         systemManager.getSandboxRoot().removeEventListener(SandboxMouseEvent.MOUSE_UP_SOMEWHERE, 
             track_mouseUpHandler);
 
-        if (trackScrollTimer)
-            trackScrollTimer.reset();
-            
-        if (getStyle("smoothScrolling") && !animatingSinglePage)
-        {
-            if (animator.isPlaying)
-            {
-                animationEndHandler(animator);
-            }
-            // Stop it regardless, in case the animation is startDelayed and
-            // thus not 'playing', but still active
-            animator.stop();
-        }
+		// First, we check for smoothScrolling and also if we are
+		// not in a shift-click case.
+        if (getStyle("smoothScrolling"))
+        {
+			if (!animatingSinglePage)
+			{
+				// We check the timer to see if the user released the mouse
+				// before or after the repeat delay has expired. If not,
+				// we are currently repeating and we should end the animation
+				// as well as dispatch a change event.
+				if (trackScrollTimer && trackScrollTimer.running)
+				{
+					// If the animation has not yet finished before the repeat delay
+					// we set animatingSinglePage to true. Otherwise, the animation
+					// is done but repeating has not begun so we dispatch a change
+					// event.
+					if (animator.isPlaying)
+						animatingSinglePage = true;
+					else
+						dispatchEvent(new Event(Event.CHANGE));
+				}
+				else
+				{
+					if (animator.isPlaying)
+					{
+						animationEndHandler(animator);
+					}
+					// Stop it regardless, in case the animation is startDelayed and
+					// thus not 'playing', but still active
+					animator.stop();
+					
+					dispatchEvent(new Event(Event.CHANGE));
+				}
+			}
+        }
+		else
+		{
+			// Dispatch change if there's no animation.
+			dispatchEvent(new Event(Event.CHANGE));
+		}
+		
+		if (trackScrollTimer)
+			trackScrollTimer.reset();
     }
 
     /**

     */
    protected function button_buttonDownHandler(event:Event):void
    {
        // Noop if we're currently running a stepping animation. We get
        // called repeatedly here due to the button's autoRepeat
        if (!steppingDown && !steppingUp)
        {
            var increment:Boolean = (event.target == incrementButton);
            var oldValue:Number = value;
            
            // FIXME (chaase): first step is non-animated, just to simplify the delayed
            // start of the animated stepping. Seems okay, but worth thinking
            // about whether we should animate the first step too
            changeValueByStep(increment);

            // Only animate if smoothScrolling enabled and we're not at the end already
            if (getStyle("smoothScrolling") &&
                ((increment && value < maximum) ||
                 (!increment && value > minimum)))
            {
                systemManager.getSandboxRoot().addEventListener(MouseEvent.MOUSE_UP, 
                    button_buttonUpHandler, true);
                systemManager.getSandboxRoot().addEventListener(
                    SandboxMouseEvent.MOUSE_UP_SOMEWHERE, button_buttonUpHandler);
                // FIXME (chaase): what's a reasonable stepSize? Can't use viewport's because
                // it can vary widely depending on what items are in the view. Can't use
                // default stepSize because it can be quite small if not changed by

     */
    private var steppingDown:Boolean;
    private var steppingUp:Boolean;
	private var isStepping:Boolean;

    /**
     * @private
