Index: jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/flat/Rank.java
===================================================================
--- jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/flat/Rank.java	(revision 982239)
+++ jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/flat/Rank.java	(working copy)
@@ -16,11 +16,10 @@
  */
 package org.apache.jackrabbit.commons.flat;
 
-import static org.apache.jackrabbit.commons.iterator.Iterators.arrayIterator;
-import static org.apache.jackrabbit.commons.iterator.Iterators.empty;
-
 import java.lang.reflect.Array;
+import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Comparator;
 import java.util.Iterator;
 import java.util.LinkedList;
@@ -192,11 +191,10 @@
         if (n > 0) {
             take(n, first, values.length - 1);
             first += n;
-            return arrayIterator(values, first - n, first);
+            return Arrays.asList(values).subList(first - n, first).iterator();
+        } else {
+            return Collections.<T>emptySet().iterator();
         }
-        else {
-            return empty();
-        }
     }
 
     /**
Index: jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/flat/BTreeManager.java
===================================================================
--- jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/flat/BTreeManager.java	(revision 982239)
+++ jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/flat/BTreeManager.java	(working copy)
@@ -16,12 +16,7 @@
  */
 package org.apache.jackrabbit.commons.flat;
 
-import static org.apache.jackrabbit.commons.iterator.Iterators.filterIterator;
-import static org.apache.jackrabbit.commons.iterator.Iterators.nodes;
-import static org.apache.jackrabbit.commons.iterator.Iterators.properties;
-
 import org.apache.jackrabbit.JcrConstants;
-import org.apache.jackrabbit.commons.iterator.Predicate;
 
 import javax.jcr.Item;
 import javax.jcr.Node;
@@ -30,6 +25,7 @@
 import javax.jcr.PropertyIterator;
 import javax.jcr.RepositoryException;
 
+import java.util.ArrayList;
 import java.util.Comparator;
 import java.util.Iterator;
 
@@ -256,31 +252,27 @@
     /**
      * Returns a {@link SizedIterator} of the child nodes of <code>node</code>.
      */
+    @SuppressWarnings("unchecked")
     protected SizedIterator<Node> getNodes(Node node) throws RepositoryException {
         NodeIterator nodes = node.getNodes();
-        return getSizedIterator(nodes(nodes), nodes.getSize());
+        return getSizedIterator(nodes, nodes.getSize());
     }
 
     /**
-     * Returns a {@link SizedIterator} of the properties of <code>node</code> which
-     * excludes the <code>jcr.primaryType</code> property.
+     * Returns a {@link SizedIterator} of the properties of <code>node</code>
+     * which excludes the <code>jcr.primaryType</code> property.
      */
-    protected SizedIterator<Property> getProperties(final Node node) throws RepositoryException {
-        final PropertyIterator properties = node.getProperties();
-
-        Iterator<Property> filtered = filterIterator(properties(properties), new Predicate<Property>() {
-            public boolean evaluate(Property property) {
-                try {
-                    return !JcrConstants.JCR_PRIMARYTYPE.equals(property.getName());
-                }
-                catch (RepositoryException ignore) {
-                    return true;
-                }
+    protected SizedIterator<Property> getProperties(Node node)
+            throws RepositoryException {
+        ArrayList<Property> list = new ArrayList<Property>();
+        PropertyIterator properties = node.getProperties();
+        while (properties.hasNext()) {
+            Property property = properties.nextProperty();
+            if (!JcrConstants.JCR_PRIMARYTYPE.equals(property.getName())) {
+                list.add(property);
             }
-        });
-
-        long size = properties.getSize();
-        return getSizedIterator(filtered, size > 0 ? size - 1 : size);
+        }
+        return getSizedIterator(list.iterator(), list.size());
     }
 
     /**
@@ -311,7 +303,7 @@
     /**
      * Wraps <code>iterator</code> into a {@link SizedIterator} given a
      * <code>size</code>. The value of the <code>size</code> parameter must
-     * correctly reflect the number of items in <code>iterator</code>.Ê
+     * correctly reflect the number of items in <code>iterator</code>.
      */
     protected final <T> SizedIterator<T> getSizedIterator(final Iterator<T> iterator, final long size) {
         return new SizedIterator<T>() {
Index: jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/flat/TreeTraverser.java
===================================================================
--- jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/flat/TreeTraverser.java	(revision 982239)
+++ jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/flat/TreeTraverser.java	(working copy)
@@ -16,10 +16,6 @@
  */
 package org.apache.jackrabbit.commons.flat;
 
-import static org.apache.jackrabbit.commons.iterator.Iterators.empty;
-import static org.apache.jackrabbit.commons.iterator.Iterators.iteratorChain;
-import static org.apache.jackrabbit.commons.iterator.Iterators.properties;
-import static org.apache.jackrabbit.commons.iterator.Iterators.singleton;
 import static org.apache.jackrabbit.commons.iterator.LazyIteratorChain.chain;
 
 import javax.jcr.Item;
@@ -28,6 +24,9 @@
 import javax.jcr.Property;
 import javax.jcr.RepositoryException;
 
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
 import java.util.Iterator;
 
 /**
@@ -247,45 +246,43 @@
      * Returns an iterator of the nodes of the sub-tree rooted at
      * <code>node</code>.
      */
+    @SuppressWarnings("unchecked")
     private Iterator<Node> iterator(Node node) {
         try {
             if (inclusionPolicy.include(node)) {
-                return iteratorChain(singleton(node), chain(childIterators(node)));
+                return chain(Arrays.asList(
+                        Collections.singleton(node).iterator(),
+                        chain(childIterators(node))).iterator());
             }
             else {
                 return chain(childIterators(node));
             }
-        }
-        catch (RepositoryException e) {
+        } catch (RepositoryException e) {
             errorHandler.call(node, e);
-            return empty();
+            return Collections.<Node>emptySet().iterator();
         }
     }
 
     /**
      * Returns an iterator of iterators of the child nodes of <code>node</code>.
      */
-    private Iterator<Iterator<Node>> childIterators(final Node node) {
+    private Iterator<Iterator<Node>> childIterators(Node node) {
         try {
+            final NodeIterator childNodes = node.getNodes();
             return new Iterator<Iterator<Node>>() {
-                private final NodeIterator childNodes = node.getNodes();
-
                 public boolean hasNext() {
                     return childNodes.hasNext();
                 }
-
                 public Iterator<Node> next() {
                     return iterator(childNodes.nextNode());
                 }
-
                 public void remove() {
                     throw new UnsupportedOperationException();
                 }
             };
-        }
-        catch (RepositoryException e) {
+        } catch (RepositoryException e) {
             errorHandler.call(node, e);
-            return empty();
+            return Collections.<Iterator<Node>>emptySet().iterator();
         }
     }
 
@@ -303,14 +300,14 @@
                 return nodes.hasNext();
             }
 
+            @SuppressWarnings("unchecked")
             public Iterator<Property> next() {
                 Node n = nodes.next();
                 try {
-                    return properties(n.getProperties());
-                }
-                catch (RepositoryException e) {
+                    return n.getProperties();
+                } catch (RepositoryException e) {
                     errorHandler.call(n, e);
-                    return empty();
+                    return Collections.<Property>emptySet().iterator();
                 }
             }
 
