      */
     protected function button_buttonDownHandler(event:Event):void
     {
+		// Make sure we finish any running page animation before starting
+		// to step.
+		if (animatingSinglePage)
+		{
+			animationEndHandler(animator);
+			animator.stop();
+		}
+		
         // 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;
-            
+
+			if (!isStepping && 
+				((increment && value < maximum) ||
+				 (!increment && value > minimum)))
+			{
+				dispatchEvent(new FlexEvent(FlexEvent.CHANGING));
+				isStepping = true;
+			}
+			
             // 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);
-
+            
+			systemManager.getSandboxRoot().addEventListener(MouseEvent.MOUSE_UP, 
+				button_buttonUpHandler, true);
+			systemManager.getSandboxRoot().addEventListener(
+				SandboxMouseEvent.MOUSE_UP_SOMEWHERE, button_buttonUpHandler);
+			
             // 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

            {
                animationEndHandler(animator);
            }
            else
            {
                // probably shouldn't get here, but just in case
                steppingUp = steppingDown = false;
            }
            // stop even if !isPlaying - it might just be startDelayed
            animator.stop();
            
            systemManager.getSandboxRoot().removeEventListener(MouseEvent.MOUSE_UP, 
                button_buttonUpHandler, true);
            systemManager.getSandboxRoot().removeEventListener(
                SandboxMouseEvent.MOUSE_UP_SOMEWHERE, button_buttonUpHandler);
        }
    }
    
    //---------------------------------

            // appropriate direction, ensuring that we stop on a content 
            // item boundary 
            changeValueByStep(steppingDown);
            animator.startDelay = 0;
			return;
        }
		
		if (animatingSinglePage)
			dispatchEvent(new Event(Event.CHANGE));
		
        animatingSinglePage = false;
    }
    
    /**
