Index: ChangeLog
===================================================================
--- ChangeLog	(revision 3757)
+++ ChangeLog	(working copy)
@@ -1,5 +1,14 @@
 2008-03-26  Rich Burridge <rich.burridge@sun.com>
 
+        * src/orca/default.py:
+          src/orca/Gecko.py:
+          From Tomas Cerha <cerha@brailcom.org>
+          From Peter Vagner <peter.v@datagate.sk>
+          Fix for bug #520494 – Keyboard review punctuation in Firefox.
+          Use `speech.speakCharacter()' instead of `speech.speak()'.
+
+2008-03-26  Rich Burridge <rich.burridge@sun.com>
+
         * src/orca/app_prefs.py:
           src/orca/orca_prefs.py:
           Fix for bug #523642 - orca_prefs.py:_writePronunciation should 
Index: src/orca/default.py
===================================================================
--- src/orca/default.py	(revision 3758)
+++ src/orca/default.py	(working copy)
@@ -2316,7 +2316,7 @@
                     #
                     speech.speak(_("blank"), voice, False)
         else:
-            speech.speak(chnames.getCharacterName(character), voice, False)
+            speech.speakCharacter(character, voice)
 
         self.speakTextSelectionState(obj, startOffset, endOffset)
 
@@ -3297,11 +3297,17 @@
         else:
             voice = self.voices[settings.DEFAULT_VOICE]
 
-        # We won't interrupt what else might be being spoken
-        # right now because it is typically something else
-        # related to this event.
+        # Make sure single characters are sent to speakCharacter()
+        # rather than to speak().
         #
-        speech.speak(character, voice, False)
+        if len(character) == 1:
+            speech.speakCharacter(character, voice)
+        else:
+            # We won't interrupt what else might be being spoken
+            # right now because it is typically something else
+            # related to this event.
+            #
+            speech.speak(character, voice, False)
 
     def onTextInserted(self, event):
         """Called whenever text is inserted into an object.
@@ -4448,10 +4454,10 @@
 
         for (charIndex, character) in enumerate(itemString.decode("UTF-8")):
             if character.isupper():
-                speech.speak(character.encode("UTF-8"),
+                speech.speakCharacter(character.encode("UTF-8"),
                              self.voices[settings.UPPERCASE_VOICE])
             else:
-                speech.speak(character.encode("UTF-8"))
+                speech.speakCharacter(character.encode("UTF-8"))
 
     def _reviewCurrentItem(self, inputEvent, targetCursorCell=0,
                            speechType=1):
@@ -6276,7 +6282,10 @@
             else:
                 voice =  settings.voices[settings.DEFAULT_VOICE]
             phoneticString = phonnames.getPhoneticName(character)
-            speech.speak(phoneticString, voice)
+            if len(phoneticString) == 1:
+                speech.speakCharacter(phoneticString, voice)
+            else:
+                speech.speak(phoneticString, voice)
 
     def printAncestry(self, child):
         """Prints a hierarchical view of a child's ancestry."""
Index: src/orca/Gecko.py
===================================================================
--- src/orca/Gecko.py	(revision 3758)
+++ src/orca/Gecko.py	(working copy)
@@ -1,6 +1,6 @@
 # Orca
 #
-# Copyright 2005-2007 Sun Microsystems Inc.
+# Copyright 2005-2008 Sun Microsystems Inc.
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Library General Public
@@ -8204,7 +8204,7 @@
         character = self.getCharacterAtOffset(obj, characterOffset)
         if obj:
             if character and character != self.EMBEDDED_OBJECT_CHARACTER:
-                speech.speak(character, self.getACSS(obj, character), False)
+                speech.speakCharacter(character, self.getACSS(obj, character))
             elif obj.getRole() != pyatspi.ROLE_ENTRY:
                 # We won't have a character if we move to the end of an
                 # entry (in which case we're not on a character and therefore
