Index: /CKEditor/branches/features/kama/_samples/ui_color.html
===================================================================
--- /CKEditor/branches/features/kama/_samples/ui_color.html	(revision 3647)
+++ /CKEditor/branches/features/kama/_samples/ui_color.html	(revision 3648)
@@ -22,5 +22,5 @@
 					CKEDITOR.replace( 'editor1',
 						{
-							addPlugins : 'uicolor',
+							extraPlugins : 'uicolor',
 							toolbar :
 							[
@@ -42,5 +42,5 @@
 					CKEDITOR.replace( 'editor2',
 						{
-							addPlugins : 'uicolor',
+							extraPlugins : 'uicolor',
 							uiColor: '#14B8C4',
 							toolbar :
Index: /CKEditor/branches/features/kama/_source/core/config.js
===================================================================
--- /CKEditor/branches/features/kama/_source/core/config.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/core/config.js	(revision 3648)
@@ -159,7 +159,7 @@
 	 * @type String
 	 * @example
-	 * config.addPlugins = 'myplugin,anotherplugin';
-	 */
-	addPlugins : '',
+	 * config.extraPlugins = 'myplugin,anotherplugin';
+	 */
+	extraPlugins : '',
 
 	/**
Index: /CKEditor/branches/features/kama/_source/core/dom/element.js
===================================================================
--- /CKEditor/branches/features/kama/_source/core/dom/element.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/core/dom/element.js	(revision 3648)
@@ -152,8 +152,8 @@
 		removeClass : function( className )
 		{
-			var c = this.$.className;
+			var c = this.getAttribute( 'class' );
 			if ( c )
 			{
-				var regex = new RegExp( '(?:^|\\s+)' + className + '(?=\\s|$)', '' );
+				var regex = new RegExp( '(?:^|\\s+)' + className + '(?=\\s|$)', 'i' );
 				if ( regex.test( c ) )
 				{
@@ -161,5 +161,5 @@
 
 					if ( c )
-						this.$.className = c;
+						this.setAttribute( 'class', c );
 					else
 						this.removeAttribute( 'class' );
@@ -171,5 +171,5 @@
 		{
 			var regex = new RegExp( '(?:^|\\s+)' + className + '(?=\\s|$)', '' );
-			return regex.test( this.$.className );
+			return regex.test( this.getAttribute('class') );
 		},
 
@@ -401,5 +401,5 @@
 			};
 
-			if ( CKEDITOR.env.ie && !CKEDITOR.env.ie8 )
+			if ( CKEDITOR.env.ie && ( CKEDITOR.env.ie7Compat || CKEDITOR.env.ie6Compat ) )
 			{
 				return function( name )
@@ -644,8 +644,15 @@
 		},
 
-		getLast : function()
+		/**
+		 * @param ignoreEmpty Skip empty text nodes.
+		 */
+		getLast : function( ignoreEmpty )
 		{
 			var $ = this.$.lastChild;
-			return $ ? new CKEDITOR.dom.node( $ ) : null;
+			if ( ignoreEmpty && $ && ( $.nodeType == CKEDITOR.NODE_TEXT )
+					&& !CKEDITOR.tools.trim( $.nodeValue ) )
+				return new CKEDITOR.dom.node( $ ).getPrevious( true );
+			else
+				return $ ? new CKEDITOR.dom.node( $ ) : null;
 		},
 
@@ -750,5 +757,5 @@
 		 */
 		hasAttributes :
-			CKEDITOR.env.ie ?
+			CKEDITOR.env.ie && ( CKEDITOR.env.ie7Compat || CKEDITOR.env.ie6Compat ) ?
 				function()
 				{
@@ -768,5 +775,5 @@
 								// Note : I was not able to reproduce it outside the editor,
 								// but I've faced it while working on the TC of #1391.
-								if ( this.$.className.length > 0 )
+								if ( this.getAttribute( 'class' ) > 0 )
 									return true;
 
@@ -871,5 +878,5 @@
 			};
 
-			if ( CKEDITOR.env.ie && !CKEDITOR.env.ie8 )
+			if ( CKEDITOR.env.ie && ( CKEDITOR.env.ie7Compat || CKEDITOR.env.ie6Compat ) )
 			{
 				return function( name, value )
@@ -937,5 +944,5 @@
 			};
 
-			if ( CKEDITOR.env.ie && !CKEDITOR.env.ie8  )
+			if ( CKEDITOR.env.ie && ( CKEDITOR.env.ie7Compat || CKEDITOR.env.ie6Compat ) )
 			{
 				return function( name )
@@ -1092,12 +1099,28 @@
 		getDocumentPosition : function( refDocument )
 		{
-			var x = 0, y = 0, current = this, previous = null;
-			while ( current && !( current.getName() == 'body' || current.getName() == 'html' ) )
-			{
-				x += current.$.offsetLeft - current.$.scrollLeft;
-				y += current.$.offsetTop - current.$.scrollTop;
-
-				if ( !CKEDITOR.env.opera )
-				{
+			var x = 0, y = 0,
+				body = this.getDocument().getBody();
+
+			if ( document.documentElement[ "getBoundingClientRect" ] )
+			{
+				var box  = this.$.getBoundingClientRect(),
+					doc = this.getDocument().$,
+					docElem = doc.documentElement,
+					clientTop = docElem.clientTop || body.$.clientTop || 0,
+					clientLeft = docElem.clientLeft || body.$.clientLeft || 0;
+
+				x = box.left + ( !CKEDITOR.env.quirks && docElem.scrollLeft || body.$.scrollLeft );
+				x -= clientLeft;
+				y = box.top  + ( !CKEDITOR.env.quirks && docElem.scrollTop || body.$.scrollTop );
+				y -= clientTop;
+			}
+			else
+ 			{
+				var current = this, previous = null, offsetParent;
+				while ( current && !( current.getName() == 'body' || current.getName() == 'html' ) )
+				{
+					x += current.$.offsetLeft - current.$.scrollLeft;
+					y += current.$.offsetTop - current.$.scrollTop;
+
 					// Opera includes clientTop|Left into offsetTop|Left.
 					if ( !current.equals( this ) )
@@ -1114,13 +1137,14 @@
 						scrollElement = scrollElement.getParent();
 					}
+
+					previous = current;
+					current = ( offsetParent = current.$.offsetParent ) ?
+					          new CKEDITOR.dom.element( offsetParent ) : null;
 				}
-
-				previous = current;
-				current = new CKEDITOR.dom.element( current.$.offsetParent );
 			}
 
 			if ( refDocument )
 			{
-				var currentWindow = current.getWindow(),
+				var currentWindow = this.getWindow(),
 					refWindow = refDocument.getWindow();
 
@@ -1134,27 +1158,13 @@
 			}
 
-			var body = this.getDocument().getBody();
-
-			// document.body is a special case when it comes to offsetTop and offsetLeft
-			// values.
-			// 1. It does not matter if we're in IE Quirks mode - in this case body is
-			// 	equal to the view pane itself.
-			// 2. It matters if document.body itself is a positioned element;
-			// 3. It matters when we're in IE Standards mode and the element has no
-			// 	positioned ancestor.
-			// Otherwise the values should be ignored.
-			if ( !( CKEDITOR.env.ie && CKEDITOR.env.quirks ) && ( body.getComputedStyle( 'position' ) != 'static' ||
-						( CKEDITOR.env.ie && !this.getPositionedAncestor() ) ) )
-			{
-				x += body.$.offsetLeft + ( body.$.clientLeft || 0 );
-				y += body.$.offsetTop + ( body.$.clientTop || 0 );
-			}
-
-			// In Firefox, we'll endup one pixel before the element positions,
-			// so we must add it here.
-			if ( CKEDITOR.env.gecko && !CKEDITOR.env.quirks )
-			{
-				x += this.$.clientLeft ? 1 : 0;
-				y += this.$.clientTop ? 1 : 0;
+			if ( !document.documentElement[ "getBoundingClientRect" ] )
+			{
+				// In Firefox, we'll endup one pixel before the element positions,
+				// so we must add it here.
+				if ( CKEDITOR.env.gecko && !CKEDITOR.env.quirks )
+				{
+					x += this.$.clientLeft ? 1 : 0;
+					y += this.$.clientTop ? 1 : 0;
+				}
 			}
 
Index: /CKEditor/branches/features/kama/_source/core/dom/elementpath.js
===================================================================
--- /CKEditor/branches/features/kama/_source/core/dom/elementpath.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/core/dom/elementpath.js	(revision 3648)
@@ -10,5 +10,5 @@
 
 	// Elements that may be considered the "Block limit" in an element path.
-	var pathBlockLimitElements = { body:1,div: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 };
 
 	// Check if an element contains any block element.
Index: /CKEditor/branches/features/kama/_source/core/dom/node.js
===================================================================
--- /CKEditor/branches/features/kama/_source/core/dom/node.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/core/dom/node.js	(revision 3648)
@@ -260,14 +260,4 @@
 		},
 
-		/**
-		 * Gets the node following this node (next sibling).
-		 * @returns {CKEDITOR.dom.node} The next node.
-		 */
-		getNext : function()
-		{
-			var next = this.$.nextSibling;
-			return next ? new CKEDITOR.dom.node( next ) : null;
-		},
-
 		getNextSourceNode : function( startFromSibling, nodeType, guard )
 		{
@@ -361,7 +351,11 @@
 		},
 
-		getPrevious : function()
+		getPrevious : function( ignoreSpaces )
 		{
 			var previous = this.$.previousSibling;
+			while ( ignoreSpaces && previous && ( previous.nodeType == CKEDITOR.NODE_TEXT )
+					&& !CKEDITOR.tools.trim( previous.nodeValue ) )
+				previous = previous.previousSibling;
+
 			return previous ? new CKEDITOR.dom.node( previous ) : null;
 		},
@@ -369,4 +363,5 @@
 		/**
 		 * Gets the node that follows this element in its parent's child list.
+		 * @param {Boolean} ignoreSpaces Whether should ignore empty text nodes.
 		 * @returns {CKEDITOR.dom.node} The next node or null if not
 		 *		available.
@@ -376,8 +371,12 @@
 		 * alert( first.getName() );  // "i"
 		 */
-		getNext : function()
-		{
-			var $ = this.$.nextSibling;
-			return $ ? new CKEDITOR.dom.node( $ ) : null;
+		getNext : function( ignoreSpaces )
+		{
+			var next = this.$.nextSibling;
+			while ( ignoreSpaces && next && ( next.nodeType == CKEDITOR.NODE_TEXT )
+				  && !CKEDITOR.tools.trim( next.nodeValue ) )
+				next = next.nextSibling;
+			
+			return next ? new CKEDITOR.dom.node( next ) : null;
 		},
 
Index: /CKEditor/branches/features/kama/_source/core/dom/range.js
===================================================================
--- /CKEditor/branches/features/kama/_source/core/dom/range.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/core/dom/range.js	(revision 3648)
@@ -1,3 +1,3 @@
-﻿/*
+/*
 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
 For licensing, see LICENSE.html or http://ckeditor.com/license
@@ -32,4 +32,6 @@
 	var execContentsAction = function( range, action, docFrag )
 	{
+		range.optimizeBookmark();
+		
 		var startNode	= range.startContainer;
 		var endNode		= range.endContainer;
@@ -264,7 +266,11 @@
 	function getCheckStartEndBlockEvalFunction( isStart )
 	{
-		var hadBr = false;
+		var hadBr = false, bookmarkEvaluator = CKEDITOR.dom.walker.bookmark( true );
 		return function( node )
 		{
+			// First ignore bookmark nodes.
+			if ( bookmarkEvaluator( node ) )
+				return true;
+
 			if ( node.type == CKEDITOR.NODE_TEXT )
 			{
@@ -272,5 +278,5 @@
 				if ( CKEDITOR.tools.trim( node.getText() ).length )
 					return false;
-			}
+				}
 			else
 			{
@@ -608,17 +614,28 @@
 		},
 
-		getCommonAncestor : function( includeSelf )
-		{
-			var start = this.startContainer;
-			var end = this.endContainer;
+		/**
+		 * Find the node which fully contains the range.
+		 * @param includeSelf
+		 * @param {Boolean} ignoreTextNode Whether ignore CKEDITOR.NODE_TEXT type.
+		 */
+		getCommonAncestor : function( includeSelf , ignoreTextNode )
+		{
+			var start = this.startContainer,
+				end = this.endContainer,
+				ancestor;
 
 			if ( start.equals( end ) )
 			{
-				if ( includeSelf && start.type == CKEDITOR.NODE_ELEMENT && this.startOffset == this.endOffset - 1 )
-					return start.getChild( this.startOffset );
-				return start;
-			}
-
-			return start.getCommonAncestor( end );
+				if ( includeSelf
+						&& start.type == CKEDITOR.NODE_ELEMENT
+						&& this.startOffset == this.endOffset - 1 )
+					ancestor = start.getChild( this.startOffset );
+				else
+					ancestor = start;
+			}
+			else
+				ancestor = start.getCommonAncestor( end );
+
+			return ignoreTextNode && !ancestor.is ? ancestor.getParent() : ancestor;
 		},
 
@@ -654,11 +671,24 @@
 		},
 
+		/**
+		 * Move the range out of bookmark nodes if they're been the container.
+		 */
+		optimizeBookmark: function()
+		{
+			var startNode = this.startContainer,
+				endNode = this.endContainer;
+
+			if ( startNode.is && startNode.is( 'span' )
+				&& startNode.hasAttribute( '_fck_bookmark' ) )
+				this.setStartAt( startNode, CKEDITOR.POSITION_BEFORE_START );
+			if ( endNode && endNode.is && endNode.is( 'span' )
+				&& endNode.hasAttribute( '_fck_bookmark' ) )
+				this.setEndAt( endNode,  CKEDITOR.POSITION_AFTER_END );
+		},
+
 		trim : function( ignoreStart, ignoreEnd )
 		{
 			var startContainer = this.startContainer;
 			var startOffset = this.startOffset;
-
-			var endContainer = this.endContainer;
-			var endOffset = this.endOffset;
 
 			if ( !ignoreStart && startContainer && startContainer.type == CKEDITOR.NODE_TEXT )
@@ -696,4 +726,7 @@
 				this.setStart( startContainer, startOffset );
 			}
+
+			var endContainer = this.endContainer;
+			var endOffset = this.endOffset;
 
 			if ( !ignoreEnd && endContainer && !this.collapsed && endContainer.type == CKEDITOR.NODE_TEXT )
@@ -1091,37 +1124,73 @@
 
 					// Enlarging the start boundary.
-					var walkerRange = new CKEDITOR.dom.range( this.document );
-					walkerRange.setStartAt(
-						this.document.getBody(), CKEDITOR.POSITION_AFTER_START );
+					var walkerRange = new CKEDITOR.dom.range( this.document ),
+							body = this.document.getBody();
+					walkerRange.setStartAt( body, CKEDITOR.POSITION_AFTER_START );
 					walkerRange.setEnd( this.startContainer, this.startOffset );
 
 					var walker = new CKEDITOR.dom.walker( walkerRange ),
-
-						guard = CKEDITOR.dom.walker.blockBoundary(
+					    blockBoundary,  // The node on which the enlarging should stop.
+						tailBr, //
+					    defaultGuard = CKEDITOR.dom.walker.blockBoundary(
 								( unit == CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS ) ? { br : 1 } : null ),
-						tailBr,
-						listGuard = function( node )
+						// Record the encountered 'blockBoundary' for later use.
+						boundaryGuard = function( node )
 						{
-							var result = guard( node );
-							if ( !result && node.is && node.is( 'br' ) )
+							var retval = defaultGuard( node );
+							if ( !retval )
+								blockBoundary = node;
+							return retval;
+						},
+						// Record the encounted 'tailBr' for later use.
+						tailBrGuard = function( node )
+						{
+							var retval = boundaryGuard( node );
+							if ( !retval && node.is && node.is( 'br' ) )
 								tailBr = node;
-							return result;
+							return retval;
 						};
-					walker.guard = guard;
+
+					walker.guard = boundaryGuard;
+
 
 					if ( ( enlargeable = walker.lastBackward() ) )
+					{
+						// It's the body which stop the enlaring if no block boundary found.
+						blockBoundary = blockBoundary || body;
+
+						// Start the range at different position by comparing
+						// the document position of it with 'enlargeable' node.
 						this.setStartAt(
-							enlargeable, CKEDITOR.POSITION_BEFORE_START );
+								blockBoundary,
+								blockBoundary.contains( enlargeable ) ?
+									CKEDITOR.POSITION_AFTER_START :
+									CKEDITOR.POSITION_AFTER_END );
+					}
 
 					// Enlarging the end boundary.
 					walkerRange = this.clone();
 					walkerRange.collapse();
-					walkerRange.setEndAt(
-						this.document.getBody(), CKEDITOR.POSITION_BEFORE_END );
+					walkerRange.setEndAt( body, CKEDITOR.POSITION_BEFORE_END );
 					walker = new CKEDITOR.dom.walker( walkerRange );
+
+					// tailBrGuard only used for on range end.
 					walker.guard = ( unit == CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS ) ?
-						 listGuard : guard;
+						tailBrGuard : boundaryGuard;
+					blockBoundary = null;
+					// End the range right before the block boundary node.
+					;
 					if ( ( enlargeable = walker.lastForward() ) )
-							this.setEndAfter( enlargeable );
+					{
+						// It's the body which stop the enlaring if no block boundary found.
+						blockBoundary = blockBoundary || body;
+
+						// Start the range at different position by comparing
+						// the document position of it with 'enlargeable' node.
+						this.setEndAt(
+								blockBoundary,
+								blockBoundary.contains( enlargeable ) ?
+									CKEDITOR.POSITION_BEFORE_END :
+									CKEDITOR.POSITION_BEFORE_START );
+					}
 					// We must include the <br> at the end of range if there's
 					// one and we're expanding list item contents
@@ -1137,4 +1206,5 @@
 		insertNode : function( node )
 		{
+			this.optimizeBookmark();
 			this.trim( false, true );
 
@@ -1327,5 +1397,4 @@
 
 			var elementPath = null;
-
 			// Do nothing if the boundaries are in different block limits.
 			if ( !startBlockLimit.equals( endBlockLimit ) )
Index: /CKEditor/branches/features/kama/_source/core/dom/walker.js
===================================================================
--- /CKEditor/branches/features/kama/_source/core/dom/walker.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/core/dom/walker.js	(revision 3648)
@@ -354,4 +354,39 @@
 			return this.blockBoundary( { br : 1 } );
 	};
+	/**
+	 * Whether the node is a bookmark node's inner text node.
+	 */
+	CKEDITOR.dom.walker.bookmarkContents = function( node )
+	{
+	},
+
+	/**
+	 * Whether the to-be-evaluated node is a bookmark node OR bookmark node
+	 * inner contents.
+	 * @param {Boolean} contentOnly Whether only test againt the text content of
+	 * bookmark node instead of the element itself(default).
+	 * @param {Boolean} isReject Whether should return 'false' for the bookmark
+	 * node instead of 'true'(default).
+	 */
+	CKEDITOR.dom.walker.bookmark = function( contentOnly, isReject )
+	{
+		function isBookmarkNode( node )
+		{
+			return ( node && node.getName
+					&& node.getName() == 'span'
+					&& node.hasAttribute('_fck_bookmark') );
+		}
+
+		return function( node )
+		{
+			var retval, parent;
+			// Is bookmark inner text node?
+			retval = ( node && !node.getName && ( parent = node.getParent() )
+						&& isBookmarkNode( parent ) );
+			// Is bookmark node?
+			retval = contentOnly ? retval : retval || isBookmarkNode( node );
+			return isReject ? !retval : !!retval;
+		};
+	};
 
 })();
Index: /CKEditor/branches/features/kama/_source/core/editor.js
===================================================================
--- /CKEditor/branches/features/kama/_source/core/editor.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/core/editor.js	(revision 3648)
@@ -151,14 +151,14 @@
 		var config			= editor.config,
 			plugins			= config.plugins,
-			addPlugins		= config.addPlugins,
+			extraPlugins	= config.extraPlugins,
 			removePlugins	= config.removePlugins;
 
-		if ( addPlugins )
+		if ( extraPlugins )
 		{
 			// Remove them first to avoid duplications.
-			var removeRegex = new RegExp( '(?:^|,)(?:' + addPlugins.replace( /\s*,\s*/g, '|' ) + ')(?=,|$)' , 'g' );
+			var removeRegex = new RegExp( '(?:^|,)(?:' + extraPlugins.replace( /\s*,\s*/g, '|' ) + ')(?=,|$)' , 'g' );
 			plugins = plugins.replace( removeRegex, '' );
 
-			plugins += ',' + addPlugins;
+			plugins += ',' + extraPlugins;
 		}
 
Index: /CKEditor/branches/features/kama/_source/core/htmlparser/fragment.js
===================================================================
--- /CKEditor/branches/features/kama/_source/core/htmlparser/fragment.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/core/htmlparser/fragment.js	(revision 3648)
@@ -51,4 +51,5 @@
 	 * Creates a {@link CKEDITOR.htmlParser.fragment} from an HTML string.
 	 * @param {String} fragmentHtml The HTML to be parsed, filling the fragment.
+	 * @param {Number} [fixForBody=false] Wrap body with specified element if needed.
 	 * @returns CKEDITOR.htmlParser.fragment The fragment created.
 	 * @example
@@ -108,5 +109,5 @@
 				// Create a <p> in the fragment.
 				currentNode = target;
-				parser.onTagOpen( 'p', {} );
+				parser.onTagOpen( fixForBody, {} );
 
 				// The new target now is the <p>.
@@ -115,4 +116,20 @@
 				if ( enforceCurrent )
 					currentNode = savedCurrent;
+			}
+
+			// Rtrim empty spaces on block end boundary. (#3585)
+			if ( element._.isBlockLike )
+			{
+
+				var length = element.children.length,
+					lastChild = element.children[ length - 1 ],
+					text;
+				if ( lastChild && lastChild.type == CKEDITOR.NODE_TEXT )
+				{
+					if ( !( text = CKEDITOR.tools.rtrim( lastChild.value ) ) )
+						element.children.length = length -1;
+					else
+						lastChild.value = text;
+				}
 			}
 
@@ -285,5 +302,5 @@
 
 			if ( fixForBody && !currentNode.type )
-				this.onTagOpen( 'p', {} );
+				this.onTagOpen( fixForBody, {} );
 
 			currentNode.add( new CKEDITOR.htmlParser.text( text ) );
@@ -312,5 +329,5 @@
 			{
 				currentNode = parent;
-				parser.onTagOpen( 'p', {} );
+				parser.onTagOpen( fixForBody, {} );
 				parent = currentNode;
 			}
Index: /CKEditor/branches/features/kama/_source/core/scriptloader.js
===================================================================
--- /CKEditor/branches/features/kama/_source/core/scriptloader.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/core/scriptloader.js	(revision 3648)
@@ -85,5 +85,5 @@
 			var checkLoaded = function( url, success )
 			{
-				( success ? completed : failed).push( url );
+				( success ? completed : failed ).push( url );
 
 				if ( --scriptCount <= 0 )
@@ -147,5 +147,7 @@
 						script.$.onload = function()
 						{
-							onLoad( url, true );
+							// Some browsers, such as Safari, may call the onLoad function
+							// immediately. Which will break the loading sequence. (#3661)
+							setTimeout( function() { onLoad( url, true ); }, 0 );
 						};
 
Index: /CKEditor/branches/features/kama/_source/core/xml.js
===================================================================
--- /CKEditor/branches/features/kama/_source/core/xml.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/core/xml.js	(revision 3648)
@@ -25,6 +25,7 @@
 	else
 	{
+		var data = ( xmlObjectOrData || '' ).replace( /&nbsp;/g, '\xA0' );
 		if ( window.DOMParser )
-			baseXml = (new DOMParser()).parseFromString( xmlObjectOrData || '', 'text/xml' );
+			baseXml = (new DOMParser()).parseFromString( data, 'text/xml' );
 		else if ( window.ActiveXObject )
 		{
@@ -40,5 +41,5 @@
 				baseXml.resolveExternals = false;
 				baseXml.validateOnParse = false;
-				baseXml.loadXML( xmlObjectOrData || '' );
+				baseXml.loadXML( data );
 			}
 		}
Index: /CKEditor/branches/features/kama/_source/lang/_translationstatus.txt
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/_translationstatus.txt	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/_translationstatus.txt	(revision 3648)
@@ -2,58 +2,58 @@
 For licensing, see LICENSE.html or http://ckeditor.com/license
 
-af.js      Found: 312 Missing: 112
-ar.js      Found: 326 Missing: 98
-bg.js      Found: 305 Missing: 119
-bn.js      Found: 307 Missing: 117
-bs.js      Found: 210 Missing: 214
-ca.js      Found: 327 Missing: 97
-cs.js      Found: 327 Missing: 97
-da.js      Found: 326 Missing: 98
-de.js      Found: 327 Missing: 97
-el.js      Found: 311 Missing: 113
-en-au.js   Found: 395 Missing: 29
-en-ca.js   Found: 395 Missing: 29
-en-uk.js   Found: 395 Missing: 29
-eo.js      Found: 282 Missing: 142
-es.js      Found: 332 Missing: 92
-et.js      Found: 326 Missing: 98
-eu.js      Found: 327 Missing: 97
-fa.js      Found: 326 Missing: 98
-fi.js      Found: 325 Missing: 99
-fo.js      Found: 326 Missing: 98
-fr-ca.js   Found: 327 Missing: 97
-fr.js      Found: 369 Missing: 55
-gl.js      Found: 308 Missing: 116
-gu.js      Found: 326 Missing: 98
-he.js      Found: 331 Missing: 93
-hi.js      Found: 327 Missing: 97
-hr.js      Found: 327 Missing: 97
-hu.js      Found: 326 Missing: 98
-is.js      Found: 332 Missing: 92
-it.js      Found: 325 Missing: 99
-ja.js      Found: 327 Missing: 97
-km.js      Found: 299 Missing: 125
-ko.js      Found: 318 Missing: 106
-lt.js      Found: 331 Missing: 93
-lv.js      Found: 308 Missing: 116
-mn.js      Found: 326 Missing: 98
-ms.js      Found: 287 Missing: 137
-nb.js      Found: 325 Missing: 99
-nl.js      Found: 327 Missing: 97
-no.js      Found: 325 Missing: 99
-pl.js      Found: 325 Missing: 99
-pt-br.js   Found: 325 Missing: 99
-pt.js      Found: 307 Missing: 117
-ro.js      Found: 326 Missing: 98
-ru.js      Found: 332 Missing: 92
-sk.js      Found: 327 Missing: 97
-sl.js      Found: 325 Missing: 99
-sr-latn.js Found: 301 Missing: 123
-sr.js      Found: 301 Missing: 123
-sv.js      Found: 324 Missing: 100
-th.js      Found: 312 Missing: 112
-tr.js      Found: 332 Missing: 92
-uk.js      Found: 327 Missing: 97
-vi.js      Found: 326 Missing: 98
-zh-cn.js   Found: 332 Missing: 92
-zh.js      Found: 327 Missing: 97
+af.js      Found: 312 Missing: 121
+ar.js      Found: 326 Missing: 107
+bg.js      Found: 305 Missing: 128
+bn.js      Found: 307 Missing: 126
+bs.js      Found: 210 Missing: 223
+ca.js      Found: 327 Missing: 106
+cs.js      Found: 327 Missing: 106
+da.js      Found: 326 Missing: 107
+de.js      Found: 327 Missing: 106
+el.js      Found: 311 Missing: 122
+en-au.js   Found: 395 Missing: 38
+en-ca.js   Found: 395 Missing: 38
+en-uk.js   Found: 395 Missing: 38
+eo.js      Found: 282 Missing: 151
+es.js      Found: 332 Missing: 101
+et.js      Found: 326 Missing: 107
+eu.js      Found: 327 Missing: 106
+fa.js      Found: 326 Missing: 107
+fi.js      Found: 325 Missing: 108
+fo.js      Found: 326 Missing: 107
+fr-ca.js   Found: 327 Missing: 106
+fr.js      Found: 369 Missing: 64
+gl.js      Found: 308 Missing: 125
+gu.js      Found: 326 Missing: 107
+he.js      Found: 331 Missing: 102
+hi.js      Found: 327 Missing: 106
+hr.js      Found: 327 Missing: 106
+hu.js      Found: 326 Missing: 107
+is.js      Found: 332 Missing: 101
+it.js      Found: 325 Missing: 108
+ja.js      Found: 327 Missing: 106
+km.js      Found: 299 Missing: 134
+ko.js      Found: 318 Missing: 115
+lt.js      Found: 331 Missing: 102
+lv.js      Found: 308 Missing: 125
+mn.js      Found: 326 Missing: 107
+ms.js      Found: 287 Missing: 146
+nb.js      Found: 325 Missing: 108
+nl.js      Found: 327 Missing: 106
+no.js      Found: 325 Missing: 108
+pl.js      Found: 325 Missing: 108
+pt-br.js   Found: 325 Missing: 108
+pt.js      Found: 307 Missing: 126
+ro.js      Found: 326 Missing: 107
+ru.js      Found: 332 Missing: 101
+sk.js      Found: 327 Missing: 106
+sl.js      Found: 325 Missing: 108
+sr-latn.js Found: 301 Missing: 132
+sr.js      Found: 301 Missing: 132
+sv.js      Found: 324 Missing: 109
+th.js      Found: 312 Missing: 121
+tr.js      Found: 332 Missing: 101
+uk.js      Found: 327 Missing: 106
+vi.js      Found: 326 Missing: 107
+zh-cn.js   Found: 332 Missing: 101
+zh.js      Found: 327 Missing: 106
Index: /CKEditor/branches/features/kama/_source/lang/af.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/af.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/af.js	(revision 3648)
@@ -426,4 +426,13 @@
 		alignTop	: 'Bo',
 		quality		: 'Quality', // MISSING
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode', // MISSING
 		flashvars	: 'Variables for Flash', // MISSING
Index: /CKEditor/branches/features/kama/_source/lang/ar.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/ar.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/ar.js	(revision 3648)
@@ -237,5 +237,5 @@
 			splitHorizontal	: 'تقسيم الخلية أفقياً',
 			splitVertical	: 'تقسيم الخلية عمودياً',
-			title			: 'Cell Properties', // MISSING
+			title			: "خصائص الخلية",
 			cellType		: 'Cell Type', // MISSING
 			rowSpan			: 'Rows Span', // MISSING
@@ -426,4 +426,13 @@
 		alignTop	: 'أعلى',
 		quality		: 'Quality', // MISSING
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode', // MISSING
 		flashvars	: 'Variables for Flash', // MISSING
Index: /CKEditor/branches/features/kama/_source/lang/bg.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/bg.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/bg.js	(revision 3648)
@@ -426,4 +426,13 @@
 		alignTop	: 'Отгоре',
 		quality		: 'Quality', // MISSING
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode', // MISSING
 		flashvars	: 'Variables for Flash', // MISSING
Index: /CKEditor/branches/features/kama/_source/lang/bn.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/bn.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/bn.js	(revision 3648)
@@ -426,4 +426,13 @@
 		alignTop	: 'উপর',
 		quality		: 'Quality', // MISSING
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode', // MISSING
 		flashvars	: 'Variables for Flash', // MISSING
Index: /CKEditor/branches/features/kama/_source/lang/bs.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/bs.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/bs.js	(revision 3648)
@@ -426,4 +426,13 @@
 		alignTop	: 'Vrh',
 		quality		: 'Quality', // MISSING
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode', // MISSING
 		flashvars	: 'Variables for Flash', // MISSING
Index: /CKEditor/branches/features/kama/_source/lang/ca.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/ca.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/ca.js	(revision 3648)
@@ -426,4 +426,13 @@
 		alignTop	: 'Top',
 		quality		: 'Quality', // MISSING
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode', // MISSING
 		flashvars	: 'Variables for Flash', // MISSING
Index: /CKEditor/branches/features/kama/_source/lang/cs.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/cs.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/cs.js	(revision 3648)
@@ -426,4 +426,13 @@
 		alignTop	: 'Nahoru',
 		quality		: 'Quality', // MISSING
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode', // MISSING
 		flashvars	: 'Variables for Flash', // MISSING
Index: /CKEditor/branches/features/kama/_source/lang/da.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/da.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/da.js	(revision 3648)
@@ -426,4 +426,13 @@
 		alignTop	: 'Øverst',
 		quality		: 'Quality', // MISSING
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode', // MISSING
 		flashvars	: 'Variables for Flash', // MISSING
Index: /CKEditor/branches/features/kama/_source/lang/de.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/de.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/de.js	(revision 3648)
@@ -426,4 +426,13 @@
 		alignTop	: 'Oben',
 		quality		: 'Quality', // MISSING
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode', // MISSING
 		flashvars	: 'Variables for Flash', // MISSING
Index: /CKEditor/branches/features/kama/_source/lang/el.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/el.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/el.js	(revision 3648)
@@ -426,4 +426,13 @@
 		alignTop	: 'Πάνω (Top)',
 		quality		: 'Quality', // MISSING
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode', // MISSING
 		flashvars	: 'Variables for Flash', // MISSING
Index: /CKEditor/branches/features/kama/_source/lang/en-au.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/en-au.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/en-au.js	(revision 3648)
@@ -106,5 +106,5 @@
 	link :
 	{
-		toolbar		: 'Link\u200b',		// IE6 BUG: A title called "Link" in an <A> tag would invalidate its padding!!
+		toolbar		: 'Link',
 		menu		: 'Edit Link',
 		title		: 'Link',
@@ -426,4 +426,13 @@
 		alignTop	: 'Top',
 		quality		: 'Quality',
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode',
 		flashvars	: 'Variables for Flash',
Index: /CKEditor/branches/features/kama/_source/lang/en-ca.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/en-ca.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/en-ca.js	(revision 3648)
@@ -106,5 +106,5 @@
 	link :
 	{
-		toolbar		: 'Link\u200b',		// IE6 BUG: A title called "Link" in an <A> tag would invalidate its padding!!
+		toolbar		: 'Link',
 		menu		: 'Edit Link',
 		title		: 'Link',
@@ -426,4 +426,13 @@
 		alignTop	: 'Top',
 		quality		: 'Quality',
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode',
 		flashvars	: 'Variables for Flash',
Index: /CKEditor/branches/features/kama/_source/lang/en-uk.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/en-uk.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/en-uk.js	(revision 3648)
@@ -106,5 +106,5 @@
 	link :
 	{
-		toolbar		: 'Link\u200b',		// IE6 BUG: A title called "Link" in an <A> tag would invalidate its padding!!
+		toolbar		: 'Link',
 		menu		: 'Edit Link',
 		title		: 'Link',
@@ -426,4 +426,13 @@
 		alignTop	: 'Top',
 		quality		: 'Quality',
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode',
 		flashvars	: 'Variables for Flash',
Index: /CKEditor/branches/features/kama/_source/lang/en.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/en.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/en.js	(revision 3648)
@@ -93,5 +93,8 @@
 		validateNumberFailed	: 'This value is not a number.',
 		confirmNewPage	: 'Any unsaved changes to this content will be lost. Are you sure you want to load new page?',
-		confirmCancel	: 'Some of the options have been changed. Are you sure to close the dialog?'
+		confirmCancel	: 'Some of the options have been changed. Are you sure to close the dialog?',
+
+		// Put the voice-only part of the label in the span.
+		unavailable		: '%1<span class="cke_accessibility">, unavailable</span>'
 	},
 
@@ -106,5 +109,5 @@
 	link :
 	{
-		toolbar		: 'Link\u200b',		// IE6 BUG: A title called "Link" in an <A> tag would invalidate its padding!!
+		toolbar		: 'Link',
 		menu		: 'Edit Link',
 		title		: 'Link',
@@ -426,4 +429,13 @@
 		alignTop	: 'Top',
 		quality		: 'Quality',
+		qualityBest		 : 'Best',
+		qualityHigh		 : 'High',
+		qualityAutoHigh	 : 'Auto High',
+		qualityMedium	 : 'Medium',
+		qualityAutoLow	 : 'Auto Low',
+		qualityLow		 : 'Low',
+		windowModeWindow	 : 'Window',
+		windowModeOpaque	 : 'Opaque',
+		windowModeTransparent	 : 'Transparent',
 		windowMode	: 'Window mode',
 		flashvars	: 'Variables for Flash',
Index: /CKEditor/branches/features/kama/_source/lang/eo.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/eo.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/eo.js	(revision 3648)
@@ -426,4 +426,13 @@
 		alignTop	: 'Supre',
 		quality		: 'Quality', // MISSING
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode', // MISSING
 		flashvars	: 'Variables for Flash', // MISSING
Index: /CKEditor/branches/features/kama/_source/lang/es.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/es.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/es.js	(revision 3648)
@@ -426,4 +426,13 @@
 		alignTop	: 'Tope',
 		quality		: 'Quality', // MISSING
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode', // MISSING
 		flashvars	: 'Variables for Flash', // MISSING
Index: /CKEditor/branches/features/kama/_source/lang/et.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/et.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/et.js	(revision 3648)
@@ -426,4 +426,13 @@
 		alignTop	: 'Üles',
 		quality		: 'Quality', // MISSING
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode', // MISSING
 		flashvars	: 'Variables for Flash', // MISSING
Index: /CKEditor/branches/features/kama/_source/lang/eu.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/eu.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/eu.js	(revision 3648)
@@ -426,4 +426,13 @@
 		alignTop	: 'Goian',
 		quality		: 'Quality', // MISSING
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode', // MISSING
 		flashvars	: 'Variables for Flash', // MISSING
Index: /CKEditor/branches/features/kama/_source/lang/fa.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/fa.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/fa.js	(revision 3648)
@@ -237,5 +237,5 @@
 			splitHorizontal	: 'جدا کردن افقی سلول',
 			splitVertical	: 'جدا کردن عمودی سلول',
-			title			: 'Cell Properties', // MISSING
+			title			: "ویژگیهای سلول",
 			cellType		: 'Cell Type', // MISSING
 			rowSpan			: 'Rows Span', // MISSING
@@ -426,4 +426,13 @@
 		alignTop	: 'بالا',
 		quality		: 'Quality', // MISSING
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode', // MISSING
 		flashvars	: 'Variables for Flash', // MISSING
Index: /CKEditor/branches/features/kama/_source/lang/fi.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/fi.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/fi.js	(revision 3648)
@@ -426,4 +426,13 @@
 		alignTop	: 'Ylös',
 		quality		: 'Quality', // MISSING
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode', // MISSING
 		flashvars	: 'Variables for Flash', // MISSING
Index: /CKEditor/branches/features/kama/_source/lang/fo.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/fo.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/fo.js	(revision 3648)
@@ -426,4 +426,13 @@
 		alignTop	: 'Ovast',
 		quality		: 'Quality', // MISSING
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode', // MISSING
 		flashvars	: 'Variables for Flash', // MISSING
Index: /CKEditor/branches/features/kama/_source/lang/fr-ca.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/fr-ca.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/fr-ca.js	(revision 3648)
@@ -426,4 +426,13 @@
 		alignTop	: 'Haut',
 		quality		: 'Quality', // MISSING
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode', // MISSING
 		flashvars	: 'Variables for Flash', // MISSING
Index: /CKEditor/branches/features/kama/_source/lang/fr.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/fr.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/fr.js	(revision 3648)
@@ -426,4 +426,13 @@
 		alignTop	: 'Dessus',
 		quality		: 'Qualité',
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Mode fenêtre',
 		flashvars	: 'Variables du Flash',
Index: /CKEditor/branches/features/kama/_source/lang/gl.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/gl.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/gl.js	(revision 3648)
@@ -426,4 +426,13 @@
 		alignTop	: 'Tope',
 		quality		: 'Quality', // MISSING
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode', // MISSING
 		flashvars	: 'Variables for Flash', // MISSING
Index: /CKEditor/branches/features/kama/_source/lang/gu.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/gu.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/gu.js	(revision 3648)
@@ -426,4 +426,13 @@
 		alignTop	: 'ઉપર',
 		quality		: 'Quality', // MISSING
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode', // MISSING
 		flashvars	: 'Variables for Flash', // MISSING
Index: /CKEditor/branches/features/kama/_source/lang/he.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/he.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/he.js	(revision 3648)
@@ -237,5 +237,5 @@
 			splitHorizontal	: 'פצל תא אופקית',
 			splitVertical	: 'פצל תא אנכית',
-			title			: 'Cell Properties', // MISSING
+			title			: "תכונות התא",
 			cellType		: 'Cell Type', // MISSING
 			rowSpan			: 'Rows Span', // MISSING
@@ -426,4 +426,13 @@
 		alignTop	: 'למעלה',
 		quality		: 'Quality', // MISSING
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode', // MISSING
 		flashvars	: 'Variables for Flash', // MISSING
Index: /CKEditor/branches/features/kama/_source/lang/hi.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/hi.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/hi.js	(revision 3648)
@@ -426,4 +426,13 @@
 		alignTop	: 'ऊपर',
 		quality		: 'Quality', // MISSING
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode', // MISSING
 		flashvars	: 'Variables for Flash', // MISSING
Index: /CKEditor/branches/features/kama/_source/lang/hr.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/hr.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/hr.js	(revision 3648)
@@ -426,4 +426,13 @@
 		alignTop	: 'Vrh',
 		quality		: 'Quality', // MISSING
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode', // MISSING
 		flashvars	: 'Variables for Flash', // MISSING
Index: /CKEditor/branches/features/kama/_source/lang/hu.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/hu.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/hu.js	(revision 3648)
@@ -426,4 +426,13 @@
 		alignTop	: 'Tetejére',
 		quality		: 'Quality', // MISSING
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode', // MISSING
 		flashvars	: 'Variables for Flash', // MISSING
Index: /CKEditor/branches/features/kama/_source/lang/is.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/is.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/is.js	(revision 3648)
@@ -426,4 +426,13 @@
 		alignTop	: 'Efst',
 		quality		: 'Quality', // MISSING
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode', // MISSING
 		flashvars	: 'Variables for Flash', // MISSING
Index: /CKEditor/branches/features/kama/_source/lang/it.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/it.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/it.js	(revision 3648)
@@ -426,4 +426,13 @@
 		alignTop	: 'In Alto',
 		quality		: 'Quality', // MISSING
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode', // MISSING
 		flashvars	: 'Variables for Flash', // MISSING
Index: /CKEditor/branches/features/kama/_source/lang/ja.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/ja.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/ja.js	(revision 3648)
@@ -426,4 +426,13 @@
 		alignTop	: '上',
 		quality		: 'Quality', // MISSING
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode', // MISSING
 		flashvars	: 'Variables for Flash', // MISSING
Index: /CKEditor/branches/features/kama/_source/lang/km.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/km.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/km.js	(revision 3648)
@@ -426,4 +426,13 @@
 		alignTop	: 'ខាងលើ',
 		quality		: 'Quality', // MISSING
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode', // MISSING
 		flashvars	: 'Variables for Flash', // MISSING
Index: /CKEditor/branches/features/kama/_source/lang/ko.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/ko.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/ko.js	(revision 3648)
@@ -426,4 +426,13 @@
 		alignTop	: '위',
 		quality		: 'Quality', // MISSING
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode', // MISSING
 		flashvars	: 'Variables for Flash', // MISSING
Index: /CKEditor/branches/features/kama/_source/lang/lt.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/lt.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/lt.js	(revision 3648)
@@ -426,4 +426,13 @@
 		alignTop	: 'Viršūnę',
 		quality		: 'Quality', // MISSING
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode', // MISSING
 		flashvars	: 'Variables for Flash', // MISSING
Index: /CKEditor/branches/features/kama/_source/lang/lv.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/lv.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/lv.js	(revision 3648)
@@ -426,4 +426,13 @@
 		alignTop	: 'Augšā',
 		quality		: 'Quality', // MISSING
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode', // MISSING
 		flashvars	: 'Variables for Flash', // MISSING
Index: /CKEditor/branches/features/kama/_source/lang/mn.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/mn.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/mn.js	(revision 3648)
@@ -426,4 +426,13 @@
 		alignTop	: 'Дээд талд',
 		quality		: 'Quality', // MISSING
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode', // MISSING
 		flashvars	: 'Variables for Flash', // MISSING
Index: /CKEditor/branches/features/kama/_source/lang/ms.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/ms.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/ms.js	(revision 3648)
@@ -426,4 +426,13 @@
 		alignTop	: 'Atas',
 		quality		: 'Quality', // MISSING
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode', // MISSING
 		flashvars	: 'Variables for Flash', // MISSING
Index: /CKEditor/branches/features/kama/_source/lang/nb.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/nb.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/nb.js	(revision 3648)
@@ -426,4 +426,13 @@
 		alignTop	: 'Topp',
 		quality		: 'Quality', // MISSING
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode', // MISSING
 		flashvars	: 'Variables for Flash', // MISSING
Index: /CKEditor/branches/features/kama/_source/lang/nl.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/nl.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/nl.js	(revision 3648)
@@ -426,4 +426,13 @@
 		alignTop	: 'Boven',
 		quality		: 'Quality', // MISSING
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode', // MISSING
 		flashvars	: 'Variables for Flash', // MISSING
Index: /CKEditor/branches/features/kama/_source/lang/no.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/no.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/no.js	(revision 3648)
@@ -426,4 +426,13 @@
 		alignTop	: 'Topp',
 		quality		: 'Quality', // MISSING
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode', // MISSING
 		flashvars	: 'Variables for Flash', // MISSING
Index: /CKEditor/branches/features/kama/_source/lang/pl.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/pl.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/pl.js	(revision 3648)
@@ -426,4 +426,13 @@
 		alignTop	: 'Do góry',
 		quality		: 'Quality', // MISSING
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode', // MISSING
 		flashvars	: 'Variables for Flash', // MISSING
Index: /CKEditor/branches/features/kama/_source/lang/pt-br.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/pt-br.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/pt-br.js	(revision 3648)
@@ -426,4 +426,13 @@
 		alignTop	: 'Superior',
 		quality		: 'Quality', // MISSING
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode', // MISSING
 		flashvars	: 'Variables for Flash', // MISSING
Index: /CKEditor/branches/features/kama/_source/lang/pt.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/pt.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/pt.js	(revision 3648)
@@ -426,4 +426,13 @@
 		alignTop	: 'Topo',
 		quality		: 'Quality', // MISSING
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode', // MISSING
 		flashvars	: 'Variables for Flash', // MISSING
Index: /CKEditor/branches/features/kama/_source/lang/ro.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/ro.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/ro.js	(revision 3648)
@@ -426,4 +426,13 @@
 		alignTop	: 'Sus',
 		quality		: 'Quality', // MISSING
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode', // MISSING
 		flashvars	: 'Variables for Flash', // MISSING
Index: /CKEditor/branches/features/kama/_source/lang/ru.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/ru.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/ru.js	(revision 3648)
@@ -426,4 +426,13 @@
 		alignTop	: 'По верху',
 		quality		: 'Quality', // MISSING
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode', // MISSING
 		flashvars	: 'Variables for Flash', // MISSING
Index: /CKEditor/branches/features/kama/_source/lang/sk.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/sk.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/sk.js	(revision 3648)
@@ -426,4 +426,13 @@
 		alignTop	: 'Nahor',
 		quality		: 'Quality', // MISSING
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode', // MISSING
 		flashvars	: 'Variables for Flash', // MISSING
Index: /CKEditor/branches/features/kama/_source/lang/sl.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/sl.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/sl.js	(revision 3648)
@@ -426,4 +426,13 @@
 		alignTop	: 'Na vrh',
 		quality		: 'Quality', // MISSING
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode', // MISSING
 		flashvars	: 'Variables for Flash', // MISSING
Index: /CKEditor/branches/features/kama/_source/lang/sr-latn.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/sr-latn.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/sr-latn.js	(revision 3648)
@@ -426,4 +426,13 @@
 		alignTop	: 'Vrh',
 		quality		: 'Quality', // MISSING
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode', // MISSING
 		flashvars	: 'Variables for Flash', // MISSING
Index: /CKEditor/branches/features/kama/_source/lang/sr.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/sr.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/sr.js	(revision 3648)
@@ -426,4 +426,13 @@
 		alignTop	: 'Врх',
 		quality		: 'Quality', // MISSING
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode', // MISSING
 		flashvars	: 'Variables for Flash', // MISSING
Index: /CKEditor/branches/features/kama/_source/lang/sv.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/sv.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/sv.js	(revision 3648)
@@ -426,4 +426,13 @@
 		alignTop	: 'Överkant',
 		quality		: 'Quality', // MISSING
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode', // MISSING
 		flashvars	: 'Variables for Flash', // MISSING
Index: /CKEditor/branches/features/kama/_source/lang/th.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/th.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/th.js	(revision 3648)
@@ -426,4 +426,13 @@
 		alignTop	: 'บนสุด',
 		quality		: 'Quality', // MISSING
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode', // MISSING
 		flashvars	: 'Variables for Flash', // MISSING
Index: /CKEditor/branches/features/kama/_source/lang/tr.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/tr.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/tr.js	(revision 3648)
@@ -426,4 +426,13 @@
 		alignTop	: 'Tepe',
 		quality		: 'Quality', // MISSING
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode', // MISSING
 		flashvars	: 'Variables for Flash', // MISSING
Index: /CKEditor/branches/features/kama/_source/lang/uk.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/uk.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/uk.js	(revision 3648)
@@ -426,4 +426,13 @@
 		alignTop	: 'По верху',
 		quality		: 'Quality', // MISSING
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode', // MISSING
 		flashvars	: 'Variables for Flash', // MISSING
Index: /CKEditor/branches/features/kama/_source/lang/vi.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/vi.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/vi.js	(revision 3648)
@@ -426,4 +426,13 @@
 		alignTop	: 'Trên',
 		quality		: 'Quality', // MISSING
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode', // MISSING
 		flashvars	: 'Variables for Flash', // MISSING
Index: /CKEditor/branches/features/kama/_source/lang/zh-cn.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/zh-cn.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/zh-cn.js	(revision 3648)
@@ -426,4 +426,13 @@
 		alignTop	: '顶端',
 		quality		: 'Quality', // MISSING
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode', // MISSING
 		flashvars	: 'Variables for Flash', // MISSING
Index: /CKEditor/branches/features/kama/_source/lang/zh.js
===================================================================
--- /CKEditor/branches/features/kama/_source/lang/zh.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/lang/zh.js	(revision 3648)
@@ -426,4 +426,13 @@
 		alignTop	: '靠上對齊',
 		quality		: 'Quality', // MISSING
+		qualityBest		 : 'Best', // MISSING
+		qualityHigh		 : 'High', // MISSING
+		qualityAutoHigh	 : 'Auto High', // MISSING
+		qualityMedium	 : 'Medium', // MISSING
+		qualityAutoLow	 : 'Auto Low', // MISSING
+		qualityLow		 : 'Low', // MISSING
+		windowModeWindow	 : 'Window', // MISSING
+		windowModeOpaque	 : 'Opaque', // MISSING
+		windowModeTransparent	 : 'Transparent', // MISSING
 		windowMode	: 'Window mode', // MISSING
 		flashvars	: 'Variables for Flash', // MISSING
Index: /CKEditor/branches/features/kama/_source/plugins/about/plugin.js
===================================================================
--- /CKEditor/branches/features/kama/_source/plugins/about/plugin.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/plugins/about/plugin.js	(revision 3648)
@@ -10,4 +10,5 @@
 		var command = editor.addCommand( 'about', new CKEDITOR.dialogCommand( 'about' ) );
 		command.modes = { wysiwyg:1, source:1 };
+		command.canUndo = false;
 
 		editor.ui.addButton( 'About',
Index: /CKEditor/branches/features/kama/_source/plugins/button/plugin.js
===================================================================
--- /CKEditor/branches/features/kama/_source/plugins/button/plugin.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/plugins/button/plugin.js	(revision 3648)
@@ -73,4 +73,5 @@
 
 		var id = this._.id = 'cke_' + CKEDITOR.tools.getNextNumber();
+		this._.editor = editor;
 
 		var instance =
@@ -186,5 +187,15 @@
 			return;
 
-		CKEDITOR.document.getById( this._.id ).setState( state );
+		var element = CKEDITOR.document.getById( this._.id );
+		element.setState( state );
+
+		var htmlTitle = this.title,
+			unavailable = this._.editor.lang.common.unavailable,
+			labelElement = element.getChild( 1 );
+
+		if ( state == CKEDITOR.TRISTATE_DISABLED )
+			htmlTitle = unavailable.replace( '%1', this.title );
+
+		labelElement.setHtml( htmlTitle );
 
 		this._.state = state;
Index: /CKEditor/branches/features/kama/_source/plugins/clipboard/dialogs/paste.js
===================================================================
--- /CKEditor/branches/features/kama/_source/plugins/clipboard/dialogs/paste.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/plugins/clipboard/dialogs/paste.js	(revision 3648)
@@ -11,6 +11,6 @@
 		title : editor.lang.clipboard.title,
 
-		minWidth : 350,
-		minHeight : 240,
+		minWidth : CKEDITOR.env.ie && CKEDITOR.env.quirks ? 370 : 350,
+		minHeight : CKEDITOR.env.ie && CKEDITOR.env.quirks ? 250 : 240,
 		htmlToLoad : '<!doctype html><script type="text/javascript">'
 				+ 'window.onload = function()'
Index: /CKEditor/branches/features/kama/_source/plugins/clipboard/plugin.js
===================================================================
--- /CKEditor/branches/features/kama/_source/plugins/clipboard/plugin.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/plugins/clipboard/plugin.js	(revision 3648)
@@ -61,4 +61,5 @@
 	{
 		this.type = type;
+		this.canUndo = ( this.type == 'cut' );		// We can't undo copy to clipboard.
 	};
 
Index: /CKEditor/branches/features/kama/_source/plugins/dialog/plugin.js
===================================================================
--- /CKEditor/branches/features/kama/_source/plugins/dialog/plugin.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/plugins/dialog/plugin.js	(revision 3648)
@@ -610,7 +610,4 @@
 			this._.hasFocus = false;
 
-			// Save the initial values of the dialog.
-			this.foreach( function( contentObj ) { contentObj.setInitValue && contentObj.setInitValue(); } );
-
 			// Rearrange the dialog to the middle of the window.
 			CKEDITOR.tools.setTimeout( function()
@@ -626,4 +623,8 @@
 					this.fireOnce( 'load', {} );
 					this.fire( 'show', {} );
+
+					// Save the initial values of the dialog.
+					this.foreach( function( contentObj ) { contentObj.setInitValue && contentObj.setInitValue(); } );
+
 				},
 				100, this );
@@ -2443,5 +2444,8 @@
 		{
 			editor.openDialog( this.dialogName );
-		}
+		},
+		// Dialog commands just open a dialog ui, thus require no undo logic,
+		// undo support should dedicate to specific dialog implementation.
+		canUndo: false
 	};
 
Index: /CKEditor/branches/features/kama/_source/plugins/domiterator/plugin.js
===================================================================
--- /CKEditor/branches/features/kama/_source/plugins/domiterator/plugin.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/plugins/domiterator/plugin.js	(revision 3648)
@@ -12,36 +12,4 @@
 (function()
 {
-
-	function isBookmarkNode( node )
-	{
-		return ( node && node.getName
-					&& node.getName() == 'span'
-					&& node.hasAttribute( '_fck_bookmark' ) )
-				||
-				( node && !node.getName && isBookmarkNode( node.getParent()) );
-	}
-
-	function ignoreBookmarkEvaluator( node )
-	{
-		return !isBookmarkNode( node );
-	}
-
-
-	/**
-	 * Find next source order node, ignore bookmark nodes and stop at the specified end node.
-	 * @param {Object} currentNode
-	 * @param {Object} endNode
-	 */
-	function getNextSourceNode( currentNode, endNode, startFromSibling )
-	{
-		var next = currentNode;
-		do
-		{
-			next = next.getNextSourceNode(
-				startFromSibling, null, endNode );
-		}
-		while( isBookmarkNode( next ) )
-		return next;
-	}
 
 	var iterator = function( range )
@@ -80,13 +48,14 @@
 				range.enlarge( this.forceBrBreak ? CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS : CKEDITOR.ENLARGE_BLOCK_CONTENTS );
 
-				var walker = new CKEDITOR.dom.walker( range );
-				walker.evaluator = ignoreBookmarkEvaluator;
+				var walker = new CKEDITOR.dom.walker( range ),
+					ignoreBookmarkTextEvaluator = CKEDITOR.dom.walker.bookmark( true, true );
+				// Avoid anchor inside bookmark inner text.
+				walker.evaluator = ignoreBookmarkTextEvaluator;
 				this._.nextNode = walker.next();
-
 				// TODO: It's better to have walker.reset() used here.
 				walker = new CKEDITOR.dom.walker( range );
-				walker.evaluator = ignoreBookmarkEvaluator;
+				walker.evaluator = ignoreBookmarkTextEvaluator;
 				var lastNode = walker.previous();
-				this._.lastNode = getNextSourceNode( lastNode, null, true );
+				this._.lastNode = lastNode.getNextSourceNode( true );
 				// Probably the document end is reached, we need a marker node.
 				if ( !this._.lastNode )
@@ -103,5 +72,4 @@
 
 			this._.nextNode = null;
-
 			while ( currentNode )
 			{
@@ -231,5 +199,5 @@
 					break;
 
-				currentNode = getNextSourceNode( currentNode, lastNode, continueFromSibling );
+				currentNode = currentNode.getNextSourceNode( continueFromSibling, null, lastNode );
 			}
 
@@ -302,5 +270,5 @@
 
 					this._.nextNode = ( block.equals( lastNode ) ? null :
-						getNextSourceNode( range.getBoundaryNodes().endNode, lastNode, true ) );
+						range.getBoundaryNodes().endNode.getNextSourceNode( true, null, lastNode ) );
 				}
 			}
@@ -335,5 +303,5 @@
 			{
 				this._.nextNode = ( isLast || block.equals( lastNode ) ) ? null :
-					getNextSourceNode( block, lastNode, true );
+					block.getNextSourceNode( true, null, lastNode );
 			}
 
Index: /CKEditor/branches/features/kama/_source/plugins/enterkey/plugin.js
===================================================================
--- /CKEditor/branches/features/kama/_source/plugins/enterkey/plugin.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/plugins/enterkey/plugin.js	(revision 3648)
@@ -262,5 +262,5 @@
 			// We need some text inside of it, so the bogus <br> is properly
 			// created.
-			if ( CKEDITOR.env.gecko )
+			if ( !CKEDITOR.env.ie )
 				doc.createText( '\ufeff' ).insertAfter( lineBreak );
 
@@ -271,7 +271,6 @@
 			// Now we can remove the text node contents, so the caret doesn't
 			// stop on it.
-			if ( CKEDITOR.env.gecko )
+			if ( !CKEDITOR.env.ie )
 				lineBreak.getNext().$.nodeValue = '';
-
 			// IE has different behavior regarding position.
 			if ( CKEDITOR.env.ie )
@@ -285,6 +284,12 @@
 				var dummy = null;
 
-				if ( CKEDITOR.env.opera )
+				// BR is not positioned in Opera and Webkit.
+				if ( !CKEDITOR.env.gecko )
+				{
 					dummy = doc.createElement( 'span' );
+					// We need have some contents for Webkit to position it
+					// under parent node. ( #3681)
+					dummy.setHtml('&nbsp;');
+				}
 				else
 					dummy = doc.createElement( 'br' );
Index: /CKEditor/branches/features/kama/_source/plugins/find/dialogs/find.js
===================================================================
--- /CKEditor/branches/features/kama/_source/plugins/find/dialogs/find.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/plugins/find/dialogs/find.js	(revision 3648)
@@ -503,5 +503,6 @@
 				// 1. Perform the replace when there's already a match here.
 				// 2. Otherwise perform the find but don't replace it immediately.
-				if ( this.matchRange && this.matchRange.isMatched() )
+				if ( this.matchRange && this.matchRange.isMatched()
+						&& !this.matchRange._.isReplaced )
 				{
 					var domRange = this.matchRange.toDomRange();
@@ -510,5 +511,5 @@
 					domRange.insertNode( text );
 					this.matchRange.updateFromDomRange( domRange );
-					this.matchRange._.isMatched = false;
+					this.matchRange._.isReplaced = true;
 					this.replaceCounter++;
 					result = true;
Index: /CKEditor/branches/features/kama/_source/plugins/find/plugin.js
===================================================================
--- /CKEditor/branches/features/kama/_source/plugins/find/plugin.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/plugins/find/plugin.js	(revision 3648)
@@ -14,5 +14,6 @@
 				command : 'find'
 			});
-		editor.addCommand( 'find', new CKEDITOR.dialogCommand( 'find' ) );
+		var findCommand = editor.addCommand( 'find', new CKEDITOR.dialogCommand( 'find' ) );
+		findCommand.canUndo = false;
 
 		editor.ui.addButton( 'Replace',
@@ -21,5 +22,6 @@
 				command : 'replace'
 			});
-		editor.addCommand( 'replace', new CKEDITOR.dialogCommand( 'replace' ) );
+		var replaceCommand = editor.addCommand( 'replace', new CKEDITOR.dialogCommand( 'replace' ) );
+		replaceCommand.canUndo = false;
 
 		CKEDITOR.dialog.add( 'find',	this.path + 'dialogs/find.js' );
Index: /CKEditor/branches/features/kama/_source/plugins/flash/dialogs/flash.js
===================================================================
--- /CKEditor/branches/features/kama/_source/plugins/flash/dialogs/flash.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/plugins/flash/dialogs/flash.js	(revision 3648)
@@ -514,8 +514,8 @@
 									items :
 									[
-										[ editor.lang.common.notSet , ''],
-										[ 'window' ],
-										[ 'opaque' ],
-										[ 'transparent' ]
+										[ editor.lang.common.notSet , '' ],
+										[ editor.lang.flash.windowModeWindow, 'window' ],
+										[ editor.lang.flash.windowModeOpaque, 'opaque' ],
+										[ editor.lang.flash.windowModeTransparent, 'transparent' ]
 									],
 									setup : loadValue,
@@ -530,11 +530,11 @@
 									items :
 									[
-										[ editor.lang.common.notSet , ''],
-										[ 'best' ],
-										[ 'high' ],
-										[ 'autohigh' ],
-										[ 'medium' ],
-										[ 'autolow' ],
-										[ 'low' ]
+										[ editor.lang.common.notSet , '' ],
+										[ editor.lang.flash.qualityBest, 'best' ],
+										[ editor.lang.flash.qualityHigh, 'high' ],
+										[ editor.lang.flash.qualityAutoHigh, 'autohigh' ],
+										[ editor.lang.flash.qualityMedium, 'medium' ],
+										[ editor.lang.flash.qualityAutoLow, 'autolow' ],
+										[ editor.lang.flash.qualityLow, 'low' ]
 									],
 									setup : loadValue,
Index: /CKEditor/branches/features/kama/_source/plugins/floatpanel/plugin.js
===================================================================
--- /CKEditor/branches/features/kama/_source/plugins/floatpanel/plugin.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/plugins/floatpanel/plugin.js	(revision 3648)
@@ -12,4 +12,5 @@
 {
 	var panels = {};
+	var isShowing = false;
 
 	function getPanel( editor, doc, parentElement, definition, level )
@@ -102,4 +103,6 @@
 					block = panel.showBlock( name );
 
+				isShowing = true;
+
 				var element = this.element,
 					iframe = this._.iframe,
@@ -134,5 +137,5 @@
 					focused.on( 'blur', function()
 						{
-							if ( !this._.activeChild )
+							if ( !this._.activeChild && !isShowing )
 								this.hide();
 						},
@@ -215,5 +218,8 @@
 									}
 								}
-								iframe.$.contentWindow.focus();
+								if ( CKEDITOR.env.ie && CKEDITOR.env.quirks )
+									iframe.focus();
+								else
+									iframe.$.contentWindow.focus();
 							}, 0);
 					}, 0);
@@ -221,4 +227,6 @@
 				if ( this.onShow )
 					this.onShow.call( this );
+
+				isShowing = false;
 			},
 
Index: /CKEditor/branches/features/kama/_source/plugins/forms/dialogs/checkbox.js
===================================================================
--- /CKEditor/branches/features/kama/_source/plugins/forms/dialogs/checkbox.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/plugins/forms/dialogs/checkbox.js	(revision 3648)
@@ -51,5 +51,8 @@
 						setup : function( element )
 						{
-							this.setValue( element.getAttribute( '_cke_saved_name' ) || '' );
+							this.setValue(
+									element.getAttribute( '_cke_saved_name' ) ||
+									element.getAttribute( 'name' ) ||
+									'' );
 						},
 						commit : function( data )
Index: /CKEditor/branches/features/kama/_source/plugins/forms/dialogs/radio.js
===================================================================
--- /CKEditor/branches/features/kama/_source/plugins/forms/dialogs/radio.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/plugins/forms/dialogs/radio.js	(revision 3648)
@@ -49,5 +49,8 @@
 						setup : function( element )
 						{
-							this.setValue( element.getAttribute( '_cke_saved_name' ) || '' );
+							this.setValue(
+									element.getAttribute( '_cke_saved_name' ) ||
+									element.getAttribute( 'name' ) ||
+									'' );
 						},
 						commit : function( data )
Index: /CKEditor/branches/features/kama/_source/plugins/forms/dialogs/select.js
===================================================================
--- /CKEditor/branches/features/kama/_source/plugins/forms/dialogs/select.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/plugins/forms/dialogs/select.js	(revision 3648)
@@ -184,5 +184,10 @@
 								this.setValue( '' );
 							else if ( name == 'select' )
-								this.setValue( element.getAttribute( '_cke_saved_name' ) || '' );
+							{
+								this.setValue(
+										element.getAttribute( '_cke_saved_name' ) ||
+										element.getAttribute( 'name' ) ||
+										'' );
+							}
 						},
 						commit : function( element )
@@ -205,4 +210,5 @@
 						style : 'width:350px',
 						'default' : '',
+						className : 'cke_disabled',
 						onLoad : function()
 						{
Index: /CKEditor/branches/features/kama/_source/plugins/forms/dialogs/textarea.js
===================================================================
--- /CKEditor/branches/features/kama/_source/plugins/forms/dialogs/textarea.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/plugins/forms/dialogs/textarea.js	(revision 3648)
@@ -48,5 +48,8 @@
 						setup : function( element )
 						{
-							this.setValue( element.getAttribute( '_cke_saved_name' ) );
+							this.setValue(
+									element.getAttribute( '_cke_saved_name' ) ||
+									element.getAttribute( 'name' ) ||
+									'' );
 						},
 						commit : function( element )
Index: /CKEditor/branches/features/kama/_source/plugins/htmldataprocessor/plugin.js
===================================================================
--- /CKEditor/branches/features/kama/_source/plugins/htmldataprocessor/plugin.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/plugins/htmldataprocessor/plugin.js	(revision 3648)
@@ -20,4 +20,15 @@
 			[ ( /^on/ ), '_cke_pa_on' ]
 		]
+	};
+
+	/**
+	 * IE sucks with dynamic 'name' attribute after element is created, '_cke_saved_name' is used instead for this attribute.
+	 */
+	var removeName = function( element )
+	{
+		var attribs = element.attributes;
+
+		if ( attribs._cke_saved_name )
+			delete attribs.name;
 	};
 
@@ -61,4 +72,6 @@
 					var attribs = element.attributes;
 
+					if ( attribs._cke_saved_name )
+						delete attribs.name;
 					if ( attribs._cke_saved_src )
 						delete attribs.src;
@@ -69,18 +82,14 @@
 					var attribs = element.attributes;
 
+					if ( attribs._cke_saved_name )
+						delete attribs.name;
 					if ( attribs._cke_saved_href )
 						delete attribs.href;
 				},
 
-				/**
-				 * IE sucks with dynamic 'name' attribute after element is created, '_cke_saved_name' is used instead for this attribute.
-				 */
-				input : function( element )
-				{
-					var attribs = element.attributes;
-
-					if ( attribs._cke_saved_name )
-						delete attribs.name;
-				}
+				input : removeName,
+				textarea : removeName,
+				select : removeName,
+				form : removeName
 			},
 
Index: /CKEditor/branches/features/kama/_source/plugins/image/dialogs/image.js
===================================================================
--- /CKEditor/branches/features/kama/_source/plugins/image/dialogs/image.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/plugins/image/dialogs/image.js	(revision 3648)
@@ -94,7 +94,7 @@
 
 		if ( dialog.lockRatio )
-			ratioButton.removeClass( 'BtnUnlocked' );
+			ratioButton.removeClass( 'cke_btn_unlocked' );
 		else
-			ratioButton.addClass( 'BtnUnlocked' );
+			ratioButton.addClass( 'cke_btn_unlocked' );
 
 		return dialog.lockRatio;
@@ -659,7 +659,7 @@
 													html : '<div>'+
 														'<div title="' + editor.lang.image.lockRatio +
-														'" class="BtnLocked" id="btnLockSizes"></div>' +
+														'" class="cke_btn_locked" id="btnLockSizes"></div>' +
 														'<div title="' + editor.lang.image.resetSize +
-														'" class="BtnReset" id="btnResetSize"></div>'+
+														'" class="cke_btn_reset" id="btnResetSize"></div>'+
 														'</div>'
 												}
Index: /CKEditor/branches/features/kama/_source/plugins/list/plugin.js
===================================================================
--- /CKEditor/branches/features/kama/_source/plugins/list/plugin.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/plugins/list/plugin.js	(revision 3648)
@@ -378,5 +378,12 @@
 					paragraph.appendTo( body );
 					ranges = [ new CKEDITOR.dom.range( doc ) ];
-					ranges[0].selectNodeContents( paragraph );
+					// IE exception on inserting anything when anchor inside <br>.
+					if ( paragraph.is( 'br' ) )
+					{
+						ranges[ 0 ].setStartBefore( paragraph );
+						ranges[ 0 ].setEndAfter( paragraph );
+					}
+					else
+						ranges[ 0 ].selectNodeContents( paragraph );
 					selection.selectRanges( ranges );
 				}
@@ -477,35 +484,16 @@
 			{
 				listNode = listsCreated[i];
-				var stopFlag = false,
-					currentNode = listNode;
-
-				while ( !stopFlag )
-				{
-					currentNode = currentNode.getNext();
-					if ( currentNode && currentNode.type == CKEDITOR.NODE_TEXT && emptyTextRegex.test( currentNode.getText() ) )
-						continue;
-					stopFlag = true;
-				}
-
-				if ( currentNode && currentNode.getName() == this.type )
-				{
-					currentNode.remove();
-					currentNode.moveChildren( listNode );
-				}
-
-				stopFlag = false;
-				currentNode = listNode;
-				while ( !stopFlag )
-				{
-					currentNode = currentNode.getNext();
-					if ( currentNode && currentNode.type == CKEDITOR.NODE_TEXT && emptyTextRegex.test( currentNode.getText() ) )
-						continue;
-					stopFlag = true;
-				}
-				if ( currentNode && currentNode.getName() == this.type  )
-				{
-					currentNode.remove();
-					currentNode.moveChildren( listNode, true );
-				}
+				var mergeSibling, listCommand = this;
+				( mergeSibling = function( rtl ){
+
+					var sibling = listNode[ rtl ? 'getPrevious' : 'getNext' ].call( listNode, true );
+					if ( sibling && sibling.getName &&
+					     sibling.getName() == listCommand.type )
+					{
+						sibling.remove();
+						sibling.moveChildren( listNode );
+					}
+				} )();
+				mergeSibling( true );
 			}
 
Index: /CKEditor/branches/features/kama/_source/plugins/maximize/plugin.js
===================================================================
--- /CKEditor/branches/features/kama/_source/plugins/maximize/plugin.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/plugins/maximize/plugin.js	(revision 3648)
@@ -187,4 +187,7 @@
 									top : ( -1 * offset.y ) + 'px'
 								} );
+
+							// Add cke_maximized class.
+							container.addClass( 'cke_maximized' );
 						}
 						else if ( this.state == CKEDITOR.TRISTATE_ON )	// Restore from fullscreen if the state is on.
@@ -210,4 +213,7 @@
 							// Restore the window scroll position.
 							mainWindow.$.scrollTo( outerScroll.x, outerScroll.y );
+
+							// Remove cke_maximized class.
+							container.removeClass( 'cke_maximized' );
 
 							// Emit a resize event, because this time the size is modified in
@@ -242,5 +248,6 @@
 						savedSelection = savedScroll = null;
 						savedState = this.state;
-					}
+					},
+					canUndo : false
 				} );
 
Index: /CKEditor/branches/features/kama/_source/plugins/menu/plugin.js
===================================================================
--- /CKEditor/branches/features/kama/_source/plugins/menu/plugin.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/plugins/menu/plugin.js	(revision 3648)
@@ -16,5 +16,7 @@
 		editor._.menuGroups = groupsOrder;
 		editor._.menuItems = {};
-	}
+	},
+	
+	requires : [ 'floatpanel' ]
 });
 
@@ -158,5 +160,8 @@
 					element = this._.element = block.element;
 					element.addClass( editor.skinClass );
-					element.getDocument().getBody().setStyle( 'overflow', 'hidden' );
+
+					var elementDoc = element.getDocument();
+					elementDoc.getBody().setStyle( 'overflow', 'hidden' );
+					elementDoc.getElementsByTag( 'html' ).getItem( 0 ).setStyle( 'overflow', 'hidden' );
 
 					this._.itemOverFn = CKEDITOR.tools.addFunction( function( index )
@@ -276,4 +281,8 @@
 				state == CKEDITOR.TRISTATE_DISABLED ? 'disabled' :
 				'off' );
+
+			var htmlLabel = this.label;
+			if ( state == CKEDITOR.TRISTATE_DISABLED )
+				htmlLabel = this.editor.lang.common.unavailable.replace( '%1', htmlLabel );
 
 			if ( this.className )
@@ -326,5 +335,5 @@
 
 			output.push(
-							this.label,
+							htmlLabel,
 						'</span>' +
 				'</a>' +
Index: /CKEditor/branches/features/kama/_source/plugins/panel/plugin.js
===================================================================
--- /CKEditor/branches/features/kama/_source/plugins/panel/plugin.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/plugins/panel/plugin.js	(revision 3648)
@@ -267,5 +267,6 @@
 		hide : function()
 		{
-			this.element.setStyle( 'display', 'none' );
+			if ( !this.onHide || this.onHide.call( this )  !== true ) 
+				this.element.setStyle( 'display', 'none' ); 
 		},
 
Index: /CKEditor/branches/features/kama/_source/plugins/panelbutton/plugin.js
===================================================================
--- /CKEditor/branches/features/kama/_source/plugins/panelbutton/plugin.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/plugins/panelbutton/plugin.js	(revision 3648)
@@ -126,7 +126,12 @@
 					};
 
-
 				if ( this.onBlock )
 					this.onBlock( panel, _.id );
+
+				panel.getBlock( _.id ).onHide = function()  
+						{  
+								_.on = 0;  
+								me.setState( CKEDITOR.TRISTATE_OFF );  
+						}; 
 			}
 		}
Index: /CKEditor/branches/features/kama/_source/plugins/pastefromword/dialogs/pastefromword.js
===================================================================
--- /CKEditor/branches/features/kama/_source/plugins/pastefromword/dialogs/pastefromword.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/plugins/pastefromword/dialogs/pastefromword.js	(revision 3648)
@@ -8,6 +8,6 @@
 	return {
 		title : editor.lang.pastefromword.title,
-		minWidth : 350,
-		minHeight : 250,
+		minWidth : CKEDITOR.env.ie && CKEDITOR.env.quirks ? 370 : 350,
+		minHeight : CKEDITOR.env.ie && CKEDITOR.env.quirks ? 270 : 250,
 		htmlToLoad : '<!doctype html><script type="text/javascript">'
 				+ 'window.onload = function()'
Index: /CKEditor/branches/features/kama/_source/plugins/pastetext/dialogs/pastetext.js
===================================================================
--- /CKEditor/branches/features/kama/_source/plugins/pastetext/dialogs/pastetext.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/plugins/pastetext/dialogs/pastetext.js	(revision 3648)
@@ -11,5 +11,5 @@
 				title : editor.lang.pasteText.title,
 
-				minWidth : 350,
+				minWidth : CKEDITOR.env.ie && CKEDITOR.env.quirks ? 368 : 350,
 				minHeight : 240,
 
Index: /CKEditor/branches/features/kama/_source/plugins/preview/plugin.js
===================================================================
--- /CKEditor/branches/features/kama/_source/plugins/preview/plugin.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/plugins/preview/plugin.js	(revision 3648)
@@ -13,5 +13,5 @@
 	{
 		modes : { wysiwyg:1, source:1 },
-
+		canUndo : false,
 		exec : function( editor )
 		{
Index: /CKEditor/branches/features/kama/_source/plugins/print/plugin.js
===================================================================
--- /CKEditor/branches/features/kama/_source/plugins/print/plugin.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/plugins/print/plugin.js	(revision 3648)
@@ -37,4 +37,5 @@
 			editor.document.$.execCommand( "Print" );
 	},
+	canUndo : false,
 	modes : { wysiwyg : !( CKEDITOR.env.opera ) }		// It is imposible to print the inner document in Opera.
 };
Index: /CKEditor/branches/features/kama/_source/plugins/richcombo/plugin.js
===================================================================
--- /CKEditor/branches/features/kama/_source/plugins/richcombo/plugin.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/plugins/richcombo/plugin.js	(revision 3648)
@@ -268,4 +268,10 @@
 			this._.list = list;
 
+			panel.getBlock( this.id ).onHide = function() 
+				{ 
+					me._.on = 0; 
+					me.setState( CKEDITOR.TRISTATE_OFF ); 
+				}
+
 			if ( this.init )
 				this.init();
Index: /CKEditor/branches/features/kama/_source/plugins/scayt/dialogs/options.js
===================================================================
--- /CKEditor/branches/features/kama/_source/plugins/scayt/dialogs/options.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/plugins/scayt/dialogs/options.js	(revision 3648)
@@ -9,5 +9,5 @@
 		captions,
 		doc = CKEDITOR.document,
-		fckLang = "en";
+		fckLang = 'en';
 
 	var init_with_captions = function()
@@ -16,5 +16,6 @@
 			lang_list = dialog.data.scayt.getLangList(),
 			buttons = [ 'dic_create','dic_delete','dic_rename','dic_restore' ],
-			labels = [ 'mixedCase','mixedWithDigits','allCaps','ignoreDomainNames' ];
+			labels = [ 'mixedCase','mixedWithDigits','allCaps','ignoreDomainNames' ],
+			i;
 
 /*
@@ -23,23 +24,23 @@
 		{
 			var button = buttons[ i ];
-			doc.getById( button ).setHtml( captions[ "button_" + button] );
+			doc.getById( button ).setHtml( captions[ 'button_' + button] );
 		}
-		doc.getById( "dic_info" ).setHtml( captions[ "dic_info" ] );
+		doc.getById( 'dic_info' ).setHtml( captions[ 'dic_info' ] );
 */
 
 		// Fill options and dictionary labels.
-		for ( var i in labels )
-		{
-			var label = "label_" + labels[ i ];
-			var labelElement = doc.getById( label );
+		for ( i in labels )
+		{
+			var label = 'label_' + labels[ i ],
+				labelElement = doc.getById( label );
 			if ( labelElement )
 				labelElement.setHtml( captions[ label ] );
 		}
 		
-		var about = '<p>' + captions[ "about_throwt_image" ] + '</p>'+
-					'<p>' + captions[ "version" ]  + dialog.data.scayt.version.toString() + '</p>' +
-					'<p>' + captions[ "about_throwt_copy" ] + '</p>';
-
-		doc.getById( "scayt_about" ).setHtml( about );
+		var about = '<p>' + captions[ 'about_throwt_image' ] + '</p>'+
+					'<p>' + captions[ 'version' ]  + dialog.data.scayt.version.toString() + '</p>' +
+					'<p>' + captions[ 'about_throwt_copy' ] + '</p>';
+
+		doc.getById( 'scayt_about' ).setHtml( about );
 
 		// Create languages tab.
@@ -54,5 +55,5 @@
 
 			var div = doc.createElement( 'div' );
-				radio = CKEDITOR.dom.element.createFromHtml( '<input id="cke_option' + 
+			var radio = CKEDITOR.dom.element.createFromHtml( '<input id="cke_option' + 
 					option + '" type="radio" ' + 
 					( dialog.sLang == option ? 'checked="checked"' : '' ) +
@@ -72,13 +73,13 @@
 				code : option,
 				radio : div
-			}
+			};
 		};
 
 		var langList = [];
-		for ( var i in lang_list.rtl )
-			langList[ langList.length ] = createOption( i, lang_list.ltr )
-
-		for ( var i in lang_list.ltr )
-			langList[ langList.length  ] = createOption( i, lang_list.ltr )
+		for ( i in lang_list.rtl )
+			langList[ langList.length ] = createOption( i, lang_list.ltr );
+
+		for ( i in lang_list.ltr )
+			langList[ langList.length  ] = createOption( i, lang_list.ltr );
 
 		langList.sort( 	function( lang1, lang2 )
@@ -89,5 +90,5 @@
 		var fieldL = doc.getById( 'scayt_lcol' ),
 			fieldR = doc.getById( 'scayt_rcol' );
-		for ( var i=0; i < langList.length; i++ )
+		for ( i=0; i < langList.length; i++ )
 		{
 			var field = ( i < langList.length / 2 ) ? fieldL : fieldR;
@@ -107,5 +108,5 @@
 				checkbox.removeAttribute( 'checked' );
 				if ( dialog.options[ i ] == 1 )
-					checkbox.setAttribute( 'checked', "checked" );
+					checkbox.setAttribute( 'checked', 'checked' );
 
 				// Bind events. Do it only once.
@@ -115,5 +116,5 @@
 						{
 							dialog.options[ this.getId() ] = this.$.checked ? 1 : 0 ;
-						} )
+						} );
 				}
 			}
@@ -123,7 +124,7 @@
 		var dic_buttons = [
 			// [0] contains buttons for creating
-			"dic_create,dic_restore",
+			'dic_create,dic_restore',
 			// [1] contains buton for manipulation 
-			"dic_rename,dic_delete,dic_restore"
+			'dic_rename,dic_delete,dic_restore'
 		];
 		scayt.getNameUserDictionary(
@@ -145,5 +146,5 @@
 		var dic_flag = 0; 
 		 // ** bind event listeners
-		dojo.query("div.dic_buttons a.button").onclick(function( ev )
+		dojo.query('div.dic_buttons a.button').onclick(function( ev )
 			{
 				if (typeof window[this.id] == 'function'  ){
@@ -156,5 +157,5 @@
 						return false;
 					}
-					//apply handler
+					// Apply handler
 					window[this.id].apply( window, [this,ev , dic_name, dic_buttons ] );
 				}
@@ -171,5 +172,5 @@
 		   {
 				var dialog = this;
-				dialog.data = editor.fire( "scaytDialog", {} );
+				dialog.data = editor.fire( 'scaytDialog', {} );
 				dialog.options = dialog.data.scayt_control.option();
 				dialog.sLang = dialog.data.scayt_control.sLang;
@@ -177,5 +178,5 @@
 				if ( !dialog.data || !dialog.data.scayt || !dialog.data.scayt_control ) 
 				{
-					alert( "Error loading application service" );
+					alert( 'Error loading application service' );
 					dialog.hide();
 					return;
@@ -202,9 +203,9 @@
 			onOk : function()
 			{
-				var scayt_control =  this.data.scayt_control;
-					o = scayt_control.option();
+				var scayt_control =  this.data.scayt_control,
+					o = scayt_control.option(),
 					c = 0;
 
-				// Set upp options if any was set.
+				// Set up options if any was set.
 				for ( var oN in this.options ) 
 				{
@@ -304,5 +305,5 @@
 							type : 'html',
 							id : 'about',
-							style : "margin: 10px 40px;",
+							style : 'margin: 10px 40px;',
 							html : '<div id="scayt_about"></div>'
 						}
Index: /CKEditor/branches/features/kama/_source/plugins/scayt/plugin.js
===================================================================
--- /CKEditor/branches/features/kama/_source/plugins/scayt/plugin.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/plugins/scayt/plugin.js	(revision 3648)
@@ -11,6 +11,6 @@
 (function()
 {
-	var commandName 	= "scaytcheck",
-		sc_on_cssclass 	= "scayt_enabled",
+	var commandName 	= 'scaytcheck',
+		sc_on_cssclass 	= 'scayt_enabled',
 		sc_off_cssclass = 'scayt_disabled',
 		openPage		= '';
@@ -19,7 +19,7 @@
 	{
 		var editor = this;
-		dojo.requireLocalization( 'scayt', 'caption', '', "ROOT" );
-
-		var createInstnce = function()	// Create new instance every time Document is created.
+		dojo.requireLocalization( 'scayt', 'caption', '', 'ROOT' );
+
+		var createInstance = function()	// Create new instance every time Document is created.
 		{
 			// Initialise Scayt instance.
@@ -30,5 +30,5 @@
 
 			// Copy config.
-			var	lastInstance = plugin.instances[ editor.name ]
+			var	lastInstance = plugin.instances[ editor.name ];
 			if ( lastInstance )
 			{
@@ -41,9 +41,9 @@
 
 			try {
-				scayt_control.setDisabled( scayt_control.paused === false );				// I really don't know why it couse JS error in IE
+				scayt_control.setDisabled( scayt_control.paused === false );				// I really don't know why it causes JS error in IE
 			} catch (e) {}
 		};
 
-		editor.on( 'contentDom', createInstnce )		// Get the iframe somehow.
+		editor.on( 'contentDom', createInstance );		// Get the iframe somehow.
 		editor.on( 'contentDomUnload', function()
 			{
@@ -62,5 +62,5 @@
 						script.remove();
 				}
-			})
+			});
 
 		editor.on( 'beforeCommandExec', function( ev )		// Disable SCAYT before Source command execution.
@@ -68,5 +68,5 @@
 				if ( ev.data.name == 'source' && editor.mode == 'wysiwyg' )
 				{
-					var scayt = plugin.getScayt( editor )
+					var scayt = plugin.getScayt( editor );
 					if ( scayt )
 					{
@@ -100,5 +100,5 @@
 		if ( editor.document )
 		{
-			createInstnce();
+			createInstance();
 			editor.fire( 'showScaytState' );
 		}
@@ -129,8 +129,8 @@
 				return onEngineLoad.apply( editor );	// Add new instance.
 			else if ( this.engineLoaded == -1 )			// We are waiting.
-				return CKEDITOR.on( "scaytReady", function(){ onEngineLoad.apply( editor )} );	// Use function(){} to avoid rejection as duplicate.
-
-			CKEDITOR.on( "scaytReady", onEngineLoad, editor );
-			CKEDITOR.on( "scaytReady", function()
+				return CKEDITOR.on( 'scaytReady', function(){ onEngineLoad.apply( editor );} );	// Use function(){} to avoid rejection as duplicate.
+
+			CKEDITOR.on( 'scaytReady', onEngineLoad, editor );
+			CKEDITOR.on( 'scaytReady', function()
 				{
 					this.engineLoaded = true;
@@ -143,6 +143,6 @@
 			djConfig = 
 			{
-				baseUrl: "./",
-				blankGif: "http://demo.spellchecker.net/spellcheck3/lf/scayt/blank.gif",
+				baseUrl: './',
+				blankGif: 'http://demo.spellchecker.net/spellcheck3/lf/scayt/blank.gif',
 				parseOnLoad: true,
 				afterOnLoad: true,
@@ -153,10 +153,10 @@
 				scaytNodes: document.getElementById('foo'),
 				require: [
-					"dojo.i18n",
-					"scayt._base"
+					'dojo.i18n',
+					'scayt._base'
 				],
 				modulePaths:
 				{
-					"scayt": "http://demo.spellchecker.net/spellcheck3/lf/scayt"
+					'scayt': 'http://demo.spellchecker.net/spellcheck3/lf/scayt'
 				},
 				addOnLoad: 
@@ -164,5 +164,5 @@
 					function()
 					{
-						CKEDITOR.fireOnce( "scaytReady" );
+						CKEDITOR.fireOnce( 'scaytReady' );
 					}
 				],
@@ -170,5 +170,5 @@
 			};
 
-			// Append javascrip code.
+			// Append javascript code.
 			CKEDITOR.document.getHead().append( 
 				CKEDITOR.document.createElement( 'script',
@@ -177,5 +177,5 @@
 							{
 								type : 'text/javascript',
-								src : "http://demo.spellchecker.net/spellcheck3/lf/dojo/dojo/dojo.xd.js"
+								src : 'http://demo.spellchecker.net/spellcheck3/lf/dojo/dojo/dojo.xd.js'
 							}
 					})
@@ -299,5 +299,5 @@
 				});
 
-			editor.ui.add( "Scayt", CKEDITOR.UI_MENUBUTTON,
+			editor.ui.add( 'Scayt', CKEDITOR.UI_MENUBUTTON,
 				{
 					label : editor.lang.scayt.title,
@@ -359,5 +359,5 @@
 						mainSuggestions = {};
 
-						// Rgister the More suggestions group;
+						// Register the More suggestions group;
 						editor.addMenuItem( 'scayt_moresuggest',
 							{
@@ -373,5 +373,5 @@
 						for ( var i = 0, l = items_suggestion.length; i < l; i += 1 )
 						{
-							var commandName = 'scayt_suggestion_' + items_suggestion[i].replace( " ", "_" );
+							var commandName = 'scayt_suggestion_' + items_suggestion[i].replace( ' ', '_' );
 							var exec = ( function( el, s )
 								{
@@ -386,5 +386,5 @@
 							if ( i < editor.config.scayt_maxSuggestions )
 							{
-								addButtonCommand( editor, "button_" + commandName, items_suggestion[i], 
+								addButtonCommand( editor, 'button_' + commandName, items_suggestion[i], 
 									commandName, exec, 'scayt_suggest', i + 1 );
 								_r[ commandName ] = CKEDITOR.TRISTATE_OFF;
@@ -393,5 +393,5 @@
 							else
 							{
-								addButtonCommand( editor, "button_" + commandName, items_suggestion[i], 
+								addButtonCommand( editor, 'button_' + commandName, items_suggestion[i], 
 									commandName, exec, 'scayt_moresuggest', i + 1 );
 								moreSuggestions[ commandName ] = CKEDITOR.TRISTATE_OFF;
@@ -421,9 +421,9 @@
 						};
 
-						addButtonCommand( editor, "ignore", editor.lang.scayt.ignore, 
+						addButtonCommand( editor, 'ignore', editor.lang.scayt.ignore, 
 							'scayt_ignore', ignore_command, 'scayt_control', 1);
-						addButtonCommand( editor, "ignore_all", editor.lang.scayt.ignoreAll, 
+						addButtonCommand( editor, 'ignore_all', editor.lang.scayt.ignoreAll, 
 							'scayt_ignore_all', ignore_all_command, 'scayt_control', 2);
-						addButtonCommand( editor, "add_word", editor.lang.scayt.addWord, 
+						addButtonCommand( editor, 'add_word', editor.lang.scayt.addWord, 
 							'scayt_add_word', addword_command, 'scayt_control', 3);
 
Index: /CKEditor/branches/features/kama/_source/plugins/selection/plugin.js
===================================================================
--- /CKEditor/branches/features/kama/_source/plugins/selection/plugin.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/plugins/selection/plugin.js	(revision 3648)
@@ -1,3 +1,3 @@
-﻿/*
+﻿﻿/*
 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
 For licensing, see LICENSE.html or http://ckeditor.com/license
@@ -83,5 +83,6 @@
 					// TODO
 			}
-		}
+		},
+		canUndo : false
 	};
 
Index: /CKEditor/branches/features/kama/_source/plugins/showblocks/plugin.js
===================================================================
--- /CKEditor/branches/features/kama/_source/plugins/showblocks/plugin.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/plugins/showblocks/plugin.js	(revision 3648)
@@ -111,4 +111,5 @@
 		{
 			var command = editor.addCommand( 'showblocks', commandDefinition );
+			command.canUndo = false;
 
 			if ( editor.config.startupOutlineBlocks )
Index: /CKEditor/branches/features/kama/_source/plugins/smiley/dialogs/smiley.js
===================================================================
--- /CKEditor/branches/features/kama/_source/plugins/smiley/dialogs/smiley.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/plugins/smiley/dialogs/smiley.js	(revision 3648)
@@ -1,3 +1,3 @@
-/*
+﻿/*
 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
 For licensing, see LICENSE.html or http://ckeditor.com/license
@@ -159,5 +159,5 @@
 
 		html.push(
-			'<td class="dark_background hand centered" style="vertical-align: middle;">' +
+			'<td class="cke_dark_background cke_hand cke_centered" style="vertical-align: middle;">' +
 				'<a class="cke_smile" tabindex="-1" onkeydown="CKEDITOR.tools.callFunction( ', onKeydown, ', event, this );">',
 					'<img class="hand" title="', config.smiley_descriptions[i], '"' +
Index: /CKEditor/branches/features/kama/_source/plugins/sourcearea/plugin.js
===================================================================
--- /CKEditor/branches/features/kama/_source/plugins/sourcearea/plugin.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/plugins/sourcearea/plugin.js	(revision 3648)
@@ -170,7 +170,11 @@
 			exec : function( editor )
 			{
+				if ( editor.mode == 'wysiwyg' )
+					editor.fire( 'saveSnapshot' );
 				editor.getCommand( 'source' ).setState( CKEDITOR.TRISTATE_DISABLED );
 				editor.setMode( editor.mode == 'source' ? 'wysiwyg' : 'source' );
-			}
+			},
+
+			canUndo : false
 		}
 	}
Index: /CKEditor/branches/features/kama/_source/plugins/specialchar/dialogs/specialchar.js
===================================================================
--- /CKEditor/branches/features/kama/_source/plugins/specialchar/dialogs/specialchar.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/plugins/specialchar/dialogs/specialchar.js	(revision 3648)
@@ -63,9 +63,9 @@
 							' title="', chars[i].replace( /&/g, '&amp;' ), '"' +
 							' value="', chars[i].replace( /&/g, "&amp;" ), '"' +
-							' class="DarkBackground Hand">');
+							' class="cke_dark_background cke_hand">');
 						html.push( chars[i] );
 					}
 					else
-						html.push( '<td class="DarkBackground">&nbsp;' );
+						html.push( '<td class="cke_dark_background">&nbsp;' );
 
 					html.push( '</td>' );
@@ -107,5 +107,5 @@
 										dialog.getContentElement( 'info', 'charPreview' ).getElement().setHtml( value );
 										htmlPreview.setHtml( CKEDITOR.tools.htmlEncode( value ) );
-										target.addClass( "LightBackground" );
+										target.addClass( "cke_light_background" );
 									}
 								},
@@ -118,5 +118,5 @@
 										dialog.getContentElement( 'info', 'charPreview' ).getElement().setHtml( '&nbsp;' );
 										dialog.getContentElement( 'info', 'htmlPreview' ).getElement().setHtml( '&nbsp;' );
-										target.removeClass( "LightBackground" );
+										target.removeClass( "cke_light_background" );
 									}
 								},
@@ -128,5 +128,5 @@
 									{
 										var dialog = this.getDialog();
-										target.removeClass( "LightBackground" );
+										target.removeClass( "cke_light_background" );
 										dialog.getParentEditor().insertHtml( value );
 										dialog.hide();
Index: /CKEditor/branches/features/kama/_source/plugins/table/dialogs/table.js
===================================================================
--- /CKEditor/branches/features/kama/_source/plugins/table/dialogs/table.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/plugins/table/dialogs/table.js	(revision 3648)
@@ -477,4 +477,5 @@
 								{
 									type : 'text',
+									id : 'txtCaption',
 									label : editor.lang.table.caption,
 									setup : function( selectedTable )
@@ -519,4 +520,5 @@
 								{
 									type : 'text',
+									id : 'txtSummary',
 									label : editor.lang.table.summary,
 									setup : function( selectedTable )
Index: /CKEditor/branches/features/kama/_source/plugins/tabletools/plugin.js
===================================================================
--- /CKEditor/branches/features/kama/_source/plugins/tabletools/plugin.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/plugins/tabletools/plugin.js	(revision 3648)
@@ -18,4 +18,8 @@
 	function getSelectedCells( selection )
 	{
+		// Walker will try to split text nodes, which will make the current selection
+		// invalid. So save bookmarks before doing anything.
+		var bookmarks = selection.createBookmarks();
+
 		var ranges = selection.getRanges();
 		var retval = [];
@@ -41,21 +45,34 @@
 		{
 			var range = ranges[ i ];
-			var walker = new CKEDITOR.dom.walker( range );
-			walker.guard = moveOutOfCellGuard;
-
-			while ( ( node = walker.next() ) )
-			{
-				// If may be possible for us to have a range like this:
-				// <td>^1</td><td>^2</td>
-				// The 2nd td shouldn't be included.
-				//
-				// So we have to take care to include a td we've entered only when we've
-				// walked into its children.
-
-				var parent = node.getParent();
-				if ( parent && cellNodeRegex.test( parent.getName() ) && !parent.getCustomData( 'selected_cell' ) )
-				{
-					CKEDITOR.dom.element.setMarker( database, parent, 'selected_cell', true );
-					retval.push( parent );
+
+			if ( range.collapsed )
+			{
+				// Walker does not handle collapsed ranges yet - fall back to old API.
+				var startNode = range.getCommonAncestor();
+				var nearestCell = startNode.getAscendant( 'td', true ) || startNode.getAscendant( 'th', true );
+				if ( nearestCell )
+					retval.push( nearestCell );
+			}
+			else
+			{
+				var walker = new CKEDITOR.dom.walker( range );
+				var node;
+				walker.guard = moveOutOfCellGuard;
+
+				while ( ( node = walker.next() ) )
+				{
+					// If may be possible for us to have a range like this:
+					// <td>^1</td><td>^2</td>
+					// The 2nd td shouldn't be included.
+					//
+					// So we have to take care to include a td we've entered only when we've
+					// walked into its children.
+
+					var parent = node.getParent();
+					if ( parent && cellNodeRegex.test( parent.getName() ) && !parent.getCustomData( 'selected_cell' ) )
+					{
+						CKEDITOR.dom.element.setMarker( database, parent, 'selected_cell', true );
+						retval.push( parent );
+					}
 				}
 			}
@@ -63,4 +80,7 @@
 
 		CKEDITOR.dom.element.clearAllMarkers( database );
+
+		// Restore selection position.
+		selection.selectBookmarks( bookmarks );
 
 		return retval;
Index: /CKEditor/branches/features/kama/_source/plugins/toolbar/plugin.js
===================================================================
--- /CKEditor/branches/features/kama/_source/plugins/toolbar/plugin.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/plugins/toolbar/plugin.js	(revision 3648)
@@ -253,5 +253,7 @@
 										var dy = toolboxContainer.$.offsetHeight - previousHeight;
 										contents.setStyle( 'height', ( contentHeight - dy ) + 'px' );
-									}
+									},
+
+									modes : { wysiwyg : 1, source : 1 }
 								} );
 
Index: /CKEditor/branches/features/kama/_source/plugins/undo/plugin.js
===================================================================
--- /CKEditor/branches/features/kama/_source/plugins/undo/plugin.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/plugins/undo/plugin.js	(revision 3648)
@@ -83,10 +83,10 @@
 									// Do not capture CTRL hotkeys.
 									if ( !event.data.$.ctrlKey && !event.data.$.metaKey )
-										undoManager.type();
+										undoManager.type( event );
 								});
 
-							// Being this the first call, let's get an undo snapshot.
-							if ( undoManager.index == -1 )
-								undoManager.save();
+							// Always save an undo snapshot - the previous mode might have changed
+							// editor contents.
+							undoManager.save( true );
 						}
 					}
@@ -168,4 +168,5 @@
 	{
 		this.typesCount = 0;
+		this.modifiersCount = 0;
 
 		this.editor = editor;
@@ -183,11 +184,47 @@
 
 		this.limit = editor.config.undoStackSize;
+
+		/**
+		 * Remember last pressed key.
+		 */
+		this.lastKeystroke = 0;
 	}
 
 	UndoManager.prototype =
 	{
-		type : function()
-		{
-			if ( !this.typing )
+		/**
+		 * Process undo system regard keystrikes.
+		 * @param {CKEDITOR.dom.event} event
+		 */
+		type : function( event )
+		{
+			var keystroke = event && event.data.getKeystroke(),
+
+				// Backspace, Delete
+				modifierCodes = { 8:1, 46:1 },
+				// Keystrokes which will modify the contents.
+				isModifier = keystroke in modifierCodes,
+				wasModifier = this.lastKeystroke in modifierCodes,
+				lastWasSameModifier = isModifier && keystroke == this.lastKeystroke,
+
+				// Arrows: L, T, R, B
+				resetTypingCodes = { 37:1, 38:1, 39:1, 40:1 },
+				// Keystrokes which navigation through contents.
+				isReset = keystroke in resetTypingCodes,
+				wasReset = this.lastKeystroke in resetTypingCodes,
+
+				// Keystrokes which just introduce new contents.
+				isContent = ( !isModifier && !isReset ),
+
+				// Create undo snap for every different modifier key.
+				modifierSnapshot = ( isModifier && !lastWasSameModifier ),
+				// Create undo snap on the following cases:
+				// 1. Just start to type.
+				// 2. Typing some content after a modifier.
+				// 3. Typing some content after make a visible selection.
+				startedTyping = !this.typing
+					|| ( isContent && ( wasModifier || wasReset ) );
+
+			if ( startedTyping || modifierSnapshot )
 			{
 				var beforeTypeImage = new Image( this.editor );
@@ -205,9 +242,9 @@
 						if ( beforeTypeImage.contents != currentSnapshot )
 						{
-							if ( !this.save( false, beforeTypeImage ) )
-							{
+							// This's a special save, with specified snapshot
+							// and without auto 'fireChange'.
+							if ( !this.save( false, beforeTypeImage, false ) )
 								// Drop future snapshots.
 								this.snapshots.splice( this.index + 1, this.snapshots.length - this.index - 1 );
-							}
 
 							this.hasUndo = true;
@@ -215,20 +252,36 @@
 
 							this.typesCount = 1;
-							this.typing = true;
+							this.modifiersCount = 1;
 
 							this.onChange();
 						}
 					},
-					0, this );
-
-				return;
-			}
-
-			this.typesCount++;
-
-			if ( this.typesCount > 25 )
-			{
-				this.save();
-				this.typesCount = 1;
+					0, this
+				);
+			}
+
+			this.lastKeystroke = keystroke;
+			// Create undo snap after typed too much (over 25 times).
+			if ( isModifier )
+			{
+				this.typesCount = 0;
+				this.modifiersCount++;
+
+				if ( this.modifiersCount > 25 )
+				{
+					this.save();
+					this.modifiersCount = 1;
+				}
+			}
+			else if ( !isReset )
+			{
+				this.modifiersCount = 0;
+				this.typesCount++;
+
+				if ( this.typesCount > 25 )
+				{
+					this.save();
+					this.typesCount = 1;
+				}
 			}
 
@@ -236,12 +289,21 @@
 		},
 
+		/**
+		 * Reset all states about typing.
+		 * @see  UndoManager.type
+		 */
+		resetType : function()
+		{
+			this.typing = false;
+			delete this.lastKeystroke;
+			this.typesCount = 0;
+			this.modifiersCount = 0;
+		},
 		fireChange : function()
 		{
 			this.hasUndo = !!this.getNextImage( true );
 			this.hasRedo = !!this.getNextImage( false );
-
-			this.typing = false;
-			this.typesCount = 0;
-
+			// Reset typing
+			this.resetType();
 			this.onChange();
 		},
@@ -250,5 +312,5 @@
 		 * Save a snapshot of document image for later retrieve.
 		 */
-		save : function( onContentOnly, image )
+		save : function( onContentOnly, image, autoFireChange )
 		{
 			var snapshots = this.snapshots;
@@ -274,6 +336,6 @@
 			this.currentImage = image;
 
-			this.fireChange();
-
+			if ( autoFireChange !== false )
+				this.fireChange();
 			return true;
 		},
@@ -285,4 +347,13 @@
 			if ( image.bookmarks )
 				this.editor.getSelection().selectBookmarks( image.bookmarks );
+			else if ( CKEDITOR.env.ie )
+			{
+				// IE BUG: If I don't set the selection to *somewhere* after setting
+				// document contents, then IE would create an empty paragraph at the bottom
+				// the next time the document is modified.
+				$range = this.editor.document.getBody().$.createTextRange();
+				$range.collapse( true );
+				$range.select();
+			}
 
 			this.index = image.index;
Index: /CKEditor/branches/features/kama/_source/plugins/wysiwygarea/plugin.js
===================================================================
--- /CKEditor/branches/features/kama/_source/plugins/wysiwygarea/plugin.js	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/plugins/wysiwygarea/plugin.js	(revision 3648)
@@ -11,4 +11,11 @@
 (function()
 {
+	/**
+	 * List of elements in which has no way to move editing focus outside.
+	 */
+	var nonExitableElementNames = { table:1,pre:1 };
+	// Matching an empty paragraph at the end of document.
+	var emptyParagraphRegexp = /\s*<(p|div|address|h\d|center)[^>]*>\s*(?:<br[^>]*>|&nbsp;|&#160;)\s*(:?<\/\1>)?\s*$/gi;
+
 	function onInsertHtml( evt )
 	{
@@ -48,4 +55,5 @@
 		{
 			this.focus();
+			this.fire( 'saveSnapshot' );
 
 			var element = evt.data,
@@ -72,28 +80,15 @@
 				clone = !i && element || element.clone( true );
 
-				var toSplit;
-
-				// If the new node is a block element, split the current block (if any).
+				// If we're inserting a block at dtd-violated positoin, split
+				// the parent blocks until we reach blockLimit.
+				var parent, dtd;
 				if ( this.config.enterMode != CKEDITOR.ENTER_BR && isBlock )
-				{
-					var startPath = new CKEDITOR.dom.elementPath( range.startContainer ),
-						j = 0,
-						parent;
-
-					while( ( parent = startPath.elements[ j++ ] ) && parent != startPath.blockLimit )
-					{
-						var parentName = parent.getName(),
-							parentDtd = CKEDITOR.dtd[ parentName ];
-
-						if ( parentDtd && !parentDtd[ elementName ] )
-							toSplit = parent;
-					}
-				}
+					while( ( parent = range.getCommonAncestor( false, true ) )
+							&& ( dtd = CKEDITOR.dtd[ parent.getName() ] )
+							&& !( dtd && dtd [ elementName ] ) )
+						range.splitBlock();
 
 				// Insert the new node.
 				range.insertNode( clone );
-
-				if ( toSplit )
-					clone.breakParent( toSplit );
 
 				// Save the last element reference so we can make the
@@ -113,4 +108,61 @@
 			if ( selIsLocked )
 				this.getSelection().lock();
+
+			// Save snaps after the whole execution completed.
+			// This's a workaround for make DOM modification's happened after
+			// 'insertElement' to be included either, e.g. Form-based dialogs' 'commitContents'
+			// call.
+			CKEDITOR.tools.setTimeout( function(){
+				this.fire( 'saveSnapshot' );
+			}, 0, this );
+		}
+	}
+	
+	/**
+	 *  Auto-fixing block-less content by wrapping paragraph, prevent 
+	 *  non-exitable-block by padding extra br.
+	 */
+	function onSelectionChangeFixBody( evt )
+	{
+		var editor = evt.editor,
+			path = evt.data.path,
+			blockLimit = path.blockLimit,
+			body = editor.document.getBody(),
+			enterMode = editor.config.enterMode;
+
+		// When enterMode set to block, we'll establing new paragraph if the
+		// current range is block-less within body.
+		if ( enterMode != CKEDITOR.ENTER_BR
+			 && blockLimit.getName() == 'body'
+			 && !path.block )
+		{
+			var selection = evt.data.selection,
+				range = evt.data.selection.getRanges()[0],
+				bms = selection.createBookmarks(),
+				fixedBlock = range.fixBlock( true,
+					editor.config.enterMode == CKEDITOR.ENTER_DIV ? 'div' : 'p'  );
+
+			// For IE, we'll be removing any bogus br ( introduce by fixing body )
+			// right now to prevent it introducing visual line break.
+			if ( CKEDITOR.env.ie )
+			{
+				var brNodeList = fixedBlock.getElementsByTag( 'br' ), brNode;
+				for ( var i = 0 ; i < brNodeList.count() ; i++ )
+					if( ( brNode = brNodeList.getItem( i ) ) && brNode.hasAttribute( '_fck_bookmark' ) )
+						brNode.remove();
+			}
+
+			selection.selectBookmarks( bms );
+		}
+
+		// Inserting the padding-br before body if it's preceded by an
+		// unexitable block.
+		var lastNode = body.getLast( true );
+		if ( lastNode.getName && ( lastNode.getName() in nonExitableElementNames ) )
+		{
+			var paddingBlock = editor.document.createElement(
+					( CKEDITOR.env.ie && enterMode != CKEDITOR.ENTER_BR ) ?
+						'<br _cke_bogus="true" />' : 'br' );
+			body.append( paddingBlock );
 		}
 	}
@@ -325,4 +377,22 @@
 									isPendingFocus = false;
 								}
+
+								/*
+								 * IE BUG: IE might have rendered the iframe with invisible contents.
+								 * (#3623). Push some inconsequential CSS style changes to force IE to
+								 * refresh it.
+								 *
+								 * Also, for some unknown reasons, short timeouts (e.g. 100ms) do not
+								 * fix the problem. :(
+								 */
+								if ( CKEDITOR.env.ie )
+								{
+									setTimeout( function()
+										{
+											var $body = editor.document.$.body;
+											$body.runtimeStyle.marginBottom = '0px';
+											$body.runtimeStyle.marginBottom = '';
+										}, 1000 );
+								}
 							},
 							0 );
@@ -361,5 +431,9 @@
 								// Get the HTML version of the data.
 								if ( editor.dataProcessor )
-									data = editor.dataProcessor.toHtml( data, ( editor.config.enterMode != CKEDITOR.ENTER_BR ) );
+								{
+									var fixForBody = ( editor.config.enterMode != CKEDITOR.ENTER_BR )
+										? editor.config.enterMode == CKEDITOR.ENTER_DIV ? 'div' : 'p' : false;
+									data = editor.dataProcessor.toHtml( data, fixForBody );
+								}
 
 								data =
@@ -413,4 +487,8 @@
 									data = editor.dataProcessor.toDataFormat( data, ( editor.config.enterMode != CKEDITOR.ENTER_BR ) );
 
+								// Strip the last blank paragraph within document.
+								if ( editor.config.ignoreEmptyParagraph )
+									data = data.replace( emptyParagraphRegexp, '' );
+
 								return data;
 							},
@@ -447,4 +525,6 @@
 					editor.on( 'insertHtml', onInsertHtml, null, null, 20 );
 					editor.on( 'insertElement', onInsertElement, null, null, 20 );
+					// Auto fixing on some document structure weakness to enhance usabilities. (#3190 and #3189)
+					editor.on( 'selectionChange', onSelectionChangeFixBody, null, null, 1 );
 				});
 		}
@@ -488,2 +568,10 @@
  */
 CKEDITOR.config.disableNativeSpellChecker = true;
+/**
+ * The editor will post an empty value ("") if you have just an empty paragraph on it, like this:
+ * @example
+ * <p></p>
+ * <p><br /></p>
+ * <p><b></b></p>
+ */
+CKEDITOR.config.ignoreEmptyParagraph = true;
Index: /CKEditor/branches/features/kama/_source/skins/kama/dialog.css
===================================================================
--- /CKEditor/branches/features/kama/_source/skins/kama/dialog.css	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/skins/kama/dialog.css	(revision 3648)
@@ -225,4 +225,10 @@
 }
 
+.cke_skin_kama div.cke_disabled .cke_dialog_ui_labeled_content *
+{
+	background-color : #a0a0a0;
+	cursor : default;
+}
+
 .cke_skin_kama .cke_dialog_ui_hbox
 {
@@ -413,8 +419,4 @@
 	background-repeat: no-repeat;
 	background-position: 0 -1022px;
-	/* IE 6 */
-	_background-image: url(images/sprites_ie6.png);
-	_background-repeat: no-repeat;
-	_background-position: 0 -713px;
 	position: absolute;
 	cursor: pointer;
@@ -423,4 +425,8 @@
 	width: 20px;
 	top: 5px;
+
+	/* IE 6 */
+	_background-image: url(images/sprites_ie6.png);
+	_background-position: 0 -713px;
 }
 
@@ -480,15 +486,15 @@
  * Some utility CSS classes for dialog authors.
  */
-.cke_skin_kama .cke_dialog .dark_background
+.cke_skin_kama .cke_dialog .cke_dark_background
 {
 	background-color: #eaead1;
 }
 
-.cke_skin_kama .cke_dialog .hand
+.cke_skin_kama .cke_dialog .cke_hand
 {
 	cursor: pointer;
 }
 
-.cke_skin_kama .cke_dialog .centered
+.cke_skin_kama .cke_dialog .cke_centered
 {
 	text-align: center;
@@ -599,9 +605,8 @@
 }
 
-.cke_skin_kama .disabled
+.cke_skin_kama .cke_disabled
 {
 	color: #a0a0a0;
 }
-
 
 /* High Contrast Mode */
Index: /CKEditor/branches/features/kama/_source/skins/kama/elementspath.css
===================================================================
--- /CKEditor/branches/features/kama/_source/skins/kama/elementspath.css	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/skins/kama/elementspath.css	(revision 3648)
@@ -15,6 +15,6 @@
 {
 	padding: 0 5px;
-	display: block;
-	float: left; 
+	display: inline-block;
+	float: left;
 }
 
@@ -27,5 +27,5 @@
 .cke_skin_kama .cke_path .cke_empty
 {
-	display: block;
+	display: inline-block;
 	float: left;
 	padding-top: 1px;
@@ -40,4 +40,10 @@
 {
 	visibility: hidden;
+}
+
+.cke_skin_kama .cke_rtl .cke_path a,
+.cke_skin_kama .cke_rtl .cke_path cke_empty
+{
+	float: right;
 }
 
@@ -61,10 +67,2 @@
 	float: none;
 }
-
-.cke_skin_kama .cke_browser_ie .cke_rtl .cke_path,
-.cke_skin_kama .cke_browser_ie .cke_rtl .cke_path a,
-.cke_skin_kama .cke_browser_ie .cke_rtl .cke_path .cke_empty
-{
-	display: inline-block;
-}
-/* END IE double float-right workaround */
Index: /CKEditor/branches/features/kama/_source/skins/kama/mainui.css
===================================================================
--- /CKEditor/branches/features/kama/_source/skins/kama/mainui.css	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/skins/kama/mainui.css	(revision 3648)
@@ -106,7 +106,12 @@
 }
 
+.cke_skin_kama .cke_maximized .cke_resizer
+{
+	display: none;
+}
+
 .cke_skin_kama .cke_browser_ie6 .cke_contents textarea,
 .cke_skin_kama .cke_browser_ie7 .cke_contents textarea
 {
-	position: relative;
+	position: absolute;
 }
Index: /CKEditor/branches/features/kama/_source/skins/office2003/dialog.css
===================================================================
--- /CKEditor/branches/features/kama/_source/skins/office2003/dialog.css	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/skins/office2003/dialog.css	(revision 3648)
@@ -1,3 +1,3 @@
-﻿/*
+/*
 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
 For licensing, see LICENSE.html or http://ckeditor.com/license
@@ -319,4 +319,10 @@
 }
 
+.cke_skin_office2003 div.cke_disabled .cke_dialog_ui_labeled_content *
+{
+	background-color : #a0a0a0;
+	cursor : default;
+}
+
 .cke_skin_office2003 .cke_dialog_ui_hbox
 {
@@ -478,20 +484,20 @@
  * Some utility CSS classes for dialog authors.
  */
-.cke_skin_office2003 .cke_dialog .dark_background
+.cke_skin_office2003 .cke_dialog .cke_dark_background
 {
 	background-color: #eaead1;
 }
 
-.cke_skin_office2003 .cke_dialog .hand
+.cke_skin_office2003 .cke_dialog .cke_hand
 {
 	cursor: pointer;
 }
 
-.cke_skin_office2003 .cke_dialog .centered
+.cke_skin_office2003 .cke_dialog .cke_centered
 {
 	text-align: center;
 }
 
-.cke_skin_office2003 .cke_dialog .BtnReset
+.cke_skin_office2003 .cke_dialog .cke_btn_reset
 {
 	float: right;
@@ -505,10 +511,11 @@
 }
 
-.cke_skin_office2003 .cke_rtl .cke_dialog .BtnReset
+.cke_skin_office2003 .cke_rtl .cke_dialog .cke_btn_reset
 {
 	float: left;
 }
 
-.cke_skin_office2003 .cke_dialog .BtnLocked, .BtnUnlocked
+.cke_skin_office2003 .cke_dialog .cke_btn_locked,
+.cke_skin_office2003 .cke_dialog .cke_btn_unlocked
 {
 	float: left;
@@ -522,10 +529,11 @@
 }
 
-.cke_skin_office2003 .cke_dialog .BtnLocked, .BtnUnlocked
+.cke_skin_office2003 .cke_dialog .cke_btn_locked,
+.cke_skin_office2003 .cke_dialog .cke_btn_unlocked
 {
 	float: right;
 }
 
-.cke_skin_office2003 .cke_dialog .BtnUnlocked
+.cke_skin_office2003 .cke_dialog .cke_btn_unlocked
 {
 	background-position: 0 -16px;
@@ -533,5 +541,5 @@
 }
 
-.cke_skin_office2003 .cke_dialog .BtnOver
+.cke_skin_office2003 .cke_dialog .cke_btn_over
 {
 	border: outset 1px;
@@ -576,5 +584,5 @@
 }
 
-.cke_skin_office2003 .cke_dialog .DarkBackground
+.cke_skin_office2003 .cke_dialog .cke_dark_background
 {
 	text-align : center;
@@ -583,5 +591,5 @@
 }
 
-.cke_skin_office2003 .cke_dialog .LightBackground
+.cke_skin_office2003 .cke_dialog .cke_light_background
 {
 	text-align : center;
@@ -589,5 +597,5 @@
 }
 
-.cke_skin_office2003 .cke_dialog .Hand
+.cke_skin_office2003 .cke_dialog .cke_hand
 {
 	cursor: pointer;
@@ -595,5 +603,5 @@
 }
 
-.cke_skin_office2003 .disabled
+.cke_skin_office2003 .cke_disabled
 {
 	color: #a0a0a0;
Index: /CKEditor/branches/features/kama/_source/skins/office2003/mainui.css
===================================================================
--- /CKEditor/branches/features/kama/_source/skins/office2003/mainui.css	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/skins/office2003/mainui.css	(revision 3648)
@@ -73,4 +73,9 @@
 }
 
+.cke_skin_office2003 .cke_maximized .cke_resizer
+{
+	display: none;
+}
+
 .cke_skin_office2003 .cke_rtl .cke_resizer
 {
Index: /CKEditor/branches/features/kama/_source/skins/v2/dialog.css
===================================================================
--- /CKEditor/branches/features/kama/_source/skins/v2/dialog.css	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/skins/v2/dialog.css	(revision 3648)
@@ -1,3 +1,3 @@
-﻿/*
+/*
 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
 For licensing, see LICENSE.html or http://ckeditor.com/license
@@ -316,4 +316,10 @@
 }
 
+.cke_skin_v2 div.cke_disabled .cke_dialog_ui_labeled_content *
+{
+	background-color : #a0a0a0;
+	cursor : default;
+}
+
 .cke_skin_v2 .cke_dialog_ui_hbox
 {
@@ -477,20 +483,20 @@
  * Some utility CSS classes for dialog authors.
  */
-.cke_skin_v2 .cke_dialog .dark_background
+.cke_skin_v2 .cke_dialog .cke_dark_background
 {
 	background-color: #eaead1;
 }
 
-.cke_skin_v2 .cke_dialog .hand
+.cke_skin_v2 .cke_dialog .cke_hand
 {
 	cursor: pointer;
 }
 
-.cke_skin_v2 .cke_dialog .centered
+.cke_skin_v2 .cke_dialog .cke_centered
 {
 	text-align: center;
 }
 
-.cke_skin_v2 .cke_dialog .BtnReset
+.cke_skin_v2 .cke_dialog .cke_btn_reset
 {
 	float: right;
@@ -504,10 +510,11 @@
 }
 
-.cke_skin_v2 .cke_rtl .cke_dialog .BtnReset
+.cke_skin_v2 .cke_rtl .cke_dialog .cke_btn_reset
 {
 	float: left;
 }
 
-.cke_skin_v2 .cke_dialog .BtnLocked, .BtnUnlocked
+.cke_skin_v2 .cke_dialog .cke_btn_locked,
+.cke_skin_v2 .cke_dialog .cke_btn_unlocked
 {
 	float: left;
@@ -521,10 +528,11 @@
 }
 
-.cke_skin_v2 .cke_dialog .BtnLocked, .BtnUnlocked
+.cke_skin_v2 .cke_dialog .cke_btn_locked,
+.cke_skin_v2 .cke_dialog .cke_btn_unlocked
 {
 	float: right;
 }
 
-.cke_skin_v2 .cke_dialog .BtnUnlocked
+.cke_skin_v2 .cke_dialog .cke_btn_unlocked
 {
 	background-position: 0 -16px;
@@ -532,5 +540,5 @@
 }
 
-.cke_skin_v2 .cke_dialog .BtnOver
+.cke_skin_v2 .cke_dialog .cke_btn_over
 {
 	border: outset 1px;
@@ -575,5 +583,5 @@
 }
 
-.cke_skin_v2 .cke_dialog .DarkBackground
+.cke_skin_v2 .cke_dialog .cke_dark_background
 {
 	text-align : center;
@@ -582,5 +590,5 @@
 }
 
-.cke_skin_v2 .cke_dialog .LightBackground
+.cke_skin_v2 .cke_dialog .cke_light_background
 {
 	text-align : center;
@@ -588,5 +596,5 @@
 }
 
-.cke_skin_v2 .cke_dialog .Hand
+.cke_skin_v2 .cke_dialog .cke_hand
 {
 	cursor: pointer;
@@ -594,5 +602,5 @@
 }
 
-.cke_skin_v2 .disabled
+.cke_skin_v2 .cke_disabled
 {
 	color: #a0a0a0;
Index: /CKEditor/branches/features/kama/_source/skins/v2/mainui.css
===================================================================
--- /CKEditor/branches/features/kama/_source/skins/v2/mainui.css	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/skins/v2/mainui.css	(revision 3648)
@@ -95,4 +95,9 @@
 }
 
+.cke_skin_v2 .cke_maximized .cke_resizer
+{
+	display: none;
+}
+
 .cke_skin_v2 .cke_browser_ie6 .cke_contents textarea,
 .cke_skin_v2 .cke_browser_ie7 .cke_contents textarea
Index: /CKEditor/branches/features/kama/_source/tests/core/ajax.html
===================================================================
--- /CKEditor/branches/features/kama/_source/tests/core/ajax.html	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/tests/core/ajax.html	(revision 3648)
@@ -138,4 +138,20 @@
 		},
 
+		test_parseXml : function()
+		{
+			var data = new CKEDITOR.xml( '<?xml version="1.0" encoding="utf-8" ?><list><item id="test1" /><item id="test2" /></list>' );
+			assert.isInstanceOf( CKEDITOR.xml, data );
+			assert.isNotNull( data.selectSingleNode( '//list/item' ), 'The loaded data doesn\'t match (null)' );
+			assert.isNotUndefined( data.selectSingleNode( '//list/item' ), 'The loaded data doesn\'t match (undefined)' );
+		},
+
+		test_parseXml_nbsp : function()
+		{
+			var data = new CKEDITOR.xml( '<?xml version="1.0" encoding="utf-8" ?><list><item id="test1">&nbsp;</item><item id="test2" /></list>' );
+			assert.isInstanceOf( CKEDITOR.xml, data );
+			assert.isNotNull( data.selectSingleNode( '//list/item' ), 'The loaded data doesn\'t match (null)' );
+			assert.isNotUndefined( data.selectSingleNode( '//list/item' ), 'The loaded data doesn\'t match (undefined)' );
+		},
+
 		name : document.title
 	};
Index: /CKEditor/branches/features/kama/_source/tests/core/dom/range.html
===================================================================
--- /CKEditor/branches/features/kama/_source/tests/core/dom/range.html	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/tests/core/dom/range.html	(revision 3648)
@@ -2169,4 +2169,22 @@
 			
 			assert.isFalse( range.checkEndOfBlock() );
+		},
+
+		/**
+		 *  Test trim with text range.
+		 */
+		test_trim : function()
+		{
+			var text = doc.getById( '_trim_ct').getFirst();
+			var range = new CKEDITOR.dom.range();
+			range.setStart(text, 2);
+			range.setEnd(text, 6);
+			range.trim();
+
+			assert.isFalse( range.collapsed );
+			assert.isTrue( range.startContainer.equals( doc.getById( '_trim_ct') ) );
+			assert.areEqual( range.startOffset, 1 );
+			assert.isTrue( range.endContainer.equals( doc.getById( '_trim_ct') ) );
+			assert.areEqual( range.endOffset, 2 );
 		},
 
@@ -2328,4 +2346,5 @@
 		<p id="_EnlargeP15">Test <span id="S9"></span>List<br/ >Item Enlarge</p>
 		<p id="_EnlargeP16">Test <strong>Block<span id="S10"></span></strong><br /><br />Enlarge</p>
+		<p id="_trim_ct">Test trim</p>
 	</div>
 	<script type="text/javascript">
Index: /CKEditor/branches/features/kama/_source/tests/core/htmlparser/fragment.html
===================================================================
--- /CKEditor/branches/features/kama/_source/tests/core/htmlparser/fragment.html	(revision 3647)
+++ /CKEditor/branches/features/kama/_source/tests/core/htmlparser/fragment.html	(revision 3648)
@@ -152,4 +152,23 @@
 		},
 
+		test_ticket_3585 : function()
+		{
+			testParser(	'<p><br />\t\r\n</p>',
+						'<p><br /></p>' );
+		},
+
+		test_ticket_3585_1 : function()
+		{
+			testParser(	'<p><br />text\t\r\n</p>',
+						'<p><br />text</p>' );
+		},
+
+
+		test_ticket_3585_2 : function()
+		{
+			testParser(	'<b>inline </b>\n<p>paragraph\t\r\n</p>\t\r\n',
+						'<p><b>inline </b></p><p>paragraph</p>' );
+		},
+
 		name : document.title
 	};
@@ -157,5 +176,5 @@
 
 // Uncomment the following to run a single test.
-// window.onload = tc.test_ticket_3195_2;
+// window.onload = tc.test_ticket_3585_2;
 
 	//]]>
