                 scrollStartEvent.reason = TouchInteractionReason.SCROLL;
                 mouseDownedDisplayObject.dispatchEvent(scrollStartEvent);
                 
-                // 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;
+                
+                // now that we're scrolling, calculate the scrollAnchorPoint.  
+                // There are three cases: diagonal, horizontal, and vertical.
+                // if (0,0) is where you mouseDowned, (10,10) is where you are at now.  Then mouseDownedDiff is (10, 10)
+                // scrollAnchorPoint is calculated as where we "crossed the threshold" in to scrolling territory.
+                // so we figure out if they scrolled up, down, right, left (or a combination of that for 
+                // the diagonal case).
+                if (possibleScrollHorizontally && possibleScrollVertically)
+                {
+                    // diagonal case
+                    if (mouseDownedDifference.length >= diagonalSlop)
+                    {
+                        var scrollAnchorDiffX:int;
+                        var scrollAnchorDiffY:int;
+                        
+                        // normalize the diff to keep the right angle
+                        var normalizedDiff:Point = mouseDownedDifference.clone();
+                        normalizedDiff.normalize(diagonalSlop);
+                        
+                        // 4 possibilities: top-right, top-left, bottom-right, bottom-left
+                        scrollAnchorDiffX = Math.round(normalizedDiff.x);
+                        scrollAnchorDiffY = Math.round(normalizedDiff.y);
+                        
+                        scrollGestureAnchorPoint = new Point(mouseDownedPoint.x + scrollAnchorDiffX, 
+                            mouseDownedPoint.y + scrollAnchorDiffY);
+                    }
+                }
+                else if (possibleScrollHorizontally)
+                {
+                    // horizontal case
+                    if (mouseDownedDifference.x >= horizontalSlop)
+                        scrollGestureAnchorPoint = new Point(mouseDownedPoint.x + horizontalSlop, mouseDownedPoint.y);
+                    else //if (mouseDownedDifference.x >= -horizontalSlop)
+                        scrollGestureAnchorPoint = new Point(mouseDownedPoint.x - horizontalSlop, mouseDownedPoint.y);
+                }
+                else if (possibleScrollVertically)
+                {
+                    // vertical case
+                    if (mouseDownedDifference.y >= verticalSlop)
+                        scrollGestureAnchorPoint = new Point(mouseDownedPoint.x, mouseDownedPoint.y + verticalSlop);
+                    else //if (mouseDownedDifference.y >= -verticalSlop)
+                        scrollGestureAnchorPoint = new Point(mouseDownedPoint.x, mouseDownedPoint.y - verticalSlop);
+                }
                 
                 // see comment located above the variable for why this is needed
                 scrollDraggingCountForUpdateAfterEvent = 0;

    public function startScrollWatch(event:Event):void
    {
        // this is the point from which all deltas are based.
        startTime = GetTimerUtil.getTimerFunction();
        
        if (event is MouseEvent && event.type == MouseEvent.MOUSE_DOWN)
        {

        }
        
        // add time history as well
        mouseEventTimeHistory[currentIndex] = GetTimerUtil.getTimer() - startTime;
        
        // increment current length if appropriate
        mouseEventLength ++;
