Index: _source/core/htmlparser/fragment.js
===================================================================
--- _source/core/htmlparser/fragment.js	(revision 5030)
+++ _source/core/htmlparser/fragment.js	(working copy)
@@ -64,6 +64,7 @@
 			html = [],
 			fragment = new CKEDITOR.htmlParser.fragment(),
 			pendingInline = [],
+			pendingBRs = [],
 			currentNode = fragment,
 		    // Indicate we're inside a <pre> element, spaces should be touched differently.
 			inPre = false,
@@ -71,6 +72,8 @@
 
 		function checkPending( newTagName )
 		{
+			var pendingBRsSent;
+
 			if ( pendingInline.length > 0 )
 			{
 				for ( var i = 0 ; i < pendingInline.length ; i++ )
@@ -82,6 +85,12 @@
 
 					if ( ( !currentDtd || currentDtd[ pendingName ] ) && ( !newTagName || !pendingDtd || pendingDtd[ newTagName ] || !CKEDITOR.dtd[ newTagName ] ) )
 					{
+						if ( !pendingBRsSent )
+						{
+							sendPendingBRs();
+							pendingBRsSent = 1;
+						}
+
 						// Get a clone for the pending element.
 						pendingElement = pendingElement.clone();
 
@@ -99,6 +108,12 @@
 			}
 		}
 
+		function sendPendingBRs()
+		{
+			while ( pendingBRs.length )
+				currentNode.add( pendingBRs.shift() );
+		}
+
 		function addElement( element, target, enforceCurrent )
 		{
 			target = target || currentNode || fragment;
@@ -181,6 +196,12 @@
 				return;
 			}
 
+			if ( tagName == 'br' )
+			{
+				pendingBRs.push( element );
+				return;
+			}
+
 			var currentName = currentNode.name;
 
 			var currentDtd = currentName
@@ -308,9 +329,12 @@
 
 				currentNode = candidate;
 
-				if( currentNode.name == 'pre' )
+				if ( currentNode.name == 'pre' )
 					inPre = false;
 
+				if ( candidate._.isBlockLike )
+					sendPendingBRs();
+
 				addElement( candidate, candidate.parent );
 
 				// The parent should start receiving new nodes now, except if
@@ -321,7 +345,7 @@
 				pendingInline = pendingInline.concat( newPendingInline );
 			}
 
-			if( tagName == 'body' )
+			if ( tagName == 'body' )
 				fixForBody = false;
 		};
 
@@ -336,6 +360,7 @@
 					return;
 			}
 
+			sendPendingBRs();
 			checkPending();
 
 			if ( fixForBody
@@ -366,6 +391,8 @@
 		// Parse it.
 		parser.parse( fragmentHtml );
 
+		sendPendingBRs();
+
 		// Close all pending nodes.
 		while ( currentNode.type )
 		{

