         systemManager.getSandboxRoot().removeEventListener(SandboxMouseEvent.MOUSE_UP_SOMEWHERE, 
             track_mouseUpHandler);
 
-        // First, we check for smoothScrolling and also if we are
-        // in the non-repeating case.
+		// First, we check for smoothScrolling and also if we are
+		// not in a shift-click case.
         if (getStyle("smoothScrolling"))
         {
-            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();
+			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();
     }
 
     /**

            }
            return;
        }
        
        dispatchEvent(new FlexEvent(FlexEvent.CHANGE_START));
        // Assume we're repeating unless user releases 
        animatingOnce = false;
        
        changeValueByPage(trackScrollDown);
        

                slideDuration != 0 && 
                (maximum - minimum) != 0)
            {
                // Animate the shift-click operation
                startAnimation(slideDuration * 
                    (Math.abs(value - newScrollValue) / (maximum - minimum)),
                    adjustedValue, deceleratingSineEaser);
				animatingSinglePage = true;
            }
            else
            {
