         
         stageText.stage = stage;
         
+        stageText.stage.addEventListener(EffectEvent.EFFECT_START, stage_effectStartHandler, true, 0, true);
+        stageText.stage.addEventListener(EffectEvent.EFFECT_END, stage_effectEndHandler, true, 0, true);
+        
+        stageText.stage.addEventListener(Event.ADDED, stage_hierarchyChangedHandler, false, 0, true);
+        stageText.stage.addEventListener(Event.REMOVED, stage_hierarchyChangedHandler, false, 0, true);
+        
+        updateWatchedAncestors();
+        
         if (deferredViewPortUpdate)
             updateViewPort();
     }
     
-    /**
-     *  Clean up and dispose of our StageText.
-     *  TODO: This fails on iOS because of bug 2906305. 
-     */
     private function removedFromStageHandler(event:Event):void
     {
         if (stageText == null)
             return;
         
+        stageText.stage.removeEventListener(EffectEvent.EFFECT_START, stage_effectStartHandler, true);
+        stageText.stage.removeEventListener(EffectEvent.EFFECT_END, stage_effectEndHandler, true);
+
+        stageText.stage.removeEventListener(Event.ADDED, stage_hierarchyChangedHandler);
+        stageText.stage.removeEventListener(Event.REMOVED, stage_hierarchyChangedHandler);
+
         stageText.stage = null;
         
         stageText.removeEventListener(Event.CHANGE, stageText_changeHandler);

        }
    }
    
    /**
     *  Tell the StageText what rectangle it needs to render in. The StageText
     *  is not part of the normal display hierarchy, so its coordinates are

    //
    //--------------------------------------------------------------------------
    
    private function ancestor_hideHandler(event:FlexEvent):void
    {
        // Shortcut: If any ancestor hid, the StageText must hide. No need to
        // recalculate visibility.
        ancestorsVisible = false;
        ancestorsVisibleInvalidateFlag = false;
        invalidateViewPortFlag = true;
        
        invalidateProperties();
    }
    
    private function ancestor_moveHandler(event:MoveEvent):void
    {
        // Any change in ancestor geometry may affect the StageText's geometry.
        invalidateViewPortFlag = true;
        invalidateProperties();
    }
    
    private function ancestor_resizeHandler(event:ResizeEvent):void
    {
        // Any change in ancestor geometry may affect the StageText's geometry.
        invalidateViewPortFlag = true;
        invalidateProperties();
    }
    
    private function ancestor_showHandler(event:FlexEvent):void
    {
        // An ancestor was shown, but some other ancestor may still be hidden.
        // Invalidate visibility and recalculate it later.
        ancestorsVisibleInvalidateFlag = true;
        invalidateViewPortFlag = true;
        
        invalidateProperties();
    }

    private function stageText_changeHandler(event:Event):void
    {
        var foundChange:Boolean = false;
