diff --git a/src/main/java/de/ids_mannheim/korap/KorapCollection.java b/src/main/java/de/ids_mannheim/korap/KorapCollection.java
index 232b5bb..68a9964 100644
--- a/src/main/java/de/ids_mannheim/korap/KorapCollection.java
+++ b/src/main/java/de/ids_mannheim/korap/KorapCollection.java
@@ -42,6 +42,7 @@
  * @author diewald
  */
 /*
+ * TODO: Clean up for new KoralQuery
  * TODO: Make a cache for the bits
  *       Delete it in case of an extension or a filter
  * TODO: Maybe use randomaccessfilterstrategy
@@ -62,8 +63,14 @@
     // This advices the java compiler to ignore all loggings
     public static final boolean DEBUG = false;
 
-    public KorapCollection (KorapIndex ki) {
-        this.index = ki;
+
+    /**
+     * Construct a new KorapCollection by passing a KorapIndex.
+     *
+     * @param index The {@link KorapIndex} object.
+     */
+    public KorapCollection (KorapIndex index) {
+        this.index = index;
         this.filter = new ArrayList<FilterOperation>(5);
     };
 
@@ -147,7 +154,105 @@
      * @throws QueryException
      */
     public void fromJSON (JsonNode json) throws QueryException {
-        this.filter(new CollectionBuilder(json));
+        this.filter(this._fromJSON(json));
+    };
+
+
+    // Create a boolean filter from JSON
+    private BooleanFilter _fromJSON (JsonNode json) throws QueryException {
+        return this._fromJSON(json, "tokens");
+    };
+
+
+    // Create a booleanfilter from JSON
+    private BooleanFilter _fromJSON (JsonNode json, String field) throws QueryException {
+        BooleanFilter bfilter = new BooleanFilter();
+
+        // TODO: THIS UNFORTUNATELY BREAKS TESTS
+        if (!json.has("@type"))
+            throw new QueryException(701, "JSON-LD group has no @type attribute");
+
+        String type = json.get("@type").asText();
+        
+        // Single filter
+        if (type.equals("korap:doc")) {
+
+            String key     = "tokens";
+            String valtype = "type:string";
+            String match   = "match:eq";
+
+            if (json.has("key"))
+                key = json.get("key").asText();
+            
+            if (json.has("type"))
+                valtype = json.get("type").asText();
+
+            // Filter based on date
+            if (valtype.equals("type:date")) {
+
+                if (!json.has("value"))
+                    throw new QueryException(612, "Dates require value fields");
+
+                String dateStr = json.get("value").asText();
+                if (json.has("match"))
+                    match = json.get("match").asText();
+
+                // TODO: This isn't stable yet
+                switch (match) {
+                case "match:eq":
+                    bfilter.date(dateStr);
+                    break;
+                case "match:geq":
+                    bfilter.since(dateStr);
+                    break;
+                case "match:leq":
+                    bfilter.till(dateStr);
+                    break;
+                };
+                // No good reason for gt or lt
+                return bfilter;
+            }
+
+            else if (valtype.equals("type:string")) {
+                if (json.has("match"))
+                    match = json.get("match").asText();
+
+                if (match.equals("match:eq"))
+                    bfilter.and(key, json.get("value").asText());
+
+                return bfilter;
+            };
+        }
+
+        // nested group
+        else if (type.equals("korap:docGroup")) {
+            if (!json.has("operands") || !json.get("operands").isArray())
+                throw new QueryException(612, "Groups need operands");
+
+            String operation = "operation:and";
+            if (json.has("operation"))
+                operation = json.get("operation").asText();
+
+            BooleanFilter group = new BooleanFilter();
+
+            for (JsonNode operand : json.get("operands")) {
+                if (operation.equals("operation:and"))
+                    group.and(this._fromJSON(operand, field));
+
+                else if (operation.equals("operation:or"))
+                    group.or(this._fromJSON(operand, field));
+
+                else
+                    throw new QueryException(613, "Unknown document group operation");
+            };
+            bfilter.and(group);
+            return bfilter;
+        }
+
+        // Unknown type
+        else throw new QueryException(613, "Collection query type has to be doc or docGroup");
+        
+        return new BooleanFilter();
     };
 
 
@@ -178,6 +283,7 @@
      *        as a {@link JsonNode} object.
      * @throws QueryException
      */
+    @Deprecated
     public void fromJSONLegacy (JsonNode json) throws QueryException {
         if (!json.has("@type"))
             throw new QueryException(701, "JSON-LD group has no @type attribute");
@@ -185,27 +291,121 @@
         if (!json.has("@value"))
             throw new QueryException(851, "Legacy filter need @value fields");
 
+        BooleanFilter bf = this._fromJSONLegacy(json.get("@value"), "tokens");
         String type = json.get("@type").asText();
 
-        CollectionBuilder kf = new CollectionBuilder();
-        kf.setBooleanFilter(kf.fromJSONLegacy(json.get("@value"), "tokens"));
-
         // Filter the collection
         if (type.equals("korap:meta-filter")) {
             if (DEBUG)
                 log.trace("Add Filter LEGACY");
-            this.filter(kf);
+            this.filter(bf);
         }
         
         // Extend the collection
         else if (type.equals("korap:meta-extend")) {
             if (DEBUG)
                 log.trace("Add Extend LEGACY");
-            this.extend(kf);
+            this.extend(bf);
         };
     };
 
 
+    // Create a boolean filter from a Json string
+    @Deprecated
+    private BooleanFilter _fromJSONLegacy (JsonNode json, String field)
+        throws QueryException {
+        BooleanFilter bfilter = new BooleanFilter();
+
+        if (!json.has("@type"))
+            throw new QueryException(612, "JSON-LD group has no @type attribute");
+	
+        String type = json.get("@type").asText();
+        
+        if (DEBUG) log.trace("@type: " + type);
+
+        if (json.has("@field"))
+            field = _getFieldLegacy(json);
+
+        if (type.equals("korap:term")) {
+            if (field != null && json.has("@value"))
+                bfilter.and(field, json.get("@value").asText());
+            return bfilter;
+        }
+        else if (type.equals("korap:group")) {
+            if (!json.has("relation"))
+                throw new QueryException(612, "Group needs relation");
+
+            if (!json.has("operands"))
+                throw new QueryException(612, "Group needs operand list");
+
+            String dateStr, till;
+            JsonNode operands = json.get("operands");
+
+            if (!operands.isArray())
+                throw new QueryException(612, "Group needs operand list");
+
+            if (DEBUG)
+                log.trace("relation found {}",  json.get("relation").asText());
+
+            BooleanFilter group = new BooleanFilter();
+	    
+            switch (json.get("relation").asText())  {
+            case "between":
+                dateStr = _getDateLegacy(json, 0);
+                till = _getDateLegacy(json, 1);
+                if (dateStr != null && till != null)
+                    bfilter.between(dateStr, till);
+                break;
+
+            case "until":
+                dateStr = _getDateLegacy(json, 0);
+                if (dateStr != null)
+                    bfilter.till(dateStr);
+                break;
+
+            case "since":
+                dateStr = _getDateLegacy(json, 0);
+                if (dateStr != null)
+                    bfilter.since(dateStr);
+                break;
+
+            case "equals":
+                dateStr = _getDateLegacy(json, 0);
+                if (dateStr != null)
+                    bfilter.date(dateStr);
+                break;
+
+            case "and":
+                if (operands.size() < 1)
+                    throw new QueryException(612, "Operation needs at least two operands");
+
+                for (JsonNode operand : operands) {
+                    group.and(this._fromJSONLegacy(operand, field));
+                };
+                bfilter.and(group);
+                break;
+
+            case "or":
+                if (operands.size() < 1)
+                    throw new QueryException(612, "Operation needs at least two operands");
+
+                for (JsonNode operand : operands) {
+                    group.or(this._fromJSONLegacy(operand, field));
+                };
+                bfilter.and(group);
+                break;
+
+            default:
+                throw new QueryException(613, "Relation is not supported");
+            };
+        }
+        else {
+            throw new QueryException(613, "Filter type is not a supported group");
+        };
+        return bfilter;
+    };
+
+
     /**
      * Set the {@link KorapIndex} the virtual collection refers to.
      *
@@ -519,6 +719,7 @@
     };
 
 
+    // Term relation API is not in use anymore
     @Deprecated
     public HashMap getTermRelation (String field) throws Exception {
         if (this.index == null) {
@@ -531,6 +732,7 @@
     };
 
 
+    // Term relation API is not in use anymore
     @Deprecated
     public String getTermRelationJSON (String field) throws IOException {
         ObjectMapper mapper = new ObjectMapper();
@@ -586,4 +788,39 @@
         sw.append("}");
         return sw.getBuffer().toString();
     };
+
+
+    // Get legacy field
+    @Deprecated
+    private static String  _getFieldLegacy (JsonNode json)  {
+        if (!json.has("@field"))
+            return (String) null;
+
+        String field = json.get("@field").asText();
+        return field.replaceFirst("korap:field#", "");
+    };
+
+
+    // Get legacy date
+    @Deprecated
+    private static String _getDateLegacy (JsonNode json, int index) {
+        if (!json.has("operands"))
+            return (String) null;
+
+        if (!json.get("operands").has(index))
+            return (String) null;
+
+        JsonNode date = json.get("operands").get(index);
+
+        if (!date.has("@type"))
+            return (String) null;
+
+        if (!date.get("@type").asText().equals("korap:date"))
+            return (String) null;
+        
+        if (!date.has("@value"))
+            return (String) null;
+
+        return date.get("@value").asText();
+    };
 };
diff --git a/src/main/java/de/ids_mannheim/korap/collection/CollectionBuilder.java b/src/main/java/de/ids_mannheim/korap/collection/CollectionBuilder.java
index 10a6b65..804f199 100644
--- a/src/main/java/de/ids_mannheim/korap/collection/CollectionBuilder.java
+++ b/src/main/java/de/ids_mannheim/korap/collection/CollectionBuilder.java
@@ -26,9 +26,12 @@
  */
 public class CollectionBuilder {
     private BooleanFilter filter;
+    private String field = "tokens";
 
     // Logger
-    private final static Logger log = LoggerFactory.getLogger(CollectionBuilder.class);
+    private final static Logger log = LoggerFactory.getLogger(
+        CollectionBuilder.class
+    );
 
     // This advices the java compiler to ignore all loggings
     public static final boolean DEBUG = false;
@@ -36,241 +39,6 @@
     public CollectionBuilder () {
         filter = new BooleanFilter();
     };
-
-    public CollectionBuilder (JsonNode json) throws QueryException {
-        filter = this.fromJSON(json, "tokens");
-    };
-
-
-    public BooleanFilter fromJSON (JsonNode json, String field) throws QueryException {
-        BooleanFilter bfilter = new BooleanFilter();
-
-        // TODO: THIS UNFORTUNATELY BREAKS TESTS
-        if (!json.has("@type"))
-            throw new QueryException(701, "JSON-LD group has no @type attribute");
-
-        String type = json.get("@type").asText();
-        
-        // Single filter
-        if (type.equals("korap:doc")) {
-
-            String key     = "tokens";
-            String valtype = "type:string";
-            String match   = "match:eq";
-
-            if (json.has("key"))
-                key = json.get("key").asText();
-            
-            if (json.has("type"))
-                valtype = json.get("type").asText();
-
-            // Filter based on date
-            if (valtype.equals("type:date")) {
-
-                if (!json.has("value"))
-                    throw new QueryException(612, "Dates require value fields");
-
-                String dateStr = json.get("value").asText();
-                if (json.has("match"))
-                    match = json.get("match").asText();
-
-                // TODO: This isn't stable yet
-                switch (match) {
-                case "match:eq":
-                    bfilter.date(dateStr);
-                    break;
-                case "match:geq":
-                    bfilter.since(dateStr);
-                    break;
-                case "match:leq":
-                    bfilter.till(dateStr);
-                    break;
-                };
-                // No good reason for gt or lt
-                return bfilter;
-            }
-
-            else if (valtype.equals("type:string")) {
-                if (json.has("match"))
-                    match = json.get("match").asText();
-
-                if (match.equals("match:eq"))
-                    bfilter.and(key, json.get("value").asText());
-
-                return bfilter;
-            };
-        }
-
-        // nested group
-        else if (type.equals("korap:docGroup")) {
-            if (!json.has("operands") || !json.get("operands").isArray())
-                throw new QueryException(612, "Groups need operands");
-
-            String operation = "operation:and";
-            if (json.has("operation"))
-                operation = json.get("operation").asText();
-
-            BooleanFilter group = new BooleanFilter();
-
-            for (JsonNode operand : json.get("operands")) {
-                if (operation.equals("operation:and"))
-                    group.and(this.fromJSON(operand, field));
-
-                else if (operation.equals("operation:or"))
-                    group.or(this.fromJSON(operand, field));
-
-                else
-                    throw new QueryException(613, "Unknown document group operation");
-            };
-            bfilter.and(group);
-            return bfilter;
-        }
-
-        // Unknown type
-        else throw new QueryException(613, "Collection query type has to be doc or docGroup");
-        
-        return new BooleanFilter();
-    };
-    
-	
-    /*
-      String type = json.get("@type").asText();
-      String field = _getField(json);
-
-      if (type.equals("korap:term")) {
-      this.fromJSON(json, field);
-      }
-      else if (type.equals("korap:group")) {
-	    // TODO: relation
-	    for (JsonNode operand : json.get("operands")) {
-		this.fromJSON(operand, field);
-	    };
-	};
-	*/
-    
-    public BooleanFilter fromJSONLegacy (JsonNode json, String field)
-        throws QueryException {
-        BooleanFilter bfilter = new BooleanFilter();
-
-        if (!json.has("@type"))
-            throw new QueryException(612, "JSON-LD group has no @type attribute");
-	
-        String type = json.get("@type").asText();
-
-        if (DEBUG)
-            log.trace("@type: " + type);
-
-        if (json.has("@field"))
-            field = _getFieldLegacy(json);
-
-        if (type.equals("korap:term")) {
-            if (field != null && json.has("@value"))
-                bfilter.and(field, json.get("@value").asText());
-            return bfilter;
-        }
-        else if (type.equals("korap:group")) {
-            if (!json.has("relation"))
-                throw new QueryException(612, "Group needs relation");
-
-            if (!json.has("operands"))
-                throw new QueryException(612, "Group needs operand list");
-
-            String dateStr, till;
-            JsonNode operands = json.get("operands");
-
-            if (!operands.isArray())
-                throw new QueryException(612, "Group needs operand list");
-
-            if (DEBUG)
-                log.trace("relation found {}",  json.get("relation").asText());
-
-            BooleanFilter group = new BooleanFilter();
-	    
-            switch (json.get("relation").asText())  {
-            case "between":
-                dateStr = _getDateLegacy(json, 0);
-                till = _getDateLegacy(json, 1);
-                if (dateStr != null && till != null)
-                    bfilter.between(dateStr, till);
-                break;
-
-            case "until":
-                dateStr = _getDateLegacy(json, 0);
-                if (dateStr != null)
-                    bfilter.till(dateStr);
-                break;
-
-            case "since":
-                dateStr = _getDateLegacy(json, 0);
-                if (dateStr != null)
-                    bfilter.since(dateStr);
-                break;
-
-            case "equals":
-                dateStr = _getDateLegacy(json, 0);
-                if (dateStr != null)
-                    bfilter.date(dateStr);
-                break;
-
-            case "and":
-                if (operands.size() < 1)
-                    throw new QueryException(612, "Operation needs at least two operands");
-
-                for (JsonNode operand : operands) {
-                    group.and(this.fromJSONLegacy(operand, field));
-                };
-                bfilter.and(group);
-                break;
-
-            case "or":
-                if (operands.size() < 1)
-                    throw new QueryException(612, "Operation needs at least two operands");
-
-                for (JsonNode operand : operands) {
-                    group.or(this.fromJSONLegacy(operand, field));
-                };
-                bfilter.and(group);
-                break;
-
-            default:
-                throw new QueryException(613, "Relation is not supported");
-            };
-        }
-        else {
-            throw new QueryException(613, "Filter type is not a supported group");
-        };
-        return bfilter;
-    };
-
-    private static String  _getFieldLegacy (JsonNode json)  {
-        if (!json.has("@field"))
-            return (String) null;
-
-        String field = json.get("@field").asText();
-        return field.replaceFirst("korap:field#", "");
-    };
-
-    private static String _getDateLegacy (JsonNode json, int index) {
-        if (!json.has("operands"))
-            return (String) null;
-
-        if (!json.get("operands").has(index))
-            return (String) null;
-
-        JsonNode date = json.get("operands").get(index);
-
-        if (!date.has("@type"))
-            return (String) null;
-
-        if (!date.get("@type").asText().equals("korap:date"))
-            return (String) null;
-        
-        if (!date.has("@value"))
-            return (String) null;
-
-        return date.get("@value").asText();
-    };
-
     
     public BooleanFilter and (String type, String ... terms) {
         BooleanFilter bf = new BooleanFilter();
