         private static var noEnterFramesRemaining:int = NaN;
         private static const _finishNotifier:EventDispatcher = new EventDispatcher();
 
-        private var _objectWhichIsRemovedOnSizeValidation:SomeComponent;
+        private var _objectWhichIsRemovedAtValidation:SomeComponent;
         private var _creationCompleteCalls:int;
 
         [Before]
         public function setUp():void
         {
             _creationCompleteCalls = 0;
-            _objectWhichIsRemovedOnSizeValidation = new SomeComponent();
-            _objectWhichIsRemovedOnSizeValidation.addEventListener(FlexEvent.CREATION_COMPLETE, onCreationComplete);
-            UIImpersonator.addElement(_objectWhichIsRemovedOnSizeValidation);
+            _objectWhichIsRemovedAtValidation = new SomeComponent();
+            _objectWhichIsRemovedAtValidation.addEventListener(FlexEvent.CREATION_COMPLETE, onCreationComplete);
+            UIImpersonator.addChild(_objectWhichIsRemovedAtValidation);
         }
 
         [After]
         public function tearDown():void
         {
             UIImpersonator.removeAllChildren();
-            _objectWhichIsRemovedOnSizeValidation = null;
-        }
+            _objectWhichIsRemovedAtValidation = null;
+        }
+
+
+        //--------------------------------------------------------------------------
+        //
+        //  Test method
+        //
+        //--------------------------------------------------------------------------
+
 
         [Test]
         public function test_object_removed_from_stage_via_code_is_not_initialized():void
         {
             //given
             UIComponentGlobals.mx_internal::layoutManager.usePhasedInstantiation = false;
-            _objectWhichIsRemovedOnSizeValidation.removeFromStageOnValidateProperties = true;
-
-            //when
-            _objectWhichIsRemovedOnSizeValidation.validateNow();
-
-            //then
-            assertNull("The object was actually not removed from stage. Huh?", _objectWhichIsRemovedOnSizeValidation.parent);
-            assertEquals("Yep, this is the bug. Why call initialized=true on an object that's not on stage?", 0, _creationCompleteCalls);
-        }
+            _objectWhichIsRemovedAtValidation.removeFromStageOnValidateProperties = true;
+
+            //when
+            _objectWhichIsRemovedAtValidation.validateNow();
+
+            //then
+            then_assert_not_initialized();
+        }
+
+
+
+        //--------------------------------------------------------------------------
+        //
+        //  Test method
+        //
+        //--------------------------------------------------------------------------
+
 
         [Test(async, timeout=500)]
         public function test_object_removed_from_stage_via_user_action_is_not_initialized():void
         {
             //given
             UIComponentGlobals.mx_internal::layoutManager.usePhasedInstantiation = true;
-            _objectWhichIsRemovedOnSizeValidation.removeFromStageOnValidateProperties = false;
-
-            //when
-            _objectWhichIsRemovedOnSizeValidation.invalidateDisplayList();
-            _objectWhichIsRemovedOnSizeValidation.invalidateProperties();
-            _objectWhichIsRemovedOnSizeValidation.invalidateSize();
+            _objectWhichIsRemovedAtValidation.removeFromStageOnValidateProperties = false;
+
+            //when
+            _objectWhichIsRemovedAtValidation.invalidateDisplayList();
+            _objectWhichIsRemovedAtValidation.invalidateProperties();
+            _objectWhichIsRemovedAtValidation.invalidateSize();
 
             //then wait 1 frame
             noEnterFramesRemaining = 1;
             UIImpersonator.testDisplay.addEventListener(Event.ENTER_FRAME, onEnterFrame);
-            Async.handleEvent(this, _finishNotifier, Event.COMPLETE, then_remove_from_stage_in_next_frame, 300);
-        }
-
-        private function then_remove_from_stage_in_next_frame(event:Event, passThroughData:Object):void
-        {
-            //when
-            _objectWhichIsRemovedOnSizeValidation.pretendUserAskedForComponentRemovalInNextFrame();
-
-            //then wait 2 frames
-            noEnterFramesRemaining = 2;
-            UIImpersonator.testDisplay.addEventListener(Event.ENTER_FRAME, onEnterFrame);
-            Async.handleEvent(this, _finishNotifier, Event.COMPLETE, then_assert_not_initialized, 300);
-        }
-
-        private function then_assert_not_initialized(event:Event, passThroughData:Object):void
-        {
-            //then
-            assertNull("The object was actually not removed from stage. Huh?", _objectWhichIsRemovedOnSizeValidation.parent);
-            assertEquals("Yep, this is the bug. Why call initialized=true on an object that's not on stage?", 0, _creationCompleteCalls);
-        }
-
+            Async.handleEvent(this, _finishNotifier, Event.COMPLETE, then_remove_from_stage_via_callLater, 300, then_assert_not_initialized);
+        }
+
+
+
+
+        //--------------------------------------------------------------------------
+        //
+        //  Test method
+        //
+        //--------------------------------------------------------------------------
 
         [Test(async, timeout=750)]
         public function test_object_removed_from_stage_then_readded_is_initialized_once():void
         {
             //given
             UIComponentGlobals.mx_internal::layoutManager.usePhasedInstantiation = true;
-            _objectWhichIsRemovedOnSizeValidation.removeFromStageOnValidateProperties = false;
-
-            //when
-            _objectWhichIsRemovedOnSizeValidation.validateNow();
-            _objectWhichIsRemovedOnSizeValidation.pretendUserAskedForComponentRemovalInNextFrame();
+            _objectWhichIsRemovedAtValidation.removeFromStageOnValidateProperties = false;
+
+            //when
+            _objectWhichIsRemovedAtValidation.invalidateDisplayList();
+            _objectWhichIsRemovedAtValidation.invalidateProperties();
+            _objectWhichIsRemovedAtValidation.invalidateSize();
 
             //then wait 1 frame
             noEnterFramesRemaining = 1;
             UIImpersonator.testDisplay.addEventListener(Event.ENTER_FRAME, onEnterFrame);
-            Async.handleEvent(this, _finishNotifier, Event.COMPLETE, then_readd_object, 200);
+            Async.handleEvent(this, _finishNotifier, Event.COMPLETE, then_remove_from_stage_via_callLater, 300, then_readd_object);
         }
 
         private function then_readd_object(event:Event, passThroughData:Object):void
         {
             //then
-            assertNull("The object was actually not removed from stage. Huh?", _objectWhichIsRemovedOnSizeValidation.parent);
-
-            //when
-            UIImpersonator.addElement(_objectWhichIsRemovedOnSizeValidation);
+            assertNull("The object was actually not removed from stage. Huh?", _objectWhichIsRemovedAtValidation.parent);
+
+            //when
+            UIImpersonator.addElement(_objectWhichIsRemovedAtValidation);
 
             //then wait 4 frames, to make sure validation is done
             noEnterFramesRemaining = 4;

    {
        _removeFromStageOnValidateProperties = value;
    }
}
    }
}

import mx.core.IVisualElementContainer;
import mx.core.UIComponent;

class SomeComponent extends UIComponent
{
    private var _removeFromStageOnValidateProperties:Boolean = false;
    private var _numValidatePropertiesCalls:int = 0;
    private var _numValidateSizeCalls:int = 0;
    private var _numValidateDisplayListCalls:int = 0;

    override public function validateProperties():void
    {
        super.validateProperties();
        _numValidatePropertiesCalls++;
        if(_removeFromStageOnValidateProperties)
            removeFromStage();
    }
