Index: /CKEditor/trunk/CHANGES.html
===================================================================
--- /CKEditor/trunk/CHANGES.html	(revision 6189)
+++ /CKEditor/trunk/CHANGES.html	(revision 6190)
@@ -35,4 +35,34 @@
 		CKEditor Changelog
 	</h1>
+	<h3>
+			CKEditor 3.5 (SVN)</h3>
+	<p>
+			New features:</p>
+	<ul>
+		<li><a href="http://dev.ckeditor.com/ticket/4090">#4090</a> : Full Adobe AIR support.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/5084">#5084</a> : Dialogs are now resizable with a grip in the bottom of the dialog.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/5755">#5755</a> : Introduced the <a href="http://docs.cksource.com/ckeditor_api/symbols/CKEDITOR.config.html#.dialog_buttonsOrder">dialog_buttonsOrder</a> setting, making it possible to control the buttons order.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/4648">#4648</a> : Added the new Iframe plugin.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6010">#6010</a> : The "automatic" option of the font/background color panel now represents the real color.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/5654">#5654</a> : Added the new placeholder plugin.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6334">#6334</a> : CKEditor now uses <a href="http://www.w3.org/TR/2010/WD-html5-20101019/elements.html#embedding-custom-non-visible-data-with-the-data-attributes">HTML5's data-* attributes</a> for its internal attributes.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6103">#6103</a> : It's now possible to control the styling of inline read-only elements with the disableReadonlyStyling setting. It's also possible to avoid inline-styling any element by setting its data-cke-nostyle attribute to "1".</li>
+		<li><a href="http://dev.ckeditor.com/ticket/5404">#5404</a> : "fillEmptyBlocks" configuration option of v2 is now available.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/5367">#5367</a> : New "CKEDITOR.editor::insertText" method (check api.html sample page for usages) is now provided to insert plain text into editor.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/5367">#5915</a> : Hiding dialog tabs.</li>
+	</ul>
+	<p>
+			Fixed issues:</p>
+	<ul>
+		<li><a href="http://dev.ckeditor.com/ticket/4821">#4821</a> : Icons in the toolbar were distorted with IE and zoom != 100%.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/5587">#5587</a> : Visual improvements in dialogs.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/4652">#4652</a> : Config for disable editor context menu.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/5599">#5599</a> : Labels for special characters need to be resourced.</li>
+		<li><a href="http:/dev.ckeditor.com/ticket/6419">#6419</a> : IE: List creation by merging problem.</li>
+		<li><a href="http:/dev.ckeditor.com/ticket/6502">#6502</a> : Remove IE6 image preloading.</li>
+		<li>Updated the following language files:<ul>
+			<li>Hebrew;</li>
+		</ul></li>
+	</ul>
 	<h3>
 			CKEditor 3.4.3 (SVN)</h3>
Index: /CKEditor/trunk/_samples/adobeair/application.xml
===================================================================
--- /CKEditor/trunk/_samples/adobeair/application.xml	(revision 6190)
+++ /CKEditor/trunk/_samples/adobeair/application.xml	(revision 6190)
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+-->
+<application xmlns="http://ns.adobe.com/air/application/1.0">
+	<id>com.ckeditor.air.sample</id>
+	<name>CKEditor - Adobe AIR Sample Application</name>
+	<version>1.0</version>
+	<filename>CKEditor AIR Samples</filename>
+	<description>This is a sample AIR application of CKEditor.</description>
+	<copyright>Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.</copyright>
+	<initialWindow>
+		<content>_samples/adobeair/sample.html</content>
+		<title>CKEditor - Adobe AIR Sample</title>
+		<systemChrome>standard</systemChrome>
+		<transparent>false</transparent>
+		<visible>true</visible>
+		<minimizable>true</minimizable>
+		<maximizable>true</maximizable>
+		<resizable>true</resizable>
+		<x>100</x>
+		<y>80</y>
+		<width>950</width>
+		<height>700</height>
+		<minSize>900 600</minSize>
+	</initialWindow>
+	<installFolder>CKEditor/Sample AIR Application</installFolder>
+	<programMenuFolder>CKEditor/Sample AIR Application</programMenuFolder>
+	<customUpdateUI>false</customUpdateUI>
+	<allowBrowserInvocation>false</allowBrowserInvocation>
+</application>
Index: /CKEditor/trunk/_samples/adobeair/run.bat
===================================================================
--- /CKEditor/trunk/_samples/adobeair/run.bat	(revision 6190)
+++ /CKEditor/trunk/_samples/adobeair/run.bat	(revision 6190)
@@ -0,0 +1,12 @@
+@ECHO OFF
+::
+:: Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
+:: For licensing, see LICENSE.html or http://ckeditor.com/license
+::
+:: Use this file to quickly run the sample in a Windows environment.
+::
+:: Be sure to change the following directory path so it matches your AIR SDK
+:: installation path.
+::
+
+C:/AdobeAIRSDK/bin/adl application.xml ../../
Index: /CKEditor/trunk/_samples/adobeair/sample.html
===================================================================
--- /CKEditor/trunk/_samples/adobeair/sample.html	(revision 6190)
+++ /CKEditor/trunk/_samples/adobeair/sample.html	(revision 6190)
@@ -0,0 +1,49 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!--
+Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+-->
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title>Replace Textarea by Code - CKEditor Sample</title>
+	<meta content="text/html; charset=utf-8" http-equiv="content-type" />
+	<!-- CKReleaser %REMOVE_LINE%
+	<script type="text/javascript" src="../../ckeditor.js"></script>
+	CKReleaser %REMOVE_START% -->
+	<script type="text/javascript" src="../../ckeditor_source.js"></script>
+	<!-- CKReleaser %REMOVE_END% -->
+	<link href="../sample.css" rel="stylesheet" type="text/css" />
+	<style type="text/css">
+		body { margin: 10px ; }
+	</style></head>
+<body>
+	<h1>
+		CKEditor - Adobe AIR Sample
+	</h1>
+	<p>
+		This is a sample HTML/JavaScript Adobe AIR application with CKEditor with default features.
+	</p>
+	<p>
+		<textarea cols="80" id="editor1" name="editor1" rows="10">&lt;p&gt;This is some &lt;strong&gt;sample text&lt;/strong&gt;. You are using &lt;a href="http://ckeditor.com/"&gt;CKEditor&lt;/a&gt;.&lt;/p&gt;</textarea>
+		<script type="text/javascript">
+		//<![CDATA[
+
+			// Replace the <textarea id="editor"> with an CKEditor
+			// instance, using default configurations.
+			CKEDITOR.replace( 'editor1' );
+
+		//]]>
+		</script>
+	</p>
+	<div id="footer" style="position:absolute;bottom:0;left:0;right:0;width:100%;padding-bottom:10px;">
+		<hr />
+		<p>
+			CKEditor - The text editor for Internet - <a href="#" onclick="window.runtime.flash.net.navigateToURL(new window.runtime.flash.net.URLRequest('http://ckeditor.com/'));return false;">http://ckeditor.com</a>
+		</p>
+		<p id="copy">
+			Copyright &copy; 2003-2010, <a href="#" onclick="window.runtime.flash.net.navigateToURL(new window.runtime.flash.net.URLRequest('http://cksource.com/'));return false;">CKSource</a> - Frederico
+			Knabben. All rights reserved.
+		</p>
+	</div>
+</body>
+</html>
Index: /CKEditor/trunk/_samples/api.html
===================================================================
--- /CKEditor/trunk/_samples/api.html	(revision 6189)
+++ /CKEditor/trunk/_samples/api.html	(revision 6190)
@@ -33,5 +33,5 @@
 	// Get the editor instance that we want to interact with.
 	var oEditor = CKEDITOR.instances.editor1;
-	var value = document.getElementById( 'plainArea' ).value;
+	var value = document.getElementById( 'htmlArea' ).value;
 
 	// Check the active editing mode.
@@ -45,9 +45,25 @@
 }
 
+function InsertText()
+{
+	// Get the editor instance that we want to interact with.
+	var oEditor = CKEDITOR.instances.editor1;
+	var value = document.getElementById( 'txtArea' ).value;
+
+	// Check the active editing mode.
+	if ( oEditor.mode == 'wysiwyg' )
+	{
+		// Insert as plain text.
+		oEditor.insertText( value );
+	}
+	else
+		alert( 'You must be on WYSIWYG mode!' );
+}
+
 function SetContents()
 {
 	// Get the editor instance that we want to interact with.
 	var oEditor = CKEDITOR.instances.editor1;
-	var value = document.getElementById( 'plainArea' ).value;
+	var value = document.getElementById( 'htmlArea' ).value;
 
 	// Set the editor contents (replace the actual one).
@@ -132,6 +148,12 @@
 			<input onclick="GetContents();" type="button" value="Get Editor Contents (XHTML)" />
 			<br />
-			<textarea cols="80" id="plainArea" rows="3">&lt;h2&gt;Test&lt;/h2&gt;&lt;p&gt;This is some &lt;a href="/Test1.html"&gt;sample&lt;/a&gt; HTML&lt;/p&gt;</textarea>
+			<textarea cols="80" id="htmlArea" rows="3">&lt;h2&gt;Test&lt;/h2&gt;&lt;p&gt;This is some &lt;a href="/Test1.html"&gt;sample&lt;/a&gt; HTML&lt;/p&gt;</textarea>
 			<br />
+			<br />
+			<input onclick="InsertText();" type="button" value="Insert Text" />
+			<br />
+			<textarea cols="80" id="txtArea" rows="3">   First line with some leading whitespaces.
+
+Second line of text preceding by two line-breaks.</textarea>
 			<br />
 			<input onclick="ExecuteCommand('bold');" type="button" value="Execute &quot;bold&quot; Command" />
Index: /CKEditor/trunk/_samples/index.html
===================================================================
--- /CKEditor/trunk/_samples/index.html	(revision 6189)
+++ /CKEditor/trunk/_samples/index.html	(revision 6190)
@@ -44,4 +44,5 @@
 		<li><a href="output_for_flash.html">Output for Flash</a></li>
 		<li><a href="autogrow.html">AutoGrow plugin</a></li>
+		<li><a href="placeholder.html">Placeholder plugin</a></li>
 	</ul>
 	<div id="footer">
Index: /CKEditor/trunk/_samples/placeholder.html
===================================================================
--- /CKEditor/trunk/_samples/placeholder.html	(revision 6190)
+++ /CKEditor/trunk/_samples/placeholder.html	(revision 6190)
@@ -0,0 +1,66 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!--
+Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+-->
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title>Placeholder Plugin - CKEditor Sample</title>
+	<meta content="text/html; charset=utf-8" http-equiv="content-type" />
+	<!-- CKReleaser %REMOVE_LINE%
+	<script type="text/javascript" src="../ckeditor.js"></script>
+	CKReleaser %REMOVE_START% -->
+	<script type="text/javascript" src="../ckeditor_source.js"></script>
+	<!-- CKReleaser %REMOVE_END% -->
+	<script src="sample.js" type="text/javascript"></script>
+	<link href="sample.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+	<h1>
+		CKEditor Sample
+	</h1>
+	<!-- This <div> holds alert messages to be display in the sample page. -->
+	<div id="alerts">
+		<noscript>
+			<p>
+				<strong>CKEditor requires JavaScript to run</strong>. In a browser with no JavaScript
+				support, like yours, you should still see the contents (HTML data) and you should
+				be able to edit it normally, without a rich editor interface.
+			</p>
+		</noscript>
+	</div>
+	<form action="sample_posteddata.php" method="post">
+		<p>
+			In this sample the Placeholder plugin is available.<br />
+			It replaces text in the format of <code>[[text]]</code> to uneditable sections, and lets the user edit them and create new ones using a dialog.</p>
+		<p>
+			<label for="editor1">
+				With default configuration:</label><br />
+			<textarea cols="80" id="editor1" name="editor1" rows="10">&lt;p&gt;This is a [[sample placeholder]]. You are using &lt;a href="http://ckeditor.com/"&gt;CKEditor&lt;/a&gt;. &lt;/p&gt;</textarea>
+			<script type="text/javascript">
+			//<![CDATA[
+
+				CKEDITOR.replace( 'editor1', {
+					extraPlugins : 'placeholder',
+					toolbar : [ [ 'Source', 'CreatePlaceholder' ] ]
+				});
+
+			//]]>
+			</script>
+		</p>
+		<p>
+			<input type="submit" value="Submit" />
+		</p>
+	</form>
+	<div id="footer">
+		<hr />
+		<p>
+			CKEditor - The text editor for Internet - <a href="http://ckeditor.com/">http://ckeditor.com</a>
+		</p>
+		<p id="copy">
+			Copyright &copy; 2003-2010, <a href="http://cksource.com/">CKSource</a> - Frederico
+			Knabben. All rights reserved.
+		</p>
+	</div>
+</body>
+</html>
Index: /CKEditor/trunk/_source/core/ckeditor_base.js
===================================================================
--- /CKEditor/trunk/_source/core/ckeditor_base.js	(revision 6189)
+++ /CKEditor/trunk/_source/core/ckeditor_base.js	(revision 6190)
@@ -13,5 +13,5 @@
 // ckeditor_source.js and ckeditor_basic_source.js files.
 
-// if(!window.CKEDITOR)window.CKEDITOR=(function(){var a={timestamp:'',version:'%VERSION%',rev:'%REV%',_:{},status:'unloaded',basePath:(function(){var d=window.CKEDITOR_BASEPATH||'';if(!d){var e=document.getElementsByTagName('script');for(var f=0;f<e.length;f++){var g=e[f].src.match(/(^|.*[\\\/])ckeditor(?:_basic)?(?:_source)?.js(?:\?.*)?$/i);if(g){d=g[1];break;}}}if(d.indexOf('://')==-1)if(d.indexOf('/')===0)d=location.href.match(/^.*?:\/\/[^\/]*/)[0]+d;else d=location.href.match(/^[^\?]*\/(?:)/)[0]+d;return d;})(),getUrl:function(d){if(d.indexOf('://')==-1&&d.indexOf('/')!==0)d=this.basePath+d;if(this.timestamp&&d.charAt(d.length-1)!='/')d+=(d.indexOf('?')>=0?'&':'?')+('t=')+this.timestamp;return d;}},b=window.CKEDITOR_GETURL;if(b){var c=a.getUrl;a.getUrl=function(d){return b.call(a,d)||c.call(a,d);};}return a;})();
+// if(!window.CKEDITOR)window.CKEDITOR=(function(){var a={timestamp:'',version:'%VERSION%',rev:'%REV%',_:{},status:'unloaded',basePath:(function(){var d=window.CKEDITOR_BASEPATH||'';if(!d){var e=document.getElementsByTagName('script');for(var f=0;f<e.length;f++){var g=e[f].src.match(/(^|.*[\\\/])ckeditor(?:_basic)?(?:_source)?.js(?:\?.*)?$/i);if(g){d=g[1];break;}}}if(d.indexOf(':/')==-1)if(d.indexOf('/')===0)d=location.href.match(/^.*?:\/\/[^\/]*/)[0]+d;else d=location.href.match(/^[^\?]*\/(?:)/)[0]+d;return d;})(),getUrl:function(d){if(d.indexOf(':/')==-1&&d.indexOf('/')!==0)d=this.basePath+d;if(this.timestamp&&d.charAt(d.length-1)!='/')d+=(d.indexOf('?')>=0?'&':'?')+('t=')+this.timestamp;return d;}},b=window.CKEDITOR_GETURL;if(b){var c=a.getUrl;a.getUrl=function(d){return b.call(a,d)||c.call(a,d);};}return a;})();
 
 // #### Raw code
@@ -127,5 +127,5 @@
 				// In IE (only) the script.src string is the raw valued entered in the
 				// HTML. Other browsers return the full resolved URL instead.
-				if ( path.indexOf('://') == -1 )
+				if ( path.indexOf(':/') == -1 )
 				{
 					// Absolute path.
@@ -169,5 +169,5 @@
 			{
 				// If this is not a full or absolute path.
-				if ( resource.indexOf('://') == -1 && resource.indexOf( '/' ) !== 0 )
+				if ( resource.indexOf(':/') == -1 && resource.indexOf( '/' ) !== 0 )
 					resource = this.basePath + resource;
 
Index: /CKEditor/trunk/_source/core/config.js
===================================================================
--- /CKEditor/trunk/_source/core/config.js	(revision 6189)
+++ /CKEditor/trunk/_source/core/config.js	(revision 6190)
@@ -293,4 +293,5 @@
 		'horizontalrule,' +
 		'htmldataprocessor,' +
+		'iframe,' +
 		'image,' +
 		'indent,' +
Index: /CKEditor/trunk/_source/core/dom/document.js
===================================================================
--- /CKEditor/trunk/_source/core/dom/document.js	(revision 6189)
+++ /CKEditor/trunk/_source/core/dom/document.js	(revision 6190)
@@ -166,4 +166,7 @@
 		{
 			var head = this.$.getElementsByTagName( 'head' )[0];
+			if ( !head )
+				head = this.getDocumentElement().append( new CKEDITOR.dom.element( 'head' ), true );
+			else
 			head = new CKEDITOR.dom.element( head );
 
@@ -221,4 +224,28 @@
 					return win;
 				})();
+		},
+
+		/**
+		 * Defines the document contents through document.write. Note that the
+		 * previous document contents will be lost (cleaned).
+		 * @since 3.5
+		 * @param {String} html The HTML defining the document contents.
+		 * @example
+		 * document.write(
+		 *     '&lt;html&gt;' +
+		 *         '&lt;head&gt;&lt;title&gt;Sample Doc&lt;/title&gt;&lt;/head&gt;' +
+		 *         '&lt;body&gt;Document contents created by code&lt;/body&gt;' +
+		 *      '&lt;/html&gt;' );
+		 */
+		write : function( html )
+		{
+			// Don't leave any history log in IE. (#5657)
+			this.$.open( 'text/html', 'replace' );
+
+			// Support for custom document.domain in IE.
+			CKEDITOR.env.isCustomDomain() &&  ( this.$.domain = document.domain );
+
+			this.$.write( html );
+			this.$.close();
 		}
 	});
Index: /CKEditor/trunk/_source/core/dom/domobject.js
===================================================================
--- /CKEditor/trunk/_source/core/dom/domobject.js	(revision 6189)
+++ /CKEditor/trunk/_source/core/dom/domobject.js	(revision 6190)
@@ -168,4 +168,7 @@
 	 * Sets a data slot value for this object. These values are shared by all
 	 * instances pointing to that same DOM object.
+	 * <strong>Note:</strong> The created data slot is only guarantied to be available on this unique dom node,
+	 * thus any wish to continue access it from other element clones (either created by clone node or from innerHtml)
+	 * will fail, for such usage, please use {@link CKEDITOR.dom.element::setAttribute} instead.
 	 * @name CKEDITOR.dom.domObject.prototype.setCustomData
 	 * @function
@@ -201,5 +204,5 @@
 	domObjectProto.getCustomData = function( key )
 	{
-		var expandoNumber = this.$._cke_expando,
+		var expandoNumber = this.$[ 'data-cke-expando' ],
 			dataSlot = expandoNumber && customData[ expandoNumber ];
 
@@ -212,5 +215,5 @@
 	domObjectProto.removeCustomData = function( key )
 	{
-		var expandoNumber = this.$._cke_expando,
+		var expandoNumber = this.$[ 'data-cke-expando' ],
 			dataSlot = expandoNumber && customData[ expandoNumber ],
 			retval = dataSlot && dataSlot[ key ];
@@ -234,5 +237,5 @@
 		this.removeAllListeners();
 
-		var expandoNumber = this.$._cke_expando;
+		var expandoNumber = this.$[ 'data-cke-expando' ];
 		expandoNumber && delete customData[ expandoNumber ];
 	};
@@ -247,5 +250,5 @@
 	domObjectProto.getUniqueId = function()
 	{
-		return this.$._cke_expando || ( this.$._cke_expando = CKEDITOR.tools.getNextNumber() );
+		return this.$[ 'data-cke-expando' ] || ( this.$[ 'data-cke-expando' ] = CKEDITOR.tools.getNextNumber() );
 	};
 
Index: /CKEditor/trunk/_source/core/dom/element.js
===================================================================
--- /CKEditor/trunk/_source/core/dom/element.js	(revision 6189)
+++ /CKEditor/trunk/_source/core/dom/element.js	(revision 6190)
@@ -1,3 +1,3 @@
-/*
+﻿/*
 Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
 For licensing, see LICENSE.html or http://ckeditor.com/license
@@ -308,10 +308,14 @@
 		/**
 		 * Moves the selection focus to this element.
+		 * @param  {Boolean} defer Whether to asynchronously defer the
+		 * 		execution by 100 ms.
 		 * @example
 		 * var element = CKEDITOR.document.getById( 'myTextarea' );
 		 * <b>element.focus()</b>;
 		 */
-		focus : function()
-		{
+		focus : (function()
+		{
+			function exec()
+			{
 			// IE throws error if the element is not visible.
 			try
@@ -321,5 +325,14 @@
 			catch (e)
 			{}
-		},
+			}
+
+			return function( defer )
+			{
+				if ( defer )
+					CKEDITOR.tools.setTimeout( exec, 100, this );
+				else
+					exec.call( this );
+			}
+		}()),
 
 		/**
@@ -726,5 +739,8 @@
 				var attribute = thisAttribs[ i ];
 
-				if ( ( !CKEDITOR.env.ie || ( attribute.specified && attribute.nodeName != '_cke_expando' ) ) && attribute.nodeValue != otherElement.getAttribute( attribute.nodeName ) )
+				if ( attribute.nodeName == '_moz_dirty' )
+					continue;
+
+				if ( ( !CKEDITOR.env.ie || ( attribute.specified && attribute.nodeName != 'data-cke-expando' ) ) && attribute.nodeValue != otherElement.getAttribute( attribute.nodeName ) )
 					return false;
 			}
@@ -737,5 +753,5 @@
 				{
 					attribute = otherAttribs[ i ];
-					if ( attribute.specified && attribute.nodeName != '_cke_expando'
+					if ( attribute.specified && attribute.nodeName != 'data-cke-expando'
 							&& attribute.nodeValue != this.getAttribute( attribute.nodeName ) )
 						return false;
@@ -787,5 +803,5 @@
 				var child = children.getItem( i );
 
-				if ( child.type == CKEDITOR.NODE_ELEMENT && child.getAttribute( '_cke_bookmark' ) )
+				if ( child.type == CKEDITOR.NODE_ELEMENT && child.data( 'cke-bookmark' ) )
 					continue;
 
@@ -832,5 +848,5 @@
 
 							// Attributes to be ignored.
-							case '_cke_expando' :
+							case 'data-cke-expando' :
 								continue;
 
@@ -852,5 +868,5 @@
 
 					// The _moz_dirty attribute might get into the element after pasting (#5455)
-					var execludeAttrs = { _cke_expando : 1, _moz_dirty : 1 };
+					var execludeAttrs = { 'data-cke-expando' : 1, _moz_dirty : 1 };
 
 					return attrsNum > 0 &&
@@ -915,5 +931,5 @@
 					var pendingNodes = [];
 
-					while ( sibling.getAttribute( '_cke_bookmark' )
+					while ( sibling.data( 'cke-bookmark' )
 						|| sibling.isEmptyInlineRemoveable() )
 					{
@@ -1481,5 +1497,5 @@
 			// Replace the node.
 			this.getParent() && this.$.parentNode.replaceChild( newNode.$, this.$ );
-			newNode.$._cke_expando = this.$._cke_expando;
+			newNode.$[ 'data-cke-expando' ] = this.$[ 'data-cke-expando' ];
 			this.$ = newNode.$;
 		},
@@ -1523,34 +1539,4 @@
 
 		/**
-		 *  Update the element's size with box model awareness.
-		 * @name CKEDITOR.dom.element.setSize
-		 * @param {String} type [width|height]
-		 * @param {Number} size The length unit in px.
-		 * @param isBorderBox Apply the {@param width} and {@param height} based on border box model.
-		 */
-		setSize : ( function()
-		{
-			var sides = {
-				width : [ "border-left-width", "border-right-width","padding-left", "padding-right" ],
-				height : [ "border-top-width", "border-bottom-width", "padding-top",  "padding-bottom" ]
-			};
-
-			return function( type, size, isBorderBox )
-				{
-					if ( typeof size == 'number' )
-					{
-						if ( isBorderBox && !( CKEDITOR.env.ie && CKEDITOR.env.quirks ) )
-						{
-							var	adjustment = 0;
-							for ( var i = 0, len = sides[ type ].length; i < len; i++ )
-								adjustment += parseInt( this.getComputedStyle( sides [ type ][ i ] ) || 0, 10 ) || 0;
-							size -= adjustment;
-						}
-						this.setStyle( type, size + 'px' );
-					}
-				};
-		})(),
-
-		/**
 		 * Gets element's direction. Supports both CSS 'direction' prop and 'dir' attr.
 		 */
@@ -1558,4 +1544,72 @@
 		{
 			return useComputed ? this.getComputedStyle( 'direction' ) : this.getStyle( 'direction' ) || this.getAttribute( 'dir' );
+		},
+
+		/**
+		 * Gets, sets and removes custom data to be stored as HTML5 data-* attributes.
+		 * @name CKEDITOR.dom.element.data
+		 * @param {String} name The name of the attribute, execluding the 'data-' part.
+		 * @param {String} [value] The value to set. If set to false, the attribute will be removed.
+		 */
+		data : function ( name, value )
+		{
+			name = 'data-' + name;
+			if ( value === undefined )
+				return this.getAttribute( name );
+			else if ( value === false )
+				this.removeAttribute( name );
+			else
+				this.setAttribute( name, value );
 		}
 	});
+
+( function()
+{
+	var sides = {
+		width : [ "border-left-width", "border-right-width","padding-left", "padding-right" ],
+		height : [ "border-top-width", "border-bottom-width", "padding-top",  "padding-bottom" ]
+	};
+
+	function marginAndPaddingSize( type )
+	{
+		var adjustment = 0;
+		for ( var i = 0, len = sides[ type ].length; i < len; i++ )
+			adjustment += parseInt( this.getComputedStyle( sides [ type ][ i ] ) || 0, 10 ) || 0;
+		return adjustment;
+	}
+
+	/**
+	 * Update the element's size with box model awareness.
+	 * @name CKEDITOR.dom.element.setSize
+	 * @param {String} type [width|height]
+	 * @param {Number} size The length unit in px.
+	 * @param isBorderBox Apply the {@param width} and {@param height} based on border box model.
+	 */
+	CKEDITOR.dom.element.prototype.setSize = function( type, size, isBorderBox )
+		{
+			if ( typeof size == 'number' )
+			{
+				if ( isBorderBox && !( CKEDITOR.env.ie && CKEDITOR.env.quirks ) )
+					size -= marginAndPaddingSize.call( this, type );
+
+				this.setStyle( type, size + 'px' );
+			}
+		};
+
+	/**
+	 * Get the element's size, possibly with box model awareness.
+	 * @name CKEDITOR.dom.element.getSize
+	 * @param {String} type [width|height]
+	 * @param {Boolean} contentSize Get the {@param width} or {@param height} based on border box model.
+	 */
+	CKEDITOR.dom.element.prototype.getSize = function( type, contentSize )
+		{
+			var size = Math.max( this.$[ 'offset' + CKEDITOR.tools.capitalize( type )  ],
+				this.$[ 'client' + CKEDITOR.tools.capitalize( type )  ] ) || 0;
+
+			if ( contentSize )
+				size -= marginAndPaddingSize.call( this, type );
+
+			return size;
+		};
+})();
Index: /CKEditor/trunk/_source/core/dom/node.js
===================================================================
--- /CKEditor/trunk/_source/core/dom/node.js	(revision 6189)
+++ /CKEditor/trunk/_source/core/dom/node.js	(revision 6190)
@@ -108,22 +108,23 @@
 			var $clone = this.$.cloneNode( includeChildren );
 
-			if ( !cloneId )
-			{
-				var removeIds = function( node )
-				{
-					if ( node.nodeType != CKEDITOR.NODE_ELEMENT )
-						return;
-
-					node.removeAttribute( 'id', false ) ;
-					node.removeAttribute( '_cke_expando', false ) ;
-
+			var removeIds = function( node )
+			{
+				if ( node.nodeType != CKEDITOR.NODE_ELEMENT )
+					return;
+
+				if ( !cloneId )
+					node.removeAttribute( 'id', false );
+				node.removeAttribute( 'data-cke-expando', false );
+
+				if ( includeChildren )
+				{
 					var childs = node.childNodes;
-					for ( var i=0 ; i < childs.length ; i++ )
+					for ( var i=0; i < childs.length; i++ )
 						removeIds( childs[ i ] );
-				};
-
-				// The "id" attribute should never be cloned to avoid duplication.
-				removeIds( $clone );
-			}
+				}
+			};
+
+			// The "id" attribute should never be cloned to avoid duplication.
+			removeIds( $clone );
 
 			return new CKEDITOR.dom.node( $clone );
@@ -244,11 +245,5 @@
 		getDocument : function()
 		{
-			var document = new CKEDITOR.dom.document( this.$.ownerDocument || this.$.parentNode.ownerDocument );
-
-			return (
-			this.getDocument = function()
-				{
-					return document;
-				})();
+			return new CKEDITOR.dom.document( this.$.ownerDocument || this.$.parentNode.ownerDocument );
 		},
 
Index: /CKEditor/trunk/_source/core/dom/range.js
===================================================================
--- /CKEditor/trunk/_source/core/dom/range.js	(revision 6189)
+++ /CKEditor/trunk/_source/core/dom/range.js	(revision 6190)
@@ -309,5 +309,5 @@
 			    && node.getName() in CKEDITOR.dtd.$removeEmpty
 			    || !CKEDITOR.tools.trim( node.getText() )
-			    || node.getParent().hasAttribute( '_cke_bookmark' );
+			    || node.getParent().data( 'cke-bookmark' );
 	}
 
@@ -404,5 +404,5 @@
 
 			startNode = this.document.createElement( 'span' );
-			startNode.setAttribute( '_cke_bookmark', 1 );
+			startNode.data( 'cke-bookmark', 1 );
 			startNode.setStyle( 'display', 'none' );
 
@@ -714,8 +714,8 @@
 
 			if ( startNode.is && startNode.is( 'span' )
-				&& startNode.hasAttribute( '_cke_bookmark' ) )
+				&& startNode.data( 'cke-bookmark' ) )
 				this.setStartAt( startNode, CKEDITOR.POSITION_BEFORE_START );
 			if ( endNode && endNode.is && endNode.is( 'span' )
-				&& endNode.hasAttribute( '_cke_bookmark' ) )
+				&& endNode.data( 'cke-bookmark' ) )
 				this.setEndAt( endNode,  CKEDITOR.POSITION_AFTER_END );
 		},
@@ -923,5 +923,5 @@
 								// We need to check for the bookmark attribute because IE insists on
 								// rendering the display:none nodes we use for bookmarks. (#3363)
-								if ( sibling.$.offsetWidth > 0 && !sibling.getAttribute( '_cke_bookmark' ) )
+								if ( sibling.$.offsetWidth > 0 && !sibling.data( 'cke-bookmark' ) )
 								{
 									// We'll accept it only if we need
@@ -1082,5 +1082,5 @@
 								// We need to check for the bookmark attribute because IE insists on
 								// rendering the display:none nodes we use for bookmarks. (#3363)
-								if ( sibling.$.offsetWidth > 0 && !sibling.getAttribute( '_cke_bookmark' ) )
+								if ( sibling.$.offsetWidth > 0 && !sibling.data( 'cke-bookmark' ) )
 								{
 									// We'll accept it only if we need
Index: /CKEditor/trunk/_source/core/dom/walker.js
===================================================================
--- /CKEditor/trunk/_source/core/dom/walker.js	(revision 6189)
+++ /CKEditor/trunk/_source/core/dom/walker.js	(revision 6190)
@@ -374,5 +374,5 @@
 			return ( node && node.getName
 					&& node.getName() == 'span'
-					&& node.hasAttribute( '_cke_bookmark' ) );
+					&& node.data( 'cke-bookmark' ) );
 		}
 
Index: /CKEditor/trunk/_source/core/editor.js
===================================================================
--- /CKEditor/trunk/_source/core/editor.js	(revision 6189)
+++ /CKEditor/trunk/_source/core/editor.js	(revision 6190)
@@ -228,4 +228,7 @@
 		}
 
+		// Load the Adobe AIR plugin conditionally.
+		CKEDITOR.env.air && ( plugins += ',adobeair' );
+
 		// Load all plugins defined in the "plugins" setting.
 		CKEDITOR.plugins.load( plugins.split( ',' ), function( plugins )
@@ -757,4 +760,20 @@
 
 		/**
+		 * Insert text content into the currently selected position in the
+		 * editor, in WYSIWYG mode, styles of the selected element will be applied to the inserted text,
+		 * spaces around the text will be leaving untouched.
+		 * <strong>Note:</strong> two subsequent line-breaks will introduce one paragraph, which element depends on {@link CKEDITOR.config.enterMode};
+		 * A single line-break will be instead translated into one &lt;br /&gt;.
+		 * @since 3.5
+		 * @param {String} text Text to be inserted into the editor.
+		 * @example
+		 * CKEDITOR.instances.editor1.<b>insertText( ' line1 \n\n line2' )</b>;
+		 */
+		insertText : function( text )
+		{
+			this.fire( 'insertText', text );
+		},
+
+		/**
 		 * Inserts an element into the currently selected position in the
 		 * editor.
Index: /CKEditor/trunk/_source/core/htmlparser/element.js
===================================================================
--- /CKEditor/trunk/_source/core/htmlparser/element.js	(revision 6189)
+++ /CKEditor/trunk/_source/core/htmlparser/element.js	(revision 6190)
@@ -35,5 +35,5 @@
 	this.children = [];
 
-	var tagName = attributes._cke_real_element_type || name;
+	var tagName = attributes[ 'data-cke-real-element-type' ] || name;
 
 	var dtd			= CKEDITOR.dtd,
Index: /CKEditor/trunk/_source/core/htmlparser/fragment.js
===================================================================
--- /CKEditor/trunk/_source/core/htmlparser/fragment.js	(revision 6189)
+++ /CKEditor/trunk/_source/core/htmlparser/fragment.js	(revision 6190)
@@ -126,5 +126,5 @@
 				if ( element.attributes
 					 && ( realElementName =
-						  element.attributes[ '_cke_real_element_type' ] ) )
+						  element.attributes[ 'data-cke-real-element-type' ] ) )
 					elementName = realElementName;
 				else
Index: Editor/trunk/_source/core/imagecacher.js
===================================================================
--- /CKEditor/trunk/_source/core/imagecacher.js	(revision 6189)
+++ 	(revision )
@@ -1,80 +1,0 @@
-﻿/*
-Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-(function()
-{
-	var loaded = {};
-
-	var loadImage = function( image, callback )
-	{
-		var doCallback = function()
-			{
-				img.removeAllListeners();
-				loaded[ image ] = 1;
-				callback();
-			};
-
-		var img = new CKEDITOR.dom.element( 'img' );
-		img.on( 'load', doCallback );
-		img.on( 'error', doCallback );
-		img.setAttribute( 'src', image );
-	};
-
-	/**
-	 * @namespace Load images into the browser cache.
-	 */
- 	CKEDITOR.imageCacher =
-	{
-		/**
-		 * Loads one or more images.
-		 * @param {Array} images The URLs of the images to be loaded.
-		 * @param {Function} [callback] A function to be called once all images
-		 *		are loaded.
-		 * @return {CKEDITOR.event} An event object which fires the 'loaded'
-		 *		event when all images are completely loaded. Additionally, the
-		 *		"finished" property is set after the "loaded" event call.
-		 * @example
-		 * var loader = CKEDITOR.imageCacher.load( [ '/image1.png', 'image2.png' ] );
-		 * if ( !loader.finished )
-		 * {
-		 *     loader.on( 'load', function()
-		 *         {
-		 *             alert( 'All images are loaded' );
-		 *         });
-		 * }
-		 */
-		load : function( images, callback )
-		{
-			var pendingCount = images.length;
-
-			var event = new CKEDITOR.event;
-			event.on( 'loaded', function()
-				{
-					event.finished = 1;
-				});
-
-			if ( callback )
-				event.on( 'loaded', callback );
-
-			var checkPending = function()
-				{
-					if ( --pendingCount === 0 )
-						event.fire( 'loaded' );
-				};
-
-			for ( var i = 0 ; i < images.length ; i++ )
-			{
-				var image = images[ i ];
-
-				if ( loaded[ image ] )
-					checkPending();
-				else
-					loadImage( image, checkPending );
-			}
-
-			return event;
-		}
-	};
-})();
Index: /CKEditor/trunk/_source/core/loader.js
===================================================================
--- /CKEditor/trunk/_source/core/loader.js	(revision 6189)
+++ /CKEditor/trunk/_source/core/loader.js	(revision 6190)
@@ -60,10 +60,9 @@
 			'core/htmlparser/filter'	: [ 'core/htmlparser' ],
 			'core/htmlparser/basicwriter': [ 'core/htmlparser' ],
-			'core/imagecacher'		: [ 'core/dom/element', 'core/event' ],
 			'core/lang'				: [],
 			'core/plugins'			: [ 'core/resourcemanager' ],
 			'core/resourcemanager'	: [ 'core/scriptloader', 'core/tools' ],
 			'core/scriptloader'		: [ 'core/dom/element', 'core/env' ],
-			'core/skins'			: [ 'core/imagecacher', 'core/scriptloader' ],
+			'core/skins'			: [ 'core/scriptloader' ],
 			'core/themes'			: [ 'core/resourcemanager' ],
 			'core/tools'			: [ 'core/env' ],
Index: /CKEditor/trunk/_source/core/skins.js
===================================================================
--- /CKEditor/trunk/_source/core/skins.js	(revision 6189)
+++ /CKEditor/trunk/_source/core/skins.js	(revision 6190)
@@ -18,5 +18,4 @@
 	// Holds the list of loaded skins.
 	var loaded = {},
-		preloaded = {},
 		paths = {};
 
@@ -53,31 +52,4 @@
 							return 'url(' + baseUrl + opener +  path + closer + ')';
 					} );
-		}
-
-		// Check if we need to preload images from it.
-		var preload = skinDefinition.preload;
-		if ( preload && preload.length > 0 )
-		{
-			if ( !preloaded[ skinName ] )
-			{
-				// Prepare image URLs
-				appendSkinPath( preload );
-
-				// Get preloader event dispatcher object.
-				preloaded[ skinName ] = CKEDITOR.imageCacher.load( preload );
-			}
-
-			if ( !preloaded[ skinName ].finished )
-			{
-				// Bind listener for this editor instance.
-				preloaded[ skinName ].on( 'loaded', function()
-					{
-						loadPart( editor, skinName, part, callback );
-					}
-				);
-
-				// Execution will be continued from event listener.
-				return;
-			}
 		}
 
Index: /CKEditor/trunk/_source/core/tools.js
===================================================================
--- /CKEditor/trunk/_source/core/tools.js	(revision 6189)
+++ /CKEditor/trunk/_source/core/tools.js	(revision 6190)
@@ -639,5 +639,5 @@
 			return functions.push( function()
 				{
-					fn.apply( scope || this, arguments );
+					return fn.apply( scope || this, arguments );
 				}) - 1;
 		},
Index: /CKEditor/trunk/_source/core/ui.js
===================================================================
--- /CKEditor/trunk/_source/core/ui.js	(revision 6189)
+++ /CKEditor/trunk/_source/core/ui.js	(revision 6190)
@@ -92,4 +92,6 @@
 };
 
+CKEDITOR.event.implementOn( CKEDITOR.ui );
+
 /**
  * (Virtual Class) Do not call this constructor. This class is not really part
Index: /CKEditor/trunk/_source/lang/_translationstatus.txt
===================================================================
--- /CKEditor/trunk/_source/lang/_translationstatus.txt	(revision 6189)
+++ /CKEditor/trunk/_source/lang/_translationstatus.txt	(revision 6190)
@@ -2,59 +2,59 @@
 For licensing, see LICENSE.html or http://ckeditor.com/license
 
-af.js      Found: 287 Missing: 244
-ar.js      Found: 451 Missing: 80
-bg.js      Found: 280 Missing: 251
-bn.js      Found: 281 Missing: 250
-bs.js      Found: 187 Missing: 344
-ca.js      Found: 490 Missing: 41
-cs.js      Found: 411 Missing: 120
-cy.js      Found: 452 Missing: 79
-da.js      Found: 404 Missing: 127
-de.js      Found: 528 Missing: 3
-el.js      Found: 286 Missing: 245
-en-au.js   Found: 369 Missing: 162
-en-ca.js   Found: 369 Missing: 162
-en-gb.js   Found: 370 Missing: 161
-eo.js      Found: 259 Missing: 272
-es.js      Found: 531 Missing: 0
-et.js      Found: 301 Missing: 230
-eu.js      Found: 403 Missing: 128
-fa.js      Found: 302 Missing: 229
-fi.js      Found: 531 Missing: 0
-fo.js      Found: 420 Missing: 111
-fr-ca.js   Found: 301 Missing: 230
-fr.js      Found: 403 Missing: 128
-gl.js      Found: 283 Missing: 248
-gu.js      Found: 300 Missing: 231
-he.js      Found: 531 Missing: 0
-hi.js      Found: 302 Missing: 229
-hr.js      Found: 404 Missing: 127
-hu.js      Found: 530 Missing: 1
-is.js      Found: 307 Missing: 224
-it.js      Found: 404 Missing: 127
-ja.js      Found: 489 Missing: 42
-km.js      Found: 275 Missing: 256
-ko.js      Found: 293 Missing: 238
-lt.js      Found: 306 Missing: 225
-lv.js      Found: 283 Missing: 248
-mn.js      Found: 300 Missing: 231
-ms.js      Found: 265 Missing: 266
-nb.js      Found: 470 Missing: 61
-nl.js      Found: 531 Missing: 0
-no.js      Found: 470 Missing: 61
-pl.js      Found: 411 Missing: 120
-pt-br.js   Found: 524 Missing: 7
-pt.js      Found: 282 Missing: 249
-ro.js      Found: 301 Missing: 230
-ru.js      Found: 467 Missing: 64
-sk.js      Found: 302 Missing: 229
-sl.js      Found: 410 Missing: 121
-sr-latn.js Found: 276 Missing: 255
-sr.js      Found: 275 Missing: 256
-sv.js      Found: 299 Missing: 232
-th.js      Found: 287 Missing: 244
-tr.js      Found: 524 Missing: 7
-uk.js      Found: 531 Missing: 0
-vi.js      Found: 481 Missing: 50
-zh-cn.js   Found: 531 Missing: 0
-zh.js      Found: 404 Missing: 127
+af.js      Found: 287 Missing: 259
+ar.js      Found: 451 Missing: 95
+bg.js      Found: 280 Missing: 266
+bn.js      Found: 281 Missing: 265
+bs.js      Found: 187 Missing: 359
+ca.js      Found: 490 Missing: 56
+cs.js      Found: 411 Missing: 135
+cy.js      Found: 452 Missing: 94
+da.js      Found: 404 Missing: 142
+de.js      Found: 528 Missing: 18
+el.js      Found: 286 Missing: 260
+en-au.js   Found: 369 Missing: 177
+en-ca.js   Found: 369 Missing: 177
+en-gb.js   Found: 370 Missing: 176
+eo.js      Found: 259 Missing: 287
+es.js      Found: 531 Missing: 15
+et.js      Found: 301 Missing: 245
+eu.js      Found: 403 Missing: 143
+fa.js      Found: 302 Missing: 244
+fi.js      Found: 531 Missing: 15
+fo.js      Found: 420 Missing: 126
+fr-ca.js   Found: 301 Missing: 245
+fr.js      Found: 403 Missing: 143
+gl.js      Found: 283 Missing: 263
+gu.js      Found: 300 Missing: 246
+he.js      Found: 546 Missing: 0
+hi.js      Found: 302 Missing: 244
+hr.js      Found: 404 Missing: 142
+hu.js      Found: 530 Missing: 16
+is.js      Found: 307 Missing: 239
+it.js      Found: 404 Missing: 142
+ja.js      Found: 489 Missing: 57
+km.js      Found: 275 Missing: 271
+ko.js      Found: 293 Missing: 253
+lt.js      Found: 306 Missing: 240
+lv.js      Found: 283 Missing: 263
+mn.js      Found: 300 Missing: 246
+ms.js      Found: 265 Missing: 281
+nb.js      Found: 470 Missing: 76
+nl.js      Found: 531 Missing: 15
+no.js      Found: 470 Missing: 76
+pl.js      Found: 411 Missing: 135
+pt-br.js   Found: 524 Missing: 22
+pt.js      Found: 282 Missing: 264
+ro.js      Found: 301 Missing: 245
+ru.js      Found: 467 Missing: 79
+sk.js      Found: 302 Missing: 244
+sl.js      Found: 410 Missing: 136
+sr-latn.js Found: 276 Missing: 270
+sr.js      Found: 275 Missing: 271
+sv.js      Found: 299 Missing: 247
+th.js      Found: 287 Missing: 259
+tr.js      Found: 524 Missing: 22
+uk.js      Found: 531 Missing: 15
+vi.js      Found: 481 Missing: 65
+zh-cn.js   Found: 546 Missing: 0
+zh.js      Found: 404 Missing: 142
Index: /CKEditor/trunk/_source/lang/af.js
===================================================================
--- /CKEditor/trunk/_source/lang/af.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/af.js	(revision 6190)
@@ -616,4 +616,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/lang/ar.js
===================================================================
--- /CKEditor/trunk/_source/lang/ar.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/ar.js	(revision 6190)
@@ -616,4 +616,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/lang/bg.js
===================================================================
--- /CKEditor/trunk/_source/lang/bg.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/bg.js	(revision 6190)
@@ -616,4 +616,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/lang/bn.js
===================================================================
--- /CKEditor/trunk/_source/lang/bn.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/bn.js	(revision 6190)
@@ -616,4 +616,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/lang/bs.js
===================================================================
--- /CKEditor/trunk/_source/lang/bs.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/bs.js	(revision 6190)
@@ -616,4 +616,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/lang/ca.js
===================================================================
--- /CKEditor/trunk/_source/lang/ca.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/ca.js	(revision 6190)
@@ -616,4 +616,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/lang/cs.js
===================================================================
--- /CKEditor/trunk/_source/lang/cs.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/cs.js	(revision 6190)
@@ -616,4 +616,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/lang/cy.js
===================================================================
--- /CKEditor/trunk/_source/lang/cy.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/cy.js	(revision 6190)
@@ -616,4 +616,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/lang/da.js
===================================================================
--- /CKEditor/trunk/_source/lang/da.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/da.js	(revision 6190)
@@ -616,4 +616,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/lang/de.js
===================================================================
--- /CKEditor/trunk/_source/lang/de.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/de.js	(revision 6190)
@@ -616,4 +616,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/lang/el.js
===================================================================
--- /CKEditor/trunk/_source/lang/el.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/el.js	(revision 6190)
@@ -616,4 +616,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/lang/en-au.js
===================================================================
--- /CKEditor/trunk/_source/lang/en-au.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/en-au.js	(revision 6190)
@@ -529,8 +529,8 @@
 	justify :
 	{
-		left	: 'Left Justify',
-		center	: 'Centre Justify',
-		right	: 'Right Justify',
-		block	: 'Block Justify'
+		left	: 'Align Left',
+		center	: 'Centre',
+		right	: 'Align Right',
+		block	: 'Justify'
 	},
 
@@ -615,4 +615,23 @@
 		remove				: 'Remove Div' // MISSING
   	},
+
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
 
 	font :
Index: /CKEditor/trunk/_source/lang/en-ca.js
===================================================================
--- /CKEditor/trunk/_source/lang/en-ca.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/en-ca.js	(revision 6190)
@@ -529,8 +529,8 @@
 	justify :
 	{
-		left	: 'Left Justify',
-		center	: 'Centre Justify',
-		right	: 'Right Justify',
-		block	: 'Block Justify'
+		left	: 'Align Left',
+		center	: 'Centre',
+		right	: 'Align Right',
+		block	: 'Justify'
 	},
 
@@ -615,4 +615,23 @@
 		remove				: 'Remove Div' // MISSING
   	},
+
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
 
 	font :
Index: /CKEditor/trunk/_source/lang/en-gb.js
===================================================================
--- /CKEditor/trunk/_source/lang/en-gb.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/en-gb.js	(revision 6190)
@@ -529,8 +529,8 @@
 	justify :
 	{
-		left	: 'Left Justify',
-		center	: 'Centre Justify',
-		right	: 'Right Justify',
-		block	: 'Block Justify'
+		left	: 'Align Left',
+		center	: 'Centre',
+		right	: 'Align Right',
+		block	: 'Justify'
 	},
 
@@ -615,4 +615,23 @@
 		remove				: 'Remove Div' // MISSING
   	},
+
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
 
 	font :
Index: /CKEditor/trunk/_source/lang/en.js
===================================================================
--- /CKEditor/trunk/_source/lang/en.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/en.js	(revision 6190)
@@ -529,8 +529,8 @@
 	justify :
 	{
-		left	: 'Left Justify',
-		center	: 'Center Justify',
-		right	: 'Right Justify',
-		block	: 'Block Justify'
+		left	: 'Align Left',
+		center	: 'Center',
+		right	: 'Align Right',
+		block	: 'Justify'
 	},
 
@@ -615,4 +615,23 @@
 		remove				: 'Remove Div'
   	},
+
+	iframe :
+	{
+		title		: 'iFrame Properties',
+		toolbar		: 'iFrame',
+		height		: 'Height',
+		width		: 'Width',
+		invalidHeight	: 'iFrame height must be a number.',
+		invalidWidth	: 'iFrame width must be a number.',
+		noUrl		: 'Please type the iFrame URL',
+		scrolling	: 'Enable scrollbars',
+		border		: 'Show frame border',
+		align		: 'Alignment',
+		alignLeft	: 'Left',
+		alignRight	: 'Right',
+		alignTop	: 'Top',
+		alignMiddle	: 'Middle',
+		alignBottom	: 'Bottom'
+	},
 
 	font :
Index: /CKEditor/trunk/_source/lang/eo.js
===================================================================
--- /CKEditor/trunk/_source/lang/eo.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/eo.js	(revision 6190)
@@ -616,4 +616,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/lang/es.js
===================================================================
--- /CKEditor/trunk/_source/lang/es.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/es.js	(revision 6190)
@@ -616,4 +616,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/lang/et.js
===================================================================
--- /CKEditor/trunk/_source/lang/et.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/et.js	(revision 6190)
@@ -616,4 +616,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/lang/eu.js
===================================================================
--- /CKEditor/trunk/_source/lang/eu.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/eu.js	(revision 6190)
@@ -616,4 +616,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/lang/fa.js
===================================================================
--- /CKEditor/trunk/_source/lang/fa.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/fa.js	(revision 6190)
@@ -616,4 +616,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/lang/fi.js
===================================================================
--- /CKEditor/trunk/_source/lang/fi.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/fi.js	(revision 6190)
@@ -616,4 +616,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/lang/fo.js
===================================================================
--- /CKEditor/trunk/_source/lang/fo.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/fo.js	(revision 6190)
@@ -616,4 +616,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/lang/fr-ca.js
===================================================================
--- /CKEditor/trunk/_source/lang/fr-ca.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/fr-ca.js	(revision 6190)
@@ -616,4 +616,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/lang/fr.js
===================================================================
--- /CKEditor/trunk/_source/lang/fr.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/fr.js	(revision 6190)
@@ -616,4 +616,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/lang/gl.js
===================================================================
--- /CKEditor/trunk/_source/lang/gl.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/gl.js	(revision 6190)
@@ -616,4 +616,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/lang/gu.js
===================================================================
--- /CKEditor/trunk/_source/lang/gu.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/gu.js	(revision 6190)
@@ -616,4 +616,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/lang/he.js
===================================================================
--- /CKEditor/trunk/_source/lang/he.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/he.js	(revision 6190)
@@ -616,4 +616,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'מאפייני חלון פנימי (iFrame)',
+		toolbar		: 'חלון פנימי (iFrame)',
+		height		: 'גובה',
+		width		: 'רוחב',
+		invalidHeight	: 'גובה החלון חייב להיות מספרי.',
+		invalidWidth	: 'רוחב החלון חייב להיות מספרי.',
+		noUrl		: 'יש להכניס כתובת לחלון.',
+		scrolling	: 'אפשר פסי גלילה',
+		border		: 'הראה מסגרת לחלון',
+		align		: 'יישור',
+		alignLeft	: 'שמאל',
+		alignRight	: 'ימין',
+		alignTop	: 'למעלה',
+		alignMiddle	: 'מרכז',
+		alignBottom	: 'למטה'
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/lang/hi.js
===================================================================
--- /CKEditor/trunk/_source/lang/hi.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/hi.js	(revision 6190)
@@ -616,4 +616,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/lang/hr.js
===================================================================
--- /CKEditor/trunk/_source/lang/hr.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/hr.js	(revision 6190)
@@ -616,4 +616,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/lang/hu.js
===================================================================
--- /CKEditor/trunk/_source/lang/hu.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/hu.js	(revision 6190)
@@ -616,4 +616,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/lang/is.js
===================================================================
--- /CKEditor/trunk/_source/lang/is.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/is.js	(revision 6190)
@@ -616,4 +616,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/lang/it.js
===================================================================
--- /CKEditor/trunk/_source/lang/it.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/it.js	(revision 6190)
@@ -616,4 +616,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/lang/ja.js
===================================================================
--- /CKEditor/trunk/_source/lang/ja.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/ja.js	(revision 6190)
@@ -616,4 +616,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/lang/km.js
===================================================================
--- /CKEditor/trunk/_source/lang/km.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/km.js	(revision 6190)
@@ -616,4 +616,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/lang/ko.js
===================================================================
--- /CKEditor/trunk/_source/lang/ko.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/ko.js	(revision 6190)
@@ -616,4 +616,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/lang/lt.js
===================================================================
--- /CKEditor/trunk/_source/lang/lt.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/lt.js	(revision 6190)
@@ -616,4 +616,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/lang/lv.js
===================================================================
--- /CKEditor/trunk/_source/lang/lv.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/lv.js	(revision 6190)
@@ -616,4 +616,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/lang/mn.js
===================================================================
--- /CKEditor/trunk/_source/lang/mn.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/mn.js	(revision 6190)
@@ -616,4 +616,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/lang/ms.js
===================================================================
--- /CKEditor/trunk/_source/lang/ms.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/ms.js	(revision 6190)
@@ -616,4 +616,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/lang/nb.js
===================================================================
--- /CKEditor/trunk/_source/lang/nb.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/nb.js	(revision 6190)
@@ -616,4 +616,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/lang/nl.js
===================================================================
--- /CKEditor/trunk/_source/lang/nl.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/nl.js	(revision 6190)
@@ -616,4 +616,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/lang/no.js
===================================================================
--- /CKEditor/trunk/_source/lang/no.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/no.js	(revision 6190)
@@ -616,4 +616,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/lang/pl.js
===================================================================
--- /CKEditor/trunk/_source/lang/pl.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/pl.js	(revision 6190)
@@ -616,4 +616,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/lang/pt-br.js
===================================================================
--- /CKEditor/trunk/_source/lang/pt-br.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/pt-br.js	(revision 6190)
@@ -615,4 +615,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/lang/pt.js
===================================================================
--- /CKEditor/trunk/_source/lang/pt.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/pt.js	(revision 6190)
@@ -616,4 +616,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/lang/ro.js
===================================================================
--- /CKEditor/trunk/_source/lang/ro.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/ro.js	(revision 6190)
@@ -616,4 +616,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/lang/ru.js
===================================================================
--- /CKEditor/trunk/_source/lang/ru.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/ru.js	(revision 6190)
@@ -616,4 +616,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/lang/sk.js
===================================================================
--- /CKEditor/trunk/_source/lang/sk.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/sk.js	(revision 6190)
@@ -616,4 +616,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/lang/sl.js
===================================================================
--- /CKEditor/trunk/_source/lang/sl.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/sl.js	(revision 6190)
@@ -616,4 +616,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/lang/sr-latn.js
===================================================================
--- /CKEditor/trunk/_source/lang/sr-latn.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/sr-latn.js	(revision 6190)
@@ -616,4 +616,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/lang/sr.js
===================================================================
--- /CKEditor/trunk/_source/lang/sr.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/sr.js	(revision 6190)
@@ -616,4 +616,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/lang/sv.js
===================================================================
--- /CKEditor/trunk/_source/lang/sv.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/sv.js	(revision 6190)
@@ -616,4 +616,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/lang/th.js
===================================================================
--- /CKEditor/trunk/_source/lang/th.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/th.js	(revision 6190)
@@ -616,4 +616,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/lang/tr.js
===================================================================
--- /CKEditor/trunk/_source/lang/tr.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/tr.js	(revision 6190)
@@ -615,4 +615,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/lang/uk.js
===================================================================
--- /CKEditor/trunk/_source/lang/uk.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/uk.js	(revision 6190)
@@ -616,4 +616,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/lang/vi.js
===================================================================
--- /CKEditor/trunk/_source/lang/vi.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/vi.js	(revision 6190)
@@ -616,4 +616,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/lang/zh-cn.js
===================================================================
--- /CKEditor/trunk/_source/lang/zh-cn.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/zh-cn.js	(revision 6190)
@@ -616,4 +616,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'iFrame属性',
+		toolbar		: 'iFrame',
+		height		: '高度',
+		width		: '宽度',
+		invalidHeight	: '框架高度必须为数字格式',
+		invalidWidth	: '框架宽度必须为数字格式',
+		noUrl		: '请输入框架的 URL',
+		scrolling	: '允许滚动条',
+		border		: '显示框架边框',
+		align		: '对齐方式',
+		alignLeft	: '左',
+		alignRight	: '右',
+		alignTop	: '上',
+		alignMiddle	: '中',
+		alignBottom	: '下'
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/lang/zh.js
===================================================================
--- /CKEditor/trunk/_source/lang/zh.js	(revision 6189)
+++ /CKEditor/trunk/_source/lang/zh.js	(revision 6190)
@@ -616,4 +616,23 @@
   	},
 
+	iframe :
+	{
+		title		: 'iFrame Properties', // MISSING
+		toolbar		: 'iFrame', // MISSING
+		height		: 'Height', // MISSING
+		width		: 'Width', // MISSING
+		invalidHeight	: 'iFrame height must be a number.', // MISSING
+		invalidWidth	: 'iFrame width must be a number.', // MISSING
+		noUrl		: 'Please type the iFrame URL', // MISSING
+		scrolling	: 'Enable scrollbars', // MISSING
+		border		: 'Show frame border', // MISSING
+		align		: 'Alignment', // MISSING
+		alignLeft	: 'Left', // MISSING
+		alignRight	: 'Right', // MISSING
+		alignTop	: 'Top', // MISSING
+		alignMiddle	: 'Middle', // MISSING
+		alignBottom	: 'Bottom' // MISSING
+	},
+
 	font :
 	{
Index: /CKEditor/trunk/_source/plugins/adobeair/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/adobeair/plugin.js	(revision 6190)
+++ /CKEditor/trunk/_source/plugins/adobeair/plugin.js	(revision 6190)
@@ -0,0 +1,227 @@
+/*
+Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+(function()
+{
+	var eventNameList = [ 'click', 'keydown', 'mousedown', 'keypress' ];
+
+	// Inline event callbacks assigned via innerHTML/outerHTML, such as
+	// onclick/onmouseover, are ignored in AIR.
+	// Use DOM2 event listeners to substitue inline handlers instead.
+	function convertInlineHandlers( container )
+	{
+		// TODO: document.querySelectorAll is not supported in AIR.
+		var children = container.getElementsByTag( '*' ),
+			count = children.count(),
+			child;
+
+		for ( var i = 0; i < count; i++ )
+		{
+			child = children.getItem( i );
+
+			(function( node )
+			{
+				for ( var j = 0; j < eventNameList.length; j++ )
+				{
+					(function( eventName )
+					{
+						if ( node.hasAttribute( 'on' + eventName ) )
+						{
+							node.on( eventName, function( evt )
+							{
+								var inlineEventHandler = node.getAttribute( 'on' + eventName ),
+									callFunc = /(return\s*)?CKEDITOR\.tools\.callFunction\(([^)]+)\)/.exec( inlineEventHandler ),
+									hasReturn = callFunc && callFunc[ 1 ],
+									callFuncArgs = callFunc &&  callFunc[ 2 ].split( ',' ),
+									preventDefault = /return false;/.test( inlineEventHandler );
+
+								if ( callFuncArgs )
+								{
+									var nums = callFuncArgs.length,
+										argName;
+
+									for ( var i = 0; i < nums; i++ )
+									{
+										// Trim spaces around param.
+										callFuncArgs[ i ] = argName = CKEDITOR.tools.trim( callFuncArgs[ i ] );
+
+										// String form param.
+										var strPattern = argName.match( /^(["'])([^"']*?)\1$/ );
+										if ( strPattern )
+										{
+											callFuncArgs[ i ] = strPattern[ 2 ];
+											continue;
+										}
+
+										// Integer form param.
+										if ( argName.match( /\d+/ ) )
+										{
+											callFuncArgs[ i ] = parseInt( argName, 10 );
+											continue;
+										}
+
+										// Speical variables.
+										switch( argName )
+										{
+											case 'this' :
+												callFuncArgs[ i ] = node.$;
+												break;
+											case 'event' :
+												callFuncArgs[ i ] = evt.data.$;
+												break;
+											case 'null' :
+												callFuncArgs [ i ] = null;
+												break;
+										}
+									}
+
+									var retval = CKEDITOR.tools.callFunction.apply( window, callFuncArgs );
+									if ( hasReturn && retval === false )
+										 preventDefault = 1;
+								}
+
+								if ( preventDefault )
+									evt.data.preventDefault();
+							});
+						}
+					})( eventNameList[ j ] );
+				}
+			})( child );
+		}
+	}
+
+	CKEDITOR.plugins.add( 'adobeair',
+	{
+		init : function( editor )
+		{
+			if ( !CKEDITOR.env.air )
+				return;
+
+			// Body doesn't get default margin on AIR.
+			editor.addCss( 'body { padding: 8px }' );
+
+			editor.on( 'uiReady', function()
+				{
+					convertInlineHandlers( editor.container );
+
+					if ( editor.sharedSpaces )
+					{
+						for ( var space in editor.sharedSpaces )
+							convertInlineHandlers( editor.sharedSpaces[ space ] );
+					}
+
+					editor.on( 'elementsPathUpdate', function( evt ) { convertInlineHandlers( evt.data.space ); } );
+				});
+
+			editor.on( 'contentDom', function()
+				{
+					// Hyperlinks are enabled in editable documents in Adobe
+					// AIR. Prevent their click behavior.
+					editor.document.on( 'click', function( ev )
+						{
+							ev.data.preventDefault( true );
+						});
+				});
+		}
+	});
+
+	CKEDITOR.ui.on( 'ready', function( evt )
+		{
+			var ui = evt.data;
+			// richcombo, panelbutton and menu
+			if ( ui._.panel )
+			{
+				var panel = ui._.panel._.panel,
+						holder;
+
+				( function()
+				{
+					// Adding dom event listeners off-line are not supported in AIR,
+					// waiting for panel iframe loaded.
+					if ( !panel.isLoaded )
+					{
+						setTimeout( arguments.callee, 30 );
+						return;
+					}
+					holder = panel._.holder;
+					convertInlineHandlers( holder );
+				})();
+			}
+			else if ( ui instanceof CKEDITOR.dialog )
+				convertInlineHandlers( ui._.element );
+		});
+})();
+
+CKEDITOR.dom.document.prototype.write = CKEDITOR.tools.override( CKEDITOR.dom.document.prototype.write,
+	function( original_write )
+	{
+		function appendElement( parent, tagName, fullTag, text )
+		{
+			var node = parent.append( tagName ),
+				attrs = CKEDITOR.htmlParser.fragment.fromHtml( fullTag ).children[ 0 ].attributes;
+			attrs && node.setAttributes( attrs );
+			text && node.append( parent.getDocument().createText( text ) );
+		}
+
+		return function( html, mode )
+			{
+				// document.write() or document.writeln() fail silently after
+				// the page load event in Adobe AIR.
+				// DOM manipulation could be used instead.
+				if ( this.getBody() )
+				{
+					// We're taking the below extra work only because innerHTML
+					// on <html> element doesn't work as expected.
+					var doc = this,
+						head = this.getHead();
+
+					// Create style nodes for inline css. ( <style> content doesn't applied when setting via innerHTML )
+					html = html.replace( /(<style[^>]*>)([\s\S]*?)<\/style>/gi,
+						function ( match, startTag, styleText )
+						{
+							appendElement( head, 'style', startTag, styleText );
+							return '';
+						});
+
+					html = html.replace( /<base\b[^>]*\/>/i,
+						function( match )
+						{
+							appendElement( head, 'base', match );
+							return '';
+						});
+
+					html = html.replace( /<title>([\s\S]*)<\/title>/i,
+						function( match, title )
+						{
+							doc.$.title = title;
+							return '';
+						});
+
+					// Move the rest of head stuff.
+					html = html.replace( /<head>([\s\S]*)<\/head>/i,
+						function( headHtml )
+						{
+							// Inject the <head> HTML inside a <div>.
+							// Do that before getDocumentHead because WebKit moves
+							// <link css> elements to the <head> at this point.
+							var div = new CKEDITOR.dom.element( 'div', doc );
+							div.setHtml( headHtml );
+							// Move the <div> nodes to <head>.
+							div.moveChildren( head );
+							return '';
+						});
+
+					html.replace( /(<body[^>]*>)([\s\S]*)(?=$|<\/body>)/i,
+						function( match, startTag, innerHTML )
+						{
+							doc.getBody().setHtml( innerHTML );
+							var attrs = CKEDITOR.htmlParser.fragment.fromHtml( startTag ).children[ 0 ].attributes;
+							attrs && doc.getBody().setAttributes( attrs );
+						});
+				}
+				else
+					original_write.apply( this, arguments );
+			};
+	});
Index: /CKEditor/trunk/_source/plugins/button/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/button/plugin.js	(revision 6189)
+++ /CKEditor/trunk/_source/plugins/button/plugin.js	(revision 6190)
@@ -55,4 +55,43 @@
 	}
 };
+
+/**
+ * Handles a button click.
+ * @private
+ */
+CKEDITOR.ui.button._ =
+{
+	instances : [],
+
+	keydown : function( index, ev )
+	{
+		var instance = CKEDITOR.ui.button._.instances[ index ];
+
+		if ( instance.onkey )
+		{
+			ev = new CKEDITOR.dom.event( ev );
+			return ( instance.onkey( instance, ev.getKeystroke() ) !== false );
+		}
+	},
+
+	focus : function( index, ev )
+	{
+		var instance = CKEDITOR.ui.button._.instances[ index ],
+			retVal;
+
+		if ( instance.onfocus )
+			retVal = ( instance.onfocus( instance, new CKEDITOR.dom.event( ev ) ) !== false );
+
+		// FF2: prevent focus event been bubbled up to editor container, which caused unexpected editor focus.
+		if ( CKEDITOR.env.gecko && CKEDITOR.env.version < 10900 )
+			ev.preventBubble();
+		return retVal;
+	}
+};
+
+( function()
+{
+	var keydownFn = CKEDITOR.tools.addFunction( CKEDITOR.ui.button._.keydown, CKEDITOR.ui.button._ ),
+		focusFn = CKEDITOR.tools.addFunction( CKEDITOR.ui.button._.focus, CKEDITOR.ui.button._ );
 
 CKEDITOR.ui.button.prototype =
@@ -161,6 +200,6 @@
 
 		output.push(
-				' onkeydown="return CKEDITOR.ui.button._.keydown(', index, ', event);"' +
-				' onfocus="return CKEDITOR.ui.button._.focus(', index, ', event);"' +
+					' onkeydown="return CKEDITOR.tools.callFunction(', keydownFn, ', ', index, ', event);"' +
+					' onfocus="return CKEDITOR.tools.callFunction(', focusFn,', ', index, ', event);"' +
 				' onclick="CKEDITOR.tools.callFunction(', clickFn, ', this); return false;">' +
 					'<span class="cke_icon"' );
@@ -222,37 +261,5 @@
 };
 
-/**
- * Handles a button click.
- * @private
- */
-CKEDITOR.ui.button._ =
-{
-	instances : [],
-
-	keydown : function( index, ev )
-	{
-		var instance = CKEDITOR.ui.button._.instances[ index ];
-
-		if ( instance.onkey )
-		{
-			ev = new CKEDITOR.dom.event( ev );
-			return ( instance.onkey( instance, ev.getKeystroke() ) !== false );
-		}
-	},
-
-	focus : function( index, ev )
-	{
-		var instance = CKEDITOR.ui.button._.instances[ index ],
-			retVal;
-
-		if ( instance.onfocus )
-			retVal = ( instance.onfocus( instance, new CKEDITOR.dom.event( ev ) ) !== false );
-
-		// FF2: prevent focus event been bubbled up to editor container, which caused unexpected editor focus.
-		if ( CKEDITOR.env.gecko && CKEDITOR.env.version < 10900 )
-			ev.preventBubble();
-		return retVal;
-	}
-};
+})();
 
 /**
Index: /CKEditor/trunk/_source/plugins/clipboard/dialogs/paste.js
===================================================================
--- /CKEditor/trunk/_source/plugins/clipboard/dialogs/paste.js	(revision 6189)
+++ /CKEditor/trunk/_source/plugins/clipboard/dialogs/paste.js	(revision 6190)
@@ -1,3 +1,3 @@
-﻿/*
+/*
 Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
 For licensing, see LICENSE.html or http://ckeditor.com/license
@@ -14,5 +14,6 @@
 			docElement = doc.$;
 
-		doc.getById( 'cke_actscrpt' ).remove();
+		var script = doc.getById( 'cke_actscrpt' );
+		script && script.remove();
 
 		CKEDITOR.env.ie ?
@@ -75,4 +76,16 @@
 				'</html>';
 
+			var src =
+				CKEDITOR.env.air ?
+					'javascript:void(0)' :
+				isCustomDomain ?
+					'javascript:void((function(){' +
+						'document.open();' +
+						'document.domain=\'' + document.domain + '\';' +
+						'document.close();' +
+						'})())"'
+				:
+					'';
+
 			var iframe = CKEDITOR.dom.element.createFromHtml(
 						'<iframe' +
@@ -80,11 +93,5 @@
 						' frameborder="0" ' +
 						' allowTransparency="true"' +
-						// Support for custom document.domain in IE.
-						( isCustomDomain ?
-							' src="javascript:void((function(){' +
-								'document.open();' +
-								'document.domain=\'' + document.domain + '\';' +
-								'document.close();' +
-							'})())"' : '' ) +
+						' src="' + src + '"' +
 						' role="region"' +
 						' aria-label="' + lang.pasteArea + '"' +
@@ -94,14 +101,14 @@
 
 			iframe.on( 'load', function( e )
-			{
-				e.removeListener();
-				var doc = iframe.getFrameDocument().$;
-				// Custom domain handling is needed after each document.open().
-				doc.open();
-				if ( isCustomDomain )
-					doc.domain = document.domain;
-				doc.write( htmlToLoad );
-				doc.close();
-			}, this );
+				{
+					e.removeListener();
+
+					var doc = iframe.getFrameDocument();
+					doc.write( htmlToLoad );
+
+					if ( CKEDITOR.env.air )
+						onPasteFrameLoad.call( this, doc.getWindow().$ );
+				},
+				this );
 
 			iframe.setCustomData( 'dialog', this );
Index: /CKEditor/trunk/_source/plugins/clipboard/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/clipboard/plugin.js	(revision 6189)
+++ /CKEditor/trunk/_source/plugins/clipboard/plugin.js	(revision 6190)
@@ -50,5 +50,5 @@
 				{
 					// Other browsers throw an error if the command is disabled.
-					return editor.document.$.execCommand( type );
+					return editor.document.$.execCommand( type, false, null );
 				}
 				catch( e )
Index: /CKEditor/trunk/_source/plugins/colorbutton/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/colorbutton/plugin.js	(revision 6189)
+++ /CKEditor/trunk/_source/plugins/colorbutton/plugin.js	(revision 6190)
@@ -23,4 +23,5 @@
 		function addButton( name, type, title )
 		{
+			var colorBoxId = CKEDITOR.tools.getNextId() + '_colorBox';
 			editor.ui.add( name, CKEDITOR.UI_PANELBUTTON,
 				{
@@ -40,7 +41,9 @@
 						block.autoSize = true;
 						block.element.addClass( 'cke_colorblock' );
-						block.element.setHtml( renderColors( panel, type ) );
+						block.element.setHtml( renderColors( panel, type, colorBoxId ) );
 						// The block should not have scrollbars (#5933, #6056)
 						block.element.getDocument().getBody().setStyle( 'overflow', 'hidden' );
+
+						CKEDITOR.ui.fire( 'ready', this );
 
 						var keys = block.keys;
@@ -53,4 +56,29 @@
 						keys[ CKEDITOR.SHIFT + 9 ]	= 'prev';	// SHIFT + TAB
 						keys[ 32 ]	= 'click';					// SPACE
+					},
+
+					// The automatic colorbox should represent the real color (#6010)
+					onOpen : function()
+					{
+						var selection = editor.getSelection(),
+							block = selection && selection.getStartElement(),
+							path = new CKEDITOR.dom.elementPath( block ),
+							color;
+
+						// Find the closest block element.
+						block = path.block || path.blockLimit;
+
+						// The background color might be transparent. In that case, look up the color in the DOM tree.
+						do
+						{
+							color = block && block.getComputedStyle( type == 'back' ? 'background-color' : 'color' ) || 'transparent';
+						}
+						while ( type == 'back' && color == 'transparent' && ( block = block.getParent() ) );
+
+						// The box should never be transparent.
+						if ( !color || color == 'transparent' )
+							color = '#ffffff';
+
+						this._.panel._.iframe.getFrameDocument().getById( colorBoxId ).setStyle( 'background-color', color );
 					}
 				});
@@ -58,5 +86,5 @@
 
 
-		function renderColors( panel, type )
+		function renderColors( panel, type, colorBoxId )
 		{
 			var output = [],
@@ -101,8 +129,16 @@
 
 						colorStyle.childRule = type == 'back' ?
-							// It's better to apply background color as the innermost style. (#3599)
-							function(){ return false; } :
-							// Fore color style must be applied inside links instead of around it.
-							function( element ){ return element.getName() != 'a'; };
+							function( element )
+							{
+								// It's better to apply background color as the innermost style. (#3599)
+								// Except for "unstylable elements". (#6103)
+								return isUnstylable( element );
+							}
+							:
+							function( element )
+							{
+								// Fore color style must be applied inside links instead of around it.
+								return element.getName() != 'a' || isUnstylable( element );
+							};
 
 						new CKEDITOR.style( colorStyle, { color : color } ).apply( editor.document );
@@ -122,5 +158,5 @@
 						'<tr>' +
 							'<td>' +
-								'<span class="cke_colorbox" style="background-color:#000"></span>' +
+								'<span class="cke_colorbox" id="', colorBoxId, '"></span>' +
 							'</td>' +
 							'<td colspan=7 align=center>',
@@ -182,4 +218,9 @@
 			return output.join( '' );
 		}
+
+		function isUnstylable( ele )
+		{
+			return ( ele.getAttribute( 'contentEditable' ) == 'false' ) || ele.getAttribute( 'data-cke-nostyle' );
+		}
 	}
 });
Index: /CKEditor/trunk/_source/plugins/contextmenu/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/contextmenu/plugin.js	(revision 6189)
+++ /CKEditor/trunk/_source/plugins/contextmenu/plugin.js	(revision 6190)
@@ -7,4 +7,148 @@
 {
 	requires : [ 'menu' ],
+	
+	// Make sure the base class (CKEDITOR.menu) is loaded before it (#3318).
+	onLoad : function()
+	{
+		CKEDITOR.plugins.contextMenu = CKEDITOR.tools.createClass(
+		{
+			base : CKEDITOR.menu,
+
+			$ : function( editor )
+			{
+				this.base.call( this, editor,
+				{
+					panel:
+					{
+						className : editor.skinClass + ' cke_contextmenu',
+						attributes :
+						{
+							'aria-label' : editor.lang.contextmenu.options
+						}
+					}
+				});
+			},
+
+			proto :
+			{
+				addTarget : function( element, nativeContextMenuOnCtrl )
+				{
+					// Opera doesn't support 'contextmenu' event, we have duo approaches employed here:
+					// 1. Inherit the 'button override' hack we introduced in v2 (#4530), while this require the Opera browser
+					//  option 'Allow script to detect context menu/right click events' to be always turned on.
+					// 2. Considering the fact that ctrl/meta key is not been occupied
+					//  for multiple range selecting (like Gecko), we use this key
+					//  combination as a fallback for triggering context-menu. (#4530)
+					if ( CKEDITOR.env.opera && !( 'oncontextmenu' in document.body ))
+					{
+						var contextMenuOverrideButton;
+						element.on( 'mousedown', function( evt )
+						{
+							evt = evt.data;
+							if ( evt.$.button != 2 )
+							{
+								if ( evt.getKeystroke() == CKEDITOR.CTRL + 1 )
+									element.fire( 'contextmenu', evt );
+								return;
+							}
+
+							if ( nativeContextMenuOnCtrl
+								 && ( CKEDITOR.env.mac ? evt.$.metaKey : evt.$.ctrlKey ) )
+								return;
+
+							var target = evt.getTarget();
+
+							if ( !contextMenuOverrideButton )
+							{
+								var ownerDoc =  target.getDocument();
+								contextMenuOverrideButton = ownerDoc.createElement( 'input' ) ;
+								contextMenuOverrideButton.$.type = 'button' ;
+								ownerDoc.getBody().append( contextMenuOverrideButton ) ;
+							}
+
+							contextMenuOverrideButton.setAttribute( 'style', 'position:absolute;top:' + ( evt.$.clientY - 2 ) +
+								'px;left:' + ( evt.$.clientX - 2 ) +
+								'px;width:5px;height:5px;opacity:0.01' );
+
+						} );
+
+						element.on( 'mouseup', function ( evt )
+						{
+							if ( contextMenuOverrideButton )
+							{
+								contextMenuOverrideButton.remove();
+								contextMenuOverrideButton = undefined;
+								// Simulate 'contextmenu' event.
+								element.fire( 'contextmenu', evt.data );
+							}
+						} );
+					}
+
+					element.on( 'contextmenu', function( event )
+						{
+							var domEvent = event.data;
+
+							if ( nativeContextMenuOnCtrl &&
+								 // Safari on Windows always show 'ctrlKey' as true in 'contextmenu' event,
+								// which make this property unreliable. (#4826)
+								 ( CKEDITOR.env.webkit ? holdCtrlKey : ( CKEDITOR.env.mac ? domEvent.$.metaKey : domEvent.$.ctrlKey ) ) )
+								return;
+
+
+							// Cancel the browser context menu.
+							domEvent.preventDefault();
+
+							var offsetParent = domEvent.getTarget().getDocument().getDocumentElement(),
+								offsetX = domEvent.$.clientX,
+								offsetY = domEvent.$.clientY;
+
+							CKEDITOR.tools.setTimeout( function()
+								{
+									this.open( offsetParent, null, offsetX, offsetY );
+								},
+								0, this );
+						},
+						this );
+
+					if ( CKEDITOR.env.opera )
+					{
+						// 'contextmenu' event triggered by Windows menu key is unpreventable,
+						// cancel the key event itself. (#6534)
+						element.on( 'keypress' , function ( evt )
+						{
+							var domEvent = evt.data;
+
+							if ( domEvent.$.keyCode == 0 )
+								domEvent.preventDefault();
+						});
+					}
+
+					if ( CKEDITOR.env.webkit )
+					{
+						var holdCtrlKey,
+							onKeyDown = function( event )
+							{
+								holdCtrlKey = CKEDITOR.env.mac ? event.data.$.metaKey : event.data.$.ctrlKey ;
+							},
+							resetOnKeyUp = function()
+							{
+								holdCtrlKey = 0;
+							};
+
+						element.on( 'keydown', onKeyDown );
+						element.on( 'keyup', resetOnKeyUp );
+						element.on( 'contextmenu', resetOnKeyUp );
+					}
+				},
+
+				open : function( offsetParent, corner, offsetX, offsetY )
+				{
+					this.editor.focus();
+					offsetParent = offsetParent || CKEDITOR.document.getDocumentElement();
+					this.show( offsetParent, corner, offsetX, offsetY );
+				}
+			}
+		});
+	},
 
 	beforeInit : function( editor )
@@ -16,264 +160,7 @@
 				exec : function()
 					{
-						editor.contextMenu.show( editor.document.getBody() );
+						editor.contextMenu.open( editor.document.getBody() );
 					}
 			});
-	}
-});
-
-CKEDITOR.plugins.contextMenu = CKEDITOR.tools.createClass(
-{
-	$ : function( editor )
-	{
-		this.id = CKEDITOR.tools.getNextId();
-		this.editor = editor;
-		this._.listeners = [];
-		this._.functionId = CKEDITOR.tools.addFunction( function( commandName )
-			{
-				this._.panel.hide();
-				editor.focus();
-				editor.execCommand( commandName );
-			},
-			this);
-
-		this.definition =
-		{
-			panel:
-			{
-				className : editor.skinClass + ' cke_contextmenu',
-				attributes :
-				{
-					'aria-label' : editor.lang.contextmenu.options
-				}
-			}
-		};
-	},
-
-	_ :
-	{
-		onMenu : function( offsetParent, corner, offsetX, offsetY )
-		{
-			var menu = this._.menu,
-				editor = this.editor;
-
-			if ( menu )
-			{
-				menu.hide();
-				menu.removeAll();
-			}
-			else
-			{
-				menu = this._.menu = new CKEDITOR.menu( editor, this.definition );
-				menu.onClick = CKEDITOR.tools.bind( function( item )
-				{
-					menu.hide();
-
-					if ( item.onClick )
-						item.onClick();
-					else if ( item.command )
-						editor.execCommand( item.command );
-
-				}, this );
-
-				menu.onEscape = function( keystroke )
-				{
-					var parent = this.parent;
-					// 1. If it's sub-menu, restore the last focused item
-					// of upper level menu.
-					// 2. In case of a top-menu, close it.
-					if ( parent )
-					{
-						parent._.panel.hideChild();
-						// Restore parent block item focus.
-						var parentBlock = parent._.panel._.panel._.currentBlock,
-							parentFocusIndex =  parentBlock._.focusIndex;
-						parentBlock._.markItem( parentFocusIndex );
-					}
-					else if ( keystroke == 27 )
-					{
-						this.hide();
-						editor.focus();
-					}
-					return false;
-				};
-			}
-
-			var listeners = this._.listeners,
-				includedItems = [];
-
-			var selection = this.editor.getSelection(),
-				element = selection && selection.getStartElement();
-
-			menu.onHide = CKEDITOR.tools.bind( function()
-				{
-					menu.onHide = null;
-
-					if ( CKEDITOR.env.ie )
-					{
-						var selection = editor.getSelection();
-						selection && selection.unlock();
-					}
-
-					this.onHide && this.onHide();
-				},
-				this );
-
-			// Call all listeners, filling the list of items to be displayed.
-			for ( var i = 0 ; i < listeners.length ; i++ )
-			{
-				var listenerItems = listeners[ i ]( element, selection );
-
-				if ( listenerItems )
-				{
-					for ( var itemName in listenerItems )
-					{
-						var item = this.editor.getMenuItem( itemName );
-
-						if ( item )
-						{
-							item.state = listenerItems[ itemName ];
-							menu.add( item );
-						}
-					}
-				}
-			}
-
-			// Don't show context menu with zero items.
-			menu.items.length && menu.show( offsetParent, corner || ( editor.lang.dir == 'rtl' ? 2 : 1 ), offsetX, offsetY );
-		}
-	},
-
-	proto :
-	{
-		addTarget : function( element, nativeContextMenuOnCtrl )
-		{
-
-			// For browsers (Opera <=10a) that doesn't  support 'contextmenu' event, we have duo approaches employed here:
-			// 1. Inherit the 'button override' hack we introduced in v2 (#4530) (In Opera browser, this require the
-			//  option 'Allow script to detect context menu/right click events' to be always turned on).
-			// 2. Considering the fact that ctrl/meta key is not been occupied
-			//  for multiple range selecting (like Gecko), we use this key
-			//  combination as a fallback for triggering context-menu. (#4530)
-			if ( CKEDITOR.env.opera && !( 'oncontextmenu' in document.body ) )
-			{
-				var contextMenuOverrideButton;
-				element.on( 'mousedown', function( evt )
-				{
-					evt = evt.data;
-					if ( evt.$.button != 2 )
-					{
-						if ( evt.getKeystroke() == CKEDITOR.CTRL + 1 )
-							element.fire( 'contextmenu', evt );
-						return;
-					}
-
-					if ( nativeContextMenuOnCtrl
-						 && ( CKEDITOR.env.mac ? evt.$.metaKey : evt.$.ctrlKey ) )
-						return;
-
-					var target = evt.getTarget();
-
-					if ( !contextMenuOverrideButton )
-					{
-						var ownerDoc =  target.getDocument();
-						contextMenuOverrideButton = ownerDoc.createElement( 'input' ) ;
-						contextMenuOverrideButton.$.type = 'button' ;
-						ownerDoc.getBody().append( contextMenuOverrideButton ) ;
-					}
-
-					contextMenuOverrideButton.setAttribute( 'style', 'position:absolute;top:' + ( evt.$.clientY - 2 ) +
-						'px;left:' + ( evt.$.clientX - 2 ) +
-						'px;width:5px;height:5px;opacity:0.01' );
-
-				} );
-
-				element.on( 'mouseup', function ( evt )
-				{
-					if ( contextMenuOverrideButton )
-					{
-						contextMenuOverrideButton.remove();
-						contextMenuOverrideButton = undefined;
-						// Simulate 'contextmenu' event.
-						element.fire( 'contextmenu', evt.data );
-					}
-				} );
-			}
-
-			element.on( 'contextmenu', function( event )
-				{
-					var domEvent = event.data;
-
-					if ( nativeContextMenuOnCtrl &&
-					     // Safari on Windows always show 'ctrlKey' as true in 'contextmenu' event,
-						// which make this property unreliable. (#4826)
-					     ( CKEDITOR.env.webkit ? holdCtrlKey : ( CKEDITOR.env.mac ? domEvent.$.metaKey : domEvent.$.ctrlKey ) ) )
-						return;
-
-
-					// Cancel the browser context menu.
-					domEvent.preventDefault();
-
-					var offsetParent = domEvent.getTarget().getDocument().getDocumentElement(),
-						offsetX = domEvent.$.clientX,
-						offsetY = domEvent.$.clientY;
-
-					CKEDITOR.tools.setTimeout( function()
-						{
-							this.show( offsetParent, null, offsetX, offsetY );
-						},
-						0, this );
-				},
-				this );
-
-			if ( CKEDITOR.env.opera )
-			{
-				// 'contextmenu' event triggered by Windows menu key is unpreventable,
-				// cancel the key event itself. (#6534)
-				element.on( 'keypress' , function ( evt )
-				{
-					var domEvent = evt.data;
-
-					if ( domEvent.$.keyCode === 0 )
-						domEvent.preventDefault();
-				});
-			}
-
-			if ( CKEDITOR.env.webkit )
-			{
-				var holdCtrlKey,
-					onKeyDown = function( event )
-					{
-						holdCtrlKey = CKEDITOR.env.mac ? event.data.$.metaKey : event.data.$.ctrlKey ;
-					},
-					resetOnKeyUp = function()
-					{
-						holdCtrlKey = 0;
-					};
-
-				element.on( 'keydown', onKeyDown );
-				element.on( 'keyup', resetOnKeyUp );
-				element.on( 'contextmenu', resetOnKeyUp );
-			}
-		},
-
-		addListener : function( listenerFn )
-		{
-			this._.listeners.push( listenerFn );
-		},
-
-		show : function( offsetParent, corner, offsetX, offsetY )
-		{
-			this.editor.focus();
-
-			// Selection will be unavailable after context menu shows up
-			// in IE, lock it now.
-			if ( CKEDITOR.env.ie )
-			{
-				var selection = this.editor.getSelection();
-				selection && selection.lock();
-			}
-
-			this._.onMenu( offsetParent || CKEDITOR.document.getDocumentElement(), corner, offsetX || 0, offsetY || 0 );
-		}
 	}
 });
Index: /CKEditor/trunk/_source/plugins/dialog/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/dialog/plugin.js	(revision 6189)
+++ /CKEditor/trunk/_source/plugins/dialog/plugin.js	(revision 6190)
@@ -106,8 +106,17 @@
 	{
 		// Load the dialog definition.
-		var definition = CKEDITOR.dialog._.dialogDefinitions[ dialogName ];
+		var definition = CKEDITOR.dialog._.dialogDefinitions[ dialogName ],
+			defaultDefinition = CKEDITOR.tools.clone( defaultDialogDefinition ),
+			buttonsOrder = editor.config.dialog_buttonsOrder || 'OS',
+			dir = editor.lang.dir;
+
+			if ( ( buttonsOrder == 'OS' && CKEDITOR.env.mac ) ||    // The buttons in MacOS Apps are in reverse order (#4750)  
+				( buttonsOrder == 'rtl' && dir == 'ltr' ) ||  
+				( buttonsOrder == 'ltr' && dir == 'rtl' ) )  
+					defaultDefinition.buttons.reverse();  
+
 
 		// Completes the definition with the default values.
-		definition = CKEDITOR.tools.extend( definition( editor ), defaultDialogDefinition );
+		definition = CKEDITOR.tools.extend( definition( editor ), defaultDefinition );
 
 		// Clone a functionally independent copy for this dialog.
@@ -117,5 +126,4 @@
 		// functions.
 		definition = new definitionObject( this, definition );
-
 
 		var doc = CKEDITOR.document;
@@ -131,5 +139,4 @@
 			contentSize : { width : 0, height : 0 },
 			size : { width : 0, height : 0 },
-			updateSize : false,
 			contents : {},
 			buttons : {},
@@ -180,4 +187,32 @@
 			}
 			, editor ).definition;
+
+		var tabsToRemove = {};
+		// Cache tabs that should be removed.
+		if ( !( 'removeDialogTabs' in editor._ ) && editor.config.removeDialogTabs )
+		{
+			var removeContents = editor.config.removeDialogTabs.split( ';' );
+
+			for ( i = 0; i < removeContents.length; i++ )
+			{
+				var parts = removeContents[ i ].split( ':' );
+				if ( parts.length == 2 )
+				{
+					var removeDialogName = parts[ 0 ];
+					if ( !tabsToRemove[ removeDialogName ] )
+						tabsToRemove[ removeDialogName ] = [];
+					tabsToRemove[ removeDialogName ].push( parts[ 1 ] );
+				}
+			}
+			editor._.removeDialogTabs = tabsToRemove;
+		}
+
+		// Remove tabs of this dialog.
+		if ( editor._.removeDialogTabs && ( tabsToRemove = editor._.removeDialogTabs[ dialogName ] ) )
+		{
+			for ( i = 0; i < tabsToRemove.length; i++ )
+				definition.removeContents( tabsToRemove[ i ] );
+		}
+
 		// Initialize load, show, hide, ok and cancel events.
 		if ( definition.onLoad )
@@ -602,5 +637,4 @@
 
 				this._.contentSize = { width : width, height : height };
-				this._.updateSize = true;
 			};
 		})(),
@@ -614,13 +648,6 @@
 		getSize : function()
 		{
-			if ( !this._.updateSize )
-				return this._.size;
 			var element = this._.element.getFirst();
-			var size = this._.size = { width : element.$.offsetWidth || 0, height : element.$.offsetHeight || 0};
-
-			// If either the offsetWidth or offsetHeight is 0, the element isn't visible.
-			this._.updateSize = !size.width || !size.height;
-
-			return size;
+			return { width : element.$.offsetWidth || 0, height : element.$.offsetHeight || 0};
 		},
 
@@ -630,4 +657,5 @@
 		 * @param {Number} x The target x-coordinate.
 		 * @param {Number} y The target y-coordinate.
+		 * @param {Boolean} save Flag indicate whether the dialog position should be remembered on next open up.
 		 * @example
 		 * dialogObj.move( 10, 40 );
@@ -636,5 +664,5 @@
 		{
 			var isFixed;
-			return function( x, y )
+			return function( x, y, save )
 			{
 				// The dialog may be fixed positioned or absolute positioned. Ask the
@@ -663,4 +691,6 @@
 							'top'	: ( y > 0 ? y : 0 ) + 'px'
 						});
+
+				save && ( this._.moved = 1 );
 			};
 		})(),
@@ -696,4 +726,5 @@
 				element.setStyle( 'display', 'block' );
 
+			CKEDITOR.ui.fire( 'ready', this );
 			// FIREFOX BUG: Fix vanishing caret for Firefox 2 or Gecko 1.8.
 			if ( CKEDITOR.env.gecko && CKEDITOR.env.version < 10900 )
@@ -709,5 +740,6 @@
 
 			// First, set the dialog to an appropriate size.
-			this.resize( definition.minWidth, definition.minHeight );
+			this.resize( this._.contentSize && this._.contentSize.width || definition.minWidth,
+					this._.contentSize && this._.contentSize.height || definition.minHeight );
 
 			// Reset all inputs back to their default value.
@@ -754,14 +786,7 @@
 			this._.hasFocus = false;
 
-			// Rearrange the dialog to the middle of the window.
 			CKEDITOR.tools.setTimeout( function()
 				{
-					var viewSize = CKEDITOR.document.getWindow().getViewPaneSize();
-					var dialogSize = this.getSize();
-
-					// We're using definition size for initial position because of
-					// offten corrupted data in offsetWidth at this point. (#4084)
-					this.move( ( viewSize.width - definition.minWidth ) / 2, ( viewSize.height - dialogSize.height ) / 2 );
-
+					this.layout();
 					this.parts.dialog.setStyle( 'visibility', '' );
 
@@ -776,4 +801,17 @@
 				},
 				100, this );
+		},
+
+		/**
+		 * Rearrange the dialog to its previous position or the middle of the window.
+		 * @since 3.5
+		 */
+		layout : function()
+		{
+			var viewSize = CKEDITOR.document.getWindow().getViewPaneSize(),
+					dialogSize = this.getSize();
+
+			this.move( this._.moved ? this._.position.x : ( viewSize.width - dialogSize.width ) / 2,
+					this._.moved ? this._.position.y : ( viewSize.height - dialogSize.height ) / 2 );
 		},
 
@@ -904,5 +942,5 @@
 							expand : !!contents.expand,
 							padding : contents.padding,
-							style : contents.style || 'width: 100%; height: 100%;'
+							style : contents.style || 'width: 100%;'
 						}, pageHtml );
 
@@ -1343,7 +1381,4 @@
 	};
 
-	// The buttons in MacOS Apps are in reverse order #4750
-	CKEDITOR.env.mac && defaultDialogDefinition.buttons.reverse();
-
 	// Tool function used to return an item from an array based on its id
 	// property.
@@ -1614,5 +1649,5 @@
 				realX = - margins[3];
 			else if ( abstractDialogCoords.x - margins[1] > viewPaneSize.width - dialogSize.width - magnetDistance )
-				realX = viewPaneSize.width - dialogSize.width + margins[1];
+				realX = viewPaneSize.width - dialogSize.width + ( editor.lang.dir == 'rtl' ? 0 : margins[1] );
 			else
 				realX = abstractDialogCoords.x;
@@ -1625,5 +1660,5 @@
 				realY = abstractDialogCoords.y;
 
-			dialog.move( realX, realY );
+			dialog.move( realX, realY, 1 );
 
 			evt.data.preventDefault();
@@ -1645,6 +1680,4 @@
 		dialog.parts.title.on( 'mousedown', function( evt )
 			{
-				dialog._.updateSize = true;
-
 				lastCoords = { x : evt.data.$.screenX, y : evt.data.$.screenY };
 
@@ -1666,116 +1699,104 @@
 	function initResizeHandles( dialog )
 	{
-		var definition = dialog.definition,
-			minWidth = definition.minWidth || 0,
-			minHeight = definition.minHeight || 0,
-			resizable = definition.resizable,
-			margins = dialog.getParentEditor().skin.margins || [ 0, 0, 0, 0 ];
-
-		function topSizer( coords, dy )
-		{
-			coords.y += dy;
-		}
-
-		function rightSizer( coords, dx )
-		{
-			coords.x2 += dx;
-		}
-
-		function bottomSizer( coords, dy )
-		{
-			coords.y2 += dy;
-		}
-
-		function leftSizer( coords, dx )
-		{
-			coords.x += dx;
-		}
-
-		var lastCoords = null,
-			abstractDialogCoords = null,
-			magnetDistance = dialog._.editor.config.magnetDistance,
-			parts = [ 'tl', 't', 'tr', 'l', 'r', 'bl', 'b', 'br' ];
-
-		function mouseDownHandler( evt )
-		{
-			var partName = evt.listenerData.part, size = dialog.getSize();
-			abstractDialogCoords = dialog.getPosition();
-			CKEDITOR.tools.extend( abstractDialogCoords,
-				{
-					x2 : abstractDialogCoords.x + size.width,
-					y2 : abstractDialogCoords.y + size.height
-				} );
-			lastCoords = { x : evt.data.$.screenX, y : evt.data.$.screenY };
-
-			CKEDITOR.document.on( 'mousemove', mouseMoveHandler, dialog, { part : partName } );
-			CKEDITOR.document.on( 'mouseup', mouseUpHandler, dialog, { part : partName } );
+		var def = dialog.definition,
+			resizable = def.resizable;
+
+		if ( resizable == CKEDITOR.DIALOG_RESIZE_NONE )
+			return;
+
+		var editor = dialog.getParentEditor();
+		var wrapperWidth, wrapperHeight, viewSize, origin, startSize;
+
+		function positionDialog( right )
+		{
+			// Maintain righthand sizing in RTL.
+			if ( dialog._.moved && editor.lang.dir == 'rtl' )
+			{
+				var element = dialog._.element.getFirst();
+				element.setStyle( 'right', right + "px" );
+				element.removeStyle( 'left' );
+			}
+			else if ( !dialog._.moved )
+				dialog.layout();
+		}
+
+		var mouseDownFn = CKEDITOR.tools.addFunction( function( $event )
+		{
+			startSize = dialog.getSize();
+
+			// Calculate the offset between content and chrome size.
+			wrapperHeight = startSize.height - dialog.parts.contents.getSize( 'height',  ! ( CKEDITOR.env.gecko || CKEDITOR.env.opera || CKEDITOR.env.ie && CKEDITOR.env.quirks ) );
+			wrapperWidth = startSize.width - dialog.parts.contents.getSize( 'width', 1 );
+
+			origin = { x : $event.screenX, y : $event.screenY };
+
+			viewSize = CKEDITOR.document.getWindow().getViewPaneSize();
+
+			CKEDITOR.document.on( 'mousemove', mouseMoveHandler );
+			CKEDITOR.document.on( 'mouseup', mouseUpHandler );
 
 			if ( CKEDITOR.env.ie6Compat )
 			{
 				var coverDoc = currentCover.getChild( 0 ).getFrameDocument();
-				coverDoc.on( 'mousemove', mouseMoveHandler, dialog, { part : partName } );
-				coverDoc.on( 'mouseup', mouseUpHandler, dialog, { part : partName } );
-			}
+				coverDoc.on( 'mousemove', mouseMoveHandler );
+				coverDoc.on( 'mouseup', mouseUpHandler );
+			}
+
+			$event.preventDefault && $event.preventDefault();
+		});
+
+		// Prepend the grip to the dialog.
+		dialog.on( 'load', function()
+		{
+			var direction = '';
+			if ( resizable == CKEDITOR.DIALOG_RESIZE_WIDTH )
+				direction = ' cke_resizer_horizontal';
+			else if ( resizable == CKEDITOR.DIALOG_RESIZE_HEIGHT )
+				direction = ' cke_resizer_vertical';
+			var resizer = CKEDITOR.dom.element.createFromHtml( '<div class="cke_resizer' + direction + '"' +
+					' title="' + CKEDITOR.tools.htmlEncode( editor.lang.resize ) + '"' + 
+					' onmousedown="CKEDITOR.tools.callFunction(' + mouseDownFn + ', event )"></div>' );
+			dialog.parts.footer.append( resizer, 1 );
+		});
+		editor.on( 'destroy', function() { CKEDITOR.tools.removeFunction( mouseDownFn ); } );
+
+		function mouseMoveHandler( evt )
+		{
+			var rtl = editor.lang.dir == 'rtl',
+				dx = ( evt.data.$.screenX - origin.x ) * ( rtl ? -1 : 1 ),
+				dy = evt.data.$.screenY - origin.y,
+				width = startSize.width,
+				height = startSize.height,
+				internalWidth = width + dx * ( dialog._.moved ? 1 : 2 ),
+				internalHeight = height + dy * ( dialog._.moved ? 1 : 2 ),
+				element = dialog._.element.getFirst(),
+				right = rtl && element.getComputedStyle( 'right' ),
+				position = dialog.getPosition();
+
+			// IE might return "auto", we need exact position.
+			if ( right )
+				right = right == 'auto' ? viewSize.width - ( position.x || 0 ) - element.getSize( 'width' ) : parseInt( right, 10 );
+
+			if ( position.y + internalHeight > viewSize.height )
+				internalHeight = viewSize.height - position.y;
+
+			if ( ( rtl ? right : position.x ) + internalWidth > viewSize.width )
+				internalWidth = viewSize.width - ( rtl ? right : position.x );
+
+			// Make sure the dialog will not be resized to the wrong side when it's in the leftmost position for RTL.
+			if ( ( resizable == CKEDITOR.DIALOG_RESIZE_WIDTH || resizable == CKEDITOR.DIALOG_RESIZE_BOTH ) && !( rtl && dx > 0 && !position.x ) )
+				width = Math.max( def.minWidth || 0, internalWidth - wrapperWidth );
+
+			if ( resizable == CKEDITOR.DIALOG_RESIZE_HEIGHT || resizable == CKEDITOR.DIALOG_RESIZE_BOTH )
+				height = Math.max( def.minHeight || 0, internalHeight - wrapperHeight );
+
+			dialog.resize( width, height );
+			// The right property might get broken during resizing, so computing it before the resizing.
+			positionDialog( right );
 
 			evt.data.preventDefault();
 		}
 
-		function mouseMoveHandler( evt )
-		{
-			var x = evt.data.$.screenX,
-				y = evt.data.$.screenY,
-				dx = x - lastCoords.x,
-				dy = y - lastCoords.y,
-				viewPaneSize = CKEDITOR.document.getWindow().getViewPaneSize(),
-				partName = evt.listenerData.part;
-
-			if ( partName.search( 't' ) != -1 )
-				topSizer( abstractDialogCoords, dy );
-			if ( partName.search( 'l' ) != -1 )
-				leftSizer( abstractDialogCoords, dx );
-			if ( partName.search( 'b' ) != -1 )
-				bottomSizer( abstractDialogCoords, dy );
-			if ( partName.search( 'r' ) != -1 )
-				rightSizer( abstractDialogCoords, dx );
-
-			lastCoords = { x : x, y : y };
-
-			var realX, realY, realX2, realY2;
-
-			if ( abstractDialogCoords.x + margins[3] < magnetDistance )
-				realX = - margins[3];
-			else if ( partName.search( 'l' ) != -1 && abstractDialogCoords.x2 - abstractDialogCoords.x < minWidth + magnetDistance )
-				realX = abstractDialogCoords.x2 - minWidth;
-			else
-				realX = abstractDialogCoords.x;
-
-			if ( abstractDialogCoords.y + margins[0] < magnetDistance )
-				realY = - margins[0];
-			else if ( partName.search( 't' ) != -1 && abstractDialogCoords.y2 - abstractDialogCoords.y < minHeight + magnetDistance )
-				realY = abstractDialogCoords.y2 - minHeight;
-			else
-				realY = abstractDialogCoords.y;
-
-			if ( abstractDialogCoords.x2 - margins[1] > viewPaneSize.width - magnetDistance )
-				realX2 = viewPaneSize.width + margins[1] ;
-			else if ( partName.search( 'r' ) != -1 && abstractDialogCoords.x2 - abstractDialogCoords.x < minWidth + magnetDistance )
-				realX2 = abstractDialogCoords.x + minWidth;
-			else
-				realX2 = abstractDialogCoords.x2;
-
-			if ( abstractDialogCoords.y2 - margins[2] > viewPaneSize.height - magnetDistance )
-				realY2= viewPaneSize.height + margins[2] ;
-			else if ( partName.search( 'b' ) != -1 && abstractDialogCoords.y2 - abstractDialogCoords.y < minHeight + magnetDistance )
-				realY2 = abstractDialogCoords.y + minHeight;
-			else
-				realY2 = abstractDialogCoords.y2 ;
-
-			dialog.move( realX, realY );
-			dialog.resize( realX2 - realX, realY2 - realY );
-
-			evt.data.preventDefault();
-		}
-
-		function mouseUpHandler( evt )
+		function mouseUpHandler()
 		{
 			CKEDITOR.document.removeListener( 'mouseup', mouseUpHandler );
@@ -1788,21 +1809,23 @@
 				coverDoc.removeListener( 'mousemove', mouseMoveHandler );
 			}
-		}
-
-// TODO : Simplify the resize logic, having just a single resize grip <div>.
-//		var widthTest = /[lr]/,
-//			heightTest = /[tb]/;
-//		for ( var i = 0 ; i < parts.length ; i++ )
-//		{
-//			var element = dialog.parts[ parts[i] + '_resize' ];
-//			if ( resizable == CKEDITOR.DIALOG_RESIZE_NONE ||
-//					resizable == CKEDITOR.DIALOG_RESIZE_HEIGHT && widthTest.test( parts[i] ) ||
-//			  		resizable == CKEDITOR.DIALOG_RESIZE_WIDTH && heightTest.test( parts[i] ) )
-//			{
-//				element.hide();
-//				continue;
-//			}
-//			element.on( 'mousedown', mouseDownHandler, dialog, { part : parts[i] } );
-//		}
+
+			// Switch back to use the left property, if RTL is used.
+			if ( editor.lang.dir == 'rtl' )
+			{
+				var element = dialog._.element.getFirst(),
+					left = element.getComputedStyle( 'left' );
+
+				// IE might return "auto", we need exact position.
+				if ( left == 'auto' )
+					left = viewSize.width - parseInt( element.getStyle( 'right' ), 10 ) - dialog.getSize().width;
+				else
+					left = parseInt( left, 10 );
+
+				element.removeStyle( 'right' );
+				// Make sure the left property gets applied, even if it is the same as previously.
+				dialog._.position.x += 1;
+				dialog.move( left, dialog._.position.y );
+			}
+		}
 	}
 
@@ -2993,4 +3016,32 @@
 
 /**
+ * The guildeline to follow when generating the dialog buttons. There are 3 possible options:
+ * <ul>
+ *     <li>'OS' - the buttons will be displayed in the default order of the user's OS;</li>
+ *     <li>'ltr' - for Left-To-Right order;</li>
+ *     <li>'rtl' - for Right-To-Left order.</li>
+ * </ul>
+ * @name CKEDITOR.config.dialog_buttonsOrder
+ * @type String
+ * @default 'OS'
+ * @since 3.5
+ * @example
+ * config.dialog_buttonsOrder = 'rtl';
+ */
+
+/**  
+ * The dialog contents to removed. It's a string composed by dialog name and tab name with a colon between them.
+ * Separate each pair with semicolon (see example).
+ * <b>Note: All names are case-sensitive.</b>
+ * <b>Note: Be cautious when specifying dialog tabs that are mandatory, like "info", dialog functionality might be broken because of this!<b>
+ * @name CKEDITOR.config.removeDialogTabs
+ * @type String
+ * @since 3.5
+ * @default ''
+ * @example
+ * config.removeDialogTabs = 'flash:advanced;image:Link';
+ */
+
+/**
  * Fired when a dialog definition is about to be used to create a dialog into
  * an editor instance. This event makes it possible to customize the definition
Index: /CKEditor/trunk/_source/plugins/div/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/div/plugin.js	(revision 6189)
+++ /CKEditor/trunk/_source/plugins/div/plugin.js	(revision 6190)
@@ -38,8 +38,8 @@
 								div = blockLimit.is( 'div' ) && blockLimit;
 
-							if ( div && !div.getAttribute( '_cke_div_added' ) )
+							if ( div && !div.data( 'cke-div-added' ) )
 							{
 								toRemove.push( div );
-								div.setAttribute( '_cke_div_added' );
+								div.data( 'cke-div-added' );
 							}
 						}
Index: /CKEditor/trunk/_source/plugins/elementspath/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/elementspath/plugin.js	(revision 6189)
+++ /CKEditor/trunk/_source/plugins/elementspath/plugin.js	(revision 6190)
@@ -20,6 +20,7 @@
 				var element = CKEDITOR.document.getById( idBase + '0' );
 
-				if ( element )
-					element.focus();
+				// Make the first button focus accessible for IE. (#3417)
+				// Adobe AIR instead need while of delay.
+				element && element.focus( CKEDITOR.env.ie || CKEDITOR.env.air );
 			}
 		}
@@ -57,4 +58,51 @@
 				});
 
+			function onClick( elementIndex )
+			{
+				editor.focus();
+				var element = editor._.elementsPath.list[ elementIndex ];
+				editor.getSelection().selectElement( element );
+			}
+
+			var onClickHanlder = CKEDITOR.tools.addFunction( onClick );
+
+			var onKeyDownHandler = CKEDITOR.tools.addFunction( function( elementIndex, ev )
+				{
+					var idBase = editor._.elementsPath.idBase,
+						element;
+
+					ev = new CKEDITOR.dom.event( ev );
+
+					var rtl = editor.lang.dir == 'rtl';
+					switch ( ev.getKeystroke() )
+					{
+						case rtl ? 39 : 37 :		// LEFT-ARROW
+						case 9 :					// TAB
+							element = CKEDITOR.document.getById( idBase + ( elementIndex + 1 ) );
+							if ( !element )
+								element = CKEDITOR.document.getById( idBase + '0' );
+							element.focus();
+							return false;
+
+						case rtl ? 37 : 39 :		// RIGHT-ARROW
+						case CKEDITOR.SHIFT + 9 :	// SHIFT + TAB
+							element = CKEDITOR.document.getById( idBase + ( elementIndex - 1 ) );
+							if ( !element )
+								element = CKEDITOR.document.getById( idBase + ( editor._.elementsPath.list.length - 1 ) );
+							element.focus();
+							return false;
+
+						case 27 :					// ESC
+							editor.focus();
+							return false;
+
+						case 13 :					// ENTER	// Opera
+						case 32 :					// SPACE
+							onClick( elementIndex );
+							return false;
+					}
+					return true;
+				});
+
 			editor.on( 'selectionChange', function( ev )
 				{
@@ -83,6 +131,6 @@
 							var index = elementsList.push( element ) - 1;
 							var name;
-							if ( element.getAttribute( '_cke_real_element_type' ) )
-								name = element.getAttribute( '_cke_real_element_type' );
+							if ( element.data( 'cke-real-element-type' ) )
+								name = element.data( 'cke-real-element-type' );
 							else
 								name = element.getName();
@@ -113,7 +161,7 @@
 									' onfocus="event.preventBubble();"' : '' ) +
 									' hidefocus="true" ' +
-									' onkeydown="return CKEDITOR._.elementsPath.keydown(\'', editor.name, '\',', index, ', event);"' +
+									' onkeydown="return CKEDITOR.tools.callFunction(', onKeyDownHandler, ',', index, ', event );"' +
 									extra ,
-									' onclick="return CKEDITOR._.elementsPath.click(\'', editor.name, '\',', index, ');"',
+									' onclick="CKEDITOR.tools.callFunction('+ onClickHanlder, ',', index, '); return false;"',
 									' role="button" aria-labelledby="' + idBase + index + '_label">',
 										name,
@@ -129,5 +177,7 @@
 					}
 
-					getSpaceElement().setHtml( html.join('') + emptyHtml );
+					var space = getSpaceElement();
+					space.setHtml( html.join('') + emptyHtml );
+					editor.fire( 'elementsPathUpdate', { space : space } );
 				});
 
@@ -143,72 +193,2 @@
 	});
 })();
-
-/**
- * Handles the click on an element in the element path.
- * @private
- */
-CKEDITOR._.elementsPath =
-{
-	click : function( instanceName, elementIndex )
-	{
-		var editor = CKEDITOR.instances[ instanceName ];
-		editor.focus();
-
-		var element = editor._.elementsPath.list[ elementIndex ];
-
-		if ( element.is( 'body' ) )
-		{
-			var range = new CKEDITOR.dom.range( editor.document );
-			range.selectNodeContents( element );
-			range.select();
-		}
-		else
-			editor.getSelection().selectElement( element );
-
-		return false;
-	},
-
-	keydown : function( instanceName, elementIndex, ev )
-	{
-		var instance = CKEDITOR.ui.button._.instances[ elementIndex ];
-		var editor = CKEDITOR.instances[ instanceName ];
-		var idBase = editor._.elementsPath.idBase;
-
-		var element;
-
-		ev = new CKEDITOR.dom.event( ev );
-
-		var rtl = editor.lang.dir == 'rtl';
-		switch ( ev.getKeystroke() )
-		{
-			case rtl ? 39 : 37 :					// LEFT-ARROW
-			case 9 :					// TAB
-				element = CKEDITOR.document.getById( idBase + ( elementIndex + 1 ) );
-				if ( !element )
-					element = CKEDITOR.document.getById( idBase + '0' );
-				element.focus();
-				return false;
-
-			case rtl ? 37 : 39 :					// RIGHT-ARROW
-			case CKEDITOR.SHIFT + 9 :	// SHIFT + TAB
-				element = CKEDITOR.document.getById( idBase + ( elementIndex - 1 ) );
-				if ( !element )
-					element = CKEDITOR.document.getById( idBase + ( editor._.elementsPath.list.length - 1 ) );
-				element.focus();
-				return false;
-
-			case 27 :					// ESC
-				editor.focus();
-				return false;
-
-			case 13 :					// ENTER	// Opera
-			case 32 :					// SPACE
-				this.click( instanceName, elementIndex );
-				return false;
-
-			//default :
-			//	alert( ev.getKeystroke() );
-		}
-		return true;
-	}
-};
Index: /CKEditor/trunk/_source/plugins/fakeobjects/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/fakeobjects/plugin.js	(revision 6189)
+++ /CKEditor/trunk/_source/plugins/fakeobjects/plugin.js	(revision 6190)
@@ -13,5 +13,5 @@
 			{
 				var attributes = element.attributes,
-					realHtml = attributes && attributes._cke_realelement,
+					realHtml = attributes && attributes[ 'data-cke-realelement' ],
 					realFragment = realHtml && new CKEDITOR.htmlParser.fragment.fromHtml( decodeURIComponent( realHtml ) ),
 					realElement = realFragment && realFragment.children[ 0 ];
@@ -19,5 +19,5 @@
 				// If we have width/height in the element, we must move it into
 				// the real element.
-				if ( realElement && element.attributes._cke_resizable )
+				if ( realElement && element.attributes[ 'data-cke-resizable' ] )
 				{
 					var style = element.attributes.style;
@@ -69,6 +69,6 @@
 		'class' : className,
 		src : CKEDITOR.getUrl( 'images/spacer.gif' ),
-		_cke_realelement : encodeURIComponent( realElement.getOuterHtml() ),
-		_cke_real_node_type : realElement.type,
+		'data-cke-realelement' : encodeURIComponent( realElement.getOuterHtml() ),
+		'data-cke-real-node-type' : realElement.type,
 		alt : lang[ realElementType ] || lang.unknown,
 		align : realElement.getAttribute( 'align' ) || ''
@@ -76,8 +76,8 @@
 
 	if ( realElementType )
-		attributes._cke_real_element_type = realElementType;
+		attributes[ 'data-cke-real-element-type' ] = realElementType;
 
 	if ( isResizable )
-		attributes._cke_resizable = isResizable;
+		attributes[ 'data-cke-resizable' ] = isResizable;
 
 	return this.document.createElement( 'img', { attributes : attributes } );
@@ -97,6 +97,6 @@
 		'class' : className,
 		src : CKEDITOR.getUrl( 'images/spacer.gif' ),
-		_cke_realelement : encodeURIComponent( html ),
-		_cke_real_node_type : realElement.type,
+		'data-cke-realelement' : encodeURIComponent( html ),
+		'data-cke-real-node-type' : realElement.type,
 		alt : lang[ realElementType ] || lang.unknown,
 		align : realElement.attributes.align || ''
@@ -104,8 +104,8 @@
 
 	if ( realElementType )
-		attributes._cke_real_element_type = realElementType;
+		attributes[ 'data-cke-real-element-type' ] = realElementType;
 
 	if ( isResizable )
-		attributes._cke_resizable = isResizable;
+		attributes[ 'data-cke-resizable' ] = isResizable;
 
 	return new CKEDITOR.htmlParser.element( 'img', attributes );
@@ -114,9 +114,9 @@
 CKEDITOR.editor.prototype.restoreRealElement = function( fakeElement )
 {
-	if ( fakeElement.getAttribute( '_cke_real_node_type' ) != CKEDITOR.NODE_ELEMENT )
+	if ( fakeElement.data( 'cke-real-node-type' ) != CKEDITOR.NODE_ELEMENT )
 		return null;
 
 	return CKEDITOR.dom.element.createFromHtml(
-		decodeURIComponent( fakeElement.getAttribute( '_cke_realelement' ) ),
+		decodeURIComponent( fakeElement.data( 'cke-realelement' ) ),
 		this.document );
 };
Index: /CKEditor/trunk/_source/plugins/flash/dialogs/flash.js
===================================================================
--- /CKEditor/trunk/_source/plugins/flash/dialogs/flash.js	(revision 6189)
+++ /CKEditor/trunk/_source/plugins/flash/dialogs/flash.js	(revision 6190)
@@ -191,5 +191,5 @@
 				// Try to detect any embed or object tag that has Flash parameters.
 				var fakeImage = this.getSelectedElement();
-				if ( fakeImage && fakeImage.getAttribute( '_cke_real_element_type' ) && fakeImage.getAttribute( '_cke_real_element_type' ) == 'flash' )
+				if ( fakeImage && fakeImage.data( 'cke-real-element-type' ) && fakeImage.data( 'cke-real-element-type' ) == 'flash' )
 				{
 					this.fakeImage = fakeImage;
Index: /CKEditor/trunk/_source/plugins/flash/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/flash/plugin.js	(revision 6189)
+++ /CKEditor/trunk/_source/plugins/flash/plugin.js	(revision 6190)
@@ -76,5 +76,5 @@
 					var element = evt.data.element;
 
-					if ( element.is( 'img' ) && element.getAttribute( '_cke_real_element_type' ) == 'flash' )
+					if ( element.is( 'img' ) && element.data( 'cke-real-element-type' ) == 'flash' )
 						evt.data.dialog = 'flash';
 				});
@@ -86,5 +86,5 @@
 					{
 						if ( element && element.is( 'img' ) && !element.isReadOnly()
-								&& element.getAttribute( '_cke_real_element_type' ) == 'flash' )
+								&& element.data( 'cke-real-element-type' ) == 'flash' )
 							return { flash : CKEDITOR.TRISTATE_OFF };
 					});
Index: /CKEditor/trunk/_source/plugins/floatpanel/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/floatpanel/plugin.js	(revision 6189)
+++ /CKEditor/trunk/_source/plugins/floatpanel/plugin.js	(revision 6190)
@@ -1,3 +1,3 @@
-﻿/*
+/*
 Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
 For licensing, see LICENSE.html or http://ckeditor.com/license
@@ -306,5 +306,5 @@
 							this.allowBlur( true );
 						}, 0, this);
-					}, 0, this);
+					},  CKEDITOR.env.air ? 200 : 0, this);
 				this.visible = 1;
 
Index: /CKEditor/trunk/_source/plugins/forms/dialogs/button.js
===================================================================
--- /CKEditor/trunk/_source/plugins/forms/dialogs/button.js	(revision 6189)
+++ /CKEditor/trunk/_source/plugins/forms/dialogs/button.js	(revision 6190)
@@ -53,5 +53,5 @@
 						{
 							this.setValue(
-									element.getAttribute( '_cke_saved_name' ) ||
+									element.data( 'cke-saved-name' ) ||
 									element.getAttribute( 'name' ) ||
 									'' );
@@ -62,8 +62,8 @@
 
 							if ( this.getValue() )
-								element.setAttribute( '_cke_saved_name', this.getValue() );
+								element.data( 'cke-saved-name', this.getValue() );
 							else
 							{
-								element.removeAttribute( '_cke_saved_name' );
+								element.data( 'cke-saved-name', false );
 								element.removeAttribute( 'name' );
 							}
Index: /CKEditor/trunk/_source/plugins/forms/dialogs/checkbox.js
===================================================================
--- /CKEditor/trunk/_source/plugins/forms/dialogs/checkbox.js	(revision 6189)
+++ /CKEditor/trunk/_source/plugins/forms/dialogs/checkbox.js	(revision 6190)
@@ -52,5 +52,5 @@
 						{
 							this.setValue(
-									element.getAttribute( '_cke_saved_name' ) ||
+									element.data( 'cke-saved-name' ) ||
 									element.getAttribute( 'name' ) ||
 									'' );
@@ -62,8 +62,8 @@
 							// IE failed to update 'name' property on input elements, protect it now.
 							if ( this.getValue() )
-								element.setAttribute( '_cke_saved_name', this.getValue() );
+								element.data( 'cke-saved-name', this.getValue() );
 							else
 							{
-								element.removeAttribute( '_cke_saved_name' );
+								element.data( 'cke-saved-name', false );
 								element.removeAttribute( 'name' );
 							}
Index: /CKEditor/trunk/_source/plugins/forms/dialogs/form.js
===================================================================
--- /CKEditor/trunk/_source/plugins/forms/dialogs/form.js	(revision 6189)
+++ /CKEditor/trunk/_source/plugins/forms/dialogs/form.js	(revision 6190)
@@ -85,5 +85,5 @@
 						setup : function( element )
 						{
-							this.setValue( element.getAttribute( '_cke_saved_name' ) ||
+							this.setValue( element.data( 'cke-saved-name' ) ||
 									element.getAttribute( 'name' ) ||
 									'' );
@@ -92,8 +92,8 @@
 						{
 							if ( this.getValue() )
-								element.setAttribute( '_cke_saved_name', this.getValue() );
+								element.data( 'cke-saved-name', this.getValue() );
 							else
 							{
-								element.removeAttribute( '_cke_saved_name' );
+								element.data( 'cke-saved-name', false );
 								element.removeAttribute( 'name' );
 							}
Index: /CKEditor/trunk/_source/plugins/forms/dialogs/hiddenfield.js
===================================================================
--- /CKEditor/trunk/_source/plugins/forms/dialogs/hiddenfield.js	(revision 6189)
+++ /CKEditor/trunk/_source/plugins/forms/dialogs/hiddenfield.js	(revision 6190)
@@ -18,5 +18,5 @@
 				element = selection.getSelectedElement();
 
-			if ( element && element.getAttribute( '_cke_real_element_type' ) && element.getAttribute( '_cke_real_element_type' ) == 'hiddenfield' )
+			if ( element && element.data( 'cke-real-element-type' ) && element.data( 'cke-real-element-type' ) == 'hiddenfield' )
 			{
 				this.hiddenField = element;
@@ -60,5 +60,5 @@
 						{
 							this.setValue(
-									element.getAttribute( '_cke_saved_name' ) ||
+									element.data( 'cke-saved-name' ) ||
 									element.getAttribute( 'name' ) ||
 									'' );
Index: /CKEditor/trunk/_source/plugins/forms/dialogs/radio.js
===================================================================
--- /CKEditor/trunk/_source/plugins/forms/dialogs/radio.js	(revision 6189)
+++ /CKEditor/trunk/_source/plugins/forms/dialogs/radio.js	(revision 6190)
@@ -52,5 +52,5 @@
 						{
 							this.setValue(
-									element.getAttribute( '_cke_saved_name' ) ||
+									element.data( 'cke-saved-name' ) ||
 									element.getAttribute( 'name' ) ||
 									'' );
@@ -61,8 +61,8 @@
 
 							if ( this.getValue() )
-								element.setAttribute( '_cke_saved_name', this.getValue() );
+								element.data( 'cke-saved-name', this.getValue() );
 							else
 							{
-								element.removeAttribute( '_cke_saved_name' );
+								element.data( 'cke-saved-name', false );
 								element.removeAttribute( 'name' );
 							}
Index: /CKEditor/trunk/_source/plugins/forms/dialogs/select.js
===================================================================
--- /CKEditor/trunk/_source/plugins/forms/dialogs/select.js	(revision 6189)
+++ /CKEditor/trunk/_source/plugins/forms/dialogs/select.js	(revision 6190)
@@ -194,9 +194,9 @@
 						{
 							if ( name == 'clear' )
-								this.setValue( this['default'] || '' );
+								this.setValue( this[ 'default' ] || '' );
 							else if ( name == 'select' )
 							{
 								this.setValue(
-										element.getAttribute( '_cke_saved_name' ) ||
+										element.data( 'cke-saved-name' ) ||
 										element.getAttribute( 'name' ) ||
 										'' );
@@ -206,8 +206,8 @@
 						{
 							if ( this.getValue() )
-								element.setAttribute( '_cke_saved_name', this.getValue() );
+								element.data( 'cke-saved-name', this.getValue() );
 							else
 							{
-								element.removeAttribute( '_cke_saved_name' ) ;
+								element.data( 'cke-saved-name', false );
 								element.removeAttribute( 'name' );
 							}
Index: /CKEditor/trunk/_source/plugins/forms/dialogs/textarea.js
===================================================================
--- /CKEditor/trunk/_source/plugins/forms/dialogs/textarea.js	(revision 6189)
+++ /CKEditor/trunk/_source/plugins/forms/dialogs/textarea.js	(revision 6190)
@@ -51,5 +51,5 @@
 						{
 							this.setValue(
-									element.getAttribute( '_cke_saved_name' ) ||
+									element.data( 'cke-saved-name' ) ||
 									element.getAttribute( 'name' ) ||
 									'' );
@@ -58,8 +58,8 @@
 						{
 							if ( this.getValue() )
-								element.setAttribute( '_cke_saved_name', this.getValue() );
+								element.data( 'cke-saved-name', this.getValue() );
 							else
 							{
-								element.removeAttribute( '_cke_saved_name' );
+								element.data( 'cke-saved-name', false );
 								element.removeAttribute( 'name' );
 							}
Index: /CKEditor/trunk/_source/plugins/forms/dialogs/textfield.js
===================================================================
--- /CKEditor/trunk/_source/plugins/forms/dialogs/textfield.js	(revision 6189)
+++ /CKEditor/trunk/_source/plugins/forms/dialogs/textfield.js	(revision 6190)
@@ -99,5 +99,5 @@
 								{
 									this.setValue(
-											element.getAttribute( '_cke_saved_name' ) ||
+											element.data( 'cke-saved-name' ) ||
 											element.getAttribute( 'name' ) ||
 											'' );
@@ -108,8 +108,8 @@
 
 									if ( this.getValue() )
-										element.setAttribute( '_cke_saved_name', this.getValue() );
+										element.data( 'cke-saved-name', this.getValue() );
 									else
 									{
-										element.removeAttribute( '_cke_saved_name' );
+										element.data( 'cke-saved-name', false );
 										element.removeAttribute( 'name' );
 									}
Index: /CKEditor/trunk/_source/plugins/forms/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/forms/plugin.js	(revision 6189)
+++ /CKEditor/trunk/_source/plugins/forms/plugin.js	(revision 6190)
@@ -168,5 +168,5 @@
 						}
 
-						if ( name == 'img' && element.getAttribute( '_cke_real_element_type' ) == 'hiddenfield' )
+						if ( name == 'img' && element.data( 'cke-real-element-type' ) == 'hiddenfield' )
 							return { hiddenfield : CKEDITOR.TRISTATE_OFF };
 					}
@@ -184,5 +184,5 @@
 				else if ( element.is( 'textarea' ) )
 					evt.data.dialog = 'textarea';
-				else if ( element.is( 'img' ) && element.getAttribute( '_cke_real_element_type' ) == 'hiddenfield' )
+				else if ( element.is( 'img' ) && element.data( 'cke-real-element-type' ) == 'hiddenfield' )
 					evt.data.dialog = 'hiddenfield';
 				else if ( element.is( 'input' ) )
Index: /CKEditor/trunk/_source/plugins/htmldataprocessor/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/htmldataprocessor/plugin.js	(revision 6189)
+++ /CKEditor/trunk/_source/plugins/htmldataprocessor/plugin.js	(revision 6190)
@@ -1,3 +1,3 @@
-/*
+﻿/*
 Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
 For licensing, see LICENSE.html or http://ckeditor.com/license
@@ -39,10 +39,14 @@
 	}
 
-	function blockNeedsExtension( block, fromSource )
-	{
+	function blockNeedsExtension( block, fromSource, extendEmptyBlock )
+	{
+		if( !extendEmptyBlock ||
+			typeof extendEmptyBlock == 'function' && ( extendEmptyBlock( block ) == false ) )
+			return false;
+
         // 1. For IE version >=8,  empty blocks are displayed correctly themself in wysiwiyg;
         // 2. For the rest, at least table cell and list item need no filler space.
         // (#6248)
-        if ( fromSource && CKEDITOR.env.ie && 
+        if ( fromSource && CKEDITOR.env.ie &&
                 ( document.documentMode > 7
                 || block.name in CKEDITOR.dtd.tr
@@ -52,30 +56,25 @@
 		var lastChild = lastNoneSpaceChild( block );
 
-		return !lastChild
-			|| lastChild.type == CKEDITOR.NODE_ELEMENT && lastChild.name == 'br'
-			// Some of the controls in form needs extension too,
-			// to move cursor at the end of the form. (#4791)
-			|| block.name == 'form' && lastChild.name == 'input';
-	}
-
-	function extendBlockForDisplay( block )
-	{
-		trimFillers( block, true );
-
-		if ( blockNeedsExtension( block, true ) )
-		{
-			if ( CKEDITOR.env.ie )
-				block.add( new CKEDITOR.htmlParser.text( '\xa0' ) );
-			else
-				block.add( new CKEDITOR.htmlParser.element( 'br', {} ) );
+		return !lastChild || lastChild &&
+				( lastChild.type == CKEDITOR.NODE_ELEMENT && lastChild.name == 'br'
+				// Some of the controls in form needs extension too,
+				// to move cursor at the end of the form. (#4791)
+				|| block.name == 'form' && lastChild.name == 'input' );
+	}
+
+	function getBlockExtension( isOutput, emptyBlockFiller )
+	{
+		return function( node )
+		{
+			trimFillers( node, !isOutput );
+
+			if ( blockNeedsExtension( node, !isOutput, emptyBlockFiller ) )
+			{
+				if ( isOutput || CKEDITOR.env.ie )
+					node.add( new CKEDITOR.htmlParser.text( '\xa0' ) );
+				else
+					node.add( new CKEDITOR.htmlParser.element( 'br', {} ) );
+			}
 		}
-	}
-
-	function extendBlockForOutput( block )
-	{
-		trimFillers( block );
-
-		if ( blockNeedsExtension( block ) )
-			block.add( new CKEDITOR.htmlParser.text( '\xa0' ) );
 	}
 
@@ -99,5 +98,5 @@
 			// Event attributes (onXYZ) must not be directly set. They can become
 			// active in the editing area (IE|WebKit).
-			[ ( /^on/ ), '_cke_pa_on' ]
+			[ ( /^on/ ), 'data-cke-pa-on' ]
 		]
 	};
@@ -106,5 +105,5 @@
 
 	for ( i in blockLikeTags )
-		defaultDataBlockFilterRules.elements[ i ] = extendBlockForDisplay;
+		defaultDataBlockFilterRules.elements[ i ] = getBlockExtension();
 
 	var defaultHtmlFilterRules =
@@ -122,8 +121,8 @@
 			[
 				// Attributes saved for changes and protected attributes.
-				[ ( /^_cke_(saved|pa)_/ ), '' ],
-
-				// All "_cke" attributes are to be ignored.
-				[ ( /^_cke.*/ ), '' ],
+				[ ( /^data-cke-(saved|pa)-/ ), '' ],
+
+				// All "data-cke" attributes are to be ignored.
+				[ ( /^data-cke.*/ ), '' ],
 
 				[ 'hidefocus', '' ]
@@ -139,5 +138,5 @@
 					{
 						// Elements marked as temporary are to be ignored.
-						if ( attribs.cke_temp )
+						if ( attribs[ 'data-cke-temp' ] )
 							return false;
 
@@ -147,5 +146,5 @@
 						for ( var i = 0 ; i < attributeNames.length ; i++ )
 						{
-							savedAttributeName = '_cke_saved_' + attributeNames[ i ];
+							savedAttributeName = 'data-cke-saved-' + attributeNames[ i ];
 							savedAttributeName in attribs && ( delete attribs[ attributeNames[ i ] ] );
 						}
@@ -182,5 +181,5 @@
 					if ( !( element.children.length ||
 							element.attributes.name ||
-							element.attributes._cke_saved_name ) )
+							element.attributes[ 'data-cke-saved-name' ] ) )
 					{
 						return false;
@@ -188,4 +187,11 @@
 				},
 
+				// Remove dummy span in webkit.
+				span: function( element )
+				{
+					if ( element.attributes[ 'class' ] == 'Apple-style-span' )
+						delete element.name;
+				},
+
 				html : function( element )
 				{
@@ -212,5 +218,5 @@
 				{
 					var titleText = element.children[ 0 ];
-					titleText && ( titleText.value = element.attributes[ '_cke_title' ] || '' );
+					titleText && ( titleText.value = element.attributes[ 'data-cke-title' ] || '' );
 				}
 			},
@@ -243,9 +249,4 @@
 		};
 
-	var defaultHtmlBlockFilterRules = { elements : {} };
-
-	for ( i in blockLikeTags )
-		defaultHtmlBlockFilterRules.elements[ i ] = extendBlockForOutput;
-
 	if ( CKEDITOR.env.ie )
 	{
@@ -274,5 +275,5 @@
 
 	var protectAttributeRegex = /<((?:a|area|img|input)\b[\s\S]*?\s)((href|src|name)\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|(?:[^ "'>]+)))([^>]*)>/gi,
-		findSavedSrcRegex = /\s_cke_saved_src\s*=/;
+		findSavedSrcRegex = /\sdata-cke-saved-src\s*=/;
 
 	var protectElementsRegex = /(?:<style(?=[ >])[^>]*>[\s\S]*<\/style>)|(?:<(:?link|meta|base)[^>]*>)/gi,
@@ -292,5 +293,5 @@
 					return tag;
 				else
-					return '<' + beginning + fullAttr + ' _cke_saved_' + fullAttr + end + '>';
+					return '<' + beginning + fullAttr + ' data-cke-saved-' + fullAttr + end + '>';
 			});
 	}
@@ -413,5 +414,15 @@
 			dataProcessor.dataFilter.addRules( defaultDataBlockFilterRules );
 			dataProcessor.htmlFilter.addRules( defaultHtmlFilterRules );
+
+			var defaultHtmlBlockFilterRules = { elements : {} };
+			for ( i in blockLikeTags )
+				defaultHtmlBlockFilterRules.elements[ i ] = getBlockExtension( true, editor.config.fillEmptyBlocks );
+
 			dataProcessor.htmlFilter.addRules( defaultHtmlBlockFilterRules );
+		},
+		
+		onLoad : function()
+		{
+			! ( 'fillEmptyBlocks' in CKEDITOR.config ) && ( CKEDITOR.config.fillEmptyBlocks = 1 );
 		}
 	});
@@ -505,4 +516,5 @@
  * W3C XHTML 1.0 standards (<a href="http://www.w3.org/TR/xhtml1/#C_12">C.12, XHTML 1.0</a>).
  * @name CKEDITOR.config.forceSimpleAmpersand
+ * @name CKEDITOR.config.forceSimpleAmpersand
  * @type Boolean
  * @default false
@@ -510,2 +522,23 @@
  * config.forceSimpleAmpersand = false;
  */
+
+/**
+ * Whether a filler text (non-breaking space entity - &nbsp;) will be inserted into empty block elements in HTML output,
+ * this is used to render block elements properly with line-height; When a function is instead specified,
+ * it'll be passed a {@link CKEDITOR.htmlParser.element} to decide whether adding the filler text
+ * by expecting a boolean return value.
+ * @name CKEDITOR.config.fillEmptyBlocks;
+ * @since 3.5
+ * @type Boolean
+ * @default true
+ * @example
+ * config.fillEmptyBlocks = false;	// Prevent filler nodes in all empty blocks.
+ *
+ * // Prevent filler node only in float cleaners.
+ * config.fillEmptyBlocks = function( element )
+ * {
+ * 	if ( element.attributes[ 'class' ].indexOf ( 'clear-both' ) != -1 )
+ * 		return false;
+ * }
+ */
+
Index: /CKEditor/trunk/_source/plugins/iframe/dialogs/iframe.js
===================================================================
--- /CKEditor/trunk/_source/plugins/iframe/dialogs/iframe.js	(revision 6190)
+++ /CKEditor/trunk/_source/plugins/iframe/dialogs/iframe.js	(revision 6190)
@@ -0,0 +1,257 @@
+/*
+Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+(function()
+{
+	// Map 'true' and 'false' values to match W3C's specifications
+	// http://www.w3.org/TR/REC-html40/present/frames.html#h-16.5
+	var checkboxValues =
+	{
+		scrolling : { 'true' : 'yes', 'false' : 'no' },
+		frameborder : { 'true' : '1', 'false' : '0' }
+	};
+	
+	function loadValue( iframeNode )
+	{
+		var isCheckbox = this instanceof CKEDITOR.ui.dialog.checkbox;
+		if ( iframeNode.hasAttribute( this.id ) )
+		{
+			var value = iframeNode.getAttribute( this.id );
+			if ( isCheckbox )
+				this.setValue( checkboxValues[ this.id ][ 'true' ] == value.toLowerCase() );
+			else
+				this.setValue( value );
+		}
+	}
+
+	function commitValue( iframeNode )
+	{
+		var isRemove = this.getValue() === '',
+			isCheckbox = this instanceof CKEDITOR.ui.dialog.checkbox,
+			value = this.getValue();
+		if ( isRemove )
+			iframeNode.removeAttribute( this.att || this.id );
+		else if ( isCheckbox )
+			iframeNode.setAttribute( this.id, checkboxValues[ this.id ][ value ] );
+		else
+			iframeNode.setAttribute( this.att || this.id, value );
+	}
+
+	CKEDITOR.dialog.add( 'iframe', function( editor )
+	{
+		var iframeLang = editor.lang.iframe,
+			commonLang = editor.lang.common,
+			dialogadvtab = editor.plugins.dialogadvtab;
+		return {
+			title : iframeLang.title,
+			minWidth : 350,
+			minHeight : 260,
+			onShow : function()
+			{
+				// Clear previously saved elements.
+				this.fakeImage = this.iframeNode = null;
+
+				var fakeImage = this.getSelectedElement();
+				if ( fakeImage && fakeImage.data( 'cke-real-element-type' ) && fakeImage.data( 'cke-real-element-type' ) == 'iframe' )
+				{
+					this.fakeImage = fakeImage;
+
+					var iframeNode = editor.restoreRealElement( fakeImage );
+					this.iframeNode = iframeNode;
+
+					this.setupContent( iframeNode, fakeImage );
+				}
+			},
+			onOk : function()
+			{
+				var iframeNode;
+				if ( !this.fakeImage )
+					iframeNode = new CKEDITOR.dom.element( 'iframe' );
+				else
+					iframeNode = this.iframeNode;
+
+				// A subset of the specified attributes/styles
+				// should also be applied on the fake element to
+				// have better visual effect. (#5240)
+				var extraStyles = {}, extraAttributes = {};
+				this.commitContent( iframeNode, extraStyles, extraAttributes );
+
+				// Refresh the fake image.
+				var newFakeImage = editor.createFakeElement( iframeNode, 'cke_iframe', 'iframe', true );
+				newFakeImage.setAttributes( extraAttributes );
+				newFakeImage.setStyles( extraStyles );
+				if ( this.fakeImage )
+				{
+					newFakeImage.replace( this.fakeImage );
+					editor.getSelection().selectElement( newFakeImage );
+				}
+				else
+					editor.insertElement( newFakeImage );
+			},
+			contents : [
+				{
+					id : 'info',
+					label : commonLang.generalTab,
+					accessKey : 'I',
+					elements :
+					[
+						{
+							type : 'vbox',
+							padding : 0,
+							children :
+							[
+								{
+									id : 'src',
+									type : 'text',
+									label : commonLang.url,
+									required : true,
+									validate : CKEDITOR.dialog.validate.notEmpty( iframeLang.noUrl ),
+									setup : loadValue,
+									commit : commitValue
+								}
+							]
+						},
+						{
+							type : 'hbox',
+							children :
+							[
+								{
+									id : 'width',
+									type : 'text',
+									style : 'width:100%',
+									labelLayout : 'vertical',
+									label : iframeLang.width,
+									validate : CKEDITOR.dialog.validate.integer( iframeLang.invalidWidth ),
+									setup : function( iframeNode, fakeImage )
+									{
+										loadValue.apply( this, arguments );
+										if ( fakeImage )
+										{
+											var fakeImageWidth = parseInt( fakeImage.$.style.width, 10 );
+											if ( !isNaN( fakeImageWidth ) )
+												this.setValue( fakeImageWidth );
+										}
+									},
+									commit : function( iframeNode, extraStyles )
+									{
+										commitValue.apply( this, arguments );
+										if ( this.getValue() )
+											extraStyles.width = this.getValue() + 'px';
+									}
+								},
+								{
+									id : 'height',
+									type : 'text',
+									style : 'width:100%',
+									labelLayout : 'vertical',
+									label : iframeLang.height,
+									validate : CKEDITOR.dialog.validate.integer( iframeLang.invalidHeight ),
+									setup : function( iframeNode, fakeImage )
+									{
+										loadValue.apply( this, arguments );
+										if ( fakeImage )
+										{
+											var fakeImageHeight = parseInt( fakeImage.$.style.height, 10 );
+											if ( !isNaN( fakeImageHeight ) )
+												this.setValue( fakeImageHeight );
+										}
+									},
+									commit : function( iframeNode, extraStyles )
+									{
+										commitValue.apply( this, arguments );
+										if ( this.getValue() )
+											extraStyles.height = this.getValue() + 'px';
+									}
+								},
+								{
+									id : 'align',
+									type : 'select',
+									'default' : '',
+									items :
+									[
+										[ commonLang.notSet , '' ],
+										[ iframeLang.alignLeft , 'left' ],
+										[ iframeLang.alignRight , 'right' ],
+										[ iframeLang.alignTop , 'top' ],
+										[ iframeLang.alignMiddle , 'middle' ],
+										[ iframeLang.alignBottom , 'bottom' ]
+									],
+									style : 'width:100%',
+									labelLayout : 'vertical',
+									label : iframeLang.align,
+									setup : function( iframeNode, fakeImage )
+									{
+										loadValue.apply( this, arguments );
+										if ( fakeImage )
+										{
+											var fakeImageAlign = fakeImage.getAttribute( 'align' );
+											this.setValue( fakeImageAlign && fakeImageAlign.toLowerCase() || '' );
+										}
+									},
+									commit : function( iframeNode, extraStyles, extraAttributes )
+									{
+										commitValue.apply( this, arguments );
+										if ( this.getValue() )
+											extraAttributes.align = this.getValue();
+									}
+								}
+							]
+						},
+						{
+							type : 'hbox',
+							widths : [ '50%', '50%' ],
+							children :
+							[
+								{
+									id : 'scrolling',
+									type : 'checkbox',
+									label : iframeLang.scrolling,
+									setup : loadValue,
+									commit : commitValue
+								},
+								{
+									id : 'frameborder',
+									type : 'checkbox',
+									label : iframeLang.border,
+									setup : loadValue,
+									commit : commitValue
+								}
+							]
+						},
+						{
+							type : 'hbox',
+							widths : [ '50%', '50%' ],
+							children :
+							[
+								{
+									id : 'name',
+									type : 'text',
+									label : commonLang.name,
+									setup : loadValue,
+									commit : commitValue
+								},
+								{
+									id : 'title',
+									type : 'text',
+									label : commonLang.advisoryTitle,
+									setup : loadValue,
+									commit : commitValue
+								}
+							]
+						},
+						{
+							id : 'longdesc',
+							type : 'text',
+							label : commonLang.longDescr,
+							setup : loadValue,
+							commit : commitValue
+						}
+					]
+				},
+				dialogadvtab && dialogadvtab.createAdvancedTab( editor, { id:1, classes:1, styles:1 })
+			]
+		};
+	});
+})();
Index: /CKEditor/trunk/_source/plugins/iframe/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/iframe/plugin.js	(revision 6190)
+++ /CKEditor/trunk/_source/plugins/iframe/plugin.js	(revision 6190)
@@ -0,0 +1,106 @@
+/*
+Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+(function()
+{
+	function createFakeElement( editor, realElement )
+	{
+		var fakeElement = editor.createFakeParserElement( realElement, 'cke_iframe', 'iframe', true ),
+			fakeStyle = fakeElement.attributes.style || '';
+
+		var width = realElement.attributes.width,
+			height = realElement.attributes.height;
+
+		if ( typeof width != 'undefined' )
+			fakeStyle += 'width:' + CKEDITOR.tools.cssLength( width ) + ';';
+
+		if ( typeof height != 'undefined' )
+			fakeStyle += 'height:' + CKEDITOR.tools.cssLength( height ) + ';';
+
+		fakeElement.attributes.style = fakeStyle;
+
+		return fakeElement;
+	}
+
+	CKEDITOR.plugins.add( 'iframe',
+	{
+		requires : [ 'dialog', 'fakeobjects' ],
+		init : function( editor )
+		{
+			var pluginName = 'iframe',
+				lang = editor.lang.iframe;
+
+			CKEDITOR.dialog.add( pluginName, this.path + 'dialogs/iframe.js' );
+			editor.addCommand( pluginName, new CKEDITOR.dialogCommand( pluginName ) );
+
+			editor.addCss(
+				'img.cke_iframe' +
+				'{' +
+					'background-image: url(' + CKEDITOR.getUrl( this.path + 'images/placeholder.png' ) + ');' +
+					'background-position: center center;' +
+					'background-repeat: no-repeat;' +
+					'border: 1px solid #a9a9a9;' +
+					'width: 80px;' +
+					'height: 80px;' +
+				'}'
+			);
+
+			editor.ui.addButton( 'Iframe',
+				{
+					label : lang.toolbar,
+					command : pluginName
+				});
+
+			editor.on( 'doubleclick', function( evt )
+				{
+					var element = evt.data.element;
+					if ( element.is( 'img' ) && element.data( 'cke-real-element-type' ) == 'iframe' )
+						evt.data.dialog = 'iframe';
+				});
+
+			if ( editor.addMenuItems )
+			{
+				editor.addMenuItems(
+				{
+					iframe :
+					{
+						label : lang.title,
+						command : 'iframe',
+						group : 'image'
+					}
+				});
+			}
+
+			// If the "contextmenu" plugin is loaded, register the listeners.
+			if ( editor.contextMenu )
+			{
+				editor.contextMenu.addListener( function( element, selection )
+					{
+						if ( element && element.is( 'img' ) && element.data( 'cke-real-element-type' ) == 'iframe' )
+							return { iframe : CKEDITOR.TRISTATE_OFF };
+					});
+			}
+		},
+		afterInit : function( editor )
+		{
+			var dataProcessor = editor.dataProcessor,
+				dataFilter = dataProcessor && dataProcessor.dataFilter;
+
+			if ( dataFilter )
+			{
+				dataFilter.addRules(
+				{
+					elements :
+					{
+						iframe : function( element )
+						{
+							return createFakeElement( editor, element );
+						}
+					}
+				});
+			}
+		}
+	});
+})();
Index: /CKEditor/trunk/_source/plugins/image/dialogs/image.js
===================================================================
--- /CKEditor/trunk/_source/plugins/image/dialogs/image.js	(revision 6189)
+++ /CKEditor/trunk/_source/plugins/image/dialogs/image.js	(revision 6190)
@@ -265,5 +265,5 @@
 			title : ( dialogType == 'image' ) ? editor.lang.image.title : editor.lang.image.titleButton,
 			minWidth : 420,
-			minHeight : 310,
+			minHeight : CKEDITOR.env.ie && CKEDITOR.env.quirks?  360: 310,
 			onShow : function()
 			{
@@ -320,5 +320,5 @@
 				}
 
-				if ( element && element.getName() == 'img' && !element.getAttribute( '_cke_realelement' )
+				if ( element && element.getName() == 'img' && !element.data( 'cke-realelement' )
 					|| element && element.getName() == 'input' && element.getAttribute( 'type' ) == 'image' )
 				{
@@ -534,5 +534,5 @@
 												if ( type == IMAGE )
 												{
-													var url = element.getAttribute( '_cke_saved_src' ) || element.getAttribute( 'src' );
+													var url = element.data( 'cke-saved-src' ) || element.getAttribute( 'src' );
 													var field = this;
 
@@ -548,5 +548,5 @@
 												if ( type == IMAGE && ( this.getValue() || this.isChanged() ) )
 												{
-													element.setAttribute( '_cke_saved_src', decodeURI( this.getValue() ) );
+													element.data( 'cke-saved-src', decodeURI( this.getValue() ) );
 													element.setAttribute( 'src', decodeURI( this.getValue() ) );
 												}
@@ -608,15 +608,13 @@
 						{
 							type : 'hbox',
-							widths : [ '140px', '240px' ],
 							children :
 							[
 								{
 									type : 'vbox',
-									padding : 10,
 									children :
 									[
 										{
 											type : 'hbox',
-											widths : [ '70%', '30%' ],
+											widths : [ '50%', '50%' ],
 											children :
 											[
@@ -630,5 +628,4 @@
 															width: '40px',
 															id : 'txtWidth',
-															labelLayout : 'horizontal',
 															label : editor.lang.image.width,
 															onKeyUp : onSizeChange,
@@ -680,5 +677,4 @@
 															id : 'txtHeight',
 															width: '40px',
-															labelLayout : 'horizontal',
 															label : editor.lang.image.height,
 															onKeyUp : onSizeChange,
@@ -731,5 +727,5 @@
 												{
 													type : 'html',
-													style : 'margin-top:10px;width:40px;height:40px;',
+													style : 'margin-top:30px;width:40px;height:40px;',
 													onLoad : function()
 													{
@@ -801,5 +797,4 @@
 													id : 'txtBorder',
 													width: '60px',
-													labelLayout : 'horizontal',
 													label : editor.lang.image.border,
 													'default' : '',
@@ -858,5 +853,4 @@
 													id : 'txtHSpace',
 													width: '60px',
-													labelLayout : 'horizontal',
 													label : editor.lang.image.hSpace,
 													'default' : '',
@@ -922,5 +916,4 @@
 													id : 'txtVSpace',
 													width : '60px',
-													labelLayout : 'horizontal',
 													label : editor.lang.image.vSpace,
 													'default' : '',
@@ -984,5 +977,4 @@
 													id : 'cmbAlign',
 													type : 'select',
-													labelLayout : 'horizontal',
 													widths : [ '35%','65%' ],
 													style : 'width:90px',
@@ -1099,5 +1091,5 @@
 								if ( type == LINK )
 								{
-									var href = element.getAttribute( '_cke_saved_href' );
+									var href = element.data( 'cke-saved-href' );
 									if ( !href )
 										href = element.getAttribute( 'href' );
@@ -1111,5 +1103,5 @@
 									if ( this.getValue() || this.isChanged() )
 									{
-										element.setAttribute( '_cke_saved_href', decodeURI( this.getValue() ) );
+										element.data( 'cke-saved-href', decodeURI( this.getValue() ) );
 										element.setAttribute( 'href', 'javascript:void(0)/*' +
 											CKEDITOR.tools.getNextNumber() + '*/' );
Index: /CKEditor/trunk/_source/plugins/image/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/image/plugin.js	(revision 6189)
+++ /CKEditor/trunk/_source/plugins/image/plugin.js	(revision 6190)
@@ -31,5 +31,5 @@
 				var element = evt.data.element;
 
-				if ( element.is( 'img' ) && !element.getAttribute( '_cke_realelement' ) )
+				if ( element.is( 'img' ) && !element.data( 'cke-realelement' ) )
 					evt.data.dialog = 'image';
 			});
@@ -54,5 +54,5 @@
 			editor.contextMenu.addListener( function( element, selection )
 				{
-					if ( !element || !element.is( 'img' ) || element.getAttribute( '_cke_realelement' ) || element.isReadOnly() )
+					if ( !element || !element.is( 'img' ) || element.data( 'cke-realelement' ) || element.isReadOnly() )
 						return null;
 
Index: /CKEditor/trunk/_source/plugins/link/dialogs/anchor.js
===================================================================
--- /CKEditor/trunk/_source/plugins/link/dialogs/anchor.js	(revision 6189)
+++ /CKEditor/trunk/_source/plugins/link/dialogs/anchor.js	(revision 6190)
@@ -39,5 +39,5 @@
 
 			// Set name.
-			element.removeAttribute( '_cke_saved_name' );
+			element.data( 'cke-saved-name', false );
 			element.setAttribute( 'name', name );
 
@@ -62,5 +62,5 @@
 			var selection = editor.getSelection();
 			var element = selection.getSelectedElement();
-			if ( element && element.getAttribute( '_cke_real_element_type' ) && element.getAttribute( '_cke_real_element_type' ) == 'anchor' )
+			if ( element && element.data( 'cke-real-element-type' ) && element.data( 'cke-real-element-type' ) == 'anchor' )
 			{
 				this.fakeObj = element;
Index: /CKEditor/trunk/_source/plugins/link/dialogs/link.js
===================================================================
--- /CKEditor/trunk/_source/plugins/link/dialogs/link.js	(revision 6189)
+++ /CKEditor/trunk/_source/plugins/link/dialogs/link.js	(revision 6190)
@@ -76,4 +76,6 @@
 				element.hide();
 		}
+
+		dialog.layout();
 	};
 
@@ -95,5 +97,5 @@
 	var parseLink = function( editor, element )
 	{
-		var href = ( element  && ( element.getAttribute( '_cke_saved_href' ) || element.getAttribute( 'href' ) ) ) || '',
+		var href = ( element  && ( element.data( 'cke-saved-href' ) || element.getAttribute( 'href' ) ) ) || '',
 		 	javascriptMatch,
 			emailMatch,
@@ -185,5 +187,5 @@
 			if ( !target )
 			{
-				var onclick = element.getAttribute( '_cke_pa_onclick' ) || element.getAttribute( 'onclick' ),
+				var onclick = element.data( 'cke-pa-onclick' ) || element.getAttribute( 'onclick' ),
 					onclickMatch = onclick && onclick.match( popupRegex );
 				if ( onclickMatch )
@@ -243,5 +245,5 @@
 		{
 			var item = elements.getItem( i );
-			if ( item.getAttribute( '_cke_realelement' ) && item.getAttribute( '_cke_real_element_type' ) == 'anchor' )
+			if ( item.data( 'cke-realelement' ) && item.data( 'cke-real-element-type' ) == 'anchor' )
 				anchors.push( editor.restoreRealElement( item ) );
 		}
@@ -792,5 +794,5 @@
 					{
 						type : 'vbox',
-						width : 260,
+						width : '100%',
 						align : 'center',
 						padding : 2,
@@ -896,5 +898,5 @@
 											{
 												type :  'text',
-												widths : [ '30%', '70%' ],
+												widths : [ '50%', '50%' ],
 												labelLayout : 'horizontal',
 												label : linkLang.popupWidth,
@@ -907,5 +909,5 @@
 												type :  'text',
 												labelLayout : 'horizontal',
-												widths : [ '55%', '45%' ],
+												widths : [ '50%', '50%' ],
 												label : linkLang.popupLeft,
 												id : 'left',
@@ -923,5 +925,5 @@
 												type :  'text',
 												labelLayout : 'horizontal',
-												widths : [ '30%', '70%' ],
+												widths : [ '50%', '50%' ],
 												label : linkLang.popupHeight,
 												id : 'height',
@@ -934,5 +936,5 @@
 												labelLayout : 'horizontal',
 												label : linkLang.popupTop,
-												widths : [ '55%', '45%' ],
+												widths : [ '50%', '50%' ],
 												id : 'top',
 												setup : setupPopupParams,
@@ -1146,6 +1148,6 @@
 				selection.selectElement( element );
 			else if ( ( element = selection.getSelectedElement() ) && element.is( 'img' )
-					&& element.getAttribute( '_cke_real_element_type' )
-					&& element.getAttribute( '_cke_real_element_type' ) == 'anchor' )
+					&& element.data( 'cke-real-element-type' )
+					&& element.data( 'cke-real-element-type' ) == 'anchor' )
 			{
 				this.fakeObj = element;
@@ -1174,10 +1176,10 @@
 					var protocol = ( data.url && data.url.protocol != undefined ) ? data.url.protocol : 'http://',
 						url = ( data.url && data.url.url ) || '';
-					attributes._cke_saved_href = ( url.indexOf( '/' ) === 0 ) ? url : protocol + url;
+					attributes[ 'data-cke-saved-href' ] = ( url.indexOf( '/' ) === 0 ) ? url : protocol + url;
 					break;
 				case 'anchor':
 					var name = ( data.anchor && data.anchor.name ),
 						id = ( data.anchor && data.anchor.id );
-					attributes._cke_saved_href = '#' + ( name || id || '' );
+					attributes[ 'data-cke-saved-href' ] = '#' + ( name || id || '' );
 					break;
 				case 'email':
@@ -1226,5 +1228,5 @@
 					}
 
-					attributes._cke_saved_href = linkHref.join( '' );
+					attributes[ 'data-cke-saved-href' ] = linkHref.join( '' );
 					break;
 			}
@@ -1254,5 +1256,5 @@
 
 					onclickList.push( featureList.join( ',' ), '\'); return false;' );
-					attributes[ '_cke_pa_onclick' ] = onclickList.join( '' );
+					attributes[ 'data-cke-pa-onclick' ] = onclickList.join( '' );
 
 					// Add the "target" attribute. (#5074)
@@ -1266,5 +1268,5 @@
 						removeAttributes.push( 'target' );
 
-					removeAttributes.push( '_cke_pa_onclick', 'onclick' );
+					removeAttributes.push( 'data-cke-pa-onclick', 'onclick' );
 				}
 			}
@@ -1305,5 +1307,5 @@
 					// Short mailto link text view (#5736).
 					var text = new CKEDITOR.dom.text( data.type == 'email' ?
-							data.email.address : attributes._cke_saved_href, editor.document );
+							data.email.address : attributes[ 'data-cke-saved-href' ], editor.document );
 					ranges[0].insertNode( text );
 					ranges[0].selectNodeContents( text );
@@ -1334,5 +1336,5 @@
 				// We're only editing an existing link, so just overwrite the attributes.
 				var element = this._.selectedElement,
-					href = element.getAttribute( '_cke_saved_href' ),
+					href = element.data( 'cke-saved-href' ),
 					textView = element.getHtml();
 
@@ -1361,5 +1363,5 @@
 					// Short mailto link text view (#5736).
 					element.setHtml( data.type == 'email' ?
-						data.email.address : attributes._cke_saved_href );
+						data.email.address : attributes[ 'data-cke-saved-href' ] );
 				}
 				// Make the element display as an anchor if a name has been set.
Index: /CKEditor/trunk/_source/plugins/link/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/link/plugin.js	(revision 6189)
+++ /CKEditor/trunk/_source/plugins/link/plugin.js	(revision 6190)
@@ -1,3 +1,3 @@
-/*
+﻿/*
 Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
 For licensing, see LICENSE.html or http://ckeditor.com/license
@@ -74,5 +74,5 @@
 					if ( element.is( 'a' ) )
 						evt.data.dialog =  ( element.getAttribute( 'name' ) && !element.getAttribute( 'href' ) ) ? 'anchor' : 'link';
-					else if ( element.is( 'img' ) && element.getAttribute( '_cke_real_element_type' ) == 'anchor' )
+					else if ( element.is( 'img' ) && element.data( 'cke-real-element-type' ) == 'anchor' )
 						evt.data.dialog = 'anchor';
 				}
@@ -117,5 +117,5 @@
 						return null;
 
-					var isAnchor = ( element.is( 'img' ) && element.getAttribute( '_cke_real_element_type' ) == 'anchor' );
+					var isAnchor = ( element.is( 'img' ) && element.data( 'cke-real-element-type' ) == 'anchor' );
 
 					if ( !isAnchor )
Index: /CKEditor/trunk/_source/plugins/menu/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/menu/plugin.js	(revision 6189)
+++ /CKEditor/trunk/_source/plugins/menu/plugin.js	(revision 6190)
@@ -1,3 +1,3 @@
-﻿/*
+/*
 Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
 For licensing, see LICENSE.html or http://ckeditor.com/license
@@ -54,4 +54,5 @@
 			this.editor = editor;
 			this.items = [];
+			this._.listeners = [];
 
 			this._.level = definition.level || 1;
@@ -72,4 +73,82 @@
 		_ :
 		{
+			onShow : function()
+			{
+				var selection = this.editor.getSelection();
+
+				// Selection will be unavailable after menu shows up
+				// in IE, lock it now.
+				if ( CKEDITOR.env.ie )
+					selection && selection.lock();
+
+				var element = selection && selection.getStartElement(),
+					listeners = this._.listeners,
+					includedItems = [];
+
+				this.removeAll();
+				// Call all listeners, filling the list of items to be displayed.
+				for ( var i = 0 ; i < listeners.length ; i++ )
+				{
+					var listenerItems = listeners[ i ]( element, selection );
+
+					if ( listenerItems )
+					{
+						for ( var itemName in listenerItems )
+						{
+							var item = this.editor.getMenuItem( itemName );
+
+							if ( item )
+							{
+								item.state = listenerItems[ itemName ];
+								this.add( item );
+							}
+						}
+					}
+				}
+			},
+
+			onClick : function( item )
+			{
+				this.hide();
+
+				if ( item.onClick )
+					item.onClick();
+				else if ( item.command )
+					this.editor.execCommand( item.command );
+			},
+
+			onEscape : function( keystroke )
+			{
+				var parent = this.parent;
+				// 1. If it's sub-menu, restore the last focused item
+				// of upper level menu.
+				// 2. In case of a top-menu, close it.
+				if ( parent )
+				{
+					parent._.panel.hideChild();
+					// Restore parent block item focus.
+					var parentBlock = parent._.panel._.panel._.currentBlock,
+						parentFocusIndex =  parentBlock._.focusIndex;
+					parentBlock._.markItem( parentFocusIndex );
+				}
+				else if ( keystroke == 27 )
+				{
+					this.hide();
+					this.editor.focus();
+				}
+				return false;
+			},
+
+			onHide : function()
+			{
+				if ( CKEDITOR.env.ie )
+				{
+					var selection = this.editor.getSelection();
+					selection && selection.unlock();
+				}
+
+				this.onHide && this.onHide();
+			},
+
 			showSubMenu : function( index )
 			{
@@ -99,7 +178,5 @@
 								   CKEDITOR.tools.extend( {}, this._.definition, { level : this._.level + 1 }, true ) );
 					menu.parent = this;
-					menu.onClick = CKEDITOR.tools.bind( this.onClick, this );
-					// Sub menu use their own scope for binding onEscape.
-					menu.onEscape = this.onEscape;
+					menu._.onClick = CKEDITOR.tools.bind( this._.onClick, this );
 				}
 
@@ -143,4 +220,15 @@
 			show : function( offsetParent, corner, offsetX, offsetY )
 			{
+				// Not for sub menu.
+				if ( !this.parent )
+				{
+					this._.onShow();
+					// Don't menu with zero items.
+					if ( ! this.items.length )
+						return;
+				}
+
+				corner = corner || ( this.editor.lang.dir == 'rtl' ? 2 : 1 );
+
 				var items = this.items,
 					editor = this.editor,
@@ -158,5 +246,5 @@
 					panel.onEscape = CKEDITOR.tools.bind( function( keystroke )
 					{
-						if ( this.onEscape && this.onEscape( keystroke ) === false )
+						if ( this._.onEscape( keystroke ) === false )
 							return false;
 					},
@@ -165,5 +253,5 @@
 					panel.onHide = CKEDITOR.tools.bind( function()
 					{
-						this.onHide && this.onHide();
+						this._.onHide && this._.onHide();
 					},
 					this );
@@ -214,5 +302,5 @@
 								this._.showSubMenu( index );
 							else
-								this.onClick && this.onClick( item );
+								this._.onClick( item );
 						},
 						this );
@@ -248,4 +336,6 @@
 				element.setHtml( output.join( '' ) );
 
+				CKEDITOR.ui.fire( 'ready', this );
+
 				// Show the panel.
 				if ( this.parent )
@@ -257,6 +347,12 @@
 			},
 
+			addListener : function( listenerFn )
+			{
+				this._.listeners.push( listenerFn );
+			},
+
 			hide : function()
 			{
+				this._.onHide && this._.onHide();
 				this._.panel && this._.panel.hide();
 			}
@@ -278,40 +374,38 @@
 			});
 	}
-})();
-
-CKEDITOR.menuItem = CKEDITOR.tools.createClass(
-{
-	$ : function( editor, name, definition )
+	CKEDITOR.menuItem = CKEDITOR.tools.createClass(
 	{
-		CKEDITOR.tools.extend( this, definition,
-			// Defaults
-			{
-				order : 0,
-				className : 'cke_button_' + name
-			});
-
-		// Transform the group name into its order number.
-		this.group = editor._.menuGroups[ this.group ];
-
-		this.editor = editor;
-		this.name = name;
-	},
-
-	proto :
-	{
-		render : function( menu, index, output )
+		$ : function( editor, name, definition )
 		{
-			var id = menu.id + String( index ),
-				state = ( typeof this.state == 'undefined' ) ? CKEDITOR.TRISTATE_OFF : this.state;
-
-			var classes = ' cke_' + (
-				state == CKEDITOR.TRISTATE_ON ? 'on' :
-				state == CKEDITOR.TRISTATE_DISABLED ? 'disabled' :
-				'off' );
-
-			var htmlLabel = this.label;
-
-			if ( this.className )
-				classes += ' ' + this.className;
+			CKEDITOR.tools.extend( this, definition,
+				// Defaults
+				{
+					order : 0,
+					className : 'cke_button_' + name
+				});
+
+			// Transform the group name into its order number.
+			this.group = editor._.menuGroups[ this.group ];
+
+			this.editor = editor;
+			this.name = name;
+		},
+
+		proto :
+		{
+			render : function( menu, index, output )
+			{
+				var id = menu.id + String( index ),
+					state = ( typeof this.state == 'undefined' ) ? CKEDITOR.TRISTATE_OFF : this.state;
+
+				var classes = ' cke_' + (
+					state == CKEDITOR.TRISTATE_ON ? 'on' :
+					state == CKEDITOR.TRISTATE_DISABLED ? 'disabled' :
+					'off' );
+
+				var htmlLabel = this.label;
+
+				if ( this.className )
+					classes += ' ' + this.className;
 
 			var hasSubMenu = this.getItems;
@@ -330,23 +424,23 @@
 					( state == CKEDITOR.TRISTATE_ON ? 'aria-pressed="true"' : '' ) );
 
-			// Some browsers don't cancel key events in the keydown but in the
-			// keypress.
-			// TODO: Check if really needed for Gecko+Mac.
-			if ( CKEDITOR.env.opera || ( CKEDITOR.env.gecko && CKEDITOR.env.mac ) )
-			{
+				// Some browsers don't cancel key events in the keydown but in the
+				// keypress.
+				// TODO: Check if really needed for Gecko+Mac.
+				if ( CKEDITOR.env.opera || ( CKEDITOR.env.gecko && CKEDITOR.env.mac ) )
+				{
+					output.push(
+						' onkeypress="return false;"' );
+				}
+
+				// With Firefox, we need to force the button to redraw, otherwise it
+				// will remain in the focus state.
+				if ( CKEDITOR.env.gecko )
+				{
+					output.push(
+						' onblur="this.style.cssText = this.style.cssText;"' );
+				}
+
+				var offset = ( this.iconOffset || 0 ) * -16;
 				output.push(
-					' onkeypress="return false;"' );
-			}
-
-			// With Firefox, we need to force the button to redraw, otherwise it
-			// will remain in the focus state.
-			if ( CKEDITOR.env.gecko )
-			{
-				output.push(
-					' onblur="this.style.cssText = this.style.cssText;"' );
-			}
-
-			var offset = ( this.iconOffset || 0 ) * -16;
-			output.push(
 //					' onkeydown="return CKEDITOR.ui.button._.keydown(', index, ', event);"' +
 					' onmouseover="CKEDITOR.tools.callFunction(', menu._.itemOverFn, ',', index, ');"' +
@@ -372,12 +466,15 @@
 			}
 
-			output.push(
-							htmlLabel,
-						'</span>' +
-				'</a>' +
-				'</span>' );
+				output.push(
+								htmlLabel,
+							'</span>' +
+					'</a>' +
+					'</span>' );
 		}
-	}
-});
+		}
+	});
+
+})();
+
 
 /**
Index: /CKEditor/trunk/_source/plugins/menubutton/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/menubutton/plugin.js	(revision 6189)
+++ /CKEditor/trunk/_source/plugins/menubutton/plugin.js	(revision 6190)
@@ -6,5 +6,5 @@
 CKEDITOR.plugins.add( 'menubutton',
 {
-	requires : [ 'button', 'contextmenu' ],
+	requires : [ 'button', 'menu' ],
 	beforeInit : function( editor )
 	{
@@ -36,6 +36,12 @@
 		if ( !menu )
 		{
-			menu = _.menu = new CKEDITOR.plugins.contextMenu( editor );
-			menu.definition.panel.attributes[ 'aria-label' ] = editor.lang.common.options;
+			menu = _.menu = new CKEDITOR.menu( editor,
+			{
+				panel:
+				{
+					className : editor.skinClass + ' cke_contextmenu',
+					attributes : { 'aria-label' : editor.lang.common.options }
+				}
+			});
 
 			menu.onHide = CKEDITOR.tools.bind( function()
Index: /CKEditor/trunk/_source/plugins/panel/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/panel/plugin.js	(revision 6189)
+++ /CKEditor/trunk/_source/plugins/panel/plugin.js	(revision 6190)
@@ -1,3 +1,3 @@
-﻿/*
+/*
 Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
 For licensing, see LICENSE.html or http://ckeditor.com/license
@@ -137,10 +137,4 @@
 					langCode = parentDiv.getParent().getAttribute( 'lang' ),
 					doc = iframe.getFrameDocument();
-				// Initialize the IFRAME document body.
-				doc.$.open();
-
-				// Support for custom document.domain in IE.
-				if ( CKEDITOR.env.isCustomDomain() )
-					doc.$.domain = document.domain;
 
 				var onLoad = CKEDITOR.tools.addFunction( CKEDITOR.tools.bind( function( ev )
@@ -151,5 +145,5 @@
 					}, this ) );
 
-				doc.$.write(
+				var data =
 					'<!DOCTYPE html>' +
 					'<html dir="' + dir + '" class="' + className + '_container" lang="' + langCode + '">' +
@@ -163,6 +157,7 @@
 						// available. (#3031)
 						CKEDITOR.tools.buildStyleHtml( this.css ) +
-					'<\/html>' );
-				doc.$.close();
+					'<\/html>';
+
+				doc.write( data );
 
 				var win = doc.getWindow();
@@ -195,4 +190,5 @@
 				holder = doc.getBody();
 				holder.unselectable();
+				CKEDITOR.env.air && CKEDITOR.tools.callFunction( onLoad );
 			}
 			else
Index: /CKEditor/trunk/_source/plugins/pastetext/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/pastetext/plugin.js	(revision 6189)
+++ /CKEditor/trunk/_source/plugins/pastetext/plugin.js	(revision 6190)
@@ -38,18 +38,4 @@
 	};
 
-	function doInsertText( doc, text )
-	{
-		// Native text insertion.
-		if ( CKEDITOR.env.ie )
-		{
-			var selection = doc.selection;
-			if ( selection.type == 'Control' )
-				selection.clear();
-			selection.createRange().pasteHTML( text );
-		}
-		else
-			doc.execCommand( 'inserthtml', false, text );
-	}
-
 	// Register the plugin.
 	CKEDITOR.plugins.add( 'pastetext',
@@ -85,50 +71,4 @@
 	});
 
-	function doEnter( editor, mode, times, forceMode )
-	{
-		while ( times-- )
-		{
-			CKEDITOR.plugins.enterkey[ mode == CKEDITOR.ENTER_BR ? 'enterBr' : 'enterBlock' ]
-					( editor, mode, null, forceMode );
-		}
-	}
-
-	CKEDITOR.editor.prototype.insertText = function( text )
-	{
-		this.focus();
-		this.fire( 'saveSnapshot' );
-
-		var mode = this.getSelection().getStartElement().hasAscendant( 'pre', true ) ? CKEDITOR.ENTER_BR : this.config.enterMode,
-			isEnterBrMode = mode == CKEDITOR.ENTER_BR,
-			doc = this.document.$,
-			self = this,
-			line;
-
-		text = CKEDITOR.tools.htmlEncode( text.replace( /\r\n|\r/g, '\n' ) );
-
-		var startIndex = 0;
-		text.replace( /\n+/g, function( match, lastIndex )
-		 {
-			line = text.substring( startIndex, lastIndex );
-			startIndex = lastIndex + match.length;
-			line.length && doInsertText( doc, line );
-
-			var lineBreakNums = match.length,
-				// Duo consequence line-break as a enter block.
-				enterBlockTimes = isEnterBrMode ? 0 : Math.floor( lineBreakNums / 2 ),
-				// Per link-break as a enter br.
-				enterBrTimes = isEnterBrMode ? lineBreakNums : lineBreakNums % 2;
-
-			// Line-breaks are converted to editor enter key strokes.
-			doEnter( self, mode, enterBlockTimes );
-			doEnter( self, CKEDITOR.ENTER_BR, enterBrTimes, isEnterBrMode ? false : true );
-		 });
-
-		// Insert the last text line of text.
-		line = text.substring( startIndex, text.length );
-		line.length && doInsertText( doc, line );
-
-		this.fire( 'saveSnapshot' );
-	};
 })();
 
Index: /CKEditor/trunk/_source/plugins/placeholder/dialogs/placeholder.js
===================================================================
--- /CKEditor/trunk/_source/plugins/placeholder/dialogs/placeholder.js	(revision 6190)
+++ /CKEditor/trunk/_source/plugins/placeholder/dialogs/placeholder.js	(revision 6190)
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.html or http://ckeditor.com/license
+ */
+
+(function()
+{
+	function placeholderDialog( editor, isEdit )
+	{
+
+		var lang = editor.lang.placeholder,
+			generalLabel = editor.lang.common.generalTab;
+		return {
+			title : lang.title,
+			minWidth : 300,
+			minHeight : 80,
+			contents :
+			[
+				{
+					id : 'info',
+					label : generalLabel,
+					title : generalLabel,
+					elements :
+					[
+						{
+							id : 'text',
+							type : 'text',
+							style : 'width: 100%;',
+							label : lang.text,
+							'default' : '',
+							required : true,
+							validate : CKEDITOR.dialog.validate.notEmpty( lang.textMissing ),
+							setup : function( element )
+							{
+								if ( isEdit )
+									this.setValue( element.getText().slice( 2, -2 ) );
+							},
+							commit : function( element )
+							{
+								var text = '[[' + this.getValue() + ']]';
+								// The placeholder must be recreated.
+								CKEDITOR.plugins.placeholder.createPlaceholder( editor, element, text );
+							}
+						}
+					]
+				}
+			],
+			onShow : function()
+			{
+				if ( isEdit )
+				{
+					var range = editor.getSelection().getRanges()[0];
+					range.shrink( CKEDITOR.SHRINK_TEXT );
+					var node = range.startContainer;
+					while( node && !( node.type == CKEDITOR.NODE_ELEMENT && node.data( 'cke-placeholder' ) ) )
+						node = node.getParent();
+					this._element = node;
+				}
+
+				this.setupContent( this._element );
+			},
+			onOk : function()
+			{
+				this.commitContent( this._element );
+				delete this._element;
+			}
+		};
+	}
+
+	CKEDITOR.dialog.add( 'createplaceholder', function( editor )
+		{
+			return placeholderDialog( editor );
+		});
+	CKEDITOR.dialog.add( 'editplaceholder', function( editor )
+		{
+			return placeholderDialog( editor, 1 );
+		});
+} )();
Index: /CKEditor/trunk/_source/plugins/placeholder/lang/en.js
===================================================================
--- /CKEditor/trunk/_source/plugins/placeholder/lang/en.js	(revision 6190)
+++ /CKEditor/trunk/_source/plugins/placeholder/lang/en.js	(revision 6190)
@@ -0,0 +1,16 @@
+/*
+Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang( 'placeholder', 'en',
+{
+	placeholder :
+	{
+		title		: 'Placeholder Properties',
+		toolbar		: 'Create Placeholder',
+		text		: 'Placeholder Text',
+		edit		: 'Edit Placeholder',
+		textMissing	: 'The placeholder must contain text.'
+	}
+});
Index: /CKEditor/trunk/_source/plugins/placeholder/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/placeholder/plugin.js	(revision 6190)
+++ /CKEditor/trunk/_source/plugins/placeholder/plugin.js	(revision 6190)
@@ -0,0 +1,160 @@
+/*
+Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+/**
+ * @fileOverview The "placeholder" plugin.
+ *
+ */
+
+(function()
+{
+	var placeholderReplaceRegex = /\[\[[^\]]+\]\]/g;
+	CKEDITOR.plugins.add( 'placeholder',
+	{
+		requires : [ 'dialog' ],
+		lang : [ 'en' ],
+		init : function( editor )
+		{
+			var lang = editor.lang.placeholder;
+
+			editor.addCommand( 'createplaceholder', new CKEDITOR.dialogCommand( 'createplaceholder' ) );
+			editor.addCommand( 'editplaceholder', new CKEDITOR.dialogCommand( 'editplaceholder' ) );
+
+			editor.ui.addButton( 'CreatePlaceholder',
+			{
+				label : lang.toolbar,
+				command :'createplaceholder',
+				icon : this.path + 'placeholder.gif'
+			});
+
+			if ( editor.addMenuItems )
+			{
+				editor.addMenuGroup( 'placeholder', 20 );
+				editor.addMenuItems(
+					{
+						editplaceholder :
+						{
+							label : lang.edit,
+							command : 'editplaceholder',
+							group : 'placeholder',
+							order : 1,
+							icon : this.path + 'placeholder.gif'
+						}
+					} );
+
+				if ( editor.contextMenu )
+				{
+					editor.contextMenu.addListener( function( element, selection )
+						{
+							if ( !element || !element.data( 'cke-placeholder' ) )
+								return null;
+
+							return { editplaceholder : CKEDITOR.TRISTATE_OFF };
+						} );
+				}
+			}
+
+			editor.on( 'doubleclick', function( evt )
+				{
+					var element = evt.data.element;
+					if ( element.data( 'cke-placeholder' ) )
+						evt.data.dialog = 'editplaceholder';
+				});
+
+			editor.addCss(
+				'.cke_placeholder' + 
+				'{' + 
+					'background-color: #ffff00;' + 
+					( CKEDITOR.env.gecko ? 'cursor: default;' : '' ) +
+				'}'
+			);
+
+			editor.on( 'contentDom', function()
+				{
+					editor.document.getBody().on( 'resizestart', function( evt )
+						{
+							if ( editor.getSelection().getSelectedElement().data( 'cke-placeholder' ) )
+								evt.data.preventDefault();
+						});
+				});
+
+			CKEDITOR.dialog.add( 'createplaceholder', this.path + 'dialogs/placeholder.js' );
+			CKEDITOR.dialog.add( 'editplaceholder', this.path + 'dialogs/placeholder.js' );
+		},
+		afterInit : function( editor )
+		{
+			var dataProcessor = editor.dataProcessor,
+				dataFilter = dataProcessor && dataProcessor.dataFilter,
+				htmlFilter = dataProcessor && dataProcessor.htmlFilter;
+
+			if ( dataFilter )
+			{
+				dataFilter.addRules(
+				{
+					text : function( text )
+					{
+						return text.replace( placeholderReplaceRegex, function( match )
+							{
+								return CKEDITOR.plugins.placeholder.createPlaceholder( editor, null, match, 1 );
+							});
+					}
+				});
+			}
+
+			if ( htmlFilter )
+			{
+				htmlFilter.addRules(
+				{
+					elements :
+					{
+						'span' : function( element )
+						{
+							if ( element.attributes && element.attributes[ 'data-cke-placeholder' ] )
+								delete element.name;
+						}
+					}
+				});
+			}
+		}
+	});
+})();
+
+CKEDITOR.plugins.placeholder = 
+{
+	createPlaceholder : function( editor, oldElement, text, isGet )
+	{
+		var element = new CKEDITOR.dom.element( 'span', editor.document );
+		element.setAttributes(
+			{
+				contentEditable		: 'false',
+				'data-cke-placeholder'	: 1,
+				'class'			: 'cke_placeholder'
+			}
+		);
+
+		text && element.setText( text );
+
+		if ( isGet )
+			return element.getOuterHtml();
+
+		if ( oldElement )
+		{
+			if ( CKEDITOR.env.ie )
+			{
+				element.insertAfter( oldElement );
+				// Some time is required for IE before the element is removed.
+				setTimeout( function()
+					{
+						oldElement.remove();
+						element.focus();
+					}, 10 );
+			}
+			else
+				element.replace( oldElement );
+		}
+		else
+			editor.insertElement( element );
+	}
+};
Index: /CKEditor/trunk/_source/plugins/removeformat/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/removeformat/plugin.js	(revision 6189)
+++ /CKEditor/trunk/_source/plugins/removeformat/plugin.js	(revision 6190)
@@ -99,5 +99,5 @@
 						// This node must not be a fake element.
 						if ( !( currentNode.getName() == 'img'
-							&& currentNode.getAttribute( '_cke_realelement' ) )
+							&& currentNode.data( 'cke-realelement' ) )
 							&& filter( editor, currentNode ) )
 						{
Index: /CKEditor/trunk/_source/plugins/richcombo/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/richcombo/plugin.js	(revision 6189)
+++ /CKEditor/trunk/_source/plugins/richcombo/plugin.js	(revision 6190)
@@ -107,6 +107,5 @@
 					}
 
-					!_.committed && this.commit();
-
+					this.commit();
 					var value = this.getValue();
 					if ( value )
@@ -198,5 +197,5 @@
 							'<span id="' + id + '_text" class="cke_text cke_inline_label">' + this.label + '</span>' +
 						'</span>' +
-						'<span class=cke_openbutton>' + ( CKEDITOR.env.hc ? '<span>&#9660;</span>' : '' ) + '</span>' +	// BLACK DOWN-POINTING TRIANGLE
+						'<span class=cke_openbutton>' + ( CKEDITOR.env.hc ? '<span>&#9660;</span>' : CKEDITOR.env.air ?  '&nbsp;' : '' ) + '</span>' +	// BLACK DOWN-POINTING TRIANGLE
 					'</a>' +
 				'</span>' +
@@ -346,5 +345,10 @@
 		commit : function()
 		{
-			this._.list.commit();
+			if ( !this._.committed )
+			{
+				this._.list.commit();
+				this._.committed = 1;
+				CKEDITOR.ui.fire( 'ready', this );
+			}
 			this._.committed = 1;
 		},
Index: /CKEditor/trunk/_source/plugins/scayt/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/scayt/plugin.js	(revision 6189)
+++ /CKEditor/trunk/_source/plugins/scayt/plugin.js	(revision 6190)
@@ -1,3 +1,3 @@
-﻿/*
+/*
 Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
 For licensing, see LICENSE.html or http://ckeditor.com/license
@@ -359,6 +359,6 @@
 		loadEngine : function( editor )
 		{
-			// SCAYT doesn't work with Firefox2, Opera.
-			if ( CKEDITOR.env.gecko && CKEDITOR.env.version < 10900 || CKEDITOR.env.opera )
+			// SCAYT doesn't work with Firefox2, Opera and AIR.
+			if ( CKEDITOR.env.gecko && CKEDITOR.env.version < 10900 || CKEDITOR.env.opera || CKEDITOR.env.air )
 				return editor.fire( 'showScaytState' );
 
@@ -758,5 +758,5 @@
 					editor.removeListener( 'showScaytState', showInitialState );
 
-					if ( !CKEDITOR.env.opera )
+					if ( !CKEDITOR.env.opera && !CKEDITOR.env.air )
 						command.setState( plugin.isScaytEnabled( editor ) ? CKEDITOR.TRISTATE_ON : CKEDITOR.TRISTATE_OFF );
 					else
@@ -766,5 +766,5 @@
 			editor.on( 'showScaytState', showInitialState );
 
-			if ( CKEDITOR.env.opera )
+			if ( CKEDITOR.env.opera || CKEDITOR.env.air )
 			{
 				editor.on( 'instanceReady', function()
Index: /CKEditor/trunk/_source/plugins/showblocks/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/showblocks/plugin.js	(revision 6189)
+++ /CKEditor/trunk/_source/plugins/showblocks/plugin.js	(revision 6190)
@@ -148,5 +148,6 @@
 /**
  * Whether to automaticaly enable the "show block" command when the editor
- * loads.
+ * loads. (StartupShowBlocks in FCKeditor)
+ * @name CKEDITOR.config.startupOutlineBlocks
  * @type Boolean
  * @default false
Index: /CKEditor/trunk/_source/plugins/showborders/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/showborders/plugin.js	(revision 6189)
+++ /CKEditor/trunk/_source/plugins/showborders/plugin.js	(revision 6190)
@@ -195,4 +195,6 @@
 /**
  * Whether to automatically enable the "show borders" command when the editor loads.
+ * (ShowBorders in FCKeditor)
+ * @name CKEDITOR.config.startupShowBorders
  * @type Boolean
  * @default true
Index: /CKEditor/trunk/_source/plugins/smiley/dialogs/smiley.js
===================================================================
--- /CKEditor/trunk/_source/plugins/smiley/dialogs/smiley.js	(revision 6189)
+++ /CKEditor/trunk/_source/plugins/smiley/dialogs/smiley.js	(revision 6190)
@@ -35,5 +35,5 @@
 				{
 					src : src,
-					_cke_saved_src : src,
+					'data-cke-saved-src' : src,
 					title : title,
 					alt : title,
Index: /CKEditor/trunk/_source/plugins/specialchar/dialogs/specialchar.js
===================================================================
--- /CKEditor/trunk/_source/plugins/specialchar/dialogs/specialchar.js	(revision 6189)
+++ /CKEditor/trunk/_source/plugins/specialchar/dialogs/specialchar.js	(revision 6190)
@@ -13,30 +13,4 @@
 		lang = editor.lang.specialChar;
 
-	var insertSpecialChar = function ( specialChar )
-	{
-		var selection = editor.getSelection(),
-			ranges = selection.getRanges( true ),
-			range, textNode;
-
-		editor.fire( 'saveSnapshot' );
-
-		for ( var i = ranges.length - 1; i >= 0 ; i-- )
-		{
-			range = ranges[ i ];
-			range.deleteContents();
-
-			textNode = CKEDITOR.dom.element.createFromHtml( specialChar );
-			range.insertNode( textNode );
-		}
-
-		if ( range )
-		{
-			range.moveToPosition( textNode, CKEDITOR.POSITION_AFTER_END );
-			range.select();
-		}
-
-		editor.fire( 'saveSnapshot' );
-	};
-
 	var onChoice = function( evt )
 	{
@@ -52,9 +26,5 @@
 			dialog.hide();
 
-			// Firefox has bug on insert chars into a element use its own API. (#5170)
-			if ( CKEDITOR.env.gecko )
-				insertSpecialChar( value );
-			else
-				editor.insertHtml( value );
+			editor.insertText( value );
 		}
 	};
@@ -223,46 +193,9 @@
 		buttons : [ CKEDITOR.dialog.cancelButton ],
 		charColumns : 17,
-		chars :
-			[
-				'!','&quot;','#','$','%','&amp;',"'",'(',')','*','+','-','.','/',
-				'0','1','2','3','4','5','6','7','8','9',':',';',
-				'&lt;','=','&gt;','?','@',
-				'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O',
-				'P','Q','R','S','T','U','V','W','X','Y','Z',
-				'[',']','^','_','`',
-				'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p',
-				'q','r','s','t','u','v','w','x','y','z',
-				'{','|','}','~','&euro;(EURO SIGN)','&lsquo;(LEFT SINGLE QUOTATION MARK)','&rsquo;(RIGHT SINGLE QUOTATION MARK)','&ldquo;(LEFT DOUBLE QUOTATION MARK)',
-				'&rdquo;(RIGHT DOUBLE QUOTATION MARK)','&ndash;(EN DASH)','&mdash;(EM DASH)','&iexcl;(INVERTED EXCLAMATION MARK)','&cent;(CENT SIGN)','&pound;(POUND SIGN)',
-				'&curren;(CURRENCY SIGN)','&yen;(YEN SIGN)','&brvbar;(BROKEN BAR)','&sect;(SECTION SIGN)','&uml;(DIAERESIS)','&copy;(COPYRIGHT SIGN)','&ordf;(FEMININE ORDINAL INDICATOR)',
-				'&laquo;(LEFT-POINTING DOUBLE ANGLE QUOTATION MARK)','&not;(NOT SIGN)','&reg;(REGISTERED SIGN)','&macr;(MACRON)','&deg;(DEGREE SIGN)','&plusmn;(PLUS-MINUS SIGN)','&sup2;(SUPERSCRIPT TWO)',
-				'&sup3;(SUPERSCRIPT THREE)','&acute;(ACUTE ACCENT)','&micro;(MICRO SIGN)','&para;(PILCROW SIGN)','&middot;(MIDDLE DOT)','&cedil;(CEDILLA)',
-				'&sup1;(SUPERSCRIPT ONE)','&ordm;(MASCULINE ORDINAL INDICATOR)','&raquo;(RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK)','&frac14;(VULGAR FRACTION ONE QUARTER)','&frac12;(VULGAR FRACTION ONE HALF)','&frac34;(VULGAR FRACTION THREE QUARTERS)',
-				'&iquest;(INVERTED QUESTION MARK)','&Agrave;(LATIN CAPITAL LETTER A WITH GRAVE)','&Aacute;(LATIN CAPITAL LETTER A WITH ACUTE)','&Acirc;(LATIN CAPITAL LETTER A WITH CIRCUMFLEX)','&Atilde;(LATIN CAPITAL LETTER A WITH TILDE)','&Auml;(LATIN CAPITAL LETTER A WITH DIAERESIS)',
-				'&Aring;(LATIN CAPITAL LETTER A WITH RING ABOVE)','&AElig;(LATIN CAPITAL LETTER AE)','&Ccedil;(LATIN CAPITAL LETTER C WITH CEDILLA)','&Egrave;(LATIN CAPITAL LETTER E WITH GRAVE)','&Eacute;(LATIN CAPITAL LETTER E WITH ACUTE)','&Ecirc;(LATIN CAPITAL LETTER E WITH CIRCUMFLEX)',
-				'&Euml;(LATIN CAPITAL LETTER E WITH DIAERESIS)','&Igrave;(LATIN CAPITAL LETTER I WITH GRAVE)','&Iacute;(LATIN CAPITAL LETTER I WITH ACUTE)','&Icirc;(LATIN CAPITAL LETTER I WITH CIRCUMFLEX)','&Iuml;(LATIN CAPITAL LETTER I WITH DIAERESIS)','&ETH;(LATIN CAPITAL LETTER ETH)',
-				'&Ntilde;(LATIN CAPITAL LETTER N WITH TILDE)','&Ograve;(LATIN CAPITAL LETTER O WITH GRAVE)','&Oacute;(LATIN CAPITAL LETTER O WITH ACUTE)','&Ocirc;(LATIN CAPITAL LETTER O WITH CIRCUMFLEX)','&Otilde;(LATIN CAPITAL LETTER O WITH TILDE)','&Ouml;(LATIN CAPITAL LETTER O WITH DIAERESIS)',
-				'&times;(MULTIPLICATION SIGN)','&Oslash;(LATIN CAPITAL LETTER O WITH STROKE)','&Ugrave;(LATIN CAPITAL LETTER U WITH GRAVE)','&Uacute;(LATIN CAPITAL LETTER U WITH ACUTE)','&Ucirc;(LATIN CAPITAL LETTER U WITH CIRCUMFLEX)','&Uuml;(LATIN CAPITAL LETTER U WITH DIAERESIS)',
-				'&Yacute;(LATIN CAPITAL LETTER Y WITH ACUTE)','&THORN;(LATIN CAPITAL LETTER THORN)','&szlig;(LATIN SMALL LETTER SHARP S)','&agrave;(LATIN SMALL LETTER A WITH GRAVE)','&aacute;(LATIN SMALL LETTER A WITH ACUTE)','&acirc;(LATIN SMALL LETTER A WITH CIRCUMFLEX)',
-				'&atilde;(LATIN SMALL LETTER A WITH TILDE)','&auml;(LATIN SMALL LETTER A WITH DIAERESIS)','&aring;(LATIN SMALL LETTER A WITH RING ABOVE)','&aelig;(LATIN SMALL LETTER AE)','&ccedil;(LATIN SMALL LETTER C WITH CEDILLA)','&egrave;(LATIN SMALL LETTER E WITH GRAVE)',
-				'&eacute;(LATIN SMALL LETTER E WITH ACUTE)','&ecirc;(LATIN SMALL LETTER E WITH CIRCUMFLEX)','&euml;(LATIN SMALL LETTER E WITH DIAERESIS)','&igrave;(LATIN SMALL LETTER I WITH GRAVE)','&iacute;(LATIN SMALL LETTER I WITH ACUTE)','&icirc;(LATIN SMALL LETTER I WITH CIRCUMFLEX)',
-				'&iuml;(LATIN SMALL LETTER I WITH DIAERESIS)','&eth;(LATIN SMALL LETTER ETH)','&ntilde;(LATIN SMALL LETTER N WITH TILDE)','&ograve;(LATIN SMALL LETTER O WITH GRAVE)','&oacute;(LATIN SMALL LETTER O WITH ACUTE)','&ocirc;(LATIN SMALL LETTER O WITH CIRCUMFLEX)',
-				'&otilde;(LATIN SMALL LETTER O WITH TILDE)','&ouml;(LATIN SMALL LETTER O WITH DIAERESIS)',
-				'&divide;(DIVISION SIGN)','&oslash;(LATIN SMALL LETTER O WITH STROKE)',
-				'&ugrave;(LATIN SMALL LETTER U WITH GRAVE)','&uacute;(LATIN SMALL LETTER U WITH ACUTE)',
-				'&ucirc;(LATIN SMALL LETTER U WITH CIRCUMFLEX)','&uuml;(LATIN SMALL LETTER U WITH DIAERESIS)',
-				'&uuml;(LATIN SMALL LETTER U WITH DIAERESIS)','&yacute;(LATIN SMALL LETTER Y WITH ACUTE)','&thorn;(LATIN SMALL LETTER THORN)','&yuml;(LATIN SMALL LETTER Y WITH DIAERESIS)',
-				'&OElig;(LATIN CAPITAL LIGATURE OE)',
-				'&oelig;(LATIN SMALL LIGATURE OE)','&#372;(LATIN CAPITAL LETTER W WITH CIRCUMFLEX)',
-				'&#374(LATIN CAPITAL LETTER Y WITH CIRCUMFLEX)','&#373(LATIN SMALL LETTER W WITH CIRCUMFLEX)',
-				'&#375;(LATIN SMALL LETTER Y WITH CIRCUMFLEX)','&sbquo;(SINGLE LOW-9 QUOTATION MARK)',
-				'&#8219;(SINGLE HIGH-REVERSED-9 QUOTATION MARK)','&bdquo;(DOUBLE LOW-9 QUOTATION MARK)','&hellip;(HORIZONTAL ELLIPSIS)',
-				'&trade;(TRADE MARK SIGN)','&#9658;(BLACK RIGHT-POINTING POINTER)','&bull;(BULLET)',
-				'&rarr;(RIGHTWARDS ARROW)','&rArr;(RIGHTWARDS DOUBLE ARROW)','&hArr;(LEFT RIGHT DOUBLE ARROW)','&diams;(BLACK DIAMOND SUIT)','&asymp;(ALMOST EQUAL TO)'
-			],
 		onLoad :  function()
 		{
 			var columns = this.definition.charColumns,
-				chars = this.definition.chars;
+				extraChars = editor.config.extraSpecialChars,
+				chars = editor.config.specialChars;
 
 			var charsTableLabel =  CKEDITOR.tools.getNextId() + '_specialchar_table_label';
@@ -285,12 +218,17 @@
 					{
 						charDesc = '';
-						character = character.replace( /\((.*?)\)/, function( match, desc )
-							{
-								charDesc = desc;
-								return '';
-							} );
-
-						// Use character in case description unavailable.
-						charDesc = charDesc || character;
+						
+						if ( character instanceof Array )
+						{
+							charDesc = character[ 1 ];
+							character = character[ 0 ];
+						}
+						else
+						{
+							var _tmpName = character.toLowerCase().replace( '&', '' ).replace( ';', '' ).replace( '#', '' );
+
+							// Use character in case description unavailable.
+							charDesc = lang[ _tmpName ] || character;
+						}
 
 						var charLabelId =  'cke_specialchar_label_' + i + '_' + CKEDITOR.tools.getNextNumber();
Index: /CKEditor/trunk/_source/plugins/specialchar/lang/en.js
===================================================================
--- /CKEditor/trunk/_source/plugins/specialchar/lang/en.js	(revision 6190)
+++ /CKEditor/trunk/_source/plugins/specialchar/lang/en.js	(revision 6190)
@@ -0,0 +1,89 @@
+
+CKEDITOR.plugins.setLang( 'specialchar', 'en',
+{
+	euro: "EURO SIGN",
+	lsquo: "LEFT SINGLE QUOTATION MARK",
+	rsquo: "RIGHT SINGLE QUOTATION MARK",
+	ldquo: "LEFT DOUBLE QUOTATION MARK",
+	rdquo: "RIGHT DOUBLE QUOTATION MARK",
+	ndash: "EN DASH",
+	mdash: "EM DASH",
+	iexcl: "INVERTED EXCLAMATION MARK",
+	cent: "CENT SIGN",
+	pound: "POUND SIGN",
+	curren: "CURRENCY SIGN",
+	yen: "YEN SIGN",
+	brvbar: "BROKEN BAR",
+	sect: "SECTION SIGN",
+	uml: "DIAERESIS",
+	copy: "COPYRIGHT SIGN",
+	ordf: "FEMININE ORDINAL INDICATOR",
+	laquo: "LEFT-POINTING DOUBLE ANGLE QUOTATION MARK",
+	not: "NOT SIGN",
+	reg: "REGISTERED SIGN",
+	macr: "MACRON",
+	deg: "DEGREE SIGN",
+	sup2: "SUPERSCRIPT TWO",
+	sup3: "SUPERSCRIPT THREE",
+	acute: "ACUTE ACCENT",
+	micro: "MICRO SIGN",
+	para: "PILCROW SIGN",
+	middot: "MIDDLE DOT",
+	cedil: "CEDILLA",
+	sup1: "SUPERSCRIPT ONE",
+	ordm: "MASCULINE ORDINAL INDICATOR",
+	frac14: "VULGAR FRACTION ONE QUARTER",
+	frac12: "VULGAR FRACTION ONE HALF",
+	frac34: "VULGAR FRACTION THREE QUARTERS",
+	iquest: "INVERTED QUESTION MARK",
+	agrave: "LATIN SMALL LETTER A WITH GRAVE",
+	aacute: "LATIN SMALL LETTER A WITH ACUTE",
+	acirc: "LATIN SMALL LETTER A WITH CIRCUMFLEX",
+	atilde: "LATIN SMALL LETTER A WITH TILDE",
+	auml: "LATIN SMALL LETTER A WITH DIAERESIS",
+	aring: "LATIN SMALL LETTER A WITH RING ABOVE",
+	aelig: "LATIN SMALL LETTER AE",
+	ccedil: "LATIN SMALL LETTER C WITH CEDILLA",
+	egrave: "LATIN SMALL LETTER E WITH GRAVE",
+	eacute: "LATIN SMALL LETTER E WITH ACUTE",
+	ecirc: "LATIN SMALL LETTER E WITH CIRCUMFLEX",
+	euml: "LATIN SMALL LETTER E WITH DIAERESIS",
+	igrave: "LATIN SMALL LETTER I WITH GRAVE",
+	iacute: "LATIN SMALL LETTER I WITH ACUTE",
+	icirc: "LATIN SMALL LETTER I WITH CIRCUMFLEX",
+	iuml: "LATIN SMALL LETTER I WITH DIAERESIS",
+	eth: "LATIN SMALL LETTER ETH",
+	ntilde: "LATIN SMALL LETTER N WITH TILDE",
+	ograve: "LATIN SMALL LETTER O WITH GRAVE",
+	oacute: "LATIN SMALL LETTER O WITH ACUTE",
+	ocirc: "LATIN SMALL LETTER O WITH CIRCUMFLEX",
+	otilde: "LATIN SMALL LETTER O WITH TILDE",
+	ouml: "LATIN SMALL LETTER O WITH DIAERESIS",
+	times: "MULTIPLICATION SIGN",
+	oslash: "LATIN SMALL LETTER O WITH STROKE",
+	ugrave: "LATIN SMALL LETTER U WITH GRAVE",
+	uacute: "LATIN SMALL LETTER U WITH ACUTE",
+	ucirc: "LATIN SMALL LETTER U WITH CIRCUMFLEX",
+	uuml: "LATIN SMALL LETTER U WITH DIAERESIS",
+	yacute: "LATIN SMALL LETTER Y WITH ACUTE",
+	thorn: "LATIN SMALL LETTER THORN",
+	szlig: "LATIN SMALL LETTER SHARP S",
+	divide: "DIVISION SIGN",
+	yuml: "LATIN SMALL LETTER Y WITH DIAERESIS",
+	oelig: "LATIN SMALL LIGATURE OE",
+	'372': "LATIN CAPITAL LETTER W WITH CIRCUMFLEX",
+	'374': "LATIN CAPITAL LETTER Y WITH CIRCUMFLEX",
+	'373': "LATIN SMALL LETTER W WITH CIRCUMFLEX",
+	'375': "LATIN SMALL LETTER Y WITH CIRCUMFLEX",
+	8219: "SINGLE HIGH-REVERSED-9 QUOTATION MARK",
+	bdquo: "DOUBLE LOW-9 QUOTATION MARK",
+	hellip: "HORIZONTAL ELLIPSIS",
+	trade: "TRADE MARK SIGN",
+	'9658': "BLACK RIGHT-POINTING POINTER",
+	bull: "BULLET",
+	rarr: "RIGHTWARDS DOUBLE ARROW",
+	harr: "LEFT RIGHT DOUBLE ARROW",
+	diams: "BLACK DIAMOND SUIT",
+	asymp: "ALMOST EQUAL TO",
+	sbquo: 'SINGLE LOW-9 QUOTATION MARK'
+});
Index: /CKEditor/trunk/_source/plugins/specialchar/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/specialchar/plugin.js	(revision 6189)
+++ /CKEditor/trunk/_source/plugins/specialchar/plugin.js	(revision 6190)
@@ -10,13 +10,33 @@
 CKEDITOR.plugins.add( 'specialchar',
 {
+	// List of available localizations.
+	availableLangs : { en:1 },
+	
 	init : function( editor )
 	{
-		var pluginName = 'specialchar';
+		var pluginName = 'specialchar',
+			plugin = this;
 
 		// Register the dialog.
 		CKEDITOR.dialog.add( pluginName, this.path + 'dialogs/specialchar.js' );
 
-		// Register the command.
-		editor.addCommand( pluginName, new CKEDITOR.dialogCommand( pluginName ) );
+		editor.addCommand( pluginName,
+			{
+				exec : function()
+				{
+					var langCode = editor.langCode;
+					langCode = plugin.availableLangs[ langCode ] ? langCode : 'en';
+
+					CKEDITOR.scriptLoader.load(
+							CKEDITOR.getUrl( plugin.path + 'lang/' + langCode + '.js' ),
+							function()
+							{
+								CKEDITOR.tools.extend( editor.lang.specialChar, plugin.lang[ langCode ] );
+								editor.openDialog( pluginName );
+							});
+				},
+				modes : { wysiwyg:1 },
+				canUndo : false
+			});
 
 		// Register the toolbar button.
@@ -28,2 +48,23 @@
 	}
 } );
+
+/**
+  * The list of special characters visible in Special Character dialog.
+  * @type Array
+  * @example
+  * config.specialChars = [ '&quot;', '&rsquo;', [ '&custom;', 'Custom label' ] ];
+  * config.specialChars = config.specialChars.concat( [ '&quot;', [ '&rsquo;', 'Custom label' ] ] );
+  */
+CKEDITOR.config.specialChars = 
+	[
+		'!','&quot;','#','$','%','&amp;',"'",'(',')','*','+','-','.','/',
+		'0','1','2','3','4','5','6','7','8','9',':',';',
+		'&lt;','=','&gt;','?','@',
+		'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O',
+		'P','Q','R','S','T','U','V','W','X','Y','Z',
+		'[',']','^','_','`',
+		'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p',
+		'q','r','s','t','u','v','w','x','y','z',
+		'{','|','}','~',
+		"&euro;", "&lsquo;", "&rsquo;", "&ldquo;", "&rdquo;", "&ndash;", "&mdash;", "&iexcl;", "&cent;", "&pound;", "&curren;", "&yen;", "&brvbar;", "&sect;", "&uml;", "&copy;", "&ordf;", "&laquo;", "&not;", "&reg;", "&macr;", "&deg;", "&", "&sup2;", "&sup3;", "&acute;", "&micro;", "&para;", "&middot;", "&cedil;", "&sup1;", "&ordm;", "&", "&frac14;", "&frac12;", "&frac34;", "&iquest;", "&Agrave;", "&Aacute;", "&Acirc;", "&Atilde;", "&Auml;", "&Aring;", "&AElig;", "&Ccedil;", "&Egrave;", "&Eacute;", "&Ecirc;", "&Euml;", "&Igrave;", "&Iacute;", "&Icirc;", "&Iuml;", "&ETH;", "&Ntilde;", "&Ograve;", "&Oacute;", "&Ocirc;", "&Otilde;", "&Ouml;", "&times;", "&Oslash;", "&Ugrave;", "&Uacute;", "&Ucirc;", "&Uuml;", "&Yacute;", "&THORN;", "&szlig;", "&agrave;", "&aacute;", "&acirc;", "&atilde;", "&auml;", "&aring;", "&aelig;", "&ccedil;", "&egrave;", "&eacute;", "&ecirc;", "&euml;", "&igrave;", "&iacute;", "&icirc;", "&iuml;", "&eth;", "&ntilde;", "&ograve;", "&oacute;", "&ocirc;", "&otilde;", "&ouml;", "&divide;", "&oslash;", "&ugrave;", "&uacute;", "&ucirc;", "&uuml;", "&uuml;", "&yacute;", "&thorn;", "&yuml;", "&OElig;", "&oelig;", "&#372;", "&#374", "&#373", "&#375;", "&sbquo;", "&#8219;", "&bdquo;", "&hellip;", "&trade;", "&#9658;", "&bull;", "&rarr;", "&rArr;", "&hArr;", "&diams;", "&asymp;"
+	];
Index: /CKEditor/trunk/_source/plugins/styles/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/styles/plugin.js	(revision 6189)
+++ /CKEditor/trunk/_source/plugins/styles/plugin.js	(revision 6190)
@@ -6,5 +6,15 @@
 CKEDITOR.plugins.add( 'styles',
 {
-	requires : [ 'selection' ]
+	requires : [ 'selection' ],
+	init : function( editor )
+	{
+		// This doesn't look like correct, but it's the safest way to proper
+		// pass the disableReadonlyStyling configuration to the style system
+		// without having to change any method signature in the API. (#6103)
+		editor.on( 'contentDom', function()
+			{
+				editor.document.setCustomData( 'cke_includeReadonly', !editor.config.disableReadonlyStyling );
+			});
+	}
 });
 
@@ -354,4 +364,33 @@
 	};
 
+	// Gets the parent element which blocks the styling for an element. This
+	// can be done through read-only elements (contenteditable=false) or
+	// elements with the "data-cke-nostyle" attribute.
+	function getUnstylableParent( element )
+	{
+		var unstylable,
+			editable;
+		
+		while ( ( element = element.getParent() ) )
+		{
+			if ( element.getName() == 'body' )
+				break;
+
+			if ( element.getAttribute( 'data-cke-nostyle' ) )
+				unstylable = element;
+			else if ( !editable )
+			{
+				var contentEditable = element.getAttribute( 'contentEditable' );
+
+				if ( contentEditable == 'false' )
+					unstylable = element;
+				else if ( contentEditable == 'true' )
+					editable = 1;
+			}
+		}
+
+		return unstylable;
+	}
+
 	function applyInlineStyle( range )
 	{
@@ -375,4 +414,12 @@
 		var def = this._.definition;
 		var isUnknownElement;
+
+		// Indicates that fully selected read-only elements are to be included in the styling range.
+		var includeReadonly = def.includeReadonly;
+		
+		// If the read-only inclusion is not available in the definition, try
+		// to get it from the document data.
+		if ( includeReadonly == undefined )
+			includeReadonly = document.getCustomData( 'cke_includeReadonly' );
 
 		// Get the DTD definition for the element. Defaults to "span".
@@ -393,4 +440,22 @@
 		var styleRange;
 
+		// Check if the boundaries are inside non stylable elements.
+		var firstUnstylable = getUnstylableParent( firstNode ),
+			lastUnstylable = getUnstylableParent( lastNode );
+
+		// If the first element can't be styled, we'll start processing right
+		// after its unstylable root.
+		if ( firstUnstylable )
+			currentNode = firstUnstylable.getNextSourceNode( true );			
+
+		// If the last element can't be styled, we'll stop processing on its
+		// unstylable root.
+		if ( lastUnstylable )
+			lastNode = lastUnstylable;
+
+		// Do nothing if the current node now follows the last node to be processed.
+		if ( currentNode.getPosition( lastNode ) == CKEDITOR.POSITION_FOLLOWING )
+			currentNode = 0;
+
 		while ( currentNode )
 		{
@@ -406,6 +471,8 @@
 				var nodeType = currentNode.type;
 				var nodeName = nodeType == CKEDITOR.NODE_ELEMENT ? currentNode.getName() : null;
-
-				if ( nodeName && currentNode.getAttribute( '_cke_bookmark' ) )
+				var nodeIsReadonly = nodeName && ( currentNode.getAttribute( 'contentEditable' ) == 'false' );
+				var nodeIsNoStyle = nodeName && currentNode.getAttribute( 'data-cke-nostyle' );
+
+				if ( nodeName && currentNode.data( 'cke-bookmark' ) )
 				{
 					currentNode = currentNode.getNextSourceNode( true );
@@ -415,4 +482,6 @@
 				// Check if the current node can be a child of the style element.
 				if ( !nodeName || ( dtd[ nodeName ]
+					&& !nodeIsNoStyle
+					&& ( !nodeIsReadonly || includeReadonly )
 					&& ( currentNode.getPosition( lastNode ) | CKEDITOR.POSITION_PRECEDING | CKEDITOR.POSITION_IDENTICAL | CKEDITOR.POSITION_IS_CONTAINED ) == ( CKEDITOR.POSITION_PRECEDING + CKEDITOR.POSITION_IDENTICAL + CKEDITOR.POSITION_IS_CONTAINED )
 					&& ( !def.childRule || def.childRule( currentNode ) ) ) )
@@ -436,7 +505,7 @@
 						}
 
-						// Non element nodes, or empty elements can be added
-						// completely to the range.
-						if ( nodeType == CKEDITOR.NODE_TEXT || ( nodeType == CKEDITOR.NODE_ELEMENT && !currentNode.getChildCount() ) )
+						// Non element nodes, readonly elements, or empty
+						// elements can be added completely to the range.
+						if ( nodeType == CKEDITOR.NODE_TEXT || nodeIsReadonly || ( nodeType == CKEDITOR.NODE_ELEMENT && !currentNode.getChildCount() ) )
 						{
 							var includedNode = currentNode;
@@ -462,5 +531,4 @@
 							if ( !includedNode.$.nextSibling )
 								applyStyle = true;
-
 						}
 					}
@@ -472,5 +540,5 @@
 
 				// Get the next node to be processed.
-				currentNode = currentNode.getNextSourceNode();
+				currentNode = currentNode.getNextSourceNode( nodeIsNoStyle || nodeIsReadonly );
 			}
 
@@ -884,5 +952,5 @@
 		// Exclude the ones at header OR at tail,
 		// and ignore bookmark content between them.
-		var duoBrRegex = /(\S\s*)\n(?:\s|(<span[^>]+_cke_bookmark.*?\/span>))*\n(?!$)/gi,
+		var duoBrRegex = /(\S\s*)\n(?:\s|(<span[^>]+data-cke-bookmark.*?\/span>))*\n(?!$)/gi,
 			blockName = preBlock.getName(),
 			splitedHtml = replace( preBlock.getOuterHtml(),
@@ -906,5 +974,5 @@
 			tailBookmark = '';
 
-		str = str.replace( /(^<span[^>]+_cke_bookmark.*?\/span>)|(<span[^>]+_cke_bookmark.*?\/span>$)/gi,
+		str = str.replace( /(^<span[^>]+data-cke-bookmark.*?\/span>)|(<span[^>]+data-cke-bookmark.*?\/span>$)/gi,
 			function( str, m1, m2 ){
 					m1 && ( headBookmark = m1 );
@@ -1356,5 +1424,5 @@
 			// Bookmark the range so we can re-select it after processing.
 			bookmarks = selection.createBookmarks( 1 ),
-			ranges = selection.getRanges( 1 ),
+			ranges = selection.getRanges(),
 			func = remove ? this.removeFromRange : this.applyToRange,
 			range;
@@ -1448,4 +1516,21 @@
 		callback( this._.stylesDefinitions );
 };
+
+/**
+ * Indicates that fully selected read-only elements will be included when
+ * applying the style (for inline styles only).
+ * @name CKEDITOR.style.includeReadonly
+ * @type Boolean
+ * @default false
+ * @since 3.5
+ */
+
+ /**
+  * Disables inline styling on read-only elements.
+  * @name CKEDITOR.config.disableReadonlyStyling
+  * @type Boolean
+  * @default false
+  * @since 3.5
+  */
 
 /**
Index: /CKEditor/trunk/_source/plugins/table/dialogs/table.js
===================================================================
--- /CKEditor/trunk/_source/plugins/table/dialogs/table.js	(revision 6189)
+++ /CKEditor/trunk/_source/plugins/table/dialogs/table.js	(revision 6190)
@@ -168,5 +168,5 @@
 							var th = theRow.getChild( i );
 							// Skip bookmark nodes. (#6155)
-							if ( th.type == CKEDITOR.NODE_ELEMENT && !th.hasAttribute( '_cke_bookmark' ) )
+							if ( th.type == CKEDITOR.NODE_ELEMENT && !th.data( 'cke-bookmark' ) )
 							{
 								th.renameNode( 'th' );
Index: /CKEditor/trunk/_source/plugins/tableresize/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/tableresize/plugin.js	(revision 6189)
+++ /CKEditor/trunk/_source/plugins/tableresize/plugin.js	(revision 6190)
@@ -299,5 +299,5 @@
 
 		resizer = CKEDITOR.dom.element.createFromHtml(
-			'<div cke_temp=1 contenteditable=false unselectable=on '+
+			'<div data-cke-temp=1 contenteditable=false unselectable=on '+
 			'style="position:absolute;cursor:col-resize;filter:alpha(opacity=0);opacity:0;' +
 				'padding:0;background-color:#004;background-image:none;border:0px none;z-index:10"></div>', document );
Index: /CKEditor/trunk/_source/plugins/tabletools/dialogs/tableCell.js
===================================================================
--- /CKEditor/trunk/_source/plugins/tabletools/dialogs/tableCell.js	(revision 6189)
+++ /CKEditor/trunk/_source/plugins/tabletools/dialogs/tableCell.js	(revision 6190)
@@ -13,5 +13,6 @@
 			heightPattern = /^(\d+(?:\.\d+)?)px$/,
 			bind = CKEDITOR.tools.bind,
-			spacer = { type : 'html', html : '&nbsp;' };
+			spacer = { type : 'html', html : '&nbsp;' },
+			rtl = editor.lang.dir == 'rtl';
 
 		/**
@@ -72,6 +73,6 @@
 		return {
 			title : langCell.title,
-			minWidth : CKEDITOR.env.ie && CKEDITOR.env.quirks ? 550 : 480,
-			minHeight : CKEDITOR.env.ie ? ( CKEDITOR.env.quirks ? 180 : 150 ) : 140,
+			minWidth : CKEDITOR.env.ie && CKEDITOR.env.quirks? 450 : 400,
+			minHeight : CKEDITOR.env.ie && CKEDITOR.env.quirks?  230 : 200,
 			contents : [
 				{
@@ -99,7 +100,6 @@
 													type : 'text',
 													id : 'width',
+													width: '100px',
 													label : langTable.width,
-													widths : [ '71%', '29%' ],
-													labelLayout : 'horizontal',
 													validate : validate[ 'number' ]( langCell.invalidWidth ),
 
@@ -140,8 +140,6 @@
 													type : 'select',
 													id : 'widthType',
-													labelLayout : 'horizontal',
-													widths : [ '0%', '100%' ],
 													label : editor.lang.table.widthUnit,
-													labelStyle: 'display:none',
+													labelStyle: 'visibility:hidden',
 													'default' : 'px',
 													items :
@@ -168,7 +166,6 @@
 													id : 'height',
 													label : langTable.height,
+													width: '100px',
 													'default' : '',
-													widths : [ '71%', '29%' ],
-													labelLayout : 'horizontal',
 													validate : validate[ 'number' ]( langCell.invalidHeight ),
 
@@ -207,5 +204,5 @@
 													id : 'htmlHeightType',
 													type : 'html',
-													html : langTable.widthPx
+													html : '<br />'+ langTable.widthPx
 												}
 											]
@@ -215,7 +212,5 @@
 											type : 'select',
 											id : 'wordWrap',
-											labelLayout : 'horizontal',
 											label : langCell.wordWrap,
-											widths : [ '50%', '50%' ],
 											'default' : 'yes',
 											items :
@@ -246,7 +241,5 @@
 											type : 'select',
 											id : 'hAlign',
-											labelLayout : 'horizontal',
 											label : langCell.hAlign,
-											widths : [ '50%', '50%' ],
 											'default' : '',
 											items :
@@ -279,7 +272,5 @@
 											type : 'select',
 											id : 'vAlign',
-											labelLayout : 'horizontal',
 											label : langCell.vAlign,
-											widths : [ '50%', '50%' ],
 											'default' : '',
 											items :
@@ -334,6 +325,4 @@
 											id : 'cellType',
 											label : langCell.cellType,
-											labelLayout : 'horizontal',
-											widths : [ '50%', '50%' ],
 											'default' : 'td',
 											items :
@@ -356,6 +345,4 @@
 											id : 'rowSpan',
 											label : langCell.rowSpan,
-											labelLayout : 'horizontal',
-											widths : [ '50%', '50%' ],
 											'default' : '',
 											validate : validate.integer( langCell.invalidRowSpan ),
@@ -379,6 +366,4 @@
 											id : 'colSpan',
 											label : langCell.colSpan,
-											labelLayout : 'horizontal',
-											widths : [ '50%', '50%' ],
 											'default' : '',
 											validate : validate.integer( langCell.invalidColSpan ),
@@ -402,5 +387,5 @@
 											type : 'hbox',
 											padding : 0,
-											widths : [ '80%', '20%' ],
+											widths : [ '60%', '40%' ],
 											children :
 											[
@@ -409,6 +394,4 @@
 													id : 'bgColor',
 													label : langCell.bgColor,
-													labelLayout : 'horizontal',
-													widths : [ '70%', '30%' ],
 													'default' : '',
 													setup : function( element )
@@ -434,6 +417,11 @@
 													type : 'button',
 													id : 'bgColorChoose',
+													"class" : 'colorChooser',
 													label : langCell.chooseColor,
-													style : 'margin-left: 10px',
+													onLoad : function()
+													{
+														// Stick the element to the bottom (#5587)
+														this.getElement().getParent().setStyle( 'vertical-align', 'bottom' );
+													},
 													onClick : function()
 													{
@@ -453,5 +441,5 @@
 											type : 'hbox',
 											padding : 0,
-											widths : [ '80%', '20%' ],
+											widths : [ '60%', '40%' ],
 											children :
 											[
@@ -460,6 +448,4 @@
 													id : 'borderColor',
 													label : langCell.borderColor,
-													labelLayout : 'horizontal',
-													widths : [ '70%', '30%' ],
 													'default' : '',
 													setup : function( element )
@@ -484,6 +470,12 @@
 													type : 'button',
 													id : 'borderColorChoose',
+													"class" : 'colorChooser',
 													label : langCell.chooseColor,
-													style : 'margin-left: 10px',
+													style : ( rtl ? 'margin-right' : 'margin-left' ) + ': 10px',
+													onLoad : function()
+													{
+														// Stick the element to the bottom (#5587)
+														this.getElement().getParent().setStyle( 'vertical-align', 'bottom' );
+													},
 													onClick : function()
 													{
Index: /CKEditor/trunk/_source/plugins/toolbar/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/toolbar/plugin.js	(revision 6189)
+++ /CKEditor/trunk/_source/plugins/toolbar/plugin.js	(revision 6190)
@@ -44,6 +44,7 @@
 					editor.toolbox.focusCommandExecuted = true;
 
-					// Make the first button focus accessible. (#3417)
-					if ( CKEDITOR.env.ie )
+					// Make the first button focus accessible for IE. (#3417)
+					// Adobe AIR instead need while of delay.
+					if ( CKEDITOR.env.ie || CKEDITOR.env.air )
 						setTimeout( function(){ editor.toolbox.focus(); }, 100 );
 					else
@@ -418,5 +419,5 @@
  *     ['BidiLtr', 'BidiRtl' ],
  *     ['Link','Unlink','Anchor'],
- *     ['Image','Flash','Table','HorizontalRule','Smiley','SpecialChar','PageBreak'],
+ *     ['Image','Flash','Table','HorizontalRule','Smiley','SpecialChar','PageBreak','Iframe'],
  *     '/',
  *     ['Styles','Format','Font','FontSize'],
@@ -437,5 +438,5 @@
 	['BidiLtr', 'BidiRtl' ],
 	['Link','Unlink','Anchor'],
-	['Image','Flash','Table','HorizontalRule','Smiley','SpecialChar','PageBreak'],
+	['Image','Flash','Table','HorizontalRule','Smiley','SpecialChar','PageBreak','Iframe'],
 	'/',
 	['Styles','Format','Font','FontSize'],
Index: /CKEditor/trunk/_source/plugins/undo/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/undo/plugin.js	(revision 6189)
+++ /CKEditor/trunk/_source/plugins/undo/plugin.js	(revision 6190)
@@ -153,5 +153,5 @@
 
 		// In IE, we need to remove the expando attributes.
-		CKEDITOR.env.ie && contents && ( contents = contents.replace( /\s+_cke_expando=".*?"/g, '' ) );
+		CKEDITOR.env.ie && contents && ( contents = contents.replace( /\s+data-cke-expando=".*?"/g, '' ) );
 
 		this.contents	= contents;
@@ -268,5 +268,5 @@
 						// In IE, we need to remove the expando attributes.
 						if ( CKEDITOR.env.ie )
-							currentSnapshot = currentSnapshot.replace( /\s+_cke_expando=".*?"/g, '' );
+							currentSnapshot = currentSnapshot.replace( /\s+data-cke-expando=".*?"/g, '' );
 
 						if ( beforeTypeImage.contents != currentSnapshot )
Index: /CKEditor/trunk/_source/plugins/wsc/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/wsc/plugin.js	(revision 6189)
+++ /CKEditor/trunk/_source/plugins/wsc/plugin.js	(revision 6190)
@@ -19,5 +19,5 @@
 
 		// SpellChecker doesn't work in Opera and with custom domain
-		command.modes = { wysiwyg : ( !CKEDITOR.env.opera && document.domain == window.location.hostname ) };
+		command.modes = { wysiwyg : ( !CKEDITOR.env.opera && !CKEDITOR.env.air && document.domain == window.location.hostname ) };
 
 		editor.ui.addButton( 'SpellChecker',
Index: /CKEditor/trunk/_source/plugins/wysiwygarea/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/wysiwygarea/plugin.js	(revision 6189)
+++ /CKEditor/trunk/_source/plugins/wysiwygarea/plugin.js	(revision 6190)
@@ -34,175 +34,238 @@
 	}
 
-	function onInsertHtml( evt )
-	{
-		if ( this.mode == 'wysiwyg' )
-		{
-			this.focus();
-
-			var selection = this.getSelection();
-			if ( checkReadOnly( selection ) )
-				return;
-
-			var data = evt.data;
-			this.fire( 'saveSnapshot' );
-
-			if ( this.dataProcessor )
-				data = this.dataProcessor.toHtml( data );
-
-			if ( CKEDITOR.env.ie )
-			{
-				var selIsLocked = selection.isLocked;
-
-				if ( selIsLocked )
-					selection.unlock();
-
-				var $sel = selection.getNative();
-
-				// Delete control selections to avoid IE bugs on pasteHTML.
-				if ( $sel.type == 'Control' )
-					$sel.clear();
+
+	function onInsert( insertFunc )
+	{
+		return function( evt )
+		{
+			if ( this.mode == 'wysiwyg' )
+			{
+				this.focus();
+
+				var selection = this.getSelection();
+				if ( checkReadOnly( selection ) )
+					return;
+
+				this.fire( 'saveSnapshot' );
+
+				insertFunc.call( this, evt.data );
+
+				// 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 );
+			}
+		}
+	}
+	
+	function doInsertHtml( data )
+	{
+		if ( this.dataProcessor )
+			data = this.dataProcessor.toHtml( data );
+
+		var selection = this.getSelection();
+		if ( CKEDITOR.env.ie )
+		{
+			var selIsLocked = selection.isLocked;
+
+			if ( selIsLocked )
+				selection.unlock();
+
+			var $sel = selection.getNative();
+
+			// Delete control selections to avoid IE bugs on pasteHTML.
+			if ( $sel.type == 'Control' )
+				$sel.clear();
 				else if  ( selection.getType() == CKEDITOR.SELECTION_TEXT )
+			{
+				// Due to IE bugs on handling contenteditable=false blocks
+				// (#6005), we need to make some checks and eventually
+				// delete the selection first.
+
+				var range = selection.getRanges()[0],
+						endContainer = range && range.endContainer;
+
+				if ( endContainer &&
+						endContainer.type == CKEDITOR.NODE_ELEMENT &&
+						endContainer.getAttribute( 'contenteditable' ) == 'false' &&
+						range.checkBoundaryOfElement( endContainer, CKEDITOR.END ) )
 				{
-					// Due to IE bugs on handling contenteditable=false blocks
-					// (#6005), we need to make some checks and eventually
-					// delete the selection first.
-
-					var range = selection.getRanges()[0],
-						endContainer = range && range.endContainer;
-
-					if ( endContainer &&
- 						 endContainer.type == CKEDITOR.NODE_ELEMENT &&
- 						 endContainer.getAttribute( 'contenteditable' ) == 'false' &&
-						 range.checkBoundaryOfElement( endContainer, CKEDITOR.END ) )
-					{
-						range.setEndAfter( range.endContainer );
-						range.deleteContents();
-					}
+					range.setEndAfter( range.endContainer );
+					range.deleteContents();
 				}
-
-				try
+			}
+
+			try
+			{
+				$sel.createRange().pasteHTML( data );
+			}
+				catch (e) {}
+
+			if ( selIsLocked )
+				this.getSelection().lock();
+			}
+		else
+			this.document.$.execCommand( 'inserthtml', false, data );
+
+		// Webkit does not scroll to the cursor position after pasting (#5558)
+		if ( CKEDITOR.env.webkit )
+		{
+			selection = this.getSelection();
+			selection.scrollIntoView();
+		}
+	}
+
+	function doInsertText( text )
+	{
+		var selection = this.getSelection(),
+			mode = selection.getStartElement().hasAscendant( 'pre', true ) ?
+				   CKEDITOR.ENTER_BR : this.config.enterMode,
+			isEnterBrMode = mode == CKEDITOR.ENTER_BR;
+
+		var html = CKEDITOR.tools.htmlEncode( text.replace( /\r\n|\r/g, '\n' ) );
+
+		// Convert leading and trailing whitespaces into &nbsp;
+		html = html.replace( /^[ \t]+|[ \t]+$/g, function( match, offset, s )
+			{
+				if ( match.length == 1 )	// one space, preserve it
+					return '&nbsp;';
+				else if ( !offset )		// beginning of block
+					return CKEDITOR.tools.repeat( '&nbsp;', match.length - 1 ) + ' ';
+				else				// end of block
+					return ' ' + CKEDITOR.tools.repeat( '&nbsp;', match.length - 1 );
+			} );
+
+		// Convert subsequent whitespaces into &nbsp;
+		html = html.replace( /[ \t]{2,}/g, function ( match )
+		   {
+			   return CKEDITOR.tools.repeat( '&nbsp;', match.length - 1 ) + ' ';
+		   } );
+
+		var paragraphTag = mode == CKEDITOR.ENTER_P ? 'p' : 'div';
+
+		// Two line-breaks create one paragraph.
+		if ( !isEnterBrMode )
+		{
+			html = html.replace( /(\n{2})([\s\S]*?)(?:$|\1)/g,
+				function( match, group1, text )
 				{
-					$sel.createRange().pasteHTML( data );
-				}
-				catch (e) {}
-
-				if ( selIsLocked )
-					this.getSelection().lock();
+					return '<'+paragraphTag + '>' + text + '</' + paragraphTag + '>';
+				});
+		}
+
+		// One <br> per line-break.
+		html = html.replace( /\n/g, '<br>' );
+
+		// Compensate padding <br> for non-IE.
+		if ( !( isEnterBrMode || CKEDITOR.env.ie ) )
+		{
+			html = html.replace( new RegExp( '<br>(?=</' + paragraphTag + '>)' ), function( match )
+			{
+				return CKEDITOR.tools.repeat( match, 2 );
+			} );
+		}
+
+		// Inline styles have to be inherited in Firefox.
+		if ( CKEDITOR.env.gecko || CKEDITOR.env.webkit )
+		{
+			var path = new CKEDITOR.dom.elementPath( selection.getStartElement() ),
+				context = [];
+
+			for ( var i = 0; i < path.elements.length; i++ )
+			{
+				var tag = path.elements[ i ].getName();
+				if ( tag in CKEDITOR.dtd.$inline )
+					context.unshift( path.elements[ i ].getOuterHtml().match( /^<.*?>/) );
+				else if ( tag in CKEDITOR.dtd.$block )
+					break;
 			}
-			else
-				this.document.$.execCommand( 'inserthtml', false, data );
-
-			// Webkit does not scroll to the cursor position after pasting (#5558)
-			if ( CKEDITOR.env.webkit )
-			{
-				this.document.$.execCommand( 'inserthtml', false, '<span id="cke_paste_marker" cke_temp="1"></span>' );
-				var marker = this.document.getById( 'cke_paste_marker' );
-				marker.scrollIntoView();
-				marker.remove();
-				marker = null;
-			}
-
-			CKEDITOR.tools.setTimeout( function()
-				{
-					this.fire( 'saveSnapshot' );
-				}, 0, this );
+
+			// Reproduce the context  by preceding the pasted HTML with opening inline tags.
+			html = context.join( '' ) + html;
 		}
-	}
-
-	function onInsertElement( evt )
-	{
-		if ( this.mode == 'wysiwyg' )
-		{
-			this.focus();
-
-			var selection = this.getSelection();
-			if ( checkReadOnly( selection ) )
-				return;
-
-			this.fire( 'saveSnapshot' );
-
-			var ranges = selection.getRanges(),
-				element = evt.data,
+
+		doInsertHtml.call( this, html );
+	}
+
+	function doInsertElement( element )
+	{
+		var selection = this.getSelection(),
+				ranges = selection.getRanges(),
 				elementName = element.getName(),
 				isBlock = CKEDITOR.dtd.$block[ elementName ];
 
-			var selIsLocked = selection.isLocked;
-
-			if ( selIsLocked )
-				selection.unlock();
-
-			var range, clone, lastElement, bookmark;
-
-			for ( var i = ranges.length - 1 ; i >= 0 ; i-- )
-			{
-				range = ranges[ i ];
-
-				// Remove the original contents.
-				range.deleteContents();
-
-				clone = !i && element || element.clone( 1 );
-
-				// If we're inserting a block at dtd-violated position, split
-				// the parent blocks until we reach blockLimit.
-				var current, dtd;
-				if ( isBlock )
+		var selIsLocked = selection.isLocked;
+
+		if ( selIsLocked )
+			selection.unlock();
+
+		var range, clone, lastElement, bookmark;
+
+		for ( var i = ranges.length - 1 ; i >= 0 ; i-- )
+		{
+			range = ranges[ i ];
+
+			// Remove the original contents.
+			range.deleteContents();
+
+			clone = !i && element || element.clone( 1 );
+
+			// If we're inserting a block at dtd-violated position, split
+			// the parent blocks until we reach blockLimit.
+			var current, dtd;
+			if ( isBlock )
+			{
+				while ( ( current = range.getCommonAncestor( 0, 1 ) )
+						&& ( dtd = CKEDITOR.dtd[ current.getName() ] )
+						&& !( dtd && dtd [ elementName ] ) )
 				{
-					while ( ( current = range.getCommonAncestor( 0, 1 ) )
-							&& ( dtd = CKEDITOR.dtd[ current.getName() ] )
-							&& !( dtd && dtd [ elementName ] ) )
+					// Split up inline elements.
+					if ( current.getName() in CKEDITOR.dtd.span )
+						range.splitElement( current );
+					// If we're in an empty block which indicate a new paragraph,
+					// simply replace it with the inserting block.(#3664)
+					else if ( range.checkStartOfBlock()
+							&& range.checkEndOfBlock() )
 					{
-						// Split up inline elements.
-						if ( current.getName() in CKEDITOR.dtd.span )
-							range.splitElement( current );
-						// If we're in an empty block which indicate a new paragraph,
-						// simply replace it with the inserting block.(#3664)
-						else if ( range.checkStartOfBlock()
-							 && range.checkEndOfBlock() )
-						{
-							range.setStartBefore( current );
-							range.collapse( true );
-							current.remove();
-						}
-						else
-							range.splitBlock();
+						range.setStartBefore( current );
+						range.collapse( true );
+						current.remove();
 					}
+					else
+						range.splitBlock();
 				}
-
-				// Insert the new node.
-				range.insertNode( clone );
-
-				// Save the last element reference so we can make the
-				// selection later.
-				if ( !lastElement )
-					lastElement = clone;
 			}
 
-			range.moveToPosition( lastElement, CKEDITOR.POSITION_AFTER_END );
-
-			// If we're inserting a block element immediatelly followed by
-			// another block element, the selection must move there. (#3100,#5436)
-			if ( isBlock )
-			{
-				var next = lastElement.getNext( notWhitespaceEval ),
+			// Insert the new node.
+			range.insertNode( clone );
+
+			// Save the last element reference so we can make the
+			// selection later.
+			if ( !lastElement )
+				lastElement = clone;
+		}
+
+		range.moveToPosition( lastElement, CKEDITOR.POSITION_AFTER_END );
+
+		// If we're inserting a block element immediatelly followed by
+		// another block element, the selection must move there. (#3100,#5436)
+		if ( isBlock )
+		{
+			var next = lastElement.getNext( notWhitespaceEval ),
 					nextName = next && next.type == CKEDITOR.NODE_ELEMENT && next.getName();
 
-				// Check if it's a block element that accepts text.
-				if ( nextName && CKEDITOR.dtd.$block[ nextName ] && CKEDITOR.dtd[ nextName ]['#'] )
-					range.moveToElementEditStart( next );
-			}
-
-			selection.selectRanges( [ range ] );
-
-			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 );
+			// Check if it's a block element that accepts text.
+			if ( nextName && CKEDITOR.dtd.$block[ nextName ] && CKEDITOR.dtd[ nextName ]['#'] )
+				range.moveToElementEditStart( next );
 		}
+
+		selection.selectRanges( [ range ] );
+
+		if ( selIsLocked )
+			this.getSelection().lock();
 	}
 
@@ -412,6 +475,5 @@
 							iframe.remove();
 
-
-						var srcScript =
+						var src =
 							'document.open();' +
 
@@ -421,4 +483,15 @@
 
 							'document.close();';
+
+						// With IE, the custom domain has to be taken care at first,
+						// for other browers, the 'src' attribute should be left empty to
+						// trigger iframe's 'load' event.
+  						src =
+							CKEDITOR.env.air ?
+								'javascript:void(0)' :
+							CKEDITOR.env.ie ?
+								'javascript:void(function(){' + encodeURIComponent( src ) + '}())'
+							:
+								'';
 
 						iframe = CKEDITOR.dom.element.createFromHtml( '<iframe' +
@@ -426,8 +499,5 @@
   							' frameBorder="0"' +
   							' title="' + frameLabel + '"' +
-							// With IE, the custom domain has to be taken care at first,
-							// for other browers, the 'src' attribute should be left empty to
-							// trigger iframe's 'load' event.
-  							' src="' + ( CKEDITOR.env.ie ? 'javascript:void(function(){' + encodeURIComponent( srcScript ) + '}())' : '' ) + '"' +
+  							' src="' + src + '"' +
 							' tabIndex="' + ( CKEDITOR.env.webkit? -1 : editor.tabIndex ) + '"' +
   							' allowTransparency="true"' +
@@ -444,10 +514,8 @@
 								ev.removeListener();
 
-								var doc = iframe.getFrameDocument().$;
-
-								// Don't leave any history log in IE. (#5657)
-								doc.open( "text/html","replace" );
+								var doc = iframe.getFrameDocument();
 								doc.write( data );
-								doc.close();
+
+								CKEDITOR.env.air && contentDomReady( doc.getWindow().$ );
 							});
 
@@ -486,5 +554,5 @@
 					contentDomReadyHandler = CKEDITOR.tools.addFunction( contentDomReady );
 					var activationScript =
-						'<script id="cke_actscrpt" type="text/javascript" cke_temp="1">' +
+						'<script id="cke_actscrpt" type="text/javascript" data-cke-temp="1">' +
 							( isCustomDomain ? ( 'document.domain="' + document.domain + '";' ) : '' ) +
 							'window.parent.CKEDITOR.tools.callFunction( ' + contentDomReadyHandler + ', window );' +
@@ -505,5 +573,5 @@
 						// Remove this script from the DOM.
 						var script = domDocument.getElementById( "cke_actscrpt" );
-						script.parentNode.removeChild( script );
+						script && script.parentNode.removeChild( script );
 
 						body.spellcheck = !editor.config.disableNativeSpellChecker;
@@ -799,5 +867,5 @@
 								// Build the additional stuff to be included into <head>.
 								var headExtra =
-									'<style type="text/css" cke_temp="1">' +
+									'<style type="text/css" data-cke-temp="1">' +
 										editor._.styles.join( '\n' ) +
 									'</style>';
@@ -807,5 +875,5 @@
 									headExtra );
 
-								var baseTag = config.baseHref ? '<base href="' + config.baseHref + '" cke_temp="1" />' : '';
+								var baseTag = config.baseHref ? '<base href="' + config.baseHref + '" data-cke-temp="1" />' : '';
 
 								if ( fullPage )
@@ -945,4 +1013,6 @@
 							focus : function()
 							{
+								var win = editor.window;
+
 								if ( isLoadingData )
 									isPendingFocus = true;
@@ -958,8 +1028,8 @@
 									editor.selectionChange();
 								}
-								else if ( !CKEDITOR.env.opera && editor.window )
-								{
-									editor.window.focus();
-
+								else if ( !CKEDITOR.env.opera && win )
+								{
+									// AIR needs a while to focus when moving from a link.
+									CKEDITOR.env.air ? setTimeout( function () { win.focus(); }, 0 ) : win.focus();
 									editor.selectionChange();
 								}
@@ -967,6 +1037,7 @@
 						});
 
-					editor.on( 'insertHtml', onInsertHtml, null, null, 20 );
-					editor.on( 'insertElement', onInsertElement, null, null, 20 );
+					editor.on( 'insertHtml', onInsert( doInsertHtml ) , null, null, 20 );
+					editor.on( 'insertElement', onInsert( doInsertElement ), null, null, 20 );
+					editor.on( 'insertText', onInsert( doInsertText ), null, null, 20 );
 					// Auto fixing on some document structure weakness to enhance usabilities. (#3190 and #3189)
 					editor.on( 'selectionChange', onSelectionChangeFixBody, null, null, 1 );
@@ -979,5 +1050,5 @@
 				{
 					var title = editor.document.getElementsByTag( 'title' ).getItem( 0 );
-					title.setAttribute( '_cke_title', editor.document.$.title );
+					title.data( 'cke-title', editor.document.$.title );
 					editor.document.$.title = frameLabel;
 				});
Index: /CKEditor/trunk/_source/skins/kama/dialog.css
===================================================================
--- /CKEditor/trunk/_source/skins/kama/dialog.css	(revision 6189)
+++ /CKEditor/trunk/_source/skins/kama/dialog.css	(revision 6190)
@@ -103,4 +103,14 @@
 }
 
+.cke_skin_kama .cke_dialog_footer .cke_resizer
+{
+	margin-top: 20px;
+}
+.cke_skin_kama .cke_browser_iequirks .cke_dialog_footer .cke_resizer,
+.cke_skin_kama .cke_browser_ie6 .cke_dialog_footer .cke_resizer
+{
+	margin-top: 27px;
+}
+
 /* tabs */
 
@@ -713,6 +723,6 @@
 	border : 2px ridge black;
 	overflow : scroll;
-	height : 160px;
-	width : 230px;
+	height : 200px;
+	width : 300px;
 	padding : 2px;
 	background-color : white;
@@ -881,2 +891,19 @@
 	border: 1px solid white;
 }
+
+/**
+ * Styles specific to "cellProperties" dialog.
+ */
+
+.cke_skin_kama .cke_dialog_contents a.colorChooser
+{
+	display:block;
+	margin-top:6px;
+	margin-left: 10px;
+	width: 80px;
+}
+
+.cke_skin_kama .cke_rtl .cke_dialog_contents a.colorChooser
+{
+	margin-right: 10px;
+}
Index: /CKEditor/trunk/_source/skins/kama/icons.css
===================================================================
--- /CKEditor/trunk/_source/skins/kama/icons.css	(revision 6189)
+++ /CKEditor/trunk/_source/skins/kama/icons.css	(revision 6190)
@@ -356,2 +356,6 @@
 	background-position: 0 -1056px;
 }
+.cke_skin_kama .cke_button_iframe .cke_icon
+{
+	background-position: 0 -1279px;
+}
Index: /CKEditor/trunk/_source/skins/kama/mainui.css
===================================================================
--- /CKEditor/trunk/_source/skins/kama/mainui.css	(revision 6189)
+++ /CKEditor/trunk/_source/skins/kama/mainui.css	(revision 6190)
@@ -126,4 +126,11 @@
 }
 
+/* Adobe AIR doesn't support *-resize cursor shape. */
+.cke_skin_kama .cke_browser_air .cke_resizer,
+.cke_skin_kama .cke_browser_air .cke_rtl .cke_resizer
+{
+	cursor: move;
+}
+
 .cke_skin_kama .cke_rtl .cke_resizer
 {
Index: /CKEditor/trunk/_source/skins/kama/menu.css
===================================================================
--- /CKEditor/trunk/_source/skins/kama/menu.css	(revision 6189)
+++ /CKEditor/trunk/_source/skins/kama/menu.css	(revision 6190)
@@ -50,8 +50,36 @@
 }
 
+/* IE with zoom != 100% will distort the icons otherwise #4821 */
+.cke_browser_ie .cke_skin_kama .cke_menuitem .cke_icon
+{
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='icons.png', sizingMethod='scale');
+}
+.cke_browser_ie.cke_rtl .cke_skin_kama .cke_menuitem .cke_icon
+{
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='icons_rtl.png', sizingMethod='scale');
+}
+.cke_browser_ie6 .cke_skin_kama .cke_menuitem .cke_icon
+{
+	filter: ;
+}
+
 .cke_skin_kama .cke_menuitem .cke_disabled .cke_icon
 {
 	filter: alpha(opacity=70); /* IE */
 	opacity: 0.70; /* Safari, Opera and Mozilla */
+}
+
+/* IE with zoom != 100% will distort the icons otherwise #4821 */
+.cke_browser_ie .cke_skin_kama .cke_menuitem .cke_disabled .cke_icon
+{
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='icons.png', sizingMethod='scale');
+}
+.cke_browser_ie.cke_rtl .cke_skin_kama .cke_menuitem .cke_disabled .cke_icon
+{
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='icons_rtl.png', sizingMethod='scale');
+}
+.cke_browser_ie6 .cke_skin_kama .cke_menuitem .cke_disabled .cke_icon
+{
+	filter: ;
 }
 
Index: /CKEditor/trunk/_source/skins/kama/richcombo.css
===================================================================
--- /CKEditor/trunk/_source/skins/kama/richcombo.css	(revision 6189)
+++ /CKEditor/trunk/_source/skins/kama/richcombo.css	(revision 6190)
@@ -201,4 +201,14 @@
 }
 
+/* IE with zoom != 100% will distort the icons otherwise #4821 */
+.cke_skin_kama .cke_browser_ie .cke_rcombo .cke_disabled .cke_openbutton
+{
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='images/sprites.png', sizingMethod='scale'), alpha(opacity=50);
+}
+.cke_skin_kama .cke_browser_ie6 .cke_rcombo .cke_disabled .cke_openbutton
+{
+	filter: alpha(opacity=50);
+}
+
 .cke_skin_kama .cke_hc .cke_rcombo .cke_disabled .cke_text,
 .cke_skin_kama .cke_hc .cke_rcombo .cke_disabled .cke_openbutton
Index: /CKEditor/trunk/_source/skins/kama/skin.js
===================================================================
--- /CKEditor/trunk/_source/skins/kama/skin.js	(revision 6189)
+++ /CKEditor/trunk/_source/skins/kama/skin.js	(revision 6190)
@@ -6,16 +6,7 @@
 CKEDITOR.skins.add( 'kama', (function()
 {
-	var preload = [],
-		uiColorStylesheetId = 'cke_ui_color';
-
-	if ( CKEDITOR.env.ie && CKEDITOR.env.version < 7 )
-	{
-		// For IE6, we need to preload some images, otherwhise they will be
-		// downloaded several times (CSS background bug).
-		preload.push( 'icons.png', 'images/sprites_ie6.png', 'images/dialog_sides.gif' );
-	}
+	var uiColorStylesheetId = 'cke_ui_color';
 
 	return {
-		preload		: preload,
 		editor		: { css : [ 'editor.css' ] },
 		dialog		: { css : [ 'dialog.css' ] },
Index: /CKEditor/trunk/_source/skins/kama/toolbar.css
===================================================================
--- /CKEditor/trunk/_source/skins/kama/toolbar.css	(revision 6189)
+++ /CKEditor/trunk/_source/skins/kama/toolbar.css	(revision 6190)
@@ -180,9 +180,25 @@
 }
 
-.cke_skin_kama .cke_button a.cke_disabled *,
-.cke_skin_kama .cke_browser_ie a:hover.cke_button .cke_disabled *
+.cke_skin_kama .cke_button a.cke_disabled *
 {
 	filter: alpha(opacity=30); /* IE */
 	opacity: 0.3; /* Safari, Opera and Mozilla */
+}
+
+/* IE with zoom != 100% will distort the icons otherwise #4821 */
+.cke_skin_kama .cke_browser_ie .cke_button a.cke_disabled *,
+.cke_skin_kama .cke_browser_ie a:hover.cke_button .cke_disabled *
+{
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='icons.png', sizingMethod='scale'), alpha(opacity=30);
+}
+.cke_skin_kama .cke_browser_ie .cke_rtl .cke_button a.cke_disabled *,
+.cke_skin_kama .cke_browser_ie .cke_rtl a:hover.cke_button .cke_disabled *
+{
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='icons_rtl.png', sizingMethod='scale'), alpha(opacity=30);
+}
+.cke_skin_kama .cke_browser_ie6 .cke_button a.cke_disabled *,
+.cke_skin_kama .cke_browser_ie6 a:hover.cke_button .cke_disabled *
+{
+	filter: alpha(opacity=30);
 }
 
@@ -245,4 +261,17 @@
 	background-image: url(icons_rtl.png);
 }
+/* IE with zoom != 100% will distort the icons otherwise #4821 */
+.cke_skin_kama .cke_browser_ie .cke_button .cke_icon
+{
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='icons.png', sizingMethod='scale'); 
+}
+.cke_skin_kama .cke_browser_ie .cke_rtl .cke_button .cke_icon
+{
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='icons_rtl.png', sizingMethod='scale'); 
+}
+.cke_skin_kama .cke_browser_ie6 .cke_button .cke_icon
+{
+	filter: ;
+}
 
 .cke_skin_kama .cke_rtl .cke_button .cke_icon
@@ -301,4 +330,14 @@
 }
 
+/* IE with zoom != 100% will distort the icons otherwise #4821 */
+.cke_skin_kama .cke_browser_ie .cke_button .cke_buttonarrow
+{
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='images/sprites.png', sizingMethod='scale');
+}
+.cke_skin_kama .cke_browser_ie6 .cke_button .cke_buttonarrow
+{
+	filter: ;
+}
+
 .cke_skin_kama .cke_rtl .cke_button .cke_buttonarrow
 {
Index: /CKEditor/trunk/_source/skins/office2003/dialog.css
===================================================================
--- /CKEditor/trunk/_source/skins/office2003/dialog.css	(revision 6189)
+++ /CKEditor/trunk/_source/skins/office2003/dialog.css	(revision 6190)
@@ -206,4 +206,8 @@
 }
 
+.cke_skin_office2003 .cke_dialog_footer .cke_resizer {
+	margin-top: 21px;
+}
+
 /* tabs */
 
@@ -653,5 +657,5 @@
 	border : 2px ridge black;
 	overflow : scroll;
-	height : 160px;
+	height : 210px;
 	width : 230px;
 	padding : 2px;
@@ -799,2 +803,24 @@
 	float: right;
 }
+
+/**
+ * Styles specific to "cellProperties" dialog.
+ */
+
+.cke_skin_office2003 .cke_dialog_contents a.colorChooser
+{
+	display:block;
+	margin-top:12px;
+	margin-left: 10px;
+	width: 40px;
+}
+
+.cke_skin_office2003 .cke_dialog_contents a.colorChooser .cke_dialog_ui_button
+{
+	width:100%;
+}
+
+.cke_skin_office2003 .cke_rtl .cke_dialog_contents a.colorChooser
+{
+	margin-right: 10px;
+}
Index: /CKEditor/trunk/_source/skins/office2003/icons.css
===================================================================
--- /CKEditor/trunk/_source/skins/office2003/icons.css	(revision 6189)
+++ /CKEditor/trunk/_source/skins/office2003/icons.css	(revision 6190)
@@ -353,2 +353,7 @@
 	background-position: 0 -1056px;
 }
+.cke_skin_office2003 .cke_button_iframe .cke_icon
+{
+	background-position: 0 -1279px;
+}
+
Index: /CKEditor/trunk/_source/skins/office2003/mainui.css
===================================================================
--- /CKEditor/trunk/_source/skins/office2003/mainui.css	(revision 6189)
+++ /CKEditor/trunk/_source/skins/office2003/mainui.css	(revision 6190)
@@ -94,4 +94,11 @@
 }
 
+/* Adobe AIR doesn't support *-resize cursor shape. */
+.cke_skin_office2003 .cke_browser_air .cke_resizer,
+.cke_skin_office2003 .cke_browser_air .cke_rtl .cke_resizer
+{
+	cursor: move;
+}
+
 .cke_skin_office2003 .cke_rtl .cke_resizer
 {
Index: /CKEditor/trunk/_source/skins/office2003/menu.css
===================================================================
--- /CKEditor/trunk/_source/skins/office2003/menu.css	(revision 6189)
+++ /CKEditor/trunk/_source/skins/office2003/menu.css	(revision 6190)
@@ -50,8 +50,36 @@
 }
 
+/* IE with zoom != 100% will distort the icons otherwise #4821 */
+.cke_browser_ie .cke_skin_office2003 .cke_menuitem .cke_icon
+{
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='icons.png', sizingMethod='scale');
+}
+.cke_browser_ie.cke_rtl .cke_skin_office2003 .cke_menuitem .cke_icon
+{
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='icons_rtl.png', sizingMethod='scale');
+}
+.cke_browser_ie6 .cke_skin_office2003 .cke_menuitem .cke_icon
+{
+	filter: ;
+}
+
 .cke_skin_office2003 .cke_menuitem .cke_disabled .cke_icon
 {
 	filter: alpha(opacity=70); /* IE */
 	opacity: 0.70; /* Safari, Opera and Mozilla */
+}
+
+/* IE with zoom != 100% will distort the icons otherwise #4821 */
+.cke_browser_ie .cke_skin_office2003 .cke_menuitem .cke_disabled .cke_icon
+{
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='icons.png', sizingMethod='scale');
+}
+.cke_browser_ie.cke_rtl .cke_skin_office2003 .cke_menuitem .cke_disabled .cke_icon
+{
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='icons_rtl.png', sizingMethod='scale');
+}
+.cke_browser_ie6 .cke_skin_office2003 .cke_menuitem .cke_disabled .cke_icon
+{
+	filter: ;
 }
 
Index: /CKEditor/trunk/_source/skins/office2003/richcombo.css
===================================================================
--- /CKEditor/trunk/_source/skins/office2003/richcombo.css	(revision 6189)
+++ /CKEditor/trunk/_source/skins/office2003/richcombo.css	(revision 6190)
@@ -145,5 +145,5 @@
 	background-position: 5px -1002px;
 	background-image: url(images/sprites.png);
-	background-image: url(images/sprites_ie6.png);
+	_background-image: url(images/sprites_ie6.png);
 	background-repeat: no-repeat;
 
@@ -152,4 +152,14 @@
 	width: 14px;
 	height: 22px;
+}
+
+/* IE with zoom != 100% will distort the icons otherwise #4821 */
+.cke_skin_office2003 .cke_browser_ie .cke_rcombo .cke_openbutton
+{
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='images/sprites.png', sizingMethod='scale'); 
+}
+.cke_skin_office2003 .cke_browser_ie6 .cke_rcombo .cke_openbutton
+{
+	filter: ;
 }
 
@@ -245,4 +255,14 @@
 }
 
+/* IE with zoom != 100% will distort the icons otherwise #4821 */
+.cke_skin_office2003 .cke_browser_ie .cke_rcombo .cke_disabled .cke_openbutton
+{
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='images/sprites.png', sizingMethod='scale'), alpha(opacity=50);
+}
+.cke_skin_office2003 .cke_browser_ie6 .cke_rcombo .cke_disabled .cke_openbutton
+{
+	filter: alpha(opacity=50);
+}
+
 .cke_skin_office2003 .cke_hc .cke_rcombo .cke_disabled .cke_text,
 .cke_skin_office2003 .cke_hc .cke_rcombo .cke_disabled .cke_openbutton
@@ -251,4 +271,5 @@
 	opacity: 0.8;
 }
+
 
 .cke_skin_office2003 .cke_rcombo .cke_disabled .cke_text
Index: /CKEditor/trunk/_source/skins/office2003/skin.js
===================================================================
--- /CKEditor/trunk/_source/skins/office2003/skin.js	(revision 6189)
+++ /CKEditor/trunk/_source/skins/office2003/skin.js	(revision 6190)
@@ -6,15 +6,5 @@
 CKEDITOR.skins.add( 'office2003', (function()
 {
-	var preload = [];
-
-	if ( CKEDITOR.env.ie && CKEDITOR.env.version < 7 )
-	{
-		// For IE6, we need to preload some images, otherwhise they will be
-		// downloaded several times (CSS background bug).
-		preload.push( 'icons.png', 'images/sprites_ie6.png', 'images/dialog_sides.gif' );
-	}
-
 	return {
-		preload		: preload,
 		editor		: { css : [ 'editor.css' ] },
 		dialog		: { css : [ 'dialog.css' ] },
Index: /CKEditor/trunk/_source/skins/office2003/toolbar.css
===================================================================
--- /CKEditor/trunk/_source/skins/office2003/toolbar.css	(revision 6189)
+++ /CKEditor/trunk/_source/skins/office2003/toolbar.css	(revision 6190)
@@ -269,9 +269,25 @@
 }
 
-.cke_skin_office2003 .cke_button a.cke_disabled *,
-.cke_skin_office2003 .cke_browser_ie a:hover.cke_button .cke_disabled *
+.cke_skin_office2003 .cke_button a.cke_disabled *
 {
 	filter: alpha(opacity=30); /* IE */
 	opacity: 0.3; /* Safari, Opera and Mozilla */
+}
+
+/* IE with zoom != 100% will distort the icons otherwise #4821 */
+.cke_skin_office2003 .cke_browser_ie .cke_button a.cke_disabled *,
+.cke_skin_office2003 .cke_browser_ie a:hover.cke_button .cke_disabled *
+{
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='icons.png', sizingMethod='scale'), alpha(opacity=30);
+}
+.cke_skin_office2003 .cke_browser_ie .cke_rtl .cke_button a.cke_disabled *,
+.cke_skin_office2003 .cke_browser_ie .cke_rtl a:hover.cke_button .cke_disabled *
+{
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='icons_rtl.png', sizingMethod='scale'), alpha(opacity=30);
+}
+.cke_skin_office2003 .cke_browser_ie6 .cke_button a.cke_disabled *,
+.cke_skin_office2003 .cke_browser_ie6 a:hover.cke_button .cke_disabled *
+{
+	filter: alpha(opacity=30);
 }
 
@@ -314,4 +330,18 @@
 }
 
+/* IE with zoom != 100% will distort the icons otherwise #4821 */
+.cke_skin_office2003 .cke_browser_ie .cke_button .cke_icon
+{
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='icons.png', sizingMethod='scale'); 
+}
+.cke_skin_office2003 .cke_browser_ie .cke_rtl .cke_button .cke_icon
+{
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='icons_rtl.png', sizingMethod='scale'); 
+}
+.cke_skin_office2003 .cke_browser_ie6 .cke_button .cke_icon
+{
+	filter: ;
+}
+
 .cke_skin_office2003 .cke_button .cke_label
 {
@@ -367,4 +397,14 @@
 	background-repeat: no-repeat;
 	cursor: default;
+}
+
+/* IE with zoom != 100% will distort the icons otherwise #4821 */
+.cke_skin_office2003 .cke_browser_ie .cke_button .cke_buttonarrow
+{
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='images/sprites.png', sizingMethod='scale');
+}
+.cke_skin_office2003 .cke_browser_ie6 .cke_button .cke_buttonarrow
+{
+	filter: ;
 }
 
Index: /CKEditor/trunk/_source/skins/v2/dialog.css
===================================================================
--- /CKEditor/trunk/_source/skins/v2/dialog.css	(revision 6189)
+++ /CKEditor/trunk/_source/skins/v2/dialog.css	(revision 6190)
@@ -201,4 +201,8 @@
 {
 	text-align: left;
+}
+
+.cke_skin_v2 .cke_dialog_footer .cke_resizer {
+	margin-top: 21px;
 }
 
@@ -655,5 +659,5 @@
 	border : 2px ridge black;
 	overflow : scroll;
-	height : 160px;
+	height : 210px;
 	width : 230px;
 	padding : 2px;
@@ -814,2 +818,25 @@
 	border-color: #C7C78F;
 }
+
+
+/**
+ * Styles specific to "cellProperties" dialog.
+ */
+
+.cke_skin_v2 .cke_dialog_contents a.colorChooser
+{
+	display:block;
+	margin-top:12px;
+	margin-left: 10px;
+	width: 40px;
+}
+
+.cke_skin_v2 .cke_dialog_contents a.colorChooser .cke_dialog_ui_button
+{
+	width:100%;
+}
+
+.cke_skin_v2 .cke_rtl .cke_dialog_contents a.colorChooser
+{
+	margin-right: 10px;
+}
Index: /CKEditor/trunk/_source/skins/v2/icons.css
===================================================================
--- /CKEditor/trunk/_source/skins/v2/icons.css	(revision 6189)
+++ /CKEditor/trunk/_source/skins/v2/icons.css	(revision 6190)
@@ -343,5 +343,4 @@
 	background-position: 0 -1200px;
 }
-
 .cke_skin_v2 .cke_button_bidirtl .cke_icon
 {
@@ -353,2 +352,7 @@
 	background-position: 0 -1056px;
 }
+
+.cke_skin_v2 .cke_button_iframe .cke_icon
+{
+	background-position: 0 -1279px;
+}
Index: /CKEditor/trunk/_source/skins/v2/mainui.css
===================================================================
--- /CKEditor/trunk/_source/skins/v2/mainui.css	(revision 6189)
+++ /CKEditor/trunk/_source/skins/v2/mainui.css	(revision 6190)
@@ -103,4 +103,11 @@
 }
 
+/* Adobe AIR doesn't support *-resize cursor shape. */
+.cke_skin_v2 .cke_browser_air .cke_resizer,
+.cke_skin_v2 .cke_browser_air .cke_rtl .cke_resizer
+{
+	cursor: move;
+}
+
 .cke_skin_v2 .cke_rtl .cke_resizer
 {
Index: /CKEditor/trunk/_source/skins/v2/menu.css
===================================================================
--- /CKEditor/trunk/_source/skins/v2/menu.css	(revision 6189)
+++ /CKEditor/trunk/_source/skins/v2/menu.css	(revision 6190)
@@ -49,8 +49,37 @@
 }
 
+/* IE with zoom != 100% will distort the icons otherwise #4821 */
+.cke_browser_ie .cke_skin_v2 .cke_menuitem .cke_icon
+{
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='icons.png', sizingMethod='scale');
+}
+.cke_browser_ie.cke_rtl .cke_skin_v2 .cke_menuitem .cke_icon
+{
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='icons_rtl.png', sizingMethod='scale');
+}
+.cke_browser_ie6 .cke_skin_v2 .cke_menuitem .cke_icon
+{
+	filter: ;
+}
+
 .cke_skin_v2 .cke_menuitem .cke_disabled .cke_icon
 {
 	filter: alpha(opacity=70); /* IE */
 	opacity: 0.70; /* Safari, Opera and Mozilla */
+}
+
+
+/* IE with zoom != 100% will distort the icons otherwise #4821 */
+.cke_browser_ie .cke_skin_v2 .cke_menuitem .cke_disabled .cke_icon
+{
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='icons.png', sizingMethod='scale');
+}
+.cke_browser_ie.cke_rtl .cke_skin_v2 .cke_menuitem .cke_disabled .cke_icon
+{
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='icons_rtl.png', sizingMethod='scale');
+}
+.cke_browser_ie6 .cke_skin_v2 .cke_menuitem .cke_disabled .cke_icon
+{
+	filter: ;
 }
 
Index: /CKEditor/trunk/_source/skins/v2/richcombo.css
===================================================================
--- /CKEditor/trunk/_source/skins/v2/richcombo.css	(revision 6189)
+++ /CKEditor/trunk/_source/skins/v2/richcombo.css	(revision 6190)
@@ -149,4 +149,14 @@
 }
 
+/* IE with zoom != 100% will distort the icons otherwise #4821 */
+.cke_skin_v2 .cke_browser_ie .cke_rcombo .cke_openbutton
+{
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='images/sprites.png', sizingMethod='scale'); 
+}
+.cke_skin_v2 .cke_browser_ie6 .cke_rcombo .cke_openbutton
+{
+	filter: ;
+}
+
 .cke_skin_v2 .cke_rcombo .cke_openbutton span
 {
@@ -240,4 +250,14 @@
 }
 
+/* IE with zoom != 100% will distort the icons otherwise #4821 */
+.cke_skin_v2 .cke_browser_ie .cke_rcombo .cke_disabled .cke_openbutton
+{
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='images/sprites.png', sizingMethod='scale'), alpha(opacity=50);
+}
+.cke_skin_v2 .cke_browser_ie6 .cke_rcombo .cke_disabled .cke_openbutton
+{
+	filter: alpha(opacity=50);
+}
+
 .cke_skin_v2 .cke_hc .cke_rcombo .cke_disabled .cke_text,
 .cke_skin_v2 .cke_hc .cke_rcombo .cke_disabled .cke_openbutton
Index: /CKEditor/trunk/_source/skins/v2/skin.js
===================================================================
--- /CKEditor/trunk/_source/skins/v2/skin.js	(revision 6189)
+++ /CKEditor/trunk/_source/skins/v2/skin.js	(revision 6190)
@@ -6,15 +6,5 @@
 CKEDITOR.skins.add( 'v2', (function()
 {
-	var preload = [];
-
-	if ( CKEDITOR.env.ie && CKEDITOR.env.version < 7 )
-	{
-		// For IE6, we need to preload some images, otherwhise they will be
-		// downloaded several times (CSS background bug).
-		preload.push( 'icons.png', 'images/sprites_ie6.png', 'images/dialog_sides.gif' );
-	}
-
 	return {
-		preload		: preload,
 		editor		: { css : [ 'editor.css' ] },
 		dialog		: { css : [ 'dialog.css' ] },
Index: /CKEditor/trunk/_source/skins/v2/toolbar.css
===================================================================
--- /CKEditor/trunk/_source/skins/v2/toolbar.css	(revision 6189)
+++ /CKEditor/trunk/_source/skins/v2/toolbar.css	(revision 6190)
@@ -239,9 +239,25 @@
 }
 
-.cke_skin_v2 .cke_button a.cke_disabled *,
-.cke_skin_v2 .cke_browser_ie a:hover.cke_button .cke_disabled *
+.cke_skin_v2 .cke_button a.cke_disabled *
 {
 	filter: alpha(opacity=30); /* IE */
 	opacity: 0.3; /* Safari, Opera and Mozilla */
+}
+
+/* IE with zoom != 100% will distort the icons otherwise #4821 */
+.cke_skin_v2 .cke_browser_ie .cke_button a.cke_disabled *,
+.cke_skin_v2 .cke_browser_ie a:hover.cke_button .cke_disabled *
+{
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='icons.png', sizingMethod='scale'), alpha(opacity=30);
+}
+.cke_skin_v2 .cke_browser_ie .cke_rtl .cke_button a.cke_disabled *,
+.cke_skin_v2 .cke_browser_ie .cke_rtl a:hover.cke_button .cke_disabled *
+{
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='icons_rtl.png', sizingMethod='scale'), alpha(opacity=30);
+}
+.cke_skin_v2 .cke_browser_ie6 .cke_button a.cke_disabled *,
+.cke_skin_v2 .cke_browser_ie6 a:hover.cke_button .cke_disabled *
+{
+	filter: alpha(opacity=30);
 }
 
@@ -285,4 +301,18 @@
 {
 	background-image: url(icons_rtl.png);
+}
+
+/* IE with zoom != 100% will distort the icons otherwise #4821 */
+.cke_skin_v2 .cke_browser_ie .cke_button .cke_icon
+{
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='icons.png', sizingMethod='scale'); 
+}
+.cke_skin_v2 .cke_browser_ie .cke_rtl .cke_button .cke_icon
+{
+	filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='icons_rtl.png', sizingMethod='scale'); 
+}
+.cke_skin_v2 .cke_browser_ie6 .cke_button .cke_icon
+{
+	filter: ;
 }
 
Index: /CKEditor/trunk/_source/themes/default/theme.js
===================================================================
--- /CKEditor/trunk/_source/themes/default/theme.js	(revision 6189)
+++ /CKEditor/trunk/_source/themes/default/theme.js	(revision 6190)
@@ -1,3 +1,3 @@
-﻿/*
+/*
 Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
 For licensing, see LICENSE.html or http://ckeditor.com/license
@@ -46,4 +46,8 @@
 			container = mainContainer.getChild( [0,0,0,0] );
 
+			// Save a reference to the shared space container.
+			!editor.sharedSpaces && ( editor.sharedSpaces = {} );
+			editor.sharedSpaces[ spaceName ] = container;
+
 			// When the editor gets focus, we show the space container, hiding others.
 			editor.on( 'focus', function()
@@ -123,5 +127,5 @@
 					' title="', ( CKEDITOR.env.gecko ? ' ' : '' ), '"' +
 					' lang="', editor.langCode, '"' +
-					( CKEDITOR.env.webkit? ' tabindex="' + tabIndex + '"' : '' ) +
+						( CKEDITOR.env.webkit? ' tabindex="' + tabIndex + '"' : '' ) +
 					' role="application"' +
 					' aria-labelledby="cke_', name, '_arialbl"' +
Index: /CKEditor/trunk/ckeditor.pack
===================================================================
--- /CKEditor/trunk/ckeditor.pack	(revision 6189)
+++ /CKEditor/trunk/ckeditor.pack	(revision 6190)
@@ -110,5 +110,4 @@
 					'_source/core/resourcemanager.js',
 					'_source/core/plugins.js',
-					'_source/core/imagecacher.js',
 					'_source/core/skins.js',
 					'_source/core/themes.js',
@@ -157,4 +156,5 @@
 					'_source/plugins/horizontalrule/plugin.js',
 					'_source/plugins/htmldataprocessor/plugin.js',
+					'_source/plugins/iframe/plugin.js',
 					'_source/plugins/image/plugin.js',
 					'_source/plugins/indent/plugin.js',
Index: /CKEditor/trunk/ckeditor_basic_source.js
===================================================================
--- /CKEditor/trunk/ckeditor_basic_source.js	(revision 6189)
+++ /CKEditor/trunk/ckeditor_basic_source.js	(revision 6190)
@@ -6,5 +6,5 @@
 // Compressed version of core/ckeditor_base.js. See original for instructions.
 /*jsl:ignore*/
-if(!window.CKEDITOR)window.CKEDITOR=(function(){var a={timestamp:'',version:'%VERSION%',revision:'%REV%',_:{},status:'unloaded',basePath:(function(){var d=window.CKEDITOR_BASEPATH||'';if(!d){var e=document.getElementsByTagName('script');for(var f=0;f<e.length;f++){var g=e[f].src.match(/(^|.*[\\\/])ckeditor(?:_basic)?(?:_source)?.js(?:\?.*)?$/i);if(g){d=g[1];break;}}}if(d.indexOf('://')==-1)if(d.indexOf('/')===0)d=location.href.match(/^.*?:\/\/[^\/]*/)[0]+d;else d=location.href.match(/^[^\?]*\/(?:)/)[0]+d;return d;})(),getUrl:function(d){if(d.indexOf('://')==-1&&d.indexOf('/')!==0)d=this.basePath+d;if(this.timestamp&&d.charAt(d.length-1)!='/')d+=(d.indexOf('?')>=0?'&':'?')+('t=')+this.timestamp;return d;}},b=window.CKEDITOR_GETURL;if(b){var c=a.getUrl;a.getUrl=function(d){return b.call(a,d)||c.call(a,d);};}return a;})();
+if(!window.CKEDITOR)window.CKEDITOR=(function(){var a={timestamp:'',version:'%VERSION%',revision:'%REV%',_:{},status:'unloaded',basePath:(function(){var d=window.CKEDITOR_BASEPATH||'';if(!d){var e=document.getElementsByTagName('script');for(var f=0;f<e.length;f++){var g=e[f].src.match(/(^|.*[\\\/])ckeditor(?:_basic)?(?:_source)?.js(?:\?.*)?$/i);if(g){d=g[1];break;}}}if(d.indexOf(':/')==-1)if(d.indexOf('/')===0)d=location.href.match(/^.*?:\/\/[^\/]*/)[0]+d;else d=location.href.match(/^[^\?]*\/(?:)/)[0]+d;return d;})(),getUrl:function(d){if(d.indexOf(':/')==-1&&d.indexOf('/')!==0)d=this.basePath+d;if(this.timestamp&&d.charAt(d.length-1)!='/')d+=(d.indexOf('?')>=0?'&':'?')+('t=')+this.timestamp;return d;}},b=window.CKEDITOR_GETURL;if(b){var c=a.getUrl;a.getUrl=function(d){return b.call(a,d)||c.call(a,d);};}return a;})();
 /*jsl:end*/
 
Index: /CKEditor/trunk/ckeditor_source.js
===================================================================
--- /CKEditor/trunk/ckeditor_source.js	(revision 6189)
+++ /CKEditor/trunk/ckeditor_source.js	(revision 6190)
@@ -6,5 +6,5 @@
 // Compressed version of core/ckeditor_base.js. See original for instructions.
 /*jsl:ignore*/
-if(!window.CKEDITOR)window.CKEDITOR=(function(){var a={timestamp:'',version:'%VERSION%',revision:'%REV%',_:{},status:'unloaded',basePath:(function(){var d=window.CKEDITOR_BASEPATH||'';if(!d){var e=document.getElementsByTagName('script');for(var f=0;f<e.length;f++){var g=e[f].src.match(/(^|.*[\\\/])ckeditor(?:_basic)?(?:_source)?.js(?:\?.*)?$/i);if(g){d=g[1];break;}}}if(d.indexOf('://')==-1)if(d.indexOf('/')===0)d=location.href.match(/^.*?:\/\/[^\/]*/)[0]+d;else d=location.href.match(/^[^\?]*\/(?:)/)[0]+d;return d;})(),getUrl:function(d){if(d.indexOf('://')==-1&&d.indexOf('/')!==0)d=this.basePath+d;if(this.timestamp&&d.charAt(d.length-1)!='/')d+=(d.indexOf('?')>=0?'&':'?')+('t=')+this.timestamp;return d;}},b=window.CKEDITOR_GETURL;if(b){var c=a.getUrl;a.getUrl=function(d){return b.call(a,d)||c.call(a,d);};}return a;})();
+if(!window.CKEDITOR)window.CKEDITOR=(function(){var a={timestamp:'',version:'%VERSION%',revision:'%REV%',_:{},status:'unloaded',basePath:(function(){var d=window.CKEDITOR_BASEPATH||'';if(!d){var e=document.getElementsByTagName('script');for(var f=0;f<e.length;f++){var g=e[f].src.match(/(^|.*[\\\/])ckeditor(?:_basic)?(?:_source)?.js(?:\?.*)?$/i);if(g){d=g[1];break;}}}if(d.indexOf(':/')==-1)if(d.indexOf('/')===0)d=location.href.match(/^.*?:\/\/[^\/]*/)[0]+d;else d=location.href.match(/^[^\?]*\/(?:)/)[0]+d;return d;})(),getUrl:function(d){if(d.indexOf(':/')==-1&&d.indexOf('/')!==0)d=this.basePath+d;if(this.timestamp&&d.charAt(d.length-1)!='/')d+=(d.indexOf('?')>=0?'&':'?')+('t=')+this.timestamp;return d;}},b=window.CKEDITOR_GETURL;if(b){var c=a.getUrl;a.getUrl=function(d){return b.call(a,d)||c.call(a,d);};}return a;})();
 /*jsl:end*/
 
