         //  IList listeners: columns, dataProvider
         //
         //--------------------------------------------------------------------------  
+
+        /**
+         *  @private
+         *  Update caretRowIndex if necessary.  This method should only be called when 
+         *  caretRowIndex is valid, i.e. != -1.
+         */
+        private function updateCaretForDataProviderChange(event:CollectionEvent):void
+        {
+            const oldCaretRowIndex:int = caretRowIndex;
+            const location:int = event.location;
+            var itemsLength:int;
+
+            switch (event.kind)
+            {
+                case CollectionEventKind.ADD:
+                    if (oldCaretRowIndex >= location)
+                        caretRowIndex += event.items.length;
+                    break;
+               
+                case CollectionEventKind.REMOVE:
+                    if (oldCaretRowIndex >= location)
+                    {
+                        itemsLength = event.items.length;
+                        if (oldCaretRowIndex < (location + itemsLength))
+                            caretRowIndex = -1;
+                        else
+                            caretRowIndex -= itemsLength;    
+                    }
+                    
+                    break;
+                
+                case CollectionEventKind.MOVE:
+                    {
+                        const oldLocation:int = event.oldLocation;
+                        itemsLength = event.items.length;
+                        if ((oldCaretRowIndex >= oldLocation) && (oldCaretRowIndex < (oldLocation + itemsLength)))
+                            caretRowIndex += location - oldLocation;
+                    }
+                    break;                        
+                    
+                case CollectionEventKind.REPLACE:
+                case CollectionEventKind.UPDATE:
+                    break;
+                
+                case CollectionEventKind.REFRESH:
+                case CollectionEventKind.RESET:
+                    caretRowIndex = -1;
+                    caretColumnIndex = -1;
+                    break;
+            }
+                        
+        }
+        
+        /**
+         *  @private
+         *  Update hoverRowIndex if necessary.  This method should only be called when 
+         *  hoverRowIndex is valid, i.e. != -1.
+         */
+        private function updateHoverForDataProviderChange(event:CollectionEvent):void
+        {
+            const oldHoverRowIndex:int = hoverRowIndex;
+            const location:int = event.location;
+            
+            switch (event.kind)
+            {
+                case CollectionEventKind.ADD:
+                case CollectionEventKind.REMOVE:
+                case CollectionEventKind.REPLACE:
+                case CollectionEventKind.UPDATE:
+                case CollectionEventKind.MOVE:
+                    if (oldHoverRowIndex >= location)
+                        hoverRowIndex = gridDimensions.getRowIndexAt(mouseX, mouseY);
+                    break;
+                
+                
+                case CollectionEventKind.REFRESH:
+                case CollectionEventKind.RESET:
+                    hoverRowIndex = gridDimensions.getRowIndexAt(mouseX, mouseY);
+                    break;
+            }
+                        
+        }
         
         /**
          *  @private

        {
            if (gridDimensions)
                gridDimensions.dataProviderCollectionChanged(event);
            if (gridLayout)
                gridLayout.dataProviderCollectionChanged(event);
            if (gridSelection)
                gridSelection.dataProviderCollectionChanged(event);
            
            // TBD: hover and caretIndex
            
            invalidateSize();
            invalidateDisplayList();
        }

            // setters because the gridSelection and gridDimensions might not 
            // be set yet, depending on the order they are initialized when the 
            // grid skin part is added to the data grid.
            
            if (dataProviderChanged || columnsChanged)
            {
                // Remove the current selection and, if requireSelection, make
