Index: src/orca/default.py
===================================================================
--- src/orca/default.py	(revision 2513)
+++ src/orca/default.py	(working copy)
@@ -111,6 +111,11 @@
         self.lastProgressBarTime = {}
         self.lastProgressBarValue = {}
 
+        # List of possible text selection events and text caret offsets, 
+        # created by the user, using the mouse.
+        #
+        self._pendingTextSelection = []
+
     def setupInputEventHandlers(self):
         """Defines InputEventHandler fields for this script that can be
         called by the key and braille bindings."""
@@ -683,6 +688,8 @@
             self.onFocus
         #listeners["keyboard:modifiers"]                     = \
         #    self.noOp
+        listeners["mouse:button"]                           = \
+            self.onMouseButton
         listeners["object:property-change:accessible-name"] = \
             self.onNameChanged
         listeners["object:text-caret-moved"]                = \
@@ -692,7 +699,7 @@
         listeners["object:text-changed:insert"]             = \
             self.onTextInserted
         listeners["object:text-selection-changed"]          = \
-            self.noOp
+            self.onTextSelectionChanged
         listeners["object:active-descendant-changed"]       = \
             self.onActiveDescendantChanged
         listeners["object:children-changed:"]               = \
@@ -2559,6 +2566,15 @@
         - event: the Event
         """
 
+        # Check to see if there is a mouse button currently being pressed.
+        # If there is, then add this event and the current text caret offset
+        # to the list, to be used when the mouse button is released (see
+        # onMouseButton().
+        #
+        for value in orca_state.mouseButtonState.values():
+            if value == "p":
+                self._pendingTextSelection.append([event, event.detail1])
+
         # We don't always get focus: events for text areas, so if we
         # see caret moved events for a focused text area, we silently
         # set them to be the locus of focus.
@@ -3005,6 +3021,49 @@
             orca.setLocusOfFocus(event, None)
             orca_state.activeWindow = None
 
+    def onMouseButton(self, event):
+        """Called whenever the user presses or releases a mouse button.
+
+        Arguments:
+        - event: the Event
+        """
+
+        # If we've received a mouse button released event, then check if
+        # there is a possible text selection pending. If there is, then
+        # speak it.
+        #
+        button = event.type[-2]
+        state = event.type[-1]
+        if state == "r":
+            if len(orca_state.activeScript._pendingTextSelection) > 0:
+                (startEvent, startOffset) = \
+                    orca_state.activeScript._pendingTextSelection[0]
+                (endEvent, endOffset) = \
+                    orca_state.activeScript._pendingTextSelection[-1]
+                self.sayPhrase(endEvent.source, startOffset, endOffset)
+                orca_state.activeScript._pendingTextSelection = []
+            del orca_state.mouseButtonState[button]
+        else:
+            orca_state.mouseButtonState[button] = state
+
+    def onTextSelectionChanged(self, event):
+        """Called whenever a text selection event is received.
+
+        Arguments:
+        - event: the Event
+        """
+
+        # Check to see if there is a mouse button currently being pressed.
+        # If there is, then add this event and the current text caret offset
+        # to the list, to be used when the mouse button is released (see
+        # onMouseButton().
+        #
+        for value in orca_state.mouseButtonState.values():
+            if value == "p":
+                self._pendingTextSelection.append( \
+                    [event, event.source.text.caretOffset])
+        self.updateBraille(event.source)
+
     def noOp(self, event):
         """Just here to capture events.
 
Index: src/orca/orca.py
===================================================================
--- src/orca/orca.py	(revision 2513)
+++ src/orca/orca.py	(working copy)
@@ -252,6 +252,10 @@
     event = atspi.Event(e)
     orca_state.lastInputEvent = MouseButtonEvent(event)
 
+    key = event.type[-2]
+    value = event.type[-1]
+    orca_state.mouseButtonState[key] = value
+
     # A mouse button event looks like: mouse:button:1p, where the
     # number is the button number and the 'p' is either 'p' or 'r',
     # meaning pressed or released.  We only want to stop speech on
Index: src/orca/orca_state.py
===================================================================
--- src/orca/orca_state.py	(revision 2513)
+++ src/orca/orca_state.py	(working copy)
@@ -70,6 +70,12 @@
 #
 lastKeyEchoTime = None
 
+# A dictionary indicating the state of each of the mouse buttons. The mouse
+# button is the key and it's state is the value ('p' indicates a pressed 
+# state and 'r' means released).
+#
+mouseButtonState = {}
+
 # The time that the last "No focus" event occured.
 #
 noFocusTimestamp = 0.0
