Index: src/orca/default.py
===================================================================
--- src/orca/default.py	(revision 3865)
+++ src/orca/default.py	(working copy)
@@ -985,6 +985,8 @@
             self.onStateChanged
         listeners["object:state-changed:selected"]          = \
             self.onStateChanged
+        listeners["object:text-selection-changed"]          = \
+            self.onTextSelectionChanged
         listeners["object:selection-changed"]               = \
             self.onSelectionChanged
         listeners["object:property-change:accessible-value"] = \
@@ -3271,7 +3273,17 @@
         if self.flatReviewContext:
             self.toggleFlatReviewMode()
 
-        self._presentTextAtNewCaretPosition(event)
+        # If there are one or more text selections, then we are expecting
+        # that there will be a following "object:text-selection-changed"
+        # event, and we will present the text at the new caret position in
+        # that handler.
+        #
+        try:
+            text = event.source.queryText()
+            if text.getNSelections() <= 0:
+                self._presentTextAtNewCaretPosition(event)
+        except:
+            pass
 
     def onTextDeleted(self, event):
         """Called whenever text is deleted from an object.
@@ -3651,6 +3663,15 @@
         #    print "FOO INSENSITIVE"
         #    #orca.setLocusOfFocus(event, None)
 
+    def onTextSelectionChanged(self, event):
+        """Called when an object's text selection changes.
+
+        Arguments:
+        - event: the Event
+        """
+
+        self._presentTextAtNewCaretPosition(event)
+
     def onSelectionChanged(self, event):
         """Called when an object's selection changes.
 
