             }
             
             // calculate new thumb position.
-            thumbPosTrackY = (pendingValue - minimum) * ((trackSize - thumbSize) / range);
-        }
-
-        if (getStyle("fixedThumbSize") === false)
+            thumbPosTrackY = (pendingValue - min) * ((trackSize - thumbSize) / range);
+        }
+
+        // Special thumb behavior for bounce/pull.  When the component is positioned
+        // beyond its min/max, we want the scroll thumb to shink in size. 
+        // Note: not checking interactionMode==TOUCH here because it is assumed that
+        // value will never exceed min/max unless in touch mode.
+        if (value < min)
+        {
+            if (!fixedThumbSize)
+            {
+                // Note:  we use thumb.width here to ensure the thumb doesn't get smaller than square.
+                thumbSize = Math.max(Math.max(thumb.width, thumb.minHeight), thumbSize + value);
+            }
+            thumbPosTrackY = min;
+        }
+        if (value > max)
+        {
+            if (!fixedThumbSize)
+            {
+                // Note:  we use thumb.width here to ensure the thumb doesn't get smaller than square.
+                thumbSize = Math.max(Math.max(thumb.width, thumb.minHeight), thumbSize - (value - max));
+            }
+            thumbPosTrackY = trackSize - thumbSize;
+        }
+
+        if (!fixedThumbSize)
             thumb.setLayoutBoundsSize(NaN, thumbSize);
         if (getStyle("autoThumbVisibility") === true)
             thumb.visible = thumbSize < trackSize;

import flash.geom.Point;

import mx.core.IInvalidating;
import mx.core.mx_internal;
import mx.events.FlexMouseEvent;
import mx.events.PropertyChangeEvent;

    override mx_internal function viewportContentHeightChangeHandler(event:PropertyChangeEvent):void
    {
        if (viewport)
            updateMaximumAndPageSize();
    }
    
    /**
     *  @private 
     */
    override public function styleChanged(styleName:String):void
    {
        super.styleChanged(styleName);
        
        var allStyles:Boolean = !styleName || styleName == "styleName";
        
        if (allStyles || styleName == "interactionMode")
        {
            if (viewport)
                updateMaximumAndPageSize();
        }
    }
    
    
    /**
     *  @private
     *  Scroll vertically by event.delta "steps".  This listener is added to both the scrollbar 
