Index: /CKEditor/trunk/CHANGES.html
===================================================================
--- /CKEditor/trunk/CHANGES.html	(revision 3966)
+++ /CKEditor/trunk/CHANGES.html	(revision 3967)
@@ -180,4 +180,5 @@
 		</ul></li>
 		<li><a href="http://dev.fckeditor.net/ticket/4085">#4085</a> : Paste and Paste from Word dialogs were not well styled in IE+RTL.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3982">#3982</a> : Fixed enterKey on empty list item result in weird dom structure.</li>
 		<li><a href="http://dev.fckeditor.net/ticket/4101">#4101</a> : Now it is possible to close dialog before gets focus.</li>
 	</ul>
Index: /CKEditor/trunk/_source/plugins/indent/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/indent/plugin.js	(revision 3966)
+++ /CKEditor/trunk/_source/plugins/indent/plugin.js	(revision 3967)
@@ -145,6 +145,38 @@
 		// And replace the old list with the new forest.
 		var newList = CKEDITOR.plugins.list.arrayToList( listArray, database, null, editor.config.enterMode, 0 );
+
+		// Avoid nested <li> after outdent even they're visually same,
+		// recording them for later refactoring.(#3982)
+		if ( this.name == 'outdent' )
+		{
+			var parentLiElement;
+			if ( ( parentLiElement = listNode.getParent() ) && parentLiElement.is( 'li' ) )
+			{
+				var children = newList.listNode.getChildren(),
+					pendingLis = [],
+					count = children.count(),
+					child;
+				for ( var i = count - 1 ; i >= 0 ; i-- )
+					if( ( child = children.getItem( i ) ) && child.is && child.is( 'li' )  )
+						pendingLis.push( child );
+			}
+		}
+
 		if ( newList )
 			newList.listNode.replace( listNode );
+
+		// Move the nested <li> to be appeared after the parent.
+		if ( pendingLis && pendingLis.length )
+			for ( var i = 0; i < pendingLis.length ; i++ )
+			{
+				var li = pendingLis[ i ],
+					followingList = li;
+				// Nest preceding <ul>/<ol> inside current <li> if any.
+				while( ( followingList = followingList.getNext() ) &&
+					   followingList.is &&
+					   followingList.getName() in listNodeNames )
+					li.append( followingList );
+				li.insertAfter( parentLiElement );
+			}
 
 		// Clean up the markers.
