Index: /FCKeditor/trunk/editor/_source/classes/fckdomrange.js
===================================================================
--- /FCKeditor/trunk/editor/_source/classes/fckdomrange.js	(revision 968)
+++ /FCKeditor/trunk/editor/_source/classes/fckdomrange.js	(revision 969)
@@ -369,8 +369,20 @@
 			"End" : [ this._Range.endOffset ]
 		} ;
+		var curStart = this._Range.startContainer.previousSibling ;
+		var curEnd = this._Range.endContainer.previousSibling ;
+		while ( curStart && curStart.nodeType == 3 )
+		{
+			bookmark.Start[0] += curStart.length ;
+			curStart = curStart.previousSibling ;
+		}
+		while ( curEnd && curEnd.nodeType == 3 )
+		{
+			bookmark.End[0] += curEnd.length ;
+			curEnd = curEnd.previousSibling ;
+		}
 		// Then, we record down the precise position of the container nodes
 		// by walking up the DOM tree and counting their childNode index
-		bookmark.Start = FCKDomTools.GetNodeAddress( this._Range.startContainer ).concat( bookmark.Start ) ;
-		bookmark.End = FCKDomTools.GetNodeAddress( this._Range.endContainer ).concat( bookmark.End ) ;
+		bookmark.Start = FCKDomTools.GetNodeAddress( this._Range.startContainer, true ).concat( bookmark.Start ) ;
+		bookmark.End = FCKDomTools.GetNodeAddress( this._Range.endContainer, true ).concat( bookmark.End ) ;
 		return bookmark;
 	},
@@ -379,12 +391,28 @@
 	{
 		// Reverse the childNode counting algorithm in CreateBookmark2()
-		var curStart = FCKDomTools.GetNodeFromAddress( this.Window.document, bookmark.Start.slice( 0, -1 ) ) ;
-		var curEnd = FCKDomTools.GetNodeFromAddress( this.Window.document, bookmark.End.slice( 0, -1 ) ) ;
+		var curStart = FCKDomTools.GetNodeFromAddress( this.Window.document, bookmark.Start.slice( 0, -1 ), true ) ;
+		var curEnd = FCKDomTools.GetNodeFromAddress( this.Window.document, bookmark.End.slice( 0, -1 ), true ) ;
 
 		// Generate the W3C Range object and update relevant data
 		this.Release( true ) ;
 		this._Range = new FCKW3CRange( this.Window.document ) ;
-		this._Range.setStart( curStart, bookmark.Start[ bookmark.Start.length - 1 ] ) ;
-		this._Range.setEnd( curEnd, bookmark.End[ bookmark.End.length - 1 ] ) ;
+		var startOffset = bookmark.Start[ bookmark.Start.length - 1 ] ;
+		var endOffset = bookmark.End[ bookmark.End.length - 1 ] ;
+		while ( curStart.nodeType == 3 && startOffset > curStart.length )
+		{
+			if ( ! curStart.nextSibling || curStart.nextSibling.nodeType != 3 )
+				break ;
+			startOffset -= curStart.length ;
+			curStart = curStart.nextSibling ;
+		}
+		while ( curEnd.nodeType == 3 && endOffset > curEnd.length )
+		{
+			if ( ! curEnd.nextSibling || curEnd.nextSibling.nodeType != 3 )
+				break ;
+			endOffset -= curEnd.length ;
+			curEnd = curEnd.nextSibling ;
+		}
+		this._Range.setStart( curStart, startOffset ) ;
+		this._Range.setEnd( curEnd, endOffset ) ;
 		this._UpdateElementInfo() ;
 	},
Index: /FCKeditor/trunk/editor/_source/commandclasses/fckjustifycommands.js
===================================================================
--- /FCKeditor/trunk/editor/_source/commandclasses/fckjustifycommands.js	(revision 968)
+++ /FCKeditor/trunk/editor/_source/commandclasses/fckjustifycommands.js	(revision 969)
@@ -30,6 +30,4 @@
 	this.IsDefaultAlign = ( alignValue == 'left' && contentDir == 'ltr' ) ||
 						  ( alignValue == 'right' && contentDir == 'rtl' ) ;
-
-
 
 	// Get the class name to be used by this instance.
Index: /FCKeditor/trunk/editor/_source/internals/fckdomtools.js
===================================================================
--- /FCKeditor/trunk/editor/_source/internals/fckdomtools.js	(revision 968)
+++ /FCKeditor/trunk/editor/_source/internals/fckdomtools.js	(revision 969)
@@ -550,10 +550,24 @@
 	 * The tree address cannot be used for finding back the DOM tree node once the DOM tree structure has been modified.
 	 */
-	GetNodeAddress : function( node )
+	GetNodeAddress : function( node, normalized )
 	{
 		var retval = [] ;
 		while ( node && node != node.ownerDocument.documentElement )
 		{
-			retval.unshift( this.GetIndexOf( node ) ) ;
+			var parentNode = node.parentNode ;
+			var currentIndex = -1 ;
+			for( var i = 0 ; i < parentNode.childNodes.length ; i++ )
+			{
+				var candidate = parentNode.childNodes[i] ;
+				if ( normalized === true && 
+						candidate.nodeType == 3 && 
+						candidate.previousSibling && 
+						candidate.previousSibling.nodeType == 3 )
+					continue;
+				currentIndex++ ;
+				if ( parentNode.childNodes[i] == node )
+					break ;
+			}
+			retval.unshift( currentIndex ) ;
 			node = node.parentNode ;
 		}
@@ -565,9 +579,33 @@
 	 * index address.
 	 */
-	GetNodeFromAddress : function( doc, addr )
+	GetNodeFromAddress : function( doc, addr, normalized )
 	{
 		var cursor = doc.documentElement ;
 		for ( var i = 0 ; i < addr.length ; i++ )
-			cursor = cursor.childNodes[ addr[i] ] ;
+		{
+			var target = addr[i] ;
+			if ( ! normalized )
+			{
+				cursor = cursor.childNodes[target] ;
+				continue ;
+			}
+
+			var currentIndex = -1 ;
+			for (var j = 0 ; j < cursor.childNodes.length ; j++ )
+			{
+				var candidate = cursor.childNodes[j] ;
+				if ( normalized === true &&
+						candidate.nodeType == 3 &&
+						candidate.previousSibling &&
+						candidate.previousSibling.nodeType == 3 )
+					continue ;
+				currentIndex++ ;
+				if ( currentIndex == target )
+				{
+					cursor = candidate ;
+					break ;
+				}
+			}
+		}
 		return cursor ;
 	},
Index: /FCKeditor/trunk/editor/_source/internals/fckundo.js
===================================================================
--- /FCKeditor/trunk/editor/_source/internals/fckundo.js	(revision 968)
+++ /FCKeditor/trunk/editor/_source/internals/fckundo.js	(revision 969)
@@ -31,6 +31,4 @@
 FCKUndo._GetBookmark = function()
 {
-	if ( ! FCKBrowserInfo.IsIE )
-		FCK.EditorDocument.body.normalize() ;
 	var range = new FCKDomRange( FCK.EditorWindow ) ;
 	try
