      *  The list is updated by finishVirtualLayout().  
      */
     private var freeRenderers:Array = new Array();
-         
-    /**
-     *  @private
+    
+    /**
+     *  @private
+     *  Called before super.updateDisplayList() if layout.useVirtualLayout=true.
+     *  Copies virtualRendererIndices to oldRendererIndices, clears virtualRendererIndices
+     *  (which will be repopulated by subsequence getVirtualElementAt() calls), and
+     *  calls ensureTypicalElement().
+     */
+    private function startVirtualLayout():void
+    {
+        virtualLayoutUnderway = true;
+        
+        // lazily create the virtualRendererIndices vectors
+        
+        if (!virtualRendererIndices)
+            virtualRendererIndices = new Vector.<int>();
+        if (!oldVirtualRendererIndices)
+            oldVirtualRendererIndices = new Vector.<int>();
+        
+        // Copy the contents virtualRendererIndices to oldVirtualRendererIndices
+        // and then clear virtualRendererIndices
+        
+        oldVirtualRendererIndices.length = 0;
+        for each (var index:int in virtualRendererIndices)
+            oldVirtualRendererIndices.push(index);
+        virtualRendererIndices.length = 0;
+        
+        // Ensure that layout.typicalLayoutElement is set
+        ensureTypicalLayoutElement();
+    }
+    
+    /**
+     *  @private
+     *  Called after super.updateDisplayList() finishes.
+     * 
      *  Discard the ItemRenderers that aren't needed anymore, i.e. the ones
-     *  outside the range virtualLayoutStartIndex to virtualLayoutEndIndex.
+     *  not explicitly requested with getVirtualElementAt() during the most
+     *  recent super.updateDisplayList().
+     * 
      *  Discarded IRs may be added to the freeRenderers list per the rules
      *  defined in getVirtualElementAt().  If any visible renderer has a non-zero
-     *  depth we resort DisplayObject - manageDisplayObjectLayers() - as well. 
+     *  depth we resort all of them with manageDisplayObjectLayers(). 
      */
     private function finishVirtualLayout():void
     {
-        if (oldVirtualLayoutStartIndex < 0 || oldVirtualLayoutEndIndex < 0)
+        virtualLayoutUnderway = false;
+
+        if (oldVirtualRendererIndices.length == 0)
             return;
         
-        // Remove the old ItemRenderers that aren't new ItemRenderers.  In other
-        // words remove the ItemRenderers from oldVirtualLayoutStartIndex to 
-        // oldVirtualLayoutEndIndex, but skip the ones in the range
-        // virtualLayoutStartIndex to virtualLayoutEndIndex.
-
-        for (var index:int = oldVirtualLayoutStartIndex; index <= oldVirtualLayoutEndIndex; index++)
-        {
-            // Skip the inView renderers.  If vitrualLayoutStartIndex is -1, there aren't any. 
-            if (virtualLayoutStartIndex != -1 && index >= virtualLayoutStartIndex && index <= virtualLayoutEndIndex)
-            {
-                index = virtualLayoutEndIndex;
+        // Remove the old ItemRenderers that aren't new ItemRenderers and 
+        // add them to the freeRenderers list.
+        
+        for each (var vrIndex:int in oldVirtualRendererIndices)
+        {
+            // Skip renderers that are still in view.
+            if (virtualRendererIndices.indexOf(vrIndex) != -1)
                 continue;
-            }
             
             // Remove previously "in view" IR from the item=>IR table
-            var elt:IVisualElement = indexToRenderer[index] as IVisualElement;
-            delete indexToRenderer[index];
-
+            var elt:IVisualElement = indexToRenderer[vrIndex] as IVisualElement;
+            delete indexToRenderer[vrIndex];
+            
             // Free or remove the IR.
-            var item:Object = dataProvider.getItemAt(index);
+            var item:Object = dataProvider.getItemAt(vrIndex);
             if ((item != elt) && (elt is IDataRenderer))
             {
                 // IDataRenderer(elt).data = null;  see https://bugs.adobe.com/jira/browse/SDK-20962

                invalidateProperties();
                break;
            }
            
            case CollectionEventKind.RESET:
            {
                // reset everything

        if (!virtualLayoutUnderway)
            super.invalidateSize();
    }
    
    /**
     *  @private 
     *  Make sure there's a valid typicalLayoutElement for virtual layout.
