diff --git a/src/main/java/org/apache/sling/resource/filter/ResourceFilter.java b/src/main/java/org/apache/sling/resource/filter/ResourceFilter.java
index 1bfc71e..a204ec5 100644
--- a/src/main/java/org/apache/sling/resource/filter/ResourceFilter.java
+++ b/src/main/java/org/apache/sling/resource/filter/ResourceFilter.java
@@ -31,7 +31,7 @@
 
     /**
      * Add a series of key - value pairs that can then be evaluated as part of the
-     * ScriptFilter
+     * filter creation
      * 
      * @param params
      * @return
@@ -39,7 +39,8 @@
     public abstract ResourceFilter addParams(Map<String, Object> params);
 
     /**
-     * Add a key - value pair that can then be evaluated as part of the Script
+     * Add a key - value pair that can then be evaluated as part of the filter
+     * creation
      * 
      * @param params
      * @return
diff --git a/src/main/java/org/apache/sling/resource/filter/ResourceFilterException.java b/src/main/java/org/apache/sling/resource/filter/ResourceFilterException.java
index cc36917..e06e2cd 100644
--- a/src/main/java/org/apache/sling/resource/filter/ResourceFilterException.java
+++ b/src/main/java/org/apache/sling/resource/filter/ResourceFilterException.java
@@ -24,9 +24,6 @@
         super(cause);
     }
 
-    /**
-     * 
-     */
     private static final long serialVersionUID = 5893818236312416308L;
 
 
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 b40cebc..ae86dd4 100644
--- a/src/main/java/org/apache/sling/resource/filter/ResourceFilterStream.java
+++ b/src/main/java/org/apache/sling/resource/filter/ResourceFilterStream.java
@@ -1,33 +1,38 @@
 /*
- * 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
+ * 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
+ * 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.
+ * 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 java.util.stream.Stream;
 
 import org.apache.sling.api.resource.Resource;
+import org.apache.sling.resource.filter.ResourceFilterStream;
 import org.apache.sling.resource.filter.impl.script.ParseException;
 
-public abstract class ResourceFilterStream extends ResourceStream {
+/**
+ * Creates a {@link Predicate} of type {@link Resource} to identify matching
+ * Resource objects
+ *
+ */
+public class ResourceFilterStream extends ResourceStream {
 
-    public ResourceFilterStream(Resource resource) {
+    private ResourceFilter resourceFilter;
+
+    public ResourceFilterStream(Resource resource, ResourceFilter filter) {
         super(resource);
+        this.resourceFilter = filter;
     }
 
     /**
@@ -39,7 +44,9 @@
      * @return ResourceStream
      * @throws ParseException
      */
-    public abstract Stream<Resource> stream(String branchSelector) throws ResourceFilterException;
+    public Stream<Resource> stream(String branchSelector) throws ResourceFilterException {
+        return stream(resourceFilter.parse(branchSelector));
+    }
 
     /**
      * Creates a Stream<Resource> using the branchSelector to create the traversal
@@ -52,44 +59,57 @@
      * @return ResourceStream
      * @throws ParseException
      */
-    public abstract Stream<Resource> stream(String text, String charEncoding) throws ResourceFilterException;
-    
+    public Stream<Resource> stream(String branchSelector, String charEncoding) throws ResourceFilterException {
+        return stream(resourceFilter.parse(branchSelector, charEncoding));
+    }
 
     /**
      * Provides a stream of the child resources filtered by the child selector
      * 
      * @param childSelector
      * @return
-     * @throws ResourceFilterException 
+     * @throws ResourceFilterException
      * @throws ParseException
      */
-    public abstract Stream<Resource> listChildren(String text) throws ResourceFilterException;
+    public Stream<Resource> listChildren(String childSelector) throws ResourceFilterException {
+        return listChildren(resourceFilter.parse(childSelector));
+    }
 
     /**
      * Provides a stream of the child resources filtered by the child selector
      * 
-     * @param childSelector text based definition of the Predicate to use
+     * @param childSelector
+     *            text based definition of the Predicate to use
      * @param charEncoding
      *            char encoding of the branch selector String
      * @return
-     * @throws ResourceFilterException 
+     * @throws ResourceFilterException
      * @throws ParseException
      */
-    public abstract Stream<Resource> listChildren(String text, String charEncoding) throws ResourceFilterException;
-    
-    /**
-     * Add a series of key - value pairs that can then be evaluated as part of the ScriptFilter
-     * 
-     * @param params
-     * @return
-     */
-    public abstract ResourceFilterStream addParams(Map<String,Object> params);
-    
+    public Stream<Resource> listChildren(String childSelector, String charEncoding) throws ResourceFilterException {
+        return listChildren(resourceFilter.parse(childSelector, charEncoding));
+    }
+
     /**
      * Add a key - value pair that can then be evaluated as part of the Script
      * 
      * @param params
      * @return
      */
-    public abstract ResourceFilterStream addParam(String key, Object value);
-}
\ No newline at end of file
+    public ResourceFilterStream addParam(String key, Object value) {
+        resourceFilter.addParam(key, value);
+        return this;
+    }
+
+    /**
+     * Add a series of key - value pairs that can then be evaluated as part of the
+     * ScriptFilter
+     * 
+     * @param params
+     * @return
+     */
+    public ResourceFilterStream addParams(Map<String, Object> params) {
+        resourceFilter.addParams(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 829a4fa..9f490fa 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,8 @@
 
 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.ResourceFilterProvider;
+import org.apache.sling.resource.filter.ResourceFilterStream;
 import org.osgi.service.component.annotations.Component;
 import org.osgi.service.component.annotations.Reference;
 
@@ -29,13 +30,13 @@
 public class ResourceFilterAdapter implements AdapterFactory {
     
     @Reference
-    private volatile ResourceFilter filter;
+    private volatile ResourceFilterProvider filter;
 
     @SuppressWarnings("unchecked")
     @Override
     public <T> T getAdapter(Object adaptable, Class<T> type) {
         if (adaptable instanceof Resource) {
-            return (T) new ResourceFilterStreamImpl((Resource)adaptable, filter);
+            return (T) new ResourceFilterStream((Resource)adaptable, filter.getResourceFilter());
         }
         return null;
     }
diff --git a/src/main/java/org/apache/sling/resource/filter/impl/ResourceFilterStreamImpl.java b/src/main/java/org/apache/sling/resource/filter/impl/ResourceFilterStreamImpl.java
deleted file mode 100644
index 51d945a..0000000
--- a/src/main/java/org/apache/sling/resource/filter/impl/ResourceFilterStreamImpl.java
+++ /dev/null
@@ -1,101 +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.util.Map;
-import java.util.function.Predicate;
-import java.util.stream.Stream;
-
-import org.apache.sling.api.resource.Resource;
-import org.apache.sling.resource.filter.ResourceFilter;
-import org.apache.sling.resource.filter.ResourceFilterException;
-import org.apache.sling.resource.filter.ResourceFilterStream;
-import org.apache.sling.resource.filter.impl.script.ParseException;
-
-/**
- * Creates a {@link Predicate} of type {@link Resource} to identify matching
- * Resource objects
- *
- */
-public class ResourceFilterStreamImpl extends ResourceFilterStream {
-
-    private ResourceFilter resourceFilter;
-
-    public ResourceFilterStreamImpl(Resource resource, ResourceFilter filter) {
-        super(resource);
-        this.resourceFilter = filter;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * org.apache.sling.resource.filter.ResourceFilterStream#addArgument(java.lang.
-     * String, java.lang.Object)
-     */
-    public ResourceFilterStream addArgument(String key, Object value) {
-        resourceFilter.addParam(key, value);
-        return this;
-    }
-
-    @Override
-    public Stream<Resource> stream(String branchSelector) throws ResourceFilterException {
-        return stream(resourceFilter.parse(branchSelector));
-    }
-
-    @Override
-    public Stream<Resource> stream(String branchSelector, String charEncoding) throws ResourceFilterException {
-        return stream(resourceFilter.parse(branchSelector, charEncoding));
-    }
-
-    @Override
-    public ResourceFilterStream addParams(Map<String, Object> params) {
-        resourceFilter.addParams(params);
-        return this;
-    }
-
-    /**
-     * Provides a stream of the child resources filtered by the child selector
-     * 
-     * @param childSelector
-     * @return
-     * @throws ResourceFilterException
-     * @throws ParseException
-     */
-    public Stream<Resource> listChildren(String childSelector) throws ResourceFilterException {
-        return listChildren(resourceFilter.parse(childSelector));
-    }
-
-    /**
-     * Provides a stream of the child resources filtered by the child selector
-     * 
-     * @param childSelector
-     *            text based definition of the Predicate to use
-     * @param charEncoding
-     *            char encoding of the branch selector String
-     * @return
-     * @throws ResourceFilterException
-     * @throws ParseException
-     */
-    public Stream<Resource> listChildren(String childSelector, String charEncoding) throws ResourceFilterException {
-        return listChildren(resourceFilter.parse(childSelector,charEncoding));
-    }
-
-    @Override
-    public ResourceFilterStream addParam(String key, Object value) {
-        resourceFilter.addParam(key, value);
-        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 996d16e..3d7efee 100644
--- a/src/test/java/org/apache/sling/resource/filter/ResourceFilterArgTest.java
+++ b/src/test/java/org/apache/sling/resource/filter/ResourceFilterArgTest.java
@@ -25,7 +25,6 @@
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.resource.filter.impl.ResourceFilterImpl;
 import org.apache.sling.resource.filter.impl.ResourceFilterProviderImpl;
-import org.apache.sling.resource.filter.impl.ResourceFilterStreamImpl;
 import org.apache.sling.testing.mock.sling.junit.SlingContext;
 import org.junit.Before;
 import org.junit.Rule;
@@ -46,7 +45,7 @@
         context.load().json("/data.json", "/content/sample/en");
         context.registerService(new ResourceFilterProviderImpl());
         resource = context.resourceResolver().getResource(START_PATH);
-        context.registerAdapter(Resource.class, ResourceFilterStream.class, new ResourceFilterStreamImpl(resource,new ResourceFilterImpl()));
+        context.registerAdapter(Resource.class, ResourceFilterStream.class, new ResourceFilterStream(resource,new ResourceFilterImpl()));
     }
 
     @Test
