Index: src/orca/Gecko.py
===================================================================
--- src/orca/Gecko.py	(revision 2150)
+++ src/orca/Gecko.py	(working copy)
@@ -45,6 +45,7 @@
 import speechgenerator
 
 from orca_i18n import _
+from orca_i18n import ngettext  # for ngettext support
 
 # If True, it tells us to take over caret navigation.  This is something
 # that can be set in user-settings.py:
@@ -758,7 +759,9 @@
             [Script.goNextHeading,
              Script.goPreviousHeading,
              Script.goNextChunk,
-             Script.goPreviousChunk]
+             Script.goPreviousChunk,
+             Script.goNextList,
+             Script.goPreviousList]
 
         if controlCaretNavigation:
             debug.println(debug.LEVEL_CONFIGURATION,
@@ -853,6 +856,16 @@
                 Script.goNextChunk,
                 "Goes to next chunk.")
 
+        self.inputEventHandlers["goPreviousListHandler"] = \
+            input_event.InputEventHandler(
+                Script.goPreviousList,
+                "Goes to previous list.")
+
+        self.inputEventHandlers["goNextListHandler"] = \
+            input_event.InputEventHandler(
+                Script.goNextList,
+                "Goes to next list.")
+
         self.inputEventHandlers["toggleCaretNavigationHandler"] = \
             input_event.InputEventHandler(
                 Script.toggleCaretNavigation,
@@ -977,6 +990,24 @@
 
         keyBindings.add(
             keybindings.KeyBinding(
+                "l",
+                (1 << atspi.Accessibility.MODIFIER_SHIFT \
+                 | 1 << atspi.Accessibility.MODIFIER_ALT \
+                 | 1 << atspi.Accessibility.MODIFIER_CONTROL),
+                1 << atspi.Accessibility.MODIFIER_SHIFT,
+                self.inputEventHandlers["goPreviousListHandler"]))
+
+        keyBindings.add(
+            keybindings.KeyBinding(
+                "l",
+                (1 << atspi.Accessibility.MODIFIER_SHIFT \
+                 | 1 << atspi.Accessibility.MODIFIER_ALT \
+                 | 1 << atspi.Accessibility.MODIFIER_CONTROL),
+                0,
+                self.inputEventHandlers["goNextListHandler"]))
+
+        keyBindings.add(
+            keybindings.KeyBinding(
                 "F12",
                 1 << settings.MODIFIER_ORCA,
                 1 << settings.MODIFIER_ORCA,
@@ -3450,6 +3481,58 @@
         else:
             speech.speak(_("No more chunks."))
 
+    def goPreviousList(self, inputEvent):
+        [obj, characterOffset] = self.findPreviousRole([rolenames.ROLE_LIST])
+        if obj:
+            [obj, characterOffset] = self.findFirstCaretContext(obj, 0)
+            parent = obj.parent
+            nItems = 0
+            for i in range(0, parent.childCount):
+                if parent.child(i).role == rolenames.ROLE_LIST_ITEM:
+                    nItems += 1
+            itemString = "List with" + ngettext("%d item", 
+                                                "%d items", 
+                                                nItems) % nItems
+            speech.speak(itemString)
+            nestingLevel = 0
+            while parent.parent.role == rolenames.ROLE_LIST:
+                nestingLevel += 1
+                parent = parent.parent
+            if nestingLevel:
+                speech.speak(_("Nesting level %d") % nestingLevel)
+            self.setCaretPosition(obj, characterOffset)
+            self.updateBraille(obj)
+            self.speakContents(self.getLineContentsAtOffset(obj,
+                                                            characterOffset))
+        else:
+            speech.speak(_("No more lists."))
+
+    def goNextList(self, inputEvent):
+        [obj, characterOffset] = self.findNextRole([rolenames.ROLE_LIST])
+        if obj:
+            [obj, characterOffset] = self.findFirstCaretContext(obj, 0)
+            parent = obj.parent
+            nItems = 0
+            for i in range(0, parent.childCount):
+                if parent.child(i).role == rolenames.ROLE_LIST_ITEM:
+                    nItems += 1
+            itemString = "List with" + ngettext("%d item", 
+                                                "%d items", 
+                                                nItems) % nItems
+            speech.speak(itemString)
+            nestingLevel = 0
+            while parent.parent.role == rolenames.ROLE_LIST:
+                nestingLevel += 1
+                parent = parent.parent
+            if nestingLevel:
+                speech.speak(_("Nesting level %d") % nestingLevel)
+            self.setCaretPosition(obj, characterOffset)
+            self.updateBraille(obj)
+            self.speakContents(self.getLineContentsAtOffset(obj,
+                                                            characterOffset))
+        else:
+            speech.speak(_("No more lists."))
+
     def toggleCaretNavigation(self, inputEvent):
         """Toggles between Firefox native and Orca caret navigation."""
 
