     {
         if (!grid)
             return;
+        
+        // If the hoverIndicator is visible then we're going to have to fixup it's location
+        // at updateDisplayList() time.
+        
+        if ((grid.hoverRowIndex != -1) || (grid.hoverColumnIndex != -1))
+        {
+            const oldScrollR:Rectangle = grid.scrollRect;
+            const dx:Number = grid.horizontalScrollPosition - oldScrollR.x;
+            const dy:Number = grid.verticalScrollPosition - oldScrollR.y;
+            invalidateHoverLocation(dx, dy);
+        }
         
         super.scrollPositionChanged();
         

    {
        switch (event.kind)
        {
            case CollectionEventKind.ADD:    return dataProviderCollectionAdd(event);
            case CollectionEventKind.REMOVE: return dataProviderCollectionRemove(event);
                
            case CollectionEventKind.REPLACE:
            case CollectionEventKind.MOVE:
            case CollectionEventKind.REFRESH:
            case CollectionEventKind.RESET:
            case CollectionEventKind.UPDATE:
                break;
        }
        

        return indicator;
    }
    

    private var hoverLocationIsValid:Boolean = true;
    private var mouseXOffset:Number = 0;
    private var mouseYOffset:Number = 0;
    
    /**
     *  @private
     *  In theory it would be enough to just set a flag here and then fixup the 
     *  grid's hoverRow,ColumnIndex properties at updateDisplayList() time, based
     *  on the current mouse position (grid.mouseX,Y).  Unfortunately, the mouseX,Y
     *  DisplayObject properties aren't updated per the scrollRect until after 
     *  the new layout has appeared on screen.  To account for that we accumulate
     *  the deltas for grid.scrollRect.x,y here.   
     */
    private function invalidateHoverLocation(dx:Number, dy:Number):void
    {
        hoverLocationIsValid = false;
        mouseXOffset += dx;
        mouseYOffset += dy;
    }
    
    private function layoutHoverIndicator(container:IVisualElementContainer):void
    {
        if (!hoverLocationIsValid)
        {
            const mouseX:Number = grid.mouseX + mouseXOffset;
            const mouseY:Number = grid.mouseY + mouseYOffset;
            grid.hoverRowIndex = gridDimensions.getRowIndexAt(mouseX, mouseY);
            grid.hoverColumnIndex = gridDimensions.getColumnIndexAt(mouseX, mouseY);
            hoverLocationIsValid = true;
            mouseXOffset = 0;
            mouseYOffset = 0;
        }
        
        const rowIndex:int = grid.hoverRowIndex;
        const columnIndex:int = grid.hoverColumnIndex;
        const factory:IFactory = grid.hoverIndicator;
        hoverIndicator = layoutIndicator(container, factory, hoverIndicator, rowIndex, columnIndex); 
    }
    
    private function layoutCaretIndicator(container:IVisualElementContainer):void
