             scrollingHorizontally = false;
         }
         
-        if (getStyle("verticalScrollPolicy") == "on" || 
-            (getStyle("verticalScrollPolicy") == "auto" && shouldScrollVertically))
-        {
-            var verticalMP:MotionPath = new SimpleMotionPath("verticalScrollPosition", vsp, finalVSP);
+        if (canScrollVertically)
+        {
+            var verticalMP:SimpleMotionPath = new SimpleMotionPath("verticalScrollPosition");
+            var vspToUse:Number = Math.min(Math.max(finalVSP,0), maxHeight);
+            
+            // since easing function is f(t) = start + (final - start) * e(t)
+            // e(t) = Math.pow(1 - t/THROW_EFFECT_TIME, 4)
+            // We want to solve for t when e(t) = vspToUse
+            // t = THROW_EFFECT_TIME*(1-(Math.pow(1-((vspToUse-vsp)/(finalVSP-vsp)),.25)));
+            if (finalVSP == vspToUse)
+                timeToReachVSP = THROW_EFFECT_TIME;
+            else
+                timeToReachVSP = THROW_EFFECT_TIME*(1-(Math.pow(1-((vspToUse-vsp)/(finalVSP-vsp)),.25)));
+            
+            verticalMP.keyframes = Vector.<Keyframe>([new Keyframe(0, null), new Keyframe(timeToReachVSP, vspToUse)]);
             throwEffectMotionPaths.push(verticalMP);
             scrollingVertically = true;
         }

import spark.components.Group;
import spark.components.supportClasses.ScrollerLayout;
import spark.components.supportClasses.SkinnableComponent;
import spark.components.supportClasses.TouchScrollingEasing;
import spark.core.IViewport;
import spark.core.NavigationUnit;
import spark.effects.Animate;
import spark.effects.animation.MotionPath;
import spark.effects.animation.SimpleMotionPath;

use namespace mx_internal;


    
    /**
     *  @private
     *  Used to keep track of whether the throw animation 
     *  was stopped pre-emptively.  We stop propogation of 
     *  the mouse event, but in the throwEffect.EFFECT_END
