      */
     public function play():void
     {
+        setupInterpolation();
         if (startDelay > 0)
         {
-            var delayTimer:Timer = new Timer(startDelay, 1);
-            delayTimer.addEventListener(TimerEvent.TIMER, start);
-            delayTimer.start();
+            // Run timer if it's not currently running
+            if (!timer)
+            {
+                Timeline.pulse();
+                timer = new Timer(_resolution);
+                timer.addEventListener(TimerEvent.TIMER, timerHandler);
+                timer.start();
+            }
+            var animStartTime:int = Timeline.currentTime + startDelay;
+            var insertIndex:int = -1;
+            for (var i:int = 0; i < delayedStartAnims.length; ++i)
+            {
+                var timeAtIndex:int = 
+                    delayedStartTimes[delayedStartAnims[i]];
+                if (animStartTime < timeAtIndex)
+                {
+                    insertIndex = i;
+                    break;
+                }
+            }
+            if (insertIndex >= 0)
+                delayedStartAnims.splice(insertIndex, 0, this);
+            else
+                delayedStartAnims.push(this);
+            delayedStartTimes[this] = animStartTime;
         }
         else
         {

     */
    public function stop():void
    {
        if (id >= 0)
            Animation.removeAnimationAt(id);
            

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