Index: scripts/Thunderbird.py
===================================================================
--- scripts/Thunderbird.py	(revision 2073)
+++ scripts/Thunderbird.py	(working copy)
@@ -30,6 +30,8 @@
 import orca.atspi as atspi
 import orca.debug as debug
 import orca.default as default
+import orca.input_event as input_event
+import orca.orca_state as orca_state
 import orca.rolenames as rolenames
 import orca.settings as settings
 import orca.braille as braille
@@ -257,6 +259,25 @@
             Gecko.Script.onFocus(self, event)
             
 
+    def onCaretMoved(self, event):
+        """Called whenever the caret moves.
+
+        Arguments:
+        - event: the Event
+        """
+
+        # If the last event was a mouse event, then just return. This
+        # prevents the multiple utterances of text selected via the mouse
+        # (see bug #409728).
+        #
+        if isinstance(orca_state.lastInputEvent, input_event.MouseButtonEvent):
+            return
+
+        # Just fall through for now and let the parent class handle it.
+        #
+        Gecko.Script.onCaretMoved(self, event)
+
+
     def onStateChanged(self, event):
         """Called whenever an object's state changes.
 
Index: settings.py
===================================================================
--- settings.py	(revision 2073)
+++ settings.py	(working copy)
@@ -532,6 +532,7 @@
 setScriptMapping(re.compile(_('[\S\s]*StarOffice[\s\S]*')), "StarOffice")
 setScriptMapping(re.compile(_('soffice.bin')), "StarOffice")
 setScriptMapping(re.compile(_('[Ee]volution')), "Evolution")
+setScriptMapping(re.compile(_('Mail/News')), "Thunderbird")
 setScriptMapping(re.compile(_('Deer Park')), "Mozilla")
 setScriptMapping(re.compile(_('yelp')), "Mozilla")
 setScriptMapping(re.compile(_('Bon Echo')), "Mozilla")
