Index: src/orca/Gecko.py
===================================================================
--- src/orca/Gecko.py	(revision 3207)
+++ src/orca/Gecko.py	(working copy)
@@ -6359,6 +6359,15 @@
         return [None, wrapped]
 
     def findNextRole(self, roles, wrap, currentObj=None):
+
+        try:
+            #TODO: why can't I pass *args, **kwargs ??
+            return \
+                self.collectionFindNextRole(roles, wrap, currentObj=currentObj)
+        except NotImplementedError:
+            return self.iterFindNextRole(roles, wrap, currentObj=currentObj)
+
+    def iterFindNextRole(self, roles, wrap, currentObj=None):
         """Finds the caret offset at the beginning of the next object
         using the given roles list as a pattern to match or not match.
 
@@ -6371,10 +6380,8 @@
         Returns: [obj, wrapped] where wrapped is a boolean reflecting
         whether wrapping took place.
         """
-
         if not currentObj:
             [currentObj, characterOffset] = self.getCaretContext()
-
         ancestors = []
         obj = currentObj.parent
         while obj:
@@ -6402,6 +6409,33 @@
 
         return [None, wrapped]
                 
+    def collectionFindNextRole(self, roles, wrap, currentObj=None):
+        docframe = self.getDocumentFrame()
+        col = docframe.queryCollection()
+        if not currentObj:
+            [currentObj, characterOffset] = self.getCaretContext()
+
+        stateset = pyatspi.StateSet()
+        rule = col.createMatchRule(stateset.raw(), col.MATCH_NONE,
+                       "", col.MATCH_NONE,
+                       roles, col.MATCH_ANY,
+                       "", col.MATCH_NONE,
+                       False)
+
+        rs = col.getMatchesFrom(currentObj, rule, 
+                                col.SORT_ORDER_CANONICAL, False, 1)
+        if len(rs) > 0:
+            col.freeMatchRule(rule)
+            return [rs[0], False]
+        else:
+            rs = col.getMatchesFrom(docframe[0], rule, 
+                                     col.SORT_ORDER_CANONICAL, False, 1)
+            col.freeMatchRule(rule)
+            if len(rs) > 0:
+                return [rs[0], True]
+            else:
+                return [None, True]                      
+
     def findPrevByPredicate(self, pred, wrap, currentObj=None):
         """Finds the caret offset at the beginning of the previous object
         using the given predicate as a pattern to match.
