                 // require changing directions relative to the current throw,
                 // which looks strange.
                 throwEffect.stop();
-                if (viewport.verticalScrollPosition > maxVSP)
-                    viewport.verticalScrollPosition = maxVSP;
-                if (viewport.horizontalScrollPosition > maxHSP)
-                    viewport.horizontalScrollPosition = maxHSP;
+                if (viewport.verticalScrollPosition > maxVerticalScrollPosition)
+                    viewport.verticalScrollPosition = maxVerticalScrollPosition;
+                if (viewport.horizontalScrollPosition > maxHorizontalScrollPosition)
+                    viewport.horizontalScrollPosition = maxHorizontalScrollPosition;
             }
             else
             {
                 // The size of the content may have changed during the throw.
                 // In this case, we'll stop the current animation and start
-                // a new one that gets us to the correct position. 
-            
-                var velX:Number = 0;
-                var velY:Number = 0;
+                // a new one that gets us to the correct position.
                 
-                // Get the current position of the existing throw animation
-                var effectTime:Number = throwEffect.playheadTime;
-                
-                // It's possible for playheadTime to not be set if we're getting it
-                // before the first animation timer call.
-                if (isNaN(effectTime))
-                    effectTime = 0;
-                
-                var effectDuration:Number = throwEffect.duration;
-                
-                // Now get the current effective velocity for each motionpath in the animation. 
-                for (var t:int = 0; t < throwEffect.motionPaths.length; t++)
-                {
-                    var vel:Number = getMotionPathCurrentVelocity(throwEffect.motionPaths[t], effectTime, effectDuration);
-                    
-                    // The property can only either be horizontalScrollPosition or verticalScrollPosition
-                    if (throwEffect.motionPaths[t].property == "horizontalScrollPosition")
-                        velX = vel;
-                    else
-                        velY = vel;
-                }
+                // Get the effect's current velocity
+                var velocity:Point = throwEffect.getCurrentVelocity();
                 
                 // Stop the existing throw animation now that we've determined its current velocities.
                 stoppedPreemptively = true;
                 throwEffect.stop();
+                stoppedPreemptively = false;
                 
                 // Now perform a new throw to get us to the right position.
-                performThrow(-velX, -velY);
+                if (setUpThrowEffect(-velocity.x, -velocity.y))
+                    throwEffect.play();
             }
         }
         else if (!inTouchInteraction)

        
        var curVelocity:Point;
        
        // Determine the new maximum valid scroll positions
        var maxVSP:Number = viewport.contentHeight > viewport.height ? 
            viewport.contentHeight-viewport.height : 0; 
        var maxHSP:Number = viewport.contentWidth > viewport.width ? 
            viewport.contentWidth-viewport.width : 0;
        
        // Determine whether we possibly need to re-throw because of changed max positions.
        var didNotThrowFarEnough:Boolean = throwReachedMaximumScrollPosition &&
            (throwFinalVSP < maxVSP || throwFinalHSP < maxHSP);
        var threwTooFar:Boolean = (throwFinalVSP > maxVSP || throwFinalHSP > maxHSP);

        if (throwEffect && throwEffect.isPlaying && (didNotThrowFarEnough || threwTooFar))
        {
            // There's currently a throw animation playing, and it's throwing to a 
            // now-incorrect position.

     *  @private
     *  Effect used for touch scroll throwing
     */
    mx_internal var throwEffect:ThrowEffect;
    
    /**
     *  @private
