Index: src/orca/Gecko.py
===================================================================
--- src/orca/Gecko.py	(revision 3506)
+++ src/orca/Gecko.py	(working copy)
@@ -4584,6 +4584,9 @@
                 if link:
                     regions.append(braille.Region(
                         " " + rolenames.getBrailleForRoleName(link)))
+                elif obj.getRole() == pyatspi.ROLE_CAPTION:
+                    regions.append(braille.Region(
+                        " " + rolenames.getBrailleForRoleName(obj)))
 
                 if isFocusedObj \
                    and (focusedCharacterOffset >= startOffset) \
@@ -6012,7 +6015,8 @@
             return []
 
         elif obj.getRole() == pyatspi.ROLE_TABLE:
-            # If this is a table, move to the first cell.
+            # If this is a table, move to the first cell -- or the caption,
+            # if present.
             # [[[TODOS - JD:
             #    1) It might be nice to announce the fact that we've just
             #       found a table, what its dimensions are, etc.
@@ -6020,7 +6024,10 @@
             #       arrow moves us to the last row.  Possible side effect
             #       of our existing caret browsing implementation??]]]
             #
-            obj = obj.queryTable().getAccessibleAt(0, 0)
+            if obj[0] and obj[0].getRole == pyatspi.ROLE_CAPTION:
+                obj = obj[0]
+            else:
+                obj = obj.queryTable().getAccessibleAt(0, 0)
 
         objects = []
         text = self.queryNonEmptyText(obj)
@@ -7467,6 +7474,7 @@
         while not obj.getRole() in [pyatspi.ROLE_DOCUMENT_FRAME,
                                     pyatspi.ROLE_TABLE_CELL,
                                     pyatspi.ROLE_LIST_ITEM,
+                                    pyatspi.ROLE_CAPTION,
                                     pyatspi.ROLE_SECTION,
                                     pyatspi.ROLE_PANEL,
                                     pyatspi.ROLE_TEXT]:
