Index: /CKEditor/trunk/CHANGES.html
===================================================================
--- /CKEditor/trunk/CHANGES.html	(revision 6310)
+++ /CKEditor/trunk/CHANGES.html	(revision 6311)
@@ -85,4 +85,5 @@
 		<li><a href="http://dev.ckeditor.com/ticket/6873">#6873</a> : Difficult to drag the resize grip of an iframe dialog.</li>
 		<li><a href="http://dev.ckeditor.com/ticket/6896">#6896</a> : [Webkit] Unable to paste into sourcearea when maximized.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6020">#6020</a> : Cut, Copy and Paste buttons' state are now aligned with the respective context menu buttons.</li>
 	</ul>
 	<h3>
Index: /CKEditor/trunk/_source/plugins/clipboard/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/clipboard/plugin.js	(revision 6310)
+++ /CKEditor/trunk/_source/plugins/clipboard/plugin.js	(revision 6311)
@@ -62,5 +62,6 @@
 	{
 		this.type = type;
-		this.canUndo = ( this.type == 'cut' );		// We can't undo copy to clipboard.
+		this.canUndo = this.type == 'cut';		// We can't undo copy to clipboard.
+		this.startDisabled = true;
 	};
 
@@ -280,4 +281,30 @@
 	}
 
+	var depressBeforeEvent;
+	function stateFromNamedCommand( command, editor )
+	{
+		// IE Bug: queryCommandEnabled('paste') fires also 'beforepaste(copy/cut)',
+		// guard to distinguish from the ordinary sources( either
+		// keyboard paste or execCommand ) (#4874).
+		CKEDITOR.env.ie && ( depressBeforeEvent = 1 );
+
+		var retval = editor.document.$.queryCommandEnabled( command ) ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED;
+		depressBeforeEvent = 0;
+		return retval;
+	}
+
+	var inReadOnly;
+	function setToolbarStates()
+	{
+		if ( this.mode != 'wysiwyg' )
+			return;
+
+		this.getCommand( 'cut' ).setState( inReadOnly ? CKEDITOR.TRISTATE_DISABLED : stateFromNamedCommand( 'Cut', this ) );
+		this.getCommand( 'copy' ).setState( stateFromNamedCommand( 'Copy', this ) );
+		var pasteState = inReadOnly ? CKEDITOR.TRISTATE_DISABLED :
+						CKEDITOR.env.webkit ? CKEDITOR.TRISTATE_OFF : stateFromNamedCommand( 'Paste', this );
+		this.fire( 'pasteState', pasteState );
+	}
+
 	// Register the plugin.
 	CKEDITOR.plugins.add( 'clipboard',
@@ -305,4 +332,9 @@
 							editor.openDialog( 'paste' );
 						}, 0 );
+					});
+
+				editor.on( 'pasteState', function( evt )
+					{
+						editor.getCommand( 'paste' ).setState( evt.data );
 					});
 
@@ -347,5 +379,5 @@
 				{
 					var body = editor.document.getBody();
-					body.on( ( (mode == 'text' && CKEDITOR.env.ie ) || CKEDITOR.env.webkit ) ? 'paste' : 'beforepaste',
+					body.on( ( ( mode == 'text' && CKEDITOR.env.ie ) || CKEDITOR.env.webkit ) ? 'paste' : 'beforepaste',
 						function( evt )
 						{
@@ -367,4 +399,13 @@
 
 					body.on( 'beforecut', function() { !depressBeforeEvent && fixCut( editor ); } );
+
+					body.on( 'mouseup', setToolbarStates, editor );
+					body.on( 'keyup', setToolbarStates, editor );
+				});
+
+				// For improved performance, we're checking the readOnly state on selectionChange instead of hooking a key event for that.
+				editor.on( 'selectionChange', function( evt )
+				{
+					inReadOnly = evt.data.selection.getCommonAncestor().isReadOnly();
 				});
 
@@ -372,24 +413,11 @@
 				if ( editor.contextMenu )
 				{
-					var depressBeforeEvent;
-					function stateFromNamedCommand( command )
-					{
-						// IE Bug: queryCommandEnabled('paste') fires also 'beforepaste(copy/cut)',
-						// guard to distinguish from the ordinary sources( either
-						// keyboard paste or execCommand ) (#4874).
-						CKEDITOR.env.ie && ( depressBeforeEvent = 1 );
-
-						var retval = editor.document.$.queryCommandEnabled( command ) ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED;
-						depressBeforeEvent = 0;
-						return retval;
-					}
-
 					editor.contextMenu.addListener( function( element, selection )
 						{
 							var readOnly = selection.getCommonAncestor().isReadOnly();
 							return {
-								cut : !readOnly && stateFromNamedCommand( 'Cut' ),
-								copy : stateFromNamedCommand( 'Copy' ),
-								paste : !readOnly && ( CKEDITOR.env.webkit ? CKEDITOR.TRISTATE_OFF : stateFromNamedCommand( 'Paste' ) )
+								cut : !readOnly && stateFromNamedCommand( 'Cut', editor ),
+								copy : stateFromNamedCommand( 'Copy', editor ),
+								paste : !readOnly && ( CKEDITOR.env.webkit ? CKEDITOR.TRISTATE_OFF : stateFromNamedCommand( 'Paste', editor ) )
 							};
 						});
Index: /CKEditor/trunk/_source/plugins/pastefromword/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/pastefromword/plugin.js	(revision 6310)
+++ /CKEditor/trunk/_source/plugins/pastefromword/plugin.js	(revision 6311)
@@ -48,4 +48,9 @@
 				});
 
+			editor.on( 'pasteState', function( evt )
+				{
+					editor.getCommand( 'pastefromword' ).setState( evt.data );
+				});
+
 			editor.on( 'paste', function( evt )
 			{
@@ -94,5 +99,7 @@
 
 			return !isLoaded;
-		}
+		},
+
+		requires : [ 'clipboard' ]
 	});
 })();
Index: /CKEditor/trunk/_source/plugins/pastetext/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/pastetext/plugin.js	(revision 6310)
+++ /CKEditor/trunk/_source/plugins/pastetext/plugin.js	(revision 6311)
@@ -66,4 +66,9 @@
 				}, null, null, 0 );
 			}
+
+			editor.on( 'pasteState', function( evt )
+				{
+					editor.getCommand( 'pastetext' ).setState( evt.data );
+				});
 		},
 
