diff --git a/src/main/java/org/apache/sling/query/AbstractQuery.java b/src/main/java/org/apache/sling/query/AbstractQuery.java
index 9e3dcb5..0b410c9 100644
--- a/src/main/java/org/apache/sling/query/AbstractQuery.java
+++ b/src/main/java/org/apache/sling/query/AbstractQuery.java
@@ -62,753 +62,827 @@
 @ProviderType
 public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements Iterable<T> {
 
-	protected final List<Function<?, ?>> functions = new ArrayList<>();
+    protected final List<Function<?, ?>> functions = new ArrayList<>();
 
-	private final List<T> initialCollection;
+    private final List<T> initialCollection;
 
-	private final SearchStrategy searchStrategy;
+    private final SearchStrategy searchStrategy;
 
-	private final TreeProvider<T> provider;
+    private final TreeProvider<T> provider;
 
-	AbstractQuery(TreeProvider<T> provider, T[] initialCollection, SearchStrategy strategy) {
-		this.provider = provider;
-		this.initialCollection = new ArrayList<>(Arrays.asList(initialCollection));
-		this.searchStrategy = strategy;
-	}
+    AbstractQuery(TreeProvider<T> provider, T[] initialCollection, SearchStrategy strategy) {
+        this.provider = provider;
+        this.initialCollection = new ArrayList<>(Arrays.asList(initialCollection));
+        this.searchStrategy = strategy;
+    }
 
-	protected AbstractQuery(AbstractQuery<T, Q> original, SearchStrategy searchStrategy) {
-		this.functions.addAll(original.functions);
-		this.initialCollection = new ArrayList<>(original.initialCollection);
-		this.searchStrategy = searchStrategy;
-		this.provider = original.provider;
-	}
+    protected AbstractQuery(AbstractQuery<T, Q> original, SearchStrategy searchStrategy) {
+        this.functions.addAll(original.functions);
+        this.initialCollection = new ArrayList<>(original.initialCollection);
+        this.searchStrategy = searchStrategy;
+        this.provider = original.provider;
+    }
 
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public Iterator<T> iterator() {
-		IteratorToIteratorFunction<T> f = new CompositeFunction<>(functions);
-		Iterator<Option<T>> iterator = f.apply(new OptionDecoratingIterator<>(initialCollection.iterator()));
-		iterator = new EmptyElementFilter<>(iterator);
-		return new OptionStrippingIterator<>(iterator);
-	}
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Iterator<T> iterator() {
+        IteratorToIteratorFunction<T> f = new CompositeFunction<>(functions);
+        Iterator<Option<T>> iterator = f.apply(new OptionDecoratingIterator<>(initialCollection.iterator()));
+        iterator = new EmptyElementFilter<>(iterator);
+        return new OptionStrippingIterator<>(iterator);
+    }
 
-	public Stream<T> stream() {
-		return StreamSupport.stream(this.spliterator(), false);
-	}
+    public Stream<T> stream() {
+        return StreamSupport.stream(this.spliterator(), false);
+    }
 
-	/**
-	 * Include resources to the collection.
-	 * 
-	 * @param resources Resources to include
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q add(T... resources) {
-		return function(new AddFunction<>(Arrays.asList(resources)));
-	}
+    /**
+     * Include resources to the collection.
+     * 
+     * @param resources
+     *            Resources to include
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q add(T... resources) {
+        return function(new AddFunction<>(Arrays.asList(resources)));
+    }
 
-	/**
-	 * Include resources to the collection.
-	 * 
-	 * @param iterable Resources to include
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q add(Iterable<T> iterable) {
-		return function(new AddFunction<>(iterable));
-	}
+    /**
+     * Include resources to the collection.
+     * 
+     * @param iterable
+     *            Resources to include
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q add(Iterable<T> iterable) {
+        return function(new AddFunction<>(iterable));
+    }
 
-	/**
-	 * Transform SlingQuery collection into a lazy list.
-	 * 
-	 * @return List containing all elements from the collection.
-	 */
-	public List<T> asList() {
-		return new LazyList<>(iterator());
-	}
+    /**
+     * Transform SlingQuery collection into a lazy list.
+     * 
+     * @return List containing all elements from the collection.
+     */
+    public List<T> asList() {
+        return new LazyList<>(iterator());
+    }
 
-	/**
-	 * Get list of the children for each Resource in the collection.
-	 * 
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q children() {
-		return function(new ChildrenFunction<>(provider));
-	}
+    /**
+     * Get list of the children for each Resource in the collection.
+     * 
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q children() {
+        return function(new ChildrenFunction<>(provider));
+    }
 
-	/**
-	 * Get list of the children for each Resource in the collection.
-	 * 
-	 * @param filter Children filter
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q children(String filter) {
-		return function(new ChildrenFunction<>(provider), filter);
-	}
+    /**
+     * Get list of the children for each Resource in the collection.
+     * 
+     * @param filter
+     *            Children filter
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q children(String filter) {
+        return function(new ChildrenFunction<>(provider), filter);
+    }
 
-	/**
-	 * Get list of the children for each Resource in the collection.
-	 * 
-	 * @param filter Children filter
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q children(Predicate<T> filter) {
-		return function(new ChildrenFunction<>(provider), filter);
-	}
+    /**
+     * Get list of the children for each Resource in the collection.
+     * 
+     * @param filter
+     *            Children filter
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q children(Predicate<T> filter) {
+        return function(new ChildrenFunction<>(provider), filter);
+    }
 
-	/**
-	 * Get list of the children for each Resource in the collection.
-	 * 
-	 * @param filter Children filter
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q children(Iterable<T> filter) {
-		return function(new ChildrenFunction<>(provider), filter);
-	}
+    /**
+     * Get list of the children for each Resource in the collection.
+     * 
+     * @param filter
+     *            Children filter
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q children(Iterable<T> filter) {
+        return function(new ChildrenFunction<>(provider), filter);
+    }
 
-	/**
-	 * For each Resource in the collection, return the first element matching the selector testing the
-	 * Resource itself and traversing up its ancestors.
-	 * 
-	 * @param selector Ancestor filter
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q closest(String selector) {
-		return closest(parse(selector));
-	}
+    /**
+     * For each Resource in the collection, return the first element matching the
+     * selector testing the Resource itself and traversing up its ancestors.
+     * 
+     * @param selector
+     *            Ancestor filter
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q closest(String selector) {
+        return closest(parse(selector));
+    }
 
-	/**
-	 * For each Resource in the collection, return the first element matching the selector testing the
-	 * Resource itself and traversing up its ancestors.
-	 * 
-	 * @param iterable Ancestor filter
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q closest(Iterable<T> iterable) {
-		return closest(new IterableContainsPredicate<>(iterable, provider));
-	}
+    /**
+     * For each Resource in the collection, return the first element matching the
+     * selector testing the Resource itself and traversing up its ancestors.
+     * 
+     * @param iterable
+     *            Ancestor filter
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q closest(Iterable<T> iterable) {
+        return closest(new IterableContainsPredicate<>(iterable, provider));
+    }
 
-	/**
-	 * For each Resource in the collection, return the first element matching the selector testing the
-	 * Resource itself and traversing up its ancestors.
-	 * 
-	 * @param predicate Ancestor filter
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q closest(Predicate<T> predicate) {
-		return function(new ClosestFunction<>(predicate, provider));
-	}
+    /**
+     * For each Resource in the collection, return the first element matching the
+     * selector testing the Resource itself and traversing up its ancestors.
+     * 
+     * @param predicate
+     *            Ancestor filter
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q closest(Predicate<T> predicate) {
+        return function(new ClosestFunction<>(predicate, provider));
+    }
 
-	/**
-	 * Reduce Resource collection to the one Resource at the given 0-based index.
-	 * 
-	 * @param index 0-based index
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q eq(int index) {
-		return slice(index, index);
-	}
+    /**
+     * Reduce Resource collection to the one Resource at the given 0-based index.
+     * 
+     * @param index
+     *            0-based index
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q eq(int index) {
+        return slice(index, index);
+    }
 
-	/**
-	 * Filter Resource collection using given selector.
-	 * 
-	 * @param selector Selector
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q filter(String selector) {
-		return function(new IdentityFunction<T>(), selector);
-	}
+    /**
+     * Filter Resource collection using given selector.
+     * 
+     * @param selector
+     *            Selector
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q filter(String selector) {
+        return function(new IdentityFunction<T>(), selector);
+    }
 
-	/**
-	 * Filter Resource collection using given predicate object.
-	 * 
-	 * @param predicate Collection filter
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q filter(Predicate<T> predicate) {
-		return function(new FilterFunction<>(predicate));
-	}
+    /**
+     * Filter Resource collection using given predicate object.
+     * 
+     * @param predicate
+     *            Collection filter
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q filter(Predicate<T> predicate) {
+        return function(new FilterFunction<>(predicate));
+    }
 
-	/**
-	 * Filter Resource collection using given iterable.
-	 * 
-	 * @param iterable Collection filter
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q filter(Iterable<T> iterable) {
-		return function(new FilterFunction<>(new IterableContainsPredicate<>(iterable, provider)));
-	}
+    /**
+     * Filter Resource collection using given iterable.
+     * 
+     * @param iterable
+     *            Collection filter
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q filter(Iterable<T> iterable) {
+        return function(new FilterFunction<>(new IterableContainsPredicate<>(iterable, provider)));
+    }
 
-	/**
-	 * For each Resource in collection use depth-first search to return all its descendants. Please notice
-	 * that invoking this method on a Resource being a root of a large subtree may and will cause performance
-	 * problems.
-	 * 
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q find() {
-		return function(new FindFunction<>(searchStrategy, provider, ""));
-	}
+    /**
+     * For each Resource in collection use depth-first search to return all its
+     * descendants. Please notice that invoking this method on a Resource being a
+     * root of a large subtree may and will cause performance problems.
+     * 
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q find() {
+        return function(new FindFunction<>(searchStrategy, provider, ""));
+    }
 
-	/**
-	 * For each Resource in collection use breadth-first search to return all its descendants. Please notice
-	 * that invoking this method on a Resource being a root of a large subtree may and will cause performance
-	 * problems.
-	 * 
-	 * @param selector descendants filter
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q find(String selector) {
-		return function(new FindFunction<>(searchStrategy, provider, selector), selector);
-	}
+    /**
+     * For each Resource in collection use breadth-first search to return all its
+     * descendants. Please notice that invoking this method on a Resource being a
+     * root of a large subtree may and will cause performance problems.
+     * 
+     * @param selector
+     *            descendants filter
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q find(String selector) {
+        return function(new FindFunction<>(searchStrategy, provider, selector), selector);
+    }
 
-	/**
-	 * For each Resource in collection use breadth-first search to return all its descendants. Please notice
-	 * that invoking this method on a Resource being a root of a large subtree may and will cause performance
-	 * problems.
-	 * 
-	 * @param predicate descendants filter
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q find(Predicate<T> predicate) {
-		return function(new FindFunction<>(searchStrategy, provider, ""), predicate);
-	}
+    /**
+     * For each Resource in collection use breadth-first search to return all its
+     * descendants. Please notice that invoking this method on a Resource being a
+     * root of a large subtree may and will cause performance problems.
+     * 
+     * @param predicate
+     *            descendants filter
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q find(Predicate<T> predicate) {
+        return function(new FindFunction<>(searchStrategy, provider, ""), predicate);
+    }
 
-	/**
-	 * For each Resource in collection use breadth-first search to return all its descendants. Please notice
-	 * that invoking this method on a Resource being a root of a large subtree may and will cause performance
-	 * problems.
-	 * 
-	 * @param iterable descendants filter
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q find(Iterable<T> iterable) {
-		return function(new DescendantFunction<>(new LazyList<>(iterable.iterator()), provider));
-	}
+    /**
+     * For each Resource in collection use breadth-first search to return all its
+     * descendants. Please notice that invoking this method on a Resource being a
+     * root of a large subtree may and will cause performance problems.
+     * 
+     * @param iterable
+     *            descendants filter
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q find(Iterable<T> iterable) {
+        return function(new DescendantFunction<>(new LazyList<>(iterable.iterator()), provider));
+    }
 
-	/**
-	 * Filter Resource collection to the first element. Equivalent to {@code eq(0)} or {@code slice(0, 0)}.
-	 * 
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q first() {
-		return eq(0);
-	}
+    /**
+     * Filter Resource collection to the first element. Equivalent to {@code eq(0)}
+     * or {@code slice(0, 0)}.
+     * 
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q first() {
+        return eq(0);
+    }
 
-	/**
-	 * Pick such Resources from the collection that have descendant matching the selector.
-	 * 
-	 * @param selector Descendant selector
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q has(String selector) {
-		return function(new HasFunction<>(selector, searchStrategy, provider));
-	}
+    /**
+     * Pick such Resources from the collection that have descendant matching the
+     * selector.
+     * 
+     * @param selector
+     *            Descendant selector
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q has(String selector) {
+        return function(new HasFunction<>(selector, searchStrategy, provider));
+    }
 
-	/**
-	 * Pick such Resources from the collection that have descendant matching the selector.
-	 * 
-	 * @param predicate Descendant selector
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q has(Predicate<T> predicate) {
-		return function(new HasFunction<>(predicate, searchStrategy, provider));
-	}
+    /**
+     * Pick such Resources from the collection that have descendant matching the
+     * selector.
+     * 
+     * @param predicate
+     *            Descendant selector
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q has(Predicate<T> predicate) {
+        return function(new HasFunction<>(predicate, searchStrategy, provider));
+    }
 
-	/**
-	 * Pick such Resources from the collection that have descendant matching the selector.
-	 * 
-	 * @param iterable Descendant selector
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q has(Iterable<T> iterable) {
-		return function(new HasFunction<>(iterable, provider));
-	}
+    /**
+     * Pick such Resources from the collection that have descendant matching the
+     * selector.
+     * 
+     * @param iterable
+     *            Descendant selector
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q has(Iterable<T> iterable) {
+        return function(new HasFunction<>(iterable, provider));
+    }
 
-	/**
-	 * Filter Resource collection to the last element.
-	 * 
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q last() {
-		return function(new LastFunction<T>());
-	}
+    /**
+     * Filter Resource collection to the last element.
+     * 
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q last() {
+        return function(new LastFunction<T>());
+    }
 
-	/**
-	 * Return the next sibling for each Resource in the collection.
-	 * 
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q next() {
-		return function(new NextFunction<>(provider));
-	}
+    /**
+     * Return the next sibling for each Resource in the collection.
+     * 
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q next() {
+        return function(new NextFunction<>(provider));
+    }
 
-	/**
-	 * Return the next sibling for each Resource in the collection and filter it by a selector. If the next
-	 * sibling doesn't match it, empty collection will be returned.
-	 * 
-	 * @param selector Next sibling filter
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q next(String selector) {
-		return function(new NextFunction<>(provider), selector);
-	}
+    /**
+     * Return the next sibling for each Resource in the collection and filter it by
+     * a selector. If the next sibling doesn't match it, empty collection will be
+     * returned.
+     * 
+     * @param selector
+     *            Next sibling filter
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q next(String selector) {
+        return function(new NextFunction<>(provider), selector);
+    }
 
-	/**
-	 * Return the next sibling for each Resource in the collection and filter it by a selector. If the next
-	 * sibling doesn't match it, empty collection will be returned.
-	 * 
-	 * @param predicate Next sibling filter
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q next(Predicate<T> predicate) {
-		return function(new NextFunction<>(provider), predicate);
-	}
+    /**
+     * Return the next sibling for each Resource in the collection and filter it by
+     * a selector. If the next sibling doesn't match it, empty collection will be
+     * returned.
+     * 
+     * @param predicate
+     *            Next sibling filter
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q next(Predicate<T> predicate) {
+        return function(new NextFunction<>(provider), predicate);
+    }
 
-	/**
-	 * Return the next sibling for each Resource in the collection and filter it by a selector. If the next
-	 * sibling doesn't match it, empty collection will be returned.
-	 * 
-	 * @param iterable Next sibling filter
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q next(Iterable<T> iterable) {
-		return function(new NextFunction<>(provider), iterable);
-	}
+    /**
+     * Return the next sibling for each Resource in the collection and filter it by
+     * a selector. If the next sibling doesn't match it, empty collection will be
+     * returned.
+     * 
+     * @param iterable
+     *            Next sibling filter
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q next(Iterable<T> iterable) {
+        return function(new NextFunction<>(provider), iterable);
+    }
 
-	/**
-	 * Return all following siblings for each Resource in the collection.
-	 * 
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q nextAll() {
-		return function(new NextFunction<>(new RejectingPredicate<>(), provider));
-	}
+    /**
+     * Return all following siblings for each Resource in the collection.
+     * 
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q nextAll() {
+        return function(new NextFunction<>(new RejectingPredicate<>(), provider));
+    }
 
-	/**
-	 * Return all following siblings for each Resource in the collection, filtering them by a selector.
-	 * 
-	 * @param selector Following siblings filter
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q nextAll(String selector) {
-		return function(new NextFunction<>(new RejectingPredicate<>(), provider), selector);
-	}
+    /**
+     * Return all following siblings for each Resource in the collection, filtering
+     * them by a selector.
+     * 
+     * @param selector
+     *            Following siblings filter
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q nextAll(String selector) {
+        return function(new NextFunction<>(new RejectingPredicate<>(), provider), selector);
+    }
 
-	/**
-	 * Return all following siblings for each Resource in the collection, filtering them by a selector.
-	 * 
-	 * @param predicate Following siblings filter
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q nextAll(Predicate<T> predicate) {
-		return function(new NextFunction<>(new RejectingPredicate<>(), provider), predicate);
-	}
+    /**
+     * Return all following siblings for each Resource in the collection, filtering
+     * them by a selector.
+     * 
+     * @param predicate
+     *            Following siblings filter
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q nextAll(Predicate<T> predicate) {
+        return function(new NextFunction<>(new RejectingPredicate<>(), provider), predicate);
+    }
 
-	/**
-	 * Return all following siblings for each Resource in the collection, filtering them by a selector.
-	 * 
-	 * @param iterable Following siblings filter
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q nextAll(Iterable<T> iterable) {
-		return function(new NextFunction<>(new RejectingPredicate<>(), provider), iterable);
-	}
+    /**
+     * Return all following siblings for each Resource in the collection, filtering
+     * them by a selector.
+     * 
+     * @param iterable
+     *            Following siblings filter
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q nextAll(Iterable<T> iterable) {
+        return function(new NextFunction<>(new RejectingPredicate<>(), provider), iterable);
+    }
 
-	/**
-	 * Return all following siblings for each Resource in the collection up to, but not including, Resource
-	 * matched by a selector.
-	 * 
-	 * @param until Selector marking when the operation should stop
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q nextUntil(String until) {
-		return function(new NextFunction<>(parse(until), provider));
-	}
+    /**
+     * Return all following siblings for each Resource in the collection up to, but
+     * not including, Resource matched by a selector.
+     * 
+     * @param until
+     *            Selector marking when the operation should stop
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q nextUntil(String until) {
+        return function(new NextFunction<>(parse(until), provider));
+    }
 
-	/**
-	 * Return all following siblings for each Resource in the collection up to, but not including, Resource
-	 * matched by a selector.
-	 * 
-	 * @param predicate Selector marking when the operation should stop
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q nextUntil(Predicate<T> predicate) {
-		return function(new NextFunction<>(predicate, provider));
-	}
+    /**
+     * Return all following siblings for each Resource in the collection up to, but
+     * not including, Resource matched by a selector.
+     * 
+     * @param predicate
+     *            Selector marking when the operation should stop
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q nextUntil(Predicate<T> predicate) {
+        return function(new NextFunction<>(predicate, provider));
+    }
 
-	/**
-	 * Return all following siblings for each Resource in the collection up to, but not including, Resource
-	 * matched by a selector.
-	 * 
-	 * @param iterable Selector marking when the operation should stop
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q nextUntil(Iterable<T> iterable) {
-		return nextUntil(new IterableContainsPredicate<>(iterable, provider));
-	}
+    /**
+     * Return all following siblings for each Resource in the collection up to, but
+     * not including, Resource matched by a selector.
+     * 
+     * @param iterable
+     *            Selector marking when the operation should stop
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q nextUntil(Iterable<T> iterable) {
+        return nextUntil(new IterableContainsPredicate<>(iterable, provider));
+    }
 
-	/**
-	 * Remove elements from the collection.
-	 * 
-	 * @param selector Selector used to remove Resources
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q not(String selector) {
-		return function(new NotFunction<>(parse(selector)));
-	}
+    /**
+     * Remove elements from the collection.
+     * 
+     * @param selector
+     *            Selector used to remove Resources
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q not(String selector) {
+        return function(new NotFunction<>(parse(selector)));
+    }
 
-	/**
-	 * Remove elements from the collection.
-	 * 
-	 * @param predicate Selector used to remove Resources
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q not(Predicate<T> predicate) {
-		return function(new FilterFunction<>(new RejectingPredicate<>(predicate)));
-	}
+    /**
+     * Remove elements from the collection.
+     * 
+     * @param predicate
+     *            Selector used to remove Resources
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q not(Predicate<T> predicate) {
+        return function(new FilterFunction<>(new RejectingPredicate<>(predicate)));
+    }
 
-	/**
-	 * Remove elements from the collection.
-	 * 
-	 * @param iterable Selector used to remove Resources
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q not(Iterable<T> iterable) {
-		return not(new IterableContainsPredicate<>(iterable, provider));
-	}
+    /**
+     * Remove elements from the collection.
+     * 
+     * @param iterable
+     *            Selector used to remove Resources
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q not(Iterable<T> iterable) {
+        return not(new IterableContainsPredicate<>(iterable, provider));
+    }
 
-	/**
-	 * Replace each element in the collection with its parent.
-	 * 
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q parent() {
-		return function(new ParentFunction<>(provider));
-	}
+    /**
+     * Replace each element in the collection with its parent.
+     * 
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q parent() {
+        return function(new ParentFunction<>(provider));
+    }
 
-	/**
-	 * For each element in the collection find its all ancestor.
-	 * 
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q parents() {
-		return function(new ParentsFunction<>(new RejectingPredicate<>(), provider));
-	}
+    /**
+     * For each element in the collection find its all ancestor.
+     * 
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q parents() {
+        return function(new ParentsFunction<>(new RejectingPredicate<>(), provider));
+    }
 
-	/**
-	 * For each element in the collection find its all ancestor, filtered by a selector.
-	 * 
-	 * @param selector Parents filter
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q parents(String selector) {
-		return function(new ParentsFunction<>(new RejectingPredicate<>(), provider), selector);
-	}
+    /**
+     * For each element in the collection find its all ancestor, filtered by a
+     * selector.
+     * 
+     * @param selector
+     *            Parents filter
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q parents(String selector) {
+        return function(new ParentsFunction<>(new RejectingPredicate<>(), provider), selector);
+    }
 
-	/**
-	 * For each element in the collection find its all ancestor, filtered by a selector.
-	 * 
-	 * @param predicate Parents filter
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q parents(Predicate<T> predicate) {
-		return function(new ParentsFunction<>(new RejectingPredicate<>(), provider), predicate);
-	}
+    /**
+     * For each element in the collection find its all ancestor, filtered by a
+     * selector.
+     * 
+     * @param predicate
+     *            Parents filter
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q parents(Predicate<T> predicate) {
+        return function(new ParentsFunction<>(new RejectingPredicate<>(), provider), predicate);
+    }
 
-	/**
-	 * For each element in the collection find its all ancestor, filtered by a selector.
-	 * 
-	 * @param iterable Parents filter
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q parents(Iterable<T> iterable) {
-		return function(new ParentsFunction<>(new RejectingPredicate<>(), provider), iterable);
-	}
+    /**
+     * For each element in the collection find its all ancestor, filtered by a
+     * selector.
+     * 
+     * @param iterable
+     *            Parents filter
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q parents(Iterable<T> iterable) {
+        return function(new ParentsFunction<>(new RejectingPredicate<>(), provider), iterable);
+    }
 
-	/**
-	 * For each element in the collection find all of its ancestors until the predicate is met.
-	 * 
-	 * @param until Selector marking when the operation should stop
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q parentsUntil(String until) {
-		return function(new ParentsFunction<>(parse(until), provider));
-	}
+    /**
+     * For each element in the collection find all of its ancestors until the
+     * predicate is met.
+     * 
+     * @param until
+     *            Selector marking when the operation should stop
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q parentsUntil(String until) {
+        return function(new ParentsFunction<>(parse(until), provider));
+    }
 
-	/**
-	 * For each element in the collection find all of its ancestors until the predicate is met.
-	 * 
-	 * @param predicate Selector marking when the operation should stop
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q parentsUntil(Predicate<T> predicate) {
-		return function(new ParentsFunction<>(predicate, provider));
-	}
+    /**
+     * For each element in the collection find all of its ancestors until the
+     * predicate is met.
+     * 
+     * @param predicate
+     *            Selector marking when the operation should stop
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q parentsUntil(Predicate<T> predicate) {
+        return function(new ParentsFunction<>(predicate, provider));
+    }
 
-	/**
-	 * For each element in the collection find all of its ancestors until the predicate is met.
-	 * 
-	 * @param iterable Selector marking when the operation should stop
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q parentsUntil(Iterable<T> iterable) {
-		return parentsUntil(new IterableContainsPredicate<>(iterable, provider));
-	}
+    /**
+     * For each element in the collection find all of its ancestors until the
+     * predicate is met.
+     * 
+     * @param iterable
+     *            Selector marking when the operation should stop
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q parentsUntil(Iterable<T> iterable) {
+        return parentsUntil(new IterableContainsPredicate<>(iterable, provider));
+    }
 
-	/**
-	 * Return the previous sibling for each Resource in the collection.
-	 * 
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q prev() {
-		return function(new PrevFunction<>(provider));
-	}
+    /**
+     * Return the previous sibling for each Resource in the collection.
+     * 
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q prev() {
+        return function(new PrevFunction<>(provider));
+    }
 
-	/**
-	 * Return the previous sibling for each Resource in the collection and filter it by a selector. If the
-	 * previous sibling doesn't match it, empty collection will be returned.
-	 * 
-	 * @param selector Previous sibling filter
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q prev(String selector) {
-		return function(new PrevFunction<>(null, provider), selector);
-	}
+    /**
+     * Return the previous sibling for each Resource in the collection and filter it
+     * by a selector. If the previous sibling doesn't match it, empty collection
+     * will be returned.
+     * 
+     * @param selector
+     *            Previous sibling filter
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q prev(String selector) {
+        return function(new PrevFunction<>(null, provider), selector);
+    }
 
-	/**
-	 * Return the previous sibling for each Resource in the collection and filter it by a selector. If the
-	 * previous sibling doesn't match it, empty collection will be returned.
-	 * 
-	 * @param predicate Previous sibling filter
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q prev(Predicate<T> predicate) {
-		return function(new PrevFunction<>(null, provider), predicate);
-	}
+    /**
+     * Return the previous sibling for each Resource in the collection and filter it
+     * by a selector. If the previous sibling doesn't match it, empty collection
+     * will be returned.
+     * 
+     * @param predicate
+     *            Previous sibling filter
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q prev(Predicate<T> predicate) {
+        return function(new PrevFunction<>(null, provider), predicate);
+    }
 
-	/**
-	 * Return the previous sibling for each Resource in the collection and filter it by a selector. If the
-	 * previous sibling doesn't match it, empty collection will be returned.
-	 * 
-	 * @param iterable Previous sibling filter
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q prev(Iterable<T> iterable) {
-		return function(new PrevFunction<>(null, provider), iterable);
-	}
+    /**
+     * Return the previous sibling for each Resource in the collection and filter it
+     * by a selector. If the previous sibling doesn't match it, empty collection
+     * will be returned.
+     * 
+     * @param iterable
+     *            Previous sibling filter
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q prev(Iterable<T> iterable) {
+        return function(new PrevFunction<>(null, provider), iterable);
+    }
 
-	/**
-	 * Return all previous siblings for each Resource in the collection.
-	 * 
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q prevAll() {
-		return function(new PrevFunction<>(new RejectingPredicate<>(), provider));
-	}
+    /**
+     * Return all previous siblings for each Resource in the collection.
+     * 
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q prevAll() {
+        return function(new PrevFunction<>(new RejectingPredicate<>(), provider));
+    }
 
-	/**
-	 * Return all previous siblings for each Resource in the collection, filtering them by a selector.
-	 * 
-	 * @param selector Previous siblings filter
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q prevAll(String selector) {
-		return function(new PrevFunction<>(new RejectingPredicate<>(), provider), selector);
-	}
+    /**
+     * Return all previous siblings for each Resource in the collection, filtering
+     * them by a selector.
+     * 
+     * @param selector
+     *            Previous siblings filter
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q prevAll(String selector) {
+        return function(new PrevFunction<>(new RejectingPredicate<>(), provider), selector);
+    }
 
-	/**
-	 * Return all previous siblings for each Resource in the collection, filtering them by a selector.
-	 * 
-	 * @param predicate Previous siblings filter
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q prevAll(Predicate<T> predicate) {
-		return function(new PrevFunction<>(new RejectingPredicate<>(), provider), predicate);
-	}
+    /**
+     * Return all previous siblings for each Resource in the collection, filtering
+     * them by a selector.
+     * 
+     * @param predicate
+     *            Previous siblings filter
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q prevAll(Predicate<T> predicate) {
+        return function(new PrevFunction<>(new RejectingPredicate<>(), provider), predicate);
+    }
 
-	/**
-	 * Return all previous siblings for each Resource in the collection, filtering them by a selector.
-	 * 
-	 * @param iterable Previous siblings filter
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q prevAll(Iterable<T> iterable) {
-		return function(new PrevFunction<>(new RejectingPredicate<>(), provider), iterable);
-	}
+    /**
+     * Return all previous siblings for each Resource in the collection, filtering
+     * them by a selector.
+     * 
+     * @param iterable
+     *            Previous siblings filter
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q prevAll(Iterable<T> iterable) {
+        return function(new PrevFunction<>(new RejectingPredicate<>(), provider), iterable);
+    }
 
-	/**
-	 * Return all previous siblings for each Resource in the collection up to, but not including, Resource
-	 * matched by a selector.
-	 * 
-	 * @param until Selector marking when the operation should stop
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q prevUntil(String until) {
-		return function(new PrevFunction<>(parse(until), provider));
-	}
+    /**
+     * Return all previous siblings for each Resource in the collection up to, but
+     * not including, Resource matched by a selector.
+     * 
+     * @param until
+     *            Selector marking when the operation should stop
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q prevUntil(String until) {
+        return function(new PrevFunction<>(parse(until), provider));
+    }
 
-	/**
-	 * Return all previous siblings for each Resource in the collection up to, but not including, Resource
-	 * matched by a selector.
-	 * 
-	 * @param predicate Selector marking when the operation should stop
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q prevUntil(Predicate<T> predicate) {
-		return function(new PrevFunction<>(predicate, provider));
-	}
+    /**
+     * Return all previous siblings for each Resource in the collection up to, but
+     * not including, Resource matched by a selector.
+     * 
+     * @param predicate
+     *            Selector marking when the operation should stop
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q prevUntil(Predicate<T> predicate) {
+        return function(new PrevFunction<>(predicate, provider));
+    }
 
-	/**
-	 * Return all previous siblings for each Resource in the collection up to, but not including, Resource
-	 * matched by a selector.
-	 * 
-	 * @param iterable Selector marking when the operation should stop
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q prevUntil(Iterable<T> iterable) {
-		return prevUntil(new IterableContainsPredicate<>(iterable, provider));
-	}
+    /**
+     * Return all previous siblings for each Resource in the collection up to, but
+     * not including, Resource matched by a selector.
+     * 
+     * @param iterable
+     *            Selector marking when the operation should stop
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q prevUntil(Iterable<T> iterable) {
+        return prevUntil(new IterableContainsPredicate<>(iterable, provider));
+    }
 
-	/**
-	 * Set new search strategy, which will be used in {@link AbstractQuery#find()} and
-	 * {@link AbstractQuery#has(String)} functions.
-	 * 
-	 * @param strategy Search strategy type
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q searchStrategy(SearchStrategy strategy) {
-		return clone(this, strategy);
-	}
+    /**
+     * Set new search strategy, which will be used in {@link AbstractQuery#find()}
+     * and {@link AbstractQuery#has(String)} functions.
+     * 
+     * @param strategy
+     *            Search strategy type
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q searchStrategy(SearchStrategy strategy) {
+        return clone(this, strategy);
+    }
 
-	/**
-	 * Return siblings for the given Ts.
-	 * 
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q siblings() {
-		return siblings("");
-	}
+    /**
+     * Return siblings for the given Ts.
+     * 
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q siblings() {
+        return siblings("");
+    }
 
-	/**
-	 * Return siblings for the given Resources filtered by a selector.
-	 * 
-	 * @param selector Siblings filter
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q siblings(String selector) {
-		return function(new SiblingsFunction<>(provider), selector);
-	}
+    /**
+     * Return siblings for the given Resources filtered by a selector.
+     * 
+     * @param selector
+     *            Siblings filter
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q siblings(String selector) {
+        return function(new SiblingsFunction<>(provider), selector);
+    }
 
-	/**
-	 * Return siblings for the given Resources filtered by a selector.
-	 * 
-	 * @param predicate Siblings filter
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q siblings(Predicate<T> predicate) {
-		return function(new SiblingsFunction<>(provider), predicate);
-	}
+    /**
+     * Return siblings for the given Resources filtered by a selector.
+     * 
+     * @param predicate
+     *            Siblings filter
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q siblings(Predicate<T> predicate) {
+        return function(new SiblingsFunction<>(provider), predicate);
+    }
 
-	/**
-	 * Return siblings for the given Resources filtered by a selector.
-	 * 
-	 * @param iterable Siblings filter
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q siblings(Iterable<T> iterable) {
-		return function(new SiblingsFunction<>(provider), iterable);
-	}
+    /**
+     * Return siblings for the given Resources filtered by a selector.
+     * 
+     * @param iterable
+     *            Siblings filter
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q siblings(Iterable<T> iterable) {
+        return function(new SiblingsFunction<>(provider), iterable);
+    }
 
-	/**
-	 * Filter out first {@code from} Resources from the collection.
-	 * 
-	 * @param from How many Resources to cut out
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q slice(int from) {
-		if (from < 0) {
-			throw new IndexOutOfBoundsException();
-		}
-		return function(new SliceFunction<T>(from));
-	}
+    /**
+     * Filter out first {@code from} Resources from the collection.
+     * 
+     * @param from
+     *            How many Resources to cut out
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q slice(int from) {
+        if (from < 0) {
+            throw new IndexOutOfBoundsException();
+        }
+        return function(new SliceFunction<T>(from));
+    }
 
-	/**
-	 * Reduce the collection to a subcollection specified by a given range. Both from and to are inclusive,
-	 * 0-based indices.
-	 * 
-	 * @param from Low endpoint (inclusive) of the subcollection
-	 * @param to High endpoint (inclusive) of the subcollection
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q slice(int from, int to) {
-		if (from < 0) {
-			throw new IndexOutOfBoundsException();
-		}
-		if (from > to) {
-			throw new IllegalArgumentException();
-		}
-		return function(new SliceFunction<T>(from, to));
-	}
+    /**
+     * Reduce the collection to a subcollection specified by a given range. Both
+     * from and to are inclusive, 0-based indices.
+     * 
+     * @param from
+     *            Low endpoint (inclusive) of the subcollection
+     * @param to
+     *            High endpoint (inclusive) of the subcollection
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q slice(int from, int to) {
+        if (from < 0) {
+            throw new IndexOutOfBoundsException();
+        }
+        if (from > to) {
+            throw new IllegalArgumentException();
+        }
+        return function(new SliceFunction<T>(from, to));
+    }
 
-	/**
-	 * Filter out repeated resources. The implementation of this method uses
-	 * a {@link HashSet} to store the processed elements, which may result
-	 * in an increased memory usage for the big collections.
-	 *
-	 * @return new SlingQuery object transformed by this operation
-	 */
-	public Q unique() {
-		return function(new UniqueFunction<>());
-	}
+    /**
+     * Filter out repeated resources. The implementation of this method uses a
+     * {@link HashSet} to store the processed elements, which may result in an
+     * increased memory usage for the big collections.
+     *
+     * @return new SlingQuery object transformed by this operation
+     */
+    public Q unique() {
+        return function(new UniqueFunction<>());
+    }
 
-	private Q function(Function<?, ?> function, Iterable<T> iterable) {
-		Q newQuery = clone(this, this.searchStrategy);
-		newQuery.functions.add(function);
-		newQuery.functions.add(new FilterFunction<>(new IterableContainsPredicate<>(iterable, provider)));
-		return newQuery;
-	}
+    private Q function(Function<?, ?> function, Iterable<T> iterable) {
+        Q newQuery = clone(this, this.searchStrategy);
+        newQuery.functions.add(function);
+        newQuery.functions.add(new FilterFunction<>(new IterableContainsPredicate<>(iterable, provider)));
+        return newQuery;
+    }
 
-	private Q function(Function<?, ?> function, Predicate<T> predicate) {
-		Q newQuery = clone(this, this.searchStrategy);
-		newQuery.functions.add(function);
-		newQuery.functions.add(new FilterFunction<>(predicate));
-		return newQuery;
-	}
+    private Q function(Function<?, ?> function, Predicate<T> predicate) {
+        Q newQuery = clone(this, this.searchStrategy);
+        newQuery.functions.add(function);
+        newQuery.functions.add(new FilterFunction<>(predicate));
+        return newQuery;
+    }
 
-	private Q function(Function<?, ?> function, String selector) {
-		Q newQuery = clone(this, this.searchStrategy);
-		newQuery.functions.add(function);
-		newQuery.functions.add(new SelectorFunction<>(selector, provider, searchStrategy));
-		return newQuery;
-	}
+    private Q function(Function<?, ?> function, String selector) {
+        Q newQuery = clone(this, this.searchStrategy);
+        newQuery.functions.add(function);
+        newQuery.functions.add(new SelectorFunction<>(selector, provider, searchStrategy));
+        return newQuery;
+    }
 
-	private Q function(Function<?, ?> function) {
-		Q newQuery = clone(this, this.searchStrategy);
-		newQuery.functions.add(function);
-		return newQuery;
-	}
+    private Q function(Function<?, ?> function) {
+        Q newQuery = clone(this, this.searchStrategy);
+        newQuery.functions.add(function);
+        return newQuery;
+    }
 
-	private SelectorFunction<T> parse(String selector) {
-		return new SelectorFunction<>(selector, provider, searchStrategy);
-	}
+    private SelectorFunction<T> parse(String selector) {
+        return new SelectorFunction<>(selector, provider, searchStrategy);
+    }
 
-	protected abstract Q clone(AbstractQuery<T, Q> original, SearchStrategy strategy);
+    protected abstract Q clone(AbstractQuery<T, Q> original, SearchStrategy strategy);
 
-	@Override
-	public String toString() {
-		StringBuilder builder = new StringBuilder();
-		builder.append("$(");
-		Iterator<T> iterator = this.iterator();
-		while (iterator.hasNext()) {
-			builder.append('[');
-			builder.append(iterator.next());
-			builder.append(']');
-			if (iterator.hasNext()) {
-				builder.append(", ");
-			}
-		}
-		builder.append(")");
-		return builder.toString();
-	}
+    @Override
+    public String toString() {
+        StringBuilder builder = new StringBuilder();
+        builder.append("$(");
+        Iterator<T> iterator = this.iterator();
+        while (iterator.hasNext()) {
+            builder.append('[');
+            builder.append(iterator.next());
+            builder.append(']');
+            if (iterator.hasNext()) {
+                builder.append(", ");
+            }
+        }
+        builder.append(")");
+        return builder.toString();
+    }
 }
\ No newline at end of file
diff --git a/src/main/java/org/apache/sling/query/SlingQuery.java b/src/main/java/org/apache/sling/query/SlingQuery.java
index 08b57f2..b5c9b2f 100644
--- a/src/main/java/org/apache/sling/query/SlingQuery.java
+++ b/src/main/java/org/apache/sling/query/SlingQuery.java
@@ -34,57 +34,60 @@
 @ProviderType
 public class SlingQuery extends AbstractQuery<Resource, SlingQuery> {
 
-	private SlingQuery(AbstractQuery<Resource, SlingQuery> original, SearchStrategy strategy) {
-		super(original, strategy);
-	}
+    private SlingQuery(AbstractQuery<Resource, SlingQuery> original, SearchStrategy strategy) {
+        super(original, strategy);
+    }
 
-	private SlingQuery(Resource[] resources, SearchStrategy strategy) {
-		super(new ResourceTreeProvider(resources[0].getResourceResolver()), resources, strategy);
-	}
+    private SlingQuery(Resource[] resources, SearchStrategy strategy) {
+        super(new ResourceTreeProvider(resources[0].getResourceResolver()), resources, strategy);
+    }
 
-	public static SlingQuery $(Resource... resources) {
-		if (resources.length == 0) {
-			throw new IllegalArgumentException("Initial collection can't be empty");
-		} else {
-			return new SlingQuery(resources, SearchStrategy.QUERY);
-		}
-	}
+    public static SlingQuery $(Resource... resources) {
+        if (resources.length == 0) {
+            throw new IllegalArgumentException("Initial collection can't be empty");
+        } else {
+            return new SlingQuery(resources, SearchStrategy.QUERY);
+        }
+    }
 
-	public static SlingQuery $(ResourceResolver resolver) {
-		return $(resolver.getResource("/"));
-	}
+    public static SlingQuery $(ResourceResolver resolver) {
+        return $(resolver.getResource("/"));
+    }
 
-	/**
-	 * Transform the whole collection to a new {@link Iterable} object, invoking
-	 * {@link Adaptable#adaptTo(Class)} method on each Resource. If some Resource can't be adapted to the
-	 * class (eg. {@code adaptTo()} returns {@code null}), it will be skipped.
-	 * 
-	 * @param clazz Class used to adapt the Resources
-	 * @param <E> type of the clazz
-	 * @return new iterable containing succesfully adapted Resources
-	 */
-	public <E> Iterable<E> map(final Class<? extends E> clazz) {
-		return () -> new AdaptToIterator<>(SlingQuery.this.iterator(), clazz);
-	}
+    /**
+     * Transform the whole collection to a new {@link Iterable} object, invoking
+     * {@link Adaptable#adaptTo(Class)} method on each Resource. If some Resource
+     * can't be adapted to the class (eg. {@code adaptTo()} returns {@code null}),
+     * it will be skipped.
+     * 
+     * @param clazz
+     *            Class used to adapt the Resources
+     * @param <E>
+     *            type of the clazz
+     * @return new iterable containing succesfully adapted Resources
+     */
+    public <E> Iterable<E> map(final Class<? extends E> clazz) {
+        return () -> new AdaptToIterator<>(SlingQuery.this.iterator(), clazz);
+    }
 
-	@Override
-	protected SlingQuery clone(AbstractQuery<Resource, SlingQuery> original, SearchStrategy strategy) {
-		return new SlingQuery(original, strategy);
-	}
+    @Override
+    protected SlingQuery clone(AbstractQuery<Resource, SlingQuery> original, SearchStrategy strategy) {
+        return new SlingQuery(original, strategy);
+    }
 
-	@Override
-	public String toString() {
-		StringBuilder builder = new StringBuilder();
-		builder.append("$(");
-		Iterator<Resource> iterator = this.iterator();
-		while (iterator.hasNext()) {
-			builder.append(iterator.next().getPath());
-			if (iterator.hasNext()) {
-				builder.append(", ");
-			}
-		}
-		builder.append(")");
-		return builder.toString();
-	}
+    @Override
+    public String toString() {
+        StringBuilder builder = new StringBuilder();
+        builder.append("$(");
+        Iterator<Resource> iterator = this.iterator();
+        while (iterator.hasNext()) {
+            builder.append(iterator.next().getPath());
+            if (iterator.hasNext()) {
+                builder.append(", ");
+            }
+        }
+        builder.append(")");
+        return builder.toString();
+    }
 
 }
\ No newline at end of file
diff --git a/src/main/java/org/apache/sling/query/api/SearchStrategy.java b/src/main/java/org/apache/sling/query/api/SearchStrategy.java
index e8eb4df..91ae528 100644
--- a/src/main/java/org/apache/sling/query/api/SearchStrategy.java
+++ b/src/main/java/org/apache/sling/query/api/SearchStrategy.java
@@ -23,5 +23,5 @@
 
 @ProviderType
 public enum SearchStrategy {
-	BFS, DFS, QUERY
+    BFS, DFS, QUERY
 }
diff --git a/src/main/java/org/apache/sling/query/api/internal/Option.java b/src/main/java/org/apache/sling/query/api/internal/Option.java
index 074e5ed..f9e4e7f 100644
--- a/src/main/java/org/apache/sling/query/api/internal/Option.java
+++ b/src/main/java/org/apache/sling/query/api/internal/Option.java
@@ -23,60 +23,60 @@
 import org.apache.commons.lang.builder.HashCodeBuilder;
 
 public class Option<T> {
-	private final T element;
+    private final T element;
 
-	private final int argumentId;
+    private final int argumentId;
 
-	private Option(T element, int argumentId) {
-		this.element = element;
-		this.argumentId = argumentId;
-	}
+    private Option(T element, int argumentId) {
+        this.element = element;
+        this.argumentId = argumentId;
+    }
 
-	public static <T> Option<T> of(T element, int argumentId) {
-		return new Option<>(element, argumentId);
-	}
+    public static <T> Option<T> of(T element, int argumentId) {
+        return new Option<>(element, argumentId);
+    }
 
-	public static <T> Option<T> empty(int argumentId) {
-		return new Option<>(null, argumentId);
-	}
+    public static <T> Option<T> empty(int argumentId) {
+        return new Option<>(null, argumentId);
+    }
 
-	public int getArgumentId() {
-		return argumentId;
-	}
+    public int getArgumentId() {
+        return argumentId;
+    }
 
-	public T getElement() {
-		return element;
-	}
+    public T getElement() {
+        return element;
+    }
 
-	public boolean isEmpty() {
-		return element == null;
-	}
+    public boolean isEmpty() {
+        return element == null;
+    }
 
-	public String toString() {
-		if (isEmpty()) {
-			return "Option[-]";
-		} else {
-			return String.format("Option[%s]", element.toString());
-		}
-	}
+    public String toString() {
+        if (isEmpty()) {
+            return "Option[-]";
+        } else {
+            return String.format("Option[%s]", element.toString());
+        }
+    }
 
-	@Override
-	public boolean equals(Object obj) {
-		if (obj == null) {
-			return false;
-		}
-		if (obj == this) {
-			return true;
-		}
-		if (obj.getClass() != getClass()) {
-			return false;
-		}
-		Option<?> rhs = (Option<?>) obj;
-		return new EqualsBuilder().append(element, rhs.element).isEquals();
-	}
+    @Override
+    public boolean equals(Object obj) {
+        if (obj == null) {
+            return false;
+        }
+        if (obj == this) {
+            return true;
+        }
+        if (obj.getClass() != getClass()) {
+            return false;
+        }
+        Option<?> rhs = (Option<?>) obj;
+        return new EqualsBuilder().append(element, rhs.element).isEquals();
+    }
 
-	@Override
-	public int hashCode() {
-		return new HashCodeBuilder().append(element).toHashCode();
-	}
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder().append(element).toHashCode();
+    }
 }
diff --git a/src/main/java/org/apache/sling/query/api/internal/TreeProvider.java b/src/main/java/org/apache/sling/query/api/internal/TreeProvider.java
index 50d3c6f..e0b6c7e 100644
--- a/src/main/java/org/apache/sling/query/api/internal/TreeProvider.java
+++ b/src/main/java/org/apache/sling/query/api/internal/TreeProvider.java
@@ -29,17 +29,17 @@
 
 @ConsumerType
 public interface TreeProvider<T> {
-	Iterator<T> listChildren(T parent);
+    Iterator<T> listChildren(T parent);
 
-	T getParent(T element);
+    T getParent(T element);
 
-	String getName(T element);
+    String getName(T element);
 
-	Predicate<T> getPredicate(String type, String name, List<Attribute> attributes);
+    Predicate<T> getPredicate(String type, String name, List<Attribute> attributes);
 
-	Iterator<T> query(List<SelectorSegment> segment, T resource);
+    Iterator<T> query(List<SelectorSegment> segment, T resource);
 
-	boolean sameElement(T o1, T o2);
+    boolean sameElement(T o1, T o2);
 
-	boolean isDescendant(T root, T testedElement);
+    boolean isDescendant(T root, T testedElement);
 }
diff --git a/src/main/java/org/apache/sling/query/impl/function/AddFunction.java b/src/main/java/org/apache/sling/query/impl/function/AddFunction.java
index 5edaaed..4315bad 100644
--- a/src/main/java/org/apache/sling/query/impl/function/AddFunction.java
+++ b/src/main/java/org/apache/sling/query/impl/function/AddFunction.java
@@ -28,16 +28,16 @@
 
 public class AddFunction<T> implements IteratorToIteratorFunction<T> {
 
-	private final Iterable<T> iterable;
+    private final Iterable<T> iterable;
 
-	public AddFunction(Iterable<T> iterable) {
-		this.iterable = iterable;
-	}
+    public AddFunction(Iterable<T> iterable) {
+        this.iterable = iterable;
+    }
 
-	@SuppressWarnings("unchecked")
-	@Override
-	public Iterator<Option<T>> apply(Iterator<Option<T>> input) {
-		return new MergingIterator<>(input, new OptionDecoratingIterator<>(iterable.iterator()));
-	}
+    @SuppressWarnings("unchecked")
+    @Override
+    public Iterator<Option<T>> apply(Iterator<Option<T>> input) {
+        return new MergingIterator<>(input, new OptionDecoratingIterator<>(iterable.iterator()));
+    }
 
 }
diff --git a/src/main/java/org/apache/sling/query/impl/function/ChildrenFunction.java b/src/main/java/org/apache/sling/query/impl/function/ChildrenFunction.java
index 6b2ac6e..9465fef 100644
--- a/src/main/java/org/apache/sling/query/impl/function/ChildrenFunction.java
+++ b/src/main/java/org/apache/sling/query/impl/function/ChildrenFunction.java
@@ -26,14 +26,14 @@
 
 public class ChildrenFunction<T> implements ElementToIteratorFunction<T> {
 
-	private final TreeProvider<T> provider;
+    private final TreeProvider<T> provider;
 
-	public ChildrenFunction(TreeProvider<T> provider) {
-		this.provider = provider;
-	}
+    public ChildrenFunction(TreeProvider<T> provider) {
+        this.provider = provider;
+    }
 
-	@Override
-	public Iterator<T> apply(T parent) {
-		return provider.listChildren(parent);
-	}
+    @Override
+    public Iterator<T> apply(T parent) {
+        return provider.listChildren(parent);
+    }
 }
\ No newline at end of file
diff --git a/src/main/java/org/apache/sling/query/impl/function/ClosestFunction.java b/src/main/java/org/apache/sling/query/impl/function/ClosestFunction.java
index c18b211..88d1a7d 100644
--- a/src/main/java/org/apache/sling/query/impl/function/ClosestFunction.java
+++ b/src/main/java/org/apache/sling/query/impl/function/ClosestFunction.java
@@ -28,24 +28,24 @@
 
 public class ClosestFunction<T> implements ElementToIteratorFunction<T> {
 
-	private final Predicate<T> predicate;
+    private final Predicate<T> predicate;
 
-	private final TreeProvider<T> provider;
+    private final TreeProvider<T> provider;
 
-	public ClosestFunction(Predicate<T> predicate, TreeProvider<T> provider) {
-		this.predicate = predicate;
-		this.provider = provider;
-	}
+    public ClosestFunction(Predicate<T> predicate, TreeProvider<T> provider) {
+        this.predicate = predicate;
+        this.provider = provider;
+    }
 
-	@Override
-	public Iterator<T> apply(T resource) {
-		T current = resource;
-		while (current != null) {
-			if (predicate.test(current)) {
-				return IteratorUtils.singleElementIterator(current);
-			}
-			current = provider.getParent(current);
-		}
-		return IteratorUtils.emptyIterator();
-	}
+    @Override
+    public Iterator<T> apply(T resource) {
+        T current = resource;
+        while (current != null) {
+            if (predicate.test(current)) {
+                return IteratorUtils.singleElementIterator(current);
+            }
+            current = provider.getParent(current);
+        }
+        return IteratorUtils.emptyIterator();
+    }
 }
\ No newline at end of file
diff --git a/src/main/java/org/apache/sling/query/impl/function/CompositeFunction.java b/src/main/java/org/apache/sling/query/impl/function/CompositeFunction.java
index 23adc4b..4e7ad3b 100644
--- a/src/main/java/org/apache/sling/query/impl/function/CompositeFunction.java
+++ b/src/main/java/org/apache/sling/query/impl/function/CompositeFunction.java
@@ -28,18 +28,18 @@
 
 public class CompositeFunction<T> implements IteratorToIteratorFunction<T> {
 
-	private final List<Function<?, ?>> functions;
+    private final List<Function<?, ?>> functions;
 
-	public CompositeFunction(List<Function<?, ?>> functions) {
-		this.functions = functions;
-	}
+    public CompositeFunction(List<Function<?, ?>> functions) {
+        this.functions = functions;
+    }
 
-	@Override
-	public Iterator<Option<T>> apply(Iterator<Option<T>> input) {
-		Iterator<Option<T>> iterator = input;
-		for (Function<?, ?> f : functions) {
-			iterator = new IteratorToIteratorFunctionWrapper<T>(f).apply(iterator);
-		}
-		return iterator;
-	}
+    @Override
+    public Iterator<Option<T>> apply(Iterator<Option<T>> input) {
+        Iterator<Option<T>> iterator = input;
+        for (Function<?, ?> f : functions) {
+            iterator = new IteratorToIteratorFunctionWrapper<T>(f).apply(iterator);
+        }
+        return iterator;
+    }
 }
diff --git a/src/main/java/org/apache/sling/query/impl/function/DescendantFunction.java b/src/main/java/org/apache/sling/query/impl/function/DescendantFunction.java
index 946f2f0..6e5ac97 100644
--- a/src/main/java/org/apache/sling/query/impl/function/DescendantFunction.java
+++ b/src/main/java/org/apache/sling/query/impl/function/DescendantFunction.java
@@ -28,18 +28,18 @@
 
 public class DescendantFunction<T> implements IteratorToIteratorFunction<T> {
 
-	private final Iterable<T> descendants;
+    private final Iterable<T> descendants;
 
-	private final TreeProvider<T> provider;
+    private final TreeProvider<T> provider;
 
-	public DescendantFunction(Iterable<T> descendants, TreeProvider<T> provider) {
-		this.descendants = descendants;
-		this.provider = provider;
-	}
+    public DescendantFunction(Iterable<T> descendants, TreeProvider<T> provider) {
+        this.descendants = descendants;
+        this.provider = provider;
+    }
 
-	@Override
-	public Iterator<Option<T>> apply(Iterator<Option<T>> input) {
-		return new DescendantsIterator<>(input, descendants.iterator(), provider);
-	}
+    @Override
+    public Iterator<Option<T>> apply(Iterator<Option<T>> input) {
+        return new DescendantsIterator<>(input, descendants.iterator(), provider);
+    }
 
 }
diff --git a/src/main/java/org/apache/sling/query/impl/function/EvenFunction.java b/src/main/java/org/apache/sling/query/impl/function/EvenFunction.java
index fed6500..5307e79 100644
--- a/src/main/java/org/apache/sling/query/impl/function/EvenFunction.java
+++ b/src/main/java/org/apache/sling/query/impl/function/EvenFunction.java
@@ -28,29 +28,29 @@
 
 public class EvenFunction<T> implements IteratorToIteratorFunction<T> {
 
-	private final boolean even;
+    private final boolean even;
 
-	public EvenFunction(boolean even) {
-		this.even = even;
-	}
+    public EvenFunction(boolean even) {
+        this.even = even;
+    }
 
-	@Override
-	public Iterator<Option<T>> apply(Iterator<Option<T>> resources) {
-		return new FilteringIterator<>(resources, new EvenPredicate<>(even));
-	}
+    @Override
+    public Iterator<Option<T>> apply(Iterator<Option<T>> resources) {
+        return new FilteringIterator<>(resources, new EvenPredicate<>(even));
+    }
 
-	private static class EvenPredicate<T> implements Predicate<T> {
-		private boolean accept;
+    private static class EvenPredicate<T> implements Predicate<T> {
+        private boolean accept;
 
-		public EvenPredicate(boolean firstState) {
-			accept = firstState;
-		}
+        public EvenPredicate(boolean firstState) {
+            accept = firstState;
+        }
 
-		@Override
-		public boolean test(T element) {
-			boolean oldAccept = accept;
-			accept = !accept;
-			return oldAccept;
-		}
-	}
+        @Override
+        public boolean test(T element) {
+            boolean oldAccept = accept;
+            accept = !accept;
+            return oldAccept;
+        }
+    }
 }
diff --git a/src/main/java/org/apache/sling/query/impl/function/FilterFunction.java b/src/main/java/org/apache/sling/query/impl/function/FilterFunction.java
index d4dc19e..c8039df 100644
--- a/src/main/java/org/apache/sling/query/impl/function/FilterFunction.java
+++ b/src/main/java/org/apache/sling/query/impl/function/FilterFunction.java
@@ -28,15 +28,15 @@
 
 public class FilterFunction<T> implements IteratorToIteratorFunction<T> {
 
-	private final Predicate<T> predicate;
+    private final Predicate<T> predicate;
 
-	public FilterFunction(Predicate<T> predicate) {
-		this.predicate = predicate;
-	}
+    public FilterFunction(Predicate<T> predicate) {
+        this.predicate = predicate;
+    }
 
-	@Override
-	public Iterator<Option<T>> apply(Iterator<Option<T>> input) {
-		return new FilteringIterator<>(input, predicate);
-	}
+    @Override
+    public Iterator<Option<T>> apply(Iterator<Option<T>> input) {
+        return new FilteringIterator<>(input, predicate);
+    }
 
 }
diff --git a/src/main/java/org/apache/sling/query/impl/function/FindFunction.java b/src/main/java/org/apache/sling/query/impl/function/FindFunction.java
index 8767203..91eb179 100644
--- a/src/main/java/org/apache/sling/query/impl/function/FindFunction.java
+++ b/src/main/java/org/apache/sling/query/impl/function/FindFunction.java
@@ -35,41 +35,40 @@
 
 public class FindFunction<T> implements ElementToIteratorFunction<T> {
 
-	private final List<SelectorSegment> preFilteringSelector;
+    private final List<SelectorSegment> preFilteringSelector;
 
-	private final TreeProvider<T> provider;
+    private final TreeProvider<T> provider;
 
-	private final SearchStrategy strategy;
+    private final SearchStrategy strategy;
 
-	public FindFunction(SearchStrategy searchStrategy, TreeProvider<T> provider,
-			SelectorSegment preFilteringSelector) {
-		this.strategy = searchStrategy;
-		this.provider = provider;
-		this.preFilteringSelector = Arrays.asList(preFilteringSelector);
-	}
+    public FindFunction(SearchStrategy searchStrategy, TreeProvider<T> provider, SelectorSegment preFilteringSelector) {
+        this.strategy = searchStrategy;
+        this.provider = provider;
+        this.preFilteringSelector = Arrays.asList(preFilteringSelector);
+    }
 
-	public FindFunction(SearchStrategy searchStrategy, TreeProvider<T> provider, String preFilteringSelector) {
-		this.strategy = searchStrategy;
-		this.provider = provider;
-		List<Selector> selectors = SelectorParser.parse(preFilteringSelector);
-		this.preFilteringSelector = SelectorParser.getFirstSegmentFromEachSelector(selectors);
-	}
+    public FindFunction(SearchStrategy searchStrategy, TreeProvider<T> provider, String preFilteringSelector) {
+        this.strategy = searchStrategy;
+        this.provider = provider;
+        List<Selector> selectors = SelectorParser.parse(preFilteringSelector);
+        this.preFilteringSelector = SelectorParser.getFirstSegmentFromEachSelector(selectors);
+    }
 
-	@Override
-	public Iterator<T> apply(T input) {
-		Iterator<T> iterator;
-		switch (strategy) {
-			case BFS:
-				iterator = new BfsTreeIterator<T>(input, provider);
-				break;
-			case QUERY:
-				iterator = provider.query(preFilteringSelector, input);
-				break;
-			case DFS:
-			default:
-				iterator = new DfsTreeIterator<>(input, provider);
-				break;
-		}
-		return new WarningIterator<>(iterator);
-	}
+    @Override
+    public Iterator<T> apply(T input) {
+        Iterator<T> iterator;
+        switch (strategy) {
+        case BFS:
+            iterator = new BfsTreeIterator<T>(input, provider);
+            break;
+        case QUERY:
+            iterator = provider.query(preFilteringSelector, input);
+            break;
+        case DFS:
+        default:
+            iterator = new DfsTreeIterator<>(input, provider);
+            break;
+        }
+        return new WarningIterator<>(iterator);
+    }
 }
\ No newline at end of file
diff --git a/src/main/java/org/apache/sling/query/impl/function/HasFunction.java b/src/main/java/org/apache/sling/query/impl/function/HasFunction.java
index 2da072a..da57665 100644
--- a/src/main/java/org/apache/sling/query/impl/function/HasFunction.java
+++ b/src/main/java/org/apache/sling/query/impl/function/HasFunction.java
@@ -33,38 +33,38 @@
 
 public class HasFunction<T> implements ElementToIteratorFunction<T> {
 
-	private final IteratorToIteratorFunction<T> findFunction;
+    private final IteratorToIteratorFunction<T> findFunction;
 
-	private final IteratorToIteratorFunction<T> filter;
+    private final IteratorToIteratorFunction<T> filter;
 
-	private HasFunction(FindFunction<T> findFunction, IteratorToIteratorFunction<T> filter) {
-		this.findFunction = new IteratorToIteratorFunctionWrapper<T>(findFunction);
-		this.filter = filter;
-	}
+    private HasFunction(FindFunction<T> findFunction, IteratorToIteratorFunction<T> filter) {
+        this.findFunction = new IteratorToIteratorFunctionWrapper<T>(findFunction);
+        this.filter = filter;
+    }
 
-	public HasFunction(String selectorString, SearchStrategy searchStrategy, TreeProvider<T> provider) {
-		this(new FindFunction<T>(searchStrategy, provider, selectorString), new SelectorFunction<T>(
-				selectorString, provider, searchStrategy));
-	}
+    public HasFunction(String selectorString, SearchStrategy searchStrategy, TreeProvider<T> provider) {
+        this(new FindFunction<T>(searchStrategy, provider, selectorString),
+                new SelectorFunction<T>(selectorString, provider, searchStrategy));
+    }
 
-	public HasFunction(Predicate<T> predicate, SearchStrategy searchStrategy, TreeProvider<T> provider) {
-		this(new FindFunction<>(searchStrategy, provider, ""), new FilterFunction<T>(predicate));
-	}
+    public HasFunction(Predicate<T> predicate, SearchStrategy searchStrategy, TreeProvider<T> provider) {
+        this(new FindFunction<>(searchStrategy, provider, ""), new FilterFunction<T>(predicate));
+    }
 
-	public HasFunction(Iterable<T> iterable, TreeProvider<T> provider) {
-		this.findFunction = new DescendantFunction<>(iterable, provider);
-		this.filter = new IdentityFunction<>();
-	}
+    public HasFunction(Iterable<T> iterable, TreeProvider<T> provider) {
+        this.findFunction = new DescendantFunction<>(iterable, provider);
+        this.filter = new IdentityFunction<>();
+    }
 
-	@Override
-	public Iterator<T> apply(T input) {
-		Iterator<Option<T>> iterator = IteratorUtils.singleElementIterator(Option.of(input, 0));
-		iterator = findFunction.apply(iterator);
-		iterator = filter.apply(iterator);
-		if (new EmptyElementFilter<>(iterator).hasNext()) {
-			return IteratorUtils.singleElementIterator(input);
-		} else {
-			return IteratorUtils.emptyIterator();
-		}
-	}
+    @Override
+    public Iterator<T> apply(T input) {
+        Iterator<Option<T>> iterator = IteratorUtils.singleElementIterator(Option.of(input, 0));
+        iterator = findFunction.apply(iterator);
+        iterator = filter.apply(iterator);
+        if (new EmptyElementFilter<>(iterator).hasNext()) {
+            return IteratorUtils.singleElementIterator(input);
+        } else {
+            return IteratorUtils.emptyIterator();
+        }
+    }
 }
\ No newline at end of file
diff --git a/src/main/java/org/apache/sling/query/impl/function/IdentityFunction.java b/src/main/java/org/apache/sling/query/impl/function/IdentityFunction.java
index 894be67..16e4af4 100644
--- a/src/main/java/org/apache/sling/query/impl/function/IdentityFunction.java
+++ b/src/main/java/org/apache/sling/query/impl/function/IdentityFunction.java
@@ -26,9 +26,9 @@
 
 public class IdentityFunction<T> implements IteratorToIteratorFunction<T> {
 
-	@Override
-	public Iterator<Option<T>> apply(Iterator<Option<T>> input) {
-		return input;
-	}
+    @Override
+    public Iterator<Option<T>> apply(Iterator<Option<T>> input) {
+        return input;
+    }
 
 }
diff --git a/src/main/java/org/apache/sling/query/impl/function/IteratorToIteratorFunctionWrapper.java b/src/main/java/org/apache/sling/query/impl/function/IteratorToIteratorFunctionWrapper.java
index e014582..ae1252a 100644
--- a/src/main/java/org/apache/sling/query/impl/function/IteratorToIteratorFunctionWrapper.java
+++ b/src/main/java/org/apache/sling/query/impl/function/IteratorToIteratorFunctionWrapper.java
@@ -29,26 +29,26 @@
 
 public class IteratorToIteratorFunctionWrapper<T> implements IteratorToIteratorFunction<T> {
 
-	private final Function<?, ?> function;
+    private final Function<?, ?> function;
 
-	public IteratorToIteratorFunctionWrapper(Function<?, ?> function) {
-		this.function = function;
-	}
+    public IteratorToIteratorFunctionWrapper(Function<?, ?> function) {
+        this.function = function;
+    }
 
-	@SuppressWarnings("unchecked")
-	@Override
-	public Iterator<Option<T>> apply(Iterator<Option<T>> parentIterator) {
-		if (function instanceof ElementToIteratorFunction) {
-			return getOptionIterator((ElementToIteratorFunction<T>) function, parentIterator);
-		} else if (function instanceof IteratorToIteratorFunction) {
-			return ((IteratorToIteratorFunction<T>) function).apply(parentIterator);
-		} else {
-			throw new IllegalArgumentException("Don't know how to handle " + function.toString());
-		}
-	}
+    @SuppressWarnings("unchecked")
+    @Override
+    public Iterator<Option<T>> apply(Iterator<Option<T>> parentIterator) {
+        if (function instanceof ElementToIteratorFunction) {
+            return getOptionIterator((ElementToIteratorFunction<T>) function, parentIterator);
+        } else if (function instanceof IteratorToIteratorFunction) {
+            return ((IteratorToIteratorFunction<T>) function).apply(parentIterator);
+        } else {
+            throw new IllegalArgumentException("Don't know how to handle " + function.toString());
+        }
+    }
 
-	private static <T> Iterator<Option<T>> getOptionIterator(ElementToIteratorFunction<T> function,
-			Iterator<Option<T>> parentIterator) {
-		return new ExpandingIterator<>(function, parentIterator);
-	}
+    private static <T> Iterator<Option<T>> getOptionIterator(ElementToIteratorFunction<T> function,
+            Iterator<Option<T>> parentIterator) {
+        return new ExpandingIterator<>(function, parentIterator);
+    }
 }
diff --git a/src/main/java/org/apache/sling/query/impl/function/LastFunction.java b/src/main/java/org/apache/sling/query/impl/function/LastFunction.java
index 4fef072..2470f66 100644
--- a/src/main/java/org/apache/sling/query/impl/function/LastFunction.java
+++ b/src/main/java/org/apache/sling/query/impl/function/LastFunction.java
@@ -27,9 +27,9 @@
 
 public class LastFunction<T> implements IteratorToIteratorFunction<T> {
 
-	@Override
-	public Iterator<Option<T>> apply(Iterator<Option<T>> input) {
-		return new LastIterator<>(input);
-	}
+    @Override
+    public Iterator<Option<T>> apply(Iterator<Option<T>> input) {
+        return new LastIterator<>(input);
+    }
 
 }
diff --git a/src/main/java/org/apache/sling/query/impl/function/NextFunction.java b/src/main/java/org/apache/sling/query/impl/function/NextFunction.java
index b12fc91..fd1923d 100644
--- a/src/main/java/org/apache/sling/query/impl/function/NextFunction.java
+++ b/src/main/java/org/apache/sling/query/impl/function/NextFunction.java
@@ -29,21 +29,21 @@
 
 public class NextFunction<T> implements ElementToIteratorFunction<T> {
 
-	private final Predicate<T> until;
+    private final Predicate<T> until;
 
-	private final TreeProvider<T> provider;
+    private final TreeProvider<T> provider;
 
-	public NextFunction(TreeProvider<T> provider) {
-		this(null, provider);
-	}
+    public NextFunction(TreeProvider<T> provider) {
+        this(null, provider);
+    }
 
-	public NextFunction(Predicate<T> until, TreeProvider<T> provider) {
-		this.until = until;
-		this.provider = provider;
-	}
+    public NextFunction(Predicate<T> until, TreeProvider<T> provider) {
+        this.until = until;
+        this.provider = provider;
+    }
 
-	@Override
-	public Iterator<T> apply(T resource) {
-		return new SiblingsIterator<>(until, resource, Type.NEXT, provider);
-	}
+    @Override
+    public Iterator<T> apply(T resource) {
+        return new SiblingsIterator<>(until, resource, Type.NEXT, provider);
+    }
 }
\ No newline at end of file
diff --git a/src/main/java/org/apache/sling/query/impl/function/NotFunction.java b/src/main/java/org/apache/sling/query/impl/function/NotFunction.java
index 9062de0..7044295 100644
--- a/src/main/java/org/apache/sling/query/impl/function/NotFunction.java
+++ b/src/main/java/org/apache/sling/query/impl/function/NotFunction.java
@@ -27,15 +27,15 @@
 
 public class NotFunction<T> implements IteratorToIteratorFunction<T> {
 
-	private IteratorToIteratorFunction<T> function;
+    private IteratorToIteratorFunction<T> function;
 
-	public NotFunction(IteratorToIteratorFunction<T> function) {
-		this.function = function;
-	}
+    public NotFunction(IteratorToIteratorFunction<T> function) {
+        this.function = function;
+    }
 
-	@Override
-	public Iterator<Option<T>> apply(Iterator<Option<T>> input) {
-		return new ReverseIterator<>(function, input);
-	}
+    @Override
+    public Iterator<Option<T>> apply(Iterator<Option<T>> input) {
+        return new ReverseIterator<>(function, input);
+    }
 
 }
diff --git a/src/main/java/org/apache/sling/query/impl/function/ParentFunction.java b/src/main/java/org/apache/sling/query/impl/function/ParentFunction.java
index bdf6a7a..a4479a2 100644
--- a/src/main/java/org/apache/sling/query/impl/function/ParentFunction.java
+++ b/src/main/java/org/apache/sling/query/impl/function/ParentFunction.java
@@ -27,20 +27,20 @@
 
 public class ParentFunction<T> implements ElementToIteratorFunction<T> {
 
-	private final TreeProvider<T> provider;
+    private final TreeProvider<T> provider;
 
-	public ParentFunction(TreeProvider<T> provider) {
-		this.provider = provider;
-	}
+    public ParentFunction(TreeProvider<T> provider) {
+        this.provider = provider;
+    }
 
-	@Override
-	public Iterator<T> apply(T element) {
-		T parent = provider.getParent(element);
-		if (parent == null) {
-			return IteratorUtils.emptyIterator();
-		} else {
-			return IteratorUtils.singleElementIterator(parent);
-		}
-	}
+    @Override
+    public Iterator<T> apply(T element) {
+        T parent = provider.getParent(element);
+        if (parent == null) {
+            return IteratorUtils.emptyIterator();
+        } else {
+            return IteratorUtils.singleElementIterator(parent);
+        }
+    }
 
 }
diff --git a/src/main/java/org/apache/sling/query/impl/function/ParentsFunction.java b/src/main/java/org/apache/sling/query/impl/function/ParentsFunction.java
index 0301aaa..3a9ead9 100644
--- a/src/main/java/org/apache/sling/query/impl/function/ParentsFunction.java
+++ b/src/main/java/org/apache/sling/query/impl/function/ParentsFunction.java
@@ -28,18 +28,18 @@
 
 public class ParentsFunction<T> implements ElementToIteratorFunction<T> {
 
-	private final Predicate<T> until;
+    private final Predicate<T> until;
 
-	private final TreeProvider<T> provider;
+    private final TreeProvider<T> provider;
 
-	public ParentsFunction(Predicate<T> until, TreeProvider<T> provider) {
-		this.until = until;
-		this.provider = provider;
-	}
+    public ParentsFunction(Predicate<T> until, TreeProvider<T> provider) {
+        this.until = until;
+        this.provider = provider;
+    }
 
-	@Override
-	public Iterator<T> apply(T resource) {
-		return new ParentsIterator<>(until, resource, provider);
-	}
+    @Override
+    public Iterator<T> apply(T resource) {
+        return new ParentsIterator<>(until, resource, provider);
+    }
 
 }
diff --git a/src/main/java/org/apache/sling/query/impl/function/PrevFunction.java b/src/main/java/org/apache/sling/query/impl/function/PrevFunction.java
index f8a0f1c..ede6cd1 100644
--- a/src/main/java/org/apache/sling/query/impl/function/PrevFunction.java
+++ b/src/main/java/org/apache/sling/query/impl/function/PrevFunction.java
@@ -29,21 +29,21 @@
 
 public class PrevFunction<T> implements ElementToIteratorFunction<T> {
 
-	private final Predicate<T> until;
+    private final Predicate<T> until;
 
-	private final TreeProvider<T> provider;
+    private final TreeProvider<T> provider;
 
-	public PrevFunction(TreeProvider<T> provider) {
-		this(null, provider);
-	}
+    public PrevFunction(TreeProvider<T> provider) {
+        this(null, provider);
+    }
 
-	public PrevFunction(Predicate<T> until, TreeProvider<T> provider) {
-		this.until = until;
-		this.provider = provider;
-	}
+    public PrevFunction(Predicate<T> until, TreeProvider<T> provider) {
+        this.until = until;
+        this.provider = provider;
+    }
 
-	@Override
-	public Iterator<T> apply(T resource) {
-		return new SiblingsIterator<>(until, resource, Type.PREV, provider);
-	}
+    @Override
+    public Iterator<T> apply(T resource) {
+        return new SiblingsIterator<>(until, resource, Type.PREV, provider);
+    }
 }
\ No newline at end of file
diff --git a/src/main/java/org/apache/sling/query/impl/function/SiblingsFunction.java b/src/main/java/org/apache/sling/query/impl/function/SiblingsFunction.java
index 7af5fc8..b9298c8 100644
--- a/src/main/java/org/apache/sling/query/impl/function/SiblingsFunction.java
+++ b/src/main/java/org/apache/sling/query/impl/function/SiblingsFunction.java
@@ -27,19 +27,19 @@
 
 public class SiblingsFunction<T> implements ElementToIteratorFunction<T> {
 
-	private final TreeProvider<T> provider;
+    private final TreeProvider<T> provider;
 
-	public SiblingsFunction(TreeProvider<T> provider) {
-		this.provider = provider;
-	}
+    public SiblingsFunction(TreeProvider<T> provider) {
+        this.provider = provider;
+    }
 
-	@Override
-	public Iterator<T> apply(T resource) {
-		T parent = provider.getParent(resource);
-		if (parent == null) {
-			return IteratorUtils.singleElementIterator(resource);
-		} else {
-			return provider.listChildren(parent);
-		}
-	}
+    @Override
+    public Iterator<T> apply(T resource) {
+        T parent = provider.getParent(resource);
+        if (parent == null) {
+            return IteratorUtils.singleElementIterator(resource);
+        } else {
+            return provider.listChildren(parent);
+        }
+    }
 }
diff --git a/src/main/java/org/apache/sling/query/impl/function/SliceFunction.java b/src/main/java/org/apache/sling/query/impl/function/SliceFunction.java
index 60a0a44..aba90ad 100644
--- a/src/main/java/org/apache/sling/query/impl/function/SliceFunction.java
+++ b/src/main/java/org/apache/sling/query/impl/function/SliceFunction.java
@@ -27,26 +27,26 @@
 
 public class SliceFunction<T> implements IteratorToIteratorFunction<T> {
 
-	private final int from;
+    private final int from;
 
-	private final Integer to;
+    private final Integer to;
 
-	public SliceFunction(int from, int to) {
-		this.from = from;
-		this.to = to;
-	}
+    public SliceFunction(int from, int to) {
+        this.from = from;
+        this.to = to;
+    }
 
-	public SliceFunction(int from) {
-		this.from = from;
-		this.to = null;
-	}
+    public SliceFunction(int from) {
+        this.from = from;
+        this.to = null;
+    }
 
-	@Override
-	public Iterator<Option<T>> apply(Iterator<Option<T>> resources) {
-		if (to == null) {
-			return new SliceIterator<>(resources, from);
-		} else {
-			return new SliceIterator<>(resources, from, to);
-		}
-	}
+    @Override
+    public Iterator<Option<T>> apply(Iterator<Option<T>> resources) {
+        if (to == null) {
+            return new SliceIterator<>(resources, from);
+        } else {
+            return new SliceIterator<>(resources, from, to);
+        }
+    }
 }
\ No newline at end of file
diff --git a/src/main/java/org/apache/sling/query/impl/function/UniqueFunction.java b/src/main/java/org/apache/sling/query/impl/function/UniqueFunction.java
index 995fd6d..f9b8642 100644
--- a/src/main/java/org/apache/sling/query/impl/function/UniqueFunction.java
+++ b/src/main/java/org/apache/sling/query/impl/function/UniqueFunction.java
@@ -27,9 +27,9 @@
 
 public class UniqueFunction<T> implements IteratorToIteratorFunction<T> {
 
-	@Override
-	public Iterator<Option<T>> apply(Iterator<Option<T>> input) {
-		return new UniqueIterator<>(input);
-	}
+    @Override
+    public Iterator<Option<T>> apply(Iterator<Option<T>> input) {
+        return new UniqueIterator<>(input);
+    }
 
 }
diff --git a/src/main/java/org/apache/sling/query/impl/iterator/AbstractIterator.java b/src/main/java/org/apache/sling/query/impl/iterator/AbstractIterator.java
index d131b9a..6e3cdaa 100644
--- a/src/main/java/org/apache/sling/query/impl/iterator/AbstractIterator.java
+++ b/src/main/java/org/apache/sling/query/impl/iterator/AbstractIterator.java
@@ -24,30 +24,30 @@
 
 public abstract class AbstractIterator<T> implements Iterator<T> {
 
-	private T currentElement;
+    private T currentElement;
 
-	@Override
-	public boolean hasNext() {
-		if (currentElement == null) {
-			currentElement = getElement();
-		}
-		return currentElement != null;
-	}
+    @Override
+    public boolean hasNext() {
+        if (currentElement == null) {
+            currentElement = getElement();
+        }
+        return currentElement != null;
+    }
 
-	@Override
-	public T next() {
-		if (!hasNext()) {
-			throw new NoSuchElementException();
-		}
-		T result = currentElement;
-		currentElement = null;
-		return result;
-	}
+    @Override
+    public T next() {
+        if (!hasNext()) {
+            throw new NoSuchElementException();
+        }
+        T result = currentElement;
+        currentElement = null;
+        return result;
+    }
 
-	@Override
-	public void remove() {
-		throw new UnsupportedOperationException();
-	}
+    @Override
+    public void remove() {
+        throw new UnsupportedOperationException();
+    }
 
-	protected abstract T getElement();
+    protected abstract T getElement();
 }
diff --git a/src/main/java/org/apache/sling/query/impl/iterator/AdaptToIterator.java b/src/main/java/org/apache/sling/query/impl/iterator/AdaptToIterator.java
index 6fb8f86..10bd7b0 100644
--- a/src/main/java/org/apache/sling/query/impl/iterator/AdaptToIterator.java
+++ b/src/main/java/org/apache/sling/query/impl/iterator/AdaptToIterator.java
@@ -26,50 +26,50 @@
 
 public class AdaptToIterator<F, T> implements Iterator<T> {
 
-	private final Iterator<F> iterator;
+    private final Iterator<F> iterator;
 
-	private final Class<? extends T> clazz;
+    private final Class<? extends T> clazz;
 
-	private T currentModel;
+    private T currentModel;
 
-	public AdaptToIterator(Iterator<F> iterator, Class<? extends T> clazz) {
-		this.clazz = clazz;
-		this.iterator = iterator;
-	}
+    public AdaptToIterator(Iterator<F> iterator, Class<? extends T> clazz) {
+        this.clazz = clazz;
+        this.iterator = iterator;
+    }
 
-	@Override
-	public boolean hasNext() {
-		if (currentModel == null) {
-			getCurrentModel();
-		}
-		return currentModel != null;
-	}
+    @Override
+    public boolean hasNext() {
+        if (currentModel == null) {
+            getCurrentModel();
+        }
+        return currentModel != null;
+    }
 
-	@Override
-	public T next() {
-		if (!hasNext()) {
-			throw new NoSuchElementException();
-		}
-		T model = currentModel;
-		currentModel = null;
-		return model;
-	}
+    @Override
+    public T next() {
+        if (!hasNext()) {
+            throw new NoSuchElementException();
+        }
+        T model = currentModel;
+        currentModel = null;
+        return model;
+    }
 
-	public void getCurrentModel() {
-		while (iterator.hasNext()) {
-			F element = iterator.next();
-			if (element instanceof Adaptable) {
-				currentModel = ((Adaptable) element).adaptTo(clazz);
-			}
-			if (currentModel != null) {
-				break;
-			}
-		}
-	}
+    public void getCurrentModel() {
+        while (iterator.hasNext()) {
+            F element = iterator.next();
+            if (element instanceof Adaptable) {
+                currentModel = ((Adaptable) element).adaptTo(clazz);
+            }
+            if (currentModel != null) {
+                break;
+            }
+        }
+    }
 
-	@Override
-	public void remove() {
-		throw new UnsupportedOperationException();
-	}
+    @Override
+    public void remove() {
+        throw new UnsupportedOperationException();
+    }
 
 }
diff --git a/src/main/java/org/apache/sling/query/impl/iterator/AlternativeIterator.java b/src/main/java/org/apache/sling/query/impl/iterator/AlternativeIterator.java
index e4a72bf..683d494 100644
--- a/src/main/java/org/apache/sling/query/impl/iterator/AlternativeIterator.java
+++ b/src/main/java/org/apache/sling/query/impl/iterator/AlternativeIterator.java
@@ -26,19 +26,19 @@
 
 public class AlternativeIterator<T> extends AbstractIterator<Option<T>> {
 
-	private final List<Iterator<Option<T>>> iterators;
+    private final List<Iterator<Option<T>>> iterators;
 
-	public AlternativeIterator(List<Iterator<Option<T>>> iterators) {
-		this.iterators = iterators;
-	}
+    public AlternativeIterator(List<Iterator<Option<T>>> iterators) {
+        this.iterators = iterators;
+    }
 
-	@Override
-	protected Option<T> getElement() {
-		for (Iterator<Option<T>> i : iterators) {
-			if (i.hasNext()) {
-				return i.next();
-			}
-		}
-		return null;
-	}
+    @Override
+    protected Option<T> getElement() {
+        for (Iterator<Option<T>> i : iterators) {
+            if (i.hasNext()) {
+                return i.next();
+            }
+        }
+        return null;
+    }
 }
\ No newline at end of file
diff --git a/src/main/java/org/apache/sling/query/impl/iterator/ArgumentResettingIterator.java b/src/main/java/org/apache/sling/query/impl/iterator/ArgumentResettingIterator.java
index b12657f..19cfb4e 100644
--- a/src/main/java/org/apache/sling/query/impl/iterator/ArgumentResettingIterator.java
+++ b/src/main/java/org/apache/sling/query/impl/iterator/ArgumentResettingIterator.java
@@ -25,28 +25,28 @@
 
 public class ArgumentResettingIterator<T> implements Iterator<Option<T>> {
 
-	private final Iterator<Option<T>> iterator;
+    private final Iterator<Option<T>> iterator;
 
-	private int index;
+    private int index;
 
-	public ArgumentResettingIterator(Iterator<Option<T>> iterator) {
-		this.iterator = iterator;
-		this.index = 0;
-	}
+    public ArgumentResettingIterator(Iterator<Option<T>> iterator) {
+        this.iterator = iterator;
+        this.index = 0;
+    }
 
-	@Override
-	public boolean hasNext() {
-		return iterator.hasNext();
-	}
+    @Override
+    public boolean hasNext() {
+        return iterator.hasNext();
+    }
 
-	@Override
-	public Option<T> next() {
-		return Option.of(iterator.next().getElement(), index++);
-	}
+    @Override
+    public Option<T> next() {
+        return Option.of(iterator.next().getElement(), index++);
+    }
 
-	@Override
-	public void remove() {
-		iterator.remove();
-	}
+    @Override
+    public void remove() {
+        iterator.remove();
+    }
 
 }
diff --git a/src/main/java/org/apache/sling/query/impl/iterator/DescendantsIterator.java b/src/main/java/org/apache/sling/query/impl/iterator/DescendantsIterator.java
index 2074e03..d294545 100644
--- a/src/main/java/org/apache/sling/query/impl/iterator/DescendantsIterator.java
+++ b/src/main/java/org/apache/sling/query/impl/iterator/DescendantsIterator.java
@@ -28,43 +28,43 @@
 
 public class DescendantsIterator<T> extends AbstractIterator<Option<T>> {
 
-	private final Iterator<Option<T>> input;
+    private final Iterator<Option<T>> input;
 
-	private Option<T> current;
+    private Option<T> current;
 
-	private Iterator<T> descendants;
+    private Iterator<T> descendants;
 
-	private final TreeProvider<T> provider;
+    private final TreeProvider<T> provider;
 
-	public DescendantsIterator(Iterator<Option<T>> input, Iterator<T> descendants, TreeProvider<T> provider) {
-		this.input = input;
-		this.current = null;
-		this.descendants = new ArrayList<T>(new LazyList<T>(descendants)).iterator();
-		this.provider = provider;
-	}
+    public DescendantsIterator(Iterator<Option<T>> input, Iterator<T> descendants, TreeProvider<T> provider) {
+        this.input = input;
+        this.current = null;
+        this.descendants = new ArrayList<T>(new LazyList<T>(descendants)).iterator();
+        this.provider = provider;
+    }
 
-	@Override
-	protected Option<T> getElement() {
-		if (current == null) {
-			if (input.hasNext()) {
-				current = input.next();
-			} else {
-				return null;
-			}
-		}
-		return getDescendant();
-	}
+    @Override
+    protected Option<T> getElement() {
+        if (current == null) {
+            if (input.hasNext()) {
+                current = input.next();
+            } else {
+                return null;
+            }
+        }
+        return getDescendant();
+    }
 
-	private Option<T> getDescendant() {
-		while (descendants.hasNext()) {
-			T descendantCandidate = descendants.next();
-			if (provider.isDescendant(current.getElement(), descendantCandidate)) {
-				descendants.remove();
-				return Option.of(descendantCandidate, current.getArgumentId());
-			}
-		}
-		Option<T> result = Option.empty(current.getArgumentId());
-		current = null;
-		return result;
-	}
+    private Option<T> getDescendant() {
+        while (descendants.hasNext()) {
+            T descendantCandidate = descendants.next();
+            if (provider.isDescendant(current.getElement(), descendantCandidate)) {
+                descendants.remove();
+                return Option.of(descendantCandidate, current.getArgumentId());
+            }
+        }
+        Option<T> result = Option.empty(current.getArgumentId());
+        current = null;
+        return result;
+    }
 }
diff --git a/src/main/java/org/apache/sling/query/impl/iterator/EmptyElementFilter.java b/src/main/java/org/apache/sling/query/impl/iterator/EmptyElementFilter.java
index 7334c03..39dedc1 100644
--- a/src/main/java/org/apache/sling/query/impl/iterator/EmptyElementFilter.java
+++ b/src/main/java/org/apache/sling/query/impl/iterator/EmptyElementFilter.java
@@ -25,21 +25,21 @@
 
 public class EmptyElementFilter<T> extends AbstractIterator<Option<T>> {
 
-	private final Iterator<Option<T>> input;
+    private final Iterator<Option<T>> input;
 
-	public EmptyElementFilter(Iterator<Option<T>> input) {
-		this.input = input;
-	}
+    public EmptyElementFilter(Iterator<Option<T>> input) {
+        this.input = input;
+    }
 
-	@Override
-	protected Option<T> getElement() {
-		while (input.hasNext()) {
-			Option<T> element = input.next();
-			if (!element.isEmpty()) {
-				return element;
-			}
-		}
-		return null;
-	}
+    @Override
+    protected Option<T> getElement() {
+        while (input.hasNext()) {
+            Option<T> element = input.next();
+            if (!element.isEmpty()) {
+                return element;
+            }
+        }
+        return null;
+    }
 
 }
diff --git a/src/main/java/org/apache/sling/query/impl/iterator/ExpandingIterator.java b/src/main/java/org/apache/sling/query/impl/iterator/ExpandingIterator.java
index 8852405..253b94f 100644
--- a/src/main/java/org/apache/sling/query/impl/iterator/ExpandingIterator.java
+++ b/src/main/java/org/apache/sling/query/impl/iterator/ExpandingIterator.java
@@ -25,41 +25,41 @@
 import org.apache.sling.query.api.internal.Option;
 
 /**
- * This iterator evaluates each element from the source iterator, expanding it using given function.
+ * This iterator evaluates each element from the source iterator, expanding it
+ * using given function.
  */
 public class ExpandingIterator<T> extends AbstractIterator<Option<T>> {
 
-	private final ElementToIteratorFunction<T> function;
+    private final ElementToIteratorFunction<T> function;
 
-	private final Iterator<Option<T>> parentIterator;
+    private final Iterator<Option<T>> parentIterator;
 
-	private Option<T> parentElement;
+    private Option<T> parentElement;
 
-	private Iterator<T> currentIterator;
+    private Iterator<T> currentIterator;
 
-	public ExpandingIterator(ElementToIteratorFunction<T> expandingFunction,
-			Iterator<Option<T>> sourceIterator) {
-		this.function = expandingFunction;
-		this.parentIterator = sourceIterator;
-	}
+    public ExpandingIterator(ElementToIteratorFunction<T> expandingFunction, Iterator<Option<T>> sourceIterator) {
+        this.function = expandingFunction;
+        this.parentIterator = sourceIterator;
+    }
 
-	@Override
-	protected Option<T> getElement() {
-		if (currentIterator != null && currentIterator.hasNext()) {
-			return Option.of(currentIterator.next(), parentElement.getArgumentId());
-		}
-		while (parentIterator.hasNext()) {
-			parentElement = parentIterator.next();
-			if (parentElement.isEmpty()) {
-				return parentElement;
-			}
-			currentIterator = function.apply(parentElement.getElement());
-			if (currentIterator.hasNext()) {
-				return getElement();
-			} else {
-				return Option.empty(parentElement.getArgumentId());
-			}
-		}
-		return null;
-	}
+    @Override
+    protected Option<T> getElement() {
+        if (currentIterator != null && currentIterator.hasNext()) {
+            return Option.of(currentIterator.next(), parentElement.getArgumentId());
+        }
+        while (parentIterator.hasNext()) {
+            parentElement = parentIterator.next();
+            if (parentElement.isEmpty()) {
+                return parentElement;
+            }
+            currentIterator = function.apply(parentElement.getElement());
+            if (currentIterator.hasNext()) {
+                return getElement();
+            } else {
+                return Option.empty(parentElement.getArgumentId());
+            }
+        }
+        return null;
+    }
 }
diff --git a/src/main/java/org/apache/sling/query/impl/iterator/FilteringIterator.java b/src/main/java/org/apache/sling/query/impl/iterator/FilteringIterator.java
index 59a34af..8b8f3e6 100644
--- a/src/main/java/org/apache/sling/query/impl/iterator/FilteringIterator.java
+++ b/src/main/java/org/apache/sling/query/impl/iterator/FilteringIterator.java
@@ -26,25 +26,25 @@
 
 public class FilteringIterator<T> extends AbstractIterator<Option<T>> {
 
-	private final Iterator<Option<T>> iterator;
+    private final Iterator<Option<T>> iterator;
 
-	private final Predicate<T> predicate;
+    private final Predicate<T> predicate;
 
-	public FilteringIterator(Iterator<Option<T>> iterator, Predicate<T> predicate) {
-		this.iterator = iterator;
-		this.predicate = predicate;
-	}
+    public FilteringIterator(Iterator<Option<T>> iterator, Predicate<T> predicate) {
+        this.iterator = iterator;
+        this.predicate = predicate;
+    }
 
-	@Override
-	protected Option<T> getElement() {
-		while (iterator.hasNext()) {
-			Option<T> element = iterator.next();
-			if (element.isEmpty() || predicate.test(element.getElement())) {
-				return element;
-			} else {
-				return Option.empty(element.getArgumentId());
-			}
-		}
-		return null;
-	}
+    @Override
+    protected Option<T> getElement() {
+        while (iterator.hasNext()) {
+            Option<T> element = iterator.next();
+            if (element.isEmpty() || predicate.test(element.getElement())) {
+                return element;
+            } else {
+                return Option.empty(element.getArgumentId());
+            }
+        }
+        return null;
+    }
 }
diff --git a/src/main/java/org/apache/sling/query/impl/iterator/MergingIterator.java b/src/main/java/org/apache/sling/query/impl/iterator/MergingIterator.java
index 9e51630..1c38496 100644
--- a/src/main/java/org/apache/sling/query/impl/iterator/MergingIterator.java
+++ b/src/main/java/org/apache/sling/query/impl/iterator/MergingIterator.java
@@ -23,24 +23,24 @@
 
 public class MergingIterator<T> extends AbstractIterator<T> {
 
-	private final Iterator<T>[] iterators;
+    private final Iterator<T>[] iterators;
 
-	private int index = 0;
+    private int index = 0;
 
-	public MergingIterator(Iterator<T>... iterators) {
-		this.iterators = iterators;
-	}
+    public MergingIterator(Iterator<T>... iterators) {
+        this.iterators = iterators;
+    }
 
-	@Override
-	protected T getElement() {
-		while (index < iterators.length) {
-			if (iterators[index].hasNext()) {
-				return iterators[index].next();
-			} else {
-				index++;
-			}
-		}
-		return null;
-	}
+    @Override
+    protected T getElement() {
+        while (index < iterators.length) {
+            if (iterators[index].hasNext()) {
+                return iterators[index].next();
+            } else {
+                index++;
+            }
+        }
+        return null;
+    }
 
 }
diff --git a/src/main/java/org/apache/sling/query/impl/iterator/OptionDecoratingIterator.java b/src/main/java/org/apache/sling/query/impl/iterator/OptionDecoratingIterator.java
index 023dcc5..09024f3 100644
--- a/src/main/java/org/apache/sling/query/impl/iterator/OptionDecoratingIterator.java
+++ b/src/main/java/org/apache/sling/query/impl/iterator/OptionDecoratingIterator.java
@@ -25,28 +25,28 @@
 
 public class OptionDecoratingIterator<T> implements Iterator<Option<T>> {
 
-	private final Iterator<T> iterator;
+    private final Iterator<T> iterator;
 
-	private int index;
+    private int index;
 
-	public OptionDecoratingIterator(Iterator<T> iterator) {
-		this.iterator = iterator;
-		this.index = 0;
-	}
+    public OptionDecoratingIterator(Iterator<T> iterator) {
+        this.iterator = iterator;
+        this.index = 0;
+    }
 
-	@Override
-	public boolean hasNext() {
-		return iterator.hasNext();
-	}
+    @Override
+    public boolean hasNext() {
+        return iterator.hasNext();
+    }
 
-	@Override
-	public Option<T> next() {
-		return Option.of(iterator.next(), index++);
-	}
+    @Override
+    public Option<T> next() {
+        return Option.of(iterator.next(), index++);
+    }
 
-	@Override
-	public void remove() {
-		iterator.remove();
-	}
+    @Override
+    public void remove() {
+        iterator.remove();
+    }
 
 }
diff --git a/src/main/java/org/apache/sling/query/impl/iterator/OptionStrippingIterator.java b/src/main/java/org/apache/sling/query/impl/iterator/OptionStrippingIterator.java
index 9738888..a776a7f 100644
--- a/src/main/java/org/apache/sling/query/impl/iterator/OptionStrippingIterator.java
+++ b/src/main/java/org/apache/sling/query/impl/iterator/OptionStrippingIterator.java
@@ -25,24 +25,24 @@
 
 public class OptionStrippingIterator<T> implements Iterator<T> {
 
-	private final Iterator<Option<T>> iterator;
+    private final Iterator<Option<T>> iterator;
 
-	public OptionStrippingIterator(Iterator<Option<T>> iterator) {
-		this.iterator = iterator;
-	}
+    public OptionStrippingIterator(Iterator<Option<T>> iterator) {
+        this.iterator = iterator;
+    }
 
-	@Override
-	public boolean hasNext() {
-		return iterator.hasNext();
-	}
+    @Override
+    public boolean hasNext() {
+        return iterator.hasNext();
+    }
 
-	@Override
-	public T next() {
-		return iterator.next().getElement();
-	}
+    @Override
+    public T next() {
+        return iterator.next().getElement();
+    }
 
-	@Override
-	public void remove() {
-		iterator.remove();
-	}
+    @Override
+    public void remove() {
+        iterator.remove();
+    }
 }
diff --git a/src/main/java/org/apache/sling/query/impl/iterator/ParentsIterator.java b/src/main/java/org/apache/sling/query/impl/iterator/ParentsIterator.java
index 258b39b..6a1903c 100644
--- a/src/main/java/org/apache/sling/query/impl/iterator/ParentsIterator.java
+++ b/src/main/java/org/apache/sling/query/impl/iterator/ParentsIterator.java
@@ -25,34 +25,34 @@
 
 public class ParentsIterator<T> extends AbstractIterator<T> {
 
-	private final Predicate<T> until;
+    private final Predicate<T> until;
 
-	private final TreeProvider<T> provider;
-	
-	private T currentResource;
+    private final TreeProvider<T> provider;
 
-	public ParentsIterator(Predicate<T> until, T currentResource, TreeProvider<T> provider) {
-		this.currentResource = currentResource;
-		this.until = until;
-		this.provider = provider;
-	}
+    private T currentResource;
 
-	@Override
-	protected T getElement() {
-		if (currentResource == null) {
-			return null;
-		}
-		currentResource = provider.getParent(currentResource);
+    public ParentsIterator(Predicate<T> until, T currentResource, TreeProvider<T> provider) {
+        this.currentResource = currentResource;
+        this.until = until;
+        this.provider = provider;
+    }
 
-		if (currentResource == null) {
-			return null;
-		}
+    @Override
+    protected T getElement() {
+        if (currentResource == null) {
+            return null;
+        }
+        currentResource = provider.getParent(currentResource);
 
-		if (until != null && until.test(currentResource)) {
-			return null;
-		}
+        if (currentResource == null) {
+            return null;
+        }
 
-		return currentResource;
-	}
+        if (until != null && until.test(currentResource)) {
+            return null;
+        }
+
+        return currentResource;
+    }
 
 }
diff --git a/src/main/java/org/apache/sling/query/impl/iterator/ReverseIterator.java b/src/main/java/org/apache/sling/query/impl/iterator/ReverseIterator.java
index 89ae0a8..1615338 100644
--- a/src/main/java/org/apache/sling/query/impl/iterator/ReverseIterator.java
+++ b/src/main/java/org/apache/sling/query/impl/iterator/ReverseIterator.java
@@ -27,30 +27,30 @@
 
 public class ReverseIterator<T> extends AbstractIterator<Option<T>> {
 
-	private final Iterator<Option<T>> filtered;
+    private final Iterator<Option<T>> filtered;
 
-	private final Iterator<Option<T>> original;
+    private final Iterator<Option<T>> original;
 
-	public ReverseIterator(IteratorToIteratorFunction<T> function, Iterator<Option<T>> input) {
-		LazyList<Option<T>> lazyList = new LazyList<Option<T>>(input);
-		filtered = function.apply(lazyList.listIterator());
-		original = lazyList.listIterator();
-	}
+    public ReverseIterator(IteratorToIteratorFunction<T> function, Iterator<Option<T>> input) {
+        LazyList<Option<T>> lazyList = new LazyList<Option<T>>(input);
+        filtered = function.apply(lazyList.listIterator());
+        original = lazyList.listIterator();
+    }
 
-	@Override
-	protected Option<T> getElement() {
-		if (original.hasNext()) {
-			Option<T> originalElement = original.next();
-			Option<T> filteredElement = null;
-			if (filtered.hasNext()) {
-				filteredElement = filtered.next();
-			}
-			if (filteredElement == null || filteredElement.isEmpty()) {
-				return originalElement;
-			} else {
-				return Option.empty(originalElement.getArgumentId());
-			}
-		}
-		return null;
-	}
+    @Override
+    protected Option<T> getElement() {
+        if (original.hasNext()) {
+            Option<T> originalElement = original.next();
+            Option<T> filteredElement = null;
+            if (filtered.hasNext()) {
+                filteredElement = filtered.next();
+            }
+            if (filteredElement == null || filteredElement.isEmpty()) {
+                return originalElement;
+            } else {
+                return Option.empty(originalElement.getArgumentId());
+            }
+        }
+        return null;
+    }
 }
diff --git a/src/main/java/org/apache/sling/query/impl/iterator/SiblingsIterator.java b/src/main/java/org/apache/sling/query/impl/iterator/SiblingsIterator.java
index f60bf1c..446b735 100644
--- a/src/main/java/org/apache/sling/query/impl/iterator/SiblingsIterator.java
+++ b/src/main/java/org/apache/sling/query/impl/iterator/SiblingsIterator.java
@@ -29,91 +29,91 @@
 
 public class SiblingsIterator<T> extends AbstractIterator<T> {
 
-	private final Predicate<T> until;
+    private final Predicate<T> until;
 
-	private final ListIterator<T> siblings;
+    private final ListIterator<T> siblings;
 
-	private final Type type;
+    private final Type type;
 
-	private final TreeProvider<T> provider;
+    private final TreeProvider<T> provider;
 
-	private boolean finished;
+    private boolean finished;
 
-	public SiblingsIterator(Predicate<T> until, T resource, Type type, TreeProvider<T> provider) {
-		this.provider = provider;
-		this.until = until;
-		this.siblings = getRewindedIterator(resource, type);
-		this.finished = false;
-		this.type = type;
-	}
+    public SiblingsIterator(Predicate<T> until, T resource, Type type, TreeProvider<T> provider) {
+        this.provider = provider;
+        this.until = until;
+        this.siblings = getRewindedIterator(resource, type);
+        this.finished = false;
+        this.type = type;
+    }
 
-	@Override
-	protected T getElement() {
-		if (finished) {
-			return null;
-		}
-		while (type.canAdvance(siblings)) {
-			T resource = type.advance(siblings);
-			if (until != null && until.test(resource)) {
-				finished = true;
-				return null;
-			}
-			if (until == null) {
-				finished = true;
-			}
-			return resource;
-		}
-		return null;
-	}
+    @Override
+    protected T getElement() {
+        if (finished) {
+            return null;
+        }
+        while (type.canAdvance(siblings)) {
+            T resource = type.advance(siblings);
+            if (until != null && until.test(resource)) {
+                finished = true;
+                return null;
+            }
+            if (until == null) {
+                finished = true;
+            }
+            return resource;
+        }
+        return null;
+    }
 
-	private ListIterator<T> getRewindedIterator(T resource, Type type) {
-		String resourceName = provider.getName(resource);
-		T parent = provider.getParent(resource);
-		Iterator<T> iterator;
-		if (parent == null) {
-			iterator = IteratorUtils.singleElementIterator(resource);
-		} else {
-			iterator = provider.listChildren(parent);
-		}
-		ListIterator<T> listIterator = new LazyList<T>(iterator).listIterator();
-		while (listIterator.hasNext()) {
-			T sibling = listIterator.next();
-			if (provider.getName(sibling).equals(resourceName)) {
-				break;
-			}
-		}
-		if (type == Type.PREV) {
-			listIterator.previous();
-		}
-		return listIterator;
-	}
+    private ListIterator<T> getRewindedIterator(T resource, Type type) {
+        String resourceName = provider.getName(resource);
+        T parent = provider.getParent(resource);
+        Iterator<T> iterator;
+        if (parent == null) {
+            iterator = IteratorUtils.singleElementIterator(resource);
+        } else {
+            iterator = provider.listChildren(parent);
+        }
+        ListIterator<T> listIterator = new LazyList<T>(iterator).listIterator();
+        while (listIterator.hasNext()) {
+            T sibling = listIterator.next();
+            if (provider.getName(sibling).equals(resourceName)) {
+                break;
+            }
+        }
+        if (type == Type.PREV) {
+            listIterator.previous();
+        }
+        return listIterator;
+    }
 
-	public enum Type {
-		NEXT {
-			@Override
-			public boolean canAdvance(ListIterator<?> iterator) {
-				return iterator.hasNext();
-			}
+    public enum Type {
+        NEXT {
+            @Override
+            public boolean canAdvance(ListIterator<?> iterator) {
+                return iterator.hasNext();
+            }
 
-			@Override
-			public <T> T advance(ListIterator<T> iterator) {
-				return iterator.next();
-			}
-		},
-		PREV {
-			@Override
-			public boolean canAdvance(ListIterator<?> iterator) {
-				return iterator.hasPrevious();
-			}
+            @Override
+            public <T> T advance(ListIterator<T> iterator) {
+                return iterator.next();
+            }
+        },
+        PREV {
+            @Override
+            public boolean canAdvance(ListIterator<?> iterator) {
+                return iterator.hasPrevious();
+            }
 
-			@Override
-			public <T> T advance(ListIterator<T> iterator) {
-				return iterator.previous();
-			}
-		};
+            @Override
+            public <T> T advance(ListIterator<T> iterator) {
+                return iterator.previous();
+            }
+        };
 
-		public abstract boolean canAdvance(ListIterator<?> iterator);
+        public abstract boolean canAdvance(ListIterator<?> iterator);
 
-		public abstract <T> T advance(ListIterator<T> iterator);
-	}
+        public abstract <T> T advance(ListIterator<T> iterator);
+    }
 }
diff --git a/src/main/java/org/apache/sling/query/impl/iterator/SliceIterator.java b/src/main/java/org/apache/sling/query/impl/iterator/SliceIterator.java
index 1835d0f..87d6655 100644
--- a/src/main/java/org/apache/sling/query/impl/iterator/SliceIterator.java
+++ b/src/main/java/org/apache/sling/query/impl/iterator/SliceIterator.java
@@ -25,42 +25,42 @@
 
 public class SliceIterator<T> extends AbstractIterator<Option<T>> {
 
-	private final Iterator<Option<T>> iterator;
+    private final Iterator<Option<T>> iterator;
 
-	private final int from;
+    private final int from;
 
-	private final int to;
+    private final int to;
 
-	private int current;
+    private int current;
 
-	public SliceIterator(Iterator<Option<T>> iterator, int from, int to) {
-		this.iterator = iterator;
-		this.current = -1;
-		this.from = from;
-		this.to = to;
-	}
+    public SliceIterator(Iterator<Option<T>> iterator, int from, int to) {
+        this.iterator = iterator;
+        this.current = -1;
+        this.from = from;
+        this.to = to;
+    }
 
-	public SliceIterator(Iterator<Option<T>> iterator, int from) {
-		this(iterator, from, Integer.MAX_VALUE);
-	}
+    public SliceIterator(Iterator<Option<T>> iterator, int from) {
+        this(iterator, from, Integer.MAX_VALUE);
+    }
 
-	@Override
-	protected Option<T> getElement() {
-		if (current > to) {
-			return null;
-		}
+    @Override
+    protected Option<T> getElement() {
+        if (current > to) {
+            return null;
+        }
 
-		if (iterator.hasNext()) {
-			Option<T> element = iterator.next();
-			if (element.isEmpty()) {
-				return element;
-			}
-			if (++current >= from && current <= to) {
-				return element;
-			} else {
-				return Option.empty(element.getArgumentId());
-			}
-		}
-		return null;
-	}
+        if (iterator.hasNext()) {
+            Option<T> element = iterator.next();
+            if (element.isEmpty()) {
+                return element;
+            }
+            if (++current >= from && current <= to) {
+                return element;
+            } else {
+                return Option.empty(element.getArgumentId());
+            }
+        }
+        return null;
+    }
 }
\ No newline at end of file
diff --git a/src/main/java/org/apache/sling/query/impl/iterator/SuppIterator.java b/src/main/java/org/apache/sling/query/impl/iterator/SuppIterator.java
index 42c8c7a..8bd6fa8 100644
--- a/src/main/java/org/apache/sling/query/impl/iterator/SuppIterator.java
+++ b/src/main/java/org/apache/sling/query/impl/iterator/SuppIterator.java
@@ -33,57 +33,57 @@
  */
 public class SuppIterator<T> extends AbstractIterator<Option<T>> {
 
-	private final List<Option<T>> input;
+    private final List<Option<T>> input;
 
-	private final Iterator<Option<T>> output;
+    private final Iterator<Option<T>> output;
 
-	private Option<T> outputElement;
+    private Option<T> outputElement;
 
-	private int currentIndex = 0;
+    private int currentIndex = 0;
 
-	public SuppIterator(List<Option<T>> input, IteratorToIteratorFunction<T> function) {
-		this.input = input;
-		this.output = function.apply(new ArgumentResettingIterator<T>(input.iterator()));
-	}
+    public SuppIterator(List<Option<T>> input, IteratorToIteratorFunction<T> function) {
+        this.input = input;
+        this.output = function.apply(new ArgumentResettingIterator<T>(input.iterator()));
+    }
 
-	/**
-	 * The idea behind this method is that index of each element in the input
-	 * iterator is passed to the function. One or more Option<T> items for each
-	 * index will be returned. If any Option<T> item in that index set is not
-	 * empty then the corresponding element in the input will be returned.
-	 */
-	@Override
-	protected Option<T> getElement() {
-		if (outputElement == null) {
-			if (!output.hasNext()) {
-				return null;
-			}
-			outputElement = output.next();
-		}
+    /**
+     * The idea behind this method is that index of each element in the input
+     * iterator is passed to the function. One or more Option<T> items for each
+     * index will be returned. If any Option<T> item in that index set is not empty
+     * then the corresponding element in the input will be returned.
+     */
+    @Override
+    protected Option<T> getElement() {
+        if (outputElement == null) {
+            if (!output.hasNext()) {
+                return null;
+            }
+            outputElement = output.next();
+        }
 
-		int outputIndex = outputElement.getArgumentId();
-		boolean emptyResponse = outputElement.isEmpty();
+        int outputIndex = outputElement.getArgumentId();
+        boolean emptyResponse = outputElement.isEmpty();
 
-		//loop to next index or end of list
-		while (outputIndex <= currentIndex && output.hasNext()) {
-			if (emptyResponse) {
-				emptyResponse = outputElement.isEmpty();
-			}
-			outputElement = output.next();
-			outputIndex = outputElement.getArgumentId();
-		}
+        // loop to next index or end of list
+        while (outputIndex <= currentIndex && output.hasNext()) {
+            if (emptyResponse) {
+                emptyResponse = outputElement.isEmpty();
+            }
+            outputElement = output.next();
+            outputIndex = outputElement.getArgumentId();
+        }
 
-		if (emptyResponse) {
-			if (outputIndex > currentIndex) {
-				return Option.empty(currentIndex++);
-			}
-			return null;
-		}
+        if (emptyResponse) {
+            if (outputIndex > currentIndex) {
+                return Option.empty(currentIndex++);
+            }
+            return null;
+        }
 
-		if (outputIndex <= currentIndex) {
-			outputElement = null;
-		}
-		return input.get(currentIndex++);
-	}
+        if (outputIndex <= currentIndex) {
+            outputElement = null;
+        }
+        return input.get(currentIndex++);
+    }
 
 }
diff --git a/src/main/java/org/apache/sling/query/impl/iterator/UniqueIterator.java b/src/main/java/org/apache/sling/query/impl/iterator/UniqueIterator.java
index 206ae4c..97dedcc 100644
--- a/src/main/java/org/apache/sling/query/impl/iterator/UniqueIterator.java
+++ b/src/main/java/org/apache/sling/query/impl/iterator/UniqueIterator.java
@@ -35,29 +35,29 @@
  */
 public class UniqueIterator<T> extends AbstractIterator<Option<T>> {
 
-	private Iterator<Option<T>> iterator;
+    private Iterator<Option<T>> iterator;
 
-	private Set<T> seen;
+    private Set<T> seen;
 
-	public UniqueIterator(Iterator<Option<T>> input) {
-		this.iterator = input;
-		seen = new HashSet<>();
-	}
+    public UniqueIterator(Iterator<Option<T>> input) {
+        this.iterator = input;
+        seen = new HashSet<>();
+    }
 
-	@Override
-	protected Option<T> getElement() {
-		if (!iterator.hasNext()) {
-			iterator = Collections.emptyIterator();
-			seen = null;
-			return null;
-		}
-		Option<T> candidate = iterator.next();
-		if (!candidate.isEmpty()) {
-			if (!seen.add(candidate.getElement())) {
-				return Option.empty(candidate.getArgumentId());
-			}
-		}
-		return candidate;
-	}
+    @Override
+    protected Option<T> getElement() {
+        if (!iterator.hasNext()) {
+            iterator = Collections.emptyIterator();
+            seen = null;
+            return null;
+        }
+        Option<T> candidate = iterator.next();
+        if (!candidate.isEmpty()) {
+            if (!seen.add(candidate.getElement())) {
+                return Option.empty(candidate.getArgumentId());
+            }
+        }
+        return candidate;
+    }
 
 }
diff --git a/src/main/java/org/apache/sling/query/impl/iterator/WarningIterator.java b/src/main/java/org/apache/sling/query/impl/iterator/WarningIterator.java
index 08f383a..ea042aa 100644
--- a/src/main/java/org/apache/sling/query/impl/iterator/WarningIterator.java
+++ b/src/main/java/org/apache/sling/query/impl/iterator/WarningIterator.java
@@ -26,36 +26,36 @@
 
 public class WarningIterator<T> extends AbstractIterator<T> {
 
-	private static final Logger LOG = LoggerFactory.getLogger("SlingQuery");
+    private static final Logger LOG = LoggerFactory.getLogger("SlingQuery");
 
-	private static final int DEFAULT_LIMIT = 100;
+    private static final int DEFAULT_LIMIT = 100;
 
-	private final Iterator<T> iterator;
+    private final Iterator<T> iterator;
 
-	private final int limit;
+    private final int limit;
 
-	private int count = 0;
+    private int count = 0;
 
-	public WarningIterator(Iterator<T> iterator) {
-		this(iterator, DEFAULT_LIMIT);
-	}
+    public WarningIterator(Iterator<T> iterator) {
+        this(iterator, DEFAULT_LIMIT);
+    }
 
-	public WarningIterator(Iterator<T> iterator, int limit) {
-		this.iterator = iterator;
-		this.limit = limit;
-	}
+    public WarningIterator(Iterator<T> iterator, int limit) {
+        this.iterator = iterator;
+        this.limit = limit;
+    }
 
-	@Override
-	protected T getElement() {
-		if (!iterator.hasNext()) {
-			return null;
-		}
-		if (count++ == limit) {
-			LOG.warn(
-					"Number of processed resources exceeded {}. Consider using a JCR query instead of SlingQuery. More info here: https://s.apache.org/oana",
-					new Object[] { limit });
-		}
-		return iterator.next();
-	}
+    @Override
+    protected T getElement() {
+        if (!iterator.hasNext()) {
+            return null;
+        }
+        if (count++ == limit) {
+            LOG.warn(
+                    "Number of processed resources exceeded {}. Consider using a JCR query instead of SlingQuery. More info here: https://s.apache.org/oana",
+                    new Object[] { limit });
+        }
+        return iterator.next();
+    }
 
 }
diff --git a/src/main/java/org/apache/sling/query/impl/iterator/tree/BfsTreeIterator.java b/src/main/java/org/apache/sling/query/impl/iterator/tree/BfsTreeIterator.java
index a37ad4f..968afe4 100644
--- a/src/main/java/org/apache/sling/query/impl/iterator/tree/BfsTreeIterator.java
+++ b/src/main/java/org/apache/sling/query/impl/iterator/tree/BfsTreeIterator.java
@@ -28,30 +28,30 @@
 
 public class BfsTreeIterator<T> extends AbstractIterator<T> {
 
-	private final Deque<T> queue = new LinkedList<T>();
+    private final Deque<T> queue = new LinkedList<T>();
 
-	private final TreeProvider<T> provider;
+    private final TreeProvider<T> provider;
 
-	private Iterator<T> currentIterator;
+    private Iterator<T> currentIterator;
 
-	public BfsTreeIterator(T root, TreeProvider<T> provider) {
-		this.currentIterator = provider.listChildren(root);
-		this.provider = provider;
-	}
+    public BfsTreeIterator(T root, TreeProvider<T> provider) {
+        this.currentIterator = provider.listChildren(root);
+        this.provider = provider;
+    }
 
-	@Override
-	protected T getElement() {
-		if (currentIterator.hasNext()) {
-			T resource = currentIterator.next();
-			queue.add(resource);
-			return resource;
-		}
+    @Override
+    protected T getElement() {
+        if (currentIterator.hasNext()) {
+            T resource = currentIterator.next();
+            queue.add(resource);
+            return resource;
+        }
 
-		if (!queue.isEmpty()) {
-			currentIterator = provider.listChildren(queue.pop());
-			return getElement();
-		}
+        if (!queue.isEmpty()) {
+            currentIterator = provider.listChildren(queue.pop());
+            return getElement();
+        }
 
-		return null;
-	}
+        return null;
+    }
 }
diff --git a/src/main/java/org/apache/sling/query/impl/iterator/tree/DfsTreeIterator.java b/src/main/java/org/apache/sling/query/impl/iterator/tree/DfsTreeIterator.java
index 2c24658..23fdb96 100644
--- a/src/main/java/org/apache/sling/query/impl/iterator/tree/DfsTreeIterator.java
+++ b/src/main/java/org/apache/sling/query/impl/iterator/tree/DfsTreeIterator.java
@@ -28,27 +28,27 @@
 
 public class DfsTreeIterator<T> extends AbstractIterator<T> {
 
-	private final Deque<Iterator<T>> queue = new LinkedList<Iterator<T>>();
+    private final Deque<Iterator<T>> queue = new LinkedList<Iterator<T>>();
 
-	private final TreeProvider<T> provider;
+    private final TreeProvider<T> provider;
 
-	public DfsTreeIterator(T root, TreeProvider<T> provider) {
-		this.provider = provider;
-		queue.add(provider.listChildren(root));
-	}
+    public DfsTreeIterator(T root, TreeProvider<T> provider) {
+        this.provider = provider;
+        queue.add(provider.listChildren(root));
+    }
 
-	@Override
-	protected T getElement() {
-		if (queue.isEmpty()) {
-			return null;
-		}
-		if (queue.peekLast().hasNext()) {
-			T next = queue.peekLast().next();
-			queue.add(provider.listChildren(next));
-			return next;
-		} else {
-			queue.pollLast();
-			return getElement();
-		}
-	}
+    @Override
+    protected T getElement() {
+        if (queue.isEmpty()) {
+            return null;
+        }
+        if (queue.peekLast().hasNext()) {
+            T next = queue.peekLast().next();
+            queue.add(provider.listChildren(next));
+            return next;
+        } else {
+            queue.pollLast();
+            return getElement();
+        }
+    }
 }
diff --git a/src/main/java/org/apache/sling/query/impl/predicate/IterableContainsPredicate.java b/src/main/java/org/apache/sling/query/impl/predicate/IterableContainsPredicate.java
index 4466fd2..942276a 100644
--- a/src/main/java/org/apache/sling/query/impl/predicate/IterableContainsPredicate.java
+++ b/src/main/java/org/apache/sling/query/impl/predicate/IterableContainsPredicate.java
@@ -26,22 +26,22 @@
 
 public class IterableContainsPredicate<T> implements Predicate<T> {
 
-	private final Iterable<T> iterable;
+    private final Iterable<T> iterable;
 
-	private final TreeProvider<T> provider;
+    private final TreeProvider<T> provider;
 
-	public IterableContainsPredicate(Iterable<T> iterable, TreeProvider<T> provider) {
-		this.iterable = new LazyList<T>(iterable.iterator());
-		this.provider = provider;
-	}
+    public IterableContainsPredicate(Iterable<T> iterable, TreeProvider<T> provider) {
+        this.iterable = new LazyList<T>(iterable.iterator());
+        this.provider = provider;
+    }
 
-	@Override
-	public boolean test(T element) {
-		for (T t : iterable) {
-			if (provider.sameElement(t, element)) {
-				return true;
-			}
-		}
-		return false;
-	}
+    @Override
+    public boolean test(T element) {
+        for (T t : iterable) {
+            if (provider.sameElement(t, element)) {
+                return true;
+            }
+        }
+        return false;
+    }
 }
diff --git a/src/main/java/org/apache/sling/query/impl/predicate/ParentPredicate.java b/src/main/java/org/apache/sling/query/impl/predicate/ParentPredicate.java
index 3a78f43..95884e3 100644
--- a/src/main/java/org/apache/sling/query/impl/predicate/ParentPredicate.java
+++ b/src/main/java/org/apache/sling/query/impl/predicate/ParentPredicate.java
@@ -25,15 +25,15 @@
 
 public class ParentPredicate<T> implements Predicate<T> {
 
-	private final TreeProvider<T> provider;
+    private final TreeProvider<T> provider;
 
-	public ParentPredicate(TreeProvider<T> provider) {
-		this.provider = provider;
-	}
+    public ParentPredicate(TreeProvider<T> provider) {
+        this.provider = provider;
+    }
 
-	@Override
-	public boolean test(T resource) {
-		return provider.listChildren(resource).hasNext();
-	}
+    @Override
+    public boolean test(T resource) {
+        return provider.listChildren(resource).hasNext();
+    }
 
 }
diff --git a/src/main/java/org/apache/sling/query/impl/predicate/RejectingPredicate.java b/src/main/java/org/apache/sling/query/impl/predicate/RejectingPredicate.java
index 68b6704..31c82cf 100644
--- a/src/main/java/org/apache/sling/query/impl/predicate/RejectingPredicate.java
+++ b/src/main/java/org/apache/sling/query/impl/predicate/RejectingPredicate.java
@@ -23,18 +23,18 @@
 
 public class RejectingPredicate<T> implements Predicate<T> {
 
-	private final Predicate<T> predicate;
+    private final Predicate<T> predicate;
 
-	public RejectingPredicate() {
-		this(resource -> true);
-	}
+    public RejectingPredicate() {
+        this(resource -> true);
+    }
 
-	public RejectingPredicate(Predicate<T> predicate) {
-		this.predicate = predicate;
-	}
+    public RejectingPredicate(Predicate<T> predicate) {
+        this.predicate = predicate;
+    }
 
-	@Override
-	public boolean test(T value) {
-		return !predicate.test(value);
-	}
+    @Override
+    public boolean test(T value) {
+        return !predicate.test(value);
+    }
 }
diff --git a/src/main/java/org/apache/sling/query/impl/predicate/SelectorOperator.java b/src/main/java/org/apache/sling/query/impl/predicate/SelectorOperator.java
index 19da3b5..e17d835 100644
--- a/src/main/java/org/apache/sling/query/impl/predicate/SelectorOperator.java
+++ b/src/main/java/org/apache/sling/query/impl/predicate/SelectorOperator.java
@@ -24,59 +24,59 @@
 import org.apache.commons.lang.StringUtils;
 
 public enum SelectorOperator {
-	CONTAINS("*=") {
-		@Override
-		public boolean accepts(String property, String value) {
-			return StringUtils.contains(property, value);
-		}
-	},
-	CONTAINS_WORD("~=") {
-		@Override
-		public boolean accepts(String property, String value) {
-			String quoted = Pattern.quote(value);
-			String regex = String.format("(^| )%s( |$)", quoted);
-			return property != null && Pattern.compile(regex).matcher(property).find();
-		}
-	},
-	ENDS_WITH("$=") {
-		@Override
-		public boolean accepts(String property, String value) {
-			return StringUtils.endsWith(property, value);
-		}
-	},
-	EQUALS("=") {
-		@Override
-		public boolean accepts(String property, String value) {
-			return StringUtils.equals(property, value);
-		}
-	},
-	NOT_EQUAL("!=") {
-		@Override
-		public boolean accepts(String property, String value) {
-			return !StringUtils.equals(property, value);
-		}
-	},
-	STARTS_WITH("^=") {
-		@Override
-		public boolean accepts(String property, String value) {
-			return StringUtils.startsWith(property, value);
-		}
-	};
+    CONTAINS("*=") {
+        @Override
+        public boolean accepts(String property, String value) {
+            return StringUtils.contains(property, value);
+        }
+    },
+    CONTAINS_WORD("~=") {
+        @Override
+        public boolean accepts(String property, String value) {
+            String quoted = Pattern.quote(value);
+            String regex = String.format("(^| )%s( |$)", quoted);
+            return property != null && Pattern.compile(regex).matcher(property).find();
+        }
+    },
+    ENDS_WITH("$=") {
+        @Override
+        public boolean accepts(String property, String value) {
+            return StringUtils.endsWith(property, value);
+        }
+    },
+    EQUALS("=") {
+        @Override
+        public boolean accepts(String property, String value) {
+            return StringUtils.equals(property, value);
+        }
+    },
+    NOT_EQUAL("!=") {
+        @Override
+        public boolean accepts(String property, String value) {
+            return !StringUtils.equals(property, value);
+        }
+    },
+    STARTS_WITH("^=") {
+        @Override
+        public boolean accepts(String property, String value) {
+            return StringUtils.startsWith(property, value);
+        }
+    };
 
-	private final String operator;
+    private final String operator;
 
-	SelectorOperator(String operator) {
-		this.operator = operator;
-	}
+    SelectorOperator(String operator) {
+        this.operator = operator;
+    }
 
-	public abstract boolean accepts(String key, String value);
+    public abstract boolean accepts(String key, String value);
 
-	public static SelectorOperator getSelectorOperator(String operator) {
-		for (SelectorOperator o : values()) {
-			if (o.operator.equals(operator)) {
-				return o;
-			}
-		}
-		return EQUALS;
-	}
+    public static SelectorOperator getSelectorOperator(String operator) {
+        for (SelectorOperator o : values()) {
+            if (o.operator.equals(operator)) {
+                return o;
+            }
+        }
+        return EQUALS;
+    }
 }
diff --git a/src/main/java/org/apache/sling/query/impl/resource/ResourcePredicate.java b/src/main/java/org/apache/sling/query/impl/resource/ResourcePredicate.java
index a0511a8..913eca2 100644
--- a/src/main/java/org/apache/sling/query/impl/resource/ResourcePredicate.java
+++ b/src/main/java/org/apache/sling/query/impl/resource/ResourcePredicate.java
@@ -35,65 +35,65 @@
 
 public class ResourcePredicate implements Predicate<Resource> {
 
-	private static final Logger LOG = LoggerFactory.getLogger(ResourcePredicate.class);
+    private static final Logger LOG = LoggerFactory.getLogger(ResourcePredicate.class);
 
-	private final String resourceType;
+    private final String resourceType;
 
-	private final String resourceName;
+    private final String resourceName;
 
-	private final List<Predicate<Resource>> subPredicates;
+    private final List<Predicate<Resource>> subPredicates;
 
-	private JcrTypeResolver typeResolver;
+    private JcrTypeResolver typeResolver;
 
-	public ResourcePredicate(String resourceType, String resourceName, List<Attribute> attributes,
-			JcrTypeResolver typeResolver) {
-		this.resourceType = resourceType;
-		this.resourceName = resourceName;
-		this.subPredicates = new ArrayList<>();
-		for (Attribute a : attributes) {
-			subPredicates.add(new ResourcePropertyPredicate(a));
-		}
-		this.typeResolver = typeResolver;
-	}
+    public ResourcePredicate(String resourceType, String resourceName, List<Attribute> attributes,
+            JcrTypeResolver typeResolver) {
+        this.resourceType = resourceType;
+        this.resourceName = resourceName;
+        this.subPredicates = new ArrayList<>();
+        for (Attribute a : attributes) {
+            subPredicates.add(new ResourcePropertyPredicate(a));
+        }
+        this.typeResolver = typeResolver;
+    }
 
-	@Override
-	public boolean test(Resource resource) {
-		if (StringUtils.isNotBlank(resourceName) && !resource.getName().equals(resourceName)) {
-			return false;
-		}
-		if (!isResourceType(resource, resourceType)) {
-			return false;
-		}
-		for (Predicate<Resource> predicate : subPredicates) {
-			if (!predicate.test(resource)) {
-				return false;
-			}
-		}
-		return true;
-	}
+    @Override
+    public boolean test(Resource resource) {
+        if (StringUtils.isNotBlank(resourceName) && !resource.getName().equals(resourceName)) {
+            return false;
+        }
+        if (!isResourceType(resource, resourceType)) {
+            return false;
+        }
+        for (Predicate<Resource> predicate : subPredicates) {
+            if (!predicate.test(resource)) {
+                return false;
+            }
+        }
+        return true;
+    }
 
-	private boolean isResourceType(Resource resource, String resourceType) {
-		if (StringUtils.isBlank(resourceType)) {
-			return true;
-		}
-		if (resource.isResourceType(resourceType)) {
-			return true;
-		}
-		if (!isValidType(resourceType)) {
-			return false;
-		}
-		Node node = resource.adaptTo(Node.class);
-		try {
-			if (node != null) {
-				return node.isNodeType(resourceType);
-			}
-		} catch (RepositoryException e) {
-			LOG.error("Can't check node type", e);
-		}
-		return false;
-	}
+    private boolean isResourceType(Resource resource, String resourceType) {
+        if (StringUtils.isBlank(resourceType)) {
+            return true;
+        }
+        if (resource.isResourceType(resourceType)) {
+            return true;
+        }
+        if (!isValidType(resourceType)) {
+            return false;
+        }
+        Node node = resource.adaptTo(Node.class);
+        try {
+            if (node != null) {
+                return node.isNodeType(resourceType);
+            }
+        } catch (RepositoryException e) {
+            LOG.error("Can't check node type", e);
+        }
+        return false;
+    }
 
-	private boolean isValidType(String type) {
-		return typeResolver.isJcrType(type);
-	}
+    private boolean isValidType(String type) {
+        return typeResolver.isJcrType(type);
+    }
 }
diff --git a/src/main/java/org/apache/sling/query/impl/resource/ResourcePropertyPredicate.java b/src/main/java/org/apache/sling/query/impl/resource/ResourcePropertyPredicate.java
index 493e465..279f23b 100644
--- a/src/main/java/org/apache/sling/query/impl/resource/ResourcePropertyPredicate.java
+++ b/src/main/java/org/apache/sling/query/impl/resource/ResourcePropertyPredicate.java
@@ -26,41 +26,41 @@
 import java.util.function.Predicate;
 
 public class ResourcePropertyPredicate implements Predicate<Resource> {
-	private final String key;
+    private final String key;
 
-	private final String value;
+    private final String value;
 
-	private final SelectorOperator operator;
+    private final SelectorOperator operator;
 
-	public ResourcePropertyPredicate(Attribute attribute) {
-		this.key = attribute.getKey();
-		this.value = attribute.getValue();
-		this.operator = SelectorOperator.getSelectorOperator(attribute.getOperator());
-	}
+    public ResourcePropertyPredicate(Attribute attribute) {
+        this.key = attribute.getKey();
+        this.value = attribute.getValue();
+        this.operator = SelectorOperator.getSelectorOperator(attribute.getOperator());
+    }
 
-	@Override
-	public boolean test(Resource resource) {
-		Resource property = resource.getChild(key);
-		if (property == null) {
-			return false;
-		} else if (value == null) {
-			return true;
-		} else {
-			return isEqualToValue(property);
-		}
-	}
+    @Override
+    public boolean test(Resource resource) {
+        Resource property = resource.getChild(key);
+        if (property == null) {
+            return false;
+        } else if (value == null) {
+            return true;
+        } else {
+            return isEqualToValue(property);
+        }
+    }
 
-	private boolean isEqualToValue(Resource property) {
-		final String[] multiProperty = property.adaptTo(String[].class);
-		if (multiProperty != null) {
-			for (String p : multiProperty) {
-				if (operator.accepts(p, value)) {
-					return true;
-				}
-			}
-			return false;
-		} else {
-			return operator.accepts(property.adaptTo(String.class), value);
-		}
-	}
+    private boolean isEqualToValue(Resource property) {
+        final String[] multiProperty = property.adaptTo(String[].class);
+        if (multiProperty != null) {
+            for (String p : multiProperty) {
+                if (operator.accepts(p, value)) {
+                    return true;
+                }
+            }
+            return false;
+        } else {
+            return operator.accepts(property.adaptTo(String.class), value);
+        }
+    }
 }
diff --git a/src/main/java/org/apache/sling/query/impl/resource/ResourceTreeProvider.java b/src/main/java/org/apache/sling/query/impl/resource/ResourceTreeProvider.java
index 0ec8e4e..ead4a2a 100644
--- a/src/main/java/org/apache/sling/query/impl/resource/ResourceTreeProvider.java
+++ b/src/main/java/org/apache/sling/query/impl/resource/ResourceTreeProvider.java
@@ -34,54 +34,54 @@
 
 public class ResourceTreeProvider implements TreeProvider<Resource> {
 
-	private final JcrTypeResolver typeResolver;
+    private final JcrTypeResolver typeResolver;
 
-	public ResourceTreeProvider(ResourceResolver resolver) {
-		this.typeResolver = new SessionJcrTypeResolver(resolver);
-	}
+    public ResourceTreeProvider(ResourceResolver resolver) {
+        this.typeResolver = new SessionJcrTypeResolver(resolver);
+    }
 
-	@Override
-	public Iterator<Resource> listChildren(Resource parent) {
-		return parent.listChildren();
-	}
+    @Override
+    public Iterator<Resource> listChildren(Resource parent) {
+        return parent.listChildren();
+    }
 
-	@Override
-	public Resource getParent(Resource element) {
-		return element.getParent();
-	}
+    @Override
+    public Resource getParent(Resource element) {
+        return element.getParent();
+    }
 
-	@Override
-	public String getName(Resource element) {
-		return element.getName();
-	}
+    @Override
+    public String getName(Resource element) {
+        return element.getName();
+    }
 
-	@Override
-	public Predicate<Resource> getPredicate(String type, String id, List<Attribute> attributes) {
-		return new ResourcePredicate(type, id, attributes, typeResolver);
-	}
+    @Override
+    public Predicate<Resource> getPredicate(String type, String id, List<Attribute> attributes) {
+        return new ResourcePredicate(type, id, attributes, typeResolver);
+    }
 
-	@Override
-	public Iterator<Resource> query(List<SelectorSegment> segments, Resource resource) {
-		return new JcrQueryIterator(segments, resource, typeResolver);
-	}
+    @Override
+    public Iterator<Resource> query(List<SelectorSegment> segments, Resource resource) {
+        return new JcrQueryIterator(segments, resource, typeResolver);
+    }
 
-	@Override
-	public boolean sameElement(Resource o1, Resource o2) {
-		if (o1 == null && o2 == null) {
-			return true;
-		}
-		if (o1 == null || o2 == null) {
-			return false;
-		}
-		return o1.getPath().equals(o2.getPath());
-	}
+    @Override
+    public boolean sameElement(Resource o1, Resource o2) {
+        if (o1 == null && o2 == null) {
+            return true;
+        }
+        if (o1 == null || o2 == null) {
+            return false;
+        }
+        return o1.getPath().equals(o2.getPath());
+    }
 
-	@Override
-	public boolean isDescendant(Resource root, Resource testedElement) {
-		if (root == null || testedElement == null) {
-			return false;
-		}
-		return testedElement.getPath().startsWith(root.getPath());
-	}
+    @Override
+    public boolean isDescendant(Resource root, Resource testedElement) {
+        if (root == null || testedElement == null) {
+            return false;
+        }
+        return testedElement.getPath().startsWith(root.getPath());
+    }
 
 }
diff --git a/src/main/java/org/apache/sling/query/impl/resource/jcr/JcrOperator.java b/src/main/java/org/apache/sling/query/impl/resource/jcr/JcrOperator.java
index b546f25..2d0b15c 100644
--- a/src/main/java/org/apache/sling/query/impl/resource/jcr/JcrOperator.java
+++ b/src/main/java/org/apache/sling/query/impl/resource/jcr/JcrOperator.java
@@ -20,57 +20,57 @@
 package org.apache.sling.query.impl.resource.jcr;
 
 public enum JcrOperator {
-	CONTAINS("*=") {
-		@Override
-		public String getJcrQueryFragment(String key, String value) {
-			return String.format("s.[%s] LIKE '%%%s%%'", key, value);
-		}
-	},
-	CONTAINS_WORD("~=") {
-		@Override
-		public String getJcrQueryFragment(String key, String value) {
-			return CONTAINS.getJcrQueryFragment(key, value);
-		}
-	},
-	ENDS_WITH("$=") {
-		@Override
-		public String getJcrQueryFragment(String key, String value) {
-			return String.format("s.[%s] LIKE '%%%s'", key, value);
-		}
-	},
-	EQUALS("=") {
-		@Override
-		public String getJcrQueryFragment(String key, String value) {
-			return String.format("s.[%s] = '%s'", key, value);
-		}
-	},
-	NOT_EQUAL("!=") {
-		@Override
-		public String getJcrQueryFragment(String key, String value) {
-			return String.format("s.[%s] != '%s'", key, value);
-		}
-	},
-	STARTS_WITH("^=") {
-		@Override
-		public String getJcrQueryFragment(String key, String value) {
-			return String.format("s.[%s] LIKE '%s%%'", key, value);
-		}
-	};
+    CONTAINS("*=") {
+        @Override
+        public String getJcrQueryFragment(String key, String value) {
+            return String.format("s.[%s] LIKE '%%%s%%'", key, value);
+        }
+    },
+    CONTAINS_WORD("~=") {
+        @Override
+        public String getJcrQueryFragment(String key, String value) {
+            return CONTAINS.getJcrQueryFragment(key, value);
+        }
+    },
+    ENDS_WITH("$=") {
+        @Override
+        public String getJcrQueryFragment(String key, String value) {
+            return String.format("s.[%s] LIKE '%%%s'", key, value);
+        }
+    },
+    EQUALS("=") {
+        @Override
+        public String getJcrQueryFragment(String key, String value) {
+            return String.format("s.[%s] = '%s'", key, value);
+        }
+    },
+    NOT_EQUAL("!=") {
+        @Override
+        public String getJcrQueryFragment(String key, String value) {
+            return String.format("s.[%s] != '%s'", key, value);
+        }
+    },
+    STARTS_WITH("^=") {
+        @Override
+        public String getJcrQueryFragment(String key, String value) {
+            return String.format("s.[%s] LIKE '%s%%'", key, value);
+        }
+    };
 
-	private final String operator;
+    private final String operator;
 
-	JcrOperator(String operator) {
-		this.operator = operator;
-	}
+    JcrOperator(String operator) {
+        this.operator = operator;
+    }
 
-	public abstract String getJcrQueryFragment(String key, String value);
+    public abstract String getJcrQueryFragment(String key, String value);
 
-	public static JcrOperator getSelectorOperator(String operator) {
-		for (JcrOperator o : values()) {
-			if (o.operator.equals(operator)) {
-				return o;
-			}
-		}
-		return EQUALS;
-	}
+    public static JcrOperator getSelectorOperator(String operator) {
+        for (JcrOperator o : values()) {
+            if (o.operator.equals(operator)) {
+                return o;
+            }
+        }
+        return EQUALS;
+    }
 }
diff --git a/src/main/java/org/apache/sling/query/impl/resource/jcr/JcrQueryIterator.java b/src/main/java/org/apache/sling/query/impl/resource/jcr/JcrQueryIterator.java
index 7201691..0b0e0fa 100644
--- a/src/main/java/org/apache/sling/query/impl/resource/jcr/JcrQueryIterator.java
+++ b/src/main/java/org/apache/sling/query/impl/resource/jcr/JcrQueryIterator.java
@@ -30,27 +30,27 @@
 
 public class JcrQueryIterator extends AbstractIterator<Resource> {
 
-	private final ResourceResolver resolver;
+    private final ResourceResolver resolver;
 
-	private final String query;
+    private final String query;
 
-	private Iterator<Resource> currentIterator;
+    private Iterator<Resource> currentIterator;
 
-	public JcrQueryIterator(List<SelectorSegment> segments, Resource root, JcrTypeResolver typeResolver) {
-		JcrQueryBuilder builder = new JcrQueryBuilder(typeResolver);
-		query = builder.buildQuery(segments, root.getPath());
-		resolver = root.getResourceResolver();
-	}
+    public JcrQueryIterator(List<SelectorSegment> segments, Resource root, JcrTypeResolver typeResolver) {
+        JcrQueryBuilder builder = new JcrQueryBuilder(typeResolver);
+        query = builder.buildQuery(segments, root.getPath());
+        resolver = root.getResourceResolver();
+    }
 
-	@Override
-	protected Resource getElement() {
-		if (currentIterator == null) {
-			currentIterator = resolver.findResources(query, "JCR-SQL2");
-		}
-		if (currentIterator.hasNext()) {
-			return currentIterator.next();
-		} else {
-			return null;
-		}
-	}
+    @Override
+    protected Resource getElement() {
+        if (currentIterator == null) {
+            currentIterator = resolver.findResources(query, "JCR-SQL2");
+        }
+        if (currentIterator.hasNext()) {
+            return currentIterator.next();
+        } else {
+            return null;
+        }
+    }
 }
diff --git a/src/main/java/org/apache/sling/query/impl/resource/jcr/JcrTypeResolver.java b/src/main/java/org/apache/sling/query/impl/resource/jcr/JcrTypeResolver.java
index 3ecb242..4873a2c 100644
--- a/src/main/java/org/apache/sling/query/impl/resource/jcr/JcrTypeResolver.java
+++ b/src/main/java/org/apache/sling/query/impl/resource/jcr/JcrTypeResolver.java
@@ -20,7 +20,7 @@
 package org.apache.sling.query.impl.resource.jcr;
 
 public interface JcrTypeResolver {
-	boolean isJcrType(String name);
+    boolean isJcrType(String name);
 
-	boolean isSubtype(String supertype, String subtype);
+    boolean isSubtype(String supertype, String subtype);
 }
diff --git a/src/main/java/org/apache/sling/query/impl/resource/jcr/SessionJcrTypeResolver.java b/src/main/java/org/apache/sling/query/impl/resource/jcr/SessionJcrTypeResolver.java
index 118f853..ac50968 100644
--- a/src/main/java/org/apache/sling/query/impl/resource/jcr/SessionJcrTypeResolver.java
+++ b/src/main/java/org/apache/sling/query/impl/resource/jcr/SessionJcrTypeResolver.java
@@ -30,56 +30,56 @@
 
 public class SessionJcrTypeResolver implements JcrTypeResolver {
 
-	private static final Logger LOG = LoggerFactory.getLogger(SessionJcrTypeResolver.class);
+    private static final Logger LOG = LoggerFactory.getLogger(SessionJcrTypeResolver.class);
 
-	private final NodeTypeManager nodeTypeManager;
+    private final NodeTypeManager nodeTypeManager;
 
-	public SessionJcrTypeResolver(ResourceResolver resolver) {
-		NodeTypeManager m = null;
-		try {
-			if (resolver != null) {
-				m = resolver.adaptTo(Session.class).getWorkspace().getNodeTypeManager();
-			}
-		} catch (RepositoryException e) {
-			LOG.error("Can't get node type manager", e);
-			m = null;
-		}
-		nodeTypeManager = m;
-	}
+    public SessionJcrTypeResolver(ResourceResolver resolver) {
+        NodeTypeManager m = null;
+        try {
+            if (resolver != null) {
+                m = resolver.adaptTo(Session.class).getWorkspace().getNodeTypeManager();
+            }
+        } catch (RepositoryException e) {
+            LOG.error("Can't get node type manager", e);
+            m = null;
+        }
+        nodeTypeManager = m;
+    }
 
-	@Override
-	public boolean isJcrType(String name) {
-		if (nodeTypeManager == null) {
-			return false;
-		}
-		if (name == null || name.contains("/")) {
-			return false;
-		}
-		try {
-			nodeTypeManager.getNodeType(name);
-			return true;
-		} catch (NoSuchNodeTypeException e) {
-			return false;
-		} catch (RepositoryException e) {
-			LOG.error("Can't check node type " + name, e);
-			return false;
-		}
-	}
+    @Override
+    public boolean isJcrType(String name) {
+        if (nodeTypeManager == null) {
+            return false;
+        }
+        if (name == null || name.contains("/")) {
+            return false;
+        }
+        try {
+            nodeTypeManager.getNodeType(name);
+            return true;
+        } catch (NoSuchNodeTypeException e) {
+            return false;
+        } catch (RepositoryException e) {
+            LOG.error("Can't check node type " + name, e);
+            return false;
+        }
+    }
 
-	@Override
-	public boolean isSubtype(String supertype, String subtype) {
-		if (nodeTypeManager == null) {
-			return false;
-		}
-		if (!isJcrType(subtype) || !isJcrType(supertype)) {
-			return false;
-		}
-		try {
-			return nodeTypeManager.getNodeType(subtype).isNodeType(supertype);
-		} catch (RepositoryException e) {
-			LOG.error("Can't compare two node types: " + subtype + " and " + supertype, e);
-			return false;
-		}
-	}
+    @Override
+    public boolean isSubtype(String supertype, String subtype) {
+        if (nodeTypeManager == null) {
+            return false;
+        }
+        if (!isJcrType(subtype) || !isJcrType(supertype)) {
+            return false;
+        }
+        try {
+            return nodeTypeManager.getNodeType(subtype).isNodeType(supertype);
+        } catch (RepositoryException e) {
+            LOG.error("Can't compare two node types: " + subtype + " and " + supertype, e);
+            return false;
+        }
+    }
 
 }
diff --git a/src/main/java/org/apache/sling/query/impl/resource/jcr/query/Atomic.java b/src/main/java/org/apache/sling/query/impl/resource/jcr/query/Atomic.java
index e998bca..ba251c3 100644
--- a/src/main/java/org/apache/sling/query/impl/resource/jcr/query/Atomic.java
+++ b/src/main/java/org/apache/sling/query/impl/resource/jcr/query/Atomic.java
@@ -21,14 +21,14 @@
 
 public class Atomic implements Term {
 
-	private final String condition;
+    private final String condition;
 
-	public Atomic(String condition) {
-		this.condition = condition;
-	}
+    public Atomic(String condition) {
+        this.condition = condition;
+    }
 
-	@Override
-	public String buildString() {
-		return condition;
-	}
+    @Override
+    public String buildString() {
+        return condition;
+    }
 }
diff --git a/src/main/java/org/apache/sling/query/impl/resource/jcr/query/Formula.java b/src/main/java/org/apache/sling/query/impl/resource/jcr/query/Formula.java
index 4745049..607f001 100644
--- a/src/main/java/org/apache/sling/query/impl/resource/jcr/query/Formula.java
+++ b/src/main/java/org/apache/sling/query/impl/resource/jcr/query/Formula.java
@@ -23,39 +23,39 @@
 import java.util.List;
 
 public class Formula implements Term {
-	public enum Operator {
-		AND, OR
-	}
+    public enum Operator {
+        AND, OR
+    }
 
-	private final Operator operator;
+    private final Operator operator;
 
-	private final List<Term> conditions;
+    private final List<Term> conditions;
 
-	public Formula(Operator operator, List<Term> conditions) {
-		this.operator = operator;
-		this.conditions = conditions;
-	}
+    public Formula(Operator operator, List<Term> conditions) {
+        this.operator = operator;
+        this.conditions = conditions;
+    }
 
-	public String buildString() {
-		if (conditions.isEmpty()) {
-			return "";
-		}
+    public String buildString() {
+        if (conditions.isEmpty()) {
+            return "";
+        }
 
-		StringBuilder builder = new StringBuilder();
-		Iterator<Term> iterator = conditions.iterator();
-		if (conditions.size() > 1) {
-			builder.append("(");
-		}
-		while (iterator.hasNext()) {
-			Term term = iterator.next();
-			builder.append(term.buildString());
-			if (iterator.hasNext()) {
-				builder.append(' ').append(operator.toString()).append(' ');
-			}
-		}
-		if (conditions.size() > 1) {
-			builder.append(")");
-		}
-		return builder.toString();
-	}
+        StringBuilder builder = new StringBuilder();
+        Iterator<Term> iterator = conditions.iterator();
+        if (conditions.size() > 1) {
+            builder.append("(");
+        }
+        while (iterator.hasNext()) {
+            Term term = iterator.next();
+            builder.append(term.buildString());
+            if (iterator.hasNext()) {
+                builder.append(' ').append(operator.toString()).append(' ');
+            }
+        }
+        if (conditions.size() > 1) {
+            builder.append(")");
+        }
+        return builder.toString();
+    }
 }
diff --git a/src/main/java/org/apache/sling/query/impl/resource/jcr/query/JcrQueryBuilder.java b/src/main/java/org/apache/sling/query/impl/resource/jcr/query/JcrQueryBuilder.java
index e0b296c..6bcef63 100644
--- a/src/main/java/org/apache/sling/query/impl/resource/jcr/query/JcrQueryBuilder.java
+++ b/src/main/java/org/apache/sling/query/impl/resource/jcr/query/JcrQueryBuilder.java
@@ -31,111 +31,111 @@
 
 public class JcrQueryBuilder {
 
-	private final JcrTypeResolver typeResolver;
+    private final JcrTypeResolver typeResolver;
 
-	public JcrQueryBuilder(JcrTypeResolver typeResolver) {
-		this.typeResolver = typeResolver;
-	}
+    public JcrQueryBuilder(JcrTypeResolver typeResolver) {
+        this.typeResolver = typeResolver;
+    }
 
-	public String buildQuery(List<SelectorSegment> segments, String rootPath) {
-		StringBuilder query = new StringBuilder();
-		query.append("SELECT * FROM [");
-		query.append(findPrimaryType(segments));
-		query.append("]");
-		query.append(" AS s");
+    public String buildQuery(List<SelectorSegment> segments, String rootPath) {
+        StringBuilder query = new StringBuilder();
+        query.append("SELECT * FROM [");
+        query.append(findPrimaryType(segments));
+        query.append("]");
+        query.append(" AS s");
 
-		String conditionString = getConditionString(segments, rootPath);
-		if (StringUtils.isNotBlank(conditionString)) {
-			query.append(" WHERE ").append(conditionString);
-		}
-		return query.toString();
-	}
+        String conditionString = getConditionString(segments, rootPath);
+        if (StringUtils.isNotBlank(conditionString)) {
+            query.append(" WHERE ").append(conditionString);
+        }
+        return query.toString();
+    }
 
-	private String getConditionString(List<SelectorSegment> segments, String rootPath) {
-		Formula formula = prepareAlternativeConditions(segments);
-		if (StringUtils.isNotBlank(rootPath) && !"/".equals(rootPath)) {
-			List<Term> conditions = new ArrayList<Term>();
-			conditions.add(new Atomic(String.format("ISDESCENDANTNODE('%s')", rootPath)));
-			if (formula != null) {
-				conditions.add(formula);
-			}
-			formula = new Formula(Operator.AND, conditions);
-		}
-		if (formula == null) {
-			return null;
-		} else {
-			return formula.buildString();
-		}
-	}
+    private String getConditionString(List<SelectorSegment> segments, String rootPath) {
+        Formula formula = prepareAlternativeConditions(segments);
+        if (StringUtils.isNotBlank(rootPath) && !"/".equals(rootPath)) {
+            List<Term> conditions = new ArrayList<Term>();
+            conditions.add(new Atomic(String.format("ISDESCENDANTNODE('%s')", rootPath)));
+            if (formula != null) {
+                conditions.add(formula);
+            }
+            formula = new Formula(Operator.AND, conditions);
+        }
+        if (formula == null) {
+            return null;
+        } else {
+            return formula.buildString();
+        }
+    }
 
-	private String findPrimaryType(List<SelectorSegment> segments) {
-		String result = null;
-		for (SelectorSegment s : segments) {
-			String type = s.getType();
-			if (!typeResolver.isJcrType(type)) {
-				continue;
-			}
-			if (result == null) {
-				result = type;
-			} else if (typeResolver.isSubtype(type, result)) {
-				result = type;
-			} else if (!typeResolver.isSubtype(result, type)) {
-				result = "nt:base";
-			}
-		}
-		if (result == null) {
-			result = "nt:base";
-		}
-		return result;
-	}
+    private String findPrimaryType(List<SelectorSegment> segments) {
+        String result = null;
+        for (SelectorSegment s : segments) {
+            String type = s.getType();
+            if (!typeResolver.isJcrType(type)) {
+                continue;
+            }
+            if (result == null) {
+                result = type;
+            } else if (typeResolver.isSubtype(type, result)) {
+                result = type;
+            } else if (!typeResolver.isSubtype(result, type)) {
+                result = "nt:base";
+            }
+        }
+        if (result == null) {
+            result = "nt:base";
+        }
+        return result;
+    }
 
-	private static Formula prepareAlternativeConditions(List<SelectorSegment> segments) {
-		List<Term> list = new ArrayList<>();
-		for (SelectorSegment segment : segments) {
-			Formula conditions = prepareSegmentConditions(segment.getType(), segment.getName(),
-					segment.getAttributes());
-			if (conditions != null) {
-				list.add(conditions);
-			}
-		}
-		if (list.isEmpty()) {
-			return null;
-		} else {
-			return new Formula(Operator.OR, list);
-		}
-	}
+    private static Formula prepareAlternativeConditions(List<SelectorSegment> segments) {
+        List<Term> list = new ArrayList<>();
+        for (SelectorSegment segment : segments) {
+            Formula conditions = prepareSegmentConditions(segment.getType(), segment.getName(),
+                    segment.getAttributes());
+            if (conditions != null) {
+                list.add(conditions);
+            }
+        }
+        if (list.isEmpty()) {
+            return null;
+        } else {
+            return new Formula(Operator.OR, list);
+        }
+    }
 
-	private static Formula prepareSegmentConditions(String resourceType, String resourceName,
-			List<Attribute> attributes) {
-		List<Term> conditions = new ArrayList<>();
-		if (StringUtils.isNotBlank(resourceType) && !StringUtils.contains(resourceType, ':')) {
-			conditions.add(new Atomic(String.format("s.[sling:resourceType] = '%s'", resourceType)));
-		}
-		if (StringUtils.isNotBlank(resourceName)) {
-			conditions.add(new Atomic(String.format("NAME(s) = '%s'", resourceName)));
-		}
-		if (attributes != null) {
-			for (Attribute a : attributes) {
-				String attributeCondition = getAttributeCondition(a);
-				if (StringUtils.isNotBlank(attributeCondition)) {
-					conditions.add(new Atomic(attributeCondition));
-				}
-			}
-		}
-		if (conditions.isEmpty()) {
-			return null;
-		} else {
-			return new Formula(Operator.AND, conditions);
-		}
-	}
+    private static Formula prepareSegmentConditions(String resourceType, String resourceName,
+            List<Attribute> attributes) {
+        List<Term> conditions = new ArrayList<>();
+        if (StringUtils.isNotBlank(resourceType) && !StringUtils.contains(resourceType, ':')) {
+            conditions.add(new Atomic(String.format("s.[sling:resourceType] = '%s'", resourceType)));
+        }
+        if (StringUtils.isNotBlank(resourceName)) {
+            conditions.add(new Atomic(String.format("NAME(s) = '%s'", resourceName)));
+        }
+        if (attributes != null) {
+            for (Attribute a : attributes) {
+                String attributeCondition = getAttributeCondition(a);
+                if (StringUtils.isNotBlank(attributeCondition)) {
+                    conditions.add(new Atomic(attributeCondition));
+                }
+            }
+        }
+        if (conditions.isEmpty()) {
+            return null;
+        } else {
+            return new Formula(Operator.AND, conditions);
+        }
+    }
 
-	private static String getAttributeCondition(Attribute attribute) {
-		if (attribute.getKey().contains("/")) {
-			return null;
-		}
+    private static String getAttributeCondition(Attribute attribute) {
+        if (attribute.getKey().contains("/")) {
+            return null;
+        }
 
-		JcrOperator operator = JcrOperator.getSelectorOperator(attribute.getOperator());
-		String value = StringUtils.replace(attribute.getValue(), "'", "''");
-		return operator.getJcrQueryFragment(attribute.getKey(), value);
-	}
+        JcrOperator operator = JcrOperator.getSelectorOperator(attribute.getOperator());
+        String value = StringUtils.replace(attribute.getValue(), "'", "''");
+        return operator.getJcrQueryFragment(attribute.getKey(), value);
+    }
 }
diff --git a/src/main/java/org/apache/sling/query/impl/resource/jcr/query/Term.java b/src/main/java/org/apache/sling/query/impl/resource/jcr/query/Term.java
index 4515639..04509e4 100644
--- a/src/main/java/org/apache/sling/query/impl/resource/jcr/query/Term.java
+++ b/src/main/java/org/apache/sling/query/impl/resource/jcr/query/Term.java
@@ -20,5 +20,5 @@
 package org.apache.sling.query.impl.resource.jcr.query;
 
 public interface Term {
-	String buildString();
+    String buildString();
 }
diff --git a/src/main/java/org/apache/sling/query/impl/selector/FunctionType.java b/src/main/java/org/apache/sling/query/impl/selector/FunctionType.java
index 626e065..467ef32 100644
--- a/src/main/java/org/apache/sling/query/impl/selector/FunctionType.java
+++ b/src/main/java/org/apache/sling/query/impl/selector/FunctionType.java
@@ -33,85 +33,75 @@
 import java.util.function.Function;
 
 public enum FunctionType {
-	EQ {
-		@Override
-		public <T> Function<?, ?> getFunction(String argument, SearchStrategy strategy,
-				TreeProvider<T> provider) {
-			int index = Integer.parseInt(argument);
-			return new SliceFunction<T>(index, index);
-		}
-	},
-	FIRST {
-		@Override
-		public <T> Function<?, ?> getFunction(String argument, SearchStrategy strategy,
-				TreeProvider<T> provider) {
-			return new SliceFunction<T>(0, 0);
-		}
-	},
-	LAST {
-		@Override
-		public <T> Function<?, ?> getFunction(String argument, SearchStrategy strategy,
-				TreeProvider<T> provider) {
-			return new LastFunction<T>();
-		}
-	},
-	GT {
-		@Override
-		public <T> Function<?, ?> getFunction(String argument, SearchStrategy strategy,
-				TreeProvider<T> provider) {
-			return new SliceFunction<T>(Integer.valueOf(argument) + 1);
-		}
-	},
-	LT {
-		@Override
-		public <T> Function<?, ?> getFunction(String argument, SearchStrategy strategy,
-				TreeProvider<T> provider) {
-			return new SliceFunction<T>(0, Integer.valueOf(argument) - 1);
-		}
-	},
-	HAS {
-		@Override
-		public <T> Function<?, ?> getFunction(String selector, SearchStrategy strategy,
-											  TreeProvider<T> provider) {
-			return new HasFunction<T>(selector, strategy, provider);
-		}
-	},
-	PARENT {
-		@Override
-		public <T> Function<?, ?> getFunction(String selector, SearchStrategy strategy,
-				final TreeProvider<T> provider) {
-			return new FilterFunction<T>(new ParentPredicate<T>(provider));
-		}
-	},
-	EMPTY {
-		@Override
-		public <T> Function<?, ?> getFunction(String argument, SearchStrategy strategy,
-				final TreeProvider<T> provider) {
-			return new FilterFunction<T>(new RejectingPredicate<T>(new ParentPredicate<T>(provider)));
-		}
-	},
-	ODD {
-		@Override
-		public <T> Function<?, ?> getFunction(String argument, SearchStrategy strategy,
-				TreeProvider<T> provider) {
-			return new EvenFunction<T>(false);
-		}
-	},
-	EVEN {
-		@Override
-		public <T> Function<?, ?> getFunction(String argument, SearchStrategy strategy,
-				TreeProvider<T> provider) {
-			return new EvenFunction<T>(true);
-		}
-	},
-	NOT {
-		@Override
-		public <T> Function<?, ?> getFunction(String argument, SearchStrategy strategy,
-				TreeProvider<T> provider) {
-			return new NotFunction<T>(new SelectorFunction<T>(argument, provider, strategy));
-		}
-	};
+    EQ {
+        @Override
+        public <T> Function<?, ?> getFunction(String argument, SearchStrategy strategy, TreeProvider<T> provider) {
+            int index = Integer.parseInt(argument);
+            return new SliceFunction<T>(index, index);
+        }
+    },
+    FIRST {
+        @Override
+        public <T> Function<?, ?> getFunction(String argument, SearchStrategy strategy, TreeProvider<T> provider) {
+            return new SliceFunction<T>(0, 0);
+        }
+    },
+    LAST {
+        @Override
+        public <T> Function<?, ?> getFunction(String argument, SearchStrategy strategy, TreeProvider<T> provider) {
+            return new LastFunction<T>();
+        }
+    },
+    GT {
+        @Override
+        public <T> Function<?, ?> getFunction(String argument, SearchStrategy strategy, TreeProvider<T> provider) {
+            return new SliceFunction<T>(Integer.valueOf(argument) + 1);
+        }
+    },
+    LT {
+        @Override
+        public <T> Function<?, ?> getFunction(String argument, SearchStrategy strategy, TreeProvider<T> provider) {
+            return new SliceFunction<T>(0, Integer.valueOf(argument) - 1);
+        }
+    },
+    HAS {
+        @Override
+        public <T> Function<?, ?> getFunction(String selector, SearchStrategy strategy, TreeProvider<T> provider) {
+            return new HasFunction<T>(selector, strategy, provider);
+        }
+    },
+    PARENT {
+        @Override
+        public <T> Function<?, ?> getFunction(String selector, SearchStrategy strategy,
+                final TreeProvider<T> provider) {
+            return new FilterFunction<T>(new ParentPredicate<T>(provider));
+        }
+    },
+    EMPTY {
+        @Override
+        public <T> Function<?, ?> getFunction(String argument, SearchStrategy strategy,
+                final TreeProvider<T> provider) {
+            return new FilterFunction<T>(new RejectingPredicate<T>(new ParentPredicate<T>(provider)));
+        }
+    },
+    ODD {
+        @Override
+        public <T> Function<?, ?> getFunction(String argument, SearchStrategy strategy, TreeProvider<T> provider) {
+            return new EvenFunction<T>(false);
+        }
+    },
+    EVEN {
+        @Override
+        public <T> Function<?, ?> getFunction(String argument, SearchStrategy strategy, TreeProvider<T> provider) {
+            return new EvenFunction<T>(true);
+        }
+    },
+    NOT {
+        @Override
+        public <T> Function<?, ?> getFunction(String argument, SearchStrategy strategy, TreeProvider<T> provider) {
+            return new NotFunction<T>(new SelectorFunction<T>(argument, provider, strategy));
+        }
+    };
 
-	public abstract <T> Function<?, ?> getFunction(String argument, SearchStrategy strategy,
-			TreeProvider<T> provider);
+    public abstract <T> Function<?, ?> getFunction(String argument, SearchStrategy strategy, TreeProvider<T> provider);
 }
diff --git a/src/main/java/org/apache/sling/query/impl/selector/HierarchyOperator.java b/src/main/java/org/apache/sling/query/impl/selector/HierarchyOperator.java
index 4ad399e..b422a1d 100644
--- a/src/main/java/org/apache/sling/query/impl/selector/HierarchyOperator.java
+++ b/src/main/java/org/apache/sling/query/impl/selector/HierarchyOperator.java
@@ -31,54 +31,59 @@
 import java.util.function.Function;
 
 public enum HierarchyOperator {
-//@formatter:off
-	CHILD('>') {
-		@Override
-		public <T> Function<?, ?> getFunction(SelectorSegment segment, SearchStrategy strategy, TreeProvider<T> provider) {
-			return new ChildrenFunction<T>(provider);
-		}
-	},
-	DESCENDANT(' ') {
-		@Override
-		public <T> Function<?, ?> getFunction(SelectorSegment segment, SearchStrategy strategy, TreeProvider<T> provider) {
-			return new FindFunction<T>(strategy, provider, segment);
-		}
-	},
-	NEXT_ADJACENT('+') {
-		@Override
-		public <T> Function<?, ?> getFunction(SelectorSegment segment, SearchStrategy strategy, TreeProvider<T> provider) {
-			return new NextFunction<T>(null, provider);
-		}
-	},
-	NEXT_SIBLINGS('~') {
-		@Override
-		public <T> Function<?, ?> getFunction(SelectorSegment segment, SearchStrategy strategy, TreeProvider<T> provider) {
-			return new NextFunction<T>(new RejectingPredicate<T>(), provider);
-		}
-	},
-	NOOP((char)0) {
-		@Override
-		public <T> Function<?, ?> getFunction(SelectorSegment segment, SearchStrategy strategy, TreeProvider<T> provider) {
-			return new IdentityFunction<T>();
-		}
-	};
-//@formatter:on
+    // @formatter:off
+    CHILD('>') {
+        @Override
+        public <T> Function<?, ?> getFunction(SelectorSegment segment, SearchStrategy strategy,
+                TreeProvider<T> provider) {
+            return new ChildrenFunction<T>(provider);
+        }
+    },
+    DESCENDANT(' ') {
+        @Override
+        public <T> Function<?, ?> getFunction(SelectorSegment segment, SearchStrategy strategy,
+                TreeProvider<T> provider) {
+            return new FindFunction<T>(strategy, provider, segment);
+        }
+    },
+    NEXT_ADJACENT('+') {
+        @Override
+        public <T> Function<?, ?> getFunction(SelectorSegment segment, SearchStrategy strategy,
+                TreeProvider<T> provider) {
+            return new NextFunction<T>(null, provider);
+        }
+    },
+    NEXT_SIBLINGS('~') {
+        @Override
+        public <T> Function<?, ?> getFunction(SelectorSegment segment, SearchStrategy strategy,
+                TreeProvider<T> provider) {
+            return new NextFunction<T>(new RejectingPredicate<T>(), provider);
+        }
+    },
+    NOOP((char) 0) {
+        @Override
+        public <T> Function<?, ?> getFunction(SelectorSegment segment, SearchStrategy strategy,
+                TreeProvider<T> provider) {
+            return new IdentityFunction<T>();
+        }
+    };
+    // @formatter:on
 
-	private final char c;
+    private final char c;
 
-	private HierarchyOperator(char c) {
-		this.c = c;
-	}
+    private HierarchyOperator(char c) {
+        this.c = c;
+    }
 
-	public abstract <T> Function<?, ?> getFunction(SelectorSegment segment, SearchStrategy strategy,
-												   TreeProvider<T> provider);
+    public abstract <T> Function<?, ?> getFunction(SelectorSegment segment, SearchStrategy strategy,
+            TreeProvider<T> provider);
 
-	public static HierarchyOperator findByCharacter(char c) {
-		for (HierarchyOperator operator : values()) {
-			if (operator.c == c) {
-				return operator;
-			}
-		}
-		return NOOP;
-	}
+    public static HierarchyOperator findByCharacter(char c) {
+        for (HierarchyOperator operator : values()) {
+            if (operator.c == c) {
+                return operator;
+            }
+        }
+        return NOOP;
+    }
 }
diff --git a/src/main/java/org/apache/sling/query/impl/selector/SelectorFunction.java b/src/main/java/org/apache/sling/query/impl/selector/SelectorFunction.java
index 4f10e8a..395139a 100644
--- a/src/main/java/org/apache/sling/query/impl/selector/SelectorFunction.java
+++ b/src/main/java/org/apache/sling/query/impl/selector/SelectorFunction.java
@@ -43,59 +43,58 @@
 
 public class SelectorFunction<T> implements IteratorToIteratorFunction<T>, Predicate<T> {
 
-	private final List<IteratorToIteratorFunction<T>> selectorFunctions;
+    private final List<IteratorToIteratorFunction<T>> selectorFunctions;
 
-	private final TreeProvider<T> provider;
+    private final TreeProvider<T> provider;
 
-	private final SearchStrategy strategy;
+    private final SearchStrategy strategy;
 
-	public SelectorFunction(String selector, TreeProvider<T> provider, SearchStrategy strategy) {
-		this.provider = provider;
-		this.strategy = strategy;
-		List<Selector> selectors = SelectorParser.parse(selector);
-		selectorFunctions = new ArrayList<>();
-		for (Selector s : selectors) {
-			selectorFunctions.add(createSelectorFunction(s.getSegments()));
-		}
-	}
+    public SelectorFunction(String selector, TreeProvider<T> provider, SearchStrategy strategy) {
+        this.provider = provider;
+        this.strategy = strategy;
+        List<Selector> selectors = SelectorParser.parse(selector);
+        selectorFunctions = new ArrayList<>();
+        for (Selector s : selectors) {
+            selectorFunctions.add(createSelectorFunction(s.getSegments()));
+        }
+    }
 
-	@Override
-	public Iterator<Option<T>> apply(Iterator<Option<T>> input) {
-		LazyList<Option<T>> list = new LazyList<Option<T>>(input);
-		List<Iterator<Option<T>>> iterators = new ArrayList<>();
-		for (IteratorToIteratorFunction<T> function : selectorFunctions) {
-			iterators.add(new SuppIterator<T>(list, function));
-		}
-		return new AlternativeIterator<T>(iterators);
-	}
+    @Override
+    public Iterator<Option<T>> apply(Iterator<Option<T>> input) {
+        LazyList<Option<T>> list = new LazyList<Option<T>>(input);
+        List<Iterator<Option<T>>> iterators = new ArrayList<>();
+        for (IteratorToIteratorFunction<T> function : selectorFunctions) {
+            iterators.add(new SuppIterator<T>(list, function));
+        }
+        return new AlternativeIterator<T>(iterators);
+    }
 
-	@Override
-	public boolean test(T resource) {
-		Iterator<Option<T>> result = apply(IteratorUtils.singleElementIterator(Option.of(resource, 0)));
-		return new EmptyElementFilter<T>(result).hasNext();
-	}
+    @Override
+    public boolean test(T resource) {
+        Iterator<Option<T>> result = apply(IteratorUtils.singleElementIterator(Option.of(resource, 0)));
+        return new EmptyElementFilter<T>(result).hasNext();
+    }
 
-	private IteratorToIteratorFunction<T> createSelectorFunction(List<SelectorSegment> segments) {
-		List<Function<?, ?>> segmentFunctions = new ArrayList<>();
-		for (SelectorSegment segment : segments) {
-			segmentFunctions.addAll(createSegmentFunction(segment));
-		}
-		return new CompositeFunction<T>(segmentFunctions);
-	}
+    private IteratorToIteratorFunction<T> createSelectorFunction(List<SelectorSegment> segments) {
+        List<Function<?, ?>> segmentFunctions = new ArrayList<>();
+        for (SelectorSegment segment : segments) {
+            segmentFunctions.addAll(createSegmentFunction(segment));
+        }
+        return new CompositeFunction<T>(segmentFunctions);
+    }
 
-	private List<Function<?, ?>> createSegmentFunction(SelectorSegment segment) {
-		List<Function<?, ?>> functions = new ArrayList<>();
-		HierarchyOperator operator = HierarchyOperator.findByCharacter(segment.getHierarchyOperator());
-		functions.add(operator.getFunction(segment, strategy, provider));
-		Predicate<T> predicate = provider.getPredicate(segment.getType(), segment.getName(),
-				segment.getAttributes());
-		functions.add(new FilterFunction<T>(predicate));
-		for (Modifier modifiers : segment.getModifiers()) {
-			FunctionType type = FunctionType.valueOf(modifiers.getName().toUpperCase());
-			Function<?, ?> f = type.getFunction(modifiers.getArgument(), strategy, provider);
-			functions.add(f);
-		}
-		return functions;
-	}
+    private List<Function<?, ?>> createSegmentFunction(SelectorSegment segment) {
+        List<Function<?, ?>> functions = new ArrayList<>();
+        HierarchyOperator operator = HierarchyOperator.findByCharacter(segment.getHierarchyOperator());
+        functions.add(operator.getFunction(segment, strategy, provider));
+        Predicate<T> predicate = provider.getPredicate(segment.getType(), segment.getName(), segment.getAttributes());
+        functions.add(new FilterFunction<T>(predicate));
+        for (Modifier modifiers : segment.getModifiers()) {
+            FunctionType type = FunctionType.valueOf(modifiers.getName().toUpperCase());
+            Function<?, ?> f = type.getFunction(modifiers.getArgument(), strategy, provider);
+            functions.add(f);
+        }
+        return functions;
+    }
 
 }
diff --git a/src/main/java/org/apache/sling/query/impl/selector/parser/Attribute.java b/src/main/java/org/apache/sling/query/impl/selector/parser/Attribute.java
index ba4db14..f6fc2e9 100644
--- a/src/main/java/org/apache/sling/query/impl/selector/parser/Attribute.java
+++ b/src/main/java/org/apache/sling/query/impl/selector/parser/Attribute.java
@@ -23,49 +23,49 @@
 import org.apache.commons.lang.builder.HashCodeBuilder;
 
 public class Attribute {
-	private final String key;
+    private final String key;
 
-	private final String operator;
+    private final String operator;
 
-	private final String value;
+    private final String value;
 
-	public Attribute(String key, String operator, String value) {
-		this.key = key;
-		this.operator = operator;
-		this.value = value;
-	}
+    public Attribute(String key, String operator, String value) {
+        this.key = key;
+        this.operator = operator;
+        this.value = value;
+    }
 
-	public String getKey() {
-		return key;
-	}
+    public String getKey() {
+        return key;
+    }
 
-	public String getOperator() {
-		return operator;
-	}
+    public String getOperator() {
+        return operator;
+    }
 
-	public String getValue() {
-		return value;
-	}
+    public String getValue() {
+        return value;
+    }
 
-	public String toString() {
-		return String.format("Attribute[%s %s %s]", key, operator, value);
-	}
+    public String toString() {
+        return String.format("Attribute[%s %s %s]", key, operator, value);
+    }
 
-	public boolean equals(Object obj) {
-		if (obj == null) {
-			return false;
-		}
-		if (obj == this) {
-			return true;
-		}
-		if (obj.getClass() != getClass()) {
-			return false;
-		}
-		Attribute rhs = (Attribute) obj;
-		return new EqualsBuilder().append(key, rhs.key).append(value, rhs.value).isEquals();
-	}
+    public boolean equals(Object obj) {
+        if (obj == null) {
+            return false;
+        }
+        if (obj == this) {
+            return true;
+        }
+        if (obj.getClass() != getClass()) {
+            return false;
+        }
+        Attribute rhs = (Attribute) obj;
+        return new EqualsBuilder().append(key, rhs.key).append(value, rhs.value).isEquals();
+    }
 
-	public int hashCode() {
-		return new HashCodeBuilder().append(key).append(value).toHashCode();
-	}
+    public int hashCode() {
+        return new HashCodeBuilder().append(key).append(value).toHashCode();
+    }
 }
diff --git a/src/main/java/org/apache/sling/query/impl/selector/parser/Modifier.java b/src/main/java/org/apache/sling/query/impl/selector/parser/Modifier.java
index 1c60da1..00a8a21 100644
--- a/src/main/java/org/apache/sling/query/impl/selector/parser/Modifier.java
+++ b/src/main/java/org/apache/sling/query/impl/selector/parser/Modifier.java
@@ -24,46 +24,45 @@
 
 public class Modifier {
 
-	private final String name;
+    private final String name;
 
-	private final String argument;
+    private final String argument;
 
-	public Modifier(String name, String argument) {
-		this.name = name;
-		this.argument = argument;
-	}
+    public Modifier(String name, String argument) {
+        this.name = name;
+        this.argument = argument;
+    }
 
-	public String getName() {
-		return name;
-	}
+    public String getName() {
+        return name;
+    }
 
-	public String getArgument() {
-		return argument;
-	}
+    public String getArgument() {
+        return argument;
+    }
 
-	@Override
-	public String toString() {
-		return String.format("Modifier[%s,%s]", name, argument);
-	}
+    @Override
+    public String toString() {
+        return String.format("Modifier[%s,%s]", name, argument);
+    }
 
-	@Override
-	public boolean equals(Object obj) {
-		if (obj == null) {
-			return false;
-		}
-		if (obj == this) {
-			return true;
-		}
-		if (obj.getClass() != getClass()) {
-			return false;
-		}
-		Modifier rhs = (Modifier) obj;
-		return new EqualsBuilder().append(name, rhs.name).append(argument, rhs.argument)
-				.isEquals();
-	}
+    @Override
+    public boolean equals(Object obj) {
+        if (obj == null) {
+            return false;
+        }
+        if (obj == this) {
+            return true;
+        }
+        if (obj.getClass() != getClass()) {
+            return false;
+        }
+        Modifier rhs = (Modifier) obj;
+        return new EqualsBuilder().append(name, rhs.name).append(argument, rhs.argument).isEquals();
+    }
 
-	@Override
-	public int hashCode() {
-		return new HashCodeBuilder().append(name).append(argument).toHashCode();
-	}
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder().append(name).append(argument).toHashCode();
+    }
 }
\ No newline at end of file
diff --git a/src/main/java/org/apache/sling/query/impl/selector/parser/ParserContext.java b/src/main/java/org/apache/sling/query/impl/selector/parser/ParserContext.java
index df2de0f..271b079 100644
--- a/src/main/java/org/apache/sling/query/impl/selector/parser/ParserContext.java
+++ b/src/main/java/org/apache/sling/query/impl/selector/parser/ParserContext.java
@@ -23,142 +23,142 @@
 import java.util.List;
 
 public class ParserContext {
-	private final List<Selector> selectors = new ArrayList<Selector>();
+    private final List<Selector> selectors = new ArrayList<Selector>();
 
-	private final List<SelectorSegment> segments = new ArrayList<SelectorSegment>();
+    private final List<SelectorSegment> segments = new ArrayList<SelectorSegment>();
 
-	private final List<Attribute> attributes = new ArrayList<Attribute>();
+    private final List<Attribute> attributes = new ArrayList<Attribute>();
 
-	private final List<Modifier> modifiers = new ArrayList<Modifier>();
+    private final List<Modifier> modifiers = new ArrayList<Modifier>();
 
-	private char hierarchyOperator;
+    private char hierarchyOperator;
 
-	private State state = State.START;
+    private State state = State.START;
 
-	private StringBuilder builder = new StringBuilder();
+    private StringBuilder builder = new StringBuilder();
 
-	private String type;
+    private String type;
 
-	private String name;
+    private String name;
 
-	private String attributeKey;
+    private String attributeKey;
 
-	private String attributeOperator;
+    private String attributeOperator;
 
-	private String attributeValue;
+    private String attributeValue;
 
-	private String currentModifierName;
+    private String currentModifierName;
 
-	private int parenthesesCount = 0;
+    private int parenthesesCount = 0;
 
-	List<Attribute> getAttributes() {
-		return attributes;
-	}
+    List<Attribute> getAttributes() {
+        return attributes;
+    }
 
-	List<Modifier> getModifiers() {
-		return modifiers;
-	}
+    List<Modifier> getModifiers() {
+        return modifiers;
+    }
 
-	String getType() {
-		return type;
-	}
+    String getType() {
+        return type;
+    }
 
-	String getName() {
-		return name;
-	}
+    String getName() {
+        return name;
+    }
 
-	char getHierarchyOperator() {
-		return hierarchyOperator;
-	}
+    char getHierarchyOperator() {
+        return hierarchyOperator;
+    }
 
-	public State getState() {
-		return state;
-	}
+    public State getState() {
+        return state;
+    }
 
-	void increaseParentheses() {
-		parenthesesCount++;
-	}
+    void increaseParentheses() {
+        parenthesesCount++;
+    }
 
-	int decreaseParentheses() {
-		return --parenthesesCount;
-	}
+    int decreaseParentheses() {
+        return --parenthesesCount;
+    }
 
-	void setType() {
-		type = builder.toString();
-		builder = new StringBuilder();
-	}
+    void setType() {
+        type = builder.toString();
+        builder = new StringBuilder();
+    }
 
-	void setName() {
-		name = builder.toString();
-		builder = new StringBuilder();
-	}
+    void setName() {
+        name = builder.toString();
+        builder = new StringBuilder();
+    }
 
-	void setAttributeKey() {
-		attributeKey = builder.toString();
-		builder = new StringBuilder();
-	}
+    void setAttributeKey() {
+        attributeKey = builder.toString();
+        builder = new StringBuilder();
+    }
 
-	void setAttributeOperator() {
-		attributeOperator = builder.toString();
-		builder = new StringBuilder();
-	}
+    void setAttributeOperator() {
+        attributeOperator = builder.toString();
+        builder = new StringBuilder();
+    }
 
-	void setAttributeValue() {
-		attributeValue = builder.toString();
-		builder = new StringBuilder();
-	}
+    void setAttributeValue() {
+        attributeValue = builder.toString();
+        builder = new StringBuilder();
+    }
 
-	void addAttribute() {
-		attributes.add(new Attribute(attributeKey, attributeOperator, attributeValue));
-		attributeKey = null;
-		attributeOperator = null;
-		attributeValue = null;
-	}
+    void addAttribute() {
+        attributes.add(new Attribute(attributeKey, attributeOperator, attributeValue));
+        attributeKey = null;
+        attributeOperator = null;
+        attributeValue = null;
+    }
 
-	void setModifierName() {
-		currentModifierName = builder.toString();
-		builder = new StringBuilder();
-	}
+    void setModifierName() {
+        currentModifierName = builder.toString();
+        builder = new StringBuilder();
+    }
 
-	void addModifier() {
-		Modifier modifier;
-		if (currentModifierName == null) {
-			modifier = new Modifier(builder.toString(), null);
-		} else {
-			modifier = new Modifier(currentModifierName, builder.toString());
-			currentModifierName = null;
-		}
-		modifiers.add(modifier);
-		builder = new StringBuilder();
-	}
+    void addModifier() {
+        Modifier modifier;
+        if (currentModifierName == null) {
+            modifier = new Modifier(builder.toString(), null);
+        } else {
+            modifier = new Modifier(currentModifierName, builder.toString());
+            currentModifierName = null;
+        }
+        modifiers.add(modifier);
+        builder = new StringBuilder();
+    }
 
-	void setState(State state) {
-		this.state = state;
-	}
+    void setState(State state) {
+        this.state = state;
+    }
 
-	void setHierarchyOperator(char hierarchyOperator) {
-		this.hierarchyOperator = hierarchyOperator;
-	}
+    void setHierarchyOperator(char hierarchyOperator) {
+        this.hierarchyOperator = hierarchyOperator;
+    }
 
-	void finishSelectorSegment() {
-		segments.add(new SelectorSegment(this, segments.isEmpty()));
-		attributes.clear();
-		modifiers.clear();
-		hierarchyOperator = ' ';
-		type = null;
-		name = null;
-	}
+    void finishSelectorSegment() {
+        segments.add(new SelectorSegment(this, segments.isEmpty()));
+        attributes.clear();
+        modifiers.clear();
+        hierarchyOperator = ' ';
+        type = null;
+        name = null;
+    }
 
-	void finishSelector() {
-		selectors.add(new Selector(segments));
-		segments.clear();
-	}
+    void finishSelector() {
+        selectors.add(new Selector(segments));
+        segments.clear();
+    }
 
-	void append(char c) {
-		builder.append(c);
-	}
+    void append(char c) {
+        builder.append(c);
+    }
 
-	public List<Selector> getSelectors() {
-		return selectors;
-	}
+    public List<Selector> getSelectors() {
+        return selectors;
+    }
 }
diff --git a/src/main/java/org/apache/sling/query/impl/selector/parser/Selector.java b/src/main/java/org/apache/sling/query/impl/selector/parser/Selector.java
index bd21eed..435c28f 100644
--- a/src/main/java/org/apache/sling/query/impl/selector/parser/Selector.java
+++ b/src/main/java/org/apache/sling/query/impl/selector/parser/Selector.java
@@ -24,17 +24,17 @@
 import java.util.List;
 
 public class Selector {
-	private final List<SelectorSegment> segments;
+    private final List<SelectorSegment> segments;
 
-	public Selector() {
-		this.segments = Collections.emptyList();
-	}
+    public Selector() {
+        this.segments = Collections.emptyList();
+    }
 
-	public Selector(List<SelectorSegment> segments) {
-		this.segments = new ArrayList<>(segments);
-	}
+    public Selector(List<SelectorSegment> segments) {
+        this.segments = new ArrayList<>(segments);
+    }
 
-	public List<SelectorSegment> getSegments() {
-		return segments;
-	}
+    public List<SelectorSegment> getSegments() {
+        return segments;
+    }
 }
diff --git a/src/main/java/org/apache/sling/query/impl/selector/parser/SelectorParser.java b/src/main/java/org/apache/sling/query/impl/selector/parser/SelectorParser.java
index 7e5d2ab..eff1ce1 100644
--- a/src/main/java/org/apache/sling/query/impl/selector/parser/SelectorParser.java
+++ b/src/main/java/org/apache/sling/query/impl/selector/parser/SelectorParser.java
@@ -27,29 +27,29 @@
 
 public final class SelectorParser {
 
-	private SelectorParser() {
-	}
+    private SelectorParser() {
+    }
 
-	public static List<Selector> parse(String selector) {
-		if (StringUtils.isEmpty(selector)) {
-			return Arrays.asList(new Selector());
-		}
-		ParserContext context = new ParserContext();
-		for (char c : selector.toCharArray()) {
-			context.getState().process(context, c);
-		}
-		context.getState().process(context, (char) 0);
-		return context.getSelectors();
-	}
+    public static List<Selector> parse(String selector) {
+        if (StringUtils.isEmpty(selector)) {
+            return Arrays.asList(new Selector());
+        }
+        ParserContext context = new ParserContext();
+        for (char c : selector.toCharArray()) {
+            context.getState().process(context, c);
+        }
+        context.getState().process(context, (char) 0);
+        return context.getSelectors();
+    }
 
-	public static List<SelectorSegment> getFirstSegmentFromEachSelector(List<Selector> selectors) {
-		List<SelectorSegment> segments = new ArrayList<SelectorSegment>();
-		for (Selector selector : selectors) {
-			if (!selector.getSegments().isEmpty()) {
-				segments.add(selector.getSegments().get(0));
-			}
-		}
-		return segments;
-	}
+    public static List<SelectorSegment> getFirstSegmentFromEachSelector(List<Selector> selectors) {
+        List<SelectorSegment> segments = new ArrayList<SelectorSegment>();
+        for (Selector selector : selectors) {
+            if (!selector.getSegments().isEmpty()) {
+                segments.add(selector.getSegments().get(0));
+            }
+        }
+        return segments;
+    }
 
 }
diff --git a/src/main/java/org/apache/sling/query/impl/selector/parser/SelectorSegment.java b/src/main/java/org/apache/sling/query/impl/selector/parser/SelectorSegment.java
index e5089a9..2dfa38c 100644
--- a/src/main/java/org/apache/sling/query/impl/selector/parser/SelectorSegment.java
+++ b/src/main/java/org/apache/sling/query/impl/selector/parser/SelectorSegment.java
@@ -26,82 +26,81 @@
 import org.apache.commons.lang.builder.HashCodeBuilder;
 
 public class SelectorSegment {
-	private final String type;
+    private final String type;
 
-	private final String name;
+    private final String name;
 
-	private final List<Attribute> attributes;
+    private final List<Attribute> attributes;
 
-	private final List<Modifier> modifiers;
+    private final List<Modifier> modifiers;
 
-	private final char hierarchyOperator;
+    private final char hierarchyOperator;
 
-	public SelectorSegment(ParserContext context, boolean firstSegment) {
-		this.type = context.getType();
-		this.name = context.getName();
-		this.attributes = new ArrayList<>(context.getAttributes());
-		this.modifiers = new ArrayList<>(context.getModifiers());
-		if (firstSegment) {
-			hierarchyOperator = 0;
-		} else {
-			hierarchyOperator = context.getHierarchyOperator();
-		}
-	}
+    public SelectorSegment(ParserContext context, boolean firstSegment) {
+        this.type = context.getType();
+        this.name = context.getName();
+        this.attributes = new ArrayList<>(context.getAttributes());
+        this.modifiers = new ArrayList<>(context.getModifiers());
+        if (firstSegment) {
+            hierarchyOperator = 0;
+        } else {
+            hierarchyOperator = context.getHierarchyOperator();
+        }
+    }
 
-	SelectorSegment(String type, String name, List<Attribute> attributes,
-			List<Modifier> modifiers, char hierarchyOperator) {
-		this.type = type;
-		this.name = name;
-		this.attributes = attributes;
-		this.modifiers = modifiers;
-		this.hierarchyOperator = hierarchyOperator;
-	}
+    SelectorSegment(String type, String name, List<Attribute> attributes, List<Modifier> modifiers,
+            char hierarchyOperator) {
+        this.type = type;
+        this.name = name;
+        this.attributes = attributes;
+        this.modifiers = modifiers;
+        this.hierarchyOperator = hierarchyOperator;
+    }
 
-	public String getType() {
-		return type;
-	}
+    public String getType() {
+        return type;
+    }
 
-	public String getName() {
-		return name;
-	}
+    public String getName() {
+        return name;
+    }
 
-	public List<Attribute> getAttributes() {
-		return attributes;
-	}
+    public List<Attribute> getAttributes() {
+        return attributes;
+    }
 
-	public char getHierarchyOperator() {
-		return hierarchyOperator;
-	}
+    public char getHierarchyOperator() {
+        return hierarchyOperator;
+    }
 
-	public List<Modifier> getModifiers() {
-		return modifiers;
-	}
+    public List<Modifier> getModifiers() {
+        return modifiers;
+    }
 
-	@Override
-	public boolean equals(Object obj) {
-		if (obj == null) {
-			return false;
-		}
-		if (obj == this) {
-			return true;
-		}
-		if (obj.getClass() != getClass()) {
-			return false;
-		}
-		SelectorSegment rhs = (SelectorSegment) obj;
-		return new EqualsBuilder().append(type, rhs.type).append(attributes, rhs.attributes)
-				.append(modifiers, rhs.modifiers).append(hierarchyOperator, rhs.hierarchyOperator).isEquals();
-	}
+    @Override
+    public boolean equals(Object obj) {
+        if (obj == null) {
+            return false;
+        }
+        if (obj == this) {
+            return true;
+        }
+        if (obj.getClass() != getClass()) {
+            return false;
+        }
+        SelectorSegment rhs = (SelectorSegment) obj;
+        return new EqualsBuilder().append(type, rhs.type).append(attributes, rhs.attributes)
+                .append(modifiers, rhs.modifiers).append(hierarchyOperator, rhs.hierarchyOperator).isEquals();
+    }
 
-	@Override
-	public int hashCode() {
-		return new HashCodeBuilder().append(type).append(attributes).append(modifiers)
-				.append(hierarchyOperator).toHashCode();
-	}
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder().append(type).append(attributes).append(modifiers).append(hierarchyOperator)
+                .toHashCode();
+    }
 
-	@Override
-	public String toString() {
-		return String.format("SelectorSegment[%s,%s,%s,%s]", type, attributes, modifiers,
-				hierarchyOperator);
-	}
+    @Override
+    public String toString() {
+        return String.format("SelectorSegment[%s,%s,%s,%s]", type, attributes, modifiers, hierarchyOperator);
+    }
 }
diff --git a/src/main/java/org/apache/sling/query/impl/selector/parser/State.java b/src/main/java/org/apache/sling/query/impl/selector/parser/State.java
index ced32c6..a6b8883 100644
--- a/src/main/java/org/apache/sling/query/impl/selector/parser/State.java
+++ b/src/main/java/org/apache/sling/query/impl/selector/parser/State.java
@@ -22,217 +22,217 @@
 import org.apache.commons.lang.ArrayUtils;
 
 public enum State {
-	START {
-		@Override
-		public void process(ParserContext context, char c) {
-			if (c == '/') {
-				context.setState(State.TYPE_WITH_SLASHES);
-				context.append(c);
-			} else if (c == '[') {
-				context.setState(State.ATTRIBUTE_KEY);
-			} else if (c == ':') {
-				context.setState(State.MODIFIER);
-			} else if (c == '>' || c == '+' || c == '~') {
-				context.setHierarchyOperator(c);
-			} else if (c == '#') {
-				context.setType();
-				context.setState(NAME);
-			} else if (c != ' ') {
-				context.setState(State.TYPE);
-				context.append(c);
-			}
-		}
-	},
-	IDLE {
-		@Override
-		public void process(ParserContext context, char c) {
-			if (c == '[') {
-				context.setState(State.ATTRIBUTE_KEY);
-			} else if (c == ':') {
-				context.setState(State.MODIFIER);
-			} else if (c == ' ') {
-				context.finishSelectorSegment();
-				context.setState(START);
-			} else if (c == ',' || c == 0) {
-				context.finishSelectorSegment();
-				context.finishSelector();
-				context.setState(START);
-			}
-		}
-	},
-	TYPE {
-		@Override
-		public void process(ParserContext context, char c) {
-			if (c == '/') {
-				context.setState(State.TYPE_WITH_SLASHES);
-				context.append(c);
-			} else if (c == '[') {
-				context.setState(State.ATTRIBUTE_KEY);
-				context.setType();
-			} else if (c == ':') {
-				context.setState(State.TYPE_WITH_SLASHES);
-				context.append(c);
-			} else if (c == '#') {
-				context.setType();
-				context.setState(NAME);
-			} else if (c == ' ') {
-				context.setType();
-				context.finishSelectorSegment();
-				context.setState(START);
-			} else if (c == ',' || c == 0) {
-				context.setType();
-				context.finishSelectorSegment();
-				context.finishSelector();
-				context.setState(START);
-			} else {
-				context.append(c);
-			}
-		}
-	},
-	TYPE_WITH_SLASHES {
-		@Override
-		public void process(ParserContext context, char c) {
-			if (c == '[') {
-				context.setState(State.ATTRIBUTE_KEY);
-				context.setType();
-			} else if (c == ':') {
-				context.setState(State.MODIFIER);
-				context.setType();
-			} else if (c == '#') {
-				context.setType();
-				context.setState(NAME);
-			} else if (c == ' ') {
-				context.setType();
-				context.finishSelectorSegment();
-				context.setState(START);
-			} else if (c == ',' || c == 0) {
-				context.setType();
-				context.finishSelectorSegment();
-				context.finishSelector();
-				context.setState(START);
-			} else {
-				context.append(c);
-			}
-		}
-	},
-	NAME {
-		@Override
-		public void process(ParserContext context, char c) {
-			if (c == '[') {
-				context.setName();
-				context.setState(State.ATTRIBUTE_KEY);
-			} else if (c == ':') {
-				context.setName();
-				context.setState(State.MODIFIER);
-			} else if (c == ' ') {
-				context.setName();
-				context.finishSelectorSegment();
-				context.setState(START);
-			} else if (c == ',' || c == 0) {
-				context.setName();
-				context.finishSelectorSegment();
-				context.finishSelector();
-				context.setState(START);
-			} else if (c == '\'') {
-				context.setState(State.ESCAPED_NAME);
-			} else {
-				context.append(c);
-			}
-		}
-	},
-	ESCAPED_NAME {
-		@Override
-		public void process(ParserContext context, char c) {
-			if (c == '\'') {
-				context.setName();
-				context.setState(IDLE);
-			} else {
-				context.append(c);
-			}
-		}
-	},
-	ATTRIBUTE_KEY {
-		@Override
-		public void process(ParserContext context, char c) {
-			if (c == ']') {
-				context.setAttributeKey();
-				context.addAttribute();
-				context.setState(State.IDLE);
-			} else if (ArrayUtils.contains(OPERATORS, c)) {
-				context.setAttributeKey();
-				context.setState(State.ATTRIBUTE_OPERATOR);
-				context.append(c);
-			} else {
-				context.append(c);
-			}
-		}
-	},
-	ATTRIBUTE_OPERATOR {
-		@Override
-		public void process(ParserContext context, char c) {
-			if (!ArrayUtils.contains(OPERATORS, c)) {
-				context.setAttributeOperator();
-				context.append(c);
-				context.setState(ATTRIBUTE_VALUE);
-			} else {
-				context.append(c);
-			}
-		}
-	},
-	ATTRIBUTE_VALUE {
-		@Override
-		public void process(ParserContext context, char c) {
-			if (c == ']') {
-				context.setState(State.IDLE);
-				context.setAttributeValue();
-				context.addAttribute();
-			} else {
-				context.append(c);
-			}
-		}
-	},
-	MODIFIER {
-		@Override
-		public void process(ParserContext context, char c) {
-			if (c == ':') {
-				context.addModifier();
-			} else if (c == '(') {
-				context.setModifierName();
-				context.setState(State.MODIFIER_ARGUMENT);
-				context.increaseParentheses();
-			} else if (c == ' ') {
-				context.addModifier();
-				context.finishSelectorSegment();
-				context.setState(START);
-			} else if (c == ',' || c == 0) {
-				context.addModifier();
-				context.finishSelectorSegment();
-				context.finishSelector();
-				context.setState(START);
-			} else {
-				context.append(c);
-			}
-		}
-	},
-	MODIFIER_ARGUMENT {
-		@Override
-		public void process(ParserContext context, char c) {
-			if (c == ')') {
-				if (context.decreaseParentheses() == 0) {
-					context.addModifier();
-					context.setState(IDLE);
-				} else {
-					context.append(c);
-				}
-			} else if (c == '(') {
-				context.increaseParentheses();
-				context.append(c);
-			} else {
-				context.append(c);
-			}
-		}
-	};
-	public abstract void process(ParserContext context, char c);
+    START {
+        @Override
+        public void process(ParserContext context, char c) {
+            if (c == '/') {
+                context.setState(State.TYPE_WITH_SLASHES);
+                context.append(c);
+            } else if (c == '[') {
+                context.setState(State.ATTRIBUTE_KEY);
+            } else if (c == ':') {
+                context.setState(State.MODIFIER);
+            } else if (c == '>' || c == '+' || c == '~') {
+                context.setHierarchyOperator(c);
+            } else if (c == '#') {
+                context.setType();
+                context.setState(NAME);
+            } else if (c != ' ') {
+                context.setState(State.TYPE);
+                context.append(c);
+            }
+        }
+    },
+    IDLE {
+        @Override
+        public void process(ParserContext context, char c) {
+            if (c == '[') {
+                context.setState(State.ATTRIBUTE_KEY);
+            } else if (c == ':') {
+                context.setState(State.MODIFIER);
+            } else if (c == ' ') {
+                context.finishSelectorSegment();
+                context.setState(START);
+            } else if (c == ',' || c == 0) {
+                context.finishSelectorSegment();
+                context.finishSelector();
+                context.setState(START);
+            }
+        }
+    },
+    TYPE {
+        @Override
+        public void process(ParserContext context, char c) {
+            if (c == '/') {
+                context.setState(State.TYPE_WITH_SLASHES);
+                context.append(c);
+            } else if (c == '[') {
+                context.setState(State.ATTRIBUTE_KEY);
+                context.setType();
+            } else if (c == ':') {
+                context.setState(State.TYPE_WITH_SLASHES);
+                context.append(c);
+            } else if (c == '#') {
+                context.setType();
+                context.setState(NAME);
+            } else if (c == ' ') {
+                context.setType();
+                context.finishSelectorSegment();
+                context.setState(START);
+            } else if (c == ',' || c == 0) {
+                context.setType();
+                context.finishSelectorSegment();
+                context.finishSelector();
+                context.setState(START);
+            } else {
+                context.append(c);
+            }
+        }
+    },
+    TYPE_WITH_SLASHES {
+        @Override
+        public void process(ParserContext context, char c) {
+            if (c == '[') {
+                context.setState(State.ATTRIBUTE_KEY);
+                context.setType();
+            } else if (c == ':') {
+                context.setState(State.MODIFIER);
+                context.setType();
+            } else if (c == '#') {
+                context.setType();
+                context.setState(NAME);
+            } else if (c == ' ') {
+                context.setType();
+                context.finishSelectorSegment();
+                context.setState(START);
+            } else if (c == ',' || c == 0) {
+                context.setType();
+                context.finishSelectorSegment();
+                context.finishSelector();
+                context.setState(START);
+            } else {
+                context.append(c);
+            }
+        }
+    },
+    NAME {
+        @Override
+        public void process(ParserContext context, char c) {
+            if (c == '[') {
+                context.setName();
+                context.setState(State.ATTRIBUTE_KEY);
+            } else if (c == ':') {
+                context.setName();
+                context.setState(State.MODIFIER);
+            } else if (c == ' ') {
+                context.setName();
+                context.finishSelectorSegment();
+                context.setState(START);
+            } else if (c == ',' || c == 0) {
+                context.setName();
+                context.finishSelectorSegment();
+                context.finishSelector();
+                context.setState(START);
+            } else if (c == '\'') {
+                context.setState(State.ESCAPED_NAME);
+            } else {
+                context.append(c);
+            }
+        }
+    },
+    ESCAPED_NAME {
+        @Override
+        public void process(ParserContext context, char c) {
+            if (c == '\'') {
+                context.setName();
+                context.setState(IDLE);
+            } else {
+                context.append(c);
+            }
+        }
+    },
+    ATTRIBUTE_KEY {
+        @Override
+        public void process(ParserContext context, char c) {
+            if (c == ']') {
+                context.setAttributeKey();
+                context.addAttribute();
+                context.setState(State.IDLE);
+            } else if (ArrayUtils.contains(OPERATORS, c)) {
+                context.setAttributeKey();
+                context.setState(State.ATTRIBUTE_OPERATOR);
+                context.append(c);
+            } else {
+                context.append(c);
+            }
+        }
+    },
+    ATTRIBUTE_OPERATOR {
+        @Override
+        public void process(ParserContext context, char c) {
+            if (!ArrayUtils.contains(OPERATORS, c)) {
+                context.setAttributeOperator();
+                context.append(c);
+                context.setState(ATTRIBUTE_VALUE);
+            } else {
+                context.append(c);
+            }
+        }
+    },
+    ATTRIBUTE_VALUE {
+        @Override
+        public void process(ParserContext context, char c) {
+            if (c == ']') {
+                context.setState(State.IDLE);
+                context.setAttributeValue();
+                context.addAttribute();
+            } else {
+                context.append(c);
+            }
+        }
+    },
+    MODIFIER {
+        @Override
+        public void process(ParserContext context, char c) {
+            if (c == ':') {
+                context.addModifier();
+            } else if (c == '(') {
+                context.setModifierName();
+                context.setState(State.MODIFIER_ARGUMENT);
+                context.increaseParentheses();
+            } else if (c == ' ') {
+                context.addModifier();
+                context.finishSelectorSegment();
+                context.setState(START);
+            } else if (c == ',' || c == 0) {
+                context.addModifier();
+                context.finishSelectorSegment();
+                context.finishSelector();
+                context.setState(START);
+            } else {
+                context.append(c);
+            }
+        }
+    },
+    MODIFIER_ARGUMENT {
+        @Override
+        public void process(ParserContext context, char c) {
+            if (c == ')') {
+                if (context.decreaseParentheses() == 0) {
+                    context.addModifier();
+                    context.setState(IDLE);
+                } else {
+                    context.append(c);
+                }
+            } else if (c == '(') {
+                context.increaseParentheses();
+                context.append(c);
+            } else {
+                context.append(c);
+            }
+        }
+    };
+    public abstract void process(ParserContext context, char c);
 
-	private static final char[] OPERATORS = "*~$!^=".toCharArray();
+    private static final char[] OPERATORS = "*~$!^=".toCharArray();
 }
diff --git a/src/main/java/org/apache/sling/query/impl/util/IteratorUtils.java b/src/main/java/org/apache/sling/query/impl/util/IteratorUtils.java
index 5f136ff..64398ae 100644
--- a/src/main/java/org/apache/sling/query/impl/util/IteratorUtils.java
+++ b/src/main/java/org/apache/sling/query/impl/util/IteratorUtils.java
@@ -24,18 +24,18 @@
 
 public final class IteratorUtils {
 
-	private IteratorUtils() {
-	}
+    private IteratorUtils() {
+    }
 
-	public static <T> Iterator<T> arrayIterator(T... elements) {
-		return Arrays.asList(elements).iterator();
-	}
+    public static <T> Iterator<T> arrayIterator(T... elements) {
+        return Arrays.asList(elements).iterator();
+    }
 
-	public static <T> Iterator<T> singleElementIterator(T element) {
-		return Arrays.asList(element).iterator();
-	}
+    public static <T> Iterator<T> singleElementIterator(T element) {
+        return Arrays.asList(element).iterator();
+    }
 
-	public static <T> Iterator<T> emptyIterator() {
-		return Arrays.<T> asList().iterator();
-	}
+    public static <T> Iterator<T> emptyIterator() {
+        return Arrays.<T>asList().iterator();
+    }
 }
diff --git a/src/main/java/org/apache/sling/query/impl/util/LazyList.java b/src/main/java/org/apache/sling/query/impl/util/LazyList.java
index 59d7de7..1063d61 100644
--- a/src/main/java/org/apache/sling/query/impl/util/LazyList.java
+++ b/src/main/java/org/apache/sling/query/impl/util/LazyList.java
@@ -28,251 +28,251 @@
 
 public class LazyList<E> implements List<E> {
 
-	private final class LazyListIterator implements ListIterator<E> {
-		private int index = 0;
+    private final class LazyListIterator implements ListIterator<E> {
+        private int index = 0;
 
-		private LazyListIterator() {
-			this.index = 0;
-		}
+        private LazyListIterator() {
+            this.index = 0;
+        }
 
-		private LazyListIterator(int index) {
-			this.index = index;
-		}
+        private LazyListIterator(int index) {
+            this.index = index;
+        }
 
-		@Override
-		public boolean hasNext() {
-			fillToSize(index + 1);
-			return arrayList.size() > index;
-		}
+        @Override
+        public boolean hasNext() {
+            fillToSize(index + 1);
+            return arrayList.size() > index;
+        }
 
-		@Override
-		public E next() {
-			if (!hasNext()) {
-				throw new NoSuchElementException();
-			}
-			return arrayList.get(index++);
-		}
+        @Override
+        public E next() {
+            if (!hasNext()) {
+                throw new NoSuchElementException();
+            }
+            return arrayList.get(index++);
+        }
 
-		@Override
-		public boolean hasPrevious() {
-			return index > 0;
-		}
+        @Override
+        public boolean hasPrevious() {
+            return index > 0;
+        }
 
-		@Override
-		public E previous() {
-			if (!hasPrevious()) {
-				throw new NoSuchElementException();
-			}
-			fillToSize(index);
-			return arrayList.get(--index);
-		}
+        @Override
+        public E previous() {
+            if (!hasPrevious()) {
+                throw new NoSuchElementException();
+            }
+            fillToSize(index);
+            return arrayList.get(--index);
+        }
 
-		@Override
-		public int nextIndex() {
-			return index;
-		}
+        @Override
+        public int nextIndex() {
+            return index;
+        }
 
-		@Override
-		public int previousIndex() {
-			return index - 1;
-		}
+        @Override
+        public int previousIndex() {
+            return index - 1;
+        }
 
-		@Override
-		public void remove() {
-			throw new UnsupportedOperationException();
-		}
+        @Override
+        public void remove() {
+            throw new UnsupportedOperationException();
+        }
 
-		@Override
-		public void set(E e) {
-			throw new UnsupportedOperationException();
-		}
+        @Override
+        public void set(E e) {
+            throw new UnsupportedOperationException();
+        }
 
-		@Override
-		public void add(E e) {
-			throw new UnsupportedOperationException();
-		}
-	}
+        @Override
+        public void add(E e) {
+            throw new UnsupportedOperationException();
+        }
+    }
 
-	private final List<E> arrayList;
+    private final List<E> arrayList;
 
-	private final Iterator<E> iterator;
+    private final Iterator<E> iterator;
 
-	public LazyList(Iterator<E> iterator) {
-		this.arrayList = new ArrayList<E>();
-		this.iterator = iterator;
-	}
+    public LazyList(Iterator<E> iterator) {
+        this.arrayList = new ArrayList<E>();
+        this.iterator = iterator;
+    }
 
-	private void fillAll() {
-		while (fillNext() != -1)
-			;
-	}
+    private void fillAll() {
+        while (fillNext() != -1)
+            ;
+    }
 
-	private void fillToSize(int size) {
-		for (int s = arrayList.size(); s < size; s++) {
-			if (fillNext() == -1) {
-				break;
-			}
-		}
-	}
+    private void fillToSize(int size) {
+        for (int s = arrayList.size(); s < size; s++) {
+            if (fillNext() == -1) {
+                break;
+            }
+        }
+    }
 
-	private int fillNext() {
-		if (iterator.hasNext()) {
-			E element = iterator.next();
-			arrayList.add(element);
-			return arrayList.size() - 1;
-		}
-		return -1;
-	}
+    private int fillNext() {
+        if (iterator.hasNext()) {
+            E element = iterator.next();
+            arrayList.add(element);
+            return arrayList.size() - 1;
+        }
+        return -1;
+    }
 
-	@Override
-	public int size() {
-		fillAll();
-		return arrayList.size();
-	}
+    @Override
+    public int size() {
+        fillAll();
+        return arrayList.size();
+    }
 
-	@Override
-	public boolean isEmpty() {
-		return arrayList.isEmpty() && !iterator.hasNext();
-	}
+    @Override
+    public boolean isEmpty() {
+        return arrayList.isEmpty() && !iterator.hasNext();
+    }
 
-	@Override
-	public boolean contains(Object o) {
-		return indexOf(o) != -1;
-	}
+    @Override
+    public boolean contains(Object o) {
+        return indexOf(o) != -1;
+    }
 
-	@Override
-	public Iterator<E> iterator() {
-		return new LazyListIterator();
-	}
+    @Override
+    public Iterator<E> iterator() {
+        return new LazyListIterator();
+    }
 
-	@Override
-	public Object[] toArray() {
-		fillAll();
-		return arrayList.toArray();
-	}
+    @Override
+    public Object[] toArray() {
+        fillAll();
+        return arrayList.toArray();
+    }
 
-	@Override
-	public <T> T[] toArray(T[] a) {
-		fillAll();
-		return arrayList.toArray(a);
-	}
+    @Override
+    public <T> T[] toArray(T[] a) {
+        fillAll();
+        return arrayList.toArray(a);
+    }
 
-	@Override
-	public boolean containsAll(Collection<?> c) {
-		for (Object o : c) {
-			if (!contains(o)) {
-				return false;
-			}
-		}
-		return true;
-	}
+    @Override
+    public boolean containsAll(Collection<?> c) {
+        for (Object o : c) {
+            if (!contains(o)) {
+                return false;
+            }
+        }
+        return true;
+    }
 
-	@Override
-	public E get(int index) {
-		fillToSize(index + 1);
-		return arrayList.get(index);
-	}
+    @Override
+    public E get(int index) {
+        fillToSize(index + 1);
+        return arrayList.get(index);
+    }
 
-	@Override
-	public int indexOf(Object o) {
-		int index = arrayList.indexOf(o);
-		if (index > -1) {
-			return index;
-		}
-		int addedIndex;
-		while ((addedIndex = fillNext()) != -1) {
-			E element = arrayList.get(addedIndex);
-			if (element == null && o == null) {
-				return addedIndex;
-			} else if (element != null && element.equals(o)) {
-				return addedIndex;
-			}
-		}
-		return -1;
-	}
+    @Override
+    public int indexOf(Object o) {
+        int index = arrayList.indexOf(o);
+        if (index > -1) {
+            return index;
+        }
+        int addedIndex;
+        while ((addedIndex = fillNext()) != -1) {
+            E element = arrayList.get(addedIndex);
+            if (element == null && o == null) {
+                return addedIndex;
+            } else if (element != null && element.equals(o)) {
+                return addedIndex;
+            }
+        }
+        return -1;
+    }
 
-	@Override
-	public int lastIndexOf(Object o) {
-		fillAll();
-		return arrayList.lastIndexOf(o);
-	}
+    @Override
+    public int lastIndexOf(Object o) {
+        fillAll();
+        return arrayList.lastIndexOf(o);
+    }
 
-	@Override
-	public ListIterator<E> listIterator() {
-		return new LazyListIterator();
-	}
+    @Override
+    public ListIterator<E> listIterator() {
+        return new LazyListIterator();
+    }
 
-	@Override
-	public ListIterator<E> listIterator(int index) {
-		return new LazyListIterator(index);
-	}
+    @Override
+    public ListIterator<E> listIterator(int index) {
+        return new LazyListIterator(index);
+    }
 
-	@Override
-	public List<E> subList(int fromIndex, int toIndex) {
-		fillToSize(toIndex);
-		return arrayList.subList(fromIndex, toIndex);
-	}
+    @Override
+    public List<E> subList(int fromIndex, int toIndex) {
+        fillToSize(toIndex);
+        return arrayList.subList(fromIndex, toIndex);
+    }
 
-	@Override
-	public boolean equals(Object o) {
-		fillAll();
-		return arrayList.equals(o);
-	}
+    @Override
+    public boolean equals(Object o) {
+        fillAll();
+        return arrayList.equals(o);
+    }
 
-	@Override
-	public int hashCode() {
-		fillAll();
-		return arrayList.hashCode();
-	}
+    @Override
+    public int hashCode() {
+        fillAll();
+        return arrayList.hashCode();
+    }
 
-	@Override
-	public boolean add(E e) {
-		throw new UnsupportedOperationException();
-	}
+    @Override
+    public boolean add(E e) {
+        throw new UnsupportedOperationException();
+    }
 
-	@Override
-	public boolean remove(Object o) {
-		throw new UnsupportedOperationException();
-	}
+    @Override
+    public boolean remove(Object o) {
+        throw new UnsupportedOperationException();
+    }
 
-	@Override
-	public boolean addAll(Collection<? extends E> c) {
-		throw new UnsupportedOperationException();
-	}
+    @Override
+    public boolean addAll(Collection<? extends E> c) {
+        throw new UnsupportedOperationException();
+    }
 
-	@Override
-	public boolean addAll(int index, Collection<? extends E> c) {
-		throw new UnsupportedOperationException();
-	}
+    @Override
+    public boolean addAll(int index, Collection<? extends E> c) {
+        throw new UnsupportedOperationException();
+    }
 
-	@Override
-	public boolean removeAll(Collection<?> c) {
-		throw new UnsupportedOperationException();
-	}
+    @Override
+    public boolean removeAll(Collection<?> c) {
+        throw new UnsupportedOperationException();
+    }
 
-	@Override
-	public boolean retainAll(Collection<?> c) {
-		throw new UnsupportedOperationException();
-	}
+    @Override
+    public boolean retainAll(Collection<?> c) {
+        throw new UnsupportedOperationException();
+    }
 
-	@Override
-	public void clear() {
-		throw new UnsupportedOperationException();
-	}
+    @Override
+    public void clear() {
+        throw new UnsupportedOperationException();
+    }
 
-	@Override
-	public E set(int index, E element) {
-		throw new UnsupportedOperationException();
-	}
+    @Override
+    public E set(int index, E element) {
+        throw new UnsupportedOperationException();
+    }
 
-	@Override
-	public void add(int index, E element) {
-		throw new UnsupportedOperationException();
-	}
+    @Override
+    public void add(int index, E element) {
+        throw new UnsupportedOperationException();
+    }
 
-	@Override
-	public E remove(int index) {
-		throw new UnsupportedOperationException();
-	}
+    @Override
+    public E remove(int index) {
+        throw new UnsupportedOperationException();
+    }
 
 }
diff --git a/src/test/java/org/apache/sling/query/AddTest.java b/src/test/java/org/apache/sling/query/AddTest.java
index be5bebe..8b4d954 100644
--- a/src/test/java/org/apache/sling/query/AddTest.java
+++ b/src/test/java/org/apache/sling/query/AddTest.java
@@ -27,32 +27,31 @@
 
 public class AddTest {
 
-	private Resource tree = TestUtils.getTree();
+    private Resource tree = TestUtils.getTree();
 
-	@Test
-	public void testSimpleAdd() {
-		SlingQuery query = $(tree.getChild("application")).add(tree.getChild("home"));
-		assertResourceSetEquals(query.iterator(), "application", "home");
-	}
+    @Test
+    public void testSimpleAdd() {
+        SlingQuery query = $(tree.getChild("application")).add(tree.getChild("home"));
+        assertResourceSetEquals(query.iterator(), "application", "home");
+    }
 
-	@Test
-	public void testAddToChildren() {
-		SlingQuery query = $(tree).children("cq:Page").add(tree.getChild("home/java"));
-		assertResourceSetEquals(query.iterator(), "application", "home", "java");
-	}
+    @Test
+    public void testAddToChildren() {
+        SlingQuery query = $(tree).children("cq:Page").add(tree.getChild("home/java"));
+        assertResourceSetEquals(query.iterator(), "application", "home", "java");
+    }
 
-	@Test
-	public void testAddedChildren() {
-		SlingQuery query = $(tree).add(tree.getChild("home/java")).children("cq:Page");
-		assertResourceSetEquals(query.iterator(), "application", "home", "email", "labels", "navigation");
-	}
+    @Test
+    public void testAddedChildren() {
+        SlingQuery query = $(tree).add(tree.getChild("home/java")).children("cq:Page");
+        assertResourceSetEquals(query.iterator(), "application", "home", "email", "labels", "navigation");
+    }
 
-	@Test
-	public void testAddIterable() {
-		SlingQuery query1 = $(tree).children("cq:Page");
-		SlingQuery query2 = $(tree.getChild("home/java")).children("cq:Page");
-		assertResourceSetEquals(query1.add(query2).iterator(), "application", "home", "email", "labels",
-				"navigation");
-	}
+    @Test
+    public void testAddIterable() {
+        SlingQuery query1 = $(tree).children("cq:Page");
+        SlingQuery query2 = $(tree.getChild("home/java")).children("cq:Page");
+        assertResourceSetEquals(query1.add(query2).iterator(), "application", "home", "email", "labels", "navigation");
+    }
 
 }
diff --git a/src/test/java/org/apache/sling/query/AttributeOperatorTest.java b/src/test/java/org/apache/sling/query/AttributeOperatorTest.java
index 3140254..b1dd5b3 100644
--- a/src/test/java/org/apache/sling/query/AttributeOperatorTest.java
+++ b/src/test/java/org/apache/sling/query/AttributeOperatorTest.java
@@ -28,132 +28,131 @@
 
 public class AttributeOperatorTest {
 
-	private Resource tree = TestUtils.getTree();
+    private Resource tree = TestUtils.getTree();
 
-	@Test
-	public void testEquals() {
-		SlingQuery query = $(tree).children("cq:PageContent[jcr:title=CQ Commons demo]");
-		assertResourceSetEquals(query.iterator(), "jcr:content");
-	}
+    @Test
+    public void testEquals() {
+        SlingQuery query = $(tree).children("cq:PageContent[jcr:title=CQ Commons demo]");
+        assertResourceSetEquals(query.iterator(), "jcr:content");
+    }
 
-	@Test
-	public void testEqualsWithMultivalue() {
-		SlingQuery query = $(tree).children("cq:PageContent[cq:allowedTemplates=other demo template]");
-		assertResourceSetEquals(query.iterator(), "jcr:content");
-	}
+    @Test
+    public void testEqualsWithMultivalue() {
+        SlingQuery query = $(tree).children("cq:PageContent[cq:allowedTemplates=other demo template]");
+        assertResourceSetEquals(query.iterator(), "jcr:content");
+    }
 
-	@Test
-	public void testNotEquals() {
-		SlingQuery query = $(tree).children("cq:PageContent[jcr:title=123]");
-		assertEmptyIterator(query.iterator());
-	}
+    @Test
+    public void testNotEquals() {
+        SlingQuery query = $(tree).children("cq:PageContent[jcr:title=123]");
+        assertEmptyIterator(query.iterator());
+    }
 
-	@Test
-	public void testContains() {
-		SlingQuery query = $(tree).children("cq:PageContent[jcr:title*=mmons de]");
-		assertResourceSetEquals(query.iterator(), "jcr:content");
-	}
+    @Test
+    public void testContains() {
+        SlingQuery query = $(tree).children("cq:PageContent[jcr:title*=mmons de]");
+        assertResourceSetEquals(query.iterator(), "jcr:content");
+    }
 
-	@Test
-	public void testContainsWithMultivalue() {
-		SlingQuery query = $(tree).children("cq:PageContent[cq:allowedTemplates*=her demo templa]");
-		assertResourceSetEquals(query.iterator(), "jcr:content");
-	}
+    @Test
+    public void testContainsWithMultivalue() {
+        SlingQuery query = $(tree).children("cq:PageContent[cq:allowedTemplates*=her demo templa]");
+        assertResourceSetEquals(query.iterator(), "jcr:content");
+    }
 
-	@Test
-	public void testNotContains() {
-		SlingQuery query = $(tree).children("cq:PageContent[jcr:title*=123]");
-		assertEmptyIterator(query.iterator());
-	}
+    @Test
+    public void testNotContains() {
+        SlingQuery query = $(tree).children("cq:PageContent[jcr:title*=123]");
+        assertEmptyIterator(query.iterator());
+    }
 
-	@Test
-	public void testContainsWord() {
-		SlingQuery query = $(tree).children("cq:PageContent[jcr:title~=Commons]");
-		assertResourceSetEquals(query.iterator(), "jcr:content");
-	}
+    @Test
+    public void testContainsWord() {
+        SlingQuery query = $(tree).children("cq:PageContent[jcr:title~=Commons]");
+        assertResourceSetEquals(query.iterator(), "jcr:content");
+    }
 
-	@Test
-	public void testContainsWordWithMultivalue() {
-		SlingQuery query = $(tree).children("cq:PageContent[cq:allowedTemplates~=template]");
-		assertResourceSetEquals(query.iterator(), "jcr:content");
-	}
+    @Test
+    public void testContainsWordWithMultivalue() {
+        SlingQuery query = $(tree).children("cq:PageContent[cq:allowedTemplates~=template]");
+        assertResourceSetEquals(query.iterator(), "jcr:content");
+    }
 
-	@Test
-	public void testNotContainsWord() {
-		SlingQuery query = $(tree).children("cq:PageContent[jcr:title~=mmons de]");
-		assertEmptyIterator(query.iterator());
-	}
+    @Test
+    public void testNotContainsWord() {
+        SlingQuery query = $(tree).children("cq:PageContent[jcr:title~=mmons de]");
+        assertEmptyIterator(query.iterator());
+    }
 
-	@Test
-	public void testEndsWith() {
-		SlingQuery query = $(tree).children("cq:PageContent[jcr:title$=demo]");
-		assertResourceSetEquals(query.iterator(), "jcr:content");
-	}
+    @Test
+    public void testEndsWith() {
+        SlingQuery query = $(tree).children("cq:PageContent[jcr:title$=demo]");
+        assertResourceSetEquals(query.iterator(), "jcr:content");
+    }
 
-	@Test
-	public void testEndsWithWithMultivalue() {
-		SlingQuery query = $(tree).children("cq:PageContent[cq:allowedTemplates$=demo template]");
-		assertResourceSetEquals(query.iterator(), "jcr:content");
-	}
+    @Test
+    public void testEndsWithWithMultivalue() {
+        SlingQuery query = $(tree).children("cq:PageContent[cq:allowedTemplates$=demo template]");
+        assertResourceSetEquals(query.iterator(), "jcr:content");
+    }
 
-	@Test
-	public void testNotEndsWith() {
-		SlingQuery query = $(tree).children("cq:PageContent[jcr:title$=CQ]");
-		assertEmptyIterator(query.iterator());
-	}
+    @Test
+    public void testNotEndsWith() {
+        SlingQuery query = $(tree).children("cq:PageContent[jcr:title$=CQ]");
+        assertEmptyIterator(query.iterator());
+    }
 
-	@Test
-	public void testNotEquals2() {
-		SlingQuery query = $(tree).children("cq:PageContent[jcr:title!=123]");
-		assertResourceSetEquals(query.iterator(), "jcr:content");
-	}
+    @Test
+    public void testNotEquals2() {
+        SlingQuery query = $(tree).children("cq:PageContent[jcr:title!=123]");
+        assertResourceSetEquals(query.iterator(), "jcr:content");
+    }
 
-	@Test
-	public void testNotNotEquals() {
-		SlingQuery query = $(tree).children("cq:PageContent[jcr:title!=CQ Commons demo]");
-		assertEmptyIterator(query.iterator());
-	}
+    @Test
+    public void testNotNotEquals() {
+        SlingQuery query = $(tree).children("cq:PageContent[jcr:title!=CQ Commons demo]");
+        assertEmptyIterator(query.iterator());
+    }
 
-	@Test
-	public void testStartsWith() {
-		SlingQuery query = $(tree).children("cq:PageContent[jcr:title^=CQ]");
-		assertResourceSetEquals(query.iterator(), "jcr:content");
-	}
+    @Test
+    public void testStartsWith() {
+        SlingQuery query = $(tree).children("cq:PageContent[jcr:title^=CQ]");
+        assertResourceSetEquals(query.iterator(), "jcr:content");
+    }
 
-	@Test
-	public void testStartsWithWithMultivalue() {
-		SlingQuery query = $(tree).children("cq:PageContent[cq:allowedTemplates^=other demo]");
-		assertResourceSetEquals(query.iterator(), "jcr:content");
-	}
+    @Test
+    public void testStartsWithWithMultivalue() {
+        SlingQuery query = $(tree).children("cq:PageContent[cq:allowedTemplates^=other demo]");
+        assertResourceSetEquals(query.iterator(), "jcr:content");
+    }
 
-	@Test
-	public void testNotStartsWith() {
-		SlingQuery query = $(tree).children("cq:PageContent[jcr:title^=Commons]");
-		assertEmptyIterator(query.iterator());
-	}
+    @Test
+    public void testNotStartsWith() {
+        SlingQuery query = $(tree).children("cq:PageContent[jcr:title^=Commons]");
+        assertEmptyIterator(query.iterator());
+    }
 
-	@Test
-	public void testHas() {
-		SlingQuery query = $(tree).children("cq:PageContent[jcr:title]");
-		assertResourceSetEquals(query.iterator(), "jcr:content");
-	}
+    @Test
+    public void testHas() {
+        SlingQuery query = $(tree).children("cq:PageContent[jcr:title]");
+        assertResourceSetEquals(query.iterator(), "jcr:content");
+    }
 
-	@Test
-	public void testNotHas() {
-		SlingQuery query = $(tree).children("cq:PageContent[jcr:title123]");
-		assertEmptyIterator(query.iterator());
-	}
+    @Test
+    public void testNotHas() {
+        SlingQuery query = $(tree).children("cq:PageContent[jcr:title123]");
+        assertEmptyIterator(query.iterator());
+    }
 
-	@Test
-	public void testMultipleAttributes() {
-		SlingQuery query = $(tree).children("cq:PageContent[jcr:title=CQ Commons demo][jcr:createdBy=admin]");
-		assertResourceSetEquals(query.iterator(), "jcr:content");
-	}
+    @Test
+    public void testMultipleAttributes() {
+        SlingQuery query = $(tree).children("cq:PageContent[jcr:title=CQ Commons demo][jcr:createdBy=admin]");
+        assertResourceSetEquals(query.iterator(), "jcr:content");
+    }
 
-	@Test
-	public void testNotMultipleAttributes() {
-		SlingQuery query = $(tree).children(
-				"cq:PageContent[jcr:title=CQ Commons demo aaa][jcr:createdBy=admin]");
-		assertEmptyIterator(query.iterator());
-	}
+    @Test
+    public void testNotMultipleAttributes() {
+        SlingQuery query = $(tree).children("cq:PageContent[jcr:title=CQ Commons demo aaa][jcr:createdBy=admin]");
+        assertEmptyIterator(query.iterator());
+    }
 }
diff --git a/src/test/java/org/apache/sling/query/ChildrenTest.java b/src/test/java/org/apache/sling/query/ChildrenTest.java
index 3a46970..030f2d6 100644
--- a/src/test/java/org/apache/sling/query/ChildrenTest.java
+++ b/src/test/java/org/apache/sling/query/ChildrenTest.java
@@ -28,35 +28,35 @@
 
 public class ChildrenTest {
 
-	private Resource tree = TestUtils.getTree();
+    private Resource tree = TestUtils.getTree();
 
-	@Test
-	public void testChildren() {
-		SlingQuery query = $(tree).children();
-		assertResourceSetEquals(query.iterator(), "jcr:content", "application", "home");
-	}
+    @Test
+    public void testChildren() {
+        SlingQuery query = $(tree).children();
+        assertResourceSetEquals(query.iterator(), "jcr:content", "application", "home");
+    }
 
-	@Test
-	public void testNameChildren() {
-		SlingQuery query = $(tree).children("cq:Page#application");
-		assertResourceSetEquals(query.iterator(), "application");
-	}
+    @Test
+    public void testNameChildren() {
+        SlingQuery query = $(tree).children("cq:Page#application");
+        assertResourceSetEquals(query.iterator(), "application");
+    }
 
-	@Test
-	public void testFilteredChildren() {
-		SlingQuery query = $(tree).children("cq:Page");
-		assertResourceSetEquals(query.iterator(), "application", "home");
-	}
+    @Test
+    public void testFilteredChildren() {
+        SlingQuery query = $(tree).children("cq:Page");
+        assertResourceSetEquals(query.iterator(), "application", "home");
+    }
 
-	@Test
-	public void testNoChildren() {
-		SlingQuery query = $(tree.getChild("jcr:content")).children();
-		assertEmptyIterator(query.iterator());
-	}
+    @Test
+    public void testNoChildren() {
+        SlingQuery query = $(tree.getChild("jcr:content")).children();
+        assertEmptyIterator(query.iterator());
+    }
 
-	@Test
-	public void testLeafChildren() {
-		SlingQuery query = $(tree.getChild("jcr:content")).children();
-		assertEmptyIterator(query.iterator());
-	}
+    @Test
+    public void testLeafChildren() {
+        SlingQuery query = $(tree.getChild("jcr:content")).children();
+        assertEmptyIterator(query.iterator());
+    }
 }
diff --git a/src/test/java/org/apache/sling/query/ClosestTest.java b/src/test/java/org/apache/sling/query/ClosestTest.java
index 232bc6f..259522f 100644
--- a/src/test/java/org/apache/sling/query/ClosestTest.java
+++ b/src/test/java/org/apache/sling/query/ClosestTest.java
@@ -28,25 +28,25 @@
 
 public class ClosestTest {
 
-	private static final String PATH = "application/configuration/labels/jcr:content/configParsys/tab_0/items/text";
+    private static final String PATH = "application/configuration/labels/jcr:content/configParsys/tab_0/items/text";
 
-	private Resource tree = TestUtils.getTree();
+    private Resource tree = TestUtils.getTree();
 
-	@Test
-	public void testClosest() {
-		SlingQuery query = $(tree.getChild(PATH)).closest("cq:Page");
-		assertResourceSetEquals(query.iterator(), "labels");
-	}
+    @Test
+    public void testClosest() {
+        SlingQuery query = $(tree.getChild(PATH)).closest("cq:Page");
+        assertResourceSetEquals(query.iterator(), "labels");
+    }
 
-	@Test
-	public void testNoClosest() {
-		SlingQuery query = $(tree.getChild(PATH)).closest("cq:Undefined");
-		assertEmptyIterator(query.iterator());
-	}
+    @Test
+    public void testNoClosest() {
+        SlingQuery query = $(tree.getChild(PATH)).closest("cq:Undefined");
+        assertEmptyIterator(query.iterator());
+    }
 
-	@Test
-	public void testClosestOnRoot() {
-		SlingQuery query = $(tree).closest("cq:Page");
-		assertResourceSetEquals(query.iterator(), "/");
-	}
+    @Test
+    public void testClosestOnRoot() {
+        SlingQuery query = $(tree).closest("cq:Page");
+        assertResourceSetEquals(query.iterator(), "/");
+    }
 }
diff --git a/src/test/java/org/apache/sling/query/FilterTest.java b/src/test/java/org/apache/sling/query/FilterTest.java
index de1971f..bd3a7af 100644
--- a/src/test/java/org/apache/sling/query/FilterTest.java
+++ b/src/test/java/org/apache/sling/query/FilterTest.java
@@ -29,18 +29,18 @@
 
 public class FilterTest {
 
-	private Resource tree = TestUtils.getTree();
+    private Resource tree = TestUtils.getTree();
 
-	@Test
-	public void testFilter() {
-		SlingQuery query = $(tree).searchStrategy(SearchStrategy.DFS).find()
-				.filter(resource -> "configParsys".equals(resource.getName()));
-		assertResourceSetEquals(query.iterator(), "configParsys");
-	}
+    @Test
+    public void testFilter() {
+        SlingQuery query = $(tree).searchStrategy(SearchStrategy.DFS).find()
+                .filter(resource -> "configParsys".equals(resource.getName()));
+        assertResourceSetEquals(query.iterator(), "configParsys");
+    }
 
-	@Test
-	public void testFilterOnEmptyCollection() {
-		SlingQuery query = $(tree).children("cq:Undefined").filter(resource -> true);
-		assertEmptyIterator(query.iterator());
-	}
+    @Test
+    public void testFilterOnEmptyCollection() {
+        SlingQuery query = $(tree).children("cq:Undefined").filter(resource -> true);
+        assertEmptyIterator(query.iterator());
+    }
 }
diff --git a/src/test/java/org/apache/sling/query/FindTest.java b/src/test/java/org/apache/sling/query/FindTest.java
index 7a2ed8c..7546238 100644
--- a/src/test/java/org/apache/sling/query/FindTest.java
+++ b/src/test/java/org/apache/sling/query/FindTest.java
@@ -30,58 +30,58 @@
 
 public class FindTest {
 
-	private Resource tree = TestUtils.getTree();
+    private Resource tree = TestUtils.getTree();
 
-	@Test
-	public void testFind() {
-		SlingQuery query = $(tree.getChild("application/configuration/labels")).searchStrategy(
-				SearchStrategy.DFS).find();
-		assertResourceSetEquals(query.iterator(), "jcr:content", "configParsys", "tab", "tab_0", "items",
-				"items", "localizedtext", "text", "text_0", "text", "lang");
-	}
+    @Test
+    public void testFind() {
+        SlingQuery query = $(tree.getChild("application/configuration/labels")).searchStrategy(SearchStrategy.DFS)
+                .find();
+        assertResourceSetEquals(query.iterator(), "jcr:content", "configParsys", "tab", "tab_0", "items", "items",
+                "localizedtext", "text", "text_0", "text", "lang");
+    }
 
-	@Test
-	public void testFindWithFilter() {
-		SlingQuery query = $(tree.getChild("application/configuration/labels")).searchStrategy(
-				SearchStrategy.DFS).find("cq-commons/config/components/text");
-		assertResourceSetEquals(query.iterator(), "text", "text");
-	}
+    @Test
+    public void testFindWithFilter() {
+        SlingQuery query = $(tree.getChild("application/configuration/labels")).searchStrategy(SearchStrategy.DFS)
+                .find("cq-commons/config/components/text");
+        assertResourceSetEquals(query.iterator(), "text", "text");
+    }
 
-	@Test
-	public void testFindWithResources() {
-		SlingQuery query = $(tree.getChild("home")).find(
-				$(tree.getChild("home/java"), tree.getChild("home/js"), tree.getChild("application")));
-		assertResourceSetEquals(query.iterator(), "java", "js");
-	}
+    @Test
+    public void testFindWithResources() {
+        SlingQuery query = $(tree.getChild("home"))
+                .find($(tree.getChild("home/java"), tree.getChild("home/js"), tree.getChild("application")));
+        assertResourceSetEquals(query.iterator(), "java", "js");
+    }
 
-	@Test
-	public void testLeaveFind() {
-		SlingQuery query = $(
-				tree.getChild("application/configuration/labels/jcr:content/configParsys/tab/items/localizedtext/lang"))
-				.searchStrategy(SearchStrategy.DFS).find();
-		assertEmptyIterator(query.iterator());
-	}
+    @Test
+    public void testLeaveFind() {
+        SlingQuery query = $(
+                tree.getChild("application/configuration/labels/jcr:content/configParsys/tab/items/localizedtext/lang"))
+                        .searchStrategy(SearchStrategy.DFS).find();
+        assertEmptyIterator(query.iterator());
+    }
 
-	@Test
-	public void testEmptyFind() {
-		SlingQuery query = $(tree.getChild("application/configuration/labels")).searchStrategy(
-				SearchStrategy.DFS).find("cq:Undefined");
-		assertEmptyIterator(query.iterator());
-	}
+    @Test
+    public void testEmptyFind() {
+        SlingQuery query = $(tree.getChild("application/configuration/labels")).searchStrategy(SearchStrategy.DFS)
+                .find("cq:Undefined");
+        assertEmptyIterator(query.iterator());
+    }
 
-	@Test
-	public void testBfsFind() {
-		SlingQuery query = $(tree.getChild("application/configuration/labels")).searchStrategy(
-				SearchStrategy.BFS).find("");
-		assertResourceListEquals(query.iterator(), "jcr:content", "configParsys", "tab", "tab_0", "items",
-				"items", "localizedtext", "text", "text_0", "text", "lang");
-	}
+    @Test
+    public void testBfsFind() {
+        SlingQuery query = $(tree.getChild("application/configuration/labels")).searchStrategy(SearchStrategy.BFS)
+                .find("");
+        assertResourceListEquals(query.iterator(), "jcr:content", "configParsys", "tab", "tab_0", "items", "items",
+                "localizedtext", "text", "text_0", "text", "lang");
+    }
 
-	@Test
-	public void testDfsFind() {
-		SlingQuery query = $(tree.getChild("application/configuration/labels")).searchStrategy(
-				SearchStrategy.DFS).find("");
-		assertResourceListEquals(query.iterator(), "jcr:content", "configParsys", "tab", "items",
-				"localizedtext", "lang", "text", "tab_0", "items", "text_0", "text");
-	}
+    @Test
+    public void testDfsFind() {
+        SlingQuery query = $(tree.getChild("application/configuration/labels")).searchStrategy(SearchStrategy.DFS)
+                .find("");
+        assertResourceListEquals(query.iterator(), "jcr:content", "configParsys", "tab", "items", "localizedtext",
+                "lang", "text", "tab_0", "items", "text_0", "text");
+    }
 }
diff --git a/src/test/java/org/apache/sling/query/HasTest.java b/src/test/java/org/apache/sling/query/HasTest.java
index 95b23ea..7155606 100644
--- a/src/test/java/org/apache/sling/query/HasTest.java
+++ b/src/test/java/org/apache/sling/query/HasTest.java
@@ -28,22 +28,22 @@
 
 public class HasTest {
 
-	private static final String PAR_PATH = "home/java";
+    private static final String PAR_PATH = "home/java";
 
-	private Resource tree = TestUtils.getTree();
+    private Resource tree = TestUtils.getTree();
 
-	@Test
-	public void testHas() {
-		SlingQuery query = $(tree.getChild(PAR_PATH)).searchStrategy(SearchStrategy.DFS).children()
-				.has("demo/core/components/configValue");
-		assertResourceSetEquals(query.iterator(), "labels");
-	}
+    @Test
+    public void testHas() {
+        SlingQuery query = $(tree.getChild(PAR_PATH)).searchStrategy(SearchStrategy.DFS).children()
+                .has("demo/core/components/configValue");
+        assertResourceSetEquals(query.iterator(), "labels");
+    }
 
-	@Test
-	public void testHasResource() {
-		SlingQuery query = $(tree.getChild(PAR_PATH)).children().has(
-				$(tree.getChild("home/java/labels/jcr:content/par")));
-		assertResourceSetEquals(query.iterator(), "labels");
-	}
+    @Test
+    public void testHasResource() {
+        SlingQuery query = $(tree.getChild(PAR_PATH)).children()
+                .has($(tree.getChild("home/java/labels/jcr:content/par")));
+        assertResourceSetEquals(query.iterator(), "labels");
+    }
 
 }
diff --git a/src/test/java/org/apache/sling/query/HierarchySelectorTest.java b/src/test/java/org/apache/sling/query/HierarchySelectorTest.java
index b81ecc0..2de65d0 100644
--- a/src/test/java/org/apache/sling/query/HierarchySelectorTest.java
+++ b/src/test/java/org/apache/sling/query/HierarchySelectorTest.java
@@ -28,30 +28,30 @@
 
 public class HierarchySelectorTest {
 
-	private Resource tree = TestUtils.getTree();
+    private Resource tree = TestUtils.getTree();
 
-	@Test
-	public void testChildrenWithAttribute() {
-		SlingQuery query = $(tree.getChild("home")).children("cq:Page > cq:PageContent[jcr:title=Java]");
-		assertResourceSetEquals(query.iterator(), "java");
-	}
+    @Test
+    public void testChildrenWithAttribute() {
+        SlingQuery query = $(tree.getChild("home")).children("cq:Page > cq:PageContent[jcr:title=Java]");
+        assertResourceSetEquals(query.iterator(), "java");
+    }
 
-	@Test
-	public void testDescendant() {
-		SlingQuery query = $(tree.getChild("home")).searchStrategy(SearchStrategy.DFS).children(
-				"cq:Page demo/core/components/configValue");
-		assertResourceSetEquals(query.iterator(), "java");
-	}
+    @Test
+    public void testDescendant() {
+        SlingQuery query = $(tree.getChild("home")).searchStrategy(SearchStrategy.DFS)
+                .children("cq:Page demo/core/components/configValue");
+        assertResourceSetEquals(query.iterator(), "java");
+    }
 
-	@Test
-	public void testNextAdjacent() {
-		SlingQuery query = $(tree).children().filter("cq:PageContent + cq:Page");
-		assertResourceSetEquals(query.iterator(), "jcr:content");
-	}
+    @Test
+    public void testNextAdjacent() {
+        SlingQuery query = $(tree).children().filter("cq:PageContent + cq:Page");
+        assertResourceSetEquals(query.iterator(), "jcr:content");
+    }
 
-	@Test
-	public void testNextSiblings() {
-		SlingQuery query = $(tree).children("cq:PageContent ~ cq:Page");
-		assertResourceSetEquals(query.iterator(), "jcr:content");
-	}
+    @Test
+    public void testNextSiblings() {
+        SlingQuery query = $(tree).children("cq:PageContent ~ cq:Page");
+        assertResourceSetEquals(query.iterator(), "jcr:content");
+    }
 }
diff --git a/src/test/java/org/apache/sling/query/LastTest.java b/src/test/java/org/apache/sling/query/LastTest.java
index 86a65d8..36da35a 100644
--- a/src/test/java/org/apache/sling/query/LastTest.java
+++ b/src/test/java/org/apache/sling/query/LastTest.java
@@ -43,7 +43,7 @@
         SlingQuery query = $(tree).children("cq:Undefined").last();
         assertEmptyIterator(query.iterator());
     }
-    
+
     @Test
     public void testLastAfterFilter() {
         SlingQuery query = $(tree.getChild(PAR_PATH)).children().filter("[key=helloWorld]").last();
diff --git a/src/test/java/org/apache/sling/query/ListTest.java b/src/test/java/org/apache/sling/query/ListTest.java
index 702fbd1..02b3678 100644
--- a/src/test/java/org/apache/sling/query/ListTest.java
+++ b/src/test/java/org/apache/sling/query/ListTest.java
@@ -31,64 +31,64 @@
 
 public class ListTest {
 
-	private Resource tree = TestUtils.getTree();
+    private Resource tree = TestUtils.getTree();
 
-	@Test
-	public void testIterator() {
-		List<Resource> list = $(tree).children().asList();
-		assertResourceSetEquals(list.iterator(), "jcr:content", "application", "home");
-	}
-	
-	@Test
-	public void testListIterator() {
-		ListIterator<Resource> iterator = $(tree).children().asList().listIterator();
-		Assert.assertEquals("jcr:content", iterator.next().getName());
-		Assert.assertEquals("application", iterator.next().getName());
-		Assert.assertEquals("home", iterator.next().getName());
-		Assert.assertEquals("home", iterator.previous().getName());
-		Assert.assertEquals("application", iterator.previous().getName());
-		Assert.assertEquals("jcr:content", iterator.previous().getName());
-	}
+    @Test
+    public void testIterator() {
+        List<Resource> list = $(tree).children().asList();
+        assertResourceSetEquals(list.iterator(), "jcr:content", "application", "home");
+    }
 
-	@Test
-	public void testSize() {
-		List<Resource> list = $(tree).children().asList();
-		Assert.assertEquals(3, list.size());
-	}
+    @Test
+    public void testListIterator() {
+        ListIterator<Resource> iterator = $(tree).children().asList().listIterator();
+        Assert.assertEquals("jcr:content", iterator.next().getName());
+        Assert.assertEquals("application", iterator.next().getName());
+        Assert.assertEquals("home", iterator.next().getName());
+        Assert.assertEquals("home", iterator.previous().getName());
+        Assert.assertEquals("application", iterator.previous().getName());
+        Assert.assertEquals("jcr:content", iterator.previous().getName());
+    }
 
-	@Test
-	public void testGet() {
-		List<Resource> list = $(tree).children().asList();
-		Assert.assertEquals("jcr:content", list.get(0).getName());
-		Assert.assertEquals("application", list.get(1).getName());
-		Assert.assertEquals("home", list.get(2).getName());
-	}
+    @Test
+    public void testSize() {
+        List<Resource> list = $(tree).children().asList();
+        Assert.assertEquals(3, list.size());
+    }
 
-	@Test
-	public void testIndexOf() {
-		Resource home = $(tree).children("#home").iterator().next();
-		List<Resource> list = $(tree).children().asList();
-		Assert.assertEquals(2, list.indexOf(home));
-		Assert.assertEquals(-1, list.indexOf(tree));
-	}
+    @Test
+    public void testGet() {
+        List<Resource> list = $(tree).children().asList();
+        Assert.assertEquals("jcr:content", list.get(0).getName());
+        Assert.assertEquals("application", list.get(1).getName());
+        Assert.assertEquals("home", list.get(2).getName());
+    }
 
-	@Test
-	public void testContains() {
-		Resource home = $(tree).children("#home").iterator().next();
-		List<Resource> list = $(tree).children().asList();
-		Assert.assertEquals(true, list.contains(home));
-		Assert.assertEquals(false, list.contains(tree));
-	}
+    @Test
+    public void testIndexOf() {
+        Resource home = $(tree).children("#home").iterator().next();
+        List<Resource> list = $(tree).children().asList();
+        Assert.assertEquals(2, list.indexOf(home));
+        Assert.assertEquals(-1, list.indexOf(tree));
+    }
 
-	@Test
-	public void testEmpty() {
-		Assert.assertEquals(true, $(tree).children("#aaa").asList().isEmpty());
-		Assert.assertEquals(false, $(tree).children().asList().isEmpty());
-	}
+    @Test
+    public void testContains() {
+        Resource home = $(tree).children("#home").iterator().next();
+        List<Resource> list = $(tree).children().asList();
+        Assert.assertEquals(true, list.contains(home));
+        Assert.assertEquals(false, list.contains(tree));
+    }
 
-	@Test
-	public void testSublist() {
-		List<Resource> list = $(tree).children().asList().subList(1, 3);
-		assertResourceSetEquals(list.iterator(), "application", "home");
-	}
+    @Test
+    public void testEmpty() {
+        Assert.assertEquals(true, $(tree).children("#aaa").asList().isEmpty());
+        Assert.assertEquals(false, $(tree).children().asList().isEmpty());
+    }
+
+    @Test
+    public void testSublist() {
+        List<Resource> list = $(tree).children().asList().subList(1, 3);
+        assertResourceSetEquals(list.iterator(), "application", "home");
+    }
 }
diff --git a/src/test/java/org/apache/sling/query/MapTest.java b/src/test/java/org/apache/sling/query/MapTest.java
index 6be2f5c..845583a 100644
--- a/src/test/java/org/apache/sling/query/MapTest.java
+++ b/src/test/java/org/apache/sling/query/MapTest.java
@@ -29,16 +29,16 @@
 
 public class MapTest {
 
-	private static final String PAR_PATH = "home/java/labels/jcr:content/par";
+    private static final String PAR_PATH = "home/java/labels/jcr:content/par";
 
-	private Resource tree = TestUtils.getTree();
+    private Resource tree = TestUtils.getTree();
 
-	@Test
-	public void testMap() {
-		@SuppressWarnings("rawtypes")
-		Iterable<Map> iterable = $(tree.getChild(PAR_PATH)).children().map(Map.class);
-		for (Map<?, ?> m : iterable) {
-			Assert.assertEquals("nt:unstructured", m.get("jcr:primaryType"));
-		}
-	}
+    @Test
+    public void testMap() {
+        @SuppressWarnings("rawtypes")
+        Iterable<Map> iterable = $(tree.getChild(PAR_PATH)).children().map(Map.class);
+        for (Map<?, ?> m : iterable) {
+            Assert.assertEquals("nt:unstructured", m.get("jcr:primaryType"));
+        }
+    }
 }
diff --git a/src/test/java/org/apache/sling/query/MultipleSelectorTest.java b/src/test/java/org/apache/sling/query/MultipleSelectorTest.java
index c019b6d..0655bad 100644
--- a/src/test/java/org/apache/sling/query/MultipleSelectorTest.java
+++ b/src/test/java/org/apache/sling/query/MultipleSelectorTest.java
@@ -27,20 +27,20 @@
 
 public class MultipleSelectorTest {
 
-	private Resource tree = TestUtils.getTree();
+    private Resource tree = TestUtils.getTree();
 
-	@Test
-	public void testTwoNames() {
-		SlingQuery query = $(tree).children("#application, #home");
-		assertResourceSetEquals(query.iterator(), "application", "home");
-	}
+    @Test
+    public void testTwoNames() {
+        SlingQuery query = $(tree).children("#application, #home");
+        assertResourceSetEquals(query.iterator(), "application", "home");
+    }
 
-	@Test
-	public void testEverything() {
-		SlingQuery query = $(tree).children(":not(#application), #application");
-		assertResourceSetEquals(query.iterator(), "jcr:content", "application", "home");
+    @Test
+    public void testEverything() {
+        SlingQuery query = $(tree).children(":not(#application), #application");
+        assertResourceSetEquals(query.iterator(), "jcr:content", "application", "home");
 
-		query = $(tree).children("#application, :not(#application)");
-		assertResourceSetEquals(query.iterator(), "jcr:content", "application", "home");
-	}
+        query = $(tree).children("#application, :not(#application)");
+        assertResourceSetEquals(query.iterator(), "jcr:content", "application", "home");
+    }
 }
diff --git a/src/test/java/org/apache/sling/query/NextPrevAllTest.java b/src/test/java/org/apache/sling/query/NextPrevAllTest.java
index 42df107..cac211c 100644
--- a/src/test/java/org/apache/sling/query/NextPrevAllTest.java
+++ b/src/test/java/org/apache/sling/query/NextPrevAllTest.java
@@ -28,69 +28,69 @@
 
 public class NextPrevAllTest {
 
-	private static final String PAR_PATH = "home/java/labels/jcr:content/par";
+    private static final String PAR_PATH = "home/java/labels/jcr:content/par";
 
-	private Resource tree = TestUtils.getTree();
+    private Resource tree = TestUtils.getTree();
 
-	@Test
-	public void testNextAll() {
-		SlingQuery query = $(tree.getChild(PAR_PATH).getChild("configvalue_0")).nextAll();
-		assertResourceSetEquals(query.iterator(), "configvalue_1", "configvalue_2");
-	}
+    @Test
+    public void testNextAll() {
+        SlingQuery query = $(tree.getChild(PAR_PATH).getChild("configvalue_0")).nextAll();
+        assertResourceSetEquals(query.iterator(), "configvalue_1", "configvalue_2");
+    }
 
-	@Test
-	public void testPrevAll() {
-		SlingQuery query = $(tree.getChild(PAR_PATH).getChild("configvalue_0")).prevAll();
-		assertResourceSetEquals(query.iterator(), "richtext", "configvalue");
-	}
+    @Test
+    public void testPrevAll() {
+        SlingQuery query = $(tree.getChild(PAR_PATH).getChild("configvalue_0")).prevAll();
+        assertResourceSetEquals(query.iterator(), "richtext", "configvalue");
+    }
 
-	@Test
-	public void testNextAllFiltered() {
-		SlingQuery query = $(tree.getChild(PAR_PATH).getChild("configvalue")).nextAll(
-				"demo/core/components/configValue");
-		assertResourceSetEquals(query.iterator(), "configvalue_0", "configvalue_1", "configvalue_2");
-	}
+    @Test
+    public void testNextAllFiltered() {
+        SlingQuery query = $(tree.getChild(PAR_PATH).getChild("configvalue"))
+                .nextAll("demo/core/components/configValue");
+        assertResourceSetEquals(query.iterator(), "configvalue_0", "configvalue_1", "configvalue_2");
+    }
 
-	@Test
-	public void testPrevAllFiltered() {
-		SlingQuery query = $(tree.getChild(PAR_PATH).getChild("configvalue_0")).prevAll(
-				"demo/core/components/richtext");
-		assertResourceSetEquals(query.iterator(), "richtext");
-	}
+    @Test
+    public void testPrevAllFiltered() {
+        SlingQuery query = $(tree.getChild(PAR_PATH).getChild("configvalue_0"))
+                .prevAll("demo/core/components/richtext");
+        assertResourceSetEquals(query.iterator(), "richtext");
+    }
 
-	@Test
-	public void testNextAllInvalidFiltered() {
-		SlingQuery query = $(tree.getChild(PAR_PATH).getChild("configvalue")).nextAll("cq:Undefined");
-		assertEmptyIterator(query.iterator());
-	}
+    @Test
+    public void testNextAllInvalidFiltered() {
+        SlingQuery query = $(tree.getChild(PAR_PATH).getChild("configvalue")).nextAll("cq:Undefined");
+        assertEmptyIterator(query.iterator());
+    }
 
-	@Test
-	public void testPrevAllInvalidFiltered() {
-		SlingQuery query = $(tree.getChild(PAR_PATH).getChild("configvalue")).prevAll("cq:Undefined");
-		assertEmptyIterator(query.iterator());
-	}
+    @Test
+    public void testPrevAllInvalidFiltered() {
+        SlingQuery query = $(tree.getChild(PAR_PATH).getChild("configvalue")).prevAll("cq:Undefined");
+        assertEmptyIterator(query.iterator());
+    }
 
-	@Test
-	public void testNextAllOnLast() {
-		SlingQuery query = $(tree.getChild(PAR_PATH).getChild("configvalue_2")).nextAll();
-		assertEmptyIterator(query.iterator());
-	}
+    @Test
+    public void testNextAllOnLast() {
+        SlingQuery query = $(tree.getChild(PAR_PATH).getChild("configvalue_2")).nextAll();
+        assertEmptyIterator(query.iterator());
+    }
 
-	@Test
-	public void testPrevAllOnFirst() {
-		SlingQuery query = $(tree.getChild(PAR_PATH).getChild("richtext")).prevAll();
-		assertEmptyIterator(query.iterator());
-	}
+    @Test
+    public void testPrevAllOnFirst() {
+        SlingQuery query = $(tree.getChild(PAR_PATH).getChild("richtext")).prevAll();
+        assertEmptyIterator(query.iterator());
+    }
 
-	@Test
-	public void testNextAllOnRoot() {
-		SlingQuery query = $(tree).nextAll();
-		assertEmptyIterator(query.iterator());
-	}
+    @Test
+    public void testNextAllOnRoot() {
+        SlingQuery query = $(tree).nextAll();
+        assertEmptyIterator(query.iterator());
+    }
 
-	@Test
-	public void testPrevAllOnRoot() {
-		SlingQuery query = $(tree).prevAll();
-		assertEmptyIterator(query.iterator());
-	}
+    @Test
+    public void testPrevAllOnRoot() {
+        SlingQuery query = $(tree).prevAll();
+        assertEmptyIterator(query.iterator());
+    }
 }
\ No newline at end of file
diff --git a/src/test/java/org/apache/sling/query/NextPrevTest.java b/src/test/java/org/apache/sling/query/NextPrevTest.java
index ca6c303..2af42ca 100644
--- a/src/test/java/org/apache/sling/query/NextPrevTest.java
+++ b/src/test/java/org/apache/sling/query/NextPrevTest.java
@@ -28,69 +28,67 @@
 
 public class NextPrevTest {
 
-	private static final String PAR_PATH = "home/java/labels/jcr:content/par";
+    private static final String PAR_PATH = "home/java/labels/jcr:content/par";
 
-	private Resource tree = TestUtils.getTree();
+    private Resource tree = TestUtils.getTree();
 
-	@Test
-	public void testNext() {
-		SlingQuery query = $(tree.getChild(PAR_PATH).getChild("configvalue")).next();
-		assertResourceSetEquals(query.iterator(), "configvalue_0");
-	}
+    @Test
+    public void testNext() {
+        SlingQuery query = $(tree.getChild(PAR_PATH).getChild("configvalue")).next();
+        assertResourceSetEquals(query.iterator(), "configvalue_0");
+    }
 
-	@Test
-	public void testPrev() {
-		SlingQuery query = $(tree.getChild(PAR_PATH).getChild("configvalue")).prev();
-		assertResourceSetEquals(query.iterator(), "richtext");
-	}
+    @Test
+    public void testPrev() {
+        SlingQuery query = $(tree.getChild(PAR_PATH).getChild("configvalue")).prev();
+        assertResourceSetEquals(query.iterator(), "richtext");
+    }
 
-	@Test
-	public void testNextFiltered() {
-		SlingQuery query = $(tree.getChild(PAR_PATH).getChild("configvalue")).next(
-				"demo/core/components/configValue");
-		assertResourceSetEquals(query.iterator(), "configvalue_0");
-	}
+    @Test
+    public void testNextFiltered() {
+        SlingQuery query = $(tree.getChild(PAR_PATH).getChild("configvalue")).next("demo/core/components/configValue");
+        assertResourceSetEquals(query.iterator(), "configvalue_0");
+    }
 
-	@Test
-	public void testPrevFiltered() {
-		SlingQuery query = $(tree.getChild(PAR_PATH).getChild("configvalue")).prev(
-				"demo/core/components/richtext");
-		assertResourceSetEquals(query.iterator(), "richtext");
-	}
+    @Test
+    public void testPrevFiltered() {
+        SlingQuery query = $(tree.getChild(PAR_PATH).getChild("configvalue")).prev("demo/core/components/richtext");
+        assertResourceSetEquals(query.iterator(), "richtext");
+    }
 
-	@Test
-	public void testNextInvalidFiltered() {
-		SlingQuery query = $(tree.getChild(PAR_PATH).getChild("configvalue")).next("cq:Undefined");
-		assertEmptyIterator(query.iterator());
-	}
+    @Test
+    public void testNextInvalidFiltered() {
+        SlingQuery query = $(tree.getChild(PAR_PATH).getChild("configvalue")).next("cq:Undefined");
+        assertEmptyIterator(query.iterator());
+    }
 
-	@Test
-	public void testPrevInvalidFiltered() {
-		SlingQuery query = $(tree.getChild(PAR_PATH).getChild("configvalue")).prev("cq:Undefined");
-		assertEmptyIterator(query.iterator());
-	}
+    @Test
+    public void testPrevInvalidFiltered() {
+        SlingQuery query = $(tree.getChild(PAR_PATH).getChild("configvalue")).prev("cq:Undefined");
+        assertEmptyIterator(query.iterator());
+    }
 
-	@Test
-	public void testNextOnLast() {
-		SlingQuery query = $(tree.getChild(PAR_PATH).getChild("configvalue_2")).next();
-		assertEmptyIterator(query.iterator());
-	}
+    @Test
+    public void testNextOnLast() {
+        SlingQuery query = $(tree.getChild(PAR_PATH).getChild("configvalue_2")).next();
+        assertEmptyIterator(query.iterator());
+    }
 
-	@Test
-	public void testPrevOnFirst() {
-		SlingQuery query = $(tree.getChild(PAR_PATH).getChild("richtext")).prev();
-		assertEmptyIterator(query.iterator());
-	}
+    @Test
+    public void testPrevOnFirst() {
+        SlingQuery query = $(tree.getChild(PAR_PATH).getChild("richtext")).prev();
+        assertEmptyIterator(query.iterator());
+    }
 
-	@Test
-	public void testNextOnRoot() {
-		SlingQuery query = $(tree).next();
-		assertEmptyIterator(query.iterator());
-	}
+    @Test
+    public void testNextOnRoot() {
+        SlingQuery query = $(tree).next();
+        assertEmptyIterator(query.iterator());
+    }
 
-	@Test
-	public void testPrevOnRoot() {
-		SlingQuery query = $(tree).prev();
-		assertEmptyIterator(query.iterator());
-	}
+    @Test
+    public void testPrevOnRoot() {
+        SlingQuery query = $(tree).prev();
+        assertEmptyIterator(query.iterator());
+    }
 }
\ No newline at end of file
diff --git a/src/test/java/org/apache/sling/query/NextPrevUntilTest.java b/src/test/java/org/apache/sling/query/NextPrevUntilTest.java
index ed0b47f..43fd13e 100644
--- a/src/test/java/org/apache/sling/query/NextPrevUntilTest.java
+++ b/src/test/java/org/apache/sling/query/NextPrevUntilTest.java
@@ -28,70 +28,69 @@
 
 public class NextPrevUntilTest {
 
-	private static final String PAR_PATH = "home/java/labels/jcr:content/par";
+    private static final String PAR_PATH = "home/java/labels/jcr:content/par";
 
-	private Resource tree = TestUtils.getTree();
+    private Resource tree = TestUtils.getTree();
 
-	@Test
-	public void testNextUntil() {
-		SlingQuery query = $(tree.getChild(PAR_PATH).getChild("configvalue")).nextUntil("[key=unknownKey]");
-		assertResourceSetEquals(query.iterator(), "configvalue_0", "configvalue_1");
-	}
+    @Test
+    public void testNextUntil() {
+        SlingQuery query = $(tree.getChild(PAR_PATH).getChild("configvalue")).nextUntil("[key=unknownKey]");
+        assertResourceSetEquals(query.iterator(), "configvalue_0", "configvalue_1");
+    }
 
-	@Test
-	public void testNextUntilResource() {
-		Resource resource = tree.getChild(PAR_PATH).getChild("configvalue_2");
-		SlingQuery query = $(tree.getChild(PAR_PATH).getChild("configvalue")).nextUntil($(resource));
-		assertResourceSetEquals(query.iterator(), "configvalue_0", "configvalue_1");
-	}
+    @Test
+    public void testNextUntilResource() {
+        Resource resource = tree.getChild(PAR_PATH).getChild("configvalue_2");
+        SlingQuery query = $(tree.getChild(PAR_PATH).getChild("configvalue")).nextUntil($(resource));
+        assertResourceSetEquals(query.iterator(), "configvalue_0", "configvalue_1");
+    }
 
-	@Test
-	public void testPrevUntil() {
-		SlingQuery query = $(tree.getChild(PAR_PATH).getChild("configvalue_2")).prevUntil("[key=helloWorld]");
-		assertResourceSetEquals(query.iterator(), "configvalue_0", "configvalue_1");
-	}
+    @Test
+    public void testPrevUntil() {
+        SlingQuery query = $(tree.getChild(PAR_PATH).getChild("configvalue_2")).prevUntil("[key=helloWorld]");
+        assertResourceSetEquals(query.iterator(), "configvalue_0", "configvalue_1");
+    }
 
-	@Test
-	public void testPrevUntilResource() {
-		Resource resource = tree.getChild(PAR_PATH).getChild("configvalue");
-		SlingQuery query = $(tree.getChild(PAR_PATH).getChild("configvalue_2")).prevUntil($(resource));
-		assertResourceSetEquals(query.iterator(), "configvalue_0", "configvalue_1");
-	}
+    @Test
+    public void testPrevUntilResource() {
+        Resource resource = tree.getChild(PAR_PATH).getChild("configvalue");
+        SlingQuery query = $(tree.getChild(PAR_PATH).getChild("configvalue_2")).prevUntil($(resource));
+        assertResourceSetEquals(query.iterator(), "configvalue_0", "configvalue_1");
+    }
 
-	@Test
-	public void testNextUntilOnLast() {
-		SlingQuery query = $(tree.getChild(PAR_PATH).getChild("configvalue_2")).nextUntil("[key=unknownKey]");
-		assertEmptyIterator(query.iterator());
-	}
+    @Test
+    public void testNextUntilOnLast() {
+        SlingQuery query = $(tree.getChild(PAR_PATH).getChild("configvalue_2")).nextUntil("[key=unknownKey]");
+        assertEmptyIterator(query.iterator());
+    }
 
-	@Test
-	public void testPrevUntilOnFirst() {
-		SlingQuery query = $(tree.getChild(PAR_PATH).getChild("richtext")).prevUntil("[key=helloWorld]");
-		assertEmptyIterator(query.iterator());
-	}
+    @Test
+    public void testPrevUntilOnFirst() {
+        SlingQuery query = $(tree.getChild(PAR_PATH).getChild("richtext")).prevUntil("[key=helloWorld]");
+        assertEmptyIterator(query.iterator());
+    }
 
-	@Test
-	public void testNextUntilOnRoot() {
-		SlingQuery query = $(tree).nextUntil("cq:Page");
-		assertEmptyIterator(query.iterator());
-	}
+    @Test
+    public void testNextUntilOnRoot() {
+        SlingQuery query = $(tree).nextUntil("cq:Page");
+        assertEmptyIterator(query.iterator());
+    }
 
-	@Test
-	public void testPrevUntilOnRoot() {
-		SlingQuery query = $(tree).prevUntil("cq:Page");
-		assertEmptyIterator(query.iterator());
-	}
+    @Test
+    public void testPrevUntilOnRoot() {
+        SlingQuery query = $(tree).prevUntil("cq:Page");
+        assertEmptyIterator(query.iterator());
+    }
 
-	@Test
-	public void testNextUntilInvalid() {
-		SlingQuery query = $(tree.getChild(PAR_PATH).getChild("richtext")).nextUntil("cq:Undefined");
-		assertResourceSetEquals(query.iterator(), "configvalue", "configvalue_0", "configvalue_1",
-				"configvalue_2");
-	}
+    @Test
+    public void testNextUntilInvalid() {
+        SlingQuery query = $(tree.getChild(PAR_PATH).getChild("richtext")).nextUntil("cq:Undefined");
+        assertResourceSetEquals(query.iterator(), "configvalue", "configvalue_0", "configvalue_1", "configvalue_2");
+    }
 
-	@Test
-	public void testPrevUntilInvalid() {
-		SlingQuery query = $(tree.getChild(PAR_PATH).getChild("configvalue_2")).prevUntil("cq:Undefined");
-		assertResourceSetEquals(query.iterator(), "configvalue", "configvalue_0", "configvalue_1", "richtext");
-	}
+    @Test
+    public void testPrevUntilInvalid() {
+        SlingQuery query = $(tree.getChild(PAR_PATH).getChild("configvalue_2")).prevUntil("cq:Undefined");
+        assertResourceSetEquals(query.iterator(), "configvalue", "configvalue_0", "configvalue_1", "richtext");
+    }
 }
\ No newline at end of file
diff --git a/src/test/java/org/apache/sling/query/NotTest.java b/src/test/java/org/apache/sling/query/NotTest.java
index c8d796f..53405ea 100644
--- a/src/test/java/org/apache/sling/query/NotTest.java
+++ b/src/test/java/org/apache/sling/query/NotTest.java
@@ -30,36 +30,35 @@
 
 public class NotTest {
 
-	private Resource tree = TestUtils.getTree();
+    private Resource tree = TestUtils.getTree();
 
-	@Test
-	public void testNot() {
-		SlingQuery query = $(tree).children().not("cq:Page");
-		assertResourceSetEquals(query.iterator(), "jcr:content");
-	}
+    @Test
+    public void testNot() {
+        SlingQuery query = $(tree).children().not("cq:Page");
+        assertResourceSetEquals(query.iterator(), "jcr:content");
+    }
 
-	@Test
-	public void testNotResources() {
-		SlingQuery query = $(tree).children().not(
-				$(tree.getChild("jcr:content"), tree.getChild("application")));
-		assertResourceSetEquals(query.iterator(), "home");
-	}
+    @Test
+    public void testNotResources() {
+        SlingQuery query = $(tree).children().not($(tree.getChild("jcr:content"), tree.getChild("application")));
+        assertResourceSetEquals(query.iterator(), "home");
+    }
 
-	@Test
-	public void testNotEmptyResources() {
-		SlingQuery query = $(tree).children().not(Collections.<Resource>emptyList());
-		assertResourceSetEquals(query.iterator(), "jcr:content", "application", "home");
-	}
+    @Test
+    public void testNotEmptyResources() {
+        SlingQuery query = $(tree).children().not(Collections.<Resource>emptyList());
+        assertResourceSetEquals(query.iterator(), "jcr:content", "application", "home");
+    }
 
-	@Test
-	public void testNotWithModifier() {
-		SlingQuery query = $(tree).children("cq:Page").not(":first");
-		assertResourceSetEquals(query.iterator(), "home");
-	}
+    @Test
+    public void testNotWithModifier() {
+        SlingQuery query = $(tree).children("cq:Page").not(":first");
+        assertResourceSetEquals(query.iterator(), "home");
+    }
 
-	@Test
-	public void testNotOnEmptyCollection() {
-		SlingQuery query = $(tree).children("cq:Undefined").not("cq:Page");
-		assertEmptyIterator(query.iterator());
-	}
+    @Test
+    public void testNotOnEmptyCollection() {
+        SlingQuery query = $(tree).children("cq:Undefined").not("cq:Page");
+        assertEmptyIterator(query.iterator());
+    }
 }
diff --git a/src/test/java/org/apache/sling/query/ParentTest.java b/src/test/java/org/apache/sling/query/ParentTest.java
index a984e8d..e9f2295 100644
--- a/src/test/java/org/apache/sling/query/ParentTest.java
+++ b/src/test/java/org/apache/sling/query/ParentTest.java
@@ -28,17 +28,17 @@
 
 public class ParentTest {
 
-	private Resource tree = TestUtils.getTree();
+    private Resource tree = TestUtils.getTree();
 
-	@Test
-	public void testParent() {
-		SlingQuery query = $(tree.getChild("application/configuration/labels")).parent();
-		assertResourceSetEquals(query.iterator(), "configuration");
-	}
+    @Test
+    public void testParent() {
+        SlingQuery query = $(tree.getChild("application/configuration/labels")).parent();
+        assertResourceSetEquals(query.iterator(), "configuration");
+    }
 
-	@Test
-	public void testRootParent() {
-		SlingQuery query = $(tree).parent();
-		assertEmptyIterator(query.iterator());
-	}
+    @Test
+    public void testRootParent() {
+        SlingQuery query = $(tree).parent();
+        assertEmptyIterator(query.iterator());
+    }
 }
diff --git a/src/test/java/org/apache/sling/query/ParentsTest.java b/src/test/java/org/apache/sling/query/ParentsTest.java
index b0b8445..da04e85 100644
--- a/src/test/java/org/apache/sling/query/ParentsTest.java
+++ b/src/test/java/org/apache/sling/query/ParentsTest.java
@@ -28,33 +28,31 @@
 
 public class ParentsTest {
 
-	private Resource tree = TestUtils.getTree();
+    private Resource tree = TestUtils.getTree();
 
-	@Test
-	public void testParents() {
-		SlingQuery query = $(tree.getChild("application/configuration/labels/jcr:content")).parents();
-		assertResourceSetEquals(query.iterator(), "labels", "configuration", "application", "/");
-	}
+    @Test
+    public void testParents() {
+        SlingQuery query = $(tree.getChild("application/configuration/labels/jcr:content")).parents();
+        assertResourceSetEquals(query.iterator(), "labels", "configuration", "application", "/");
+    }
 
-	@Test
-	public void testFilteredParents() {
-		SlingQuery query = $(
-				tree.getChild("application/configuration/labels/jcr:content/configParsys/tab/items"))
-				.parents("cq:Page");
-		assertResourceSetEquals(query.iterator(), "labels", "configuration", "application", "/");
-	}
+    @Test
+    public void testFilteredParents() {
+        SlingQuery query = $(tree.getChild("application/configuration/labels/jcr:content/configParsys/tab/items"))
+                .parents("cq:Page");
+        assertResourceSetEquals(query.iterator(), "labels", "configuration", "application", "/");
+    }
 
-	@Test
-	public void testNoParents() {
-		SlingQuery query = $(
-				tree.getChild("application/configuration/labels/jcr:content/configParsys/tab/items"))
-				.parents("cq:Undefined");
-		assertEmptyIterator(query.iterator());
-	}
+    @Test
+    public void testNoParents() {
+        SlingQuery query = $(tree.getChild("application/configuration/labels/jcr:content/configParsys/tab/items"))
+                .parents("cq:Undefined");
+        assertEmptyIterator(query.iterator());
+    }
 
-	@Test
-	public void testRootParents() {
-		SlingQuery query = $(tree).parents();
-		assertEmptyIterator(query.iterator());
-	}
+    @Test
+    public void testRootParents() {
+        SlingQuery query = $(tree).parents();
+        assertEmptyIterator(query.iterator());
+    }
 }
diff --git a/src/test/java/org/apache/sling/query/ParentsUntilTest.java b/src/test/java/org/apache/sling/query/ParentsUntilTest.java
index 80a9ca8..313b205 100644
--- a/src/test/java/org/apache/sling/query/ParentsUntilTest.java
+++ b/src/test/java/org/apache/sling/query/ParentsUntilTest.java
@@ -27,28 +27,28 @@
 
 public class ParentsUntilTest {
 
-	private static final String PAR_PATH = "application/configuration/labels/jcr:content/configParsys/tab/items";
+    private static final String PAR_PATH = "application/configuration/labels/jcr:content/configParsys/tab/items";
 
-	private Resource tree = TestUtils.getTree();
+    private Resource tree = TestUtils.getTree();
 
-	@Test
-	public void testParentsUntilMatch() {
-		SlingQuery query = $(tree.getChild(PAR_PATH)).parentsUntil("cq:Page");
-		assertResourceSetEquals(query.iterator(), "jcr:content", "configParsys", "tab");
-	}
+    @Test
+    public void testParentsUntilMatch() {
+        SlingQuery query = $(tree.getChild(PAR_PATH)).parentsUntil("cq:Page");
+        assertResourceSetEquals(query.iterator(), "jcr:content", "configParsys", "tab");
+    }
 
-	@Test
-	public void testParentsUntilNoMatch() {
-		SlingQuery query = $(tree.getChild(PAR_PATH)).parentsUntil("cq:Undefined");
-		assertResourceSetEquals(query.iterator(), "application", "configuration", "labels", "jcr:content",
-				"configParsys", "tab", "/");
-	}
+    @Test
+    public void testParentsUntilNoMatch() {
+        SlingQuery query = $(tree.getChild(PAR_PATH)).parentsUntil("cq:Undefined");
+        assertResourceSetEquals(query.iterator(), "application", "configuration", "labels", "jcr:content",
+                "configParsys", "tab", "/");
+    }
 
-	@Test
-	public void testParentsUntilResource() {
-		Resource resource = tree.getChild("application/configuration");
-		SlingQuery query = $(tree.getChild(PAR_PATH)).parentsUntil($(resource));
-		assertResourceSetEquals(query.iterator(), "tab", "configParsys", "jcr:content", "labels");
-	}
+    @Test
+    public void testParentsUntilResource() {
+        Resource resource = tree.getChild("application/configuration");
+        SlingQuery query = $(tree.getChild(PAR_PATH)).parentsUntil($(resource));
+        assertResourceSetEquals(query.iterator(), "tab", "configParsys", "jcr:content", "labels");
+    }
 
 }
diff --git a/src/test/java/org/apache/sling/query/SelectorFunctionTest.java b/src/test/java/org/apache/sling/query/SelectorFunctionTest.java
index c3d0b40..1bebd8b 100644
--- a/src/test/java/org/apache/sling/query/SelectorFunctionTest.java
+++ b/src/test/java/org/apache/sling/query/SelectorFunctionTest.java
@@ -28,94 +28,92 @@
 
 public class SelectorFunctionTest {
 
-	// children with indexes:
-	// 0 - richtext
-	// 1 - configvalue
-	// 2 - configvalue_0
-	// 3 - configvalue_1
-	// 4 - configvalue_2
-	private static final String PAR_PATH = "home/java/labels/jcr:content/par";
+    // children with indexes:
+    // 0 - richtext
+    // 1 - configvalue
+    // 2 - configvalue_0
+    // 3 - configvalue_1
+    // 4 - configvalue_2
+    private static final String PAR_PATH = "home/java/labels/jcr:content/par";
 
-	private Resource tree = TestUtils.getTree();
+    private Resource tree = TestUtils.getTree();
 
-	@Test
-	public void testEq() {
-		SlingQuery query = $(tree.getChild(PAR_PATH)).children(":eq(2)");
-		assertResourceSetEquals(query.iterator(), "configvalue_0");
-	}
+    @Test
+    public void testEq() {
+        SlingQuery query = $(tree.getChild(PAR_PATH)).children(":eq(2)");
+        assertResourceSetEquals(query.iterator(), "configvalue_0");
+    }
 
-	@Test
-	public void testFirst() {
-		SlingQuery query = $(tree.getChild(PAR_PATH)).children(":first");
-		assertResourceSetEquals(query.iterator(), "richtext");
-	}
+    @Test
+    public void testFirst() {
+        SlingQuery query = $(tree.getChild(PAR_PATH)).children(":first");
+        assertResourceSetEquals(query.iterator(), "richtext");
+    }
 
-	@Test
-	public void testLast() {
-		SlingQuery query = $(tree.getChild(PAR_PATH)).children(":last");
-		assertResourceSetEquals(query.iterator(), "configvalue_2");
-	}
+    @Test
+    public void testLast() {
+        SlingQuery query = $(tree.getChild(PAR_PATH)).children(":last");
+        assertResourceSetEquals(query.iterator(), "configvalue_2");
+    }
 
-	@Test
-	public void testGt() {
-		SlingQuery query = $(tree.getChild(PAR_PATH)).children(":gt(2)");
-		assertResourceSetEquals(query.iterator(), "configvalue_1", "configvalue_2");
-	}
+    @Test
+    public void testGt() {
+        SlingQuery query = $(tree.getChild(PAR_PATH)).children(":gt(2)");
+        assertResourceSetEquals(query.iterator(), "configvalue_1", "configvalue_2");
+    }
 
-	@Test
-	public void testLt() {
-		SlingQuery query = $(tree.getChild(PAR_PATH)).children(":lt(3)");
-		assertResourceSetEquals(query.iterator(), "richtext", "configvalue", "configvalue_0");
-	}
+    @Test
+    public void testLt() {
+        SlingQuery query = $(tree.getChild(PAR_PATH)).children(":lt(3)");
+        assertResourceSetEquals(query.iterator(), "richtext", "configvalue", "configvalue_0");
+    }
 
-	@Test
-	public void testHas() {
-		SlingQuery query = $(tree.getChild("home/java")).searchStrategy(SearchStrategy.DFS).children(
-				":has([key=helloWorld])");
-		assertResourceSetEquals(query.iterator(), "labels");
-	}
+    @Test
+    public void testHas() {
+        SlingQuery query = $(tree.getChild("home/java")).searchStrategy(SearchStrategy.DFS)
+                .children(":has([key=helloWorld])");
+        assertResourceSetEquals(query.iterator(), "labels");
+    }
 
-	@Test
-	public void testParent() {
-		SlingQuery query = $(tree.getChild("home/java/email/jcr:content/par")).children(":parent");
-		assertResourceSetEquals(query.iterator(), "email");
-	}
+    @Test
+    public void testParent() {
+        SlingQuery query = $(tree.getChild("home/java/email/jcr:content/par")).children(":parent");
+        assertResourceSetEquals(query.iterator(), "email");
+    }
 
-	@Test
-	public void testOdd() {
-		SlingQuery query = $(tree.getChild(PAR_PATH)).children(":odd");
-		assertResourceSetEquals(query.iterator(), "configvalue", "configvalue_1");
-	}
+    @Test
+    public void testOdd() {
+        SlingQuery query = $(tree.getChild(PAR_PATH)).children(":odd");
+        assertResourceSetEquals(query.iterator(), "configvalue", "configvalue_1");
+    }
 
-	@Test
-	public void testEven() {
-		SlingQuery query = $(tree.getChild(PAR_PATH)).children(":even");
-		assertResourceSetEquals(query.iterator(), "richtext", "configvalue_0", "configvalue_2");
-	}
+    @Test
+    public void testEven() {
+        SlingQuery query = $(tree.getChild(PAR_PATH)).children(":even");
+        assertResourceSetEquals(query.iterator(), "richtext", "configvalue_0", "configvalue_2");
+    }
 
-	@Test
-	public void testSimpleNot() {
-		SlingQuery query = $(tree.getChild(PAR_PATH)).children(":not(demo/core/components/richtext)");
-		assertResourceSetEquals(query.iterator(), "configvalue", "configvalue_0", "configvalue_1",
-				"configvalue_2");
-	}
+    @Test
+    public void testSimpleNot() {
+        SlingQuery query = $(tree.getChild(PAR_PATH)).children(":not(demo/core/components/richtext)");
+        assertResourceSetEquals(query.iterator(), "configvalue", "configvalue_0", "configvalue_1", "configvalue_2");
+    }
 
-	@Test
-	public void testNotFirst() {
-		SlingQuery query = $(tree.getChild(PAR_PATH)).children(":not(:first)");
-		assertResourceSetEquals(query.iterator(), "configvalue", "configvalue_0", "configvalue_1",
-				"configvalue_2");
-	}
+    @Test
+    public void testNotFirst() {
+        SlingQuery query = $(tree.getChild(PAR_PATH)).children(":not(:first)");
+        assertResourceSetEquals(query.iterator(), "configvalue", "configvalue_0", "configvalue_1", "configvalue_2");
+    }
 
-	@Test
-	public void testNotLast() {
-		SlingQuery query = $(tree.getChild(PAR_PATH)).children(":not(:last)");
-		assertResourceSetEquals(query.iterator(), "richtext", "configvalue", "configvalue_0", "configvalue_1");
-	}
+    @Test
+    public void testNotLast() {
+        SlingQuery query = $(tree.getChild(PAR_PATH)).children(":not(:last)");
+        assertResourceSetEquals(query.iterator(), "richtext", "configvalue", "configvalue_0", "configvalue_1");
+    }
 
-	@Test
-	public void testComplexNot() {
-		SlingQuery query = $(tree.getChild(PAR_PATH)).children(":not(:first):not(:last)");
-		assertResourceSetEquals(query.iterator(), "configvalue", "configvalue_0", "configvalue_1");
-	}
+    @Test
+    public void testComplexNot() {
+        SlingQuery query = $(tree.getChild(PAR_PATH)).children(":not(:first):not(:last)");
+        assertResourceSetEquals(query.iterator(), "configvalue", "configvalue_0", "configvalue_1");
+    }
 }
\ No newline at end of file
diff --git a/src/test/java/org/apache/sling/query/SiblingsTest.java b/src/test/java/org/apache/sling/query/SiblingsTest.java
index fe3092b..1a0e94a 100644
--- a/src/test/java/org/apache/sling/query/SiblingsTest.java
+++ b/src/test/java/org/apache/sling/query/SiblingsTest.java
@@ -28,29 +28,29 @@
 
 public class SiblingsTest {
 
-	private Resource tree = TestUtils.getTree();
+    private Resource tree = TestUtils.getTree();
 
-	@Test
-	public void testSiblings() {
-		SlingQuery query = $(tree.getChild("application")).siblings();
-		assertResourceSetEquals(query.iterator(), "jcr:content", "application", "home");
-	}
+    @Test
+    public void testSiblings() {
+        SlingQuery query = $(tree.getChild("application")).siblings();
+        assertResourceSetEquals(query.iterator(), "jcr:content", "application", "home");
+    }
 
-	@Test
-	public void testFilteredChildren() {
-		SlingQuery query = $(tree.getChild("application")).siblings("cq:Page");
-		assertResourceSetEquals(query.iterator(), "application", "home");
-	}
+    @Test
+    public void testFilteredChildren() {
+        SlingQuery query = $(tree.getChild("application")).siblings("cq:Page");
+        assertResourceSetEquals(query.iterator(), "application", "home");
+    }
 
-	@Test
-	public void testNoSiblings() {
-		SlingQuery query = $(tree.getChild("application")).siblings("cq:Undefined");
-		assertEmptyIterator(query.iterator());
-	}
+    @Test
+    public void testNoSiblings() {
+        SlingQuery query = $(tree.getChild("application")).siblings("cq:Undefined");
+        assertEmptyIterator(query.iterator());
+    }
 
-	@Test
-	public void testRootSiblings() {
-		SlingQuery query = $(tree).siblings();
-		assertResourceSetEquals(query.iterator(), "/");
-	}
+    @Test
+    public void testRootSiblings() {
+        SlingQuery query = $(tree).siblings();
+        assertResourceSetEquals(query.iterator(), "/");
+    }
 }
diff --git a/src/test/java/org/apache/sling/query/SliceTest.java b/src/test/java/org/apache/sling/query/SliceTest.java
index 692b4ee..025eadd 100644
--- a/src/test/java/org/apache/sling/query/SliceTest.java
+++ b/src/test/java/org/apache/sling/query/SliceTest.java
@@ -28,78 +28,78 @@
 
 public class SliceTest {
 
-	// children with indexes:
-	// 0 - richtext
-	// 1 - configvalue
-	// 2 - configvalue_0
-	// 3 - configvalue_1
-	// 4 - configvalue_2
-	private static final String PAR_PATH = "home/java/labels/jcr:content/par";
+    // children with indexes:
+    // 0 - richtext
+    // 1 - configvalue
+    // 2 - configvalue_0
+    // 3 - configvalue_1
+    // 4 - configvalue_2
+    private static final String PAR_PATH = "home/java/labels/jcr:content/par";
 
-	private Resource tree = TestUtils.getTree();
+    private Resource tree = TestUtils.getTree();
 
-	@Test
-	public void testSlice() {
-		SlingQuery query = $(tree.getChild(PAR_PATH)).children().slice(2, 4);
-		assertResourceSetEquals(query.iterator(), "configvalue_0", "configvalue_1", "configvalue_2");
-	}
+    @Test
+    public void testSlice() {
+        SlingQuery query = $(tree.getChild(PAR_PATH)).children().slice(2, 4);
+        assertResourceSetEquals(query.iterator(), "configvalue_0", "configvalue_1", "configvalue_2");
+    }
 
-	@Test
-	public void testSliceOne() {
-		SlingQuery query = $(tree.getChild(PAR_PATH)).children().slice(2, 2);
-		assertResourceSetEquals(query.iterator(), "configvalue_0");
-	}
+    @Test
+    public void testSliceOne() {
+        SlingQuery query = $(tree.getChild(PAR_PATH)).children().slice(2, 2);
+        assertResourceSetEquals(query.iterator(), "configvalue_0");
+    }
 
-	@Test
-	public void testEq() {
-		SlingQuery query = $(tree.getChild(PAR_PATH)).children().eq(2);
-		assertResourceSetEquals(query.iterator(), "configvalue_0");
-	}
+    @Test
+    public void testEq() {
+        SlingQuery query = $(tree.getChild(PAR_PATH)).children().eq(2);
+        assertResourceSetEquals(query.iterator(), "configvalue_0");
+    }
 
-	@Test
-	public void testEqOnEmpty() {
-		SlingQuery query = $(tree).children("cq:Undefined").eq(0);
-		assertEmptyIterator(query.iterator());
-	}
+    @Test
+    public void testEqOnEmpty() {
+        SlingQuery query = $(tree).children("cq:Undefined").eq(0);
+        assertEmptyIterator(query.iterator());
+    }
 
-	@Test
-	public void testFirst() {
-		SlingQuery query = $(tree.getChild(PAR_PATH)).children().first();
-		assertResourceSetEquals(query.iterator(), "richtext");
-	}
+    @Test
+    public void testFirst() {
+        SlingQuery query = $(tree.getChild(PAR_PATH)).children().first();
+        assertResourceSetEquals(query.iterator(), "richtext");
+    }
 
-	@Test
-	public void testFirstOnEmpty() {
-		SlingQuery query = $(tree).children("cq:Undefined").first();
-		assertEmptyIterator(query.iterator());
-	}
+    @Test
+    public void testFirstOnEmpty() {
+        SlingQuery query = $(tree).children("cq:Undefined").first();
+        assertEmptyIterator(query.iterator());
+    }
 
-	@Test
-	public void testSliceAll() {
-		SlingQuery query = $(tree.getChild(PAR_PATH)).children().slice(0, 4);
-		assertResourceSetEquals(query.iterator(), "richtext", "configvalue", "configvalue_0",
-				"configvalue_1", "configvalue_2");
-	}
+    @Test
+    public void testSliceAll() {
+        SlingQuery query = $(tree.getChild(PAR_PATH)).children().slice(0, 4);
+        assertResourceSetEquals(query.iterator(), "richtext", "configvalue", "configvalue_0", "configvalue_1",
+                "configvalue_2");
+    }
 
-	@Test
-	public void testSliceAllBigTo() {
-		SlingQuery query = $(tree.getChild(PAR_PATH)).children().slice(0, 10);
-		assertResourceSetEquals(query.iterator(), "richtext", "configvalue", "configvalue_0",
-				"configvalue_1", "configvalue_2");
-	}
+    @Test
+    public void testSliceAllBigTo() {
+        SlingQuery query = $(tree.getChild(PAR_PATH)).children().slice(0, 10);
+        assertResourceSetEquals(query.iterator(), "richtext", "configvalue", "configvalue_0", "configvalue_1",
+                "configvalue_2");
+    }
 
-	@Test(expected = IndexOutOfBoundsException.class)
-	public void testSliceNegativeFrom() {
-		$(tree.getChild(PAR_PATH)).children().slice(-1);
-	}
+    @Test(expected = IndexOutOfBoundsException.class)
+    public void testSliceNegativeFrom() {
+        $(tree.getChild(PAR_PATH)).children().slice(-1);
+    }
 
-	@Test(expected = IndexOutOfBoundsException.class)
-	public void testSliceNegativeFrom2() {
-		$(tree.getChild(PAR_PATH)).children().slice(-1, 2);
-	}
+    @Test(expected = IndexOutOfBoundsException.class)
+    public void testSliceNegativeFrom2() {
+        $(tree.getChild(PAR_PATH)).children().slice(-1, 2);
+    }
 
-	@Test(expected = IllegalArgumentException.class)
-	public void testSliceFromGreaterThanTo() {
-		$(tree.getChild(PAR_PATH)).children().slice(2, 1);
-	}
+    @Test(expected = IllegalArgumentException.class)
+    public void testSliceFromGreaterThanTo() {
+        $(tree.getChild(PAR_PATH)).children().slice(2, 1);
+    }
 }
\ No newline at end of file
diff --git a/src/test/java/org/apache/sling/query/TestUtils.java b/src/test/java/org/apache/sling/query/TestUtils.java
index 7b68afa..52dc18f 100644
--- a/src/test/java/org/apache/sling/query/TestUtils.java
+++ b/src/test/java/org/apache/sling/query/TestUtils.java
@@ -34,63 +34,62 @@
 import org.junit.Assert;
 
 public final class TestUtils {
-	private TestUtils() {
-	}
+    private TestUtils() {
+    }
 
-	public static Resource getTree() {
-		InputStream jsonStream = TestUtils.class.getClassLoader().getResourceAsStream("sample_tree.json");
-		try {
-			Resource resource = JsonToResource.parse(jsonStream);
-			jsonStream.close();
-			return resource;
-		} catch (IOException e) {
-			return null;
-		}
-	}
+    public static Resource getTree() {
+        InputStream jsonStream = TestUtils.class.getClassLoader().getResourceAsStream("sample_tree.json");
+        try {
+            Resource resource = JsonToResource.parse(jsonStream);
+            jsonStream.close();
+            return resource;
+        } catch (IOException e) {
+            return null;
+        }
+    }
 
-	public static <T> List<T> iteratorToList(Iterator<T> iterator) {
-		List<T> list = new ArrayList<T>();
-		while (iterator.hasNext()) {
-			list.add(iterator.next());
-		}
-		return list;
-	}
+    public static <T> List<T> iteratorToList(Iterator<T> iterator) {
+        List<T> list = new ArrayList<T>();
+        while (iterator.hasNext()) {
+            list.add(iterator.next());
+        }
+        return list;
+    }
 
-	public static <T> List<Option<T>> optionList(List<T> list) {
-		List<Option<T>> result = new ArrayList<Option<T>>();
-		int index = 0;
-		for (T element : list) {
-			result.add(Option.of(element, index++));
-		}
-		return result;
-	}
+    public static <T> List<Option<T>> optionList(List<T> list) {
+        List<Option<T>> result = new ArrayList<Option<T>>();
+        int index = 0;
+        for (T element : list) {
+            result.add(Option.of(element, index++));
+        }
+        return result;
+    }
 
-	public static void assertEmptyIterator(Iterator<?> iterator) {
-		if (iterator.hasNext()) {
-			Assert.fail(String.format("Iterator should be empty, but %s is returned", iterator.next()
-					.toString()));
-		}
-	}
+    public static void assertEmptyIterator(Iterator<?> iterator) {
+        if (iterator.hasNext()) {
+            Assert.fail(String.format("Iterator should be empty, but %s is returned", iterator.next().toString()));
+        }
+    }
 
-	public static void assertResourceSetEquals(Iterator<Resource> iterator, String... names) {
-		Set<String> expectedSet = new LinkedHashSet<String>(Arrays.asList(names));
-		Set<String> actualSet = new LinkedHashSet<String>(getResourceNames(iterator));
-		Assert.assertEquals(expectedSet, actualSet);
-	}
+    public static void assertResourceSetEquals(Iterator<Resource> iterator, String... names) {
+        Set<String> expectedSet = new LinkedHashSet<String>(Arrays.asList(names));
+        Set<String> actualSet = new LinkedHashSet<String>(getResourceNames(iterator));
+        Assert.assertEquals(expectedSet, actualSet);
+    }
 
-	public static void assertResourceListEquals(Iterator<Resource> iterator, String... names) {
-		Assert.assertEquals(Arrays.asList(names), getResourceNames(iterator));
-	}
+    public static void assertResourceListEquals(Iterator<Resource> iterator, String... names) {
+        Assert.assertEquals(Arrays.asList(names), getResourceNames(iterator));
+    }
 
-	public static List<String> l(String... args) {
-		return Arrays.asList(args);
-	}
+    public static List<String> l(String... args) {
+        return Arrays.asList(args);
+    }
 
-	private static List<String> getResourceNames(Iterator<Resource> iterator) {
-		List<String> resourceNames = new ArrayList<String>();
-		while (iterator.hasNext()) {
-			resourceNames.add(iterator.next().getName());
-		}
-		return resourceNames;
-	}
+    private static List<String> getResourceNames(Iterator<Resource> iterator) {
+        List<String> resourceNames = new ArrayList<String>();
+        while (iterator.hasNext()) {
+            resourceNames.add(iterator.next().getName());
+        }
+        return resourceNames;
+    }
 }
diff --git a/src/test/java/org/apache/sling/query/UniqueTest.java b/src/test/java/org/apache/sling/query/UniqueTest.java
index 1c58674..c53a8a3 100644
--- a/src/test/java/org/apache/sling/query/UniqueTest.java
+++ b/src/test/java/org/apache/sling/query/UniqueTest.java
@@ -27,15 +27,15 @@
 
 public class UniqueTest {
 
-	private Resource tree = TestUtils.getTree();
+    private Resource tree = TestUtils.getTree();
 
-	@Test
-	public void testUnique() {
-		Resource r1 = tree.getChild("home");
-		Resource r2 = tree.getChild("application");
-		Resource r3 = tree.getChild("home/java");
+    @Test
+    public void testUnique() {
+        Resource r1 = tree.getChild("home");
+        Resource r2 = tree.getChild("application");
+        Resource r3 = tree.getChild("home/java");
 
-		SlingQuery query = $(r1, r1, r1, r2, r2, r3, r3, r3, r1).unique();
-		assertResourceListEquals(query.iterator(), "home", "application", "java");
-	}
+        SlingQuery query = $(r1, r1, r1, r2, r2, r3, r3, r3, r1).unique();
+        assertResourceListEquals(query.iterator(), "home", "application", "java");
+    }
 }
diff --git a/src/test/java/org/apache/sling/query/impl/iterator/ReverseTest.java b/src/test/java/org/apache/sling/query/impl/iterator/ReverseTest.java
index 9890aae..0e1808d 100644
--- a/src/test/java/org/apache/sling/query/impl/iterator/ReverseTest.java
+++ b/src/test/java/org/apache/sling/query/impl/iterator/ReverseTest.java
@@ -35,19 +35,19 @@
 
 public class ReverseTest {
 
-	@Test
-	public void testReverse() {
-		test(l("a", "b", "c", "d", "e"), l(null, null, null, null, null), new IdentityFunction<String>());
-		test(l("a", "b", "c", "d", "e"), l("a", null, null, null, null), new SliceFunction<String>(1));
-		test(l("a", "b", "c", "d", "e"), l(null, null, null, "d", "e"), new SliceFunction<String>(0, 2));
-	}
+    @Test
+    public void testReverse() {
+        test(l("a", "b", "c", "d", "e"), l(null, null, null, null, null), new IdentityFunction<String>());
+        test(l("a", "b", "c", "d", "e"), l("a", null, null, null, null), new SliceFunction<String>(1));
+        test(l("a", "b", "c", "d", "e"), l(null, null, null, "d", "e"), new SliceFunction<String>(0, 2));
+    }
 
-	private static <T> void test(List<T> input, List<T> output, IteratorToIteratorFunction<T> function) {
-		List<Option<T>> optionInput = TestUtils.optionList(input);
-		List<Option<T>> expectedOutput = TestUtils.optionList(output);
-		Iterator<Option<T>> actualOutputIterator = new ReverseIterator<T>(function, optionInput.iterator());
-		List<Option<T>> actualOutput = TestUtils.iteratorToList(actualOutputIterator);
-		Assert.assertEquals(expectedOutput, actualOutput);
-	}
+    private static <T> void test(List<T> input, List<T> output, IteratorToIteratorFunction<T> function) {
+        List<Option<T>> optionInput = TestUtils.optionList(input);
+        List<Option<T>> expectedOutput = TestUtils.optionList(output);
+        Iterator<Option<T>> actualOutputIterator = new ReverseIterator<T>(function, optionInput.iterator());
+        List<Option<T>> actualOutput = TestUtils.iteratorToList(actualOutputIterator);
+        Assert.assertEquals(expectedOutput, actualOutput);
+    }
 
 }
diff --git a/src/test/java/org/apache/sling/query/impl/iterator/SuppTest.java b/src/test/java/org/apache/sling/query/impl/iterator/SuppTest.java
index ef0c556..031605e 100644
--- a/src/test/java/org/apache/sling/query/impl/iterator/SuppTest.java
+++ b/src/test/java/org/apache/sling/query/impl/iterator/SuppTest.java
@@ -38,99 +38,99 @@
 
 public class SuppTest {
 
-	@Test
-	public void testIdentity() {
-		test(l("a", "b", "c", "d", "e"), l("a", "b", "c", "d", "e"), new IdentityFunction<String>());
-	}
+    @Test
+    public void testIdentity() {
+        test(l("a", "b", "c", "d", "e"), l("a", "b", "c", "d", "e"), new IdentityFunction<String>());
+    }
 
-	@Test
-	public void testNoFirst() {
-		test(l("a", "b", "c", "d", "e"), l(null, "b", "c", "d", "e"), new SliceFunction<String>(1));
-	}
+    @Test
+    public void testNoFirst() {
+        test(l("a", "b", "c", "d", "e"), l(null, "b", "c", "d", "e"), new SliceFunction<String>(1));
+    }
 
-	@Test
-	public void testNoSecond() {
-		testExpanding(l("a", "---"), l("a"));
-	}
+    @Test
+    public void testNoSecond() {
+        testExpanding(l("a", "---"), l("a"));
+    }
 
-	@Test
-	public void testNoTwoFirst() {
-		test(l("a", "b", "c", "d", "e"), l(null, null, "c", "d", "e"), new SliceFunction<String>(2));
-	}
+    @Test
+    public void testNoTwoFirst() {
+        test(l("a", "b", "c", "d", "e"), l(null, null, "c", "d", "e"), new SliceFunction<String>(2));
+    }
 
-	@Test
-	public void testNoLast() {
-		test(l("a", "b", "c", "d", "e"), l("a", "b", "c", "d"), new SliceFunction<String>(0, 3));
-	}
+    @Test
+    public void testNoLast() {
+        test(l("a", "b", "c", "d", "e"), l("a", "b", "c", "d"), new SliceFunction<String>(0, 3));
+    }
 
-	@Test
-	public void testNoTwoLast() {
-		test(l("a", "b", "c", "d", "e"), l("a", "b", "c"), new SliceFunction<String>(0, 2));
-	}
+    @Test
+    public void testNoTwoLast() {
+        test(l("a", "b", "c", "d", "e"), l("a", "b", "c"), new SliceFunction<String>(0, 2));
+    }
 
-	@Test
-	public void testJustFirst() {
-		test(l("a", "b", "c", "d", "e"), l("a"), new SliceFunction<String>(0, 0));
-	}
+    @Test
+    public void testJustFirst() {
+        test(l("a", "b", "c", "d", "e"), l("a"), new SliceFunction<String>(0, 0));
+    }
 
-	@Test
-	public void testExpandFirst() {
-		testExpanding(l("+", "b", "c", "d", "e"), l("+", "b", "c", "d", "e"));
-	}
+    @Test
+    public void testExpandFirst() {
+        testExpanding(l("+", "b", "c", "d", "e"), l("+", "b", "c", "d", "e"));
+    }
 
-	@Test
-	public void testExpandMiddle() {
-		testExpanding(l("a", "b", "+", "d", "e"), l("a", "b", "+", "d", "e"));
-	}
+    @Test
+    public void testExpandMiddle() {
+        testExpanding(l("a", "b", "+", "d", "e"), l("a", "b", "+", "d", "e"));
+    }
 
-	@Test
-	public void testExpandLast() {
-		testExpanding(l("a", "b", "c", "d", "+"), l("a", "b", "c", "d", "+"));
-	}
+    @Test
+    public void testExpandLast() {
+        testExpanding(l("a", "b", "c", "d", "+"), l("a", "b", "c", "d", "+"));
+    }
 
-	@Test
-	public void testRemoveFirst() {
-		testExpanding(l("-", "b", "c", "d", "e"), l(null, "b", "c", "d", "e"));
-		testExpanding(l("---", "b", "c", "d", "e"), l(null, "b", "c", "d", "e"));
-	}
+    @Test
+    public void testRemoveFirst() {
+        testExpanding(l("-", "b", "c", "d", "e"), l(null, "b", "c", "d", "e"));
+        testExpanding(l("---", "b", "c", "d", "e"), l(null, "b", "c", "d", "e"));
+    }
 
-	@Test
-	public void testRemoveMiddle() {
-		testExpanding(l("a", "b", "-", "d", "e"), l("a", "b", null, "d", "e"));
-		testExpanding(l("a", "b", "---", "d", "e"), l("a", "b", null, "d", "e"));
-	}
+    @Test
+    public void testRemoveMiddle() {
+        testExpanding(l("a", "b", "-", "d", "e"), l("a", "b", null, "d", "e"));
+        testExpanding(l("a", "b", "---", "d", "e"), l("a", "b", null, "d", "e"));
+    }
 
-	@Test
-	public void testRemoveLast() {
-		testExpanding(l("a", "b", "c", "d", "-"), l("a", "b", "c", "d"));
-		testExpanding(l("a", "b", "c", "d", "---"), l("a", "b", "c", "d"));
-	}
+    @Test
+    public void testRemoveLast() {
+        testExpanding(l("a", "b", "c", "d", "-"), l("a", "b", "c", "d"));
+        testExpanding(l("a", "b", "c", "d", "---"), l("a", "b", "c", "d"));
+    }
 
-	private static void testExpanding(List<String> input, List<String> output) {
-		test(input, output, EXPANDING_FUNCTION);
-	}
+    private static void testExpanding(List<String> input, List<String> output) {
+        test(input, output, EXPANDING_FUNCTION);
+    }
 
-	private static <T> void test(List<T> input, List<T> output, IteratorToIteratorFunction<T> function) {
-		List<Option<T>> optionInput = TestUtils.optionList(input);
-		List<Option<T>> expectedOutput = TestUtils.optionList(output);
-		Iterator<Option<T>> actualOutputIterator = new SuppIterator<T>(optionInput, function);
-		List<Option<T>> actualOutput = TestUtils.iteratorToList(actualOutputIterator);
-		Assert.assertEquals(expectedOutput, actualOutput);
-	}
+    private static <T> void test(List<T> input, List<T> output, IteratorToIteratorFunction<T> function) {
+        List<Option<T>> optionInput = TestUtils.optionList(input);
+        List<Option<T>> expectedOutput = TestUtils.optionList(output);
+        Iterator<Option<T>> actualOutputIterator = new SuppIterator<T>(optionInput, function);
+        List<Option<T>> actualOutput = TestUtils.iteratorToList(actualOutputIterator);
+        Assert.assertEquals(expectedOutput, actualOutput);
+    }
 
-	private static final IteratorToIteratorFunctionWrapper<String> EXPANDING_FUNCTION = new IteratorToIteratorFunctionWrapper<String>(
-			new ElementToIteratorFunction<String>() {
-				@Override
-				public Iterator<String> apply(String input) {
-					if ("+".equals(input)) {
-						return Arrays.asList("a", "b", "c").iterator();
-					} else if ("-".equals(input)) {
-						return Arrays.<String> asList().iterator();
-					} else if ("---".equals(input)) {
-						return Arrays.<String> asList(null, null, null).iterator();
-					} else {
-						return Arrays.asList(input).iterator();
-					}
-				}
-			});
+    private static final IteratorToIteratorFunctionWrapper<String> EXPANDING_FUNCTION = new IteratorToIteratorFunctionWrapper<String>(
+            new ElementToIteratorFunction<String>() {
+                @Override
+                public Iterator<String> apply(String input) {
+                    if ("+".equals(input)) {
+                        return Arrays.asList("a", "b", "c").iterator();
+                    } else if ("-".equals(input)) {
+                        return Arrays.<String>asList().iterator();
+                    } else if ("---".equals(input)) {
+                        return Arrays.<String>asList(null, null, null).iterator();
+                    } else {
+                        return Arrays.asList(input).iterator();
+                    }
+                }
+            });
 }
\ No newline at end of file
diff --git a/src/test/java/org/apache/sling/query/impl/selector/parser/JcrMultiSelectorTest.java b/src/test/java/org/apache/sling/query/impl/selector/parser/JcrMultiSelectorTest.java
index 7759100..4c1c7c5 100644
--- a/src/test/java/org/apache/sling/query/impl/selector/parser/JcrMultiSelectorTest.java
+++ b/src/test/java/org/apache/sling/query/impl/selector/parser/JcrMultiSelectorTest.java
@@ -25,34 +25,34 @@
 import org.junit.Test;
 
 public class JcrMultiSelectorTest {
-	@Test
-	public void typeHierarchy() {
-		String selector = "cq:Page, cq:Type";
-		String jcrQuery = "SELECT * FROM [cq:Page] AS s";
-		Assert.assertEquals(jcrQuery, parse(selector, "/"));
+    @Test
+    public void typeHierarchy() {
+        String selector = "cq:Page, cq:Type";
+        String jcrQuery = "SELECT * FROM [cq:Page] AS s";
+        Assert.assertEquals(jcrQuery, parse(selector, "/"));
 
-		selector = "cq:Type, cq:Page";
-		Assert.assertEquals(jcrQuery, parse(selector, "/"));
-	}
+        selector = "cq:Type, cq:Page";
+        Assert.assertEquals(jcrQuery, parse(selector, "/"));
+    }
 
-	@Test
-	public void incompatibleTypes() {
-		final String selector = "jcr:someType, cq:Type";
-		final String jcrQuery = "SELECT * FROM [nt:base] AS s";
-		Assert.assertEquals(jcrQuery, parse(selector, "/"));
-	}
+    @Test
+    public void incompatibleTypes() {
+        final String selector = "jcr:someType, cq:Type";
+        final String jcrQuery = "SELECT * FROM [nt:base] AS s";
+        Assert.assertEquals(jcrQuery, parse(selector, "/"));
+    }
 
-	@Test
-	public void attributes() {
-		final String selector = "[x=y][y=z], [a=b][c=d]";
-		final String jcrQuery = "SELECT * FROM [nt:base] AS s WHERE ((s.[x] = 'y' AND s.[y] = 'z') OR (s.[a] = 'b' AND s.[c] = 'd'))";
-		Assert.assertEquals(jcrQuery, parse(selector, "/"));
-	}
+    @Test
+    public void attributes() {
+        final String selector = "[x=y][y=z], [a=b][c=d]";
+        final String jcrQuery = "SELECT * FROM [nt:base] AS s WHERE ((s.[x] = 'y' AND s.[y] = 'z') OR (s.[a] = 'b' AND s.[c] = 'd'))";
+        Assert.assertEquals(jcrQuery, parse(selector, "/"));
+    }
 
-	@Test
-	public void attributesWithPath() {
-		final String selector = "[x=y][y=z], [a=b][c=d]";
-		final String jcrQuery = "SELECT * FROM [nt:base] AS s WHERE (ISDESCENDANTNODE('/content') AND ((s.[x] = 'y' AND s.[y] = 'z') OR (s.[a] = 'b' AND s.[c] = 'd')))";
-		Assert.assertEquals(jcrQuery, parse(selector, "/content"));
-	}
+    @Test
+    public void attributesWithPath() {
+        final String selector = "[x=y][y=z], [a=b][c=d]";
+        final String jcrQuery = "SELECT * FROM [nt:base] AS s WHERE (ISDESCENDANTNODE('/content') AND ((s.[x] = 'y' AND s.[y] = 'z') OR (s.[a] = 'b' AND s.[c] = 'd')))";
+        Assert.assertEquals(jcrQuery, parse(selector, "/content"));
+    }
 }
diff --git a/src/test/java/org/apache/sling/query/impl/selector/parser/JcrSelectorTest.java b/src/test/java/org/apache/sling/query/impl/selector/parser/JcrSelectorTest.java
index dea4fd5..b8a53e4 100644
--- a/src/test/java/org/apache/sling/query/impl/selector/parser/JcrSelectorTest.java
+++ b/src/test/java/org/apache/sling/query/impl/selector/parser/JcrSelectorTest.java
@@ -30,107 +30,107 @@
 import org.junit.Test;
 
 public class JcrSelectorTest {
-	@Test
-	public void parseResourceType() {
-		final String selector = "foundation/components/parsys";
-		final String jcrQuery = "SELECT * FROM [nt:base] AS s WHERE s.[sling:resourceType] = 'foundation/components/parsys'";
-		Assert.assertEquals(jcrQuery, parse(selector, "/"));
-	}
+    @Test
+    public void parseResourceType() {
+        final String selector = "foundation/components/parsys";
+        final String jcrQuery = "SELECT * FROM [nt:base] AS s WHERE s.[sling:resourceType] = 'foundation/components/parsys'";
+        Assert.assertEquals(jcrQuery, parse(selector, "/"));
+    }
 
-	@Test
-	public void parsePrimaryType() {
-		final String selector = "cq:Page";
-		final String jcrQuery = "SELECT * FROM [cq:Page] AS s";
-		Assert.assertEquals(jcrQuery, parse(selector, "/"));
-	}
+    @Test
+    public void parsePrimaryType() {
+        final String selector = "cq:Page";
+        final String jcrQuery = "SELECT * FROM [cq:Page] AS s";
+        Assert.assertEquals(jcrQuery, parse(selector, "/"));
+    }
 
-	@Test
-	public void parsePath() {
-		final String selector = "cq:Page";
-		final String jcrQuery = "SELECT * FROM [cq:Page] AS s WHERE ISDESCENDANTNODE('/content')";
-		Assert.assertEquals(jcrQuery, parse(selector, "/content"));
-	}
+    @Test
+    public void parsePath() {
+        final String selector = "cq:Page";
+        final String jcrQuery = "SELECT * FROM [cq:Page] AS s WHERE ISDESCENDANTNODE('/content')";
+        Assert.assertEquals(jcrQuery, parse(selector, "/content"));
+    }
 
-	@Test
-	public void parseEmptySelector() {
-		final String selector = "";
-		final String jcrQuery = "SELECT * FROM [nt:base] AS s";
-		Assert.assertEquals(jcrQuery, parse(selector, "/"));
-	}
+    @Test
+    public void parseEmptySelector() {
+        final String selector = "";
+        final String jcrQuery = "SELECT * FROM [nt:base] AS s";
+        Assert.assertEquals(jcrQuery, parse(selector, "/"));
+    }
 
-	@Test
-	public void parseEquals() {
-		final String selector = "[key1=value]";
-		final String jcrQuery = "SELECT * FROM [nt:base] AS s WHERE s.[key1] = 'value'";
-		Assert.assertEquals(jcrQuery, parse(selector, "/"));
-	}
+    @Test
+    public void parseEquals() {
+        final String selector = "[key1=value]";
+        final String jcrQuery = "SELECT * FROM [nt:base] AS s WHERE s.[key1] = 'value'";
+        Assert.assertEquals(jcrQuery, parse(selector, "/"));
+    }
 
-	@Test
-	public void parseNotEquals() {
-		final String selector = "[key1!=value]";
-		final String jcrQuery = "SELECT * FROM [nt:base] AS s WHERE s.[key1] != 'value'";
-		Assert.assertEquals(jcrQuery, parse(selector, "/"));
-	}
+    @Test
+    public void parseNotEquals() {
+        final String selector = "[key1!=value]";
+        final String jcrQuery = "SELECT * FROM [nt:base] AS s WHERE s.[key1] != 'value'";
+        Assert.assertEquals(jcrQuery, parse(selector, "/"));
+    }
 
-	@Test
-	public void parseContains() {
-		final String selector = "[key1*=value]";
-		final String jcrQuery = "SELECT * FROM [nt:base] AS s WHERE s.[key1] LIKE '%value%'";
-		Assert.assertEquals(jcrQuery, parse(selector, "/"));
-	}
+    @Test
+    public void parseContains() {
+        final String selector = "[key1*=value]";
+        final String jcrQuery = "SELECT * FROM [nt:base] AS s WHERE s.[key1] LIKE '%value%'";
+        Assert.assertEquals(jcrQuery, parse(selector, "/"));
+    }
 
-	@Test
-	public void parseContainsWord() {
-		final String selector = "[key1~=value]";
-		final String jcrQuery = "SELECT * FROM [nt:base] AS s WHERE s.[key1] LIKE '%value%'";
-		Assert.assertEquals(jcrQuery, parse(selector, "/"));
-	}
+    @Test
+    public void parseContainsWord() {
+        final String selector = "[key1~=value]";
+        final String jcrQuery = "SELECT * FROM [nt:base] AS s WHERE s.[key1] LIKE '%value%'";
+        Assert.assertEquals(jcrQuery, parse(selector, "/"));
+    }
 
-	@Test
-	public void parseStartsWith() {
-		final String selector = "[key1^=value]";
-		final String jcrQuery = "SELECT * FROM [nt:base] AS s WHERE s.[key1] LIKE 'value%'";
-		Assert.assertEquals(jcrQuery, parse(selector, "/"));
-	}
+    @Test
+    public void parseStartsWith() {
+        final String selector = "[key1^=value]";
+        final String jcrQuery = "SELECT * FROM [nt:base] AS s WHERE s.[key1] LIKE 'value%'";
+        Assert.assertEquals(jcrQuery, parse(selector, "/"));
+    }
 
-	@Test
-	public void parseEndsWith() {
-		final String selector = "[key1$=value]";
-		final String jcrQuery = "SELECT * FROM [nt:base] AS s WHERE s.[key1] LIKE '%value'";
-		Assert.assertEquals(jcrQuery, parse(selector, "/"));
-	}
+    @Test
+    public void parseEndsWith() {
+        final String selector = "[key1$=value]";
+        final String jcrQuery = "SELECT * FROM [nt:base] AS s WHERE s.[key1] LIKE '%value'";
+        Assert.assertEquals(jcrQuery, parse(selector, "/"));
+    }
 
-	@Test
-	public void parseEscapedValue() {
-		final String selector = "[key1=value'123]";
-		final String jcrQuery = "SELECT * FROM [nt:base] AS s WHERE s.[key1] = 'value''123'";
-		Assert.assertEquals(jcrQuery, parse(selector, "/"));
-	}
+    @Test
+    public void parseEscapedValue() {
+        final String selector = "[key1=value'123]";
+        final String jcrQuery = "SELECT * FROM [nt:base] AS s WHERE s.[key1] = 'value''123'";
+        Assert.assertEquals(jcrQuery, parse(selector, "/"));
+    }
 
-	@Test
-	public void parseMultipleConditions() {
-		final String selector = "[key1=value1][key2=value2]";
-		final String jcrQuery = "SELECT * FROM [nt:base] AS s WHERE (s.[key1] = 'value1' AND s.[key2] = 'value2')";
-		Assert.assertEquals(jcrQuery, parse(selector, "/"));
-	}
+    @Test
+    public void parseMultipleConditions() {
+        final String selector = "[key1=value1][key2=value2]";
+        final String jcrQuery = "SELECT * FROM [nt:base] AS s WHERE (s.[key1] = 'value1' AND s.[key2] = 'value2')";
+        Assert.assertEquals(jcrQuery, parse(selector, "/"));
+    }
 
-	@Test
-	public void parseMultipleConditionsWithResourceTypeAndPath() {
-		final String selector = "foundation/components/parsys[key1=value1][key2=value2]";
-		final String jcrQuery = "SELECT * FROM [nt:base] AS s WHERE (ISDESCENDANTNODE('/content') AND (s.[sling:resourceType] = 'foundation/components/parsys' AND s.[key1] = 'value1' AND s.[key2] = 'value2'))";
-		Assert.assertEquals(jcrQuery, parse(selector, "/content"));
-	}
+    @Test
+    public void parseMultipleConditionsWithResourceTypeAndPath() {
+        final String selector = "foundation/components/parsys[key1=value1][key2=value2]";
+        final String jcrQuery = "SELECT * FROM [nt:base] AS s WHERE (ISDESCENDANTNODE('/content') AND (s.[sling:resourceType] = 'foundation/components/parsys' AND s.[key1] = 'value1' AND s.[key2] = 'value2'))";
+        Assert.assertEquals(jcrQuery, parse(selector, "/content"));
+    }
 
-	@Test
-	public void parseAttributeWithSubresource() {
-		final String selector = "cq:Page[jcr:content/cq:template=xyz]";
-		final String jcrQuery = "SELECT * FROM [cq:Page] AS s WHERE ISDESCENDANTNODE('/content')";
-		Assert.assertEquals(jcrQuery, parse(selector, "/content"));
-	}
+    @Test
+    public void parseAttributeWithSubresource() {
+        final String selector = "cq:Page[jcr:content/cq:template=xyz]";
+        final String jcrQuery = "SELECT * FROM [cq:Page] AS s WHERE ISDESCENDANTNODE('/content')";
+        Assert.assertEquals(jcrQuery, parse(selector, "/content"));
+    }
 
-	static String parse(String selector, String root) {
-		List<Selector> selectors = SelectorParser.parse(selector);
-		List<SelectorSegment> segments = SelectorParser.getFirstSegmentFromEachSelector(selectors);
-		return new JcrQueryBuilder(new MockTypeResolver()).buildQuery(segments, root);
-	}
+    static String parse(String selector, String root) {
+        List<Selector> selectors = SelectorParser.parse(selector);
+        List<SelectorSegment> segments = SelectorParser.getFirstSegmentFromEachSelector(selectors);
+        return new JcrQueryBuilder(new MockTypeResolver()).buildQuery(segments, root);
+    }
 }
diff --git a/src/test/java/org/apache/sling/query/impl/selector/parser/SelectorTest.java b/src/test/java/org/apache/sling/query/impl/selector/parser/SelectorTest.java
index b363a49..030b0c3 100644
--- a/src/test/java/org/apache/sling/query/impl/selector/parser/SelectorTest.java
+++ b/src/test/java/org/apache/sling/query/impl/selector/parser/SelectorTest.java
@@ -31,235 +31,235 @@
 import org.junit.Test;
 
 public class SelectorTest {
-	@Test
-	public void parseResourceType() {
-		SelectorSegment selector = getFirstSegment("my/resource/type");
-		Assert.assertEquals(selector.getType(), "my/resource/type");
-	}
+    @Test
+    public void parseResourceType() {
+        SelectorSegment selector = getFirstSegment("my/resource/type");
+        Assert.assertEquals(selector.getType(), "my/resource/type");
+    }
 
-	@Test
-	public void parseProperty() {
-		SelectorSegment selector = getFirstSegment("[key=value]");
-		Assert.assertEquals(Arrays.asList(pp("key", "value")), selector.getAttributes());
-	}
+    @Test
+    public void parseProperty() {
+        SelectorSegment selector = getFirstSegment("[key=value]");
+        Assert.assertEquals(Arrays.asList(pp("key", "value")), selector.getAttributes());
+    }
 
-	@Test
-	public void parseProperties() {
-		SelectorSegment selector = getFirstSegment("[key=value][key2=value2]");
-		Assert.assertEquals(Arrays.asList(pp("key", "value"), pp("key2", "value2")), selector.getAttributes());
-	}
+    @Test
+    public void parseProperties() {
+        SelectorSegment selector = getFirstSegment("[key=value][key2=value2]");
+        Assert.assertEquals(Arrays.asList(pp("key", "value"), pp("key2", "value2")), selector.getAttributes());
+    }
 
-	@Test
-	public void parseResourceTypeAndName() {
-		SelectorSegment selector = getFirstSegment("my/resource/type#some-name");
-		Assert.assertEquals("my/resource/type", selector.getType());
-		Assert.assertEquals("some-name", selector.getName());
-	}
+    @Test
+    public void parseResourceTypeAndName() {
+        SelectorSegment selector = getFirstSegment("my/resource/type#some-name");
+        Assert.assertEquals("my/resource/type", selector.getType());
+        Assert.assertEquals("some-name", selector.getName());
+    }
 
-	@Test
-	public void parseResourceTypeAndProperty() {
-		SelectorSegment selector = getFirstSegment("my/resource/type[key=value]");
-		Assert.assertEquals(Arrays.asList(pp("key", "value")), selector.getAttributes());
-		Assert.assertEquals("my/resource/type", selector.getType());
-	}
+    @Test
+    public void parseResourceTypeAndProperty() {
+        SelectorSegment selector = getFirstSegment("my/resource/type[key=value]");
+        Assert.assertEquals(Arrays.asList(pp("key", "value")), selector.getAttributes());
+        Assert.assertEquals("my/resource/type", selector.getType());
+    }
 
-	@Test
-	public void parseResourceTypeAndNameAndProperty() {
-		SelectorSegment selector = getFirstSegment("my/resource/type#some-name[key=value]");
-		Assert.assertEquals(Arrays.asList(pp("key", "value")), selector.getAttributes());
-		Assert.assertEquals("my/resource/type", selector.getType());
-		Assert.assertEquals("some-name", selector.getName());
-	}
+    @Test
+    public void parseResourceTypeAndNameAndProperty() {
+        SelectorSegment selector = getFirstSegment("my/resource/type#some-name[key=value]");
+        Assert.assertEquals(Arrays.asList(pp("key", "value")), selector.getAttributes());
+        Assert.assertEquals("my/resource/type", selector.getType());
+        Assert.assertEquals("some-name", selector.getName());
+    }
 
-	@Test
-	public void parseResourceTypeAndProperties() {
-		SelectorSegment selector = getFirstSegment("my/resource/type[key=value][key2=value2]");
-		Assert.assertEquals(Arrays.asList(pp("key", "value"), pp("key2", "value2")), selector.getAttributes());
-		Assert.assertEquals("my/resource/type", selector.getType());
-	}
+    @Test
+    public void parseResourceTypeAndProperties() {
+        SelectorSegment selector = getFirstSegment("my/resource/type[key=value][key2=value2]");
+        Assert.assertEquals(Arrays.asList(pp("key", "value"), pp("key2", "value2")), selector.getAttributes());
+        Assert.assertEquals("my/resource/type", selector.getType());
+    }
 
-	@Test
-	public void parseResourceTypeAndNameAndProperties() {
-		SelectorSegment selector = getFirstSegment("my/resource/type#some-name[key=value][key2=value2]");
-		Assert.assertEquals(Arrays.asList(pp("key", "value"), pp("key2", "value2")), selector.getAttributes());
-		Assert.assertEquals("my/resource/type", selector.getType());
-		Assert.assertEquals("some-name", selector.getName());
-	}
+    @Test
+    public void parseResourceTypeAndNameAndProperties() {
+        SelectorSegment selector = getFirstSegment("my/resource/type#some-name[key=value][key2=value2]");
+        Assert.assertEquals(Arrays.asList(pp("key", "value"), pp("key2", "value2")), selector.getAttributes());
+        Assert.assertEquals("my/resource/type", selector.getType());
+        Assert.assertEquals("some-name", selector.getName());
+    }
 
-	@Test
-	public void parseFunction() {
-		SelectorSegment selector = getFirstSegment(":eq(12)");
-		Assert.assertEquals(Arrays.asList(f("eq", "12")), selector.getModifiers());
-	}
+    @Test
+    public void parseFunction() {
+        SelectorSegment selector = getFirstSegment(":eq(12)");
+        Assert.assertEquals(Arrays.asList(f("eq", "12")), selector.getModifiers());
+    }
 
-	@Test
-	public void parseNameAndFunction() {
-		SelectorSegment selector = getFirstSegment("#some-name:eq(12)");
-		Assert.assertEquals("some-name", selector.getName());
-		Assert.assertEquals(Arrays.asList(f("eq", "12")), selector.getModifiers());
-	}
+    @Test
+    public void parseNameAndFunction() {
+        SelectorSegment selector = getFirstSegment("#some-name:eq(12)");
+        Assert.assertEquals("some-name", selector.getName());
+        Assert.assertEquals(Arrays.asList(f("eq", "12")), selector.getModifiers());
+    }
 
-	@Test
-	public void parseEscapedNameAndFunction() {
-		SelectorSegment selector = getFirstSegment("#'jcr:content':eq(12)");
-		Assert.assertEquals("jcr:content", selector.getName());
-		Assert.assertEquals(Arrays.asList(f("eq", "12")), selector.getModifiers());
-	}
+    @Test
+    public void parseEscapedNameAndFunction() {
+        SelectorSegment selector = getFirstSegment("#'jcr:content':eq(12)");
+        Assert.assertEquals("jcr:content", selector.getName());
+        Assert.assertEquals(Arrays.asList(f("eq", "12")), selector.getModifiers());
+    }
 
-	@Test
-	public void parseFunctionWithFilter() {
-		SelectorSegment selector = getFirstSegment(":has([key=value])");
-		Assert.assertEquals(Arrays.asList(f("has", "[key=value]")), selector.getModifiers());
-	}
+    @Test
+    public void parseFunctionWithFilter() {
+        SelectorSegment selector = getFirstSegment(":has([key=value])");
+        Assert.assertEquals(Arrays.asList(f("has", "[key=value]")), selector.getModifiers());
+    }
 
-	@Test
-	public void parseNameAndFunctionWithFilter() {
-		SelectorSegment selector = getFirstSegment("#some-name:has([key=value])");
-		Assert.assertEquals(Arrays.asList(f("has", "[key=value]")), selector.getModifiers());
-		Assert.assertEquals("some-name", selector.getName());
-	}
+    @Test
+    public void parseNameAndFunctionWithFilter() {
+        SelectorSegment selector = getFirstSegment("#some-name:has([key=value])");
+        Assert.assertEquals(Arrays.asList(f("has", "[key=value]")), selector.getModifiers());
+        Assert.assertEquals("some-name", selector.getName());
+    }
 
-	@Test
-	public void parseNestedFunction() {
-		SelectorSegment selector = getFirstSegment(":not(:has(cq:Page))");
-		Assert.assertEquals(Arrays.asList(f("not", ":has(cq:Page)")), selector.getModifiers());
-	}
+    @Test
+    public void parseNestedFunction() {
+        SelectorSegment selector = getFirstSegment(":not(:has(cq:Page))");
+        Assert.assertEquals(Arrays.asList(f("not", ":has(cq:Page)")), selector.getModifiers());
+    }
 
-	@Test
-	public void parseFunctionWithoutArgument() {
-		SelectorSegment selector = getFirstSegment(":first");
-		Assert.assertEquals(Arrays.asList(f("first", null)), selector.getModifiers());
-	}
+    @Test
+    public void parseFunctionWithoutArgument() {
+        SelectorSegment selector = getFirstSegment(":first");
+        Assert.assertEquals(Arrays.asList(f("first", null)), selector.getModifiers());
+    }
 
-	@Test
-	public void parseFunctions() {
-		SelectorSegment selector = getFirstSegment(":eq(12):first");
-		Assert.assertEquals(Arrays.asList(f("eq", "12"), f("first", null)), selector.getModifiers());
-	}
+    @Test
+    public void parseFunctions() {
+        SelectorSegment selector = getFirstSegment(":eq(12):first");
+        Assert.assertEquals(Arrays.asList(f("eq", "12"), f("first", null)), selector.getModifiers());
+    }
 
-	@Test
-	public void parsePrimaryTypeAndFunction() {
-		SelectorSegment selector = getFirstSegment("cq:Page:first");
-		Assert.assertEquals("cq:Page", selector.getType());
-		Assert.assertEquals(Arrays.asList(f("first", null)), selector.getModifiers());
-	}
+    @Test
+    public void parsePrimaryTypeAndFunction() {
+        SelectorSegment selector = getFirstSegment("cq:Page:first");
+        Assert.assertEquals("cq:Page", selector.getType());
+        Assert.assertEquals(Arrays.asList(f("first", null)), selector.getModifiers());
+    }
 
-	@Test
-	public void parsePrimaryTypeAndFunctions() {
-		SelectorSegment selector = getFirstSegment("cq:Page:first:eq(12)");
-		Assert.assertEquals("cq:Page", selector.getType());
-		Assert.assertEquals(Arrays.asList(f("first", null), f("eq", "12")), selector.getModifiers());
-	}
+    @Test
+    public void parsePrimaryTypeAndFunctions() {
+        SelectorSegment selector = getFirstSegment("cq:Page:first:eq(12)");
+        Assert.assertEquals("cq:Page", selector.getType());
+        Assert.assertEquals(Arrays.asList(f("first", null), f("eq", "12")), selector.getModifiers());
+    }
 
-	@Test
-	public void parseResourceTypeAndFunction() {
-		SelectorSegment selector = getFirstSegment("my/resource/type:first");
-		Assert.assertEquals("my/resource/type", selector.getType());
-		Assert.assertEquals(Arrays.asList(f("first", null)), selector.getModifiers());
-	}
+    @Test
+    public void parseResourceTypeAndFunction() {
+        SelectorSegment selector = getFirstSegment("my/resource/type:first");
+        Assert.assertEquals("my/resource/type", selector.getType());
+        Assert.assertEquals(Arrays.asList(f("first", null)), selector.getModifiers());
+    }
 
-	@Test
-	public void parseResourceTypeAndNameAndFunction() {
-		SelectorSegment selector = getFirstSegment("my/resource/type#some-name:first");
-		Assert.assertEquals("my/resource/type", selector.getType());
-		Assert.assertEquals(Arrays.asList(f("first", null)), selector.getModifiers());
-		Assert.assertEquals("some-name", selector.getName());
-	}
+    @Test
+    public void parseResourceTypeAndNameAndFunction() {
+        SelectorSegment selector = getFirstSegment("my/resource/type#some-name:first");
+        Assert.assertEquals("my/resource/type", selector.getType());
+        Assert.assertEquals(Arrays.asList(f("first", null)), selector.getModifiers());
+        Assert.assertEquals("some-name", selector.getName());
+    }
 
-	@Test
-	public void parseResourceTypeAndFunctions() {
-		SelectorSegment selector = getFirstSegment("my/resource/type:first:eq(12)");
-		Assert.assertEquals("my/resource/type", selector.getType());
-		Assert.assertEquals(Arrays.asList(f("first", null), f("eq", "12")), selector.getModifiers());
-	}
+    @Test
+    public void parseResourceTypeAndFunctions() {
+        SelectorSegment selector = getFirstSegment("my/resource/type:first:eq(12)");
+        Assert.assertEquals("my/resource/type", selector.getType());
+        Assert.assertEquals(Arrays.asList(f("first", null), f("eq", "12")), selector.getModifiers());
+    }
 
-	@Test
-	public void parseResourceTypeAndPropertyAndFunction() {
-		SelectorSegment selector = getFirstSegment("my/resource/type[key=value]:first");
-		Assert.assertEquals("my/resource/type", selector.getType());
-		Assert.assertEquals(Arrays.asList(pp("key", "value")), selector.getAttributes());
-		Assert.assertEquals(Arrays.asList(f("first", null)), selector.getModifiers());
-	}
+    @Test
+    public void parseResourceTypeAndPropertyAndFunction() {
+        SelectorSegment selector = getFirstSegment("my/resource/type[key=value]:first");
+        Assert.assertEquals("my/resource/type", selector.getType());
+        Assert.assertEquals(Arrays.asList(pp("key", "value")), selector.getAttributes());
+        Assert.assertEquals(Arrays.asList(f("first", null)), selector.getModifiers());
+    }
 
-	@Test
-	public void parseResourceTypeAndNameAndPropertyAndFunction() {
-		SelectorSegment selector = getFirstSegment("my/resource/type#some-name[key=value]:first");
-		Assert.assertEquals(selector.getType(), "my/resource/type");
-		Assert.assertEquals(Arrays.asList(pp("key", "value")), selector.getAttributes());
-		Assert.assertEquals(Arrays.asList(f("first", null)), selector.getModifiers());
-		Assert.assertEquals("some-name", selector.getName());
-	}
+    @Test
+    public void parseResourceTypeAndNameAndPropertyAndFunction() {
+        SelectorSegment selector = getFirstSegment("my/resource/type#some-name[key=value]:first");
+        Assert.assertEquals(selector.getType(), "my/resource/type");
+        Assert.assertEquals(Arrays.asList(pp("key", "value")), selector.getAttributes());
+        Assert.assertEquals(Arrays.asList(f("first", null)), selector.getModifiers());
+        Assert.assertEquals("some-name", selector.getName());
+    }
 
-	@Test
-	public void parseResourceTypeAndPropertiesAndFunction() {
-		SelectorSegment selector = getFirstSegment("my/resource/type[key=value][key2=value2]:first");
-		Assert.assertEquals("my/resource/type", selector.getType());
-		Assert.assertEquals(Arrays.asList(pp("key", "value"), pp("key2", "value2")), selector.getAttributes());
-		Assert.assertEquals(Arrays.asList(f("first", null)), selector.getModifiers());
-	}
+    @Test
+    public void parseResourceTypeAndPropertiesAndFunction() {
+        SelectorSegment selector = getFirstSegment("my/resource/type[key=value][key2=value2]:first");
+        Assert.assertEquals("my/resource/type", selector.getType());
+        Assert.assertEquals(Arrays.asList(pp("key", "value"), pp("key2", "value2")), selector.getAttributes());
+        Assert.assertEquals(Arrays.asList(f("first", null)), selector.getModifiers());
+    }
 
-	@Test
-	public void parseResourceTypeAndPropertyAndFunctions() {
-		SelectorSegment selector = getFirstSegment("my/resource/type[key=value]:first:eq(12)");
-		Assert.assertEquals("my/resource/type", selector.getType());
-		Assert.assertEquals(Arrays.asList(pp("key", "value")), selector.getAttributes());
-		Assert.assertEquals(Arrays.asList(f("first", null), f("eq", "12")), selector.getModifiers());
-	}
+    @Test
+    public void parseResourceTypeAndPropertyAndFunctions() {
+        SelectorSegment selector = getFirstSegment("my/resource/type[key=value]:first:eq(12)");
+        Assert.assertEquals("my/resource/type", selector.getType());
+        Assert.assertEquals(Arrays.asList(pp("key", "value")), selector.getAttributes());
+        Assert.assertEquals(Arrays.asList(f("first", null), f("eq", "12")), selector.getModifiers());
+    }
 
-	@Test
-	public void parseResourceTypeAndPropertiesAndFunctions() {
-		SelectorSegment selector = getFirstSegment("my/resource/type[key=value][key2=value2]:first:eq(12)");
-		Assert.assertEquals("my/resource/type", selector.getType());
-		Assert.assertEquals(Arrays.asList(pp("key", "value"), pp("key2", "value2")), selector.getAttributes());
-		Assert.assertEquals(Arrays.asList(f("first", null), f("eq", "12")), selector.getModifiers());
-	}
+    @Test
+    public void parseResourceTypeAndPropertiesAndFunctions() {
+        SelectorSegment selector = getFirstSegment("my/resource/type[key=value][key2=value2]:first:eq(12)");
+        Assert.assertEquals("my/resource/type", selector.getType());
+        Assert.assertEquals(Arrays.asList(pp("key", "value"), pp("key2", "value2")), selector.getAttributes());
+        Assert.assertEquals(Arrays.asList(f("first", null), f("eq", "12")), selector.getModifiers());
+    }
 
-	@Test
-	public void parseMultiSegments() {
-		List<SelectorSegment> segments = getSegments("cq:Page cq:Page");
-		Assert.assertEquals(getSegments("cq:Page", " ", "cq:Page"), segments);
+    @Test
+    public void parseMultiSegments() {
+        List<SelectorSegment> segments = getSegments("cq:Page cq:Page");
+        Assert.assertEquals(getSegments("cq:Page", " ", "cq:Page"), segments);
 
-		segments = getSegments("cq:Page > cq:Page");
-		Assert.assertEquals(getSegments("cq:Page", ">", "cq:Page"), segments);
+        segments = getSegments("cq:Page > cq:Page");
+        Assert.assertEquals(getSegments("cq:Page", ">", "cq:Page"), segments);
 
-		segments = getSegments("cq:Page ~ cq:Page");
-		Assert.assertEquals(getSegments("cq:Page", "~", "cq:Page"), segments);
+        segments = getSegments("cq:Page ~ cq:Page");
+        Assert.assertEquals(getSegments("cq:Page", "~", "cq:Page"), segments);
 
-		segments = getSegments("cq:Page + cq:Page");
-		Assert.assertEquals(getSegments("cq:Page", "+", "cq:Page"), segments);
+        segments = getSegments("cq:Page + cq:Page");
+        Assert.assertEquals(getSegments("cq:Page", "+", "cq:Page"), segments);
 
-		segments = getSegments("cq:Page   cq:Page2 +  cq:Page3");
-		Assert.assertEquals(getSegments("cq:Page", " ", "cq:Page2", "+", "cq:Page3"), segments);
-	}
+        segments = getSegments("cq:Page   cq:Page2 +  cq:Page3");
+        Assert.assertEquals(getSegments("cq:Page", " ", "cq:Page2", "+", "cq:Page3"), segments);
+    }
 
-	private static Attribute pp(String key, String value) {
-		return new Attribute(key, "=", value);
-	}
+    private static Attribute pp(String key, String value) {
+        return new Attribute(key, "=", value);
+    }
 
-	private static Modifier f(String functionId, String argument) {
-		return new Modifier(functionId, argument);
-	}
+    private static Modifier f(String functionId, String argument) {
+        return new Modifier(functionId, argument);
+    }
 
-	private static List<SelectorSegment> getSegments(String selector) {
-		return SelectorParser.parse(selector).get(0).getSegments();
-	}
+    private static List<SelectorSegment> getSegments(String selector) {
+        return SelectorParser.parse(selector).get(0).getSegments();
+    }
 
-	private static SelectorSegment getFirstSegment(String selector) {
-		return getSegments(selector).get(0);
-	}
+    private static SelectorSegment getFirstSegment(String selector) {
+        return getSegments(selector).get(0);
+    }
 
-	private static List<SelectorSegment> getSegments(String... segments) {
-		List<SelectorSegment> list = new ArrayList<SelectorSegment>();
-		if (segments.length > 0) {
-			list.add(getFirstSegment(segments[0]));
-		}
-		for (int i = 1; i < segments.length; i += 2) {
-			SelectorSegment parsed = getFirstSegment(segments[i + 1]);
-			char operator = segments[i].charAt(0);
-			SelectorSegment segment = new SelectorSegment(parsed.getType(), null, parsed.getAttributes(),
-					parsed.getModifiers(), operator);
-			list.add(segment);
-		}
-		return list;
-	}
+    private static List<SelectorSegment> getSegments(String... segments) {
+        List<SelectorSegment> list = new ArrayList<SelectorSegment>();
+        if (segments.length > 0) {
+            list.add(getFirstSegment(segments[0]));
+        }
+        for (int i = 1; i < segments.length; i += 2) {
+            SelectorSegment parsed = getFirstSegment(segments[i + 1]);
+            char operator = segments[i].charAt(0);
+            SelectorSegment segment = new SelectorSegment(parsed.getType(), null, parsed.getAttributes(),
+                    parsed.getModifiers(), operator);
+            list.add(segment);
+        }
+        return list;
+    }
 }
\ No newline at end of file
diff --git a/src/test/java/org/apache/sling/query/mock/MockTypeResolver.java b/src/test/java/org/apache/sling/query/mock/MockTypeResolver.java
index 0433c55..eebeec1 100644
--- a/src/test/java/org/apache/sling/query/mock/MockTypeResolver.java
+++ b/src/test/java/org/apache/sling/query/mock/MockTypeResolver.java
@@ -26,24 +26,24 @@
 
 public class MockTypeResolver implements JcrTypeResolver {
 
-	private static final List<String> TYPE_HIERARCHY = Arrays.asList("nt:base", "nt:unstructured", "cq:Page",
-			"cq:Type");
+    private static final List<String> TYPE_HIERARCHY = Arrays.asList("nt:base", "nt:unstructured", "cq:Page",
+            "cq:Type");
 
-	private static final List<String> OTHER_TYPES = Arrays.asList("jcr:otherType", "jcr:someType");
+    private static final List<String> OTHER_TYPES = Arrays.asList("jcr:otherType", "jcr:someType");
 
-	@Override
-	public boolean isJcrType(String name) {
-		return TYPE_HIERARCHY.contains(name) || OTHER_TYPES.contains(name);
-	}
+    @Override
+    public boolean isJcrType(String name) {
+        return TYPE_HIERARCHY.contains(name) || OTHER_TYPES.contains(name);
+    }
 
-	@Override
-	public boolean isSubtype(String supertype, String subtype) {
-		int i1 = TYPE_HIERARCHY.indexOf(supertype);
-		int i2 = TYPE_HIERARCHY.indexOf(subtype);
-		if (i1 == -1 || i2 == -1) {
-			return false;
-		}
-		return i1 < i2;
-	}
+    @Override
+    public boolean isSubtype(String supertype, String subtype) {
+        int i1 = TYPE_HIERARCHY.indexOf(supertype);
+        int i2 = TYPE_HIERARCHY.indexOf(subtype);
+        if (i1 == -1 || i2 == -1) {
+            return false;
+        }
+        return i1 < i2;
+    }
 
 }
diff --git a/src/test/java/org/apache/sling/query/mock/PropertyResourceMock.java b/src/test/java/org/apache/sling/query/mock/PropertyResourceMock.java
index 55380c7..68219c4 100644
--- a/src/test/java/org/apache/sling/query/mock/PropertyResourceMock.java
+++ b/src/test/java/org/apache/sling/query/mock/PropertyResourceMock.java
@@ -28,92 +28,92 @@
 
 public class PropertyResourceMock implements Resource {
 
-	private final String name;
+    private final String name;
 
-	private final Resource parent;
+    private final Resource parent;
 
-	private final String value;
+    private final String value;
 
-	private final String[] values;
+    private final String[] values;
 
-	public PropertyResourceMock(Resource parent, String name, String value) {
-		this.parent = parent;
-		this.name = name;
-		this.value = value;
-		this.values = null;
-	}
+    public PropertyResourceMock(Resource parent, String name, String value) {
+        this.parent = parent;
+        this.name = name;
+        this.value = value;
+        this.values = null;
+    }
 
-	public PropertyResourceMock(Resource parent, String name, String[] values) {
-		this.parent = parent;
-		this.name = name;
-		this.value = null;
-		this.values = values;
-	}
+    public PropertyResourceMock(Resource parent, String name, String[] values) {
+        this.parent = parent;
+        this.name = name;
+        this.value = null;
+        this.values = values;
+    }
 
-	@SuppressWarnings("unchecked")
-	@Override
-	public <AdapterType> AdapterType adaptTo(Class<AdapterType> type) {
-		if (type.isAssignableFrom(String.class)) {
-			return (AdapterType) value;
-		} else if (type.isAssignableFrom(String[].class)) {
-			return (AdapterType) (value == null ? values : new String[] { value });
-		} else {
-			return null;
-		}
-	}
+    @SuppressWarnings("unchecked")
+    @Override
+    public <AdapterType> AdapterType adaptTo(Class<AdapterType> type) {
+        if (type.isAssignableFrom(String.class)) {
+            return (AdapterType) value;
+        } else if (type.isAssignableFrom(String[].class)) {
+            return (AdapterType) (value == null ? values : new String[] { value });
+        } else {
+            return null;
+        }
+    }
 
-	@Override
-	public String getPath() {
-		if (parent == null) {
-			return "";
-		} else {
-			return String.format("%s/%s", parent.getPath(), name);
-		}
-	}
+    @Override
+    public String getPath() {
+        if (parent == null) {
+            return "";
+        } else {
+            return String.format("%s/%s", parent.getPath(), name);
+        }
+    }
 
-	@Override
-	public String getName() {
-		return name;
-	}
+    @Override
+    public String getName() {
+        return name;
+    }
 
-	@Override
-	public Resource getParent() {
-		return parent;
-	}
+    @Override
+    public Resource getParent() {
+        return parent;
+    }
 
-	@Override
-	public Iterator<Resource> listChildren() {
-		return Arrays.<Resource> asList().iterator();
-	}
+    @Override
+    public Iterator<Resource> listChildren() {
+        return Arrays.<Resource>asList().iterator();
+    }
 
-	@Override
-	public Resource getChild(String relPath) {
-		throw new UnsupportedOperationException();
-	}
+    @Override
+    public Resource getChild(String relPath) {
+        throw new UnsupportedOperationException();
+    }
 
-	@Override
-	public String getResourceType() {
-		throw new UnsupportedOperationException();
-	}
+    @Override
+    public String getResourceType() {
+        throw new UnsupportedOperationException();
+    }
 
-	@Override
-	public String getResourceSuperType() {
-		throw new UnsupportedOperationException();
-	}
+    @Override
+    public String getResourceSuperType() {
+        throw new UnsupportedOperationException();
+    }
 
-	@Override
-	public boolean isResourceType(String resourceType) {
-		throw new UnsupportedOperationException();
-	}
+    @Override
+    public boolean isResourceType(String resourceType) {
+        throw new UnsupportedOperationException();
+    }
 
-	@Override
-	public ResourceMetadata getResourceMetadata() {
-		throw new UnsupportedOperationException();
-	}
+    @Override
+    public ResourceMetadata getResourceMetadata() {
+        throw new UnsupportedOperationException();
+    }
 
-	@Override
-	public ResourceResolver getResourceResolver() {
-		throw new UnsupportedOperationException();
-	}
+    @Override
+    public ResourceResolver getResourceResolver() {
+        throw new UnsupportedOperationException();
+    }
 
 }
diff --git a/src/test/java/org/apache/sling/query/mock/ResourceMock.java b/src/test/java/org/apache/sling/query/mock/ResourceMock.java
index 39d7804..a49338f 100644
--- a/src/test/java/org/apache/sling/query/mock/ResourceMock.java
+++ b/src/test/java/org/apache/sling/query/mock/ResourceMock.java
@@ -33,129 +33,128 @@
 
 public class ResourceMock implements Resource {
 
-	private final String name;
+    private final String name;
 
-	private final Map<String, Resource> children;
+    private final Map<String, Resource> children;
 
-	private final Resource parent;
+    private final Resource parent;
 
-	public ResourceMock(Resource parent, String name) {
-		this.name = name;
-		this.parent = parent;
-		this.children = new LinkedHashMap<String, Resource>();
-	}
+    public ResourceMock(Resource parent, String name) {
+        this.name = name;
+        this.parent = parent;
+        this.children = new LinkedHashMap<String, Resource>();
+    }
 
-	public void addChild(Resource resource) {
-		children.put(resource.getName(), resource);
-	}
+    public void addChild(Resource resource) {
+        children.put(resource.getName(), resource);
+    }
 
-	@Override
-	public String getName() {
-		return name;
-	}
+    @Override
+    public String getName() {
+        return name;
+    }
 
-	@Override
-	public Resource getParent() {
-		return parent;
-	}
+    @Override
+    public Resource getParent() {
+        return parent;
+    }
 
-	@Override
-	public Iterator<Resource> listChildren() {
-		List<Resource> nonProperties = new ArrayList<Resource>();
-		for (Resource r : children.values()) {
-			if (!(r instanceof PropertyResourceMock)) {
-				nonProperties.add(r);
-			}
-		}
-		return nonProperties.iterator();
-	}
+    @Override
+    public Iterator<Resource> listChildren() {
+        List<Resource> nonProperties = new ArrayList<Resource>();
+        for (Resource r : children.values()) {
+            if (!(r instanceof PropertyResourceMock)) {
+                nonProperties.add(r);
+            }
+        }
+        return nonProperties.iterator();
+    }
 
-	@Override
-	public Resource getChild(String relPath) {
-		if (StringUtils.contains(relPath, '/')) {
-			String firstPart = StringUtils.substringBefore(relPath, "/");
-			String rest = StringUtils.substringAfter(relPath, "/");
-			if (children.containsKey(firstPart)) {
-				return children.get(firstPart).getChild(rest);
-			}
-		} else if (children.containsKey(relPath)) {
-			return children.get(relPath);
-		}
+    @Override
+    public Resource getChild(String relPath) {
+        if (StringUtils.contains(relPath, '/')) {
+            String firstPart = StringUtils.substringBefore(relPath, "/");
+            String rest = StringUtils.substringAfter(relPath, "/");
+            if (children.containsKey(firstPart)) {
+                return children.get(firstPart).getChild(rest);
+            }
+        } else if (children.containsKey(relPath)) {
+            return children.get(relPath);
+        }
 
-		return null;
-	}
+        return null;
+    }
 
-	@SuppressWarnings("unchecked")
-	@Override
-	public <AdapterType> AdapterType adaptTo(Class<AdapterType> type) {
-		if (type.isAssignableFrom(Map.class)) {
-			Map<String, Object> map = new LinkedHashMap<String, Object>();
-			for (Entry<String, Resource> e : children.entrySet()) {
-				Resource o = e.getValue();
-				String[] stringArray = o.adaptTo(String[].class);
-				String stringValue = o.adaptTo(String.class);
-				if (stringValue != null) {
-					map.put(e.getKey(), stringValue);
-				} else if (stringArray != null) {
-					map.put(e.getKey(), stringArray);
-				}
-			}
-			return (AdapterType) map;
-		} else {
-			return null;
-		}
-	}
+    @SuppressWarnings("unchecked")
+    @Override
+    public <AdapterType> AdapterType adaptTo(Class<AdapterType> type) {
+        if (type.isAssignableFrom(Map.class)) {
+            Map<String, Object> map = new LinkedHashMap<String, Object>();
+            for (Entry<String, Resource> e : children.entrySet()) {
+                Resource o = e.getValue();
+                String[] stringArray = o.adaptTo(String[].class);
+                String stringValue = o.adaptTo(String.class);
+                if (stringValue != null) {
+                    map.put(e.getKey(), stringValue);
+                } else if (stringArray != null) {
+                    map.put(e.getKey(), stringArray);
+                }
+            }
+            return (AdapterType) map;
+        } else {
+            return null;
+        }
+    }
 
-	@Override
-	public boolean isResourceType(String resourceType) {
-		return StringUtils.isNotBlank(resourceType)
-				&& (resourceType.equals(getPropertyAsString("sling:resourceType")) || resourceType
-						.equals(getPropertyAsString("jcr:primaryType")));
-	}
+    @Override
+    public boolean isResourceType(String resourceType) {
+        return StringUtils.isNotBlank(resourceType) && (resourceType.equals(getPropertyAsString("sling:resourceType"))
+                || resourceType.equals(getPropertyAsString("jcr:primaryType")));
+    }
 
-	@Override
-	public String getResourceType() {
-		if (children.containsKey("sling:resourceType")) {
-			return getPropertyAsString("sling:resourceType");
-		} else {
-			return getPropertyAsString("jcr:primaryType");
-		}
-	}
+    @Override
+    public String getResourceType() {
+        if (children.containsKey("sling:resourceType")) {
+            return getPropertyAsString("sling:resourceType");
+        } else {
+            return getPropertyAsString("jcr:primaryType");
+        }
+    }
 
-	@Override
-	public String getPath() {
-		if (parent == null) {
-			return "";
-		} else {
-			return String.format("%s/%s", parent.getPath(), name);
-		}
-	}
+    @Override
+    public String getPath() {
+        if (parent == null) {
+            return "";
+        } else {
+            return String.format("%s/%s", parent.getPath(), name);
+        }
+    }
 
-	@Override
-	public String getResourceSuperType() {
-		throw new UnsupportedOperationException();
-	}
+    @Override
+    public String getResourceSuperType() {
+        throw new UnsupportedOperationException();
+    }
 
-	@Override
-	public ResourceMetadata getResourceMetadata() {
-		throw new UnsupportedOperationException();
-	}
+    @Override
+    public ResourceMetadata getResourceMetadata() {
+        throw new UnsupportedOperationException();
+    }
 
-	@Override
-	public ResourceResolver getResourceResolver() {
-		return null;
-	}
+    @Override
+    public ResourceResolver getResourceResolver() {
+        return null;
+    }
 
-	@Override
-	public String toString() {
-		return String.format("ResourceMock[%s]", name);
-	}
+    @Override
+    public String toString() {
+        return String.format("ResourceMock[%s]", name);
+    }
 
-	private String getPropertyAsString(String name) {
-		if (children.containsKey(name)) {
-			return children.get(name).adaptTo(String.class);
-		}
-		return null;
-	}
+    private String getPropertyAsString(String name) {
+        if (children.containsKey(name)) {
+            return children.get(name).adaptTo(String.class);
+        }
+        return null;
+    }
 
 }
diff --git a/src/test/java/org/apache/sling/query/mock/json/JsonToResource.java b/src/test/java/org/apache/sling/query/mock/json/JsonToResource.java
index 3635ce1..1b5210c 100644
--- a/src/test/java/org/apache/sling/query/mock/json/JsonToResource.java
+++ b/src/test/java/org/apache/sling/query/mock/json/JsonToResource.java
@@ -34,44 +34,44 @@
 import com.google.gson.JsonPrimitive;
 
 public final class JsonToResource {
-	private JsonToResource() {
-	}
+    private JsonToResource() {
+    }
 
-	public static Resource parse(InputStream inputStream) {
-		JsonElement element = new JsonParser().parse(new InputStreamReader(inputStream));
-		return parseResource(element.getAsJsonObject(), "/", null);
-	}
+    public static Resource parse(InputStream inputStream) {
+        JsonElement element = new JsonParser().parse(new InputStreamReader(inputStream));
+        return parseResource(element.getAsJsonObject(), "/", null);
+    }
 
-	private static Resource parseResource(JsonElement object, String name, Resource parent) {
-		if (object.isJsonArray()) {
-			return parseResource(object.getAsJsonArray(), name, parent);
-		} else if (object.isJsonPrimitive()) {
-			return parseResource(object.getAsJsonPrimitive(), name, parent);
-		} else if (object.isJsonObject()) {
-			return parseResource(object.getAsJsonObject(), name, parent);
-		} else {
-			return null;
-		}
-	}
+    private static Resource parseResource(JsonElement object, String name, Resource parent) {
+        if (object.isJsonArray()) {
+            return parseResource(object.getAsJsonArray(), name, parent);
+        } else if (object.isJsonPrimitive()) {
+            return parseResource(object.getAsJsonPrimitive(), name, parent);
+        } else if (object.isJsonObject()) {
+            return parseResource(object.getAsJsonObject(), name, parent);
+        } else {
+            return null;
+        }
+    }
 
-	private static Resource parseResource(JsonArray array, String name, Resource parent) {
-		final String[] values = new String[array.size()];
-		int i = 0;
-		for (JsonElement e : array) {
-			values[i++] = e.getAsString();
-		}
-		return new PropertyResourceMock(parent, name, values);
-	}
+    private static Resource parseResource(JsonArray array, String name, Resource parent) {
+        final String[] values = new String[array.size()];
+        int i = 0;
+        for (JsonElement e : array) {
+            values[i++] = e.getAsString();
+        }
+        return new PropertyResourceMock(parent, name, values);
+    }
 
-	private static Resource parseResource(JsonPrimitive primitive, String name, Resource parent) {
-		return new PropertyResourceMock(parent, name, primitive.getAsString());
-	}
+    private static Resource parseResource(JsonPrimitive primitive, String name, Resource parent) {
+        return new PropertyResourceMock(parent, name, primitive.getAsString());
+    }
 
-	private static Resource parseResource(JsonObject object, String name, Resource parent) {
-		ResourceMock resource = new ResourceMock(parent, name);
-		for (Entry<String, JsonElement> entry : object.entrySet()) {
-			resource.addChild(parseResource(entry.getValue(), entry.getKey(), resource));
-		}
-		return resource;
-	}
+    private static Resource parseResource(JsonObject object, String name, Resource parent) {
+        ResourceMock resource = new ResourceMock(parent, name);
+        for (Entry<String, JsonElement> entry : object.entrySet()) {
+            resource.addChild(parseResource(entry.getValue(), entry.getKey(), resource));
+        }
+        return resource;
+    }
 }
