diff --git a/src/main/java/de/ids_mannheim/korap/Krill.java b/src/main/java/de/ids_mannheim/korap/Krill.java
index e026682..0d02b79 100644
--- a/src/main/java/de/ids_mannheim/korap/Krill.java
+++ b/src/main/java/de/ids_mannheim/korap/Krill.java
@@ -217,7 +217,8 @@
             }
 
             else if (json.has("collections")) {
-                this.addError(899, "Collections are not supported anymore in favour of a single collection");
+                this.addError(899,
+                        "Collections are not supported anymore in favour of a single collection");
             };
         }
         catch (QueryException q) {
diff --git a/src/main/java/de/ids_mannheim/korap/KrillCollection.java b/src/main/java/de/ids_mannheim/korap/KrillCollection.java
index ceb6671..14cbec1 100644
--- a/src/main/java/de/ids_mannheim/korap/KrillCollection.java
+++ b/src/main/java/de/ids_mannheim/korap/KrillCollection.java
@@ -93,7 +93,8 @@
                 this.fromJson(json.get("collection"));
 
             else if (json.has("collections"))
-                this.addError(899, "Collections are not supported anymore in favour of a single collection");
+                this.addError(899,
+                        "Collections are not supported anymore in favour of a single collection");
         }
 
         // Query Exception
@@ -155,7 +156,8 @@
     };
 
 
-    private CollectionBuilder.Interface _fromJson (JsonNode json) throws QueryException {
+    private CollectionBuilder.Interface _fromJson (JsonNode json)
+            throws QueryException {
 
         if (!json.has("@type")) {
             throw new QueryException(701,
@@ -189,14 +191,14 @@
 
                 // TODO: This isn't stable yet
                 switch (match) {
-                case "match:eq":
-                    return this.cb.date(key, dateStr);
-                case "match:ne":
-                    return this.cb.date(key, dateStr).not();
-                case "match:geq":
-                    return this.cb.since(key, dateStr);
-                case "match:leq":
-                    return this.cb.till(key, dateStr);
+                    case "match:eq":
+                        return this.cb.date(key, dateStr);
+                    case "match:ne":
+                        return this.cb.date(key, dateStr).not();
+                    case "match:geq":
+                        return this.cb.since(key, dateStr);
+                    case "match:leq":
+                        return this.cb.till(key, dateStr);
                 };
 
                 throw new QueryException(841, "Match relation unknown for type");
@@ -209,22 +211,26 @@
 
                 switch (match) {
 
-                case "match:eq":
-                    return this.cb.term(key, json.get("value").asText());
-                case "match:ne":
-                    return this.cb.term(key, json.get("value").asText()).not();
+                    case "match:eq":
+                        return this.cb.term(key, json.get("value").asText());
+                    case "match:ne":
+                        return this.cb.term(key, json.get("value").asText())
+                                .not();
 
-                // This may change - but for now it means the elements are lowercased
-                case "match:contains":
-                    return this.cb.term(key, json.get("value").asText().toLowerCase());
+                        // This may change - but for now it means the elements are lowercased
+                    case "match:contains":
+                        return this.cb.term(key, json.get("value").asText()
+                                .toLowerCase());
 
-                case "match:containsnot":
-                    return this.cb.term(key, json.get("value").asText().toLowerCase()).not();
+                    case "match:containsnot":
+                        return this.cb.term(key,
+                                json.get("value").asText().toLowerCase()).not();
 
-                    // <LEGACY>
-                case "match:excludes":
-                    return this.cb.term(key, json.get("value").asText().toLowerCase()).not();
-                    // </LEGACY>
+                        // <LEGACY>
+                    case "match:excludes":
+                        return this.cb.term(key,
+                                json.get("value").asText().toLowerCase()).not();
+                        // </LEGACY>
                 };
 
                 throw new QueryException(841, "Match relation unknown for type");
@@ -259,21 +265,23 @@
         else if (type.equals("koral:docGroup")) {
 
             if (!json.has("operands") || !json.get("operands").isArray())
-                throw new QueryException(842, "Document group needs operand list");
+                throw new QueryException(842,
+                        "Document group needs operand list");
 
             CollectionBuilder.Group group;
 
             String operation = "operation:and";
             if (json.has("operation"))
-                operation = json.get("operation").asText();            
+                operation = json.get("operation").asText();
 
             if (operation.equals("operation:or"))
                 group = this.cb.orGroup();
             else if (operation.equals("operation:and"))
                 group = this.cb.andGroup();
             else
-                throw new QueryException(810, "Unknown document group operation");
-    
+                throw new QueryException(810,
+                        "Unknown document group operation");
+
             for (JsonNode operand : json.get("operands")) {
                 group.with(this._fromJson(operand));
             };
@@ -282,7 +290,8 @@
 
         // Unknown type
         throw new QueryException(813, "Collection type is not supported");
-    }; 
+    };
+
 
     // Returns the number of filters - always one!
     @Deprecated
@@ -294,13 +303,15 @@
     /**
      * Set the collection from a {@link CollectionBuilder} object.
      * 
-     * @param cb The CollectionBuilder object.
+     * @param cb
+     *            The CollectionBuilder object.
      */
     public KrillCollection fromBuilder (CollectionBuilder.Interface cbi) {
         this.cbi = cbi;
         return this;
     };
 
+
     public CollectionBuilder.Interface getBuilder () {
         return this.cbi;
     };
@@ -310,12 +321,15 @@
         return this.cb;
     };
 
+
     public KrillCollection filter (CollectionBuilder.Interface filter) {
         return this.fromBuilder(this.cb.andGroup().with(this.cbi).with(filter));
     };
 
+
     public KrillCollection extend (CollectionBuilder.Interface extension) {
-        return this.fromBuilder(this.cb.orGroup().with(this.cbi).with(extension));
+        return this.fromBuilder(this.cb.orGroup().with(this.cbi)
+                .with(extension));
     };
 
 
@@ -434,12 +448,13 @@
      * This will respect deleted documents.
      * 
      * @param atomic
-     *           The {@link AtomicReaderContext} to search in.
+     *            The {@link AtomicReaderContext} to search in.
      * @param accepted
      *            {@link Bits} vector of accepted documents.
      * @throws IOException
      */
-    public DocIdSet getDocIdSet (AtomicReaderContext atomic, Bits acceptDocs) throws IOException {
+    public DocIdSet getDocIdSet (AtomicReaderContext atomic, Bits acceptDocs)
+            throws IOException {
 
         int maxDoc = atomic.reader().maxDoc();
         FixedBitSet bitset = new FixedBitSet(maxDoc);
@@ -455,7 +470,8 @@
 
             // Init vector
             DocIdSet docids = filter.getDocIdSet(atomic, null);
-            DocIdSetIterator filterIter = (docids == null) ? null : docids.iterator();
+            DocIdSetIterator filterIter = (docids == null) ? null : docids
+                    .iterator();
 
             if (filterIter == null) {
                 if (!this.cbi.isNegative())
@@ -479,16 +495,16 @@
         };
 
         // Remove deleted docs
-        return (DocIdSet) BitsFilteredDocIdSet.wrap(
-            (DocIdSet) bitset,
-            acceptDocs
-        );
+        return (DocIdSet) BitsFilteredDocIdSet.wrap((DocIdSet) bitset,
+                acceptDocs);
     };
 
+
     public long numberOf (String type) throws IOException {
         return this.numberOf("tokens", type);
     };
 
+
     /**
      * Search for the number of occurrences of different types,
      * e.g. <i>documents</i>, <i>sentences</i> etc. in the virtual
@@ -525,7 +541,7 @@
             else
                 return this.docCount();
         };
-        
+
         // Create search term
         // This may be prefixed by foundries
         Term term = new Term(field, "-:" + type);
@@ -544,10 +560,11 @@
 
                 occurrences += this._numberOfAtomic(bits, atomic, term);
                 if (DEBUG)
-                    log.debug("Added up to {} for {}/{}", occurrences, field, type);
+                    log.debug("Added up to {} for {}/{}", occurrences, field,
+                            type);
             };
         }
-        
+
         // Something went wrong
         catch (IOException e) {
             log.warn(e.getMessage());
@@ -577,11 +594,8 @@
                 // TODO: Reuse a DocsAndPositionsEnum!!
 
                 // Start an iterator to fetch all payloads of the term
-                DocsAndPositionsEnum docs = termsEnum.docsAndPositions(
-                        docvec,
-                        null,
-                        DocsAndPositionsEnum.FLAG_PAYLOADS
-                );
+                DocsAndPositionsEnum docs = termsEnum.docsAndPositions(docvec,
+                        null, DocsAndPositionsEnum.FLAG_PAYLOADS);
 
 
                 // The iterator is empty
@@ -605,17 +619,17 @@
                     // Copy payload with the offset of the BytesRef
                     payload = docs.getPayload();
                     if (payload != null) {
-                        System.arraycopy(payload.bytes, payload.offset, pl, 0, 4);
+                        System.arraycopy(payload.bytes, payload.offset, pl, 0,
+                                4);
 
                         // Add payload as integer
                         occurrences += bb.wrap(pl).getInt();
 
                         if (DEBUG)
-                            log.debug("Value for {} incremented by {} to {} in {}",
-                                      term,
-                                      bb.wrap(pl).getInt(),
-                                      occurrences,
-                                      docs.docID());                    
+                            log.debug(
+                                    "Value for {} incremented by {} to {} in {}",
+                                    term, bb.wrap(pl).getInt(), occurrences,
+                                    docs.docID());
                     };
                 };
 
@@ -626,7 +640,7 @@
 
         // Nothing found
         return 0;
-    };    
+    };
 
 
     /**
diff --git a/src/main/java/de/ids_mannheim/korap/KrillCollectionLegacy.java b/src/main/java/de/ids_mannheim/korap/KrillCollectionLegacy.java
deleted file mode 100644
index 17fa1fe..0000000
--- a/src/main/java/de/ids_mannheim/korap/KrillCollectionLegacy.java
+++ /dev/null
@@ -1,937 +0,0 @@
-package de.ids_mannheim.korap;
-
-import java.util.*;
-import java.io.IOException;
-
-import de.ids_mannheim.korap.*;
-import de.ids_mannheim.korap.util.KrillDate;
-import de.ids_mannheim.korap.util.QueryException;
-import de.ids_mannheim.korap.collection.BooleanFilter;
-import de.ids_mannheim.korap.collection.RegexFilter;
-import de.ids_mannheim.korap.collection.FilterOperation;
-import de.ids_mannheim.korap.collection.CollectionBuilderLegacy;
-import de.ids_mannheim.korap.response.Notifications;
-import de.ids_mannheim.korap.response.Result;
-
-import org.apache.lucene.search.spans.SpanQuery;
-import org.apache.lucene.search.*;
-
-import org.apache.lucene.index.AtomicReaderContext;
-import org.apache.lucene.util.FixedBitSet;
-import org.apache.lucene.util.Bits;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.JsonNode;
-
-import java.io.StringWriter;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Create a Virtual Collection of documents by means of a KoralQuery
- * collection object.
- * Alternatively by applying manual filters and extensions on Lucene
- * fields.
- * 
- * <blockquote><pre>
- * KrillCollectionLegacy kc = new KrillCollectionLegacy(json);
- * kc.filterUIDS("a1", "a2", "a3");
- * </pre></blockquote>
- * 
- * <strong>Warning</strong>: This API is deprecated and will
- * be replaced in future versions. It supports legacy versions of
- * KoralQuery that will be disabled.
- * 
- * @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
- * TODO: Maybe a constantScoreQuery can make things faster?
- * See http://mail-archives.apache.org/mod_mbox/lucene-java-user/
- *     200805.mbox/%3C17080852.post@talk.nabble.com%3E
- */
-public class KrillCollectionLegacy extends Notifications {
-    private KrillIndex index;
-    private KrillDate created;
-    private String id;
-    private ArrayList<FilterOperation> filter;
-    private int filterCount = 0;
-    private JsonNode json;
-
-    // Logger
-    private final static Logger log = LoggerFactory
-            .getLogger(KrillCollection.class);
-
-    // This advices the java compiler to ignore all loggings
-    public static final boolean DEBUG = false;
-
-
-    /**
-     * Construct a new KrillCollectionLegacy by passing a KrillIndex.
-     * 
-     * @param index
-     *            The {@link KrillIndex} object.
-     */
-    public KrillCollectionLegacy (KrillIndex index) {
-        this.index = index;
-        this.filter = new ArrayList<FilterOperation>(5);
-    };
-
-
-    /**
-     * Construct a new KrillCollectionLegacy by passing a KoralQuery.
-     * This supports collections with the key "collection" and
-     * legacy collections with the key "collections".
-     * 
-     * @param jsonString
-     *            The virtual collection as a KoralQuery.
-     */
-    public KrillCollectionLegacy (String jsonString) {
-        ObjectMapper mapper = new ObjectMapper();
-        this.filter = new ArrayList<FilterOperation>(5);
-
-        try {
-            JsonNode json = mapper.readTree(jsonString);
-
-            // Deserialize from recent collections
-            if (json.has("collection")) {
-                this.fromJson(json.get("collection"));
-            }
-
-            // Legacy collection serialization
-            // This will be removed!
-            else if (json.has("collections")) {
-                this.addMessage(850,
-                        "Collections are deprecated in favour of a single collection");
-                for (JsonNode collection : json.get("collections")) {
-                    this.fromJsonLegacy(collection);
-                };
-            };
-        }
-        // Some exceptions ...
-        catch (QueryException qe) {
-            this.addError(qe.getErrorCode(), qe.getMessage());
-        }
-        catch (IOException e) {
-            this.addError(621, "Unable to parse JSON", "KrillCollectionLegacy",
-                    e.getLocalizedMessage());
-        };
-    };
-
-
-    /**
-     * Construct a new KrillCollectionLegacy.
-     */
-    public KrillCollectionLegacy () {
-        this.filter = new ArrayList<FilterOperation>(5);
-    };
-
-
-    /**
-     * Import the "collection" part of a KoralQuery.
-     * 
-     * @param jsonString
-     *            The "collection" part of a KoralQuery.
-     * @throws QueryException
-     */
-    public KrillCollectionLegacy fromJson (String jsonString) throws QueryException {
-        ObjectMapper mapper = new ObjectMapper();
-        try {
-            this.fromJson((JsonNode) mapper.readTree(jsonString));
-        }
-        catch (Exception e) {
-            this.addError(621, "Unable to parse JSON", "KrillCollection");
-        };
-
-        return this;
-    };
-
-
-    /**
-     * Import the "collection" part of a KoralQuery.
-     * 
-     * @param json
-     *            The "collection" part of a KoralQuery
-     *            as a {@link JsonNode} object.
-     * @throws QueryException
-     */
-    public KrillCollectionLegacy fromJson (JsonNode json) throws QueryException {
-        this.json = json;
-        this.filter(this._fromJson(json));
-        return this;
-    };
-
-
-    // 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();
-
-        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("koral: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;
-            }
-
-            // Filter based on string
-            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());
-                }
-                else if (match.equals("match:ne")) {
-                    bfilter.andNot(key, json.get("value").asText());
-                }
-                // This may change - but for now it means the elements are lowercased
-                else if (match.equals("match:contains")) {
-                    bfilter.and(key, json.get("value").asText().toLowerCase());
-                }
-                else if (match.equals("match:containsnot")) {
-                    bfilter.andNot(key, json.get("value").asText().toLowerCase());
-                }
-                // <LEGACY>
-                else if (match.equals("match:excludes")) {
-                    bfilter.andNot(key, json.get("value").asText().toLowerCase());
-                }
-                // </LEGACY>
-                else {
-                    throw new QueryException(0, "Unknown match type");
-                };
-
-                return bfilter;
-            }
-
-            // Filter based on regex
-            else if (valtype.equals("type:regex")) {
-                if (json.has("match"))
-                    match = json.get("match").asText();
-
-                if (match.equals("match:eq")) {
-                    return bfilter.and(key, new RegexFilter(json.get("value")
-                            .asText()));
-                }
-                else if (match.equals("match:ne")) {
-                    return bfilter.andNot(key, new RegexFilter(json
-                            .get("value").asText()));
-                };
-
-                // TODO! for excludes and contains
-                throw new QueryException(0, "Unknown document type");
-            };
-
-            // TODO!
-            throw new QueryException(0, "Unknown document operation");
-        }
-
-        // nested group
-        else if (type.equals("koral: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();
-    };
-
-
-    /**
-     * Import the "collections" part of a KoralQuery.
-     * This method is deprecated and will vanish in future versions.
-     * 
-     * @param jsonString
-     *            The "collections" part of a KoralQuery.
-     * @throws QueryException
-     */
-    @Deprecated
-    public KrillCollectionLegacy fromJsonLegacy (String jsonString)
-            throws QueryException {
-        ObjectMapper mapper = new ObjectMapper();
-        try {
-            this.fromJsonLegacy((JsonNode) mapper.readValue(jsonString,
-                    JsonNode.class));
-        }
-        catch (Exception e) {
-            this.addError(621, "Unable to parse JSON", "KrillCollection");
-        };
-        return this;
-    };
-
-
-    /**
-     * Import the "collections" part of a KoralQuery.
-     * This method is deprecated and will vanish in future versions.
-     * 
-     * @param json
-     *            The "collections" part of a KoralQuery
-     *            as a {@link JsonNode} object.
-     * @throws QueryException
-     */
-    @Deprecated
-    public KrillCollectionLegacy fromJsonLegacy (JsonNode json) throws QueryException {
-        if (!json.has("@type"))
-            throw new QueryException(701,
-                    "JSON-LD group has no @type attribute");
-
-        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();
-
-        // Filter the collection
-        if (type.equals("koral:meta-filter")) {
-            if (DEBUG)
-                log.trace("Add Filter LEGACY");
-            this.filter(bf);
-        }
-
-        // Extend the collection
-        else if (type.equals("koral:meta-extend")) {
-            if (DEBUG)
-                log.trace("Add Extend LEGACY");
-            this.extend(bf);
-        };
-
-        return this;
-    };
-
-
-    // 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("koral:term")) {
-            if (field != null && json.has("@value"))
-                bfilter.and(field, json.get("@value").asText());
-            return bfilter;
-        }
-        else if (type.equals("koral: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 KrillIndex} the virtual collection refers to.
-     * 
-     * @param index
-     *            The {@link KrillIndex} the virtual collection refers
-     *            to.
-     */
-    public void setIndex (KrillIndex index) {
-        this.index = index;
-    };
-
-
-    /**
-     * Add a filter by means of a {@link BooleanFilter}.
-     * 
-     * <strong>Warning</strong>: Filters are part of the collections
-     * legacy API and may vanish without warning.
-     * 
-     * @param filter
-     *            The filter to add to the collection.
-     * @return The {@link KrillCollectionLegacy} object for chaining.
-     */
-    // TODO: The checks may not be necessary
-    public KrillCollectionLegacy filter (BooleanFilter filter) {
-        if (DEBUG)
-            log.trace("Added filter: {}", filter.toString());
-
-        if (filter == null) {
-            this.addWarning(830, "Filter was empty");
-            return this;
-        };
-
-        Filter f = (Filter) new QueryWrapperFilter(filter.toQuery());
-        if (f == null) {
-            this.addWarning(831, "Filter is not wrappable");
-            return this;
-        };
-        FilterOperation fo = new FilterOperation(f, false);
-        if (fo == null) {
-            this.addWarning(832, "Filter operation is invalid");
-            return this;
-        };
-        this.filter.add(fo);
-        this.filterCount++;
-        return this;
-    };
-
-
-    /**
-     * Add a filter by means of a {@link CollectionBuilderLegacy} object.
-     * 
-     * <strong>Warning</strong>: Filters are part of the collections
-     * legacy API and may vanish without warning.
-     * 
-     * @param filter
-     *            The filter to add to the collection.
-     * @return The {@link KrillCollectionLegacy} object for chaining.
-     */
-    public KrillCollectionLegacy filter (CollectionBuilderLegacy filter) {
-        return this.filter(filter.getBooleanFilter());
-    };
-
-
-    /**
-     * Add an extension by means of a {@link BooleanFilter}.
-     * 
-     * <strong>Warning</strong>: Extensions are part of the
-     * collections
-     * legacy API and may vanish without warning.
-     * 
-     * @param extension
-     *            The extension to add to the collection.
-     * @return The {@link KrillCollectionLegacy} object for chaining.
-     */
-    public KrillCollectionLegacy extend (BooleanFilter extension) {
-        if (DEBUG)
-            log.trace("Added extension: {}", extension.toString());
-
-        this.filter.add(new FilterOperation((Filter) new QueryWrapperFilter(
-                extension.toQuery()), true));
-        this.filterCount++;
-        return this;
-    };
-
-
-    /**
-     * Add an extension by means of a {@link CollectionBuilderLegacy}
-     * object.
-     * 
-     * <strong>Warning</strong>: Extensions are part of the
-     * collections
-     * legacy API and may vanish without warning.
-     * 
-     * @param extension
-     *            The extension to add to the collection.
-     * @return The {@link KrillCollectionLegacy} object for chaining.
-     */
-    public KrillCollectionLegacy extend (CollectionBuilderLegacy extension) {
-        return this.extend(extension.getBooleanFilter());
-    };
-
-
-    /**
-     * Add a filter based on a list of unique document identifiers.
-     * UIDs may be indexed in the field "UID".
-     * 
-     * This filter is not part of the legacy API!
-     * 
-     * @param uids
-     *            The list of unique document identifier.
-     * @return The {@link KrillCollectionLegacy} object for chaining.
-     */
-    public KrillCollectionLegacy filterUIDs (String ... uids) {
-        BooleanFilter filter = new BooleanFilter();
-        filter.or("UID", uids);
-        if (DEBUG)
-            log.debug("UID based filter: {}", filter.toString());
-        return this.filter(filter);
-    };
-
-
-    /**
-     * Get the list of filters constructing the collection.
-     * 
-     * <strong>Warning</strong>: This is part of the collections
-     * legacy API and may vanish without warning.
-     * 
-     * @return The list of filters.
-     */
-    public List<FilterOperation> getFilters () {
-        return this.filter;
-    };
-
-
-    /**
-     * Get a certain {@link FilterOperation} from the list of filters
-     * constructing the collection by its numerical index.
-     * 
-     * <strong>Warning</strong>: This is part of the collections
-     * legacy API and may vanish without warning.
-     * 
-     * @param index
-     *            The index position of the requested
-     *            {@link FilterOperation}.
-     * @return The {@link FilterOperation} at the certain list
-     *         position.
-     */
-    public FilterOperation getFilter (int index) {
-        return this.filter.get(index);
-    };
-
-
-    /**
-     * Get the number of filter operations constructing this
-     * collection.
-     * 
-     * <strong>Warning</strong>: This is part of the collections
-     * legacy API and may vanish without warning.
-     * 
-     * @return The number of filter operations constructing this
-     *         collection.
-     */
-    public int getCount () {
-        return this.filterCount;
-    };
-
-
-    /**
-     * Generate a string representatio of the virtual collection.
-     * 
-     * <strong>Warning</strong>: This currently does not generate a
-     * valid
-     * KoralQuery string, so this may change in a future version.
-     * 
-     * @return A string representation of the virtual collection.
-     */
-    public String toString () {
-        StringBuilder sb = new StringBuilder();
-        for (FilterOperation fo : this.filter) {
-            sb.append(fo.toString()).append("; ");
-        };
-        return sb.toString();
-    };
-
-
-    /**
-     * Return the associated KoralQuery collection object
-     * as a {@link JsonNode}. This won't work,
-     * if the object was build using a CollectionBuilderLegacy,
-     * therefore it is limited to mirror a deserialized KoralQuery
-     * object.
-     * 
-     * @return The {@link JsonNode} representing the collection object
-     *         of a deserialized KoralQuery object.
-     */
-    public JsonNode toJsonNode () {
-        return this.json;
-    };
-
-
-
-    /**
-     * Search in the virtual collection.
-     * This is mostly used for testing purposes
-     * and <strong>is not recommended</strong>
-     * as a common search API.
-     * 
-     * Please use {@link KrillQuery#run} instead.
-     * 
-     * @param query
-     *            a {@link SpanQuery} to apply on the
-     *            virtual collection.
-     * @return A {@link Result} object representing the search's
-     *         result.
-     */
-    public Result search (SpanQuery query) {
-        /*
-return this.index.search(this, query, 0, (short) 20, true, (short) 5,
-                true, (short) 5);
-        */
-        return null;
-    };
-
-
-    /**
-     * Create a bit vector representing the live documents of the
-     * virtual collection to be used in searches.
-     * 
-     * @param The
-     *            {@link AtomicReaderContext} to search in.
-     * @return A bit vector representing the live documents of the
-     *         virtual collection.
-     * @throws IOException
-     */
-    public FixedBitSet bits (AtomicReaderContext atomic) throws IOException {
-        // TODO: Probably use Bits.MatchAllBits(int len)
-        boolean noDoc = true;
-        FixedBitSet bitset;
-
-        // There are filters set
-        if (this.filterCount > 0) {
-            bitset = new FixedBitSet(atomic.reader().maxDoc());
-
-            ArrayList<FilterOperation> filters = (ArrayList<FilterOperation>) this.filter
-                    .clone();
-
-            FilterOperation kcInit = filters.remove(0);
-            if (DEBUG)
-                log.trace("FILTER: {}", kcInit);
-
-            // Init vector
-            DocIdSet docids = kcInit.filter.getDocIdSet(atomic, null);
-
-            DocIdSetIterator filterIter = docids.iterator();
-
-            // The filter has an effect
-            if (filterIter != null) {
-                if (DEBUG)
-                    log.trace("InitFilter has effect");
-                bitset.or(filterIter);
-                noDoc = false;
-            };
-
-            // Apply all filters sequentially
-            for (FilterOperation kc : filters) {
-                if (DEBUG)
-                    log.trace("FILTER: {}", kc);
-
-                // TODO: BUG???
-                docids = kc.filter.getDocIdSet(atomic, kc.isExtension() ? null
-                        : bitset);
-                filterIter = docids.iterator();
-
-                if (filterIter == null) {
-                    // There must be a better way ...
-                    if (kc.isFilter()) {
-                        // TODO: Check if this is really correct!
-                        // Maybe here is the bug
-                        bitset.clear(0, bitset.length());
-                        noDoc = true;
-                    };
-                    continue;
-                };
-                if (kc.isExtension())
-                    bitset.or(filterIter);
-                else
-                    bitset.and(filterIter);
-            };
-
-            if (!noDoc) {
-                FixedBitSet livedocs = (FixedBitSet) atomic.reader()
-                        .getLiveDocs();
-                if (livedocs != null)
-                    bitset.and(livedocs);
-            };
-        }
-        else {
-            bitset = (FixedBitSet) atomic.reader().getLiveDocs();
-        };
-
-        return bitset;
-    };
-
-
-    /**
-     * Search for the number of occurrences of different types,
-     * e.g. <i>documents</i>, <i>sentences</i> etc. in the virtual
-     * collection.
-     * 
-     * @param field
-     *            The field containing the textual data and the
-     *            annotations as a string.
-     * @param type
-     *            The type of meta information,
-     *            e.g. <i>documents</i> or <i>sentences</i> as a
-     *            string.
-     * @return The number of the occurrences.
-     * @throws IOException
-     * @see KrillIndex#numberOf
-     */
-    public long numberOf (String field, String type) throws IOException {
-        if (this.index == null)
-            return (long) -1;
-
-        // return this.index.numberOf(this, field, type);
-        return (long) 0;
-    };
-
-
-    /**
-     * Search for the number of occurrences of different types,
-     * e.g. <i>documents</i>, <i>sentences</i> etc. in the virtual
-     * collection, in the <i>base</i> foundry.
-     * 
-     * @param type
-     *            The type of meta information,
-     *            e.g. <i>documents</i> or <i>sentences</i> as a
-     *            string.
-     * @return The number of the occurrences.
-     * @throws IOException
-     * @see KrillIndex#numberOf
-     */
-    public long numberOf (String type) throws IOException {
-        if (this.index == null)
-            return (long) -1;
-
-        // return this.index.numberOf(this, "tokens", type);
-        return (long) 0;
-    };
-
-
-    // Term relation API is not in use anymore
-    /*
-    @Deprecated
-    public HashMap getTermRelation (String field) throws Exception {
-        if (this.index == null) {
-            HashMap<String, Long> map = new HashMap<>(1);
-            map.put("-docs", (long) 0);
-            return map;
-        };
-
-        return this.index.getTermRelation(this, field);
-    };
-    */
-
-
-    // Term relation API is not in use anymore
-    /*
-    @Deprecated
-    public String getTermRelationJSON (String field) throws IOException {
-        ObjectMapper mapper = new ObjectMapper();
-        StringWriter sw = new StringWriter();
-        sw.append("{\"field\":");
-        mapper.writeValue(sw, field);
-        sw.append(",");
-
-        try {
-            HashMap<String, Long> map = this.getTermRelation(field);
-
-            sw.append("\"documents\":");
-            mapper.writeValue(sw, map.remove("-docs"));
-            sw.append(",");
-
-            String[] keys = map.keySet().toArray(new String[map.size()]);
-
-            HashMap<String, Integer> setHash = new HashMap<>(20);
-            ArrayList<HashMap<String, Long>> set = new ArrayList<>(20);
-            ArrayList<Long[]> overlap = new ArrayList<>(100);
-
-            int count = 0;
-            for (String key : keys) {
-                if (!key.startsWith("#__")) {
-                    HashMap<String, Long> simpleMap = new HashMap<>();
-                    simpleMap.put(key, map.remove(key));
-                    set.add(simpleMap);
-                    setHash.put(key, count++);
-                };
-            };
-
-            keys = map.keySet().toArray(new String[map.size()]);
-            for (String key : keys) {
-                String[] comb = key.substring(3).split(":###:");
-                Long[] l = new Long[3];
-                l[0] = (long) setHash.get(comb[0]);
-                l[1] = (long) setHash.get(comb[1]);
-                l[2] = map.remove(key);
-                overlap.add(l);
-            };
-
-            sw.append("\"sets\":");
-            mapper.writeValue(sw, (Object) set);
-            sw.append(",\"overlaps\":");
-            mapper.writeValue(sw, (Object) overlap);
-            sw.append(",\"error\":null");
-        }
-        catch (Exception e) {
-            sw.append("\"error\":");
-            mapper.writeValue(sw, e.getMessage());
-        };
-
-        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("koral: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("koral: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/KrillIndex.java b/src/main/java/de/ids_mannheim/korap/KrillIndex.java
index c1c0c00..7dc25ee 100644
--- a/src/main/java/de/ids_mannheim/korap/KrillIndex.java
+++ b/src/main/java/de/ids_mannheim/korap/KrillIndex.java
@@ -218,8 +218,7 @@
         analyzerPerField.put("keywords", new KeywordAnalyzer());
         analyzerPerField.put("foundries", new KeywordAnalyzer());
         PerFieldAnalyzerWrapper analyzer = new PerFieldAnalyzerWrapper(
-          new TextAnalyzer(), analyzerPerField
-        );
+                new TextAnalyzer(), analyzerPerField);
 
         // Create configuration with base analyzer
         this.config = new IndexWriterConfig(Version.LUCENE_CURRENT, analyzer);
@@ -430,9 +429,7 @@
         if (field == null || term == null)
             return false;
         try {
-            this.writer().deleteDocuments(
-                new Term(field, term)
-            );
+            this.writer().deleteDocuments(new Term(field, term));
             if (++commitCounter > autoCommit) {
                 this.commit();
                 commitCounter = 0;
@@ -1011,7 +1008,7 @@
                         field);
 
                 HashSet<String> fields = (HashSet<String>) new Krill()
-                    .getMeta().getFields().clone();
+                        .getMeta().getFields().clone();
 
                 fields.add(field);
 
@@ -1025,8 +1022,7 @@
                 match.populateDocument(doc, field, fields);
                 if (DEBUG)
                     log.trace("The document has the id '{}' or the sigle '{}'",
-                              match.getDocID(),
-                              match.getTextSigle());
+                            match.getDocID(), match.getTextSigle());
 
                 // Todo:
                 SearchContext context = match.getContext();
@@ -1034,7 +1030,8 @@
                 // Search for minimal surrounding sentences
                 if (extendToSentence) {
 
-                    String element = (match.getTextSigle() == null ? "s" : "base/s:s");
+                    String element = (match.getTextSigle() == null ? "s"
+                            : "base/s:s");
 
                     // SUPPORT FOR LEGACY ANNOTATIONS
                     int[] spanContext = match.expandContextToSpan(element);
@@ -1043,8 +1040,7 @@
                         log.trace("Extend to sentence element '{}'", element);
 
                     // </legacy>
-                    if (spanContext[0] >= 0 &&
-                        spanContext[0] < spanContext[1]) {
+                    if (spanContext[0] >= 0 && spanContext[0] < spanContext[1]) {
                         match.setStartPos(spanContext[0]);
                         match.setEndPos(spanContext[1]);
                         match.startMore = false;
@@ -1222,7 +1218,7 @@
         // Todo: Make kr subclassing ks - so ks has a method for a new Result!
         Result kr = new Result(query.toString(), meta.getStartIndex(),
                 meta.getCount(), meta.getContext());
-        
+
         // Set version info to result
         if (this.getVersion() != null)
             kr.setVersion(this.getVersion());
@@ -1350,8 +1346,8 @@
                     int docID = atomic.docBase + localDocID;
 
                     // Do not load all of this, in case the doc is the same!
-                    Document doc = (fields != null) ? lreader.document(localDocID, fields) :
-                        lreader.document(localDocID);
+                    Document doc = (fields != null) ? lreader.document(
+                            localDocID, fields) : lreader.document(localDocID);
 
                     // Create new Match
                     Match match = new Match(pto, localDocID, spans.start(),
@@ -1451,6 +1447,7 @@
         return kr;
     };
 
+
     public void getFields () {
         /*
          * Return a map of key, value pairs:
@@ -1460,10 +1457,12 @@
          */
     };
 
+
     public void getValues (String field) {
 
     };
 
+
     // Collect matches
     public MatchCollector collect (Krill ks, MatchCollector mc) {
         if (DEBUG)
diff --git a/src/main/java/de/ids_mannheim/korap/KrillQuery.java b/src/main/java/de/ids_mannheim/korap/KrillQuery.java
index 72fc389..07a3c3b 100644
--- a/src/main/java/de/ids_mannheim/korap/KrillQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/KrillQuery.java
@@ -399,39 +399,39 @@
 
         // Branch on operation
         switch (operation) {
-        case "operation:junction":
-            return this._operationJunctionFromJson(operands);
+            case "operation:junction":
+                return this._operationJunctionFromJson(operands);
 
-        case "operation:position":
-            return this._operationPositionFromJson(json, operands);
+            case "operation:position":
+                return this._operationPositionFromJson(json, operands);
 
-        case "operation:sequence":
-            return this._operationSequenceFromJson(json, operands);
+            case "operation:sequence":
+                return this._operationSequenceFromJson(json, operands);
 
-        case "operation:class":
-            return this._operationClassFromJson(json, operands);
+            case "operation:class":
+                return this._operationClassFromJson(json, operands);
 
-        case "operation:repetition":
-            return this._operationRepetitionFromJson(json, operands);
+            case "operation:repetition":
+                return this._operationRepetitionFromJson(json, operands);
 
-        case "operation:relation":
-            if (!json.has("relation")) {
-                throw new QueryException(717, "Missing relation node");
-            }
+            case "operation:relation":
+                if (!json.has("relation")) {
+                    throw new QueryException(717, "Missing relation node");
+                }
 
-            return _operationRelationFromJson(operands,
-                                              json.get("relation"));
-            /*throw new QueryException(765,
-              "Relations are currently not supported");*/
+                return _operationRelationFromJson(operands,
+                        json.get("relation"));
+                /*throw new QueryException(765,
+                  "Relations are currently not supported");*/
 
-        case "operation:or": // Deprecated in favor of operation:junction
-            return this._operationJunctionFromJson(operands);
-            /*
-              case "operation:submatch": // Deprecated in favor of koral:reference
-              return this._operationSubmatchFromJson(json, operands);
-            */
-        case "operation:disjunction":
-            return this._operationJunctionFromJson(operands);
+            case "operation:or": // Deprecated in favor of operation:junction
+                return this._operationJunctionFromJson(operands);
+                /*
+                  case "operation:submatch": // Deprecated in favor of koral:reference
+                  return this._operationSubmatchFromJson(json, operands);
+                */
+            case "operation:disjunction":
+                return this._operationJunctionFromJson(operands);
         };
 
         // Unknown
diff --git a/src/main/java/de/ids_mannheim/korap/collection/BooleanFilter.java b/src/main/java/de/ids_mannheim/korap/collection/BooleanFilter.java
deleted file mode 100644
index 19693c6..0000000
--- a/src/main/java/de/ids_mannheim/korap/collection/BooleanFilter.java
+++ /dev/null
@@ -1,229 +0,0 @@
-package de.ids_mannheim.korap.collection;
-
-import java.util.*;
-
-import org.apache.lucene.index.Term;
-
-import org.apache.lucene.search.BooleanClause;
-import org.apache.lucene.search.BooleanQuery;
-import org.apache.lucene.search.Query;
-import org.apache.lucene.search.TermQuery;
-import org.apache.lucene.search.RegexpQuery;
-import org.apache.lucene.search.NumericRangeQuery;
-
-import de.ids_mannheim.korap.util.KrillDate;
-import de.ids_mannheim.korap.KrillCollection;
-import de.ids_mannheim.korap.util.QueryException;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-
-/*
-  THIS IS LIMITED TO PUBDATE AT THE MOMENT AND COMPLETELY LEGACY!
-*/
-
-/**
- * @author Nils Diewald
- * 
- *         BooleanFilter implements a simple API for boolean
- *         operations
- *         on constraints for KorapFilter.
- */
-public class BooleanFilter {
-    private String type;
-
-    // Logger
-    private final static Logger log = LoggerFactory
-            .getLogger(KrillCollection.class);
-
-    // This advices the java compiler to ignore all loggings
-    public static final boolean DEBUG = false;
-
-    private BooleanQuery bool;
-    private String error;
-
-
-    public BooleanFilter () {
-        bool = new BooleanQuery();
-    };
-
-
-    public BooleanFilter or (String type, String ... terms) {
-        for (String term : terms) {
-
-            if (DEBUG)
-                log.trace("Filter: OR {}={}", type, term);
-
-            bool.add(new TermQuery(new Term(type, term)),
-                    BooleanClause.Occur.SHOULD);
-        };
-        return this;
-    };
-
-
-    public BooleanFilter or (String type, RegexFilter value) {
-        bool.add(value.toQuery(type), BooleanClause.Occur.SHOULD);
-        return this;
-    };
-
-
-    public BooleanFilter or (BooleanFilter bf) {
-        if (bf.bool.clauses().size() == 1) {
-            BooleanClause bc = bf.bool.getClauses()[0];
-            bc.setOccur(BooleanClause.Occur.SHOULD);
-            bool.add(bc);
-            return this;
-        }
-        bool.add(bf.toQuery(), BooleanClause.Occur.SHOULD);
-        return this;
-    };
-
-
-    public BooleanFilter or (NumericRangeQuery<Integer> nrq) {
-        bool.add(nrq, BooleanClause.Occur.SHOULD);
-        return this;
-    };
-
-
-    public BooleanFilter and (String type, String ... terms) {
-        for (String term : terms) {
-            bool.add(new TermQuery(new Term(type, term)),
-                    BooleanClause.Occur.MUST);
-        };
-        return this;
-    };
-
-
-    public BooleanFilter and (String type, RegexFilter value) {
-        bool.add(value.toQuery(type), BooleanClause.Occur.MUST);
-        return this;
-    };
-
-
-    public BooleanFilter and (BooleanFilter bf) {
-        if (bf.bool.clauses().size() == 1) {
-            BooleanClause bc = bf.bool.getClauses()[0];
-            bc.setOccur(BooleanClause.Occur.MUST);
-            bool.add(bc);
-            return this;
-        }
-        bool.add(bf.toQuery(), BooleanClause.Occur.MUST);
-        return this;
-    };
-
-
-    public BooleanFilter andNot (String type, String ... terms) {
-        for (String term : terms) {
-            bool.add(new TermQuery(new Term(type, term)),
-                    BooleanClause.Occur.MUST_NOT);
-        };
-        return this;
-    };
-
-
-    public BooleanFilter andNot (String type, RegexFilter value) {
-        bool.add(value.toQuery(type), BooleanClause.Occur.MUST_NOT);
-        return this;
-    };
-
-
-    public BooleanFilter andNot (BooleanFilter bf) {
-        if (bf.bool.clauses().size() == 1) {
-            BooleanClause bc = bf.bool.getClauses()[0];
-            bc.setOccur(BooleanClause.Occur.MUST_NOT);
-            bool.add(bc);
-            return this;
-        }
-        bool.add(bf.toQuery(), BooleanClause.Occur.MUST_NOT);
-        return this;
-    };
-
-
-    public BooleanFilter since (String dateStr) {
-        int since = new KrillDate(dateStr).floor();
-
-        if (since == 0 || since == KrillDate.BEGINNING)
-            return this;
-
-        bool.add(NumericRangeQuery.newIntRange("pubDate", since, KrillDate.END,
-                true, true), BooleanClause.Occur.MUST);
-
-        return this;
-    };
-
-
-    public BooleanFilter till (String dateStr) {
-        try {
-            int till = new KrillDate(dateStr).ceil();
-            if (till == 0 || till == KrillDate.END)
-                return this;
-
-            bool.add(NumericRangeQuery.newIntRange("pubDate",
-                    KrillDate.BEGINNING, till, true, true),
-                    BooleanClause.Occur.MUST);
-        }
-        catch (NumberFormatException e) {
-            log.warn("Parameter of till(date) is invalid");
-        };
-        return this;
-    };
-
-
-    public BooleanFilter between (String beginStr, String endStr) {
-        KrillDate beginDF = new KrillDate(beginStr);
-
-        int begin = beginDF.floor();
-
-        int end = new KrillDate(endStr).ceil();
-
-        if (end == 0)
-            return this;
-
-        if (begin == KrillDate.BEGINNING && end == KrillDate.END)
-            return this;
-
-        if (begin == end) {
-            this.and("pubDate", beginDF.toString());
-            return this;
-        };
-
-        this.bool.add(NumericRangeQuery.newIntRange("pubDate", begin, end,
-                true, true), BooleanClause.Occur.MUST);
-        return this;
-    };
-
-
-    public BooleanFilter date (String dateStr) {
-        KrillDate dateDF = new KrillDate(dateStr);
-
-        if (dateDF.year == 0)
-            return this;
-
-        if (dateDF.day == 0 || dateDF.month == 0) {
-            int begin = dateDF.floor();
-            int end = dateDF.ceil();
-
-            if (end == 0
-                    || (begin == KrillDate.BEGINNING && end == KrillDate.END))
-                return this;
-
-            this.bool.add(NumericRangeQuery.newIntRange("pubDate", begin, end,
-                    true, true), BooleanClause.Occur.MUST);
-            return this;
-        };
-
-        this.and("pubDate", dateDF.toString());
-        return this;
-    };
-
-
-    public Query toQuery () {
-        return this.bool;
-    };
-
-
-    public String toString () {
-        return this.bool.toString();
-    };
-};
diff --git a/src/main/java/de/ids_mannheim/korap/collection/BooleanGroupFilter.java b/src/main/java/de/ids_mannheim/korap/collection/BooleanGroupFilter.java
index 60c4ebb..53b0b66 100644
--- a/src/main/java/de/ids_mannheim/korap/collection/BooleanGroupFilter.java
+++ b/src/main/java/de/ids_mannheim/korap/collection/BooleanGroupFilter.java
@@ -20,17 +20,19 @@
 /**
  * A container Filter that allows Boolean composition of Filters
  * in groups (either or-groups or and-groups).
- *
+ * 
  * @author Nils Diewald
- *
- * This filter is roughly based on org.apache.lucene.queries.BooleanFilter.
+ * 
+ *         This filter is roughly based on
+ *         org.apache.lucene.queries.BooleanFilter.
  */
 public class BooleanGroupFilter extends Filter {
     // Group is either an or- or an and-Group
     private boolean isOptional;
 
     // Logger
-    private final static Logger log = LoggerFactory.getLogger(KrillCollection.class);
+    private final static Logger log = LoggerFactory
+            .getLogger(KrillCollection.class);
 
     // This advices the java compiler to ignore all loggings
     public static final boolean DEBUG = false;
@@ -43,6 +45,7 @@
         public Filter filter;
         public boolean isNegative;
 
+
         // Operand has filter and negativity information
         public GroupFilterOperand (Filter filter, boolean negative) {
             this.filter = filter;
@@ -50,6 +53,7 @@
         };
     };
 
+
     /**
      * Create a new BooleanGroupFilter.
      * Accepts a boolean parameter to make it an or-Group
@@ -82,7 +86,7 @@
     public boolean equals (Object obj) {
         if (this == obj)
             return true;
-        
+
         if ((obj == null) || (obj.getClass() != this.getClass()))
             return false;
 
@@ -92,16 +96,15 @@
 
 
     @Override
-    public int hashCode() {
+    public int hashCode () {
         return 657153719 ^ operands.hashCode();
     };
 
-    
+
     @Override
     public String toString () {
-        StringBuilder buffer = new StringBuilder(
-            this.isOptional ? "OrGroup(" : "AndGroup("
-        );
+        StringBuilder buffer = new StringBuilder(this.isOptional ? "OrGroup("
+                : "AndGroup(");
         boolean first = true;
         for (final GroupFilterOperand operand : this.operands) {
             if (first)
@@ -117,12 +120,13 @@
         return buffer.append(')').toString();
     };
 
-  
+
     @Override
-    public DocIdSet getDocIdSet (AtomicReaderContext context, Bits acceptDocs) throws IOException {
+    public DocIdSet getDocIdSet (AtomicReaderContext context, Bits acceptDocs)
+            throws IOException {
         final AtomicReader reader = context.reader();
         int maxDoc = reader.maxDoc();
-        FixedBitSet bitset     = new FixedBitSet(maxDoc);
+        FixedBitSet bitset = new FixedBitSet(maxDoc);
         FixedBitSet combinator = new FixedBitSet(maxDoc);
         boolean init = true;
 
@@ -131,17 +135,18 @@
 
         for (final GroupFilterOperand operand : this.operands) {
             final DocIdSet docids = operand.filter.getDocIdSet(context, null);
-            final DocIdSetIterator filterIter = (docids == null) ? null : docids.iterator();
+            final DocIdSetIterator filterIter = (docids == null) ? null
+                    : docids.iterator();
 
             if (DEBUG)
                 log.debug("> Filter to bitset of {} ({} negative)",
-                          operand.filter.toString(),
-                          operand.isNegative);
+                        operand.filter.toString(), operand.isNegative);
 
             // Filter resulted in no docs
             if (filterIter == null) {
 
-                if (DEBUG) log.debug("- Filter is null");
+                if (DEBUG)
+                    log.debug("- Filter is null");
 
                 // Filter matches
                 if (operand.isNegative) {
@@ -150,25 +155,29 @@
                     if (this.isOptional) {
 
                         // Everything is allowed
-                        if (DEBUG) log.debug("- Filter to allow all documents");
+                        if (DEBUG)
+                            log.debug("- Filter to allow all documents");
 
                         bitset.set(0, maxDoc);
                         return BitsFilteredDocIdSet.wrap(bitset, acceptDocs);
                     };
 
                     // There is no possible match
-                    if (DEBUG) log.debug("- Filter to allow no documents (1)");
+                    if (DEBUG)
+                        log.debug("- Filter to allow no documents (1)");
                     return null;
                 }
 
                 // The result is unimportant
                 else if (this.isOptional) {
-                    if (DEBUG) log.debug("- Filter is ignorable");
+                    if (DEBUG)
+                        log.debug("- Filter is ignorable");
                     continue;
                 };
 
                 // There is no possible match
-                if (DEBUG) log.debug("- Filter to allow no documents (2)");
+                if (DEBUG)
+                    log.debug("- Filter to allow no documents (2)");
                 return null;
             }
 
@@ -177,30 +186,40 @@
 
                 bitset.or(filterIter);
 
-                if (DEBUG) log.debug("- Filter is inial with card {}", bitset.cardinality());
+                if (DEBUG)
+                    log.debug("- Filter is inial with card {}",
+                            bitset.cardinality());
 
                 // Flip the matching documents
                 if (operand.isNegative) {
                     bitset.flip(0, maxDoc);
-                    if (DEBUG) log.debug("- Filter is negative - so flipped to card {} (1)", bitset.cardinality());
+                    if (DEBUG)
+                        log.debug(
+                                "- Filter is negative - so flipped to card {} (1)",
+                                bitset.cardinality());
                 };
 
                 init = false;
             }
             else {
 
-                if (DEBUG) log.debug("- Filter is fine and operating");
+                if (DEBUG)
+                    log.debug("- Filter is fine and operating");
 
                 // Operator is negative and needs to be flipped
                 if (operand.isNegative) {
                     if (this.isOptional) {
-                    if (DEBUG) log.debug("- Filter is negative optional");
+                        if (DEBUG)
+                            log.debug("- Filter is negative optional");
 
                         // Negative or ... may be slow
                         combinator.or(filterIter);
                         combinator.flip(0, maxDoc);
 
-                        if (DEBUG) log.debug("- Filter is negative - so flipped to card {} (2)", combinator.cardinality());
+                        if (DEBUG)
+                            log.debug(
+                                    "- Filter is negative - so flipped to card {} (2)",
+                                    combinator.cardinality());
 
                         bitset.or(combinator);
                         combinator.clear(0, maxDoc);
@@ -208,22 +227,27 @@
 
                     // Negative and
                     else {
-                        if (DEBUG) log.debug("- Filter is negative not optional");
+                        if (DEBUG)
+                            log.debug("- Filter is negative not optional");
                         bitset.andNot(filterIter);
-                        if (DEBUG) log.debug("- Filter is negative - so andNotted");
+                        if (DEBUG)
+                            log.debug("- Filter is negative - so andNotted");
                     }
                 }
                 else if (this.isOptional) {
-                    if (DEBUG) log.debug("- Filter is simply optional");
+                    if (DEBUG)
+                        log.debug("- Filter is simply optional");
                     bitset.or(filterIter);
                 }
                 else {
-                    if (DEBUG) log.debug("- Filter is simply not optional");
+                    if (DEBUG)
+                        log.debug("- Filter is simply not optional");
                     bitset.and(filterIter);
                     // TODO: Check with nextSetBit() if the filter is not applicable
                 };
 
-                if (DEBUG) log.debug("- Subresult has card {} ", bitset.cardinality());
+                if (DEBUG)
+                    log.debug("- Subresult has card {} ", bitset.cardinality());
             };
         };
         return BitsFilteredDocIdSet.wrap(bitset, acceptDocs);
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 836aaa1..350d852 100644
--- a/src/main/java/de/ids_mannheim/korap/collection/CollectionBuilder.java
+++ b/src/main/java/de/ids_mannheim/korap/collection/CollectionBuilder.java
@@ -25,19 +25,23 @@
 public class CollectionBuilder {
 
     // Logger
-    private final static Logger log = LoggerFactory.getLogger(KrillCollection.class);
+    private final static Logger log = LoggerFactory
+            .getLogger(KrillCollection.class);
 
     // This advices the java compiler to ignore all loggings
     public static final boolean DEBUG = false;
 
+
     public CollectionBuilder.Interface term (String field, String term) {
         return new CollectionBuilder.Term(field, term);
     };
 
+
     public CollectionBuilder.Interface re (String field, String term) {
         return new CollectionBuilder.Term(field, term, true);
     };
 
+
     public CollectionBuilder.Interface since (String field, String date) {
         int since = new KrillDate(date).floor();
 
@@ -47,6 +51,7 @@
         return new CollectionBuilder.Range(field, since, KrillDate.END);
     };
 
+
     public CollectionBuilder.Interface till (String field, String date) {
         try {
             int till = new KrillDate(date).ceil();
@@ -61,8 +66,10 @@
         return null;
     };
 
+
     // This will be optimized away in future versions
-    public CollectionBuilder.Interface between (String field, String start, String end) {
+    public CollectionBuilder.Interface between (String field, String start,
+            String end) {
         CollectionBuilder.Interface startObj = this.since(field, start);
         if (startObj == null)
             return null;
@@ -74,6 +81,7 @@
         return this.andGroup().with(startObj).with(endObj);
     };
 
+
     public CollectionBuilder.Interface date (String field, String date) {
         KrillDate dateDF = new KrillDate(date);
 
@@ -85,7 +93,7 @@
             int end = dateDF.ceil();
 
             if (end == 0
-                || (begin == KrillDate.BEGINNING && end == KrillDate.END))
+                    || (begin == KrillDate.BEGINNING && end == KrillDate.END))
                 return null;
 
             return new CollectionBuilder.Range(field, begin, end);
@@ -94,18 +102,26 @@
         return new CollectionBuilder.Range(field, dateDF.floor(), dateDF.ceil());
     };
 
+
     public CollectionBuilder.Group andGroup () {
         return new CollectionBuilder.Group(false);
     };
 
+
     public CollectionBuilder.Group orGroup () {
         return new CollectionBuilder.Group(true);
     };
 
     public interface Interface {
         public String toString ();
+
+
         public Filter toFilter ();
+
+
         public boolean isNegative ();
+
+
         public CollectionBuilder.Interface not ();
     };
 
@@ -115,28 +131,33 @@
         private String field;
         private String term;
 
+
         public Term (String field, String term) {
             this.field = field;
             this.term = term;
         };
 
+
         public Term (String field, String term, boolean regex) {
             this.field = field;
             this.term = term;
             this.regex = regex;
         };
 
+
         public Filter toFilter () {
             // Regular expression
             if (this.regex)
                 return new QueryWrapperFilter(
-                    new RegexpQuery(new org.apache.lucene.index.Term(this.field, this.term))
-                );
-            
+                        new RegexpQuery(new org.apache.lucene.index.Term(
+                                this.field, this.term)));
+
             // Simple term
-            return new TermsFilter(new org.apache.lucene.index.Term(this.field, this.term));
+            return new TermsFilter(new org.apache.lucene.index.Term(this.field,
+                    this.term));
         };
 
+
         public String toString () {
             Filter filter = this.toFilter();
             if (filter == null)
@@ -144,6 +165,7 @@
             return filter.toString();
         };
 
+
         public boolean isNegative () {
             return this.isNegative;
         };
@@ -159,21 +181,25 @@
         private boolean isOptional = false;
         private boolean isNegative = true;
 
+
         public boolean isNegative () {
             return this.isNegative;
         };
 
+
         public boolean isOptional () {
             return this.isOptional;
         };
 
         private ArrayList<CollectionBuilder.Interface> operands;
 
+
         public Group (boolean optional) {
             this.isOptional = optional;
             this.operands = new ArrayList<CollectionBuilder.Interface>(3);
         };
 
+
         public Group with (CollectionBuilder.Interface cb) {
             if (cb == null)
                 return this;
@@ -184,12 +210,14 @@
             return this;
         };
 
+
         public Group with (String field, String term) {
             if (field == null || term == null)
                 return this;
             return this.with(new CollectionBuilder.Term(field, term));
         };
 
+
         public Filter toFilter () {
             if (this.operands == null || this.operands.isEmpty())
                 return null;
@@ -214,6 +242,7 @@
             return bool;
         };
 
+
         public String toString () {
             Filter filter = this.toFilter();
             if (filter == null)
@@ -221,6 +250,7 @@
             return filter.toString();
         };
 
+
         public CollectionBuilder.Interface not () {
             this.isNegative = true;
             return this;
@@ -232,16 +262,19 @@
         private String field;
         private int start, end;
 
+
         public Range (String field, int start, int end) {
             this.field = field;
             this.start = start;
             this.end = end;
         };
 
+
         public boolean isNegative () {
             return this.isNegative;
         };
 
+
         public String toString () {
             Filter filter = this.toFilter();
             if (filter == null)
@@ -249,14 +282,13 @@
             return filter.toString();
         };
 
+
         public Filter toFilter () {
-            return NumericRangeFilter.newIntRange(this.field,
-                                                  this.start,
-                                                  this.end,
-                                                  true,
-                                                  true);
+            return NumericRangeFilter.newIntRange(this.field, this.start,
+                    this.end, true, true);
         };
 
+
         public CollectionBuilder.Interface not () {
             this.isNegative = true;
             return this;
diff --git a/src/main/java/de/ids_mannheim/korap/collection/CollectionBuilderLegacy.java b/src/main/java/de/ids_mannheim/korap/collection/CollectionBuilderLegacy.java
deleted file mode 100644
index 37fa50f..0000000
--- a/src/main/java/de/ids_mannheim/korap/collection/CollectionBuilderLegacy.java
+++ /dev/null
@@ -1,128 +0,0 @@
-package de.ids_mannheim.korap.collection;
-
-import de.ids_mannheim.korap.collection.BooleanFilter;
-import de.ids_mannheim.korap.collection.RegexFilter;
-import de.ids_mannheim.korap.util.QueryException;
-import de.ids_mannheim.korap.util.KrillDate;
-
-import org.apache.lucene.search.Query;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.JsonNode;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * CollectionBuilderLegacy implements a simple API for creating queries
- * constituing Virtual Collections.
- * 
- * <strong>Warning</strong>: The API is likely to change.
- * 
- * @author diewald
- */
-/*
- * Todo: WildCardFilter!
- * Todo: Support delete boolean etc.
- * Todo: Supports foundries
- */
-public class CollectionBuilderLegacy {
-    private BooleanFilter filter;
-    private String field = "tokens";
-
-    // Logger
-    private final static Logger log = LoggerFactory
-            .getLogger(CollectionBuilder.class);
-
-    // This advices the java compiler to ignore all loggings
-    public static final boolean DEBUG = false;
-
-
-    /**
-     * Construct a new CollectionBuilderLegacy object.
-     */
-    public CollectionBuilderLegacy () {
-        filter = new BooleanFilter();
-    };
-
-
-    public BooleanFilter and (String type, String ... terms) {
-        BooleanFilter bf = new BooleanFilter();
-        bf.and(type, terms);
-        return bf;
-    };
-
-
-    public BooleanFilter or (String type, String ... terms) {
-        BooleanFilter bf = new BooleanFilter();
-        bf.or(type, terms);
-        return bf;
-    };
-
-
-    public BooleanFilter and (String type, RegexFilter re) {
-        BooleanFilter bf = new BooleanFilter();
-        bf.and(type, re);
-        return bf;
-    };
-
-
-    public BooleanFilter or (String type, RegexFilter re) {
-        BooleanFilter bf = new BooleanFilter();
-        bf.or(type, re);
-        return bf;
-    };
-
-
-    public BooleanFilter since (String date) {
-        BooleanFilter bf = new BooleanFilter();
-        bf.since(date);
-        return bf;
-    };
-
-
-    public BooleanFilter till (String date) {
-        BooleanFilter bf = new BooleanFilter();
-        bf.till(date);
-        return bf;
-    };
-
-
-    public BooleanFilter date (String date) {
-        BooleanFilter bf = new BooleanFilter();
-        bf.date(date);
-        return bf;
-    };
-
-
-    public BooleanFilter between (String date1, String date2) {
-        BooleanFilter bf = new BooleanFilter();
-        bf.between(date1, date2);
-        return bf;
-    };
-
-
-    public RegexFilter re (String regex) {
-        return new RegexFilter(regex);
-    };
-
-
-    public BooleanFilter getBooleanFilter () {
-        return this.filter;
-    };
-
-
-    public void setBooleanFilter (BooleanFilter bf) {
-        this.filter = bf;
-    };
-
-
-    public Query toQuery () {
-        return this.filter.toQuery();
-    };
-
-
-    public String toString () {
-        return this.filter.toQuery().toString();
-    };
-};
diff --git a/src/main/java/de/ids_mannheim/korap/collection/FilterOperation.java b/src/main/java/de/ids_mannheim/korap/collection/FilterOperation.java
deleted file mode 100644
index 5d3be07..0000000
--- a/src/main/java/de/ids_mannheim/korap/collection/FilterOperation.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package de.ids_mannheim.korap.collection;
-
-import org.apache.lucene.search.Filter;
-
-public class FilterOperation {
-    private boolean extension;
-    public Filter filter;
-
-
-    public FilterOperation (Filter filter, boolean extension) {
-        this.extension = extension;
-        this.filter = filter;
-    };
-
-
-    public boolean isExtension () {
-        return this.extension;
-    };
-
-
-    public boolean isFilter () {
-        return !(this.extension);
-    };
-
-
-    @Override
-    public Object clone () throws CloneNotSupportedException {
-        return (Object) new FilterOperation(this.filter, this.extension);
-    };
-
-
-    @Override
-    public String toString () {
-        StringBuilder sb = new StringBuilder();
-        if (this.extension) {
-            sb.append("extend with ");
-        }
-        else {
-            sb.append("filter with ");
-        };
-        sb.append(this.filter.toString());
-        return sb.toString();
-    };
-};
diff --git a/src/main/java/de/ids_mannheim/korap/collection/RegexFilter.java b/src/main/java/de/ids_mannheim/korap/collection/RegexFilter.java
deleted file mode 100644
index c948dab..0000000
--- a/src/main/java/de/ids_mannheim/korap/collection/RegexFilter.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package de.ids_mannheim.korap.collection;
-
-import java.util.*;
-
-import org.apache.lucene.search.RegexpQuery;
-import org.apache.lucene.index.Term;
-
-/**
- * @author Nils Diewald
- * 
- *         RegexFilter implements a helper object for
- *         regular expressions used in KrillCollection
- *         constraints.
- */
-
-public class RegexFilter {
-    String regex;
-
-
-    public RegexFilter (String regex) {
-        this.regex = regex;
-    };
-
-
-    public RegexpQuery toQuery (String field) {
-        return new RegexpQuery(new Term(field, this.regex));
-    };
-};
diff --git a/src/main/java/de/ids_mannheim/korap/index/KeywordAnalyzer.java b/src/main/java/de/ids_mannheim/korap/index/KeywordAnalyzer.java
index e20af6f..0725778 100644
--- a/src/main/java/de/ids_mannheim/korap/index/KeywordAnalyzer.java
+++ b/src/main/java/de/ids_mannheim/korap/index/KeywordAnalyzer.java
@@ -10,10 +10,11 @@
 
 public class KeywordAnalyzer extends Analyzer {
 
-  @Override
-  protected TokenStreamComponents createComponents(final String fieldName, final Reader reader) {
-    final Tokenizer source = new WhitespaceTokenizer(reader);
-    TokenStream sink = new LowerCaseFilter(source);
-    return new TokenStreamComponents(source, sink);
-  };
+    @Override
+    protected TokenStreamComponents createComponents (final String fieldName,
+            final Reader reader) {
+        final Tokenizer source = new WhitespaceTokenizer(reader);
+        TokenStream sink = new LowerCaseFilter(source);
+        return new TokenStreamComponents(source, sink);
+    };
 };
diff --git a/src/main/java/de/ids_mannheim/korap/index/TextAnalyzer.java b/src/main/java/de/ids_mannheim/korap/index/TextAnalyzer.java
index bca39b5..771c6c1 100644
--- a/src/main/java/de/ids_mannheim/korap/index/TextAnalyzer.java
+++ b/src/main/java/de/ids_mannheim/korap/index/TextAnalyzer.java
@@ -10,10 +10,11 @@
 
 public class TextAnalyzer extends Analyzer {
 
-  @Override
-  protected TokenStreamComponents createComponents (final String fieldName, final Reader reader) {
-    final Tokenizer source = new StandardTokenizer(reader);
-    TokenStream sink = new LowerCaseFilter(source);
-    return new TokenStreamComponents(source, sink);
-  };
+    @Override
+    protected TokenStreamComponents createComponents (final String fieldName,
+            final Reader reader) {
+        final Tokenizer source = new StandardTokenizer(reader);
+        TokenStream sink = new LowerCaseFilter(source);
+        return new TokenStreamComponents(source, sink);
+    };
 };
diff --git a/src/main/java/de/ids_mannheim/korap/response/Match.java b/src/main/java/de/ids_mannheim/korap/response/Match.java
index b324ffc..617f07a 100644
--- a/src/main/java/de/ids_mannheim/korap/response/Match.java
+++ b/src/main/java/de/ids_mannheim/korap/response/Match.java
@@ -374,7 +374,7 @@
         this.addHighlight(new Highlight(target, target, id));
     };
 
-    
+
     /**
      * Populate document meta information with information coming from
      * the index.
diff --git a/src/main/java/de/ids_mannheim/korap/response/match/DocIdentifier.java b/src/main/java/de/ids_mannheim/korap/response/match/DocIdentifier.java
index b384222..53280c7 100644
--- a/src/main/java/de/ids_mannheim/korap/response/match/DocIdentifier.java
+++ b/src/main/java/de/ids_mannheim/korap/response/match/DocIdentifier.java
@@ -8,8 +8,8 @@
 
 public class DocIdentifier {
     protected String textSigle, // fine
-        corpusID, // LEGACY
-        docID;    // LEGACY
+            corpusID, // LEGACY
+            docID;    // LEGACY
 
 
     // Legacy
diff --git a/src/main/java/de/ids_mannheim/korap/response/match/MatchIdentifier.java b/src/main/java/de/ids_mannheim/korap/response/match/MatchIdentifier.java
index f9fdfbe..7ebf161 100644
--- a/src/main/java/de/ids_mannheim/korap/response/match/MatchIdentifier.java
+++ b/src/main/java/de/ids_mannheim/korap/response/match/MatchIdentifier.java
@@ -9,11 +9,9 @@
     private ArrayList<int[]> pos = new ArrayList<>(8);
 
     // TODO: "contains" is necessary for a compatibility bug in Kustvakt
-    Pattern idRegex = Pattern
-        .compile("^(?:match-|contains-)"
-                 + "(?:([^!]+?)[!\\.])?"
-                 + "([^!]+)-p([0-9]+)-([0-9]+)"
-                 + "((?:\\(-?[0-9]+\\)-?[0-9]+--?[0-9]+)*)" + "(?:c.+?)?$");
+    Pattern idRegex = Pattern.compile("^(?:match-|contains-)"
+            + "(?:([^!]+?)[!\\.])?" + "([^!]+)-p([0-9]+)-([0-9]+)"
+            + "((?:\\(-?[0-9]+\\)-?[0-9]+--?[0-9]+)*)" + "(?:c.+?)?$");
     Pattern posRegex = Pattern.compile("\\(([0-9]+)\\)([0-9]+)-([0-9]+)");
 
 
diff --git a/src/test/java/de/ids_mannheim/korap/benchmark/TestBenchmarkSpans.java b/src/test/java/de/ids_mannheim/korap/benchmark/TestBenchmarkSpans.java
index 4f7ba16..922792e 100644
--- a/src/test/java/de/ids_mannheim/korap/benchmark/TestBenchmarkSpans.java
+++ b/src/test/java/de/ids_mannheim/korap/benchmark/TestBenchmarkSpans.java
@@ -11,7 +11,6 @@
 import de.ids_mannheim.korap.KrillQuery;
 import de.ids_mannheim.korap.query.QueryBuilder;
 import org.apache.lucene.store.MMapDirectory;
-import de.ids_mannheim.korap.collection.BooleanFilter;
 import org.apache.lucene.search.spans.SpanQuery;
 import de.ids_mannheim.korap.query.wrap.SpanQueryWrapper;
 import de.ids_mannheim.korap.util.QueryException;
diff --git a/src/test/java/de/ids_mannheim/korap/collection/TestCollectionBuilder.java b/src/test/java/de/ids_mannheim/korap/collection/TestCollectionBuilder.java
index 9dd7baf..27a3dd7 100644
--- a/src/test/java/de/ids_mannheim/korap/collection/TestCollectionBuilder.java
+++ b/src/test/java/de/ids_mannheim/korap/collection/TestCollectionBuilder.java
@@ -20,38 +20,42 @@
     @Test
     public void builderTerm () throws IOException {
         CollectionBuilder kc = new CollectionBuilder();
-        assertEquals("author:tree",
-                     kc.term("author", "tree").toString());
+        assertEquals("author:tree", kc.term("author", "tree").toString());
     };
 
+
     @Test
     public void builderRegex () throws IOException {
         CollectionBuilder kc = new CollectionBuilder();
         assertEquals("QueryWrapperFilter(author:/tre*?/)",
-                     kc.re("author", "tre*?").toString());
+                kc.re("author", "tre*?").toString());
     };
 
+
     @Test
     public void builderDateYear () throws IOException {
         CollectionBuilder kc = new CollectionBuilder();
         assertEquals("pubDate:[20050000 TO 20059999]",
-                     kc.date("pubDate", "2005").toString());
+                kc.date("pubDate", "2005").toString());
     };
 
+
     @Test
     public void builderDateMonth () throws IOException {
         CollectionBuilder kc = new CollectionBuilder();
         assertEquals("pubDate:[20051000 TO 20051099]",
-                     kc.date("pubDate", "2005-10").toString());
+                kc.date("pubDate", "2005-10").toString());
     };
 
+
     @Test
     public void builderDateDay () throws IOException {
         CollectionBuilder kc = new CollectionBuilder();
         assertEquals("pubDate:[20051011 TO 20051011]",
-                     kc.date("pubDate", "2005-10-11").toString());
+                kc.date("pubDate", "2005-10-11").toString());
     };
 
+
     @Test
     public void builderDateBorders () throws IOException {
         CollectionBuilder kc = new CollectionBuilder();
@@ -59,109 +63,127 @@
         assertNull(kc.date("pubDate", ""));
 
         assertEquals("pubDate:[20051580 TO 20051580]",
-                     kc.date("pubDate", "2005-15-80").toString());
+                kc.date("pubDate", "2005-15-80").toString());
 
         assertNull(kc.date("pubDate", "2005-15-8"));
         assertNull(kc.date("pubDate", "2005-5-18"));
         assertNull(kc.date("pubDate", "200-05-18"));
     };
 
+
     @Test
     public void builderSince () throws IOException {
         CollectionBuilder kc = new CollectionBuilder();
         assertEquals("pubDate:[20050000 TO 99999999]",
-                     kc.since("pubDate", "2005").toString());
+                kc.since("pubDate", "2005").toString());
 
         assertEquals("pubDate:[20051000 TO 99999999]",
-                     kc.since("pubDate", "2005-10").toString());
+                kc.since("pubDate", "2005-10").toString());
 
         assertEquals("pubDate:[20051012 TO 99999999]",
-                     kc.since("pubDate", "2005-10-12").toString());
+                kc.since("pubDate", "2005-10-12").toString());
     };
 
 
     @Test
     public void builderTill () throws IOException {
         CollectionBuilder kc = new CollectionBuilder();
-        assertEquals("pubDate:[0 TO 20059999]",
-                     kc.till("pubDate", "2005").toString());
+        assertEquals("pubDate:[0 TO 20059999]", kc.till("pubDate", "2005")
+                .toString());
 
-        assertEquals("pubDate:[0 TO 20051299]",
-                     kc.till("pubDate", "2005-12").toString());
+        assertEquals("pubDate:[0 TO 20051299]", kc.till("pubDate", "2005-12")
+                .toString());
 
-        assertEquals("pubDate:[0 TO 20051204]",
-                     kc.till("pubDate", "2005-12-04").toString());
+        assertEquals("pubDate:[0 TO 20051204]", kc
+                .till("pubDate", "2005-12-04").toString());
     };
 
 
     @Test
     public void builderAndSimple () throws IOException {
         CollectionBuilder kc = new CollectionBuilder();
-        assertEquals("author:tree", kc.andGroup().with(kc.term("author", "tree")).toString());
+        assertEquals("author:tree",
+                kc.andGroup().with(kc.term("author", "tree")).toString());
     };
 
+
     @Test
     public void builderOrSimple () throws IOException {
         CollectionBuilder kc = new CollectionBuilder();
-        assertEquals("author:tree", kc.orGroup().with(kc.term("author", "tree")).toString());
+        assertEquals("author:tree", kc.orGroup()
+                .with(kc.term("author", "tree")).toString());
     };
 
+
     @Test
     public void builderAndCombined () throws IOException {
         CollectionBuilder kc = new CollectionBuilder();
-        assertEquals("AndGroup(author:tree title:name)",
-                     kc.andGroup().with(kc.term("author", "tree"))
-                     .with(kc.term("title", "name")).toString());
+        assertEquals(
+                "AndGroup(author:tree title:name)",
+                kc.andGroup().with(kc.term("author", "tree"))
+                        .with(kc.term("title", "name")).toString());
     };
 
+
     @Test
     public void builderAndNestedSimple () throws IOException {
         CollectionBuilder kc = new CollectionBuilder();
-        assertEquals("AndGroup(author:tree title:name)",
-                     kc.andGroup().with(kc.andGroup().with(kc.term("author", "tree")).with(kc.term("title", "name"))).toString());
+        assertEquals(
+                "AndGroup(author:tree title:name)",
+                kc.andGroup()
+                        .with(kc.andGroup().with(kc.term("author", "tree"))
+                                .with(kc.term("title", "name"))).toString());
     };
 
 
     @Test
     public void builderOrCombined () throws IOException {
         CollectionBuilder kc = new CollectionBuilder();
-        assertEquals("OrGroup(author:tree title:name)",
-                     kc.orGroup().with(kc.term("author", "tree"))
-                     .with(kc.term("title", "name")).toString());
+        assertEquals(
+                "OrGroup(author:tree title:name)",
+                kc.orGroup().with(kc.term("author", "tree"))
+                        .with(kc.term("title", "name")).toString());
     };
 
+
     @Test
     public void builderOrNestedSimple () throws IOException {
         CollectionBuilder kc = new CollectionBuilder();
-        assertEquals("OrGroup(author:tree title:name)",
-                     kc.orGroup().with(kc.orGroup().with(kc.term("author", "tree"))
-                                .with(kc.term("title", "name"))).toString()
-                     );
+        assertEquals(
+                "OrGroup(author:tree title:name)",
+                kc.orGroup()
+                        .with(kc.orGroup().with(kc.term("author", "tree"))
+                                .with(kc.term("title", "name"))).toString());
     };
 
+
     @Test
     public void builderGroups () throws IOException {
         CollectionBuilder kc = new CollectionBuilder();
-        String g = kc.orGroup().with(
-                                     kc.orGroup().with(kc.term("author", "tree1")).with(kc.term("title", "name1"))
-        ).with(
-               kc.andGroup().with(kc.term("author", "tree2")).with(kc.term("title", "name2"))
-               ).toString();
-        assertEquals("OrGroup(OrGroup(author:tree1 title:name1) AndGroup(author:tree2 title:name2))", g);
+        String g = kc
+                .orGroup()
+                .with(kc.orGroup().with(kc.term("author", "tree1"))
+                        .with(kc.term("title", "name1")))
+                .with(kc.andGroup().with(kc.term("author", "tree2"))
+                        .with(kc.term("title", "name2"))).toString();
+        assertEquals(
+                "OrGroup(OrGroup(author:tree1 title:name1) AndGroup(author:tree2 title:name2))",
+                g);
     };
 
+
     @Test
     public void builderNegationRoot () throws IOException {
         CollectionBuilder kc = new CollectionBuilder();
-        CollectionBuilder.Interface kbi = kc.orGroup().with(kc.term("author", "tree1")).with(kc.term("title", "name1"));
-        assertEquals(
-                     "OrGroup(author:tree1 title:name1)",
-                     kbi.toString());
+        CollectionBuilder.Interface kbi = kc.orGroup()
+                .with(kc.term("author", "tree1"))
+                .with(kc.term("title", "name1"));
+        assertEquals("OrGroup(author:tree1 title:name1)", kbi.toString());
         assertFalse(kbi.isNegative());
 
-        kbi = kc.andGroup().with(
-                                 kc.orGroup().with(kc.term("author", "tree1")).with(kc.term("title", "name1"))
-              ).not();
+        kbi = kc.andGroup()
+                .with(kc.orGroup().with(kc.term("author", "tree1"))
+                        .with(kc.term("title", "name1"))).not();
         assertEquals("OrGroup(author:tree1 title:name1)", kbi.toString());
         assertTrue(kbi.isNegative());
     };
@@ -170,8 +192,7 @@
     @Test
     public void builderNegation () throws IOException {
         CollectionBuilder kc = new CollectionBuilder();
-        CollectionBuilder.Interface kbi =
-            kc.term("author", "tree").not();
+        CollectionBuilder.Interface kbi = kc.term("author", "tree").not();
         assertEquals("author:tree", kbi.toString());
         assertTrue(kbi.isNegative());
 
@@ -184,6 +205,7 @@
         assertTrue(kbi.isNegative());
     };
 
+
     // The legacy tests were adopted from the legacy collection builder and reformuated
 
     @Test
@@ -193,14 +215,18 @@
         /*
         assertEquals("+textClass:tree", kf.and("textClass", "tree").toString());
         */
-        assertEquals("textClass:tree", kf.andGroup().with(kf.term("textClass", "tree")).toString());
+        assertEquals("textClass:tree",
+                kf.andGroup().with(kf.term("textClass", "tree")).toString());
 
         /*
         assertEquals("+textClass:tree +textClass:sport",
                 kf.and("textClass", "tree").and("textClass", "sport")
                         .toString());
         */
-        assertEquals("AndGroup(textClass:tree textClass:sport)", kf.andGroup().with(kf.term("textClass", "tree")).with(kf.term("textClass", "sport")).toString());
+        assertEquals(
+                "AndGroup(textClass:tree textClass:sport)",
+                kf.andGroup().with(kf.term("textClass", "tree"))
+                        .with(kf.term("textClass", "sport")).toString());
 
         /*
         assertEquals(
@@ -208,22 +234,34 @@
                 kf.and("textClass", "tree").and("textClass", "sport")
                         .or("textClass", "news").toString());
         */
-        assertEquals("OrGroup(AndGroup(textClass:tree textClass:sport) textClass:news)", kf.orGroup().with(kf.andGroup().with("textClass", "tree").with("textClass", "sport")).with("textClass", "news").toString());
+        assertEquals(
+                "OrGroup(AndGroup(textClass:tree textClass:sport) textClass:news)",
+                kf.orGroup()
+                        .with(kf.andGroup().with("textClass", "tree")
+                                .with("textClass", "sport"))
+                        .with("textClass", "news").toString());
 
         /*
         assertEquals("+textClass:tree +textClass:sport +textClass:news", kf
                 .and("textClass", "tree", "sport", "news").toString());
         */
-        assertEquals("AndGroup(textClass:tree textClass:sport textClass:news)", kf.andGroup().with("textClass", "tree").with("textClass", "sport").with("textClass", "news").toString());
+        assertEquals(
+                "AndGroup(textClass:tree textClass:sport textClass:news)",
+                kf.andGroup().with("textClass", "tree")
+                        .with("textClass", "sport").with("textClass", "news")
+                        .toString());
 
         /*
         assertEquals("corpusID:c-1 corpusID:c-2 corpusID:c-3",
                 kf.or("corpusID", "c-1", "c-2", "c-3").toString());
         */
-        assertEquals("OrGroup(corpusID:c-1 corpusID:c-2 corpusID:c-3)", kf.orGroup().with("corpusID", "c-1").with("corpusID", "c-2").with("corpusID", "c-3").toString());
+        assertEquals("OrGroup(corpusID:c-1 corpusID:c-2 corpusID:c-3)", kf
+                .orGroup().with("corpusID", "c-1").with("corpusID", "c-2")
+                .with("corpusID", "c-3").toString());
 
     };
 
+
     @Test
     public void LegacyRangeExample () throws IOException {
         CollectionBuilder kf = new CollectionBuilder();
@@ -232,27 +270,31 @@
                 kf.between("2003-06-04", "2003-08-99").toString());
         */
         // This will be optimized and probably crash
-        assertEquals("AndGroup(pubDate:[20030604 TO 99999999] pubDate:[0 TO 20030899])", kf.andGroup().with(kf.since("pubDate", "2003-06-04")).with(kf.till("pubDate", "2003-08-99")).toString());
+        assertEquals(
+                "AndGroup(pubDate:[20030604 TO 99999999] pubDate:[0 TO 20030899])",
+                kf.andGroup().with(kf.since("pubDate", "2003-06-04"))
+                        .with(kf.till("pubDate", "2003-08-99")).toString());
 
         /*
         assertEquals("+pubDate:[0 TO 20030604]", kf.till("2003-06-04")
                 .toString());
         */
-        assertEquals("pubDate:[0 TO 20030604]", kf.till("pubDate", "2003-06-04")
-                .toString());
+        assertEquals("pubDate:[0 TO 20030604]", kf
+                .till("pubDate", "2003-06-04").toString());
 
 
         /*
         assertEquals("+pubDate:[20030604 TO 99999999]", kf.since("2003-06-04")
                 .toString());
         */
-        assertEquals("pubDate:[20030604 TO 99999999]", kf.since("pubDate", "2003-06-04")
-                .toString());
+        assertEquals("pubDate:[20030604 TO 99999999]",
+                kf.since("pubDate", "2003-06-04").toString());
 
         /*
         assertEquals("+pubDate:20030604", kf.date("2003-06-04").toString());
         */
-        assertEquals("pubDate:[20030604 TO 20030604]", kf.date("pubDate", "2003-06-04").toString());
+        assertEquals("pubDate:[20030604 TO 20030604]",
+                kf.date("pubDate", "2003-06-04").toString());
     };
 
 
@@ -263,57 +305,66 @@
         assertEquals("+pubDate:[20050000 TO 20099999]",
                 kf.between("2005", "2009").toString());
         */
-        assertEquals("AndGroup(pubDate:[20050000 TO 99999999] pubDate:[0 TO 20099999])",
-                     kf.between("pubDate", "2005", "2009").toString());
+        assertEquals(
+                "AndGroup(pubDate:[20050000 TO 99999999] pubDate:[0 TO 20099999])",
+                kf.between("pubDate", "2005", "2009").toString());
 
         /*
         assertEquals("+pubDate:[20051000 TO 20090899]",
                 kf.between("200510", "200908").toString());
         */
-        assertEquals("AndGroup(pubDate:[20051000 TO 99999999] pubDate:[0 TO 20090899])",
-                     kf.between("pubDate", "200510", "200908").toString());
+        assertEquals(
+                "AndGroup(pubDate:[20051000 TO 99999999] pubDate:[0 TO 20090899])",
+                kf.between("pubDate", "200510", "200908").toString());
 
         /*
         assertEquals("+pubDate:[20051000 TO 20090899]",
                 kf.between("2005-10", "2009-08").toString());
         */
-        assertEquals("AndGroup(pubDate:[20051000 TO 99999999] pubDate:[0 TO 20090899])",
-                     kf.between("pubDate", "2005-10", "2009-08").toString());
+        assertEquals(
+                "AndGroup(pubDate:[20051000 TO 99999999] pubDate:[0 TO 20090899])",
+                kf.between("pubDate", "2005-10", "2009-08").toString());
 
 
         /*
         assertEquals("+pubDate:[20051006 TO 20090803]",
                 kf.between("2005-1006", "2009-0803").toString());
          */
-        assertEquals("AndGroup(pubDate:[20051006 TO 99999999] pubDate:[0 TO 20090803])",
-                     kf.between("pubDate", "2005-1006", "2009-0803").toString());
+        assertEquals(
+                "AndGroup(pubDate:[20051006 TO 99999999] pubDate:[0 TO 20090803])",
+                kf.between("pubDate", "2005-1006", "2009-0803").toString());
 
         /*
         assertEquals("+pubDate:[20051006 TO 20090803]",
                 kf.between("2005-10-06", "2009-08-03").toString());
         */
-        assertEquals("AndGroup(pubDate:[20051006 TO 99999999] pubDate:[0 TO 20090803])",
-                     kf.between("pubDate", "2005-10-06", "2009-08-03").toString());
+        assertEquals(
+                "AndGroup(pubDate:[20051006 TO 99999999] pubDate:[0 TO 20090803])",
+                kf.between("pubDate", "2005-10-06", "2009-08-03").toString());
 
         /*
         assertEquals("+pubDate:[0 TO 20059999]", kf.till("2005").toString());
         */
-        assertEquals("pubDate:[0 TO 20059999]", kf.till("pubDate", "2005").toString());
+        assertEquals("pubDate:[0 TO 20059999]", kf.till("pubDate", "2005")
+                .toString());
 
         /*
         assertEquals("+pubDate:[0 TO 20051099]", kf.till("200510").toString());
         */
-        assertEquals("pubDate:[0 TO 20051099]", kf.till("pubDate", "200510").toString());
+        assertEquals("pubDate:[0 TO 20051099]", kf.till("pubDate", "200510")
+                .toString());
 
         /*
         assertEquals("+pubDate:[0 TO 20051099]", kf.till("200510").toString());
         */
-        assertEquals("pubDate:[0 TO 20051099]", kf.till("pubDate", "200510").toString());
+        assertEquals("pubDate:[0 TO 20051099]", kf.till("pubDate", "200510")
+                .toString());
 
         /*
         assertEquals("+pubDate:[0 TO 20051099]", kf.till("2005-10").toString());
         */
-        assertEquals("pubDate:[0 TO 20051099]", kf.till("pubDate", "2005-10").toString());
+        assertEquals("pubDate:[0 TO 20051099]", kf.till("pubDate", "2005-10")
+                .toString());
 
         /*
         assertEquals("+pubDate:[0 TO 20051006]", kf.till("2005-1006")
@@ -326,76 +377,78 @@
         assertEquals("+pubDate:[0 TO 20051006]", kf.till("2005-10-06")
                 .toString());
         */
-        assertEquals("pubDate:[0 TO 20051006]", kf.till("pubDate", "2005-10-06")
-                .toString());
+        assertEquals("pubDate:[0 TO 20051006]", kf
+                .till("pubDate", "2005-10-06").toString());
 
         /*
         assertEquals("+pubDate:[20050000 TO 99999999]", kf.since("2005")
                 .toString());
         */
-        assertEquals("pubDate:[20050000 TO 99999999]", kf.since("pubDate", "2005")
-                .toString());
+        assertEquals("pubDate:[20050000 TO 99999999]",
+                kf.since("pubDate", "2005").toString());
 
         /*
         assertEquals("+pubDate:[20051000 TO 99999999]", kf.since("200510")
                 .toString());
         */
-        assertEquals("pubDate:[20051000 TO 99999999]", kf.since("pubDate", "200510")
-                .toString());
+        assertEquals("pubDate:[20051000 TO 99999999]",
+                kf.since("pubDate", "200510").toString());
 
 
         /*
         assertEquals("+pubDate:[20051000 TO 99999999]", kf.since("2005-10")
                 .toString());
         */
-        assertEquals("pubDate:[20051000 TO 99999999]", kf.since("pubDate", "2005-10")
-                .toString());
+        assertEquals("pubDate:[20051000 TO 99999999]",
+                kf.since("pubDate", "2005-10").toString());
 
         /*
         assertEquals("+pubDate:[20051006 TO 99999999]", kf.since("2005-1006")
                 .toString());
         */
-        assertEquals("pubDate:[20051006 TO 99999999]", kf.since("pubDate", "2005-1006")
-                .toString());
+        assertEquals("pubDate:[20051006 TO 99999999]",
+                kf.since("pubDate", "2005-1006").toString());
 
         /*
         assertEquals("+pubDate:[20051006 TO 99999999]", kf.since("2005-10-06")
                 .toString());
         */
-        assertEquals("pubDate:[20051006 TO 99999999]", kf.since("pubDate", "2005-10-06")
-                .toString());
+        assertEquals("pubDate:[20051006 TO 99999999]",
+                kf.since("pubDate", "2005-10-06").toString());
 
         /*
         assertEquals("+pubDate:[20050000 TO 20059999]", kf.date("2005")
                 .toString());
         */
-        assertEquals("pubDate:[20050000 TO 20059999]", kf.date("pubDate", "2005")
-                .toString());
+        assertEquals("pubDate:[20050000 TO 20059999]",
+                kf.date("pubDate", "2005").toString());
 
 
         /*
         assertEquals("+pubDate:[20051000 TO 20051099]", kf.date("200510")
                 .toString());
         */
-        assertEquals("pubDate:[20051000 TO 20051099]", kf.date("pubDate", "200510")
-                .toString());
+        assertEquals("pubDate:[20051000 TO 20051099]",
+                kf.date("pubDate", "200510").toString());
 
         /*
         assertEquals("+pubDate:[20051000 TO 20051099]", kf.date("2005-10")
                 .toString());
         */
-        assertEquals("pubDate:[20051000 TO 20051099]", kf.date("pubDate", "2005-10")
-                .toString());
+        assertEquals("pubDate:[20051000 TO 20051099]",
+                kf.date("pubDate", "2005-10").toString());
 
         /*
         assertEquals("+pubDate:20051006", kf.date("2005-1006").toString());
         */
-        assertEquals("pubDate:[20051006 TO 20051006]", kf.date("pubDate", "2005-1006").toString());
+        assertEquals("pubDate:[20051006 TO 20051006]",
+                kf.date("pubDate", "2005-1006").toString());
 
         /*
         assertEquals("+pubDate:20051006", kf.date("2005-10-06").toString());
         */
-        assertEquals("pubDate:[20051006 TO 20051006]", kf.date("pubDate", "2005-10-06").toString());
+        assertEquals("pubDate:[20051006 TO 20051006]",
+                kf.date("pubDate", "2005-10-06").toString());
     };
 
 
diff --git a/src/test/java/de/ids_mannheim/korap/collection/TestCollectionBuilderLegacy.java b/src/test/java/de/ids_mannheim/korap/collection/TestCollectionBuilderLegacy.java
deleted file mode 100644
index a52a575..0000000
--- a/src/test/java/de/ids_mannheim/korap/collection/TestCollectionBuilderLegacy.java
+++ /dev/null
@@ -1,110 +0,0 @@
-package de.ids_mannheim.korap.collection;
-
-import java.util.*;
-import java.io.*;
-
-import org.apache.lucene.util.Version;
-import org.apache.lucene.util.BytesRef;
-import org.apache.lucene.util.Bits;
-
-import static org.junit.Assert.*;
-import org.junit.Test;
-import org.junit.Ignore;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-import de.ids_mannheim.korap.collection.CollectionBuilderLegacy;
-
-@RunWith(JUnit4.class)
-public class TestCollectionBuilderLegacy {
-
-    @Test
-    @Ignore
-    public void filterExample () throws IOException {
-        CollectionBuilderLegacy kf = new CollectionBuilderLegacy();
-
-        assertEquals("+textClass:tree", kf.and("textClass", "tree").toString());
-        assertEquals("+textClass:tree +textClass:sport",
-                kf.and("textClass", "tree").and("textClass", "sport")
-                        .toString());
-        assertEquals(
-                "+textClass:tree +textClass:sport textClass:news",
-                kf.and("textClass", "tree").and("textClass", "sport")
-                        .or("textClass", "news").toString());
-        assertEquals("+textClass:tree +textClass:sport +textClass:news", kf
-                .and("textClass", "tree", "sport", "news").toString());
-
-        assertEquals("corpusID:c-1 corpusID:c-2 corpusID:c-3",
-                kf.or("corpusID", "c-1", "c-2", "c-3").toString());
-    };
-
-
-    @Test
-    @Ignore
-    public void rangeExample () throws IOException {
-        CollectionBuilderLegacy kf = new CollectionBuilderLegacy();
-        assertEquals("+pubDate:[20030604 TO 20030899]",
-                kf.between("2003-06-04", "2003-08-99").toString());
-        assertEquals("+pubDate:[0 TO 20030604]", kf.till("2003-06-04")
-                .toString());
-        assertEquals("+pubDate:[20030604 TO 99999999]", kf.since("2003-06-04")
-                .toString());
-        assertEquals("+pubDate:20030604", kf.date("2003-06-04").toString());
-    };
-
-
-    @Test
-    @Ignore
-    public void rangeLimited () throws IOException {
-        CollectionBuilderLegacy kf = new CollectionBuilderLegacy();
-        assertEquals("+pubDate:[20050000 TO 20099999]",
-                kf.between("2005", "2009").toString());
-        assertEquals("+pubDate:[20051000 TO 20090899]",
-                kf.between("200510", "200908").toString());
-        assertEquals("+pubDate:[20051000 TO 20090899]",
-                kf.between("2005-10", "2009-08").toString());
-        assertEquals("+pubDate:[20051006 TO 20090803]",
-                kf.between("2005-1006", "2009-0803").toString());
-        assertEquals("+pubDate:[20051006 TO 20090803]",
-                kf.between("2005-10-06", "2009-08-03").toString());
-
-        assertEquals("+pubDate:[0 TO 20059999]", kf.till("2005").toString());
-        assertEquals("+pubDate:[0 TO 20051099]", kf.till("200510").toString());
-        assertEquals("+pubDate:[0 TO 20051099]", kf.till("2005-10").toString());
-        assertEquals("+pubDate:[0 TO 20051006]", kf.till("2005-1006")
-                .toString());
-        assertEquals("+pubDate:[0 TO 20051006]", kf.till("2005-10-06")
-                .toString());
-
-        assertEquals("+pubDate:[20050000 TO 99999999]", kf.since("2005")
-                .toString());
-        assertEquals("+pubDate:[20051000 TO 99999999]", kf.since("200510")
-                .toString());
-        assertEquals("+pubDate:[20051000 TO 99999999]", kf.since("2005-10")
-                .toString());
-        assertEquals("+pubDate:[20051006 TO 99999999]", kf.since("2005-1006")
-                .toString());
-        assertEquals("+pubDate:[20051006 TO 99999999]", kf.since("2005-10-06")
-                .toString());
-
-        assertEquals("+pubDate:[20050000 TO 20059999]", kf.date("2005")
-                .toString());
-        assertEquals("+pubDate:[20051000 TO 20051099]", kf.date("200510")
-                .toString());
-        assertEquals("+pubDate:[20051000 TO 20051099]", kf.date("2005-10")
-                .toString());
-        assertEquals("+pubDate:20051006", kf.date("2005-1006").toString());
-        assertEquals("+pubDate:20051006", kf.date("2005-10-06").toString());
-    };
-
-
-    @Test
-    @Ignore
-    public void rangeFailure () throws IOException {
-        CollectionBuilderLegacy kf = new CollectionBuilderLegacy();
-        assertEquals("", kf.between("aaaa-bb-cc", "aaaabbcc").toString());
-        assertEquals("", kf.till("aaaa-bb-cc").toString());
-        assertEquals("", kf.since("aaaa-bb-cc").toString());
-        assertEquals("", kf.date("aaaa-bb-cc").toString());
-    };
-};
diff --git a/src/test/java/de/ids_mannheim/korap/collection/TestKrillCollectionIndex.java b/src/test/java/de/ids_mannheim/korap/collection/TestKrillCollectionIndex.java
index 5fe41bf..932426a 100644
--- a/src/test/java/de/ids_mannheim/korap/collection/TestKrillCollectionIndex.java
+++ b/src/test/java/de/ids_mannheim/korap/collection/TestKrillCollectionIndex.java
@@ -1,4 +1,5 @@
 package de.ids_mannheim.korap.collection;
+
 import java.io.IOException;
 
 import de.ids_mannheim.korap.KrillIndex;
@@ -10,7 +11,6 @@
 import de.ids_mannheim.korap.KrillQuery;
 import de.ids_mannheim.korap.query.QueryBuilder;
 
-
 import org.apache.lucene.analysis.Analyzer;
 import org.apache.lucene.analysis.TokenStream;
 import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
@@ -20,8 +20,6 @@
 import org.apache.lucene.search.spans.SpanTermQuery;
 import org.apache.lucene.search.spans.SpanQuery;
 
-
-
 import static org.junit.Assert.*;
 import org.junit.Test;
 import org.junit.Ignore;
@@ -32,6 +30,7 @@
 public class TestKrillCollectionIndex {
     private KrillIndex ki;
 
+
     @Test
     public void testIndexWithCollectionBuilder () throws IOException {
         ki = new KrillIndex();
@@ -65,47 +64,57 @@
         assertEquals(1, kcn.docCount());
 
         // Simple orGroup tests
-        kcn.fromBuilder(cb.orGroup().with(cb.term("author", "Frank")).with(cb.term("author", "Michael")));
+        kcn.fromBuilder(cb.orGroup().with(cb.term("author", "Frank"))
+                .with(cb.term("author", "Michael")));
         assertEquals(1, kcn.docCount());
 
-        kcn.fromBuilder(cb.orGroup().with(cb.term("author", "Frank")).with(cb.term("author", "Sebastian")));
+        kcn.fromBuilder(cb.orGroup().with(cb.term("author", "Frank"))
+                .with(cb.term("author", "Sebastian")));
         assertEquals(2, kcn.docCount());
 
         kcn.fromBuilder(cb.orGroup().with(cb.term("author", "Frank"))
-                        .with(cb.term("author", "Sebastian"))
-                        .with(cb.term("author", "Peter")));
+                .with(cb.term("author", "Sebastian"))
+                .with(cb.term("author", "Peter")));
         assertEquals(3, kcn.docCount());
 
         kcn.fromBuilder(cb.orGroup().with(cb.term("author", "Huhu"))
-                        .with(cb.term("author", "Haha"))
-                        .with(cb.term("author", "Hehe")));
+                .with(cb.term("author", "Haha"))
+                .with(cb.term("author", "Hehe")));
         assertEquals(0, kcn.docCount());
 
         // Multi field orGroup tests
-        kcn.fromBuilder(cb.orGroup().with(cb.term("ID", "doc-1")).with(cb.term("author", "Peter")));
+        kcn.fromBuilder(cb.orGroup().with(cb.term("ID", "doc-1"))
+                .with(cb.term("author", "Peter")));
         assertEquals(2, kcn.docCount());
 
-        kcn.fromBuilder(cb.orGroup().with(cb.term("ID", "doc-1")).with(cb.term("author", "Frank")));
+        kcn.fromBuilder(cb.orGroup().with(cb.term("ID", "doc-1"))
+                .with(cb.term("author", "Frank")));
         assertEquals(1, kcn.docCount());
 
-        kcn.fromBuilder(cb.orGroup().with(cb.term("ID", "doc-1")).with(cb.term("author", "Michael")));
+        kcn.fromBuilder(cb.orGroup().with(cb.term("ID", "doc-1"))
+                .with(cb.term("author", "Michael")));
         assertEquals(1, kcn.docCount());
 
         // Simple andGroup tests
-        kcn.fromBuilder(cb.andGroup().with(cb.term("author", "Frank")).with(cb.term("author", "Michael")));
+        kcn.fromBuilder(cb.andGroup().with(cb.term("author", "Frank"))
+                .with(cb.term("author", "Michael")));
         assertEquals(0, kcn.docCount());
 
-        kcn.fromBuilder(cb.andGroup().with(cb.term("ID", "doc-1")).with(cb.term("author", "Frank")));
+        kcn.fromBuilder(cb.andGroup().with(cb.term("ID", "doc-1"))
+                .with(cb.term("author", "Frank")));
         assertEquals(1, kcn.docCount());
 
         // andGroup in keyword field test
-        kcn.fromBuilder(cb.andGroup().with(cb.term("textClass", "reisen")).with(cb.term("textClass", "finanzen")));
+        kcn.fromBuilder(cb.andGroup().with(cb.term("textClass", "reisen"))
+                .with(cb.term("textClass", "finanzen")));
         assertEquals(1, kcn.docCount());
 
-        kcn.fromBuilder(cb.andGroup().with(cb.term("textClass", "reisen")).with(cb.term("textClass", "kultur")));
+        kcn.fromBuilder(cb.andGroup().with(cb.term("textClass", "reisen"))
+                .with(cb.term("textClass", "kultur")));
         assertEquals(2, kcn.docCount());
 
-        kcn.fromBuilder(cb.andGroup().with(cb.term("textClass", "finanzen")).with(cb.term("textClass", "kultur")));
+        kcn.fromBuilder(cb.andGroup().with(cb.term("textClass", "finanzen"))
+                .with(cb.term("textClass", "kultur")));
         assertEquals(0, kcn.docCount());
 
         kcn.fromBuilder(cb.term("text", "mann"));
@@ -115,6 +124,7 @@
         assertEquals(1, kcn.docCount());
     };
 
+
     @Test
     public void testIndexWithNegation () throws IOException {
         ki = new KrillIndex();
@@ -136,18 +146,17 @@
         assertEquals(1, kcn.docCount());
 
         // orGroup with simple Negation
-        kcn.fromBuilder(
-          cb.orGroup().with(cb.term("textClass", "kultur").not()).with(cb.term("author", "Peter"))
-        );
+        kcn.fromBuilder(cb.orGroup().with(cb.term("textClass", "kultur").not())
+                .with(cb.term("author", "Peter")));
         assertEquals(2, kcn.docCount());
 
-        kcn.fromBuilder(
-          cb.orGroup().with(cb.term("textClass", "kultur").not()).with(cb.term("author", "Sebastian"))
-        );
+        kcn.fromBuilder(cb.orGroup().with(cb.term("textClass", "kultur").not())
+                .with(cb.term("author", "Sebastian")));
         assertEquals(1, kcn.docCount());
-        
+
     };
 
+
     @Test
     public void testIndexWithMultipleCommitsAndDeletes () throws IOException {
         ki = new KrillIndex();
@@ -206,6 +215,7 @@
         assertEquals(3, kcn.docCount());
     };
 
+
     @Test
     public void testIndexStream () throws IOException {
         ki = new KrillIndex();
@@ -215,8 +225,8 @@
         Analyzer ana = new TextAnalyzer();
         TokenStream ts = fd.doc.getField("text").tokenStream(ana, null);
 
-        CharTermAttribute charTermAttribute =
-            ts.addAttribute(CharTermAttribute.class);
+        CharTermAttribute charTermAttribute = ts
+                .addAttribute(CharTermAttribute.class);
         ts.reset();
 
         ts.incrementToken();
@@ -235,6 +245,7 @@
         assertEquals("straße", charTermAttribute.toString());
     };
 
+
     @Test
     public void testIndexWithDateRanges () throws IOException {
         ki = new KrillIndex();
@@ -353,7 +364,9 @@
                 "freizeit-unterhaltung"));
         */
 
-        kc.fromBuilder(kc.build().andGroup().with(kc.build().term("textClass", "reisen")).with(kc.build().term("textClass", "freizeit-unterhaltung")));
+        kc.fromBuilder(kc.build().andGroup()
+                .with(kc.build().term("textClass", "reisen"))
+                .with(kc.build().term("textClass", "freizeit-unterhaltung")));
 
         assertEquals("Documents", 5, kc.numberOf("documents"));
         assertEquals("Tokens", 1678, kc.numberOf("tokens"));
@@ -393,7 +406,8 @@
         QueryBuilder kq = new QueryBuilder("tokens");
         SpanQuery query = kq.seg("opennlp/p:NN").with("tt/p:NN").toQuery();
 
-        Result kr = ki.search(kc, query, 0, (short) 20, true, (short) 5, true, (short) 5);
+        Result kr = ki.search(kc, query, 0, (short) 20, true, (short) 5, true,
+                (short) 5);
         assertEquals(kr.getTotalResults(), 70);
 
 
@@ -444,7 +458,9 @@
         kc.filter(kf.and("textClass", "reisen").and("textClass",
                 "freizeit-unterhaltung"));
         */
-        kc.filter(kc.build().andGroup().with(kc.build().term("textClass", "reisen")).with(kc.build().term("textClass", "freizeit-unterhaltung")));
+        kc.filter(kc.build().andGroup()
+                .with(kc.build().term("textClass", "reisen"))
+                .with(kc.build().term("textClass", "freizeit-unterhaltung")));
 
         assertEquals("Documents", 5, kc.numberOf("documents"));
         assertEquals("Tokens", 1678, kc.numberOf("tokens"));
@@ -474,7 +490,8 @@
         QueryBuilder kq = new QueryBuilder("tokens");
         SpanQuery query = kq.seg("opennlp/p:NN").with("tt/p:NN").toQuery();
 
-        Result kr = ki.search(kc, query, 0, (short) 20, true, (short) 5, true, (short) 5);
+        Result kr = ki.search(kc, query, 0, (short) 20, true, (short) 5, true,
+                (short) 5);
         assertEquals(kr.getTotalResults(), 70);
 
         // kc.extend(kf.and("textClass", "uninteresting"));
@@ -514,6 +531,7 @@
         assertEquals("Paragraphs", 48, kc.numberOf("paragraphs"));
     };
 
+
     @Test
     public void filterExample2Legacy () throws Exception {
 
@@ -544,7 +562,8 @@
 
         KrillCollection kc = new KrillCollection(ki);
         CollectionBuilder cb = kc.build();
-        kc.filter(cb.andGroup().with(cb.term("textClass", "reisen")).with(cb.term("textClass","freizeit-unterhaltung")));
+        kc.filter(cb.andGroup().with(cb.term("textClass", "reisen"))
+                .with(cb.term("textClass", "freizeit-unterhaltung")));
 
         assertEquals("Documents", 5, kc.numberOf("documents"));
         assertEquals("Tokens", 1678, kc.numberOf("tokens"));
@@ -557,7 +576,8 @@
         SpanQuery query = kq.seg("opennlp/p:NN").with("tt/p:NN").toQuery();
 
 
-        Result kr = ki.search(kc, query, 0, (short) 20, true, (short) 5, true, (short) 5);
+        Result kr = ki.search(kc, query, 0, (short) 20, true, (short) 5, true,
+                (short) 5);
         assertEquals(kr.getTotalResults(), 369);
 
         // kc.filter(kf.and("corpusID", "QQQ"));
@@ -568,7 +588,8 @@
         assertEquals("Sentences", 0, kc.numberOf("sentences"));
         assertEquals("Paragraphs", 0, kc.numberOf("paragraphs"));
 
-        kr = ki.search(kc, query, 0, (short) 20, true, (short) 5, true, (short) 5);
+        kr = ki.search(kc, query, 0, (short) 20, true, (short) 5, true,
+                (short) 5);
         assertEquals(kr.getTotalResults(), 0);
     };
 
@@ -612,6 +633,7 @@
         assertEquals((long) 39, kr.getTotalResults());
     };
 
+
     @Test
     public void uidCollectionWithDeletions () throws IOException {
 
@@ -665,6 +687,7 @@
         return fd;
     };
 
+
     private FieldDocument createDoc2 () {
         FieldDocument fd = new FieldDocument();
         fd.addString("ID", "doc-2");
@@ -675,6 +698,7 @@
         return fd;
     };
 
+
     private FieldDocument createDoc3 () {
         FieldDocument fd = new FieldDocument();
         fd.addString("ID", "doc-3");
diff --git a/src/test/java/de/ids_mannheim/korap/collection/TestKrillCollectionJSON.java b/src/test/java/de/ids_mannheim/korap/collection/TestKrillCollectionJSON.java
index a504bf2..2736722 100644
--- a/src/test/java/de/ids_mannheim/korap/collection/TestKrillCollectionJSON.java
+++ b/src/test/java/de/ids_mannheim/korap/collection/TestKrillCollectionJSON.java
@@ -29,8 +29,7 @@
     public void collection1 () {
         String metaQuery = _getJSONString("collection_1.jsonld");
         KrillCollection kc = new KrillCollection(metaQuery);
-        assertEquals(kc.toString(),
-                "pubDate:[20000101 TO 20000101]");
+        assertEquals(kc.toString(), "pubDate:[20000101 TO 20000101]");
     };
 
 
@@ -55,7 +54,8 @@
     public void collection5 () {
         String metaQuery = _getJSONString("collection_5.jsonld");
         KrillCollection kc = new KrillCollection(metaQuery);
-        assertEquals(kc.toString(), "OrGroup(pubDate:[19900000 TO 99999999] title:Mannheim)");
+        assertEquals(kc.toString(),
+                "OrGroup(pubDate:[19900000 TO 99999999] title:Mannheim)");
     };
 
 
@@ -66,8 +66,8 @@
         assertFalse(ks.hasErrors());
         assertFalse(ks.hasWarnings());
         assertFalse(ks.hasMessages());
-        assertEquals("QueryWrapperFilter(author:/Goethe/)", ks
-                .getCollection().toString());
+        assertEquals("QueryWrapperFilter(author:/Goethe/)", ks.getCollection()
+                .toString());
     };
 
 
@@ -78,8 +78,8 @@
         assertFalse(ks.hasErrors());
         assertFalse(ks.hasWarnings());
         assertFalse(ks.hasMessages());
-        assertEquals("-QueryWrapperFilter(author:/Goethe/)", ks
-                .getCollection().toString());
+        assertEquals("-QueryWrapperFilter(author:/Goethe/)", ks.getCollection()
+                .toString());
     };
 
 
@@ -90,8 +90,7 @@
         assertFalse(ks.hasErrors());
         assertFalse(ks.hasWarnings());
         assertFalse(ks.hasMessages());
-        assertEquals("-author:Goethe", ks
-                .getCollection().toString());
+        assertEquals("-author:Goethe", ks.getCollection().toString());
     };
 
 
@@ -166,9 +165,12 @@
         */
 
         // This will and should fail on optimization
-        assertEquals("OrGroup(AndGroup(textClass:wissenschaft AndGroup(pubPlace:Erfurt author:Hesse)) AndGroup(AndGroup(pubDate:[20110429 TO 99999999] pubDate:[0 TO 20131231]) textClass:freizeit))", kc.toString());
+        assertEquals(
+                "OrGroup(AndGroup(textClass:wissenschaft AndGroup(pubPlace:Erfurt author:Hesse)) AndGroup(AndGroup(pubDate:[20110429 TO 99999999] pubDate:[0 TO 20131231]) textClass:freizeit))",
+                kc.toString());
     };
 
+
     @Test
     public void metaQuery2Legacy () {
         String metaQuery = getString(getClass().getResource(
@@ -180,7 +182,8 @@
                 "filter with QueryWrapperFilter(+(+author:Hesse +pubDate:[0 TO 20131205]))",
                 kc.getFilter(0).toString());
         */
-        assertEquals("AndGroup(author:Hesse pubDate:[0 TO 20131205])", kc.toString());
+        assertEquals("AndGroup(author:Hesse pubDate:[0 TO 20131205])",
+                kc.toString());
     };
 
 
@@ -196,7 +199,9 @@
                      "filter with QueryWrapperFilter(+(+pubDate:[20000101 TO 99999999] +pubDate:[0 TO 20131231]))",
                 kc.getFilter(0).toString());
         */
-        assertEquals("AndGroup(pubDate:[20000101 TO 99999999] pubDate:[0 TO 20131231])", kc.toString());
+        assertEquals(
+                "AndGroup(pubDate:[20000101 TO 99999999] pubDate:[0 TO 20131231])",
+                kc.toString());
     };
 
 
@@ -215,7 +220,9 @@
                 kc.getFilter(1).toString());
         */
         // TODO: This is subject to optimization and may change in further versions
-        assertEquals("AndGroup(OrGroup(corpusID:c-1 corpusID:c-2) AndGroup(corpusID:d-1 corpusID:d-2))", kc.toString());
+        assertEquals(
+                "AndGroup(OrGroup(corpusID:c-1 corpusID:c-2) AndGroup(corpusID:d-1 corpusID:d-2))",
+                kc.toString());
     };
 
 
diff --git a/src/test/java/de/ids_mannheim/korap/collection/TestKrillCollectionJSONLegacy.java b/src/test/java/de/ids_mannheim/korap/collection/TestKrillCollectionJSONLegacy.java
deleted file mode 100644
index d9a8cff..0000000
--- a/src/test/java/de/ids_mannheim/korap/collection/TestKrillCollectionJSONLegacy.java
+++ /dev/null
@@ -1,91 +0,0 @@
-package de.ids_mannheim.korap.collection;
-
-import java.util.*;
-import java.io.*;
-
-import de.ids_mannheim.korap.KrillCollectionLegacy;
-
-import static de.ids_mannheim.korap.TestSimple.*;
-
-import static org.junit.Assert.*;
-import org.junit.Test;
-import org.junit.Ignore;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-@RunWith(JUnit4.class)
-public class TestKrillCollectionJSONLegacy {
-
-    @Test
-    @Ignore
-    public void metaQuery1 () {
-        String metaQuery = getString(getClass().getResource(
-                "/queries/metaquery.jsonld").getFile());
-        KrillCollectionLegacy kc = new KrillCollectionLegacy(metaQuery);
-
-        assertEquals("filter with QueryWrapperFilter(+textClass:wissenschaft)",
-                kc.getFilter(0).toString());
-        assertEquals(
-                "filter with QueryWrapperFilter(+(+pubPlace:Erfurt +author:Hesse))",
-                kc.getFilter(1).toString());
-        assertEquals(
-                "extend with QueryWrapperFilter(+(+pubDate:[20110429 TO 20131231] +textClass:freizeit))",
-                kc.getFilter(2).toString());
-        assertEquals(3, kc.getCount());
-    };
-
-
-    @Test
-    @Ignore
-    public void metaQuery2 () {
-        String metaQuery = getString(getClass().getResource(
-                "/queries/metaquery2.jsonld").getFile());
-        KrillCollectionLegacy kc = new KrillCollectionLegacy(metaQuery);
-        assertEquals(1, kc.getCount());
-        assertEquals(
-                "filter with QueryWrapperFilter(+(+author:Hesse +pubDate:[0 TO 20131205]))",
-                kc.getFilter(0).toString());
-    };
-
-
-    @Test
-    @Ignore
-    public void metaQuery3 () {
-        String metaQuery = getString(getClass().getResource(
-                "/queries/metaquery4.jsonld").getFile());
-        KrillCollectionLegacy kc = new KrillCollectionLegacy(metaQuery);
-        assertEquals(1, kc.getCount());
-        assertEquals(
-                     // "filter with QueryWrapperFilter(+pubDate:[20000101 TO 20131231])"
-                     "filter with QueryWrapperFilter(+(+pubDate:[20000101 TO 99999999] +pubDate:[0 TO 20131231]))",
-                kc.getFilter(0).toString());
-    };
-
-
-    @Test
-    @Ignore
-    public void metaQuery7 () {
-        String metaQuery = getString(getClass().getResource(
-                "/queries/metaquery7.jsonld").getFile());
-        KrillCollectionLegacy kc = new KrillCollectionLegacy(metaQuery);
-        assertEquals(2, kc.getCount());
-        assertEquals(
-                "filter with QueryWrapperFilter(+(corpusID:c-1 corpusID:c-2))",
-                kc.getFilter(0).toString());
-        assertEquals(
-                "filter with QueryWrapperFilter(+(+corpusID:d-1 +corpusID:d-2))",
-                kc.getFilter(1).toString());
-    };
-
-
-    @Test
-    @Ignore
-    public void metaQuery9 () {
-        String metaQuery = getString(getClass().getResource(
-                "/queries/metaquery9.jsonld").getFile());
-        KrillCollectionLegacy kc = new KrillCollectionLegacy(metaQuery);
-        assertEquals(1, kc.getCount());
-        assertEquals("filter with QueryWrapperFilter(+corpusID:WPD)", kc
-                .getFilter(0).toString());
-    };
-};
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestMatchIdentifier.java b/src/test/java/de/ids_mannheim/korap/index/TestMatchIdentifier.java
index 49f9d8c..3f651b5 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestMatchIdentifier.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestMatchIdentifier.java
@@ -85,8 +85,7 @@
         assertEquals(null, id.getTextSigle());
         assertEquals(id.toString(), "match-c1!d1-p4-20(5)7-8(2)3-4(4)7-8");
 
-        id = new MatchIdentifier(
-                "match-GOE!GOE_AGF.02286-p2105-2106");
+        id = new MatchIdentifier("match-GOE!GOE_AGF.02286-p2105-2106");
         assertEquals(2105, id.getStartPos());
         assertEquals(2106, id.getEndPos());
         assertEquals(null, id.getCorpusID());
@@ -95,6 +94,7 @@
         assertEquals("match-GOE_AGF.02286-p2105-2106", id.toString());
     };
 
+
     @Test
     public void posIdentifierExample1 () throws IOException {
         PosIdentifier id = new PosIdentifier();
@@ -255,22 +255,15 @@
                 km.getSnippetHTML());
     };
 
+
     @Test
     public void indexNewStructure () throws IOException, QueryException {
         KrillIndex ki = new KrillIndex();
         ki.addDoc(getClass().getResourceAsStream("/goe/AGX-00002.json"), false);
         ki.commit();
 
-        Match km = ki.getMatchInfo(
-                                   "match-GOE!GOE_AGX.00002-p210-211",
-                                   "tokens",
-                                   true,
-                                   (String) null,
-                                   (String) null,
-                                   true,
-                                   true,
-                                   true
-                                   );
+        Match km = ki.getMatchInfo("match-GOE!GOE_AGX.00002-p210-211",
+                "tokens", true, (String) null, (String) null, true, true, true);
 
         JsonNode res = mapper.readTree(km.toJsonString());
         assertEquals("tokens", res.at("/field").asText());
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestWPDIndex.java b/src/test/java/de/ids_mannheim/korap/index/TestWPDIndex.java
index 603cbbc..3b96e13 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestWPDIndex.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestWPDIndex.java
@@ -19,7 +19,6 @@
 import de.ids_mannheim.korap.response.Match;
 import de.ids_mannheim.korap.response.Result;
 import de.ids_mannheim.korap.Krill;
-import de.ids_mannheim.korap.collection.BooleanFilter;
 import de.ids_mannheim.korap.query.DistanceConstraint;
 import de.ids_mannheim.korap.query.SpanDistanceQuery;
 import de.ids_mannheim.korap.query.SpanElementQuery;
@@ -168,15 +167,16 @@
         //0.8s
 
         // Check if it includes some results
-        
+
         /*
-BooleanFilter bf = new BooleanFilter();
+        BooleanFilter bf = new BooleanFilter();
         bf.or("ID", "WPD_BBB.04463", "WPD_III.00758");
         */
-        
+
         KrillCollection kc = new KrillCollection();
         CollectionBuilder cb = new CollectionBuilder();
-        kc.fromBuilder(cb.orGroup().with(cb.term("ID", "WPD_BBB.04463")).with(cb.term("ID", "WPD_III.00758")));
+        kc.fromBuilder(cb.orGroup().with(cb.term("ID", "WPD_BBB.04463"))
+                .with(cb.term("ID", "WPD_III.00758")));
 
         // kc.filter(bf);
         ks.setCollection(kc);
diff --git a/src/test/java/de/ids_mannheim/korap/query/TestKrillQueryJSON.java b/src/test/java/de/ids_mannheim/korap/query/TestKrillQueryJSON.java
index b906609..3663623 100644
--- a/src/test/java/de/ids_mannheim/korap/query/TestKrillQueryJSON.java
+++ b/src/test/java/de/ids_mannheim/korap/query/TestKrillQueryJSON.java
@@ -32,6 +32,7 @@
         assertTrue(sqwi.isOptional());
     };
 
+
     @Test
     public void queryJSONBsp1Disjunction () throws QueryException {
         SpanQueryWrapper sqwi = jsonQuery(getClass().getResource(
@@ -481,7 +482,9 @@
         SpanQueryWrapper sqwi = jsonQuery(getClass().getResource(
                 "/queries/bugs/unspecified_key_bug.jsonld").getFile());
 
-        assertEquals(sqwi.toQuery().toString(), "spanContain(<tokens:s />, spanDistance(tokens:s:Erde, tokens:s:Sonne, [(w[0:100], ordered, notExcluded)]))");
+        assertEquals(
+                sqwi.toQuery().toString(),
+                "spanContain(<tokens:s />, spanDistance(tokens:s:Erde, tokens:s:Sonne, [(w[0:100], ordered, notExcluded)]))");
     };
 
 
diff --git a/src/test/java/de/ids_mannheim/korap/query/TestTemporaryQueryLimitations.java b/src/test/java/de/ids_mannheim/korap/query/TestTemporaryQueryLimitations.java
index 3d25377..58c0507 100644
--- a/src/test/java/de/ids_mannheim/korap/query/TestTemporaryQueryLimitations.java
+++ b/src/test/java/de/ids_mannheim/korap/query/TestTemporaryQueryLimitations.java
@@ -23,8 +23,10 @@
 import org.junit.runners.JUnit4;
 
 /**
- * These tests are meant to fail in a predictable way - but they describe
- * temporary behaviour and will be disabled once these features are part of Krill.
+ * These tests are meant to fail in a predictable way - but they
+ * describe
+ * temporary behaviour and will be disabled once these features are
+ * part of Krill.
  */
 
 @RunWith(JUnit4.class)
@@ -57,9 +59,9 @@
         assertEquals(kr.getStartIndex(), 0);
 
         assertEquals("This is a warning coming from the serialization", kr
-                     .getWarning(0).getMessage());
+                .getWarning(0).getMessage());
         assertEquals("Class reference checks are currently not supported"
-                     + " - results may not be correct", kr.getWarning(1)
-                     .getMessage());
+                + " - results may not be correct", kr.getWarning(1)
+                .getMessage());
     };
 };
diff --git a/src/test/java/de/ids_mannheim/korap/search/TestKrill.java b/src/test/java/de/ids_mannheim/korap/search/TestKrill.java
index 01d1a4b..bde5902 100644
--- a/src/test/java/de/ids_mannheim/korap/search/TestKrill.java
+++ b/src/test/java/de/ids_mannheim/korap/search/TestKrill.java
@@ -263,6 +263,7 @@
         assertEquals(kr.getTotalResults(), 0);
     };
 
+
     /*
      * Queries should be mirrored correctly for debugging reasons.
      */
@@ -271,8 +272,7 @@
         // Construct index
         KrillIndex ki = new KrillIndex();
         String json = getString(getClass().getResource(
-            "/queries/bugs/failing_mirror.jsonld").getFile()
-        );
+                "/queries/bugs/failing_mirror.jsonld").getFile());
         Krill ks = new Krill(json);
         Result kr = ks.apply(ki);
 
@@ -282,15 +282,14 @@
         assertEquals("Unable to parse JSON", res.at("/errors/0/1").asText());
 
         json = getString(getClass().getResource(
-            "/queries/bugs/failing_mirror_2.jsonld").getFile()
-        );
+                "/queries/bugs/failing_mirror_2.jsonld").getFile());
         ks = new Krill(json);
         kr = ks.apply(ki);
 
         res = mapper.readTree(kr.toJsonString());
 
-        assertEquals(23,res.at("/meta/count").asInt());
-        assertEquals(25,res.at("/meta/itemsPerPage").asInt());
+        assertEquals(23, res.at("/meta/count").asInt());
+        assertEquals(25, res.at("/meta/itemsPerPage").asInt());
         assertEquals("base/s:p", res.at("/meta/context").asText());
         assertFalse(res.at("/query").isMissingNode());
         assertTrue(res.at("/query/@type").isMissingNode());
@@ -813,7 +812,8 @@
         kc.extend(new CollectionBuilder().or("corpusSigle", "BZK"));
         */
         CollectionBuilder cb = new CollectionBuilder();
-        kc.fromBuilder(cb.orGroup().with(kc.getBuilder()).with(cb.term("corpusSigle", "BZK")));
+        kc.fromBuilder(cb.orGroup().with(kc.getBuilder())
+                .with(cb.term("corpusSigle", "BZK")));
 
         ks.setCollection(kc);
         assertEquals(1, kc.numberOf("documents"));
@@ -913,7 +913,9 @@
                 + " +tokens:s:Schriftzeichen)))",
                 ks.getCollection().getFilter(1).toString());
         */
-        assertEquals("AndGroup(OrGroup(ID:WPD_AAA.00001 ID:WPD_AAA.00002) OrGroup(ID:WPD_AAA.00003 AndGroup(tokens:s:die tokens:s:Schriftzeichen)))", ks.getCollection().toString());
+        assertEquals(
+                "AndGroup(OrGroup(ID:WPD_AAA.00001 ID:WPD_AAA.00002) OrGroup(ID:WPD_AAA.00003 AndGroup(tokens:s:die tokens:s:Schriftzeichen)))",
+                ks.getCollection().toString());
 
         assertEquals(kr.getTotalResults(), 119);
         assertEquals(0, kr.getStartIndex());
diff --git a/src/test/java/de/ids_mannheim/korap/search/TestMetaFields.java b/src/test/java/de/ids_mannheim/korap/search/TestMetaFields.java
index d0862a4..0ff48b5 100644
--- a/src/test/java/de/ids_mannheim/korap/search/TestMetaFields.java
+++ b/src/test/java/de/ids_mannheim/korap/search/TestMetaFields.java
@@ -215,6 +215,7 @@
                 .asText());
     };
 
+
     @Test
     public void searchCollectionFields () throws IOException {
         KrillIndex ki = new KrillIndex();
@@ -245,7 +246,7 @@
 
         // textClass = reisen & wissenschaft
         String jsonString = getString(getClass().getResource(
-        "/queries/collections/collection_textClass.jsonld").getFile());
+                "/queries/collections/collection_textClass.jsonld").getFile());
         Krill ks = new Krill(jsonString);
         KrillCollection kc = ks.getCollection();
         kc.setIndex(ki);
@@ -254,7 +255,7 @@
 
         // textClass = reisen
         jsonString = getString(getClass().getResource(
-        "/queries/collections/collection_textClass_2.jsonld").getFile());
+                "/queries/collections/collection_textClass_2.jsonld").getFile());
         ks = new Krill(jsonString);
         kc = ks.getCollection();
         kc.setIndex(ki);
@@ -282,7 +283,7 @@
 
         // author = wolfgang
         jsonString = getString(getClass().getResource(
-        "/queries/collections/collection_goethe.jsonld").getFile());
+                "/queries/collections/collection_goethe.jsonld").getFile());
         ks = new Krill(jsonString);
         kc = ks.getCollection();
         kc.setIndex(ki);
@@ -291,7 +292,7 @@
 
         // author = Wolfgang
         jsonString = getString(getClass().getResource(
-        "/queries/collections/collection_goethe_2.jsonld").getFile());
+                "/queries/collections/collection_goethe_2.jsonld").getFile());
         ks = new Krill(jsonString);
         kc = ks.getCollection();
         kc.setIndex(ki);
@@ -299,7 +300,7 @@
         assertEquals(1, kc.numberOf("documents"));
 
         Result kr = ks.apply(ki);
-        
+
         ObjectMapper mapper = new ObjectMapper();
         JsonNode res = mapper.readTree(kr.toJsonString());
         assertEquals(1, res.at("/meta/totalResults").asInt());
