         // so we can ignore any collectionChange.UPDATE events
         renderersBeingUpdated = true;
         
-        // Set the data    
-        if ((renderer is IDataRenderer) && (renderer !== data))
-            IDataRenderer(renderer).data = data;
-        
-        // Newly created renderer with no owner, set owner to this     
-        if (!renderer.owner)
-            renderer.owner = this; 
-        
-        // Set the index
-        if (renderer is IItemRenderer)
-            IItemRenderer(renderer).itemIndex = index;
-        
-        // If a delegate is specified defer to the rendererUpdateDelegate
-        // to update the renderer.
-        if (_rendererUpdateDelegate)
-            _rendererUpdateDelegate.updateRenderer(renderer);
-
-        // Else if we're the owner, set the label to the toString()
-        // of the data 
-        else if (renderer.owner == this && renderer is IItemRenderer)
-            IItemRenderer(renderer).label = itemToLabel(data);
+        // Defer to the rendererUpdateDelegate
+        // to update the renderer.  By default, the delegate is DataGroup
+        _rendererUpdateDelegate.updateRenderer(renderer, itemIndex, data);
         
         // technically if this got called "recursively", this renderersBeingUpdated flag
         // would be prematurely set to false, but in most cases, this check should be 
         // good enough.
         renderersBeingUpdated = false;
     }
-
-    
+    
+    /**
+     *  @inheritDoc
+     */
+    public function updateRenderer(renderer:IVisualElement, itemIndex:int, data:Object):void
+    {
+        // set the owner
+        renderer.owner = this;
+        
+        // Set the index
+        if (renderer is IItemRenderer)
+            IItemRenderer(renderer).itemIndex = itemIndex;
+
+        // set the label to the toString() of the data 
+        if (renderer is IItemRenderer)
+            IItemRenderer(renderer).label = itemToLabel(data);
+        
+        // always set the data last
+        if ((renderer is IDataRenderer) && (renderer !== data))
+            IDataRenderer(renderer).data = data;
+    }
+    
+    /**
+     *  @private
+     */
     private function manageDisplayObjectLayers():void
     {
         // itemRenderers should be both DisplayObjects and IVisualElements

        var myItemRenderer:IVisualElement = createRendererForItem(item);
        indexToRenderer.splice(index, 0, myItemRenderer);
        addItemRendererToDisplayList(myItemRenderer as DisplayObject, index);
        updateRenderer(myItemRenderer, index, item);
        dispatchEvent(new RendererExistenceEvent(
                      RendererExistenceEvent.RENDERER_ADD, false, false, 
                      myItemRenderer, index, item));

    }
    
    /**
     *  @inheritDoc
     * 
     *  Given a data item, return the toString() representation 
     *  of the data item for an item renderer to display. Null 
     *  data items return the empty string. 
     */
    public function itemToLabel(item:Object):String
    {
        if (item !== null)
            return item.toString();
