         var y:Number = llv.start(startIndex);
         var index:int = startIndex;
         var x0:Number = paddingLeft;
+            
+		var w:Number;
+		var h:Number;
+		var elt:ILayoutElement;
         
         // First pass: compute element x,y,width,height based on 
         // current contentWidth; cache computed widths/heights in llv.
         for (; (y < maxVisibleY) && (index < eltCount); index++)
         {
-            var elt:ILayoutElement = layoutTarget.getVirtualElementAt(index, eltWidth, eltHeight);
-            var w:Number = calculateElementWidth(elt, targetWidth, containerWidth); // can be NaN
-            var h:Number = fixedRowHeight; // NaN for variable height rows
+            // reset this flag so components like Image can tell us
+            // not to cache measurements
+            dontCacheMeasurements = false;
+            // reset this array so we can find out what components are
+            // not final
+			if (!notFinalTargets)
+				notFinalTargets = [];
+			else
+            	notFinalTargets.length = 0;
+			// request element, but skip validation (especially of the displaylist)
+            elt = layoutTarget.getVirtualElementAt(index, eltWidth, eltHeight, true);
+			// then validate everything but the displaylist so there are valid
+			// default size
+			if (FlexVersion.compatibilityVersion >= FlexVersion.VERSION_4_5)
+				if (elt is ILayoutManagerClient)
+					UIComponentGlobals.layoutManager.validateClient(ILayoutManagerClient(elt), true);
+            w = calculateElementWidth(elt, targetWidth, containerWidth); // can be NaN
+            h = fixedRowHeight; // NaN for variable height rows
             elt.setLayoutBoundsSize(w, h);
-            w = elt.getLayoutBoundsWidth();        
+            w = elt.getLayoutBoundsWidth();       
             h = elt.getLayoutBoundsHeight();            
             var x:Number = x0 + calculateElementX(elt, w, containerWidth);
             elt.setLayoutBoundsPosition(x, y);
-            llv.cacheDimensions(index, elt);
+			// this flag potentially set by an event dispatched in the previous lines of code
+            if (dontCacheMeasurements)
+            {
+                // associate the index with the target
+                // so if the target is recycled to another
+                // index we know the current index
+                for each (var t:* in notFinalTargets)
+				{
+					if (!notFinalComponents)
+						notFinalComponents = new Dictionary(true);
+					notFinalComponents[t] = index;
+					
+				}
+				if (!notFinalIndexes)
+					notFinalIndexes = [];
+                // remember that this index didn't want to be cached
+                notFinalIndexes[index] = index;
+            }
+            else
+            {
+                if (notFinalIndexes && notFinalIndexes[index] != null)
+                {
+                    // we were previously told not to cache measurements.
+                    // clear it from the table.  We'll put it back in
+                    // if needed
+                    notFinalIndexes[index] = null;
+                    // scan the components that have dispatched a notFinal
+                    // to see if any are associated with this index
+                    for each(var p:* in notFinalComponents)
+                    {
+                        if (p == index)
+                        {
+                            // still a component that isn't final
+                            // so re-add it
+                            notFinalIndexes[index] = index;
+                            break;
+                        }
+                    }
+                    if (notFinalIndexes[index] == null)
+                        llv.cacheDimensions(index, elt);                
+                }
+                else
+                    llv.cacheDimensions(index, elt);                
+            }
             y += h + gap;
         }
         var endIndex:int = index - 1;
-
+        
         // Second pass: if neccessary, fix up x and width values based
         // on the updated contentWidth
         if (!justifyWidths && (llv.minorSize != contentWidth))

        var typicalElt:ILayoutElement = typicalLayoutElement;
        if (typicalElt)
        {
            var typicalWidth:Number = typicalElt.getPreferredBoundsWidth();
            var typicalHeight:Number = typicalElt.getPreferredBoundsHeight();
            llv.defaultMinorSize = typicalWidth;


        var layoutTarget:GroupBase = target;
        if (layoutTarget)
        {
            if (FlexVersion.compatibilityVersion >= FlexVersion.VERSION_4_5)
            {
                layoutTarget.invalidateSize();
                layoutTarget.invalidateEstimatedSizesOfChildren();
            }
            layoutTarget.invalidateDisplayList();
        }
    }
    
    //----------------------------------
