     }
 
     //----------------------------------
+    //  hovered
+    //----------------------------------
+
+    /**
+     *  @private
+     *  Storage for the hovered property 
+     */
+    private var _hovered:Boolean = false;    
+
+    /**
+     *  Indicates whether the mouse pointer is over the button.
+     *  Used to determine the skin state.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 10
+     *  @playerversion AIR 1.5
+     *  @productversion Flex 4
+     */ 
+    protected function get hovered():Boolean
+    {
+        return _hovered;
+    }
+    
+    /**
+     *  @private
+     */ 
+    protected function set hovered(value:Boolean):void
+    {
+        if (value == _hovered)
+            return;
+
+        _hovered = value;
+        invalidateButtonState();
+    }
+
+    //----------------------------------
+    //  keepDown
+    //----------------------------------
+    
+    /**
+     *  @private
+     */
+	private var _keepDown:Boolean = false;
+    
+    /**
+     *  @private
+     *  If true, forces the button to be in the down state
+     *  Set fireEvent to false if you want to supress the ButtonDown event. 
+     *  This is useful if you have programmatically set keepDown but the 
+     *  mouse is not over the button. 
+     */
+    mx_internal function keepDown(down:Boolean, fireEvent:Boolean = true):void
+    {
+        if (_keepDown == down)
+            return;
+        
+        _keepDown = down;
+        
+        if (!fireEvent) // Don't let the ButtonDown event get fired
+            _downEventFired = true;
+          
+        if (_keepDown)
+            invalidateSkinState();
+        else
+            invalidateButtonState();
+    }
+
+    //----------------------------------
+    //  keyboardPressed
+    //----------------------------------
+
+    /**
+     *  @private
+     *  Storage for the keyboardPressed property 
+     */
+    private var _keyboardPressed:Boolean = false;    
+
+    /**
+     *  Indicates whether a keyboard key is pressed while the button is in focus.
+     *  Used to determine the skin state.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 10
+     *  @playerversion AIR 1.5
+     *  @productversion Flex 4
+     */ 
+    protected function get keyboardPressed():Boolean
+    {
+        return _keyboardPressed;
+    }
+    
+    /**
+     *  @private
+     */
+    protected function set keyboardPressed(value:Boolean):void
+    {
+        if (value == _keyboardPressed)
+            return;
+
+        _keyboardPressed = value;
+        invalidateButtonState();
+    }
+    
+    //----------------------------------
     //  label
     //----------------------------------
 

        if (ButtonBase.createAccessibilityImplementation != null)
            ButtonBase.createAccessibilityImplementation(this);
    }
    
    //----------------------------------
    //  baselinePosition
    //----------------------------------

    /**
     *  @private
     */
    override public function get baselinePosition():Number
    {
        return getBaselinePositionForPart(labelDisplay);
    }

    //--------------------------------------------------------------------------
    //
    //  Overridden methods
    //
    //--------------------------------------------------------------------------

    /**
     *  @private
     */
    override protected function partAdded(partName:String, instance:Object):void
    {
        super.partAdded(partName, instance);
        
        // Push down to the part only if the label was explicitly set
        if (_content !== undefined && instance == labelDisplay)
            labelDisplay.text = label;
    }

    /**
     *  @private
     *  Remember whether we have fired an event already,
     *  so that we don't fire a second time.
     */
    private var _downEventFired:Boolean = false;
    
    /**
     *  @private

        invalidateButtonState();
    }

    //--------------------------------------------------------------------------
    //
    //  Overridden properties
    //
    //--------------------------------------------------------------------------
    
	/**
     *  @private
     */
    override protected function initializeAccessibility():void
