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

        // updated yet.  Making the maximum==vsp here avoids trouble later
        // when Range constrains value
        var cHeight:Number = viewport.contentHeight;
        maximum = (cHeight == 0) ? vsp : cHeight - viewportHeight;
        pageSize = viewportHeight;
    }
    

            return;

        var trackSize:Number = track.getLayoutBoundsHeight();

        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 viewportHeight:Number = isNaN(viewport.height) ? 0 : viewport.height;
            
            min = 0;
            max = Math.max(0, maximum - viewportHeight);
        }
        else
        {
            min = minimum;
            max = maximum;
        }
        var range:Number = max - min;

        var fixedThumbSize:Boolean = !(getStyle("fixedThumbSize") === false); 
        var thumbPos:Point;
        var thumbPosTrackY:Number = 0;
        var thumbPosParentY:Number = 0;
        var thumbSize:Number = trackSize;
        if (range > 0)
        {
            if (!fixedThumbSize)
            {
                thumbSize = Math.min((pageSize / (range + pageSize)) * trackSize, trackSize);
                thumbSize = Math.max(thumb.minHeight, thumbSize);
            }
            else
