      */
     public function end():void
     {
-        // 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 (id >= 0)
+        {
+            // 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);
+        }
 
         // The rest of what we need to do is handled by the stop() function
         stop();

     */
    public function play():void
    {
        setupInterpolation();
        if (startDelay > 0)
        {
            // Run timer if it's not currently running

     */
    private function start(event:TimerEvent = null):void
    {
        // actualStartTime accounts for overrun in desired startDelay
        var actualStartTime:int = 0;
        
        // TODO (chaase): call removal utility instead of this code
        // Make sure to remove any references on the delayed lists
        for (var i:int = 0; i < delayedStartAnims.length; ++i)
        {
            if (this == delayedStartAnims[i])
            {
                var animStartTime:int = int(delayedStartTimes[this]);
                var overrun:int = Timeline.currentTime - animStartTime;
                if (overrun > 0)
                    actualStartTime = Math.min(overrun, duration);
                delete delayedStartTimes[this];
                delayedStartAnims.splice(i, 1);
                break;
            }
        }
        numRepeats = 1;
        sendAnimationEvent(AnimationEvent.ANIMATION_START, startValue);
        
        // start/end values may be changed by FxAnimate (set dynamically),
        // so now we set up our interpolator based on the real values
        setupInterpolation();
        
        var value:Object = getCurrentValue(0);

        if (duration == 0)
        {
