                 var child:UIComponent = UIComponent(form.getChildAt(i));
                 if (child is FormHeading)
                 {
-                    formName = FormHeading(child).label + " ";
+                    // Accessible name if it exists, else label text.
+                    if (FormHeading(child).accessibilityProperties)
+                        formName = 
+                        FormHeading(child).accessibilityProperties.name;
+                    if (formName == "") 
+                        formName = FormHeading(child).label;
                     break;
                 }
             }
         }
 
-        // Add in text if we are a required field
+        // Add in "Required Field" text if we are a required field
         if (formItem.required)
-            formName += "Required Field ";
+            formName = joinWithSpace(formName,
+                resourceManager.getString("controls","requiredField"))
 
         // Add in the label from the formItem
-        if (formItem.label != "")
-            formName += formItem.label + " ";
-
+        // Accessible name if it exists, else label text.
+        var f:String = "";
+        if (formItem.accessibilityProperties)
+            f = formItem.accessibilityProperties.name
+        if (f == "")
+            f = formItem.label;
+            
+        formName = joinWithSpace(formName, f);
+
+        /* 
+         * Disable form item label accessibility so the form item label and the 
+         * text from the form item label are not both seen in the virtual view of       
+         * a screen reader.
+         * Otherwise, the formItem would appear with a name, followed
+         * by the component being labeled, with a duplicate of that name.
+         * Setting silent here also causes code above to avoid recalculating the name.
+         * FIXME gosmith: If the caching above is removed, remove the above comment also.
+         */
         if (accProp && !accProp.silent)
         {
             accProp.silent = true;


        return accState;
    }

    /**
     *  @private
     */
    private function getStatusName():String
    {
        var statusName:String = "";
        
        if (master.toolTip)
            statusName += " " + master.toolTip;
        
        if (master is UIComponent && UIComponent(master).errorString)
            statusName += " " + UIComponent(master).errorString;
        
        return statusName;
    }
    
    /**
     *  @private
     */
    protected function createChildIDArray(n:int):Array
    {
        var a:Array = new Array(n);
        
        for (var i:int = 0; i < n; i++)
        {
            a[i] = i + 1;
        }
        
        return a;
    }
    
    //--------------------------------------------------------------------------

     *  @private
     *  Method for supporting Form Accessibility.
     */
    private static function joinWithSpace(s1:String,s2:String):String
    {
		// Single space treated as null so developers can override default name elements with " ".
		if (s1 == " ")
			s1 = "";
		if (s2 == " ")
			s2 = "";
        if (s1 && s2)
            s1 += " " +s2;
        else if (s2)
            s1 = s2;
        // else we have non-empty s1 and empty s2, so do nothing.
        return s1;
    }
    
    /**
     *  @private
     *  Method for supporting Form Accessibility.
     */
    private static function updateFormItemString(formItem:FormItem):String
    {
        var formName:String = "";
        var resourceManager:IResourceManager = ResourceManager.getInstance();
        
        const itemLabel:Label = formItem.itemLabel;
        const accProp:AccessibilityProperties = (itemLabel ? itemLabel.accessibilityProperties : null);
        if (accProp && accProp.silent)
            // We already calculated this label's name below, so just return it.
            // FIXME gosmith: Caching this will cause problems if
            // formItem, item label, or form header changes dynamically.
            return accProp.name;

        var form:UIComponent = UIComponent(formItem.parent);
