 		var bounds:Rectangle = mx_internal::bounds;
         bounds.x = 0;
         bounds.y = 0;
-        bounds.width = width;
+        bounds.width = isNaN(width) ? maxWidth : width;
         bounds.height = height;
 
         mx_internal::removeTextLines();
+        mx_internal::textLines.length = 0;
+        
         createTextLines();
-        mx_internal::addTextLines(DisplayObjectContainer(displayObject));
+                    
+        // If toFit and explicit width, adjust the bounds to match.
+        // This will save a recompose and/or clip in updateDisplayList() if 
+        // the bounds width matches the unscaled width.
+        if (getStyle("lineBreak") == "toFit" && !isNaN(width) && 
+            mx_internal::bounds.width < width)
+        {
+            mx_internal::bounds.width = width;
+        }                                                           
+        
+        mx_internal::addTextLines(DisplayObjectContainer(drawnDisplayObject));
+        
+        // Figure out if the text overruns the available space for composition.
+        mx_internal::isOverset = mx_internal::isTextOverset(width, height);
         
 		// Just recomposed so reset.
-        mx_internal::stylesChanged = false;
+        mx_internal::invalidateCompose = false;
         
         // Listen for "damage" events in case the textFlow is 
         // modified programatically.

     */
    override protected function composeOnWidthChange():Boolean
    {
        var direction:String = textFlow.hostTextLayoutFormat.direction;
        var textAlign:String = textFlow.hostTextLayoutFormat.textAlign;
        var leftAligned:Boolean =

     */
    override protected function composeOnHeightChange():Boolean
    {
        if (super.composeOnHeightChange())
            return true;

        var topAligned:Boolean =
            textFlow.hostTextLayoutFormat.verticalAlign == "top";

