Index: src/orca/speechgenerator.py
===================================================================
--- src/orca/speechgenerator.py	(revision 2603)
+++ 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.
+        """
+
+        utterances = self._getDefaultSpeech(obj, already_focused)
+
+        # If already in focus then the tree probably collapsed or expanded
+        if obj.state.count(atspi.Accessibility.STATE_EXPANDABLE):
+            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.append(_("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.append(_("collapsed"))
+
+        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 2603)
+++ 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)
