Index: src/orca/speechgenerator.py
===================================================================
--- src/orca/speechgenerator.py	(revision 3421)
+++ src/orca/speechgenerator.py	(working copy)
@@ -1287,46 +1287,11 @@
         Returns a list of utterances to be spoken for the object.
         """
 
-        utterances = []
+        utterances = self._script.tableCellIsCheckbox(obj,
+                                                      already_focused, True)
+        if utterances:
+            return utterances
 
-        # If this table cell has 2 children and one of them has a 
-        # 'toggle' action and the other does not, then present this 
-        # as a checkbox where:
-        # 1) we get the checked state from the cell with the 'toggle' action
-        # 2) we get the label from the other cell.
-        # See Orca bug #376015 for more details.
-        #
-        if obj.childCount == 2:
-            cellOrder = []
-            hasToggle = [ False, False ]
-            for i, child in enumerate(obj):
-                try:
-                    action = child.queryAction()
-                except NotImplementedError:
-                    continue
-                else:
-                    for j in range(0, action.nActions):
-                        if action.getName(j) == "toggle":
-                            hasToggle[i] = True
-                            break
-
-            if hasToggle[0] and not hasToggle[1]:
-                cellOrder = [ 1, 0 ] 
-            elif not hasToggle[0] and hasToggle[1]:
-                cellOrder = [ 0, 1 ]
-            if cellOrder:
-                for i in cellOrder:
-                    # Don't speak the label if just the checkbox state has
-                    # changed.
-                    #
-                    if already_focused and not hasToggle[i]:
-                        pass
-                    else:
-                        utterances.extend( \
-                            self._getSpeechForTableCell(obj[i],
-                                                        already_focused))
-                return utterances
-
         # [[[TODO: WDW - Attempt to infer the cell type.  There's a
         # bunch of stuff we can do here, such as check the EXPANDABLE
         # state, check the NODE_CHILD_OF relation, etc.  Logged as
Index: src/orca/default.py
===================================================================
--- src/orca/default.py	(revision 3421)
+++ src/orca/default.py	(working copy)
@@ -3349,6 +3349,70 @@
 
         return layoutOnly
 
+    def tableCellIsCheckbox(self, obj, already_focused, forSpeech=True):
+        """Check to see if the type of this table cell object is a checkbox.
+
+        Arguments:
+        - obj: the table cell object
+        - already_focused: False if object just received focus
+        - forSpeech: True for speech and False for braille.
+
+        Returns a list which will be empty if this table cell is not a
+        check box, or contain either a list of speech utterances or a list 
+        of braille regions.
+        """
+
+        values = []
+
+        # If this table cell has 2 children and one of them has a
+        # 'toggle' action and the other does not, then present this
+        # as a checkbox where:
+        # 1) we get the checked state from the cell with the 'toggle' action
+        # 2) we get the label from the other cell.
+        # See Orca bug #376015 for more details.
+        #
+        if obj.childCount == 2:
+            cellOrder = []
+            hasToggle = [ False, False ]
+            for i, child in enumerate(obj):
+                try:
+                    action = child.queryAction()
+                except NotImplementedError:
+                    continue
+                else:
+                    for j in range(0, action.nActions):
+                        if action.getName(j) == "toggle":
+                            hasToggle[i] = True
+                            break
+
+            if hasToggle[0] and not hasToggle[1]:
+                cellOrder = [ 1, 0 ]
+            elif not hasToggle[0] and hasToggle[1]:
+                cellOrder = [ 0, 1 ]
+            if cellOrder:
+                for i in cellOrder:
+                    if forSpeech:
+                        # Don't speak the label if just the checkbox state has
+                        # changed.
+                        #
+                        if already_focused and not hasToggle[i]:
+                            pass
+                        else:
+                            values.extend(self.speechGenerator.\
+                              _getSpeechForTableCell(obj[i], already_focused))
+                    else:
+                        [cellRegions, focusRegion] = self.brailleGenerator.\
+                                       _getBrailleRegionsForTableCell(obj[i])
+                        if len(values):
+                            values.append(braille.Region(" "))
+                        else:
+                            cellFocusedRegion = focusRegion
+                        values.append(cellRegions[0])
+                if not forSpeech:
+                    values = [values, cellFocusedRegion]
+
+        return values
+
     def toggleTableCellReadMode(self, inputEvent=None):
         """Toggles an indicator for whether we should just read the current
         table cell or read the whole row."""
Index: src/orca/braillegenerator.py
===================================================================
--- src/orca/braillegenerator.py	(revision 3421)
+++ src/orca/braillegenerator.py	(working copy)
@@ -1150,45 +1150,10 @@
 
         self._debugGenerator("_getBrailleRegionsForTableCell", obj)
 
-        regions = []
+        regions = self._script.tableCellIsCheckbox(obj, False, False)
+        if regions:
+            return regions
 
-        # If this table cell has 2 children and one of them has a
-        # 'toggle' action and the other does not, then present this
-        # as a checkbox where:
-        # 1) we get the checked state from the cell with the 'toggle' action
-        # 2) we get the label from the other cell.
-        # See Orca bug #376015 for more details.
-        #
-        if obj.childCount == 2:
-            cellOrder = []
-            hasToggle = [ False, False ]
-            for i, child in enumerate(obj):
-                try:
-                    action = child.queryAction()
-                except:
-                    continue
-                else:
-                    for j in range(0, action.nActions):
-                        if action.getName(j) == "toggle":
-                            hasToggle[i] = True
-                            break
-
-            if hasToggle[0] and not hasToggle[1]:
-                cellOrder = [ 0, 1 ]
-            elif not hasToggle[0] and hasToggle[1]:
-                cellOrder = [ 1, 0 ]
-            if cellOrder:
-                for i in cellOrder:
-                    [cellRegions, focusRegion] = \
-                            self._getBrailleRegionsForTableCell(obj[i])
-                    if len(regions):
-                        regions.append(braille.Region(" "))
-                    else:
-                        cellFocusedRegion = focusRegion
-                    regions.append(cellRegions[0])
-                regions = [regions, cellFocusedRegion]
-                return regions
-
         # [[[TODO: WDW - Attempt to infer the cell type.  There's a
         # bunch of stuff we can do here, such as check the EXPANDABLE
         # state, check the NODE_CHILD_OF relation, etc.  Logged as
