      *  @param index The index of the item that is being removed.
      */
     mx_internal function itemRemoved(item:Object, index:int):void
-    {       
-        var myItemRenderer:IVisualElement = itemToRenderer[item];
-        delete itemToRenderer[item];
+    {
+        if (layout && layout.useVirtualLayout)
+        {
+            if (index < virtualLayoutStartIndex)
+            {
+                invalidateSize();
+                invalidateDisplayList();
+                return;
+            }
+            else if (index > virtualLayoutEndIndex)
+            {
+                invalidateSize();
+                return;
+            }
+            // otherwise, we'll add it to the display list
+        }
+        
+        var myItemRenderer:IVisualElement = indexToRenderer[index];
+        indexToRenderer.splice(index, 1);
         
         dispatchEvent(new RendererExistenceEvent(
                       RendererExistenceEvent.RENDERER_REMOVE, false, false, 

        if (layout && layout.useVirtualLayout)
        {
            virtualLayoutUnderway = true;
            virtualLayoutStartIndex = -1;
            ensureTypicalLayoutElement();
        }
        
        super.updateDisplayList(unscaledWidth, unscaledHeight);

        if (virtualLayoutUnderway)
        {
            finishVirtualLayout();

    {
        if ((index < 0) || (dataProvider == null) || (index >= dataProvider.length))
            return null;
        
        var elt:IVisualElement = indexToRenderer[index];
        
        if (virtualLayoutUnderway)
        {
