             _includeInLayout = false;
         }
 
-        // TODO (chaase): Would be nice to put this function in a central place
-        // to be used by UIComponent, SpriteVisualElement, UIMovieClip, and
-        // GraphicElement, since they all have similar or identical functions
-        if (_layoutFeatures == null)
-        {
-            // TODO (chaase): should provide a way to return to having no
-            // layoutFeatures if we call this later with a more trivial
-            // situation
-            var needAdvancedLayout:Boolean = 
-                (scale != null && ((!isNaN(scale.x) && scale.x != 1) || 
-                    (!isNaN(scale.y) && scale.y != 1) ||
-                    (!isNaN(scale.z) && scale.z != 1))) || 
-                (rotation != null && ((!isNaN(rotation.x) && rotation.x != 0) || 
-                    (!isNaN(rotation.y) && rotation.y != 0) ||
-                    (!isNaN(rotation.z) && rotation.z != 0))) || 
-                (translation != null && translation.z != 0 && !isNaN(translation.z)) ||
-                postLayoutScale != null ||
-                postLayoutRotation != null ||
-                (postLayoutTranslation != null && 
-                    (translation == null ||
-                     postLayoutTranslation.x != translation.x ||
-                     postLayoutTranslation.y != translation.y ||
-                     postLayoutTranslation.z != translation.z));
-            if (needAdvancedLayout)
-                initAdvancedLayoutFeatures();
-        }
+        var prevX:Number = x;
+        var prevY:Number = y;
+        var prevZ:Number = z;
+        
+        TransformUtil.transformAround(this,
+                                      transformCenter,
+                                      scale,
+                                      rotation,
+                                      translation,
+                                      postLayoutScale,
+                                      postLayoutRotation,
+                                      postLayoutTranslation,
+                                      _layoutFeatures,
+                                      internal_initAdvancedLayoutFeatures);
+        
         if (_layoutFeatures != null)
         {
-            var prevX:Number = _layoutFeatures.layoutX;
-            var prevY:Number = _layoutFeatures.layoutY;
-            var prevZ:Number = _layoutFeatures.layoutZ;
-            _layoutFeatures.transformAround(transformCenter, scale, rotation,
-                translation, postLayoutScale, postLayoutRotation,
-                postLayoutTranslation);
             invalidateTransform();
 
             // Will not invalidate parent if we have set _includeInLayout to false
             // in the beginning of the method
             invalidateParentSizeAndDisplayList();
-
+            
             if (prevX != _layoutFeatures.layoutX)
                 dispatchEvent(new Event("xChanged"));
             if (prevY != _layoutFeatures.layoutY)

        features.layoutWidth = width;  // for the mirror transform      
        _layoutFeatures = features;
        invalidateTransform();
    }

    /**

    //  ILayoutElement
    //
    //--------------------------------------------------------------------------

    /**
     *  @inheritDoc
