     //  Overidden Methods
     //
     //--------------------------------------------------------------------------
+    
+    /**
+     *  Compute the estimatedWidth and estimatedHeight on the
+     *  elements.
+     *
+     *  @langversion 3.0
+     *  @playerversion Flash 10.2
+     *  @playerversion AIR 2.0
+     *  @productversion Flex 4.5
+     */
+    override public function estimateSizesOfElements():void
+    {
+        var scroller:Scroller = getScroller();
+        if (!scroller) 
+            return;
+        
+        var viewport:IViewport = scroller.viewport;
+        var layoutElement:ILayoutElement = viewport as ILayoutElement;
+        if (!layoutElement)
+			return;
+		
+        var cw:Number;
+        var ch:Number;
+        var oldcw:Number = layoutElement.estimatedWidth;
+        var oldch:Number = layoutElement.estimatedHeight;
+        cw = target.estimatedWidth;
+        if (isNaN(cw) && !isNaN(target.explicitWidth))
+            cw = target.explicitWidth;
+        ch = target.estimatedHeight;
+        if (isNaN(ch) && !isNaN(target.explicitHeight))
+            ch = target.explicitHeight;
+        
+        const minViewportInset:Number = scroller.minViewportInset;
+        const measuredSizeIncludesScrollBars:Boolean = scroller.measuredSizeIncludesScrollBars && (scroller.getStyle("interactionMode") == InteractionMode.MOUSE);
+        const hsb:ScrollBarBase = scroller.horizontalScrollBar;
+        var showHSB:Boolean = false;
+        if (measuredSizeIncludesScrollBars)
+            switch(scroller.getStyle("horizontalScrollPolicy")) 
+            {
+                case ScrollPolicy.ON: 
+                    if (hsb) showHSB = true; 
+                    break;
+                case ScrollPolicy.AUTO: 
+                    if (hsb) showHSB = hsb.visible;
+                    break;
+            } 
+        
+        const vsb:ScrollBarBase = scroller.verticalScrollBar;
+        var showVSB:Boolean = false;
+        if (measuredSizeIncludesScrollBars)
+            switch(scroller.getStyle("verticalScrollPolicy")) 
+            {
+                case ScrollPolicy.ON: 
+                    if (vsb) showVSB = true; 
+                    break;
+                case ScrollPolicy.AUTO: 
+                    if (vsb) showVSB = vsb.visible;
+                    break;
+            }
+        
+        ch -= (showHSB) ? hsbRequiredHeight() + minViewportInset : minViewportInset * 2;
+        cw -= (showVSB) ? vsbRequiredWidth() + minViewportInset : minViewportInset * 2;
+        
+        layoutElement.setEstimatedSize(cw, ch);
+        if (layoutElement is ILayoutManagerContainerClient)
+		{
+			var sameWidth:Boolean = isNaN(cw) && isNaN(oldcw) || cw == oldcw;
+			var sameHeight:Boolean = isNaN(ch) && isNaN(oldch) || ch == oldch;
+            if (!(sameHeight && sameWidth))
+            {
+                if (layoutElement is IContainerInvalidating)
+                    IContainerInvalidating(layoutElement).invalidateEstimatedSizesOfChildren();
+                ILayoutManagerContainerClient(layoutElement).validateEstimatedSizesOfChildren();
+            }
+		}
+    }
     
     /**
      * @private

            else
                vsb.setLayoutBoundsPosition(w - vsbW - 3, 0);
        }

        // If we've added an auto scrollbar, then the measured size is likely to have been wrong.
        // There's a risk of looping here, so we count.  
        if ((invalidationCount < 2) && (((vsbVisible != oldShowVSB) && vAuto) || ((hsbVisible != oldShowHSB) && hAuto)))
        {
            target.invalidateSize();
            
            // If the viewport's layout is virtual, it's possible that its
            // measured size changed as a consequence of laying it out,
            // so we invalidate its size as well.
            var viewportGroup:GroupBase = viewport as GroupBase;
            if (viewportGroup && viewportGroup.layout && viewportGroup.layout.useVirtualLayout)
                viewportGroup.invalidateSize();
            
            invalidationCount += 1; 
        }
        else
            invalidationCount = 0;
             
        target.setContentSize(w, h);
    }



        if (viewport)
        {
            if (FlexVersion.compatibilityVersion >= FlexVersion.VERSION_4_5)
            {
                estimateSizesOfElements();
                if (viewport is ILayoutManagerClient)
                    UIComponentGlobals.layoutManager.validateClient(ILayoutManagerClient(viewport), true);
            }
            viewport.setLayoutBoundsSize(viewportW, viewportH);
            viewport.setLayoutBoundsPosition(minViewportInset, minViewportInset);
        }
