Index: test/keystrokes/firefox/uiuc_button.py
===================================================================
--- test/keystrokes/firefox/uiuc_button.py	(revision 4128)
+++ test/keystrokes/firefox/uiuc_button.py	(working copy)
@@ -35,8 +35,6 @@
     "tab to first button", 
     ["BRAILLE LINE:  'Font Larger + Button Font Smaller - Button & y Italic i ToggleButton Bold B Button'",
      "     VISIBLE:  'Font Larger + Button Font Smalle', cursor=1",
-     "BRAILLE LINE:  'Font Larger + Button Font Smaller - Button & y Italic i ToggleButton Bold B Button'",
-     "     VISIBLE:  'Font Larger + Button Font Smalle', cursor=1",
      "SPEECH OUTPUT: 'Text Formating Controls 1 list'",
      "SPEECH OUTPUT: 'Font Larger + button'"]))
 
@@ -74,8 +72,6 @@
     "tab to second button", 
     ["BRAILLE LINE:  'Font Larger + Button Font Smaller - Button & y Italic i ToggleButton Bold B Button'",
      "     VISIBLE:  'Font Smaller - Button & y Italic', cursor=1",
-     "BRAILLE LINE:  'Font Larger + Button Font Smaller - Button & y Italic i ToggleButton Bold B Button'",
-     "     VISIBLE:  'Font Smaller - Button & y Italic', cursor=1",
      "SPEECH OUTPUT: ''",
      "SPEECH OUTPUT: 'Font Smaller - button'"]))
 
@@ -97,8 +93,6 @@
     "tab to third button", 
     ["BRAILLE LINE:  'Font Larger + Button Font Smaller - Button & y Italic i ToggleButton Bold B Button'",
      "     VISIBLE:  '& y Italic i ToggleButton Bold B', cursor=1",
-     "BRAILLE LINE:  'Font Larger + Button Font Smaller - Button & y Italic i ToggleButton Bold B Button'",
-     "     VISIBLE:  '& y Italic i ToggleButton Bold B', cursor=1",
      "SPEECH OUTPUT: ''",
      "SPEECH OUTPUT: 'Italic i toggle button not pressed'"]))
 
@@ -120,8 +114,6 @@
     "tab to fourth button", 
     ["BRAILLE LINE:  'Font Larger + Button Font Smaller - Button & y Italic i ToggleButton Bold B Button'",
      "     VISIBLE:  'Bold B Button', cursor=1",
-     "BRAILLE LINE:  'Font Larger + Button Font Smaller - Button & y Italic i ToggleButton Bold B Button'",
-     "     VISIBLE:  'Bold B Button', cursor=1",
      "SPEECH OUTPUT: ''",
      "SPEECH OUTPUT: 'Bold B button'"]))
 
Index: test/keystrokes/firefox/uiuc_radiobutton.py
===================================================================
--- test/keystrokes/firefox/uiuc_radiobutton.py	(revision 4128)
+++ test/keystrokes/firefox/uiuc_radiobutton.py	(working copy)
@@ -33,8 +33,6 @@
     "tab to first button again", 
     ["BRAILLE LINE:  '& y Thai RadioButton'",
      "     VISIBLE:  '& y Thai RadioButton', cursor=1",
-     "BRAILLE LINE:  '& y Thai RadioButton'",
-     "     VISIBLE:  '& y Thai RadioButton', cursor=1",
      "SPEECH OUTPUT: 'Lunch Options panel'",
      "SPEECH OUTPUT: 'Thai not selected radio button'"]))
 ########################################################################
@@ -59,13 +57,9 @@
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
     "move to second radio button", 
-    ["BUG? - We're repeating ourselves",
-     "BRAILLE LINE:  '&=y Subway RadioButton'",
+    ["BRAILLE LINE:  '&=y Subway RadioButton'",
      "     VISIBLE:  '&=y Subway RadioButton', cursor=1",
-     "BRAILLE LINE:  '&=y Subway RadioButton'",
-     "     VISIBLE:  '&=y Subway RadioButton', cursor=1",
      "SPEECH OUTPUT: ''",
-     "SPEECH OUTPUT: 'Subway selected radio button'",
      "SPEECH OUTPUT: 'Subway selected radio button'"]))
 
 ########################################################################
@@ -75,13 +69,9 @@
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
     "move to third radio button", 
-    ["BUG? - We're repeating ourselves",
-     "BRAILLE LINE:  '&=y Jimmy Johns RadioButton'",
+    ["BRAILLE LINE:  '&=y Jimmy Johns RadioButton'",
      "     VISIBLE:  '&=y Jimmy Johns RadioButton', cursor=1",
-     "BRAILLE LINE:  '&=y Jimmy Johns RadioButton'",
-     "     VISIBLE:  '&=y Jimmy Johns RadioButton', cursor=1",
      "SPEECH OUTPUT: ''",
-     "SPEECH OUTPUT: 'Jimmy Johns selected radio button'",
      "SPEECH OUTPUT: 'Jimmy Johns selected radio button'"]))
 
 ########################################################################
@@ -91,13 +81,9 @@
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
     "move to fourth radio button", 
-    ["BUG? - We're repeating ourselves",
-     "BRAILLE LINE:  '&=y Radio Maria RadioButton'",
+    ["BRAILLE LINE:  '&=y Radio Maria RadioButton'",
      "     VISIBLE:  '&=y Radio Maria RadioButton', cursor=1",
-     "BRAILLE LINE:  '&=y Radio Maria RadioButton'",
-     "     VISIBLE:  '&=y Radio Maria RadioButton', cursor=1",
      "SPEECH OUTPUT: ''",
-     "SPEECH OUTPUT: 'Radio Maria selected radio button'",
      "SPEECH OUTPUT: 'Radio Maria selected radio button'"]))
 
 ########################################################################
@@ -107,13 +93,9 @@
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
     "move to fifth radio button", 
-    ["BUG? - We're repeating ourselves",
-     "BRAILLE LINE:  '&=y Rainbow Gardens RadioButton'",
+    ["BRAILLE LINE:  '&=y Rainbow Gardens RadioButton'",
      "     VISIBLE:  '&=y Rainbow Gardens RadioButton', cursor=1",
-     "BRAILLE LINE:  '&=y Rainbow Gardens RadioButton'",
-     "     VISIBLE:  '&=y Rainbow Gardens RadioButton', cursor=1",
      "SPEECH OUTPUT: ''",
-     "SPEECH OUTPUT: 'Rainbow Gardens selected radio button'",
      "SPEECH OUTPUT: 'Rainbow Gardens selected radio button'"]))
 
 ########################################################################
@@ -126,10 +108,9 @@
     "tab to second radio group", 
     ["BRAILLE LINE:  '&=y Coffee RadioButton'",
      "     VISIBLE:  '&=y Coffee RadioButton', cursor=1",
-     "BRAILLE LINE:  '&=y Coffee RadioButton'",
-     "     VISIBLE:  '&=y Coffee RadioButton', cursor=1",
      "SPEECH OUTPUT: 'Drink Options panel'",
      "SPEECH OUTPUT: 'Coffee selected radio button'"]))
+
 ########################################################################
 # Move to the second radio button.
 #
@@ -137,13 +118,9 @@
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
     "move to second radio button grp2",
-    ["BUG? - We're repeating ourselves",
-     "BRAILLE LINE:  '&=y Cola RadioButton'",
+    ["BRAILLE LINE:  '&=y Cola RadioButton'",
      "     VISIBLE:  '&=y Cola RadioButton', cursor=1",
-     "BRAILLE LINE:  '&=y Cola RadioButton'",
-     "     VISIBLE:  '&=y Cola RadioButton', cursor=1",
      "SPEECH OUTPUT: ''",
-     "SPEECH OUTPUT: 'Cola selected radio button'",
      "SPEECH OUTPUT: 'Cola selected radio button'"]))
 
 ########################################################################
@@ -153,13 +130,9 @@
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
     "move back to first radio button grp2",
-    ["BUG? - We're repeating ourselves",
-     "BRAILLE LINE:  '&=y Coffee RadioButton'",
+    ["BRAILLE LINE:  '&=y Coffee RadioButton'",
      "     VISIBLE:  '&=y Coffee RadioButton', cursor=1",
-     "BRAILLE LINE:  '&=y Coffee RadioButton'",
-     "     VISIBLE:  '&=y Coffee RadioButton', cursor=1",
      "SPEECH OUTPUT: ''",
-     "SPEECH OUTPUT: 'Coffee selected radio button'",
      "SPEECH OUTPUT: 'Coffee selected radio button'"]))
 
 ########################################################################
Index: test/keystrokes/firefox/dojo_spinner.py
===================================================================
--- test/keystrokes/firefox/dojo_spinner.py	(revision 4128)
+++ test/keystrokes/firefox/dojo_spinner.py	(working copy)
@@ -41,6 +41,8 @@
     "Tab to the first spinner", 
     ["BRAILLE LINE:  'Spinbox #1: 900 $l not fired yet! $l '",
      "     VISIBLE:  'Spinbox #1: 900 $l not fired yet', cursor=16",
+     "BRAILLE LINE:  'Spinbox #1: 900 $l not fired yet! $l '",
+     "     VISIBLE:  'Spinbox #1: 900 $l not fired yet', cursor=16",
      "SPEECH OUTPUT: ''",
      "SPEECH OUTPUT: 'Spinbox #1: 900 selected spin button'"]))
 
Index: test/keystrokes/firefox/uiuc_grid.py
===================================================================
--- test/keystrokes/firefox/uiuc_grid.py	(revision 4128)
+++ test/keystrokes/firefox/uiuc_grid.py	(working copy)
@@ -36,8 +36,6 @@
      "     VISIBLE:  'Sel $l', cursor=0",
      "BRAILLE LINE:  '< > Email 0 Selected CheckBox 1 Cell Read message Image Attachment Image Lowest priority Image John Smith Cell Trip to Florida Cell 2007-10-03 Cell 2K Cell'",
      "     VISIBLE:  '< > Email 0 Selected CheckBox 1 ', cursor=1",
-     "BRAILLE LINE:  '< > Email 0 Selected CheckBox 1 Cell Read message Image Attachment Image Lowest priority Image John Smith Cell Trip to Florida Cell 2007-10-03 Cell 2K Cell'",
-     "     VISIBLE:  '< > Email 0 Selected CheckBox 1 ', cursor=1",
      "SPEECH OUTPUT: ''",
      "SPEECH OUTPUT: 'E-mail List Sorted by Date table'",
      "SPEECH OUTPUT: ''",
@@ -67,12 +65,9 @@
     "Move down grid", 
     ["BRAILLE LINE:  '< > Email 1 Selected CheckBox 2 Cell New message Image Attachment Image Low priority Image Fred Jones Cell Lunch on Friday Cell 2007-12-03 Cell 1K Cell'",
      "     VISIBLE:  '< > Email 1 Selected CheckBox 2 ', cursor=1",
-     "BRAILLE LINE:  '< > Email 1 Selected CheckBox 2 Cell New message Image Attachment Image Low priority Image Fred Jones Cell Lunch on Friday Cell 2007-12-03 Cell 1K Cell'",
-     "     VISIBLE:  '< > Email 1 Selected CheckBox 2 ', cursor=1",
      "SPEECH OUTPUT: ''",
      "SPEECH OUTPUT: 'Att column header'",
-     "SPEECH OUTPUT: '2 New message Attachment Low priority From Fred Jones Subject Lunch on Friday panel'",
-     "SPEECH OUTPUT: 'check box not checked 2 New message image Attachment image Low priority image Fred Jones Lunch on Friday 2007-12-03 1K'"]))
+     "SPEECH OUTPUT: '2 New message Attachment Low priority From Fred Jones Subject Lunch on Friday panel'"]))
     
 ########################################################################
 # Move right on second row 1
@@ -83,8 +78,6 @@
     "Move right on second row 1", 
     ["BRAILLE LINE:  '< > Email 1 Selected CheckBox 2 Cell New message Image Attachment Image Low priority Image Fred Jones Cell Lunch on Friday Cell 2007-12-03 Cell 1K Cell'",
      "     VISIBLE:  '< > Email 1 Selected CheckBox 2 ', cursor=1",
-     "BRAILLE LINE:  '< > Email 1 Selected CheckBox 2 Cell New message Image Attachment Image Low priority Image Fred Jones Cell Lunch on Friday Cell 2007-12-03 Cell 1K Cell'",
-     "     VISIBLE:  '< > Email 1 Selected CheckBox 2 ', cursor=1",
      "SPEECH OUTPUT: ''",
      "SPEECH OUTPUT: 'Email 1 Selected'"]))
      
@@ -97,10 +90,7 @@
     "Move right on second row 2", 
     ["BRAILLE LINE:  '< > Email 1 Selected CheckBox 2 Cell New message Image Attachment Image Low priority Image Fred Jones Cell Lunch on Friday Cell 2007-12-03 Cell 1K Cell'",
      "     VISIBLE:  '2 Cell New message Image Attachm', cursor=1",
-     "BRAILLE LINE:  '< > Email 1 Selected CheckBox 2 Cell New message Image Attachment Image Low priority Image Fred Jones Cell Lunch on Friday Cell 2007-12-03 Cell 1K Cell'",
-     "     VISIBLE:  '2 Cell New message Image Attachm', cursor=1",
      "SPEECH OUTPUT: ''",
-     "SPEECH OUTPUT: '2'",
      "SPEECH OUTPUT: '2'"]))
      
 ########################################################################
@@ -112,8 +102,6 @@
     "Move right on second row 3", 
     ["BRAILLE LINE:  'New message Image Attachment Image Low priority Image Fred Jones Cell Lunch on Friday Cell 2007-12-03 Cell 1K Cell'",
      "     VISIBLE:  'New message Image Attachment Ima', cursor=1",
-     "BRAILLE LINE:  'New message Image Attachment Image Low priority Image Fred Jones Cell Lunch on Friday Cell 2007-12-03 Cell 1K Cell'",
-     "     VISIBLE:  'New message Image Attachment Ima', cursor=1",
      "SPEECH OUTPUT: ''",
      "SPEECH OUTPUT: 'New message'"]))
     
@@ -126,11 +114,8 @@
     "Move down to third row", 
     ["BRAILLE LINE:  'New message Image None Image Image Jane Johnson Cell Proposal for you to review Cell 2007-16-03 Cell 12K Cell'",
      "     VISIBLE:  'New message Image None Image Ima', cursor=1",
-     "BRAILLE LINE:  'New message Image None Image Image Jane Johnson Cell Proposal for you to review Cell 2007-16-03 Cell 12K Cell'",
-     "     VISIBLE:  'New message Image None Image Ima', cursor=1",
      "SPEECH OUTPUT: '3 New message None From Jane Johnson Subject Proposal for you to review panel'",
-     "SPEECH OUTPUT: 'New message'",
-     "SPEECH OUTPUT: 'New message image None image Jane Johnson Proposal for you to review 2007-16-03 12K'"]))
+     "SPEECH OUTPUT: 'New message'"]))
 
 ########################################################################
 # Close the demo
Index: test/keystrokes/firefox/moz_checkbox.py
===================================================================
--- test/keystrokes/firefox/moz_checkbox.py	(revision 4128)
+++ test/keystrokes/firefox/moz_checkbox.py	(working copy)
@@ -33,8 +33,6 @@
     "tab to first checkbox", 
     ["BRAILLE LINE:  '<x> Include decorative fruit basket CheckBox'",
      "     VISIBLE:  '<x> Include decorative fruit bas', cursor=1",
-     "BRAILLE LINE:  '<x> Include decorative fruit basket CheckBox'",
-     "     VISIBLE:  '<x> Include decorative fruit bas', cursor=1",
      "SPEECH OUTPUT: ''",
      "SPEECH OUTPUT: 'Include decorative fruit basket check box checked'"]))
 
@@ -58,8 +56,6 @@
     "tab to second checkbox", 
     ["BRAILLE LINE:  '<x> Invalid checkbox CheckBox'",
      "     VISIBLE:  '<x> Invalid checkbox CheckBox', cursor=1",
-     "BRAILLE LINE:  '<x> Invalid checkbox CheckBox'",
-     "     VISIBLE:  '<x> Invalid checkbox CheckBox', cursor=1",
      "SPEECH OUTPUT: ''",
      "SPEECH OUTPUT: 'Invalid checkbox check box checked'"]))
 ########################################################################
@@ -82,8 +78,6 @@
     "tab to third checkbox", 
     ["BRAILLE LINE:  '<x> Required checkbox CheckBox'",
      "     VISIBLE:  '<x> Required checkbox CheckBox', cursor=1",
-     "BRAILLE LINE:  '<x> Required checkbox CheckBox'",
-     "     VISIBLE:  '<x> Required checkbox CheckBox', cursor=1",
      "SPEECH OUTPUT: ''",
      "SPEECH OUTPUT: 'Required checkbox check box checked'"]))
     
@@ -131,8 +125,6 @@
     "tab to checkbox tristate", 
     ["BRAILLE LINE:  '<x> Tri-state checkbox CheckBox'",
      "     VISIBLE:  '<x> Tri-state checkbox CheckBox', cursor=1",
-     "BRAILLE LINE:  '<x> Tri-state checkbox CheckBox'",
-     "     VISIBLE:  '<x> Tri-state checkbox CheckBox', cursor=1",
      "SPEECH OUTPUT: ''",
      "SPEECH OUTPUT: 'Tri-state checkbox check box checked'"]))
     
Index: test/keystrokes/firefox/moz_slider.py
===================================================================
--- test/keystrokes/firefox/moz_slider.py	(revision 4128)
+++ test/keystrokes/firefox/moz_slider.py	(working copy)
@@ -45,7 +45,7 @@
 sequence.append(utils.AssertPresentationAction(
     "basic whereAmI", 
     ["BRAILLE LINE:  ' Move slider left Button 10 Slider Move slider right Button'",
-     "     VISIBLE:  'Move slider right Button', cursor=1",
+     "     VISIBLE:  '10 Slider Move slider right Butt', cursor=1",
      "SPEECH OUTPUT: ''",
      "SPEECH OUTPUT: 'slider'",
      "SPEECH OUTPUT: '10.0'",
@@ -65,7 +65,7 @@
 sequence.append(utils.AssertPresentationAction(
     "0 move slider", 
     ["BRAILLE LINE:  ' Move slider left Button 15 Slider Move slider right Button'",
-     "     VISIBLE:  'Move slider right Button', cursor=1",
+     "     VISIBLE:  '15 Slider Move slider right Butt', cursor=1",
      "SPEECH OUTPUT: '15'"]))
                                
 sequence.append(utils.StartRecordingAction())                       
@@ -78,7 +78,7 @@
 sequence.append(utils.AssertPresentationAction(
     "1 move slider", 
     ["BRAILLE LINE:  ' Move slider left Button 20 Slider Move slider right Button'",
-     "     VISIBLE:  'Move slider right Button', cursor=1",
+     "     VISIBLE:  '20 Slider Move slider right Butt', cursor=1",
      "SPEECH OUTPUT: '20'"]))
                               
 sequence.append(utils.StartRecordingAction())                         
@@ -91,7 +91,7 @@
 sequence.append(utils.AssertPresentationAction(
     "2 move slider", 
     ["BRAILLE LINE:  ' Move slider left Button 25 Slider Move slider right Button'",
-     "     VISIBLE:  'Move slider right Button', cursor=1",
+     "     VISIBLE:  '25 Slider Move slider right Butt', cursor=1",
      "SPEECH OUTPUT: '25'"]))
                                      
 sequence.append(utils.StartRecordingAction())           
@@ -104,7 +104,7 @@
 sequence.append(utils.AssertPresentationAction(
     "3 move slider", 
     ["BRAILLE LINE:  ' Move slider left Button 30 Slider Move slider right Button'",
-     "     VISIBLE:  'Move slider right Button', cursor=1",
+     "     VISIBLE:  '30 Slider Move slider right Butt', cursor=1",
      "SPEECH OUTPUT: '30'"]))
                                
 sequence.append(utils.StartRecordingAction())                        
@@ -117,7 +117,7 @@
 sequence.append(utils.AssertPresentationAction(
     "4 move slider", 
     ["BRAILLE LINE:  ' Move slider left Button 25 Slider Move slider right Button'",
-     "     VISIBLE:  'Move slider right Button', cursor=1",
+     "     VISIBLE:  '25 Slider Move slider right Butt', cursor=1",
      "SPEECH OUTPUT: '25'"]))
                                        
 sequence.append(utils.StartRecordingAction())                  
@@ -130,7 +130,7 @@
 sequence.append(utils.AssertPresentationAction(
     "5 move slider", 
     ["BRAILLE LINE:  ' Move slider left Button 20 Slider Move slider right Button'",
-     "     VISIBLE:  'Move slider right Button', cursor=1",
+     "     VISIBLE:  '20 Slider Move slider right Butt', cursor=1",
      "SPEECH OUTPUT: '20'"]))
                                      
 sequence.append(utils.StartRecordingAction())                    
@@ -143,7 +143,7 @@
 sequence.append(utils.AssertPresentationAction(
     "6 move slider", 
     ["BRAILLE LINE:  ' Move slider left Button 15 Slider Move slider right Button'",
-     "     VISIBLE:  'Move slider right Button', cursor=1",
+     "     VISIBLE:  '15 Slider Move slider right Butt', cursor=1",
      "SPEECH OUTPUT: '15'"]))                           
   
 sequence.append(utils.StartRecordingAction())                     
@@ -156,7 +156,7 @@
 sequence.append(utils.AssertPresentationAction(
     "7 move slider", 
     ["BRAILLE LINE:  ' Move slider left Button 10 Slider Move slider right Button'",
-     "     VISIBLE:  'Move slider right Button', cursor=1",
+     "     VISIBLE:  '10 Slider Move slider right Butt', cursor=1",
      "SPEECH OUTPUT: '10'"]))   
                             
 #  Move the slider with the 'end' key.
@@ -171,7 +171,7 @@
 sequence.append(utils.AssertPresentationAction(
     "move slider end", 
     ["BRAILLE LINE:  ' Move slider left Button 100 Slider Move slider right Button'",
-     "     VISIBLE:  'Move slider right Button', cursor=1",
+     "     VISIBLE:  '100 Slider Move slider right But', cursor=1",
      "SPEECH OUTPUT: '100'"]))
                                
 #  Move the slider with the 'home' key.
@@ -186,7 +186,7 @@
 sequence.append(utils.AssertPresentationAction(
     "move slider home", 
     ["BRAILLE LINE:  ' Move slider left Button 0 Slider Move slider right Button'",
-     "     VISIBLE:  'Move slider right Button', cursor=1",
+     "     VISIBLE:  '0 Slider Move slider right Butto', cursor=1",
      "SPEECH OUTPUT: '0'"]))
 ########################################################################
 # Close the demo
Index: test/keystrokes/firefox/uiuc_tabpanel.py
===================================================================
--- test/keystrokes/firefox/uiuc_tabpanel.py	(revision 4128)
+++ test/keystrokes/firefox/uiuc_tabpanel.py	(working copy)
@@ -23,8 +23,6 @@
 sequence.append(KeyComboAction("Return"))
 sequence.append(WaitForDocLoad())
 
-
-
 ########################################################################
 # Do a basic "Where Am I" via KP_Enter.  
 #
Index: src/orca/scripts/toolkits/Gecko/script.py
===================================================================
--- src/orca/scripts/toolkits/Gecko/script.py	(revision 4128)
+++ src/orca/scripts/toolkits/Gecko/script.py	(working copy)
@@ -1277,15 +1277,21 @@
                 # example.
                 #
                 orca.setLocusOfFocus(event, event.source, False)
-                if eventSourceRole == pyatspi.ROLE_SPIN_BUTTON:
-                    text = self.queryNonEmptyText(event.source)
-                    if text and text.characterCount == event.detail1:
-                        return
-                elif event.detail1 == 0 \
-                     and eventSourceRole in [pyatspi.ROLE_PAGE_TAB,
-                                             pyatspi.ROLE_LIST_ITEM,
-                                             pyatspi.ROLE_MENU_ITEM]:
+                if event.detail1 == 0 and not string in ["Left", "Home"] \
+                   or eventSourceRole in [pyatspi.ROLE_PAGE_TAB,
+                                          pyatspi.ROLE_LIST_ITEM,
+                                          pyatspi.ROLE_MENU_ITEM]:
+                    # A focus:/object:state-changed:focused event should
+                    # pick up this case.
+                    #
                     return
+                elif eventSourceRole == pyatspi.ROLE_SPIN_BUTTON \
+                    and string in ["Up", "Down"]:
+                    # Ignore this bogus event.
+                    #
+                    return
+                else:
+                    self.setCaretContext(event.source, event.detail1)
 
             elif eventSourceInDocument and not self.inDocumentContent() \
                  and orca_state.locusOfFocus:
@@ -1304,18 +1310,14 @@
                 return
 
         # If we're still here, and in document content, update the caret
-        # context.
+        # context and set the locusOfFocus so that the default script's
+        # onCaretMoved will handle.
         #
-        if eventSourceInDocument:
-            text = self.queryNonEmptyText(event.source)
-            if text:
-                caretOffset = text.caretOffset
-            else:
-                caretOffset = 0
-
+        if eventSourceInDocument and not self.isAriaWidget():
             [obj, characterOffset] = \
-                self.findFirstCaretContext(event.source, caretOffset)
+                self.findFirstCaretContext(event.source, event.detail1)
             self.setCaretContext(obj, characterOffset)
+            orca.setLocusOfFocus(event, obj, False)
 
         # Pass the event along to the default script for processing.
         #
@@ -2688,6 +2690,9 @@
         return ('xml-roles' in attrs and 'live' not in attrs)
 
     def _getAttrDictionary(self, obj):
+        if not obj:
+            return {}
+
         return dict([attr.split(':', 1) for attr in obj.getAttributes()])
 
     def handleAsLiveRegion(self, event):
