diff --git a/README.md b/README.md
index bf872ae..6c235dc 100644
--- a/README.md
+++ b/README.md
@@ -2,12 +2,13 @@
 
  [![Build Status](https://builds.apache.org/buildStatus/icon?job=sling-org-apache-sling-resource-filter-1.8)](https://builds.apache.org/view/S-Z/view/Sling/job/sling-org-apache-sling-resource-filter-1.8) [![Test Status](https://img.shields.io/jenkins/t/https/builds.apache.org/view/S-Z/view/Sling/job/sling-org-apache-sling-resource-filter-1.8.svg)](https://builds.apache.org/view/S-Z/view/Sling/job/sling-org-apache-sling-resource-filter-1.8/test_results_analyzer/) [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://www.apache.org/licenses/LICENSE-2.0)
 
-# Resource Filter
-`ResourceFilter` provides a simple matching language that allows you to define a `Predicate<Resource>` for use with the Collections and Streams api in Java as as the ability to add parameters to the underlying context that the Script will pick up. The ResourceFilter can be created by adapting a `Resource` object. 
+# Resource Predicate Service
+`ResourcePredicate` is a service takes a simple matching language script that allows you to define a `Predicate<Resource>` for use with the Collections and the Streams api in Java, it also provides  the ability to add parameters to the underlying context that the script will pick up.
 
 ```java
-ResourceFilter rf = resource.adaptTo(ResourceFilter.class);
-Predicate<Resource> predicate = rf.parse("[jcr:content/created] < 2013-08-08T16:32");
+@Reference
+ResourcePredicates rp;
+Predicate<Resource> predicate = rp.parse("[jcr:content/created] < 2013-08-08T16:32");
 resourceCollection.stream().filter(predicate).forEach(
     resource -> System.out.println(resource.getPath())
 );
@@ -18,8 +19,8 @@
 `ResourceStream` is a general utility to provide a `Stream<Resource>` which traverses a resource and it's subtree. The implementation takes a `Predicate<Resource>` object as part of the stream creation to define a branch selector that controls which children of a resource are followed
 
 
-## Resource Stream Filter
-`ResourceStreamFilter` combines the `ResourceStream` functionality with the `ResourceFilter` to provide an ability to define a `Stream<Resource>` that follows specific child pages and looks for specific Resources by using a ResourceFilter script. The ResourceStreamFilter is access by adaption.
+## Resource Filter Stream
+`ResourceFilterStream` combines the `ResourceStream` functionality with the `ResourcePredicates` service to provide an ability to define a `Stream<Resource>` that follows specific child pages and looks for specific Resources as defined by the resources filter script. The ResourceStreamFilter is access by adaption.
 
 ```java
      ResourceStreamFilter rfs = resource.adaptTo(ResourceStreamFilter.class);
diff --git a/src/main/java/org/apache/sling/resource/filter/ResourceFilter.java b/src/main/java/org/apache/sling/resource/filter/ResourceFilter.java
deleted file mode 100644
index dcc6aba..0000000
--- a/src/main/java/org/apache/sling/resource/filter/ResourceFilter.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.sling.resource.filter;
-
-import java.util.Map;
-import java.util.function.Predicate;
-
-import org.apache.sling.api.resource.Resource;
-
-public interface ResourceFilter {
-
-    /**
-     * Creates a Predicate<Resource> based on the script
-     * 
-     * @param filter
-     * @return
-     * @throws ResourceFilterException
-     */
-    public Predicate<Resource> parse(String filter);
-
-    /**
-     * Creates a Predicate<Resource> based on the script
-     * 
-     * @param filter
-     * @param charEncoding
-     * @return
-     * @throws ResourceFilterException
-     */
-    public Predicate<Resource> parse(String filter, String charEncoding);
-
-    /**
-     * Add a series of key - value pairs that can then be evaluated as part of the
-     * filter creation
-     * 
-     * @param params Map of Key - Value pairs
-     * @return this
-     */
-    public abstract ResourceFilter addParams(Map<String, Object> params);
-
-    /**
-     * Adds a key - value pair that can then be evaluated as part of the filter
-     * creation
-     * 
-     * @param key
-     * @param value
-     * @return this
-     */
-    public abstract ResourceFilter addParam(String key, Object value);
-}
diff --git a/src/main/java/org/apache/sling/resource/filter/ResourceFilterStream.java b/src/main/java/org/apache/sling/resource/filter/ResourceFilterStream.java
index 6e7e9c6..2310881 100644
--- a/src/main/java/org/apache/sling/resource/filter/ResourceFilterStream.java
+++ b/src/main/java/org/apache/sling/resource/filter/ResourceFilterStream.java
@@ -13,6 +13,7 @@
  */
 package org.apache.sling.resource.filter;
 
+import java.util.HashMap;
 import java.util.Map;
 import java.util.function.Predicate;
 import java.util.stream.Stream;
@@ -29,15 +30,17 @@
 
     private ResourceStream resources;
 
-    private ResourceFilter resourceFilter;
+    private ResourcePredicates resourcePredicate;
 
     private Predicate<Resource> branchSelector = resource -> true;
 
     private Predicate<Resource> childSelector = resource -> true;
+    
+    private Map<String,Object> parameters = new HashMap<>();
 
-    public ResourceFilterStream(Resource resource, ResourceFilter filter) {
-        resources = new ResourceStream(resource);
-        this.resourceFilter = filter;
+    public ResourceFilterStream(Resource resource, ResourcePredicates filter) {
+        this.resources = new ResourceStream(resource);
+        this.resourcePredicate = filter;
     }
 
     /**
@@ -45,12 +48,12 @@
      * down as part of the Resource traversal
      * 
      * @param branchSelector
-     *            resourceFilter script for traversal control
+     *            resourcePredicate script for traversal control
      * @return ResourceStreamFilter
      * @throws ResourceFilterException
      */
     public ResourceFilterStream setBranchSelector(String branchSelector) {
-        this.branchSelector = resourceFilter.parse(branchSelector);
+        this.branchSelector = resourcePredicate.usingParameterMap(parameters).parse(branchSelector);
         return this;
     }
 
@@ -59,12 +62,12 @@
      * stream
      * 
      * @param childSelector
-     *            resourceFilter script to identify child resources to return
+     *            resourcePredicate script to identify child resources to return
      * @return ResourceStreamFilter
      * @throws ResourceFilterException
      */
     public ResourceFilterStream setChildSelector(String childSelector) {
-        this.childSelector = resourceFilter.parse(childSelector);
+        this.childSelector = resourcePredicate.usingParameterMap(parameters).parse(childSelector);
         return this;
     }
 
@@ -75,7 +78,7 @@
      * @return
      */
     public ResourceFilterStream addParam(String key, Object value) {
-        resourceFilter.addParam(key, value);
+        parameters.put(key, value);
         return this;
     }
 
@@ -87,7 +90,7 @@
      * @return
      */
     public ResourceFilterStream addParams(Map<String, Object> params) {
-        resourceFilter.addParams(params);
+        parameters.putAll(params);
         return this;
     }
 
diff --git a/src/main/java/org/apache/sling/resource/filter/ResourcePredicates.java b/src/main/java/org/apache/sling/resource/filter/ResourcePredicates.java
new file mode 100644
index 0000000..281d106
--- /dev/null
+++ b/src/main/java/org/apache/sling/resource/filter/ResourcePredicates.java
@@ -0,0 +1,87 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.resource.filter;
+
+import java.util.Map;
+import java.util.function.Predicate;
+
+import org.apache.sling.api.resource.Resource;
+
+/**
+ * 
+ *
+ */
+public interface ResourcePredicates {
+
+    /**
+     * Creates a Predicate<Resource> based on the provided script
+     * 
+     * @param filter
+     * @return
+     * @throws ResourceFilterException
+     */
+    Predicate<Resource> parse(String filter);
+
+    /**
+     * Creates a Predicate<Resource> based on the provided script
+     * 
+     * @param filter
+     * @param charEncoding
+     * @return
+     * @throws ResourceFilterException
+     */
+    Predicate<Resource> parse(String filter, String charEncoding);
+
+    /**
+     * Add a series of key - value pairs that can then be evaluated as part of the
+     * Predicate<Resource> creation
+     * 
+     * @param params
+     *            Map of Key - Value pairs
+     * @return ResourcePredicateBuilder
+     */
+    ResourcePredicateBuilder withParameters(Map<String, Object> params);
+
+    /**
+     * Adds a key - value pair that can then be evaluated as part of the
+     * Predicate<Resource> creation
+     * 
+     * @param key
+     * @param value
+     * @return ResourcePredicateBuilder
+     */
+    ResourcePredicateBuilder withParameter(String key, Object value);
+
+    /**
+     * Replaces the existing parameter map with the supplied Map<String,Object>
+     * object, all prior provided parameters will be replaced
+     * 
+     * @return ResourcePredicateBuilder
+     */
+    ResourcePredicateBuilder usingParameterMap(Map<String, Object> params);
+
+    /**
+     * Provides a transitional state where multiple parameters can be applied before
+     * creating the Predicate
+     * 
+     */
+    public static interface ResourcePredicateBuilder extends ResourcePredicates {
+
+    }
+}
diff --git a/src/main/java/org/apache/sling/resource/filter/impl/ComparisonVisitor.java b/src/main/java/org/apache/sling/resource/filter/impl/ComparisonVisitor.java
index ee71126..55a3533 100644
--- a/src/main/java/org/apache/sling/resource/filter/impl/ComparisonVisitor.java
+++ b/src/main/java/org/apache/sling/resource/filter/impl/ComparisonVisitor.java
@@ -74,7 +74,7 @@
         case FilterParserConstants.DYNAMIC_ARG:
             return resource -> {
                 String argument = node.text;
-                Optional<Object> arg = context.getArgument(argument);
+                Optional<Object> arg = context.getParameter(argument);
                 if (!arg.isPresent()) {
                     throw new NoSuchElementException(String.format("No value present for '%s'",argument));
                 }
diff --git a/src/main/java/org/apache/sling/resource/filter/impl/Context.java b/src/main/java/org/apache/sling/resource/filter/impl/Context.java
index 0ef64f5..798293f 100644
--- a/src/main/java/org/apache/sling/resource/filter/impl/Context.java
+++ b/src/main/java/org/apache/sling/resource/filter/impl/Context.java
@@ -95,8 +95,17 @@
      * @param name of the argument
      * @return Optional object represented by the name
      */
-    Optional<Object> getArgument(String name);
+    Optional<Object> getParameter(String name);
 
-    void addParams(Map<String, Object> params);
+    
+    void addParameters(Map<String, Object> params);
 
+    /**
+     * Allows an object to be represented in the script for evaluation.
+     * 
+     * @param name of the argument
+     * @param object value that is represented
+     * @return this Context
+     */
+    Context replaceParameterMap(Map<String, Object> params);
 }
diff --git a/src/main/java/org/apache/sling/resource/filter/impl/DefaultContext.java b/src/main/java/org/apache/sling/resource/filter/impl/DefaultContext.java
index 41dfdb8..8a63932 100644
--- a/src/main/java/org/apache/sling/resource/filter/impl/DefaultContext.java
+++ b/src/main/java/org/apache/sling/resource/filter/impl/DefaultContext.java
@@ -26,7 +26,7 @@
 
     private Map<String, BiFunction<Object[], Resource, Object>> functions = new HashMap<>();
 
-    private Map<String, Object> arguments = new HashMap<>();
+    private Map<String, Object> parameters = new HashMap<>();
 
     private Visitor<Predicate<Resource>> logicVisitor;
 
@@ -46,7 +46,7 @@
 
     @Override
     public Context addArgument(String name, Object object) {
-        arguments.put(name, object);
+        parameters.put(name, object);
         return this;
     }
 
@@ -78,13 +78,19 @@
     }
 
     @Override
-    public Optional<Object> getArgument(String text) {
-        return Optional.ofNullable(arguments.get(text));
+    public Optional<Object> getParameter(String text) {
+        return Optional.ofNullable(parameters.get(text));
     }
 
     @Override
-    public void addParams(Map<String, Object> params) {
-        arguments.putAll(params);
+    public void addParameters(Map<String, Object> params) {
+        parameters.putAll(params);
+    }
+
+    @Override
+    public Context replaceParameterMap(Map<String, Object> params) {
+        parameters = params;
+        return this;
     }
 
 }
diff --git a/src/main/java/org/apache/sling/resource/filter/impl/ResourceFilterAdapter.java b/src/main/java/org/apache/sling/resource/filter/impl/ResourceFilterAdapter.java
index d1197fb..903447e 100644
--- a/src/main/java/org/apache/sling/resource/filter/impl/ResourceFilterAdapter.java
+++ b/src/main/java/org/apache/sling/resource/filter/impl/ResourceFilterAdapter.java
@@ -20,7 +20,7 @@
 
 import org.apache.sling.api.adapter.AdapterFactory;
 import org.apache.sling.api.resource.Resource;
-import org.apache.sling.resource.filter.ResourceFilter;
+import org.apache.sling.resource.filter.ResourcePredicates;
 import org.apache.sling.resource.filter.ResourceFilterStream;
 import org.osgi.service.component.annotations.Component;
 
@@ -32,11 +32,11 @@
     @Override
     public <T> T getAdapter(Object adaptable, Class<T> type) {
         if (adaptable instanceof Resource) {
-            ResourceFilter filter = new ResourceFilterImpl();
+            ResourcePredicates filter = new ResourcePredicateImpl();
             if (type == ResourceFilterStream.class) {
                 return (T) new ResourceFilterStream((Resource)adaptable, filter);
             }
-            if (type == ResourceFilter.class) {
+            if (type == ResourcePredicates.class) {
                 return (T) filter;
             }
         }
diff --git a/src/main/java/org/apache/sling/resource/filter/impl/ResourceFilterImpl.java b/src/main/java/org/apache/sling/resource/filter/impl/ResourceFilterImpl.java
deleted file mode 100644
index 7aa51bf..0000000
--- a/src/main/java/org/apache/sling/resource/filter/impl/ResourceFilterImpl.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.sling.resource.filter.impl;
-
-import java.io.ByteArrayInputStream;
-import java.util.Map;
-import java.util.function.Predicate;
-
-import org.apache.sling.api.resource.Resource;
-import org.apache.sling.resource.filter.ResourceFilter;
-import org.apache.sling.resource.filter.impl.node.Node;
-import org.apache.sling.resource.filter.impl.script.FilterParser;
-import org.apache.sling.resource.filter.impl.script.ParseException;
-
-public class ResourceFilterImpl implements ResourceFilter {
-
-    
-    private Context context;
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.apache.sling.resource.filter.ResourceFilterStream#getContext()
-     */
-    public Context getContext() {
-        if (context == null) {
-            context = new DefaultContext();
-            new LogicVisitor(context);
-            new ComparisonVisitor(context);
-        }
-        return context;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * org.apache.sling.resource.filter.ResourceFilterStream#setContext(org.apache.sling.
-     * resource.filter.impl.Context)
-     */
-
-    public ResourceFilter setContext(Context context) {
-        this.context = context;
-        return this;
-    }
-    
-    
-    @Override
-    public Predicate<Resource> parse(String filter) {
-        Node rootNode;
-        try {
-            rootNode = new FilterParser(new ByteArrayInputStream(filter.getBytes())).parse();
-            return rootNode.accept(getContext().getLogicVisitor());
-        } catch (ParseException e) {
-            throw new IllegalArgumentException(e);
-        }
-    }
-
-
-
-    @Override
-    public Predicate<Resource> parse(String filter, String charEncoding) {
-        Node rootNode;
-        try {
-            rootNode = new FilterParser(new ByteArrayInputStream(filter.getBytes()),charEncoding).parse();
-            return rootNode.accept(getContext().getLogicVisitor());
-        } catch (ParseException e) {
-            throw new IllegalArgumentException(e);
-        }
-    }
-
-    @Override
-    public ResourceFilter addParams(Map<String, Object> params) {
-        getContext().addParams(params);
-        return this;
-    }
-
-    @Override
-    public ResourceFilter addParam(String key, Object value) {
-        getContext().addArgument(key, value);
-        return this;
-    }
-
-}
diff --git a/src/main/java/org/apache/sling/resource/filter/impl/ResourcePredicateImpl.java b/src/main/java/org/apache/sling/resource/filter/impl/ResourcePredicateImpl.java
new file mode 100644
index 0000000..060ec2e
--- /dev/null
+++ b/src/main/java/org/apache/sling/resource/filter/impl/ResourcePredicateImpl.java
@@ -0,0 +1,107 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.resource.filter.impl;
+
+import java.io.ByteArrayInputStream;
+import java.util.Map;
+import java.util.function.Predicate;
+
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.resource.filter.ResourcePredicates;
+import org.apache.sling.resource.filter.impl.node.Node;
+import org.apache.sling.resource.filter.impl.script.FilterParser;
+import org.apache.sling.resource.filter.impl.script.ParseException;
+import org.osgi.service.component.annotations.Component;
+
+@Component
+public class ResourcePredicateImpl implements ResourcePredicates {
+
+    @Override
+    public Predicate<Resource> parse(String filter) {
+        return new ResourcePredicateBuilderImpl().parse(filter);
+    }
+
+    @Override
+    public Predicate<Resource> parse(String filter, String charEncoding) {
+        return new ResourcePredicateBuilderImpl().parse(filter, charEncoding);
+    }
+
+    @Override
+    public ResourcePredicateBuilder withParameters(Map<String, Object> params) {
+        return new ResourcePredicateBuilderImpl().withParameters(params);
+    }
+
+    @Override
+    public ResourcePredicateBuilder withParameter(String key, Object value) {
+        return new ResourcePredicateBuilderImpl().withParameter(key, value);
+    }
+    
+    @Override
+    public ResourcePredicateBuilder usingParameterMap(Map<String, Object> params) {
+        return new ResourcePredicateBuilderImpl().usingParameterMap(params);
+    }
+
+    public static class ResourcePredicateBuilderImpl implements ResourcePredicateBuilder {
+
+        private Context context;
+
+        private ResourcePredicateBuilderImpl() {
+            context = new DefaultContext();
+            new LogicVisitor(context);
+            new ComparisonVisitor(context);
+        }
+
+        @Override
+        public Predicate<Resource> parse(String filter) {
+            Node rootNode;
+            try {
+                rootNode = new FilterParser(new ByteArrayInputStream(filter.getBytes())).parse();
+                return rootNode.accept(context.getLogicVisitor());
+            } catch (ParseException e) {
+                throw new IllegalArgumentException(e);
+            }
+        }
+
+        @Override
+        public Predicate<Resource> parse(String filter, String charEncoding) {
+            Node rootNode;
+            try {
+                rootNode = new FilterParser(new ByteArrayInputStream(filter.getBytes()), charEncoding).parse();
+                return rootNode.accept(context.getLogicVisitor());
+            } catch (ParseException e) {
+                throw new IllegalArgumentException(e);
+            }
+        }
+
+        @Override
+        public ResourcePredicateBuilder withParameters(Map<String, Object> params) {
+            context.addParameters(params);
+            return this;
+        }
+
+        @Override
+        public ResourcePredicateBuilder withParameter(String key, Object value) {
+            context.addArgument(key, value);
+            return this;
+        }
+
+        @Override
+        public ResourcePredicateBuilder usingParameterMap(Map<String, Object> params) {
+            context.replaceParameterMap(params);
+            return this;
+        }
+
+    }
+
+}
diff --git a/src/test/java/org/apache/sling/resource/filter/ResourceFilterArgTest.java b/src/test/java/org/apache/sling/resource/filter/ResourceFilterArgTest.java
index 11128e7..773d7e0 100644
--- a/src/test/java/org/apache/sling/resource/filter/ResourceFilterArgTest.java
+++ b/src/test/java/org/apache/sling/resource/filter/ResourceFilterArgTest.java
@@ -23,7 +23,7 @@
 import java.util.stream.Collectors;
 
 import org.apache.sling.api.resource.Resource;
-import org.apache.sling.resource.filter.impl.ResourceFilterImpl;
+import org.apache.sling.resource.filter.impl.ResourcePredicateImpl;
 import org.apache.sling.testing.mock.sling.junit.SlingContext;
 import org.junit.Before;
 import org.junit.Rule;
@@ -37,14 +37,14 @@
 
     Resource resource;
     
-    ResourceFilter resourceFilter = new ResourceFilterImpl();
+    ResourcePredicates resourceFilter = new ResourcePredicateImpl();
     
     @Before
     public void setUp() throws ParseException {
         context.load().json("/data.json", "/content/sample/en");
         resource = context.resourceResolver().getResource(START_PATH);
-        context.registerAdapter(Resource.class, ResourceFilterStream.class, new ResourceFilterStream(resource,new ResourceFilterImpl()));
-        context.registerAdapter(Resource.class, ResourceFilter.class, new ResourceFilterImpl());
+        context.registerAdapter(Resource.class, ResourceFilterStream.class, new ResourceFilterStream(resource,new ResourcePredicateImpl()));
+        context.registerAdapter(Resource.class, ResourcePredicates.class, new ResourcePredicateImpl());
     }
 
     @Test
@@ -69,7 +69,7 @@
 
     @Test
     public void testNameFunctionAgainstRegex() throws ParseException, Exception {
-        Predicate<Resource> filter = resourceFilter.addParam("regex", "testpage[1-2]").parse("name() like $regex");
+        Predicate<Resource> filter = resourceFilter.withParameter("regex", "testpage[1-2]").parse("name() like $regex");
         List<Resource> found = handle(new ResourceStream(resource), filter);
         assertEquals(2, found.size());
     }
diff --git a/src/test/java/org/apache/sling/resource/filter/ResourceFilterDateTest.java b/src/test/java/org/apache/sling/resource/filter/ResourceFilterDateTest.java
index bdc4a63..210b493 100644
--- a/src/test/java/org/apache/sling/resource/filter/ResourceFilterDateTest.java
+++ b/src/test/java/org/apache/sling/resource/filter/ResourceFilterDateTest.java
@@ -19,7 +19,7 @@
 import java.util.stream.Collectors;
 
 import org.apache.sling.api.resource.Resource;
-import org.apache.sling.resource.filter.impl.ResourceFilterImpl;
+import org.apache.sling.resource.filter.impl.ResourcePredicateImpl;
 import org.apache.sling.resource.filter.impl.script.ParseException;
 import org.apache.sling.testing.mock.sling.junit.SlingContext;
 import org.junit.Before;
@@ -33,7 +33,7 @@
 
     private Resource resource;
     
-    ResourceFilter resourceFilter = new ResourceFilterImpl();
+    ResourcePredicates resourceFilter = new ResourcePredicateImpl();
 
     private static String START_PATH = "/content/sample/en";
 
diff --git a/src/test/java/org/apache/sling/resource/filter/ResourceFilterLogicTest.java b/src/test/java/org/apache/sling/resource/filter/ResourceFilterLogicTest.java
index aad9a37..7afeddf 100644
--- a/src/test/java/org/apache/sling/resource/filter/ResourceFilterLogicTest.java
+++ b/src/test/java/org/apache/sling/resource/filter/ResourceFilterLogicTest.java
@@ -19,7 +19,7 @@
 import java.util.stream.Collectors;
 
 import org.apache.sling.api.resource.Resource;
-import org.apache.sling.resource.filter.impl.ResourceFilterImpl;
+import org.apache.sling.resource.filter.impl.ResourcePredicateImpl;
 import org.apache.sling.resource.filter.impl.script.ParseException;
 import org.apache.sling.testing.mock.sling.junit.SlingContext;
 import org.junit.Before;
@@ -35,7 +35,7 @@
 
     private Resource resource;
     
-    ResourceFilter resourceFilter = new ResourceFilterImpl();
+    ResourcePredicates resourceFilter = new ResourcePredicateImpl();
 
     @Before
     public void setUp() throws ParseException, java.text.ParseException {
diff --git a/src/test/java/org/apache/sling/resource/filter/ResourceFilterTest.java b/src/test/java/org/apache/sling/resource/filter/ResourceFilterTest.java
index 781bdbd..cb6554b 100644
--- a/src/test/java/org/apache/sling/resource/filter/ResourceFilterTest.java
+++ b/src/test/java/org/apache/sling/resource/filter/ResourceFilterTest.java
@@ -19,7 +19,7 @@
 import java.util.stream.Collectors;
 
 import org.apache.sling.api.resource.Resource;
-import org.apache.sling.resource.filter.impl.ResourceFilterImpl;
+import org.apache.sling.resource.filter.impl.ResourcePredicateImpl;
 import org.apache.sling.testing.mock.sling.junit.SlingContext;
 import org.junit.Before;
 import org.junit.Rule;
@@ -34,7 +34,7 @@
 
     private Resource resource;
     
-    ResourceFilter resourceFilter = new ResourceFilterImpl();
+    ResourcePredicates resourceFilter = new ResourcePredicateImpl();
 
     @Before
     public void setUp() {
