diff --git a/src/main/java/org/apache/sling/resource/filter/api/Context.java b/src/main/java/org/apache/sling/resource/filter/api/Context.java
index 4e90f2a..4a0bb8c 100644
--- a/src/main/java/org/apache/sling/resource/filter/api/Context.java
+++ b/src/main/java/org/apache/sling/resource/filter/api/Context.java
@@ -22,22 +22,78 @@
 
 public interface Context {
 
+    /**
+     * Adds a Function to the script to allow for customization. 
+     * 
+     * 
+     * @param name
+     *            of the function as it appears in the script
+     * @param functionImpl
+     *            defines the function in terms of passed in arguments, the resource
+     *            that is being acted on and the return object
+     * @return this Context
+     */
     Context addFunction(String name, BiFunction<Object[], Resource, Object> functionImpl);
 
+    /**
+     * Remove the function with the given name from the context.
+     * 
+     * @param name
+     * @return
+     */
     Context removeFunction(String name);
 
+    /**
+     * 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 addArgument(String name, Object object);
 
+    /**
+     * Retrieve the currently defined Logic Visitor 
+     * 
+     * @return Visitor
+     */
     Visitor<Predicate<Resource>> getLogicVisitor();
 
+    /**
+     * Retrieve the currently defined Comparison Visitor 
+     * 
+     * @return Visitor
+     */
     Visitor<Function<Resource, Object>> getComparisonVisitor();
 
+    /**
+     * Replaces the existing Logic Visitor, if present, with the provided Visitor
+     * 
+     * @param Visitor
+     */
     void setLogicVisitor(Visitor<Predicate<Resource>> logicVisitor);
 
+    /**
+     * Replaces the existing Comparison Visitor, if present, with the provided Visitor
+     * 
+     * @param comparisonVisitor
+     */
     void setComparionVisitor(Visitor<Function<Resource, Object>> comparisonVisitor);
 
-    Optional<BiFunction<Object[], Resource, Object>> getFunction(String text);
+    /**
+     * Used to retrieve the function during script processing
+     * 
+     * @param name of the function in the context
+     * @return Optional BiFunction object representing the name
+     */
+    Optional<BiFunction<Object[], Resource, Object>> getFunction(String name);
 
-    Optional<Object> getArgument(String text);
+    /**
+     * Retrieves the value object associated with the name
+     * 
+     * @param name of the argument
+     * @return Optional object represented by the name
+     */
+    Optional<Object> getArgument(String name);
 
 }
diff --git a/src/main/java/org/apache/sling/resource/filter/api/ResourceFilterFactory.java b/src/main/java/org/apache/sling/resource/filter/api/ResourceFilterFactory.java
deleted file mode 100644
index c9e2fb0..0000000
--- a/src/main/java/org/apache/sling/resource/filter/api/ResourceFilterFactory.java
+++ /dev/null
@@ -1,22 +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.api;
-
-import org.apache.sling.resource.filter.ResourceFilter;
-
-public interface ResourceFilterFactory {
-
-    ResourceFilter getResourceFilter(String script);
-
-}
diff --git a/src/main/java/org/apache/sling/resource/filter/api/ResourceFilterFunction.java b/src/main/java/org/apache/sling/resource/filter/api/ResourceFilterFunction.java
index 1633bc1..b633fbf 100644
--- a/src/main/java/org/apache/sling/resource/filter/api/ResourceFilterFunction.java
+++ b/src/main/java/org/apache/sling/resource/filter/api/ResourceFilterFunction.java
@@ -18,9 +18,8 @@
 import org.apache.sling.api.resource.Resource;
 
 /**
- * A CustomFilterFunction implementation is used to translate a command in a
- * script or an Object that is a result of a custom function. Into a value that
- * is used for Comparison
+ * A ResourceFilterFunction implementation is used to translate a command in a
+ * script to a value object that will be used as part of a comparison
  * 
  */
 public interface ResourceFilterFunction extends BiFunction<Object[], Resource, Object> {
@@ -37,11 +36,5 @@
      */
     Object apply(Object[] arguments, Resource resource);
 
-    /**
-     * Allows the name of the function to be defined
-     * 
-     * @return name to be used in the script
-     */
-    String getName();
 
 }
diff --git a/src/main/java/org/apache/sling/resource/filter/api/impl/ComparisonVisitor.java b/src/main/java/org/apache/sling/resource/filter/api/impl/ComparisonVisitor.java
index 43f42a8..fe85f03 100644
--- a/src/main/java/org/apache/sling/resource/filter/api/impl/ComparisonVisitor.java
+++ b/src/main/java/org/apache/sling/resource/filter/api/impl/ComparisonVisitor.java
@@ -48,48 +48,13 @@
 
     @Override
     public Function<Resource, Object> visit(Node node) {
-
         switch (node.kind) {
         case FilterParserConstants.FUNCTION_NAME:
-            // will only get here in the case of the 'FUNCTION' switch case
-            switch (node.text) {
-            case "name":
-                return Resource::getName;
-            case "path":
-                return Resource::getPath;
-            case "date":
-                return resource -> {
-                    Object[] arguments = node.visitChildren(this).stream().map(funct -> funct.apply(resource))
-                            .toArray();
-                    return dateHandler(arguments);
-                };
-            default:
-                Optional<BiFunction<Object[], Resource, Object>> temp = context.getFunction(node.text);
-                if (temp.isPresent()) {
-                    final List<Function<Resource, Object>> children2 = node.visitChildren(this);
-                    return resource -> {
-                        Object[] arguments = children2.stream().map(funct -> funct.apply(resource)).toArray();
-                        return temp.get().apply(arguments, resource);
-                    };
-                }
-            }
-            break;
+            return functionHandler(node);
         case FilterParserConstants.NULL:
             return resource -> new Null();
         case FilterParserConstants.NUMBER:
-            Number numericValue = null;
-            String numberText = node.text;
-            try {
-                numericValue = Integer.valueOf(numberText);
-            } catch (NumberFormatException nfe1) {
-                try {
-                    numericValue = new BigDecimal(numberText);
-                } catch (NumberFormatException nfe2) {
-                    // swallow
-                }
-            }
-            final Number numericReply = numericValue;
-            return resource -> numericReply;
+            return resource -> numericHandler(node.text);
         case FilterParserConstants.OFFSETDATETIME:
             return resource -> OffsetDateTime.parse(node.text).toInstant();
         case FilterParserConstants.DATETIME:
@@ -115,7 +80,6 @@
         default:
             return resource -> node.text;
         }
-        return null;
     }
 
     private ValueMap valueMapOf(Resource resource) {
@@ -143,5 +107,45 @@
             return DateTimeFormatter.ISO_OFFSET_DATE_TIME.parse(dateString, OffsetDateTime::from).toInstant();
         }
     }
+    
+    private Function<Resource, Object> functionHandler(Node node){
+        // will only get here in the case of the 'FUNCTION' switch case
+        switch (node.text) {
+        case "name":
+            return Resource::getName;
+        case "path":
+            return Resource::getPath;
+        case "date":
+            return resource -> {
+                Object[] arguments = node.visitChildren(this).stream().map(funct -> funct.apply(resource))
+                        .toArray();
+                return dateHandler(arguments);
+            };
+        default:
+            Optional<BiFunction<Object[], Resource, Object>> temp = context.getFunction(node.text);
+            if (temp.isPresent()) {
+                final List<Function<Resource, Object>> children2 = node.visitChildren(this);
+                return resource -> {
+                    Object[] arguments = children2.stream().map(funct -> funct.apply(resource)).toArray();
+                    return temp.get().apply(arguments, resource);
+                };
+            }
+        }
+        return null;
+    }
+    
+    private static Number numericHandler(String numberText) {
+        Number numericValue = null;
+        try {
+            numericValue = Integer.valueOf(numberText);
+        } catch (NumberFormatException nfe1) {
+            try {
+                numericValue = new BigDecimal(numberText);
+            } catch (NumberFormatException nfe2) {
+                // swallow
+            }
+        }
+        return numericValue;
+    }
 
 }
diff --git a/src/main/java/org/apache/sling/resource/filter/api/impl/ResourceFactoryImpl.java b/src/main/java/org/apache/sling/resource/filter/api/impl/ResourceFactoryImpl.java
deleted file mode 100644
index 5915b67..0000000
--- a/src/main/java/org/apache/sling/resource/filter/api/impl/ResourceFactoryImpl.java
+++ /dev/null
@@ -1,51 +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.api.impl;
-
-import java.util.List;
-
-import org.apache.sling.resource.filter.ResourceFilter;
-import org.apache.sling.resource.filter.api.Context;
-import org.apache.sling.resource.filter.api.ResourceFilterFactory;
-import org.apache.sling.resource.filter.api.ResourceFilterFunction;
-import org.apache.sling.resource.filter.impl.ParseException;
-import org.osgi.service.component.annotations.Component;
-import org.osgi.service.component.annotations.Reference;
-import org.osgi.service.component.annotations.ReferencePolicyOption;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Component(property = { "service.description=ResourceFilter Factory", "service.vendor=The Apache Software Foundation" })
-public class ResourceFactoryImpl implements ResourceFilterFactory {
-
-    @Reference(policyOption=ReferencePolicyOption.GREEDY)
-    List<ResourceFilterFunction> functions;
-
-    protected final Logger log = LoggerFactory.getLogger(getClass());
-
-    @Override
-    public ResourceFilter getResourceFilter(String script) {
-        try {
-            ResourceFilter filter = new ResourceFilter(script);
-            Context context = filter.getContext();
-            for (ResourceFilterFunction func : functions) {
-                context.addArgument(func.getName(), func);
-            }
-        } catch (ParseException e) {
-            log.error(e.getLocalizedMessage());
-        }
-        return null;
-    }
-
-}
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 1fc6cc8..293213a 100644
--- a/src/test/java/org/apache/sling/resource/filter/ResourceFilterTest.java
+++ b/src/test/java/org/apache/sling/resource/filter/ResourceFilterTest.java
@@ -15,15 +15,11 @@
 
 import static org.junit.Assert.assertEquals;
 
-import java.text.SimpleDateFormat;
-import java.util.Date;
 import java.util.List;
 import java.util.function.Predicate;
 import java.util.stream.Collectors;
 
 import org.apache.sling.api.resource.Resource;
-import org.apache.sling.resource.filter.ResourceFilter;
-import org.apache.sling.resource.filter.ResourceStream;
 import org.apache.sling.resource.filter.impl.ParseException;
 import org.apache.sling.testing.mock.sling.junit.SlingContext;
 import org.junit.Before;
@@ -36,7 +32,7 @@
     public final SlingContext context = new SlingContext();
 
     private static String START_PATH = "/content/sample/en";
-    private Date midPoint;
+
 
     private static String DATE_STRING = "Thu Aug 07 2013 16:32:59 GMT+0200";
     private static String NEW_DATE = "2013-08-08T16:32:59.000+02:00";
@@ -45,7 +41,6 @@
     @Before
     public void setUp() throws ParseException, java.text.ParseException {
         context.load().json("/data.json", "/content/sample/en");
-        midPoint = new SimpleDateFormat(DATE_FORMAT).parse(DATE_STRING);
     }
 
     @Test
