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 f3f2802..dcc6aba 100644
--- a/src/main/java/org/apache/sling/resource/filter/ResourceFilter.java
+++ b/src/main/java/org/apache/sling/resource/filter/ResourceFilter.java
@@ -32,7 +32,7 @@
      * @return
      * @throws ResourceFilterException
      */
-    public Predicate<Resource> parse(String filter) throws ResourceFilterException;
+    public Predicate<Resource> parse(String filter);
 
     /**
      * Creates a Predicate<Resource> based on the script
@@ -42,7 +42,7 @@
      * @return
      * @throws ResourceFilterException
      */
-    public Predicate<Resource> parse(String filter, String charEncoding) 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
diff --git a/src/main/java/org/apache/sling/resource/filter/ResourceFilterException.java b/src/main/java/org/apache/sling/resource/filter/ResourceFilterException.java
deleted file mode 100644
index 99db709..0000000
--- a/src/main/java/org/apache/sling/resource/filter/ResourceFilterException.java
+++ /dev/null
@@ -1,35 +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;
-
-/**
- * Used to wrap internally generated Parser exceptions when a malformed script
- * is provided
- * 
- *
- */
-public class ResourceFilterException extends Exception {
-
-    public ResourceFilterException(Throwable cause) {
-        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 e2dd9d8..6e7e9c6 100644
--- a/src/main/java/org/apache/sling/resource/filter/ResourceFilterStream.java
+++ b/src/main/java/org/apache/sling/resource/filter/ResourceFilterStream.java
@@ -49,7 +49,7 @@
      * @return ResourceStreamFilter
      * @throws ResourceFilterException
      */
-    public ResourceFilterStream setBranchSelector(String branchSelector) throws ResourceFilterException {
+    public ResourceFilterStream setBranchSelector(String branchSelector) {
         this.branchSelector = resourceFilter.parse(branchSelector);
         return this;
     }
@@ -63,7 +63,7 @@
      * @return ResourceStreamFilter
      * @throws ResourceFilterException
      */
-    public ResourceFilterStream setChildSelector(String childSelector) throws ResourceFilterException {
+    public ResourceFilterStream setChildSelector(String childSelector) {
         this.childSelector = resourceFilter.parse(childSelector);
         return this;
     }
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
index 3f5a160..7aa51bf 100644
--- a/src/main/java/org/apache/sling/resource/filter/impl/ResourceFilterImpl.java
+++ b/src/main/java/org/apache/sling/resource/filter/impl/ResourceFilterImpl.java
@@ -19,7 +19,6 @@
 
 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.impl.node.Node;
 import org.apache.sling.resource.filter.impl.script.FilterParser;
 import org.apache.sling.resource.filter.impl.script.ParseException;
@@ -58,26 +57,26 @@
     
     
     @Override
-    public Predicate<Resource> parse(String filter) throws ResourceFilterException {
+    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 ResourceFilterException(e);
+            throw new IllegalArgumentException(e);
         }
     }
 
 
 
     @Override
-    public Predicate<Resource> parse(String filter, String charEncoding) throws ResourceFilterException {
+    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 ResourceFilterException(e);
+            throw new IllegalArgumentException(e);
         }
     }
 
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 cfd1a87..bdc4a63 100644
--- a/src/test/java/org/apache/sling/resource/filter/ResourceFilterDateTest.java
+++ b/src/test/java/org/apache/sling/resource/filter/ResourceFilterDateTest.java
@@ -44,7 +44,7 @@
     }
 
     @Test
-    public void testPropLessThanDateFunction() throws ResourceFilterException {
+    public void testPropLessThanDateFunction() {
         String query = "[jcr:content/created] < date('2013-08-08T16:32:59.000+02:00')";
         List<Resource> found = handle(START_PATH, query);
         assertEquals(3, found.size());
@@ -98,7 +98,7 @@
         assertEquals(4, found.size());
     }
 
-    private List<Resource> handle(String path, String filter) throws ResourceFilterException {
+    private List<Resource> handle(String path, String filter) {
         return new ResourceStream(resource).stream(r -> true).filter(resourceFilter.parse(filter))
                 .collect(Collectors.toList());
     }
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 f1b9dd8..aad9a37 100644
--- a/src/test/java/org/apache/sling/resource/filter/ResourceFilterLogicTest.java
+++ b/src/test/java/org/apache/sling/resource/filter/ResourceFilterLogicTest.java
@@ -44,7 +44,7 @@
     }
 
     @Test
-    public void testDateAndProperty() throws ResourceFilterException {
+    public void testDateAndProperty() {
         String query = "[jcr:content/created] > '2013-08-08T16:32:59' and [jcr:content/jcr:title] == 'Mongolian'";
         List<Resource> found = handle(START_PATH, query);
         assertEquals(1, found.size());
@@ -62,7 +62,7 @@
         assertEquals(4, found.size());
     }
 
-    private List<Resource> handle(String path, String filter) throws  ResourceFilterException {
+    private List<Resource> handle(String path, String filter)  {
         return new ResourceStream(resource).stream(r -> true).filter(resourceFilter.parse(filter))
                 .collect(Collectors.toList());
     }
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 04a527b..781bdbd 100644
--- a/src/test/java/org/apache/sling/resource/filter/ResourceFilterTest.java
+++ b/src/test/java/org/apache/sling/resource/filter/ResourceFilterTest.java
@@ -32,82 +32,81 @@
 
     private static String START_PATH = "/content/sample/en";
 
-
     private Resource resource;
     
     ResourceFilter resourceFilter = new ResourceFilterImpl();
 
     @Before
-    public void setUp() throws ResourceFilterException {
+    public void setUp() {
         context.load().json("/data.json", "/content/sample/en");
         resource = context.resourceResolver().getResource(START_PATH);
     }
 
     @Test
-    public void testPropertyEquals() throws ResourceFilterException {
+    public void testPropertyEquals() {
         String query = "[jcr:content/jcr:title] == 'English'";
         List<Resource> found = handle(START_PATH, query);
         assertEquals(4, found.size());
     }
 
     @Test
-    public void testPropertyIs() throws ResourceFilterException {
+    public void testPropertyIs() {
         String query = "[jcr:content/jcr:title] is 'English'";
         List<Resource> found = handle(START_PATH, query);
         assertEquals(4, found.size());
     }
 
     @Test
-    public void testDateBeforeValue() throws ResourceFilterException {
+    public void testDateBeforeValue() {
         String query = "[jcr:content/created] < date('2013-08-08T16:32:59.000+02:00')";
         List<Resource> found = handle(START_PATH, query);
         assertEquals(3, found.size());
     }
 
     @Test
-    public void testDateBeforeValue2() throws ResourceFilterException {
+    public void testDateBeforeValue2() {
         String query = "[jcr:content/created] less than date('2013-08-08T16:32:59.000+02:00')";
         List<Resource> found = handle(START_PATH, query);
         assertEquals(3, found.size());
     }
 
     @Test
-    public void testDateBeforeValue3() throws ResourceFilterException {
+    public void testDateBeforeValue3() {
         String query = "[jcr:content/created] < date('2013-08-08','yyyy-MM-dd')";
         List<Resource> found = handle(START_PATH, query);
         assertEquals(3, found.size());
     }
 
     @Test
-    public void testDateAndProperty() throws ResourceFilterException {
+    public void testDateAndProperty() {
         String query = "[jcr:content/created] < date('2013-08-08T16:32:59.000+02:00') and [jcr:content/jcr:title] == 'English'";
         List<Resource> found = handle(START_PATH, query);
         assertEquals(3, found.size());
     }
 
     @Test
-    public void testDateAndPropertyTwice() throws ResourceFilterException {
+    public void testDateAndPropertyTwice() {
         String query = "([jcr:content/created] < date('2013-08-08T16:32:59.000+02:00') and [jcr:content/jcr:title] == 'English') or [jcr:content/jcr:title] == 'Mongolian'";
         List<Resource> found = handle(START_PATH, query);
         assertEquals(4, found.size());
     }
 
     @Test
-    public void testDateOrProperty() throws ResourceFilterException {
+    public void testDateOrProperty() {
         String query = "[jcr:content/created] < date('2013-08-08T16:32:59.000+02:00') or [jcr:content/jcr:title] == 'Mongolian'";
         List<Resource> found = handle(START_PATH, query);
         assertEquals(4, found.size());
     }
 
     @Test
-    public void testDateAsString() throws ResourceFilterException {
+    public void testDateAsString() {
         String query = "[jcr:content/created] < '2013-08-08T16:32'";
         List<Resource> found = handle(START_PATH, query);
         assertEquals(3, found.size());
     }
 
     @Test
-    public void testNullPropertyAndLimit() throws ResourceFilterException {
+    public void testNullPropertyAndLimit() {
         String query = "[jcr:content/foo] == null ";
         List<Resource> found = new ResourceStream(resource).stream(r -> true).filter(resourceFilter.parse(query)).limit(3)
                 .collect(Collectors.toList());
@@ -115,145 +114,145 @@
     }
 
     @Test
-    public void testNullProperty() throws ResourceFilterException {
+    public void testNullProperty() {
         String query = "[jcr:content/foo] == null ";
         List<Resource> found = handle(START_PATH, query);
         assertEquals(20, found.size());
     }
 
     @Test
-    public void testNumberLiteral() throws ResourceFilterException {
+    public void testNumberLiteral() {
         String query = "[count] < 2 ";
         List<Resource> found = handle(START_PATH, query);
         assertEquals(1, found.size());
     }
 
     @Test
-    public void testNumberLiteral2() throws ResourceFilterException {
+    public void testNumberLiteral2() {
         String query = "[count] < 2 or [count] > 1";
         List<Resource> found = handle(START_PATH, query);
         assertEquals(1, found.size());
     }
 
     @Test
-    public void testNumberLiteral3() throws ResourceFilterException {
+    public void testNumberLiteral3() {
         String query = "[views] < 7 ";
         List<Resource> found = handle(START_PATH, query);
         assertEquals(1, found.size());
     }
 
     @Test
-    public void testNotNullProperty() throws ResourceFilterException {
+    public void testNotNullProperty() {
         String query = "[layout] != null ";
         List<Resource> found = handle(START_PATH, query);
         assertEquals(5, found.size());
     }
 
     @Test
-    public void testNotProperty() throws ResourceFilterException {
+    public void testNotProperty() {
         String query = "[layout] != 'foo' ";
         List<Resource> found = handle(START_PATH, query);
         assertEquals(4, found.size());
     }
 
     @Test
-    public void testNameFunctionIs() throws ResourceFilterException {
+    public void testNameFunctionIs() {
         String query = "name() == 'testpage1'";
         List<Resource> found = handle(START_PATH, query);
         assertEquals(1, found.size());
     }
 
     @Test
-    public void testNameFunctionAgainstRegex() throws ResourceFilterException {
+    public void testNameFunctionAgainstRegex() {
         String query = "name() like 'testpage.*'";
         List<Resource> found = handle(START_PATH, query);
         assertEquals(4, found.size());
     }
 
     @Test
-    public void testNameFunctionAgainstRegex2() throws ResourceFilterException {
+    public void testNameFunctionAgainstRegex2() {
         String query = "name() like 'testpage[1-2]'";
         List<Resource> found = handle(START_PATH, query);
         assertEquals(2, found.size());
     }
 
     @Test
-    public void testChildExistence() throws ResourceFilterException {
+    public void testChildExistence() {
         String query = "name() == 'testpage3' ";
         List<Resource> found = handle(START_PATH, query);
         assertEquals(1, found.size());
     }
 
     @Test
-    public void testBoolean() throws ResourceFilterException {
+    public void testBoolean() {
         String query = "[published] == true";
         List<Resource> found = handle(START_PATH, query);
         assertEquals(1, found.size());
     }
 
     @Test
-    public void testContains() throws ResourceFilterException {
+    public void testContains() {
         String query = "[jcr:content/monkey] contains 'fish'";
         List<Resource> found = handle(START_PATH, query);
         assertEquals(1, found.size());
     }
 
     @Test
-    public void testContainsNot() throws ResourceFilterException {
+    public void testContainsNot() {
         String query = "[jcr:content/monkey] contains not 'fish'";
         List<Resource> found = handle(START_PATH, query);
         assertEquals(19, found.size());
     }
 
     @Test
-    public void testIn() throws ResourceFilterException {
+    public void testIn() {
         String query = "'fish' in [jcr:content/monkey]";
         List<Resource> found = handle(START_PATH, query);
         assertEquals(1, found.size());
     }
 
     @Test
-    public void testPathLike() throws ResourceFilterException {
+    public void testPathLike() {
         String query = "path() like '/content/sample/en/testpage1.*'";
         List<Resource> found = handle(START_PATH, query);
         assertEquals(4, found.size());
     }
 
     @Test
-    public void testPathLike2() throws ResourceFilterException {
+    public void testPathLike2() {
         String query = "path() like '/content/sample/en/testpage1'";
         List<Resource> found = handle(START_PATH, query);
         assertEquals(1, found.size());
     }
 
     @Test
-    public void testPathLike3() throws ResourceFilterException {
+    public void testPathLike3() {
         String query = "path() is '/content/sample/en/testpage1'";
         List<Resource> found = handle(START_PATH, query);
         assertEquals(1, found.size());
     }
 
     @Test
-    public void testNotIn() throws ResourceFilterException {
+    public void testNotIn() {
         String query = "'fish' not in [jcr:content/monkey]";
         List<Resource> found = handle(START_PATH, query);
         assertEquals(19, found.size());
     }
 
     @Test
-    public void testInNotException() throws ResourceFilterException {
-        ResourceFilterException error = null;
+    public void testInNotException() {
+        IllegalArgumentException error = null;
         try {
             String query = "'fish' in not [jcr:content/monkey]";
             handle(START_PATH, query);
-        } catch (ResourceFilterException e) {
+        } catch (IllegalArgumentException e) {
             error = e;
         }
         assert (error.getMessage()
                 .startsWith("org.apache.sling.resource.filter.impl.script.ParseException: Encountered \" <PROPERTY> \"jcr:content/monkey \"\" at line 1, column 15."));
     }
 
-    private List<Resource> handle(String path, String filter) throws ResourceFilterException {
+    private List<Resource> handle(String path, String filter) {
         return new ResourceStream(resource).stream(r -> true).filter(resourceFilter.parse(filter))
                 .collect(Collectors.toList());
     }
