         // if the velocity is greater than the minimum velocity, start throwing
         if (throwVelocity.length > MIN_START_VELOCITY)
         {
-            var scrollEndAndThrowEvent:TouchScrollEvent = new TouchScrollEvent(TouchScrollEvent.TOUCH_SCROLL_THROW, false, false);
-            scrollEndAndThrowEvent.scrollingObject = scroller;
-            scrollEndAndThrowEvent.velocityX = throwVelocity.x;
-            scrollEndAndThrowEvent.velocityY = throwVelocity.y;
-            
-            // wait for the animation to be over so we can dispatch a touchScrollEnd event
-            scroller.addEventListener(TouchScrollEvent.TOUCH_SCROLL_THROW_ANIMATION_END, scroller_touchScrollThrowAnimationEnd);
-            scroller.dispatchEvent(scrollEndAndThrowEvent);
+            scroller.performThrow(throwVelocity.x, throwVelocity.y);
         }
         else
         {

        lastVelocity.x *= movedRatio.x;
        lastVelocity.y *= movedRatio.y;
        
        var scrollEndEvent:TouchScrollEvent;
        
        // FIXME (rfrishbe): should be minXVelocity, minYVelocity, minDiagonalVelocity
        // FIXME (rfrishbe): this should be parameterized better and the heuristic should 

     *  Used to keep track of whether we should capture the next 
     *  mousedown event that we receive or whether we should let it dispatch 
     *  normally.  We capture the mousedown event if a scroll-throw is 
     *  currently happening.  We set this property in mouseDown, gestureCaptureStart, 
     *  and gestureCaptureEnd.
     */
    private var captureNextMouseDown:Boolean = false;
    
