Index: /CKEditor/trunk/CHANGES.html
===================================================================
--- /CKEditor/trunk/CHANGES.html	(revision 7418)
+++ /CKEditor/trunk/CHANGES.html	(revision 7419)
@@ -81,4 +81,5 @@
 		<li><a href="http://dev.ckeditor.com/ticket/8602">#8602</a> : Image src is now properly hidden when running data through the data processor.</li>
 		<li><a href="http://dev.ckeditor.com/ticket/8812">#8812</a> : Resolved issues on the IE native range translation with comments in the DOM.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/7907">#7907</a> : Fix decrease indent on RTL block in list item looses text direction.</li>
 	</ul>
 	<h3>
Index: /CKEditor/trunk/_source/plugins/list/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/list/plugin.js	(revision 7418)
+++ /CKEditor/trunk/_source/plugins/list/plugin.js	(revision 7419)
@@ -103,4 +103,5 @@
 				currentListItem = null,
 				orgDir,
+				block,
 				paragraphName = ( paragraphMode == CKEDITOR.ENTER_P ? 'p' : 'div' );
 			while ( 1 )
@@ -147,29 +148,46 @@
 						currentListItem = item.element.clone( false, true );
 					else
+						currentListItem = new CKEDITOR.dom.documentFragment( doc );
+
+					// Migrate all children to the new container,
+					// apply the proper text direction.
+					var dirLoose = item.grandparent.getDirection( 1 ) != orgDir,
+						enterBr = paragraphMode == CKEDITOR.ENTER_BR,
+						li = item.element,
+						className = li.getAttribute( 'class' ),
+						style = li.getAttribute( 'style' );
+
+					for ( var i = 0, child, count = item.contents.length; i < count; i++ )
 					{
-						// Create completely new blocks here.
-						if ( dir || item.element.hasAttributes() || paragraphMode != CKEDITOR.ENTER_BR )
+						child = item.contents[ i ];
+
+						if ( child.type == CKEDITOR.NODE_ELEMENT && child.isBlockBoundary() )
 						{
-							currentListItem = doc.createElement( paragraphName );
-							item.element.copyAttributes( currentListItem, { type:1, value:1 } );
-
-							// There might be a case where there are no attributes in the element after all
-							// (i.e. when "type" or "value" are the only attributes set). In this case, if enterMode = BR,
-							// the current item should be a fragment.
-							if ( !dir && paragraphMode == CKEDITOR.ENTER_BR && !currentListItem.hasAttributes() )
-								currentListItem = new CKEDITOR.dom.documentFragment( doc );
+							// Apply direction on content blocks.
+							if ( dirLoose && !child.getDirection() )
+								child.setAttribute( 'dir', orgDir );
+
+							// Merge into child styles.
+							style && child.setAttribute( 'style', style + child.getAttribute( 'style' ) || '' );
+							className && child.addClass( className );
 						}
-						else
-							currentListItem = new CKEDITOR.dom.documentFragment( doc );
+						else if ( dirLoose || !enterBr || style || className )
+						{
+							// Establish new block to hold text direction and styles.
+							if ( !block )
+							{
+								block = doc.createElement( paragraphName );
+								dirLoose && block.setAttribute( 'dir', orgDir );
+							}
+
+							// Copy over styles to new block;
+							style && block.setAttribute( 'style', style );
+							className && block.setAttribute( 'class', className );
+
+							block.append( child.clone( 1, 1 ) );
+						}
+
+						currentListItem.append( block || child.clone( 1, 1 ) );
 					}
-
-					if ( currentListItem.type == CKEDITOR.NODE_ELEMENT )
-					{
-						if ( item.grandparent.getDirection( 1 ) != orgDir )
-							currentListItem.setAttribute( 'dir', orgDir );
-					}
-
-					for ( i = 0 ; i < item.contents.length ; i++ )
-						currentListItem.append( item.contents[i].clone( 1, 1 ) );
 
 					if ( currentListItem.type == CKEDITOR.NODE_DOCUMENT_FRAGMENT
@@ -191,18 +209,4 @@
 					}
 
-					if ( currentListItem.type == CKEDITOR.NODE_ELEMENT &&
-							currentListItem.getName() == paragraphName &&
-							currentListItem.$.firstChild )
-					{
-						currentListItem.trim();
-						var firstChild = currentListItem.getFirst();
-						if ( firstChild.type == CKEDITOR.NODE_ELEMENT && firstChild.isBlockBoundary() )
-						{
-							var tmp = new CKEDITOR.dom.documentFragment( doc );
-							currentListItem.moveChildren( tmp );
-							currentListItem = tmp;
-						}
-					}
-
 					var currentListItemName = currentListItem.$.nodeName.toLowerCase();
 					if ( !CKEDITOR.env.ie && ( currentListItemName == 'div' || currentListItemName == 'p' ) )
@@ -214,4 +218,6 @@
 				else
 					return null;
+
+				block = null;
 
 				if ( listArray.length <= currentIndex || Math.max( listArray[ currentIndex ].indent, 0 ) < indentLevel )
