 
     private var reverseAnimation:Boolean;
     
+    private var needsRemoval:Boolean;
+    
     //--------------------------------------------------------------------------
     //
     // Properties

     * when the animation is complete.
     */ 
    protected var affectsConstraints:Boolean;
    
    private var _easer:IEaser;    
    public function set easer(value:IEaser):void

        finishEffect();
        if (affectsConstraints)
            reenableConstraints();
        if (autoRemoveTarget)
            removeDisappearingTarget();
    }

    /**
     * Adds a target which is not in the state we are transitioning
     * to. This is the partner of removeDisappearingTarget(), which removes
     * the target when this effect is finished if necessary.
     * Note that if a RemoveAction effect is playing in a CompositeEffect,
     * then the adding/removing is already happening and this function
     * will noop the add.
     */
    private function addDisappearingTarget():void
    {
        needsRemoval = false;
        if (propertyChanges)
        {
            // Check for non-null parent ensures that we won't double-remove
            // items, such as if there is a RemoveAction effect working on
            // the same target
            if ("parent" in target && !target.parent)
            {
                var parentStart:* = propertyChanges.start["parent"];;
                var parentEnd:* = propertyChanges.end["parent"];;
                if (parentStart && !parentEnd)
                {
                    if (parentStart is Group)
                        parentStart.addItem(target);
                    else
                        parentStart.addChild(target);
                    needsRemoval = true;
                }
            }
            else if ("elementHost" in target && !target.elementHost)
            {
                var hostStart:* = propertyChanges.start["elementHost"];
                var hostEnd:* = propertyChanges.end["elementHost"];
                if (hostStart && !hostEnd)
                {
                    hostStart.addItem(target);
                    needsRemoval = true;
                }
            }
        }
    }

    /**
     * Removes a target which is not in the state we are transitioning
     * to. This is the partner of addDisappearingTarget(), which re-adds
     * the target when this effect is played if necessary.
     * Note that if a RemoveAction effect is playing in a CompositeEffect,
     * then the adding/removing is already happening and this function
     * will noop the removal.
     */
    private function removeDisappearingTarget():void
    {
        if (needsRemoval && propertyChanges)
        {
            // Check for non-null parent ensures that we won't double-remove
            // items, such as if there is a RemoveAction effect working on
            // the same target
            if ("parent" in target && target.parent)
            {
                var parentStart:* = propertyChanges.start["parent"];;
                var parentEnd:* = propertyChanges.end["parent"];;
                if (parentStart && !parentEnd)
                {
                    if (parentStart is Group)
                        parentStart.removeItem(target);
                    else
                        parentStart.removeChild(target);
                }
            }
            else if ("elementHost" in target && target.elementHost)
            {
                var hostStart:* = propertyChanges.start["elementHost"];
                var hostEnd:* = propertyChanges.end["elementHost"];
                if (hostStart && !hostEnd)
                    hostStart.removeItem(target);
            }
        }
    }

    private var constraintsHolder:Object;
    
    private function reenableConstraint(name:String):void
