Index: /CKEditor/branches/features/pasting/_source/core/htmlparser/element.js
===================================================================
--- /CKEditor/branches/features/pasting/_source/core/htmlparser/element.js	(revision 4217)
+++ /CKEditor/branches/features/pasting/_source/core/htmlparser/element.js	(revision 4218)
@@ -105,4 +105,18 @@
 				a, value;
 
+			var isChildrenFiltered;
+
+			/**
+			 * Providing an option for bottom-up filtering order ( element
+			 * children to be pre-filtered before the element itself ).
+			 */
+			element.filterChildren = function()
+			{
+				var writer = new CKEDITOR.htmlParser.basicWriter();
+				CKEDITOR.htmlParser.fragment.prototype.writeHtml.call( element, writer, filter );
+				element.children = new CKEDITOR.htmlParser.fragment.fromHtml( writer.getHtml() ).children;
+				isChildrenFiltered = 1;
+			};
+
 			if ( filter )
 			{
@@ -121,7 +135,10 @@
 
 					writeName = element.name;
-					if ( !writeName )	// Send children.
+
+					// This indicate that the element has been dropped by
+					// filter but not the children.
+					if ( !writeName )
 					{
-						CKEDITOR.htmlParser.fragment.prototype.writeHtml.apply( element, arguments );
+						this.writeChildrenHtml( writer, isChildrenFiltered ? null : filter );
 						return;
 					}
@@ -178,10 +195,15 @@
 			if ( !element.isEmpty )
 			{
-				// Send children.
-				CKEDITOR.htmlParser.fragment.prototype.writeHtml.apply( element, arguments );
-
+				this.writeChildrenHtml( writer, isChildrenFiltered ? null : filter );
 				// Close the element.
 				writer.closeTag( writeName );
 			}
+		},
+
+		writeChildrenHtml : function( writer, filter )
+		{
+			// Send children.
+			CKEDITOR.htmlParser.fragment.prototype.writeHtml.apply( this, arguments );
+
 		}
 	};
Index: /CKEditor/branches/features/pasting/_source/plugins/pastefromword/plugin.js
===================================================================
--- /CKEditor/branches/features/pasting/_source/plugins/pastefromword/plugin.js	(revision 4217)
+++ /CKEditor/branches/features/pasting/_source/plugins/pastefromword/plugin.js	(revision 4218)
@@ -84,6 +84,6 @@
 						$ : function( element )
 						{
-							var tagName = element.name,
-								child = onlyChildOf( element );
+
+							var tagName = element.name;
 
 							var match, level;
@@ -91,7 +91,9 @@
 							if ( ( match = tagName.match( /h(\d)/i ) ) && ( level = match[ 1 ] ) )
 							{
+								element.filterChildren();
+								var child = onlyChildOf( element );
+
 								// Remove empty headings.
-								if( child
-									&& child.type == CKEDITOR.NODE_TEXT
+								if( child && child.value
 									&& !CKEDITOR.tools.trim( child.value ) )
 									return false;
@@ -103,6 +105,5 @@
 								{
 									// Word likes to insert extra <font> tags, when using MSIE. (Wierd).
-									if ( child && child.type == CKEDITOR.NODE_ELEMENT
-											&& child.name.match( /em|font/ ) )
+									if ( child && /em|font/.exec( child.name ) )
 										element.children = child.children;
 								}
@@ -118,13 +119,13 @@
 								}
 							}
-							// Remove empty space inline wrapper.
-							else if( tagName.match( /u|i|strike|/ ) )
+							// Remove inline elements which contain only empty spaces.
+							else if( tagName.match( /^(:?b|u|i|strike|span)$/ ) )
 							{
-								if ( child
-									 && child.type == CKEDITOR.NODE_TEXT
-									 && CKEDITOR.tools.trim( child.value ) == '&nbsp;' )
+								element.filterChildren();
+								var child = onlyChildOf( element );
+								if ( child && /(:?\s|&nbsp;)+/.exec( child.value ) )
 									delete element.name;
 							}
-							// Remove dummy wrapper span.
+							// Remove dummy inline wrappers.
 							else if( tagName.match( /span|font/ ) )
 							{
@@ -170,5 +171,5 @@
 						'align' : function( value )
 						{
-							return ! ( value == 'left ' );
+							return value == 'left ' ? false : value;
 						}
 					},
