             // displayed lines.
             messageHeight = Math.min(messageHeight, messageDisplay.textHeight + UITextField.TEXT_HEIGHT_PADDING);
             
-            messageDisplay.x = Math.round(labelComponentsX);
-            messageDisplay.y = Math.round(paddingTop + labelHeight + verticalGap);
-            
             // since it's multi-line, no need to truncate
             //if (messageDisplay.isTruncated)
             //    messageDisplay.text = messageText;
             //messageDisplay.truncateToFit();
         }
-        
-        // revisit y positions now that we know all heights so we can respect verticalAlign style
-        if (getStyle("verticalAlign") == "top")
-        {
-            // don't do anything...already aligned to top in code above
-        }
-        else if (getStyle("verticalAlign") == "bottom")
-        {
-            if (iconDisplay)
-                iconDisplayHolder.setLayoutBoundsPosition(paddingLeft, unscaledHeight - iconHeight - paddingBottom);
+
+        // Position the text components now that we know all heights so we can respect verticalAlign style
+        if (labelDisplay || messageDisplay)
+        {
+            var totalHeight:Number = labelHeight + messageHeight + verticalGap;
+            var labelComponentsY:Number = Math.round(vAlign * (viewHeight - totalHeight)) + paddingTop;
+
+            if (labelDisplay)
+                positionElement(labelDisplay, labelComponentsX, labelComponentsY);
+
             if (messageDisplay)
-                messageDisplay.y = unscaledHeight - paddingBottom - messageHeight;
-            if (labelDisplay)
-                labelDisplay.y = unscaledHeight - paddingBottom - messageHeight - verticalGap - labelHeight;
-        }
-        else //if (getStyle("verticalAlign") == "middle")
-        {
-            if (iconDisplay)
-                iconDisplayHolder.setLayoutBoundsPosition(paddingLeft, Math.round((unscaledHeight - iconHeight)/2));
-            var textTotalHeight:Number = labelHeight + messageHeight + verticalGap;
-            if (labelDisplay)
-                labelDisplay.y = Math.round((unscaledHeight - textTotalHeight)/2);
-            if (messageDisplay)
-                messageDisplay.y = Math.round((unscaledHeight - textTotalHeight)/2 + verticalGap + labelHeight);
-        }
-        // made "middle" last even though it's most likely so it is the default and if someone 
-        // types "center", then it will still vertically center itself.
+                positionElement(messageDisplay, labelComponentsX, labelComponentsY + labelHeight + verticalGap);
+        }
     }
     
     //--------------------------------------------------------------------------

        var iconHeight:Number = 0;
        var decoratorWidth:Number = 0;
        var decoratorHeight:Number = 0;
        
        var paddingLeft:Number = getStyle("paddingLeft");
        var paddingRight:Number = getStyle("paddingRight");
        var paddingTop:Number = getStyle("paddingTop");
        var paddingBottom:Number = getStyle("paddingBottom");
        
        var viewWidth:Number = unscaledWidth - paddingLeft - paddingRight;
        var viewHeight:Number = unscaledHeight - paddingTop - paddingBottom;
        
        // icon is on the left
        if (iconDisplay)
        {
            // set the icon's position and size
            iconDisplayHolder.setLayoutBoundsSize(this.iconWidth, this.iconHeight);
            
            iconWidth = iconDisplayHolder.getLayoutBoundsWidth();
            iconHeight = iconDisplayHolder.getLayoutBoundsHeight();
            
            // paddingLeft for x, paddingTop for y
            iconDisplayHolder.setLayoutBoundsPosition(paddingLeft, paddingTop);
        }
        
        // decorator is aligned next to icon
        if (decoratorDisplay)
        {
            if (decoratorDisplay is IVisualElement)
            {
                var decoratorVisualElement:IVisualElement = IVisualElement(decoratorDisplay);
                decoratorVisualElement.setLayoutBoundsSize(NaN, NaN);
                
                decoratorWidth = decoratorVisualElement.getLayoutBoundsWidth();
                decoratorHeight = decoratorVisualElement.getLayoutBoundsHeight();
                
                // paddingRight from right and center vertically
                decoratorVisualElement.setLayoutBoundsPosition(unscaledWidth - paddingRight - decoratorWidth, (viewHeight - decoratorHeight)/2 + paddingTop);
            }
            else if (decoratorDisplay is IFlexDisplayObject)
            {
                decoratorWidth = IFlexDisplayObject(decoratorDisplay).measuredWidth;
                decoratorHeight = IFlexDisplayObject(decoratorDisplay).measuredHeight;
                
                IFlexDisplayObject(decoratorDisplay).setActualSize(decoratorWidth, decoratorHeight);
                
                // paddingRight from right and center vertically
                IFlexDisplayObject(decoratorDisplay).move(unscaledWidth - paddingRight - decoratorWidth, (viewHeight - decoratorHeight)/2 + paddingTop);
            }
        }

        // Figure out how much space we have for label and message as well as the 

        
        // don't forget the extra gap padding if these elements exist
        if (iconDisplay)
            labelComponentsViewWidth -= horizontalGap;
        if (decoratorDisplay)
            labelComponentsViewWidth -= horizontalGap;
        
        var labelComponentsX:Number = paddingLeft;
        if (iconDisplay)
            labelComponentsX += iconWidth + horizontalGap;
        
        // calculte the natural height for the label
        var labelTextHeight:Number = 0;
