Index: /CKEditor/trunk/_source/plugins/justify/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/justify/plugin.js	(revision 3661)
+++ /CKEditor/trunk/_source/plugins/justify/plugin.js	(revision 3662)
@@ -67,38 +67,43 @@
 		exec : function( editor )
 		{
-			var selection = editor.getSelection(),
-				range = selection && selection.getRanges()[0];
+			var selection = editor.getSelection();
+			if ( !selection )
+				return;
+			
+			var bookmarks = selection.createBookmarks(),
+				ranges = selection.getRanges();
 
-			if ( !range )
-				return;
 
-			var bookmarks = selection.createBookmarks(),
-				cssClassName = this.cssClassName,
-				iterator = range.createIterator(),
+			var cssClassName = this.cssClassName,
+				iterator,
 				block;
-
-			while ( ( block = iterator.getNextParagraph() ) )
+			for ( var i = ranges.length - 1 ; i >= 0 ; i-- ) 
 			{
-				block.removeAttribute( 'align' );
-
-				if ( cssClassName )
+				iterator = ranges[ i ].createIterator();
+				while ( ( block = iterator.getNextParagraph() ) )
 				{
-					// Remove any of the alignment classes from the className.
-					var className = block.$.className =
-						CKEDITOR.tools.ltrim( block.$.className.replace( this.cssClassRegex, '' ) );
-
-					// Append the desired class name.
-					if ( this.state == CKEDITOR.TRISTATE_OFF && !this.isDefaultAlign )
-						block.addClass( cssClassName );
-					else if ( !className )
-						block.removeAttribute( 'class' );
+					block.removeAttribute( 'align' );
+	
+					if ( cssClassName )
+					{
+						// Remove any of the alignment classes from the className.
+						var className = block.$.className =
+							CKEDITOR.tools.ltrim( block.$.className.replace( this.cssClassRegex, '' ) );
+	
+						// Append the desired class name.
+						if ( this.state == CKEDITOR.TRISTATE_OFF && !this.isDefaultAlign )
+							block.addClass( cssClassName );
+						else if ( !className )
+							block.removeAttribute( 'class' );
+					}
+					else
+					{
+						if ( this.state == CKEDITOR.TRISTATE_OFF && !this.isDefaultAlign )
+							block.setStyle( 'text-align', this.value );
+						else
+							block.removeStyle( 'text-align' );
+					}
 				}
-				else
-				{
-					if ( this.state == CKEDITOR.TRISTATE_OFF && !this.isDefaultAlign )
-						block.setStyle( 'text-align', this.value );
-					else
-						block.removeStyle( 'text-align' );
-				}
+				
 			}
 
Index: /CKEditor/trunk/_source/plugins/selection/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/selection/plugin.js	(revision 3661)
+++ /CKEditor/trunk/_source/plugins/selection/plugin.js	(revision 3662)
@@ -870,7 +870,33 @@
 		{
 			var retval = [],
-				ranges = this.getRanges();
-			for ( var i = 0 ; i < ranges.length ; i++ )
-				retval.push( ranges[i].createBookmark( serializable ) );
+				ranges = this.getRanges(),
+				length = ranges.length,
+				bookmark;
+			for ( var i = 0; i < length ; i++ )
+			{
+			    retval.push( bookmark = ranges[ i ].createBookmark( serializable, true ) );
+
+				var serializable = bookmark.serializable,
+					bookmarkStart = serializable ?
+						this.document.getById( bookmark.startNode )
+						: bookmark.startNode,
+					bookmarkEnd = serializable ?
+					  this.document.getById( bookmark.endNode )
+					  : bookmark.endNode;
+
+			    // Updating the offset values for rest of ranges which have been mangled(#3256).
+			    for ( var j = i + 1 ; j < length ; j++ )
+			    {
+			        var dirtyRange = ranges[ j ],
+			               rangeStart = dirtyRange.startContainer,
+			               rangeEnd = dirtyRange.endContainer;
+
+			       rangeStart.equals( bookmarkStart.getParent() ) && dirtyRange.startOffset++;
+			       rangeStart.equals( bookmarkEnd.getParent() ) && dirtyRange.startOffset++;
+			       rangeEnd.equals( bookmarkStart.getParent() ) && dirtyRange.endOffset++;
+			       rangeEnd.equals( bookmarkEnd.getParent() ) && dirtyRange.endOffset++;
+			    }
+			}
+
 			return retval;
 		},
