Index: CKEditor/branches/versions/3.5.x/CHANGES.html
===================================================================
--- CKEditor/branches/versions/3.5.x/CHANGES.html	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/CHANGES.html	(revision 6050)
@@ -1,3 +1,3 @@
-﻿<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!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.
@@ -55,5 +55,75 @@
 	</ul>
 	<h3>
-			CKEditor 3.4.1 (SVN)</h3>
+			CKEditor 3.4.2</h3>
+	<p>
+			New features:</p>
+	<ul>
+		<li><a href="http://dev.ckeditor.com/ticket/5024">#5024</a> : Added a sample that shows how to output HTML that is valid for Flash.</li>
+	</ul>
+	<p>
+			Fixed issues:</p>
+	<ul>
+		<li><a href="http://dev.ckeditor.com/ticket/5237">#5237</a> : English text in dialogs' title was flipped when using RTL language (office2003 and v2 skins).</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6289">#6289</a> : Deleting nested table removed the parent cell.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6341">#6341</a> : The editor contents now has the text cursor.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6153">#6153</a> : Chrome: tab focus is wrong.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6261">#6261</a> : Focus and infinite loop between multiple editors.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6170">#6170</a> : Dedicated class names are removed from floating panels when opening another panel.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6339">#6339</a> : Autogrow plugin now doesn't work on maximized editors.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6237">#6237</a> : BIDI: Applying same language direction to all paragraphs not working.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6353">#6353</a> : [IE] Resize was broken with office2003 and v2 skins.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6375">#6375</a> : Avoiding errors when hiding the editor after the blur event.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6133">#6133</a> : Styled paragraphs result on buggy list creation.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/5074">#5074</a> : Link target is not removed when changing to popup.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6408">#6408</a> : [IE] Autogrow now works correctly on Quirks.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6420">#6420</a> : [IE] The table properties dialog now correctly retrieves the caption text.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6141">#6141</a> : It was impossible to outdent a list when indentOffset was set to 0.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6377">#6377</a> : FF width and height are not shown for smiley in Image properties dialog.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/5399">#5399</a> : Lists pasted from Word do not maintain their nesting.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6225">#6225</a> : [FF] Can not transform sevaral lines to list with enterMode BR.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6467">#6467</a> : [FF] It is now possible to disable the plugin command on "mode" event.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6461">#6461</a> : Attributes are now being kept when changing block formatting.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6226">#6226</a> : BIDI: Language direction applied to a Paragraph is removed when we apply one of Paragraph formatting options.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/5395">#5395</a> : [Opera] Native context menu incorrectly opened after Opera 10.2.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6444">#6444</a> : [Opera] Close panels and dialogs don't return focus to wysiwyg frame.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6332">#6332</a> : IE: V2 skin bottom dialog's border broken.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/5646">#5646</a> : Parser incorreclty removes inline element when there's only one comment node enclosed.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6189">#6189</a> : Minor code size reduction.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/5045">#5045</a> : uiColor behaved wrong if multiple editors were used with period in their names.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/5766">#5766</a> : Config entry "ignoreEmptyParagraph" should only remove one single empty paragraph in document.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/5931">#5931</a> : Unable to apply inline style because of nested elements with same style name.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6083">#6083</a> : Dialog close sometimes cause collapsed editor selection before the insertion.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6253">#6253</a> : BIDI: creating a Numbered/Bulleted list causing improper behavior on bidi.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/4023">#4023</a> : [Opera] Maximize plugin.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6403">#6403</a> : [Opera] Font name options is not correctly marked in dropdown list.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/4534">#4534</a> : [Opera] Arrow key to navigate through combo list has side effects of window scrolling.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6534">#6534</a> : [Opera] Menu key brings up both CKEditor and browser context menu.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6534">#6534</a> : [Opera] Menu key brings up both CKEditor and browser context menu.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6416">#6416</a> : [IE9] Unable to make text selection with mouse in source area.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6417">#6417</a> : [IE9] Context menu opens at the upper-left corner always.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6501">#6501</a> : [IE9] Context menu item layout is broken.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6099">#6099</a> : BIDI: when we apply explicit language direction to Numbered/Bulleted List the corresponding BIDI Tool bar icon is not highlighted in the Toolbar.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6100">#6100</a> : BIDI: when we change Table language direction indentation of text in Table cells is not applied correctly.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6376">#6376</a> : BIDI: buttons should not toggle the base language direction.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6235">#6235</a> : BIDI: Applying direction to multi-paragraph selection within a div.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6187">#6187</a> : [IE6] Multi-instance loading produces 404s on background images.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/5446">#5446</a> : Setting config.filebrowserImageBrowseUrl results in displaying also Browser Server on links.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/5626">#5626</a> : CKeditor 3.2.1 : html content attached makes ckeditor crash the browser FF/IE.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6508">#6508</a> : BiDi: Margin mirroring logic doesn't honor CSS direction.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6043">#6043</a> : BIDI: When we apply RTL direction to a right aligned Paragraph, Paragraph is not moved to left & Alignment of Paragraph is not changed.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6485">#6485</a> : BIDI: When direction is applied on partial selected list, the style is been incorrectly applied on the entired list.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6087">#6087</a> : Cursor of input fields in dialog isn't visible in RLT .</li>
+		<li><a href="http://dev.ckeditor.com/ticket/5595">#5595</a> : Extra leading spaces added in preformatted block.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6094">#6094</a> : Match full word option doesn't stop on block boundaries.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/5730">#5730</a> : [Safari] Continual pastes (holding paste key) breaks document contents.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/5850">#5850</a> : [IE] Inline style misbehaviors at the beginning of numbered/bulleted list.</li>
+		<li>Updated the following language files:<ul>
+			<li><a href="http://dev.ckeditor.com/ticket/6427">#6427</a> : Ukrainian;</li>
+			<li><a href="http://dev.ckeditor.com/ticket/6464">#6464</a> : Finnish;</li>
+			<li>Hebrew;</li>
+		</ul></li>
+	</ul>
+	<h3>
+			CKEditor 3.4.1</h3>
 	<p>
 			New features:</p>
@@ -71,5 +141,47 @@
 		<li><a href="http://dev.ckeditor.com/ticket/5956">#5956</a> : [FF] It was impossible to create an editor inside an hidden container.</li>
 		<li><a href="http://dev.ckeditor.com/ticket/5753">#5753</a> : It was impossible to have a default value for the name field in the select dialog.</li>
-		<li><a href="http://dev.ckeditor.com/ticket/6041">#6041</a> : BIDI: Direction of Increase Indent & Decrease Indent icons are not reversed after changing Lang direction to RTL.</li>		
+		<li><a href="http://dev.ckeditor.com/ticket/6041">#6041</a> : BIDI: Direction of Increase Indent & Decrease Indent icons are not reversed after changing Lang direction to RTL.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6138">#6138</a> : List indentation is not working.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/5649">#5649</a> : Image dialog too wide when many styles are set.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/5715">#5715</a> : Cell color picker dialog returns focus to document.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6108">#6108</a> : Fixed div style.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/5336">#5336</a> : Remove object style.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6155">#6155</a> : [[FF]] Modifying Table Header Properties by selecting first Row, causing several issues.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6163">#6163</a> : Focus not going to Tabs in Image dialog when we went to Edit the Image.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6177">#6177</a> : IE we can't start Numbered/Bulleted list on a Empty page.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/5413">#5413</a> : Browser error after pasting html table in CKEditor.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6034">#6034</a> : Horizontal Alignment applied to Table cell is not updated correctly in the Toolbar.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6112">#6112</a> : BIDI: Alignment set to text in Table cell is not shown in the Tool bar when we press Enter to start a new Paragraph.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6117">#6117</a> : BIDI: Language direction is changing when we come out of Numbered/Bulleted list.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6182">#6182</a> : Language Direction field on the Advanced tab of Table Properties dialog has a fixed pixel width.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/5487">#5487</a> : Fullpage writer problem with line-break.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6197">#6197</a> : The CKEDITOR.loader base path auto-detection was not working with the _source folder.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6240">#6240</a> : Font Names & Font Sizes should be shown Left Align even for RTL Languages.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/5975">#5975</a> : Page-break should have proper Alt Text instead of Unknown object. so that JAWS reads it properly.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6255">#6255</a> : Inserting a page break as the first node triggered an error.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6188">#6188</a> : [IE7] Automatic color button had the wrong cursor.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6129">#6129</a> : The show blocks' labels are now shown in the right for RTL languages.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/5421">#5421</a> : &amp;shy; entity not converted when config.entities=false.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/5769">#5769</a> : xhtml code generation problem &amp;nbsp; instead of &amp;#160; (htmlentities, entities,entities_additional,..., configuration).</li>
+		<li><a href="http://dev.ckeditor.com/ticket/4472">#4472</a> : [FF3] Browser window scrolls to loaded CKEditor.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6230">#6230</a> : Fixed invalid parameter count for setTimeout function call.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/5335">#5335</a> : Several lines' formatted data will be merged to one line when we apply Numbers/Bullets.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/5353">#5353</a> : wrong width of editor after resize() called in Firefox 3.6.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/5778">#5778</a> : [IE] Unwanted scroll on first mouse right-click.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/5218">#5218</a> : [FF] Copy/paste of an image from same domain changed URL to relative URL.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6265">#6265</a> : Popup window properties were visible in the link dialog's target tab when nothing was selected.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6075">#6075</a> : [FF] Newly created links didn't fill in information on edit.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6183">#6183</a> : The toolbar panels options sometimes had the contents' link color.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6192">#6192</a> : [WebKit] Inserting smileys was not working because of editor focus issues.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6178">#6178</a> : [WebKit] Inserting elements by code was failing if the editor didn't receive the focus first.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6179">#6179</a> : [WebKit] The Image dialog was not working if the editor didn't receive the focus first.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/4657">#4657</a> : [Opera] Styles where not working with collapsed selections.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/5839">#5839</a> : "Insert row after" was removing the ids of the elements from the clicked row.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6315">#6315</a> : DIV plugin TT #2885 regression.</li>
+		<li>Updated the following language files:<ul>
+			<li><a href="http://dev.ckeditor.com/ticket/6246">#6246</a> : Chinese Simplified;</li>
+			<li><a href="http://dev.ckeditor.com/ticket/6256">#6256</a> : Dutch;</li>
+			<li><a href="http://dev.ckeditor.com/ticket/6271">#6271</a> : English;</li>
+		</ul></li>
 	</ul>
 	<h3>
Index: CKEditor/branches/versions/3.5.x/_dev/docs_build/docs_build.conf
===================================================================
--- CKEditor/branches/versions/3.5.x/_dev/docs_build/docs_build.conf	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_dev/docs_build/docs_build.conf	(revision 6050)
@@ -17,5 +17,6 @@
 		'../../_source/core/',
 		'../../_source/plugins/',
-		'../../_source/skins/kama/skin.js'
+		'../../_source/skins/kama/skin.js',
+		'../../_source/themes/default/theme.js'
 	],
 
Index: CKEditor/branches/versions/3.5.x/_dev/docs_build/template/class.tmpl
===================================================================
--- CKEditor/branches/versions/3.5.x/_dev/docs_build/template/class.tmpl	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_dev/docs_build/template/class.tmpl	(revision 6050)
@@ -54,4 +54,7 @@
 					{+ data.version +}.<br />
 				</if>
+
+				{+resolveLinks(data.classDesc)+}
+				
 				<if test="data.augments.length"><br />Extends
 					{+
@@ -62,9 +65,7 @@
 						)
 						.join(", ")
-					+}.<br />
+					+}.
 				</if>
 			
-				{+resolveLinks(data.classDesc)+}
-				
 				<if test="!data.isBuiltin()">{# isn't defined in any file #}
 					<br /><i>Defined in: </i> {+ ckeditor_FileLink( data.srcFile ) +}.
@@ -73,5 +74,5 @@
 
 <!-- ============================== constructor summary ==================== -->			
-			<if test="!data.isBuiltin() && (data.isNamespace || data.is('CONSTRUCTOR'))">
+			<if test="!data.isBuiltin() && data.is('CONSTRUCTOR')">
 			<table class="summaryTable" cellspacing="0" summary="A summary of the constructor documented in the class {+data.alias+}.">
 				<caption>{+classType+}Summary</caption>
@@ -273,5 +274,5 @@
 							!}&nbsp;</td>
 							<td class="nameDescription">
-								<div class="fixedFont"><if test="member.isStatic && member.memberOf != '_global_'">{+member.memberOf+}.</if><b>{+new Link().toSymbol(member.alias).withText(member.name)+}</b>{+makeSignature(member.params)+}
+								<div class="fixedFont"><if test="member.isStatic && member.memberOf != '_global_'">{+member.memberOf+}.</if><b>{+new Link().toSymbol(member.alias).withText(member.name)+}</b>
 								</div>
 								<div class="description">{+resolveLinks(summarize(member.desc))+}</div>
@@ -313,5 +314,5 @@
 
 <!-- ============================== constructor details ==================== -->		
-			<if test="!data.isBuiltin() && (data.isNamespace || data.is('CONSTRUCTOR'))">
+			<if test="!data.isBuiltin() && data.is('CONSTRUCTOR')">
 			<div class="details"><a name="constructor"> </a>
 				<div class="sectionTitle">
Index: CKEditor/branches/versions/3.5.x/_dev/docs_build/template/publish.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_dev/docs_build/template/publish.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_dev/docs_build/template/publish.js	(revision 6050)
@@ -1,3 +1,3 @@
-﻿/** Called automatically by JsDoc Toolkit. */
+/** Called automatically by JsDoc Toolkit. */
 function publish(symbolSet) {
 	publish.conf = {  // trailing slash expected for dirs
@@ -79,5 +79,8 @@
 
 		symbol.events = symbol.getEvents();   // 1 order matters
-		symbol.methods = symbol.getMethods(); // 2
+		symbol.methods = symbol.getMethods().filter( function( $ )
+			{
+				return !$.isInner;
+			}); // 2
 
 		var output = "";
Index: CKEditor/branches/versions/3.5.x/_dev/docs_build/template/static/default.css
===================================================================
--- CKEditor/branches/versions/3.5.x/_dev/docs_build/template/static/default.css	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_dev/docs_build/template/static/default.css	(revision 6050)
@@ -36,7 +36,7 @@
 #index
 {
-	margin-top: 24px;
+	margin-top: 14px;
 	float: left;
-	width: 160px;
+	width: 220px;
 	position: absolute;
 	left: 8px;
@@ -47,5 +47,5 @@
 #content
 {
-	margin-left: 190px;
+	margin-left: 250px;
 }
 
Index: CKEditor/branches/versions/3.5.x/_samples/api.html
===================================================================
--- CKEditor/branches/versions/3.5.x/_samples/api.html	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_samples/api.html	(revision 6050)
@@ -64,5 +64,5 @@
 }
 
-function ExecuteCommand(commandName)
+function ExecuteCommand( commandName )
 {
 	// Get the editor instance that we want to interact with.
@@ -114,5 +114,5 @@
 	<form action="sample_posteddata.php" method="post">
 		<p>
-			This sample shows how to use the CKeditor JavaScript API to interact with the editor
+			This sample shows how to use the CKEditor JavaScript API to interact with the editor
 			at runtime.</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>
Index: CKEditor/branches/versions/3.5.x/_samples/assets/swfobject.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_samples/assets/swfobject.js	(revision 6050)
+++ CKEditor/branches/versions/3.5.x/_samples/assets/swfobject.js	(revision 6050)
@@ -0,0 +1,18 @@
+﻿/**
+ * SWFObject v1.5: Flash Player detection and embed - http://blog.deconcept.com/swfobject/
+ *
+ * SWFObject is (c) 2007 Geoff Stearns and is released under the MIT License:
+ * http://www.opensource.org/licenses/mit-license.php
+ *
+ */
+/*
+Copyright (c) 2007 Geoff Stearns
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+/*jsl:ignoreall*/
+if(typeof deconcept=="undefined"){var deconcept=new Object();}if(typeof deconcept.util=="undefined"){deconcept.util=new Object();}if(typeof deconcept.SWFObjectUtil=="undefined"){deconcept.SWFObjectUtil=new Object();}deconcept.SWFObject=function(_1,id,w,h,_5,c,_7,_8,_9,_a){if(!document.getElementById){return;}this.DETECT_KEY=_a?_a:"detectflash";this.skipDetect=deconcept.util.getRequestParameter(this.DETECT_KEY);this.params=new Object();this.variables=new Object();this.attributes=new Array();if(_1){this.setAttribute("swf",_1);}if(id){this.setAttribute("id",id);}if(w){this.setAttribute("width",w);}if(h){this.setAttribute("height",h);}if(_5){this.setAttribute("version",new deconcept.PlayerVersion(_5.toString().split(".")));}this.installedVer=deconcept.SWFObjectUtil.getPlayerVersion();if(!window.opera&&document.all&&this.installedVer.major>7){deconcept.SWFObject.doPrepUnload=true;}if(c){this.addParam("bgcolor",c);}var q=_7?_7:"high";this.addParam("quality",q);this.setAttribute("useExpressInstall",false);this.setAttribute("doExpressInstall",false);var _c=(_8)?_8:window.location;this.setAttribute("xiRedirectUrl",_c);this.setAttribute("redirectUrl","");if(_9){this.setAttribute("redirectUrl",_9);}};deconcept.SWFObject.prototype={useExpressInstall:function(_d){this.xiSWFPath=!_d?"expressinstall.swf":_d;this.setAttribute("useExpressInstall",true);},setAttribute:function(_e,_f){this.attributes[_e]=_f;},getAttribute:function(_10){return this.attributes[_10];},addParam:function(_11,_12){this.params[_11]=_12;},getParams:function(){return this.params;},addVariable:function(_13,_14){this.variables[_13]=_14;},getVariable:function(_15){return this.variables[_15];},getVariables:function(){return this.variables;},getVariablePairs:function(){var _16=new Array();var key;var _18=this.getVariables();for(key in _18){_16[_16.length]=key+"="+_18[key];}return _16;},getSWFHTML:function(){var _19="";if(navigator.plugins&&navigator.mimeTypes&&navigator.mimeTypes.length){if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","PlugIn");this.setAttribute("swf",this.xiSWFPath);}_19="<embed type=\"application/x-shockwave-flash\" src=\""+this.getAttribute("swf")+"\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\" style=\""+this.getAttribute("style")+"\"";_19+=" id=\""+this.getAttribute("id")+"\" name=\""+this.getAttribute("id")+"\" ";var _1a=this.getParams();for(var key in _1a){_19+=[key]+"=\""+_1a[key]+"\" ";}var _1c=this.getVariablePairs().join("&");if(_1c.length>0){_19+="flashvars=\""+_1c+"\"";}_19+="/>";}else{if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","ActiveX");this.setAttribute("swf",this.xiSWFPath);}_19="<object id=\""+this.getAttribute("id")+"\" classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\" style=\""+this.getAttribute("style")+"\">";_19+="<param name=\"movie\" value=\""+this.getAttribute("swf")+"\" />";var _1d=this.getParams();for(var key in _1d){_19+="<param name=\""+key+"\" value=\""+_1d[key]+"\" />";}var _1f=this.getVariablePairs().join("&");if(_1f.length>0){_19+="<param name=\"flashvars\" value=\""+_1f+"\" />";}_19+="</object>";}return _19;},write:function(_20){if(this.getAttribute("useExpressInstall")){var _21=new deconcept.PlayerVersion([6,0,65]);if(this.installedVer.versionIsValid(_21)&&!this.installedVer.versionIsValid(this.getAttribute("version"))){this.setAttribute("doExpressInstall",true);this.addVariable("MMredirectURL",escape(this.getAttribute("xiRedirectUrl")));document.title=document.title.slice(0,47)+" - Flash Player Installation";this.addVariable("MMdoctitle",document.title);}}if(this.skipDetect||this.getAttribute("doExpressInstall")||this.installedVer.versionIsValid(this.getAttribute("version"))){var n=(typeof _20=="string")?document.getElementById(_20):_20;n.innerHTML=this.getSWFHTML();return true;}else{if(this.getAttribute("redirectUrl")!=""){document.location.replace(this.getAttribute("redirectUrl"));}}return false;}};deconcept.SWFObjectUtil.getPlayerVersion=function(){var _23=new deconcept.PlayerVersion([0,0,0]);if(navigator.plugins&&navigator.mimeTypes.length){var x=navigator.plugins["Shockwave Flash"];if(x&&x.description){_23=new deconcept.PlayerVersion(x.description.replace(/([a-zA-Z]|\s)+/,"").replace(/(\s+r|\s+b[0-9]+)/,".").split("."));}}else{if(navigator.userAgent&&navigator.userAgent.indexOf("Windows CE")>=0){var axo=1;var _26=3;while(axo){try{_26++;axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash."+_26);_23=new deconcept.PlayerVersion([_26,0,0]);}catch(e){axo=null;}}}else{try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");}catch(e){try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");_23=new deconcept.PlayerVersion([6,0,21]);axo.AllowScriptAccess="always";}catch(e){if(_23.major==6){return _23;}}try{axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");}catch(e){}}if(axo!=null){_23=new deconcept.PlayerVersion(axo.GetVariable("$version").split(" ")[1].split(","));}}}return _23;};deconcept.PlayerVersion=function(_29){this.major=_29[0]!=null?parseInt(_29[0]):0;this.minor=_29[1]!=null?parseInt(_29[1]):0;this.rev=_29[2]!=null?parseInt(_29[2]):0;};deconcept.PlayerVersion.prototype.versionIsValid=function(fv){if(this.major<fv.major){return false;}if(this.major>fv.major){return true;}if(this.minor<fv.minor){return false;}if(this.minor>fv.minor){return true;}if(this.rev<fv.rev){return false;}return true;};deconcept.util={getRequestParameter:function(_2b){var q=document.location.search||document.location.hash;if(_2b==null){return q;}if(q){var _2d=q.substring(1).split("&");for(var i=0;i<_2d.length;i++){if(_2d[i].substring(0,_2d[i].indexOf("="))==_2b){return _2d[i].substring((_2d[i].indexOf("=")+1));}}}return "";}};deconcept.SWFObjectUtil.cleanupSWFs=function(){var _2f=document.getElementsByTagName("OBJECT");for(var i=_2f.length-1;i>=0;i--){_2f[i].style.display="none";for(var x in _2f[i]){if(typeof _2f[i][x]=="function"){_2f[i][x]=function(){};}}}};if(deconcept.SWFObject.doPrepUnload){if(!deconcept.unloadSet){deconcept.SWFObjectUtil.prepUnload=function(){__flash_unloadHandler=function(){};__flash_savedUnloadHandler=function(){};window.attachEvent("onunload",deconcept.SWFObjectUtil.cleanupSWFs);};window.attachEvent("onbeforeunload",deconcept.SWFObjectUtil.prepUnload);deconcept.unloadSet=true;}}if(!document.getElementById&&document.all){document.getElementById=function(id){return document.all[id];};}var getQueryParamValue=deconcept.util.getRequestParameter;var FlashObject=deconcept.SWFObject;var SWFObject=deconcept.SWFObject;
Index: CKEditor/branches/versions/3.5.x/_samples/index.html
===================================================================
--- CKEditor/branches/versions/3.5.x/_samples/index.html	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_samples/index.html	(revision 6050)
@@ -42,4 +42,5 @@
 		<li><a href="output_xhtml.html">Output XHTML</a></li>
 		<li><a href="output_html.html">Output HTML</a></li>
+		<li><a href="output_for_flash.html">Output for Flash</a></li>
 		<li><a href="autogrow.html">AutoGrow plugin</a></li>
 	</ul>
Index: CKEditor/branches/versions/3.5.x/_samples/output_for_flash.html
===================================================================
--- CKEditor/branches/versions/3.5.x/_samples/output_for_flash.html	(revision 6050)
+++ CKEditor/branches/versions/3.5.x/_samples/output_for_flash.html	(revision 6050)
@@ -0,0 +1,261 @@
+<!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>Output for Flash</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" />
+	<script type="text/javascript" src="assets/swfobject.js"></script>
+	<script type="text/javascript">
+function sendToFlash()
+{
+	var html = CKEDITOR.instances.editor1.getData() ;
+	var flash = document.getElementById( 'ckFlash' ) ;
+	flash.setData( html ) ;
+}
+
+function init()
+{
+	var so = new SWFObject("assets/output_for_flash.swf", "ckFlash", "550", "400", "8", "#ffffff") ;
+	so.addParam("wmode", "transparent");
+	so.write("ckFlashContainer") ;
+}
+	</script>
+	</head>
+<body onload="init()">
+	<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>
+
+	<div>
+		This sample shows CKEditor configured to produce HTML code that can be used with
+		<a href="http://www.adobe.com/livedocs/flash/9.0/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&amp;file=00000922.html">
+			Flash</a>.
+	</div>
+	<hr />
+	<table width="100%" cellpadding="0" cellspacing="0">
+		<tr>
+			<td style="width: 100%">
+			<textarea cols="80" id="editor1" name="editor1" rows="10">&lt;p&gt;This is some &lt;b&gt;sample text&lt;/b&gt;. You are using &lt;a href="http://ckeditor.com/"&gt;CKEditor&lt;/a&gt;.&lt;/p&gt;</textarea>
+			<script type="text/javascript">
+			//<![CDATA[
+
+				if ( document.location.protocol == 'file:' )
+					alert( 'Warning: This samples does not work when loaded from local filesystem due to security restrictions implemented in Flash.' +
+									'\n\nPlease load the sample from a web server instead.') ;
+
+				CKEDITOR.replace( 'editor1',
+					{
+						height : 300,
+						width : '100%',
+						toolbar : [
+								['Source','-','Bold','Italic','Underline','-','BulletedList','-','Link','Unlink'],
+								['JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock'],
+								'/',
+								['Font','FontSize','-','TextColor','-','About']
+							],
+
+						/*
+						 * Style sheet for the contents
+						 */
+						contentsCss : 'body {color:#000; background-color#FFF; font-family: Arial; font-size:80%;} p, ol, ul {margin-top: 0px; margin-bottom: 0px;}',
+
+						/*
+						 * Quirks doctype
+						 */
+						docType : '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">',
+
+						/*
+						 * Core styles.
+						 */
+						coreStyles_bold	: { element : 'b' },
+						coreStyles_italic	: { element : 'i' },
+						coreStyles_underline	: { element : 'u'},
+
+						/*
+						 * Font face
+						 */
+						// Define the way font elements will be applied to the document. The "font"
+						// element will be used.
+						font_style :
+						{
+								element		: 'font',
+								attributes		: { 'face' : '#(family)' }
+						},
+
+						/*
+						 * Font sizes.
+						 * The CSS part of the font sizes isn't used by Flash, it is there to get the
+						 * font rendered correctly in CKEditor.
+						 */
+						fontSize_sizes : '8px/8;9px/9;10px/10;11px/11;12px/12;14px/14;16px/16;18px/18;20px/20;22px/22;24px/24;26px/26;28px/28;36px/36;48px/48;72px/72',
+						fontSize_style :
+							{
+								element		: 'font',
+								attributes	: { 'size' : '#(size)' },
+								styles		: { 'font-size' : '#(size)px' }
+							} ,
+
+						/*
+						 * Font colors.
+						 */
+						colorButton_enableMore : true,
+
+						colorButton_foreStyle :
+							{
+								element : 'font',
+								attributes : { 'color' : '#(color)' }
+							},
+
+						colorButton_backStyle :
+							{
+								element : 'font',
+								styles	: { 'background-color' : '#(color)' }
+							},
+
+
+						on : { 'instanceReady' : configureFlashOutput }
+					});
+
+/*
+ * Adjust the behavior of the dataProcessor to match the
+ * requirements of Flash
+ */
+function configureFlashOutput( ev )
+{
+	var editor = ev.editor,
+		dataProcessor = editor.dataProcessor,
+		htmlFilter = dataProcessor && dataProcessor.htmlFilter;
+
+	// Out self closing tags the HTML4 way, like <br>.
+	dataProcessor.writer.selfClosingEnd = '>';
+
+	// Make output formatting match Flash expectations
+	var dtd = CKEDITOR.dtd;
+	for ( var e in CKEDITOR.tools.extend( {}, dtd.$nonBodyContent, dtd.$block, dtd.$listItem, dtd.$tableContent ) )
+	{
+		dataProcessor.writer.setRules( e,
+			{
+				indent : false,
+				breakBeforeOpen : false,
+				breakAfterOpen : false,
+				breakBeforeClose : false,
+				breakAfterClose : false
+			});
+	}
+	dataProcessor.writer.setRules( 'br',
+		{
+			indent : false,
+			breakBeforeOpen : false,
+			breakAfterOpen : false,
+			breakBeforeClose : false,
+			breakAfterClose : false
+		});
+
+	// Output properties as attributes, not styles.
+	htmlFilter.addRules(
+		{
+			elements :
+			{
+				$ : function( element )
+				{
+					var style, match, width, height, align;
+
+					// Output dimensions of images as width and height
+					if ( element.name == 'img' )
+					{
+						style = element.attributes.style;
+
+						if ( style )
+						{
+							// Get the width from the style.
+							match = /(?:^|\s)width\s*:\s*(\d+)px/i.exec( style );
+							width = match && match[1];
+
+							// Get the height from the style.
+							match = /(?:^|\s)height\s*:\s*(\d+)px/i.exec( style );
+							height = match && match[1];
+
+							if ( width )
+							{
+								element.attributes.style = element.attributes.style.replace( /(?:^|\s)width\s*:\s*(\d+)px;?/i , '' );
+								element.attributes.width = width;
+							}
+
+							if ( height )
+							{
+								element.attributes.style = element.attributes.style.replace( /(?:^|\s)height\s*:\s*(\d+)px;?/i , '' );
+								element.attributes.height = height;
+							}
+						}
+					}
+
+					// Output alignment of paragraphs using align
+					if ( element.name == 'p' )
+					{
+						style = element.attributes.style;
+
+						if ( style )
+						{
+							// Get the align from the style.
+							match = /(?:^|\s)text-align\s*:\s*(\w*);?/i.exec( style );
+							align = match && match[1];
+
+							if ( align )
+							{
+								element.attributes.style = element.attributes.style.replace( /(?:^|\s)text-align\s*:\s*(\w*);?/i , '' );
+								element.attributes.align = align;
+							}
+						}
+					}
+
+					if ( element.attributes.style == '' )
+						delete element.attributes.style;
+
+					return element;
+				}
+			}
+
+		} );
+}
+
+			//]]>
+			</script>
+				<input type="button" value="Send to Flash" onclick="sendToFlash();" />
+			</td>
+			<td valign="top" style="padding-left: 15px" id="ckFlashContainer">
+			</td>
+		</tr>
+	</table>
+
+	<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/branches/versions/3.5.x/_source/core/_bootstrap.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/core/_bootstrap.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/core/_bootstrap.js	(revision 6050)
@@ -67,7 +67,5 @@
 	});
 
-/*
-TODO: Enable the following and check if effective.
-
+// Needed for IE6 to not request image (HTTP 200 or 304) for every CSS background. (#6187)
 if ( CKEDITOR.env.ie )
 {
@@ -83,5 +81,12 @@
 	}
 }
-*/
+
+/**
+ * Indicates that CKEditor is running on a High Contrast environment.
+ * @name CKEDITOR.env.hc
+ * @example
+ * if ( CKEDITOR.env.hc )
+ *     alert( 'You're running on High Contrast mode. The editor interface will get adapted to provide you a better experience.' );
+ */
 
 /**
Index: CKEditor/branches/versions/3.5.x/_source/core/ajax.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/core/ajax.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/core/ajax.js	(revision 6050)
@@ -10,6 +10,5 @@
 
 /**
- * Ajax methods for data loading.
- * @namespace
+ * @namespace Ajax methods for data loading.
  * @example
  */
Index: CKEditor/branches/versions/3.5.x/_source/core/ckeditor.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/core/ckeditor.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/core/ckeditor.js	(revision 6050)
@@ -107,7 +107,27 @@
 
 /**
+ * The editor which is currently active (have user focus).
+ * @name CKEDITOR.currentInstance
+ * @type CKEDITOR.editor
+ * @see CKEDITOR#currentInstance
+ * @example
+ * function showCurrentEditorName()
+ * {
+ *     if ( CKEDITOR.currentInstance )
+ *         alert( CKEDITOR.currentInstance.name );
+ *     else
+ *         alert( 'Please focus an editor first.' );
+ * }
+ */
+
+/**
  * Fired when the CKEDITOR.currentInstance object reference changes. This may
  * happen when setting the focus on different editor instances in the page.
  * @name CKEDITOR#currentInstance
  * @event
+ * var editor;  // Variable to hold a reference to the current editor.
+ * CKEDITOR.on( 'currentInstance' , function( e )
+ *     {
+ *         editor = CKEDITOR.currentInstance;
+ *     });
  */
Index: CKEditor/branches/versions/3.5.x/_source/core/ckeditor_base.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/core/ckeditor_base.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/core/ckeditor_base.js	(revision 6050)
@@ -21,7 +21,6 @@
 {
 	/**
-	 * This is the API entry point. The entire CKEditor code runs under this object.
 	 * @name CKEDITOR
-	 * @namespace
+	 * @namespace This is the API entry point. The entire CKEditor code runs under this object.
 	 * @example
 	 */
@@ -53,5 +52,5 @@
 			 * @type String
 			 * @example
-			 * alert( CKEDITOR.version );  // e.g. 'CKEditor 3.0 Beta'
+			 * alert( CKEDITOR.version );  // e.g. 'CKEditor 3.4.1'
 			 */
 			version : '%VERSION%',
@@ -59,5 +58,6 @@
 			/**
 			 * Contains the CKEditor revision number.
-			 * Revision number is incremented automatically after each modification of CKEditor source code.
+			 * The revision number is incremented automatically, following each
+			 * modification to the CKEditor source code.
 			 * @type String
 			 * @example
@@ -146,10 +146,13 @@
 			 * Gets the full URL for CKEditor resources. By default, URLs
 			 * returned by this function contains a querystring parameter ("t")
-			 * set to the {@link CKEDITOR.timestamp} value.
+			 * set to the {@link CKEDITOR.timestamp} value.<br />
+			 * <br />
 			 * It's possible to provide a custom implementation to this
 			 * function by setting a global variable named CKEDITOR_GETURL.
 			 * This global variable must be set "before" the editor script
-			 * loading. If the custom implementation returns nothing, the
+			 * loading. If the custom implementation returns nothing (==null), the
 			 * default implementation is used.
+			 * @param {String} resource The resource to which get the full URL.
+			 *		It may be a full, absolute or relative URL.
 			 * @returns {String} The full URL.
 			 * @example
@@ -170,5 +173,5 @@
 
 				// Add the timestamp, except for directories.
-				if ( this.timestamp && resource.charAt( resource.length - 1 ) != '/' && !/[&?]t=/.test( resource ) )
+				if ( this.timestamp && resource.charAt( resource.length - 1 ) != '/' && !(/[&?]t=/).test( resource ) )
 					resource += ( resource.indexOf( '?' ) >= 0 ? '&' : '?' ) + 't=' + this.timestamp;
 
Index: CKEditor/branches/versions/3.5.x/_source/core/ckeditor_basic.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/core/ckeditor_basic.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/core/ckeditor_basic.js	(revision 6050)
@@ -30,5 +30,5 @@
 			if ( CKEDITOR.status != 'basic_ready' )
 			{
-				CKEDITOR.loadFullCore._load = true;
+				CKEDITOR.loadFullCore._load = 1;
 				return;
 			}
@@ -79,5 +79,5 @@
 		 * <b>CKEDITOR.replaceByClassEnabled</b> = false;
 		 */
-		CKEDITOR.replaceByClassEnabled = true;
+		CKEDITOR.replaceByClassEnabled = 1;
 
 		var createInstance = function( elementOrIdOrName, config, creationFunction, data )
@@ -139,8 +139,5 @@
 		};
 
-		/**
-		 * @ignore
-		 * Documented at ckeditor.js.
-		 */
+		// Documented at ckeditor.js.
 		CKEDITOR.add = function( editor )
 		{
@@ -176,7 +173,7 @@
 			for ( var i = 0 ; i < textareas.length ; i++ )
 			{
-				var config = null;
-				var textarea = textareas[i];
-				var name = textarea.name;
+				var config = null,
+					textarea = textareas[i],
+					name = textarea.name;
 
 				// The "name" and/or "id" attribute must exist.
Index: CKEditor/branches/versions/3.5.x/_source/core/command.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/core/command.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/core/command.js	(revision 6050)
@@ -4,8 +4,42 @@
 */
 
+/**
+ * Creates a command class instance.
+ * @class Represents a command that can be executed on an editor instance.
+ * @param {CKEDITOR.editor} editor The editor instance this command will be
+ *		related to.
+ * @param {CKEDITOR.commandDefinition} commandDefinition The command
+ *		definition.
+ * @augments CKEDITOR.event
+ * @example
+ * var command = new CKEDITOR.command( editor,
+ *     {
+ *         exec : function( editor )
+ *         {
+ *             alert( editor.document.getBody().getHtml() );
+ *         }
+ *     });
+ */
 CKEDITOR.command = function( editor, commandDefinition )
 {
+	/**
+	 * Lists UI items that are associated to this command. This list can be
+	 * used to interact with the UI on command execution (by the execution code
+	 * itself, for example).
+	 * @type Array
+	 * @example
+	 * alert( 'Number of UI items associated to this command: ' + command.<b>uiItems</b>.length );
+	 */
 	this.uiItems = [];
 
+	/**
+	 * Executes the command.
+	 * @param {Object} [data] Any data to pass to the command. Depends on the
+	 *		command implementation and requirements.
+	 * @returns {Boolean} A boolean indicating that the command has been
+	 *      successfully executed.
+	 * @example
+	 * command.<b>exec()</b>;  // The command gets executed.
+	 */
 	this.exec = function( data )
 	{
@@ -21,7 +55,54 @@
 	CKEDITOR.tools.extend( this, commandDefinition,
 		// Defaults
+		/** @lends CKEDITOR.command.prototype */
 		{
+			/**
+			 * The editor modes within which the command can be executed. The
+			 * execution will have no action if the current mode is not listed
+			 * in this property.
+			 * @type Object
+			 * @default { wysiwyg : 1 }
+			 * @see CKEDITOR.editor.prototype.mode
+			 * @example
+			 * // Enable the command in both WYSIWYG and Source modes.
+			 * command.<b>modes</b> = { wysiwyg : 1, source : 1 };
+			 * @example
+			 * // Enable the command in Source mode only.
+			 * command.<b>modes</b> = { source : 1 };
+			 */
 			modes : { wysiwyg : 1 },
-			editorFocus : true,
+
+			/**
+			 * Indicates that the editor will get the focus before executing
+			 * the command.
+			 * @type Boolean
+			 * @default true
+			 * @example
+			 * // Do not force the editor to have focus when executing the command.
+			 * command.<b>editorFocus</b> = false;
+			 */
+			editorFocus : 1,
+
+			/**
+			 * Indicates the editor state. Possible values are:
+			 * <ul>
+			 * <li>{@link CKEDITOR.TRISTATE_DISABLED}: the command is
+			 *		disabled. It's execution will have no effect. Same as
+			 *		{@link disable}.</li>
+			 * <li>{@link CKEDITOR.TRISTATE_ON}: the command is enabled
+			 *		and currently active in the editor (for context sensitive commands,
+			 *		for example).</li>
+			 * <li>{@link CKEDITOR.TRISTATE_OFF}: the command is enabled
+			 *		and currently inactive in the editor (for context sensitive
+			 *		commands, for example).</li>
+			 * </ul>
+			 * Do not set this property directly, using the {@link #setState}
+			 * method instead.
+			 * @type Number
+			 * @default {@link CKEDITOR.TRISTATE_OFF}
+			 * @example
+			 * if ( command.<b>state</b> == CKEDITOR.TRISTATE_DISABLED )
+			 *     alert( 'This command is disabled' );
+			 */
 			state : CKEDITOR.TRISTATE_OFF
 		});
@@ -33,4 +114,12 @@
 CKEDITOR.command.prototype =
 {
+	/**
+	 * Enables the command for execution. The command state (see
+	 * {@link CKEDITOR.command.prototype.state}) available before disabling it
+	 * is restored.
+	 * @example
+	 * command.<b>enable()</b>;
+	 * command.exec();    // Execute the command.
+	 */
 	enable : function()
 	{
@@ -39,4 +128,12 @@
 	},
 
+	/**
+	 * Disables the command for execution. The command state (see
+	 * {@link CKEDITOR.command.prototype.state}) will be set to
+	 * {@link CKEDITOR.TRISTATE_DISABLED}.
+	 * @example
+	 * command.<b>disable()</b>;
+	 * command.exec();    // "false" - Nothing happens.
+	 */
 	disable : function()
 	{
@@ -44,4 +141,16 @@
 	},
 
+	/**
+	 * Sets the command state.
+	 * @param {Number} newState The new state. See {@link #state}.
+	 * @returns {Boolean} Returns "true" if the command state changed.
+	 * @example
+	 * command.<b>setState( CKEDITOR.TRISTATE_ON )</b>;
+	 * command.exec();    // Execute the command.
+	 * command.<b>setState( CKEDITOR.TRISTATE_DISABLED )</b>;
+	 * command.exec();    // "false" - Nothing happens.
+	 * command.<b>setState( CKEDITOR.TRISTATE_OFF )</b>;
+	 * command.exec();    // Execute the command.
+	 */
 	setState : function( newState )
 	{
@@ -62,4 +171,10 @@
 	},
 
+	/**
+	 * Toggles the on/off (active/inactive) state of the command. This is
+	 * mainly used internally by context sensitive commands.
+	 * @example
+	 * command.<b>toggleState()</b>;
+	 */
 	toggleState : function()
 	{
@@ -72,2 +187,23 @@
 
 CKEDITOR.event.implementOn( CKEDITOR.command.prototype, true );
+
+/**
+ * Indicates the preivous command state.
+ * @name CKEDITOR.command.prototype.previousState
+ * @type Number
+ * @see #state
+ * @example
+ * alert( command.<b>previousState</b> );
+ */
+
+/**
+ * Fired when the command state changes.
+ * @name CKEDITOR.command#state
+ * @event
+ * @example
+ * command.on( <b>'state'</b> , function( e )
+ *     {
+ *         // Alerts the new state.
+ *         alert( this.state );
+ *     });
+ */
Index: CKEditor/branches/versions/3.5.x/_source/core/commanddefinition.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/core/commanddefinition.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/core/commanddefinition.js	(revision 6050)
@@ -12,13 +12,13 @@
 /**
  * (Virtual Class) Do not call this constructor. This class is not really part
- *		of the API. It just illustrates the features of command objects to be
+ * of the API.
+ * @name CKEDITOR.commandDefinition
+ * @class Virtual class that illustrates the features of command objects to be
  *		passed to the {@link CKEDITOR.editor.prototype.addCommand} function.
- * @name CKEDITOR.commandDefinition
- * @constructor
  * @example
  */
 
  /**
- * Executes the command.
+ * The function to be fired when the commend is executed.
  * @name CKEDITOR.commandDefinition.prototype.exec
  * @function
@@ -39,7 +39,7 @@
 /**
  * Whether the command need to be hooked into the redo/undo system.
- * @name  CKEDITOR.commandDefinition.canUndo
- * @type {Boolean} If not defined or 'true' both hook into undo system, set it
- *		to 'false' explicitly  keep it out.
+ * @name  CKEDITOR.commandDefinition.prototype.canUndo
+ * @type {Boolean}
+ * @default true
  * @field
  * @example
@@ -55,16 +55,21 @@
 
 /**
- * Whether the command is asynchronous, which means the 'afterCommandExec' event
- * will be fired by the command itself manually, and the 'exec' function return value
- * of this command is not to be returned.
- * @name  CKEDITOR.commandDefinition.async
- * @type {Boolean} If defined as 'true', the command is asynchronous.
+ * Whether the command is asynchronous, which means that the
+ * {@link CKEDITOR.editor#event:afterCommandExec} event will be fired by the
+ * command itself manually, and that the return value of this command is not to
+ * be returned by the {@link CKEDITOR.command#exec} function.
+ * @name  CKEDITOR.commandDefinition.prototype.async
+ * @default false
+ * @type {Boolean}
  * @example
- * editorInstance.addCommand( 'alertName',
+ * editorInstance.addCommand( 'loadOptions',
  * {
  *     exec : function( editor )
  *     {
  *         // Asynchronous operation below.
- *         CKEDITOR.ajax.loadXml( 'data.xml' );
+ *         CKEDITOR.ajax.loadXml( 'data.xml', function()
+ *             {
+ *                 editor.fire( 'afterCommandExec' );
+ *             ));
  *     },
  *     async : true    // The command need some time to complete after exec function returns.
@@ -74,6 +79,8 @@
 /**
  * Whether the command should give focus to the editor before execution.
- * @name  CKEDITOR.commandDefinition.editorFocus
+ * @name  CKEDITOR.commandDefinition.prototype.editorFocus
  * @type {Boolean}
+ * @default true
+ * @see CKEDITOR.command#editorFocus
  * @example
  * editorInstance.addCommand( 'maximize',
@@ -81,4 +88,5 @@
  *     exec : function( editor )
  *     {
+ *         // ...
  *     },
  *     editorFocus : false    // The command doesn't require focusing the editing document.
@@ -89,5 +97,5 @@
 /**
  * Whether the command state should be set to {@link CKEDITOR.TRISTATE_DISABLED} on startup.
- * @name  CKEDITOR.commandDefinition.startDisabled
+ * @name  CKEDITOR.commandDefinition.prototype.startDisabled
  * @type {Boolean}
  * @default false
@@ -97,6 +105,25 @@
  *     exec : function( editor )
  *     {
+ *         // ...
  *     },
  *     startDisabled : true    // Command is unavailable until selection is inside a link.
  * });
  */
+
+/**
+ * The editor modes within which the command can be executed. The execution
+ * will have no action if the current mode is not listed in this property.
+ * @name  CKEDITOR.commandDefinition.prototype.modes
+ * @type Object
+ * @default { wysiwyg : 1 }
+ * @see CKEDITOR.command#modes
+ * @example
+ * editorInstance.addCommand( 'link',
+ * {
+ *     exec : function( editor )
+ *     {
+ *         // ...
+ *     },
+ *     modes : { wysiwyg : 1 }    // Command is available in wysiwyg mode only.
+ * });
+ */
Index: CKEditor/branches/versions/3.5.x/_source/core/config.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/core/config.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/core/config.js	(revision 6050)
@@ -9,17 +9,32 @@
  */
 
+/**
+ * Used in conjuction with {@link CKEDITOR.config.enterMode} and
+ * {@link CKEDITOR.config.shiftEnterMode} to make the editor produce &lt;p&gt;
+ * tags when using the ENTER key.
+ * @constant
+ */
 CKEDITOR.ENTER_P	= 1;
+
+/**
+ * Used in conjuction with {@link CKEDITOR.config.enterMode} and
+ * {@link CKEDITOR.config.shiftEnterMode} to make the editor produce &lt;br&gt;
+ * tags when using the ENTER key.
+ * @constant
+ */
 CKEDITOR.ENTER_BR	= 2;
+
+/**
+ * Used in conjuction with {@link CKEDITOR.config.enterMode} and
+ * {@link CKEDITOR.config.shiftEnterMode} to make the editor produce &lt;div&gt;
+ * tags when using the ENTER key.
+ * @constant
+ */
 CKEDITOR.ENTER_DIV	= 3;
 
 /**
- * Holds the default configuration settings. Changes to this object are
+ * @namespace Holds the default configuration settings. Changes to this object are
  * reflected in all editor instances, if not specificaly specified for those
  * instances.
- * @namespace
- * @example
- * // All editor created after the following setting will not load custom
- * // configuration files.
- * CKEDITOR.config.customConfig = '';
  */
 CKEDITOR.config =
@@ -57,5 +72,5 @@
 	 * editor content.
 	 * @type String
-	 * @default '' (empty string)
+	 * @default '' (empty)
 	 * @example
 	 * config.baseHref = 'http://www.example.com/path/';
@@ -195,8 +210,13 @@
 	/**
 	 * Sets the "id" attribute to be used on the body element of the editing
-	 * area.
+	 * area. This can be useful when reusing the original CSS file you're using
+	 * on your live website and you want to assing to the editor the same id
+	 * you're using for the region that'll hold the contents. In this way,
+	 * id specific CSS rules will be enabled.
 	 * @since 3.1
 	 * @type String
-	 * @default ''
+	 * @default '' (empty)
+	 * @example
+	 * config.bodyId = 'contents_id';
 	 */
 	bodyId : '',
@@ -204,8 +224,13 @@
 	/**
 	 * Sets the "class" attribute to be used on the body element of the editing
-	 * area.
+	 * area. This can be useful when reusing the original CSS file you're using
+	 * on your live website and you want to assing to the editor the same class
+	 * name you're using for the region that'll hold the contents. In this way,
+	 * class specific CSS rules will be enabled.
 	 * @since 3.1
 	 * @type String
-	 * @default ''
+	 * @default '' (empty)
+	 * @example
+	 * config.bodyClass = 'contents';
 	 */
 	bodyClass : '',
@@ -244,5 +269,62 @@
 	 * @example
 	 */
-	plugins : 'about,a11yhelp,basicstyles,bidi,blockquote,button,clipboard,colorbutton,colordialog,contextmenu,dialogadvtab,div,elementspath,enterkey,entities,filebrowser,find,flash,font,format,forms,horizontalrule,htmldataprocessor,iframe,image,indent,justify,keystrokes,link,list,liststyle,maximize,newpage,pagebreak,pastefromword,pastetext,popup,preview,print,removeformat,resize,save,scayt,smiley,showblocks,showborders,sourcearea,stylescombo,table,tabletools,specialchar,tab,templates,toolbar,undo,wysiwygarea,wsc',
+	plugins :
+		'about,' +
+		'a11yhelp,' +
+		'basicstyles,' +
+		'bidi,' +
+		'blockquote,' +
+		'button,' +
+		'clipboard,' +
+		'colorbutton,' +
+		'colordialog,' +
+		'contextmenu,' +
+		'dialogadvtab,' +
+		'div,' +
+		'elementspath,' +
+		'enterkey,' +
+		'entities,' +
+		'filebrowser,' +
+		'find,' +
+		'flash,' +
+		'font,' +
+		'format,' +
+		'forms,' +
+		'horizontalrule,' +
+		'htmldataprocessor,' +
+		'iframe,' +
+		'image,' +
+		'indent,' +
+		'justify,' +
+		'keystrokes,' +
+		'link,' +
+		'list,' +
+		'liststyle,' +
+		'maximize,' +
+		'newpage,' +
+		'pagebreak,' +
+		'pastefromword,' +
+		'pastetext,' +
+		'popup,' +
+		'preview,' +
+		'print,' +
+		'removeformat,' +
+		'resize,' +
+		'save,' +
+		'scayt,' +
+		'smiley,' +
+		'showblocks,' +
+		'showborders,' +
+		'sourcearea,' +
+		'stylescombo,' +
+		'table,' +
+		'tabletools,' +
+		'specialchar,' +
+		'tab,' +
+		'templates,' +
+		'toolbar,' +
+		'undo,' +
+		'wysiwygarea,' +
+		'wsc',
 
 	/**
@@ -332,8 +414,8 @@
 
 /**
- * Indicates that some of the editor features, like alignement and text
+ * Indicates that some of the editor features, like alignment and text
  * direction, should used the "computed value" of the feature to indicate it's
- * on/off state, instead of using the "real value".
- *
+ * on/off state, instead of using the "real value".<br />
+ * <br />
  * If enabled, in a left to right written document, the "Left Justify"
  * alignment button will show as active, even if the aligment style is not
Index: CKEditor/branches/versions/3.5.x/_source/core/dataprocessor.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/core/dataprocessor.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/core/dataprocessor.js	(revision 6050)
@@ -16,16 +16,15 @@
  * which handles HTML data. The editor may also handle other data formats by
  * using different data processors provided by specific plugins.
- * @name CKEDITOR.editor.dataProcessor
+ * @name CKEDITOR.editor.prototype.dataProcessor
  * @type CKEDITOR.dataProcessor
  */
 
 /**
- * Represents a data processor, which is responsible to translate and transform
- * the editor data on input and output.
- * This class is not really part of the API. It's here for documentation
- * purposes, and serves as the base ("interface") for data processors
+ * This class is here for documentation purposes only and is not really part of
+ * the API. It serves as the base ("interface") for data processors
  * implementation.
  * @name CKEDITOR.dataProcessor
- * @contructor
+ * @class Represents a data processor, which is responsible to translate and
+ *        transform the editor data on input and output.
  * @example
  */
Index: CKEditor/branches/versions/3.5.x/_source/core/dom.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/core/dom.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/core/dom.js	(revision 6050)
@@ -10,8 +10,7 @@
 
 /**
- * DOM manipulation objects and function.<br /><br />
+ * @namespace DOM manipulation objects, classes and functions.
  * @see CKEDITOR.dom.element
  * @see CKEDITOR.dom.node
- * @namespace
  * @example
  */
Index: CKEditor/branches/versions/3.5.x/_source/core/dom/documentfragment.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/core/dom/documentfragment.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/core/dom/documentfragment.js	(revision 6050)
@@ -3,11 +3,11 @@
 For licensing, see LICENSE.html or http://ckeditor.com/license
 */
+
 /**
- * DocumentFragment is a "lightweight" or "minimal" Document object. It is
+ * @class DocumentFragment is a "lightweight" or "minimal" Document object. It is
  * commonly used to extract a portion of a document's tree or to create a new
  * fragment of a document. Various operations may take DocumentFragment objects
  * as arguments and results in all the child nodes of the DocumentFragment being
  * moved to the child list of this node.
- *
  * @param {Object} ownerDocument
  */
Index: CKEditor/branches/versions/3.5.x/_source/core/dom/domobject.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/core/dom/domobject.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/core/dom/domobject.js	(revision 6050)
@@ -85,8 +85,8 @@
 				var listener = nativeListeners[ eventName ] = getNativeListener( this, eventName );
 
-				if ( this.$.addEventListener )
+				if ( this.$.attachEvent )
+					this.$.attachEvent( 'on' + eventName, listener );
+				else if ( this.$.addEventListener )
 					this.$.addEventListener( eventName, listener, !!CKEDITOR.event.useCapture );
-				else if ( this.$.attachEvent )
-					this.$.attachEvent( 'on' + eventName, listener );
 			}
 
@@ -108,8 +108,8 @@
 				if ( listener )
 				{
-					if ( this.$.removeEventListener )
+					if ( this.$.detachEvent )
+						this.$.detachEvent( 'on' + eventName, listener );
+					else if ( this.$.removeEventListener )
 						this.$.removeEventListener( eventName, listener, false );
-					else if ( this.$.detachEvent )
-						this.$.detachEvent( 'on' + eventName, listener );
 
 					delete nativeListeners[ eventName ];
@@ -129,8 +129,8 @@
 			{
 				var listener = nativeListeners[ eventName ];
-				if ( this.$.removeEventListener )
+				if ( this.$.detachEvent )
+					this.$.detachEvent( 'on' + eventName, listener );
+				else if ( this.$.removeEventListener )
 					this.$.removeEventListener( eventName, listener, false );
-				else if ( this.$.detachEvent )
-					this.$.detachEvent( 'on' + eventName, listener );
 
 				delete nativeListeners[ eventName ];
@@ -239,5 +239,9 @@
 
 	/**
-	 * @name CKEDITOR.dom.domObject.prototype.getCustomData
+	 * Gets an ID that can be used to identiquely identify this DOM object in
+	 * the running session.
+	 * @name CKEDITOR.dom.domObject.prototype.getUniqueId
+	 * @function
+	 * @returns {Number} A unique ID.
 	 */
 	domObjectProto.getUniqueId = function()
Index: CKEditor/branches/versions/3.5.x/_source/core/dom/element.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/core/dom/element.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/core/dom/element.js	(revision 6050)
@@ -89,5 +89,5 @@
 {
 	for ( var i in database )
-		CKEDITOR.dom.element.clearMarkers( database, database[i], true );
+		CKEDITOR.dom.element.clearMarkers( database, database[i], 1 );
 };
 
@@ -1171,5 +1171,5 @@
 				{
 					this.$.style.MozUserSelect = 'none';
-					this.on( 'dragstart', function (evt) { evt.data.preventDefault(); } );
+					this.on( 'dragstart', function( evt ) { evt.data.preventDefault(); } );
 				}
 			: CKEDITOR.env.webkit ?
@@ -1177,5 +1177,5 @@
 				{
 					this.$.style.KhtmlUserSelect = 'none';
-					this.on( 'dragstart', function (evt) { evt.data.preventDefault(); } );
+					this.on( 'dragstart', function( evt ) { evt.data.preventDefault(); } );
 				}
 			:
@@ -1523,4 +1523,42 @@
 						event.data.preventDefault();
 				} );
+		},
+
+		/**
+		 *  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.
+		 */
+		getDirection : function( useComputed )
+		{
+			return useComputed ? this.getComputedStyle( 'direction' ) : this.getStyle( 'direction' ) || this.getAttribute( 'dir' );
 		}
 	});
Index: CKEditor/branches/versions/3.5.x/_source/core/dom/elementpath.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/core/dom/elementpath.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/core/dom/elementpath.js	(revision 6050)
@@ -28,4 +28,7 @@
 	};
 
+	/**
+	 * @class
+	 */
 	CKEDITOR.dom.elementPath = function( lastNode )
 	{
Index: CKEditor/branches/versions/3.5.x/_source/core/dom/nodelist.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/core/dom/nodelist.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/core/dom/nodelist.js	(revision 6050)
@@ -4,4 +4,7 @@
 */
 
+/**
+ * @class
+ */
 CKEDITOR.dom.nodeList = function( nativeList )
 {
Index: CKEditor/branches/versions/3.5.x/_source/core/dom/range.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/core/dom/range.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/core/dom/range.js	(revision 6050)
@@ -4,4 +4,7 @@
 */
 
+/**
+ * @class
+ */
 CKEDITOR.dom.range = function( document )
 {
@@ -1301,5 +1304,6 @@
 				}
 
-				var walker = new CKEDITOR.dom.walker( walkerRange );
+				var walker = new CKEDITOR.dom.walker( walkerRange ),
+					isBookmark = CKEDITOR.dom.walker.bookmark();
 
 				walker.evaluator = function( node )
@@ -1312,4 +1316,7 @@
 				walker.guard = function( node, movingOut )
 				{
+					if ( isBookmark( node ) )
+						return true;
+
 					// Stop when we're shrink in element mode while encountering a text node.
 					if ( mode == CKEDITOR.SHRINK_ELEMENT && node.type == CKEDITOR.NODE_TEXT )
@@ -1430,5 +1437,5 @@
 			if( endNode.type == CKEDITOR.NODE_ELEMENT
 				&& CKEDITOR.dtd.$empty[ endNode.getName() ] )
-				endNode = endNode.getParent(), endOffset = endNode.getIndex() + 1;
+				endOffset = endNode.getIndex() + 1, endNode = endNode.getParent();
 
 			this.endContainer	= endNode;
@@ -1865,16 +1872,12 @@
 CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS = 3;
 
-/**
- * Check boundary types.
- * @see CKEDITOR.dom.range.prototype.checkBoundaryOfElement
- */
+// Check boundary types.
+// @see CKEDITOR.dom.range.prototype.checkBoundaryOfElement
 CKEDITOR.START = 1;
 CKEDITOR.END = 2;
 CKEDITOR.STARTEND = 3;
 
-/**
- * Shrink range types.
- * @see CKEDITOR.dom.range.prototype.shrink
- */
+// Shrink range types.
+// @see CKEDITOR.dom.range.prototype.shrink
 CKEDITOR.SHRINK_ELEMENT = 1;
 CKEDITOR.SHRINK_TEXT = 2;
Index: CKEditor/branches/versions/3.5.x/_source/core/dom/rangelist.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/core/dom/rangelist.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/core/dom/rangelist.js	(revision 6050)
@@ -40,5 +40,7 @@
 			{
 				var rangeList = this,
-					bookmarks = [],
+					bookmark = CKEDITOR.dom.walker.bookmark(),
+					guard = function( node ) { return ! ( node.is && node.is( 'tr' ) ); },
+						bookmarks = [],
 					current;
 
@@ -50,6 +52,7 @@
 					/**
 					 * Retrieves the next range in the list.
+					 * @param {Boolean} mergeConsequent Whether join two adjacent ranges into single, e.g. consequent table cells.
 					 */
-					getNextRange : function()
+					getNextRange : function( mergeConsequent )
 					{
 						current = current == undefined ? 0 : current + 1;
@@ -66,9 +69,57 @@
 							{
 								// Make sure bookmark correctness by reverse processing.
-								for ( var i = rangeList.length - 1; i > 0; i-- )
+								for ( var i = rangeList.length - 1; i >= 0; i-- )
 									bookmarks.unshift( rangeList[ i ].createBookmark( true ) );
 							}
-							else
-								range.moveToBookmark( bookmarks.shift() );
+
+							if ( mergeConsequent )
+							{
+								// Figure out how many ranges should be merged.
+								var mergeCount = 0;
+								while ( rangeList[ current + mergeCount + 1 ] )
+								{
+									var doc = range.document,
+										found = 0,
+										left =  doc.getById( bookmarks[ mergeCount ].endNode ),
+										right = doc.getById( bookmarks[ mergeCount + 1 ].startNode ),
+										next;
+
+									// Check subsequent range.
+									while ( 1 )
+									{
+										next = left.getNextSourceNode( false );
+										if ( !right.equals( next ) )
+										{
+											// This could be yet another bookmark or
+											// walking across block boundaries.
+											if ( bookmark( next ) || ( next.type == CKEDITOR.NODE_ELEMENT && next.isBlockBoundary() ) )
+											{
+												left = next;
+												continue;
+											}
+										}
+										else
+											found = 1;
+
+										break;
+									}
+
+									if ( !found )
+										break;
+
+									mergeCount++;
+								}
+							}
+
+							range.moveToBookmark( bookmarks.shift() );
+
+							var next;
+							// Merge ranges finally after moving to bookmarks.
+							while( mergeCount-- )
+							{
+								next = rangeList[ ++current ];
+								next.moveToBookmark( bookmarks.shift() );
+								range.setEnd( next.endContainer, next.endOffset );
+							}
 						}
 
Index: CKEditor/branches/versions/3.5.x/_source/core/dom/walker.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/core/dom/walker.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/core/dom/walker.js	(revision 6050)
@@ -262,5 +262,5 @@
 			previous : function()
 			{
-				return iterate.call( this, true );
+				return iterate.call( this, 1 );
 			},
 
@@ -272,5 +272,5 @@
 			checkForward : function()
 			{
-				return iterate.call( this, false, true ) !== false;
+				return iterate.call( this, 0, 1 ) !== false;
 			},
 
@@ -282,5 +282,5 @@
 			checkBackward : function()
 			{
-				return iterate.call( this, true, true ) !== false;
+				return iterate.call( this, 1, 1 ) !== false;
 			},
 
@@ -304,5 +304,5 @@
 			lastBackward : function()
 			{
-				return iterateToLast.call( this, true );
+				return iterateToLast.call( this, 1 );
 			},
 
@@ -375,5 +375,5 @@
 			return ( node && node.getName
 					&& node.getName() == 'span'
-					&& node.hasAttribute('_cke_bookmark') );
+					&& node.hasAttribute( '_cke_bookmark' ) );
 		}
 
@@ -386,5 +386,5 @@
 			// Is bookmark node?
 			isBookmark = contentOnly ? isBookmark : isBookmark || isBookmarkNode( node );
-			return isReject ^ isBookmark;
+			return !! ( isReject ^ isBookmark );
 		};
 	};
@@ -400,5 +400,5 @@
 			var isWhitespace = node && ( node.type == CKEDITOR.NODE_TEXT )
 							&& !CKEDITOR.tools.trim( node.getText() );
-			return isReject ^ isWhitespace;
+			return !! ( isReject ^ isWhitespace );
 		};
 	};
@@ -419,11 +419,11 @@
 			// all sorts of empty paragraph, e.g. <br />.
 			var isInvisible = whitespace( node ) || node.is && !node.$.offsetHeight;
-			return isReject ^ isInvisible;
+			return !! ( isReject ^ isInvisible );
 		};
 	};
 
 	var tailNbspRegex = /^[\t\r\n ]*(?:&nbsp;|\xa0)$/,
-		isNotWhitespaces = CKEDITOR.dom.walker.whitespaces( true ),
-		isNotBookmark = CKEDITOR.dom.walker.bookmark( false, true ),
+		isNotWhitespaces = CKEDITOR.dom.walker.whitespaces( 1 ),
+		isNotBookmark = CKEDITOR.dom.walker.bookmark( 0, 1 ),
 		fillerEvaluator = function( element )
 		{
@@ -432,5 +432,5 @@
 
 	// Check if there's a filler node at the end of an element, and return it.
-	CKEDITOR.dom.element.prototype.getBogus = function ()
+	CKEDITOR.dom.element.prototype.getBogus = function()
 	{
 		var tail = this.getLast( fillerEvaluator );
Index: CKEditor/branches/versions/3.5.x/_source/core/dtd.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/core/dtd.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/core/dtd.js	(revision 6050)
@@ -11,14 +11,13 @@
 
 /**
- * Holds and object representation of the HTML DTD to be used by the editor in
- * its internal operations.
- *
- * Each element in the DTD is represented by a
- * property in this object. Each property contains the list of elements that
- * can be contained by the element. Text is represented by the "#" property.
- *
+ * @namespace Holds and object representation of the HTML DTD to be used by the
+ * editor in its internal operations.<br />
+ * <br />
+ * Each element in the DTD is represented by a property in this object. Each
+ * property contains the list of elements that can be contained by the element.
+ * Text is represented by the "#" property.<br />
+ * <br />
  * Several special grouping properties are also available. Their names start
  * with the "$" character.
- * @namespace
  * @example
  * // Check if "div" can be contained in a "p" element.
@@ -82,6 +81,12 @@
 		$blockLimit : { body:1,div:1,td:1,th:1,caption:1,form:1 },
 
+		/**
+		 * List of inline (&lt;span&gt; like) elements.
+		 */
 		$inline : L,	// Just like span.
 
+		/**
+		 * list of elements that can be children at &lt;body&gt;.
+		 */
 		$body : X({script:1,style:1}, block),
 
Index: CKEditor/branches/versions/3.5.x/_source/core/editor.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/core/editor.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/core/editor.js	(revision 6050)
@@ -119,8 +119,44 @@
 				'skins/' + skinName + '/' ) );
 
+		/**
+		 * The name of the skin used by this editor instance. The skin name can
+		 * be set though the {@link CKEDITOR.config.skin} setting.
+		 * @name CKEDITOR.editor.prototype.skinName
+		 * @type String
+		 * @example
+		 * alert( editor.skinName );  // "kama" (e.g.)
+		 */
 		editor.skinName = skinName;
+
+		/**
+		 * The full URL of the skin directory.
+		 * @name CKEDITOR.editor.prototype.skinPath
+		 * @type String
+		 * @example
+		 * alert( editor.skinPath );  // "http://example.com/ckeditor/skins/kama/" (e.g.)
+		 */
 		editor.skinPath = skinPath;
+
+		/**
+		 * The CSS class name used for skin identification purposes.
+		 * @name CKEDITOR.editor.prototype.skinClass
+		 * @type String
+		 * @example
+		 * alert( editor.skinClass );  // "cke_skin_kama" (e.g.)
+		 */
 		editor.skinClass = 'cke_skin_' + skinName;
 
+		/**
+		 * The <a href="http://en.wikipedia.org/wiki/Tabbing_navigation">tabbing
+		 * navigation</a> order that has been calculated for this editor
+		 * instance. This can be set by the {@link CKEDITOR.config.tabIndex}
+		 * setting or taken from the "tabindex" attribute of the
+		 * {@link #element} associated to the editor.
+		 * @name CKEDITOR.editor.prototype.tabIndex
+		 * @type Number
+		 * @default 0 (zero)
+		 * @example
+		 * alert( editor.tabIndex );  // "0" (e.g.)
+		 */
 		editor.tabIndex = editor.config.tabIndex || editor.element.getAttribute( 'tabindex' ) || 0;
 
@@ -136,6 +172,22 @@
 		CKEDITOR.lang.load( editor.config.language, editor.config.defaultLanguage, function( languageCode, lang )
 			{
+				/**
+				 * The code for the language resources that have been loaded
+				 * for the user internface elements of this editor instance.
+				 * @name CKEDITOR.editor.prototype.langCode
+				 * @type String
+				 * @example
+				 * alert( editor.langCode );  // "en" (e.g.)
+				 */
 				editor.langCode = languageCode;
 
+				/**
+				 * An object holding all language strings used by the editor
+				 * interface.
+				 * @name CKEDITOR.editor.prototype.lang
+				 * @type CKEDITOR.lang
+				 * @example
+				 * alert( editor.lang.bold );  // "Negrito" (e.g. if language is Portuguese)
+				 */
 				// As we'll be adding plugin specific entries that could come
 				// from different language code files, we need a copy of lang,
@@ -189,5 +241,12 @@
 				var languageFiles = [];
 
-				// Cache the loaded plugin names.
+				/**
+				 * And object holding references to all plugins used by this
+				 * editor istance.
+				 * @name CKEDITOR.editor.prototype.plugins
+				 * @type Object
+				 * @example
+				 * alert( editor.plugins.dialog.path );  // "http://example.com/ckeditor/plugins/dialog/" (e.g.)
+				 */
 				editor.plugins = plugins;
 
@@ -272,4 +331,11 @@
 		CKEDITOR.themes.load( theme, function()
 			{
+				/**
+				 * The theme used by this editor instance.
+				 * @name CKEDITOR.editor.prototype.theme
+				 * @type CKEDITOR.theme
+				 * @example
+				 * alert( editor.theme );  "http://example.com/ckeditor/themes/default/" (e.g.)
+				 */
 				var editorTheme = editor.theme = CKEDITOR.themes.get( theme );
 				editorTheme.path = CKEDITOR.themes.getPath( theme );
@@ -384,4 +450,11 @@
 
 			/**
+			 * A unique random string assigned to each editor instance in the page.
+			 * @name CKEDITOR.editor.prototype.id
+			 * @type String
+			 */
+			this.id = CKEDITOR.tools.getNextId();
+
+			/**
 			 * The configurations for this editor instance. It inherits all
 			 * settings defined in (@link CKEDITOR.config}, combined with settings
@@ -597,4 +670,14 @@
 		},
 
+		/**
+		 * Gets the "raw data" currently available in the editor. This is a
+		 * fast method which return the data as is, without processing, so it's
+		 * not recommended to use it on resulting pages. It can be used instead
+		 * combined with the {@link #loadSnapshot} so one can automatic save
+		 * the editor data from time to time while the user is using the
+		 * editor, to avoid data loss, without risking performance issues.
+		 * @example
+		 * alert( editor.getSnapshot() );
+		 */
 		getSnapshot : function()
 		{
@@ -611,4 +694,13 @@
 		},
 
+		/**
+		 * Loads "raw data" in the editor. This data is loaded with processing
+		 * straight to the editing area. It should not be used as a way to load
+		 * any kind of data, but instead in combination with
+		 * {@link #getSnapshot} produced data.
+		 * @example
+		 * var data = editor.getSnapshot();
+		 * editor.<b>loadSnapshot( data )</b>;
+		 */
 		loadSnapshot : function( snapshot )
 		{
@@ -678,4 +770,22 @@
 		},
 
+		/**
+		 * Checks whether the current editor contents present changes when
+		 * compared to the contents loaded into the editor at startup, or to
+		 * the contents available in the editor when {@link #resetDirty} has
+		 * been called.
+		 * @returns {Boolean} "true" is the contents present changes.
+		 * @example
+		 * function beforeUnload( e )
+		 * {
+		 *     if ( CKEDITOR.instances.editor1.<b>checkDirty()</b> )
+		 * 	        return e.returnValue = "You'll loose the changes made in the editor.";
+		 * }
+		 *
+		 * if ( window.addEventListener )
+		 *     window.addEventListener( 'beforeunload', beforeUnload, false );
+		 * else
+		 *     window.attachEvent( 'onbeforeunload', beforeUnload );
+		 */
 		checkDirty : function()
 		{
@@ -683,4 +793,13 @@
 		},
 
+		/**
+		 * Resets the "dirty state" of the editor so subsequent calls to
+		 * {@link #checkDirty} will return "false" if the user will not make
+		 * further changes to the contents.
+		 * @example
+		 * alert( editor.checkDirty() );  // "true" (e.g.)
+		 * editor.<b>resetDirty()</b>;
+		 * alert( editor.checkDirty() );  // "false"
+		 */
 		resetDirty : function()
 		{
@@ -757,3 +876,49 @@
  * @name CKEDITOR#pluginsLoaded
  * @event
+ * @param {CKEDITOR.editor} editor The editor instance that has been destroyed.
  */
+
+/**
+ * Fired before the command execution when {@link #execCommand} is called.
+ * @name CKEDITOR.editor#beforeCommandExec
+ * @event
+ * @param {CKEDITOR.editor} editor This editor instance.
+ * @param {String} data.name The command name.
+ * @param {Object} data.commandData The data to be sent to the command. This
+ *		can be manipulated by the event listener.
+ * @param {CKEDITOR.command} data.command The command itself.
+ */
+
+/**
+ * Fired after the command execution when {@link #execCommand} is called.
+ * @name CKEDITOR.editor#afterCommandExec
+ * @event
+ * @param {CKEDITOR.editor} editor This editor instance.
+ * @param {String} data.name The command name.
+ * @param {Object} data.commandData The data sent to the command.
+ * @param {CKEDITOR.command} data.command The command itself.
+ * @param {Object} data.returnValue The value returned by the command execution.
+ */
+
+/**
+ * Fired every custom configuration file is loaded, before the final
+ * configurations initialization.<br />
+ * <br />
+ * Custom configuration files can be loaded thorugh the
+ * {@link CKEDITOR.config.customConfig} setting. Several files can be loading
+ * by chaning this setting.
+ * @name CKEDITOR.editor#customConfigLoaded
+ * @event
+ * @param {CKEDITOR.editor} editor This editor instance.
+ * @example
+ */
+
+/**
+ * Fired once the editor configuration is ready (loaded and processed).
+ * @name CKEDITOR.editor#configLoaded
+ * @event
+ * @param {CKEDITOR.editor} editor This editor instance.
+ * @example
+ * if( editor.config.fullPage )
+ *     alert( 'This is a full page editor' );
+ */
Index: CKEditor/branches/versions/3.5.x/_source/core/editor_basic.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/core/editor_basic.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/core/editor_basic.js	(revision 6050)
@@ -28,7 +28,7 @@
 
 	/**
-	 * Represents an editor instance. This constructor should be rarely used,
-	 * being the {@link CKEDITOR} methods preferible.
-	 * @constructor
+	 * Creates an editor class instance. This constructor should be rarely
+	 * used, in favor of the {@link CKEDITOR} editor creation functions.
+	 * @ class Represents an editor instance.
 	 * @param {Object} instanceConfig Configuration values for this specific
 	 *		instance.
@@ -36,5 +36,5 @@
 	 *		instance.
 	 * @param {Number} [mode] The mode in which the element is linked to this
-	 *		instance.
+	 *		instance. See {@link #elementMode}.
 	 * @param {String} [data] Since 3.3. Initial value for the instance.
 	 * @augments CKEDITOR.event
@@ -55,9 +55,9 @@
 		 * instance. It can be any of the following values:
 		 * <ul>
-		 * <li><b>CKEDITOR.ELEMENT_MODE_NONE</b>: No element is linked to the
+		 * <li>{@link CKEDITOR.ELEMENT_MODE_NONE}: No element is linked to the
 		 *		editor instance.</li>
-		 * <li><b>CKEDITOR.ELEMENT_MODE_REPLACE</b>: The element is to be
+		 * <li>{@link CKEDITOR.ELEMENT_MODE_REPLACE}: The element is to be
 		 *		replaced by the editor instance.</li>
-		 * <li><b>CKEDITOR.ELEMENT_MODE_APPENDTO</b>: The editor is to be
+		 * <li>{@link CKEDITOR.ELEMENT_MODE_APPENDTO}: The editor is to be
 		 *		created inside the element.</li>
 		 * </ul>
Index: CKEditor/branches/versions/3.5.x/_source/core/env.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/core/env.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/core/env.js	(revision 6050)
@@ -12,7 +12,5 @@
 {
 	/**
-	 * Environment and browser information.
-	 * @namespace
-	 * @example
+	 * @namespace Environment and browser information.
 	 */
 	CKEDITOR.env = (function()
@@ -70,8 +68,30 @@
 			mac	: ( agent.indexOf( 'macintosh' ) > -1 ),
 
+			/**
+			 * Indicates that CKEditor is running on a quirks mode environemnt.
+			 * @type Boolean
+			 * @example
+			 * if ( CKEDITOR.env.quirks )
+			 *     alert( "Nooooo!" );
+			 */
 			quirks : ( document.compatMode == 'BackCompat' ),
 
+			/**
+			 * Indicates that CKEditor is running on a mobile like environemnt.
+			 * @type Boolean
+			 * @example
+			 * if ( CKEDITOR.env.mobile )
+			 *     alert( "I'm running with CKEditor today!" );
+			 */
 			mobile : ( agent.indexOf( 'mobile' ) > -1 ),
 
+			/**
+			 * Indicates that the browser has a custom domain enabled. This has
+			 * been set with "document.domain".
+			 * @returns {Boolean} "true" if a custom domain is enabled.
+			 * @example
+			 * if ( CKEDITOR.env.isCustomDomain() )
+			 *     alert( "I'm in a custom domain!" );
+			 */
 			isCustomDomain : function()
 			{
@@ -106,10 +126,21 @@
 
 			/**
-			 *  Indicate IE8 browser.
+			 * Indicates that CKEditor is running on Internet Explorer 8.
+			 * @name CKEDITOR.env.ie8
+			 * @type Boolean
+			 * @example
+			 * if ( CKEDITOR.env.ie8 )
+			 *     alert( "I'm on IE8!" );
 			 */
 			env.ie8 = !!document.documentMode;
 
 			/**
-			 * Indicte IE8 document mode.
+			 * Indicates that CKEditor is running on Internet Explorer 8 on
+			 * standards mode.
+			 * @name CKEDITOR.env.ie8Compat
+			 * @type Boolean
+			 * @example
+			 * if ( CKEDITOR.env.ie8Compat )
+			 *     alert( "Now I'm on IE8, for real!" );
 			 */
 			env.ie8Compat = document.documentMode == 8;
@@ -118,5 +149,9 @@
 			 * Indicates that CKEditor is running on an IE7-like environment, which
 			 * includes IE7 itself and IE8's IE7 document mode.
-			 * @type Boolean
+			 * @name CKEDITOR.env.ie7Compat
+			 * @type Boolean
+			 * @example
+			 * if ( CKEDITOR.env.ie8Compat )
+			 *     alert( "I'm on IE7 or on an IE7 like IE8!" );
 			 */
 			env.ie7Compat = ( ( version == 7 && !document.documentMode )
@@ -126,4 +161,5 @@
 			 * Indicates that CKEditor is running on an IE6-like environment, which
 			 * includes IE6 itself and IE7 and IE8 quirks mode.
+			 * @name CKEDITOR.env.ie6Compat
 			 * @type Boolean
 			 * @example
@@ -132,5 +168,4 @@
 			 */
 			env.ie6Compat = ( version < 7 || env.quirks );
-
 		}
 
@@ -161,10 +196,10 @@
 
 		/**
-		 * Contains the browser version.
-		 *
+		 * Contains the browser version.<br />
+		 * <br />
 		 * For gecko based browsers (like Firefox) it contains the revision
 		 * number with first three parts concatenated with a padding zero
-		 * (e.g. for revision 1.9.0.2 we have 10900).
-		 *
+		 * (e.g. for revision 1.9.0.2 we have 10900).<br />
+		 * <br />
 		 * For webkit based browser (like Safari and Chrome) it contains the
 		 * WebKit build version (e.g. 522).
@@ -194,6 +229,12 @@
 			false );
 
-		// The CSS class to be appended on the main UI containers, making it
-		// easy to apply browser specific styles to it.
+		/**
+		 * The CSS class to be appended on the main UI containers, making it
+		 * easy to apply browser specific styles to it.
+		 * @name CKEDITOR.env.cssClass
+		 * @type String
+		 * @example
+		 * myDiv.className = CKEDITOR.env.cssClass;
+		 */
 		env.cssClass =
 			'cke_browser_' + (
@@ -212,5 +253,5 @@
 			env.cssClass += ' cke_browser_ie' + (
 				env.version < 7 ? '6' :
-				env.version >= 8 ? '8' :
+				env.version >= 8 ? document.documentMode:
 				'7' );
 
Index: CKEditor/branches/versions/3.5.x/_source/core/event.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/core/event.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/core/event.js	(revision 6050)
@@ -12,7 +12,13 @@
 {
 	/**
-	 * This is a base class for classes and objects that require event handling
-	 * features.
-	 * @constructor
+	 * Creates an event class instance. This constructor is rearely used, being
+	 * the {@link #.implementOn} function used in class prototypes directly
+	 * instead.
+	 * @class This is a base class for classes and objects that require event
+	 * handling features.<br />
+	 * <br />
+	 * Do not confuse this class with {@link CKEDITOR.dom.event} which is
+	 * instead used for DOM events. The CKEDITOR.event class implements the
+	 * internal event system used by the CKEditor to fire API related events.
 	 * @example
 	 */
@@ -22,5 +28,5 @@
 	/**
 	 * Implements the {@link CKEDITOR.event} features in an object.
-	 * @param {Object} targetObject The object in which implement the features.
+	 * @param {Object} targetObject The object into which implement the features.
 	 * @example
 	 * var myObject = { message : 'Example' };
@@ -32,5 +38,5 @@
 	 * myObject.fire( 'testEvent' );
 	 */
-	CKEDITOR.event.implementOn = function( targetObject, isTargetPrototype )
+	CKEDITOR.event.implementOn = function( targetObject )
 	{
 		var eventProto = CKEDITOR.event.prototype;
Index: CKEditor/branches/versions/3.5.x/_source/core/eventInfo.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/core/eventInfo.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/core/eventInfo.js	(revision 6050)
@@ -11,9 +11,9 @@
 
 /**
- * This class is not really part of the API. It just illustrates the features
- * of the event object passed to event listeners by a {@link CKEDITOR.event}
- * based object.
+ * (Virtual Class) Do not call this constructor. This class is not really part
+ * of the API.
+ * @class Virtual class that illustrates the features of the event object to be
+ * passed to event listeners by a {@link CKEDITOR.event} based object.
  * @name CKEDITOR.eventInfo
- * @constructor
  * @example
  * // Do not do this.
Index: CKEditor/branches/versions/3.5.x/_source/core/focusmanager.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/core/focusmanager.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/core/focusmanager.js	(revision 6050)
@@ -10,9 +10,12 @@
 
 /**
- * Manages the focus activity in an editor instance. This class is to be used
- * mainly by UI elements coders when adding interface elements to CKEditor.
- * @constructor
+ * Creates a focusManager class instance.
+ * @class Manages the focus activity in an editor instance. This class is to be
+ * used mainly by UI elements coders when adding interface elements that need
+ * to set the focus state of the editor.
  * @param {CKEDITOR.editor} editor The editor instance.
  * @example
+ * var focusManager = <b>new CKEDITOR.focusManager( editor )</b>;
+ * focusManager.focus();
  */
 CKEDITOR.focusManager = function( editor )
@@ -44,7 +47,8 @@
 {
 	/**
-	 * Indicates that the editor instance has the focus.
-	 *
-	 * This function is not used to set the focus in the editor. Use
+	 * Used to indicate that the editor instance has the focus.<br />
+	 * <br />
+	 * Note that this function will not explicitelly set the focus in the
+	 * editor (for example, making the caret blinking on it). Use
 	 * {@link CKEDITOR.editor#focus} for it instead.
 	 * @example
@@ -77,8 +81,9 @@
 
 	/**
-	 * Indicates that the editor instance has lost the focus. Note that this
-	 * functions acts asynchronously with a delay of 100ms to avoid subsequent
-	 * blur/focus effects. If you want the "blur" to happen immediately, use
-	 * the {@link #forceBlur} function instead.
+	 * Used to indicate that the editor instance has lost the focus.<br />
+	 * <br />
+	 * Note that this functions acts asynchronously with a delay of 100ms to
+	 * avoid subsequent blur/focus effects. If you want the "blur" to happen
+	 * immediately, use the {@link #forceBlur} function instead.
 	 * @example
 	 * var editor = CKEDITOR.instances.editor1;
@@ -102,5 +107,5 @@
 
 	/**
-	 * Indicates that the editor instance has lost the focus. Unlike
+	 * Used to indicate that the editor instance has lost the focus. Unlike
 	 * {@link #blur}, this function is synchronous, marking the instance as
 	 * "blured" immediately.
@@ -128,4 +133,9 @@
  * @event
  * @param {CKEDITOR.editor} editor The editor instance.
+ * @example
+ * editor.on( 'focus', function( e )
+ *     {
+ *         alert( 'The editor named ' + e.editor.name + ' is now focused' );
+ *     });
  */
 
@@ -135,3 +145,8 @@
  * @event
  * @param {CKEDITOR.editor} editor The editor instance.
+ * @example
+ * editor.on( 'blur', function( e )
+ *     {
+ *         alert( 'The editor named ' + e.editor.name + ' lost the focus' );
+ *     });
  */
Index: CKEditor/branches/versions/3.5.x/_source/core/htmlparser.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/core/htmlparser.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/core/htmlparser.js	(revision 6050)
@@ -5,7 +5,13 @@
 
 /**
- * HTML text parser.
- * @constructor
+ * Creates a {@link CKEDITOR.htmlParser} class instance.
+ * @class Provides an "event like" system to parse strings of HTML data.
  * @example
+ * var parser = new CKEDITOR.htmlParser();
+ * parser.onTagOpen = function( tagName, attributes, selfClosing )
+ *     {
+ *         alert( tagName );
+ *     };
+ * parser.parse( '&lt;p&gt;Some &lt;b&gt;text&lt;/b&gt;.&lt;/p&gt;' );
  */
 CKEDITOR.htmlParser = function()
@@ -93,5 +99,5 @@
 		 * @example
 		 * var parser = new CKEDITOR.htmlParser();
-		 * parser.onText = function( comment )
+		 * parser.onComment = function( comment )
 		 *     {
 		 *         alert( comment );  // e.g. " Example "
Index: CKEditor/branches/versions/3.5.x/_source/core/htmlparser/fragment.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/core/htmlparser/fragment.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/core/htmlparser/fragment.js	(revision 6050)
@@ -238,4 +238,10 @@
 					addElement( currentNode, currentNode.parent );
 				}
+				else if ( tagName in CKEDITOR.dtd.$listItem )
+				{
+					parser.onTagOpen( 'ul', {} );
+					addPoint = currentNode;
+					reApply = true;
+				}
 				else
 				{
@@ -387,4 +393,5 @@
 		parser.onComment = function( comment )
 		{
+			checkPending();
 			currentNode.add( new CKEDITOR.htmlParser.comment( comment ) );
 		};
Index: CKEditor/branches/versions/3.5.x/_source/core/imagecacher.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/core/imagecacher.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/core/imagecacher.js	(revision 6050)
@@ -24,7 +24,5 @@
 
 	/**
-	 * Load images into the browser cache.
-	 * @namespace
-	 * @example
+	 * @namespace Load images into the browser cache.
 	 */
  	CKEDITOR.imageCacher =
@@ -32,7 +30,19 @@
 		/**
 		 * Loads one or more images.
-		 * @param {Array} images The URLs for the images to be loaded.
-		 * @param {Function} callback The function to be called once all 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 )
@@ -40,9 +50,18 @@
 			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 )
-					callback();
-			};
+				{
+					if ( --pendingCount === 0 )
+						event.fire( 'loaded' );
+				};
 
 			for ( var i = 0 ; i < images.length ; i++ )
@@ -55,4 +74,6 @@
 					loadImage( image, checkPending );
 			}
+
+			return event;
 		}
 	};
Index: CKEditor/branches/versions/3.5.x/_source/core/lang.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/core/lang.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/core/lang.js	(revision 6050)
@@ -8,4 +8,7 @@
 	var loadedLangs = {};
 
+	/**
+	 * @namespace Holds language related functions.
+	 */
 	CKEDITOR.lang =
 	{
@@ -82,10 +85,9 @@
 		 * then called when the file gets loaded.
 		 * @param {String} languageCode The code of the language file to be
-		 *		loaded. If "autoDetect" is set to true, this language will be
-		 *		used as the default one, if the detect language is not
-		 *		available in the core.
-		 * @param {Boolean} autoDetect Indicates that the function must try to
-		 *		detect the user language and load it instead.
-		 * @param {Function} callback The function to be called once the
+		 *		loaded. If null or empty, autodetection will be performed. The
+		 *		same happens if the language is not supported.
+		 * @param {String} defaultLanguage The language to be used if
+		 *		languageCode is not supported or if the autodetection fails.
+		 * @param {Function} callback A function to be called once the
 		 *		language file is loaded. Two parameters are passed to this
 		 *		function: the language code and the loaded language entries.
@@ -122,4 +124,6 @@
 		 * @param {String} defaultLanguage The default language to be returned
 		 *		if the user language is not supported.
+		 * @param {String} [probeLanguage] A language code to try to use,
+		 *		instead of the browser based autodetection.
 		 * @returns {String} The detected language code.
 		 * @example
Index: CKEditor/branches/versions/3.5.x/_source/core/loader.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/core/loader.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/core/loader.js	(revision 6050)
@@ -60,5 +60,5 @@
 			'core/htmlparser/filter'	: [ 'core/htmlparser' ],
 			'core/htmlparser/basicwriter': [ 'core/htmlparser' ],
-			'core/imagecacher'		: [ 'core/dom/element' ],
+			'core/imagecacher'		: [ 'core/dom/element', 'core/event' ],
 			'core/lang'				: [],
 			'core/plugins'			: [ 'core/resourcemanager' ],
@@ -85,5 +85,5 @@
 			for ( var i = 0 ; i < scripts.length ; i++ )
 			{
-				var match = scripts[i].src.match( /(^|.*[\\\/])core\/loader.js(?:\?.*)?$/i );
+				var match = scripts[i].src.match( /(^|.*?[\\\/])(?:_source\/)?core\/loader.js(?:\?.*)?$/i );
 
 				if ( match )
Index: CKEditor/branches/versions/3.5.x/_source/core/scriptloader.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/core/scriptloader.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/core/scriptloader.js	(revision 6050)
@@ -16,6 +16,6 @@
 CKEDITOR.scriptLoader = (function()
 {
-	var uniqueScripts = {};
-	var waitingList = {};
+	var uniqueScripts = {},
+		waitingList = {};
 
 	return /** @lends CKEDITOR.scriptLoader */ {
@@ -36,4 +36,6 @@
 		 * @param {Boolean} [noCheck] Indicates that the script must be loaded
 		 *		anyway, not checking if it has already loaded.
+		 * @param {Boolean} [showBusy] Changes the cursor of the document while
++		 *		the script is loaded.
 		 * @example
 		 * CKEDITOR.scriptLoader.load( '/myscript.js' );
Index: CKEditor/branches/versions/3.5.x/_source/core/skins.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/core/skins.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/core/skins.js	(revision 6050)
@@ -17,7 +17,7 @@
 {
 	// Holds the list of loaded skins.
-	var loaded = {};
-	var preloaded = {};
-	var paths = {};
+	var loaded = {},
+		preloaded = {},
+		paths = {};
 
 	var loadPart = function( editor, skinName, part, callback )
@@ -56,20 +56,28 @@
 
 		// Check if we need to preload images from it.
-		if ( !preloaded[ skinName ] )
-		{
-			var preload = skinDefinition.preload;
-			if ( preload && preload.length > 0 )
-			{
+		var preload = skinDefinition.preload;
+		if ( preload && preload.length > 0 )
+		{
+			if ( !preloaded[ skinName ] )
+			{
+				// Prepare image URLs
 				appendSkinPath( preload );
-				CKEDITOR.imageCacher.load( preload, function()
-					{
-						preloaded[ skinName ] = 1;
+
+				// 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;
 			}
-
-			// Mark it as preloaded.
-			preloaded[ skinName ] = 1;
 		}
 
@@ -94,6 +102,6 @@
 			// Check whether the "css" and "js" properties have been defined
 			// for that part.
-			var cssIsLoaded = !part.css || !part.css.length;
-			var jsIsLoaded = !part.js || !part.js.length;
+			var cssIsLoaded = !part.css || !part.css.length,
+				jsIsLoaded = !part.js || !part.js.length;
 
 			// This is the function that will trigger the callback calls on
Index: CKEditor/branches/versions/3.5.x/_source/core/tools.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/core/tools.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/core/tools.js	(revision 6050)
@@ -347,17 +347,4 @@
 
 		/**
-		 * Replace characters can't be represented through CSS Selectors string
-		 * by CSS Escape Notation where the character escape sequence consists
-		 * of a backslash character (\) followed by the orginal characters.
-		 * Ref: http://www.w3.org/TR/css3-selectors/#grammar
-		 * @param cssSelectText
-		 * @return the escaped selector text.
-		 */
-		escapeCssSelector : function( cssSelectText )
-		{
-			return cssSelectText.replace( /[\s#:.,$*^\[\]()~=+>]/g, '\\$&' );
-		},
-
-		/**
 		 * Gets a unique number for this CKEDITOR execution session. It returns
 		 * progressive numbers starting at 1.
Index: CKEditor/branches/versions/3.5.x/_source/lang/_translationstatus.txt
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/_translationstatus.txt	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/_translationstatus.txt	(revision 6050)
@@ -21,5 +21,5 @@
 eu.js      Found: 403 Missing: 143
 fa.js      Found: 302 Missing: 244
-fi.js      Found: 518 Missing: 28
+fi.js      Found: 531 Missing: 15
 fo.js      Found: 420 Missing: 126
 fr-ca.js   Found: 301 Missing: 245
@@ -41,5 +41,5 @@
 ms.js      Found: 265 Missing: 281
 nb.js      Found: 470 Missing: 76
-nl.js      Found: 494 Missing: 52
+nl.js      Found: 531 Missing: 15
 no.js      Found: 470 Missing: 76
 pl.js      Found: 411 Missing: 135
@@ -55,6 +55,6 @@
 th.js      Found: 287 Missing: 259
 tr.js      Found: 524 Missing: 22
-uk.js      Found: 404 Missing: 142
+uk.js      Found: 531 Missing: 15
 vi.js      Found: 481 Missing: 65
-zh-cn.js   Found: 523 Missing: 23
+zh-cn.js   Found: 531 Missing: 15
 zh.js      Found: 404 Missing: 142
Index: CKEditor/branches/versions/3.5.x/_source/lang/af.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/af.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/af.js	(revision 6050)
@@ -732,5 +732,5 @@
 		dic_delete		: 'Delete', // MISSING
 		dic_rename		: 'Rename', // MISSING
-		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type it\'s name and click the Restore button.', // MISSING
+		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.', // MISSING
 
 		aboutTab		: 'About' // MISSING
Index: CKEditor/branches/versions/3.5.x/_source/lang/ar.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/ar.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/ar.js	(revision 6050)
@@ -732,5 +732,5 @@
 		dic_delete		: 'Delete', // MISSING
 		dic_rename		: 'Rename', // MISSING
-		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type it\'s name and click the Restore button.', // MISSING
+		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.', // MISSING
 
 		aboutTab		: 'عن'
Index: CKEditor/branches/versions/3.5.x/_source/lang/bg.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/bg.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/bg.js	(revision 6050)
@@ -732,5 +732,5 @@
 		dic_delete		: 'Delete', // MISSING
 		dic_rename		: 'Rename', // MISSING
-		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type it\'s name and click the Restore button.', // MISSING
+		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.', // MISSING
 
 		aboutTab		: 'About' // MISSING
Index: CKEditor/branches/versions/3.5.x/_source/lang/bn.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/bn.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/bn.js	(revision 6050)
@@ -732,5 +732,5 @@
 		dic_delete		: 'Delete', // MISSING
 		dic_rename		: 'Rename', // MISSING
-		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type it\'s name and click the Restore button.', // MISSING
+		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.', // MISSING
 
 		aboutTab		: 'About' // MISSING
Index: CKEditor/branches/versions/3.5.x/_source/lang/bs.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/bs.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/bs.js	(revision 6050)
@@ -732,5 +732,5 @@
 		dic_delete		: 'Delete', // MISSING
 		dic_rename		: 'Rename', // MISSING
-		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type it\'s name and click the Restore button.', // MISSING
+		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.', // MISSING
 
 		aboutTab		: 'About' // MISSING
Index: CKEditor/branches/versions/3.5.x/_source/lang/ca.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/ca.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/ca.js	(revision 6050)
@@ -732,5 +732,5 @@
 		dic_delete		: 'Delete', // MISSING
 		dic_rename		: 'Rename', // MISSING
-		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type it\'s name and click the Restore button.', // MISSING
+		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.', // MISSING
 
 		aboutTab		: 'Quant a'
Index: CKEditor/branches/versions/3.5.x/_source/lang/cs.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/cs.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/cs.js	(revision 6050)
@@ -732,5 +732,5 @@
 		dic_delete		: 'Delete', // MISSING
 		dic_rename		: 'Rename', // MISSING
-		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type it\'s name and click the Restore button.', // MISSING
+		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.', // MISSING
 
 		aboutTab		: 'O aplikaci'
Index: CKEditor/branches/versions/3.5.x/_source/lang/cy.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/cy.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/cy.js	(revision 6050)
@@ -732,5 +732,5 @@
 		dic_delete		: 'Delete', // MISSING
 		dic_rename		: 'Rename', // MISSING
-		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type it\'s name and click the Restore button.', // MISSING
+		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.', // MISSING
 
 		aboutTab		: 'Ynghylch'
Index: CKEditor/branches/versions/3.5.x/_source/lang/da.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/da.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/da.js	(revision 6050)
@@ -732,5 +732,5 @@
 		dic_delete		: 'Delete', // MISSING
 		dic_rename		: 'Rename', // MISSING
-		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type it\'s name and click the Restore button.', // MISSING
+		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.', // MISSING
 
 		aboutTab		: 'Om'
Index: CKEditor/branches/versions/3.5.x/_source/lang/el.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/el.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/el.js	(revision 6050)
@@ -732,5 +732,5 @@
 		dic_delete		: 'Delete', // MISSING
 		dic_rename		: 'Rename', // MISSING
-		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type it\'s name and click the Restore button.', // MISSING
+		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.', // MISSING
 
 		aboutTab		: 'About' // MISSING
Index: CKEditor/branches/versions/3.5.x/_source/lang/en-au.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/en-au.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/en-au.js	(revision 6050)
@@ -732,5 +732,5 @@
 		dic_delete		: 'Delete', // MISSING
 		dic_rename		: 'Rename', // MISSING
-		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type it\'s name and click the Restore button.', // MISSING
+		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.', // MISSING
 
 		aboutTab		: 'About' // MISSING
Index: CKEditor/branches/versions/3.5.x/_source/lang/en-ca.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/en-ca.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/en-ca.js	(revision 6050)
@@ -732,5 +732,5 @@
 		dic_delete		: 'Delete', // MISSING
 		dic_rename		: 'Rename', // MISSING
-		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type it\'s name and click the Restore button.', // MISSING
+		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.', // MISSING
 
 		aboutTab		: 'About' // MISSING
Index: CKEditor/branches/versions/3.5.x/_source/lang/en-gb.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/en-gb.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/en-gb.js	(revision 6050)
@@ -732,5 +732,5 @@
 		dic_delete		: 'Delete', // MISSING
 		dic_rename		: 'Rename', // MISSING
-		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type it\'s name and click the Restore button.', // MISSING
+		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.', // MISSING
 
 		aboutTab		: 'About' // MISSING
Index: CKEditor/branches/versions/3.5.x/_source/lang/en.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/en.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/en.js	(revision 6050)
@@ -732,5 +732,5 @@
 		dic_delete		: 'Delete',
 		dic_rename		: 'Rename',
-		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type it\'s name and click the Restore button.',
+		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',
 
 		aboutTab		: 'About'
Index: CKEditor/branches/versions/3.5.x/_source/lang/eo.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/eo.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/eo.js	(revision 6050)
@@ -732,5 +732,5 @@
 		dic_delete		: 'Delete', // MISSING
 		dic_rename		: 'Rename', // MISSING
-		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type it\'s name and click the Restore button.', // MISSING
+		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.', // MISSING
 
 		aboutTab		: 'About' // MISSING
Index: CKEditor/branches/versions/3.5.x/_source/lang/et.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/et.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/et.js	(revision 6050)
@@ -732,5 +732,5 @@
 		dic_delete		: 'Delete', // MISSING
 		dic_rename		: 'Rename', // MISSING
-		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type it\'s name and click the Restore button.', // MISSING
+		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.', // MISSING
 
 		aboutTab		: 'About' // MISSING
Index: CKEditor/branches/versions/3.5.x/_source/lang/eu.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/eu.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/eu.js	(revision 6050)
@@ -732,5 +732,5 @@
 		dic_delete		: 'Delete', // MISSING
 		dic_rename		: 'Rename', // MISSING
-		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type it\'s name and click the Restore button.', // MISSING
+		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.', // MISSING
 
 		aboutTab		: 'Honi buruz'
Index: CKEditor/branches/versions/3.5.x/_source/lang/fa.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/fa.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/fa.js	(revision 6050)
@@ -732,5 +732,5 @@
 		dic_delete		: 'Delete', // MISSING
 		dic_rename		: 'Rename', // MISSING
-		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type it\'s name and click the Restore button.', // MISSING
+		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.', // MISSING
 
 		aboutTab		: 'About' // MISSING
Index: CKEditor/branches/versions/3.5.x/_source/lang/fi.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/fi.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/fi.js	(revision 6050)
@@ -106,8 +106,8 @@
 		targetSelf		: 'Sama ikkuna (_self)',
 		targetParent	: 'Ylemmän tason ikkuna (_parent)',
-		langDirLTR		: 'Left to Right (LTR)', // MISSING
-		langDirRTL		: 'Right to Left (RTL)', // MISSING
-		styles			: 'Style', // MISSING
-		cssClasses		: 'Stylesheet Classes', // MISSING
+		langDirLTR		: 'Vasemmalta oikealle (LTR)',
+		langDirRTL		: 'Oikealta vasemmalle (RTL)',
+		styles			: 'Tyyli',
+		cssClasses		: 'Tyylitiedoston luokat',
 
 		// Put the voice-only part of the label in the span.
@@ -117,5 +117,5 @@
 	contextmenu :
 	{
-		options : 'Context Menu Options' // MISSING
+		options : 'Pikavalikon ominaisuudet'
 	},
 
@@ -125,5 +125,5 @@
 		toolbar		: 'Lisää erikoismerkki',
 		title		: 'Valitse erikoismerkki',
-		options : 'Special Character Options' // MISSING
+		options : 'Erikoismerkin ominaisuudet'
 	},
 
@@ -201,5 +201,5 @@
 		type				: 'Tyyppi',
 		start				: 'Alku',
-		validateStartNumber				:'List start number must be a whole number.', // MISSING
+		validateStartNumber				:'Listan ensimmäisen numeron tulee olla kokonaisluku.',
 		circle				: 'Ympyrä',
 		disc				: 'Levy',
@@ -208,5 +208,5 @@
 		notset				: '<ei asetettu>',
 		armenian			: 'Armeenialainen numerointi',
-		georgian			: 'Georgian numbering (an, ban, gan, etc.)', // MISSING
+		georgian			: 'Georgialainen numerointi (an, ban, gan, etc.)',
 		lowerRoman			: 'Pienet roomalaiset (i, ii, iii, iv, v, jne.)',
 		upperRoman			: 'Isot roomalaiset (I, II, III, IV, V, jne.)',
@@ -513,5 +513,5 @@
 		toolbar	: 'Hymiö',
 		title	: 'Lisää hymiö',
-		options : 'Smiley Options' // MISSING
+		options : 'Hymiön ominaisuudet'
 	},
 
@@ -565,5 +565,5 @@
 		button			: 'Pohjat',
 		title			: 'Sisältöpohjat',
-		options : 'Template Options', // MISSING
+		options : 'Sisältöpohjan ominaisuudet',
 		insertOption	: 'Korvaa editorin koko sisältö',
 		selectPromptMsg	: 'Valitse pohja editoriin<br>(aiempi sisältö menetetään):',
@@ -761,5 +761,5 @@
 	{
 		title		: 'Valitse väri',
-		options	:	'Color Options', // MISSING
+		options	:	'Värin ominaisuudet',
 		highlight	: 'Korostus',
 		selected	: 'Valittu',
@@ -772,6 +772,6 @@
 	bidi :
 	{
-		ltr : 'Text direction from left to right', // MISSING
-		rtl : 'Text direction from right to left' // MISSING
+		ltr : 'Tekstin suunta vasemmalta oikealle',
+		rtl : 'Tekstin suunta oikealta vasemmalle'
 	}
 };
Index: CKEditor/branches/versions/3.5.x/_source/lang/fo.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/fo.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/fo.js	(revision 6050)
@@ -732,5 +732,5 @@
 		dic_delete		: 'Delete', // MISSING
 		dic_rename		: 'Rename', // MISSING
-		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type it\'s name and click the Restore button.', // MISSING
+		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.', // MISSING
 
 		aboutTab		: 'Um'
Index: CKEditor/branches/versions/3.5.x/_source/lang/fr-ca.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/fr-ca.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/fr-ca.js	(revision 6050)
@@ -732,5 +732,5 @@
 		dic_delete		: 'Delete', // MISSING
 		dic_rename		: 'Rename', // MISSING
-		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type it\'s name and click the Restore button.', // MISSING
+		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.', // MISSING
 
 		aboutTab		: 'About' // MISSING
Index: CKEditor/branches/versions/3.5.x/_source/lang/fr.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/fr.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/fr.js	(revision 6050)
@@ -732,5 +732,5 @@
 		dic_delete		: 'Delete', // MISSING
 		dic_rename		: 'Rename', // MISSING
-		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type it\'s name and click the Restore button.', // MISSING
+		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.', // MISSING
 
 		aboutTab		: 'A propos de'
Index: CKEditor/branches/versions/3.5.x/_source/lang/gl.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/gl.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/gl.js	(revision 6050)
@@ -732,5 +732,5 @@
 		dic_delete		: 'Delete', // MISSING
 		dic_rename		: 'Rename', // MISSING
-		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type it\'s name and click the Restore button.', // MISSING
+		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.', // MISSING
 
 		aboutTab		: 'About' // MISSING
Index: CKEditor/branches/versions/3.5.x/_source/lang/gu.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/gu.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/gu.js	(revision 6050)
@@ -732,5 +732,5 @@
 		dic_delete		: 'Delete', // MISSING
 		dic_rename		: 'Rename', // MISSING
-		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type it\'s name and click the Restore button.', // MISSING
+		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.', // MISSING
 
 		aboutTab		: 'About' // MISSING
Index: CKEditor/branches/versions/3.5.x/_source/lang/hi.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/hi.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/hi.js	(revision 6050)
@@ -732,5 +732,5 @@
 		dic_delete		: 'Delete', // MISSING
 		dic_rename		: 'Rename', // MISSING
-		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type it\'s name and click the Restore button.', // MISSING
+		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.', // MISSING
 
 		aboutTab		: 'About' // MISSING
Index: CKEditor/branches/versions/3.5.x/_source/lang/hr.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/hr.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/hr.js	(revision 6050)
@@ -732,5 +732,5 @@
 		dic_delete		: 'Delete', // MISSING
 		dic_rename		: 'Rename', // MISSING
-		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type it\'s name and click the Restore button.', // MISSING
+		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.', // MISSING
 
 		aboutTab		: 'O SCAYT'
Index: CKEditor/branches/versions/3.5.x/_source/lang/hu.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/hu.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/hu.js	(revision 6050)
@@ -732,5 +732,5 @@
 		dic_delete		: 'Delete', // MISSING
 		dic_rename		: 'Rename', // MISSING
-		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type it\'s name and click the Restore button.', // MISSING
+		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.', // MISSING
 
 		aboutTab		: 'Névjegy'
Index: CKEditor/branches/versions/3.5.x/_source/lang/is.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/is.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/is.js	(revision 6050)
@@ -732,5 +732,5 @@
 		dic_delete		: 'Delete', // MISSING
 		dic_rename		: 'Rename', // MISSING
-		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type it\'s name and click the Restore button.', // MISSING
+		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.', // MISSING
 
 		aboutTab		: 'About' // MISSING
Index: CKEditor/branches/versions/3.5.x/_source/lang/it.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/it.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/it.js	(revision 6050)
@@ -732,5 +732,5 @@
 		dic_delete		: 'Delete', // MISSING
 		dic_rename		: 'Rename', // MISSING
-		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type it\'s name and click the Restore button.', // MISSING
+		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.', // MISSING
 
 		aboutTab		: 'About'
Index: CKEditor/branches/versions/3.5.x/_source/lang/ja.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/ja.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/ja.js	(revision 6050)
@@ -732,5 +732,5 @@
 		dic_delete		: 'Delete', // MISSING
 		dic_rename		: 'Rename', // MISSING
-		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type it\'s name and click the Restore button.', // MISSING
+		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.', // MISSING
 
 		aboutTab		: 'バージョン情報'
Index: CKEditor/branches/versions/3.5.x/_source/lang/km.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/km.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/km.js	(revision 6050)
@@ -732,5 +732,5 @@
 		dic_delete		: 'Delete', // MISSING
 		dic_rename		: 'Rename', // MISSING
-		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type it\'s name and click the Restore button.', // MISSING
+		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.', // MISSING
 
 		aboutTab		: 'About' // MISSING
Index: CKEditor/branches/versions/3.5.x/_source/lang/ko.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/ko.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/ko.js	(revision 6050)
@@ -732,5 +732,5 @@
 		dic_delete		: 'Delete', // MISSING
 		dic_rename		: 'Rename', // MISSING
-		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type it\'s name and click the Restore button.', // MISSING
+		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.', // MISSING
 
 		aboutTab		: 'About' // MISSING
Index: CKEditor/branches/versions/3.5.x/_source/lang/lt.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/lt.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/lt.js	(revision 6050)
@@ -732,5 +732,5 @@
 		dic_delete		: 'Delete', // MISSING
 		dic_rename		: 'Rename', // MISSING
-		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type it\'s name and click the Restore button.', // MISSING
+		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.', // MISSING
 
 		aboutTab		: 'About' // MISSING
Index: CKEditor/branches/versions/3.5.x/_source/lang/lv.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/lv.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/lv.js	(revision 6050)
@@ -732,5 +732,5 @@
 		dic_delete		: 'Delete', // MISSING
 		dic_rename		: 'Rename', // MISSING
-		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type it\'s name and click the Restore button.', // MISSING
+		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.', // MISSING
 
 		aboutTab		: 'About' // MISSING
Index: CKEditor/branches/versions/3.5.x/_source/lang/mn.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/mn.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/mn.js	(revision 6050)
@@ -732,5 +732,5 @@
 		dic_delete		: 'Delete', // MISSING
 		dic_rename		: 'Rename', // MISSING
-		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type it\'s name and click the Restore button.', // MISSING
+		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.', // MISSING
 
 		aboutTab		: 'About' // MISSING
Index: CKEditor/branches/versions/3.5.x/_source/lang/ms.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/ms.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/ms.js	(revision 6050)
@@ -732,5 +732,5 @@
 		dic_delete		: 'Delete', // MISSING
 		dic_rename		: 'Rename', // MISSING
-		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type it\'s name and click the Restore button.', // MISSING
+		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.', // MISSING
 
 		aboutTab		: 'About' // MISSING
Index: CKEditor/branches/versions/3.5.x/_source/lang/nb.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/nb.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/nb.js	(revision 6050)
@@ -732,5 +732,5 @@
 		dic_delete		: 'Delete', // MISSING
 		dic_rename		: 'Rename', // MISSING
-		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type it\'s name and click the Restore button.', // MISSING
+		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.', // MISSING
 
 		aboutTab		: 'Om'
Index: CKEditor/branches/versions/3.5.x/_source/lang/nl.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/nl.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/nl.js	(revision 6050)
@@ -106,8 +106,8 @@
 		targetSelf		: 'Zelfde venster (_self)',
 		targetParent	: 'Origineel venster (_parent)',
-		langDirLTR		: 'Left to Right (LTR)', // MISSING
-		langDirRTL		: 'Right to Left (RTL)', // MISSING
-		styles			: 'Style', // MISSING
-		cssClasses		: 'Stylesheet Classes', // MISSING
+		langDirLTR		: 'Links naar rechts (LTR)',
+		langDirRTL		: 'Rechts naar links (RTL)',
+		styles			: 'Stijlen',
+		cssClasses		: 'Stylesheet klassen',
 
 		// Put the voice-only part of the label in the span.
@@ -197,23 +197,23 @@
 	list:
 	{
-		numberedTitle		: 'Numbered List Properties', // MISSING
-		bulletedTitle		: 'Bulleted List Properties', // MISSING
-		type				: 'Type', // MISSING
-		start				: 'Start', // MISSING
-		validateStartNumber				:'List start number must be a whole number.', // MISSING
-		circle				: 'Circle', // MISSING
-		disc				: 'Disc', // MISSING
-		square				: 'Square', // MISSING
-		none				: 'None', // MISSING
-		notset				: '<not set>', // MISSING
-		armenian			: 'Armenian numbering', // MISSING
-		georgian			: 'Georgian numbering (an, ban, gan, etc.)', // MISSING
-		lowerRoman			: 'Lower Roman (i, ii, iii, iv, v, etc.)', // MISSING
-		upperRoman			: 'Upper Roman (I, II, III, IV, V, etc.)', // MISSING
-		lowerAlpha			: 'Lower Alpha (a, b, c, d, e, etc.)', // MISSING
-		upperAlpha			: 'Upper Alpha (A, B, C, D, E, etc.)', // MISSING
-		lowerGreek			: 'Lower Greek (alpha, beta, gamma, etc.)', // MISSING
-		decimal				: 'Decimal (1, 2, 3, etc.)', // MISSING
-		decimalLeadingZero	: 'Decimal leading zero (01, 02, 03, etc.)' // MISSING
+		numberedTitle		: 'Eigenschappen genummerde lijst',
+		bulletedTitle		: 'Eigenschappen lijst met opsommingstekens',
+		type				: 'Type',
+		start				: 'Start',
+		validateStartNumber				:'Starnummer van de lijst moet een heel nummer zijn.',
+		circle				: 'Cirkel',
+		disc				: 'Schijf',
+		square				: 'Vierkant',
+		none				: 'Geen',
+		notset				: '<niet gezet>',
+		armenian			: 'Armeense numering',
+		georgian			: 'Greorgische numering (an, ban, gan, etc.)',
+		lowerRoman			: 'Romeins kleine letters (i, ii, iii, iv, v, etc.)',
+		upperRoman			: 'Romeins hoofdletters (I, II, III, IV, V, etc.)',
+		lowerAlpha			: 'Kleine letters (a, b, c, d, e, etc.)',
+		upperAlpha			: 'Hoofdletters (A, B, C, D, E, etc.)',
+		lowerGreek			: 'Grieks kleine letters (alpha, beta, gamma, etc.)',
+		decimal				: 'Cijfers (1, 2, 3, etc.)',
+		decimalLeadingZero	: 'Cijfers beginnen met nul (01, 02, 03, etc.)'
 	},
 
@@ -705,5 +705,5 @@
 	{
 		title			: 'Controleer de spelling tijdens het typen',
-		opera_title		: 'Not supported by Opera', // MISSING
+		opera_title		: 'Niet ondersteund door Opera',
 		enable			: 'SCAYT inschakelen',
 		disable			: 'SCAYT uitschakelen',
@@ -719,18 +719,18 @@
 
 		optionsTab		: 'Opties',
-		allCaps			: 'Ignore All-Caps Words', // MISSING
-		ignoreDomainNames : 'Ignore Domain Names', // MISSING
-		mixedCase		: 'Ignore Words with Mixed Case', // MISSING
-		mixedWithDigits	: 'Ignore Words with Numbers', // MISSING
+		allCaps			: 'Negeer woorden helemaal in hoofdletters',
+		ignoreDomainNames : 'Negeer domeinnamen',
+		mixedCase		: 'Negeer woorden met hoofd- en kleine letters',
+		mixedWithDigits	: 'Negeer woorden met cijfers',
 
 		languagesTab	: 'Talen',
 
 		dictionariesTab	: 'Woordenboeken',
-		dic_field_name	: 'Dictionary name', // MISSING
-		dic_create		: 'Create', // MISSING
-		dic_restore		: 'Restore', // MISSING
-		dic_delete		: 'Delete', // MISSING
-		dic_rename		: 'Rename', // MISSING
-		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type it\'s name and click the Restore button.', // MISSING
+		dic_field_name	: 'Naam woordenboek',
+		dic_create		: 'Aanmaken',
+		dic_restore		: 'Terugzetten',
+		dic_delete		: 'Verwijderen',
+		dic_rename		: 'Hernoemen',
+		dic_info		: 'Initieel wordt het gebruikerswoordenboek opgeslagen in een cookie. Cookies zijn echter beperkt in grootte. Zodra het gebruikerswoordenboek het punt bereikt waarop het niet meer in een cookie opgeslagen kan worden, dan wordt het woordenboek op de server opgeslagen. Om je persoonlijke woordenboek op je eigen server op te slaan, moet je een mapnaam opgeven. Indien je al een woordenboek hebt opgeslagen, typ dan de naam en klik op de Terugzetten knop.',
 
 		aboutTab		: 'Over'
@@ -761,5 +761,5 @@
 	{
 		title		: 'Selecteer kleur',
-		options	:	'Color Options', // MISSING
+		options	:	'Kleuropties',
 		highlight	: 'Actief',
 		selected	: 'Geselecteerd',
@@ -772,6 +772,6 @@
 	bidi :
 	{
-		ltr : 'Text direction from left to right', // MISSING
-		rtl : 'Text direction from right to left' // MISSING
+		ltr : 'Schrijfrichting van links naar rechts',
+		rtl : 'Schrijfrichting van rechts naar links'
 	}
 };
Index: CKEditor/branches/versions/3.5.x/_source/lang/no.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/no.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/no.js	(revision 6050)
@@ -732,5 +732,5 @@
 		dic_delete		: 'Delete', // MISSING
 		dic_rename		: 'Rename', // MISSING
-		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type it\'s name and click the Restore button.', // MISSING
+		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.', // MISSING
 
 		aboutTab		: 'Om'
Index: CKEditor/branches/versions/3.5.x/_source/lang/pl.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/pl.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/pl.js	(revision 6050)
@@ -732,5 +732,5 @@
 		dic_delete		: 'Delete', // MISSING
 		dic_rename		: 'Rename', // MISSING
-		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type it\'s name and click the Restore button.', // MISSING
+		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.', // MISSING
 
 		aboutTab		: 'Na temat SCAYT'
Index: CKEditor/branches/versions/3.5.x/_source/lang/pt.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/pt.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/pt.js	(revision 6050)
@@ -732,5 +732,5 @@
 		dic_delete		: 'Delete', // MISSING
 		dic_rename		: 'Rename', // MISSING
-		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type it\'s name and click the Restore button.', // MISSING
+		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.', // MISSING
 
 		aboutTab		: 'About' // MISSING
Index: CKEditor/branches/versions/3.5.x/_source/lang/ro.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/ro.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/ro.js	(revision 6050)
@@ -732,5 +732,5 @@
 		dic_delete		: 'Delete', // MISSING
 		dic_rename		: 'Rename', // MISSING
-		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type it\'s name and click the Restore button.', // MISSING
+		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.', // MISSING
 
 		aboutTab		: 'About' // MISSING
Index: CKEditor/branches/versions/3.5.x/_source/lang/ru.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/ru.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/ru.js	(revision 6050)
@@ -732,5 +732,5 @@
 		dic_delete		: 'Delete', // MISSING
 		dic_rename		: 'Rename', // MISSING
-		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type it\'s name and click the Restore button.', // MISSING
+		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.', // MISSING
 
 		aboutTab		: 'О словарях'
Index: CKEditor/branches/versions/3.5.x/_source/lang/sk.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/sk.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/sk.js	(revision 6050)
@@ -732,5 +732,5 @@
 		dic_delete		: 'Delete', // MISSING
 		dic_rename		: 'Rename', // MISSING
-		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type it\'s name and click the Restore button.', // MISSING
+		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.', // MISSING
 
 		aboutTab		: 'About' // MISSING
Index: CKEditor/branches/versions/3.5.x/_source/lang/sl.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/sl.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/sl.js	(revision 6050)
@@ -732,5 +732,5 @@
 		dic_delete		: 'Delete', // MISSING
 		dic_rename		: 'Rename', // MISSING
-		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type it\'s name and click the Restore button.', // MISSING
+		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.', // MISSING
 
 		aboutTab		: 'O storitvi'
Index: CKEditor/branches/versions/3.5.x/_source/lang/sr-latn.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/sr-latn.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/sr-latn.js	(revision 6050)
@@ -732,5 +732,5 @@
 		dic_delete		: 'Delete', // MISSING
 		dic_rename		: 'Rename', // MISSING
-		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type it\'s name and click the Restore button.', // MISSING
+		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.', // MISSING
 
 		aboutTab		: 'About' // MISSING
Index: CKEditor/branches/versions/3.5.x/_source/lang/sr.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/sr.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/sr.js	(revision 6050)
@@ -732,5 +732,5 @@
 		dic_delete		: 'Delete', // MISSING
 		dic_rename		: 'Rename', // MISSING
-		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type it\'s name and click the Restore button.', // MISSING
+		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.', // MISSING
 
 		aboutTab		: 'About' // MISSING
Index: CKEditor/branches/versions/3.5.x/_source/lang/sv.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/sv.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/sv.js	(revision 6050)
@@ -732,5 +732,5 @@
 		dic_delete		: 'Delete', // MISSING
 		dic_rename		: 'Rename', // MISSING
-		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type it\'s name and click the Restore button.', // MISSING
+		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.', // MISSING
 
 		aboutTab		: 'About' // MISSING
Index: CKEditor/branches/versions/3.5.x/_source/lang/th.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/th.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/th.js	(revision 6050)
@@ -732,5 +732,5 @@
 		dic_delete		: 'Delete', // MISSING
 		dic_rename		: 'Rename', // MISSING
-		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type it\'s name and click the Restore button.', // MISSING
+		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.', // MISSING
 
 		aboutTab		: 'About' // MISSING
Index: CKEditor/branches/versions/3.5.x/_source/lang/uk.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/uk.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/uk.js	(revision 6050)
@@ -6,5 +6,5 @@
 /**
  * @fileOverview Defines the {@link CKEDITOR.lang} object, for the
- * Ukrainian language. Translated by Alexander Pervak.
+ * Ukrainian language.
  */
 
@@ -32,9 +32,9 @@
 	 * of reading non-English words. So be careful while translating it.
 	 */
-	editorTitle : 'Rich text editor, %1, press ALT 0 for help.', // MISSING
+	editorTitle : 'Текстовий редактор, %1, натисніть ALT 0 для довідки.',
 
 	// ARIA descriptions.
-	toolbar	: 'Toolbar', // MISSING
-	editor	: 'Rich Text Editor', // MISSING
+	toolbar	: 'Панель інструментів',
+	editor	: 'Текстовий редактор',
 
 	// Toolbar buttons without dialogs.
@@ -51,11 +51,11 @@
 	italic			: 'Курсив',
 	selectAll		: 'Виділити все',
-	removeFormat	: 'Прибрати форматування',
+	removeFormat	: 'Очистити форматування',
 	strike			: 'Закреслений',
-	subscript		: 'Підрядковий індекс',
-	superscript		: 'Надрядковий индекс',
-	horizontalrule	: 'Вставити горизонтальну лінію',
-	pagebreak		: 'Вставити розривши сторінки',
-	unlink			: 'Знищити посилання',
+	subscript		: 'Нижній індекс',
+	superscript		: 'Верхній індекс',
+	horizontalrule	: 'Горизонтальна лінія',
+	pagebreak		: 'Вставити розрив сторінки',
+	unlink			: 'Видалити посилання',
 	undo			: 'Повернути',
 	redo			: 'Повторити',
@@ -64,13 +64,13 @@
 	common :
 	{
-		browseServer	: 'Передивитися на сервері',
+		browseServer	: 'Огляд',
 		url				: 'URL',
 		protocol		: 'Протокол',
-		upload			: 'Закачати',
+		upload			: 'Надіслати',
 		uploadSubmit	: 'Надіслати на сервер',
 		image			: 'Зображення',
 		flash			: 'Flash',
 		form			: 'Форма',
-		checkbox		: 'Флагова кнопка',
+		checkbox		: 'Галочка',
 		radio			: 'Кнопка вибору',
 		textField		: 'Текстове поле',
@@ -82,9 +82,9 @@
 		notSet			: '<не визначено>',
 		id				: 'Ідентифікатор',
-		name			: 'Им\'я',
+		name			: 'Ім\'я',
 		langDir			: 'Напрямок мови',
-		langDirLtr		: 'Зліва на право (LTR)',
-		langDirRtl		: 'Зправа на ліво (RTL)',
-		langCode		: 'Мова',
+		langDirLtr		: 'Зліва направо (LTR)',
+		langDirRtl		: 'Справа наліво (RTL)',
+		langCode		: 'Код мови',
 		longDescr		: 'Довгий опис URL',
 		cssClass		: 'Клас CSS',
@@ -93,21 +93,21 @@
 		ok				: 'ОК',
 		cancel			: 'Скасувати',
-		close			: 'Close', // MISSING
-		preview			: 'Preview', // MISSING
-		generalTab		: 'Загальна',
-		advancedTab		: 'Розширений',
-		validateNumberFailed : 'Значення не є числом.',
-		confirmNewPage	: 'Всі не збережені зміни будуть втрачені. Ви впевнені, що хочете завантажити нову сторінку?',
-		confirmCancel	: 'Деякі опції були змінені. Закрити вікно?',
-		options			: 'Options', // MISSING
-		target			: 'Target', // MISSING
-		targetNew		: 'New Window (_blank)', // MISSING
-		targetTop		: 'Topmost Window (_top)', // MISSING
-		targetSelf		: 'Same Window (_self)', // MISSING
-		targetParent	: 'Parent Window (_parent)', // MISSING
-		langDirLTR		: 'Left to Right (LTR)', // MISSING
-		langDirRTL		: 'Right to Left (RTL)', // MISSING
-		styles			: 'Style', // MISSING
-		cssClasses		: 'Stylesheet Classes', // MISSING
+		close			: 'Закрити',
+		preview			: 'Попередній перегляд',
+		generalTab		: 'Основне',
+		advancedTab		: 'Додаткове',
+		validateNumberFailed : 'Значення не є цілим числом.',
+		confirmNewPage	: 'Всі незбережені зміни будуть втрачені. Ви впевнені, що хочете завантажити нову сторінку?',
+		confirmCancel	: 'Деякі опції змінено. Закрити вікно без збереження змін?',
+		options			: 'Опції',
+		target			: 'Ціль',
+		targetNew		: 'Нове вікно (_blank)',
+		targetTop		: 'Поточне вікно (_top)',
+		targetSelf		: 'Поточний фрейм/вікно (_self)',
+		targetParent	: 'Батьківський фрейм/вікно (_parent)',
+		langDirLTR		: 'Зліва направо (LTR)',
+		langDirRTL		: 'Справа наліво (RTL)',
+		styles			: 'Стиль CSS',
+		cssClasses		: 'Клас CSS',
 
 		// Put the voice-only part of the label in the span.
@@ -117,5 +117,5 @@
 	contextmenu :
 	{
-		options : 'Context Menu Options' // MISSING
+		options : 'Опції контекстного меню'
 	},
 
@@ -123,7 +123,7 @@
 	specialChar		:
 	{
-		toolbar		: 'Вставити спеціальний символ',
+		toolbar		: 'Спеціальний символ',
 		title		: 'Оберіть спеціальний символ',
-		options : 'Special Character Options' // MISSING
+		options : 'Опції'
 	},
 
@@ -137,22 +137,22 @@
 		info		: 'Інформація посилання',
 		target		: 'Ціль',
-		upload		: 'Закачати',
-		advanced	: 'Розширений',
+		upload		: 'Надіслати',
+		advanced	: 'Додаткове',
 		type		: 'Тип посилання',
-		toUrl		: 'URL', // MISSING
+		toUrl		: 'URL',
 		toAnchor	: 'Якір на цю сторінку',
-		toEmail		: 'Эл. пошта',
+		toEmail		: 'Ел. пошта',
 		targetFrame		: '<фрейм>',
-		targetPopup		: '<спливаюче вікно>',
-		targetFrameName	: 'Ім\'я целевого фрейма',
-		targetPopupName	: 'Ім\'я спливаючого вікна',
-		popupFeatures	: 'Властивості спливаючого вікна',
+		targetPopup		: '<випливаюче вікно>',
+		targetFrameName	: 'Ім\'я цільового фрейму',
+		targetPopupName	: 'Ім\'я випливаючого вікна',
+		popupFeatures	: 'Властивості випливаючого вікна',
 		popupResizable	: 'Масштабоване',
-		popupStatusBar	: 'Строка статусу',
+		popupStatusBar	: 'Рядок статусу',
 		popupLocationBar: 'Панель локації',
 		popupToolbar	: 'Панель інструментів',
 		popupMenuBar	: 'Панель меню',
 		popupFullScreen	: 'Повний екран (IE)',
-		popupScrollBars	: 'Полоси прокрутки',
+		popupScrollBars	: 'Стрічки прокрутки',
 		popupDependent	: 'Залежний (Netscape)',
 		popupWidth		: 'Ширина',
@@ -160,26 +160,26 @@
 		popupHeight		: 'Висота',
 		popupTop		: 'Позиція зверху',
-		id				: 'Ідентифікатор (Id)',
+		id				: 'Ідентифікатор',
 		langDir			: 'Напрямок мови',
-		langDirLTR		: 'Зліва на право (LTR)',
-		langDirRTL		: 'Зправа на ліво (RTL)',
+		langDirLTR		: 'Зліва направо (LTR)',
+		langDirRTL		: 'Справа наліво (RTL)',
 		acccessKey		: 'Гаряча клавіша',
-		name			: 'Им\'я',
-		langCode		: 'Напрямок мови',
+		name			: 'Ім\'я',
+		langCode		: 'Код мови',
 		tabIndex		: 'Послідовність переходу',
 		advisoryTitle	: 'Заголовок',
 		advisoryContentType	: 'Тип вмісту',
 		cssClasses		: 'Клас CSS',
-		charset			: 'Кодировка',
+		charset			: 'Кодування',
 		styles			: 'Стиль CSS',
 		selectAnchor	: 'Оберіть якір',
-		anchorName		: 'За ім\'ям якоря',
-		anchorId		: 'За ідентифікатором елемента',
+		anchorName		: 'За ім\'ям елементу',
+		anchorId		: 'За ідентифікатором елементу',
 		emailAddress	: 'Адреса ел. пошти',
 		emailSubject	: 'Тема листа',
 		emailBody		: 'Тіло повідомлення',
-		noAnchors		: '(Немає якорів доступних в цьому документі)',
-		noUrl			: 'Будь ласка, занесіть URL посилання',
-		noEmail			: 'Будь ласка, занесіть адрес эл. почты'
+		noAnchors		: '(В цьому документі немає якорів)',
+		noUrl			: 'Будь ласка, вкажіть URL посилання',
+		noEmail			: 'Будь ласка, вкажіть адрес ел. пошти'
 	},
 
@@ -191,5 +191,5 @@
 		title		: 'Властивості якоря',
 		name		: 'Ім\'я якоря',
-		errorName	: 'Будь ласка, занесіть ім\'я якоря'
+		errorName	: 'Будь ласка, вкажіть ім\'я якоря'
 	},
 
@@ -197,23 +197,23 @@
 	list:
 	{
-		numberedTitle		: 'Numbered List Properties', // MISSING
-		bulletedTitle		: 'Bulleted List Properties', // MISSING
-		type				: 'Type', // MISSING
-		start				: 'Start', // MISSING
-		validateStartNumber				:'List start number must be a whole number.', // MISSING
-		circle				: 'Circle', // MISSING
-		disc				: 'Disc', // MISSING
-		square				: 'Square', // MISSING
-		none				: 'None', // MISSING
-		notset				: '<not set>', // MISSING
-		armenian			: 'Armenian numbering', // MISSING
-		georgian			: 'Georgian numbering (an, ban, gan, etc.)', // MISSING
-		lowerRoman			: 'Lower Roman (i, ii, iii, iv, v, etc.)', // MISSING
-		upperRoman			: 'Upper Roman (I, II, III, IV, V, etc.)', // MISSING
-		lowerAlpha			: 'Lower Alpha (a, b, c, d, e, etc.)', // MISSING
-		upperAlpha			: 'Upper Alpha (A, B, C, D, E, etc.)', // MISSING
-		lowerGreek			: 'Lower Greek (alpha, beta, gamma, etc.)', // MISSING
-		decimal				: 'Decimal (1, 2, 3, etc.)', // MISSING
-		decimalLeadingZero	: 'Decimal leading zero (01, 02, 03, etc.)' // MISSING
+		numberedTitle		: 'Опції нумерованого списку',
+		bulletedTitle		: 'Опції маркірованого списку',
+		type				: 'Тип',
+		start				: 'Почати з...',
+		validateStartNumber				:'Початковий номер списку повинен бути цілим числом.',
+		circle				: 'Кільце',
+		disc				: 'Кружечок',
+		square				: 'Квадратик',
+		none				: 'Нема',
+		notset				: '<не вказано>',
+		armenian			: 'Вірменська нумерація',
+		georgian			: 'Грузинська нумерація (an, ban, gan і т.д.)',
+		lowerRoman			: 'Малі римські (i, ii, iii, iv, v і т.д.)',
+		upperRoman			: 'Великі римські (I, II, III, IV, V і т.д.)',
+		lowerAlpha			: 'Малі лат. букви (a, b, c, d, e і т.д.)',
+		upperAlpha			: 'Великі лат. букви (A, B, C, D, E і т.д.)',
+		lowerGreek			: 'Малі гр. букви (альфа, бета, гамма і т.д.)',
+		decimal				: 'Десяткові (1, 2, 3 і т.д.)',
+		decimalLeadingZero	: 'Десяткові з нулем (01, 02, 03 і т.д.)'
 	},
 
@@ -226,10 +226,10 @@
 		findWhat			: 'Шукати:',
 		replaceWith			: 'Замінити на:',
-		notFoundMsg			: 'Вказаний текст не знайдений.',
+		notFoundMsg			: 'Вказаний текст не знайдено.',
 		matchCase			: 'Враховувати регістр',
 		matchWord			: 'Збіг цілих слів',
 		matchCyclic			: 'Циклічна заміна',
 		replaceAll			: 'Замінити все',
-		replaceSuccessMsg	: '%1 співпадінь(я) замінено.'
+		replaceSuccessMsg	: '%1 співпадінь(ня) замінено.'
 	},
 
@@ -241,82 +241,82 @@
 		menu		: 'Властивості таблиці',
 		deleteTable	: 'Видалити таблицю',
-		rows		: 'Строки',
-		columns		: 'Колонки',
-		border		: 'Розмір бордюра',
+		rows		: 'Рядки',
+		columns		: 'Стовбці',
+		border		: 'Розмір рамки',
 		align		: 'Вирівнювання',
-		alignLeft	: 'Зліва',
+		alignLeft	: 'По лівому краю',
 		alignCenter	: 'По центру',
-		alignRight	: 'Зправа',
+		alignRight	: 'По правому краю',
 		width		: 'Ширина',
 		widthPx		: 'пікселів',
 		widthPc		: 'відсотків',
-		widthUnit	: 'width unit', // MISSING
+		widthUnit	: 'Одиниці вимір.',
 		height		: 'Висота',
-		cellSpace	: 'Проміжок (spacing)',
-		cellPad		: 'Відступ (padding)',
-		caption		: 'Заголовок',
-		summary		: 'Резюме',
-		headers		: 'Заголовки',
-		headersNone		: 'Жодного',
-		headersColumn	: 'Перша колонка',
-		headersRow		: 'Перший рядок',
-		headersBoth		: 'Обидва',
-		invalidRows		: 'Кількість рядків повинна бути числом більше за 0.',
-		invalidCols		: 'Кількість колонок повинна бути числом більше за  0.',
-		invalidBorder	: 'Розмір бордюра повинен бути числом.',
-		invalidWidth	: 'Ширина таблиці повинна бути числом.',
-		invalidHeight	: 'Висота таблиці повинна бути числом.',
-		invalidCellSpacing	: 'Проміжок (spacing) комірки повинен бути числом.',
-		invalidCellPadding	: 'Відступ (padding) комірки повинен бути числом.',
+		cellSpace	: 'Проміжок',
+		cellPad		: 'Внутр. відступ',
+		caption		: 'Заголовок таблиці',
+		summary		: 'Детальний опис заголовку таблиці',
+		headers		: 'Заголовки стовбців/рядків',
+		headersNone		: 'Без заголовків',
+		headersColumn	: 'Стовбці',
+		headersRow		: 'Рядки',
+		headersBoth		: 'Стовбці і рядки',
+		invalidRows		: 'Кількість рядків повинна бути більшою 0.',
+		invalidCols		: 'Кількість стовбців повинна бути більшою 0.',
+		invalidBorder	: 'Розмір рамки повинен бути цілим числом.',
+		invalidWidth	: 'Ширина таблиці повинна бути цілим числом.',
+		invalidHeight	: 'Висота таблиці повинна бути цілим числом.',
+		invalidCellSpacing	: 'Проміжок між комірками повинен бути цілим числом.',
+		invalidCellPadding	: 'Внутр. відступ комірки повинен бути цілим числом.',
 
 		cell :
 		{
-			menu			: 'Осередок',
-			insertBefore	: 'Вставити комірку до',
+			menu			: 'Комірки',
+			insertBefore	: 'Вставити комірку перед',
 			insertAfter		: 'Вставити комірку після',
 			deleteCell		: 'Видалити комірки',
 			merge			: 'Об\'єднати комірки',
-			mergeRight		: 'Об\'єднати зправа',
-			mergeDown		: 'Об\'єднати до низу',
+			mergeRight		: 'Об\'єднати справа',
+			mergeDown		: 'Об\'єднати донизу',
 			splitHorizontal	: 'Розділити комірку по горизонталі',
 			splitVertical	: 'Розділити комірку по вертикалі',
 			title			: 'Властивості комірки',
 			cellType		: 'Тип комірки',
-			rowSpan			: 'Обєднання рядків (Rows Span)',
-			colSpan			: 'Обєднання стовпчиків (Columns Span)',
-			wordWrap		: 'Авто згортання тексту (Word Wrap)',
-			hAlign			: 'Горизонтальне вирівнювання',
-			vAlign			: 'Вертикальне вирівнювання',
-			alignTop		: 'До верху',
-			alignMiddle		: 'Посередині',
-			alignBottom		: 'До низу',
+			rowSpan			: 'Об\'єднання рядків',
+			colSpan			: 'Об\'єднання стовпців',
+			wordWrap		: 'Автоперенесення тексту',
+			hAlign			: 'Гориз. вирівнювання',
+			vAlign			: 'Верт. вирівнювання',
+			alignTop		: 'По верхньому краю',
+			alignMiddle		: 'По середині',
+			alignBottom		: 'По нижньому краю',
 			alignBaseline	: 'По базовій лінії',
 			bgColor			: 'Колір фону',
-			borderColor		: 'Колір бордюру',
+			borderColor		: 'Колір рамки',
 			data			: 'Дані',
 			header			: 'Заголовок',
 			yes				: 'Так',
 			no				: 'Ні',
-			invalidWidth	: 'Ширина комірки повинна бути числом.',
-			invalidHeight	: 'Висота комірки повинна бути числом.',
-			invalidRowSpan	: 'Кількість обєднуваних рядків повинна бути цілим числом.',
-			invalidColSpan	: 'Кількість обєднуваних стовпчиків повинна бути цілим числом.',
-			chooseColor		: 'Choose' // MISSING
+			invalidWidth	: 'Ширина комірки повинна бути цілим числом.',
+			invalidHeight	: 'Висота комірки повинна бути цілим числом.',
+			invalidRowSpan	: 'Кількість об\'єднуваних рядків повинна бути цілим числом.',
+			invalidColSpan	: 'Кількість об\'єднуваних стовбців повинна бути цілим числом.',
+			chooseColor		: 'Обрати'
 		},
 
 		row :
 		{
-			menu			: 'Рядок',
-			insertBefore	: 'Вставити рядок до',
+			menu			: 'Рядки',
+			insertBefore	: 'Вставити рядок перед',
 			insertAfter		: 'Вставити рядок після',
-			deleteRow		: 'Видалити строки'
+			deleteRow		: 'Видалити рядки'
 		},
 
 		column :
 		{
-			menu			: 'Колонка',
-			insertBefore	: 'Вставити колонку до',
-			insertAfter		: 'Вставити колонку після',
-			deleteColumn	: 'Видалити колонки'
+			menu			: 'Стовбці',
+			insertBefore	: 'Вставити стовбець перед',
+			insertAfter		: 'Вставити стовбець після',
+			deleteColumn	: 'Видалити стовбці'
 		}
 	},
@@ -326,9 +326,9 @@
 	{
 		title		: 'Властивості кнопки',
-		text		: 'Текст (Значення)',
+		text		: 'Значення',
 		type		: 'Тип',
-		typeBtn		: 'Кнопка',
-		typeSbm		: 'Відправити',
-		typeRst		: 'Скинути'
+		typeBtn		: 'Кнопка (button)',
+		typeSbm		: 'Надіслати (submit)',
+		typeRst		: 'Очистити (reset)'
 	},
 
@@ -336,5 +336,5 @@
 	checkboxAndRadio :
 	{
-		checkboxTitle : 'Властивості флагової кнопки',
+		checkboxTitle : 'Властивості галочки',
 		radioTitle	: 'Властивості кнопки вибору',
 		value		: 'Значення',
@@ -359,7 +359,7 @@
 		opAvail		: 'Доступні варіанти',
 		value		: 'Значення',
-		size		: 'Розмір',
-		lines		: 'лінії',
-		chkMulti	: 'Дозволити обрання декількох позицій',
+		size		: 'Кількість',
+		lines		: 'видимих позицій у списку',
+		chkMulti	: 'Список з мультивибором',
 		opText		: 'Текст',
 		opValue		: 'Значення',
@@ -368,5 +368,5 @@
 		btnUp		: 'Вгору',
 		btnDown		: 'Вниз',
-		btnSetValue : 'Встановити як вибране значення',
+		btnSetValue : 'Встановити як обране значення',
 		btnDelete	: 'Видалити'
 	},
@@ -376,6 +376,6 @@
 	{
 		title		: 'Властивості текстової області',
-		cols		: 'Колонки',
-		rows		: 'Строки'
+		cols		: 'Стовбці',
+		rows		: 'Рядки'
 	},
 
@@ -387,5 +387,5 @@
 		value		: 'Значення',
 		charWidth	: 'Ширина',
-		maxChars	: 'Макс. кіл-ть символів',
+		maxChars	: 'Макс. к-ть символів',
 		type		: 'Тип',
 		typeText	: 'Текст',
@@ -407,29 +407,29 @@
 		titleButton	: 'Властивості кнопки із зображенням',
 		menu		: 'Властивості зображення',
-		infoTab		: 'Інформація про изображении',
+		infoTab		: 'Інформація про зображення',
 		btnUpload	: 'Надіслати на сервер',
-		upload		: 'Закачати',
+		upload		: 'Надіслати',
 		alt			: 'Альтернативний текст',
 		width		: 'Ширина',
 		height		: 'Висота',
 		lockRatio	: 'Зберегти пропорції',
-		unlockRatio	: 'Unlock Ratio', // MISSING
-		resetSize	: 'Скинути розмір',
-		border		: 'Бордюр',
-		hSpace		: 'Горизонтальний відступ',
-		vSpace		: 'Вертикальний відступ',
-		align		: 'Вирівнювання',
+		unlockRatio	: 'Не зберігати пропорції',
+		resetSize	: 'Очистити поля розмірів',
+		border		: 'Рамка',
+		hSpace		: 'Гориз. відступ',
+		vSpace		: 'Верт. відступ',
+		align		: 'Вирівн.',
 		alignLeft	: 'По лівому краю',
 		alignRight	: 'По правому краю',
-		alertUrl	: 'Будь ласка, введіть URL зображення',
+		alertUrl	: 'Будь ласка, вкажіть URL зображення',
 		linkTab		: 'Посилання',
-		button2Img	: 'Ви хочете перетворити обрану кнопку-зображення на просте зображення?',
-		img2Button	: 'Ви хочете перетворити обране зображення на кнопку-зображення?',
-		urlMissing	: 'Image source URL is missing.', // MISSING
-		validateWidth	: 'Width must be a whole number.', // MISSING
-		validateHeight	: 'Height must be a whole number.', // MISSING
-		validateBorder	: 'Border must be a whole number.', // MISSING
-		validateHSpace	: 'HSpace must be a whole number.', // MISSING
-		validateVSpace	: 'VSpace must be a whole number.' // MISSING
+		button2Img	: 'Бажаєте перетворити обрану кнопку-зображення на просте зображення?',
+		img2Button	: 'Бажаєте перетворити обране зображення на кнопку-зображення?',
+		urlMissing	: 'Вкажіть URL зображення.',
+		validateWidth	: 'Ширина повинна бути цілим числом.',
+		validateHeight	: 'Висота повинна бути цілим числом.',
+		validateBorder	: 'Ширина рамки повинна бути цілим числом.',
+		validateHSpace	: 'Гориз. відступ повинен бути цілим числом.',
+		validateVSpace	: 'Верт. відступ повинен бути цілим числом.'
 	},
 
@@ -440,12 +440,12 @@
 		propertiesTab	: 'Властивості',
 		title			: 'Властивості Flash',
-		chkPlay			: 'Авто програвання',
-		chkLoop			: 'Зациклити',
+		chkPlay			: 'Автопрогравання',
+		chkLoop			: 'Циклічно',
 		chkMenu			: 'Дозволити меню Flash',
 		chkFull			: 'Дозволити повноекранний перегляд',
  		scale			: 'Масштаб',
-		scaleAll		: 'Показати всі',
+		scaleAll		: 'Показати все',
 		scaleNoBorder	: 'Без рамки',
-		scaleFit		: 'Дійсний розмір',
+		scaleFit		: 'Поч. розмір',
 		access			: 'Доступ до скрипта',
 		accessAlways	: 'Завжди',
@@ -454,34 +454,34 @@
 		align			: 'Вирівнювання',
 		alignLeft		: 'По лівому краю',
-		alignAbsBottom	: 'Абс по низу',
-		alignAbsMiddle	: 'Абс по середині',
+		alignAbsBottom	: 'По нижньому краю (abs)',
+		alignAbsMiddle	: 'По середині (abs)',
 		alignBaseline	: 'По базовій лінії',
-		alignBottom		: 'По низу',
+		alignBottom		: 'По нижньому краю',
 		alignMiddle		: 'По середині',
 		alignRight		: 'По правому краю',
-		alignTextTop	: 'Текст на верху',
-		alignTop		: 'По верху',
+		alignTextTop	: 'Текст по верхньому краю',
+		alignTop		: 'По верхньому краю',
 		quality			: 'Якість',
 		qualityBest		: 'Відмінна',
 		qualityHigh		: 'Висока',
-		qualityAutoHigh	: 'Авто відмінна',
+		qualityAutoHigh	: 'Автом. відмінна',
 		qualityMedium	: 'Середня',
-		qualityAutoLow	: 'Авто низька',
+		qualityAutoLow	: 'Автом. низька',
 		qualityLow		: 'Низька',
 		windowModeWindow: 'Вікно',
-		windowModeOpaque: 'Непрозорість (Opaque)',
-		windowModeTransparent : 'Прозорість (Transparent)',
-		windowMode		: 'Режим вікна',
+		windowModeOpaque: 'Непрозорість',
+		windowModeTransparent : 'Прозорість',
+		windowMode		: 'Віконний режим',
 		flashvars		: 'Змінні Flash',
 		bgcolor			: 'Колір фону',
 		width			: 'Ширина',
 		height			: 'Висота',
-		hSpace			: 'Горизонтальний відступ',
-		vSpace			: 'Вертикальний відступ',
-		validateSrc		: 'Будь ласка, занесіть URL посилання',
-		validateWidth	: 'Ширина повинна бути числом.',
-		validateHeight	: 'Висота повинна бути числом.',
-		validateHSpace	: 'HSpace повинна бути числом.',
-		validateVSpace	: 'VSpace повинна бути числом.'
+		hSpace			: 'Гориз. відступ',
+		vSpace			: 'Верт. відступ',
+		validateSrc		: 'Будь ласка, вкажіть URL посилання',
+		validateWidth	: 'Ширина повинна бути цілим числом.',
+		validateHeight	: 'Висота повинна бути цілим числом.',
+		validateHSpace	: 'Гориз. відступ повинен бути цілим числом.',
+		validateVSpace	: 'Верт. відступ повинен бути цілим числом.'
 	},
 
@@ -493,18 +493,18 @@
 		notAvailable	: 'Вибачте, але сервіс наразі недоступний.',
 		errorLoading	: 'Помилка завантаження : %s.',
-		notInDic		: 'Не має в словнику',
+		notInDic		: 'Немає в словнику',
 		changeTo		: 'Замінити на',
-		btnIgnore		: 'Ігнорувати',
-		btnIgnoreAll	: 'Ігнорувати все',
+		btnIgnore		: 'Пропустити',
+		btnIgnoreAll	: 'Пропустити все',
 		btnReplace		: 'Замінити',
 		btnReplaceAll	: 'Замінити все',
 		btnUndo			: 'Назад',
-		noSuggestions	: '- Немає припущень -',
+		noSuggestions	: '- немає варіантів -',
 		progress		: 'Виконується перевірка орфографії...',
 		noMispell		: 'Перевірку орфографії завершено: помилок не знайдено',
 		noChanges		: 'Перевірку орфографії завершено: жодне слово не змінено',
-		oneChange		: 'Перевірку орфографії завершено: змінено одно слово',
-		manyChanges		: 'Перевірку орфографії завершено: 1% слів змінено',
-		ieSpellDownload	: 'Модуль перевірки орфографії не встановлено. Бажаєтн завантажити його зараз?'
+		oneChange		: 'Перевірку орфографії завершено: змінено одне слово',
+		manyChanges		: 'Перевірку орфографії завершено: 1% слів(ова) змінено',
+		ieSpellDownload	: 'Модуль перевірки орфографії не встановлено. Бажаєте завантажити його зараз?'
 	},
 
@@ -513,15 +513,15 @@
 		toolbar	: 'Смайлик',
 		title	: 'Вставити смайлик',
-		options : 'Smiley Options' // MISSING
+		options : 'Опції смайликів'
 	},
 
 	elementsPath :
 	{
-		eleLabel : 'Elements path', // MISSING
+		eleLabel : 'Шлях',
 		eleTitle : '%1 елемент'
 	},
 
 	numberedlist	: 'Нумерований список',
-	bulletedlist	: 'Маркований список',
+	bulletedlist	: 'Маркірований список',
 	indent			: 'Збільшити відступ',
 	outdent			: 'Зменшити відступ',
@@ -540,17 +540,17 @@
 	{
 		title		: 'Вставити',
-		cutError	: 'Настройки безпеки вашого браузера не дозволяють редактору автоматично виконувати операції вирізування. Будь ласка, використовуйте клавіатуру для цього (Ctrl/Cmd+X).',
-		copyError	: 'Настройки безпеки вашого браузера не дозволяють редактору автоматично виконувати операції копіювання. Будь ласка, використовуйте клавіатуру для цього (Ctrl/Cmd+C).',
-		pasteMsg	: 'Будь ласка, вставте з буфера обміну в цю область, користуючись комбінацією клавіш (<STRONG>Ctrl/Cmd+V</STRONG>) та натисніть <STRONG>OK</STRONG>.',
-		securityMsg	: 'Редактор не може отримати прямий доступ до буферу обміну у зв\'язку з налаштуваннями вашого браузера. Вам потрібно вставити інформацію повторно в це вікно.',
-		pasteArea	: 'Paste Area' // MISSING
+		cutError	: 'Налаштування безпеки Вашого браузера не дозволяють редактору автоматично виконувати операції вирізування. Будь ласка, використовуйте клавіатуру для цього (Ctrl/Cmd+X)',
+		copyError	: 'Налаштування безпеки Вашого браузера не дозволяють редактору автоматично виконувати операції копіювання. Будь ласка, використовуйте клавіатуру для цього (Ctrl/Cmd+C).',
+		pasteMsg	: 'Будь ласка, вставте інформацію з буфера обміну в цю область, користуючись комбінацією клавіш (<STRONG>Ctrl/Cmd+V</STRONG>), та натисніть <STRONG>OK</STRONG>.',
+		securityMsg	: 'Редактор не може отримати прямий доступ до буферу обміну у зв\'язку з налаштуваннями Вашого браузера. Вам потрібно вставити інформацію в це вікно.',
+		pasteArea	: 'Область вставки'
 	},
 
 	pastefromword :
 	{
-		confirmCleanup	: 'Текст, що ви хочете вставити, схожий на копійований з Word. Ви хочете очистити його перед вставкою?',
+		confirmCleanup	: 'Текст, що Ви намагаєтесь вставити, схожий на скопійований з Word. Бажаєте очистити його форматування перед вставлянням?',
 		toolbar			: 'Вставити з Word',
 		title			: 'Вставити з Word',
-		error			: 'It was not possible to clean up the pasted data due to an internal error' // MISSING
+		error			: 'Неможливо очистити форматування через внутрішню помилку.'
 	},
 
@@ -565,8 +565,8 @@
 		button			: 'Шаблони',
 		title			: 'Шаблони змісту',
-		options : 'Template Options', // MISSING
+		options : 'Опції шаблону',
 		insertOption	: 'Замінити поточний вміст',
 		selectPromptMsg	: 'Оберіть, будь ласка, шаблон для відкриття в редакторі<br>(поточний зміст буде втрачено):',
-		emptyListMsg	: '(Не визначено жодного шаблону)'
+		emptyListMsg	: '(Не знайдено жодного шаблону)'
 	},
 
@@ -576,8 +576,8 @@
 	{
 		label		: 'Стиль',
-		panelTitle	: 'Formatting Styles', // MISSING
-		panelTitle1	: 'Block стилі',
-		panelTitle2	: 'Inline стилі',
-		panelTitle3	: 'Object стилі'
+		panelTitle	: 'Стилі форматування',
+		panelTitle1	: 'Блочні стилі',
+		panelTitle2	: 'Рядкові стилі',
+		panelTitle3	: 'Об\'єктні стилі'
 	},
 
@@ -596,22 +596,22 @@
 		tag_h5		: 'Заголовок 5',
 		tag_h6		: 'Заголовок 6',
-		tag_div		: 'Нормальний (DIV)'
+		tag_div		: 'Нормальний (div)'
 	},
 
 	div :
 	{
-		title				: 'Create Div Container', // MISSING
-		toolbar				: 'Create Div Container', // MISSING
-		cssClassInputLabel	: 'Stylesheet Classes', // MISSING
-		styleSelectLabel	: 'Style', // MISSING
-		IdInputLabel		: 'Id', // MISSING
-		languageCodeInputLabel	: ' Language Code', // MISSING
-		inlineStyleInputLabel	: 'Inline Style', // MISSING
-		advisoryTitleInputLabel	: 'Advisory Title', // MISSING
-		langDirLabel		: 'Language Direction', // MISSING
-		langDirLTRLabel		: 'Left to Right (LTR)', // MISSING
-		langDirRTLLabel		: 'Right to Left (RTL)', // MISSING
-		edit				: 'Edit Div', // MISSING
-		remove				: 'Remove Div' // MISSING
+		title				: 'Створити блок-контейнер',
+		toolbar				: 'Створити блок-контейнер',
+		cssClassInputLabel	: 'Клас CSS',
+		styleSelectLabel	: 'Стиль CSS',
+		IdInputLabel		: 'Ідентифікатор',
+		languageCodeInputLabel	: 'Код мови',
+		inlineStyleInputLabel	: 'Вписаний стиль',
+		advisoryTitleInputLabel	: 'Зміст випливаючої підказки',
+		langDirLabel		: 'Напрямок мови',
+		langDirLTRLabel		: 'Зліва направо (LTR)',
+		langDirRTLLabel		: 'Справа наліво (RTL)',
+		edit				: 'Редагувати блок',
+		remove				: 'Видалити блок'
   	},
 
@@ -645,5 +645,5 @@
 	{
 		label		: 'Розмір',
-		voiceLabel	: 'Розмір шрифта',
+		voiceLabel	: 'Розмір шрифту',
 		panelTitle	: 'Розмір'
 	},
@@ -653,6 +653,6 @@
 		textColorTitle	: 'Колір тексту',
 		bgColorTitle	: 'Колір фону',
-		panelTitle		: 'Colors', // MISSING
-		auto			: 'Автоматичний',
+		panelTitle		: 'Кольори',
+		auto			: 'Авто',
 		more			: 'Кольори...'
 	},
@@ -660,44 +660,44 @@
 	colors :
 	{
-		'000' : 'Black', // MISSING
-		'800000' : 'Maroon', // MISSING
-		'8B4513' : 'Saddle Brown', // MISSING
-		'2F4F4F' : 'Dark Slate Gray', // MISSING
-		'008080' : 'Teal', // MISSING
-		'000080' : 'Navy', // MISSING
-		'4B0082' : 'Indigo', // MISSING
-		'696969' : 'Dark Gray', // MISSING
-		'B22222' : 'Fire Brick', // MISSING
-		'A52A2A' : 'Brown', // MISSING
-		'DAA520' : 'Golden Rod', // MISSING
-		'006400' : 'Dark Green', // MISSING
-		'40E0D0' : 'Turquoise', // MISSING
-		'0000CD' : 'Medium Blue', // MISSING
-		'800080' : 'Purple', // MISSING
-		'808080' : 'Gray', // MISSING
-		'F00' : 'Red', // MISSING
-		'FF8C00' : 'Dark Orange', // MISSING
-		'FFD700' : 'Gold', // MISSING
-		'008000' : 'Green', // MISSING
-		'0FF' : 'Cyan', // MISSING
-		'00F' : 'Blue', // MISSING
-		'EE82EE' : 'Violet', // MISSING
-		'A9A9A9' : 'Dim Gray', // MISSING
-		'FFA07A' : 'Light Salmon', // MISSING
-		'FFA500' : 'Orange', // MISSING
-		'FFFF00' : 'Yellow', // MISSING
-		'00FF00' : 'Lime', // MISSING
-		'AFEEEE' : 'Pale Turquoise', // MISSING
-		'ADD8E6' : 'Light Blue', // MISSING
-		'DDA0DD' : 'Plum', // MISSING
-		'D3D3D3' : 'Light Grey', // MISSING
-		'FFF0F5' : 'Lavender Blush', // MISSING
-		'FAEBD7' : 'Antique White', // MISSING
-		'FFFFE0' : 'Light Yellow', // MISSING
-		'F0FFF0' : 'Honeydew', // MISSING
-		'F0FFFF' : 'Azure', // MISSING
-		'F0F8FF' : 'Alice Blue', // MISSING
-		'E6E6FA' : 'Lavender', // MISSING
-		'FFF' : 'White' // MISSING
+		'000' : 'Чорний',
+		'800000' : 'Бордовий',
+		'8B4513' : 'Коричневий',
+		'2F4F4F' : 'Темний сіро-зелений',
+		'008080' : 'Морської хвилі',
+		'000080' : 'Сливовий',
+		'4B0082' : 'Індиго',
+		'696969' : 'Темносірий',
+		'B22222' : 'Темночервоний',
+		'A52A2A' : 'Каштановий',
+		'DAA520' : 'Бежевий',
+		'006400' : 'Темнозелений',
+		'40E0D0' : 'Бірюзовий',
+		'0000CD' : 'Темносиній',
+		'800080' : 'Пурпурний',
+		'808080' : 'Сірий',
+		'F00' : 'Червоний',
+		'FF8C00' : 'Темнооранжевий',
+		'FFD700' : 'Жовтий',
+		'008000' : 'Зелений',
+		'0FF' : 'Синьо-зелений',
+		'00F' : 'Синій',
+		'EE82EE' : 'Фіолетовий',
+		'A9A9A9' : 'Світлосірий',
+		'FFA07A' : 'Рожевий',
+		'FFA500' : 'Оранжевий',
+		'FFFF00' : 'Яскравожовтий',
+		'00FF00' : 'Салатовий',
+		'AFEEEE' : 'Світлобірюзовий',
+		'ADD8E6' : 'Блакитний',
+		'DDA0DD' : 'Світлофіолетовий',
+		'D3D3D3' : 'Сріблястий',
+		'FFF0F5' : 'Світлорожевий',
+		'FAEBD7' : 'Світлооранжевий',
+		'FFFFE0' : 'Світложовтий',
+		'F0FFF0' : 'Світлозелений',
+		'F0FFFF' : 'Світлий синьо-зелений',
+		'F0F8FF' : 'Світлоблакитний',
+		'E6E6FA' : 'Лавандовий',
+		'FFF' : 'Білий'
 	},
 
@@ -705,34 +705,34 @@
 	{
 		title			: 'Перефірка орфографії по мірі набору',
-		opera_title		: 'Not supported by Opera', // MISSING
-		enable			: 'Включити SCAYT',
-		disable			: 'Відключити SCAYT',
+		opera_title		: 'Не підтримується в Opera',
+		enable			: 'Ввімкнути SCAYT',
+		disable			: 'Вимкнути SCAYT',
 		about			: 'Про SCAYT',
 		toggle			: 'Перемкнути SCAYT',
 		options			: 'Опції',
 		langs			: 'Мови',
-		moreSuggestions	: 'Більше пропозицій',
-		ignore			: 'Ігнорувати',
-		ignoreAll		: 'Ігнорувати всі',
+		moreSuggestions	: 'Більше варіантів',
+		ignore			: 'Пропустити',
+		ignoreAll		: 'Пропустити всі',
 		addWord			: 'Додати слово',
-		emptyDic		: 'Назва словника повинна бути заповнена.',
+		emptyDic		: 'Назва словника повинна бути вказана.',
 
 		optionsTab		: 'Опції',
-		allCaps			: 'Ignore All-Caps Words', // MISSING
-		ignoreDomainNames : 'Ignore Domain Names', // MISSING
-		mixedCase		: 'Ignore Words with Mixed Case', // MISSING
-		mixedWithDigits	: 'Ignore Words with Numbers', // MISSING
+		allCaps			: 'Пропустити прописні слова',
+		ignoreDomainNames : 'Пропустити доменні назви',
+		mixedCase		: 'Пропустити слова зі змішаним регістром',
+		mixedWithDigits	: 'Пропустити слова, що містять цифри',
 
 		languagesTab	: 'Мови',
 
 		dictionariesTab	: 'Словники',
-		dic_field_name	: 'Dictionary name', // MISSING
-		dic_create		: 'Create', // MISSING
-		dic_restore		: 'Restore', // MISSING
-		dic_delete		: 'Delete', // MISSING
-		dic_rename		: 'Rename', // MISSING
-		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type it\'s name and click the Restore button.', // MISSING
-
-		aboutTab		: 'Про'
+		dic_field_name	: 'Назва словника',
+		dic_create		: 'Створити',
+		dic_restore		: 'Відновити',
+		dic_delete		: 'Видалити',
+		dic_rename		: 'Перейменувати',
+		dic_info		: 'Як правило, користувацькі словники зберігаються у cookie-файлах. Однак, cookie-файли мають обмеження на розмір. Якщо користувацький словник зростає в обсязі настільки, що вже не може бути збережений у cookie-файлі, тоді його можна зберегти на нашому сервері. Щоб зберегти Ваш персональний словник на нашому сервері необхідно вказати назву словника. Якщо Ви вже зберігали словник на сервері, будь ласка, вкажіть назву збереженого словника і натисніть кнопку Відновити.',
+
+		aboutTab		: 'Про SCAYT'
 	},
 
@@ -741,37 +741,37 @@
 		title		: 'Про CKEditor',
 		dlgTitle	: 'Про CKEditor',
-		moreInfo	: 'Щодо інформації з ліцензування завітайте до нашого сайту:',
+		moreInfo	: 'Щодо інформації з ліцензування завітайте на наш сайт:',
 		copy		: 'Copyright &copy; $1. Всі права застережено.'
 	},
 
 	maximize : 'Максимізувати',
-	minimize : 'Minimize', // MISSING
+	minimize : 'Мінімізувати',
 
 	fakeobjects :
 	{
 		anchor	: 'Якір',
-		flash	: 'Flash анімація',
+		flash	: 'Flash-анімація',
 		div		: 'Розрив сторінки',
-		unknown	: 'Невідомий об`єкт'
-	},
-
-	resize : 'Пересувайте для зміни розміру',
+		unknown	: 'Невідомий об\'єкт'
+	},
+
+	resize : 'Потягніть для зміни розмірів',
 
 	colordialog :
 	{
-		title		: 'Select color', // MISSING
-		options	:	'Color Options', // MISSING
-		highlight	: 'Highlight', // MISSING
-		selected	: 'Selected Color', // MISSING
-		clear		: 'Clear' // MISSING
-	},
-
-	toolbarCollapse	: 'Collapse Toolbar', // MISSING
-	toolbarExpand	: 'Expand Toolbar', // MISSING
+		title		: 'Обрати колір',
+		options	:	'Опції кольорів',
+		highlight	: 'Колір, на який вказує курсор',
+		selected	: 'Обраний колір',
+		clear		: 'Очистити'
+	},
+
+	toolbarCollapse	: 'Згорнути панель інструментів',
+	toolbarExpand	: 'Розгорнути панель інструментів',
 
 	bidi :
 	{
-		ltr : 'Text direction from left to right', // MISSING
-		rtl : 'Text direction from right to left' // MISSING
+		ltr : 'Напрямок тексту зліва направо',
+		rtl : 'Напрямок тексту справа наліво'
 	}
 };
Index: CKEditor/branches/versions/3.5.x/_source/lang/vi.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/vi.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/vi.js	(revision 6050)
@@ -732,5 +732,5 @@
 		dic_delete		: 'Xóa',
 		dic_rename		: 'Thay tên',
-		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type it\'s name and click the Restore button.', // MISSING
+		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.', // MISSING
 
 		aboutTab		: 'Thông tin'
Index: CKEditor/branches/versions/3.5.x/_source/lang/zh-cn.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/zh-cn.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/zh-cn.js	(revision 6050)
@@ -99,5 +99,5 @@
 		validateNumberFailed : '需要输入数字格式',
 		confirmNewPage	: '当前文档内容未保存,是否确认新建文档？',
-		confirmCancel	: '部分选项尚未保存，是否确认关闭对话框？',
+		confirmCancel	: '部分修改尚未保存，是否确认关闭对话框？',
 		options			: '选项',
 		target			: '目标窗口',
@@ -106,8 +106,8 @@
 		targetSelf		: '本窗口 (_self)',
 		targetParent	: '父窗口 (_parent)',
-		langDirLTR		: 'Left to Right (LTR)', // MISSING
-		langDirRTL		: 'Right to Left (RTL)', // MISSING
-		styles			: 'Style', // MISSING
-		cssClasses		: 'Stylesheet Classes', // MISSING
+		langDirLTR		: '从左到右 (LTR)',
+		langDirRTL		: '从右到左 (RTL)',
+		styles			: '样式',
+		cssClasses		: '样式类',
 
 		// Put the voice-only part of the label in the span.
@@ -201,5 +201,5 @@
 		type				: '标记类型',
 		start				: '开始序号',
-		validateStartNumber				:'List start number must be a whole number.', // MISSING
+		validateStartNumber				:'列表开始序号必须为整数格式',
 		circle				: '空心圆',
 		disc				: '实心圆',
@@ -288,8 +288,8 @@
 			hAlign			: '水平对齐',
 			vAlign			: '垂直对齐',
-			alignTop		: '顶端对齐',
-			alignMiddle		: '中间对齐',
-			alignBottom		: '底部对齐',
-			alignBaseline	: '基线对齐',
+			alignTop		: '顶端',
+			alignMiddle		: '中间',
+			alignBottom		: '底部',
+			alignBaseline	: '基线',
 			bgColor			: '背景颜色',
 			borderColor		: '边框颜色',
@@ -732,5 +732,5 @@
 		dic_delete		: '删除',
 		dic_rename		: '重命名',
-		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type it\'s name and click the Restore button.', // MISSING
+		dic_info		: '一开始用户词典储存在 Cookie 中, 但是 Cookies 的容量是有限的, 当用户词典增长到超出 Cookie 限制时就无法再储存了, 这时您可以将词典储存到我们的服务器上. 要把您的个人词典到储存到我们的服务器上的话, 需要为您的词典指定一个名称, 如果您在我们的服务器上已经有储存有一个词典, 请输入词典名称并按还原按钮.',
 
 		aboutTab		: '关于'
@@ -742,5 +742,5 @@
 		dlgTitle	: '关于CKEditor',
 		moreInfo	: '访问我们的网站以获取更多关于协议的信息',
-		copy		: '版权所有 &copy; $1.'
+		copy		: 'Copyright &copy; $1. All rights reserved.'
 	},
 
@@ -751,7 +751,7 @@
 	{
 		anchor	: '锚点',
-		flash	: 'Flash',
+		flash	: 'Flash 动画',
 		div		: '分页',
-		unknown	: '位置对象'
+		unknown	: '未知对象'
 	},
 
@@ -772,6 +772,6 @@
 	bidi :
 	{
-		ltr : 'Text direction from left to right', // MISSING
-		rtl : 'Text direction from right to left' // MISSING
+		ltr : '文字方向为从左至右',
+		rtl : '文字方向为从右至左'
 	}
 };
Index: CKEditor/branches/versions/3.5.x/_source/lang/zh.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/zh.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/lang/zh.js	(revision 6050)
@@ -732,5 +732,5 @@
 		dic_delete		: 'Delete', // MISSING
 		dic_rename		: 'Rename', // MISSING
-		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type it\'s name and click the Restore button.', // MISSING
+		dic_info		: 'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.', // MISSING
 
 		aboutTab		: '關於'
Index: CKEditor/branches/versions/3.5.x/_source/plugins/a11yhelp/dialogs/a11yhelp.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/a11yhelp/dialogs/a11yhelp.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/a11yhelp/dialogs/a11yhelp.js	(revision 6050)
@@ -7,5 +7,5 @@
 {
 	var lang = editor.lang.accessibilityHelp,
-		id = CKEDITOR.tools.getNextNumber();
+		id = CKEDITOR.tools.getNextId();
 
 	// CharCode <-> KeyChar.
@@ -126,6 +126,6 @@
 	function buildHelpContents()
 	{
-		var pageTpl = '<div class="cke_accessibility_legend" role="document" aria-labelledby="cke_' + id + '_arialbl" tabIndex="-1">%1</div>' +
-				'<span id="cke_' + id + '_arialbl" class="cke_voice_label">' + lang.contents + ' </span>',
+		var pageTpl = '<div class="cke_accessibility_legend" role="document" aria-labelledby="' + id + '_arialbl" tabIndex="-1">%1</div>' +
+				'<span id="' + id + '_arialbl" class="cke_voice_label">' + lang.contents + ' </span>',
 			sectionTpl = '<h1>%1</h1><dl>%2</dl>',
 			itemTpl = '<dt>%1</dt><dd>%2</dd>';
Index: CKEditor/branches/versions/3.5.x/_source/plugins/autogrow/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/autogrow/plugin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/autogrow/plugin.js	(revision 6050)
@@ -15,6 +15,8 @@
 
 		// We can not use documentElement to calculate the height for IE (#6061).
-		if ( CKEDITOR.env.ie )
-			newHeight = doc.getBody().$.scrollHeight + 24;
+		// It is not good for IE Quirks, yet using offsetHeight would also not work as expected (#6408).
+		// We do the same for FF because of the html height workaround (#6341).
+		if ( CKEDITOR.env.ie || CKEDITOR.env.gecko )
+			newHeight = doc.getBody().$.scrollHeight + ( CKEDITOR.env.ie && CKEDITOR.env.quirks ? 0 : 24 );
 		else
 			newHeight = doc.getDocumentElement().$.offsetHeight;
@@ -42,7 +44,12 @@
 				editor.on( eventName, function( evt )
 				{
+					var maximize = editor.getCommand( 'maximize' );
 					// Some time is required for insertHtml, and it gives other events better performance as well.
-					if ( evt.editor.mode == 'wysiwyg' )
+					if ( evt.editor.mode == 'wysiwyg' &&
+						// Disable autogrow when the editor is maximized .(#6339)
+						( !maximize || maximize.state != CKEDITOR.TRISTATE_ON ) )
+					{
 						setTimeout( function(){ resizeEditor( evt.editor ); }, 100 );
+					}
 				});
 			}
Index: CKEditor/branches/versions/3.5.x/_source/plugins/basicstyles/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/basicstyles/plugin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/basicstyles/plugin.js	(revision 6050)
@@ -30,13 +30,13 @@
 		};
 
-		var config = editor.config;
-		var lang = editor.lang;
+		var config = editor.config,
+			lang = editor.lang;
 
-		addButtonCommand( 'Bold'		, lang.bold			, 'bold'		, config.coreStyles_bold );
+		addButtonCommand( 'Bold'		, lang.bold		, 'bold'		, config.coreStyles_bold );
 		addButtonCommand( 'Italic'		, lang.italic		, 'italic'		, config.coreStyles_italic );
-		addButtonCommand( 'Underline'	, lang.underline	, 'underline'	, config.coreStyles_underline );
+		addButtonCommand( 'Underline'	, lang.underline		, 'underline'	, config.coreStyles_underline );
 		addButtonCommand( 'Strike'		, lang.strike		, 'strike'		, config.coreStyles_strike );
-		addButtonCommand( 'Subscript'	, lang.subscript	, 'subscript'	, config.coreStyles_subscript );
-		addButtonCommand( 'Superscript'	, lang.superscript	, 'superscript'	, config.coreStyles_superscript );
+		addButtonCommand( 'Subscript'	, lang.subscript		, 'subscript'	, config.coreStyles_subscript );
+		addButtonCommand( 'Superscript'	, lang.superscript		, 'superscript'	, config.coreStyles_superscript );
 	}
 });
Index: CKEditor/branches/versions/3.5.x/_source/plugins/bidi/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/bidi/plugin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/bidi/plugin.js	(revision 6050)
@@ -6,9 +6,18 @@
 (function()
 {
-	var guardElements = { table:1, ul:1, ol:1, blockquote:1, div:1 };
-	var directSelectionGuardElements = {};
+	var guardElements = { table:1, tbody: 1, ul:1, ol:1, blockquote:1, div:1, tr: 1 },
+		directSelectionGuardElements = {},
+		// All guard elements which can have a direction applied on them.
+		allGuardElements = {};
 	CKEDITOR.tools.extend( directSelectionGuardElements, guardElements, { tr:1, p:1, div:1, li:1 } );
-
-	function onSelectionChange( evt )
+	CKEDITOR.tools.extend( allGuardElements, directSelectionGuardElements, { td:1 } );
+
+	function onSelectionChange( e )
+	{
+		setToolbarStates( e );
+		handleMixedDirContent( e );
+	}
+
+	function setToolbarStates( evt )
 	{
 		var editor = evt.editor,
@@ -19,22 +28,12 @@
 		useComputedState = useComputedState === undefined || useComputedState;
 
-		if ( useComputedState )
-		{
-			var selection = editor.getSelection(),
-				ranges = selection.getRanges();
-
-			selectedElement = ranges && ranges[ 0 ].getEnclosedNode();
-
-			// If this is not our element of interest, apply to fully selected elements from guardElements.
-			if ( !selectedElement || selectedElement
-					&& !( selectedElement.type == CKEDITOR.NODE_ELEMENT && selectedElement.getName() in directSelectionGuardElements )
-				)
-				selectedElement = getFullySelected( selection, guardElements );
-		}
+		// We can use computedState provided by the browser or traverse parents manually.
+		if ( !useComputedState )
+			selectedElement = getElementForDirection( path.lastElement );
 
 		selectedElement = selectedElement || path.block || path.blockLimit;
 
 		if ( !selectedElement || selectedElement.getName() == 'body' )
-			return CKEDITOR.TRISTATE_OFF;
+			return;
 
 		var selectionDir = useComputedState ?
@@ -44,8 +43,13 @@
 		editor.getCommand( 'bidirtl' ).setState( selectionDir == 'rtl' ? CKEDITOR.TRISTATE_ON : CKEDITOR.TRISTATE_OFF );
 		editor.getCommand( 'bidiltr' ).setState( selectionDir == 'ltr' ? CKEDITOR.TRISTATE_ON : CKEDITOR.TRISTATE_OFF );
-
-		var chromeRoot = editor.container.getChild( 1 );
-
-		if ( selectionDir != editor.lang.dir )
+	}
+
+	function handleMixedDirContent( evt )
+	{
+		var editor = evt.editor,
+			chromeRoot = editor.container.getChild( 1 ),
+			directionNode = getElementForDirection( evt.data.path.lastElement );
+
+		if ( directionNode && editor.lang.dir != directionNode.getComputedStyle( 'direction' ) )
 			chromeRoot.addClass( 'cke_mixed_dir_content' );
 		else
@@ -53,14 +57,65 @@
 	}
 
-	function switchDir( element, dir, editor )
-	{
-		var dirBefore = element.getComputedStyle( 'direction' ),
-			currentDir = element.getStyle( 'direction' ) || element.getAttribute( 'dir' ) || '';
-
+	/**
+	 * Returns element with possibility of applying the direction.
+	 * @param node
+	 */
+	function getElementForDirection( node )
+	{
+		while ( node && !( node.getName() in allGuardElements || node.is( 'body' ) ) )
+		{
+			var parent = node.getParent();
+			if ( !parent )
+				break;
+
+			node = parent;
+		}
+
+		return node;
+	}
+
+	function switchDir( element, dir, editor, database )
+	{
+		// Mark this element as processed by switchDir.
+		CKEDITOR.dom.element.setMarker( database, element, 'bidi_processed', 1 );
+
+		// Check whether one of the ancestors has already been styled.
+		var parent = element;
+		while ( ( parent = parent.getParent() ) && !parent.is( 'body' ) )
+		{
+			if ( parent.getCustomData( 'bidi_processed' ) )
+			{
+				// Ancestor style must dominate.
+				element.removeStyle( 'direction' );
+				element.removeAttribute( 'dir' );
+				return null;
+			}
+		}
+
+		var useComputedState = ( 'useComputedState' in editor.config ) ? editor.config.useComputedState : 1;
+
+		var elementDir = useComputedState ? element.getComputedStyle( 'direction' )
+			: element.getStyle( 'direction' ) || element.hasAttribute( 'dir' );
+
+		// Stop if direction is same as present.
+		if ( elementDir == dir )
+			return null;
+
+		// Reuse computedState if we already have it.
+		var dirBefore = useComputedState ? elementDir : element.getComputedStyle( 'direction' );
+
+		// Clear direction on this element.
 		element.removeStyle( 'direction' );
 
-		if ( currentDir.toLowerCase() == dir )
+		// Do the second check when computed state is ON, to check
+		// if we need to apply explicit direction on this element.
+		if ( useComputedState )
+		{
 			element.removeAttribute( 'dir' );
+			if ( dir != element.getComputedStyle( 'direction' ) )
+				element.setAttribute( 'dir', dir );
+		}
 		else
+			// Set new direction for this element.
 			element.setAttribute( 'dir', dir );
 
@@ -68,51 +123,33 @@
 		// the element and all its children, so it will get really reflected
 		// like a mirror. (#5910)
-		var dirAfter = element.getComputedStyle( 'direction' );
-		if ( dirAfter != dirBefore )
-		{
-			var range = new CKEDITOR.dom.range( element.getDocument() );
-			range.setStartBefore( element );
-			range.setEndAfter( element );
-
-			var walker = new CKEDITOR.dom.walker( range );
-
-			var node;
-			while ( ( node = walker.next() ) )
-			{
-				if ( node.type == CKEDITOR.NODE_ELEMENT )
-				{
-					// A child with dir defined is to be ignored.
-					if ( !node.equals( element ) && node.hasAttribute( 'dir' ) )
-					{
-						range.setStartAfter( node );
-						walker = new CKEDITOR.dom.walker( range );
-						continue;
-					}
-
-					// Switch the margins.
-					var marginLeft = node.getStyle( 'margin-right' ),
-						marginRight = node.getStyle( 'margin-left' );
-
-					marginLeft ? node.setStyle( 'margin-left', marginLeft ) : node.removeStyle( 'margin-left' );
-					marginRight ? node.setStyle( 'margin-right', marginRight ) : node.removeStyle( 'margin-right' );
-				}
-			}
-		}
+		if ( dir != dirBefore )
+			editor.fire( 'dirChanged', element );
 
 		editor.forceNextSelectionCheck();
-	}
-
-	function getFullySelected( selection, elements )
-	{
-		var selectedElement = selection.getCommonAncestor();
-		while( selectedElement.type == CKEDITOR.NODE_ELEMENT
-				&& !( selectedElement.getName() in elements )
-				&& selectedElement.getParent().getChildCount() == 1
-			)
-			selectedElement = selectedElement.getParent();
-
-		return selectedElement.type == CKEDITOR.NODE_ELEMENT
-			&& ( selectedElement.getName() in elements )
-			&& selectedElement;
+
+		return null;
+	}
+
+	function getFullySelected( range, elements )
+	{
+		var ancestor = range.getCommonAncestor( false, true );
+
+		range.enlarge( CKEDITOR.ENLARGE_BLOCK_CONTENTS );
+
+		if ( range.checkBoundaryOfElement( ancestor, CKEDITOR.START )
+				&& range.checkBoundaryOfElement( ancestor, CKEDITOR.END ) )
+		{
+			var parent;
+			while ( ancestor && ancestor.type == CKEDITOR.NODE_ELEMENT
+					&& ( parent = ancestor.getParent() )
+					&& parent.getChildCount() == 1
+					&& ( !( ancestor.getName() in elements ) || ( parent.getName() in elements ) )
+					)
+				ancestor = parent;
+
+			return ancestor.type == CKEDITOR.NODE_ELEMENT
+					&& ( ancestor.getName() in elements )
+					&& ancestor;
+		}
 	}
 
@@ -127,88 +164,63 @@
 			if ( ranges && ranges.length )
 			{
-				// Apply do directly selected elements from guardElements.
-				var selectedElement = ranges[ 0 ].getEnclosedNode();
-
-				// If this is not our element of interest, apply to fully selected elements from guardElements.
-				if ( !selectedElement || selectedElement
-						&& !( selectedElement.type == CKEDITOR.NODE_ELEMENT && selectedElement.getName() in directSelectionGuardElements )
-					)
-					selectedElement = getFullySelected( selection, guardElements );
-
-				if ( selectedElement )
+				var database = {};
+
+				// Creates bookmarks for selection, as we may split some blocks.
+				var bookmarks = selection.createBookmarks();
+
+				var rangeIterator = ranges.createIterator(),
+					range,
+					i = 0;
+
+				while ( ( range = rangeIterator.getNextRange( 1 ) ) )
 				{
-					if ( !selectedElement.isReadOnly() )
-						switchDir( selectedElement, dir, editor );
-				}
-				else
-				{
-					// Creates bookmarks for selection, as we may split some blocks.
-					var bookmarks = selection.createBookmarks();
+					// Apply do directly selected elements from guardElements.
+					var selectedElement = range.getEnclosedNode();
+
+					// If this is not our element of interest, apply to fully selected elements from guardElements.
+					if ( !selectedElement || selectedElement
+							&& !( selectedElement.type == CKEDITOR.NODE_ELEMENT && selectedElement.getName() in directSelectionGuardElements )
+						)
+						selectedElement = getFullySelected( range, guardElements );
+
+					if ( selectedElement && !selectedElement.isReadOnly() )
+						switchDir( selectedElement, dir, editor, database );
 
 					var iterator,
 						block;
 
-					for ( var i = ranges.length - 1 ; i >= 0 ; i-- )
+					// Walker searching for guardElements.
+					var walker = new CKEDITOR.dom.walker( range );
+
+					var start = bookmarks[ i ].startNode,
+						end = bookmarks[ i++ ].endNode;
+
+					walker.evaluator = function( node )
 					{
-						// Array of elements processed as guardElements.
-						var processedElements = [];
-						// Walker searching for guardElements.
-						var walker = new CKEDITOR.dom.walker( ranges[ i ] );
-						walker.evaluator = function( node ){
-							return node.type == CKEDITOR.NODE_ELEMENT
+						return !! ( node.type == CKEDITOR.NODE_ELEMENT
 								&& node.getName() in guardElements
 								&& !( node.getName() == ( enterMode == CKEDITOR.ENTER_P ) ? 'p' : 'div'
 									&& node.getParent().type == CKEDITOR.NODE_ELEMENT
-									&& node.getParent().getName() == 'blockquote'
-								);
-						};
-
-						while ( ( block = walker.next() ) )
-						{
-							switchDir( block, dir, editor );
-							processedElements.push( block );
-						}
-
-						iterator = ranges[ i ].createIterator();
-						iterator.enlargeBr = enterMode != CKEDITOR.ENTER_BR;
-
-						while ( ( block = iterator.getNextParagraph( enterMode == CKEDITOR.ENTER_P ? 'p' : 'div' ) ) )
-						{
-							if ( block.isReadOnly() )
-								continue;
-
-							var _break = 0;
-
-							// Check if block have been already processed by the walker above.
-							for ( var ii = 0; ii < processedElements.length; ii++ )
-							{
-								var parent = block.getParent();
-
-								while( parent && parent.getName() != 'body' )
-								{
-									if ( ( parent.$.isSameNode && parent.$.isSameNode( processedElements[ ii ].$ ) )
-											|| parent.$ == processedElements[ ii ].$ )
-									{
-										_break = 1;
-										break;
-									}
-									parent = parent.getParent();
-								}
-
-								if ( _break )
-									break;
-							}
-
-							if ( !_break )
-							{
-								switchDir( block, dir, editor );
-							}
-						}
-					}
-
-					editor.forceNextSelectionCheck();
-					// Restore selection position.
-					selection.selectBookmarks( bookmarks );
+									&& node.getParent().getName() == 'blockquote' )
+								// Element must be fully included in the range as well. (#6485).
+								&& node.getPosition( start ) & CKEDITOR.POSITION_FOLLOWING
+								&& ( ( node.getPosition( end ) & CKEDITOR.POSITION_PRECEDING + CKEDITOR.POSITION_CONTAINS ) == CKEDITOR.POSITION_PRECEDING ) );
+					};
+
+					while ( ( block = walker.next() ) )
+						switchDir( block, dir, editor, database );
+
+					iterator = range.createIterator();
+					iterator.enlargeBr = enterMode != CKEDITOR.ENTER_BR;
+
+					while ( ( block = iterator.getNextParagraph( enterMode == CKEDITOR.ENTER_P ? 'p' : 'div' ) ) )
+						!block.isReadOnly() && switchDir( block, dir, editor, database );
 				}
+
+				CKEDITOR.dom.element.clearAllMarkers( database );
+
+				editor.forceNextSelectionCheck();
+				// Restore selection position.
+				selection.selectBookmarks( bookmarks );
 
 				editor.focus();
Index: CKEditor/branches/versions/3.5.x/_source/plugins/button/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/button/plugin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/button/plugin.js	(revision 6050)
@@ -71,5 +71,5 @@
 	{
 		var env = CKEDITOR.env,
-			id = this._.id = 'cke_' + CKEDITOR.tools.getNextNumber(),
+			id = this._.id = CKEDITOR.tools.getNextId(),
 			classes = '',
 			command = this.command, // Get the command name.
Index: CKEditor/branches/versions/3.5.x/_source/plugins/clipboard/dialogs/paste.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/clipboard/dialogs/paste.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/clipboard/dialogs/paste.js	(revision 6050)
@@ -11,8 +11,8 @@
 	function onPasteFrameLoad( win )
 	{
-		var doc =  new CKEDITOR.dom.document( win.document ),
+		var doc = new CKEDITOR.dom.document( win.document ),
 			docElement = doc.$;
 
-		doc.getById( "cke_actscrpt" ).remove();
+		doc.getById( 'cke_actscrpt' ).remove();
 
 		CKEDITOR.env.ie ?
Index: CKEditor/branches/versions/3.5.x/_source/plugins/clipboard/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/clipboard/plugin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/clipboard/plugin.js	(revision 6050)
@@ -17,8 +17,8 @@
 			body = doc.getBody();
 
-		var	enabled = false;
+		var enabled = 0;
 		var onExec = function()
 		{
-			enabled = true;
+			enabled = 1;
 		};
 
@@ -164,14 +164,14 @@
 		var doc = this.document;
 
-		// Avoid recursions on 'paste' event for IE.
-		if ( CKEDITOR.env.ie && doc.getById( 'cke_pastebin' ) )
+		// Avoid recursions on 'paste' event or consequent paste too fast. (#5730)
+		if ( doc.getById( 'cke_pastebin' ) )
 			return;
 
 		// If the browser supports it, get the data directly
-		if (mode == 'text' && evt.data && evt.data.$.clipboardData)
+		if ( mode == 'text' && evt.data && evt.data.$.clipboardData )
 		{
 			// evt.data.$.clipboardData.types contains all the flavours in Mac's Safari, but not on windows.
 			var plain = evt.data.$.clipboardData.getData( 'text/plain' );
-			if (plain)
+			if ( plain )
 			{
 				evt.data.preventDefault();
@@ -255,5 +255,5 @@
 	function fixCut( editor )
 	{
-		if ( !CKEDITOR.env.ie || editor.document.$.compatMode == 'BackCompat' )
+		if ( !CKEDITOR.env.ie || CKEDITOR.env.quirks )
 			return;
 
@@ -349,5 +349,5 @@
 				{
 					var body = editor.document.getBody();
-					body.on( ( (mode == 'text' && CKEDITOR.env.ie) || CKEDITOR.env.webkit ) ? 'paste' : 'beforepaste',
+					body.on( ( (mode == 'text' && CKEDITOR.env.ie ) || CKEDITOR.env.webkit ) ? 'paste' : 'beforepaste',
 						function( evt )
 						{
Index: CKEditor/branches/versions/3.5.x/_source/plugins/colorbutton/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/colorbutton/plugin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/colorbutton/plugin.js	(revision 6050)
@@ -188,5 +188,5 @@
 
 			// Render the "More Colors" button.
-			if ( config.colorButton_enableMore )
+			if ( config.colorButton_enableMore === undefined || config.colorButton_enableMore )
 			{
 				output.push(
@@ -201,5 +201,5 @@
 								lang.more,
 							'</a>' +
-						'</td>' );	// It is later in the code.
+						'</td>' );	// tr is later in the code.
 			}
 
@@ -213,10 +213,9 @@
 /**
  * Whether to enable the "More Colors..." button in the color selectors.
- * @default false
+ * @default true
  * @type Boolean
  * @example
  * config.colorButton_enableMore = false;
  */
-CKEDITOR.config.colorButton_enableMore = true;
 
 /**
Index: CKEditor/branches/versions/3.5.x/_source/plugins/colordialog/dialogs/colordialog.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/colordialog/dialogs/colordialog.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/colordialog/dialogs/colordialog.js	(revision 6050)
@@ -15,11 +15,9 @@
 		var dialog;
 
-		function spacer()
-		{
-			return {
-				type : 'html',
-				html : '&nbsp;'
-			};
-		}
+		var spacer =
+		{
+			type : 'html',
+			html : '&nbsp;'
+		};
 
 		function clearSelected()
@@ -31,9 +29,9 @@
 		function updateSelected( evt )
 		{
-			if ( ! (evt instanceof CKEDITOR.dom.event ) )
+			if ( ! ( evt instanceof CKEDITOR.dom.event ) )
 				evt = new CKEDITOR.dom.event( evt );
 
 			var target = evt.getTarget(),
-					color;
+				color;
 
 			if ( target.getName() == 'a' && ( color = target.getChild( 0 ).getHtml() ) )
@@ -43,5 +41,5 @@
 		function updateHighlight( event )
 		{
-			if ( ! (event instanceof CKEDITOR.dom.event ) )
+			if ( ! ( event instanceof CKEDITOR.dom.event ) )
 				event = event.data;
 
@@ -62,11 +60,9 @@
 		}
 
-		var onMouseout = $tools.addFunction( clearHighlight );
-
-		var onClick = updateSelected,
-				onClickHandler = CKEDITOR.tools.addFunction( onClick );
-
-		var onFocus = updateHighlight,
-				onBlur = clearHighlight;
+		var onMouseout = $tools.addFunction( clearHighlight ),
+			onClick = updateSelected,
+			onClickHandler = CKEDITOR.tools.addFunction( onClick ),
+			onFocus = updateHighlight,
+			onBlur = clearHighlight;
 
 		var onKeydownHandler = CKEDITOR.tools.addFunction( function( ev )
@@ -75,6 +71,6 @@
 			var element = ev.getTarget();
 			var relative, nodeToMove;
-			var keystroke = ev.getKeystroke();
-			var rtl = editor.lang.dir == 'rtl';
+			var keystroke = ev.getKeystroke(),
+				rtl = editor.lang.dir == 'rtl';
 
 			switch ( keystroke )
@@ -178,5 +174,5 @@
 		{
 			// Create the base colors array.
-			var aColors = ['00','33','66','99','cc','ff'];
+			var aColors = [ '00', '33', '66', '99', 'cc', 'ff' ];
 
 			// This function combines two ranges of three values from the color array into a row.
@@ -185,5 +181,5 @@
 				for ( var i = rangeA ; i < rangeA + 3 ; i++ )
 				{
-					var row = table.$.insertRow(-1);
+					var row = table.$.insertRow( -1 );
 
 					for ( var j = rangeB ; j < rangeB + 3 ; j++ )
@@ -288,5 +284,5 @@
 									}
 								},
-								spacer(),
+								spacer,
 								{
 									type : 'vbox',
@@ -321,5 +317,5 @@
 											}
 										},
-										spacer(),
+										spacer,
 										{
 											type : 'button',
Index: CKEditor/branches/versions/3.5.x/_source/plugins/contextmenu/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/contextmenu/plugin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/contextmenu/plugin.js	(revision 6050)
@@ -40,5 +40,5 @@
 					//  for multiple range selecting (like Gecko), we use this key
 					//  combination as a fallback for triggering context-menu. (#4530)
-					if ( CKEDITOR.env.opera )
+					if ( CKEDITOR.env.opera && !( 'oncontextmenu' in document.body ))
 					{
 						var contextMenuOverrideButton;
@@ -111,4 +111,17 @@
 						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 )
 					{
Index: CKEditor/branches/versions/3.5.x/_source/plugins/dialog/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/dialog/plugin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/dialog/plugin.js	(revision 6050)
@@ -34,4 +34,5 @@
 (function()
 {
+	var cssLength = CKEDITOR.tools.cssLength;
 	function isTabVisible( tabId )
 	{
@@ -67,4 +68,28 @@
 
 		return null;
+	}
+
+
+	function clearOrRecoverTextInputValue( container, isRecover )
+	{
+		var inputs = container.$.getElementsByTagName( 'input' );
+		for ( var i = 0, length = inputs.length; i < length ; i++ )
+		{
+			var item = new CKEDITOR.dom.element( inputs[ i ] );
+
+			if ( item.getAttribute( 'type' ).toLowerCase() == 'text' )
+			{
+				if ( isRecover )
+				{
+					item.setAttribute( 'value', item.getCustomData( 'fake_value' ) || '' );
+					item.removeCustomData( 'fake_value' );
+				}
+				else
+				{
+					item.setCustomData( 'fake_value', item.getAttribute( 'value' ) );
+					item.setAttribute( 'value', '' );
+				}
+			}
+		}
 	}
 
@@ -487,5 +512,5 @@
 		}
 
-		this.parts['tabs'].on( 'click', function( evt )
+		this.parts[ 'tabs' ].on( 'click', function( evt )
 				{
 					var target = evt.data.getTarget();
@@ -695,9 +720,9 @@
 			this.resize( definition.minWidth, definition.minHeight );
 
+			// Reset all inputs back to their default value.
+			this.reset();
+
 			// Select the first tab by default.
 			this.selectPage( this.definition.contents[0].id );
-
-			// Reset all inputs back to their default value.
-			this.reset();
 
 			// Set z-index.
@@ -976,7 +1001,22 @@
 			}
 
-			var selected = this._.tabs[id];
-			selected[0].addClass( 'cke_dialog_tab_selected' );
-			selected[1].show();
+			var selected = this._.tabs[ id ];
+			selected[ 0 ].addClass( 'cke_dialog_tab_selected' );
+
+			// [IE] an invisible input[type='text'] will enlarge it's width
+			// if it's value is long when it shows, so we clear it's value
+			// before it shows and then recover it (#5649)
+			if ( CKEDITOR.env.ie6Compat || CKEDITOR.env.ie7Compat )
+			{
+				clearOrRecoverTextInputValue( selected[ 1 ] );
+				selected[ 1 ].show();
+				setTimeout( function()
+				{
+					clearOrRecoverTextInputValue( selected[ 1 ], 1 );
+				}, 0 );
+			}
+			else
+				selected[ 1 ].show();
+
 			this._.currentTabId = id;
 			this._.currentTabIndex = CKEDITOR.tools.indexOf( this._.tabIdList, id );
@@ -1782,7 +1822,8 @@
 	{
 		var win = CKEDITOR.document.getWindow();
-		var backgroundColorStyle = editor.config.dialog_backgroundCoverColor || 'white',
-			backgroundCoverOpacity = editor.config.dialog_backgroundCoverOpacity,
-			baseFloatZIndex = editor.config.baseFloatZIndex,
+		var config = editor.config,
+			backgroundColorStyle = config.dialog_backgroundCoverColor || 'white',
+			backgroundCoverOpacity = config.dialog_backgroundCoverOpacity,
+			baseFloatZIndex = config.baseFloatZIndex,
 			coverKey = CKEDITOR.tools.genKey(
 					backgroundColorStyle,
@@ -2215,12 +2256,12 @@
 						{
 							if ( widths[i] )
-								styles.push( 'width:' + CKEDITOR.tools.cssLength( widths[i] ) );
+								styles.push( 'width:' + cssLength( widths[i] ) );
 						}
 						else
 							styles.push( 'width:' + Math.floor( 100 / childHtmlList.length ) + '%' );
 						if ( height )
-							styles.push( 'height:' + CKEDITOR.tools.cssLength( height ) );
+							styles.push( 'height:' + cssLength( height ) );
 						if ( elementDefinition && elementDefinition.padding != undefined )
-							styles.push( 'padding:' + CKEDITOR.tools.cssLength( elementDefinition.padding ) );
+							styles.push( 'padding:' + cssLength( elementDefinition.padding ) );
 						if ( styles.length > 0 )
 							html.push( 'style="' + styles.join('; ') + '" ' );
@@ -2275,5 +2316,5 @@
 			vbox : function( dialog, childObjList, childHtmlList, htmlList, elementDefinition )
 			{
-				if (arguments.length < 3 )
+				if ( arguments.length < 3 )
 					return;
 
@@ -2290,5 +2331,5 @@
 					if ( elementDefinition && elementDefinition.expand )
 						html.push( 'height:100%;' );
-					html.push( 'width:' + CKEDITOR.tools.cssLength( width || '100%' ), ';' );
+					html.push( 'width:' + cssLength( width || '100%' ), ';' );
 					html.push( '"' );
 					html.push( 'align="', CKEDITOR.tools.htmlEncode(
@@ -2301,11 +2342,11 @@
 						html.push( '<tr><td role="presentation" ' );
 						if ( width )
-							styles.push( 'width:' + CKEDITOR.tools.cssLength( width || '100%' ) );
+							styles.push( 'width:' + cssLength( width || '100%' ) );
 						if ( heights )
-							styles.push( 'height:' + CKEDITOR.tools.cssLength( heights[i] ) );
+							styles.push( 'height:' + cssLength( heights[i] ) );
 						else if ( elementDefinition && elementDefinition.expand )
 							styles.push( 'height:' + Math.floor( 100 / childHtmlList.length ) + '%' );
 						if ( elementDefinition && elementDefinition.padding != undefined )
-							styles.push( 'padding:' + CKEDITOR.tools.cssLength( elementDefinition.padding ) );
+							styles.push( 'padding:' + cssLength( elementDefinition.padding ) );
 						if ( styles.length > 0 )
 							html.push( 'style="', styles.join( '; ' ), '" ' );
Index: CKEditor/branches/versions/3.5.x/_source/plugins/dialogadvtab/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/dialogadvtab/plugin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/dialogadvtab/plugin.js	(revision 6050)
@@ -36,4 +36,12 @@
 		var attrName = this.att,
 			value = this.getValue();
+
+		// Broadcast Lang Dir change
+		if ( attrName == 'dir' )
+		{
+			var dir = element.getAttribute( attrName, value );
+			if ( dir != value && element.getParent() )
+					this._.dialog._.editor.fire( 'dirChanged', element );
+		}
 
 		if ( value )
@@ -99,5 +107,5 @@
 						label : lang.langDir,
 						'default' : '',
-						style : 'width:110px',
+						style : 'width:100%',
 						items :
 						[
@@ -123,5 +131,5 @@
 			contents = [];
 
-			if ( tabConfig.id )
+			if ( tabConfig.styles )
 			{
 				contents.push(
@@ -132,6 +140,4 @@
 						label : lang.styles,
 						'default' : '',
-
-						onChange : function(){},
 
 						getStyle : function( name, defaultValue )
@@ -160,5 +166,5 @@
 							}
 
-							this.setValue( styles, true );
+							this.setValue( styles, 1 );
 
 						},
Index: CKEditor/branches/versions/3.5.x/_source/plugins/dialogui/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/dialogui/plugin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/dialogui/plugin.js	(revision 6050)
@@ -381,5 +381,5 @@
 						attributes.checked = 'checked';
 
-					if (typeof myDefinition.controlStyle != 'undefined')
+					if ( typeof myDefinition.controlStyle != 'undefined' )
 						myDefinition.style = myDefinition.controlStyle;
 
@@ -463,5 +463,5 @@
 						cleanInnerDefinition( labelDefinition );
 
-						if (typeof inputDefinition.controlStyle != 'undefined')
+						if ( typeof inputDefinition.controlStyle != 'undefined' )
 							inputDefinition.style = inputDefinition.controlStyle;
 
@@ -623,5 +623,5 @@
 					}
 
-					if (typeof myDefinition.controlStyle != 'undefined')
+					if ( typeof myDefinition.controlStyle != 'undefined' )
 						myDefinition.style = myDefinition.controlStyle;
 
@@ -932,5 +932,5 @@
 					this._.disabled = false;
 					var element = this.getElement();
-					element && element.removeClass( 'disabled' );
+					element && element.removeClass( 'cke_disabled' );
 				},
 
@@ -942,5 +942,5 @@
 				{
 					this._.disabled = true;
-					this.getElement().addClass( 'disabled' );
+					this.getElement().addClass( 'cke_disabled' );
 				},
 
@@ -1385,16 +1385,17 @@
 				reset : function()
 				{
-					var frameElement = CKEDITOR.document.getById( this._.frameId ),
+					var _ = this._,
+						frameElement = CKEDITOR.document.getById( _.frameId ),
 						frameDocument = frameElement.getFrameDocument(),
-						elementDefinition = this._.definition,
-						buttons = this._.buttons,
+						elementDefinition = _.definition,
+						buttons = _.buttons,
 						callNumber = this.formLoadedNumber,
 						unloadNumber = this.formUnloadNumber,
-						langDir = this._.dialog._.editor.lang.dir,
-						langCode = this._.dialog._.editor.langCode;
+						langDir = _.dialog._.editor.lang.dir,
+						langCode = _.dialog._.editor.langCode;
 
 					// The callback function for the iframe, but we must call tools.addFunction only once
 					// so we store the function number in this.formLoadedNumber
-					if (!callNumber)
+					if ( !callNumber )
 					{
 						callNumber = this.formLoadedNumber = CKEDITOR.tools.addFunction(
Index: CKEditor/branches/versions/3.5.x/_source/plugins/div/dialogs/div.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/div/dialogs/div.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/div/dialogs/div.js	(revision 6050)
@@ -141,6 +141,6 @@
 
 			// Get all ranges from the selection.
-			var selection = editor.document.getSelection();
-			var ranges = selection.getRanges();
+			var selection = editor.document.getSelection(),
+				ranges = selection.getRanges();
 			var bookmarks = selection.createBookmarks();
 			var i, iterator;
@@ -331,5 +331,11 @@
 									var styleName;
 									if ( ( styleName = this.getValue() ) )
-										styles[ styleName ].applyToObject( element );
+									{
+										var style = styles[ styleName ];
+										var customData = element.getCustomData( 'elementStyle' ) || '';
+
+										style.applyToObject( element );
+										element.setCustomData( 'elementStyle', customData + style._.definition.attributes.style );
+									}
 								}
 							},
@@ -387,7 +393,6 @@
 											{
 												// Merge with 'elementStyle', which is of higher priority.
-												var value = this.getValue(),
-														merged = [ value, element.getAttribute( 'style' ) ].join( ';' );
-												value && element.setAttribute( 'style', merged );
+												var merged = this.getValue() + ( element.getCustomData( 'elementStyle' ) || '' );
+												element.setAttribute( 'style', merged );
 											}
 										}
@@ -433,5 +438,5 @@
 			onLoad : function()
 			{
-				setupFields.call(this);
+				setupFields.call( this );
 
 				// Preparing for the 'elementStyle' field.
@@ -504,4 +509,7 @@
 			onHide : function()
 			{
+				// Remove style only when editing existing DIV. (#6315)
+				if ( command == 'editdiv' )
+					this._element.removeCustomData( 'elementStyle' );
 				delete this._element;
 			}
Index: CKEditor/branches/versions/3.5.x/_source/plugins/div/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/div/plugin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/div/plugin.js	(revision 6050)
@@ -96,5 +96,5 @@
 					editor.contextMenu.addListener( function( element, selection )
 						{
-							if ( !element || element.isReadOnly())
+							if ( !element || element.isReadOnly() )
 								return null;
 
Index: CKEditor/branches/versions/3.5.x/_source/plugins/domiterator/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/domiterator/plugin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/domiterator/plugin.js	(revision 6050)
@@ -21,9 +21,9 @@
 
 		this.range = range;
-		this.forceBrBreak = false;
+		this.forceBrBreak = 0;
 
 		// Whether include <br>s into the enlarged range.(#3730).
-		this.enlargeBr = true;
-		this.enforceRealBlocks = false;
+		this.enlargeBr = 1;
+		this.enforceRealBlocks = 0;
 
 		this._ || ( this._ = {} );
@@ -45,4 +45,7 @@
 			var isLast;
 
+			// Indicate at least one of the range boundaries is inside a preformat block.
+			var touchPre;
+
 			// Instructs to cleanup remaining BRs.
 			var removePreviousBr, removeLastBr;
@@ -56,5 +59,8 @@
 				range.shrink( CKEDITOR.NODE_ELEMENT, true );
 
-				range.enlarge( this.forceBrBreak || !this.enlargeBr ?
+				touchPre = range.endContainer.hasAscendant( 'pre', true )
+					|| range.startContainer.hasAscendant( 'pre', true );
+
+				range.enlarge( this.forceBrBreak && !touchPre || !this.enlargeBr ?
 							   CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS : CKEDITOR.ENLARGE_BLOCK_CONTENTS );
 
@@ -75,5 +81,5 @@
 				if ( this._.lastNode &&
 						this._.lastNode.type == CKEDITOR.NODE_TEXT &&
-						!CKEDITOR.tools.trim( this._.lastNode.getText( ) ) &&
+						!CKEDITOR.tools.trim( this._.lastNode.getText() ) &&
 						this._.lastNode.getParent().isBlockBoundary() )
 				{
@@ -107,10 +113,11 @@
 				// closeRange indicates that a paragraph boundary has been found,
 				// so the range can be closed.
-				var closeRange = false;
+				var closeRange = 0,
+					parentPre = currentNode.hasAscendant( 'pre' );
 
 				// includeNode indicates that the current node is good to be part
 				// of the range. By default, any non-element node is ok for it.
 				var includeNode = ( currentNode.type != CKEDITOR.NODE_ELEMENT ),
-					continueFromSibling = false;
+					continueFromSibling = 0;
 
 				// If it is an element node, let's check if it can be part of the
@@ -120,10 +127,11 @@
 					var nodeName = currentNode.getName();
 
-					if ( currentNode.isBlockBoundary( this.forceBrBreak && { br : 1 } ) )
+					if ( currentNode.isBlockBoundary( this.forceBrBreak &&
+							!parentPre && { br : 1 } ) )
 					{
 						// <br> boundaries must be part of the range. It will
 						// happen only if ForceBrBreak.
 						if ( nodeName == 'br' )
-							includeNode = true;
+							includeNode = 1;
 						else if ( !range && !currentNode.getChildCount() && nodeName != 'hr' )
 						{
@@ -147,5 +155,5 @@
 						}
 
-						closeRange = true;
+						closeRange = 1;
 					}
 					else
@@ -164,5 +172,5 @@
 							continue;
 						}
-						includeNode = true;
+						includeNode = 1;
 					}
 				}
@@ -172,5 +180,5 @@
 					// other unicode whitespaces) before/after a block node.
 					if ( beginWhitespaceRegex.test( currentNode.getText() ) )
-						includeNode = false;
+						includeNode = 0;
 				}
 
@@ -194,7 +202,8 @@
 						var parentNode = currentNode.getParent();
 
-						if ( parentNode.isBlockBoundary( this.forceBrBreak && { br : 1 } ) )
+						if ( parentNode.isBlockBoundary( this.forceBrBreak
+								&& !parentPre && { br : 1 } ) )
 						{
-							closeRange = true;
+							closeRange = 1;
 							isLast = isLast || ( parentNode.equals( lastNode) );
 							break;
@@ -202,7 +211,7 @@
 
 						currentNode = parentNode;
-						includeNode = true;
+						includeNode = 1;
 						isLast = ( currentNode.equals( lastNode ) );
-						continueFromSibling = true;
+						continueFromSibling = 1;
 					}
 				}
@@ -294,4 +303,7 @@
 			}
 
+			// Ignore bookmark nodes.(#3783)
+			var bookmarkGuard = CKEDITOR.dom.walker.bookmark( false, true );
+
 			if ( removePreviousBr )
 			{
@@ -308,7 +320,4 @@
 			if ( removeLastBr )
 			{
-				// Ignore bookmark nodes.(#3783)
-				var bookmarkGuard = CKEDITOR.dom.walker.bookmark( false, true );
-
 				var lastChild = block.getLast();
 				if ( lastChild && lastChild.type == CKEDITOR.NODE_ELEMENT && lastChild.getName() == 'br' )
@@ -331,4 +340,10 @@
 			}
 
+			if ( !bookmarkGuard( this._.nextNode ) )
+			{
+				this._.nextNode = this._.nextNode.getNextSourceNode( true, null, function( node )
+					{ return !node.equals( lastNode ) && bookmarkGuard( node ); } );
+			}
+
 			return block;
 		}
Index: CKEditor/branches/versions/3.5.x/_source/plugins/editingblock/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/editingblock/plugin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/editingblock/plugin.js	(revision 6050)
@@ -111,5 +111,5 @@
 						editor.fireOnce( 'instanceReady' );
 						CKEDITOR.fire( 'instanceReady', null, editor );
-					} );
+					}, 0 );
 				});
 		}
@@ -212,5 +212,4 @@
  * config.startupFocus = true;
  */
-CKEDITOR.config.startupFocus = false;
 
 /**
Index: CKEditor/branches/versions/3.5.x/_source/plugins/enterkey/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/enterkey/plugin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/enterkey/plugin.js	(revision 6050)
@@ -70,5 +70,5 @@
 				{
 					nextBlock.breakParent( node );
-					nextBlock.move( nextBlock.getNext(), true );
+					nextBlock.move( nextBlock.getNext(), 1 );
 				}
 			}
@@ -318,5 +318,5 @@
 		}
 		else
-			return enter( editor, editor.config.shiftEnterMode, true );
+			return enter( editor, editor.config.shiftEnterMode, 1 );
 	}
 
@@ -336,5 +336,5 @@
 			{
 				editor.fire( 'saveSnapshot' );	// Save undo step.
-				if ( mode == CKEDITOR.ENTER_BR || editor.getSelection().getStartElement().hasAscendant( 'pre', true ) )
+				if ( mode == CKEDITOR.ENTER_BR || editor.getSelection().getStartElement().hasAscendant( 'pre', 1 ) )
 					enterBr( editor, mode, null, forceMode );
 				else
Index: CKEditor/branches/versions/3.5.x/_source/plugins/entities/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/entities/plugin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/entities/plugin.js	(revision 6050)
@@ -6,9 +6,8 @@
 (function()
 {
+	// Base HTML entities.
+	var htmlbase = 'nbsp,gt,lt,quot';
+
 	var entities =
-
-		// Base HTML entities.
-		'nbsp,gt,lt,quot,' +
-
 		// Latin-1 Entities
 		'iexcl,cent,pound,curren,yen,brvbar,sect,uml,copy,ordf,laquo,' +
@@ -47,5 +46,9 @@
 		'upsih,piv';
 
-	function buildTable( entities )
+	/**
+	 * Create a mapping table between one character and it's entity form from a list of entity names.
+	 * @param reverse {Boolean} Whether create a reverse map from the entity string form to actual character.
+	 */
+	function buildTable( entities, reverse )
 	{
 		var table = {},
@@ -64,29 +67,35 @@
 		entities = entities.replace( /\b(nbsp|shy|gt|lt|amp)(?:,|$)/g, function( match, entity )
 			{
-				table[ specialTable[ entity ] ] = '&' + entity + ';';
-				regex.push( specialTable[ entity ] );
+				var org = reverse ? '&' + entity + ';' : specialTable[ entity ],
+					result = reverse ? specialTable[ entity ] : '&' + entity + ';';
+
+				table[ org ] = result;
+				regex.push( org );
 				return '';
 			});
 
-		// Transforms the entities string into an array.
-		entities = entities.split( ',' );
-
-		// Put all entities inside a DOM element, transforming them to their
-		// final chars.
-		var div = document.createElement( 'div' ),
-			chars;
-		div.innerHTML = '&' + entities.join( ';&' ) + ';';
-		chars = div.innerHTML;
-		div = null;
-
-		// Add all chars to the table.
-		for ( var i = 0 ; i < chars.length ; i++ )
+		if ( !reverse )
 		{
-			var charAt = chars.charAt( i );
-			table[ charAt ] = '&' + entities[ i ] + ';';
-			regex.push( charAt );
+			// Transforms the entities string into an array.
+			entities = entities.split( ',' );
+
+			// Put all entities inside a DOM element, transforming them to their
+			// final chars.
+			var div = document.createElement( 'div' ),
+				chars;
+			div.innerHTML = '&' + entities.join( ';&' ) + ';';
+			chars = div.innerHTML;
+			div = null;
+
+			// Add all chars to the table.
+			for ( var i = 0 ; i < chars.length ; i++ )
+			{
+				var charAt = chars.charAt( i );
+				table[ charAt ] = '&' + entities[ i ] + ';';
+				regex.push( charAt );
+			}
 		}
 
-		table.regex = regex.join( '' );
+		table.regex = regex.join( reverse ? '|' : '' );
 
 		return table;
@@ -99,7 +108,4 @@
 			var config = editor.config;
 
-			if ( !config.entities )
-				return;
-
 			var dataProcessor = editor.dataProcessor,
 				htmlFilter = dataProcessor && dataProcessor.htmlFilter;
@@ -107,14 +113,19 @@
 			if ( htmlFilter )
 			{
-				var selectedEntities = entities;
-
-				if ( config.entities_latin )
-					selectedEntities += ',' + latin;
-
-				if ( config.entities_greek )
-					selectedEntities += ',' + greek;
-
-				if ( config.entities_additional )
-					selectedEntities += ',' + config.entities_additional;
+				// Mandatory HTML base entities.
+				var selectedEntities = htmlbase;
+
+				if ( config.entities )
+				{
+					selectedEntities += ',' + entities;
+					if ( config.entities_latin )
+						selectedEntities += ',' + latin;
+
+					if ( config.entities_greek )
+						selectedEntities += ',' + greek;
+
+					if ( config.entities_additional )
+						selectedEntities += ',' + config.entities_additional;
+				}
 
 				var entitiesTable = buildTable( selectedEntities );
@@ -124,12 +135,24 @@
 				delete entitiesTable.regex;
 
-				if ( config.entities_processNumerical )
+				if ( config.entities && config.entities_processNumerical )
 					entitiesRegex = '[^ -~]|' + entitiesRegex ;
 
 				entitiesRegex = new RegExp( entitiesRegex, 'g' );
+
+				function getEntity( character )
+				{
+					return config.entities_processNumerical == 'force' || !entitiesTable[ character ] ?
+						   '&#' + character.charCodeAt(0) + ';'
+							: entitiesTable[ character ];
+				}
+
+				// Decode entities that the browsers has transformed
+				// at first place.
+				var baseEntitiesTable = buildTable( [ htmlbase, 'shy' ].join( ',' ) , true ),
+					baseEntitiesRegex = new RegExp( baseEntitiesTable.regex, 'g' );
 
 				function getChar( character )
 				{
-					return entitiesTable[ character ] || ( '&#' + character.charCodeAt(0) + ';' );
+					return baseEntitiesTable[ character ];
 				}
 
@@ -138,5 +161,6 @@
 						text : function( text )
 						{
-							return text.replace( entitiesRegex, getChar );
+							return text.replace( baseEntitiesRegex, getChar )
+									.replace( entitiesRegex, getEntity );
 						}
 					});
@@ -180,13 +204,15 @@
 /**
  * Whether to convert all remaining characters, not comprised in the ASCII
- * character table, to their relative numeric representation of HTML entity.
+ * character table, to their relative decimal numeric representation of HTML entity.
+ * When specified as the value 'force', it will simply convert all entities into the above form.
  * For example, the phrase "This is Chinese: &#27721;&#35821;." is outputted
  * as "This is Chinese: &amp;#27721;&amp;#35821;."
  * @type Boolean
+ * @type Boolean|String
  * @default false
  * @example
  * config.entities_processNumerical = true;
- */
-CKEDITOR.config.entities_processNumerical = false;
+ * config.entities_processNumerical = 'force';		//Convert from "&nbsp;" into "&#160;";
+ */
 
 /**
Index: CKEditor/branches/versions/3.5.x/_source/plugins/filebrowser/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/filebrowser/plugin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/filebrowser/plugin.js	(revision 6050)
@@ -262,6 +262,11 @@
 			if ( element.filebrowser.action == 'Browse' )
 			{
-				var url = element.filebrowser.url || editor.config[ 'filebrowser' + ucFirst( dialogName ) + 'BrowseUrl' ]
-							|| editor.config.filebrowserBrowseUrl;
+				var url = element.filebrowser.url;
+				if ( url === undefined )
+				{
+					url = editor.config[ 'filebrowser' + ucFirst( dialogName ) + 'BrowseUrl' ];
+					if ( url === undefined )
+						url = editor.config.filebrowserBrowseUrl;
+				}
 
 				if ( url )
@@ -274,6 +279,11 @@
 			else if ( element.filebrowser.action == 'QuickUpload' && element[ 'for' ] )
 			{
-				url =  element.filebrowser.url || editor.config[ 'filebrowser' + ucFirst( dialogName ) + 'UploadUrl' ]
-							|| editor.config.filebrowserUploadUrl;
+				var url = element.filebrowser.url;
+				if ( url === undefined )
+				{
+					url = editor.config[ 'filebrowser' + ucFirst( dialogName ) + 'UploadUrl' ];
+					if ( url === undefined )
+						url = editor.config.filebrowserUploadUrl;
+				}
 
 				if ( url )
@@ -341,5 +351,5 @@
 			for ( var i = 0 ; i < ids.length ; i++ )
 			{
-				if ( isConfigured( definition, tabId, ids[i]) )
+				if ( isConfigured( definition, tabId, ids[i] ) )
 					return true;
 			}
Index: CKEditor/branches/versions/3.5.x/_source/plugins/find/dialogs/find.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/find/dialogs/find.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/find/dialogs/find.js	(revision 6050)
@@ -72,5 +72,5 @@
 		// 1. Defined as full match style to avoid compromising ordinary text color styles.
 		// 2. Must be apply onto inner-most text to avoid conflicting with ordinary text color styles visually.
-		var highlightStyle = new CKEDITOR.style( CKEDITOR.tools.extend( { fullMatch : true, childRule : function(){ return false; } },
+		var highlightStyle = new CKEDITOR.style( CKEDITOR.tools.extend( { fullMatch : true, childRule : function(){ return 0; } },
 			editor.config.find_highlight ) );
 
@@ -84,9 +84,19 @@
 		var characterWalker = function( range , matchWord )
 		{
+			var self = this;
 			var walker =
 				new CKEDITOR.dom.walker( range );
-			walker.guard = matchWord ? nonCharactersBoundary : null;
+			walker.guard = matchWord ? nonCharactersBoundary : function( node )
+			{
+				!nonCharactersBoundary( node ) && ( self._.matchBoundary = true );
+			};
 			walker[ 'evaluator' ] = findEvaluator;
-			walker.breakOnFalse = true;
+			walker.breakOnFalse = 1;
+
+			if ( range.startContainer.type == CKEDITOR.NODE_TEXT )
+			{
+				this.textNode = range.startContainer;
+				this.offset = range.startOffset - 1;
+			}
 
 			this._ = {
@@ -112,5 +122,5 @@
 				var currentTextNode = this.textNode;
 				// Already at the end of document, no more character available.
-				if (  currentTextNode === null )
+				if ( currentTextNode === null )
 					return cursorStep.call( this );
 
@@ -143,12 +153,6 @@
 						// already reach document end.
 						if ( this._.matchWord && !currentTextNode
-							 ||this._.walker._.end )
+							 || this._.walker._.end )
 							break;
-
-						// Marking as match character boundaries.
-						if ( !currentTextNode
-						   && !nonCharactersBoundary( this._.walker.current ) )
-							this._.matchBoundary = true;
-
 					}
 					// Found a fresh text node.
@@ -176,5 +180,5 @@
 				rangeLength : rangeLength,
 				highlightRange : null,
-				isMatched : false
+				isMatched : 0
 			};
 		};
@@ -512,5 +516,5 @@
 				if ( matchCyclic && !cyclicRerun )
 				{
-					this.searchRange = getSearchRange( true );
+					this.searchRange = getSearchRange( 1 );
 					this.matchRange = null;
 					return arguments.callee.apply( this,
@@ -532,5 +536,5 @@
 
 				// Successiveness of current replace/find.
-				var result = false;
+				var result = 0;
 
 				// 1. Perform the replace when there's already a match here.
@@ -562,5 +566,5 @@
 					this.matchRange._.isReplaced = true;
 					this.replaceCounter++;
-					result = true;
+					result = 1;
 				}
 				else
@@ -596,15 +600,16 @@
 		}
 
+		var lang = editor.lang.findAndReplace;
 		return {
-			title : editor.lang.findAndReplace.title,
+			title : lang.title,
 			resizable : CKEDITOR.DIALOG_RESIZE_NONE,
 			minWidth : 350,
 			minHeight : 165,
-			buttons : [ CKEDITOR.dialog.cancelButton ],		//Cancel button only.
+			buttons : [ CKEDITOR.dialog.cancelButton ],		// Cancel button only.
 			contents : [
 				{
 					id : 'find',
-					label : editor.lang.findAndReplace.find,
-					title : editor.lang.findAndReplace.find,
+					label : lang.find,
+					title : lang.find,
 					accessKey : '',
 					elements : [
@@ -617,5 +622,5 @@
 									type : 'text',
 									id : 'txtFindFind',
-									label : editor.lang.findAndReplace.findWhat,
+									label : lang.findWhat,
 									isChanged : false,
 									labelLayout : 'horizontal',
@@ -626,5 +631,5 @@
 									align : 'left',
 									style : 'width:100%',
-									label : editor.lang.findAndReplace.find,
+									label : lang.find,
 									onClick : function()
 									{
@@ -634,5 +639,5 @@
 													dialog.getValueOf( 'find', 'txtFindWordChk' ),
 													dialog.getValueOf( 'find', 'txtFindCyclic' ) ) )
-											alert( editor.lang.findAndReplace
+											alert( lang
 												.notFoundMsg );
 									}
@@ -650,5 +655,5 @@
 									isChanged : false,
 									style : 'margin-top:28px',
-									label : editor.lang.findAndReplace.matchCase
+									label : lang.matchCase
 								},
 								{
@@ -656,5 +661,5 @@
 									id : 'txtFindWordChk',
 									isChanged : false,
-									label : editor.lang.findAndReplace.matchWord
+									label : lang.matchWord
 								},
 								{
@@ -663,5 +668,5 @@
 									isChanged : false,
 									'default' : true,
-									label : editor.lang.findAndReplace.matchCyclic
+									label : lang.matchCyclic
 								}
 							]
@@ -671,5 +676,5 @@
 				{
 					id : 'replace',
-					label : editor.lang.findAndReplace.replace,
+					label : lang.replace,
 					accessKey : 'M',
 					elements : [
@@ -682,5 +687,5 @@
 									type : 'text',
 									id : 'txtFindReplace',
-									label : editor.lang.findAndReplace.findWhat,
+									label : lang.findWhat,
 									isChanged : false,
 									labelLayout : 'horizontal',
@@ -691,5 +696,5 @@
 									align : 'left',
 									style : 'width:100%',
-									label : editor.lang.findAndReplace.replace,
+									label : lang.replace,
 									onClick : function()
 									{
@@ -701,5 +706,5 @@
 													dialog.getValueOf( 'replace', 'txtReplaceWordChk' ),
 													dialog.getValueOf( 'replace', 'txtReplaceCyclic' ) ) )
-											alert( editor.lang.findAndReplace
+											alert( lang
 												.notFoundMsg );
 									}
@@ -715,5 +720,5 @@
 									type : 'text',
 									id : 'txtReplace',
-									label : editor.lang.findAndReplace.replaceWith,
+									label : lang.replaceWith,
 									isChanged : false,
 									labelLayout : 'horizontal',
@@ -724,5 +729,5 @@
 									align : 'left',
 									style : 'width:100%',
-									label : editor.lang.findAndReplace.replaceAll,
+									label : lang.replaceAll,
 									isChanged : false,
 									onClick : function()
@@ -734,5 +739,5 @@
 
 										// Scope to full document.
-										finder.searchRange = getSearchRange( true );
+										finder.searchRange = getSearchRange( 1 );
 										if ( finder.matchRange )
 										{
@@ -751,9 +756,9 @@
 										if ( finder.replaceCounter )
 										{
-											alert( editor.lang.findAndReplace.replaceSuccessMsg.replace( /%1/, finder.replaceCounter ) );
+											alert( lang.replaceSuccessMsg.replace( /%1/, finder.replaceCounter ) );
 											editor.fire( 'saveSnapshot' );
 										}
 										else
-											alert( editor.lang.findAndReplace.notFoundMsg );
+											alert( lang.notFoundMsg );
 									}
 								}
@@ -769,5 +774,5 @@
 									id : 'txtReplaceCaseChk',
 									isChanged : false,
-									label : editor.lang.findAndReplace
+									label : lang
 										.matchCase
 								},
@@ -776,5 +781,5 @@
 									id : 'txtReplaceWordChk',
 									isChanged : false,
-									label : editor.lang.findAndReplace
+									label : lang
 										.matchWord
 								},
@@ -784,5 +789,5 @@
 									isChanged : false,
 									'default' : true,
-									label : editor.lang.findAndReplace
+									label : lang
 										.matchCyclic
 								}
@@ -796,17 +801,17 @@
 				var dialog = this;
 
-				//keep track of the current pattern field in use.
+				// Keep track of the current pattern field in use.
 				var patternField, wholeWordChkField;
 
-				//Ignore initial page select on dialog show
-				var isUserSelect = false;
-				this.on('hide', function()
-						{
-							isUserSelect = false;
-						} );
-				this.on('show', function()
-						{
-							isUserSelect = true;
-						} );
+				// Ignore initial page select on dialog show
+				var isUserSelect = 0;
+				this.on( 'hide', function()
+						{
+							isUserSelect = 0;
+						});
+				this.on( 'show', function()
+						{
+							isUserSelect = 1;
+						});
 
 				this.selectPage = CKEDITOR.tools.override( this.selectPage, function( originalFunc )
@@ -826,5 +831,5 @@
 								wholeWordChkFieldId );
 
-							// prepare for check pattern text filed 'keyup' event
+							// Prepare for check pattern text filed 'keyup' event
 							if ( !currPage.initialized )
 							{
@@ -834,6 +839,6 @@
 							}
 
+							// Synchronize fields on tab switch.
 							if ( isUserSelect )
-								// synchronize fields on tab switch.
 								syncFieldsBetweenTabs.call( this, pageId );
 						};
Index: CKEditor/branches/versions/3.5.x/_source/plugins/flash/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/flash/plugin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/flash/plugin.js	(revision 6050)
@@ -6,13 +6,7 @@
 (function()
 {
-	var flashFilenameRegex = /\.swf(?:$|\?)/i,
-		numberRegex = /^\d+(?:\.\d+)?$/;
+	var flashFilenameRegex = /\.swf(?:$|\?)/i;
 
-	function cssifyLength( length )
-	{
-		if ( numberRegex.test( length ) )
-			return length + 'px';
-		return length;
-	}
+	var cssifyLength = CKEDITOR.tools.cssLength;
 
 	function isFlashEmbed( element )
Index: CKEditor/branches/versions/3.5.x/_source/plugins/floatpanel/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/floatpanel/plugin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/floatpanel/plugin.js	(revision 6050)
@@ -17,12 +17,6 @@
 	{
 		// Generates the panel key: docId-eleId-skinName-langDir[-uiColor][-CSSs][-level]
-		var key =
-			doc.getUniqueId() +
-			'-' + parentElement.getUniqueId() +
-			'-' + editor.skinName +
-			'-' + editor.lang.dir +
-			( ( editor.uiColor && ( '-' + editor.uiColor ) ) || '' ) +
-			( ( definition.css && ( '-' + definition.css ) ) || '' ) +
-			( ( level && ( '-' + level ) ) || '' );
+		var key = CKEDITOR.tools.genKey( doc.getUniqueId(), parentElement.getUniqueId(), editor.skinName, editor.lang.dir,
+			editor.uiColor || '', definition.css || '', level || '' );
 
 		var panel = panels[ key ];
@@ -47,5 +41,5 @@
 		$ : function( editor, parentElement, definition, level )
 		{
-			definition.forceIFrame = true;
+			definition.forceIFrame = 1;
 
 			var doc = parentElement.getDocument(),
@@ -105,5 +99,5 @@
 
 				this.allowBlur( false );
-				isShowing = true;
+				isShowing = 1;
 
 				var element = this.element,
@@ -130,5 +124,6 @@
 				element.setStyles(
 					{
-						top : '-30000px',
+						top : 0,
+						left: 0,
 						display	: ''
 					});
@@ -283,4 +278,12 @@
 							}
 
+							// Trigger the onHide event of the previously active panel to prevent
+							// incorrect styles from being applied (#6170)
+							var innerElement = element.getFirst(),
+								activePanel;
+							if ( ( activePanel = innerElement.getCustomData( 'activePanel' ) ) )
+								activePanel.onHide && activePanel.onHide.call( this, 1 );
+							innerElement.setCustomData( 'activePanel', this );
+
 							element.setStyles(
 								{
@@ -306,5 +309,5 @@
 					this.onShow.call( this );
 
-				isShowing = false;
+				isShowing = 0;
 			},
 
@@ -316,4 +319,5 @@
 					this.element.setStyle( 'display', 'none' );
 					this.visible = 0;
+					this.element.getFirst().removeCustomData( 'activePanel' );
 				}
 			},
Index: CKEditor/branches/versions/3.5.x/_source/plugins/forms/dialogs/button.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/forms/dialogs/button.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/forms/dialogs/button.js	(revision 6050)
@@ -13,8 +13,8 @@
 			delete this.button;
 			var element = this.getParentEditor().getSelection().getSelectedElement();
-			if ( element && element.getName() == "input" )
+			if ( element && element.is( 'input' ) )
 			{
 				var type = element.getAttribute( 'type' );
-				if ( type == "button" || type == "reset" || type == "submit" )
+				if ( type in { button:1, reset:1, submit:1 } )
 				{
 					this.button = element;
Index: CKEditor/branches/versions/3.5.x/_source/plugins/forms/dialogs/checkbox.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/forms/dialogs/checkbox.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/forms/dialogs/checkbox.js	(revision 6050)
@@ -15,5 +15,5 @@
 			var element = this.getParentEditor().getSelection().getSelectedElement();
 
-			if ( element && element.getAttribute( 'type' ) == "checkbox" )
+			if ( element && element.getAttribute( 'type' ) == 'checkbox' )
 			{
 				this.checkbox = element;
@@ -32,8 +32,6 @@
 				element = editor.document.createElement( 'input' );
 				element.setAttribute( 'type', 'checkbox' );
+				editor.insertElement( element );
 			}
-
-			if ( isInsertMode )
-				editor.insertElement( element );
 			this.commitContent( { element : element } );
 		},
@@ -95,5 +93,5 @@
 								if ( CKEDITOR.env.ie )
 								{
-									// Remove attribute 'value' of checkbox #4721.
+									// Remove attribute 'value' of checkbox (#4721).
 									var checkbox = new CKEDITOR.dom.element( 'input', element.getDocument() );
 									element.copyAttributes( checkbox, { value: 1 } );
@@ -124,6 +122,6 @@
 							if ( CKEDITOR.env.ie )
 							{
-								var isElementChecked = !!element.getAttribute( 'checked' );
-								var isChecked = !!this.getValue();
+								var isElementChecked = !!element.getAttribute( 'checked' ),
+									isChecked = !!this.getValue();
 
 								if ( isElementChecked != isChecked )
Index: CKEditor/branches/versions/3.5.x/_source/plugins/forms/dialogs/radio.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/forms/dialogs/radio.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/forms/dialogs/radio.js	(revision 6050)
@@ -14,5 +14,5 @@
 
 			var element = this.getParentEditor().getSelection().getSelectedElement();
-			if ( element && element.getName() == "input" && element.getAttribute( 'type' ) == "radio" )
+			if ( element && element.getName() == 'input' && element.getAttribute( 'type' ) == 'radio' )
 			{
 				this.radioButton = element;
Index: CKEditor/branches/versions/3.5.x/_source/plugins/forms/dialogs/select.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/forms/dialogs/select.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/forms/dialogs/select.js	(revision 6050)
@@ -194,5 +194,5 @@
 						{
 							if ( name == 'clear' )
-								this.setValue( this.default || '' );
+								this.setValue( this['default'] || '' );
 							else if ( name == 'select' )
 							{
Index: CKEditor/branches/versions/3.5.x/_source/plugins/forms/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/forms/plugin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/forms/plugin.js	(revision 6050)
@@ -192,8 +192,11 @@
 					switch ( type )
 					{
-						case 'text' : case 'password':
+						case 'text' :
+						case 'password' :
 							evt.data.dialog = 'textfield';
 							break;
-						case 'button' : case 'submit' : case 'reset' :
+						case 'button' :
+						case 'submit' :
+						case 'reset' :
 							evt.data.dialog = 'button';
 							break;
Index: CKEditor/branches/versions/3.5.x/_source/plugins/htmldataprocessor/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/htmldataprocessor/plugin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/htmldataprocessor/plugin.js	(revision 6050)
@@ -264,5 +264,6 @@
 	}
 
-	var protectAttributeRegex = /<(?:a|area|img|input)[\s\S]*?\s((?:href|src|name)\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|(?:[^ "'>]+)))/gi;
+	var protectAttributeRegex = /<((?:a|area|img|input)[\s\S]*?\s)((href|src|name)\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|(?:[^ "'>]+)))([^>]*)>/gi,
+		findSavedSrcRegex = /\s_cke_saved_src\s*=/;
 
 	var protectElementsRegex = /(?:<style(?=[ >])[^>]*>[\s\S]*<\/style>)|(?:<(:?link|meta|base)[^>]*>)/gi,
@@ -276,5 +277,12 @@
 	function protectAttributes( html )
 	{
-		return html.replace( protectAttributeRegex, '$& _cke_saved_$1' );
+		return html.replace( protectAttributeRegex, function( tag, beginning, fullAttr, attrName, end )
+			{
+				// We should not rewrite the _cke_saved_src attribute (#5218)
+				if ( attrName == 'src' && findSavedSrcRegex.test( tag ) )
+					return tag;
+				else
+					return '<' + beginning + fullAttr + ' _cke_saved_' + fullAttr + end + '>';
+			});
 	}
 
@@ -308,4 +316,9 @@
 	{
 		return html.replace( protectSelfClosingRegex, '<cke:$1$2></cke:$1>' );
+	}
+
+	function protectPreFormatted( html )
+	{
+		return html.replace( /(<pre\b[^>]*>)(\r\n|\n)/g, '$1$2$2' );
 	}
 
@@ -430,4 +443,8 @@
 			data = protectSelfClosingElements( data );
 
+			// Compensate one leading line break after <pre> open as browsers
+			// eat it up. (#5789)
+			data = protectPreFormatted( data );
+
 			// Call the browser to help us fixing a possibly invalid HTML
 			// structure.
@@ -484,3 +501,2 @@
  * config.forceSimpleAmpersand = false;
  */
-CKEDITOR.config.forceSimpleAmpersand = false;
Index: CKEditor/branches/versions/3.5.x/_source/plugins/htmlwriter/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/htmlwriter/plugin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/htmlwriter/plugin.js	(revision 6050)
@@ -58,10 +58,12 @@
 		this.lineBreakChars = '\n';
 
-		this.forceSimpleAmpersand = false;
-
-		this.sortAttributes = true;
-
-		this._.indent = false;
+		this.forceSimpleAmpersand = 0;
+
+		this.sortAttributes = 1;
+
+		this._.indent = 0;
 		this._.indentation = '';
+		// Indicate preformatted block context status. (#5789)
+		this._.inPre = 0;
 		this._.rules = {};
 
@@ -72,9 +74,9 @@
 			this.setRules( e,
 				{
-					indent : true,
-					breakBeforeOpen : true,
-					breakAfterOpen : true,
+					indent : 1,
+					breakBeforeOpen : 1,
+					breakAfterOpen : 1,
 					breakBeforeClose : !dtd[ e ][ '#' ],
-					breakAfterClose : true
+					breakAfterClose : 1
 				});
 		}
@@ -82,17 +84,17 @@
 		this.setRules( 'br',
 			{
-				breakAfterOpen : true
+				breakAfterOpen : 1
 			});
 
 		this.setRules( 'title',
 			{
-				indent : false,
-				breakAfterOpen : false
+				indent : 0,
+				breakAfterOpen : 0
 			});
 
 		this.setRules( 'style',
 			{
-				indent : false,
-				breakBeforeClose : true
+				indent : 0,
+				breakBeforeClose : 1
 			});
 
@@ -100,5 +102,5 @@
 		this.setRules( 'pre',
 			{
-			  indent: false
+			  indent : 0
 			});
 	},
@@ -159,4 +161,5 @@
 			if ( rules && rules.breakAfterOpen )
 				this.lineBreak();
+			tagName == 'pre' && ( this._.inPre = 1 );
 		},
 
@@ -207,4 +210,5 @@
 
 			this._.output.push( '</', tagName, '>' );
+			tagName == 'pre' && ( this._.inPre = 0 );
 
 			if ( rules && rules.breakAfterClose )
@@ -224,5 +228,5 @@
 			{
 				this.indentation();
-				text = CKEDITOR.tools.ltrim( text );
+				!this._.inPre  && ( text = CKEDITOR.tools.ltrim( text ) );
 			}
 
@@ -253,7 +257,7 @@
 		lineBreak : function()
 		{
-			if ( this._.output.length > 0 )
+			if ( !this._.inPre && this._.output.length > 0 )
 				this._.output.push( this.lineBreakChars );
-			this._.indent = true;
+			this._.indent = 1;
 		},
 
@@ -268,6 +272,7 @@
 		indentation : function()
 		{
-			this._.output.push( this._.indentation );
-			this._.indent = false;
+			if( !this._.inPre )
+				this._.output.push( this._.indentation );
+			this._.indent = 0;
 		},
 
Index: CKEditor/branches/versions/3.5.x/_source/plugins/iframedialog/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/iframedialog/plugin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/iframedialog/plugin.js	(revision 6050)
@@ -75,5 +75,5 @@
 					cssWidth = CKEDITOR.tools.cssLength( elementDefinition.width ),
 					cssHeight = CKEDITOR.tools.cssLength( elementDefinition.height );
-				_.frameId = CKEDITOR.tools.getNextNumber() + '_iframe';
+				_.frameId = CKEDITOR.tools.getNextId() + '_iframe';
 
 				// IE BUG: Parent container does not resize to contain the iframe automatically.
Index: CKEditor/branches/versions/3.5.x/_source/plugins/image/dialogs/image.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/image/dialogs/image.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/image/dialogs/image.js	(revision 6050)
@@ -542,5 +542,4 @@
 													// Manually set the initial value.(#4191)
 													field.setInitValue();
-													field.focus();
 												}
 											},
@@ -1125,5 +1124,5 @@
 								action : 'Browse',
 								target: 'Link:txtUrl',
-								url: editor.config.filebrowserImageBrowseLinkUrl || editor.config.filebrowserBrowseUrl
+								url: editor.config.filebrowserImageBrowseLinkUrl
 							},
 							style : 'float:right',
Index: CKEditor/branches/versions/3.5.x/_source/plugins/indent/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/indent/plugin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/indent/plugin.js	(revision 6050)
@@ -158,5 +158,6 @@
 				// Convert the array back to a DOM forest (yes we might have a few subtrees now).
 				// And replace the old list with the new forest.
-				var newList = CKEDITOR.plugins.list.arrayToList( listArray, database, null, editor.config.enterMode, 0 );
+				var newListDir = listNode.getAttribute( 'dir' ) || listNode.getStyle( 'direction' );
+				var newList = CKEDITOR.plugins.list.arrayToList( listArray, database, null, editor.config.enterMode, newListDir );
 
 				// Avoid nested <li> after outdent even they're visually same,
@@ -256,9 +257,10 @@
 				else
 				{
-					var indentCssProperty = getIndentCssProperty( element );
-					var currentOffset = parseInt( element.getStyle( indentCssProperty ), 10 );
+					var indentCssProperty = getIndentCssProperty( element ),
+						currentOffset = parseInt( element.getStyle( indentCssProperty ), 10 );
 					if ( isNaN( currentOffset ) )
 						currentOffset = 0;
-					currentOffset += ( self.name == 'indent' ? 1 : -1 ) * editor.config.indentOffset;
+					var indentOffset = editor.config.indentOffset || 40;
+					currentOffset += ( self.name == 'indent' ? 1 : -1 ) * indentOffset;
 
 					if ( currentOffset < 0 )
@@ -266,25 +268,24 @@
 
 					currentOffset = Math.max( currentOffset, 0 );
-					currentOffset = Math.ceil( currentOffset / editor.config.indentOffset ) * editor.config.indentOffset;
-					element.setStyle( indentCssProperty, currentOffset ? currentOffset + editor.config.indentUnit : '' );
+					currentOffset = Math.ceil( currentOffset / indentOffset ) * indentOffset;
+					element.setStyle( indentCssProperty, currentOffset ? currentOffset + ( editor.config.indentUnit || 'px' ) : '' );
 					if ( element.getAttribute( 'style' ) === '' )
 						element.removeAttribute( 'style' );
 				}
 
-				CKEDITOR.dom.element.setMarker( database, element, 'indent_processed', true );
+				CKEDITOR.dom.element.setMarker( database, element, 'indent_processed', 1 );
 				return true;
 			}
 
 			var selection = editor.getSelection(),
-				bookmarks = selection.createBookmarks( true ),
-				ranges = selection && selection.getRanges( true ),
+				bookmarks = selection.createBookmarks( 1 ),
+				ranges = selection && selection.getRanges( 1 ),
 				range;
+
 
 			var iterator = ranges.createIterator();
 			while ( ( range = iterator.getNextRange() ) )
 			{
-				var startContainer = range.startContainer,
-					endContainer = range.endContainer,
-					rangeRoot = range.getCommonAncestor(),
+				var rangeRoot = range.getCommonAncestor(),
 					nearestListBlock = rangeRoot;
 
@@ -293,8 +294,23 @@
 					nearestListBlock = nearestListBlock.getParent();
 
+				// Avoid having selection enclose the entire list. (#6138)
+				// [<ul><li>...</li></ul>] =><ul><li>[...]</li></ul>
+				if ( !nearestListBlock )
+				{
+					var selectedNode = range.getEnclosedNode();
+					if ( selectedNode
+						&& selectedNode.type == CKEDITOR.NODE_ELEMENT
+						&& selectedNode.getName() in listNodeNames)
+					{
+						range.setStartAt( selectedNode, CKEDITOR.POSITION_AFTER_START );
+						range.setEndAt( selectedNode, CKEDITOR.POSITION_BEFORE_END );
+						nearestListBlock = selectedNode;
+					}
+				}
+
 				// Avoid selection anchors under list root.
 				// <ul>[<li>...</li>]</ul> =>	<ul><li>[...]</li></ul>
-				if ( nearestListBlock && startContainer.type == CKEDITOR.NODE_ELEMENT
-					&& startContainer.getName() in listNodeNames )
+				if ( nearestListBlock && range.startContainer.type == CKEDITOR.NODE_ELEMENT
+					&& range.startContainer.getName() in listNodeNames )
 				{
 					var walker = new CKEDITOR.dom.walker( range );
@@ -303,6 +319,6 @@
 				}
 
-				if ( nearestListBlock && endContainer.type == CKEDITOR.NODE_ELEMENT
-					&& endContainer.getName() in listNodeNames )
+				if ( nearestListBlock && range.endContainer.type == CKEDITOR.NODE_ELEMENT
+					&& range.endContainer.getName() in listNodeNames )
 				{
 					walker = new CKEDITOR.dom.walker( range );
@@ -311,5 +327,5 @@
 				}
 
-				if ( nearestListBlock  )
+				if ( nearestListBlock )
 				{
 					var firstListItem = nearestListBlock.getFirst( function( node )
@@ -320,7 +336,10 @@
 						indentWholeList = firstListItem.equals( rangeStart ) || firstListItem.contains( rangeStart );
 
-					// Indent the entire list if  cursor is inside the first list item. (#3893)
-					if ( !( indentWholeList && indentElement( nearestListBlock ) ) )
-						indentList( nearestListBlock );
+					// Indent the entire list if cursor is inside the first list item. (#3893)
+					// Only do that for indenting or when using indent classes or when there is something to outdent. (#6141)
+					if ( !( indentWholeList &&
+						( self.name == 'indent' || self.useIndentClasses || parseInt( nearestListBlock.getStyle( getIndentCssProperty( nearestListBlock ) ), 10 ) ) &&
+							indentElement( nearestListBlock ) ) )
+								indentList( nearestListBlock );
 				}
 				else
@@ -372,4 +391,36 @@
 					"}" );
 			}
+
+			// Register dirChanged listener.
+			editor.on( 'dirChanged', function( e )
+			{
+				var range = new CKEDITOR.dom.range( editor.document );
+				range.setStartBefore( e.data );
+				range.setEndAfter( e.data );
+
+				var walker = new CKEDITOR.dom.walker( range ),
+					node;
+
+				while ( ( node = walker.next() ) )
+				{
+					if ( node.type == CKEDITOR.NODE_ELEMENT )
+					{
+						// A child with the defined dir is to be ignored.
+						if ( !node.equals( e.data ) && node.getDirection() )
+						{
+							range.setStartAfter( node );
+							walker = new CKEDITOR.dom.walker( range );
+							continue;
+						}
+
+						// Switch the margins.
+						var marginLeft = node.getStyle( 'margin-right' ),
+							marginRight = node.getStyle( 'margin-left' );
+
+						marginLeft ? node.setStyle( 'margin-left', marginLeft ) : node.removeStyle( 'margin-left' );
+						marginRight ? node.setStyle( 'margin-right', marginRight ) : node.removeStyle( 'margin-right' );
+					}
+				}
+			});
 		},
 
@@ -377,36 +428,4 @@
 	} );
 })();
-
-CKEDITOR.tools.extend( CKEDITOR.config,
-	{
-		indentOffset : 40,
-		indentUnit : 'px',
-		indentClasses : null
-	});
-
-/**
- * Size of each indentation step
- * @type Number
- * @example
- * config.indentOffset = 40;
- */
-
- /**
- * Unit for the indentation style
- * @type String
- * @example
- * config.indentUnit = 'px';
- */
-
- /**
- * List of classes to use for indenting the contents.
- * @type Array
- * @example
- * // Don't use classes for indenting. (this is the default value)
- * config.indentClasses = null;
- * @example
- * // Use the classes 'Indent1', 'Indent2', 'Indent3'
- * config.indentClasses = ['Indent1', 'Indent2', 'Indent3'];
- */
 
 /**
Index: CKEditor/branches/versions/3.5.x/_source/plugins/justify/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/justify/plugin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/justify/plugin.js	(revision 6050)
@@ -26,7 +26,18 @@
 		useComputedState = useComputedState === undefined || useComputedState;
 
-		var align = useComputedState ?
-			element.getComputedStyle( 'text-align' ) :
-			element.getStyle( 'text-align' ) || element.getAttribute( 'align' ) || '';
+		var align;
+		if ( useComputedState )
+			align = element.getComputedStyle( 'text-align' );
+		else
+		{
+			while ( !element.hasAttribute || !( element.hasAttribute( 'align' ) || element.getStyle( 'text-align' ) ) )
+			{
+				var parent = element.getParent();
+				if ( !parent )
+					break;
+				element = parent;
+			}
+			align = element.getStyle( 'text-align' ) || element.getAttribute( 'align' ) || '';
+		}
 
 		align && ( align = align.replace( /-moz-|-webkit-|start|auto/i, '' ) );
@@ -69,4 +80,39 @@
 
 			this.cssClassRegex = new RegExp( '(?:^|\\s+)(?:' + classes.join( '|' ) + ')(?=$|\\s)' );
+		}
+	}
+
+	function onDirChanged( e )
+	{
+		var editor = e.editor;
+
+		var range = new CKEDITOR.dom.range( editor.document );
+		range.setStartBefore( e.data );
+		range.setEndAfter( e.data );
+
+		var walker = new CKEDITOR.dom.walker( range ),
+			node;
+
+		while ( ( node = walker.next() ) )
+		{
+			if ( node.type == CKEDITOR.NODE_ELEMENT )
+			{
+				// A child with the defined dir is to be ignored.
+				if ( !node.equals( e.data ) && node.getDirection() )
+				{
+					range.setStartAfter( node );
+					walker = new CKEDITOR.dom.walker( range );
+					continue;
+				}
+
+				// Switch the alignment.
+				var style = 'text-align';
+				var align = node.getStyle( style );
+
+				if ( align == 'left' )
+					node.setStyle( style, 'right' );
+				else if ( align == 'right' )
+					node.setStyle( style, 'left' );
+			}
 		}
 	}
@@ -168,4 +214,5 @@
 			editor.on( 'selectionChange', CKEDITOR.tools.bind( onSelectionChange, center ) );
 			editor.on( 'selectionChange', CKEDITOR.tools.bind( onSelectionChange, justify ) );
+			editor.on( 'dirChanged', onDirChanged );
 		},
 
@@ -173,7 +220,2 @@
 	});
 })();
-
-CKEDITOR.tools.extend( CKEDITOR.config,
-	{
-		justifyClasses : null
-	} );
Index: CKEditor/branches/versions/3.5.x/_source/plugins/keystrokes/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/keystrokes/plugin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/keystrokes/plugin.js	(revision 6050)
@@ -29,12 +29,8 @@
 
 		for ( var i = 0 ; i < keystrokesConfig.length ; i++ )
-		{
 			keystrokes[ keystrokesConfig[i][0] ] = keystrokesConfig[i][1];
-		}
 
 		for ( i = 0 ; i < blockedConfig.length ; i++ )
-		{
 			blockedKeystrokes[ blockedConfig[i] ] = 1;
-		}
 	}
 });
Index: CKEditor/branches/versions/3.5.x/_source/plugins/link/dialogs/link.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/link/dialogs/link.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/link/dialogs/link.js	(revision 6050)
@@ -244,7 +244,5 @@
 			var item = elements.getItem( i );
 			if ( item.getAttribute( '_cke_realelement' ) && item.getAttribute( '_cke_real_element_type' ) == 'anchor' )
-			{
 				anchors.push( editor.restoreRealElement( item ) );
-			}
 		}
 
@@ -364,6 +362,9 @@
 	}
 
+	var commonLang = editor.lang.common,
+		linkLang = editor.lang.link;
+
 	return {
-		title : editor.lang.link.title,
+		title : linkLang.title,
 		minWidth : 350,
 		minHeight : 230,
@@ -371,6 +372,6 @@
 			{
 				id : 'info',
-				label : editor.lang.link.info,
-				title : editor.lang.link.info,
+				label : linkLang.info,
+				title : linkLang.info,
 				elements :
 				[
@@ -378,11 +379,11 @@
 						id : 'linkType',
 						type : 'select',
-						label : editor.lang.link.type,
+						label : linkLang.type,
 						'default' : 'url',
 						items :
 						[
-							[ editor.lang.link.toUrl, 'url' ],
-							[ editor.lang.link.toAnchor, 'anchor' ],
-							[ editor.lang.link.toEmail, 'email' ]
+							[ linkLang.toUrl, 'url' ],
+							[ linkLang.toAnchor, 'anchor' ],
+							[ linkLang.toEmail, 'email' ]
 						],
 						onChange : linkTypeChanged,
@@ -410,5 +411,5 @@
 										id : 'protocol',
 										type : 'select',
-										label : editor.lang.common.protocol,
+										label : commonLang.protocol,
 										'default' : 'http://',
 										items :
@@ -419,5 +420,5 @@
 											[ 'ftp://\u200E', 'ftp://' ],
 											[ 'news://\u200E', 'news://' ],
-											[ editor.lang.link.other , '' ]
+											[ linkLang.other , '' ]
 										],
 										setup : function( data )
@@ -437,5 +438,5 @@
 										type : 'text',
 										id : 'url',
-										label : editor.lang.common.url,
+										label : commonLang.url,
 										required: true,
 										onLoad : function ()
@@ -478,5 +479,5 @@
 												return true;
 
-											var func = CKEDITOR.dialog.validate.notEmpty( editor.lang.link.noUrl );
+											var func = CKEDITOR.dialog.validate.notEmpty( linkLang.noUrl );
 											return func.apply( this );
 										},
@@ -514,5 +515,5 @@
 								hidden : 'true',
 								filebrowser : 'info:url',
-								label : editor.lang.common.browseServer
+								label : commonLang.browseServer
 							}
 						]
@@ -529,5 +530,5 @@
 								type : 'fieldset',
 								id : 'selectAnchorText',
-								label : editor.lang.link.selectAnchor,
+								label : linkLang.selectAnchor,
 								setup : function( data )
 								{
@@ -548,5 +549,5 @@
 												id : 'anchorName',
 												'default' : '',
-												label : editor.lang.link.anchorName,
+												label : linkLang.anchorName,
 												style : 'width: 100%;',
 												items :
@@ -583,5 +584,5 @@
 												id : 'anchorId',
 												'default' : '',
-												label : editor.lang.link.anchorId,
+												label : linkLang.anchorId,
 												style : 'width: 100%;',
 												items :
@@ -625,5 +626,5 @@
 								id : 'noAnchors',
 								style : 'text-align: center;',
-								html : '<div role="label" tabIndex="-1">' + CKEDITOR.tools.htmlEncode( editor.lang.link.noAnchors ) + '</div>',
+								html : '<div role="label" tabIndex="-1">' + CKEDITOR.tools.htmlEncode( linkLang.noAnchors ) + '</div>',
 								// Focus the first element defined in above html.
 								focus : true,
@@ -652,5 +653,5 @@
 								type : 'text',
 								id : 'emailAddress',
-								label : editor.lang.link.emailAddress,
+								label : linkLang.emailAddress,
 								required : true,
 								validate : function()
@@ -662,5 +663,5 @@
 										return true;
 
-									var func = CKEDITOR.dialog.validate.notEmpty( editor.lang.link.noEmail );
+									var func = CKEDITOR.dialog.validate.notEmpty( linkLang.noEmail );
 									return func.apply( this );
 								},
@@ -685,5 +686,5 @@
 								type : 'text',
 								id : 'emailSubject',
-								label : editor.lang.link.emailSubject,
+								label : linkLang.emailSubject,
 								setup : function( data )
 								{
@@ -702,5 +703,5 @@
 								type : 'textarea',
 								id : 'emailBody',
-								label : editor.lang.link.emailBody,
+								label : linkLang.emailBody,
 								rows : 3,
 								'default' : '',
@@ -729,6 +730,6 @@
 			{
 				id : 'target',
-				label : editor.lang.link.target,
-				title : editor.lang.link.target,
+				label : linkLang.target,
+				title : linkLang.target,
 				elements :
 				[
@@ -741,16 +742,16 @@
 								type : 'select',
 								id : 'linkTargetType',
-								label : editor.lang.common.target,
+								label : commonLang.target,
 								'default' : 'notSet',
 								style : 'width : 100%;',
 								'items' :
 								[
-									[ editor.lang.common.notSet, 'notSet' ],
-									[ editor.lang.link.targetFrame, 'frame' ],
-									[ editor.lang.link.targetPopup, 'popup' ],
-									[ editor.lang.common.targetNew, '_blank' ],
-									[ editor.lang.common.targetTop, '_top' ],
-									[ editor.lang.common.targetSelf, '_self' ],
-									[ editor.lang.common.targetParent, '_parent' ]
+									[ commonLang.notSet, 'notSet' ],
+									[ linkLang.targetFrame, 'frame' ],
+									[ linkLang.targetPopup, 'popup' ],
+									[ commonLang.targetNew, '_blank' ],
+									[ commonLang.targetTop, '_top' ],
+									[ commonLang.targetSelf, '_self' ],
+									[ commonLang.targetParent, '_parent' ]
 								],
 								onChange : targetChanged,
@@ -759,4 +760,5 @@
 									if ( data.target )
 										this.setValue( data.target.type );
+									targetChanged.call( this );
 								},
 								commit : function( data )
@@ -771,5 +773,5 @@
 								type : 'text',
 								id : 'linkTargetName',
-								label : editor.lang.link.targetFrameName,
+								label : linkLang.targetFrameName,
 								'default' : '',
 								setup : function( data )
@@ -798,5 +800,5 @@
 							{
 								type : 'fieldset',
-								label : editor.lang.link.popupFeatures,
+								label : linkLang.popupFeatures,
 								children :
 								[
@@ -808,5 +810,5 @@
 												type : 'checkbox',
 												id : 'resizable',
-												label : editor.lang.link.popupResizable,
+												label : linkLang.popupResizable,
 												setup : setupPopupParams,
 												commit : commitPopupParams
@@ -815,5 +817,5 @@
 												type : 'checkbox',
 												id : 'status',
-												label : editor.lang.link.popupStatusBar,
+												label : linkLang.popupStatusBar,
 												setup : setupPopupParams,
 												commit : commitPopupParams
@@ -829,5 +831,5 @@
 												type : 'checkbox',
 												id : 'location',
-												label : editor.lang.link.popupLocationBar,
+												label : linkLang.popupLocationBar,
 												setup : setupPopupParams,
 												commit : commitPopupParams
@@ -837,5 +839,5 @@
 												type : 'checkbox',
 												id : 'toolbar',
-												label : editor.lang.link.popupToolbar,
+												label : linkLang.popupToolbar,
 												setup : setupPopupParams,
 												commit : commitPopupParams
@@ -851,5 +853,5 @@
 												type : 'checkbox',
 												id : 'menubar',
-												label : editor.lang.link.popupMenuBar,
+												label : linkLang.popupMenuBar,
 												setup : setupPopupParams,
 												commit : commitPopupParams
@@ -859,5 +861,5 @@
 												type : 'checkbox',
 												id : 'fullscreen',
-												label : editor.lang.link.popupFullScreen,
+												label : linkLang.popupFullScreen,
 												setup : setupPopupParams,
 												commit : commitPopupParams
@@ -873,5 +875,5 @@
 												type : 'checkbox',
 												id : 'scrollbars',
-												label : editor.lang.link.popupScrollBars,
+												label : linkLang.popupScrollBars,
 												setup : setupPopupParams,
 												commit : commitPopupParams
@@ -881,5 +883,5 @@
 												type : 'checkbox',
 												id : 'dependent',
-												label : editor.lang.link.popupDependent,
+												label : linkLang.popupDependent,
 												setup : setupPopupParams,
 												commit : commitPopupParams
@@ -896,5 +898,5 @@
 												widths : [ '50%', '50%' ],
 												labelLayout : 'horizontal',
-												label : editor.lang.link.popupWidth,
+												label : linkLang.popupWidth,
 												id : 'width',
 												setup : setupPopupParams,
@@ -906,5 +908,5 @@
 												labelLayout : 'horizontal',
 												widths : [ '50%', '50%' ],
-												label : editor.lang.link.popupLeft,
+												label : linkLang.popupLeft,
 												id : 'left',
 												setup : setupPopupParams,
@@ -922,5 +924,5 @@
 												labelLayout : 'horizontal',
 												widths : [ '50%', '50%' ],
-												label : editor.lang.link.popupHeight,
+												label : linkLang.popupHeight,
 												id : 'height',
 												setup : setupPopupParams,
@@ -931,5 +933,5 @@
 												type :  'text',
 												labelLayout : 'horizontal',
-												label : editor.lang.link.popupTop,
+												label : linkLang.popupTop,
 												widths : [ '50%', '50%' ],
 												id : 'top',
@@ -948,6 +950,6 @@
 			{
 				id : 'upload',
-				label : editor.lang.link.upload,
-				title : editor.lang.link.upload,
+				label : linkLang.upload,
+				title : linkLang.upload,
 				hidden : true,
 				filebrowser : 'uploadButton',
@@ -957,5 +959,5 @@
 						type : 'file',
 						id : 'upload',
-						label : editor.lang.common.upload,
+						label : commonLang.upload,
 						style: 'height:40px',
 						size : 29
@@ -964,5 +966,5 @@
 						type : 'fileButton',
 						id : 'uploadButton',
-						label : editor.lang.common.uploadSubmit,
+						label : commonLang.uploadSubmit,
 						filebrowser : 'info:url',
 						'for' : [ 'upload', 'upload' ]
@@ -972,6 +974,6 @@
 			{
 				id : 'advanced',
-				label : editor.lang.link.advanced,
-				title : editor.lang.link.advanced,
+				label : linkLang.advanced,
+				title : linkLang.advanced,
 				elements :
 				[
@@ -989,5 +991,5 @@
 										type : 'text',
 										id : 'advId',
-										label : editor.lang.link.id,
+										label : linkLang.id,
 										setup : setupAdvParams,
 										commit : commitAdvParams
@@ -996,12 +998,12 @@
 										type : 'select',
 										id : 'advLangDir',
-										label : editor.lang.link.langDir,
+										label : linkLang.langDir,
 										'default' : '',
 										style : 'width:110px',
 										items :
 										[
-											[ editor.lang.common.notSet, '' ],
-											[ editor.lang.link.langDirLTR, 'ltr' ],
-											[ editor.lang.link.langDirRTL, 'rtl' ]
+											[ commonLang.notSet, '' ],
+											[ linkLang.langDirLTR, 'ltr' ],
+											[ linkLang.langDirRTL, 'rtl' ]
 										],
 										setup : setupAdvParams,
@@ -1012,5 +1014,5 @@
 										id : 'advAccessKey',
 										width : '80px',
-										label : editor.lang.link.acccessKey,
+										label : linkLang.acccessKey,
 										maxLength : 1,
 										setup : setupAdvParams,
@@ -1027,5 +1029,5 @@
 									{
 										type : 'text',
-										label : editor.lang.link.name,
+										label : linkLang.name,
 										id : 'advName',
 										setup : setupAdvParams,
@@ -1035,5 +1037,5 @@
 									{
 										type : 'text',
-										label : editor.lang.link.langCode,
+										label : linkLang.langCode,
 										id : 'advLangCode',
 										width : '110px',
@@ -1045,5 +1047,5 @@
 									{
 										type : 'text',
-										label : editor.lang.link.tabIndex,
+										label : linkLang.tabIndex,
 										id : 'advTabIndex',
 										width : '80px',
@@ -1069,5 +1071,5 @@
 									{
 										type : 'text',
-										label : editor.lang.link.advisoryTitle,
+										label : linkLang.advisoryTitle,
 										'default' : '',
 										id : 'advTitle',
@@ -1078,5 +1080,5 @@
 									{
 										type : 'text',
-										label : editor.lang.link.advisoryContentType,
+										label : linkLang.advisoryContentType,
 										'default' : '',
 										id : 'advContentType',
@@ -1094,5 +1096,5 @@
 									{
 										type : 'text',
-										label : editor.lang.link.cssClasses,
+										label : linkLang.cssClasses,
 										'default' : '',
 										id : 'advCSSClasses',
@@ -1103,5 +1105,5 @@
 									{
 										type : 'text',
-										label : editor.lang.link.charset,
+										label : linkLang.charset,
 										'default' : '',
 										id : 'advCharset',
@@ -1118,5 +1120,5 @@
 									{
 										type : 'text',
-										label : editor.lang.link.styles,
+										label : linkLang.styles,
 										'default' : '',
 										id : 'advStyles',
@@ -1253,4 +1255,7 @@
 					onclickList.push( featureList.join( ',' ), '\'); return false;' );
 					attributes[ '_cke_pa_onclick' ] = onclickList.join( '' );
+
+					// Add the "target" attribute. (#5074)
+					removeAttributes.push( 'target' );
 				}
 				else
@@ -1384,5 +1389,5 @@
 			var linkType = this.getContentElement( 'info', 'linkType' ),
 					urlField;
-			if ( linkType && linkType.getValue( ) == 'url' )
+			if ( linkType && linkType.getValue() == 'url' )
 			{
 				urlField = this.getContentElement( 'info', 'url' );
Index: CKEditor/branches/versions/3.5.x/_source/plugins/link/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/link/plugin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/link/plugin.js	(revision 6050)
@@ -177,8 +177,15 @@
 	getSelectedLink : function( editor )
 	{
-		var range;
 		try
 		{
-			range  = editor.getSelection().getRanges( true )[ 0 ];
+			var selection = editor.getSelection();
+			if ( selection.getType() == CKEDITOR.SELECTION_ELEMENT )
+			{
+				var selectedElement = selection.getSelectedElement();
+				if ( selectedElement.is( 'a' ) )
+					return selectedElement;
+			}
+
+			var range = selection.getRanges( true )[ 0 ];
 			range.shrink( CKEDITOR.SHRINK_TEXT );
 			var root = range.getCommonAncestor();
Index: CKEditor/branches/versions/3.5.x/_source/plugins/list/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/list/plugin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/list/plugin.js	(revision 6050)
@@ -81,5 +81,5 @@
 				currentListItem = null,
 				paragraphName = ( paragraphMode == CKEDITOR.ENTER_P ? 'p' : 'div' );
-			while ( true )
+			while ( 1 )
 			{
 				var item = listArray[ currentIndex ];
@@ -88,10 +88,10 @@
 					if ( !rootNode || listArray[ currentIndex ].parent.getName() != rootNode.getName() )
 					{
-						rootNode = listArray[ currentIndex ].parent.clone( false, true );
+						rootNode = listArray[ currentIndex ].parent.clone( false, 1 );
 						retval.append( rootNode );
 					}
-					currentListItem = rootNode.append( item.element.clone( false, true ) );
+					currentListItem = rootNode.append( item.element.clone( 0, 1 ) );
 					for ( var i = 0 ; i < item.contents.length ; i++ )
-						currentListItem.append( item.contents[i].clone( true, true ) );
+						currentListItem.append( item.contents[i].clone( 1, 1 ) );
 					currentIndex++;
 				}
@@ -109,10 +109,17 @@
 					else
 					{
-						// Create completely new blocks here, attributes are dropped.
-						if ( dir || ( paragraphMode != CKEDITOR.ENTER_BR && item.grandparent.getName() != 'td' ) )
+						// Create completely new blocks here.
+						if ( dir || item.element.hasAttributes() ||
+							( paragraphMode != CKEDITOR.ENTER_BR && item.grandparent.getName() != 'td' ) )
 						{
 							currentListItem = doc.createElement( paragraphName );
-							if ( dir )
-								currentListItem.setAttribute( 'dir', dir );
+							item.element.copyAttributes( currentListItem, { type:1, value:1 } );
+							dir && currentListItem.setAttribute( 'dir', dir );
+
+							// There might be a case where there are no attributes in the element after all
+							// (i.e. when "type" or "value" are the only attributes set). In this case, if enterMode = BR,
+							// the current item should be a fragment.
+							if ( !dir && paragraphMode == CKEDITOR.ENTER_BR && !currentListItem.hasAttributes() )
+								currentListItem = new CKEDITOR.dom.documentFragment( doc );
 						}
 						else
@@ -121,5 +128,5 @@
 
 					for ( i = 0 ; i < item.contents.length ; i++ )
-						currentListItem.append( item.contents[i].clone( true, true ) );
+						currentListItem.append( item.contents[i].clone( 1, 1 ) );
 
 					if ( currentListItem.type == CKEDITOR.NODE_DOCUMENT_FRAGMENT
@@ -269,4 +276,9 @@
 			commonParent = commonParent.getCommonAncestor( contents[i].getParent() );
 
+		var useComputedState = editor.config.useComputedState,
+			listDir, explicitDirection;
+
+		useComputedState = useComputedState === undefined || useComputedState;
+
 		// We want to insert things that are in the same tree level only, so calculate the contents again
 		// by expanding the selected blocks to the same tree level.
@@ -280,4 +292,20 @@
 				{
 					listContents.push( contentNode );
+
+					// Determine the lists's direction.
+					if ( !explicitDirection && contentNode.getDirection() )
+						explicitDirection = 1;
+
+					var itemDir = contentNode.getDirection( useComputedState );
+
+					if ( listDir !== null )
+					{
+						// If at least one LI have a different direction than current listDir, we can't have listDir.
+						if ( listDir && listDir != itemDir )
+							listDir = null;
+						else
+							listDir = itemDir;
+					}
+
 					break;
 				}
@@ -291,23 +319,27 @@
 		// Insert the list to the DOM tree.
 		var insertAnchor = listContents[ listContents.length - 1 ].getNext(),
-			listNode = doc.createElement( this.type ),
-			dir;
+			listNode = doc.createElement( this.type );
 
 		listsCreated.push( listNode );
+
+		var contentBlock, listItem;
+
 		while ( listContents.length )
 		{
-			var contentBlock = listContents.shift(),
-				listItem = doc.createElement( 'li' );
-
-			// Preserve heading structure when converting to list item. (#5271)
-			if ( headerTagRegex.test( contentBlock.getName() ) )
+			contentBlock = listContents.shift();
+			listItem = doc.createElement( 'li' );
+
+			// Preserve preformat block and heading structure when converting to list item. (#5335) (#5271)
+			if ( contentBlock.is( 'pre' ) || headerTagRegex.test( contentBlock.getName() ) )
 				contentBlock.appendTo( listItem );
 			else
 			{
-				if ( contentBlock.hasAttribute( 'dir' ) )
-				{
-					dir = dir || contentBlock.getAttribute( 'dir' );
+				// Remove DIR attribute if it was merged into list root.
+				if ( listDir && contentBlock.getDirection() )
+				{
+					contentBlock.removeStyle( 'direction' );
 					contentBlock.removeAttribute( 'dir' );
 				}
+
 				contentBlock.copyAttributes( listItem );
 				contentBlock.moveChildren( listItem );
@@ -316,12 +348,9 @@
 
 			listItem.appendTo( listNode );
-
-			// Append a bogus BR to force the LI to render at full height
-			if ( !CKEDITOR.env.ie )
-				listItem.appendBogus();
-		}
-
-		if ( dir )
-			listNode.setAttribute( 'dir', dir );
+		}
+
+		// Apply list root dir only if it has been explicitly declared.
+		if ( listDir && explicitDirection )
+			listNode.setAttribute( 'dir', listDir );
 
 		if ( insertAnchor )
@@ -425,5 +454,5 @@
 							( editor.config.enterMode == CKEDITOR.ENTER_DIV ? 'div' : 'br' ) );
 					paragraph.appendTo( body );
-					ranges = [ new CKEDITOR.dom.range( doc ) ];
+					ranges = new CKEDITOR.dom.rangeList( [ new CKEDITOR.dom.range( doc ) ] );
 					// IE exception on inserting anything when anchor inside <br>.
 					if ( paragraph.is( 'br' ) )
@@ -444,7 +473,5 @@
 					if ( enclosedNode && enclosedNode.is
 						&& this.type == enclosedNode.getName() )
-					{
-						setState.call( this, editor, CKEDITOR.TRISTATE_ON );
-					}
+							setState.call( this, editor, CKEDITOR.TRISTATE_ON );
 				}
 			}
@@ -488,5 +515,5 @@
 						pathElementsCount = pathElements.length,
 						listNode = null,
-						processedFlag = false,
+						processedFlag = 0,
 						blockLimit = path.blockLimit,
 						element;
@@ -514,5 +541,5 @@
 								CKEDITOR.dom.element.setMarker( database, element, 'list_group_object', groupObj );
 							}
-							processedFlag = true;
+							processedFlag = 1;
 							break;
 						}
@@ -567,8 +594,8 @@
 						sibling.remove();
 						// Move children order by merge direction.(#3820)
-						sibling.moveChildren( listNode, rtl ? true : false );
+						sibling.moveChildren( listNode, rtl );
 					}
 				} )();
-				mergeSibling( true );
+				mergeSibling( 1 );
 			}
 
Index: CKEditor/branches/versions/3.5.x/_source/plugins/listblock/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/listblock/plugin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/listblock/plugin.js	(revision 6050)
@@ -82,5 +82,5 @@
 					{
 						var pendingHtml = this._.pendingHtml,
-							id = 'cke_' + CKEDITOR.tools.getNextNumber();
+							id = CKEDITOR.tools.getNextId();
 
 						if ( !this._.started )
@@ -110,5 +110,5 @@
 						this._.close();
 
-						var id = 'cke_' + CKEDITOR.tools.getNextNumber();
+						var id = CKEDITOR.tools.getNextId();
 
 						this._.groups[ title ] = id;
Index: CKEditor/branches/versions/3.5.x/_source/plugins/liststyle/dialogs/liststyle.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/liststyle/dialogs/liststyle.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/liststyle/dialogs/liststyle.js	(revision 6050)
@@ -13,5 +13,5 @@
 
 		range.shrink( CKEDITOR.SHRINK_TEXT );
-		return range.getCommonAncestor().getAscendant( listTag, true );
+		return range.getCommonAncestor().getAscendant( listTag, 1 );
 	}
 
@@ -29,8 +29,9 @@
 	function listStyle( editor, startupPage )
 	{
+		var lang = editor.lang.list;
 		if ( startupPage == 'bulletedListStyle' )
 		{
 			return {
-				title : editor.lang.list.bulletedTitle,
+				title : lang.bulletedTitle,
 				minWidth : 300,
 				minHeight : 50,
@@ -44,13 +45,13 @@
 							{
 								type : 'select',
-								label : editor.lang.list.type,
+								label : lang.type,
 								id : 'type',
 								style : 'width: 150px; margin: auto;',
 								items :
 								[
-									[ editor.lang.list.notset, '' ],
-									[ editor.lang.list.circle, 'circle' ],
-									[ editor.lang.list.disc,  'disc' ],
-									[ editor.lang.list.square, 'square' ]
+									[ lang.notset, '' ],
+									[ lang.circle, 'circle' ],
+									[ lang.disc,  'disc' ],
+									[ lang.square, 'square' ]
 								],
 								setup : function( element )
@@ -96,10 +97,10 @@
 			var listStyleOptions =
 			[
-				[ editor.lang.list.notset, '' ],
-				[ editor.lang.list.lowerRoman, 'lower-roman' ],
-				[ editor.lang.list.upperRoman, 'upper-roman' ],
-				[ editor.lang.list.lowerAlpha, 'lower-alpha' ],
-				[ editor.lang.list.upperAlpha, 'upper-alpha' ],
-				[ editor.lang.list.decimal, 'decimal' ]
+				[ lang.notset, '' ],
+				[ lang.lowerRoman, 'lower-roman' ],
+				[ lang.upperRoman, 'upper-roman' ],
+				[ lang.lowerAlpha, 'lower-alpha' ],
+				[ lang.upperAlpha, 'upper-alpha' ],
+				[ lang.decimal, 'decimal' ]
 			];
 
@@ -107,13 +108,13 @@
 			{
 				listStyleOptions.concat( [
-					[ editor.lang.list.armenian, 'armenian' ],
-					[ editor.lang.list.decimalLeadingZero, 'decimal-leading-zero' ],
-					[ editor.lang.list.georgian, 'georgian' ],
-					[ editor.lang.list.lowerGreek, 'lower-greek' ]
+					[ lang.armenian, 'armenian' ],
+					[ lang.decimalLeadingZero, 'decimal-leading-zero' ],
+					[ lang.georgian, 'georgian' ],
+					[ lang.lowerGreek, 'lower-greek' ]
 				]);
 			}
 
 			return {
-				title : editor.lang.list.numberedTitle,
+				title : lang.numberedTitle,
 				minWidth : 300,
 				minHeight : 50,
@@ -131,8 +132,8 @@
 								[
 									{
-										label : editor.lang.list.start,
+										label : lang.start,
 										type : 'text',
 										id : 'start',
-										validate : CKEDITOR.dialog.validate.integer( editor.lang.list.validateStartNumber ),
+										validate : CKEDITOR.dialog.validate.integer( lang.validateStartNumber ),
 										setup : function( element )
 										{
@@ -147,5 +148,5 @@
 									{
 										type : 'select',
-										label : editor.lang.list.type,
+										label : lang.type,
 										id : 'type',
 										style : 'width: 100%;',
Index: CKEditor/branches/versions/3.5.x/_source/plugins/maximize/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/maximize/plugin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/maximize/plugin.js	(revision 6050)
@@ -11,6 +11,6 @@
 			return [];
 
-		var hijackRecord = [];
-		var hijackNames = [ 'style', 'className' ];
+		var hijackRecord = [],
+			hijackNames = [ 'style', 'className' ];
 		for ( var i = 0 ; i < hijackNames.length ; i++ )
 		{
@@ -130,10 +130,10 @@
 		{
 			var lang = editor.lang;
-			var mainDocument = CKEDITOR.document;
-			var mainWindow = mainDocument.getWindow();
+			var mainDocument = CKEDITOR.document,
+				mainWindow = mainDocument.getWindow();
 
 			// Saved selection and scroll position for the editing area.
-			var savedSelection;
-			var savedScroll;
+			var savedSelection,
+				savedScroll;
 
 			// Saved scroll position for the outer window.
@@ -195,4 +195,12 @@
 
 							// Hide scroll bars.
+							var viewPaneSize = mainWindow.getViewPaneSize();
+							var styles =
+								{
+									overflow : 'hidden',
+									width : ( CKEDITOR.env.opera ? viewPaneSize.width : 0 ) + 'px',
+									height : ( CKEDITOR.env.opera ? viewPaneSize.height - 16 : 0 ) + 'px'
+								};
+
 							if ( CKEDITOR.env.ie )
 							{
@@ -202,11 +210,10 @@
 							else
 							{
-								mainDocument.getBody().setStyles(
-									{
-										overflow : 'hidden',
-										width : '0px',
-										height : '0px'
-									} );
-							}
+								mainDocument.getBody().setStyles( styles );
+							}
+
+							// #4023: [Opera] Maximize plugin
+							if ( CKEDITOR.env.opera )
+								mainDocument.getBody().getParent().setStyles( styles );
 
 							// Scroll to the top left (IE needs some time for it - #4923).
@@ -216,5 +223,4 @@
 
 							// Resize and move to top left.
-							var viewPaneSize = mainWindow.getViewPaneSize();
 							container.setStyle( 'position', 'absolute' );
 							container.$.offsetLeft;			// SAFARI BUG: See #2066.
@@ -334,8 +340,9 @@
 				} );
 
-			// Restore the command state after mode change.
+			// Restore the command state after mode change, unless it has been changed to disabled (#6467)
 			editor.on( 'mode', function()
 				{
-					editor.getCommand( 'maximize' ).setState( savedState );
+					var command = editor.getCommand( 'maximize' );
+					command.setState( command.state == CKEDITOR.TRISTATE_DISABLED ? CKEDITOR.TRISTATE_DISABLED : savedState );
 				}, null, null, 100 );
 		}
Index: CKEditor/branches/versions/3.5.x/_source/plugins/menu/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/menu/plugin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/menu/plugin.js	(revision 6050)
@@ -279,7 +279,7 @@
 						{
 							clearTimeout( this._.showSubTimeout );
-							this._.showSubTimeout = CKEDITOR.tools.setTimeout( this._.showSubMenu, editor.config.menu_subMenuDelay, this, [ index ] );
+							this._.showSubTimeout = CKEDITOR.tools.setTimeout( this._.showSubMenu, editor.config.menu_subMenuDelay || 400, this, [ index ] );
 						},
-						this);
+						this );
 
 					this._.itemOutFn = CKEDITOR.tools.addFunction( function( index )
@@ -287,5 +287,5 @@
 							clearTimeout( this._.showSubTimeout );
 						},
-						this);
+						this );
 
 					this._.itemClickFn = CKEDITOR.tools.addFunction( function( index )
@@ -304,5 +304,5 @@
 								this._.onClick( item );
 						},
-						this);
+						this );
 				}
 
@@ -310,6 +310,6 @@
 				sortItems( items );
 
-				var chromeRoot = editor.container.getChild( 1 );
-				var mixedContentClass = chromeRoot.hasClass( 'cke_mixed_dir_content' ) ? ' cke_mixed_dir_content' : '';
+				var chromeRoot = editor.container.getChild( 1 ),
+					mixedContentClass = chromeRoot.hasClass( 'cke_mixed_dir_content' ) ? ' cke_mixed_dir_content' : '';
 
 				// Build the HTML that composes the menu and its items.
@@ -486,5 +486,4 @@
  * config.menu_subMenuDelay = 0;
  */
-CKEDITOR.config.menu_subMenuDelay = 400;
 
 /**
Index: CKEditor/branches/versions/3.5.x/_source/plugins/newpage/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/newpage/plugin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/newpage/plugin.js	(revision 6050)
@@ -20,5 +20,5 @@
 				{
 					var command = this;
-					editor.setData( editor.config.newpage_html, function()
+					editor.setData( editor.config.newpage_html || '', function()
 					{
 						// Save the undo snapshot after all document changes are affected. (#4889)
@@ -52,3 +52,2 @@
  * config.newpage_html = '&lt;p&gt;Type your text here.&lt;/p&gt;';
  */
-CKEDITOR.config.newpage_html = '';
Index: CKEditor/branches/versions/3.5.x/_source/plugins/pagebreak/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/pagebreak/plugin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/pagebreak/plugin.js	(revision 6050)
@@ -63,5 +63,11 @@
 
 							if ( childStyle && ( /page-break-after\s*:\s*always/i ).test( style ) && ( /display\s*:\s*none/i ).test( childStyle ) )
-								return editor.createFakeParserElement( element, 'cke_pagebreak', 'div' );
+							{
+								var fakeImg = editor.createFakeParserElement( element, 'cke_pagebreak', 'div' );
+								var label = editor.lang.pagebreakAlt;
+								fakeImg.attributes[ 'alt' ] = label;
+								fakeImg.attributes[ 'aria-label' ] = label;
+								return fakeImg;
+							}
 						}
 					}
@@ -78,8 +84,11 @@
 	{
 		// Create the element that represents a print break.
+		var label = editor.lang.pagebreakAlt;
 		var breakObject = CKEDITOR.dom.element.createFromHtml( '<div style="page-break-after: always;"><span style="display: none;">&nbsp;</span></div>' );
 
 		// Creates the fake image used for this element.
 		breakObject = editor.createFakeElement( breakObject, 'cke_pagebreak', 'div' );
+		breakObject.setAttribute( 'alt', label );
+		breakObject.setAttribute( 'aria-label', label );
 
 		var ranges = editor.getSelection().getRanges( true );
@@ -104,5 +113,5 @@
 			var previous = breakObject.getPrevious();
 
-			if ( CKEDITOR.dtd[ previous.getName() ].div )
+			if ( previous && CKEDITOR.dtd[ previous.getName() ].div )
 				breakObject.move( previous );
 		}
Index: CKEditor/branches/versions/3.5.x/_source/plugins/panel/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/panel/plugin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/panel/plugin.js	(revision 6050)
@@ -32,5 +32,5 @@
 		});
 
-	this.id = CKEDITOR.tools.getNextNumber();
+	this.id = CKEDITOR.tools.getNextId();
 	this.document = document;
 
@@ -74,5 +74,5 @@
 	render : function( editor, output )
 	{
-		var id = 'cke_' + this.id;
+		var id = this.id;
 
 		output.push(
@@ -131,5 +131,5 @@
 			if ( this.forceIFrame || this.css.length )
 			{
-				var iframe = this.document.getById( 'cke_' + this.id + '_frame' ),
+				var iframe = this.document.getById( this.id + '_frame' ),
 					parentDiv = iframe.getParent(),
 					dir = parentDiv.getAttribute( 'dir' ),
@@ -171,8 +171,9 @@
 				win.$.CKEDITOR = CKEDITOR;
 
-				doc.on( 'keydown', function( evt )
+				// Arrow keys for scrolling is only preventable with 'keypress' event in Opera (#4534).
+				doc.on( 'key' + ( CKEDITOR.env.opera? 'press':'down' ), function( evt )
 					{
 						var keystroke = evt.data.getKeystroke(),
-							dir = this.document.getById( 'cke_' + this.id ).getAttribute( 'dir' );
+							dir = this.document.getById( this.id ).getAttribute( 'dir' );
 
 						// Delegate key processing to block.
@@ -187,5 +188,5 @@
 						{
 							if ( this.onEscape && this.onEscape( keystroke ) === false )
-								evt.data.preventDefault( );
+								evt.data.preventDefault();
 						}
 					},
@@ -196,5 +197,5 @@
 			}
 			else
-				holder = this.document.getById( 'cke_' + this.id );
+				holder = this.document.getById( this.id );
 
 			this._.holder = holder;
@@ -226,5 +227,5 @@
 			current = this._.currentBlock,
 			holder = this.forceIFrame ?
-				this.document.getById( 'cke_' + this.id + '_frame' )
+				this.document.getById( this.id + '_frame' )
 				: this._.holder;
 
@@ -318,5 +319,5 @@
 			// Safari need focus on the iframe window first(#3389), but we need
 			// lock the blur to avoid hiding the panel.
-			if ( CKEDITOR.env.webkit )
+			if ( CKEDITOR.env.webkit || CKEDITOR.env.opera )
 				item.getDocument().getWindow().focus();
 			item.focus();
Index: CKEditor/branches/versions/3.5.x/_source/plugins/panelbutton/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/panelbutton/plugin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/panelbutton/plugin.js	(revision 6050)
@@ -114,5 +114,5 @@
 					};
 
-				panel.onHide = function()
+				panel.onHide = function( preventOnClose )
 					{
 						if ( me.className )
@@ -123,5 +123,5 @@
 						_.on = 0;
 
-						if ( me.onClose )
+						if ( !preventOnClose && me.onClose )
 							me.onClose();
 					};
Index: CKEditor/branches/versions/3.5.x/_source/plugins/pastefromword/filter/default.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/pastefromword/filter/default.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/pastefromword/filter/default.js	(revision 6050)
@@ -119,5 +119,5 @@
 	};
 
-	var cssLengthRelativeUnit = /^(\d[.\d]*)+(em|ex|px|gd|rem|vw|vh|vm|ch|mm|cm|in|pt|pc|deg|rad|ms|s|hz|khz){1}?/i;
+	var cssLengthRelativeUnit = /^([.\d]*)+(em|ex|px|gd|rem|vw|vh|vm|ch|mm|cm|in|pt|pc|deg|rad|ms|s|hz|khz){1}?/i;
 	var emptyMarginRegex = /^(?:\b0[^\s]*\s*){1,4}$/;		// e.g. 0px 0pt 0px
 
@@ -220,5 +220,5 @@
 										// Be able to deal with component/short-hand form style.
 										var values = margin.split( ' ' );
-										margin = values[ 3 ] || values[ 1 ] || values [ 0 ];
+										margin = CKEDITOR.plugins.pastefromword.utils.convertToPx( values[ 3 ] || values[ 1 ] || values [ 0 ] );
 										margin = parseInt( margin, 10 );
 
Index: CKEditor/branches/versions/3.5.x/_source/plugins/popup/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/popup/plugin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/popup/plugin.js	(revision 6050)
@@ -34,6 +34,7 @@
 
 		var top = parseInt( ( window.screen.height - height ) / 2, 10 ),
-			left = parseInt( ( window.screen.width  - width ) / 2, 10 ),
-			options = ( options || 'location=no,menubar=no,toolbar=no,dependent=yes,minimizable=no,modal=yes,alwaysRaised=yes,resizable=yes,scrollbars=yes' ) +
+			left = parseInt( ( window.screen.width  - width ) / 2, 10 );
+
+		options = ( options || 'location=no,menubar=no,toolbar=no,dependent=yes,minimizable=no,modal=yes,alwaysRaised=yes,resizable=yes,scrollbars=yes' ) +
 			',width='  + width +
 			',height=' + height +
@@ -54,5 +55,5 @@
 			popupWindow.location.href = url;
 		}
-		catch (e)
+		catch ( e )
 		{
 			popupWindow = window.open( url, null, options, true );
Index: CKEditor/branches/versions/3.5.x/_source/plugins/removeformat/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/removeformat/plugin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/removeformat/plugin.js	(revision 6050)
@@ -36,5 +36,5 @@
 
 				var filter = CKEDITOR.plugins.removeformat.filter;
-				var ranges = editor.getSelection().getRanges( true ),
+				var ranges = editor.getSelection().getRanges( 1 ),
 					iterator = ranges.createIterator(),
 					range;
@@ -51,6 +51,6 @@
 
 					// The style will be applied within the bookmark boundaries.
-					var startNode	= bookmark.startNode;
-					var endNode		= bookmark.endNode;
+					var startNode	= bookmark.startNode,
+						endNode		= bookmark.endNode;
 
 					// We need to check the selection boundaries (bookmark spans) to break
@@ -67,6 +67,6 @@
 					{
 						// Let's start checking the start boundary.
-						var path = new CKEDITOR.dom.elementPath( node );
-						var pathElements = path.elements;
+						var path = new CKEDITOR.dom.elementPath( node ),
+							pathElements = path.elements;
 
 						for ( var i = 1, pathElement ; pathElement = pathElements[ i ] ; i++ )
@@ -104,5 +104,5 @@
 							// Remove elements nodes that match with this style rules.
 							if ( tagsRegex.test( currentNode.getName() ) )
-								currentNode.remove( true );
+								currentNode.remove( 1 );
 							else
 							{
Index: CKEditor/branches/versions/3.5.x/_source/plugins/resize/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/resize/plugin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/resize/plugin.js	(revision 6050)
@@ -84,7 +84,7 @@
 					{
 						var direction = '';
-						if ( resizeHorizontal && !resizeVertical)
+						if ( resizeHorizontal && !resizeVertical )
 							direction = ' cke_resizer_horizontal';
-						if ( !resizeHorizontal && resizeVertical)
+						if ( !resizeHorizontal && resizeVertical )
 							direction = ' cke_resizer_vertical';
 
Index: CKEditor/branches/versions/3.5.x/_source/plugins/richcombo/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/richcombo/plugin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/richcombo/plugin.js	(revision 6050)
@@ -240,5 +240,5 @@
 				};
 
-			panel.onHide = function()
+			panel.onHide = function( preventOnClose )
 				{
 					if ( me.className )
@@ -249,5 +249,5 @@
 					me._.on = 0;
 
-					if ( me.onClose )
+					if ( !preventOnClose && me.onClose )
 						me.onClose();
 				};
Index: CKEditor/branches/versions/3.5.x/_source/plugins/scayt/dialogs/options.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/scayt/dialogs/options.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/scayt/dialogs/options.js	(revision 6050)
@@ -12,5 +12,5 @@
 		i,
 		contents = [],
-		userDicActive = false,
+		userDicActive = 0,
 		dic_buttons = [
 			// [0] contains buttons for creating
@@ -19,35 +19,40 @@
 			"dic_rename,dic_delete"
 		],
-		optionsIds= [ 'mixedCase','mixedWithDigits','allCaps','ignoreDomainNames' ];
+		optionsIds = [ 'mixedCase', 'mixedWithDigits', 'allCaps', 'ignoreDomainNames' ];
 
 	// common operations
 
-	function getBOMAllOptions () {
+	function getBOMAllOptions()
+	{
 		 return document.forms.optionsbar["options"];
 	}
-	function getBOMAllLangs () {
+	function getBOMAllLangs()
+	{
 		 return document.forms.languagesbar["scayt_lang"];
 	}
 
-	function setCheckedValue(radioObj, newValue) {
-		if (!radioObj)
+	function setCheckedValue( radioObj, newValue )
+	{
+		if ( !radioObj )
 			return;
 		var radioLength = radioObj.length;
-		if (radioLength == undefined) {
-			radioObj.checked = (radioObj.value == newValue.toString());
+		if ( radioLength == undefined )
+		{
+			radioObj.checked = radioObj.value == newValue.toString();
 			return;
 		}
-		for (var i = 0; i < radioLength; i++) {
+		for ( var i = 0; i < radioLength; i++ )
+		{
 			radioObj[i].checked = false;
-			if (radioObj[i].value == newValue.toString()) {
+			if ( radioObj[i].value == newValue.toString() )
 				radioObj[i].checked = true;
-			}
-		}
-	}
-
+		}
+	}
+
+	var lang = editor.lang.scayt;
 	var tags_contents =  [
 				{
 					id : 'options',
-					label : editor.lang.scayt.optionsTab,
+					label : lang.optionsTab,
 					elements : [
 						{
@@ -78,5 +83,5 @@
 				{
 					id : 'langs',
-					label : editor.lang.scayt.languagesTab,
+					label : lang.languagesTab,
 					elements : [
 						{
@@ -93,5 +98,5 @@
 				{
 					id : 'dictionaries',
-					label : editor.lang.scayt.dictionariesTab,
+					label : lang.dictionariesTab,
 					elements : [
 						{
@@ -124,5 +129,5 @@
 				{
 					id : 'about',
-					label : editor.lang.scayt.aboutTab,
+					label : lang.aboutTab,
 					elements : [
 						{
@@ -137,5 +142,5 @@
 
 	var dialogDefiniton = {
-		title : editor.lang.scayt.title,
+		title : lang.title,
 		minWidth : 360,
 		minHeight : 220,
@@ -184,8 +189,8 @@
 		{
 			var o = getBOMAllOptions();
-			for (i in o)
+			for ( var i in o )
 				o[i].checked = false;
 
-			setCheckedValue(getBOMAllLangs(),"");
+			setCheckedValue( getBOMAllLangs(), "" );
 		},
 		contents : contents
@@ -196,5 +201,5 @@
 	tags = CKEDITOR.plugins.scayt.uiTabs;
 
-	for ( i in tags )
+	for ( var i in tags )
 	{
 		if ( tags[ i ] == 1 )
@@ -202,5 +207,5 @@
 	}
 	if ( tags[2] == 1 )
-		userDicActive = true;
+		userDicActive = 1;
 
 
@@ -209,5 +214,5 @@
 		var dialog = this,
 			lang_list = dialog.data.scayt.getLangList(),
-			buttons = [ 'dic_create','dic_delete','dic_rename','dic_restore' ],
+			buttons = [ 'dic_create', 'dic_delete', 'dic_rename', 'dic_restore' ],
 			labels = optionsIds,
 			i;
@@ -283,7 +288,7 @@
 
 		var langList = [];
-		if (tags[1] ==1 )
-		{
-			for ( i in lang_list.rtl )
+		if ( tags[1] ==1 )
+		{
+			for ( var i in lang_list.rtl )
 				langList[ langList.length ] = createOption( i, lang_list.ltr );
 
@@ -315,6 +320,6 @@
 			var suc_massage = captions["succ_dic_create"];
 
-			window.scayt.createUserDictionary(dic_name,
-				function(arg)
+			window.scayt.createUserDictionary( dic_name,
+				function( arg )
 				{
 					hide_dic_buttons ( all_buttons );
@@ -323,5 +328,5 @@
 					dic_success_message (suc_massage);
 				},
-				function(arg)
+				function( arg )
 				{
 					err_massage = err_massage.replace("%s" ,arg.dname );
@@ -337,6 +342,6 @@
 			var err_massage = captions["err_dic_rename"] || "";
 			var suc_massage = captions["succ_dic_rename"] || "";
-			window.scayt.renameUserDictionary(dic_name,
-				function(arg)
+			window.scayt.renameUserDictionary( dic_name,
+				function( arg )
 					{
 						suc_massage = suc_massage.replace("%s" , arg.dname );
@@ -344,5 +349,5 @@
 						dic_success_message ( suc_massage );
 					},
-				function(arg)
+				function( arg )
 					{
 						err_massage = err_massage.replace("%s" , arg.dname  );
@@ -352,5 +357,5 @@
 		};
 
-		dic.dic_delete = function ( el, dic_name , dic_buttons )
+		dic.dic_delete = function( el, dic_name , dic_buttons )
 		{
 			var all_buttons = dic_buttons[0] + ',' + dic_buttons[1];
@@ -360,5 +365,5 @@
 			// try to delete dictionary
 			window.scayt.deleteUserDictionary(
-				function(arg)
+				function( arg )
 				{
 					suc_massage = suc_massage.replace("%s" , arg.dname );
@@ -368,5 +373,5 @@
 					dic_success_message( suc_massage );
 				},
-				function(arg)
+				function( arg )
 				{
 					err_massage = err_massage.replace("%s" , arg.dname );
@@ -375,5 +380,5 @@
 		};
 
-		dic.dic_restore = dialog.dic_restore || function ( el, dic_name , dic_buttons )
+		dic.dic_restore = dialog.dic_restore || function( el, dic_name , dic_buttons )
 			{
 				// try to restore existing dictionary
@@ -383,5 +388,5 @@
 
 				window.scayt.restoreUserDictionary(dic_name,
-					function(arg)
+					function( arg )
 					{
 						suc_massage = suc_massage.replace("%s" , arg.dname );
@@ -390,5 +395,5 @@
 						dic_success_message( suc_massage );
 					},
-					function(arg)
+					function( arg )
 					{
 						err_massage = err_massage.replace("%s" , arg.dname );
@@ -409,5 +414,7 @@
 				var id = el.getId();
 				dic[ id ].apply( null, [ el, dic_name, dic_buttons ] );
-			}catch(err){
+			}
+			catch(err)
+			{
 				dic_error_message(" Dictionary error. ");
 			}
@@ -432,5 +439,5 @@
 		var dialog = this;
 		// for enabled options tab
-		if (tags[0] == 1){
+		if ( tags[0] == 1 ){
 			var opto = getBOMAllOptions();
 
@@ -467,6 +474,6 @@
 		if ( tags[1] == 1 )
 		{
-			var domLang = doc.getById("cke_option"+dialog.sLang);
-			setCheckedValue(domLang.$,dialog.sLang);
+			var domLang = doc.getById("cke_option" + dialog.sLang);
+			setCheckedValue( domLang.$,dialog.sLang );
 		}
 
@@ -488,5 +495,5 @@
 
 				},
-				function ()
+				function()
 				{
 					doc.getById( 'dic_name' ).setValue("");
@@ -497,33 +504,27 @@
 	};
 
-	function dic_error_message ( m )
+	function dic_error_message( m )
 	{
 		doc.getById('dic_message').setHtml('<span style="color:red;">' + m + '</span>' );
 	}
-	function dic_success_message ( m )
+	function dic_success_message( m )
 	{
 		doc.getById('dic_message').setHtml('<span style="color:blue;">' + m + '</span>') ;
 	}
-	function display_dic_buttons ( sIds )
-	{
-
+	function display_dic_buttons( sIds )
+	{
 		sIds = String( sIds );
 		var aIds = sIds.split(',');
 		for ( var i=0, l = aIds.length; i < l ; i+=1)
-		{
 			doc.getById( aIds[i] ).$.style.display = "inline";
-		}
-
-	}
-	function hide_dic_buttons ( sIds )
+	}
+	function hide_dic_buttons( sIds )
 	{
 		sIds = String( sIds );
 		var aIds = sIds.split(',');
 		for ( var i = 0, l = aIds.length; i < l ; i += 1 )
-		{
 			doc.getById( aIds[i] ).$.style.display = "none";
-		}
-	}
-	function set_dic_name ( dic_name )
+	}
+	function set_dic_name( dic_name )
 	{
 		doc.getById('dic_name').$.value= dic_name;
Index: CKEditor/branches/versions/3.5.x/_source/plugins/scayt/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/scayt/plugin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/scayt/plugin.js	(revision 6050)
@@ -11,16 +11,17 @@
 (function()
 {
-	var commandName 	= 'scaytcheck',
-		openPage		= '';
+	var commandName  = 'scaytcheck',
+		openPage = '';
 
 	// Checks if a value exists in an array
-	function in_array(needle, haystack)
+	function in_array( needle, haystack )
 	{
-		var found = false, key;
-		for (key in haystack)
-		{
-			if ((haystack[key] === needle) || ( haystack[key] == needle))
-			{
-				found = true;
+		var found = 0,
+			key;
+		for ( key in haystack )
+		{
+			if ( haystack[ key ] == needle )
+			{
+				found = 1;
 				break;
 			}
@@ -35,4 +36,5 @@
 		var createInstance = function()	// Create new instance every time Document is created.
 		{
+			var config = editor.config;
 			// Initialise Scayt instance.
 			var oParams = {};
@@ -41,8 +43,8 @@
 			// syntax : AppName.AppVersion@AppRevision
 			oParams.assocApp  = 'CKEDITOR.' + CKEDITOR.version + '@' + CKEDITOR.revision;
-			oParams.customerid = editor.config.scayt_customerid  || '1:WvF0D4-UtPqN1-43nkD4-NKvUm2-daQqk3-LmNiI-z7Ysb4-mwry24-T8YrS3-Q2tpq2';
-			oParams.customDictionaryIds = editor.config.scayt_customDictionaryIds || '';
-			oParams.userDictionaryName = editor.config.scayt_userDictionaryName || '';
-			oParams.sLang = editor.config.scayt_sLang || 'en_US';
+			oParams.customerid = config.scayt_customerid  || '1:WvF0D4-UtPqN1-43nkD4-NKvUm2-daQqk3-LmNiI-z7Ysb4-mwry24-T8YrS3-Q2tpq2';
+			oParams.customDictionaryIds = config.scayt_customDictionaryIds || '';
+			oParams.userDictionaryName = config.scayt_userDictionaryName || '';
+			oParams.sLang = config.scayt_sLang || 'en_US';
 
 			// Introduce SCAYT onLoad callback. (#5632)
@@ -63,18 +65,16 @@
 			{
 				if ( plugin.getScayt( editor ) && !editor.checkDirty() )
-					setTimeout( function(){ editor.resetDirty(); } );
+					setTimeout( function(){ editor.resetDirty(); }, 0 );
 			};
 
 			var scayt_custom_params = window.scayt_custom_params;
-			if ( typeof scayt_custom_params == 'object')
+			if ( typeof scayt_custom_params == 'object' )
 			{
 				for ( var k in scayt_custom_params )
-				{
 					oParams[ k ] = scayt_custom_params[ k ];
-				}
 			}
 			// needs for restoring a specific scayt control settings
-			if ( plugin.getControlId(editor) )
-				oParams.id = plugin.getControlId(editor);
+			if ( plugin.getControlId( editor ) )
+				oParams.id = plugin.getControlId( editor );
 
 			var scayt_control = new window.scayt( oParams );
@@ -86,5 +86,5 @@
 
 			// Copy config.
-			var	lastInstance = plugin.instances[ editor.name ];
+			var lastInstance = plugin.instances[ editor.name ];
 			if ( lastInstance )
 			{
@@ -101,5 +101,5 @@
 			var fTabs  = [];
 
-			for (var i = 0,l=4; i<l; i++)
+			for ( var i = 0, l=4; i < l; i++ )
 			    fTabs.push( uiTabs[i] && plugin.uiTabs[i] );
 
@@ -133,5 +133,5 @@
 		editor.on( 'beforeCommandExec', function( ev )		// Disable SCAYT before Source command execution.
 			{
-				if ( (ev.data.name == 'source' ||  ev.data.name == 'newpage') && editor.mode == 'wysiwyg' )
+				if ( ( ev.data.name == 'source' || ev.data.name == 'newpage' ) && editor.mode == 'wysiwyg' )
 				{
 					var scayt_instance = plugin.getScayt( editor );
@@ -258,5 +258,5 @@
 		// Override Image.equals method avoid CK snapshot module to add SCAYT markup to snapshots. (#5546)
 		var undoImagePrototype = CKEDITOR.plugins.undo.Image.prototype;
-		undoImagePrototype.equals =	 CKEDITOR.tools.override( undoImagePrototype.equals, function( org )
+		undoImagePrototype.equals = CKEDITOR.tools.override( undoImagePrototype.equals, function( org )
 		{
 			return function( otherImage )
@@ -299,5 +299,5 @@
 				this.controlInfo[ editor.name ][ infoOpt ] = o[ infoOpt ];
 		},
-		isControlRestored : function ( editor )
+		isControlRestored : function( editor )
 		{
 			if ( editor &&
@@ -309,13 +309,13 @@
 			return false;
 		},
-		markControlRestore : function ( editor )
-		{
-			this.setControlInfo( editor,{ restored:true } );
-		},
-		setControlId: function (editor, id)
-		{
-			this.setControlInfo( editor,{ id:id } );
-		},
-		getControlId: function (editor)
+		markControlRestore : function( editor )
+		{
+			this.setControlInfo( editor, { restored:true } );
+		},
+		setControlId: function( editor, id )
+		{
+			this.setControlInfo( editor, { id:id } );
+		},
+		getControlId: function( editor )
 		{
 			if ( editor &&
@@ -328,9 +328,9 @@
 			return null;
 		},
-		setPaused: function ( editor , bool )
-		{
-			this.setControlInfo( editor,{ paused:bool } );
-		},
-		isPaused: function (editor)
+		setPaused: function( editor , bool )
+		{
+			this.setControlInfo( editor, { paused:bool } );
+		},
+		isPaused: function( editor )
 		{
 			if ( editor &&
@@ -338,5 +338,5 @@
 					this.controlInfo[editor.name] )
 			{
-				return this.controlInfo[editor.name].paused ;
+				return this.controlInfo[editor.name].paused;
 			}
 			return undefined;
@@ -451,4 +451,5 @@
 		preserveState : true,
 		editorFocus : false,
+		canUndo : false,
 
 		exec: function( editor )
@@ -467,5 +468,5 @@
 				//
 				// now focus is set certainly
-				scayt_control.focus( );
+				scayt_control.focus();
 				scayt_control.setDisabled( isEnabled );
 			}
@@ -493,5 +494,5 @@
 			if ( items_order && items_order.length )
 			{
-				for ( var pos in items_order )
+				for ( var pos = 0 ; pos < items_order.length ; pos++ )
 					items_order_str += 'scayt_' + items_order[ pos ] + ( items_order.length != parseInt( pos, 10 ) + 1 ? ',' : '' );
 			}
@@ -503,6 +504,6 @@
 		init : function( editor )
 		{
-			var moreSuggestions = {};
-			var mainSuggestions = {};
+			var moreSuggestions = {},
+				mainSuggestions = {};
 
 			// Scayt command.
@@ -517,7 +518,7 @@
 			confuiTabs = confuiTabs.split( ',' );
 			// check array length ! always must be 3 filled with 1 or 0
-			for (var i=0,l=3; i<l; i++)
-			{
-				var flag = parseInt(confuiTabs[i] || '1' ,10);
+			for ( var i=0, l=3; i < l; i++ )
+			{
+				var flag = parseInt( confuiTabs[i] || '1', 10 );
 				uiTabs.push( flag );
 			}
@@ -528,16 +529,18 @@
 			var uiMuneItems = {};
 
+			var lang = editor.lang.scayt;
+
 			// always added
 			uiMuneItems.scaytToggle =
 				{
-					label : editor.lang.scayt.enable,
+					label : lang.enable,
 					command : commandName,
 					group : menuGroup
 				};
 
-			if (uiTabs[0] == 1)
+			if ( uiTabs[0] == 1 )
 				uiMuneItems.scaytOptions =
 				{
-					label : editor.lang.scayt.options,
+					label : lang.options,
 					group : menuGroup,
 					onClick : function()
@@ -548,8 +551,8 @@
 				};
 
-			if (uiTabs[1] == 1)
+			if ( uiTabs[1] == 1 )
 				uiMuneItems.scaytLangs =
 				{
-					label : editor.lang.scayt.langs,
+					label : lang.langs,
 					group : menuGroup,
 					onClick : function()
@@ -559,8 +562,8 @@
 					}
 				};
-			if (uiTabs[2] == 1)
+			if ( uiTabs[2] == 1 )
 				uiMuneItems.scaytDict =
 				{
-					label : editor.lang.scayt.dictionariesTab,
+					label : lang.dictionariesTab,
 					group : menuGroup,
 					onClick : function()
@@ -580,6 +583,5 @@
 						editor.openDialog( commandName );
 					}
-				}
-			;
+				};
 
 			uiTabs[3] = 1; // about us tab is always on
@@ -590,6 +592,6 @@
 				editor.ui.add( 'Scayt', CKEDITOR.UI_MENUBUTTON,
 					{
-						label : editor.lang.scayt.title,
-						title : CKEDITOR.env.opera ? editor.lang.scayt.opera_title : editor.lang.scayt.title,
+						label : lang.title,
+						title : CKEDITOR.env.opera ? lang.opera_title : lang.title,
 						className : 'cke_button_scayt',
 						onRender: function()
@@ -605,5 +607,5 @@
 							var isEnabled = plugin.isScaytEnabled( editor );
 
-							editor.getMenuItem( 'scaytToggle' ).label = editor.lang.scayt[ isEnabled ? 'disable' : 'enable' ];
+							editor.getMenuItem( 'scaytToggle' ).label = lang[ isEnabled ? 'disable' : 'enable' ];
 
 							return {
@@ -674,5 +676,5 @@
 										exec: function()
 										{
-											scayt_control.replace(el, s);
+											scayt_control.replace( el, s );
 										}
 									};
@@ -700,5 +702,5 @@
 							editor.addMenuItem( 'scayt_moresuggest',
 							{
-								label : editor.lang.scayt.moreSuggestions,
+								label : lang.moreSuggestions,
 								group : 'scayt_moresuggest',
 								order : 10,
@@ -718,5 +720,5 @@
 								}
 							};
-							addButtonCommand( editor, 'ignore', editor.lang.scayt.ignore, 'scayt_ignore', ignore_command, 'scayt_control', 1 );
+							addButtonCommand( editor, 'ignore', lang.ignore, 'scayt_ignore', ignore_command, 'scayt_control', 1 );
 							mainSuggestions[ 'scayt_ignore' ] = CKEDITOR.TRISTATE_OFF;
 						}
@@ -729,5 +731,5 @@
 								}
 							};
-							addButtonCommand(editor, 'ignore_all', editor.lang.scayt.ignoreAll, 'scayt_ignore_all', ignore_all_command, 'scayt_control', 2);
+							addButtonCommand(editor, 'ignore_all', lang.ignoreAll, 'scayt_ignore_all', ignore_all_command, 'scayt_control', 2);
 							mainSuggestions['scayt_ignore_all'] = CKEDITOR.TRISTATE_OFF;
 						}
@@ -740,5 +742,5 @@
 								}
 							};
-							addButtonCommand(editor, 'add_word', editor.lang.scayt.addWord, 'scayt_add_word', addword_command, 'scayt_control', 3);
+							addButtonCommand(editor, 'add_word', lang.addWord, 'scayt_add_word', addword_command, 'scayt_control', 3);
 							mainSuggestions['scayt_add_word'] = CKEDITOR.TRISTATE_OFF;
 						}
Index: CKEditor/branches/versions/3.5.x/_source/plugins/selection/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/selection/plugin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/selection/plugin.js	(revision 6050)
@@ -134,5 +134,8 @@
 								if ( savedRange )
 								{
-									if ( restoreEnabled )
+									// Range restored here might invalidate the DOM structure thus break up
+									// the locked selection, give it up. (#6083)
+									var lockedSelection = doc.getCustomData( 'cke_locked_selection' );
+									if ( restoreEnabled && !lockedSelection )
 									{
 										// Well not break because of this.
@@ -152,5 +155,5 @@
 							{
 								// Enable selections to be saved.
-								saveEnabled = true;
+								saveEnabled = 1;
 
 								saveSelection();
@@ -165,5 +168,5 @@
 
 								// Disable selections from being saved.
-								saveEnabled = false;
+								saveEnabled = 0;
 								restoreEnabled = 1;
 							});
@@ -175,5 +178,10 @@
 							editor.on( 'blur', function( evt )
 							{
-								editor.document && editor.document.$.selection.empty();
+								// Try/Catch to avoid errors if the editor is hidden. (#6375)
+								try
+								{
+									editor.document && editor.document.$.selection.empty();
+								}
+								catch (e) {}
 							});
 						}
@@ -181,5 +189,5 @@
 						// Listening on document element ensures that
 						// scrollbar is included. (#5280)
-						html.on( 'mousedown', function ()
+						html.on( 'mousedown', function()
 						{
 							// Lock restore selection now, as we have
@@ -189,5 +197,5 @@
 						});
 
-						html.on( 'mouseup', function ()
+						html.on( 'mouseup', function()
 						{
 							restoreEnabled = 1;
@@ -208,15 +216,33 @@
 						}
 
+						var scroll;
 						// IE fires the "selectionchange" event when clicking
 						// inside a selection. We don't want to capture that.
-						body.on( 'mousedown', function ()
-						{
+						body.on( 'mousedown', function( evt )
+						{
+							// IE scrolls document to top on right mousedown
+							// when editor has no focus, remember this scroll
+							// position and revert it before context menu opens. (#5778)
+							if ( evt.data.$.button == 2 )
+							{
+								var sel = editor.document.$.selection;
+								if ( sel.type == 'None' )
+									scroll = editor.window.getScrollPosition();
+							}
 							disableSave();
 						});
 
 						body.on( 'mouseup',
-							function()
-							{
-								saveEnabled = true;
+							function( evt )
+							{
+								// Restore recorded scroll position when needed on right mouseup.
+								if ( evt.data.$.button == 2 && scroll )
+								{
+									editor.document.$.documentElement.scrollLeft = scroll.x;
+									editor.document.$.documentElement.scrollTop = scroll.y;
+								}
+								scroll = null;
+
+								saveEnabled = 1;
 								setTimeout( function()
 									{
@@ -230,5 +256,5 @@
 							function()
 							{
-								saveEnabled = true;
+								saveEnabled = 1;
 								saveSelection();
 							});
@@ -241,5 +267,5 @@
 						function disableSave()
 						{
-							saveEnabled = false;
+							saveEnabled = 0;
 						}
 
@@ -383,5 +409,5 @@
 
 		this.document = document;
-		this.isLocked = false;
+		this.isLocked = 0;
 		this._ =
 		{
@@ -526,5 +552,5 @@
 		 * alert(ranges.length);
 		 */
-		getRanges : (function ()
+		getRanges : (function()
 		{
 			var func = CKEDITOR.env.ie ?
@@ -638,4 +664,11 @@
 							range.setEnd( new CKEDITOR.dom.node( boundaryInfo.container ), boundaryInfo.offset );
 
+							// Correct an invalid IE range case on empty list item. (#5850)
+							if ( range.endContainer.getPosition( range.startContainer ) & CKEDITOR.POSITION_PRECEDING
+									&& range.endOffset <= range.startContainer.getIndex() )
+							{
+								range.collapse();
+							}
+
 							return [ range ];
 						}
@@ -674,14 +707,27 @@
 					// instances.
 
-					var ranges = [];
-					var sel = this.getNative();
+					var ranges = [],
+						range,
+						doc = this.document,
+						sel = this.getNative();
 
 					if ( !sel )
-						return [];
+						return ranges;
+
+					// On WebKit, it may happen that we'll have no selection
+					// available. We normalize it here by replicating the
+					// behavior of other browsers.
+					if ( !sel.rangeCount )
+					{
+						range = new CKEDITOR.dom.range( doc );
+						range.moveToElementEditStart( doc.getBody() );
+						ranges.push( range );
+					}
 
 					for ( var i = 0 ; i < sel.rangeCount ; i++ )
 					{
 						var nativeRange = sel.getRangeAt( i );
-						var range = new CKEDITOR.dom.range( this.document );
+
+						range = new CKEDITOR.dom.range( doc );
 
 						range.setStart( new CKEDITOR.dom.node( nativeRange.startContainer ), nativeRange.startOffset );
@@ -710,5 +756,5 @@
 						// Drop range spans inside one ready-only node.
 						var parent = range.getCommonAncestor();
-						if ( parent.isReadOnly())
+						if ( parent.isReadOnly() )
 							ranges.splice( i, 1 );
 
@@ -820,5 +866,5 @@
 							// selected node on the start which doesn't have
 							// visual impact. ( #3231 )
-							while ( true )
+							while ( 1 )
 							{
 								var startContainer = range.startContainer,
@@ -840,30 +886,23 @@
 
 							if ( !node || node.type != CKEDITOR.NODE_ELEMENT )
-								return range.startContainer;
-
-							var child = node.getFirst();
-							while (  child && child.type == CKEDITOR.NODE_ELEMENT )
-							{
-								node = child;
-								child = child.getFirst();
+								node = range.startContainer;
+							else
+							{
+								var child = node.getFirst();
+								while (  child && child.type == CKEDITOR.NODE_ELEMENT )
+								{
+									node = child;
+									child = child.getFirst();
+								}
 							}
-
-							return node;
-						}
-					}
-
-					if ( CKEDITOR.env.ie )
-					{
-						range = sel.createRange();
-						range.collapse( true );
-
-						node = range.parentElement();
-					}
-					else
-					{
-						node = sel.anchorNode;
-
-						if ( node && node.nodeType != 1 )
-							node = node.parentNode;
+						}
+						else
+						{
+							node = range.startContainer;
+							if ( node.type != CKEDITOR.NODE_ELEMENT )
+								node = node.getParent();
+						}
+
+						node = node.$;
 					}
 			}
@@ -929,5 +968,5 @@
 			this._.cache.nativeSel = {};
 
-			this.isLocked = true;
+			this.isLocked = 1;
 
 			// Save this selection inside the DOM document.
@@ -949,5 +988,5 @@
 						ranges = !selectedElement && lockedSelection.getRanges();
 
-					this.isLocked = false;
+					this.isLocked = 0;
 					this.reset();
 
@@ -963,5 +1002,5 @@
 			if  ( !lockedSelection || !restore )
 			{
-				this.isLocked = false;
+				this.isLocked = 0;
 				this.reset();
 			}
@@ -1004,5 +1043,5 @@
 					range.select();
 				}
-				catch(e)
+				catch( e )
 				{
 					// If failed, select it as a text range.
@@ -1104,6 +1143,8 @@
 					// element, we must add something to it otherwise the caret
 					// will not be visible.
+					// In Opera instead, the selection will be moved out of the
+					// element. (#4657)
 					if ( range.collapsed &&
-						( CKEDITOR.env.gecko && CKEDITOR.env.version < 10900 ) &&
+						( CKEDITOR.env.opera || ( CKEDITOR.env.gecko && CKEDITOR.env.version < 10900 ) ) &&
 						startContainer.type == CKEDITOR.NODE_ELEMENT &&
 						!startContainer.getChildCount() )
Index: CKEditor/branches/versions/3.5.x/_source/plugins/showblocks/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/showblocks/plugin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/showblocks/plugin.js	(revision 6050)
@@ -25,7 +25,8 @@
 		'{'+
 			'background-repeat: no-repeat;'+
+			'background-position: top %3;'+
 			'border: 1px dotted gray;'+
 			'padding-top: 8px;'+
-			'padding-left: 8px;'+
+			'padding-%3: 8px;'+
 		'}'+
 
@@ -85,5 +86,5 @@
 		'}';
 
-	var cssTemplateRegex = /%1/g, cssClassRegex = /%2/g;
+	var cssTemplateRegex = /%1/g, cssClassRegex = /%2/g, backgroundPositionRegex = /%3/g;
 
 	var commandDefinition =
@@ -119,5 +120,6 @@
 			editor.addCss( cssTemplate
 				.replace( cssTemplateRegex, 'background-image: url(' + CKEDITOR.getUrl( this.path ) + 'images/block_' )
-				.replace( cssClassRegex, 'cke_show_blocks ' ) );
+				.replace( cssClassRegex, 'cke_show_blocks ' )
+				.replace( backgroundPositionRegex, editor.lang.dir == 'rtl' ? 'right' : 'left' ) );
 
 			editor.ui.addButton( 'ShowBlocks',
@@ -152,3 +154,2 @@
  * config.startupOutlineBlocks = true;
  */
-CKEDITOR.config.startupOutlineBlocks = false;
Index: CKEditor/branches/versions/3.5.x/_source/plugins/smiley/dialogs/smiley.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/smiley/dialogs/smiley.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/smiley/dialogs/smiley.js	(revision 6050)
@@ -37,5 +37,7 @@
 					_cke_saved_src : src,
 					title : title,
-					alt : title
+					alt : title,
+					width : target.$.width,
+					height : target.$.height
 				}
 			});
@@ -53,6 +55,6 @@
 		var relative, nodeToMove;
 
-		var keystroke = ev.getKeystroke();
-		var rtl = editor.lang.dir == 'rtl';
+		var keystroke = ev.getKeystroke(),
+			rtl = editor.lang.dir == 'rtl';
 		switch ( keystroke )
 		{
Index: CKEditor/branches/versions/3.5.x/_source/plugins/sourcearea/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/sourcearea/plugin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/sourcearea/plugin.js	(revision 6050)
@@ -73,10 +73,10 @@
 								setTimeout( onResize, 0 );
 							}
-							else
-							{
-								// By some yet unknown reason, we must stop the
-								// mousedown propagation for the textarea,
-								// otherwise it's not possible to place the caret
-								// inside of it (non IE).
+							// As we prevent click to put focus on editor container,
+							// while 'mousedown' inside <textarea> is also captured,
+							// but we must stop the even propagation, otherwise
+							// it's not possible to place the caret inside of it (non IE and IE9).
+							if ( document.addEventListener )
+							{
 								textarea.on( 'mousedown', function( evt )
 									{
Index: CKEditor/branches/versions/3.5.x/_source/plugins/specialchar/dialogs/specialchar.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/specialchar/dialogs/specialchar.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/specialchar/dialogs/specialchar.js	(revision 6050)
@@ -113,6 +113,6 @@
 		var element = ev.getTarget();
 		var relative, nodeToMove;
-		var keystroke = ev.getKeystroke();
-		var rtl = editor.lang.dir == 'rtl';
+		var keystroke = ev.getKeystroke(),
+			rtl = editor.lang.dir == 'rtl';
 
 		switch ( keystroke )
@@ -348,9 +348,9 @@
 								{
 									var firstChar = this.getElement().getElementsByTag( 'a' ).getItem( 0 );
-									setTimeout(function()
+									setTimeout( function()
 									{
 										firstChar.focus();
 										onFocus( null, firstChar );
-									});
+									}, 0 );
 								},
 								onShow : function()
@@ -361,5 +361,5 @@
 											firstChar.focus();
 											onFocus( null, firstChar );
-										});
+										}, 0 );
 								},
 								onLoad : function( event )
Index: CKEditor/branches/versions/3.5.x/_source/plugins/styles/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/styles/plugin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/styles/plugin.js	(revision 6050)
@@ -138,4 +138,6 @@
 						this.type == CKEDITOR.STYLE_INLINE ?
 							removeInlineStyle
+						: this.type == CKEDITOR.STYLE_OBJECT ?
+							removeObjectStyle
 						: null ).call( this, range );
 		},
@@ -477,8 +479,20 @@
 			{
 				// Build the style element, based on the style object definition.
-				var styleNode = getElement( this, document );
+				var styleNode = getElement( this, document ),
+					styleHasAttrs = styleNode.hasAttributes();
 
 				// Get the element that holds the entire range.
 				var parent = styleRange.getCommonAncestor();
+
+				var removeList = {
+					styles : {},
+					attrs : {},
+					// Styles cannot be removed.
+					blockedStyles : {},
+					// Attrs cannot be removed.
+					blockedAttrs : {}
+				};
+
+				var attName, styleName, value;
 
 				// Loop through the parents, removing the redundant attributes
@@ -488,20 +502,24 @@
 					if ( parent.getName() == elementName )
 					{
-						for ( var attName in def.attributes )
+						for ( attName in def.attributes )
 						{
-							if ( styleNode.getAttribute( attName ) == parent.getAttribute( attName ) )
-								styleNode.removeAttribute( attName );
+							if ( removeList.blockedAttrs[ attName ] || !( value = parent.getAttribute( styleName ) ) )
+								continue;
+
+							if ( styleNode.getAttribute( attName ) == value )
+								removeList.attrs[ attName ] = 1;
+							else
+								removeList.blockedAttrs[ attName ] = 1;
 						}
 
-						for ( var styleName in def.styles )
+						for ( styleName in def.styles )
 						{
-							if ( styleNode.getStyle( styleName ) == parent.getStyle( styleName ) )
-								styleNode.removeStyle( styleName );
-						}
-
-						if ( !styleNode.hasAttributes() )
-						{
-							styleNode = null;
-							break;
+							if ( removeList.blockedStyles[ styleName ] || !( value = parent.getStyle( styleName ) ) )
+								continue;
+
+							if ( styleNode.getStyle( styleName ) == value )
+								removeList.styles[ styleName ] = 1;
+							else
+								removeList.blockedStyles[ styleName ] = 1;
 						}
 					}
@@ -509,4 +527,13 @@
 					parent = parent.getParent();
 				}
+
+				for ( attName in removeList.attrs )
+					styleNode.removeAttribute( attName );
+
+				for ( styleName in removeList.styles )
+					styleNode.removeStyle( styleName );
+
+				if ( styleHasAttrs && !styleNode.hasAttributes() )
+					styleNode = null;
 
 				if ( styleNode )
@@ -534,4 +561,13 @@
 					if ( !CKEDITOR.env.ie )
 						styleNode.$.normalize();
+				}
+				// Style already inherit from parents, left just to clear up any internal overrides. (#5931)
+				else
+				{
+					styleNode = new CKEDITOR.dom.element( 'span' );
+					styleRange.extractContents().appendTo( styleNode );
+					styleRange.insertNode( styleNode );
+					removeFromInsideElement( this, styleNode );
+					styleNode.remove( true );
 				}
 
@@ -720,4 +756,39 @@
 	}
 
+	function removeObjectStyle( range )
+	{
+		var root = range.getCommonAncestor( true, true ),
+				element = root.getAscendant( this.element, true );
+
+		if ( !element )
+			return;
+
+		var style = this;
+		var def = style._.definition;
+		var attributes = def.attributes;
+		var styles = CKEDITOR.style.getStyleText( def );
+
+		// Remove all defined attributes.
+		if ( attributes )
+		{
+			for ( var att in attributes )
+			{
+				element.removeAttribute( att, attributes[ att ] );
+			}
+		}
+
+		// Assign all defined styles.
+		if ( def.styles )
+		{
+			for ( var i in def.styles )
+			{
+				if ( !def.styles.hasOwnProperty( i ) )
+					continue;
+
+				element.removeStyle( i );
+			}
+		}
+	}
+
 	function applyBlockStyle( range )
 	{
@@ -739,5 +810,5 @@
 		while ( ( block = iterator.getNextParagraph() ) )		// Only one =
 		{
-			var newBlock = getElement( this, doc );
+			var newBlock = getElement( this, doc, block );
 			replaceBlock( block, newBlock );
 		}
@@ -1047,5 +1118,5 @@
 	}
 
-	function getElement( style, targetDocument )
+	function getElement( style, targetDocument, element )
 	{
 		var el;
@@ -1062,4 +1133,8 @@
 		el = new CKEDITOR.dom.element( elementName, targetDocument );
 
+		// #6226: attributes should be copied before the new ones are applied
+		if ( element )
+			element.copyAttributes( el );
+
 		return setupElement( el, style );
 	}
@@ -1081,5 +1156,5 @@
 
 		// Assign all defined styles.
-		if ( styles )
+		if( styles )
 			el.setAttribute( 'style', styles );
 
@@ -1232,5 +1307,9 @@
 		return styleText.replace( /\s*([;:])\s*/, '$1' )
 							 .replace( /([^\s;])$/, '$1;')
-							 .replace( /,\s+/g, ',' ) // Trimming spaces after comma (e.g. font-family name)(#4107).
+				 			// Trimming spaces after comma(#4107),
+				 			// remove quotations(#6403),
+				 			// mostly for differences on "font-family".
+							 .replace( /,\s+/g, ',' )
+							 .replace( /\"/g,'' )
 							 .toLowerCase();
 	}
@@ -1276,6 +1355,6 @@
 		var selection = document.getSelection(),
 			// Bookmark the range so we can re-select it after processing.
-			bookmarks = selection.createBookmarks(),
-			ranges = selection.getRanges( true ),
+			bookmarks = selection.createBookmarks( 1 ),
+			ranges = selection.getRanges( 1 ),
 			func = remove ? this.removeFromRange : this.applyToRange,
 			range;
@@ -1288,5 +1367,5 @@
 		{
 			selection.selectRanges( ranges );
-			bookmarks[0].startNode.remove();
+			document.getById( bookmarks[ 0 ].startNode ).remove();
 		}
 		else
Index: CKEditor/branches/versions/3.5.x/_source/plugins/stylescombo/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/stylescombo/plugin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/stylescombo/plugin.js	(revision 6050)
@@ -27,5 +27,5 @@
 
 						// Put all styles into an Array.
-						for ( var i = 0 ; i < stylesDefinitions.length ; i++ )
+						for ( var i = 0, count = stylesDefinitions.length ; i < count ; i++ )
 						{
 							var styleDefinition = stylesDefinitions[ i ];
@@ -72,5 +72,5 @@
 								// combo.
 								var lastType;
-								for ( var i = 0 ; i < stylesList.length ; i++ )
+								for ( var i = 0, count = stylesList.length ; i < count ; i++ )
 								{
 									style = stylesList[ i ];
@@ -109,4 +109,6 @@
 						if ( style.type == CKEDITOR.STYLE_INLINE && style.checkActive( elementPath ) )
 							style.remove( editor.document );
+						else if ( style.type == CKEDITOR.STYLE_OBJECT && style.checkActive( elementPath ) )
+							style.remove( editor.document );
 						else
 							style.apply( editor.document );
@@ -125,5 +127,5 @@
 
 								// For each element into the elements path.
-								for ( var i = 0, element ; i < elements.length ; i++ )
+								for ( var i = 0, count = elements.length, element ; i < count ; i++ )
 								{
 									element = elements[i];
@@ -153,7 +155,6 @@
 							editor.focus();
 
-						var selection = editor.getSelection();
-
-						var element = selection.getSelectedElement(),
+						var selection = editor.getSelection(),
+							element = selection.getSelectedElement(),
 							elementPath = new CKEDITOR.dom.elementPath( element || selection.getStartElement() );
 
Index: CKEditor/branches/versions/3.5.x/_source/plugins/tab/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/tab/plugin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/tab/plugin.js	(revision 6050)
@@ -39,6 +39,6 @@
 				{
 					var sel = editor.getSelection(),
-							ancestor = sel.getCommonAncestor(),
-							cell;
+						ancestor = sel.getCommonAncestor(),
+						cell;
 
 					if ( ( cell = ( ancestor.getAscendant( 'td', true ) || ancestor.getAscendant( 'th', true ) ) ) )
Index: CKEditor/branches/versions/3.5.x/_source/plugins/table/dialogs/table.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/table/dialogs/table.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/table/dialogs/table.js	(revision 6050)
@@ -120,5 +120,5 @@
 				{
 					var selection = editor.getSelection(),
-						bms = editor.getSelection().createBookmarks();
+						bms = selection.createBookmarks();
 				}
 
@@ -167,5 +167,6 @@
 						{
 							var th = theRow.getChild( i );
-							if ( th.type == CKEDITOR.NODE_ELEMENT )
+							// Skip bookmark nodes. (#6155)
+							if ( th.type == CKEDITOR.NODE_ELEMENT && !th.hasAttribute( '_cke_bookmark' ) )
 							{
 								th.renameNode( 'th' );
@@ -604,6 +605,5 @@
 										{
 											var caption = nodeList.getItem( 0 );
-											caption = ( caption.getChild( 0 ) && caption.getChild( 0 ).getText() ) || '';
-											caption = CKEDITOR.tools.trim( caption );
+											caption = CKEDITOR.tools.trim( caption.getText() );
 											this.setValue( caption );
 										}
Index: CKEditor/branches/versions/3.5.x/_source/plugins/table/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/table/plugin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/table/plugin.js	(revision 6050)
@@ -59,8 +59,8 @@
 			editor.contextMenu.addListener( function( element, selection )
 				{
-					if ( !element || element.isReadOnly())
+					if ( !element || element.isReadOnly() )
 						return null;
 
-					var isTable	= element.is( 'table' ) || element.hasAscendant( 'table' );
+					var isTable = element.hasAscendant( 'table', 1 );
 
 					if ( isTable )
Index: CKEditor/branches/versions/3.5.x/_source/plugins/tableresize/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/tableresize/plugin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/tableresize/plugin.js	(revision 6050)
@@ -394,5 +394,5 @@
 		}
 
-		target.getAscendant( 'table', true ).removeCustomData( '_cke_table_pillars' );
+		target.getAscendant( 'table', 1 ).removeCustomData( '_cke_table_pillars' );
 		evt.removeListener();
 	}
@@ -424,8 +424,8 @@
 							pillars;
 
-						if ( !target.is( 'table' ) && !target.getAscendant( 'tbody', true ) )
+						if ( !target.is( 'table' ) && !target.getAscendant( 'tbody', 1 ) )
 							return;
 
-						table = target.getAscendant( 'table', true );
+						table = target.getAscendant( 'table', 1 );
 
 						if ( !( pillars = table.getCustomData( '_cke_table_pillars' ) ) )
Index: CKEditor/branches/versions/3.5.x/_source/plugins/tabletools/dialogs/tableCell.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/tabletools/dialogs/tableCell.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/tabletools/dialogs/tableCell.js	(revision 6050)
@@ -26,9 +26,11 @@
 			{
 				releaseHandlers( this );
-				callback( this );
+				callback( this, this._.parentDialog );
+				this._.parentDialog.changeFocus( true );
 			};
 			var onCancel = function()
 			{
 				releaseHandlers( this );
+				this._.parentDialog.changeFocus();
 			};
 			var releaseHandlers = function( dialog )
@@ -523,4 +525,11 @@
 
 				selection.selectBookmarks( bookmarks );
+
+				// Force selectionChange event because of alignment style.
+				var firstElement = selection.getStartElement();
+				var currentPath = new CKEDITOR.dom.elementPath( firstElement );
+
+				this._.editor._.selectionPreviousPath = currentPath;
+				this._.editor.fire( 'selectionChange', { selection : selection, path : currentPath, element : firstElement } );
 			}
 		};
Index: CKEditor/branches/versions/3.5.x/_source/plugins/tabletools/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/tabletools/plugin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/tabletools/plugin.js	(revision 6050)
@@ -147,12 +147,12 @@
 
 		// Create a clone of the row.
-		var newRow = row.clone( true );
-
-		// Insert the new row before of it.
-		newRow.insertBefore( row );
-
-		// Clean one of the rows to produce the illusion of inserting an empty row
-		// before or after.
-		clearRow( insertBefore ? newRow.$ : row.$ );
+		var newRow = row.clone( 1 );
+
+		insertBefore ?
+			newRow.insertBefore( row ) :
+			newRow.insertAfter( row );
+
+		// Clean the new row.
+		clearRow( newRow.$ );
 	}
 
@@ -217,5 +217,5 @@
 		// Get the cell where the selection is placed in.
 		var startElement = selection.getStartElement();
-		var cell = startElement.getAscendant( 'td', true ) || startElement.getAscendant( 'th', true );
+		var cell = startElement.getAscendant( 'td', 1 ) || startElement.getAscendant( 'th', 1 );
 
 		if ( !cell )
@@ -235,5 +235,5 @@
 				continue;
 
-			cell = ( new CKEDITOR.dom.element( $row.cells[ cellIndex ] ) ).clone( false );
+			cell = ( new CKEDITOR.dom.element( $row.cells[ cellIndex ] ) ).clone( 0 );
 
 			if ( !CKEDITOR.env.ie )
@@ -340,5 +340,5 @@
 	{
 		var startElement = selection.getStartElement();
-		var cell = startElement.getAscendant( 'td', true ) || startElement.getAscendant( 'th', true );
+		var cell = startElement.getAscendant( 'td', 1 ) || startElement.getAscendant( 'th', 1 );
 
 		if ( !cell )
@@ -715,7 +715,7 @@
 					exec : function( editor )
 					{
-						var selection = editor.getSelection();
-						var startElement = selection && selection.getStartElement();
-						var table = startElement && startElement.getAscendant( 'table', true );
+						var selection = editor.getSelection(),
+							startElement = selection && selection.getStartElement(),
+							table = startElement && startElement.getAscendant( 'table', 1 );
 
 						if ( !table )
@@ -728,7 +728,7 @@
 						selection.selectRanges( [ range ] );
 
-						// If the table's parent has only one child, remove it,except body,as well.( #5416 )
+						// If the table's parent has only one child remove it as well (unless it's the body or a table cell) (#5416, #6289)
 						var parent = table.getParent();
-						if ( parent.getChildCount() == 1 && parent.getName() != 'body' )
+						if ( parent.getChildCount() == 1 && !parent.is( 'body', 'td', 'th' ) )
 							parent.remove();
 						else
Index: CKEditor/branches/versions/3.5.x/_source/plugins/templates/dialogs/templates.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/templates/dialogs/templates.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/templates/dialogs/templates.js	(revision 6050)
@@ -16,5 +16,5 @@
 				container.setHtml( '' );
 
-				for ( var i = 0 ; i < templatesDefinitions.length ; i++ )
+				for ( var i = 0, totalDefs = templatesDefinitions.length ; i < totalDefs ; i++ )
 				{
 					var definition = CKEDITOR.getTemplates( templatesDefinitions[ i ] ),
@@ -45,5 +45,5 @@
 
 				if ( template.image && imagesPath )
-					html += '<td class="cke_tpl_preview_img"><img src="' + CKEDITOR.getUrl( imagesPath + template.image ) + '"' + ( CKEDITOR.env.ie6Compat? ' onload="this.width=this.width"' : '' ) + ' alt="" title=""></td>';
+					html += '<td class="cke_tpl_preview_img"><img src="' + CKEDITOR.getUrl( imagesPath + template.image ) + '"' + ( CKEDITOR.env.ie6Compat ? ' onload="this.width=this.width"' : '' ) + ' alt="" title=""></td>';
 
 				html += '<td style="white-space:normal;"><span class="cke_tpl_title">' + template.title + '</span><br/>';
@@ -81,10 +81,10 @@
 						var range = new CKEDITOR.dom.range( editor.document );
 						range.moveToElementEditStart( editor.document.getBody() );
-						range.select( true );
-						setTimeout( function ()
+						range.select( 1 );
+						setTimeout( function()
 						{
 							editor.fire( 'saveSnapshot' );
 						}, 0 );
-					} );
+					});
 
 					editor.fire( 'saveSnapshot' );
@@ -147,5 +147,7 @@
 			var listContainer;
 
-			var templateListLabelId = 'cke_tpl_list_label_' + CKEDITOR.tools.getNextNumber();
+			var templateListLabelId = 'cke_tpl_list_label_' + CKEDITOR.tools.getNextNumber(),
+				lang = editor.lang.templates,
+				config = editor.config;
 			return {
 				title :editor.lang.templates.title,
@@ -158,5 +160,5 @@
 					{
 						id :'selectTpl',
-						label : editor.lang.templates.title,
+						label : lang.title,
 						elements :
 						[
@@ -170,9 +172,9 @@
 										html :
 											'<span>'  +
-												editor.lang.templates.selectPromptMsg +
+												lang.selectPromptMsg +
 											'</span>'
 									},
 									{
-										id : "templatesList",
+										id : 'templatesList',
 										type : 'html',
 										focus: true,
@@ -181,11 +183,11 @@
 												'<div class="cke_tpl_loading"><span></span></div>' +
 											'</div>' +
-											'<span class="cke_voice_label" id="' + templateListLabelId + '">' + editor.lang.templates.options+ '</span>'
+											'<span class="cke_voice_label" id="' + templateListLabelId + '">' + lang.options+ '</span>'
 									},
 									{
 										id : 'chkInsertOpt',
 										type : 'checkbox',
-										label : editor.lang.templates.insertOption,
-										'default' : editor.config.templates_replaceContent
+										label : lang.insertOption,
+										'default' : config.templates_replaceContent
 									}
 								]
@@ -202,7 +204,7 @@
 					listContainer = templatesListField.getElement();
 
-					CKEDITOR.loadTemplates( editor.config.templates_files, function()
-						{
-							var templates = editor.config.templates.split( ',' );
+					CKEDITOR.loadTemplates( config.templates_files, function()
+						{
+							var templates = ( config.templates || 'default' ).split( ',' );
 
 							if ( templates.length )
@@ -215,5 +217,5 @@
 								listContainer.setHtml(
 									'<div class="cke_tpl_empty">' +
-										'<span>' + editor.lang.templates.emptyListMsg + '</span>' +
+										'<span>' + lang.emptyListMsg + '</span>' +
 									'</div>' );
 							}
@@ -223,5 +225,5 @@
 				},
 
-				onHide : function ()
+				onHide : function()
 				{
 					this._.element.removeListener( 'keydown', keyNavigation );
Index: CKEditor/branches/versions/3.5.x/_source/plugins/templates/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/templates/plugin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/templates/plugin.js	(revision 6050)
@@ -43,5 +43,5 @@
 
 		// Look for pending template files to get loaded.
-		for ( var i = 0 ; i < templateFiles.length ; i++ )
+		for ( var i = 0, count = templateFiles.length ; i < count ; i++ )
 		{
 			if ( !loadedTemplatesFiles[ templateFiles[ i ] ] )
@@ -52,5 +52,5 @@
 		}
 
-		if ( toLoad.length > 0 )
+		if ( toLoad.length )
 			CKEDITOR.scriptLoader.load( toLoad, callback );
 		else
@@ -69,5 +69,4 @@
  * config.templates = 'my_templates';
  */
-CKEDITOR.config.templates = 'default';
 
 /**
Index: CKEditor/branches/versions/3.5.x/_source/plugins/toolbar/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/toolbar/plugin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/toolbar/plugin.js	(revision 6050)
@@ -158,5 +158,5 @@
 						editor.toolbox = new toolbox();
 
-						var labelId = 'cke_' + CKEDITOR.tools.getNextNumber();
+						var labelId = CKEDITOR.tools.getNextId();
 
 						var output = [ '<div class="cke_toolbox" role="toolbar" aria-labelledby="', labelId, '"' ],
@@ -188,5 +188,5 @@
 								continue;
 
-							var toolbarId = 'cke_' + CKEDITOR.tools.getNextNumber(),
+							var toolbarId = CKEDITOR.tools.getNextId(),
 								toolbarObj = { id : toolbarId, items : [] };
 
@@ -284,11 +284,11 @@
 								{
 									editor.execCommand( 'toolbarCollapse' );
-								} );
+								});
 
 							editor.on( 'destroy', function () {
 									CKEDITOR.tools.removeFunction( collapserFn );
-								} );
-
-							var collapserId = 'cke_' + CKEDITOR.tools.getNextNumber();
+								});
+
+							var collapserId = CKEDITOR.tools.getNextId();
 
 							editor.addCommand( 'toolbarCollapse',
@@ -296,11 +296,11 @@
 									exec : function( editor )
 									{
-										var collapser = CKEDITOR.document.getById( collapserId );
-										var toolbox = collapser.getPrevious();
-										var contents = editor.getThemeSpace( 'contents' );
-										var toolboxContainer = toolbox.getParent();
-										var contentHeight = parseInt( contents.$.style.height, 10 );
-										var previousHeight = toolboxContainer.$.offsetHeight;
-										var collapsed = !toolbox.isVisible();
+										var collapser = CKEDITOR.document.getById( collapserId ),
+											toolbox = collapser.getPrevious(),
+											contents = editor.getThemeSpace( 'contents' ),
+											toolboxContainer = toolbox.getParent(),
+											contentHeight = parseInt( contents.$.style.height, 10 ),
+											previousHeight = toolboxContainer.$.offsetHeight,
+											collapsed = !toolbox.isVisible();
 
 										if ( !collapsed )
Index: CKEditor/branches/versions/3.5.x/_source/plugins/uicolor/lang/he.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/uicolor/lang/he.js	(revision 6050)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/uicolor/lang/he.js	(revision 6050)
@@ -0,0 +1,15 @@
+﻿/*
+Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang( 'uicolor', 'he',
+{
+	uicolor :
+	{
+		title : 'בחירת צבע ממשק משתמש',
+		preview : 'תצוגה מקדימה',
+		config : 'הדבק את הטקסט הבא לתוך הקובץ config.js',
+		predefined : 'קבוצות צבעים מוגדרות מראש'
+	}
+});
Index: CKEditor/branches/versions/3.5.x/_source/plugins/uicolor/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/uicolor/plugin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/uicolor/plugin.js	(revision 6050)
@@ -7,5 +7,5 @@
 {
 	requires : [ 'dialog' ],
-	lang : [ 'en' ],
+	lang : [ 'en', 'he' ],
 
 	init : function( editor )
Index: CKEditor/branches/versions/3.5.x/_source/plugins/undo/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/undo/plugin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/undo/plugin.js	(revision 6050)
@@ -134,5 +134,5 @@
 			{
 				if ( undoManager.currentImage && new Image( editor ).equals( undoManager.currentImage ) )
-					setTimeout( function () { undoManager.update(); }, 0 );
+					setTimeout( function() { undoManager.update(); }, 0 );
 			});
 		}
@@ -340,5 +340,5 @@
 			this.index = -1;
 
-			this.limit = this.editor.config.undoStackSize;
+			this.limit = this.editor.config.undoStackSize || 20;
 
 			this.currentImage = null;
@@ -546,5 +546,4 @@
  * config.undoStackSize = 50;
  */
-CKEDITOR.config.undoStackSize = 20;
 
 /**
Index: CKEditor/branches/versions/3.5.x/_source/plugins/wysiwygarea/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/wysiwygarea/plugin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/wysiwygarea/plugin.js	(revision 6050)
@@ -15,5 +15,5 @@
 
 	// Matching an empty paragraph at the end of document.
-	var emptyParagraphRegexp = /\s*<(p|div|address|h\d|center|li)[^>]*>\s*(?:<br[^>]*>|&nbsp;|\u00A0|&#160;)?\s*(:?<\/\1>)?\s*(?=$|<\/body>)/gi;
+	var emptyParagraphRegexp = /(^|<body\b[^>]*>)\s*<(p|div|address|h\d|center)[^>]*>\s*(?:<br[^>]*>|&nbsp;|\u00A0|&#160;)?\s*(:?<\/\2>)?\s*(?=$|<\/body>)/gi;
 
 	var notWhitespaceEval = CKEDITOR.dom.walker.whitespaces( true );
@@ -74,5 +74,9 @@
 				}
 
-				$sel.createRange().pasteHTML( data );
+				try
+				{
+					$sel.createRange().pasteHTML( data );
+				}
+				catch (e) {}
 
 				if ( selIsLocked )
@@ -89,4 +93,5 @@
 				marker.scrollIntoView();
 				marker.remove();
+				marker = null;
 			}
 
@@ -129,5 +134,5 @@
 				range.deleteContents();
 
-				clone = !i && element || element.clone( true );
+				clone = !i && element || element.clone( 1 );
 
 				// If we're inserting a block at dtd-violated position, split
@@ -136,5 +141,5 @@
 				if ( isBlock )
 				{
-					while ( ( current = range.getCommonAncestor( false, true ) )
+					while ( ( current = range.getCommonAncestor( 0, 1 ) )
 							&& ( dtd = CKEDITOR.dtd[ current.getName() ] )
 							&& !( dtd && dtd [ elementName ] ) )
@@ -199,5 +204,5 @@
 	{
 		if ( !editor.checkDirty() )
-			setTimeout( function(){ editor.resetDirty(); } );
+			setTimeout( function(){ editor.resetDirty(); }, 0 );
 	}
 
@@ -245,4 +250,10 @@
 			restoreDirty( editor );
 
+			// Memorize scroll position to restore it later (#4472).
+			var hostDocument = editor.element.getDocument();
+			var hostDocumentElement = hostDocument.getDocumentElement();
+			var scrollTop = hostDocumentElement.$.scrollTop;
+			var scrollLeft = hostDocumentElement.$.scrollLeft;
+
 			// Simulating keyboard character input by dispatching a keydown of white-space text.
 			var keyEventSimulate = doc.$.createEvent( "KeyEvents" );
@@ -250,4 +261,7 @@
 				false, false, false, 0, 32 );
 			doc.$.dispatchEvent( keyEventSimulate );
+
+			if ( scrollTop != hostDocumentElement.$.scrollTop || scrollLeft != hostDocumentElement.$.scrollLeft )
+				hostDocument.getWindow().$.scrollTo( scrollLeft, scrollTop );
 
 			// Restore the original document status by placing the cursor before a bogus br created (#5021).
@@ -518,5 +532,5 @@
 						CKEDITOR.env.gecko && CKEDITOR.tools.setTimeout( activateEditing, 0, null, editor );
 
-						domWindow	= editor.window		= new CKEDITOR.dom.window( domWindow );
+						domWindow	= editor.window	= new CKEDITOR.dom.window( domWindow );
 						domDocument	= editor.document	= new CKEDITOR.dom.document( domDocument );
 
@@ -530,5 +544,5 @@
 
 						// Gecko/Webkit need some help when selecting control type elements. (#3448)
-						if ( !( CKEDITOR.env.ie || CKEDITOR.env.opera) )
+						if ( !( CKEDITOR.env.ie || CKEDITOR.env.opera ) )
 						{
 							domDocument.on( 'mousedown', function( ev )
@@ -613,4 +627,6 @@
 							});
 
+						var wasFocused;
+
 						domWindow.on( 'focus', function()
 							{
@@ -621,4 +637,13 @@
 								else if ( CKEDITOR.env.opera )
 									doc.getBody().focus();
+								// Webkit needs focus for the first time on the HTML element. (#6153)
+								else if ( CKEDITOR.env.webkit )
+								{
+									if ( !wasFocused )
+									{
+										editor.document.getDocumentElement().focus();
+										wasFocused = 1;
+									}
+								}
 
 								editor.focusManager.focus();
@@ -861,7 +886,7 @@
 									data = editor.dataProcessor.toDataFormat( data, fixForBody );
 
-								// Strip the last blank paragraph within document.
+								// Reset empty if the document contains only one empty paragraph.
 								if ( config.ignoreEmptyParagraph )
-									data = data.replace( emptyParagraphRegexp, '' );
+									data = data.replace( emptyParagraphRegexp, function( match, lookback ) { return lookback; } );
 
 								if ( docType )
@@ -918,4 +943,8 @@
 								else if ( CKEDITOR.env.opera && editor.document )
 								{
+									// Required for Opera when switching focus
+									// from another iframe, e.g. panels. (#6444)
+									var iframe = editor.window.$.frameElement;
+									iframe.blur(), iframe.focus();
 									editor.document.getBody().focus();
 
@@ -940,5 +969,5 @@
 			// Setting voice label as window title, backup the original one
 			// and restore it before running into use.
-			editor.on( 'contentDom', function ()
+			editor.on( 'contentDom', function()
 				{
 					var title = editor.document.getElementsByTag( 'title' ).getItem( 0 );
@@ -958,4 +987,7 @@
 				editor.addCss( selectors.join( ',' ) + '{ display:inline-block;}' );
 			}
+			// Set the HTML style to 100% to have the text cursor in affect (#6341)
+			else if ( CKEDITOR.env.gecko )
+				editor.addCss( 'html { height: 100% !important; }' );
 
 			// Switch on design mode for a short while and close it after then.
@@ -966,8 +998,9 @@
 					{
 						editor.document.$.designMode = 'on';
-						setTimeout( function ()
+						setTimeout( function()
 						{
 							editor.document.$.designMode = 'off';
-							editor.document.getBody().focus();
+							if ( CKEDITOR.currentInstance == editor )
+								editor.document.getBody().focus();
 						}, 50 );
 					},
@@ -1031,5 +1064,5 @@
 	if ( CKEDITOR.env.gecko )
 	{
-		( function ()
+		(function()
 		{
 			var body = document.body;
Index: CKEditor/branches/versions/3.5.x/_source/skins/kama/dialog.css
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/skins/kama/dialog.css	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/skins/kama/dialog.css	(revision 6050)
@@ -240,4 +240,30 @@
 }
 
+/* Opera/IE doesn't leave enough padding in text input for cursor to blink in RTL. (#6087) */
+.cke_skin_kama .cke_browser_ie.cke_rtl input.cke_dialog_ui_input_text,
+.cke_skin_kama .cke_browser_opera.cke_rtl input.cke_dialog_ui_input_text,
+.cke_skin_kama .cke_browser_ie.cke_rtl input.cke_dialog_ui_input_password,
+.cke_skin_kama .cke_browser_opera.cke_rtl input.cke_dialog_ui_input_password
+{
+	padding-right: 2px;
+}
+
+/* Compensate the padding added above on container. */
+.cke_skin_kama .cke_browser_ie.cke_rtl div.cke_dialog_ui_input_text,
+.cke_skin_kama .cke_browser_opera.cke_rtl div.cke_dialog_ui_input_text,
+.cke_skin_kama .cke_browser_ie.cke_rtl div.cke_dialog_ui_input_password,
+.cke_skin_kama .cke_browser_opera.cke_rtl div.cke_dialog_ui_input_password
+{
+	padding-left: 2px;
+}
+
+.cke_skin_kama .cke_browser_ie.cke_rtl .cke_dialog_ui_vbox_child,
+.cke_skin_kama .cke_browser_ie.cke_rtl .cke_dialog_ui_hbox_child,
+.cke_skin_kama .cke_browser_ie.cke_rtl .cke_dialog_ui_hbox_first,
+.cke_skin_kama .cke_browser_ie.cke_rtl .cke_dialog_ui_hbox_last
+{
+	padding-right: 2px !important;
+}
+
 .cke_skin_kama .cke_browser_ie.cke_rtl div.cke_dialog_ui_input_text {
 	padding-right: 1px;
Index: CKEditor/branches/versions/3.5.x/_source/skins/kama/menu.css
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/skins/kama/menu.css	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/skins/kama/menu.css	(revision 6050)
@@ -96,4 +96,11 @@
 }
 
+/* IE9 insists on border box model on this element.*/
+ .cke_browser_ie9 .cke_skin_kama .cke_menuitem .cke_icon_wrapper
+{
+	width:24px;
+	height:24px;
+}
+
 .cke_rtl .cke_skin_kama .cke_menuitem .cke_icon_wrapper
 {
@@ -129,4 +136,11 @@
 	background-color: #fff;
 }
+
+/* IE9 insists on border box model on this element.*/
+.cke_browser_ie9 .cke_skin_kama .cke_menuitem .cke_label
+{
+	height:24px;
+}
+
 /* Set these after the document has been loaded and we know the dimensions*/
 .cke_skin_kama .cke_frameLoaded .cke_menuitem .cke_label
Index: CKEditor/branches/versions/3.5.x/_source/skins/kama/panel.css
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/skins/kama/panel.css	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/skins/kama/panel.css	(revision 6050)
@@ -73,5 +73,5 @@
 	display: block;
 	border: 1px solid #fff;
-	color: inherit;
+	color: inherit !important;
 	text-decoration: none;
 	overflow: hidden;
@@ -179,12 +179,12 @@
 a.cke_colorbox
 {
-    border: #fff 1px solid;
-    padding: 2px;
-    float: left;
+	border: #fff 1px solid;
+	padding: 2px;
+	float: left;
 }
 
 .cke_rtl a.cke_colorbox
 {
-    float: right;
+	float: right;
 }
 
@@ -193,6 +193,6 @@
 a:active.cke_colorbox
 {
-    border: #316ac5 1px solid;
-    background-color: #dff1ff;
+	border: #316ac5 1px solid;
+	background-color: #dff1ff;
 }
 
@@ -200,7 +200,8 @@
 a.cke_colormore
 {
-    border: #fff 1px solid;
-    padding: 2px;
-    display: block;
+	border: #fff 1px solid;
+	padding: 2px;
+	display: block;
+	cursor: pointer;
 }
 
@@ -212,5 +213,5 @@
 a:active.cke_colormore
 {
-    border: #316ac5 1px solid;
-    background-color: #dff1ff;
-}
+	border: #316ac5 1px solid;
+	background-color: #dff1ff;
+}
Index: CKEditor/branches/versions/3.5.x/_source/skins/kama/richcombo.css
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/skins/kama/richcombo.css	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/skins/kama/richcombo.css	(revision 6050)
@@ -280,2 +280,8 @@
 	line-height: 17px;
 }
+
+.cke_skin_kama .cke_rtl .cke_rcombo .cke_font .cke_text,
+.cke_skin_kama .cke_rtl .cke_rcombo .cke_fontSize .cke_text
+{
+	direction: ltr;
+}
Index: CKEditor/branches/versions/3.5.x/_source/skins/kama/skin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/skins/kama/skin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/skins/kama/skin.js	(revision 6050)
@@ -148,5 +148,5 @@
 					var cssContent,
 						uiStyle = getStylesheet( CKEDITOR.document ),
-						cssId = '.cke_editor_' + CKEDITOR.tools.escapeCssSelector( editor.name );
+						cssId = '.' + editor.id;
 
 					var cssSelectors =
@@ -243,9 +243,9 @@
 						// ml
 						el = innerDialog.getChild( 4 );
-						el.setStyle( 'height', ( body.$.offsetHeight - 31 - 14 ) + 'px' );
+						el.setStyle( 'height', ( height + body.getChild(0).$.offsetHeight ) + 'px' );
 
 						// mr
 						el = innerDialog.getChild( 5 );
-						el.setStyle( 'height', ( body.$.offsetHeight - 31 - 14 ) + 'px' );
+						el.setStyle( 'height', ( height + body.getChild(0).$.offsetHeight ) + 'px' );
 					},
 					100 );
Index: CKEditor/branches/versions/3.5.x/_source/skins/office2003/dialog.css
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/skins/office2003/dialog.css	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/skins/office2003/dialog.css	(revision 6050)
@@ -182,10 +182,4 @@
 }
 
-.cke_skin_office2003 .cke_browser_ie.cke_rtl .cke_dialog_title
-{
-	position: static !important;
-	unicode-bidi: bidi-override;
-}
-
 .cke_skin_office2003 .cke_dialog_contents
 {
@@ -332,4 +326,30 @@
 	border: 1px solid #a0a0a0;
 	padding: 1px 0px;
+}
+
+/* Opera/IE doesn't leave enough padding in text input for cursor to blink in RTL. (#6087) */
+.cke_skin_office2003 .cke_browser_ie.cke_rtl input.cke_dialog_ui_input_text,
+.cke_skin_office2003 .cke_browser_opera.cke_rtl input.cke_dialog_ui_input_text,
+.cke_skin_office2003 .cke_browser_ie.cke_rtl input.cke_dialog_ui_input_password,
+.cke_skin_office2003 .cke_browser_opera.cke_rtl input.cke_dialog_ui_input_password
+{
+	padding-right: 2px
+}
+
+/* Compensate the padding added above on container. */
+.cke_skin_office2003 .cke_browser_ie.cke_rtl div.cke_dialog_ui_input_text,
+.cke_skin_office2003 .cke_browser_opera.cke_rtl div.cke_dialog_ui_input_text,
+.cke_skin_office2003 .cke_browser_ie.cke_rtl div.cke_dialog_ui_input_password,
+.cke_skin_office2003 .cke_browser_opera.cke_rtl div.cke_dialog_ui_input_password
+{
+	padding-left: 2px;
+}
+
+.cke_skin_office2003 .cke_browser_ie.cke_rtl .cke_dialog_ui_vbox_child,
+.cke_skin_office2003 .cke_browser_ie.cke_rtl .cke_dialog_ui_hbox_child,
+.cke_skin_office2003 .cke_browser_ie.cke_rtl .cke_dialog_ui_hbox_first,
+.cke_skin_office2003 .cke_browser_ie.cke_rtl .cke_dialog_ui_hbox_last
+{
+	padding-right: 2px !important;
 }
 
Index: CKEditor/branches/versions/3.5.x/_source/skins/office2003/menu.css
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/skins/office2003/menu.css	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/skins/office2003/menu.css	(revision 6050)
@@ -96,4 +96,11 @@
 }
 
+/* IE9 insists on border box model on this element.*/
+ .cke_browser_ie9 .cke_skin_office2003 .cke_menuitem .cke_icon_wrapper
+{
+	width:24px;
+	height:24px;
+}
+
 .cke_rtl .cke_skin_office2003 .cke_menuitem .cke_icon_wrapper
 {
@@ -129,4 +136,11 @@
 	background-color: #fff;
 }
+
+/* IE9 insists on border box model on this element.*/
+.cke_browser_ie9 .cke_skin_office2003 .cke_menuitem .cke_label
+{
+	height:24px;
+}
+
 /* Set these after the document has been loaded and we know the dimensions*/
 .cke_skin_office2003 .cke_frameLoaded .cke_menuitem .cke_label
Index: CKEditor/branches/versions/3.5.x/_source/skins/office2003/panel.css
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/skins/office2003/panel.css	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/skins/office2003/panel.css	(revision 6050)
@@ -68,5 +68,5 @@
 	display: block;
 	border: 1px solid #fff;
-	color: inherit;
+	color: inherit !important;
 	text-decoration: none;
 	overflow: hidden;
@@ -174,12 +174,12 @@
 a.cke_colorbox
 {
-    border: #fff 1px solid;
-    padding: 2px;
-    float: left;
+	border: #fff 1px solid;
+	padding: 2px;
+	float: left;
 }
 
 .cke_rtl a.cke_colorbox
 {
-    float: right;
+	float: right;
 }
 
@@ -188,6 +188,6 @@
 a:active.cke_colorbox
 {
-    border: #316ac5 1px solid;
-    background-color: #dff1ff;
+	border: #316ac5 1px solid;
+	background-color: #dff1ff;
 }
 
@@ -195,7 +195,8 @@
 a.cke_colormore
 {
-    border: #fff 1px solid;
-    padding: 2px;
-    display: block;
+	border: #fff 1px solid;
+	padding: 2px;
+	display: block;
+	cursor: pointer;
 }
 
@@ -207,5 +208,5 @@
 a:active.cke_colormore
 {
-    border: #316ac5 1px solid;
-    background-color: #dff1ff;
-}
+	border: #316ac5 1px solid;
+	background-color: #dff1ff;
+}
Index: CKEditor/branches/versions/3.5.x/_source/skins/office2003/richcombo.css
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/skins/office2003/richcombo.css	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/skins/office2003/richcombo.css	(revision 6050)
@@ -311,2 +311,8 @@
 	float: none;
 }
+
+.cke_skin_office2003 .cke_rtl .cke_rcombo .cke_font .cke_text,
+.cke_skin_office2003 .cke_rtl .cke_rcombo .cke_fontSize .cke_text
+{
+	direction: ltr;
+}
Index: CKEditor/branches/versions/3.5.x/_source/skins/office2003/skin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/skins/office2003/skin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/skins/office2003/skin.js	(revision 6050)
@@ -66,9 +66,9 @@
 						// ml
 						el = innerDialog.getChild( 4 );
-						el.setStyle( 'height', ( body.$.offsetHeight - 31 - 14 ) + 'px' );
+						el.setStyle( 'height', ( height + body.getChild(0).$.offsetHeight ) + 'px' );
 
 						// mr
 						el = innerDialog.getChild( 5 );
-						el.setStyle( 'height', ( body.$.offsetHeight - 31 - 14 ) + 'px' );
+						el.setStyle( 'height', ( height + body.getChild(0).$.offsetHeight ) + 'px' );
 					};
 				setTimeout( fixSize, 100 );
Index: CKEditor/branches/versions/3.5.x/_source/skins/v2/dialog.css
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/skins/v2/dialog.css	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/skins/v2/dialog.css	(revision 6050)
@@ -177,10 +177,4 @@
 	cursor: move;
 	position: relative;
-}
-
-.cke_skin_v2 .cke_browser_ie.cke_rtl .cke_dialog_title
-{
-	position: static !important;
-	unicode-bidi: bidi-override;
 }
 
@@ -335,4 +329,30 @@
 {
 	border-width: 1px;
+}
+
+/* Opera/IE doesn't leave enough padding in text input for cursor to blink in RTL. (#6087) */
+.cke_skin_v2 .cke_browser_ie.cke_rtl input.cke_dialog_ui_input_text,
+.cke_skin_v2 .cke_browser_opera.cke_rtl input.cke_dialog_ui_input_text,
+.cke_skin_v2 .cke_browser_ie.cke_rtl input.cke_dialog_ui_input_password,
+.cke_skin_v2 .cke_browser_opera.cke_rtl input.cke_dialog_ui_input_password
+{
+	padding-right: 2px
+}
+
+/* Compensate the padding added above on container. */
+.cke_skin_v2 .cke_browser_ie.cke_rtl div.cke_dialog_ui_input_text,
+.cke_skin_v2 .cke_browser_opera.cke_rtl div.cke_dialog_ui_input_text,
+.cke_skin_v2 .cke_browser_ie.cke_rtl div.cke_dialog_ui_input_password,
+.cke_skin_v2 .cke_browser_opera.cke_rtl div.cke_dialog_ui_input_password
+{
+	padding-left: 2px;
+}
+
+.cke_skin_v2 .cke_browser_ie.cke_rtl .cke_dialog_ui_vbox_child,
+.cke_skin_v2 .cke_browser_ie.cke_rtl .cke_dialog_ui_hbox_child,
+.cke_skin_v2 .cke_browser_ie.cke_rtl .cke_dialog_ui_hbox_first,
+.cke_skin_v2 .cke_browser_ie.cke_rtl .cke_dialog_ui_hbox_last
+{
+	padding-right: 2px !important;
 }
 
Index: CKEditor/branches/versions/3.5.x/_source/skins/v2/menu.css
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/skins/v2/menu.css	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/skins/v2/menu.css	(revision 6050)
@@ -96,4 +96,11 @@
 }
 
+/* IE9 insists on border box model on this element.*/
+ .cke_browser_ie9 .cke_skin_v2 .cke_menuitem .cke_icon_wrapper
+{
+	width:24px;
+	height:24px;
+}
+
 .cke_rtl .cke_skin_v2 .cke_menuitem .cke_icon_wrapper
 {
@@ -129,4 +136,11 @@
 	background-color: #fff;
 }
+
+/* IE9 insists on border box model on this element.*/
+.cke_browser_ie9 .cke_skin_v2 .cke_menuitem .cke_label
+{
+	height:24px;
+}
+
 /* Set these after the document has been loaded and we know the dimensions*/
 .cke_skin_v2 .cke_frameLoaded .cke_menuitem .cke_label
Index: CKEditor/branches/versions/3.5.x/_source/skins/v2/panel.css
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/skins/v2/panel.css	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/skins/v2/panel.css	(revision 6050)
@@ -68,5 +68,5 @@
 	display: block;
 	border: 1px solid #fff;
-	color: inherit;
+	color: inherit !important;
 	text-decoration: none;
 	overflow: hidden;
@@ -174,12 +174,12 @@
 a.cke_colorbox
 {
-    border: #fff 1px solid;
-    padding: 2px;
-    float: left;
+	border: #fff 1px solid;
+	padding: 2px;
+	float: left;
 }
 
 .cke_rtl a.cke_colorbox
 {
-    float: right;
+	float: right;
 }
 
@@ -188,6 +188,6 @@
 a:active.cke_colorbox
 {
-    border: #316ac5 1px solid;
-    background-color: #dff1ff;
+	border: #316ac5 1px solid;
+	background-color: #dff1ff;
 }
 
@@ -195,7 +195,8 @@
 a.cke_colormore
 {
-    border: #fff 1px solid;
-    padding: 2px;
-    display: block;
+	border: #fff 1px solid;
+	padding: 2px;
+	display: block;
+	cursor: pointer;
 }
 
@@ -207,5 +208,5 @@
 a:active.cke_colormore
 {
-    border: #316ac5 1px solid;
-    background-color: #dff1ff;
-}
+	border: #316ac5 1px solid;
+	background-color: #dff1ff;
+}
Index: CKEditor/branches/versions/3.5.x/_source/skins/v2/richcombo.css
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/skins/v2/richcombo.css	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/skins/v2/richcombo.css	(revision 6050)
@@ -310,2 +310,8 @@
 	height: 22px;
 }
+
+.cke_skin_v2 .cke_rtl .cke_rcombo .cke_font .cke_text,
+.cke_skin_v2 .cke_rtl .cke_rcombo .cke_fontSize .cke_text
+{
+	direction: ltr;
+}
Index: CKEditor/branches/versions/3.5.x/_source/skins/v2/skin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/skins/v2/skin.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/skins/v2/skin.js	(revision 6050)
@@ -66,9 +66,9 @@
 						// ml
 						el = innerDialog.getChild( 4 );
-						el.setStyle( 'height', ( body.$.offsetHeight - 31 - 14 ) + 'px' );
+						el.setStyle( 'height', ( height + body.getChild(0).$.offsetHeight ) + 'px' );
 
 						// mr
 						el = innerDialog.getChild( 5 );
-						el.setStyle( 'height', ( body.$.offsetHeight - 31 - 14 ) + 'px' );
+						el.setStyle( 'height', ( height + body.getChild(0).$.offsetHeight ) + 'px' );
 					},
 					100 );
Index: CKEditor/branches/versions/3.5.x/_source/themes/default/theme.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/themes/default/theme.js	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/_source/themes/default/theme.js	(revision 6050)
@@ -3,4 +3,9 @@
 For licensing, see LICENSE.html or http://ckeditor.com/license
 */
+
+/**
+ * @name CKEDITOR.theme
+ * @class
+ */
 
 CKEDITOR.themes.add( 'default', (function()
@@ -23,5 +28,5 @@
 			var html =
 				'<span class="cke_shared">' +
-				'<span class="' + editor.skinClass + ' cke_editor_' + editor.name + '">' +
+				'<span class="' + editor.skinClass + ' ' + editor.id + ' cke_editor_' + editor.name + '">' +
 				'<span class="' + CKEDITOR.env.cssClass + '">' +
 				'<span class="cke_wrapper cke_' + editor.lang.dir + '">' +
@@ -66,5 +71,5 @@
 	}
 
-	return {
+	return /** @lends CKEDITOR.theme */ {
 		build : function( editor, themePath )
 		{
@@ -115,5 +120,5 @@
 					' id="cke_', name, '"' +
 					' onmousedown="return false;"' +
-					' class="', editor.skinClass, ' cke_editor_', name, '"' +
+					' class="', editor.skinClass, ' ', editor.id, ' cke_editor_', name, '"' +
 					' dir="', editor.lang.dir, '"' +
 					' title="', ( CKEDITOR.env.gecko ? ' ' : '' ), '"' +
@@ -168,5 +173,5 @@
 
 			var element = CKEDITOR.dom.element.createFromHtml( [
-					'<div class="cke_editor_' + editor.name.replace('.', '\\.') + '_dialog cke_skin_', editor.skinName,
+					'<div class="', editor.id, '_dialog cke_editor_', editor.name.replace('.', '\\.'), '_dialog cke_skin_', editor.skinName,
 						'" dir="', editor.lang.dir, '"' +
 						' lang="', editor.langCode, '"' +
@@ -286,8 +291,4 @@
 CKEDITOR.editor.prototype.resize = function( width, height, isContentHeight, resizeInner )
 {
-	var numberRegex = /^\d+$/;
-	if ( numberRegex.test( width ) )
-		width += 'px';
-
 	var container = this.container,
 		contents = CKEDITOR.document.getById( 'cke_contents_' + this.name ),
@@ -298,5 +299,6 @@
 	// resize it. If we don't, the browser crashes!
 	CKEDITOR.env.webkit && outer.setStyle( 'display', 'none' );
-	outer.setStyle( 'width', width );
+	// Set as border box width. (#5353)
+	outer.setSize( 'width',  width, true );
 	if ( CKEDITOR.env.webkit )
 	{
Index: CKEditor/branches/versions/3.5.x/contents.css
===================================================================
--- CKEditor/branches/versions/3.5.x/contents.css	(revision 5937)
+++ CKEditor/branches/versions/3.5.x/contents.css	(revision 6050)
@@ -21,5 +21,9 @@
 	/* #3658: [IE6] Editor document has horizontal scrollbar on long lines
 	To prevent this misbehavior, we show the scrollbar always */
-	_overflow-y: scroll
+	_overflow-y: scroll;
+	/* #6341: The text cursor must be set on the editor area. */
+	cursor: text;
+	/* #6632: Avoid having "text" shape of cursor in IE7 scrollbars.*/
+	*cursor:auto;
 }
 
