diff --git a/src/orca/default.py b/src/orca/default.py
index afa7614..61bdbfc 100644
--- a/src/orca/default.py
+++ b/src/orca/default.py
@@ -852,6 +852,15 @@ class Script(script.Script):
                 #
                 _("Toggles the speaking of indentation and justification."))
 
+        self.inputEventHandlers["rotateSpeakingPunctuationLevelHandler"] = \
+            input_event.InputEventHandler(
+                Script.rotateSpeakingPunctuationLevel,
+                # Translators: Orca allows users to rotate through
+                # punctuation levels.
+                # None, some, most, or all, punctuation will be spoken.
+                #
+                _("Rotate through the speaking of punctuation levels."))
+
         self.inputEventHandlers["listAppsHandler"] = \
             input_event.InputEventHandler(
                 Script.printAppsHandler,
@@ -2055,6 +2064,14 @@ class Script(script.Script):
                 self.inputEventHandlers[ \
                   "toggleSpeakingIndentationJustificationHandler"]))
 
+        keyBindings.add(
+            keybindings.KeyBinding(
+                "",
+                settings.defaultModifierMask,
+                settings.NO_MODIFIER_MASK,
+                self.inputEventHandlers[ \
+                  "rotateSpeakingPunctuationLevelHandler"]))
+
         try:
             keyBindings = settings.overrideKeyBindings(self, keyBindings)
         except:
@@ -3420,6 +3437,58 @@ class Script(script.Script):
 
         return True
 
+
+    def rotateSpeakingPunctuationLevel(self, inputEvent=None):
+        """Rotates through the speaking of punctuation levels."""
+        currentLevel = settings.verbalizePunctuationStyle 
+        if currentLevel == settings.PUNCTUATION_STYLE_NONE:
+            newLevel = settings.PUNCTUATION_STYLE_SOME
+
+            # Translators: This message will be spoken
+            # when user rotates through the available punctuation levels.
+            #
+            line = _("Punctuation level set to some.")
+        elif currentLevel == settings.PUNCTUATION_STYLE_SOME:
+            newLevel = settings.PUNCTUATION_STYLE_MOST
+
+            # Translators: This message will be spoken
+            # when user rotates through the available punctuation levels.
+            #
+            line = _("Punctuation level set to most.")
+        elif currentLevel== settings.PUNCTUATION_STYLE_MOST:
+            newLevel= settings.PUNCTUATION_STYLE_ALL
+
+            # Translators: This message will be spoken
+            # when user rotates through the available punctuation levels.
+            #
+            line = _("Punctuation level set to all.")
+        else: 
+            # the all case, so rotate to none.
+            newLevel = settings.PUNCTUATION_STYLE_NONE
+
+            # Translators: This message will be spoken
+            # when user rotates through the available punctuation levels.
+            #
+            line = _("Punctuation level set to none.")
+
+        settings.verbalizePunctuationStyle = newLevel
+
+        # Doesnt seem that we can change punctuation level
+        # without having to reinitialise the speech.
+        # At least this seems to be the case with SD on ubuntu carmic.
+        # 
+        speech.shutdown()
+        if settings.enableSpeech:
+            try:
+                speech.init()
+                speech.speak(line)
+            except:
+                debug.printException(debug.LEVEL_SEVERE)
+                debug.println(debug.LEVEL_SEVERE,
+                  "Could not initialize connection to speech.")
+
+        return True
+
     def toggleTableCellReadMode(self, inputEvent=None):
         """Toggles an indicator for whether we should just read the current
         table cell or read the whole row."""
