         if (isDown())
             return "down";
         
-        if (hovered || mouseCaptured)
+        // if inputMode == "touch", then we have no over state
+        // if inputMode == "mouse", then only go in to the over state if 
+        // we are currently hovered or if someone pressed down on us 
+        // and then rolled away (and stickyHighlighting is off--otherwise 
+        // isDown() would have returned true)
+        if (getStyle("inputMode") == "mouse" && (hovered || mouseCaptured))
             return "over";
         
         return "up";
     }
     
-    /**
-     *  @private
-     */ 
-    override public function styleChanged(styleName:String):void
-    {
-        var allStyles:Boolean = styleName == null || styleName == "styleName";
-        
-        super.styleChanged(styleName);
-        
-        if (allStyles || styleName == "inputMode")
-        {
-            addHandlers();
-        }
-    }
-
     //--------------------------------------------------------------------------
     //
     //  Methods

    
    /**
     *  @private
     *  Keeps track of whether rollover/rollout events were added
     * 
     *  We need to be careful about calling add/remove event listener
     *  in ItemRenderer because of the reference counting going on in 
     *  GroupBase.  We don't have the same issues here in ButtonBase, but 
     *  it seems safer and more consistent to follow the same pattern.
     */
    private var rolloverEventsAdded:Boolean = false;
    
    /**
     *  @private
     *  Adds or removes handlers for rollover/rollout depending on 
     *  if inputMode == mouse or not.
     */
    private function addOrRemoveRollOverRollOutHandlers():void
    {
        if (getStyle("inputMode") == "mouse")
        {
            if (!rolloverEventsAdded)
            {
                rolloverEventsAdded = true;
                addEventListener(MouseEvent.ROLL_OVER, mouseEventHandler);
                addEventListener(MouseEvent.ROLL_OUT, mouseEventHandler);
            }
        }
        else
        {
            if (rolloverEventsAdded)
            {
                rolloverEventsAdded = false;
                removeEventListener(MouseEvent.ROLL_OVER, mouseEventHandler);
                removeEventListener(MouseEvent.ROLL_OUT, mouseEventHandler);
            }
        }
    }
    
    /**
     *  @private
     *  This method adds the systemManager_mouseUpHandler as an event listener to
     *  the stage and the systemManager so that it gets called even if mouse events
     *  are dispatched outside of the button. This is needed for example when the

                // was captured before.
                if (event.target == this)
                {
                    hovered = true;
                    
                    if (mouseCaptured)
                    {
