             invalidateTransform();
         }
         
+        // Early exit if possible. We don't want to invalidate unnecessarily.
+        // We need to do the check here, after our new value has been applied
+        // because our matrix components are rounded upon being applied to a
+        // DisplayObject.
+        if (MatrixUtil.isEqual(previousMatrix, _layoutFeatures ? 
+            _layoutFeatures.layoutMatrix : super.transform.matrix))
+        {    
+            return;
+        } 
+        
         invalidateProperties();
 
         if (invalidateLayout)

     */
    public function setLayoutMatrix3D(value:Matrix3D, invalidateLayout:Boolean):void
    {
        // validateMatrix when switching between 2D/3D, works around player bug
        // see sdk-23421 
        var was3D:Boolean = is3D;

     */
    public function setLayoutMatrix(value:Matrix, invalidateLayout:Boolean):void
    {
        var previousMatrix:Matrix = _layoutFeatures ? 
            _layoutFeatures.layoutMatrix : super.transform.matrix;
                            
        // validateMatrix when switching between 2D/3D, works around player bug
        // see sdk-23421 
        var was3D:Boolean = is3D;
        _hasComplexLayoutMatrix = true;
        
        if (_layoutFeatures == null)
        {
            // flash will make a copy of this on assignment.
