Index: /CKEditor/trunk/_source/core/htmlparser/fragment.js
===================================================================
--- /CKEditor/trunk/_source/core/htmlparser/fragment.js	(revision 7007)
+++ /CKEditor/trunk/_source/core/htmlparser/fragment.js	(revision 7008)
@@ -425,11 +425,12 @@
 		 *		{@link CKEDITOR.htmlParser.text} and
 		 *		{@link CKEDITOR.htmlParser.comment}.
+		 *	@param {Number} [index] From where the insertion happens.
 		 * @example
 		 */
-		add : function( node )
-		{
-			var len = this.children.length,
-				previous = len > 0 && this.children[ len - 1 ] || null;
-
+		add : function( node, index )
+		{
+			isNaN( index ) && ( index = this.children.length );
+
+			var previous = index > 0 ? this.children[ index - 1 ] : null;
 			if ( previous )
 			{
@@ -456,5 +457,5 @@
 			node.parent = this;
 
-			this.children.push( node );
+			this.children.splice( index, 0, node );
 
 			this._.hasInlineStarted = node.type == CKEDITOR.NODE_TEXT || ( node.type == CKEDITOR.NODE_ELEMENT && !node._.isBlockLike );
Index: /CKEditor/trunk/_source/plugins/pastefromword/filter/default.js
===================================================================
--- /CKEditor/trunk/_source/plugins/pastefromword/filter/default.js	(revision 7007)
+++ /CKEditor/trunk/_source/plugins/pastefromword/filter/default.js	(revision 7008)
@@ -386,57 +386,56 @@
 					{
 						child = children[ i ];
-						if ( child.name == 'li' )
-						{
-							var attributes = child.attributes;
-
-							if ( child.name in CKEDITOR.dtd.$listItem )
-							{
-								var listItemChildren = child.children,
-									count = listItemChildren.length,
-									last = listItemChildren[ count - 1 ];
-
-								// Move out nested list.
-								if ( last.name in CKEDITOR.dtd.$list )
-								{
-									children.splice( i + 1, 0, last );
-									last.parent = element;
-
-									// Remove the parent list item if it's just a holder.
-									if ( !--listItemChildren.length )
-										children.splice( i, 1 );
-
-									// Flatten sub list.
-									arguments.callee.apply( this, [ last, level + 1 ] );
-									var index = CKEDITOR.tools.indexOf( children, last );
-									// Absorb sub list children.
-									children = children.splice( 0, index ).concat( last.children ).concat( children.splice( index + 1 ) );
-									element.children = children;
-								}
-
-								child.name = 'cke:li';
-
-								// Inherit numbering from list root on the first list item.
-								attrs.start && !i && ( attributes.value = attrs.start );
-
-								plugin.filters.stylesFilter(
-									[
-										[ 'tab-stops', null, function( val )
-										{
-											var margin = val.split( ' ' )[ 1 ].match( cssLengthRelativeUnit );
-											margin && ( previousListItemMargin = parseInt( plugin.utils.convertToPx( margin[ 0 ] ), 10 ) );
-										} ],
-										( level == 1 ? [ 'mso-list', null, function( val )
-										{
-											val = val.split( ' ' );
-											var listId = Number( val[ 0 ].match( /\d+/ ) );
-											listId !== previousListId && ( attributes[ 'cke:reset' ] = 1 );
-											previousListId = listId;
-										 } ] : null )
-									] )( attributes.style );
-
-								attributes[ 'cke:indent' ] = level;
-								attributes[ 'cke:listtype' ] = element.name;
-								attributes[ 'cke:list-style-type' ] = listStyleType;
-							}
+
+						if ( child.name in CKEDITOR.dtd.$listItem )
+						{
+							var attributes = child.attributes,
+								listItemChildren = child.children,
+								count = listItemChildren.length,
+								last = listItemChildren[ count - 1 ];
+
+							// Move out nested list.
+							if ( last.name in CKEDITOR.dtd.$list )
+							{
+								element.add( last, i + 1 );
+
+								// Remove the parent list item if it's just a holder.
+								if ( !--listItemChildren.length )
+									children.splice( i--, 1 );
+							}
+
+							child.name = 'cke:li';
+
+							// Inherit numbering from list root on the first list item.
+							attrs.start && !i && ( attributes.value = attrs.start );
+
+							plugin.filters.stylesFilter(
+								[
+									[ 'tab-stops', null, function( val )
+									{
+										var margin = val.split( ' ' )[ 1 ].match( cssLengthRelativeUnit );
+										margin && ( previousListItemMargin = parseInt( plugin.utils.convertToPx( margin[ 0 ] ), 10 ) );
+									} ],
+									( level == 1 ? [ 'mso-list', null, function( val )
+									{
+										val = val.split( ' ' );
+										var listId = Number( val[ 0 ].match( /\d+/ ) );
+										listId !== previousListId && ( attributes[ 'cke:reset' ] = 1 );
+										previousListId = listId;
+									 } ] : null )
+								] )( attributes.style );
+
+							attributes[ 'cke:indent' ] = level;
+							attributes[ 'cke:listtype' ] = element.name;
+							attributes[ 'cke:list-style-type' ] = listStyleType;
+						}
+						// Flatten sub list.
+						else if ( child.name in CKEDITOR.dtd.$list )
+						{
+							// Absorb sub list children.
+							arguments.callee.apply( this, [ child, level + 1 ] );
+							children = children.slice( 0, i ).concat( child.children ).concat( children.slice( i + 1 ) );
+							element.children = [];
+							for ( var j = 0, num = children.length; j < num ; j++ )
+								element.add( children[ j ] );
 						}
 					}
