      */
     private function dataProviderCollectionReset(event:CollectionEvent):Boolean
     {
-        freeGridElements(visibleRowBackgrounds);
-        freeGridElements(visibleRowSeparators);
-        visibleRowIndices.length = 0;
-
-        freeGridElements(visibleColumnBackgrounds);
-        freeGridElements(visibleColumnSeparators);        
-        visibleColumnIndices.length = 0;
-        
-        freeItemRenderers(visibleItemRenderers);
-        
-        freeGridElements(visibleSelectionIndicators);
-        visibleRowSelectionIndices.length = 0;
-        visibleColumnSelectionIndices.length = 0;
-        
-        freeGridElement(hoverIndicator)
-        hoverIndicator = null;
-        
-        freeGridElement(caretIndicator);
-        caretIndicator = null;
-        
-        visibleItemRenderersBounds.setEmpty();
-        visibleGridBounds.setEmpty();
-               
+        clearVirtualLayoutCache();
         return true;
     }
     

    private var visibleRowSeparators:Vector.<IVisualElement> = new Vector.<IVisualElement>(0);
    private var visibleColumnSeparators:Vector.<IVisualElement> = new Vector.<IVisualElement>(0);
    
    private function layoutLinearElements (
        factory:IFactory,
        container:IVisualElementContainer,

     *  order.  When an element is freed, the corresponding member of the vector parameter
     *  is set to null.
     * 
     *  This method is [supposed to be a] somewhat more efficient implementation of the following:
     * 
     *  for (var i:int = 0; i < elements.length; i++)
     *     {
     *     if ((oldIndices[i] == lastIndex) || (newIndices.indexOf(oldIndices[i]) == -1))
     *         freeGridElement(elements[i]);
     *         elements[i] = null;
     *     }
     *  
     *  The lastIndex parameter is used to handle row and column separators, where the last
     *  element is left out since separators only appear in between elements.  If the lastIndex
     *  appears in oldIndices, we're not going to need the old element.
     */
    private function freeLinearElements (
        elements:Vector.<IVisualElement>, 
        oldIndices:Vector.<int>, 
        newIndices:Vector.<int>, 
        lastIndex:int):void
    {
        // TBD(hmuller): rewrite this, should be one pass (no indexOf)
        for (var i:int = 0; i < elements.length; i++)
        {
            const offset:int = newIndices.indexOf(oldIndices[i]);
            if ((oldIndices[i] == lastIndex) || (newIndices.indexOf(oldIndices[i]) == -1))
            {
                const elt:IVisualElement = elements[i];
                if (elt)
