         lastVelocity.x /= lastDt;
         lastVelocity.y /= lastDt;
         
-
         var minVelocityPixels:Number = MIN_START_VELOCITY_IPS * flash.system.Capabilities.screenDPI / 1000;
         
         var scrollEndEvent:TouchInteractionEvent;
         
+        // calculate the velocity using a weighted average
+        var throwVelocity:Point = calculateThrowVelocity();
+        if (throwVelocity.length <= minVelocityPixels)
+        {
+            throwVelocity.x = 0;
+            throwVelocity.y = 0;
+        }
+
         // FIXME (rfrishbe): should be minXVelocity, minYVelocity, minDiagonalVelocity
         // FIXME (rfrishbe): this should be parameterized better and the heuristic should 
         // be documented better
         if ( (lastDt >= 3*averageDt) &&
             (lastVelocity.length <= minVelocityPixels))
         {
-            isScrolling = false;
-            
-            // don't do anything
-            scrollEndEvent = new TouchInteractionEvent(TouchInteractionEvent.TOUCH_INTERACTION_END, true);
-            scrollEndEvent.relatedObject = scroller;
-            scrollEndEvent.reason = TouchInteractionReason.SCROLL;
-			dispatchBubblingEventOnMouseDownedDisplayObject(scrollEndEvent);
-            return;
-        }
-        
-        // calculate the velocity using a weighted average
-        var throwVelocity:Point = calculateThrowVelocity();
-        
-        // if the velocity is greater than the minimum velocity, start throwing
-        if (throwVelocity.length > minVelocityPixels)
-        {
-            scroller.performThrow(throwVelocity.x, throwVelocity.y, movedRatio);
-        }
-        else
-        {
-            // otherwise, end the scroll operation
-            isScrolling = false;
-
-            // don't do anything
-            scrollEndEvent = new TouchInteractionEvent(TouchInteractionEvent.TOUCH_INTERACTION_END, true);
-            scrollEndEvent.relatedObject = scroller;
-            scrollEndEvent.reason = TouchInteractionReason.SCROLL;
-			dispatchBubblingEventOnMouseDownedDisplayObject(scrollEndEvent);
-        }
+            throwVelocity.x = 0;
+            throwVelocity.y = 0;
+        }
+        
+        // Note that we always call performThrow - even when the velocity is zero.
+        // This is needed because we may be past the end of the list and need an 
+        // animation to get us back.
+        scroller.performThrow(throwVelocity.x, throwVelocity.y);
     }
     
     /**

    
    /**
     *  @private
     *  Minimum duration of throw effects
     */
    private static const THROW_EFFECT_DURATION_MINIMUM:int = 500;

    /**
     *  @private
     *  Range (maximum - minimum) of the throw effect duration
     */
    private static const THROW_EFFECT_DURATION_RANGE:int = 2500;
    
    //--------------------------------------------------------------------------
    //

    
    /**
     *  @private
     *  Use the specified velocity to determine the duration of the throw effect
     */
    private function calculateThrowEffectTime(velocityX:Number, velocityY:Number):int
    {
        if (scrollerLayout)
        {
            // This calculates the effect duration based on a deceleration factor that is applied evenly over time.
            // We decay the velocity by the deceleration factor until it is less than 0.01/ms, which is rounded to zero pixels.
            // We want to solve for "time" in this equasion: velocity*(decel^time)-0.01 = 0.
            // Note that we are only calculating an effect duration here.  The actual curve of our throw velocity is determined by 
            // the exponential easing function we use between animation keyframes.
            var throwTimeX:int = velocityX == 0 ? 0 : (Math.log(0.01 / (Math.abs(velocityX)))) / Math.log(THROW_EFFECT_DECEL_FACTOR);
            var throwTimeY:int = velocityY == 0 ? 0 : (Math.log(0.01 / (Math.abs(velocityY)))) / Math.log(THROW_EFFECT_DECEL_FACTOR);

            if (scrollerLayout.canScrollHorizontally && scrollerLayout.canScrollVertically)
            {
                return Math.max(throwTimeX, throwTimeY);
            }
            else if (scrollerLayout.canScrollHorizontally) 
            {
