Index: /CKEditor/trunk/_source/core/dom/range.js
===================================================================
--- /CKEditor/trunk/_source/core/dom/range.js	(revision 3058)
+++ /CKEditor/trunk/_source/core/dom/range.js	(revision 3059)
@@ -361,13 +361,23 @@
 		},
 
-		// This is an "intrusive" way to create a bookmark. It includes <span> tags
-		// in the range boundaries. The advantage of it is that it is possible to
-		// handle DOM mutations when moving back to the bookmark.
-		// Attention: the inclusion of nodes in the DOM is a design choice and
-		// should not be changed as there are other points in the code that may be
-		// using those nodes to perform operations. See GetBookmarkNode.
-		createBookmark : function()
+		/**
+		 * Creates a bookmark object, which can be later used to restore the
+		 * range by using the moveToBookmark function.
+		 * This is an "intrusive" way to create a bookmark. It includes <span> tags
+		 * in the range boundaries. The advantage of it is that it is possible to
+		 * handle DOM mutations when moving back to the bookmark.
+		 * Attention: the inclusion of nodes in the DOM is a design choice and
+		 * should not be changed as there are other points in the code that may be
+		 * using those nodes to perform operations. See GetBookmarkNode.
+		 * @param {Boolean} [serializable] Indicates that the bookmark nodes
+		 *		must contain ids, which can be used to restore the range even
+		 *		when these nodes suffer mutations (like a clonation or innerHTML
+		 *		change).
+		 * @returns {Object} And object representing a bookmark.
+		 */
+		createBookmark : function( serializable )
 		{
 			var startNode, endNode;
+			var baseId;
 			var clone;
 
@@ -380,4 +390,10 @@
 			startNode.setHtml( '&nbsp;' );
 
+			if ( serializable )
+			{
+				baseId = 'cke_bm_' + CKEDITOR.tools.getNextNumber();
+				startNode.setAttribute( 'id', baseId + 'S' );
+			}
+
 			// If collapsed, the endNode will not be created.
 			if ( !this.collapsed )
@@ -385,4 +401,7 @@
 				endNode = startNode.clone();
 				endNode.setHtml( '&nbsp;' );
+
+				if ( serializable )
+					endNode.setAttribute( 'id', baseId + 'E' );
 
 				clone = this.clone();
@@ -405,6 +424,7 @@
 
 			return {
-				startNode : startNode,
-				endNode : endNode
+				startNode : serializable ? baseId + 'S' : startNode,
+				endNode : serializable ? baseId + 'E' : endNode,
+				serializable : serializable
 			};
 		},
@@ -412,13 +432,16 @@
 		moveToBookmark : function( bookmark )
 		{
+			var serializable = bookmark.serializable,
+				startNode	= serializable ? this.document.getById( bookmark.startNode ) : bookmark.startNode,
+				endNode		= serializable ? this.document.getById( bookmark.endNode ) : bookmark.endNode;
+
 			// Set the range start at the bookmark start node position.
-			this.setStartBefore( bookmark.startNode );
+			this.setStartBefore( startNode );
 
 			// Remove it, because it may interfere in the setEndBefore call.
-			bookmark.startNode.remove();
+			startNode.remove();
 
 			// Set the range end at the bookmark end node position, or simply
 			// collapse it if it is not available.
-			var endNode = bookmark.endNode;
 			if ( endNode )
 			{
Index: /CKEditor/trunk/_source/plugins/indent/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/indent/plugin.js	(revision 3058)
+++ /CKEditor/trunk/_source/plugins/indent/plugin.js	(revision 3059)
@@ -233,5 +233,5 @@
 				return;
 
-			var bookmarks = selection.createBookmarks(),
+			var bookmarks = selection.createBookmarks( true ),
 				boundaryNodes = range.getBoundaryNodes(),
 				nearestListBlock = boundaryNodes.startNode.getCommonAncestor( boundaryNodes.endNode );
Index: /CKEditor/trunk/_source/plugins/list/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/list/plugin.js	(revision 3058)
+++ /CKEditor/trunk/_source/plugins/list/plugin.js	(revision 3059)
@@ -373,5 +373,5 @@
 			}
 			
-			var bookmarks = selection.createBookmarks();
+			var bookmarks = selection.createBookmarks( true );
 
 			// Group the blocks up because there are many cases where multiple lists have to be created,
Index: /CKEditor/trunk/_source/plugins/selection/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/selection/plugin.js	(revision 3058)
+++ /CKEditor/trunk/_source/plugins/selection/plugin.js	(revision 3059)
@@ -625,10 +625,10 @@
 				},
 
-		createBookmarks : function()
+		createBookmarks : function( serializable )
 		{
 			var retval = [],
 				ranges = this.getRanges();
 			for ( var i = 0 ; i < ranges.length ; i++ )
-				retval.push( ranges[i].createBookmark() );
+				retval.push( ranges[i].createBookmark( serializable ) );
 			return retval;
 		},
