Index: src/orca/scripts/Evolution.py
===================================================================
--- src/orca/scripts/Evolution.py	(revision 3449)
+++ src/orca/scripts/Evolution.py	(working copy)
@@ -889,6 +889,16 @@
             column = \
                 parentTable.getColumnAtIndex(event.source.getIndexInParent())
 
+            # If we are on the same row, then just speak/braille the table
+            # cell as if settings.readTableCellRow was False. 
+            # See bug #503874 for more details.
+            #
+            if self.lastMessageRow == row:
+                default.Script.locusOfFocusChanged(self, event,
+                                           oldLocusOfFocus, newLocusOfFocus)
+                settings.readTableCellRow = True
+                return
+
             # This is an indication of whether we should speak all the table
             # cells (the user has moved focus up or down the list, or just
             # deleted a message), or just the current one (focus has moved
@@ -952,6 +962,12 @@
 
                     checkbox = False
                     toRead = True
+                    # Whether or not we want to replace the cell's column
+                    # header with a more user-friendly alternative name.
+                    # Currently we only do this with the "status" column,
+                    # which we replace with "unread" if it is not checked.
+                    #
+                    useAlternativeName = False
                     try:
                         action = cell.queryAction()
                     except NotImplementedError:
@@ -971,7 +987,16 @@
                                     #
                                     if header.name == _("Status"):
                                         toRead = not checked
+                                        useAlternativeName = True
                                         break
+                                    # Translators: this is the name of the
+                                    # flagged column header in the message
+                                    # list in Evolution.  The name needs to
+                                    # match what Evolution is using.
+                                    #
+                                    elif header.name == _("Flagged"):
+                                        toRead = checked
+                                        break
                                     if not checked:
                                         toRead = False
                                 break
@@ -980,7 +1005,8 @@
                         # Speak/braille the column header for this table cell
                         # if it has focus (unless it's a checkbox).
                         #
-                        if not checkbox and verbose:
+                        if (verbose or (checkbox and column == i)) \
+                           and not useAlternativeName:
                             settings.brailleVerbosityLevel = \
                                 settings.VERBOSITY_LEVEL_BRIEF
                             settings.speechVerbosityLevel = \
@@ -1038,8 +1064,20 @@
                         elif header.name == _("Attachment"):
                             text = header.name
                             utterances = [ text ]
-                            brailleRegions.append(braille.Region(text))
-                            brailleRegions.append(braille.Region(" "))
+                            if column != i:
+                                brailleRegions.append(braille.Region(text))
+                                brailleRegions.append(braille.Region(" "))
+                        # Translators: this is the name of the
+                        # flagged column header in the message
+                        # list in Evolution.  The name needs to
+                        # match what Evolution is using.
+                        #
+                        elif header.name == _("Flagged"):
+                            text = header.name
+                            utterances = [ text ]
+                            if column != i:
+                                brailleRegions.append(braille.Region(text))
+                                brailleRegions.append(braille.Region(" "))
                         else:
                             brailleRegions.extend(cellRegions)
                             brailleRegions.append(braille.Region(" "))
Index: src/orca/speechgenerator.py
===================================================================
--- src/orca/speechgenerator.py	(revision 3449)
+++ src/orca/speechgenerator.py	(working copy)
@@ -1348,7 +1348,7 @@
 
         displayedText = self._script.getDisplayedText( \
                           self._script.getRealActiveDescendant(obj))
-        if not already_focused:
+        if not already_focused and not displayedText in utterances:
             utterances.append(displayedText)
 
         # If there is no displayed text, check to see if this table cell 
Index: src/orca/braillegenerator.py
===================================================================
--- src/orca/braillegenerator.py	(revision 3449)
+++ src/orca/braillegenerator.py	(working copy)
@@ -1205,6 +1205,7 @@
                     + "looking at action %d" % i)
                 if action.getName(i) == "toggle":
                     regions = self._getBrailleRegionsForCheckBox(obj)
+                    regions[0].append(braille.Region(" "))
 
                     # If this table cell doesn't have any label associated
                     # with it then also braille the table column header.
