         motionPaths.push(newMotionPath);
     }
     
+   /**
+     *  Documentation is not currently available.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 10
+     *  @playerversion AIR 1.5
+     *  @productversion Flex 4
+     */
+    protected function initProjection():void
+    {
+        if(applyLocalProjection)
+        {
+            // TODO (rfrishbe): need to check for IUIComponent?
+            var parent:UIComponent = target.parent;
+            
+            if(parent != null)
+            {
+                    
+                originalProjection = parent.$transform.perspectiveProjection;
+                var p:PerspectiveProjection = new PerspectiveProjection();
+                if(!isNaN(fieldOfView))
+                    p.fieldOfView = fieldOfView;
+                if(!isNaN(focalLength))
+                    p.focalLength = focalLength;
+                
+                if(autoCenterProjection)
+                {
+                    var le:ILayoutElement = target as ILayoutElement;
+                    p.projectionCenter = new Point(le.getLayoutBoundsX() + le.getLayoutBoundsWidth()/2,
+                                                   le.getLayoutBoundsY() + le.getLayoutBoundsHeight()/2);           
+                }
+                else
+                {
+                    p.projectionCenter = new Point(projectionX, projectionY);
+                }
+        
+                parent.$transform.perspectiveProjection = p;        
+            }
+        }       
+        
+    }
+    
+   /**
+     *  Documentation is not currently available.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 10
+     *  @playerversion AIR 1.5
+     *  @productversion Flex 4
+     */
+    protected function removeProjection():void
+    {
+        if(applyLocalProjection && removeLocalProjectionWhenComplete)
+        {
+            // TODO (rfrishbe): need to check for IUIComponent? 
+            // as well if checking for IVisualElement?
+            var parent:DisplayObject= target.parent as DisplayObject;
+            
+            if(parent is UIComponent)
+            {
+                (parent as UIComponent).$transform.perspectiveProjection = originalProjection;
+            }
+            else if (parent != null)
+            {
+                parent.transform.perspectiveProjection = originalProjection;
+            }
+        }
+    }
+
+
     // TODO (chaase): This probably belongs at the AnimateTransform level,
     // and make sure that it only kicks in when AnimateTransform is used
     // explicitly; Someone performing a Move may not also want to

    private static var scale:Vector3D = new Vector3D();
    private static var rotation:Vector3D = new Vector3D();
    private static var position:Vector3D = new Vector3D();

    //--------------------------------------------------------------------------
    //

    private var currentValues:Object = {rotationX:NaN, rotationY:NaN, rotationZ:NaN,
                                        scaleX:NaN, scaleY:NaN, scaleZ:NaN,
                                        translationX:NaN, translationY:NaN, translationZ:NaN,
                                        postLayoutRotationX:NaN, postLayoutRotationY:NaN, postLayoutRotationZ:NaN,
                                        postLayoutScaleX:NaN, postLayoutScaleY:NaN, postLayoutScaleZ:NaN,
                                        postLayoutTranslationX:NaN, postLayoutTranslationY:NaN, postLayoutTranslationZ:NaN};
    
    /**
     *  Utility structures used in applyValues()
