 
     /**
      *  @private
-     *  Method for supporting Form Accessibility.
+     *  Determine the string to be used as the part of a form field's name
+     *  that represents the FormItem the field is in.
+     *  TODO:  This function has the side effect of setting
+     *  accessibilityEnabled=false on one or more subparts of formItems that
+     *  need this.
+     *  Called from getFormName(), which is called from get_accName() and
+     *   from the UIComponentAccProps constructor.
      * 
      *  @param formItem Object of type FormItem. Object is used here to avoid
      *  linking in FormItem. 
      */
-    private static function updateFormItemString(formItem:Object):String
+    private static function determineFormItemString(formItem:Object):String
     {
         var formName:String = "";
         var resourceManager:IResourceManager = ResourceManager.getInstance();
-        
-        var formClass:Class = Class(getDefinition("mx.containers.Form", formItem.moduleFactory));
-        var form:UIComponent = UIComponent(formItem.parent);
-
-        // If we are located within a Form, then look for the first FormHeading
-        // that is a sibling that is above us in the parent's child hierarchy
-        if (formClass && form is formClass)
-        {
-            var formHeadingClass:Class = Class(getDefinition("mx.containers.FormHeading", formItem.moduleFactory));
-            var formItemIndex:int = form.getChildIndex(DisplayObject(formItem));
+
+        // FormHeadings are sought as direct children of this formItem's parent.
+        var formItemParent:UIComponent = UIComponent(formItem.parent);
+
+        // Figure out if we're in a Form first.
+        // As of Spark, the formItem parent itself may not be a Form class but
+        // may still descend from it.
+        if (findMatchingAncestor(formItemParent, isForm))
+        {
+            // If we are located within a Form, then look for the most
+            // recent FormHeading that is a sibling of this FormItem.
+            // TODO: More complex form layouts may be possible in
+            // which a heading is not a sibling of all of its
+            // FormItems.  For these, the heading will be omitted from
+            // the field name at this time.
+            var formHeadingClasses:Array = getDefinitions("FormHeading", formItem.moduleFactory);
+            var formItemIndex:int = formItemParent.getChildIndex(DisplayObject(formItem));
             for (var i:int = formItemIndex; i >= 0; i--)
             {
-                var child:UIComponent = UIComponent(form.getChildAt(i));
-                if (formHeadingClass && child is formHeadingClass)
+                var child:UIComponent = UIComponent(formItemParent.getChildAt(i));
+                var formHeadingClass:Class = getMatchingDefinition(child, formHeadingClasses);
+                if (formHeadingClass)
                 {
                     // Accessible name if it exists, else label text.
                     if (formHeadingClass(child).accessibilityProperties)

        accName = getFormName(master);

        // Now the component's name or toolTip.
        if (master.accessibilityProperties && 
            master.accessibilityProperties.name != null && 
            master.accessibilityProperties.name != "")
        {
            // An accName is set, so use only that.
            accName = joinWithSpace(accName, master.accessibilityProperties.name);

        }

        accName = joinWithSpace(accName, getStatusName());

        // Historical: Return null and not "" for empty and null values.
        return (accName != null && accName != "") ? accName : null;
    }
