      */
     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);
-        sendAnimationEvent(AnimationEvent.ANIMATION_START, value);
 
         if (duration == 0)
         {

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

            sendAnimationEvent(AnimationEvent.ANIMATION_UPDATE, value);
            Animation.addAnimation(this);
            _isPlaying = true;
            if (actualStartTime > 0)
                seek(actualStartTime);
        }
    }

