Index: src/orca/Gecko.py
===================================================================
--- src/orca/Gecko.py	(revision 2176)
+++ src/orca/Gecko.py	(working copy)
@@ -2373,6 +2373,21 @@
 
         return pursue
 
+    def getHeadingLevel(self, obj):
+        """Determines the heading level of the given object.  A value
+        of 0 means there is no heading level."""
+
+        level = 0
+
+        if obj.role == rolenames.ROLE_HEADING:
+            attributes = obj.attributes
+            for attribute in attributes:
+                if attribute.startswith("level:"):
+                    level = int(attribute.split(":")[1])
+                    break
+
+        return level
+
     ####################################################################
     #                                                                  #
     # Methods to find previous and next objects.                       #
@@ -3015,6 +3030,7 @@
                                     rolenames.ROLE_TABLE_CELL]:
                     strings.extend(\
                         self.speechGenerator._getSpeechForObjectRole(obj))
+
             elif self.isLayoutOnly(obj):
                 continue
             else:
@@ -3023,6 +3039,12 @@
             for string in strings:
                 utterances.append([string, self.getACSS(obj, string)])
 
+            if obj.role == rolenames.ROLE_HEADING:
+                level = self.getHeadingLevel(obj)
+                if level:
+                    utterances.append([" ", self.getACSS(obj, " ")])
+                    utterances.append([_("level %d") % level, None])
+
         return utterances
 
     def speakContents(self, contents):
