Index: /CKEditor/branches/features/aria/_source/core/config.js
===================================================================
--- /CKEditor/branches/features/aria/_source/core/config.js	(revision 4924)
+++ /CKEditor/branches/features/aria/_source/core/config.js	(revision 4925)
@@ -213,5 +213,5 @@
 	 * @example
 	 */
-	plugins : 'about,basicstyles,blockquote,button,clipboard,colorbutton,colordialog,contextmenu,div,elementspath,enterkey,entities,filebrowser,find,flash,font,format,forms,horizontalrule,htmldataprocessor,image,indent,justify,keystrokes,link,list,maximize,newpage,pagebreak,pastefromword,pastetext,popup,preview,print,removeformat,resize,save,scayt,smiley,showblocks,showborders,sourcearea,stylescombo,table,tabletools,specialchar,tab,templates,toolbar,undo,wysiwygarea,wsc',
+	plugins : 'about,accessibility,basicstyles,blockquote,button,clipboard,colorbutton,colordialog,contextmenu,div,elementspath,enterkey,entities,filebrowser,find,flash,font,format,forms,horizontalrule,htmldataprocessor,image,indent,justify,keystrokes,link,list,maximize,newpage,pagebreak,pastefromword,pastetext,popup,preview,print,removeformat,resize,save,scayt,smiley,showblocks,showborders,sourcearea,stylescombo,table,tabletools,specialchar,tab,templates,toolbar,undo,wysiwygarea,wsc',
 
 	/**
Index: /CKEditor/branches/features/aria/_source/plugins/accessibility/plugin.js
===================================================================
--- /CKEditor/branches/features/aria/_source/plugins/accessibility/plugin.js	(revision 4925)
+++ /CKEditor/branches/features/aria/_source/plugins/accessibility/plugin.js	(revision 4925)
@@ -0,0 +1,93 @@
+/*
+Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+/**
+ * @fileOverview Bring better accessibility support to browsers that has limited support for modern technologies (e.g. ARIA).
+ */
+
+( function()
+{
+	var dtd = CKEDITOR.dtd,
+		 env = CKEDITOR.env;
+	// List of in-use ARIA roles and states. 
+	var roles = [ 'role' ],
+		 states = [ 'label', 'labelledby', 'describedby', 'multiline' ],
+		 length = Math.max( roles.length, states.length );
+
+
+	function lookupARIASupport( role, tagName )
+	{
+		return {
+			// Only Firefox3 support the "dialog" role.
+			'dialog' :	 env.gecko && CKEDITOR.env.version >= 10900,
+			// IE doesn't support editable iframe as text box.
+			'textbox' : env.gecko || ( env.ie && tagName != 'iframe' )
+		}[ role ];
+	}
+
+	/**
+	 *  Bring degradeable substitution to standard ARIA widgets.  
+	 * @param element
+	 * @param isOffline
+	 */
+	function degradeARIA( element, isOffline )
+	{
+		// Save the interested ARIA attributes first.
+		var doc = element.getDocument(),
+				role = element.getAttribute( 'role' ) || '';
+
+		// Just leave the original element untouched if
+		// the role is already supported on it.
+		if( lookupARIASupport( role, element.getName() ) )
+			return element;
+
+		var labelText = element.getAttribute( 'aria-label' ) || doc.getById( element.getAttribute( 'aria-labelledby' ) ).getText() || '',
+				descriptionText = doc.getById( element.getAttribute( 'aria-describedby' ) ).getText() || '',
+				legend = [ labelText, role, descriptionText ].join( ' ' );
+
+		// Remove all ARIA attributes on the widget that could
+		// bring down or conflict with the degradtion label.
+		for ( var i = 0; i < length; i++ )
+		{
+			roles[ i ] && element.removeAttribute( roles[ i ] );
+			states[ i ] && element.removeAttribute( 'aria-' + states[ i ] );
+		}
+
+		// Translate by wrapping with a form field legend that contains all ARIA
+		// attributes which leads to be announced by ATs.
+		var fieldset = CKEDITOR.dom.element.createFromHtml(
+				'<fieldset class="cke_voicelabel_invisible">' +
+					'<legend class="cke_voicelabel_invisible">' +
+						CKEDITOR.tools.htmlEncode( legend ) +
+					'</legend>' +
+				'</fieldset>', doc );
+
+		if( !isOffline )
+		{
+			var parent;
+			while( ( parent = element.getParent() ) && !parent.getDtd()[ fieldset.getName() ] )
+				element = parent;
+			fieldset.insertBefore( element );
+		}
+
+		fieldset.append( element );
+		return fieldset;
+	}
+
+	CKEDITOR.plugins.add( 'accessibility',
+	{
+		init : function( editor )
+		{
+			editor.on( 'ariaWidget', function( evt )
+			{
+				var data = evt.data,
+					widget = data.element,
+					 widgetIsOffline = !data.replace;
+				data.element = degradeARIA( widget, widgetIsOffline );
+			} );
+		}
+	});
+
+} )( );
Index: /CKEditor/branches/features/aria/_source/plugins/dialog/plugin.js
===================================================================
--- /CKEditor/branches/features/aria/_source/plugins/dialog/plugin.js	(revision 4924)
+++ /CKEditor/branches/features/aria/_source/plugins/dialog/plugin.js	(revision 4925)
@@ -150,4 +150,9 @@
 		} );
 
+		CKEDITOR.tools.setTimeout( function()
+		{
+			editor.fire( 'ariaWidget', { element : this.parts.contents, replace : true } );
+		}, 0, this );
+		
 		// Set the startup styles for the dialog, avoiding it enlarging the
 		// page size on the dialog creation.
Index: /CKEditor/branches/features/aria/_source/plugins/wysiwygarea/plugin.js
===================================================================
--- /CKEditor/branches/features/aria/_source/plugins/wysiwygarea/plugin.js	(revision 4924)
+++ /CKEditor/branches/features/aria/_source/plugins/wysiwygarea/plugin.js	(revision 4925)
@@ -282,4 +282,6 @@
 							'</div>'
 							, CKEDITOR.document );
+
+						mainElement.append( label );
 
 						iframe = CKEDITOR.dom.element.createFromHtml( '<iframe' +
@@ -317,6 +319,5 @@
 						} );
 
-						mainElement.append( iframe );
-						label.insertBefore( iframe );
+						mainElement.append( editor.fire( 'ariaWidget', { element : iframe } ).element );
 					};
 
Index: /CKEditor/branches/features/aria/_source/skins/kama/mainui.css
===================================================================
--- /CKEditor/branches/features/aria/_source/skins/kama/mainui.css	(revision 4924)
+++ /CKEditor/branches/features/aria/_source/skins/kama/mainui.css	(revision 4925)
@@ -162,2 +162,20 @@
 	padding-bottom: 5px;
 }
+
+.cke_skin_kama fieldset.cke_voicelabel_invisible
+{
+	height: 100%;
+}
+
+.cke_skin_kama legend.cke_voicelabel_invisible
+{
+	display: none;
+}
+.cke_skin_kama .cke_browser_ie legend.cke_voicelabel_invisible
+{
+	position: absolute;
+	display: block;
+	width: 0;
+	height: 0;
+	overflow: hidden;
+}
Index: /CKEditor/branches/features/aria/_source/skins/office2003/mainui.css
===================================================================
--- /CKEditor/branches/features/aria/_source/skins/office2003/mainui.css	(revision 4924)
+++ /CKEditor/branches/features/aria/_source/skins/office2003/mainui.css	(revision 4925)
@@ -106,2 +106,20 @@
 	position: absolute;
 }
+
+.cke_skin_office2003 fieldset.cke_voicelabel_invisible
+{
+	height: 100%;
+}
+
+.cke_skin_office2003 legend.cke_voicelabel_invisible
+{
+	display: none;
+}
+.cke_skin_office2003 .cke_browser_ie legend.cke_voicelabel_invisible
+{
+	position: absolute;
+	display: block;
+	width: 0;
+	height: 0;
+	overflow: hidden;
+}
Index: /CKEditor/branches/features/aria/_source/skins/v2/mainui.css
===================================================================
--- /CKEditor/branches/features/aria/_source/skins/v2/mainui.css	(revision 4924)
+++ /CKEditor/branches/features/aria/_source/skins/v2/mainui.css	(revision 4925)
@@ -121,2 +121,20 @@
 	position: absolute;
 }
+
+.cke_skin_v2 fieldset.cke_voicelabel_invisible
+{
+	height: 100%;
+}
+
+.cke_skin_v2 legend.cke_voicelabel_invisible
+{
+	display: none;
+}
+.cke_skin_v2 .cke_browser_ie legend.cke_voicelabel_invisible
+{
+	position: absolute;
+	display: block;
+	width: 0;
+	height: 0;
+	overflow: hidden;
+}
