diff --git a/src/main/java/de/ids_mannheim/korap/config/Attributes.java b/src/main/java/de/ids_mannheim/korap/config/Attributes.java
index 6e2c227..77fa6e1 100644
--- a/src/main/java/de/ids_mannheim/korap/config/Attributes.java
+++ b/src/main/java/de/ids_mannheim/korap/config/Attributes.java
@@ -87,8 +87,8 @@
     public static final String DESCRIPTION = "description";
 
     public static final String CORPUS_SIGLE = "corpusSigle";
-
     public static final String DOC_SIGLE = "docSigle";
+    public static final String TEXT_SIGLE = "textSigle";
 
     public static final String REF_CORPUS = "refCorpus";
     public static final String QUERY = "query";
diff --git a/src/main/java/de/ids_mannheim/korap/resource/rewrite/CollectionCleanupFilter.java b/src/main/java/de/ids_mannheim/korap/resource/rewrite/CollectionCleanupFilter.java
deleted file mode 100644
index 3985bd0..0000000
--- a/src/main/java/de/ids_mannheim/korap/resource/rewrite/CollectionCleanupFilter.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package de.ids_mannheim.korap.resource.rewrite;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import de.ids_mannheim.korap.config.BeanInjectable;
-import de.ids_mannheim.korap.config.ContextHolder;
-import de.ids_mannheim.korap.config.KustvaktConfiguration;
-import de.ids_mannheim.korap.user.User;
-import de.ids_mannheim.korap.utils.JsonUtils;
-import edu.emory.mathcs.backport.java.util.Arrays;
-
-import java.util.Iterator;
-
-/**
- * @author hanl
- * @date 28/07/2015
- */
-public class CollectionCleanupFilter implements RewriteTask.RewriteNodeAt {
-
-    @Override
-    public JsonNode preProcess (KoralNode node, KustvaktConfiguration config,
-            User user) {
-        return process(node.rawNode());
-    }
-
-
-    private JsonNode process (JsonNode root) {
-        JsonNode sub = root;
-        if (root.isObject()) {
-            if (root.has("operands")) {
-                JsonNode node = root.at("/operands");
-                Iterator<JsonNode> it = node.elements();
-                while (it.hasNext()) {
-                    JsonNode n = it.next();
-                    JsonNode s = process(n);
-                    if (s == null)
-                        it.remove();
-                }
-
-                int count = node.size();
-                // remove group element and replace with single doc
-                if (count == 1)
-                    sub = node.path(0);
-                // indicate empty group
-                else if (count == 0) // can't do anything here -- fixme: edge case?!
-                    return null;
-            }
-
-            // what happens to array nodes?
-            if (!root.equals(sub)) {
-                if (sub.isObject()) {
-                    ObjectNode ob = (ObjectNode) root;
-                    ob.remove(Arrays.asList(new String[]{"@type", "operation", "operands"}));
-                    ob.putAll((ObjectNode) sub);
-                    //if (!rewrites.isMissingNode())
-                    //    ob.put("rewrites", rewrites);
-                }
-            }
-        }
-        return root;
-    }
-
-    @Override
-    public JsonNode postProcess (KoralNode node) {
-        return null;
-    }
-
-
-    @Override
-    public String at () {
-        return "/collection";
-    }
-}
diff --git a/src/main/java/de/ids_mannheim/korap/resource/rewrite/CollectionConstraint.java b/src/main/java/de/ids_mannheim/korap/resource/rewrite/CollectionConstraint.java
index f725c9a..f005413 100644
--- a/src/main/java/de/ids_mannheim/korap/resource/rewrite/CollectionConstraint.java
+++ b/src/main/java/de/ids_mannheim/korap/resource/rewrite/CollectionConstraint.java
@@ -17,30 +17,32 @@
 
 
 
-
     @Override
-    public JsonNode preProcess (KoralNode node, KustvaktConfiguration config,
+    public JsonNode rewriteQuery (KoralNode node, KustvaktConfiguration config,
             User user) {
         if (node.get("@type").equals("koral:doc")) {
-            if (node.get("key").equals(Attributes.CORPUS_SIGLE)
-                    && !check(node, user))
-                node.removeNode(Attributes.CORPUS_SIGLE);
+            if (node.get("key").equals(Attributes.CORPUS_SIGLE)) {
+                String id = node.get("value");
+                KustvaktResource corpus = check(id, user);
+                if (corpus == null)
+                    node.removeNode(new KoralNode.RewriteIdentifier(
+                            Attributes.CORPUS_SIGLE, id));
+            }
         }
         return node.rawNode();
     }
 
 
     /**
-     * @param node
+     * @param id
      * @param user
      * @return boolean if true access granted
      */
-    private boolean check (KoralNode node, User user) {
+    private KustvaktResource check (String id, User user) {
         // todo: can be used to circumvent access control if public filter not applied
         if (user == null)
-            return true;
+            return null;
 
-        String id = node.get("value");
         KustvaktResource corpus;
         try {
             SecurityManager m = SecurityManager
@@ -48,14 +50,14 @@
             corpus = m.getResource();
         }
         catch (RuntimeException | KustvaktException e) {
-            return false;
+            return null;
         }
-        return corpus != null;
+        return corpus;
     }
 
 
     @Override
-    public JsonNode postProcess (KoralNode node) {
+    public JsonNode rewriteResult (KoralNode node) {
         return null;
     }
 
diff --git a/src/main/java/de/ids_mannheim/korap/resource/rewrite/DocMatchRewrite.java b/src/main/java/de/ids_mannheim/korap/resource/rewrite/DocMatchRewrite.java
index b3f99f5..fc47c8b 100644
--- a/src/main/java/de/ids_mannheim/korap/resource/rewrite/DocMatchRewrite.java
+++ b/src/main/java/de/ids_mannheim/korap/resource/rewrite/DocMatchRewrite.java
@@ -36,24 +36,25 @@
 
 
     @Override
-    public JsonNode postProcess (KoralNode node) throws KustvaktException {
+    public JsonNode rewriteResult (KoralNode node) throws KustvaktException {
         Document doc = null;
         if (this.docDao == null)
             throw new RuntimeException("Document dao must be set!");
 
-        if (node.has(Attributes.DOC_SIGLE)) {
-            String docID = node.get(Attributes.DOC_SIGLE);
-            Element e = this.cache.get(docID);
+        if (node.has(Attributes.TEXT_SIGLE)) {
+            String textSigle = node.get(Attributes.TEXT_SIGLE);
+            Element e = this.cache.get(textSigle);
             if (e == null) {
-                doc = docDao.findbyId(docID, null);
+                doc = docDao.findbyId(textSigle, null);
                 if (doc != null)
-                    this.cache.put(new Element(docID, doc));
+                    this.cache.put(new Element(textSigle, doc));
             }
             else
                 doc = (Document) e.getObjectValue();
 
             if (doc != null && doc.isDisabled())
-                node.removeNode(Attributes.DOC_SIGLE);
+                node.removeNode(new KoralNode.RewriteIdentifier(
+                        Attributes.TEXT_SIGLE, doc.getPersistentID()));
         }
         return node.rawNode();
     }
@@ -66,7 +67,7 @@
 
 
     @Override
-    public JsonNode preProcess (KoralNode node, KustvaktConfiguration config,
+    public JsonNode rewriteQuery (KoralNode node, KustvaktConfiguration config,
             User user) {
         return null;
     }
diff --git a/src/main/java/de/ids_mannheim/korap/resource/rewrite/FoundryInject.java b/src/main/java/de/ids_mannheim/korap/resource/rewrite/FoundryInject.java
index 486ae25..9c3762b 100644
--- a/src/main/java/de/ids_mannheim/korap/resource/rewrite/FoundryInject.java
+++ b/src/main/java/de/ids_mannheim/korap/resource/rewrite/FoundryInject.java
@@ -30,7 +30,7 @@
 
 
     @Override
-    public JsonNode preProcess (KoralNode node, KustvaktConfiguration config,
+    public JsonNode rewriteQuery (KoralNode node, KustvaktConfiguration config,
             User user) throws KustvaktException {
         LayerMapper mapper;
 
@@ -62,7 +62,7 @@
 
 
     @Override
-    public JsonNode postProcess (KoralNode node) {
+    public JsonNode rewriteResult (KoralNode node) {
         return null;
     }
 
diff --git a/src/main/java/de/ids_mannheim/korap/resource/rewrite/IdWriter.java b/src/main/java/de/ids_mannheim/korap/resource/rewrite/IdWriter.java
index f0b1200..e35fd17 100644
--- a/src/main/java/de/ids_mannheim/korap/resource/rewrite/IdWriter.java
+++ b/src/main/java/de/ids_mannheim/korap/resource/rewrite/IdWriter.java
@@ -14,13 +14,14 @@
 
     private int counter;
 
+
     public IdWriter () {
         this.counter = 0;
     }
 
 
     @Override
-    public JsonNode preProcess (KoralNode node, KustvaktConfiguration config,
+    public JsonNode rewriteQuery (KoralNode node, KustvaktConfiguration config,
             User user) {
         if (node.get("@type").equals("koral:token")) {
             String s = extractToken(node.rawNode());
@@ -30,6 +31,7 @@
         return node.rawNode();
     }
 
+
     private String extractToken (JsonNode token) {
         JsonNode wrap = token.path("wrap");
         if (!wrap.isMissingNode())
diff --git a/src/main/java/de/ids_mannheim/korap/resource/rewrite/KoralNode.java b/src/main/java/de/ids_mannheim/korap/resource/rewrite/KoralNode.java
index dbce70e..6de5552 100644
--- a/src/main/java/de/ids_mannheim/korap/resource/rewrite/KoralNode.java
+++ b/src/main/java/de/ids_mannheim/korap/resource/rewrite/KoralNode.java
@@ -29,14 +29,16 @@
     }
 
 
-    public void buildRewrites(JsonNode node) {
+    public void buildRewrites (JsonNode node) {
         this.rewrites.build(node);
     }
 
-    public void buildRewrites() {
+
+    public void buildRewrites () {
         this.rewrites.build(this.node);
     }
 
+
     @Override
     public String toString () {
         return this.node.toString();
@@ -60,7 +62,7 @@
     }
 
 
-    public void remove (Object identifier) {
+    public void remove (Object identifier, RewriteIdentifier ident) {
         boolean set = false;
         if (this.node.isObject() && identifier instanceof String) {
             ObjectNode n = (ObjectNode) this.node;
@@ -72,13 +74,17 @@
             n.remove((Integer) identifier);
             set = true;
         }
+
+        if (ident != null)
+            identifier = ident.toString();
+
         if (set) {
             this.rewrites.add("deletion", identifier);
         }
     }
 
 
-    public void replace (String name, Object value) {
+    public void replace (String name, Object value, RewriteIdentifier ident) {
         if (this.node.isObject() && this.node.has(name)) {
             ObjectNode n = (ObjectNode) this.node;
             if (value instanceof String)
@@ -87,11 +93,16 @@
                 n.put(name, (Integer) value);
             else if (value instanceof JsonNode)
                 n.put(name, (JsonNode) value);
+
+            if (ident != null)
+                name = ident.toString();
+
             this.rewrites.add("override", name);
         }
     }
 
-    public void set (String name, Object value, String attrIdent) {
+
+    public void set (String name, Object value, RewriteIdentifier ident) {
         if (this.node.isObject()) {
             ObjectNode n = (ObjectNode) this.node;
             if (value instanceof String)
@@ -100,10 +111,16 @@
                 n.put(name, (Integer) value);
             else if (value instanceof JsonNode)
                 n.put(name, (JsonNode) value);
-            this.rewrites.add("insertion", attrIdent);
+
+
+            if (ident != null)
+                name = ident.toString();
+
+            this.rewrites.add("insertion", name);
         }
     }
 
+
     public String get (String name) {
         if (this.node.isObject())
             return this.node.path(name).asText();
@@ -131,11 +148,30 @@
     }
 
 
-    public void removeNode (String identifier) {
-        this.rewrites.add("deletion", identifier);
+    public void removeNode (RewriteIdentifier ident) {
+        this.rewrites.add("deletion", ident.toString());
         this.remove = true;
     }
 
+    public static class RewriteIdentifier {
+
+        private String key, value;
+
+
+        public RewriteIdentifier (String key, Object value) {
+            this.key = key;
+            this.value = value.toString();
+        }
+
+
+        @Override
+        public String toString () {
+            return key + "(" + value + ")";
+        }
+
+
+    }
+
 
     public boolean isRemove () {
         return this.remove;
@@ -144,14 +180,15 @@
 
     public static class KoralRewriteBuilder {
 
-       private List<KoralRewrite> rewrites;
+        private List<KoralRewrite> rewrites;
 
-        public KoralRewriteBuilder() {
+
+        public KoralRewriteBuilder () {
             this.rewrites = new ArrayList<>();
         }
 
 
-        public KoralRewriteBuilder add(String op, Object scope) {
+        public KoralRewriteBuilder add (String op, Object scope) {
             KoralRewrite rewrite = new KoralRewrite();
             rewrite.setOperation(op);
             rewrite.setScope(scope.toString());
@@ -169,12 +206,17 @@
                 if (node.has("rewrites")) {
                     ArrayNode n = (ArrayNode) node.path("rewrites");
                     n.add(JsonUtils.valueToTree(rewrite.map));
-                } else {
+                }
+                else if (node.isObject()) {
                     ObjectNode n = (ObjectNode) node;
                     List l = new LinkedList<>();
                     l.add(JsonUtils.valueToTree(rewrite.map));
                     n.put("rewrites", JsonUtils.valueToTree(l));
                 }
+                else {
+                    //fixme: matches in result will land here. rewrites need to be placed under root node - though then there might be unclear where they belong to
+                }
+
             }
             this.rewrites.clear();
             return node;
@@ -184,11 +226,11 @@
 
 
 
-
     private static class KoralRewrite {
 
         private Map<String, String> map;
 
+
         private KoralRewrite () {
             this.map = new LinkedHashMap<>();
             this.map.put("@type", "koral:rewrite");
diff --git a/src/main/java/de/ids_mannheim/korap/resource/rewrite/MetaConstraint.java b/src/main/java/de/ids_mannheim/korap/resource/rewrite/MetaConstraint.java
index 3158af0..522ac45 100644
--- a/src/main/java/de/ids_mannheim/korap/resource/rewrite/MetaConstraint.java
+++ b/src/main/java/de/ids_mannheim/korap/resource/rewrite/MetaConstraint.java
@@ -13,7 +13,7 @@
 
 
     @Override
-    public JsonNode preProcess (KoralNode node, KustvaktConfiguration config,
+    public JsonNode rewriteQuery (KoralNode node, KustvaktConfiguration config,
             User user) {
         // redundant
         if (node.rawNode().has("meta")) {
@@ -26,7 +26,7 @@
 
 
     @Override
-    public JsonNode postProcess (KoralNode node) {
+    public JsonNode rewriteResult (KoralNode node) {
         return null;
     }
 
diff --git a/src/main/java/de/ids_mannheim/korap/resource/rewrite/PublicCollection.java b/src/main/java/de/ids_mannheim/korap/resource/rewrite/PublicCollection.java
index 114c35a..6bd59a5 100644
--- a/src/main/java/de/ids_mannheim/korap/resource/rewrite/PublicCollection.java
+++ b/src/main/java/de/ids_mannheim/korap/resource/rewrite/PublicCollection.java
@@ -11,26 +11,24 @@
 import de.ids_mannheim.korap.user.User;
 import de.ids_mannheim.korap.utils.KoralCollectionQueryBuilder;
 import de.ids_mannheim.korap.utils.JsonUtils;
-import org.w3c.dom.Attr;
 
 import java.util.ArrayList;
-import java.util.Arrays;
+import java.util.HashSet;
 import java.util.Set;
 
 /**
  * @author hanl
  * @date 04/07/2015
  */
-public class PublicCollection implements RewriteTask.RewriteBefore {
+public class PublicCollection implements RewriteTask.RewriteQuery {
 
     public PublicCollection () {
         super();
     }
 
 
-    // todo: where to inject the array node into? --> super group with and relation plus subgroup with ids and or operator
     @Override
-    public JsonNode preProcess (KoralNode node, KustvaktConfiguration config,
+    public JsonNode rewriteQuery (KoralNode node, KustvaktConfiguration config,
             User user) {
         JsonNode subnode = node.rawNode();
 
@@ -48,13 +46,18 @@
                     throw new KustvaktException(StatusCodes.PERMISSION_DENIED,
                             "No resources found for user", user.getUsername());
 
+                Set ids = new HashSet(resources.size());
                 for (int i = 0; i < list.size(); i++) {
                     if (i > 0)
                         b.or();
-                    b.with(Attributes.CORPUS_SIGLE+"=" + list.get(i).getPersistentID());
+                    b.with(Attributes.CORPUS_SIGLE + "="
+                            + list.get(i).getPersistentID());
+                    ids.add(list.get(i).getPersistentID());
                 }
                 JsonNode rewritten = JsonUtils.readTree(b.toJSON());
-                node.set("collection", rewritten.at("/collection"), Attributes.CORPUS_SIGLE);
+                node.set("collection", rewritten.at("/collection"),
+                        new KoralNode.RewriteIdentifier(
+                                Attributes.CORPUS_SIGLE, ids));
                 node.at("/collection");
             }
             catch (KustvaktException e) {
diff --git a/src/main/java/de/ids_mannheim/korap/resource/rewrite/RewriteHandler.java b/src/main/java/de/ids_mannheim/korap/resource/rewrite/RewriteHandler.java
index 8d00d7a..3ede387 100644
--- a/src/main/java/de/ids_mannheim/korap/resource/rewrite/RewriteHandler.java
+++ b/src/main/java/de/ids_mannheim/korap/resource/rewrite/RewriteHandler.java
@@ -52,7 +52,7 @@
         this.add(PublicCollection.class);
         this.add(IdWriter.class);
         this.add(DocMatchRewrite.class);
-        this.add(CollectionCleanupFilter.class);
+        this.add(CollectionCleanRewrite.class);
     }
 
 
@@ -68,8 +68,8 @@
         else if (rewriter instanceof RewriteTask.IterableRewritePath)
             return this.node_processors
                     .add((RewriteTask.IterableRewritePath) rewriter);
-        else if (rewriter instanceof RewriteTask.RewriteBefore
-                | rewriter instanceof RewriteTask.RewriteAfter)
+        else if (rewriter instanceof RewriteTask.RewriteQuery
+                | rewriter instanceof RewriteTask.RewriteResult)
             return this.query_processors.add(rewriter);
 
         this.failed_task_registration.add(rewriter.getClass());
@@ -115,20 +115,31 @@
 
 
 
-
-    public String process(JsonNode root, User user) {
+    public String processQuery (JsonNode root, User user) {
         RewriteProcess process = new RewriteProcess(root, user);
         JsonNode pre = process.start(false);
-        //return iterate(pre, user, true);
         return JsonUtils.toJSON(pre);
     }
 
 
-    public String process(String json, User user) {
-        return process(JsonUtils.readTree(json), user);
+    public String processQuery (String json, User user) {
+        return processQuery(JsonUtils.readTree(json), user);
     }
 
 
+    public String processResult (String json, User user) {
+        return processResult(JsonUtils.readTree(json), user);
+    }
+
+
+    public String processResult (JsonNode node, User user) {
+        RewriteProcess process = new RewriteProcess(node, user);
+        JsonNode pre = process.start(true);
+        return JsonUtils.toJSON(pre);
+    }
+
+
+
     public void clear () {
         this.node_processors.clear();
         this.query_processors.clear();
@@ -149,12 +160,15 @@
         private JsonNode root;
         private User user;
 
-        private RewriteProcess(JsonNode root, User user) {
+
+        private RewriteProcess (JsonNode root, User user) {
             this.root = root;
             this.user = user;
         }
 
-        private KoralNode processNode (String key, JsonNode value, boolean post) {
+
+        private KoralNode processNode (String key, JsonNode value,
+                boolean result) {
             KoralNode kroot = KoralNode.wrapNode(value);
             if (value.isObject()) {
                 if (value.has("operands")) {
@@ -162,7 +176,7 @@
                     Iterator<JsonNode> it = ops.elements();
                     while (it.hasNext()) {
                         JsonNode next = it.next();
-                        KoralNode kn = processNode(key, next, post);
+                        KoralNode kn = processNode(key, next, result);
                         if (kn.isRemove())
                             it.remove();
                     }
@@ -170,19 +184,19 @@
                 else if (value.path("@type").asText().equals("koral:token")) {
                     // todo: koral:token nodes cannot be flagged for deletion --> creates the possibility for empty koral:token nodes
                     rewrite(key, kroot,
-                            RewriteHandler.this.token_node_processors, post);
-                    return processNode(key, value.path("wrap"), post);
+                            RewriteHandler.this.token_node_processors, result);
+                    return processNode(key, value.path("wrap"), result);
                 }
                 else {
                     return rewrite(key, kroot,
-                            RewriteHandler.this.node_processors, post);
+                            RewriteHandler.this.node_processors, result);
                 }
             }
             else if (value.isArray()) {
                 Iterator<JsonNode> it = value.elements();
                 while (it.hasNext()) {
                     JsonNode next = it.next();
-                    KoralNode kn = processNode(key, next, post);
+                    KoralNode kn = processNode(key, next, result);
                     if (kn.isRemove())
                         it.remove();
                 }
@@ -191,27 +205,30 @@
         }
 
 
-        private JsonNode start(boolean post) {
+        private JsonNode start (boolean result) {
             jlog.debug("Running rewrite process on query {}", root);
             if (root != null) {
                 Iterator<Map.Entry<String, JsonNode>> it = root.fields();
                 while (it.hasNext()) {
                     Map.Entry<String, JsonNode> next = it.next();
-                    processNode(next.getKey(), next.getValue(), post);
+                    processNode(next.getKey(), next.getValue(), result);
                 }
-                processFixedNode(root, RewriteHandler.this.query_processors, post);
+                processFixedNode(root, RewriteHandler.this.query_processors,
+                        result);
             }
             return root;
         }
 
+
         /**
          * @param node
          * @param tasks
-         * @return boolean true if node is to be removed from parent! Only
+         * @return boolean true if node is to be removed from parent!
+         *         Only
          *         applies if parent is an array node
          */
         private KoralNode rewrite (String rootNode, KoralNode node,
-                                   Collection<? extends RewriteTask> tasks, boolean post) {
+                Collection<? extends RewriteTask> tasks, boolean result) {
             if (RewriteHandler.this.config == null)
                 throw new RuntimeException("KustvaktConfiguration must be set!");
 
@@ -219,8 +236,10 @@
                 jlog.debug("running processor on node: " + node);
                 jlog.debug("on processor: " + task.getClass().toString());
 
-                if (RewriteHandler.this.beans != null && task instanceof BeanInjectable)
-                    ((BeanInjectable) task).insertBeans(RewriteHandler.this.beans);
+                if (RewriteHandler.this.beans != null
+                        && task instanceof BeanInjectable)
+                    ((BeanInjectable) task)
+                            .insertBeans(RewriteHandler.this.beans);
 
                 if (task instanceof RewriteTask.IterableRewritePath) {
                     RewriteTask.IterableRewritePath rw = (RewriteTask.IterableRewritePath) task;
@@ -230,31 +249,34 @@
                     }
                 }
                 try {
-                    if (!post && task instanceof RewriteTask.RewriteBefore) {
-                        ((RewriteTask.RewriteBefore) task).preProcess(node,
+                    if (!result && task instanceof RewriteTask.RewriteQuery) {
+                        ((RewriteTask.RewriteQuery) task).rewriteQuery(node,
                                 RewriteHandler.this.config, this.user);
                     }
-                    else if (task instanceof RewriteTask.RewriteAfter) {
-                        ((RewriteTask.RewriteAfter) task).postProcess(node);
+                    else if (task instanceof RewriteTask.RewriteResult) {
+                        ((RewriteTask.RewriteResult) task).rewriteResult(node);
                     }
                 }
                 catch (KustvaktException e) {
-                    jlog.error("Error in rewrite processor {} for node {}", task
-                            .getClass().getSimpleName(), node.rawNode().toString());
+                    jlog.error("Error in rewrite processor {} for node {}",
+                            task.getClass().getSimpleName(), node.rawNode()
+                                    .toString());
                     e.printStackTrace();
                 }
                 if (node.isRemove()) {
-                    node.buildRewrites(this.root.at("/"+ rootNode));
+                    node.buildRewrites(this.root.at("/" + rootNode));
                     break;
-                } else
+                }
+                else
                     node.buildRewrites();
             }
             return node;
         }
 
+
         // fixme: merge with processNode!
         private void processFixedNode (JsonNode node,
-                                       Collection<RewriteTask> tasks, boolean post) {
+                Collection<RewriteTask> tasks, boolean post) {
             for (RewriteTask task : tasks) {
                 KoralNode next = KoralNode.wrapNode(node);
                 if (task instanceof RewriteTask.RewriteNodeAt) {
@@ -264,16 +286,16 @@
                 }
 
                 try {
-                    if (!post & task instanceof RewriteTask.RewriteBefore)
-                        ((RewriteTask.RewriteBefore) task).preProcess(next,
+                    if (!post & task instanceof RewriteTask.RewriteQuery)
+                        ((RewriteTask.RewriteQuery) task).rewriteQuery(next,
                                 RewriteHandler.this.config, user);
-                    else if (task instanceof RewriteTask.RewriteAfter)
-                        ((RewriteTask.RewriteAfter) task).postProcess(next);
+                    else if (task instanceof RewriteTask.RewriteResult)
+                        ((RewriteTask.RewriteResult) task).rewriteResult(next);
                     next.buildRewrites();
                 }
                 catch (KustvaktException e) {
-                    jlog.error("Error in rewrite processor {} for node {}", task
-                            .getClass().getSimpleName(), next.toString());
+                    jlog.error("Error in rewrite processor {} for node {}",
+                            task.getClass().getSimpleName(), next.toString());
                     e.printStackTrace();
                 }
             }
diff --git a/src/main/java/de/ids_mannheim/korap/resource/rewrite/RewriteTask.java b/src/main/java/de/ids_mannheim/korap/resource/rewrite/RewriteTask.java
index fcc43aa..9eab6ca 100644
--- a/src/main/java/de/ids_mannheim/korap/resource/rewrite/RewriteTask.java
+++ b/src/main/java/de/ids_mannheim/korap/resource/rewrite/RewriteTask.java
@@ -13,9 +13,10 @@
 
 
     /**
-     * unspecified query rewrite that gets injected the entire root node during preprocessing
+     * unspecified query rewrite that gets injected the entire root
+     * node during preprocessing
      */
-    interface RewriteBefore extends RewriteTask {
+    interface RewriteQuery extends RewriteTask {
         /**
          * @param node
          *            Json node in KoralNode wrapper
@@ -28,21 +29,18 @@
          *            checked properly
          * @return
          */
-        JsonNode preProcess (KoralNode node, KustvaktConfiguration config,
+        JsonNode rewriteQuery (KoralNode node, KustvaktConfiguration config,
                 User user) throws KustvaktException;
 
     }
 
     /**
      * Post processor targeted at result sets for queries
-     * {@link de.ids_mannheim.korap.resource.rewrite.RewriteTask.RewriteAfter}
-     * queries will run
-     * after
-     * {@link IterableRewritePath}
-     * have been processed
+     * {@link RewriteResult} queries will run
+     * after {@link IterableRewritePath} have been processed
      */
-    interface RewriteAfter extends RewriteTask {
-        JsonNode postProcess (KoralNode node) throws KustvaktException;
+    interface RewriteResult extends RewriteTask {
+        JsonNode rewriteResult (KoralNode node) throws KustvaktException;
     }
 
     /**
@@ -52,7 +50,7 @@
      * Deletion via KoralNode not allowed. Supports pre- and
      * post-processing
      */
-    interface RewriteNodeAt extends RewriteBefore, RewriteAfter {
+    interface RewriteNodeAt extends RewriteQuery, RewriteResult {
         String at ();
     }
 
@@ -61,7 +59,7 @@
      * iteration
      * (both object and array node iteration supported)
      */
-    interface IterableRewritePath extends RewriteBefore, RewriteAfter {
+    interface IterableRewritePath extends RewriteQuery, RewriteResult {
         String path ();
     }
 
@@ -72,6 +70,6 @@
      * rewrites {@link RewriteKoralToken} rewrite DOES NOT support the
      * deletion of the respective node
      */
-    interface RewriteKoralToken extends RewriteBefore {}
+    interface RewriteKoralToken extends RewriteQuery {}
 
 }
diff --git a/src/main/java/de/ids_mannheim/korap/resource/rewrite/TreeConstraint.java b/src/main/java/de/ids_mannheim/korap/resource/rewrite/TreeConstraint.java
index e4f134a..5713570 100644
--- a/src/main/java/de/ids_mannheim/korap/resource/rewrite/TreeConstraint.java
+++ b/src/main/java/de/ids_mannheim/korap/resource/rewrite/TreeConstraint.java
@@ -60,7 +60,7 @@
 
 
     @Override
-    public JsonNode preProcess (KoralNode node, KustvaktConfiguration config,
+    public JsonNode rewriteQuery (KoralNode node, KustvaktConfiguration config,
             User user) {
         System.out.println("FIND PATH " + node.rawNode().findParent(pointer));
 
@@ -69,7 +69,7 @@
 
 
     @Override
-    public JsonNode postProcess (KoralNode node) {
+    public JsonNode rewriteResult (KoralNode node) {
         return null;
     }
 
diff --git a/src/main/java/de/ids_mannheim/korap/resources/Document.java b/src/main/java/de/ids_mannheim/korap/resources/Document.java
index 9f86444..c603011 100644
--- a/src/main/java/de/ids_mannheim/korap/resources/Document.java
+++ b/src/main/java/de/ids_mannheim/korap/resources/Document.java
@@ -7,6 +7,7 @@
  * @author hanl
  * @date 05/11/2014
  */
+// todo: distinguish between document and text!
 @Getter
 @Setter
 public class Document extends KustvaktResource {
@@ -37,6 +38,11 @@
     }
 
 
+    public boolean isText () {
+        return this.getPersistentID().contains(".");
+    }
+
+
     @Override
     public String toString () {
         return "Document{" + "id='" + this.getId() + "'" + "persistentid='"
diff --git a/src/main/java/de/ids_mannheim/korap/resources/KustvaktResource.java b/src/main/java/de/ids_mannheim/korap/resources/KustvaktResource.java
index 532e8f3..7bbb43f 100644
--- a/src/main/java/de/ids_mannheim/korap/resources/KustvaktResource.java
+++ b/src/main/java/de/ids_mannheim/korap/resources/KustvaktResource.java
@@ -104,7 +104,8 @@
         return JsonUtils.valueToTree(this.fields);
     }
 
-    public String getStringData() {
+
+    public String getStringData () {
         return JsonUtils.toJSON(this.fields);
     }
 
diff --git a/src/main/java/de/ids_mannheim/korap/resources/ResourceFactory.java b/src/main/java/de/ids_mannheim/korap/resources/ResourceFactory.java
index c6de012..7890b4a 100644
--- a/src/main/java/de/ids_mannheim/korap/resources/ResourceFactory.java
+++ b/src/main/java/de/ids_mannheim/korap/resources/ResourceFactory.java
@@ -64,7 +64,8 @@
 
     public static <T extends KustvaktResource> T createID (T resource) {
         if (resource.getData() != null && !resource.getStringData().isEmpty())
-            resource.setPersistentID(DigestUtils.sha1Hex(resource.getStringData()));
+            resource.setPersistentID(DigestUtils.sha1Hex(resource
+                    .getStringData()));
         return resource;
     }
 
diff --git a/src/main/java/de/ids_mannheim/korap/security/auth/KustvaktAuthenticationManager.java b/src/main/java/de/ids_mannheim/korap/security/auth/KustvaktAuthenticationManager.java
index 00a6e17..5c98f8f 100644
--- a/src/main/java/de/ids_mannheim/korap/security/auth/KustvaktAuthenticationManager.java
+++ b/src/main/java/de/ids_mannheim/korap/security/auth/KustvaktAuthenticationManager.java
@@ -757,7 +757,8 @@
 
             if (data == null)
                 throw new KustvaktException(user.getId(),
-                        StatusCodes.EMPTY_RESULTS, "No data found!", clazz.getSimpleName());
+                        StatusCodes.EMPTY_RESULTS, "No data found!",
+                        clazz.getSimpleName());
             return data;
         }
         catch (KustvaktException e) {
@@ -785,6 +786,7 @@
         }
     }
 
+
     private String cache_key (String input) throws KustvaktException {
         try {
             return crypto.hash(KEY + "@" + input);
diff --git a/src/main/java/de/ids_mannheim/korap/utils/KoralCollectionQueryBuilder.java b/src/main/java/de/ids_mannheim/korap/utils/KoralCollectionQueryBuilder.java
index 4d6b6f1..86ac337 100644
--- a/src/main/java/de/ids_mannheim/korap/utils/KoralCollectionQueryBuilder.java
+++ b/src/main/java/de/ids_mannheim/korap/utils/KoralCollectionQueryBuilder.java
@@ -26,12 +26,12 @@
     private String mergeOperator;
 
 
-    public KoralCollectionQueryBuilder() {
+    public KoralCollectionQueryBuilder () {
         this(false);
     }
 
 
-    public KoralCollectionQueryBuilder(boolean verbose) {
+    public KoralCollectionQueryBuilder (boolean verbose) {
         this.verbose = verbose;
         this.builder = new StringBuilder();
         this.base = null;
@@ -49,7 +49,7 @@
      * @return
      */
     public KoralCollectionQueryBuilder fieldValue (String field, String op,
-                                                   String value) {
+            String value) {
         this.builder.append(field + op + value);
         return this;
     }
@@ -65,7 +65,7 @@
      *            element
      * @return
      */
-    public KoralCollectionQueryBuilder with(String query) {
+    public KoralCollectionQueryBuilder with (String query) {
         if (!query.startsWith("(") && !query.endsWith(")"))
             query = "(" + query + ")";
         this.builder.append(query);
@@ -74,8 +74,6 @@
 
 
 
-
-
     public KoralCollectionQueryBuilder and () {
         if (this.builder.length() != 0)
             this.builder.append(" & ");
@@ -112,17 +110,20 @@
             if (request != null) {
                 JsonNode tobase = request.at("/collection");
                 request = tmp;
-                JsonNode result = JsonBuilder.buildDocGroup(this.mergeOperator != null
-                        ? this.mergeOperator.toLowerCase() : "and",
-                        request.at("/collection"), tobase);
+                JsonNode result = JsonBuilder.buildDocGroup(
+                        this.mergeOperator != null ? this.mergeOperator
+                                .toLowerCase() : "and", request
+                                .at("/collection"), tobase);
                 ((ObjectNode) request).put("collection", result);
-            } else
+            }
+            else
                 request = tmp;
         }
         return request;
     }
 
-    public JsonNode mergeWith(JsonNode node) {
+
+    public JsonNode mergeWith (JsonNode node) {
         if (this.base != null) {
             // check that collection non empty
             if (node != null) {
@@ -150,6 +151,8 @@
         this.base = JsonUtils.readTree(query);
         return this;
     }
+
+
     public KoralCollectionQueryBuilder setBaseQuery (JsonNode query) {
         this.base = query;
         return this;
diff --git a/src/main/java/de/ids_mannheim/korap/web/service/full/ResourceService.java b/src/main/java/de/ids_mannheim/korap/web/service/full/ResourceService.java
index 8ff8f3c..9b04a14 100644
--- a/src/main/java/de/ids_mannheim/korap/web/service/full/ResourceService.java
+++ b/src/main/java/de/ids_mannheim/korap/web/service/full/ResourceService.java
@@ -312,7 +312,7 @@
 
         ss.setMeta(meta);
 
-        String query = this.processor.process(ss.toJSON(), user);
+        String query = this.processor.processQuery(ss.toJSON(), user);
         return Response.ok(query).build();
     }
 
@@ -385,7 +385,8 @@
             if (resource instanceof VirtualCollection)
                 cquery.mergeWith(resource.getData());
             else if (resource instanceof Corpus)
-                cquery.with(Attributes.CORPUS_SIGLE + resource.getPersistentID());
+                cquery.with(Attributes.CORPUS_SIGLE
+                        + resource.getPersistentID());
 
         }
         catch (KustvaktException e) {
@@ -409,7 +410,7 @@
         // todo: should be possible to add the meta part to the query serialization
         try {
             User user = controller.getUser(ctx.getUsername());
-            jsonld = this.processor.process(jsonld, user);
+            jsonld = this.processor.processQuery(jsonld, user);
         }
         catch (KustvaktException e) {
             throw KustvaktResponseHandler.throwit(e);
@@ -468,7 +469,7 @@
         serializer.setMeta(meta.raw());
 
         //fixme: policy rewrite!
-        String query = this.processor.process(serializer.toJSON(), user);
+        String query = this.processor.processQuery(serializer.toJSON(), user);
 
         jlog.info("the serialized query {}", query);
 
@@ -551,7 +552,8 @@
                 if (resource instanceof VirtualCollection)
                     builder.setBaseQuery(resource.getData());
                 else if (resource instanceof Corpus)
-                    builder.with(Attributes.CORPUS_SIGLE+ resource.getPersistentID());
+                    builder.with(Attributes.CORPUS_SIGLE
+                            + resource.getPersistentID());
                 else
                     throw KustvaktResponseHandler.throwit(
                             StatusCodes.ILLEGAL_ARGUMENT,
@@ -577,7 +579,7 @@
             try {
 
                 // rewrite process
-                query = this.processor.process(query, user);
+                query = this.processor.processQuery(query, user);
 
                 if (eng.equals(KustvaktConfiguration.BACKENDS.NEO4J)) {
                     if (raw)
@@ -669,10 +671,10 @@
                 query.setBaseQuery(resource.getData());
             }
             else if (resource instanceof Corpus) {
-                query.with(Attributes.CORPUS_SIGLE+"=" + resource.getName());
+                query.with(Attributes.CORPUS_SIGLE + "=" + resource.getName());
             }
             String res = query.toJSON();
-            String qstr = processor.process(res, user);
+            String qstr = processor.processQuery(res, user);
             return Response.ok(searchKrill.getStatistics(qstr)).build();
         }
         catch (KustvaktException e) {
@@ -705,8 +707,7 @@
         VirtualCollection tmp = resourceHandler.getCache(cache.getId(),
                 VirtualCollection.class);
         if (tmp == null) {
-            String query = this.processor.process(cache.getData(),
-                    user);
+            String query = this.processor.processQuery(cache.getData(), user);
             String stats = searchKrill.getStatistics(query);
             cache.setStats(JsonUtils.readSimple(stats, Map.class));
             resourceHandler.cache(cache);
@@ -787,8 +788,8 @@
             JsonNode base;
             if (reference != null && !reference.equals("null")) {
                 try {
-                    base = resourceHandler.findbyStrId(reference,
-                            user, VirtualCollection.class).getData();
+                    base = resourceHandler.findbyStrId(reference, user,
+                            VirtualCollection.class).getData();
                 }
                 catch (KustvaktException e) {
                     throw KustvaktResponseHandler.throwit(e);
@@ -877,8 +878,8 @@
             KoralCollectionQueryBuilder cquery = new KoralCollectionQueryBuilder();
             if (reference != null && !reference.equals("null")) {
                 try {
-                    cquery.setBaseQuery(resourceHandler.findbyStrId(
-                            reference, user, VirtualCollection.class).getData());
+                    cquery.setBaseQuery(resourceHandler.findbyStrId(reference,
+                            user, VirtualCollection.class).getData());
 
                 }
                 catch (KustvaktException e) {
diff --git a/src/main/java/de/ids_mannheim/korap/web/service/light/LightService.java b/src/main/java/de/ids_mannheim/korap/web/service/light/LightService.java
index d07b912..b55cb45 100644
--- a/src/main/java/de/ids_mannheim/korap/web/service/light/LightService.java
+++ b/src/main/java/de/ids_mannheim/korap/web/service/light/LightService.java
@@ -88,8 +88,7 @@
             @QueryParam("cutoff") Boolean cutoff,
             @QueryParam("count") Integer pageLength,
             @QueryParam("offset") Integer pageIndex,
-            @QueryParam("page") Integer startPage,
-            @QueryParam("cq") String cq) {
+            @QueryParam("page") Integer startPage, @QueryParam("cq") String cq) {
         QuerySerializer ss = new QuerySerializer().setQuery(q, ql, v);
 
         MetaQueryBuilder meta = new MetaQueryBuilder();
@@ -102,14 +101,14 @@
         ss.setMeta(meta);
         if (cq != null)
             ss.setCollection(cq);
-        return Response.ok(processor.process(ss.toJSON(), null)).build();
+        return Response.ok(processor.processQuery(ss.toJSON(), null)).build();
     }
 
 
     @POST
     @Path("search")
     public Response queryRaw (@QueryParam("engine") String engine, String jsonld) {
-        jsonld = processor.process(jsonld, null);
+        jsonld = processor.processQuery(jsonld, null);
         // todo: should be possible to add the meta part to the query serialization
         jlog.info("Serialized search: {}", jsonld);
 
@@ -143,7 +142,7 @@
         if (cq != null)
             serializer.setCollection(cq);
 
-        String query = processor.process(serializer.toJSON(), null);
+        String query = processor.processQuery(serializer.toJSON(), null);
         jlog.info("the serialized query {}", query);
 
         // This may not work with the the KoralQuery
@@ -214,7 +213,7 @@
             //                meta.addEntry("itemsPerResource", 1);
             QuerySerializer s = new QuerySerializer().setQuery(query, ql, v)
                     .setMeta(meta);
-            query = processor.process(s.toJSON(), null);
+            query = processor.processQuery(s.toJSON(), null);
         }
         String result;
         try {
