      * 
      *  This is used when text is either inserted or appended via the API.
      */
-    private function handleInsertText(text:String, isAppend:Boolean=false):void
+    private function handleInsertText(newText:String, isAppend:Boolean=false):void
     {
         // Make sure all properties are committed and events dispatched
         // before doing the append.
         validateNow();
 
-        // Always use the EditManager regardless of the values of
-        // selectable, editable and enabled.
-        var editManager:IEditManager = getEditManager();
-        
-        // An append is an insert with the selection set to the end.
-        // If no selection, then it's an append.
-         if (isAppend || !editManager.hasSelection())
-            editManager.selectRange(int.MAX_VALUE, int.MAX_VALUE);
-
-        dispatchChangeAndChangingEvents = false;
- 
-        // Insert the text.  It will be composed but the display will not be
-        // updated because of our override of 
-        // EditManager.updateAllControllers().
-        editManager.insertText(text);
-
-        // Make the insertion happen now rather than on the next frame.
-        editManager.flushPendingOperations();
-        
-        dispatchChangeAndChangingEvents = true;
-        
-        // All done with edit manager.
-        releaseEditManager(editManager);        
-
-        dispatchEvent(new FlexEvent(FlexEvent.VALUE_COMMIT));                                   
+        if (isAppend)
+        {
+            // Set insertion pt to the end of the current text.
+            _selectionAnchorPosition = text.length;
+            _selectionActivePosition = _selectionAnchorPosition;
+        }
+        else
+        {
+            // Insert requires a selection, or it is a noop.
+            if (_selectionAnchorPosition == -1 || _selectionActivePosition == -1)
+                return;
+        }
+
+        // This will update the selection after the operation is done.
+        var success:Boolean =
+            _textContainerManager.insertTextOperation(
+                newText, _selectionAnchorPosition, _selectionActivePosition);
+                
+        if (success)
+            dispatchEvent(new FlexEvent(FlexEvent.VALUE_COMMIT));                                   
     }
 
     /**

            else if (category == Category.CHARACTER && characterFormat)
                format[p] = characterFormat[p];
        }
        
        // All done with the selection manager.
        releaseSelectionManager();
        
        return format;
    }

    /**
     *  @private
     */
    private var _textContainerManager:RichEditableTextContainerManager;
            
    /**
     *  @private
