Index: /CKEditor/branches/versions/3.1.x/_source/core/dtd.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/core/dtd.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/core/dtd.js	(revision 4772)
@@ -83,5 +83,5 @@
 
 		$inline : L,	// Just like span.
-		
+
 		$body : X({script:1,style:1}, block),
 
Index: /CKEditor/branches/versions/3.1.x/_source/core/htmlparser/comment.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/core/htmlparser/comment.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/core/htmlparser/comment.js	(revision 4772)
@@ -1,3 +1,3 @@
-﻿/*
+/*
 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
 For licensing, see LICENSE.html or http://ckeditor.com/license
@@ -45,9 +45,10 @@
 		if ( filter )
 		{
-			if ( !( comment = filter.onComment( comment ) ) )
+			if ( !( comment = filter.onComment( comment, this ) ) )
 				return;
 
 			if ( typeof comment != 'string' )
 			{
+				comment.parent = this.parent;
 				comment.writeHtml( writer, filter );
 				return;
Index: /CKEditor/branches/versions/3.1.x/_source/core/htmlparser/element.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/core/htmlparser/element.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/core/htmlparser/element.js	(revision 4772)
@@ -1,3 +1,3 @@
-﻿/*
+/*
 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
 For licensing, see LICENSE.html or http://ckeditor.com/license
@@ -26,5 +26,5 @@
 	 * @example
 	 */
-	this.attributes = attributes;
+	this.attributes = attributes || ( attributes = {} );
 
 	/**
@@ -102,16 +102,25 @@
 			var attributes = this.attributes;
 
-			// The "_cke_replacedata" indicates that this element is replacing
-			// a data snippet, which should be outputted as is.
-			if ( attributes._cke_replacedata )
-			{
-				writer.write( attributes._cke_replacedata );
-				return;
-			}
-
 			// Ignore cke: prefixes when writing HTML.
 			var element = this,
 				writeName = element.name,
-				a, value;
+				a, newAttrName, value;
+
+			var isChildrenFiltered;
+
+			/**
+			 * Providing an option for bottom-up filtering order ( element
+			 * children to be pre-filtered before the element itself ).
+			 */
+			element.filterChildren = function()
+			{
+				if( !isChildrenFiltered )
+				{
+					var writer = new CKEDITOR.htmlParser.basicWriter();
+					CKEDITOR.htmlParser.fragment.prototype.writeChildrenHtml.call( element, writer, filter );
+					element.children = new CKEDITOR.htmlParser.fragment.fromHtml( writer.getHtml() ).children;
+					isChildrenFiltered = 1;
+				}
+			};
 
 			if ( filter )
@@ -126,4 +135,6 @@
 					if ( !( element = filter.onElement( element ) ) )
 						return;
+
+					element.parent = this.parent;
 
 					if ( element.name == writeName )
@@ -139,7 +150,10 @@
 
 					writeName = element.name;
-					if ( !writeName )	// Send children.
+
+					// This indicate that the element has been dropped by
+					// filter but not the children.
+					if ( !writeName )
 					{
-						CKEDITOR.htmlParser.fragment.prototype.writeHtml.apply( element, arguments );
+						this.writeChildrenHtml.call( element, writer, isChildrenFiltered ? null : filter );
 						return;
 					}
@@ -154,39 +168,53 @@
 			writer.openTag( writeName, attributes );
 
-			if ( writer.sortAttributes )
-			{
-				// Copy all attributes to an array.
-				var attribsArray = [];
+			// Copy all attributes to an array.
+			var attribsArray = [];
+			// Iterate over the attributes twice since filters may alter
+			// other attributes.
+			for( var i = 0 ; i < 2; i++ )
+			{
 				for ( a in attributes )
 				{
+					newAttrName = a;
 					value = attributes[ a ];
-
-					if ( filter && ( !( a = filter.onAttributeName( a ) ) || ( value = filter.onAttribute( element, a, value ) ) === false ) )
-						continue;
-
-					attribsArray.push( [ a, value ] );
+					if( i == 1 )
+						attribsArray.push( [ a, value ] );
+					else if ( filter )
+					{
+						while ( true )
+						{
+							if ( !( newAttrName = filter.onAttributeName( a ) ) )
+							{
+								delete attributes[ a ];
+								break;
+							}
+							else if( newAttrName != a )
+							{
+								delete attributes[ a ];
+								a = newAttrName; 
+								continue;
+							}
+							else
+								break;
+						}
+						if( newAttrName )
+						{
+							if( ( value = filter.onAttribute( element, newAttrName, value ) ) === false )
+								delete attributes[ newAttrName ];
+							else
+								attributes [ newAttrName ] = value;
+						}
+					}
 				}
-
-				// Sort the attributes by name.
+			}
+			// Sort the attributes by name.
+			if ( writer.sortAttributes )
 				attribsArray.sort( sortAttribs );
 
-				// Send the attributes.
-				for ( var i = 0, len = attribsArray.length ; i < len ; i++ )
-				{
-					var attrib = attribsArray[ i ];
-					writer.attribute( attrib[0], attrib[1] );
-				}
-			}
-			else
-			{
-				for ( a in attributes )
-				{
-					value = attributes[ a ];
-
-					if ( filter && ( !( a = filter.onAttributeName( a ) ) || ( value = filter.onAttribute( element, a, value ) ) === false ) )
-						continue;
-
-					writer.attribute( a, value );
-				}
+			// Send the attributes.
+			for ( i = 0, len = attribsArray.length ; i < len ; i++ )
+			{
+				var attrib = attribsArray[ i ];
+				writer.attribute( attrib[0], attrib[1] );
 			}
 
@@ -196,10 +224,15 @@
 			if ( !element.isEmpty )
 			{
-				// Send children.
-				CKEDITOR.htmlParser.fragment.prototype.writeHtml.apply( element, arguments );
-
+				this.writeChildrenHtml.call( element, writer, isChildrenFiltered ? null : filter );
 				// Close the element.
 				writer.closeTag( writeName );
 			}
+		},
+
+		writeChildrenHtml : function( writer, filter )
+		{
+			// Send children.
+			CKEDITOR.htmlParser.fragment.prototype.writeChildrenHtml.apply( this, arguments );
+
 		}
 	};
Index: /CKEditor/branches/versions/3.1.x/_source/core/htmlparser/filter.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/core/htmlparser/filter.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/core/htmlparser/filter.js	(revision 4772)
@@ -46,4 +46,7 @@
 				// Add the comment.
 				this._.comment = transformNamedItem( this._.comment, rules.comment, priority ) || this._.comment;
+
+				// Add root fragment.
+				this._.root = transformNamedItem( this._.root, rules.root, priority ) || this._.root;
 			},
 
@@ -64,8 +67,14 @@
 			},
 
-			onComment : function( commentText )
+			onComment : function( commentText, comment )
 			{
 				var textFilter = this._.comment;
-				return textFilter ? textFilter.filter( commentText ) : commentText;
+				return textFilter ? textFilter.filter( commentText, comment ) : commentText;
+			},
+
+			onFragment : function( element )
+			{
+				var rootFilter = this._.root;
+				return rootFilter ? rootFilter.filter( element ) : element;
 			},
 
@@ -75,8 +84,8 @@
 				// well as those set to the generic $ name. So, add both to an
 				// array and process them in a small loop.
-				var filters = [ this._.elements[ element.name ], this._.elements.$ ],
+				var filters = [ this._.elements[ '^' ], this._.elements[ element.name ], this._.elements.$ ],
 					filter, ret;
 
-				for ( var i = 0 ; i < 2 ; i++ )
+				for ( var i = 0 ; i < 3 ; i++ )
 				{
 					filter = filters[ i ];
@@ -90,4 +99,8 @@
 						if ( ret && ret != element )
 							return this.onNode( ret );
+
+						// The non-root element has been dismissed by one of the filters.
+						if ( element.parent && !element.name )
+							break;
 					}
 				}
@@ -155,6 +168,9 @@
 			{
 				var item = items[ j ];
-				item.pri = priority;
-				list.splice( i, 0, item );
+				if ( item )
+				{
+					item.pri = priority;
+					list.splice( i, 0, item );
+				}
 			}
 		}
Index: /CKEditor/branches/versions/3.1.x/_source/core/htmlparser/fragment.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/core/htmlparser/fragment.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/core/htmlparser/fragment.js	(revision 4772)
@@ -196,5 +196,5 @@
 					addPoint;   // New position to start adding nodes.
 
-				// Fixing malformed nested lists(#3828).
+				// Fixing malformed nested lists by moving it into a previous list item. (#3828)
 				if( tagName in listBlocks
 					&& currentName in listBlocks )
@@ -202,10 +202,10 @@
 					var children = currentNode.children,
 						lastChild = children[ children.length - 1 ];
-					// Move inner list into to previous list item if any.
-					if( lastChild && lastChild.name in listItems )
-						returnPoint = currentNode, addPoint = lastChild;
-					// Move inner list outside in the worst case.
-					else
-						addElement( currentNode, currentNode.parent );
+
+					// Establish the list item if it's not existed.
+					if ( !( lastChild && lastChild.name in listItems ) )
+						addElement( ( lastChild = new CKEDITOR.htmlParser.element( 'li' ) ), currentNode );
+
+					returnPoint = currentNode, addPoint = lastChild;
 				}
 				// If the element name is the same as the current element name,
@@ -279,12 +279,14 @@
 
 			var pendingAdd = [],
+				newPendingInline = [],
 				candidate = currentNode;
 
 			while ( candidate.type && candidate.name != tagName )
 			{
-				// If this is an inline element, add it to the pending list, so
-				// it will continue after the closing tag.
+				// If this is an inline element, add it to the pending list, if we're
+				// really closing one of the parents element later, they will continue
+				// after it.
 				if ( !candidate._.isBlockLike )
-					pendingInline.unshift( candidate );
+					newPendingInline.unshift( candidate );
 
 				// This node should be added to it's parent at this point. But,
@@ -316,4 +318,6 @@
 				if ( candidate == currentNode )
 					currentNode = currentNode.parent;
+
+				pendingInline = pendingInline.concat( newPendingInline );
 			}
 
@@ -440,5 +444,23 @@
 		writeHtml : function( writer, filter )
 		{
-			for ( var i = 0, len = this.children.length ; i < len ; i++ )
+			var isChildrenFiltered;
+			this.filterChildren = function()
+			{
+				var writer = new CKEDITOR.htmlParser.basicWriter();
+				this.writeChildrenHtml.call( this, writer, filter, true );
+				var html = writer.getHtml();
+				this.children = new CKEDITOR.htmlParser.fragment.fromHtml( html ).children;
+				isChildrenFiltered = 1;
+			};
+
+			// Filtering the root fragment before anything else.
+			!this.name && filter && filter.onFragment( this );
+
+			this.writeChildrenHtml( writer, isChildrenFiltered ? null : filter );
+		},
+
+		writeChildrenHtml : function( writer, filter )
+		{
+			for ( var i = 0 ; i < this.children.length ; i++ )
 				this.children[i].writeHtml( writer, filter );
 		}
Index: /CKEditor/branches/versions/3.1.x/_source/core/scriptloader.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/core/scriptloader.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/core/scriptloader.js	(revision 4772)
@@ -1,3 +1,3 @@
-﻿/*
+/*
 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
 For licensing, see LICENSE.html or http://ckeditor.com/license
@@ -52,5 +52,5 @@
 		 *     });
 		 */
-		load : function( scriptUrl, callback, scope, noCheck )
+		load : function( scriptUrl, callback, scope, noCheck, showBusy )
 		{
 			var isString = ( typeof scriptUrl == 'string' );
@@ -88,5 +88,8 @@
 
 				if ( --scriptCount <= 0 )
+				{
+					showBusy && CKEDITOR.document.getDocumentElement().removeStyle( 'cursor' );
 					doCallback( success );
+				}
 			};
 
@@ -168,4 +171,5 @@
 			};
 
+			showBusy && CKEDITOR.document.getDocumentElement().setStyle( 'cursor', 'wait' );
 			for ( var i = 0 ; i < scriptCount ; i++ )
 			{
Index: /CKEditor/branches/versions/3.1.x/_source/core/tools.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/core/tools.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/core/tools.js	(revision 4772)
@@ -1,3 +1,3 @@
-﻿/*
+/*
 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
 For licensing, see LICENSE.html or http://ckeditor.com/license
@@ -97,5 +97,6 @@
 				|| ( obj instanceof Number )
 				|| ( obj instanceof Boolean )
-				|| ( obj instanceof Date ) )
+				|| ( obj instanceof Date )
+				|| ( obj instanceof RegExp) )
 			{
 				return obj;
@@ -652,4 +653,20 @@
 		{
 			return new Array( times + 1 ).join( str );
+		},
+
+		tryThese : function()
+		{
+			var returnValue;
+			for ( var i = 0, length = arguments.length; i < length; i++ )
+			{
+				var lambda = arguments[i];
+				try
+				{
+					returnValue = lambda();
+					break;
+				}
+				catch (e) {}
+			}
+			return returnValue;
 		}
 	};
Index: /CKEditor/branches/versions/3.1.x/_source/lang/_translationstatus.txt
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/_translationstatus.txt	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/_translationstatus.txt	(revision 4772)
@@ -2,58 +2,58 @@
 For licensing, see LICENSE.html or http://ckeditor.com/license
 
-af.js      Found: 305 Missing: 185
-ar.js      Found: 475 Missing: 15
-bg.js      Found: 298 Missing: 192
-bn.js      Found: 300 Missing: 190
-bs.js      Found: 203 Missing: 287
-ca.js      Found: 428 Missing: 62
-cs.js      Found: 435 Missing: 55
-da.js      Found: 428 Missing: 62
-de.js      Found: 468 Missing: 22
-el.js      Found: 304 Missing: 186
-en-au.js   Found: 388 Missing: 102
-en-ca.js   Found: 388 Missing: 102
-en-uk.js   Found: 388 Missing: 102
-eo.js      Found: 275 Missing: 215
-es.js      Found: 428 Missing: 62
-et.js      Found: 319 Missing: 171
-eu.js      Found: 428 Missing: 62
-fa.js      Found: 320 Missing: 170
-fi.js      Found: 318 Missing: 172
-fo.js      Found: 319 Missing: 171
-fr-ca.js   Found: 320 Missing: 170
-fr.js      Found: 427 Missing: 63
-gl.js      Found: 301 Missing: 189
-gu.js      Found: 319 Missing: 171
-he.js      Found: 437 Missing: 53
-hi.js      Found: 320 Missing: 170
-hr.js      Found: 428 Missing: 62
-hu.js      Found: 319 Missing: 171
-is.js      Found: 325 Missing: 165
-it.js      Found: 427 Missing: 63
-ja.js      Found: 437 Missing: 53
-km.js      Found: 294 Missing: 196
-ko.js      Found: 311 Missing: 179
-lt.js      Found: 324 Missing: 166
-lv.js      Found: 301 Missing: 189
-mn.js      Found: 319 Missing: 171
-ms.js      Found: 280 Missing: 210
-nb.js      Found: 435 Missing: 55
-nl.js      Found: 435 Missing: 55
-no.js      Found: 435 Missing: 55
-pl.js      Found: 435 Missing: 55
-pt-br.js   Found: 427 Missing: 63
-pt.js      Found: 300 Missing: 190
-ro.js      Found: 319 Missing: 171
-ru.js      Found: 325 Missing: 165
-sk.js      Found: 320 Missing: 170
-sl.js      Found: 318 Missing: 172
-sr-latn.js Found: 294 Missing: 196
-sr.js      Found: 294 Missing: 196
-sv.js      Found: 317 Missing: 173
-th.js      Found: 305 Missing: 185
-tr.js      Found: 325 Missing: 165
-uk.js      Found: 428 Missing: 62
-vi.js      Found: 428 Missing: 62
-zh-cn.js   Found: 428 Missing: 62
-zh.js      Found: 428 Missing: 62
+af.js      Found: 302 Missing: 187
+ar.js      Found: 473 Missing: 16
+bg.js      Found: 295 Missing: 194
+bn.js      Found: 297 Missing: 192
+bs.js      Found: 203 Missing: 286
+ca.js      Found: 426 Missing: 63
+cs.js      Found: 433 Missing: 56
+da.js      Found: 426 Missing: 63
+de.js      Found: 466 Missing: 23
+el.js      Found: 301 Missing: 188
+en-au.js   Found: 385 Missing: 104
+en-ca.js   Found: 385 Missing: 104
+en-uk.js   Found: 385 Missing: 104
+eo.js      Found: 275 Missing: 214
+es.js      Found: 426 Missing: 63
+et.js      Found: 316 Missing: 173
+eu.js      Found: 426 Missing: 63
+fa.js      Found: 317 Missing: 172
+fi.js      Found: 315 Missing: 174
+fo.js      Found: 316 Missing: 173
+fr-ca.js   Found: 317 Missing: 172
+fr.js      Found: 425 Missing: 64
+gl.js      Found: 298 Missing: 191
+gu.js      Found: 316 Missing: 173
+he.js      Found: 435 Missing: 54
+hi.js      Found: 317 Missing: 172
+hr.js      Found: 426 Missing: 63
+hu.js      Found: 316 Missing: 173
+is.js      Found: 322 Missing: 167
+it.js      Found: 425 Missing: 64
+ja.js      Found: 435 Missing: 54
+km.js      Found: 291 Missing: 198
+ko.js      Found: 308 Missing: 181
+lt.js      Found: 321 Missing: 168
+lv.js      Found: 298 Missing: 191
+mn.js      Found: 316 Missing: 173
+ms.js      Found: 280 Missing: 209
+nb.js      Found: 432 Missing: 57
+nl.js      Found: 433 Missing: 56
+no.js      Found: 432 Missing: 57
+pl.js      Found: 433 Missing: 56
+pt-br.js   Found: 425 Missing: 64
+pt.js      Found: 297 Missing: 192
+ro.js      Found: 316 Missing: 173
+ru.js      Found: 322 Missing: 167
+sk.js      Found: 317 Missing: 172
+sl.js      Found: 315 Missing: 174
+sr-latn.js Found: 291 Missing: 198
+sr.js      Found: 291 Missing: 198
+sv.js      Found: 314 Missing: 175
+th.js      Found: 302 Missing: 187
+tr.js      Found: 322 Missing: 167
+uk.js      Found: 426 Missing: 63
+vi.js      Found: 426 Missing: 63
+zh-cn.js   Found: 426 Missing: 63
+zh.js      Found: 426 Missing: 63
Index: /CKEditor/branches/versions/3.1.x/_source/lang/af.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/af.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/af.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING
 		toolbar : 'Van Word af byvoeg',
 		title : 'Van Word af byvoeg',
-		advice : 'Voeg asseblief die inhoud in die gegewe box by met sleutel kombenasie(<STRONG>Ctrl+V</STRONG>) en druk <STRONG>OK</STRONG>.',
-		ignoreFontFace : 'Ignoreer karakter soort defenisies',
-		removeStyle : 'Verweider Styl defenisies'
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/ar.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/ar.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/ar.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'يبدو أن النص المراد لصقه منسوخ من برنامج وورد. هل تود تنظيفه قبل الشروع في عملية اللصق؟',
 		toolbar : 'لصق من وورد',
 		title : 'لصق من وورد',
-		advice : 'الصق داخل الصندوق بإستخدام مفاتيح (<STRONG>Ctrl+V</STRONG>) في لوحة المفاتيح، ثم اضغط مفتاح <STRONG>موافق</STRONG>.',
-		ignoreFontFace : 'تجاهل تعريفات أسماء الخطوط',
-		removeStyle : 'إزالة تعريفات الأنماط'
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/bg.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/bg.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/bg.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING
 		toolbar : 'Вмъкни от MS Word',
 		title : 'Вмъкни от MS Word',
-		advice : 'Вмъкнете тук съдъжанието с клавиатуарата (<STRONG>Ctrl+V</STRONG>) и натиснете <STRONG>OK</STRONG>.',
-		ignoreFontFace : 'Игнорирай шрифтовите дефиниции',
-		removeStyle : 'Изтрий стиловите дефиниции'
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/bn.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/bn.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/bn.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING
 		toolbar : 'পেস্ট (শব্দ)',
 		title : 'পেস্ট (শব্দ)',
-		advice : 'অনুগ্রহ করে নীচের বাক্সে কিবোর্ড ব্যবহার করে (<STRONG>Ctrl+V</STRONG>) পেস্ট করুন এবং <STRONG>OK</STRONG> চাপ দিন',
-		ignoreFontFace : 'ফন্ট ফেস ডেফিনেশন ইগনোর করুন',
-		removeStyle : 'স্টাইল ডেফিনেশন সরিয়ে দিন'
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/bs.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/bs.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/bs.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING
 		toolbar : 'Zalijepi iz Word-a',
 		title : 'Zalijepi iz Word-a',
-		advice : 'Please paste inside the following box using the keyboard (<strong>Ctrl+V</strong>) and hit <strong>OK</strong>.', // MISSING
-		ignoreFontFace : 'Ignore Font Face definitions', // MISSING
-		removeStyle : 'Remove Styles definitions' // MISSING
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/ca.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/ca.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/ca.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'El text que voleu enganxar sembla provenir de Word. Voleu netejar aquest text abans que sigui enganxat?',
 		toolbar : 'Enganxa des del Word',
 		title : 'Enganxa des del Word',
-		advice : 'Si us plau, enganxeu dins del següent camp utilitzant el teclat (<STRONG>Ctrl+V</STRONG>) i premeu <STRONG>OK</STRONG>.',
-		ignoreFontFace : 'Ignora definicions de font',
-		removeStyle : 'Elimina definicions d\'estil'
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/cs.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/cs.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/cs.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'Jak je vidět, vkládaný text je kopírován z Wordu. Chcete jej před vložením vyčistit?',
 		toolbar : 'Vložit z Wordu',
 		title : 'Vložit z Wordu',
-		advice : 'Do následujícího pole vložte požadovaný obsah pomocí klávesnice (<STRONG>Ctrl+V</STRONG>) a stiskněte <STRONG>OK</STRONG>.',
-		ignoreFontFace : 'Ignorovat písmo',
-		removeStyle : 'Odstranit styly'
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/da.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/da.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/da.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'Den tekst du forsøger at indsætte ser ud til at komme fra Word. Vil du rense teksten før den indsættes?',
 		toolbar : 'Indsæt fra Word',
 		title : 'Indsæt fra Word',
-		advice : 'Indsæt i feltet herunder (<STRONG>Ctrl+V</STRONG>) og klik på <STRONG>OK</STRONG>.',
-		ignoreFontFace : 'Ignorér skrifttypedefinitioner',
-		removeStyle : 'Ignorér typografi'
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/de.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/de.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/de.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'Der Text, den Sie einfügen möchten, scheint aus MS-Word kopiert zu sein. Möchten Sie ihn zuvor bereinigen lassen?',
 		toolbar : 'aus MS-Word einfügen',
 		title : 'aus MS-Word einfügen',
-		advice : 'Bitte fügen Sie den Text in der folgenden Box über die Tastatur (mit <STRONG>Strg+V</STRONG>) ein und bestätigen Sie mit <STRONG>OK</STRONG>.',
-		ignoreFontFace : 'Ignoriere Schriftart-Definitionen',
-		removeStyle : 'Entferne Style-Definitionen'
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/el.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/el.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/el.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING
 		toolbar : 'Επικόλληση από το Word',
 		title : 'Επικόλληση από το Word',
-		advice : 'Παρακαλώ επικολήστε στο ακόλουθο κουτί χρησιμοποιόντας το πληκτρολόγιο (<STRONG>Ctrl+V</STRONG>) και πατήστε <STRONG>OK</STRONG>.',
-		ignoreFontFace : 'Αγνόηση προδιαγραφών γραμματοσειράς',
-		removeStyle : 'Αφαίρεση προδιαγραφών στύλ'
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/en-au.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/en-au.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/en-au.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING
 		toolbar : 'Paste from Word',
 		title : 'Paste from Word',
-		advice : 'Please paste inside the following box using the keyboard (<strong>Ctrl+V</strong>) and hit <strong>OK</strong>.',
-		ignoreFontFace : 'Ignore Font Face definitions',
-		removeStyle : 'Remove Styles definitions'
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/en-ca.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/en-ca.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/en-ca.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING
 		toolbar : 'Paste from Word',
 		title : 'Paste from Word',
-		advice : 'Please paste inside the following box using the keyboard (<strong>Ctrl+V</strong>) and hit <strong>OK</strong>.',
-		ignoreFontFace : 'Ignore Font Face definitions',
-		removeStyle : 'Remove Styles definitions'
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/en-uk.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/en-uk.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/en-uk.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING
 		toolbar : 'Paste from Word',
 		title : 'Paste from Word',
-		advice : 'Please paste inside the following box using the keyboard (<strong>Ctrl+V</strong>) and hit <strong>OK</strong>.',
-		ignoreFontFace : 'Ignore Font Face definitions',
-		removeStyle : 'Remove Styles definitions'
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/en.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/en.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/en.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?',
 		toolbar : 'Paste from Word',
 		title : 'Paste from Word',
-		advice : 'Please paste inside the following box using the keyboard (<strong>Ctrl+V</strong>) and hit <strong>OK</strong>.',
-		ignoreFontFace : 'Ignore Font Face definitions',
-		removeStyle : 'Remove Styles definitions'
+		error : 'It was not possible to clean up the pasted data due to an internal error'
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/eo.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/eo.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/eo.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING
 		toolbar : 'Interglui el Word',
 		title : 'Interglui el Word',
-		advice : 'Please paste inside the following box using the keyboard (<strong>Ctrl+V</strong>) and hit <strong>OK</strong>.', // MISSING
-		ignoreFontFace : 'Ignore Font Face definitions', // MISSING
-		removeStyle : 'Remove Styles definitions' // MISSING
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/es.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/es.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/es.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'El texto que desea parece provenir de Word. Desea depurarlo antes de pegarlo?',
 		toolbar : 'Pegar desde Word',
 		title : 'Pegar desde Word',
-		advice : 'Por favor pegue dentro del cuadro utilizando el teclado (<STRONG>Ctrl+V</STRONG>); luego presione <STRONG>OK</STRONG>.',
-		ignoreFontFace : 'Ignorar definiciones de fuentes',
-		removeStyle : 'Remover definiciones de estilo'
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/et.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/et.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/et.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING
 		toolbar : 'Kleebi Wordist',
 		title : 'Kleebi Wordist',
-		advice : 'Palun kleebi järgnevasse kasti kasutades klaviatuuri klahvikombinatsiooni (<STRONG>Ctrl+V</STRONG>) ja vajuta seejärel <STRONG>OK</STRONG>.',
-		ignoreFontFace : 'Ignoreeri kirja definitsioone',
-		removeStyle : 'Eemalda stiilide definitsioonid'
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/eu.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/eu.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/eu.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'Itsatsi nahi duzun testua Wordetik hartua dela dirudi. Itsatsi baino lehen garbitu nahi duzu?',
 		toolbar : 'Itsatsi Word-etik',
 		title : 'Itsatsi Word-etik',
-		advice : 'Mesedez teklatua erabilita (<STRONG>Ctrl+V</STRONG>) ondorego eremuan testua itsatsi eta <STRONG>OK</STRONG> sakatu.',
-		ignoreFontFace : 'Letra Motaren definizioa ezikusi',
-		removeStyle : 'Estilo definizioak kendu'
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/fa.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/fa.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/fa.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING
 		toolbar : 'چسباندن از Word',
 		title : 'چسباندن از Word',
-		advice : 'لطفا متن را با کلیدهای (<STRONG>Ctrl+V</STRONG>) در این جعبهٴ متنی بچسبانید و <STRONG>پذیرش</STRONG> را بزنید.',
-		ignoreFontFace : 'چشمپوشی از تعاریف نوع قلم',
-		removeStyle : 'چشمپوشی از تعاریف سبک (style)'
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/fi.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/fi.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/fi.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING
 		toolbar : 'Liitä Wordista',
 		title : 'Liitä Wordista',
-		advice : 'Liitä painamalla (<STRONG>Ctrl+V</STRONG>) ja painamalla <STRONG>OK</STRONG>.',
-		ignoreFontFace : 'Jätä huomioimatta fonttimääritykset',
-		removeStyle : 'Poista tyylimääritykset'
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/fo.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/fo.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/fo.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING
 		toolbar : 'Innrita frá Word',
 		title : 'Innrita frá Word',
-		advice : 'Vinarliga koyr tekstin í hendan rútin við knappaborðinum (<strong>CTRL+V</strong>) og klikk á <strong>Góðtak</strong>.',
-		ignoreFontFace : 'Forfjóna Font definitiónirnar',
-		removeStyle : 'Strika typografi definitiónir'
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/fr-ca.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/fr-ca.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/fr-ca.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING
 		toolbar : 'Coller en tant que Word (formaté)',
 		title : 'Coller en tant que Word (formaté)',
-		advice : 'Veuillez coller dans la zone ci-dessous en utilisant le clavier (<STRONG>Ctrl+V</STRONG>) et appuyer sur <STRONG>OK</STRONG>.',
-		ignoreFontFace : 'Ignorer les polices de caractères',
-		removeStyle : 'Supprimer les styles'
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/fr.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/fr.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/fr.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'Le texte à coller semble provenir de Word. Désirez-vous le nettoyer avant de coller?',
 		toolbar : 'Coller depuis Word',
 		title : 'Coller depuis Word',
-		advice : 'Veuillez coller le texte dans la zone suivante, en utilisant le raccourci clavier (<strong>Ctrl+V</strong>) et cliquez sur OK.',
-		ignoreFontFace : 'Supprimer la définition des polices',
-		removeStyle : 'Supprimer la définition des styles'
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/gl.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/gl.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/gl.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING
 		toolbar : 'Pegar dende Word',
 		title : 'Pegar dende Word',
-		advice : 'Por favor, pegue dentro do seguinte cadro usando o teclado (<STRONG>Ctrl+V</STRONG>) e pulse <STRONG>OK</STRONG>.',
-		ignoreFontFace : 'Ignorar as definicións de Tipografía',
-		removeStyle : 'Eliminar as definicións de Estilos'
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/gu.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/gu.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/gu.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING
 		toolbar : 'પેસ્ટ (વડૅ ટેક્સ્ટ)',
 		title : 'પેસ્ટ (વડૅ ટેક્સ્ટ)',
-		advice : 'Ctrl+V નો પ્રયોગ કરી પેસ્ટ કરો',
-		ignoreFontFace : 'ફૉન્ટફેસ વ્યાખ્યાની અવગણના',
-		removeStyle : 'સ્ટાઇલ વ્યાખ્યા કાઢી નાખવી'
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/he.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/he.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/he.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'נראה הטקסט שבכוונתך להדביק מקורו בקובץ וורד. האם ברצונך לנקות אותו טרם ההדבקה?',
 		toolbar : 'הדבקה מ-Word',
 		title : 'הדבקה מ-Word',
-		advice : 'נא להדביק בתוך הקופסה באמצעות (<STRONG>Ctrl+V</STRONG>) ולחץ על <STRONG>אישור</STRONG>.',
-		ignoreFontFace : 'התעלמות מהגדרות סוג פונט',
-		removeStyle : 'הסרת הגדרות סגנון'
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/hi.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/hi.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/hi.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING
 		toolbar : 'पेस्ट (वर्ड से)',
 		title : 'पेस्ट (वर्ड से)',
-		advice : 'Ctrl+V का प्रयोग करके पेस्ट करें और ठीक है करें.',
-		ignoreFontFace : 'फ़ॉन्ट परिभाषा निकालें',
-		removeStyle : 'स्टाइल परिभाषा निकालें'
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/hr.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/hr.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/hr.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'Tekst koji želite zalijepiti čini se da je kopiran iz Worda. Želite li prije očistiti tekst?',
 		toolbar : 'Zalijepi iz Worda',
 		title : 'Zalijepi iz Worda',
-		advice : 'Molimo zaljepite unutar doljnjeg okvira koristeći tipkovnicu (<STRONG>Ctrl+V</STRONG>) i kliknite <STRONG>OK</STRONG>.',
-		ignoreFontFace : 'Zanemari definiciju vrste fonta',
-		removeStyle : 'Ukloni definicije stilova'
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/hu.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/hu.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/hu.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING
 		toolbar : 'Beillesztés Word-ből',
 		title : 'Beillesztés Word-ből',
-		advice : 'Másolja be az alábbi mezőbe a <STRONG>Ctrl+V</STRONG> billentyűk lenyomásával, majd nyomjon <STRONG>Rendben</STRONG>-t.',
-		ignoreFontFace : 'Betű formázások megszüntetése',
-		removeStyle : 'Stílusok eltávolítása'
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/is.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/is.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/is.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING
 		toolbar : 'Líma úr Word',
 		title : 'Líma úr Word',
-		advice : 'Límdu í svæðið hér að neðan og (<STRONG>Ctrl+V</STRONG>) og smelltu á <STRONG>OK</STRONG>.',
-		ignoreFontFace : 'Hunsa leturskilgreiningar',
-		removeStyle : 'Hunsa letureigindi'
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/it.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/it.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/it.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'Il testo da incollare sembra provenire da Word. Desideri pulirlo prima di incollare?',
 		toolbar : 'Incolla da Word',
 		title : 'Incolla da Word',
-		advice : 'Incolla il testo all\'interno dell\'area sottostante usando la scorciatoia di tastiere (<STRONG>Ctrl+V</STRONG>) e premi <STRONG>OK</STRONG>.',
-		ignoreFontFace : 'Ignora le definizioni di Font',
-		removeStyle : 'Rimuovi le definizioni di Stile'
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/ja.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/ja.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/ja.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : '貼り付けを行うテキストは、ワード文章からコピーされようとしています。貼り付ける前にクリーニングを行いますか？',
 		toolbar : 'ワード文章から貼り付け',
 		title : 'ワード文章から貼り付け',
-		advice : 'キーボード(<STRONG>Ctrl+V</STRONG>)を使用して、次の入力エリア内で貼って、<STRONG>OK</STRONG>を押してください。',
-		ignoreFontFace : 'FontタグのFace属性を無視します。',
-		removeStyle : 'スタイル定義を削除します。'
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/km.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/km.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/km.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING
 		toolbar : 'ចំលងដាក់ពី Word',
 		title : 'ចំលងដាក់ពី Word',
-		advice : 'សូមចំលងអត្ថបទទៅដាក់ក្នុងប្រអប់ដូចខាងក្រោមដោយប្រើប្រាស់ ឃី \u200b(<STRONG>Ctrl+V</STRONG>) ហើយចុច <STRONG>OK</STRONG> ។',
-		ignoreFontFace : 'មិនគិតអំពីប្រភេទពុម្ភអក្សរ',
-		removeStyle : 'លប់ម៉ូត'
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/ko.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/ko.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/ko.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING
 		toolbar : 'MS Word 형식에서 붙여넣기',
 		title : 'MS Word 형식에서 붙여넣기',
-		advice : '키보드의 (<STRONG>Ctrl+V</STRONG>) 를 이용해서 상자안에 붙여넣고 <STRONG>OK</STRONG> 를 누르세요.',
-		ignoreFontFace : '폰트 설정 무시',
-		removeStyle : '스타일 정의 제거'
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/lt.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/lt.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/lt.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING
 		toolbar : 'Įdėti iš Word',
 		title : 'Įdėti iš Word',
-		advice : 'Žemiau esančiame įvedimo lauke įdėkite tekstą, naudodami klaviatūrą (<STRONG>Ctrl+V</STRONG>) ir paspauskite mygtuką <STRONG>OK</STRONG>.',
-		ignoreFontFace : 'Ignoruoti šriftų nustatymus',
-		removeStyle : 'Pašalinti stilių nustatymus'
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/lv.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/lv.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/lv.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING
 		toolbar : 'Ievietot no Worda',
 		title : 'Ievietot no Worda',
-		advice : 'Lūdzu, ievietojiet tekstu šajā laukumā, izmantojot klaviatūru (<STRONG>Ctrl+V</STRONG>) un apstipriniet ar <STRONG>Darīts!</STRONG>.',
-		ignoreFontFace : 'Ignorēt iepriekš norādītos fontus',
-		removeStyle : 'Noņemt norādītos stilus'
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/mn.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/mn.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/mn.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING
 		toolbar : 'Word-оос буулгах',
 		title : 'Word-оос буулгах',
-		advice : '(<strong>Ctrl+V</strong>) товчийг ашиглан paste хийнэ үү. Мөн <strong>OK</strong> дар.',
-		ignoreFontFace : 'Тодорхойлогдсон Font Face зөвшөөрнө',
-		removeStyle : 'Тодорхойлогдсон загварыг авах'
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/ms.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/ms.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/ms.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING
 		toolbar : 'Tampal dari Word',
 		title : 'Tampal dari Word',
-		advice : 'Please paste inside the following box using the keyboard (<strong>Ctrl+V</strong>) and hit <strong>OK</strong>.', // MISSING
-		ignoreFontFace : 'Ignore Font Face definitions', // MISSING
-		removeStyle : 'Remove Styles definitions' // MISSING
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/nb.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/nb.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/nb.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING
 		toolbar : 'Lim inn fra Word',
 		title : 'Lim inn fra Word',
-		advice : 'Vennligst lim inn i den følgende boksen med tastaturet (<STRONG>Ctrl+V</STRONG>) og trykk <STRONG>OK</STRONG>.',
-		ignoreFontFace : 'Fjern skrifttyper',
-		removeStyle : 'Fjern stildefinisjoner'
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/nl.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/nl.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/nl.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'De tekst die u plakte lijkt gekopieerd te zijn vanuit Word. Wilt u de tekst opschonen voordat deze geplakt wordt?',
 		toolbar : 'Plakken als Word-gegevens',
 		title : 'Plakken als Word-gegevens',
-		advice : 'Plak de tekst in het volgende vak gebruik makend van uw toetsenbord (<strong>Ctrl+V</strong>) en klik op <strong>OK</strong>.',
-		ignoreFontFace : 'Negeer "Font Face"-definities',
-		removeStyle : 'Verwijder "Style"-definities'
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/no.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/no.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/no.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING
 		toolbar : 'Lim inn fra Word',
 		title : 'Lim inn fra Word',
-		advice : 'Vennligst lim inn i den følgende boksen med tastaturet (<STRONG>Ctrl+V</STRONG>) og trykk <STRONG>OK</STRONG>.',
-		ignoreFontFace : 'Fjern skrifttyper',
-		removeStyle : 'Fjern stildefinisjoner'
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/pl.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/pl.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/pl.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'Tekst, który chcesz wkleić, prawdopodobnie pochodzi z programu Word. Czy chcesz go wyczyścic przed wklejeniem?',
 		toolbar : 'Wklej z Worda',
 		title : 'Wklej z Worda',
-		advice : 'Proszę wkleić w poniższym polu używając klawiaturowego skrótu (<STRONG>Ctrl+V</STRONG>) i kliknąć <STRONG>OK</STRONG>.',
-		ignoreFontFace : 'Ignoruj definicje \'Font Face\'',
-		removeStyle : 'Usuń definicje Stylów'
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/pt-br.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/pt-br.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/pt-br.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'O texto que você deseja colar parece ter sido copiado do Word. Você gostaria de remover a formatação antes de colar?',
 		toolbar : 'Colar do Word',
 		title : 'Colar do Word',
-		advice : 'Transfira o link usado no box usando o teclado com (<STRONG>Ctrl+V</STRONG>) e <STRONG>OK</STRONG>.',
-		ignoreFontFace : 'Ignorar definições de fonte',
-		removeStyle : 'Remove definições de estilo'
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/pt.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/pt.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/pt.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING
 		toolbar : 'Colar do Word',
 		title : 'Colar do Word',
-		advice : 'Por favor, cole dentro da seguinte caixa usando o teclado (<STRONG>Ctrl+V</STRONG>) e prima <STRONG>OK</STRONG>.',
-		ignoreFontFace : 'Ignorar da definições do Tipo de Letra ',
-		removeStyle : 'Remover as definições de Estilos'
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/ro.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/ro.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/ro.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING
 		toolbar : 'Adaugă din Word',
 		title : 'Adaugă din Word',
-		advice : 'Vă rugăm adăugaţi în căsuţa următoare folosind tastatura (<STRONG>Ctrl+V</STRONG>) şi apăsaţi <STRONG>OK</STRONG>.',
-		ignoreFontFace : 'Ignoră definiţiile Font Face',
-		removeStyle : 'Şterge definiţiile stilurilor'
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/ru.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/ru.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/ru.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING
 		toolbar : 'Вставить из Word',
 		title : 'Вставить из Word',
-		advice : 'Пожалуйста, вставьте текст в прямоугольник, используя сочетание клавиш (<STRONG>Ctrl+V</STRONG>), и нажмите <STRONG>OK</STRONG>.',
-		ignoreFontFace : 'Игнорировать определения гарнитуры',
-		removeStyle : 'Убрать определения стилей'
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/sk.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/sk.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/sk.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING
 		toolbar : 'Vložiť z Wordu',
 		title : 'Vložiť z Wordu',
-		advice : 'Prosím vložte nasledovný rámček použitím klávesnice (<STRONG>Ctrl+V</STRONG>) a stlačte <STRONG>OK</STRONG>.',
-		ignoreFontFace : 'Ignorovať nastavenia typu písma',
-		removeStyle : 'Odstrániť formátovanie'
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/sl.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/sl.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/sl.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING
 		toolbar : 'Prilepi iz Worda',
 		title : 'Prilepi iz Worda',
-		advice : 'Prosim prilepite v sleči okvir s pomočjo tipkovnice (<STRONG>Ctrl+V</STRONG>) in pritisnite <STRONG>V redu</STRONG>.',
-		ignoreFontFace : 'Prezri obliko pisave',
-		removeStyle : 'Odstrani nastavitve stila'
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/sr-latn.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/sr-latn.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/sr-latn.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING
 		toolbar : 'Zalepi iz Worda',
 		title : 'Zalepi iz Worda',
-		advice : 'Molimo Vas da zalepite unutar donje povrine koristeći tastaturnu prečicu (<STRONG>Ctrl+V</STRONG>) i da pritisnete <STRONG>OK</STRONG>.',
-		ignoreFontFace : 'Ignoriši definicije fontova',
-		removeStyle : 'Ukloni definicije stilova'
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/sr.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/sr.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/sr.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING
 		toolbar : 'Залепи из Worda',
 		title : 'Залепи из Worda',
-		advice : 'Молимо Вас да залепите унутар доње површине користећи тастатурну пречицу (<STRONG>Ctrl+V</STRONG>) и да притиснете <STRONG>OK</STRONG>.',
-		ignoreFontFace : 'Игнориши Font Face дефиниције',
-		removeStyle : 'Уклони дефиниције стилова'
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/sv.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/sv.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/sv.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING
 		toolbar : 'Klistra in från Word',
 		title : 'Klistra in från Word',
-		advice : 'Var god och klistra in Er text i rutan nedan genom att använda (<STRONG>Ctrl+V</STRONG>) klicka sen på <STRONG>OK</STRONG>.',
-		ignoreFontFace : 'Ignorera typsnittsdefinitioner',
-		removeStyle : 'Radera Stildefinitioner'
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/th.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/th.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/th.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING
 		toolbar : 'วางสำเนาจากตัวอักษรเวิร์ด',
 		title : 'วางสำเนาจากตัวอักษรเวิร์ด',
-		advice : 'กรุณาใช้คีย์บอร์ดเท่านั้น โดยกดปุ๋ม (<strong>Ctrl และ V</strong>)พร้อมๆกัน และกด <strong>OK</strong>.',
-		ignoreFontFace : 'ไม่สนใจ Font Face definitions',
-		removeStyle : 'ลบ Styles definitions'
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/tr.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/tr.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/tr.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING
 		toolbar : 'Word\'den Yapıştır',
 		title : 'Word\'den Yapıştır',
-		advice : 'Lütfen aşağıdaki kutunun içine yapıştırın. (<STRONG>Ctrl+V</STRONG>) ve <STRONG>Tamam</STRONG> butonunu tıklayın.',
-		ignoreFontFace : 'Yazı Tipi tanımlarını yoksay',
-		removeStyle : 'Biçem Tanımlarını çıkar'
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/uk.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/uk.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/uk.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'Текст, що ви хочете вставити, схожий на копійований з Word. Ви хочете очистити його перед вставкою?',
 		toolbar : 'Вставити з Word',
 		title : 'Вставити з Word',
-		advice : 'Будь-ласка, вставте з буфера обміну в цю область, користуючись комбінацією клавіш (<STRONG>Ctrl+V</STRONG>) та натисніть <STRONG>OK</STRONG>.',
-		ignoreFontFace : 'Ігнорувати налаштування шрифтів',
-		removeStyle : 'Видалити налаштування стилів'
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/vi.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/vi.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/vi.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : 'Văn bản bạn muốn dán có kèm định dạng của Word. Bạn có muốn loại bỏ định dạng Word trước khi dán?',
 		toolbar : 'Dán với định dạng Word',
 		title : 'Dán với định dạng Word',
-		advice : 'Hãy dán nội dung vào trong khung bên dưới, sử dụng tổ hợp phím (<STRONG>Ctrl+V</STRONG>) và nhấn vào nút <STRONG>Đồng ý</STRONG>.',
-		ignoreFontFace : 'Chấp nhận các định dạng phông',
-		removeStyle : 'Gỡ bỏ các định dạng Styles'
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/zh-cn.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/zh-cn.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/zh-cn.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : '您要粘贴的内容好像是来自 MS Word，是否要清除 MS Word 格式后再粘贴？',
 		toolbar : '从 MS Word 粘贴',
 		title : '从 MS Word 粘贴',
-		advice : '请使用键盘快捷键(<STRONG>Ctrl+V</STRONG>)把内容粘贴到下面的方框里，再按 <STRONG>确定</STRONG>',
-		ignoreFontFace : '忽略 Font 标签',
-		removeStyle : '清理 CSS 样式'
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/lang/zh.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/lang/zh.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/lang/zh.js	(revision 4772)
@@ -507,9 +507,8 @@
 	pastefromword :
 	{
+		confirmCleanup : '您想貼上的文字似乎是自 Word 複製而來，請問您是否要先清除 Word 的格式後再行貼上？',
 		toolbar : '自 Word 貼上',
 		title : '自 Word 貼上',
-		advice : '請使用快捷鍵 (<strong>Ctrl+V</strong>) 貼到下方區域中並按下 <strong>確定</strong>',
-		ignoreFontFace : '移除字型設定',
-		removeStyle : '移除樣式設定'
+		error : 'It was not possible to clean up the pasted data due to an internal error' // MISSING
 	},
 
Index: /CKEditor/branches/versions/3.1.x/_source/plugins/clipboard/dialogs/paste.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/plugins/clipboard/dialogs/paste.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/plugins/clipboard/dialogs/paste.js	(revision 4772)
@@ -119,5 +119,5 @@
 
 			setTimeout( function(){
-				editor.insertHtml( html );
+				editor.fire( 'paste', { 'html' : html } );
 			}, 0 );
 
Index: /CKEditor/branches/versions/3.1.x/_source/plugins/clipboard/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/plugins/clipboard/plugin.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/plugins/clipboard/plugin.js	(revision 4772)
@@ -79,26 +79,28 @@
 	// Paste command.
 	var pasteCmd =
-		CKEDITOR.env.ie ?
-			{
-				exec : function( editor, data )
+	{ 
+		canUndo : false,
+
+		exec : 
+			CKEDITOR.env.ie ?
+				function( editor )
 				{
 					// Prevent IE from pasting at the begining of the document.
 					editor.focus();
 
-					if ( !editor.fire( 'beforePaste' )
-						&& !execIECommand( editor, 'paste' ) )
-					{
-							editor.openDialog( 'paste' );
-					}
-				}
-			}
-		:
-			{
-				exec : function( editor )
+					if ( !editor.document.getBody().fire( 'beforepaste' )
+						 && !execIECommand( editor, 'paste' ) )
+					{
+						editor.fire( 'pasteDialog' );
+						return false;
+					}
+				}
+			:
+				function( editor )
 				{
 					try
 					{
-						if ( !editor.fire( 'beforePaste' )
-							&& !editor.document.$.execCommand( 'Paste', false, null ) )
+						if ( !editor.document.getBody().fire( 'beforepaste' )
+							 && !editor.document.$.execCommand( 'Paste', false, null ) )
 						{
 							throw 0;
@@ -107,13 +109,19 @@
 					catch ( e )
 					{
-						// Open the paste dialog.
-						editor.openDialog( 'paste' );
-					}
-				}
-			};
+						setTimeout( function()
+							{
+								editor.fire( 'pasteDialog' );
+							}, 0 );
+						return false;
+					}
+				}
+	};
 
 	// Listens for some clipboard related keystrokes, so they get customized.
 	var onKey = function( event )
 	{
+		if ( this.mode != 'wysiwyg' )
+			return;
+
 		switch ( event.data.keyCode )
 		{
@@ -122,14 +130,13 @@
 			case CKEDITOR.SHIFT + 45 :		// SHIFT+INS
 
-				var editor = this;
-				editor.fire( 'saveSnapshot' );		// Save before paste
-
-				if ( editor.fire( 'beforePaste' ) )
+				var body = this.document.getBody();
+
+				// Simulate 'beforepaste' event for all none-IEs.
+				if ( !CKEDITOR.env.ie && body.fire( 'beforepaste' ) )
 					event.cancel();
-
-				setTimeout( function()
-					{
-						editor.fire( 'saveSnapshot' );		// Save after paste
-					}, 0 );
+				// Simulate 'paste' event for Opera/Firefox2.
+				else if ( CKEDITOR.env.opera
+						 || CKEDITOR.env.gecko && CKEDITOR.env.version < 10900 )
+					body.fire( 'paste' );
 				return;
 
@@ -139,6 +146,6 @@
 
 				// Save Undo snapshot.
-				editor = this;
-				editor.fire( 'saveSnapshot' );		// Save before paste
+				var editor = this;
+				this.fire( 'saveSnapshot' );		// Save before paste
 				setTimeout( function()
 					{
@@ -148,9 +155,110 @@
 	};
 
+	// Allow to peek clipboard content by redirecting the
+	// pasting content into a temporary bin and grab the content of it.
+	function getClipboardData( evt, mode, callback )
+	{
+		var doc = this.document;
+
+		// Avoid recursions on 'paste' event for IE.
+		if ( CKEDITOR.env.ie && doc.getById( 'cke_pastebin' ) )
+			return;
+
+		var sel = this.getSelection(),
+			range = new CKEDITOR.dom.range( doc );
+
+		// Create container to paste into
+		var pastebin = new CKEDITOR.dom.element( mode == 'text' ? 'textarea' : 'div', doc );
+		pastebin.setAttribute( 'id', 'cke_pastebin' );
+		doc.getBody().append( pastebin );
+
+		// It's definitely a better user experience if we make the paste-bin pretty unnoticed
+		// by pulling it off the screen, while this hack will make the paste-bin a control type element
+		// and that become a selection plain later. 
+		if ( !CKEDITOR.env.ie && mode != 'html' )
+		{
+			pastebin.setStyles(
+				{
+					position : 'absolute',
+					left : '-1000px',
+					// Position the bin exactly at the position of the selected element
+					// to avoid any subsequent document scroll.
+					top : sel.getStartElement().getDocumentPosition().y + 'px',
+					width : '1px',
+					height : '1px',
+					overflow : 'hidden'
+				});
+		}
+
+		var bms = sel.createBookmarks();
+
+		// Turn off design mode temporarily before give focus to the paste bin.
+		if ( mode == 'text' )
+		{
+			if ( CKEDITOR.env.ie )
+			{
+				var ieRange = doc.getBody().$.createTextRange();
+				ieRange.moveToElementText( pastebin.$ );
+				ieRange.execCommand( 'Paste' );
+				evt.data.preventDefault();
+			}
+			else
+			{
+				doc.$.designMode = 'off';
+				pastebin.$.focus();
+			}
+		}
+		else
+		{
+			range.setStartAt( pastebin, CKEDITOR.POSITION_AFTER_START );
+			range.setEndAt( pastebin, CKEDITOR.POSITION_BEFORE_END );
+			range.select( true );
+		}
+
+		// Wait a while and grab the pasted contents
+		window.setTimeout( function()
+		{
+			mode == 'text' && !CKEDITOR.env.ie && ( doc.$.designMode = 'on' );
+			pastebin.remove();
+
+			// Grab the HTML contents.
+			// We need to look for a apple style wrapper on webkit it also adds
+			// a div wrapper if you copy/paste the body of the editor.
+			// Remove hidden div and restore selection.
+			var bogusSpan;
+			pastebin = ( CKEDITOR.env.webkit
+						 && ( bogusSpan = pastebin.getFirst() )
+						 && ( bogusSpan.is && bogusSpan.hasClass( 'Apple-style-span' ) ) ?
+							bogusSpan : pastebin );
+
+			sel.selectBookmarks( bms );
+			callback( pastebin[ 'get' + ( mode == 'text' ? 'Value' : 'Html' ) ]() );
+		}, 0 );
+	};
+
 	// Register the plugin.
 	CKEDITOR.plugins.add( 'clipboard',
 		{
+			requires : [ 'htmldataprocessor' ],
 			init : function( editor )
 			{
+				// Inserts processed data into the editor at the end of the
+				// events chain.
+				editor.on( 'paste', function( evt )
+					{
+						var data = evt.data;
+						if ( data[ 'html' ] )
+							editor.insertHtml( data[ 'html' ] );
+						else if ( data[ 'text' ] )
+							editor.insertText( data[ 'text' ] );
+
+					}, null, null, 1000 );
+
+				editor.on( 'pasteDialog', function( evt )
+					{
+						// Open default paste dialog. 
+						editor.openDialog( 'paste' );
+					});
+
 				function addButtonCommand( buttonName, commandName, command, ctxMenuOrder )
 				{
@@ -185,4 +293,30 @@
 				editor.on( 'key', onKey, editor );
 
+				var mode = editor.config.forcePasteAsPlainText ? 'text' : 'html';
+
+				// We'll be catching all pasted content in one line, regardless of whether the
+				// it's introduced by a document command execution (e.g. toolbar buttons) or
+				// user paste behaviors. (e.g. Ctrl-V)
+				editor.on( 'contentDom', function()
+				{
+					var body = editor.document.getBody();
+					body.on( ( mode == 'text' && CKEDITOR.env.ie ) ? 'paste' : 'beforepaste',
+						function( evt )
+						{
+							getClipboardData.call( editor, evt, mode, function ( data )
+							{
+								// The very last guard to make sure the
+								// paste has successfully happened.
+								if ( !data )
+									return;
+
+								var dataTransfer = {};
+								dataTransfer[ mode ] = data;
+								editor.fire( 'paste', dataTransfer );
+							} );
+						});
+
+				});
+
 				// If the "contextmenu" plugin is loaded, register the listeners.
 				if ( editor.contextMenu )
Index: /CKEditor/branches/versions/3.1.x/_source/plugins/dialog/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/plugins/dialog/plugin.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/plugins/dialog/plugin.js	(revision 4772)
@@ -672,4 +672,5 @@
 					this.fireOnce( 'load', {} );
 					this.fire( 'show', {} );
+					this._.editor.fire( 'dialogShow', this );
 
 					// Save the initial values of the dialog.
@@ -735,4 +736,5 @@
 		{
 			this.fire( 'hide', {} );
+			this._.editor.fire( 'dialogHide', this );
 
 			// Remove the dialog's element from the root document.
Index: /CKEditor/branches/versions/3.1.x/_source/plugins/enterkey/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/plugins/enterkey/plugin.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/plugins/enterkey/plugin.js	(revision 4772)
@@ -18,5 +18,266 @@
 	});
 
-	var forceMode,
+	CKEDITOR.plugins.enterkey =
+	{
+		enterBlock : function( editor, mode, range, forceMode )
+		{
+			// Get the range for the current selection.
+			range = range || getRange( editor );
+
+			var doc = range.document;
+
+			// Determine the block element to be used.
+			var blockTag = ( mode == CKEDITOR.ENTER_DIV ? 'div' : 'p' );
+
+			// Split the range.
+			var splitInfo = range.splitBlock( blockTag );
+
+			if ( !splitInfo )
+				return;
+
+			// Get the current blocks.
+			var previousBlock	= splitInfo.previousBlock,
+				nextBlock		= splitInfo.nextBlock;
+
+			var isStartOfBlock	= splitInfo.wasStartOfBlock,
+				isEndOfBlock	= splitInfo.wasEndOfBlock;
+
+			var node;
+
+			// If this is a block under a list item, split it as well. (#1647)
+			if ( nextBlock )
+			{
+				node = nextBlock.getParent();
+				if ( node.is( 'li' ) )
+				{
+					nextBlock.breakParent( node );
+					nextBlock.move( nextBlock.getNext(), true );
+				}
+			}
+			else if ( previousBlock && ( node = previousBlock.getParent() ) && node.is( 'li' ) )
+			{
+				previousBlock.breakParent( node );
+				range.moveToElementEditStart( previousBlock.getNext() );
+				previousBlock.move( previousBlock.getPrevious() );
+			}
+
+			// If we have both the previous and next blocks, it means that the
+			// boundaries were on separated blocks, or none of them where on the
+			// block limits (start/end).
+			if ( !isStartOfBlock && !isEndOfBlock )
+			{
+				// If the next block is an <li> with another list tree as the first
+				// child, we'll need to append a filler (<br>/NBSP) or the list item
+				// wouldn't be editable. (#1420)
+				if ( nextBlock.is( 'li' )
+					 && ( node = nextBlock.getFirst( CKEDITOR.dom.walker.invisible( true ) ) )
+					 && node.is && node.is( 'ul', 'ol' ) )
+					( CKEDITOR.env.ie ? doc.createText( '\xa0' ) : doc.createElement( 'br' ) ).insertBefore( node );
+
+				// Move the selection to the end block.
+				if ( nextBlock )
+					range.moveToElementEditStart( nextBlock );
+			}
+			else
+			{
+
+				if ( isStartOfBlock && isEndOfBlock && previousBlock.is( 'li' ) )
+				{
+					editor.execCommand( 'outdent' );
+					return;
+				}
+
+				var newBlock;
+
+				if ( previousBlock )
+				{
+					// Do not enter this block if it's a header tag, or we are in
+					// a Shift+Enter (#77). Create a new block element instead
+					// (later in the code).
+					if ( !forceMode && !headerTagRegex.test( previousBlock.getName() ) )
+					{
+						// Otherwise, duplicate the previous block.
+						newBlock = previousBlock.clone();
+					}
+				}
+				else if ( nextBlock )
+					newBlock = nextBlock.clone();
+
+				if ( !newBlock )
+					newBlock = doc.createElement( blockTag );
+
+				// Recreate the inline elements tree, which was available
+				// before hitting enter, so the same styles will be available in
+				// the new block.
+				var elementPath = splitInfo.elementPath;
+				if ( elementPath )
+				{
+					for ( var i = 0, len = elementPath.elements.length ; i < len ; i++ )
+					{
+						var element = elementPath.elements[ i ];
+
+						if ( element.equals( elementPath.block ) || element.equals( elementPath.blockLimit ) )
+							break;
+
+						if ( CKEDITOR.dtd.$removeEmpty[ element.getName() ] )
+						{
+							element = element.clone();
+							newBlock.moveChildren( element );
+							newBlock.append( element );
+						}
+					}
+				}
+
+				if ( !CKEDITOR.env.ie )
+					newBlock.appendBogus();
+
+				range.insertNode( newBlock );
+
+				// This is tricky, but to make the new block visible correctly
+				// we must select it.
+				// The previousBlock check has been included because it may be
+				// empty if we have fixed a block-less space (like ENTER into an
+				// empty table cell).
+				if ( CKEDITOR.env.ie && isStartOfBlock && ( !isEndOfBlock || !previousBlock.getChildCount() ) )
+				{
+					// Move the selection to the new block.
+					range.moveToElementEditStart( isEndOfBlock ? previousBlock : newBlock );
+					range.select();
+				}
+
+				// Move the selection to the new block.
+				range.moveToElementEditStart( isStartOfBlock && !isEndOfBlock ? nextBlock : newBlock );
+		}
+
+			if ( !CKEDITOR.env.ie )
+			{
+				if ( nextBlock )
+				{
+					// If we have split the block, adds a temporary span at the
+					// range position and scroll relatively to it.
+					var tmpNode = doc.createElement( 'span' );
+
+					// We need some content for Safari.
+					tmpNode.setHtml( '&nbsp;' );
+
+					range.insertNode( tmpNode );
+					tmpNode.scrollIntoView();
+					range.deleteContents();
+				}
+				else
+				{
+					// We may use the above scroll logic for the new block case
+					// too, but it gives some weird result with Opera.
+					newBlock.scrollIntoView();
+				}
+			}
+
+			range.select();
+		},
+
+		enterBr : function( editor, mode, range, forceMode )
+		{
+			// Get the range for the current selection.
+			range = range || getRange( editor );
+
+			var doc = range.document;
+
+			// Determine the block element to be used.
+			var blockTag = ( mode == CKEDITOR.ENTER_DIV ? 'div' : 'p' );
+
+			var isEndOfBlock = range.checkEndOfBlock();
+
+			var elementPath = new CKEDITOR.dom.elementPath( editor.getSelection().getStartElement() );
+
+			var startBlock = elementPath.block,
+				startBlockTag = startBlock && elementPath.block.getName();
+
+			var isPre = false;
+
+			if ( !forceMode && startBlockTag == 'li' )
+			{
+				enterBlock( editor, mode, range, forceMode );
+				return;
+			}
+
+			// If we are at the end of a header block.
+			if ( !forceMode && isEndOfBlock && headerTagRegex.test( startBlockTag ) )
+			{
+				// Insert a <br> after the current paragraph.
+				doc.createElement( 'br' ).insertAfter( startBlock );
+
+				// A text node is required by Gecko only to make the cursor blink.
+				if ( CKEDITOR.env.gecko )
+					doc.createText( '' ).insertAfter( startBlock );
+
+				// IE has different behaviors regarding position.
+				range.setStartAt( startBlock.getNext(), CKEDITOR.env.ie ? CKEDITOR.POSITION_BEFORE_START : CKEDITOR.POSITION_AFTER_START );
+			}
+			else
+			{
+				var lineBreak;
+
+				isPre = ( startBlockTag == 'pre' );
+
+				if ( isPre )
+					lineBreak = doc.createText( CKEDITOR.env.ie ? '\r' : '\n' );
+				else
+					lineBreak = doc.createElement( 'br' );
+
+				range.deleteContents();
+				range.insertNode( lineBreak );
+
+				// A text node is required by Gecko only to make the cursor blink.
+				// We need some text inside of it, so the bogus <br> is properly
+				// created.
+				if ( !CKEDITOR.env.ie )
+					doc.createText( '\ufeff' ).insertAfter( lineBreak );
+
+				// If we are at the end of a block, we must be sure the bogus node is available in that block.
+				if ( isEndOfBlock && !CKEDITOR.env.ie )
+					lineBreak.getParent().appendBogus();
+
+				// Now we can remove the text node contents, so the caret doesn't
+				// stop on it.
+				if ( !CKEDITOR.env.ie )
+					lineBreak.getNext().$.nodeValue = '';
+				// IE has different behavior regarding position.
+				if ( CKEDITOR.env.ie )
+					range.setStartAt( lineBreak, CKEDITOR.POSITION_AFTER_END );
+				else
+					range.setStartAt( lineBreak.getNext(), CKEDITOR.POSITION_AFTER_START );
+
+				// Scroll into view, for non IE.
+				if ( !CKEDITOR.env.ie )
+				{
+					var dummy = null;
+
+					// BR is not positioned in Opera and Webkit.
+					if ( !CKEDITOR.env.gecko )
+					{
+						dummy = doc.createElement( 'span' );
+						// We need have some contents for Webkit to position it
+						// under parent node. ( #3681)
+						dummy.setHtml('&nbsp;');
+					}
+					else
+						dummy = doc.createElement( 'br' );
+
+					dummy.insertBefore( lineBreak.getNext() );
+					dummy.scrollIntoView();
+					dummy.remove();
+				}
+			}
+
+			// This collapse guarantees the cursor will be blinking.
+			range.collapse( true );
+
+			range.select( isPre );
+		}
+	};
+
+	var plugin = CKEDITOR.plugins.enterkey,
+		enterBr = plugin.enterBr,
+		enterBlock = plugin.enterBlock,
 		headerTagRegex = /^h[1-6]$/;
 
@@ -25,10 +286,8 @@
 		// On SHIFT+ENTER we want to enforce the mode to be respected, instead
 		// of cloning the current block. (#77)
-		forceMode = 1;
-
-		return enter( editor, editor.config.shiftEnterMode );
+		return enter( editor, editor.config.shiftEnterMode, true );
 	}
 
-	function enter( editor, mode )
+	function enter( editor, mode, forceMode )
 	{
 		// Only effective within document.
@@ -44,9 +303,8 @@
 				editor.fire( 'saveSnapshot' );	// Save undo step.
 				if ( mode == CKEDITOR.ENTER_BR || editor.getSelection().getStartElement().hasAscendant( 'pre', true ) )
-					enterBr( editor, mode );
+					enterBr( editor, mode, null, forceMode );
 				else
-					enterBlock( editor, mode );
-
-				forceMode = 0;
+					enterBlock( editor, mode, null, forceMode );
+
 			}, 0 );
 
@@ -54,258 +312,4 @@
 	}
 
-	function enterBlock( editor, mode, range )
-	{
-		// Get the range for the current selection.
-		range = range || getRange( editor );
-
-		var doc = range.document;
-
-		// Determine the block element to be used.
-		var blockTag = ( mode == CKEDITOR.ENTER_DIV ? 'div' : 'p' );
-
-		// Split the range.
-		var splitInfo = range.splitBlock( blockTag );
-
-		if ( !splitInfo )
-			return;
-
-		// Get the current blocks.
-		var previousBlock	= splitInfo.previousBlock,
-			nextBlock		= splitInfo.nextBlock;
-
-		var isStartOfBlock	= splitInfo.wasStartOfBlock,
-			isEndOfBlock	= splitInfo.wasEndOfBlock;
-
-		var node;
-
-		// If this is a block under a list item, split it as well. (#1647)
-		if ( nextBlock )
-		{
-			node = nextBlock.getParent();
-			if ( node.is( 'li' ) )
-			{
-				nextBlock.breakParent( node );
-				nextBlock.move( nextBlock.getNext(), true );
-			}
-		}
-		else if ( previousBlock && ( node = previousBlock.getParent() ) && node.is( 'li' ) )
-		{
-			previousBlock.breakParent( node );
-			range.moveToElementEditStart( previousBlock.getNext() );
-			previousBlock.move( previousBlock.getPrevious() );
-		}
-
-		// If we have both the previous and next blocks, it means that the
-		// boundaries were on separated blocks, or none of them where on the
-		// block limits (start/end).
-		if ( !isStartOfBlock && !isEndOfBlock )
-		{
-			// If the next block is an <li> with another list tree as the first
-			// child, we'll need to append a filler (<br>/NBSP) or the list item
-			// wouldn't be editable. (#1420)
-			if ( nextBlock.is( 'li' )
-				 && ( node = nextBlock.getFirst( CKEDITOR.dom.walker.invisible( true ) ) )
-				 && node.is && node.is( 'ul', 'ol' ) )
-				( CKEDITOR.env.ie ? doc.createText( '\xa0' ) : doc.createElement( 'br' ) ).insertBefore( node );
-
-			// Move the selection to the end block.
-			if ( nextBlock )
-				range.moveToElementEditStart( nextBlock );
-		}
-		else
-		{
-
-			if ( isStartOfBlock && isEndOfBlock && previousBlock.is( 'li' ) )
-			{
-				editor.execCommand( 'outdent' );
-				return;
-			}
-
-			var newBlock;
-
-			if ( previousBlock )
-			{
-				// Do not enter this block if it's a header tag, or we are in
-				// a Shift+Enter (#77). Create a new block element instead
-				// (later in the code).
-				if ( !forceMode && !headerTagRegex.test( previousBlock.getName() ) )
-				{
-					// Otherwise, duplicate the previous block.
-					newBlock = previousBlock.clone();
-				}
-			}
-			else if ( nextBlock )
-				newBlock = nextBlock.clone();
-
-			if ( !newBlock )
-				newBlock = doc.createElement( blockTag );
-
-			// Recreate the inline elements tree, which was available
-			// before hitting enter, so the same styles will be available in
-			// the new block.
-			var elementPath = splitInfo.elementPath;
-			if ( elementPath )
-			{
-				for ( var i = 0, len = elementPath.elements.length ; i < len ; i++ )
-				{
-					var element = elementPath.elements[ i ];
-
-					if ( element.equals( elementPath.block ) || element.equals( elementPath.blockLimit ) )
-						break;
-
-					if ( CKEDITOR.dtd.$removeEmpty[ element.getName() ] )
-					{
-						element = element.clone();
-						newBlock.moveChildren( element );
-						newBlock.append( element );
-					}
-				}
-			}
-
-			if ( !CKEDITOR.env.ie )
-				newBlock.appendBogus();
-
-			range.insertNode( newBlock );
-
-			// This is tricky, but to make the new block visible correctly
-			// we must select it.
-			// The previousBlock check has been included because it may be
-			// empty if we have fixed a block-less space (like ENTER into an
-			// empty table cell).
-			if ( CKEDITOR.env.ie && isStartOfBlock && ( !isEndOfBlock || !previousBlock.getChildCount() ) )
-			{
-				// Move the selection to the new block.
-				range.moveToElementEditStart( isEndOfBlock ? previousBlock : newBlock );
-				range.select();
-			}
-
-			// Move the selection to the new block.
-			range.moveToElementEditStart( isStartOfBlock && !isEndOfBlock ? nextBlock : newBlock );
-		}
-
-		if ( !CKEDITOR.env.ie )
-		{
-			if ( nextBlock )
-			{
-				// If we have split the block, adds a temporary span at the
-				// range position and scroll relatively to it.
-				var tmpNode = doc.createElement( 'span' );
-
-				// We need some content for Safari.
-				tmpNode.setHtml( '&nbsp;' );
-
-				range.insertNode( tmpNode );
-				tmpNode.scrollIntoView();
-				range.deleteContents();
-			}
-			else
-			{
-				// We may use the above scroll logic for the new block case
-				// too, but it gives some weird result with Opera.
-				newBlock.scrollIntoView();
-			}
-		}
-
-		range.select();
-	}
-
-	function enterBr( editor, mode )
-	{
-		// Get the range for the current selection.
-		var range = getRange( editor ),
-			doc = range.document;
-
-		// Determine the block element to be used.
-		var blockTag = ( mode == CKEDITOR.ENTER_DIV ? 'div' : 'p' );
-
-		var isEndOfBlock = range.checkEndOfBlock();
-
-		var elementPath = new CKEDITOR.dom.elementPath( editor.getSelection().getStartElement() );
-
-		var startBlock = elementPath.block,
-			startBlockTag = startBlock && elementPath.block.getName();
-
-		var isPre = false;
-
-		if ( !forceMode && startBlockTag == 'li' )
-		{
-			enterBlock( editor, mode, range );
-			return;
-		}
-
-		// If we are at the end of a header block.
-		if ( !forceMode && isEndOfBlock && headerTagRegex.test( startBlockTag ) )
-		{
-			// Insert a <br> after the current paragraph.
-			doc.createElement( 'br' ).insertAfter( startBlock );
-
-			// A text node is required by Gecko only to make the cursor blink.
-			if ( CKEDITOR.env.gecko )
-				doc.createText( '' ).insertAfter( startBlock );
-
-			// IE has different behaviors regarding position.
-			range.setStartAt( startBlock.getNext(), CKEDITOR.env.ie ? CKEDITOR.POSITION_BEFORE_START : CKEDITOR.POSITION_AFTER_START );
-		}
-		else
-		{
-			var lineBreak;
-
-			isPre = ( startBlockTag == 'pre' );
-
-			if ( isPre )
-				lineBreak = doc.createText( CKEDITOR.env.ie ? '\r' : '\n' );
-			else
-				lineBreak = doc.createElement( 'br' );
-
-			range.deleteContents();
-			range.insertNode( lineBreak );
-
-			// A text node is required by Gecko only to make the cursor blink.
-			// We need some text inside of it, so the bogus <br> is properly
-			// created.
-			if ( !CKEDITOR.env.ie )
-				doc.createText( '\ufeff' ).insertAfter( lineBreak );
-
-			// If we are at the end of a block, we must be sure the bogus node is available in that block.
-			if ( isEndOfBlock && !CKEDITOR.env.ie )
-				lineBreak.getParent().appendBogus();
-
-			// Now we can remove the text node contents, so the caret doesn't
-			// stop on it.
-			if ( !CKEDITOR.env.ie )
-				lineBreak.getNext().$.nodeValue = '';
-			// IE has different behavior regarding position.
-			if ( CKEDITOR.env.ie )
-				range.setStartAt( lineBreak, CKEDITOR.POSITION_AFTER_END );
-			else
-				range.setStartAt( lineBreak.getNext(), CKEDITOR.POSITION_AFTER_START );
-
-			// Scroll into view, for non IE.
-			if ( !CKEDITOR.env.ie )
-			{
-				var dummy = null;
-
-				// BR is not positioned in Opera and Webkit.
-				if ( !CKEDITOR.env.gecko )
-				{
-					dummy = doc.createElement( 'span' );
-					// We need have some contents for Webkit to position it
-					// under parent node. ( #3681)
-					dummy.setHtml('&nbsp;');
-				}
-				else
-					dummy = doc.createElement( 'br' );
-
-				dummy.insertBefore( lineBreak.getNext() );
-				dummy.scrollIntoView();
-				dummy.remove();
-			}
-		}
-
-		// This collapse guarantees the cursor will be blinking.
-		range.collapse( true );
-
-		range.select( isPre );
-	}
 
 	function getRange( editor )
Index: /CKEditor/branches/versions/3.1.x/_source/plugins/fakeobjects/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/plugins/fakeobjects/plugin.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/plugins/fakeobjects/plugin.js	(revision 4772)
@@ -12,5 +12,6 @@
 			$ : function( element )
 			{
-				var realHtml = element.attributes._cke_realelement,
+				var attributes = element.attributes,
+					realHtml = attributes && attributes._cke_realelement,
 					realFragment = realHtml && new CKEDITOR.htmlParser.fragment.fromHtml( decodeURIComponent( realHtml ) ),
 					realElement = realFragment && realFragment.children[ 0 ];
Index: /CKEditor/branches/versions/3.1.x/_source/plugins/htmldataprocessor/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/plugins/htmldataprocessor/plugin.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/plugins/htmldataprocessor/plugin.js	(revision 4772)
@@ -1,3 +1,3 @@
-﻿/*
+/*
 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
 For licensing, see LICENSE.html or http://ckeditor.com/license
Index: /CKEditor/branches/versions/3.1.x/_source/plugins/pagebreak/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/plugins/pagebreak/plugin.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/plugins/pagebreak/plugin.js	(revision 4772)
@@ -56,5 +56,6 @@
 						div : function( element )
 						{
-							var style = element.attributes.style,
+							var attributes = element.attributes
+								style = attributes && attributes.style,
 								child = style && element.children.length == 1 && element.children[ 0 ],
 								childStyle = child && ( child.name == 'span' ) && child.attributes.style;
Index: /CKEditor/branches/versions/3.1.x/_source/plugins/pastefromword/filter/default.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/plugins/pastefromword/filter/default.js	(revision 4772)
+++ /CKEditor/branches/versions/3.1.x/_source/plugins/pastefromword/filter/default.js	(revision 4772)
@@ -0,0 +1,1089 @@
+/*
+Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+(function()
+{
+	var fragmentPrototype = CKEDITOR.htmlParser.fragment.prototype,
+		elementPrototype = CKEDITOR.htmlParser.element.prototype;
+
+	fragmentPrototype.onlyChild = elementPrototype.onlyChild = function()
+	{
+		var children = this.children,
+			count = children.length,
+			firstChild = ( count == 1 ) && children[ 0 ];
+		return firstChild || null;
+	};
+
+	elementPrototype.removeAnyChildWithName = function( tagName )
+	{
+		var children = this.children,
+			childs = [],
+			child;
+
+		for ( var i = 0; i < children.length; i++ )
+		{
+			child = children[ i ];
+			if( !child.name )
+				continue;
+
+			if ( child.name == tagName )
+			{
+				childs.push( child );
+				children.splice( i--, 1 );
+			}
+			childs = childs.concat( child.removeAnyChildWithName( tagName ) );
+		}
+		return childs;
+	};
+
+	elementPrototype.getAncestor = function( tagNameRegex )
+	{
+		var parent = this.parent;
+		while ( parent && !( parent.name && parent.name.match( tagNameRegex ) ) )
+			parent = parent.parent;
+		return parent;
+	};
+
+	fragmentPrototype.firstChild = elementPrototype.firstChild = function( evaluator )
+	{
+		var child;
+		for ( var i = 0 ; i < this.children.length ; i++ )
+		{
+			child = this.children[ i ];
+			if ( evaluator( child ) )
+				return child;
+			else if ( child.name )
+			{
+				child = child.firstChild( evaluator );
+				if( child )
+					return child;
+				else
+					continue;
+			}
+		}
+	};
+
+	// Adding a (set) of styles to the element's attributes.
+	elementPrototype.addStyle = function( name, value, isPrepend )
+	{
+		var styleText, addingStyleText = '';
+		// name/value pair.
+		if ( typeof value == 'string' )
+			addingStyleText += name + ':' + value + ';';
+		else
+		{
+			// style literal.
+			if ( typeof name == 'object' )
+			{
+				for( var style in name )
+				{
+					if( name.hasOwnProperty( style) )
+						addingStyleText += style + ':' + name[ style ] + ';';
+				}
+				// Avoid CKPackager produce buggy output (#4695)
+				// TODO: Remove after CKPackager get fixed.
+				;
+			}
+			// raw style text form.
+			else
+				addingStyleText += name;
+
+			isPrepend = value;
+		}
+
+		if( !this.attributes )
+			this.attributes = {};
+
+		styleText = this.attributes.style || '';
+
+		styleText = ( isPrepend ?
+		              [ addingStyleText, styleText ]
+					  : [ styleText, addingStyleText ] ).join( ';' );
+
+		this.attributes.style = styleText.replace( /^;|;(?=;)/, '' );
+	};
+
+	/**
+	 * Return the DTD-valid parent tag names of the specified one.
+	 * @param tagName
+	 */
+	CKEDITOR.dtd.parentOf = function( tagName )
+	{
+		var result = {};
+		for ( var tag in this )
+		{
+			if ( tag.indexOf( '$' ) == -1 && this[ tag ][ tagName ] )
+				result[ tag ] = 1;
+		}
+		return result;
+	};
+
+	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 emptyMarginRegex = /^(?:\b0[^\s]*\s*){1,4}$/;
+
+	CKEDITOR.plugins.pastefromword =
+	{
+		utils :
+		{
+			// Create a <cke:listbullet> which indicate an list item type.
+			createListBulletMarker : function ( bulletStyle, bulletText )
+			{
+				var marker = new CKEDITOR.htmlParser.element( 'cke:listbullet' ),
+					listType;
+
+				// TODO: Support more list style type from MS-Word.
+				if ( !bulletStyle )
+				{
+					bulletStyle = 'decimal';
+					listType = 'ol';
+				}
+				else if ( bulletStyle[ 2 ] )
+				{
+					if ( !isNaN( bulletStyle[ 1 ] ) )
+						bulletStyle = 'decimal';
+					// No way to distinguish between Roman numerals and Alphas,
+					// detect them as a whole.
+					else if ( /^[a-z]+$/.test( bulletStyle[ 1 ] ) )
+						bulletStyle = 'lower-alpha';
+					else if ( /^[A-Z]+$/.test( bulletStyle[ 1 ] ) )
+						bulletStyle = 'upper-alpha';
+					// Simply use decimal for the rest forms of unrepresentable
+					// numerals, e.g. Chinese...
+					else
+						bulletStyle = 'decimal';
+
+					listType = 'ol';
+				}
+				else
+				{
+					if ( /[l\u00B7\u2002]/.test( bulletStyle[ 1 ] ) ) //l·•
+						bulletStyle = 'disc';
+					else if ( /[\u006F\u00D8]/.test( bulletStyle[ 1 ] ) )  //oØ
+						bulletStyle = 'circle';
+					else if ( /[\u006E\u25C6]/.test( bulletStyle[ 1 ] ) ) //n◆
+						bulletStyle = 'square';
+					else
+						bulletStyle = 'disc';
+
+					listType = 'ul';
+				}
+
+				// Represent list type as CSS style.
+				marker.attributes =
+				{
+					'cke:listtype' : listType,
+					'style' : 'list-style-type:' + bulletStyle + ';'
+				};
+				marker.add( new CKEDITOR.htmlParser.text( bulletText ) );
+				return marker;
+			},
+
+			isListBulletIndicator : function( element )
+			{
+				var styleText = element.attributes && element.attributes.style;
+				if( /mso-list\s*:\s*Ignore/i.test( styleText ) )
+					return true;
+			},
+
+			isContainingOnlySpaces : function( element )
+			{
+				var text;
+				return ( ( text = element.onlyChild() )
+					    && /^(:?\s|&nbsp;)+$/.test( text.value ) );
+			},
+
+			resolveList : function( element )
+			{
+				// <cke:listbullet> indicate a list item.
+				var children = element.children,
+					attrs = element.attributes,
+					listMarker;
+
+				if ( ( listMarker = element.removeAnyChildWithName( 'cke:listbullet' ) )
+					  && listMarker.length
+					  && ( listMarker = listMarker[ 0 ] ) )
+				{
+					element.name = 'cke:li';
+
+					if ( attrs.style )
+					{
+						attrs.style = CKEDITOR.plugins.pastefromword.filters.stylesFilter(
+							[
+								// Text-indent is not representing list item level any more.
+								[ 'text-indent' ],
+								[ 'line-height' ],
+								// Resolve indent level from 'margin-left' value.
+								[ /^margin(:?-left)?$/, null, function( value )
+								{
+									// Be able to deal with component/short-hand form style.
+									var values = value.split( ' ' );
+									value = values[ 3 ] || values[ 1 ] || values [ 0 ];
+									attrs[ 'cke:indent' ] =
+										// Indent margin unit by 36pt.
+										Math.floor( parseInt( value ) / 36 );
+								} ]
+							] )( attrs.style, element ) || '' ;
+					}
+
+					// Inherit list-type-style from bullet.
+					var listBulletAttrs = listMarker.attributes,
+						listBulletStyle = listBulletAttrs.style;
+
+					element.addStyle( listBulletStyle );
+					CKEDITOR.tools.extend( attrs, listBulletAttrs );
+					return true;
+				}
+			},
+
+			// Convert various length units to 'px' in ignorance of DPI.
+			convertToPx : ( function ()
+			{
+				var calculator = CKEDITOR.dom.element.createFromHtml(
+								'<div style="position:absolute;left:-9999px;' +
+								'top:-9999px;margin:0px;padding:0px;border:0px;"' +
+								'></div>', CKEDITOR.document );
+				CKEDITOR.document.getBody().append( calculator );
+
+				return function( cssLength )
+				{
+					if( cssLength.indexOf( '%' ) == -1 )
+					{
+						calculator.setStyle( 'width', cssLength );
+						return calculator.$.clientWidth + 'px';
+					}
+					
+					return cssLength;
+				};
+			} )(),
+
+			listDtdParents : CKEDITOR.dtd.parentOf( 'ol' )
+		},
+
+		filters :
+		{
+				// Transform a normal list into flat list items only presentation.
+				// E.g. <ul><li>level1<ol><li>level2</li></ol></li> =>
+				// <cke:li cke:listtype="ul" cke:indent="1">level1</cke:li>
+				// <cke:li cke:listtype="ol" cke:indent="2">level2</cke:li>
+				flattenList : function( element )
+				{
+					var	attrs = element.attributes,
+						parent = element.parent;
+
+					var listStyleType,
+						indentLevel = 1;
+
+					// Resolve how many level nested.
+					while ( parent )
+					{
+						parent.attributes && parent.attributes[ 'cke:list'] && indentLevel++;
+						parent = parent.parent;
+					}
+
+					// All list items are of the same type.
+					switch ( attrs.type )
+					{
+						case 'a' :
+							listStyleType = 'lower-alpha';
+							break;
+						// TODO: Support more list style type from MS-Word.
+					}
+
+					var children = element.children,
+						child;
+
+					for ( var i = 0; i < children.length; i++ )
+					{
+						child = children[ i ];
+						var attributes = child.attributes;
+
+						if( child.name in CKEDITOR.dtd.$listItem )
+						{
+							var listItemChildren = child.children,
+								count = listItemChildren.length,
+								last = listItemChildren[ count - 1 ];
+
+							// Move out nested list.
+							if( last.name in CKEDITOR.dtd.$list )
+							{
+								children.splice( i + 1, 0, last );
+								last.parent = element;
+
+								// Remove the parent list item if it's just a holder.
+								if ( !--listItemChildren.length )
+									children.splice( i, 1 );
+							}
+
+							child.name = 'cke:li';
+							attributes[ 'cke:indent' ] = indentLevel;
+							attributes[ 'cke:listtype' ] = element.name;
+							listStyleType && child.addStyle( 'list-style-type', listStyleType, true );
+						}
+					}
+
+					delete element.name;
+
+					// We're loosing tag name here, signalize this element as a list.
+					attrs[ 'cke:list' ] = 1;
+				},
+
+				/**
+				 *  Try to collect all list items among the children and establish one
+				 *  or more HTML list structures for them.
+				 * @param element
+				 */
+				assembleList : function( element )
+				{
+					var children = element.children, child,
+							listItem,   // The current processing cke:li element.
+							listItemAttrs,
+							listType,   // Determine the root type of the list.
+							listItemIndent, // Indent level of current list item.
+							lastListItem, // The previous one just been added to the list.
+							list, parentList, // Current staging list and it's parent list if any.
+							indent;
+
+					for ( var i = 0; i < children.length; i++ )
+					{
+						child = children[ i ];
+
+						if ( 'cke:li' == child.name )
+						{
+							child.name = 'li';
+							listItem = child;
+							listItemAttrs = listItem.attributes;
+							listType = listItem.attributes[ 'cke:listtype' ];
+							// The indent attribute might not present.
+							listItemIndent = parseInt( listItemAttrs[ 'cke:indent' ] ) || 0;
+
+							// Ignore the 'list-style-type' attribute if it's matched with
+							// the list root element's default style type.
+							listItemAttrs.style && ( listItemAttrs.style =
+							        CKEDITOR.plugins.pastefromword.filters.stylesFilter(
+									[
+										[ 'list-style-type', listType == 'ol' ? 'decimal' : 'disc' ]
+									] )( listItemAttrs.style )
+									|| '' );
+
+							if ( !list )
+							{
+								parentList = list = new CKEDITOR.htmlParser.element( listType );
+								list.add( listItem );
+								children[ i ] = list;
+							}
+							else
+							{
+								if ( listItemIndent > indent )
+								{
+									parentList = list;
+									list = new CKEDITOR.htmlParser.element( listType );
+									list.add( listItem );
+									lastListItem.add( list );
+								}
+								else if ( listItemIndent < indent )
+								{
+									list = parentList;
+									parentList = list.parent ? list.parent.parent : list;
+									list.add( listItem );
+								}
+								else
+									list.add( listItem );
+
+								children.splice( i--, 1 );
+							}
+
+							lastListItem = listItem;
+							indent = listItemIndent;
+						}
+						else
+							list = null;
+					}
+				},
+			
+				/**
+				 * A simple filter which always rejecting.
+				 */
+				falsyFilter : function( value )
+				{
+					return false;
+				},
+
+				/**
+				 * A filter dedicated on the 'style' attribute filtering, e.g. dropping/replacing style properties.
+				 * @param styles {Array} in form of [ styleNameRegexp, styleValueRegexp,
+				 *  newStyleValue/newStyleGenerator, newStyleName ] where only the first
+				 *  parameter is mandatory.
+				 * @param whitelist {Boolean} Whether the {@param styles} will be considered as a white-list.
+				 */
+				stylesFilter : function( styles, whitelist )
+				{
+					return function( styleText, element )
+					{
+						 var rules = [];
+						// html-encoded quote might be introduced by 'font-family'
+						// from MS-Word which confused the following regexp. e.g.
+						//'font-family: &quot;Lucida, Console&quot;'
+						 styleText
+							.replace( /&quot;/g, '"' )
+							.replace( /\s*([^ :;]+)\s*:\s*([^;]+)\s*(?=;|$)/g,
+								 function( match, name, value )
+								 {
+									 name = name.toLowerCase();
+									 name == 'font-family' && ( value = value.replace( /["']/g, '' ) );
+
+									 var namePattern,
+										 valuePattern,
+										 newValue,
+										 newName;
+									 for( var i = 0 ; i < styles.length; i++ )
+									 {
+										if( styles[ i ] )
+										{
+											namePattern = styles[ i ][ 0 ];
+											valuePattern = styles[ i ][ 1 ];
+											newValue = styles[ i ][ 2 ];
+											newName = styles[ i ][ 3 ];
+
+											if ( name.match( namePattern )
+												 && ( !valuePattern || value.match( valuePattern ) ) )
+											{
+												name = newName || name;
+												whitelist && ( newValue = newValue || value );
+
+												if( typeof newValue == 'function' )
+													newValue = newValue( value, element );
+												if( typeof newValue == 'string' )
+													rules.push( [ name, newValue ] );
+												return;
+											}
+										}
+									 }
+									 
+									 !whitelist && rules.push( [ name, value ] );
+
+								 });
+
+						for ( var i = 0 ; i < rules.length ; i++ )
+							 rules[ i ] = rules[ i ].join( ':' );
+						return rules.length ?
+						         ( rules.join( ';' ) + ';' ) : false;
+					 };
+				},
+
+				/**
+				 * Migrate the element by decorate styles on it.
+				 * @param styleDefiniton
+				 * @param variables
+				 */
+				elementMigrateFilter : function ( styleDefiniton, variables )
+				{
+					return function( element )
+					{
+						var styleDef =
+								variables ?
+									new CKEDITOR.style( styleDefiniton, variables )._.definition
+									: styleDefiniton;
+						element.name = styleDef.element;
+						CKEDITOR.tools.extend( element.attributes, CKEDITOR.tools.clone( styleDef.attributes ) );
+						element.addStyle( CKEDITOR.style.getStyleText( styleDef ) );
+					}
+				},
+
+				/**
+				 * Migrate styles by creating a new nested stylish element.
+				 * @param styleDefinition
+				 */
+				styleMigrateFilter : function( styleDefinition, variableName )
+				{
+
+					var elementMigrateFilter = this.elementMigrateFilter;
+					return function( value, element )
+					{
+						// Build an stylish element first.
+						var styleElement = new CKEDITOR.htmlParser.element( null ),
+							variables = {};
+
+						variables[ variableName ] = value;
+						elementMigrateFilter( styleDefinition, variables )( styleElement );
+						// Place the new element inside the existing span.
+						styleElement.children = element.children;
+						element.children = [ styleElement ];
+					};
+				},
+
+				/**
+				 * A filter which remove cke-namespaced-attribute on
+				 * all none-cke-namespaced elements.
+				 * @param value
+				 * @param element
+				 */
+				bogusAttrFilter : function( value, element )
+				{
+					if( element.name.indexOf( 'cke:' ) == -1 )
+						return false;
+				},
+
+				/**
+				 * A filter which will be used to apply inline css style according the stylesheet
+				 * definition rules, is generated lazily when filtering.
+				 */
+				applyStyleFilter : null
+
+			},
+
+		getRules : function( editor )
+		{
+			var dtd = CKEDITOR.dtd,
+				blockLike = CKEDITOR.tools.extend( {}, dtd.$block, dtd.$listItem, dtd.$tableContent ),
+				config = editor.config,
+				filters = this.filters,
+				falsyFilter = filters.falsyFilter,
+				stylesFilter = filters.stylesFilter,
+				elementMigrateFilter = filters.elementMigrateFilter,
+				styleMigrateFilter = CKEDITOR.tools.bind( this.filters.styleMigrateFilter, this.filters ),
+				bogusAttrFilter = filters.bogusAttrFilter,
+				createListBulletMarker = this.utils.createListBulletMarker,
+				flattenList = filters.flattenList,
+				assembleList = filters.assembleList,
+				isListBulletIndicator = this.utils.isListBulletIndicator,
+				containsNothingButSpaces = this.utils.isContainingOnlySpaces,
+				resolveListItem = this.utils.resolveList,
+				convertToPx = this.utils.convertToPx,
+				listDtdParents = this.utils.listDtdParents,
+				removeFontStyles = config.pasteFromWordRemoveFontStyles !== false,
+				removeStyles = config.pasteFromWordRemoveStyles !== false;
+
+			return {
+
+				elementNames :
+				[
+					// Remove script, meta and link elements.
+					[ /meta|link|script/, '' ]
+				],
+
+				root : function( element )
+				{
+					element.filterChildren();
+					assembleList( element );
+				},
+				
+				elements :
+				{
+					'^' : function( element )
+					{
+						// Transform CSS style declaration to inline style.
+						var applyStyleFilter;
+						if ( CKEDITOR.env.gecko && ( applyStyleFilter = filters.applyStyleFilter ) )
+							applyStyleFilter( element );
+					},
+
+					$ : function( element )
+					{
+						var tagName = element.name || '',
+							attrs = element.attributes;
+
+						// Convert length unit of width/height on blocks to
+						// a more editor-friendly way (px).
+						if ( tagName in blockLike
+							&& attrs.style )
+						{
+							attrs.style = stylesFilter(
+										[ [ /^width|height$/, null, convertToPx ] ] )( attrs.style ) || '';
+						}
+
+						// Processing headings.
+						if ( tagName.match( /h\d/ ) )
+						{
+							element.filterChildren();
+							// Is the heading actually a list item?
+							if( resolveListItem( element ) )
+								return;
+
+							// Adapt heading styles to editor's convention.
+							elementMigrateFilter( config[ 'format_' + tagName ] )( element );
+						}
+						// Remove inline elements which contain only empty spaces.
+						else if ( tagName in dtd.$inline )
+						{
+							element.filterChildren();
+							if ( containsNothingButSpaces( element ) )
+								delete element.name;
+						}
+						// Remove element with ms-office namespace,
+						// with it's content preserved, e.g. 'o:p'. 
+						else if ( tagName.indexOf( ':' ) != -1
+								 && tagName.indexOf( 'cke' ) == -1 )
+						{
+							element.filterChildren();
+
+							// Restore image real link from vml.
+							if ( tagName == 'v:imagedata' )
+							{
+								var href = element.attributes[ 'o:href' ];
+								if ( href )
+									element.attributes.src = href;
+								element.name = 'img';
+								return;
+							}
+							delete element.name;
+						}
+
+						// Assembling list items into a whole list.
+						if ( tagName in listDtdParents )
+						{
+							element.filterChildren();
+							assembleList( element );
+						}
+					},
+
+					// We'll drop any style sheet, but Firefox conclude
+					// certain styles in a single style element, which are
+					// required to be changed into inline ones.
+					'style' : function( element )
+					{
+						if ( CKEDITOR.env.gecko )
+						{
+							// Grab only the style definition section.
+							var styleDefSection = element.onlyChild().value.match( /\/\* Style Definitions \*\/([\s\S]*?)\/\*/ ),
+								styleDefText = styleDefSection && styleDefSection[ 1 ],
+								rules = {}; // Storing the parsed result.
+
+							if ( styleDefText )
+							{
+								styleDefText
+									// Remove line-breaks.
+									.replace(/[\n\r]/g,'')
+									// Extract selectors and style properties.
+									.replace( /(.+?)\{(.+?)\}/g,
+										function( rule, selectors, styleBlock )
+										{
+											selectors = selectors.split( ',' );
+											var length = selectors.length, selector;
+											for ( var i = 0; i < length; i++ )
+											{
+												// Assume MS-Word mostly generate only simple
+												// selector( [Type selector][Class selector]).
+												CKEDITOR.tools.trim( selectors[ i ] )
+															  .replace( /^(\w+)(\.[\w-]+)?$/g,
+												function( match, tagName, className )
+												{
+													tagName = tagName || '*';
+													className = className.substring( 1, className.length );
+
+													// Reject MS-Word Normal styles.
+													if( className.match( /MsoNormal/ ) )
+														return;
+
+													if( !rules[ tagName ] )
+														rules[ tagName ] = {};
+													if( className )
+														rules[ tagName ][ className ] = styleBlock;
+													else
+														rules[ tagName ] = styleBlock;
+												} );
+											}
+										});
+
+								filters.applyStyleFilter = function( element )
+								{
+									var name = rules[ '*' ] ? '*' : element.name,
+										className = element.attributes && element.attributes[ 'class' ],
+										style;
+									if( name in rules )
+									{
+										style = rules[ name ];
+										if( typeof style == 'object' )
+											style = style[ className ];
+										// Maintain style rules priorities.
+										style && element.addStyle( style, true );
+									}
+								};
+							}
+						}
+						return false;
+					},
+
+					'p' : function( element )
+					{
+						element.filterChildren();
+
+						var attrs = element.attributes,
+							parent = element.parent,
+							children = element.children;
+
+						// Is the paragraph actually a list item?
+						if ( resolveListItem( element ) )
+							return;
+
+						// Adapt paragraph formatting to editor's convention
+						// according to enter-mode.
+						if ( config.enterMode == CKEDITOR.ENTER_BR )
+						{
+							// We suffer from attribute/style lost in this situation.
+							delete element.name;
+							element.add( new CKEDITOR.htmlParser.element( 'br' ) );
+						}
+						else
+							elementMigrateFilter( config[ 'format_' + ( config.enterMode == CKEDITOR.ENTER_P ? 'p' : 'div' ) ] )( element );
+					},
+
+					'td' : function ( element )
+					{
+						// 'td' in 'thead' is actually <th>.
+						if ( element.getAncestor( 'thead') )
+							element.name = 'th';
+					},
+
+					// MS-Word sometimes present list as a mixing of normal list
+					// and pseudo-list, normalize the previous ones into pseudo form.
+					'ol' : flattenList,
+					'ul' : flattenList,
+					'dl' : flattenList,
+
+					'font' : function( element )
+					{
+						// IE/Safari: drop the font tag if it comes from list bullet text.
+						if ( !CKEDITOR.env.gecko && isListBulletIndicator( element.parent ) )
+						{
+							delete element.name;
+							return;
+						}
+
+						element.filterChildren();
+
+						var attrs = element.attributes,
+							styleText = attrs.style,
+							parent = element.parent;
+
+						if ( 'font' == parent.name )     // Merge nested <font> tags.
+						{
+							CKEDITOR.tools.extend( parent.attributes,
+									element.attributes );
+							styleText && parent.addStyle( styleText );
+							delete element.name;
+							return;
+						}
+						// Convert the merged into a span with all attributes preserved.
+						else
+						{
+							styleText = styleText || '';
+							// IE's having those deprecated attributes, normalize them.
+							if ( attrs.color )
+							{
+								attrs.color != '#000000' && ( styleText += 'color:' + attrs.color + ';' );
+								delete attrs.color;
+							}
+							if ( attrs.face )
+							{
+								styleText += 'font-family:' + attrs.face + ';';
+								delete attrs.face;
+							}
+							// TODO: Mapping size in ranges of xx-small,
+							// x-small, small, medium, large, x-large, xx-large.
+							if ( attrs.size )
+							{
+								styleText += 'font-size:' +
+								             ( attrs.size > 3 ? 'large'
+										             : ( attrs.size < 3 ? 'small' : 'medium' ) ) + ';';
+								delete attrs.size;
+							}
+
+							element.name = 'span';
+							element.addStyle( styleText );
+						}
+					},
+
+					'span' : function( element )
+					{
+						// IE/Safari: remove the span if it comes from list bullet text.
+						if ( !CKEDITOR.env.gecko && isListBulletIndicator( element.parent ) )
+							return false;
+
+						element.filterChildren();
+						if ( containsNothingButSpaces( element ) )
+						{
+							delete element.name;
+							return;
+						}
+
+						// For IE/Safari: List item bullet type is supposed to be indicated by
+						// the text of a span with style 'mso-list : Ignore' or an image.
+						if ( !CKEDITOR.env.gecko && isListBulletIndicator( element ) )
+						{
+							var listSymbolNode = element.firstChild( function( node )
+							{
+								return node.value || node.name == 'img';
+							});
+
+							var listSymbol =  listSymbolNode && ( listSymbolNode.value || 'l.' ),
+								listType = listSymbol.match( /^([^\s]+?)([.)]?)$/ );
+							return createListBulletMarker( listType, listSymbol );
+						}
+
+						// Update the src attribute of image element with href.
+						var children = element.children,
+							attrs = element.attributes,
+							styleText = attrs && attrs.style,
+							firstChild = children && children[ 0 ];
+
+						// Assume MS-Word mostly carry font related styles on <span>,
+						// adapting them to editor's convention.
+						if ( styleText )
+						{
+							attrs.style = stylesFilter(
+									[
+										// Drop 'inline-height' style which make lines overlapping.
+										[ 'line-height' ],
+										[ /^font-family$/, null, !removeFontStyles ? styleMigrateFilter( config[ 'font_style' ], 'family' ) : null ] ,
+										[ /^font-size$/, null, !removeFontStyles ? styleMigrateFilter( config[ 'fontSize_style' ], 'size' ) : null ] ,
+										[ /^color$/, null, !removeFontStyles ? styleMigrateFilter( config[ 'colorButton_foreStyle' ], 'color' ) : null ] ,
+										[ /^background-color$/, null, !removeFontStyles ? styleMigrateFilter( config[ 'colorButton_backStyle' ], 'color' ) : null ]
+									] )( styleText, element ) || '';
+						}
+
+					},
+
+					// Migrate basic style formats to editor configured ones.
+					'b' : elementMigrateFilter( config[ 'coreStyles_bold' ] ),
+					'i' : elementMigrateFilter( config[ 'coreStyles_italic' ] ),
+					'u' : elementMigrateFilter( config[ 'coreStyles_underline' ] ),
+					's' : elementMigrateFilter( config[ 'coreStyles_strike' ] ),
+					'sup' : elementMigrateFilter( config[ 'coreStyles_superscript' ] ),
+					'sub' : elementMigrateFilter( config[ 'coreStyles_subscript' ] ),
+					// Editor doesn't support anchor with content currently (#3582),
+					// drop such anchors with content preserved.
+					'a' : function( element )
+					{
+						var attrs = element.attributes;
+						if( attrs && !attrs.href && attrs.name )
+							delete element.name;
+					},
+					'cke:listbullet' : function( element )
+					{
+						if ( element.getAncestor( /h\d/ ) && !config.pasteFromWordNumberedHeadingToList )
+							delete element.name;
+						}
+				},
+
+				attributeNames :
+				[
+					// Remove onmouseover and onmouseout events (from MS Word comments effect)
+					[ /^onmouse(:?out|over)/, '' ],
+					// Onload on image element.
+					[ /^onload$/, '' ],
+					// Remove office and vml attribute from elements.
+					[ /(?:v|o):\w+/, '' ],
+					// Remove lang/language attributes.
+					[ /^lang/, '' ]
+				],
+
+				attributes :
+				{
+					'style' : stylesFilter(
+					removeStyles ?
+					// Provide a white-list of styles that we preserve, those should
+					// be the ones that could later be altered with editor tools.
+					[
+						[ /^margin$|^margin-(?!bottom|top)/, null, function( value, element )
+							{
+								if( element.name in { p : 1, div : 1 }
+									&& !emptyMarginRegex.test( value ) )
+									return value;
+							} ],
+
+						[ /^border.*|margin.*|vertical-align|float$/ , null,
+							function( value, element )
+							{
+								if( element.name == 'img' )
+									return value;
+							} ],
+
+						[ /^width|height$/, null,
+							function( value, element )
+							{
+								if( element.name in { table : 1, td : 1, th : 1, img : 1 } )
+									return value;
+							} ]
+					] :
+					// Otherwise provide a black-list of styles that we remove.
+					[
+						[ /^mso-/ ],
+						// Fixing color values.
+						[ /-color$/, null, function( value )
+						{
+							if( value == 'transparent' )
+								return false;
+							if( CKEDITOR.env.gecko )
+								return value.replace( /-moz-use-text-color/g, 'transparent' );
+						} ],
+						// Remove empty margin values, e.g. 0.00001pt 0em 0pt
+						[ /^margin$/, emptyMarginRegex ],
+						[ 'text-indent', '0cm' ],
+						[ 'page-break-before' ],
+						[ 'tab-stops' ],
+						[ 'display', 'none' ],
+						removeFontStyles ? [ /font-?/ ] : null,
+					], removeStyles ),
+
+					// Prefer width styles over 'width' attributes.
+					'width' : function( value, element )
+					{
+						if( element.name in dtd.$tableContent )
+							return false;
+					},
+					// Prefer border styles over table 'border' attributes.
+					'border' : function( value, element )
+					{
+						if( element.name in dtd.$tableContent )
+							return false;
+					},
+
+					// Only Firefox carry style sheet from MS-Word, which
+					// will be applied by us manually. For other browsers
+					// the css className is useless.
+					'class' : falsyFilter,
+
+					// MS-Word always generate 'background-color' along with 'bgcolor',
+					// simply drop the deprecated attributes.
+					'bgcolor' : falsyFilter,
+
+					// Deprecate 'valign' attribute in favor of 'vertical-align'.
+					'valign' : removeStyles ? falsyFilter : function( value, element )
+					{
+						element.addStyle( 'vertical-align', value );
+						return false;
+					}
+				},
+
+				// Fore none-IE, some useful data might be buried under these IE-conditional
+				// comments where RegExp were the right approach to dig them out where usual approach
+				// is transform it into a fake element node which hold the desired data.
+				comment : 
+					!CKEDITOR.env.ie ? 
+						function( value, node )
+						{
+							var imageInfo = value.match( /<img.*?>/ ),
+								listInfo = value.match( /^\[if !supportLists\]([\s\S]*?)\[endif\]$/ );
+
+							// Seek for list bullet indicator.
+							if ( listInfo )
+							{
+								// Bullet symbol could be either text or an image.
+								var listSymbol = listInfo[ 1 ] || ( imageInfo && 'l.' ),
+									listType = listSymbol && listSymbol.match( />([^\s]+?)([.)]?)</ );
+								return createListBulletMarker( listType, listSymbol );
+							}
+
+							// Reveal the <img> element in conditional comments for Firefox.
+							if( CKEDITOR.env.gecko && imageInfo )
+							{
+								var img = CKEDITOR.htmlParser.fragment.fromHtml( imageInfo[ 0 ] ).children[ 0 ],
+									previousComment = node.previous,
+									// Try to dig the real image link from vml markup from previous comment text.
+									imgSrcInfo = previousComment && previousComment.value.match( /<v:imagedata[^>]*o:href=['"](.*?)['"]/ ),
+									imgSrc = imgSrcInfo && imgSrcInfo[ 1 ];
+
+								// Is there a real 'src' url to be used? 
+								imgSrc && ( img.attributes.src = imgSrc );
+								return img;
+							}
+
+							return false;
+						} 
+					: falsyFilter
+			};
+		}
+	};
+
+	// The paste processor here is just a reduced copy of html data processor.
+	var pasteProcessor = function()
+	{
+		this.dataFilter = new CKEDITOR.htmlParser.filter();
+	};
+
+	pasteProcessor.prototype =
+	{
+		toHtml : function( data )
+		{
+			var fragment = CKEDITOR.htmlParser.fragment.fromHtml( data, false ),
+				writer = new CKEDITOR.htmlParser.basicWriter();
+
+			fragment.writeHtml( writer, this.dataFilter );
+			return writer.getHtml( true );
+		}
+	};
+
+	CKEDITOR.cleanWord = function( data, editor )
+	{
+		// Firefox will be confused by those downlevel-revealed IE conditional
+		// comments, fixing them first( convert it to upperlevel-revealed one ).
+		// e.g. <![if !vml]>...<![endif]>
+		if( CKEDITOR.env.gecko )
+			data = data.replace( /(<!--\[if[^<]*?\])-->([\S\s]*?)<!--(\[endif\]-->)/gi, '$1$2$3' );
+
+		var dataProcessor = new pasteProcessor(),
+			dataFilter = dataProcessor.dataFilter;
+
+		// These rules will have higher priorities than default ones.
+		dataFilter.addRules( CKEDITOR.plugins.pastefromword.getRules( editor ) );
+
+		// Allow extending data filter rules. 
+		editor.fire( 'beforeCleanWord', { filter : dataFilter } );
+
+		try
+		{
+			data = dataProcessor.toHtml( data, false );
+		}
+		catch ( e )
+		{
+			alert( editor.lang.pastefromword.error );
+		}
+
+		/* Below post processing those things that are unable to delivered by filter rules. */
+
+		// Remove 'cke' namespaced attribute used in filter rules as marker.
+		data = data.replace( /cke:.*?".*?"/g, '' );
+
+		// Remove empty style attribute.
+		data = data.replace( /style=""/g, '' );
+
+		// Remove the dummy spans ( having no inline style ).
+		data = data.replace( /<span>/g, '' );
+
+		return data;
+	};
+})();
+
+/**
+ * Whether the ignore all font-related format styles, including:
+ * - font size;
+ * - font family;
+ * - font fore/background color;
+ * @name CKEDITOR.config.pasteFromWordRemoveFontStyles
+ * @type Boolean
+ * @default true
+ * @example
+ * config.pasteFromWordRemoveFontStyles = false;
+ */
+
+/**
+ * Whether transform MS-Word Outline Numbered Heading into html list.
+ * @name CKEDITOR.config.pasteFromWordNumberedHeadingToList
+ * @type Boolean
+ * @default false
+ * @example
+ * config.pasteFromWordNumberedHeadingToList = true;
+ */
+
+/**
+ * Whether remove element styles that can't be managed with editor, note that this
+ * this doesn't handle the font-specific styles, which depends on
+ * how {@link CKEDITOR.config.pasteFromWordRemoveFontStyles} is configured. 
+ * @name CKEDITOR.config.pasteFromWordRemoveStyles
+ * @type Boolean
+ * @default true
+ * @example
+ * config.pasteFromWordRemoveStyles = false;
+ */
Index: /CKEditor/branches/versions/3.1.x/_source/plugins/pastefromword/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/plugins/pastefromword/plugin.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/plugins/pastefromword/plugin.js	(revision 4772)
@@ -3,52 +3,114 @@
 For licensing, see LICENSE.html or http://ckeditor.com/license
 */
+(function()
+{
+	CKEDITOR.plugins.add( 'pastefromword',
+	{
+		init : function( editor )
+		{
 
-CKEDITOR.plugins.add( 'pastefromword',
-{
-	init : function( editor )
-	{
-		// Register the command.
-		editor.addCommand( 'pastefromword', new CKEDITOR.dialogCommand( 'pastefromword' ) );
+			// Flag indicate this command is actually been asked instead of a generic
+			// pasting.
+			var forceFromWord = 0;
+			var resetFromWord = function()
+				{
+					setTimeout( function() { forceFromWord = 0; }, 0 );
+				};
 
-		// Register the toolbar button.
-		editor.ui.addButton( 'PasteFromWord',
+			// Features bring by this command beside the normal process:
+			// 1. No more bothering of user about the clean-up.
+			// 2. Perform the clean-up even if content is not from MS-Word.
+			// (e.g. from a MS-Word similar application.)
+			editor.addCommand( 'pastefromword',
 			{
-				label : editor.lang.pastefromword.toolbar,
-				command : 'pastefromword'
-			} );
+				canUndo : false,
+				exec : function()
+				{
+					forceFromWord = 1;
+					if( editor.execCommand( 'paste' ) === false )
+					{
+						editor.on( 'dialogHide', function ( evt )
+							{
+								evt.removeListener();
+								resetFromWord();
+							});
+					}
+				}
+			});
 
-		// Register the dialog.
-		CKEDITOR.dialog.add( 'pastefromword', this.path + 'dialogs/pastefromword.js' );
-	}
-} );
+			// Register the toolbar button.
+			editor.ui.addButton( 'PasteFromWord',
+				{
+					label : editor.lang.pastefromword.toolbar,
+					command : 'pastefromword'
+				});
+
+			editor.on( 'paste', function( evt )
+			{
+				var data = evt.data,
+					mswordHtml;
+				
+				// MS-WORD format sniffing.
+				if ( ( mswordHtml = data[ 'html' ] )
+					 && ( forceFromWord || /(class=\"?Mso|style=\"[^\"]*\bmso\-|w:WordDocument)/.test( mswordHtml ) ) )
+				{
+					var isLazyLoad = this.loadFilterRules( function()
+						{
+							// Event continuation with the original data.
+							if ( isLazyLoad )
+								editor.fire( 'paste', data );
+							else if( !editor.config.pasteFromWordPromptCleanup
+							  || ( forceFromWord || confirm( editor.lang.pastefromword.confirmCleanup ) ) )
+							 {
+								data[ 'html' ] = CKEDITOR.cleanWord( mswordHtml, editor );
+							}
+						});
+
+					// The cleanup rules are to be loaded, we should just cancel
+					// this event.
+					isLazyLoad && evt.cancel();
+				}
+			}, this );
+		},
+
+		loadFilterRules : function( callback )
+		{
+
+			var isLoaded = CKEDITOR.cleanWord;
+
+			if ( isLoaded )
+				callback();
+			else
+			{
+				var filterFilePath = CKEDITOR.getUrl( 
+						CKEDITOR.config.pasteFromWordCleanupFile 
+						|| ( this.path + 'filter/default.js' ) );
+
+				// Load with busy indicator.
+				CKEDITOR.scriptLoader.load( filterFilePath, callback, null, false, true );
+			}
+
+			return !isLoaded;
+		}
+	});
+})();
 
 /**
- * Whether the "Ignore font face definitions" checkbox is enabled by default in
- * the Paste from Word dialog.
+ * Whether prompt the user about the clean-up of content from MS-Word.
+ * @name CKEDITOR.config.pasteFromWordPromptCleanup
  * @type Boolean
- * @default true
+ * @default undefined
  * @example
- * config.pasteFromWordIgnoreFontFace = false;
+ * config.pasteFromWordPromptCleanup = true;
  */
-CKEDITOR.config.pasteFromWordIgnoreFontFace = true;
 
 /**
- * Whether the "Remove styles definitions" checkbox is enabled by default in
- * the Paste from Word dialog.
- * @type Boolean
- * @default false
+ * The file that provides the MS-Word Filtering rules.
+ * Note: It's a global configuration which are shared by all editor instances.
+ * @name CKEDITOR.config.pasteFromWordCleanupFile
+ * @type String
+ * @default 'default'
  * @example
- * config.pasteFromWordRemoveStyle = true;
+ * // Load from 'pastefromword' plugin 'filter' sub folder (custom.js file).
+ * CKEDITOR.config.pasteFromWordCleanupFile = 'custom';
  */
-CKEDITOR.config.pasteFromWordRemoveStyle = false;
-
-/**
- * Whether to keep structure markup (&lt;h1&gt;, &lt;h2&gt;, etc.) or replace
- * it with elements that create more similar pasting results when pasting
- * content from Microsoft Word into the Paste from Word dialog.
- * @type Boolean
- * @default false
- * @example
- * config.pasteFromWordKeepsStructure = true;
- */
-CKEDITOR.config.pasteFromWordKeepsStructure = false;
Index: /CKEditor/branches/versions/3.1.x/_source/plugins/pastetext/dialogs/pastetext.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/plugins/pastetext/dialogs/pastetext.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/plugins/pastetext/dialogs/pastetext.js	(revision 4772)
@@ -24,7 +24,5 @@
 					// Get the textarea value.
 					var text = this.getContentElement( 'general', 'content' ).getInputElement().getValue();
-
-					// Inserts the text.
-					this.getParentEditor().insertText( text );
+					this.getParentEditor().fire( 'paste', { 'text' : text } );
 				},
 
Index: /CKEditor/branches/versions/3.1.x/_source/plugins/pastetext/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/plugins/pastetext/plugin.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/plugins/pastetext/plugin.js	(revision 4772)
@@ -1,3 +1,3 @@
-﻿/*
+/*
 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
 For licensing, see LICENSE.html or http://ckeditor.com/license
@@ -15,15 +15,55 @@
 		exec : function( editor )
 		{
-			// We use getClipboardData just to test if the clipboard access has
-			// been granted by the user.
-			if ( CKEDITOR.getClipboardData() === false || !window.clipboardData )
+			var clipboardText = CKEDITOR.tools.tryThese(
+				function()
+				{
+					var clipboardText = window.clipboardData.getData( 'Text' );
+					if ( !clipboardText )
+						throw 0;
+					return clipboardText;
+				},
+				function()
+				{
+					netscape.security.PrivilegeManager.enablePrivilege( "UniversalXPConnect" );
+
+					var clip = Components.classes[ "@mozilla.org/widget/clipboard;1" ]
+							.getService( Components.interfaces.nsIClipboard );
+					var trans = Components.classes[ "@mozilla.org/widget/transferable;1" ]
+							.createInstance( Components.interfaces.nsITransferable );
+					trans.addDataFlavor( "text/unicode" );
+					clip.getData( trans, clip.kGlobalClipboard );
+
+					var str = {}, strLength = {}, clipboardText;
+					trans.getTransferData( "text/unicode", str, strLength );
+					str = str.value.QueryInterface( Components.interfaces.nsISupportsString );
+					clipboardText = str.data.substring( 0, strLength.value / 2 );
+					return clipboardText;
+				}
+				// Any other approach that's working... 
+				);
+			
+			if ( !clipboardText )   // Clipboard access privilege is not granted.
 			{
 				editor.openDialog( 'pastetext' );
-				return;
+				return false;
 			}
-
-			editor.insertText( window.clipboardData.getData( 'Text' ) );
+			else
+				editor.fire( 'paste', { 'text' : clipboardText } );
 		}
 	};
+
+	function doInsertText( doc, text )
+	{
+		// Native text insertion.
+		if( CKEDITOR.env.ie )
+		{
+			var selection = doc.selection;
+			if ( selection.type == 'Control' )
+				selection.clear();
+			selection.createRange().pasteHTML( text );
+		}
+		else
+			doc.execCommand( 'inserthtml', false, text );
+	}
 
 	// Register the plugin.
@@ -45,89 +85,80 @@
 			if ( editor.config.forcePasteAsPlainText )
 			{
-				editor.on( 'beforePaste', function( event )
+				// Intercept the default pasting process.
+				editor.on( 'beforeCommandExec', function ( evt )
+				{
+					if ( evt.data.name == 'paste' )
 					{
-						if ( editor.mode == "wysiwyg" )
-						{
-							setTimeout( function() { command.exec(); }, 0 );
-							event.cancel();
-						}
-					},
-					null, null, 20 );
+						editor.execCommand( 'pastetext' );
+						evt.cancel();
+					}
+				}, null, null, 0 );
 			}
 		},
+
 		requires : [ 'clipboard' ]
 	});
 
-	var clipboardDiv;
+	function doInsertText( doc, text )
+	{
+		// Native text insertion.
+		if( CKEDITOR.env.ie )
+		{
+			var selection = doc.selection;
+			if ( selection.type == 'Control' )
+				selection.clear();
+			selection.createRange().pasteHTML( text );
+		}
+		else
+			doc.execCommand( 'inserthtml', false, text );
+	}
 
-	CKEDITOR.getClipboardData = function()
+	function doEnter( editor, mode, times, forceMode )
 	{
-		if ( !CKEDITOR.env.ie )
-			return false;
+		while ( times-- )
+		{
+			CKEDITOR.plugins.enterkey[ mode == CKEDITOR.ENTER_BR ? 'enterBr' : 'enterBlock' ]
+					( editor, mode, null, forceMode );
+		}
+	}
 
-		var doc = CKEDITOR.document,
-			body = doc.getBody();
+	CKEDITOR.editor.prototype.insertText = function( text )
+	{
+		this.fire( 'saveSnapshot' );
 
-		if ( !clipboardDiv )
-		{
-			clipboardDiv = doc.createElement( 'div',
-				{
-					attributes :
-						{
-							id: 'cke_hiddenDiv'
-						},
-					styles :
-						{
-							position : 'absolute',
-							visibility : 'hidden',
-							overflow : 'hidden',
-							width : '1px',
-							height : '1px'
-						}
-				});
+		var mode = this.getSelection().getStartElement().hasAscendant( 'pre', true ) ? CKEDITOR.ENTER_BR : this.config.enterMode,
+			isEnterBrMode = mode == CKEDITOR.ENTER_BR,
+			doc = this.document.$,
+			self = this,
+			line;
 
-			clipboardDiv.setHtml( '' );
+		text = CKEDITOR.tools.htmlEncode( text.replace( /\r\n|\r/g, '\n' ) );
 
-			clipboardDiv.appendTo( body );
-		}
+		var startIndex = 0;
+		text.replace( /\n+/g, function( match, lastIndex )
+		 {
+			line = text.substring( startIndex, lastIndex );
+			startIndex = lastIndex + match.length;
+			line.length && doInsertText( doc, line );
 
-		// The "enabled" flag is used to check whether the paste operation has
-		// been completed (the onpaste event has been fired).
-		var	enabled = false;
-		var setEnabled = function()
-		{
-			enabled = true;
-		};
+			var lineBreakNums = match.length,
+				// Duo consequence line-break as a enter block.
+				enterBlockTimes = isEnterBrMode ? 0 : Math.floor( lineBreakNums / 2 ),
+				// Per link-break as a enter br.
+				enterBrTimes = isEnterBrMode ? lineBreakNums : lineBreakNums % 2;
 
-		body.on( 'paste', setEnabled );
+			// Line-breaks are converted to editor enter key strokes.
+			doEnter( self, mode, enterBlockTimes );
+			doEnter( self, CKEDITOR.ENTER_BR, enterBrTimes, isEnterBrMode ? false : true );
+		 });
 
-		// Create a text range and move it inside the div.
-		var textRange = body.$.createTextRange();
-		textRange.moveToElementText( clipboardDiv.$ );
+		// Insert the last text line of text.
+		line = text.substring( startIndex, text.length );
+		line.length && doInsertText( doc, line );
 
-		// The execCommand in will fire the "onpaste", only if the
-		// security settings are enabled.
-		textRange.execCommand( 'Paste' );
-
-		// Get the DIV html and reset it.
-		var html = clipboardDiv.getHtml();
-		clipboardDiv.setHtml( '' );
-
-		body.removeListener( 'paste', setEnabled );
-
-		// Return the HTML or false if not enabled.
-		return enabled && html;
+		this.fire( 'saveSnapshot' );
 	};
 })();
 
-CKEDITOR.editor.prototype.insertText = function( text )
-{
-	text = CKEDITOR.tools.htmlEncode( text );
-
-	// TODO: Replace the following with fill line break processing (see V2).
-	text = text.replace( /(?:\r\n)|\n|\r/g, '<br>' );
-
-	this.insertHtml( text );
-};
 
 /**
@@ -135,4 +166,5 @@
  * editor, loosing any formatting information possibly available in the source
  * text.
+ * @name CKEDITOR.config.forcePasteAsPlainText
  * @type Boolean
  * @default false
@@ -140,3 +172,2 @@
  * config.forcePasteAsPlainText = true;
  */
-CKEDITOR.config.forcePasteAsPlainText = false;
Index: /CKEditor/branches/versions/3.1.x/_source/plugins/styles/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/plugins/styles/plugin.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/plugins/styles/plugin.js	(revision 4772)
@@ -199,6 +199,6 @@
 							continue;
 
-						var elementAttr = element.getAttribute( attName );
-						if ( attribs[attName] ==
+						var elementAttr = element.getAttribute( attName ) || '';
+						if ( attribs[ attName ] ==
 							 ( attName == 'style' ?
 							   normalizeCssText( elementAttr, false ) : elementAttr  ) )
Index: /CKEditor/branches/versions/3.1.x/_source/plugins/wysiwygarea/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.1.x/_source/plugins/wysiwygarea/plugin.js	(revision 4771)
+++ /CKEditor/branches/versions/3.1.x/_source/plugins/wysiwygarea/plugin.js	(revision 4772)
@@ -22,4 +22,5 @@
 		{
 			this.focus();
+			this.fire( 'saveSnapshot' );
 
 			var selection = this.getSelection(),
@@ -46,4 +47,9 @@
 			else
 				this.document.$.execCommand( 'inserthtml', false, data );
+
+			CKEDITOR.tools.setTimeout( function()
+				{
+					this.fire( 'saveSnapshot' );
+				}, 0, this );
 		}
 	}
