Index: src/orca/scripts/gnome-terminal.py
===================================================================
--- src/orca/scripts/gnome-terminal.py	(revision 2006)
+++ src/orca/scripts/gnome-terminal.py	(working copy)
@@ -147,46 +147,45 @@
         # We'll let our super class handle "Delete".  We'll handle Ctrl+D.
         #
 
-        if not orca_state.lastInputEvent or \
-            not isinstance(orca_state.lastInputEvent,
-                           input_event.KeyboardEvent):
+        if not orca_state.lastInputEvent:
             return
 
-        keyString = orca_state.lastInputEvent.event_string
+        matchFound = False
+        speakThis = False
+        if isinstance(orca_state.lastInputEvent, input_event.KeyboardEvent):
+            keyString = orca_state.lastInputEvent.event_string
 
-        controlPressed = orca_state.lastInputEvent.modifiers \
-                         & (1 << atspi.Accessibility.MODIFIER_CONTROL)
+            controlPressed = orca_state.lastInputEvent.modifiers \
+                             & (1 << atspi.Accessibility.MODIFIER_CONTROL)
 
-        if (keyString == "Delete") or (keyString == "BackSpace"):
-            return
-        elif (keyString == "D") and controlPressed:
-            text = text.decode("UTF-8")[0].decode("UTF-8")
+            if (keyString == "Delete") or (keyString == "BackSpace"):
+                return
+            elif (keyString == "D") and controlPressed:
+                text = text.decode("UTF-8")[0].decode("UTF-8")
 
-        # If the last input event was a keyboard event, check to see if
-        # the text for this event matches what the user typed. If it does,
-        # then don't speak it.
-        #
-        # Note that the text widgets sometimes compress their events,
-        # thus we might get a longer string from a single text inserted
-        # event, while we also get individual keyboard events for the
-        # characters used to type the string.  This is ugly.  We attempt
-        # to handle it here by only echoing text if we think it was the
-        # result of a command (e.g., a paste operation).
-        #
-        # Note that we have to special case the space character as it
-        # comes across as "space" in the keyboard event and " " in the
-        # text event.
-        #
-        # For terminal, Return usually ends up in more text from the
-        # system, which we want to hear.  Tab is also often used for
-        # command line completion, so we want to hear that, too.
-        #
-        # Finally, if we missed some command and the system is giving
-        # us a string typically longer than what the length of a
-        # compressed string is (we choose 5 here), then output that.
-        #
-        matchFound = False
-        if isinstance(orca_state.lastInputEvent, input_event.KeyboardEvent):
+            # If the last input event was a keyboard event, check to see if
+            # the text for this event matches what the user typed. If it does,
+            # then don't speak it.
+            #
+            # Note that the text widgets sometimes compress their events,
+            # thus we might get a longer string from a single text inserted
+            # event, while we also get individual keyboard events for the
+            # characters used to type the string.  This is ugly.  We attempt
+            # to handle it here by only echoing text if we think it was the
+            # result of a command (e.g., a paste operation).
+            #
+            # Note that we have to special case the space character as it
+            # comes across as "space" in the keyboard event and " " in the
+            # text event.
+            #
+            # For terminal, Return usually ends up in more text from the
+            # system, which we want to hear.  Tab is also often used for
+            # command line completion, so we want to hear that, too.
+            #
+            # Finally, if we missed some command and the system is giving
+            # us a string typically longer than what the length of a
+            # compressed string is (we choose 5 here), then output that.
+            #
             wasCommand = orca_state.lastInputEvent.modifiers \
                          & (1 << atspi.Accessibility.MODIFIER_CONTROL \
                             | 1 << atspi.Accessibility.MODIFIER_ALT \
@@ -201,11 +200,19 @@
                 matchFound = True
                 pass
             elif wasCommand or (len(text) > 5):
-                if text.isupper():
-                    speech.speak(text, self.voices[settings.UPPERCASE_VOICE])
-                else:
-                    speech.speak(text)
+                speakThis = True
 
+        elif isinstance(orca_state.lastInputEvent, \
+                        input_event.MouseButtonEvent) and \
+             orca_state.lastInputEvent.button == "2":
+            speakThis = True
+
+        if speakThis:
+            if text.isupper():
+                speech.speak(text, self.voices[settings.UPPERCASE_VOICE])
+            else:
+                speech.speak(text)
+
         if settings.enableEchoByWord \
            and util.isWordDelimiter(text.decode("UTF-8")[-1:]):
             if matchFound:
Index: src/orca/scripts/StarOffice.py
===================================================================
--- src/orca/scripts/StarOffice.py	(revision 2006)
+++ src/orca/scripts/StarOffice.py	(working copy)
@@ -1895,3 +1895,26 @@
         if line[1] == 0 and line[2] == 0:
             return settings.speakBlankLines
 
+    def onTextInserted(self, event):
+        """Called whenever text is inserted into an object.  Overridden here
+        to handle the case when the inserted text was pasted via middle mouse
+        click.
+
+        Arguments:
+        - event: the Event
+        """
+
+        # Because event.source is the paragraph where the text was inserted
+        # and locusOfFocus is the selected text, the default onTextInserted
+        # will return without speaking the text that was pasted.
+        #
+        text = event.any_data
+        if isinstance(orca_state.lastInputEvent, 
+                        input_event.MouseButtonEvent) and \
+             orca_state.lastInputEvent.button == "2":
+            if text.isupper():
+                speech.speak(text, self.voices[settings.UPPERCASE_VOICE])
+            else:
+                speech.speak(text)
+        else:
+            default.Script.onTextInserted(self, event)
Index: src/orca/default.py
===================================================================
--- src/orca/default.py	(revision 2006)
+++ src/orca/default.py	(working copy)
@@ -2249,6 +2249,7 @@
         # comes across as "space" in the keyboard event and " " in the
         # text event.
         #
+        speakThis = False
         if isinstance(orca_state.lastInputEvent, input_event.KeyboardEvent):
             keyString = orca_state.lastInputEvent.event_string
             wasAutoComplete = (event.source.role == rolenames.ROLE_TEXT and \
@@ -2264,11 +2265,19 @@
                 pass
             elif wasCommand or wasAutoComplete or \
                    (event.source.role == rolenames.ROLE_PASSWORD_TEXT):
-                if text.isupper():
-                    speech.speak(text, self.voices[settings.UPPERCASE_VOICE])
-                else:
-                    speech.speak(text)
+                speakThis = True
 
+        elif isinstance(orca_state.lastInputEvent, \
+                        input_event.MouseButtonEvent) and \
+             orca_state.lastInputEvent.button == "2":
+            speakThis = True
+
+        if speakThis:
+            if text.isupper():
+                speech.speak(text, self.voices[settings.UPPERCASE_VOICE])
+            else:
+                speech.speak(text)
+
         if settings.enableEchoByWord \
            and util.isWordDelimiter(text.decode("UTF-8")[-1:]):
             self.echoPreviousWord(event.source)
