Index: /CKEditor/trunk/CHANGES.html
===================================================================
--- /CKEditor/trunk/CHANGES.html	(revision 5284)
+++ /CKEditor/trunk/CHANGES.html	(revision 5285)
@@ -97,4 +97,5 @@
 		<li><a href="http://dev.fckeditor.net/ticket/5182">#5182</a> : Context menu is not been announced correctly by ATs.</li>
 		<li><a href="http://dev.fckeditor.net/ticket/4898">#4898</a> : Can't navigate outside table inside the last paragraph of document.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/4950">#4950</a> : List commands could compromise list item attribute and styles.</li>
 	</ul>
 	<h3>
Index: /CKEditor/trunk/_source/plugins/list/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/list/plugin.js	(revision 5284)
+++ /CKEditor/trunk/_source/plugins/list/plugin.js	(revision 5285)
@@ -30,5 +30,5 @@
 				baseArray = [];
 
-			// Iterate over all list items to get their contents and look for inner lists.
+			// Iterate over all list items to and look for inner lists.
 			for ( var i = 0, count = listNode.getChildCount() ; i < count ; i++ )
 			{
@@ -38,5 +38,6 @@
 				if ( listItem.$.nodeName.toLowerCase() != 'li' )
 					continue;
-				var itemObj = { 'parent' : listNode, indent : baseIndentLevel, contents : [] };
+
+				var itemObj = { 'parent' : listNode, indent : baseIndentLevel, element : listItem };
 				if ( !grandparentNode )
 				{
@@ -52,13 +53,10 @@
 				baseArray.push( itemObj );
 
-				for ( var j = 0, itemChildCount = listItem.getChildCount() ; j < itemChildCount ; j++ )
-				{
-					var child = listItem.getChild( j );
+				for ( var j = 0, itemChildCount = listItem.getChildCount(), child; j < itemChildCount ; j++ )
+				{
+					child = listItem.getChild( j );
+					// Push inner list items with +1 indentation in the correct order.
 					if ( child.type == CKEDITOR.NODE_ELEMENT && listNodeNames[ child.getName() ] )
-						// Note the recursion here, it pushes inner list items with
-						// +1 indentation in the correct order.
 						CKEDITOR.plugins.list.listToArray( child, database, baseArray, baseIndentLevel + 1, itemObj.grandparent );
-					else
-						itemObj.contents.push( child );
 				}
 			}
@@ -90,7 +88,5 @@
 						retval.append( rootNode );
 					}
-					currentListItem = rootNode.append( doc.createElement( 'li' ) );
-					for ( var i = 0 ; i < item.contents.length ; i++ )
-						currentListItem.append( item.contents[i].clone( true, true ) );
+					currentListItem = rootNode.append( item.element );
 					currentIndex++;
 				}
@@ -105,7 +101,8 @@
 					currentListItem;
 					if ( listNodeNames[ item.grandparent.getName() ] )
-						currentListItem = doc.createElement( 'li' );
+						currentListItem = item.element;
 					else
 					{
+						// Create completely new blocks here, attributes are dropped.
 						if ( paragraphMode != CKEDITOR.ENTER_BR && item.grandparent.getName() != 'td' )
 							currentListItem = doc.createElement( paragraphName );
@@ -114,6 +111,5 @@
 					}
 
-					for ( i = 0 ; i < item.contents.length ; i++ )
-						currentListItem.append( item.contents[i].clone( true, true ) );
+					item.element.moveChildren( currentListItem );
 
 					if ( currentListItem.type == CKEDITOR.NODE_DOCUMENT_FRAGMENT
