Index: oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/Filter.java
===================================================================
--- oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/Filter.java	(revision 1532269)
+++ oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/Filter.java	(working copy)
@@ -27,7 +27,6 @@
 import javax.jcr.PropertyType;
 
 import org.apache.jackrabbit.oak.api.PropertyValue;
-import org.apache.jackrabbit.oak.api.Tree;
 import org.apache.jackrabbit.oak.query.fulltext.FullTextExpression;
 
 /**
@@ -64,13 +63,6 @@
      * @return the condition (null if none)
      */
     FullTextExpression getFullTextConstraint();
-    
-    /**
-     * Get the root tree to read data.
-     * 
-     * @return the tree
-     */
-    Tree getRootTree();
 
     /**
      * Get the property restriction for the given property, if any.
Index: oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/nodetype/NodeTypeIndexTest.java
===================================================================
--- oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/nodetype/NodeTypeIndexTest.java	(revision 1532269)
+++ oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/nodetype/NodeTypeIndexTest.java	(working copy)
@@ -103,7 +103,7 @@
         NodeState types = system.getChildNode(JCR_NODE_TYPES);
         NodeState type = types.getChildNode(nodeTypeName);
         SelectorImpl selector = new SelectorImpl(type, nodeTypeName);
-        return new FilterImpl(selector, "SELECT * FROM [" + nodeTypeName + "]", null);
+        return new FilterImpl(selector, "SELECT * FROM [" + nodeTypeName + "]");
     }
 
     private static void checkCursor(Cursor cursor, String... matches) {
Index: oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SelectorImpl.java
===================================================================
--- oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SelectorImpl.java	(revision 1532269)
+++ oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/SelectorImpl.java	(working copy)
@@ -227,7 +227,7 @@
      * @return the filter
      */
     private Filter createFilter(boolean preparing) {
-        FilterImpl f = new FilterImpl(this, query.getStatement(), query.getRootTree());
+        FilterImpl f = new FilterImpl(this, query.getStatement());
         f.setPreparing(preparing);
         if (joinCondition != null) {
             joinCondition.restrict(f);
Index: oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryImpl.java
===================================================================
--- oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryImpl.java	(revision 1532269)
+++ oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryImpl.java	(working copy)
@@ -103,8 +103,9 @@
     private long offset;
     private long size = -1;
     private boolean prepared;
-    private Tree rootTree;
-    private NodeState rootState;
+    private ExecutionContext context;
+//    private Tree rootTree;
+//    private NodeState rootState;
     private NamePathMapper namePathMapper;
 
     QueryImpl(String statement, SourceImpl source, ConstraintImpl constraint, ColumnImpl[] columns) {
@@ -375,7 +376,7 @@
             LOG.debug("query execute {} ", statement);
             LOG.debug("query plan {}", getPlan());
         }
-        RowIterator rowIt = new RowIterator(rootState);
+        RowIterator rowIt = new RowIterator(context.getRootState());
         Comparator<ResultRowImpl> orderBy = ResultRowImpl.getComparator(orderings);
         Iterator<ResultRowImpl> it = 
                 FilterIterators.newCombinedFilter(rowIt, distinct, limit, offset, orderBy);
@@ -414,7 +415,7 @@
     
     @Override
     public String getPlan() {
-        return source.getPlan(rootState);
+        return source.getPlan(context.getRootState());
     }
 
     @Override
@@ -577,23 +578,15 @@
     }
 
     public QueryIndex getBestIndex(Filter filter) {
-        return QueryEngineImpl.getBestIndex(this, rootState, filter, indexProvider);
+        return QueryEngineImpl.getBestIndex(context.getRootState(), filter,
+                indexProvider);
     }
 
     @Override
-    public void setRootTree(Tree rootTree) {
-        this.rootTree = rootTree;
-    }
-    
-    public Tree getRootTree() {
-        return rootTree;
+    public void setExecutionContext(ExecutionContext context) {
+        this.context = context;
     }
-    
-    @Override
-    public void setRootState(NodeState rootState) {
-        this.rootState = rootState;
-    }
-    
+
     @Override
     public void setOrderings(OrderingImpl[] orderings) {
         this.orderings = orderings;
@@ -610,7 +603,7 @@
 
     @Override
     public Tree getTree(String path) {
-        return TreeUtil.getTree(rootTree, PathUtils.isAbsolute(path) ? path.substring(1) : path);
+        return TreeUtil.getTree(context.getRootTree(), PathUtils.isAbsolute(path) ? path.substring(1) : path);
     }
 
     /**
Index: oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/IndexUpdateTest.java
===================================================================
--- oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/IndexUpdateTest.java	(revision 1532269)
+++ oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/IndexUpdateTest.java	(working copy)
@@ -200,7 +200,7 @@
         NodeState types = system.getChildNode(JCR_NODE_TYPES);
         NodeState type = types.getChildNode(NT_BASE);
         SelectorImpl selector = new SelectorImpl(type, NT_BASE);
-        Filter filter = new FilterImpl(selector, "SELECT * FROM [nt:base]", null);
+        Filter filter = new FilterImpl(selector, "SELECT * FROM [nt:base]");
         return Sets.newHashSet(lookup.query(filter, name,
                 PropertyValues.newString(value)));
     }
Index: oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java
===================================================================
--- oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java	(revision 1532269)
+++ oak-core/src/main/java/org/apache/jackrabbit/oak/query/Query.java	(working copy)
@@ -23,7 +23,6 @@
 import org.apache.jackrabbit.oak.query.ast.ColumnImpl;
 import org.apache.jackrabbit.oak.query.ast.OrderingImpl;
 import org.apache.jackrabbit.oak.spi.query.QueryIndexProvider;
-import org.apache.jackrabbit.oak.spi.state.NodeState;
 
 /**
  * A "select" or "union" query.
@@ -34,9 +33,7 @@
  */
 public interface Query {
 
-    void setRootTree(Tree rootTree);
-
-    void setRootState(NodeState rootState);
+    void setExecutionContext(ExecutionContext context);
 
     void setNamePathMapper(NamePathMapper namePathMapper);
 
Index: oak-core/src/main/java/org/apache/jackrabbit/oak/query/ExecutionContext.java
===================================================================
--- oak-core/src/main/java/org/apache/jackrabbit/oak/query/ExecutionContext.java	(revision 1532269)
+++ oak-core/src/main/java/org/apache/jackrabbit/oak/query/ExecutionContext.java	(working copy)
@@ -44,6 +44,10 @@
     }
 
     /**
+     * 
+     * Used to evaluate the query (ie. read the existing node types, index
+     * definitions), doesn't need to be a secured version of a node state
+     * 
      * @return Root node state of the content tree against which the query runs.
      */
     @Nonnull
@@ -52,6 +56,10 @@
     }
 
     /**
+     * 
+     * Used to create the actual query results from the indexed paths, needs to
+     * be a secured version of a tree to take into account ACLs
+     * 
      * @return Root tree of the content tree against which the query runs.
      */
     @Nonnull
Index: oak-core/src/main/java/org/apache/jackrabbit/oak/query/UnionQueryImpl.java
===================================================================
--- oak-core/src/main/java/org/apache/jackrabbit/oak/query/UnionQueryImpl.java	(revision 1532269)
+++ oak-core/src/main/java/org/apache/jackrabbit/oak/query/UnionQueryImpl.java	(working copy)
@@ -20,7 +20,6 @@
 import java.util.Iterator;
 import java.util.List;
 
-import com.google.common.collect.Iterators;
 import org.apache.jackrabbit.oak.api.PropertyValue;
 import org.apache.jackrabbit.oak.api.Result;
 import org.apache.jackrabbit.oak.api.Tree;
@@ -29,10 +28,11 @@
 import org.apache.jackrabbit.oak.query.ast.OrderingImpl;
 import org.apache.jackrabbit.oak.spi.query.PropertyValues;
 import org.apache.jackrabbit.oak.spi.query.QueryIndexProvider;
-import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.collect.Iterators;
+
 /**
  * Represents a union query.
  */
@@ -57,18 +57,12 @@
     }
 
     @Override
-    public void setRootTree(Tree rootTree) {
-        left.setRootTree(rootTree);
-        right.setRootTree(rootTree);
+    public void setExecutionContext(ExecutionContext context) {
+        left.setExecutionContext(context);
+        right.setExecutionContext(context);
     }
 
     @Override
-    public void setRootState(NodeState rootState) {
-        left.setRootState(rootState);
-        right.setRootState(rootState);
-    }
-    
-    @Override
     public void setOrderings(OrderingImpl[] orderings) {
         if (orderings == null) {
             left.setOrderings(null);
Index: oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java
===================================================================
--- oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java	(revision 1532269)
+++ oak-core/src/main/java/org/apache/jackrabbit/oak/query/QueryEngineImpl.java	(working copy)
@@ -135,8 +135,7 @@
 
         ExecutionContext context = getExecutionContext();
         Query q = parseQuery(statement, language, context);
-        q.setRootTree(context.getRootTree());
-        q.setRootState(context.getRootState());
+        q.setExecutionContext(context);
         q.setNamePathMapper(namePathMapper);
         q.setLimit(limit);
         q.setOffset(offset);
@@ -171,7 +170,7 @@
         this.traversalFallback = traversal;
     }
 
-    public static QueryIndex getBestIndex(QueryImpl query, NodeState rootState, Filter filter,
+    public static QueryIndex getBestIndex(NodeState rootState, Filter filter,
             QueryIndexProvider indexProvider) {
         QueryIndex best = null;
         if (LOG.isDebugEnabled()) {
Index: oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/FilterImpl.java
===================================================================
--- oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/FilterImpl.java	(revision 1532269)
+++ oak-core/src/main/java/org/apache/jackrabbit/oak/query/index/FilterImpl.java	(working copy)
@@ -31,7 +31,6 @@
 import javax.jcr.PropertyType;
 
 import org.apache.jackrabbit.oak.api.PropertyValue;
-import org.apache.jackrabbit.oak.api.Tree;
 import org.apache.jackrabbit.oak.commons.PathUtils;
 import org.apache.jackrabbit.oak.query.ast.Operator;
 import org.apache.jackrabbit.oak.query.ast.SelectorImpl;
@@ -87,23 +86,16 @@
      * Set during the prepare phase of a query.
      */
     private boolean preparing;
-    
-    private Tree rootTree;
 
     // TODO support "order by"
     
     public FilterImpl() {
-        this(null, null, null);
+        this(null, null);
     }
 
     public FilterImpl(SelectorImpl selector, String queryStatement) {
-        this(selector, queryStatement, null);
-    }
-
-    public FilterImpl(SelectorImpl selector, String queryStatement, Tree rootTree) {
         this.selector = selector;
         this.queryStatement = queryStatement;
-        this.rootTree = rootTree;
         this.matchesAllTypes = selector != null ? selector.matchesAllTypes()
                 : false;
     }
@@ -118,7 +110,6 @@
         this.pathRestriction = impl.pathRestriction;
         this.propertyRestrictions.putAll(impl.propertyRestrictions);
         this.queryStatement = impl.queryStatement;
-        this.rootTree = impl.rootTree;
         this.selector = impl.selector;
         this.matchesAllTypes = selector != null ? selector.matchesAllTypes()
                 : false;
@@ -158,11 +149,6 @@
     public void setDistinct(boolean distinct) {
         this.distinct = distinct;
     }
-    
-    @Override
-    public Tree getRootTree() {
-        return rootTree;
-    }
 
     public void setAlwaysFalse() {
         propertyRestrictions.clear();
Index: oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexTest.java
===================================================================
--- oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexTest.java	(revision 1532269)
+++ oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/property/PropertyIndexTest.java	(working copy)
@@ -240,7 +240,7 @@
         NodeState types = system.getChildNode(JCR_NODE_TYPES);
         NodeState type = types.getChildNode(nodeTypeName);
         SelectorImpl selector = new SelectorImpl(type, nodeTypeName);
-        return new FilterImpl(selector, "SELECT * FROM [" + nodeTypeName + "]", null);
+        return new FilterImpl(selector, "SELECT * FROM [" + nodeTypeName + "]");
     }
 
     /**
