Index: /CKEditor/trunk/_source/plugins/pastefromword/filter/default.js
===================================================================
--- /CKEditor/trunk/_source/plugins/pastefromword/filter/default.js	(revision 4871)
+++ /CKEditor/trunk/_source/plugins/pastefromword/filter/default.js	(revision 4872)
@@ -124,5 +124,6 @@
 	var emptyMarginRegex = /^(?:\b0[^\s]*\s*){1,4}$/;
 
-	var listBaseIndent;
+	var listBaseIndent = 0,
+		 previousListItemMargin;
 
 	CKEDITOR.plugins.pastefromword =
@@ -218,16 +219,16 @@
 									[ 'line-height' ],
 									// Resolve indent level from 'margin-left' value.
-									[ ( /^margin(:?-left)?$/ ), null, function( value )
+									[ ( /^margin(:?-left)?$/ ), null, function( margin )
 									{
 										// Be able to deal with component/short-hand form style.
-										var values = value.split( ' ' );
-										value = values[ 3 ] || values[ 1 ] || values [ 0 ];
-										value = parseInt( value, 10 );
-
-										// Figure out the indent unit by looking at the first list item.
-										!listBaseIndent && ( listBaseIndent = value );
-
-										// Indent level start with one.
-										attrs[ 'cke:indent' ] = Math.floor( value / listBaseIndent ) + 1;
+										var values = margin.split( ' ' );
+										margin = values[ 3 ] || values[ 1 ] || values [ 0 ];
+										margin = parseInt( margin, 10 );
+
+										// Figure out the indent unit by looking at the first increament.
+										if ( !listBaseIndent && previousListItemMargin && margin > previousListItemMargin )
+											listBaseIndent = margin - previousListItemMargin;
+
+										attrs[ 'cke:margin' ] = previousListItemMargin = margin;
 									} ]
 							] )( attrs.style, element ) || '' ;
@@ -242,7 +243,4 @@
 					return true;
 				}
-				// Indicate a list has ended.
-				else
-					listBaseIndent = 0;
 
 				return false;
@@ -350,4 +348,5 @@
 							child.name = 'cke:li';
 							attributes[ 'cke:indent' ] = indentLevel;
+							previousListItemMargin = 0;
 							attributes[ 'cke:listtype' ] = element.name;
 							listStyleType && child.addStyle( 'list-style-type', listStyleType, true );
@@ -387,6 +386,11 @@
 							listItemAttrs = listItem.attributes;
 							listType = listItem.attributes[ 'cke:listtype' ];
-							// The indent attribute might not present.
-							listItemIndent = parseInt( listItemAttrs[ 'cke:indent' ], 10 ) || 0;
+
+							// List item indent level might come from a real list indentation or
+							// been resolved from a pseudo list item's margin value, even get
+							// no indentation at all.
+							listItemIndent = parseInt( listItemAttrs[ 'cke:indent' ], 10 )
+													|| listBaseIndent && ( Math.ceil( listItemAttrs[ 'cke:margin' ] / listBaseIndent ) )
+													|| 1;
 
 							// Ignore the 'list-style-type' attribute if it's matched with
@@ -401,5 +405,5 @@
 							if ( !list )
 							{
-								parentList = list = new CKEDITOR.htmlParser.element( listType );
+								list = new CKEDITOR.htmlParser.element( listType );
 								list.add( listItem );
 								children[ i ] = list;
@@ -409,5 +413,4 @@
 								if ( listItemIndent > indent )
 								{
-									parentList = list;
 									list = new CKEDITOR.htmlParser.element( listType );
 									list.add( listItem );
@@ -416,6 +419,10 @@
 								else if ( listItemIndent < indent )
 								{
-									list = parentList;
-									parentList = list.parent ? list.parent.parent : list;
+									// There might be a negative gap between two list levels. (#4944)
+									var diff = indent - listItemIndent,
+										parent = list.parent;
+									while( diff-- && parent )
+										list = parent.parent;
+
 									list.add( listItem );
 								}
@@ -432,4 +439,6 @@
 							list = null;
 					}
+					
+					listBaseIndent = 0;
 				},
 
@@ -1131,6 +1140,4 @@
 		data = data.replace( /<span>/g, '' );
 
-		// Clean up certain stateful session variables.
-		listBaseIndent = 0;
 		return data;
 	};
