      */
     override public function getLayoutElementAt(index:int):ILayoutElement
     {
-        var itemRendererIndex:int = index - virtualLayoutOffset;
-        var itemRenderer:Object = mx_internal::getRendererForItemAt(itemRendererIndex);
-
+        var itemRenderer:IVisualElement;
+        
         if (layout && layout.virtualLayout)
         {
             // Note: the code below does most of the same work as itemAdded()
             var item:Object = dataProvider.getItemAt(index);
+            var itemRendererIndex:int = index - virtualLayoutOffset;
             var createdIR:Boolean = false;
             
+            itemRenderer = virtualItemRenderers[item];
             if (!itemRenderer)
             {
                 itemRenderer = createRendererForItem(item);
+                //trace("DataGroup::getLayoutElementAt("+index+") created " + item); 
                 createdIR = true;
             }
 
-            if (itemRenderer.parent != this)
-                addItemRendererToDisplayList(DisplayObject(itemRenderer), itemRendererIndex);
-            else
-                super.setChildIndex(DisplayObject(itemRenderer), itemRendererIndex);
+            addItemRendererToDisplayList(DisplayObject(itemRenderer), itemRendererIndex);
             
             if (createdIR)
             {
+                virtualItemRenderers[item] = itemRenderer;  // weak reference
                 if (itemRenderer is IInvalidating)
                     IInvalidating(itemRenderer).validateNow();
-                // TBD sync with itemAdded
                 dispatchEvent(new ItemExistenceChangedEvent(ItemExistenceChangedEvent.ITEM_ADD, false, false, item));
             }
+        }
+        else {
+            itemRenderer = mx_internal::getRendererForItemAt(index);            
         }
 
         return LayoutElementFactory.getLayoutElementFor(itemRenderer);

     */ 
    protected function addItemRendererToDisplayList(child:DisplayObject, index:int = -1):DisplayObject
    { 
        // TODO: do we need this case (parented by me previously)?
        if (child.parent && child.parent == this)
        {
            var insertIndex:int;

import mx.layout.LayoutBase;
import mx.layout.LayoutElementFactory;
import mx.styles.IStyleClient;
import flash.utils.Dictionary;


/**
