     //  x
     //----------------------------------
     
-    private var _x:Number = 0;
-    
-    /**
-     *  @private
-     *  In the mirroring case, we restore the old transform matrix,
-     *  call the superclass' setter to recalculate the transform matrix,
-     *  and call validateTransformMatrix to de-mirror the matrix.
-     *  This ensures that the right matrix values are used when 
-     *  de-mirroring.
+    /**
+     *  @private
+     */
+    override public function get x():Number
+    {
+        // TODO(hmuller): by default get x returns transform.matrix.tx rounded to the nearest 20th.
+        // should do the same here, if we're returning layoutFeatures.layoutX.
+        return (layoutFeatures == null) ? super.x : layoutFeatures.layoutX;
+    }
+    
+    /**
+     *  @private
      */
     override public function set x(value:Number):void
     {
-        if (mirror)
-        {
-            transform.matrix = origMatrix;
+        if (x == value)
+            return;
+        
+        if (layoutFeatures == null)
+        {
             super.x = value;
-            _x = value;
-            validateTransformMatrix();
-        }
-        else
-        {
-            super.x = value;
-        }
-    }
-    
-    /**
-     *  @private
-     */
-    override public function get x():Number
-    {
-        // FIXME(hmuller): by default get x returns transform.matrix.tx rounded to the nearest 20th.
-        // should do the same here, if we're returning _x.
-        return (mirror) ? _x : super.x;
+        }
+        else
+        {
+            layoutFeatures.layoutX = value;
+            validateTransformMatrix();
+        }
     }
     
     //----------------------------------

    
    /**
     *  @private
     *  Modifies the transform matrix so that this bitmap
     *  will not be mirrored if a parent is mirrored.
     */
    private function validateTransformMatrix():void
    {
        // Save copy of current matrix
        origMatrix = transform.matrix.clone();
        
        // Create new de-mirrored transform matrix
        const mirrorMatrix:Matrix = transform.matrix;
        mirrorMatrix.translate(-mirrorMatrix.tx, 0);
        mirrorMatrix.scale(-1, 1);
        mirrorMatrix.translate(_x + width, 0);
        
        transform.matrix = mirrorMatrix;
    }
}


    
    /**
     *  @private
     */
    override public function get y():Number
    {
        return (layoutFeatures == null) ? super.y : layoutFeatures.layoutY;
    }
    
    /**
     *  @private
     */
    override public function set y(value:Number):void
    {
        if (y == value)
            return;
        
        if (layoutFeatures == null)
        {
            super.y = value;
        }
        else
        {
            layoutFeatures.layoutY = value;
            validateTransformMatrix();
        }
    }
    
    //----------------------------------
    //  z
    //----------------------------------
    
    /**
     *  @private
     */
    override public function get z():Number
    {
        return (layoutFeatures == null) ? super.z : layoutFeatures.layoutZ;
    }
    
    /**
     *  @private
     */
    override public function set z(value:Number):void
    {
        if (z == value)
            return;
        
        if (layoutFeatures == null)
        {
            super.z = value;
        }
        else
    {
            layoutFeatures.layoutZ = value;
            validateTransformMatrix();
        }
    }
    
