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 4744e07..a559415 100644
--- a/src/main/java/de/ids_mannheim/korap/utils/KoralCollectionQueryBuilder.java
+++ b/src/main/java/de/ids_mannheim/korap/utils/KoralCollectionQueryBuilder.java
@@ -6,6 +6,7 @@
 import de.ids_mannheim.korap.query.serialize.CollectionQueryProcessor;
 import edu.emory.mathcs.backport.java.util.Arrays;
 
+import java.io.IOError;
 import java.util.Map;
 
 /**
@@ -48,9 +49,14 @@
      * @param value
      * @return
      */
-    public KoralCollectionQueryBuilder fieldValue (String field, String op,
+    public KoralCollectionQueryBuilder with (String field, String op,
             String value) {
-        this.builder.append(field + op + value);
+        //String end = this.builder.substring(this.builder.length() - 4,
+        //        this.builder.length() - 1);
+        //if (this.builder.length() != 0
+        //        && (!end.contains("&") | !end.contains("|")))
+        //    throw new RuntimeException("no join operator given!");
+        this.with(field + op + value);
         return this;
     }
 
@@ -92,10 +98,7 @@
     }
 
 
-    public Object rebaseCollection (JsonNode node) {
-        if (node != null)
-            return mergeWith(node);
-
+    public Object rebaseCollection () {
         if (this.builder.length() == 0 && this.base == null)
             return null;
 
@@ -110,15 +113,8 @@
         if (this.base != null) {
             // check that collection non empty
             JsonNode tmp = this.base.deepCopy();
-            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);
-                ((ObjectNode) request).put("collection", result);
-            }
+            if (request != null)
+                request = mergeWith(request);
             else
                 request = tmp;
         }
@@ -171,12 +167,7 @@
 
 
     public String toJSON () {
-        return JsonUtils.toJSON(rebaseCollection(null));
-    }
-
-
-    public String mergeToJSON (JsonNode node) {
-        return JsonUtils.toJSON(rebaseCollection(node));
+        return JsonUtils.toJSON(rebaseCollection());
     }
 
 
@@ -200,6 +191,8 @@
 
 
         public static ObjectNode buildDocGroup (String op, JsonNode ... groups) {
+            System.out.println("GROUPS " + Arrays.asList(groups));
+
             ObjectNode node = JsonUtils.createObjectNode();
             node.put("@type", "koral:docGroup");
             node.put("operation", "operation:" + op);
diff --git a/src/main/java/de/ids_mannheim/korap/web/service/CollectionLoader.java b/src/main/java/de/ids_mannheim/korap/web/service/CollectionLoader.java
index ecb1133..084a686 100644
--- a/src/main/java/de/ids_mannheim/korap/web/service/CollectionLoader.java
+++ b/src/main/java/de/ids_mannheim/korap/web/service/CollectionLoader.java
@@ -39,7 +39,7 @@
         c1.setDescription("Goethe-Werke in Weimar (seit 1775)");
 
         bui = new KoralCollectionQueryBuilder();
-        bui.with("textType = Aphorismus");
+        bui.with("textType=Aphorismus");
 
         VirtualCollection c2 = new VirtualCollection();
         c2.setName("Aphorismen");
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 0c54bd8..dd29b09 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,8 +312,6 @@
         meta.addEntry("cutOff", cutoff);
 
         ss.setMeta(meta.raw());
-        //fixme: parsing should be done only in search functions!
-        //String query = this.processor.processQuery(ss.toJSON(), user);
         return Response.ok(ss.toJSON()).build();
     }
 
@@ -367,6 +365,7 @@
         KoralCollectionQueryBuilder cquery = new KoralCollectionQueryBuilder();
         cquery.setBaseQuery(ss.toJSON());
 
+
         String query = "";
         KustvaktResource resource;
         try {
@@ -387,10 +386,11 @@
 
         if (resource != null) {
             if (resource instanceof VirtualCollection)
-                query = cquery.and().mergeToJSON(resource.getData());
+                query = JsonUtils.toJSON(cquery.and().mergeWith(
+                        resource.getData()));
             else if (resource instanceof Corpus) {
-                cquery.and().with(
-                        Attributes.CORPUS_SIGLE + resource.getPersistentID());
+                cquery.and().with(Attributes.CORPUS_SIGLE, "=",
+                        resource.getPersistentID());
                 query = cquery.toJSON();
             }
         }
@@ -464,7 +464,6 @@
         serializer.setMeta(meta.raw());
 
         String query = this.processor.processQuery(serializer.toJSON(), user);
-        //String query = serializer.toJSON();
 
         jlog.info("the serialized query {}", query);
 
@@ -484,7 +483,7 @@
             }
         }
         else
-            result = searchKrill.search(serializer.toJSON());
+            result = searchKrill.search(query);
         KustvaktLogger.QUERY_LOGGER.trace("The result set: {}", result);
         return Response.ok(result).build();
     }
@@ -503,7 +502,7 @@
      * @param locale
      * @return
      */
-    //fixme: does not use policyrewrite!
+    // todo: remove raw
     @GET
     @Path("/{type}/{id}/search")
     public Response searchbyName (@Context SecurityContext securityContext,
@@ -533,7 +532,6 @@
                 QuerySerializer s = new QuerySerializer();
                 s.setQuery(query, ql, v);
 
-                // fixme: be replaced by public collection rewrite
                 KoralCollectionQueryBuilder builder = new KoralCollectionQueryBuilder();
 
                 KustvaktResource resource;
@@ -565,10 +563,6 @@
                 s.setMeta(meta.raw());
 
                 query = s.toJSON();
-                //                PolicyParser parser = new PolicyParser(user);
-                //                query = parser.parse(s.toJSON());
-                //todo: 1
-
             }
             String result;
             try {
