Index: src/orca/speechgenerator.py
===================================================================
--- src/orca/speechgenerator.py	(revision 2582)
+++ src/orca/speechgenerator.py	(working copy)
@@ -94,6 +94,8 @@
              self._getSpeechForLayeredPane
         self.speechGenerators[rolenames.ROLE_LIST]                = \
              self._getSpeechForList
+        self.speechGenerators[rolenames.ROLE_LIST_ITEM]           = \
+             self._getSpeechForListItem
         self.speechGenerators[rolenames.ROLE_MENU]                = \
              self._getSpeechForMenu
         self.speechGenerators[rolenames.ROLE_MENU_BAR]            = \
@@ -734,7 +736,40 @@
                              utterances)
 
         return utterances
+    
+    def _getSpeechForListItem(self, obj, already_focused):
+        """Get the speech for a listitem.
 
+        Arguments:
+        - obj: the listitem
+        - already_focused: False if object just received focus
+
+        Returns a list of utterances to be spoken for the object.
+        """
+        
+        # If already in focus then the tree probably collapsed or expanded
+        if already_focused:
+            if obj.state.count(atspi.Accessibility.STATE_EXPANDED):
+                # Translators: this represents the state of a node in a tree.
+                # 'expanded' means the children are showing.
+                # 'collapsed' means the children are not showing.
+                #
+                utterances = [_("expanded")]
+            else:
+                # Translators: this represents the state of a node in a tree.
+                # 'expanded' means the children are showing.
+                # 'collapsed' means the children are not showing.
+                #
+                utterances = [_("collapsed")]
+        else:
+            utterances = self._getDefaultSpeech(obj, already_focused)
+ 
+        self._debugGenerator("_getSpeechForListItem",
+                             obj,
+                             already_focused,
+                             utterances)
+        return utterances
+
     def _getSpeechForMenu(self, obj, already_focused):
         """Get the speech for a menu.
 
Index: src/orca/default.py
===================================================================
--- src/orca/default.py	(revision 2582)
+++ src/orca/default.py	(working copy)
@@ -6031,3 +6031,4 @@
 state_change_notifiers[rolenames.ROLE_TABLE_CELL]    = ("checked",
                                                         "expanded",
                                                         None)
+state_change_notifiers[rolenames.ROLE_LIST_ITEM]    = ("expanded", None)
Index: src/orca/Gecko.py
===================================================================
--- src/orca/Gecko.py	(revision 2582)
+++ src/orca/Gecko.py	(working copy)
@@ -3967,6 +3967,12 @@
         if not self.inDocumentContent():
             default.Script.sayCharacter(self, obj)
             return
+        
+        # User is probably using arrows to navigate widget.  May need to be 
+        # widget specific in the future, and also looking for "Up" and "Down"
+        if self.isAriaWidget(obj) and \
+                  orca_state.lastInputEvent.event_string in ["Left", "Right"]:
+            return
 
         [obj, characterOffset] = self.getCaretContext()
         if obj and obj.text:
