diff --git a/src/orca/formatting.py b/src/orca/formatting.py
index 083f710..8792fd0 100644
--- a/src/orca/formatting.py
+++ b/src/orca/formatting.py
@@ -111,8 +111,8 @@ formatting = {
             },
         pyatspi.ROLE_CHECK_BOX: {
             'focused': 'checkedState',
-            'unfocused': 'labelAndName + roleName + checkedState + required + availability + ' + MNEMONIC + ' + accelerator',
-            'basicWhereAmI': 'labelAndName + roleName + checkedState + ' + MNEMONIC + ' + accelerator + required'
+            'unfocused': 'namedContainingPanel + labelAndName + roleName + checkedState + required + availability + ' + MNEMONIC + ' + accelerator',
+            'basicWhereAmI': 'namedContainingPanel + labelAndName + roleName + checkedState + ' + MNEMONIC + ' + accelerator + required'
             },
         pyatspi.ROLE_CHECK_MENU_ITEM: {
             'focused': 'checkedState',
diff --git a/src/orca/generator.py b/src/orca/generator.py
index 4ee1fb9..1b9d4a7 100644
--- a/src/orca/generator.py
+++ b/src/orca/generator.py
@@ -1002,3 +1002,18 @@ class Generator:
         rad = self._script.getRealActiveDescendant(obj)
         args['role'] = rad.getRole()
         return self._generateRoleName(rad, **args)
+
+    def _generateNamedContainingPanel(self, obj, **args):
+        """Returns an array of strings for use by speech and braille that
+        represents the nearest ancestor of an object which is a named panel.
+        """
+        result = []
+        parent = obj.parent
+        while parent and (parent.parent != parent):
+            if parent.getRole() == pyatspi.ROLE_PANEL:
+                label = self._generateLabelAndName(parent)
+                if label:
+                    result.extend(label)
+                    break
+            parent = parent.parent
+        return result
