         systemManager.getSandboxRoot().removeEventListener(SandboxMouseEvent.MOUSE_UP_SOMEWHERE, 
             track_mouseUpHandler);
 
-		// First, we check for smoothScrolling and also if we are
-		// not in a shift-click case.
+        // First, we check for smoothScrolling and also if we are
+        // in the non-repeating 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();
+            if (!animatingOnce)
+            {
+                // We check the timer to see if the user released the mouse
+                // before the repeat delay has expired.
+                if (trackScrollTimer && trackScrollTimer.running)
+                {
+                    // If the animation has not yet finished before the repeat delay
+                    // we set animatingOnce to true. Otherwise, the animation
+                    // is done but repeating has not begun so we dispatch a changeEnd
+                    // event.
+                    if (animator.isPlaying)
+                        animatingOnce = true;
+                    else
+                        dispatchEvent(new FlexEvent(FlexEvent.CHANGE_END));
+                }
+                else
+                {
+                    // repeating case
+                    stopAnimation();
+                    dispatchEvent(new FlexEvent(FlexEvent.CHANGE_END));
+                }
+            }
+        }
+        else
+        {
+            // Dispatch changeEnd if there's no animation.
+            dispatchEvent(new FlexEvent(FlexEvent.CHANGE_END));
+        }
+        
+        if (trackScrollTimer)
+            trackScrollTimer.reset();
     }
 
     /**

     */
    private function animationUpdateHandler(animation:Animation):void
    {
        setValue(animation.currentValue["value"]);
    }
    

    {
        if (steppingDown || steppingUp)
        {
        	// stopAnimation will not dispatch a changeEnd.
            stopAnimation();
            
            dispatchEvent(new FlexEvent(FlexEvent.CHANGE_END));
            
            steppingUp = steppingDown = false;
            isStepping = false;
        }
        else if (isStepping)
        {
            // Dispatch changeEnd event for no animation case
            dispatchEvent(new FlexEvent(FlexEvent.CHANGE_END));
            isStepping = false;
        }
        
        systemManager.getSandboxRoot().removeEventListener(MouseEvent.MOUSE_UP, 
            button_buttonUpHandler, true);
        systemManager.getSandboxRoot().removeEventListener(
            SandboxMouseEvent.MOUSE_UP_SOMEWHERE, button_buttonUpHandler);
    }
    
    //---------------------------------
