             }
             
             // calculate new thumb position.
-            thumbPosTrackX = (pendingValue - minimum) * ((trackSize - thumbSize) / range);
-        }
-        
-        if (getStyle("fixedThumbSize") === false)
+            thumbPosTrackX = (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 (pendingValue < min)
+        {
+            if (!fixedThumbSize)
+            {
+                // Note:  we use thumb.height here to ensure the thumb doesn't get smaller than square.
+                thumbSize = Math.max(Math.max(thumb.height, thumb.minWidth), thumbSize + pendingValue);
+            }
+            thumbPosTrackX = min;
+        }
+        if (pendingValue > max)
+        {
+            if (!fixedThumbSize)
+            {
+                // Note:  we use thumb.height here to ensure the thumb doesn't get smaller than square.
+                thumbSize = Math.max(Math.max(thumb.height, thumb.minWidth), thumbSize - (pendingValue - max));
+            }
+            thumbPosTrackX = trackSize - thumbSize;
+        }
+        
+        if (!fixedThumbSize)
             thumb.setLayoutBoundsSize(thumbSize, NaN);
         if (getStyle("autoThumbVisibility") === true)
             thumb.visible = thumbSize < trackSize;

    override mx_internal function viewportContentWidthChangeHandler(event:PropertyChangeEvent):void
    {
        if (viewport)
        {
            var viewportWidth:Number = isNaN(viewport.width) ? 0 : viewport.width;        
            maximum = viewport.contentWidth - viewportWidth;
        }
    }
    

            return;
        
        var trackSize:Number = track.getLayoutBoundsWidth();
        
        var min:Number;
        var max:Number;
        if (getStyle("interactionMode") == InteractionMode.TOUCH)
        {
            // For calculating thumb position/size on mobile, we want to exclude
            // the extra margin we added to minimum and maximum for bounce/pull. 
            var viewportWidth:Number = isNaN(viewport.width) ? 0 : viewport.width;

            min = 0;
            max = Math.max(0, maximum - viewportWidth);
        }
        else
        {
            min = minimum;
            max = maximum;
        }
        var range:Number = max - min;
        
        var fixedThumbSize:Boolean = !(getStyle("fixedThumbSize") === false); 
        var thumbPos:Point;
        var thumbPosTrackX:Number = 0;
        var thumbPosParentX:Number = 0;
        var thumbSize:Number = trackSize;
        if (range > 0)
        {
            if (!fixedThumbSize)
            {
                thumbSize = Math.min((pageSize / (range + pageSize)) * trackSize, trackSize)
                thumbSize = Math.max(thumb.minWidth, thumbSize);
