         addHierarchyListeners();
         
         if (needsRestore)
+        {
             restoreStageText();
+        }
+        else if (savedSelectionAnchorIndex > 0 || savedSelectionActiveIndex > 0)
+        {
+            // Even if the StageText has been retrieved from the cache, its
+            // selection is not preserved. Restore the selection if necessary.
+            if (savedSelectionAnchorIndex <= _text.length && savedSelectionActiveIndex <= _text.length)
+                stageText.selectRange(savedSelectionAnchorIndex, savedSelectionActiveIndex);
+            savedSelectionAnchorIndex = 0;
+            savedSelectionActiveIndex = 0;
+        }
         
         if (deferredViewPortUpdate)
             updateViewPort();

        dispatchEvent(new KeyboardEvent(event.type, true, event.cancelable, 
            event.charCode, event.keyCode, event.keyLocation, event.ctrlKey, 
            event.altKey, event.shiftKey, event.controlKey, event.commandKey));
    }
    
    private function stageText_softKeyboardHandler(event:SoftKeyboardEvent):void

    
    private function stageText_keyDownHandler(event:KeyboardEvent):void
    {
        // Taps on the Enter key on soft keyboards may send us the Next keycode
        if ((event.keyCode == Keyboard.ENTER || event.keyCode == Keyboard.NEXT)
            && !_multiline)
        {
            dispatchEvent(new FlexEvent(FlexEvent.ENTER));
        }
        
        // Keyboard events are documented as bubbling. However, all events
        // coming from StageText are set to not bubble. So we need to create an
