                     }
                     delete delayedStartTimes[this];
                     var postDelaySeekTime:Number = playheadTime - startDelay;
+                    // also subtract out duration if playing in reverse because
+                    if (playReversed)
+                        postDelaySeekTime -= duration;
                     if (postDelaySeekTime < 0)
                     {
                         animPendingTime = intervalTime + (startDelay - playheadTime);

                        // reduce seek time by startTime; we will go ahead and
                        // seek into the now-playing animation by that much
                        playheadTime -= startDelay;
                        start();
                        startTime = cycleStartTime = intervalTime - playheadTime;
                        doInterval();
                        _doSeek = false;

        
        // TODO (chaase): call removal utility instead of this code
        // Make sure to remove any references on the delayed lists
        if (!playReversed)
            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;
                }
            }
        sendAnimationEvent(EffectEvent.EFFECT_START);
        
        // start/end values may be changed by Animate (set dynamically),
