Index: src/orca/scripts/apps/evolution/script.py
===================================================================
--- src/orca/scripts/apps/evolution/script.py	(revision 4334)
+++ src/orca/scripts/apps/evolution/script.py	(working copy)
@@ -596,6 +596,12 @@
                                event,
                                debug.getAccessibleDetails(event.source))
 
+        # We always automatically go back to focus tracking mode when
+        # the focus changes.
+        #
+        if self.flatReviewContext:
+            self.toggleFlatReviewMode()
+
         # self.printAncestry(event.source)
 
         # 1) Mail view: current message pane: individual lines of text.
Index: src/orca/scripts/apps/Thunderbird/script.py
===================================================================
--- src/orca/scripts/apps/Thunderbird/script.py	(revision 4334)
+++ src/orca/scripts/apps/Thunderbird/script.py	(working copy)
@@ -228,18 +228,20 @@
 
         # This is a better fix for bug #405541. Thunderbird gives
         # focus to the cell in the column that is being sorted
-        # (e.g., Date). Braille should show the row from the begining.
-        # This fix calls orca.setLocusOfFocus to give focus to the
-        # cell at the beginning of the row. It consume the event
-        # so Gecko.py doesn't reset the focus.
+        # (e.g., Date). Braille should show the row beginning with
+        # the first populated cell. Set the locusOfFocus to that
+        # cell and consume the event so that the Gecko script
+        # doesn't reset it.
         #
         if obj.getRole() == pyatspi.ROLE_TABLE_CELL:
             table = parent.queryTable()
-            index = self.getCellIndex(obj)
-            row = table.getRowAtIndex(index)
-            acc = table.getAccessibleAt(row, 0)
-            orca.setLocusOfFocus(event, acc)
-            consume = True
+            row = table.getRowAtIndex(self.getCellIndex(obj))
+            for i in range(0, table.nColumns):
+                acc = table.getAccessibleAt(row, i)
+                if acc.name:                
+                    orca.setLocusOfFocus(event, acc)
+                    consume = True
+                    break
 
         # Text area (for caching handle for spell checking purposes).
         #
Index: src/orca/scripts/apps/soffice/script.py
===================================================================
--- src/orca/scripts/apps/soffice/script.py	(revision 4334)
+++ src/orca/scripts/apps/soffice/script.py	(working copy)
@@ -1300,6 +1300,12 @@
             self.find()
             return
 
+        # We always automatically go back to focus tracking mode when
+        # the focus changes.
+        #
+        if self.flatReviewContext:
+            self.toggleFlatReviewMode()
+
         # If we are inside a paragraph inside a table cell (in Writer),
         # then speak/braille that parent table cell (see bug #382415).
         # Also announce that a table has been entered or left.
Index: src/orca/scripts/toolkits/Gecko/script.py
===================================================================
--- src/orca/scripts/toolkits/Gecko/script.py	(revision 4334)
+++ src/orca/scripts/toolkits/Gecko/script.py	(working copy)
@@ -1925,6 +1925,12 @@
         if self.isSameObject(oldLocusOfFocus, newLocusOfFocus):
             return
 
+        # We always automatically go back to focus tracking mode when
+        # the focus changes.
+        #
+        if self.flatReviewContext:
+            self.toggleFlatReviewMode()
+
         # Try to handle the case where a spurious focus event was tossed
         # at us.
         #
Index: src/orca/flat_review.py
===================================================================
--- src/orca/flat_review.py	(revision 4334)
+++ src/orca/flat_review.py	(working copy)
@@ -638,7 +638,7 @@
             currentZoneIndex = 0
             while currentZoneIndex < len(line.zones):
                 zone = line.zones[currentZoneIndex]
-                if zone.accessible == searchZone:
+                if self.script.isSameObject(zone.accessible, searchZone):
                     foundZoneWithFocus = True
                     break
                 else:
