Index: _source/plugins/pagebreak/plugin.js
===================================================================
--- _source/plugins/pagebreak/plugin.js	(revision 5206)
+++ _source/plugins/pagebreak/plugin.js	Thu Mar 04 16:56:29 CST 2010
@@ -82,17 +82,24 @@
 		// Creates the fake image used for this element.
 		breakObject = editor.createFakeElement( breakObject, 'cke_pagebreak', 'div' );
 
-		var ranges = editor.getSelection().getRanges();
+		var selection = editor.getSelection(),
+				ranges = selection.getRanges(),
+				range;
 
-		for ( var range, i = 0 ; i < ranges.length ; i++ )
+		for ( var i = 0; i < ranges.length; i++ )
 		{
 			range = ranges[ i ];
+			range.deleteContents();
 
-			if ( i > 0 )
-				breakObject = breakObject.clone( true );
+			// Split up all the blocks until to order to insert page-break inside 'BODY'. (#5079)
+			var current;
+			while ( !( current = range.getCommonAncestor( false, true ) ).is( 'body' ) )
+				range.splitBlock();
 
-			range.splitBlock( 'p' );
 			range.insertNode( breakObject );
+			range.moveToElementEditStart( breakObject.getNext() ||breakObject.getPrevious() );
 		}
+		
+		selection.selectRanges( ranges );
 	}
 };
Index: _source/core/dom/elementpath.js
===================================================================
--- _source/core/dom/elementpath.js	(revision 4858)
+++ _source/core/dom/elementpath.js	Thu Mar 04 16:42:10 CST 2010
@@ -9,7 +9,7 @@
 	var pathBlockElements = { address:1,blockquote:1,dl:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,p:1,pre:1,li:1,dt:1,de:1 };
 
 	// Elements that may be considered the "Block limit" in an element path.
-	var pathBlockLimitElements = { body:1,div:1,table:1,tbody:1,tr:1,td:1,th:1,caption:1,form:1 };
+	var pathBlockLimitElements = { body:1,div:1,table:1,tbody:1,tr:1,td:1,th:1,caption:1,form:1,ul:1 };
 
 	// Check if an element contains any block element.
 	var checkHasBlock = function( element )
Index: _source/core/dom/range.js
===================================================================
--- _source/core/dom/range.js	(revision 5206)
+++ _source/core/dom/range.js	Thu Mar 04 16:53:37 CST 2010
@@ -1420,6 +1420,14 @@
 			return fixedBlock;
 		},
 
+		/**
+		 * Split the occupied block into two, putting the new cursor position between them.
+		 * Note: If the range is not already inside a block, the result will
+		 *  depend on {@param blockTag }:
+		 *  1. Establish one new block element of the specified tag name before split;
+		 *  2. Split up the any surrounding blockLimit element besides 'BODY'.
+		 * @param {String} blockTag The tag name
+		 */
 		splitBlock : function( blockTag )
 		{
 			var startPath	= new CKEDITOR.dom.elementPath( this.startContainer ),
@@ -1428,13 +1436,17 @@
 			var startBlockLimit	= startPath.blockLimit,
 				endBlockLimit	= endPath.blockLimit;
 
-			var startBlock	= startPath.block,
-				endBlock	= endPath.block;
+			var startBlock	= startPath.block || !blockTag && startBlockLimit,
+				endBlock	= endPath.block || !blockTag && endBlockLimit;
 
 			var elementPath = null;
+
 			// Do nothing if the boundaries are in different block limits.
-			if ( !startBlockLimit.equals( endBlockLimit ) )
+			if ( blockTag && !startBlockLimit.equals( endBlockLimit ) )
 				return null;
+			// Don't split <body>.
+			else if( !blockTag && ( startBlock.is( 'body' ) || endBlock.is( 'body' ) ) )
+				return null;
 
 			// Get or fix current blocks.
 			if ( blockTag != 'br' )
@@ -1480,8 +1492,8 @@
 					// lists to be incorrectly rendered.
 					if ( !CKEDITOR.env.ie && !startBlock.is( 'ul', 'ol') )
 						startBlock.appendBogus() ;
-				}
-			}
+					}
+				}
 
 			return {
 				previousBlock : startBlock,
