Index: _source/plugins/wysiwygarea/plugin.js
===================================================================
--- _source/plugins/wysiwygarea/plugin.js	(revision 3167)
+++ _source/plugins/wysiwygarea/plugin.js	(working copy)
@@ -180,6 +180,34 @@
 						// must be done after setting the "src", to avoid the
 						// "secure/unsecure" message under HTTPS.
 						mainElement.append( iframe );
+
+
+						if ( CKEDITOR.env.gecko )
+						{
+							// Accessibility attributes for Firefox.
+							mainElement.setAttributes(
+								{
+									role : 'region',
+									title : 'CKEditor ' + editor.name + '. Type in text.'
+								} );
+							iframe.setAttributes(
+								{
+									role : 'region',
+									title : ' '
+								} );
+						}
+						else if ( CKEDITOR.env.ie )
+						{
+							// Accessibility label for IE.
+							var label = CKEDITOR.document.createElement( 'label' );
+							label.setStyles( {
+								position : 'absolute',
+								'top' : '-1000000px',
+								left : '-1000000px'
+							} );
+							label.append( CKEDITOR.document.createText( 'CKEditor ' + editor.name ) );
+							label.insertBefore( iframe );
+						}
 					};
 
 					// The script that is appended to the data being loaded. It
Index: _source/plugins/toolbar/plugin.js
===================================================================
--- _source/plugins/toolbar/plugin.js	(revision 3167)
+++ _source/plugins/toolbar/plugin.js	(working copy)
@@ -13,6 +13,7 @@
 	var toolbox = function()
 	{
 		this.toolbars = [];
+		this.focusCommandExecuted = false;
 	};
 
 	toolbox.prototype.focus = function()
@@ -37,7 +38,10 @@
 			exec : function( editor )
 			{
 				if ( editor.toolbox )
+				{
+					editor.toolbox.focusCommandExecuted = true;
 					editor.toolbox.focus();
+				}
 			}
 		}
 	};
@@ -155,6 +159,16 @@
 
 									itemObj.toolbar = toolbarObj;
 									itemObj.onkey = itemKeystroke;
+
+									/*
+									 * Fix for #3052:
+									 * Prevent JAWS from focusing the toolbar after document load.
+									 */
+									itemObj.onfocus = function()
+									{
+										if ( !editor.toolbox.focusCommandExecuted )
+											editor.focus();
+									};
 								}
 							}
 
Index: _source/plugins/richcombo/plugin.js
===================================================================
--- _source/plugins/richcombo/plugin.js	(revision 3167)
+++ _source/plugins/richcombo/plugin.js	(working copy)
@@ -117,7 +117,7 @@
 			output.push(
 				 '">' +
 					'<span class=cke_label>', this.label, '</span>' +
-					'<a hidefocus=true title="', this.title, '" href="javascript:void(\'', this.label, '\')"' );
+					'<a hidefocus=true title="', this.title, '" tabindex="-1" href="javascript:void(\'', this.label, '\')"' );
 
 			// Some browsers don't cancel key events in the keydown but in the
 			// keypress.
Index: _source/plugins/button/plugin.js
===================================================================
--- _source/plugins/button/plugin.js	(revision 3167)
+++ _source/plugins/button/plugin.js	(working copy)
@@ -173,6 +173,7 @@
 
 		output.push(
 				' onkeydown="return CKEDITOR.ui.button._.keydown(', index, ', event);"' +
+				' onfocus="return CKEDITOR.ui.button._.focus(', index, ', event);"' +
 				' onclick="return CKEDITOR.ui.button._.click(', index, ', event);">' +
 					'<span class="cke_icon"></span>' +
 					'<span class="cke_label">', this.label, '</span>' +
@@ -234,6 +235,14 @@
 			ev = new CKEDITOR.dom.event( ev );
 			return ( instance.onkey( instance, ev.getKeystroke() ) !== false );
 		}
+	},
+
+	focus : function( index, ev )
+	{
+		var instance = CKEDITOR.ui.button._.instances[ index ];
+
+		if ( instance.onfocus )
+			return ( instance.onfocus( instance, new CKEDITOR.dom.event( ev ) ) !== false );
 	}
 };
 
