             // 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);
+        }
     }
     
     //--------------------------------------------------------------------------

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

            // and make sure verticalAlign is operating on a correct value.
            labelWidth = Math.max(labelComponentsViewWidth, 0);
            labelHeight = Math.max(Math.min(viewHeight, labelTextHeight), 0);
            resizeElement(labelDisplay, labelWidth, labelHeight);
            
            // attempt to truncate text
            labelDisplay.truncateToFit();
        }

        if (messageDisplay)
        {
            // handle message
            // don't use the measured text width or height because that only takes the first line in to account
            messageWidth = Math.max(labelComponentsViewWidth, 0);
            messageHeight = Math.max(viewHeight - labelHeight - verticalGap, 0);
            // FIXME (rfrishbe): we should check to see if this causes textHeight to change because then we 
            // might need to remeasure
            resizeElement(messageDisplay, messageWidth, messageHeight);
            
            // FIXME (rfrishbe): figure out if this is right with regards to multi-line text.
            // For instance, if the text component spans to 2 lines but only shows one line, then textHeight here 
