      */
     private function addMouseEventHistory(event:MouseEvent):Point
     {
-        var p:Point = new Point(event.stageX, event.stageY);
-        var differencePoint:Point = p.subtract(mouseDownedPoint);
-        
-        // only store the last 5
-        if (mouseEventCoordinatesHistory.length >= HISTORY)
-        {
-            mouseEventCoordinatesHistory.shift();
-            mouseEventTimeHistory.shift();
-        }
-        
-        mouseEventCoordinatesHistory.push(differencePoint);
-        mouseEventTimeHistory.push(GetTimerUtil.getTimerFunction() - startTime);
-        
-        return differencePoint;
+        // calculate dx, dy
+        var dx:Number = event.stageX - mouseDownedPoint.x;
+        var dy:Number = event.stageY - mouseDownedPoint.y;
+        
+        // either use a Point object already created or use one already created
+        // in mouseEventCoordinatesHistory
+        var currentPoint:Point;
+        var currentIndex:int = (mouseEventLength % EVENT_HISTORY_LENGTH);
+        if (mouseEventCoordinatesHistory[currentIndex])
+        {
+            currentPoint = mouseEventCoordinatesHistory[currentIndex];
+            currentPoint.x = dx;
+            currentPoint.y = dy;
+        }
+        else
+        {
+            currentPoint = new Point(dx, dy);
+            mouseEventCoordinatesHistory[currentIndex] = currentPoint;
+        }
+        
+        // add time history as well
+        mouseEventTimeHistory[currentIndex] = GetTimerUtil.getTimerFunction() - startTime;
+        
+        // increment current length if appropriate
+        mouseEventLength ++;
+        
+        return currentPoint;
     }
 
     /**

    
    /**
     *  @private
     *  Easing object used for touch scroll throwing
     */
    private var throwEaser:TouchScrollingEasing;
    
    /**
     *  @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

                }
                
                // if the event has been accepted, then dispatch a bubbling start event
                var scrollDragStartEvent:TouchScrollEvent = new TouchScrollEvent(TouchScrollEvent.TOUCH_SCROLL_START, true, true);
                scrollDragStartEvent.scrollingObject = scroller;
                mouseDownedDisplayObject.dispatchEvent(scrollDragStartEvent);
                
                // FIXME (rfrishbe): the difference should not be from the original point but from the slop.
                // otherwise we "jump" on the first move.
                // we should reset startPoint here to be this point minus slop (in the direction that caused the scroll)
                scrollGestureAnchorPoint = new Point(event.stageX, event.stageY);
                isScrolling = true;
                
                // velocity calculations come from mouseDownedPoint.  The drag ones com from scrollStartPoint.
