refactoring
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
index 46c39f9..3f9ce89 100644
--- a/src/main/java/de/ids_mannheim/korap/resource/rewrite/CollectionCleanupFilter.java
+++ b/src/main/java/de/ids_mannheim/korap/resource/rewrite/CollectionCleanupFilter.java
@@ -19,7 +19,7 @@
     @Override
     public JsonNode preProcess (KoralNode node, KustvaktConfiguration config,
             User user) {
-        return process(node.rawNode());
+        return node.rawNode();
     }
 
 
@@ -59,7 +59,7 @@
 
     @Override
     public JsonNode postProcess (KoralNode node) {
-        return null;
+        return process(node.rawNode());
     }
 
 
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 13e6196..05b6168 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
@@ -2,8 +2,6 @@
 
 import com.fasterxml.jackson.databind.JsonNode;
 import de.ids_mannheim.korap.config.Attributes;
-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.exceptions.KustvaktException;
 import de.ids_mannheim.korap.resources.Corpus;
@@ -15,16 +13,18 @@
  * @author hanl
  * @date 03/07/2015
  */
-public class CollectionConstraint implements RewriteTask.IterableRewriteAt {
+public class CollectionConstraint implements RewriteTask.IterableRewritePath {
+
+
+
 
     @Override
     public JsonNode preProcess (KoralNode node, KustvaktConfiguration config,
             User user) {
         if (node.get("@type").equals("koral:doc")) {
-            if (node.get("key").equals(Attributes.CORPUS_SIGLE) && !check(node, user)) {
+            if (node.get("key").equals(Attributes.CORPUS_SIGLE)
+                    && !check(node, user))
                 node.removeNode();
-                // todo: add message that node was removed!
-            }
         }
         return node.rawNode();
     }
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 fb4ba86..796592a 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
@@ -18,7 +18,7 @@
  * @date 12/11/2015
  */
 //todo : test
-public class DocMatchRewrite implements RewriteTask.IterableRewriteAt,
+public class DocMatchRewrite implements RewriteTask.IterableRewritePath,
         BeanInjectable {
 
     private DocumentDao docDao;
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 19d4145..486ae25 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
@@ -8,7 +8,6 @@
 import de.ids_mannheim.korap.exceptions.KustvaktException;
 import de.ids_mannheim.korap.interfaces.db.UserDataDbIface;
 import de.ids_mannheim.korap.resource.LayerMapper;
-import de.ids_mannheim.korap.resources.Foundry;
 import de.ids_mannheim.korap.user.User;
 import de.ids_mannheim.korap.user.UserSettings;
 import edu.emory.mathcs.backport.java.util.Collections;
@@ -19,7 +18,7 @@
  * @author hanl
  * @date 30/06/2015
  */
-public class FoundryInject implements RewriteTask.IterableRewriteAt,
+public class FoundryInject implements RewriteTask.IterableRewritePath,
         BeanInjectable {
 
     private Collection userdaos;
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 16debc8..8df544e 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
@@ -5,10 +5,7 @@
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import de.ids_mannheim.korap.utils.JsonUtils;
 
-import java.util.LinkedHashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 /**
  * @author hanl
@@ -16,13 +13,13 @@
  */
 public abstract class KoralNode {
     private JsonNode node;
-    private KoralRewriteBuilder builder;
+    private KoralRewriteBuilder rewrites;
     private boolean remove;
 
 
     private KoralNode (JsonNode node) {
         this.node = node;
-        this.builder = new KoralRewriteBuilder();
+        this.rewrites = new KoralRewriteBuilder();
         this.remove = false;
     }
 
@@ -32,6 +29,12 @@
     }
 
 
+    public void buildRewrites() {
+        System.out.println("LIST REWRITES "+ this.rewrites.rewrites);
+        this.rewrites.build(this.node);
+
+    }
+
     @Override
     public String toString () {
         return this.node.toString();
@@ -39,7 +42,6 @@
 
 
     public void put (String name, Object value) {
-
         if (this.node.isObject() && this.node.path(name).isMissingNode()) {
             ObjectNode node = (ObjectNode) this.node;
             if (value instanceof String)
@@ -48,8 +50,7 @@
                 node.put(name, (Integer) value);
             else if (value instanceof JsonNode)
                 node.put(name, (JsonNode) value);
-            builder.setOperation("injection");
-            builder.build(this.node);
+            this.rewrites.add("injection", name);
         }
         else
             throw new UnsupportedOperationException(
@@ -70,8 +71,7 @@
             set = true;
         }
         if (set) {
-            builder.setOperation("deletion");
-            builder.build(this.node);
+            this.rewrites.add("deletion", identifier);
         }
     }
 
@@ -85,12 +85,11 @@
                 n.put(name, (Integer) value);
             else if (value instanceof JsonNode)
                 n.put(name, (JsonNode) value);
-            builder.setOperation("override");
-            builder.build(this.node);
+            this.rewrites.add("override", name);
         }
     }
 
-    public void set (String name, Object value) {
+    public void set (String name, Object value, String attrIdent) {
         if (this.node.isObject()) {
             ObjectNode n = (ObjectNode) this.node;
             if (value instanceof String)
@@ -99,12 +98,10 @@
                 n.put(name, (Integer) value);
             else if (value instanceof JsonNode)
                 n.put(name, (JsonNode) value);
-            builder.setOperation("insertion");
-            builder.build(this.node);
+            this.rewrites.add("insertion", attrIdent);
         }
     }
 
-
     public String get (String name) {
         if (this.node.isObject())
             return this.node.path(name).asText();
@@ -113,7 +110,8 @@
 
 
     public KoralNode at (String name) {
-        return KoralNode.wrapNode(this.node.at(name));
+        this.node = this.node.at(name);
+        return this;
     }
 
 
@@ -132,6 +130,7 @@
 
 
     public void removeNode () {
+        this.rewrites.add("deletion", this.node);
         this.remove = true;
     }
 
@@ -141,20 +140,61 @@
     }
 
 
-    //todo: 21.10.15 -- redo with better return policies!
     public static class KoralRewriteBuilder {
 
+       private List<KoralRewrite> rewrites;
+
+        public KoralRewriteBuilder() {
+            this.rewrites = new ArrayList<>();
+        }
+
+
+        public KoralRewriteBuilder add(String op, Object scope) {
+            KoralRewrite rewrite = new KoralRewrite();
+            rewrite.setOperation(op);
+            rewrite.setScope(scope.toString());
+            this.rewrites.add(rewrite);
+            return this;
+        }
+
+
+        public JsonNode build (JsonNode node) {
+            for (KoralRewrite rewrite : this.rewrites) {
+                if (rewrite.map.get("operation") == null)
+                    throw new UnsupportedOperationException(
+                            "operation not set properly");
+
+                if (node.has("rewrites")) {
+                    ArrayNode n = (ArrayNode) node.path("rewrites");
+                    n.add(JsonUtils.valueToTree(rewrite.map));
+                } else {
+                    ObjectNode n = (ObjectNode) node;
+                    List l = new LinkedList<>();
+                    l.add(JsonUtils.valueToTree(rewrite.map));
+                    n.put("rewrites", JsonUtils.valueToTree(l));
+                }
+            }
+            this.rewrites.clear();
+            return node;
+        }
+
+    }
+
+
+
+
+    private static class KoralRewrite {
+
         private Map<String, String> map;
 
-
-        public KoralRewriteBuilder () {
+        private KoralRewrite () {
             this.map = new LinkedHashMap<>();
             this.map.put("@type", "koral:rewrite");
             this.map.put("src", "Kustvakt");
         }
 
 
-        public KoralRewriteBuilder setOperation (String op) {
+        public KoralRewrite setOperation (String op) {
             if (!op.startsWith("operation:"))
                 op = "operation:" + op;
             this.map.put("operation", op);
@@ -162,29 +202,10 @@
         }
 
 
-        public KoralRewriteBuilder setScope (String scope) {
+        public KoralRewrite setScope (String scope) {
             this.map.put("scope", scope);
             return this;
         }
 
-
-        public JsonNode build (JsonNode node) {
-            if (this.map.get("operation") == null)
-                throw new UnsupportedOperationException(
-                        "operation not set properly");
-
-            if (node.has("rewrites")) {
-                ArrayNode n = (ArrayNode) node.path("rewrites");
-                n.add(JsonUtils.valueToTree(this.map));
-            }
-            else {
-                ObjectNode n = (ObjectNode) node;
-                List l = new LinkedList<>();
-                l.add(JsonUtils.valueToTree(this.map));
-                n.put("rewrites", JsonUtils.valueToTree(l));
-            }
-            return node;
-        }
-
     }
 }
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 a8efce3..114c35a 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,8 +11,10 @@
 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.Set;
 
 /**
@@ -43,7 +45,7 @@
                 ArrayList<KustvaktResource> list = new ArrayList(resources);
 
                 if (list.isEmpty())
-                    throw new KustvaktException(StatusCodes.REQUEST_INVALID,
+                    throw new KustvaktException(StatusCodes.PERMISSION_DENIED,
                             "No resources found for user", user.getUsername());
 
                 for (int i = 0; i < list.size(); i++) {
@@ -52,7 +54,8 @@
                     b.with(Attributes.CORPUS_SIGLE+"=" + list.get(i).getPersistentID());
                 }
                 JsonNode rewritten = JsonUtils.readTree(b.toJSON());
-                node.set("collection", rewritten.at("/collection"));
+                node.set("collection", rewritten.at("/collection"), Attributes.CORPUS_SIGLE);
+                node.at("/collection");
             }
             catch (KustvaktException e) {
                 e.printStackTrace();
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 746c3a0..fb98864 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
@@ -7,7 +7,6 @@
 import de.ids_mannheim.korap.exceptions.KustvaktException;
 import de.ids_mannheim.korap.user.User;
 import de.ids_mannheim.korap.utils.JsonUtils;
-import org.apache.xpath.SourceTree;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -24,7 +23,7 @@
 public class RewriteHandler implements BeanInjectable {
 
     private static Logger jlog = LoggerFactory.getLogger(RewriteHandler.class);
-    private Collection<RewriteTask.IterableRewriteAt> node_processors;
+    private Collection<RewriteTask.IterableRewritePath> node_processors;
     private Collection<RewriteTask.RewriteKoralToken> token_node_processors;
     private Collection<RewriteTask> query_processors;
 
@@ -66,9 +65,9 @@
         if (rewriter instanceof RewriteTask.RewriteKoralToken)
             return this.token_node_processors
                     .add((RewriteTask.RewriteKoralToken) rewriter);
-        else if (rewriter instanceof RewriteTask.IterableRewriteAt)
+        else if (rewriter instanceof RewriteTask.IterableRewritePath)
             return this.node_processors
-                    .add((RewriteTask.IterableRewriteAt) rewriter);
+                    .add((RewriteTask.IterableRewritePath) rewriter);
         else if (rewriter instanceof RewriteTask.RewriteBefore
                 | rewriter instanceof RewriteTask.RewriteAfter)
             return this.query_processors.add(rewriter);
@@ -122,25 +121,25 @@
     }
 
 
-    private boolean process (String name, JsonNode root, User user, boolean post) {
+    private boolean processNode (String name, JsonNode root, User user, boolean post) {
         if (root.isObject()) {
             if (root.has("operands")) {
                 JsonNode ops = root.at("/operands");
                 Iterator<JsonNode> it = ops.elements();
                 while (it.hasNext()) {
                     JsonNode next = it.next();
-                    if (process(name, next, user, post))
+                    if (processNode(name, next, user, post))
                         it.remove();
                 }
             }
             else if (root.path("@type").asText().equals("koral:token")) {
                 // todo: koral:token nodes cannot be flagged for deletion --> creates the possibility for empty koral:token nodes
-                processNode(name, KoralNode.wrapNode(root), user,
+                rewrite(name, KoralNode.wrapNode(root), user,
                         this.token_node_processors, post);
-                return process(name, root.path("wrap"), user, post);
+                return processNode(name, root.path("wrap"), user, post);
             }
             else {
-                return processNode(name, KoralNode.wrapNode(root), user,
+                return rewrite(name, KoralNode.wrapNode(root), user,
                         this.node_processors, post);
             }
         }
@@ -148,7 +147,7 @@
             Iterator<JsonNode> it = root.elements();
             while (it.hasNext()) {
                 JsonNode next = it.next();
-                if (process(name, next, user, post))
+                if (processNode(name, next, user, post))
                     it.remove();
             }
         }
@@ -156,13 +155,13 @@
     }
 
 
-    private JsonNode process (JsonNode root, User user, boolean post) {
+    private JsonNode iterate (JsonNode root, User user, boolean post) {
         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();
-                process(next.getKey(), next.getValue(), user, post);
+                processNode(next.getKey(), next.getValue(), user, post);
             }
             processFixedNode(root, user, this.query_processors, post);
         }
@@ -170,24 +169,14 @@
     }
 
 
-    public JsonNode preProcess (JsonNode root, User user) {
-        return process(root, user, false);
+    public JsonNode process(JsonNode root, User user) {
+        JsonNode pre = iterate(root, user, false);
+        return iterate(pre, user, true);
     }
 
 
-    // fixme: redo with first, second iteration and push clean up filters into second run
-    public String preProcess (String json, User user) {
-        return JsonUtils.toJSON(preProcess(JsonUtils.readTree(json), user));
-    }
-
-
-    public JsonNode postProcess (JsonNode root, User user) {
-        return process(root, user, true);
-    }
-
-
-    public String postProcess (String json, User user) {
-        return JsonUtils.toJSON(postProcess(JsonUtils.readTree(json), user));
+    public String process(String json, User user) {
+        return JsonUtils.toJSON(process(JsonUtils.readTree(json), user));
     }
 
 
@@ -198,8 +187,7 @@
      * @return boolean true if node is to be removed from parent! Only
      *         applies if parent is an array node
      */
-    // todo: integrate notifications into system!
-    private boolean processNode (String rootNode, KoralNode node, User user,
+    private boolean rewrite (String rootNode, KoralNode node, User user,
             Collection<? extends RewriteTask> tasks, boolean post) {
         if (this.config == null)
             throw new RuntimeException("KustvaktConfiguration must be set!");
@@ -211,8 +199,8 @@
             if (this.beans != null && task instanceof BeanInjectable)
                 ((BeanInjectable) task).insertBeans(this.beans);
 
-            if (task instanceof RewriteTask.IterableRewriteAt) {
-                RewriteTask.IterableRewriteAt rw = (RewriteTask.IterableRewriteAt) task;
+            if (task instanceof RewriteTask.IterableRewritePath) {
+                RewriteTask.IterableRewritePath rw = (RewriteTask.IterableRewritePath) task;
                 if (rw.path() != null && !rw.path().equals(rootNode)) {
                     jlog.debug("skipping node: " + node);
                     continue;
@@ -226,6 +214,7 @@
                 else if (task instanceof RewriteTask.RewriteAfter) {
                     ((RewriteTask.RewriteAfter) task).postProcess(node);
                 }
+                node.buildRewrites();
             }
             catch (KustvaktException e) {
                 jlog.error("Error in rewrite processor {} for node {}", task
@@ -242,20 +231,20 @@
     private void processFixedNode (JsonNode node, User user,
             Collection<RewriteTask> tasks, boolean post) {
         for (RewriteTask task : tasks) {
-            JsonNode next = node;
+            KoralNode next = KoralNode.wrapNode(node);
             if (task instanceof RewriteTask.RewriteNodeAt) {
                 RewriteTask.RewriteNodeAt rwa = (RewriteTask.RewriteNodeAt) task;
                 if ((rwa.at() != null && !node.at(rwa.at()).isMissingNode()))
-                    next = node.at(rwa.at());
+                    next = next.at(rwa.at());
             }
 
             try {
                 if (!post & task instanceof RewriteTask.RewriteBefore)
-                    ((RewriteTask.RewriteBefore) task).preProcess(
-                            KoralNode.wrapNode(next), this.config, user);
+                    ((RewriteTask.RewriteBefore) task).preProcess(next,
+                            this.config, user);
                 else if (task instanceof RewriteTask.RewriteAfter)
-                    ((RewriteTask.RewriteAfter) task).postProcess(KoralNode
-                            .wrapNode(next));
+                    ((RewriteTask.RewriteAfter) task).postProcess(next);
+                next.buildRewrites();
             }
             catch (KustvaktException e) {
                 jlog.error("Error in rewrite processor {} for node {}", task
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 2c7fa06..fcc43aa 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
@@ -38,7 +38,7 @@
      * {@link de.ids_mannheim.korap.resource.rewrite.RewriteTask.RewriteAfter}
      * queries will run
      * after
-     * {@link de.ids_mannheim.korap.resource.rewrite.RewriteTask.IterableRewriteAt}
+     * {@link IterableRewritePath}
      * have been processed
      */
     interface RewriteAfter extends RewriteTask {
@@ -61,7 +61,7 @@
      * iteration
      * (both object and array node iteration supported)
      */
-    interface IterableRewriteAt extends RewriteBefore, RewriteAfter {
+    interface IterableRewritePath extends RewriteBefore, RewriteAfter {
         String path ();
     }