Index: /CKEditor/trunk/_source/plugins/contextmenu/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/contextmenu/plugin.js	(revision 3246)
+++ /CKEditor/trunk/_source/plugins/contextmenu/plugin.js	(revision 3247)
@@ -11,4 +11,12 @@
 	{
 		editor.contextMenu = new CKEDITOR.plugins.contextMenu( editor );
+
+		editor.addCommand( 'contextMenu',
+			{
+				exec : function()
+					{
+						editor.contextMenu.show();
+					}
+			});
 	}
 });
@@ -32,9 +40,6 @@
 	_ :
 	{
-		onMenu : function( domEvent )
+		onMenu : function( offsetParent, offsetX, offsetY )
 		{
-			// Cancel the browser context menu.
-			domEvent.preventDefault();
-
 			var menu = this._.menu,
 				editor = this.editor;
@@ -48,5 +53,5 @@
 			{
 				menu = this._.menu = new CKEDITOR.menu( editor );
-				menu.onClick = function( item )
+				menu.onClick = CKEDITOR.tools.bind( function( item )
 				{
 					menu.hide();
@@ -56,5 +61,15 @@
 						item.onClick();
 					else if ( item.command )
+					{
+						if ( CKEDITOR.env.ie )
+							this.restoreSelection();
+
 						editor.execCommand( item.command );
+					}
+				}, this );
+
+				menu.onEscape = function()
+				{
+					editor.focus();
 				};
 			}
@@ -86,5 +101,8 @@
 			}
 
-			menu.show( domEvent.getTarget().getDocument().getDocumentElement(), 1, domEvent.$.clientX, domEvent.$.clientY );
+			if ( CKEDITOR.env.ie )
+				this.saveSelection();
+
+			menu.show( offsetParent, 1, offsetX, offsetY );
 		}
 	},
@@ -96,5 +114,18 @@
 			element.on( 'contextmenu', function( event )
 				{
-					return this._.onMenu( event.data );
+					var domEvent = event.data;
+
+					// Cancel the browser context menu.
+					domEvent.preventDefault();
+
+					var offsetParent = domEvent.getTarget().getDocument().getDocumentElement();
+						offsetX = domEvent.$.clientX,
+						offsetY = domEvent.$.clientY;
+
+					CKEDITOR.tools.setTimeout( function()
+						{
+							this._.onMenu( offsetParent, offsetX, offsetY );
+						},
+						0, this );
 				},
 				this );
@@ -104,4 +135,39 @@
 		{
 			this._.listeners.push( listenerFn );
+		},
+
+		show : function()
+		{
+			this.editor.focus();
+			this._.onMenu( CKEDITOR.document.getDocumentElement(), 0, 0 );
+		},
+		
+		/**
+		 * Saves the current selection position in the editor.
+		 */
+		saveSelection : function()
+		{
+			if ( this.editor.mode == 'wysiwyg' )
+			{
+				this.editor.focus();
+
+				var selection = new CKEDITOR.dom.selection( this.editor.document );
+				this._.selectedRanges = selection.getRanges();
+			}
+			else
+				delete this._.selectedRanges;
+		},
+
+		/**
+		 * Restores the editor's selection from the previously saved position in this
+		 * dialog.
+		 */
+		restoreSelection : function()
+		{
+			if ( this.editor.mode == 'wysiwyg' && this._.selectedRanges )
+			{
+				this.editor.focus();
+				( new CKEDITOR.dom.selection( this.editor.document ) ).selectRanges( this._.selectedRanges );
+			}
 		}
 	}
Index: /CKEditor/trunk/_source/plugins/keystrokes/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/keystrokes/plugin.js	(revision 3246)
+++ /CKEditor/trunk/_source/plugins/keystrokes/plugin.js	(revision 3247)
@@ -173,4 +173,6 @@
 	[ CKEDITOR.ALT + 122 /*F11*/, 'elementsPathFocus' ],
 
+	[ CKEDITOR.SHIFT + 121 /*F10*/, 'contextMenu' ],
+
 	[ CKEDITOR.CTRL + 90 /*Z*/, 'undo' ],
 	[ CKEDITOR.CTRL + 89 /*Y*/, 'redo' ],
Index: /CKEditor/trunk/_source/plugins/menu/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/menu/plugin.js	(revision 3246)
+++ /CKEditor/trunk/_source/plugins/menu/plugin.js	(revision 3247)
@@ -126,7 +126,22 @@
 						this._.level);
 
+					panel.onEscape = CKEDITOR.tools.bind( function()
+					{
+						this.hide();
+						this.onEscape && this.onEscape();
+					},
+					this );
+
 					// Create an autosize block inside the panel.
 					var block = panel.addBlock( this.id );
 					block.autoSize = true;
+
+					var keys = block.keys;
+					keys[ 40 ]	= 'next';					// ARROW-DOWN
+					keys[ 9 ]	= 'next';					// TAB
+					keys[ 38 ]	= 'prev';					// ARROW-UP
+					keys[ CKEDITOR.SHIFT + 9 ]	= 'prev';	// SHIFT + TAB
+					keys[ 32 ]	= 'click';					// SPACE
+					keys[ 39 ]	= 'click';					// ARROW-RIGHT
 
 					element = this._.element = block.element;
@@ -254,4 +269,5 @@
 					' title="', this.label, '"' +
 					' tabindex="-1"' +
+					'_cke_focus=1' + 
 					' hidefocus="true"' );
 
Index: /CKEditor/trunk/_source/skins/default/menu.css
===================================================================
--- /CKEditor/trunk/_source/skins/default/menu.css	(revision 3246)
+++ /CKEditor/trunk/_source/skins/default/menu.css	(revision 3247)
@@ -15,5 +15,6 @@
 
 .cke_skin_default .cke_menuitem a:hover,
-.cke_skin_default .cke_menuitem a:focus
+.cke_skin_default .cke_menuitem a:focus,
+.cke_skin_default .cke_menuitem a:active
 {
 	background-color: #8f8f73;
@@ -42,5 +43,6 @@
 
 .cke_skin_default .cke_menuitem a:hover .cke_icon,
-.cke_skin_default .cke_menuitem a:focus .cke_icon
+.cke_skin_default .cke_menuitem a:focus .cke_icon,
+.cke_skin_default .cke_menuitem a:active .cke_icon
 {
 	background-color: #737357;
@@ -61,5 +63,6 @@
 
 .cke_skin_default .cke_menuitem a:hover .cke_label,
-.cke_skin_default .cke_menuitem a:focus .cke_label
+.cke_skin_default .cke_menuitem a:focus .cke_label,
+.cke_skin_default .cke_menuitem a:active .cke_label
 {
 	color: #fff;
