Index: test/keystrokes/gtk-demo/role_tree_table.py
===================================================================
--- test/keystrokes/gtk-demo/role_tree_table.py	(revision 3721)
+++ test/keystrokes/gtk-demo/role_tree_table.py	(working copy)
@@ -75,7 +75,7 @@
                            5000))
 sequence.append(utils.AssertPresentationAction(
     "January cell focus",
-    ["BUG? - nothing spoken and line not brailled"]))
+    ["SPEECH OUTPUT: 'selected'"]))
 
 ########################################################################
 # Do a basic "Where Am I" via KP_Enter.
Index: src/orca/default.py
===================================================================
--- src/orca/default.py	(revision 3721)
+++ src/orca/default.py	(working copy)
@@ -3473,39 +3473,51 @@
         if event.type.startswith("object:state-changed:selected"):
             # If this selection state change is for the object which 
             # currently has the locus of focus, and the last keyboard
-            # event was Control-Space, then let the user know. 
-            # See bug #486908 for more details.
+            # event was Control-Space, or we are a focused table cell and
+            # we arrowed Down or Up and are now selected, then let the 
+            # user know the selection state. See bugs #486908 and #519564
+            # for more details.
             #
             if isinstance(orca_state.lastInputEvent,
                           input_event.KeyboardEvent):
                 keyString = orca_state.lastNonModifierKeyEvent.event_string
                 mods = orca_state.lastInputEvent.modifiers
                 isControlKey = mods & (1 << pyatspi.MODIFIER_CONTROL)
-                if keyString == "space" and isControlKey:
-                    state = orca_state.locusOfFocus.getState()
-                    if state.contains(pyatspi.STATE_FOCUSED):
-                        if self.isSameObject(event.source,
-                                             orca_state.locusOfFocus):
-                            if event.detail1:
-                                # Translators: this object is now selected.
-                                # Let the user know this.
-                                #
-                                # ONLY TRANSLATE THE PART AFTER THE PIPE
-                                # CHARACTER |
-                                #
-                                speech.speak(Q_("text|selected"),
-                                             None, False)
-                            else:
-                                # Translators: this object is now unselected.
-                                # Let the user know this.
-                                #
-                                # ONLY TRANSLATE THE PART AFTER THE PIPE
-                                # CHARACTER |
-                                #
-                                speech.speak(Q_("text|unselected"),
-                                             None, False)
-                            return
+                state = orca_state.locusOfFocus.getState()
+                parentIndex = event.source.getIndexInParent()
 
+                announceState = False
+
+                if state.contains(pyatspi.STATE_FOCUSED) and \
+                   self.isSameObject(event.source, orca_state.locusOfFocus):
+
+                    if (keyString == "space" and isControlKey):
+                        announceState = True
+
+                    if (keyString == "Down" or keyString == "Up") and \
+                       event.source.getRole() == pyatspi.ROLE_TABLE_CELL and \
+                       state.contains(pyatspi.STATE_SELECTED):
+                            announceState = True
+
+                if announceState:
+                    if event.detail1:
+                        # Translators: this object is now selected.
+                        # Let the user know this.
+                        #
+                        # ONLY TRANSLATE THE PART AFTER THE PIPE
+                        # CHARACTER |
+                        #
+                        speech.speak(Q_("text|selected"), None, False)
+                    else:
+                        # Translators: this object is now unselected.
+                        # Let the user know this.
+                        #
+                        # ONLY TRANSLATE THE PART AFTER THE PIPE
+                        # CHARACTER |
+                        #
+                        speech.speak(Q_("text|unselected"), None, False)
+                    return
+
         if event.type.startswith("object:state-changed:focused"):
             iconified = False
             try:
