     }
 
     /**
+     * Remove this animation from the list of pending animations,
+     * as appropriate
+     */
+    private function removeFromDelayedAnimations():void
+    {
+        if (delayedStartTimes[this])
+        {
+            var animPendingTime:int = delayedStartTimes[this];
+            for (var i:int = 0; i < delayedStartAnims.length; ++i)
+            {
+                if (delayedStartAnims[i] == this)
+                {
+                    delayedStartAnims.splice(i, 1);
+                    break;
+                }
+            }
+            delete delayedStartTimes[this];
+        }
+    }
+
+    /**
      *  Interrupt the animation, jump immediately to the end of the animation, 
      *  and send out ending notifications
      */
     public function end():void
     {
-        if (_isPlaying || duration == 0)
-        {
-            // TODO (chaase): Check whether we already send out a final
-            // UPDATE event with the end value; if so, this dup should be
-            // removed
-            var value:Object = getCurrentValue(duration);
-            
-            sendAnimationEvent(AnimationEvent.ANIMATION_UPDATE, value);
-            sendAnimationEvent(AnimationEvent.ANIMATION_END, value);
-            
-            // If animation has been added, id >= 0
-            // but if duration = 0, this might not be the case.
-            if (id >= 0)
-                Animation.removeAnimationAt(id);
-            
-            _invertValues = false;
-            _doReverse = false;
-            _isPlaying = false;
-        }
+        removeFromDelayedAnimations();
+        
+        // TODO (chaase): Check whether we already send out a final
+        // UPDATE event with the end value; if so, this dup should be
+        // removed
+        // TODO (chaase): this will snap paused and startDelayed animations
+        // to their end values. Seems correct, but should check this.
+        var value:Object = getCurrentValue(duration);
+        
+        sendAnimationEvent(AnimationEvent.ANIMATION_UPDATE, value);
+        sendAnimationEvent(AnimationEvent.ANIMATION_END, value);
+
+        // If animation has been added, id >= 0
+        // but if duration = 0, this might not be the case.
+        if (id >= 0)
+            Animation.removeAnimationAt(id);
+        
+        _invertValues = false;
+        _doReverse = false;
+        _isPlaying = false;
     }
 
     /**

    private static function timerHandler(event:TimerEvent):void
    {
        var oldTime:Number = intervalTime;
        _intervalTime = getTimer();
        
        var n:int = activeAnimations.length;
                
        for (var i:int = n; i >= 0; i--)
        {
            var animation:Animation = Animation(activeAnimations[i]);
            if (animation)
                animation.doInterval();
        }
        
        event.updateAfterEvent();
    }


        if (!_isPlaying)
        {
            setupInterpolation();
            _intervalTime = Timeline.currentTime;
            startTime = _intervalTime - playheadTime;
            doInterval();
        }
