JCR-5068: work in progress
diff --git a/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/flat/BTreeManager.java b/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/flat/BTreeManager.java
index 4662cb5..826f77f 100644
--- a/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/flat/BTreeManager.java
+++ b/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/flat/BTreeManager.java
@@ -18,7 +18,6 @@
 
 import org.apache.jackrabbit.JcrConstants;
 import org.apache.jackrabbit.commons.iterator.FilterIterator;
-import org.apache.jackrabbit.commons.predicate.Predicate;
 
 import javax.jcr.Item;
 import javax.jcr.Node;
@@ -427,17 +426,13 @@
      * Filtering ignored properties from the given properties.
      */
     private Iterator<Property> filterProperties(Iterator<Property> properties) {
-        return new FilterIterator<Property>(properties, new Predicate() {
-            public boolean evaluate(Object object) {
+        return new FilterIterator<Property>(properties, prop -> {
                 try {
-                    Property p = (Property) object;
-                    return !ignoredProperties.contains(p.getName());
+                    return !ignoredProperties.contains(prop.getName());
                 }
                 catch (RepositoryException ignore) {
                     return true;
-                }
-            }
-        });
+                }});
     }
 
     private static class WrappedRepositoryException extends RuntimeException {
diff --git a/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/FilterIterator.java b/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/FilterIterator.java
index d613fdb..a57aa8a 100644
--- a/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/FilterIterator.java
+++ b/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/FilterIterator.java
@@ -16,10 +16,9 @@
  */
 package org.apache.jackrabbit.commons.iterator;
 
-import org.apache.jackrabbit.commons.predicate.Predicate;
-
 import java.util.Iterator;
 import java.util.NoSuchElementException;
+import java.util.function.Predicate;
 
 /**
  * Iterator filtering out items which do not match a given predicate.
@@ -27,7 +26,7 @@
  */
 public class FilterIterator<T> implements Iterator<T> {
     private final Iterator<T> iterator;
-    private final Predicate predicate;
+    private final Predicate<T> predicate;
 
     private T next = null;
 
@@ -37,7 +36,14 @@
      * @param iterator  iterator to filter
      * @param predicate  only item matching this predicate are included
      */
-    public FilterIterator(Iterator<T> iterator, Predicate predicate) {
+    public FilterIterator(Iterator<T> iterator, Predicate<T> predicate) {
+        super();
+        this.iterator = iterator;
+        this.predicate = predicate;
+    }
+
+    @SuppressWarnings("deprecation")
+    public FilterIterator(Iterator<T> iterator, org.apache.jackrabbit.commons.predicate.Predicate<T> predicate) {
         super();
         this.iterator = iterator;
         this.predicate = predicate;
@@ -46,7 +52,7 @@
     public boolean hasNext() {
         while (next == null && iterator.hasNext()) {
             T e = iterator.next();
-            if (predicate.evaluate(e)) {
+            if (predicate.test(e)) {
                 next = e;
             }
         }
@@ -72,5 +78,4 @@
     public void remove() {
         throw new UnsupportedOperationException();
     }
-
 }
diff --git a/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/FilteredRangeIterator.java b/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/FilteredRangeIterator.java
index 596d18a..771ced0 100644
--- a/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/FilteredRangeIterator.java
+++ b/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/FilteredRangeIterator.java
@@ -18,11 +18,10 @@
 
 import java.util.Iterator;
 import java.util.NoSuchElementException;
+import java.util.function.Predicate;
 
 import javax.jcr.RangeIterator;
 
-import org.apache.jackrabbit.commons.predicate.Predicate;
-
 /**
  * Filtering decorator for iterators.
  */
@@ -36,6 +35,7 @@
     /**
      * Predicate used for filtering.
      */
+    @SuppressWarnings("rawtypes")
     private final Predicate predicate;
 
     /**
@@ -73,7 +73,14 @@
      * @param bufferSize
      */
     public FilteredRangeIterator(
-            Iterator<?> iterator, Predicate predicate, int bufferSize) {
+            Iterator<?> iterator, Predicate<?> predicate, int bufferSize) {
+        this.iterator = iterator;
+        this.predicate = predicate;
+        this.buffer = new Object[bufferSize];
+    }
+
+    public FilteredRangeIterator(
+            Iterator<?> iterator, org.apache.jackrabbit.commons.predicate.Predicate<?> predicate, int bufferSize) {
         this.iterator = iterator;
         this.predicate = predicate;
         this.buffer = new Object[bufferSize];
@@ -85,7 +92,11 @@
      * @param iterator underlying iterator
      * @param predicate predicate used for filtering
      */
-    public FilteredRangeIterator(Iterator<?> iterator, Predicate predicate) {
+    public FilteredRangeIterator(Iterator<?> iterator, Predicate<?> predicate) {
+        this(iterator, predicate, 1000);
+    }
+
+    public FilteredRangeIterator(Iterator<?> iterator, org.apache.jackrabbit.commons.predicate.Predicate<?> predicate) {
         this(iterator, predicate, 1000);
     }
 
@@ -98,12 +109,13 @@
      * @param iterator underlying iterator
      */
     public FilteredRangeIterator(Iterator<?> iterator) {
-        this(iterator, Predicate.TRUE, 1000);
+        this(iterator, x -> true, 1000);
     }
 
     /**
      * Pre-fetches more items into the buffer.
      */
+    @SuppressWarnings("unchecked")
     private void fetch() {
         if (bufferPosition == bufferSize) {
             position += bufferSize;
@@ -111,7 +123,7 @@
             bufferSize = 0;
             while (bufferSize < buffer.length && iterator.hasNext()) {
                 Object object = iterator.next();
-                if (predicate.evaluate(object)) {
+                if (predicate.test(object)) {
                     buffer[bufferSize++] = object;
                 }
             }
diff --git a/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/package-info.java b/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/package-info.java
index 409352a..e56d8c3 100644
--- a/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/package-info.java
+++ b/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/iterator/package-info.java
@@ -14,5 +14,5 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-@org.osgi.annotation.versioning.Version("2.4.0")
+@org.osgi.annotation.versioning.Version("2.5.0")
 package org.apache.jackrabbit.commons.iterator;
diff --git a/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/predicate/Predicate.java b/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/predicate/Predicate.java
index e9ecbb9..10a7319 100644
--- a/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/predicate/Predicate.java
+++ b/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/predicate/Predicate.java
@@ -19,8 +19,10 @@
 /**
  * Interface for object predicates, i.e. functions that evaluate a given
  * object to a boolean value.
+ * @deprecated Use {@link java.util.function.Predicate} instead
  */
-public interface Predicate {
+@Deprecated
+public interface Predicate<T> extends java.util.function.Predicate<T> {
 
     /**
      * Evaluates the predicate for the given object.
@@ -28,12 +30,17 @@
      * @param object some object
      * @return predicate result
      */
-    boolean evaluate(Object object);
+    boolean evaluate(T object);
+
+    default boolean test(T object) {
+        return evaluate(object);
+    }
 
     /**
      * Constant predicate that returns <code>true</code> for all objects.
      */
-    Predicate TRUE = new Predicate() {
+    @SuppressWarnings({ "unchecked", "rawtypes" })
+    Predicate<? extends Object> TRUE = new Predicate() {
         public boolean evaluate(Object object) {
             return true;
         }
@@ -42,10 +49,10 @@
     /**
      * Constant predicate that returns <code>false</code> for all objects.
      */
-    Predicate FALSE = new Predicate() {
+    @SuppressWarnings({ "unchecked", "rawtypes" })
+    Predicate<? extends Object> FALSE = new Predicate() {
         public boolean evaluate(Object object) {
             return false;
         }
     };
-
 }
diff --git a/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/predicate/Predicates.java b/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/predicate/Predicates.java
index 006613c..2b09a6c 100644
--- a/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/predicate/Predicates.java
+++ b/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/predicate/Predicates.java
@@ -27,15 +27,37 @@
      * Creates an AND predicate over all the given component predicates.
      * All the component predicates must evaluate to <code>true</code>
      * for the AND predicate to do so.
+     * @param <T>
      *
      * @param predicates component predicates
      * @return AND predicate
      */
-    public static Predicate and(final Predicate... predicates) {
-        return new Predicate() {
-            public boolean evaluate(Object object) {
-                for (Predicate predicate : predicates) {
-                    if (!predicate.evaluate(object)) {
+    @SuppressWarnings({ "unchecked", "deprecation" })
+    public static <T> Predicate<T> and(final java.util.function.Predicate<? super T>... predicates) {
+        return computeAnd(predicates);
+    }
+
+    /**
+     * Creates an AND predicate over all the given component predicates.
+     * All the component predicates must evaluate to <code>true</code>
+     * for the AND predicate to do so.
+     * @param <T>
+     *
+     * @param predicates component predicates
+     * @return AND predicate
+     */
+    @SuppressWarnings("unchecked")
+    @Deprecated
+    public static <T> Predicate<T> and(Predicate<? super T>... predicates) {
+        return computeAnd(predicates);
+    }
+
+    @SuppressWarnings({ "deprecation", "unchecked" })
+    private static <T> Predicate<T> computeAnd(final java.util.function.Predicate<? super T>... predicates) {
+        return new Predicate<T>() {
+            public boolean evaluate(T object) {
+                for (java.util.function.Predicate<? super T> predicate : predicates) {
+                    if (!predicate.test(object)) {
                         return false;
                     }
                 }
@@ -52,11 +74,31 @@
      * @param predicates component predicates
      * @return OR predicate
      */
-    public static Predicate or(final Predicate... predicates) {
-        return new Predicate() {
-            public boolean evaluate(Object object) {
-                for (Predicate predicate : predicates) {
-                    if (predicate.evaluate(object)) {
+    @SuppressWarnings({ "unchecked", "deprecation" })
+    public static <T> Predicate<T> or(final java.util.function.Predicate<? super T>... predicates) {
+        return computeOr(predicates);
+    }
+
+    /**
+     * Creates an OR predicate over all the given component predicates.
+     * At least one of the component predicates must evaluate to
+     * <code>true</code> for the OR predicate to do so.
+     *
+     * @param predicates component predicates
+     * @return OR predicate
+     */
+    @SuppressWarnings("unchecked")
+    @Deprecated
+    public static <T> Predicate<T> or(Predicate<? super T>... predicates) {
+        return computeOr(predicates);
+    }
+
+    @SuppressWarnings({ "deprecation", "unchecked" })
+    private static <T> Predicate<T> computeOr(java.util.function.Predicate<? super T>... predicates) {
+        return new Predicate<T>() {
+            public boolean evaluate(T object) {
+                for (java.util.function.Predicate<? super T> predicate : predicates) {
+                    if (predicate.test(object)) {
                         return true;
                     }
                 }
@@ -73,12 +115,28 @@
      * @param predicate component predicate
      * @return NOT predicate
      */
-    public static Predicate not(final Predicate predicate) {
-        return new Predicate() {
-            public boolean evaluate(Object object) {
-                return !predicate.evaluate(object);
+    public static <T> java.util.function.Predicate<T> not(java.util.function.Predicate<? super T> target) {
+        return new java.util.function.Predicate<T>() {
+            public boolean test(T object) {
+                return !target.test(object);
             }
         };
     }
 
+    /**
+     * Creates a NOT predicate for the given component predicate.
+     * The NOT predicate evaluates to <code>true</code> when the component
+     * predicate doesn't, and vice versa.
+     *
+     * @param predicate component predicate
+     * @return NOT predicate
+     */
+    @SuppressWarnings("deprecation")
+    public static <T> Predicate<T> not(Predicate<? super T> target) {
+        return new Predicate<T>() {
+            public boolean evaluate(T object) {
+                return !target.test(object);
+            }
+        };
+    }
 }
diff --git a/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/predicate/package-info.java b/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/predicate/package-info.java
index 5e49a54..fd13862 100644
--- a/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/predicate/package-info.java
+++ b/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/predicate/package-info.java
@@ -14,5 +14,5 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-@org.osgi.annotation.versioning.Version("2.2")
+@org.osgi.annotation.versioning.Version("2.3")
 package org.apache.jackrabbit.commons.predicate;