diff --git a/src/main/java/de/ids_mannheim/korap/Krill.java b/src/main/java/de/ids_mannheim/korap/Krill.java
index 437e1e9..5b40873 100644
--- a/src/main/java/de/ids_mannheim/korap/Krill.java
+++ b/src/main/java/de/ids_mannheim/korap/Krill.java
@@ -222,8 +222,8 @@
 
                 // TODO: Temporary
                 if (collNode.fieldNames().hasNext()) {
-                    this.setCollection(new KrillCollection()
-                            .fromKoral(collNode));
+                    this.setCollection(
+                            new KrillCollection().fromKoral(collNode));
                 };
             }
 
diff --git a/src/main/java/de/ids_mannheim/korap/KrillCollection.java b/src/main/java/de/ids_mannheim/korap/KrillCollection.java
index d49c4d6..38b0a48 100644
--- a/src/main/java/de/ids_mannheim/korap/KrillCollection.java
+++ b/src/main/java/de/ids_mannheim/korap/KrillCollection.java
@@ -200,7 +200,8 @@
                         return this.cb.till(key, dateStr);
                 };
 
-                throw new QueryException(841, "Match relation unknown for type");
+                throw new QueryException(841,
+                        "Match relation unknown for type");
             }
 
             // Filter based on string
@@ -216,23 +217,24 @@
                         return this.cb.term(key, json.get("value").asText())
                                 .not();
 
-                        // This may change - but for now it means the elements are lowercased
+                    // 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());
+                        return this.cb.term(key,
+                                json.get("value").asText().toLowerCase());
 
                     case "match:containsnot":
                         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>
+                    // </LEGACY>
                 };
 
-                throw new QueryException(841, "Match relation unknown for type");
+                throw new QueryException(841,
+                        "Match relation unknown for type");
             }
 
             // Filter based on regex
@@ -254,7 +256,8 @@
                     return this.cb.re(key, json.get("value").asText()).not();
                 };
 
-                throw new QueryException(841, "Match relation unknown for type");
+                throw new QueryException(841,
+                        "Match relation unknown for type");
             };
 
             throw new QueryException(843, "Document type is not supported");
@@ -320,8 +323,8 @@
 
 
     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));
     };
 
 
@@ -460,8 +463,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())
@@ -485,8 +488,8 @@
         };
 
         // Remove deleted docs
-        return (DocIdSet) BitsFilteredDocIdSet.wrap((DocIdSet) new BitDocIdSet(
-                bitset), acceptDocs);
+        return (DocIdSet) BitsFilteredDocIdSet
+                .wrap((DocIdSet) new BitDocIdSet(bitset), acceptDocs);
     };
 
 
@@ -681,72 +684,72 @@
             throws Exception {
         HashMap<String, Long> map = new HashMap<>(100);
         long docNumber = 0, checkNumber = 0;
-
+    
         try {
             if (kc.getCount() <= 0) {
                 checkNumber = (long) this.reader().numDocs();
             };
-
+    
             for (LeafReaderContext atomic : this.reader().leaves()) {
                 HashMap<String, FixedBitSet> termVector = new HashMap<>(20);
-
+    
                 FixedBitSet docvec = kc.bits(atomic);
                 if (docvec != null) {
                     docNumber += docvec.cardinality();
                 };
-
+    
                 Terms terms = atomic.reader().fields().terms(field);
-
+    
                 if (terms == null) {
                     continue;
                 };
-
+    
                 int docLength = atomic.reader().maxDoc();
                 FixedBitSet bitset = new FixedBitSet(docLength);
-
+    
                 // Iterate over all tokens in this field
                 TermsEnum termsEnum = terms.iterator(null);
-
+    
                 while (termsEnum.next() != null) {
-
+    
                     String termString = termsEnum.term().utf8ToString();
-
+    
                     bitset.clear(0, docLength);
-
+    
                     // Get frequency
                     bitset.or((DocIdSetIterator) termsEnum.docs((Bits) docvec,
                             null));
-
+    
                     long value = 0;
                     if (map.containsKey(termString))
                         value = map.get(termString);
-
+    
                     map.put(termString, value + bitset.cardinality());
-
+    
                     termVector.put(termString, bitset.clone());
                 };
-
+    
                 int keySize = termVector.size();
                 String[] keys = termVector.keySet()
                         .toArray(new String[keySize]);
                 java.util.Arrays.sort(keys);
-
+    
                 if (keySize > maxTermRelations) {
                     throw new Exception("termRelations are limited to "
                             + maxTermRelations + " sets"
                             + " (requested were at least " + keySize + " sets)");
                 };
-
+    
                 for (int i = 0; i < keySize; i++) {
                     for (int j = i + 1; j < keySize; j++) {
                         FixedBitSet comby = termVector.get(keys[i]).clone();
                         comby.and(termVector.get(keys[j]));
-
+    
                         StringBuilder sb = new StringBuilder();
                         sb.append("#__").append(keys[i]).append(":###:")
                                 .append(keys[j]);
                         String combString = sb.toString();
-
+    
                         long cap = (long) comby.cardinality();
                         if (map.containsKey(combString)) {
                             cap += map.get(combString);
diff --git a/src/main/java/de/ids_mannheim/korap/KrillIndex.java b/src/main/java/de/ids_mannheim/korap/KrillIndex.java
index d978efc..06713b2 100644
--- a/src/main/java/de/ids_mannheim/korap/KrillIndex.java
+++ b/src/main/java/de/ids_mannheim/korap/KrillIndex.java
@@ -139,8 +139,7 @@
 
     private byte[] pl = new byte[4];
     private static ByteBuffer bb = ByteBuffer.allocate(4),
-            bbOffset = ByteBuffer.allocate(8),
-            bbTerm = ByteBuffer.allocate(16);
+            bbOffset = ByteBuffer.allocate(8), bbTerm = ByteBuffer.allocate(16);
 
     // Some initializations ...
     {
@@ -161,7 +160,8 @@
                 this.autoCommit = Integer.parseInt(autoCommitStr);
             }
             catch (NumberFormatException e) {
-                log.error("krill.index.commit.auto expected to be a numerical value");
+                log.error(
+                        "krill.index.commit.auto expected to be a numerical value");
             };
         };
     };
@@ -547,8 +547,8 @@
             if (gzip) {
 
                 // Create json field document
-                FieldDocument fd = this.mapper.readValue(new GZIPInputStream(
-                        json), FieldDocument.class);
+                FieldDocument fd = this.mapper.readValue(
+                        new GZIPInputStream(json), FieldDocument.class);
                 return fd;
             };
             return this.mapper.readValue(json, FieldDocument.class);
@@ -579,7 +579,8 @@
      * @return The number of the occurrences.
      * @see KrillCollection#numberOf
      */
-    public long numberOf (KrillCollection collection, String field, String type) {
+    public long numberOf (KrillCollection collection, String field,
+            String type) {
 
         collection.setIndex(this);
         try {
@@ -616,11 +617,11 @@
             };
             return docCount;
         };
-
+        
         // Create search term
         // This may be prefixed by foundries
         Term term = new Term(field, "-:" + type);
-
+        
         long occurrences = 0;
         try {
             // Iterate over all atomic readers and collect occurrences
@@ -629,12 +630,12 @@
                         atomic, term);
             };
         }
-
+        
         // Something went wrong
         catch (Exception e) {
             log.warn(e.getLocalizedMessage());
         };
-
+        
         return occurrences;
         */
     };
@@ -702,9 +703,9 @@
         FixedBitSet os = (FixedBitSet) docvec;
         return os.cardinality();
     };
-
+    
     Term term = new Term(field, "-:" + type);
-
+    
     int occurrences = 0;
     try {
         for (LeafReaderContext atomic : this.reader().leaves()) {
@@ -714,7 +715,7 @@
     catch (IOException e) {
         log.warn(e.getLocalizedMessage());
     };
-
+    
     return occurrences;
     };
     */
@@ -783,8 +784,8 @@
         // Rewrite parse ID
         uid = new Integer(Integer.parseInt(uid)).toString();
 
-        Filter filter = (Filter) new QueryWrapperFilter(new TermQuery(new Term(
-                "UID", uid)));
+        Filter filter = (Filter) new QueryWrapperFilter(
+                new TermQuery(new Term("UID", uid)));
 
         try {
 
@@ -792,8 +793,8 @@
             for (LeafReaderContext atomic : this.reader().leaves()) {
 
                 // Retrieve the single document of interest
-                DocIdSet filterSet = filter.getDocIdSet(atomic, atomic.reader()
-                        .getLiveDocs());
+                DocIdSet filterSet = filter.getDocIdSet(atomic,
+                        atomic.reader().getLiveDocs());
 
                 // Create a bitset for the correct document
                 Bits bitset = filterSet.bits();
@@ -858,7 +859,7 @@
                 false,    // includeSpans
                 true,     // includeHighlights
                 false     // extendToSentence
-                );
+        );
     };
 
 
@@ -923,8 +924,7 @@
         // Create a filter based on the corpusID and the docID
         BooleanQuery bool = new BooleanQuery();
         if (match.getTextSigle() != null) {
-            bool.add(
-                    new TermQuery(new Term("textSigle", match.getTextSigle())),
+            bool.add(new TermQuery(new Term("textSigle", match.getTextSigle())),
                     BooleanClause.Occur.MUST);
         }
 
@@ -993,7 +993,8 @@
 
                         // Filter out bad layers
                         for (i = layer.size() - 1; i >= 0; i--) {
-                            if (!harmlessLayer.matcher(layer.get(i)).matches()) {
+                            if (!harmlessLayer.matcher(layer.get(i))
+                                    .matches()) {
                                 throw new QueryException(
                                         "Invalid layer requested: "
                                                 + layer.get(i));
@@ -1040,8 +1041,8 @@
             for (LeafReaderContext atomic : this.reader().leaves()) {
 
                 // Retrieve the single document of interest
-                DocIdSet filterSet = filter.getDocIdSet(atomic, atomic.reader()
-                        .getLiveDocs());
+                DocIdSet filterSet = filter.getDocIdSet(atomic,
+                        atomic.reader().getLiveDocs());
 
 
                 // Create a bitset for the correct document
@@ -1074,8 +1075,8 @@
                 Terms docTerms = atomic.reader().getTermVector(localDocID,
                         field);
 
-                HashSet<String> fields = (HashSet<String>) new Krill()
-                        .getMeta().getFields().clone();
+                HashSet<String> fields = (HashSet<String>) new Krill().getMeta()
+                        .getFields().clone();
 
                 fields.add(field);
 
@@ -1108,7 +1109,8 @@
                     if (DEBUG)
                         log.trace("Extend to sentence element '{}'", element);
 
-                    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;
@@ -1210,7 +1212,8 @@
             };
         }
         catch (IOException e) {
-            match.addError(600, "Unable to read index", e.getLocalizedMessage());
+            match.addError(600, "Unable to read index",
+                    e.getLocalizedMessage());
             log.warn(e.getLocalizedMessage());
         };
 
@@ -1327,9 +1330,10 @@
             // Revise!
             // Based on core/src/java/org/apache/lucene/search/IndexSearcher.java
             // and highlighter/src/java/org/apache/lucene/search/postingshighlight/PostingsHighlighter.java
-            for (Query rewrittenQuery = query.rewrite(this.reader()); !rewrittenQuery
-                    .equals(query); rewrittenQuery = query.rewrite(this
-                    .reader())) {
+            for (Query rewrittenQuery = query
+                    .rewrite(this.reader()); !rewrittenQuery
+                            .equals(query); rewrittenQuery = query
+                                    .rewrite(this.reader())) {
                 query = (SpanQuery) rewrittenQuery;
             };
 
@@ -1376,7 +1380,8 @@
                     if (itemsPerResource > 0) {
 
                         // IDS are identical
-                        if (localDocID == oldLocalDocID || oldLocalDocID == -1) {
+                        if (localDocID == oldLocalDocID
+                                || oldLocalDocID == -1) {
                             if (itemsPerResourceCounter++ >= itemsPerResource) {
                                 if (spans.skipTo(localDocID + 1) != true) {
                                     break;
@@ -1402,8 +1407,9 @@
                     docID = atomic.docBase + localDocID;
 
                     // Do not load all of this, in case the doc is the same!
-                    final Document doc = (fields != null) ? lreader.document(
-                            localDocID, fields) : lreader.document(localDocID);
+                    final Document doc = (fields != null)
+                            ? lreader.document(localDocID, fields)
+                            : lreader.document(localDocID);
 
                     // Create new Match
                     final Match match = new Match(pto, localDocID,
@@ -1461,7 +1467,8 @@
                             break;
 
                         // IDS are identical
-                        if (localDocID == oldLocalDocID || oldLocalDocID == -1) {
+                        if (localDocID == oldLocalDocID
+                                || oldLocalDocID == -1) {
                             if (localDocID == -1)
                                 break;
 
@@ -1549,8 +1556,9 @@
         try {
 
             // Rewrite query (for regex and wildcard queries)
-            for (Query rewrittenQuery = query.rewrite(this.reader()); rewrittenQuery != (Query) query; rewrittenQuery = query
-                    .rewrite(this.reader())) {
+            for (Query rewrittenQuery = query.rewrite(
+                    this.reader()); rewrittenQuery != (Query) query; rewrittenQuery = query
+                            .rewrite(this.reader())) {
                 query = (SpanQuery) rewrittenQuery;
             };
 
@@ -1596,8 +1604,8 @@
                         };
 
                         // Read document id from index
-                        uniqueDocIDString = lreader
-                                .document(localDocID, fields).get("UID");
+                        uniqueDocIDString = lreader.document(localDocID, fields)
+                                .get("UID");
 
                         if (uniqueDocIDString != null)
                             uniqueDocID = Integer.parseInt(uniqueDocIDString);
diff --git a/src/main/java/de/ids_mannheim/korap/KrillMeta.java b/src/main/java/de/ids_mannheim/korap/KrillMeta.java
index c6bb0a4..a6aaade 100644
--- a/src/main/java/de/ids_mannheim/korap/KrillMeta.java
+++ b/src/main/java/de/ids_mannheim/korap/KrillMeta.java
@@ -43,9 +43,9 @@
 
         // Lift following fields per default
         // These fields are chosen for <legacy /> reasons
-        for (String field : new String[] { "ID", "UID", "textSigle",
-                "corpusID", "author", "title", "subTitle", "textClass",
-                "pubPlace", "pubDate",
+        for (String field : new String[] { "ID", "UID", "textSigle", "corpusID",
+                "author", "title", "subTitle", "textClass", "pubPlace",
+                "pubDate",
                 // "foundries",
                 // "tokenization",
                 // New:
diff --git a/src/main/java/de/ids_mannheim/korap/KrillQuery.java b/src/main/java/de/ids_mannheim/korap/KrillQuery.java
index 19fd398..45f1dda 100644
--- a/src/main/java/de/ids_mannheim/korap/KrillQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/KrillQuery.java
@@ -156,11 +156,11 @@
      * SpanQueryWrapper sqw = kq.fromKoral(
      * "{\"@type\" : \"koral:token\","+
      * "\"wrap\" : {" +
-     * "\"@type\" :   \"koral:term\"," +
+     * "\"@type\" : \"koral:term\"," +
      * "\"foundry\" : \"opennlp\"," +
-     * "\"key\" :     \"tree\"," +
-     * "\"layer\" :   \"orth\"," +
-     * "\"match\" :   \"match:eq\""+
+     * "\"key\" : \"tree\"," +
+     * "\"layer\" : \"orth\"," +
+     * "\"match\" : \"match:eq\""+
      * "}}"
      * );
      * </pre></blockquote>
@@ -231,10 +231,10 @@
                 return this._groupFromJson(json);
 
             case "koral:reference":
-                if (json.has("operation")
-                        && !json.get("operation").asText()
-                                .equals("operation:focus"))
-                    throw new QueryException(712, "Unknown reference operation");
+                if (json.has("operation") && !json.get("operation").asText()
+                        .equals("operation:focus"))
+                    throw new QueryException(712,
+                            "Unknown reference operation");
 
                 if (!json.has("operands")) {
                     throw new QueryException(766,
@@ -293,14 +293,13 @@
                     SpanSubspanQueryWrapper ssqw = new SpanSubspanQueryWrapper(
                             sqw, startOffset, length);
                     return ssqw;
-                }
-                ;
+                };
 
                 if (DEBUG)
                     log.trace("Wrap class reference {}", number);
 
-                return new SpanFocusQueryWrapper(this._fromKoral(operands
-                        .get(0)), number);
+                return new SpanFocusQueryWrapper(
+                        this._fromKoral(operands.get(0)), number);
 
             case "koral:token":
 
@@ -446,10 +445,10 @@
                 // Deprecated in favor of operation:junction
             case "operation:or":
                 return this._operationJunctionFromJson(operands);
-                /*
-                  case "operation:submatch": // Deprecated in favor of koral:reference
-                  return this._operationSubmatchFromJson(json, operands);
-                */
+            /*
+              case "operation:submatch": // Deprecated in favor of koral:reference
+              return this._operationSubmatchFromJson(json, operands);
+            */
             case "operation:disjunction":
                 return this._operationJunctionFromJson(operands);
         };
@@ -469,11 +468,9 @@
         for (int i = 0; i < operands.size(); i++) {
             childNode = operands.get(i);
             if (childNode.has("@type")
-                    && childNode.get("@type").asText()
-                            .equals("koral:reference")
-                    && childNode.has("operation")
-                    && childNode.get("operation").asText()
-                            .equals("operation:focus")
+                    && childNode.get("@type").asText().equals("koral:reference")
+                    && childNode.has("operation") && childNode.get("operation")
+                            .asText().equals("operation:focus")
                     && !childNode.has("operands")) {
 
                 if (childNode.has("classRef")) {
@@ -963,7 +960,8 @@
         // inOrder was set to false without a distance constraint
         if (!sseqqw.isInOrder() && !sseqqw.hasConstraints()) {
             if (DEBUG)
-                log.trace("Add distance constraint - for the normal inorder case");
+                log.trace(
+                        "Add distance constraint - for the normal inorder case");
 
             sseqqw.withConstraint(1, 1, "w");
         };
@@ -973,7 +971,8 @@
 
 
     // Deserialize koral:token
-    private SpanQueryWrapper _segFromJson (JsonNode json) throws QueryException {
+    private SpanQueryWrapper _segFromJson (JsonNode json)
+            throws QueryException {
 
         if (!json.has("@type"))
             throw new QueryException(701,
@@ -1006,9 +1005,9 @@
                 //
                 //            case "match:eq":
                 return this._termFromJson(json);
-                //            };
-                //
-                //            throw new QueryException(741, "Match relation unknown");
+            //            };
+            //
+            //            throw new QueryException(741, "Match relation unknown");
 
             case "koral:termGroup":
 
@@ -1043,8 +1042,7 @@
                                 throw new QueryException(744,
                                         "Operand not supported in term group");
                             };
-                        }
-                        ;
+                        };
                         return ssegqw;
 
                     case "relation:or":
@@ -1053,11 +1051,9 @@
                                 this.field);
                         for (JsonNode operand : operands) {
                             ssaq.or(this._segFromJson(operand));
-                        }
-                        ;
+                        };
                         return ssaq;
-                }
-                ;
+                };
         };
         throw new QueryException(745, "Token type is not supported");
     };
@@ -1193,23 +1189,23 @@
 
             // Branch on type
             switch (json.get("type").asText()) {
-			case "type:regex": {
+                case "type:regex": {
 
-				// The regex can be rewritten to an any token
-				if (value.toString().matches("^[si]:\\.[\\+\\*]\\??$")) {
-					return new SpanRepetitionQueryWrapper();
-				};
-				return qb.seg(qb.re(value.toString(), isCaseInsensitive));
-			}
-			case "type:wildcard":
-				return qb.seq(qb.wc(value.toString(), isCaseInsensitive));
+                    // The regex can be rewritten to an any token
+                    if (value.toString().matches("^[si]:\\.[\\+\\*]\\??$")) {
+                        return new SpanRepetitionQueryWrapper();
+                    };
+                    return qb.seg(qb.re(value.toString(), isCaseInsensitive));
+                }
+                case "type:wildcard":
+                    return qb.seq(qb.wc(value.toString(), isCaseInsensitive));
 
-			case "type:string":
-				break;
+                case "type:string":
+                    break;
 
-			default:
-				this.addWarning(746,
-								"Term type is not supported - treated as a string");
+                default:
+                    this.addWarning(746,
+                            "Term type is not supported - treated as a string");
             };
         };
 
@@ -1248,8 +1244,8 @@
                 // "Arbitraty elements with attributes are currently not supported.");
             }
             else {
-                SpanQueryWrapper elementWithIdWrapper = this.builder().tag(
-                        value.toString());
+                SpanQueryWrapper elementWithIdWrapper = this.builder()
+                        .tag(value.toString());
                 if (elementWithIdWrapper == null) {
                     return null;
                 }
@@ -1366,9 +1362,8 @@
 
                 // TODO: Here do not refer to 'tokens'!!!
                 // EM: what should it be? property?
-                return new SpanAttributeQueryWrapper(
-                        new SpanSimpleQueryWrapper("tokens", "@root",
-                                Boolean.valueOf(rootValue)));
+                return new SpanAttributeQueryWrapper(new SpanSimpleQueryWrapper(
+                        "tokens", "@root", Boolean.valueOf(rootValue)));
             }
         }
         return null;
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 2143664..475b5be 100644
--- a/src/main/java/de/ids_mannheim/korap/collection/BooleanGroupFilter.java
+++ b/src/main/java/de/ids_mannheim/korap/collection/BooleanGroupFilter.java
@@ -104,8 +104,8 @@
 
     @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)
@@ -168,8 +168,8 @@
                             log.debug("- Filter to allow all documents");
 
                         bitset.set(0, maxDoc);
-                        return BitsFilteredDocIdSet.wrap(
-                                new BitDocIdSet(bitset), acceptDocs);
+                        return BitsFilteredDocIdSet
+                                .wrap(new BitDocIdSet(bitset), acceptDocs);
                     };
 
                     // There is no possible match
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 350d852..d3ade8b 100644
--- a/src/main/java/de/ids_mannheim/korap/collection/CollectionBuilder.java
+++ b/src/main/java/de/ids_mannheim/korap/collection/CollectionBuilder.java
@@ -58,7 +58,8 @@
             if (till == 0 || till == KrillDate.END)
                 return null;
 
-            return new CollectionBuilder.Range(field, KrillDate.BEGINNING, till);
+            return new CollectionBuilder.Range(field, KrillDate.BEGINNING,
+                    till);
         }
         catch (NumberFormatException e) {
             log.warn("Parameter of till(date) is invalid");
@@ -99,7 +100,8 @@
             return new CollectionBuilder.Range(field, begin, end);
         };
 
-        return new CollectionBuilder.Range(field, dateDF.floor(), dateDF.ceil());
+        return new CollectionBuilder.Range(field, dateDF.floor(),
+                dateDF.ceil());
     };
 
 
@@ -153,8 +155,8 @@
                                 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));
         };
 
 
diff --git a/src/main/java/de/ids_mannheim/korap/index/AbstractDocument.java b/src/main/java/de/ids_mannheim/korap/index/AbstractDocument.java
index b293a47..d367382 100644
--- a/src/main/java/de/ids_mannheim/korap/index/AbstractDocument.java
+++ b/src/main/java/de/ids_mannheim/korap/index/AbstractDocument.java
@@ -44,7 +44,7 @@
     public int internalDocID, localDocID, UID;
 
     private KrillDate pubDate,
-    // newly added
+            // newly added
             creationDate;
 
     private HashMap<String, String> fieldMap;
@@ -52,28 +52,17 @@
     private String
 
     // No longer supported
-            ID,
-            corpusID,
-            field,
-            layerInfo,
-            tokenization,
+    ID, corpusID, field, layerInfo, tokenization,
 
             // Still supported
-            foundries,
-            textClass,
-            pubPlace,
+            foundries, textClass, pubPlace,
 
             // Newly added for the corpus/doc/text distinction of DeReKo
-            textSigle, docSigle, corpusSigle, title, subTitle, author,
-            editor,
-            docTitle, docSubTitle, docAuthor, docEditor,
-            corpusTitle,
-            corpusSubTitle, corpusAuthor, corpusEditor, textType,
-            textTypeArt,
-            textTypeRef, textColumn, textDomain,
-            fileEditionStatement,
-            biblEditionStatement, publisher, reference, language,
-            license,
+            textSigle, docSigle, corpusSigle, title, subTitle, author, editor,
+            docTitle, docSubTitle, docAuthor, docEditor, corpusTitle,
+            corpusSubTitle, corpusAuthor, corpusEditor, textType, textTypeArt,
+            textTypeRef, textColumn, textDomain, fileEditionStatement,
+            biblEditionStatement, publisher, reference, language, license,
             pages, keywords,
 
             // Meta information regarding annotations
diff --git a/src/main/java/de/ids_mannheim/korap/index/Indexer.java b/src/main/java/de/ids_mannheim/korap/index/Indexer.java
index c5da39b..b5dfd20 100644
--- a/src/main/java/de/ids_mannheim/korap/index/Indexer.java
+++ b/src/main/java/de/ids_mannheim/korap/index/Indexer.java
@@ -71,7 +71,8 @@
 
                 // Add file to the index
                 try {
-                    if (this.index.addDoc(new FileInputStream(found), true) == null) {
+                    if (this.index.addDoc(new FileInputStream(found),
+                            true) == null) {
                         System.out.println("fail.");
                         continue;
                     };
@@ -121,8 +122,8 @@
             String jar = new File(Indexer.class.getProtectionDomain()
                     .getCodeSource().getLocation().getPath()).getName();
 
-            System.out
-                    .println("Add documents from a directory to the Krill index.");
+            System.out.println(
+                    "Add documents from a directory to the Krill index.");
             System.out.println("Usage: java -jar " + jar
                     + " [--config propfile] [directories]*");
             System.out.println();
diff --git a/src/main/java/de/ids_mannheim/korap/index/MultiTerm.java b/src/main/java/de/ids_mannheim/korap/index/MultiTerm.java
index b009e7b..e4eb624 100644
--- a/src/main/java/de/ids_mannheim/korap/index/MultiTerm.java
+++ b/src/main/java/de/ids_mannheim/korap/index/MultiTerm.java
@@ -158,7 +158,8 @@
      * @return The {@link MultiTerm} object for chaining.
      */
     public MultiTerm setPayload (short pl) {
-        this.payload = new BytesRef(ByteBuffer.allocate(2).putShort(pl).array());
+        this.payload = new BytesRef(
+                ByteBuffer.allocate(2).putShort(pl).array());
         return this;
     };
 
@@ -321,8 +322,8 @@
                 sb.append(this.payload.utf8ToString());
             }
             catch (AssertionError e) {
-                sb.append("<?>").append(
-                        this.payload.toString().replace(' ', ','));
+                sb.append("<?>")
+                        .append(this.payload.toString().replace(' ', ','));
             };
         };
 
@@ -364,8 +365,8 @@
                 sb.append(this.payload.utf8ToString());
             }
             catch (AssertionError e) {
-                sb.append("<?>").append(
-                        this.payload.toString().replace(' ', ','));
+                sb.append("<?>")
+                        .append(this.payload.toString().replace(' ', ','));
             };
         };
         return sb.toString();
@@ -398,8 +399,8 @@
 
                         // Resize the bytebuffer
                         if ((bb.capacity() - l) < 8) {
-                            bb = ByteBuffer.allocate(bb.capacity() + 8).put(
-                                    bb.array());
+                            bb = ByteBuffer.allocate(bb.capacity() + 8)
+                                    .put(bb.array());
                             bb.position(l);
                         };
 
@@ -479,7 +480,7 @@
 
     // Unescape the term
     private String _unescape (String term) {
-        return term.replace("\\\\", "\\").replace("\\#", "#")
-                .replace("\\$", "$");
+        return term.replace("\\\\", "\\").replace("\\#", "#").replace("\\$",
+                "$");
     };
 };
diff --git a/src/main/java/de/ids_mannheim/korap/index/MultiTermTokenStream.java b/src/main/java/de/ids_mannheim/korap/index/MultiTermTokenStream.java
index f02b074..50e39aa 100644
--- a/src/main/java/de/ids_mannheim/korap/index/MultiTermTokenStream.java
+++ b/src/main/java/de/ids_mannheim/korap/index/MultiTermTokenStream.java
@@ -153,7 +153,8 @@
      *            A surface string of a {@link MultiTerm}.
      * @return The {@link MultiTermTokenStream} object for chaining.
      */
-    public MultiTermTokenStream addMultiTermToken (char prefix, String surface) {
+    public MultiTermTokenStream addMultiTermToken (char prefix,
+            String surface) {
         return this.addMultiTermToken(new MultiTermToken(prefix, surface));
     };
 
diff --git a/src/main/java/de/ids_mannheim/korap/index/PositionsToOffset.java b/src/main/java/de/ids_mannheim/korap/index/PositionsToOffset.java
index bd84972..c471c51 100644
--- a/src/main/java/de/ids_mannheim/korap/index/PositionsToOffset.java
+++ b/src/main/java/de/ids_mannheim/korap/index/PositionsToOffset.java
@@ -161,8 +161,8 @@
 
 
     public void addOffset (int docID, int pos, int startOffset, int endOffset) {
-        offsets.put(new PositionsToOffsetArray(docID, pos), new Integer[] {
-                startOffset, endOffset });
+        offsets.put(new PositionsToOffsetArray(docID, pos),
+                new Integer[] { startOffset, endOffset });
     };
 
 
@@ -233,8 +233,7 @@
                             }
 
                             else {
-                                log.error(
-                                        "Doc {} has no offsets stored for {}",
+                                log.error("Doc {} has no offsets stored for {}",
                                         docID, term.toString());
                             };
                         };
diff --git a/src/main/java/de/ids_mannheim/korap/index/TermInfo.java b/src/main/java/de/ids_mannheim/korap/index/TermInfo.java
index dc7403a..3f05ea8 100644
--- a/src/main/java/de/ids_mannheim/korap/index/TermInfo.java
+++ b/src/main/java/de/ids_mannheim/korap/index/TermInfo.java
@@ -68,8 +68,7 @@
                     this.type = "relTarget";
                     tterm = tterm.substring(2);
                     ttype = 3;
-                }
-                ;
+                };
                 break;
 
             case '>':
diff --git a/src/main/java/de/ids_mannheim/korap/query/DistanceConstraint.java b/src/main/java/de/ids_mannheim/korap/query/DistanceConstraint.java
index 7a87bdd..279131f 100644
--- a/src/main/java/de/ids_mannheim/korap/query/DistanceConstraint.java
+++ b/src/main/java/de/ids_mannheim/korap/query/DistanceConstraint.java
@@ -53,7 +53,7 @@
  * </ol>
  * 
  * @author margaretha
- * */
+ */
 
 public class DistanceConstraint {
     private int minDistance, maxDistance;
diff --git a/src/main/java/de/ids_mannheim/korap/query/FrameConstraint.java b/src/main/java/de/ids_mannheim/korap/query/FrameConstraint.java
index e0c3dd6..ba90a77 100644
--- a/src/main/java/de/ids_mannheim/korap/query/FrameConstraint.java
+++ b/src/main/java/de/ids_mannheim/korap/query/FrameConstraint.java
@@ -60,9 +60,8 @@
     public static final int PRECEDES = 1, PRECEDES_DIRECTLY = 1 << 1,
             OVERLAPS_LEFT = 1 << 2, ALIGNS_LEFT = 1 << 3, STARTS_WITH = 1 << 4,
             MATCHES = 1 << 5, IS_WITHIN = 1 << 6, IS_AROUND = 1 << 7,
-            ENDS_WITH = 1 << 8, ALIGNS_RIGHT = 1 << 9,
-            OVERLAPS_RIGHT = 1 << 10, SUCCEEDS_DIRECTLY = 1 << 11,
-            SUCCEEDS = 1 << 12, ALL = 1024 * 8 - 1;
+            ENDS_WITH = 1 << 8, ALIGNS_RIGHT = 1 << 9, OVERLAPS_RIGHT = 1 << 10,
+            SUCCEEDS_DIRECTLY = 1 << 11, SUCCEEDS = 1 << 12, ALL = 1024 * 8 - 1;
 
 
     private static final Map<String, Integer> FRAME;
@@ -113,7 +112,8 @@
          * a.end < b.end && a.start == b.start
          */
         FRAME_t.put("alignsLeft", ALIGNS_LEFT);
-        NEXT_B_t.add(PRECEDES | PRECEDES_DIRECTLY | OVERLAPS_LEFT | ALIGNS_LEFT);
+        NEXT_B_t.add(
+                PRECEDES | PRECEDES_DIRECTLY | OVERLAPS_LEFT | ALIGNS_LEFT);
 
         /*
          * A starts with B
@@ -338,6 +338,7 @@
     // Todo: create nextB arraymatrix by adding all combinations of constellation precomputed
     // NEXTB[SUCCEEDS_DIRECTLY | SUCCEEDS] = NEXTB[SUCEEDS_DIRECTLY] | NEXTB[SUCCEEDS];
 
+
     // NextB
     // Integer.numberOfTrailingZeros();
     private static int _next_b (int constellation) {
diff --git a/src/main/java/de/ids_mannheim/korap/query/QueryBuilder.java b/src/main/java/de/ids_mannheim/korap/query/QueryBuilder.java
index 96e4eb5..f065737 100644
--- a/src/main/java/de/ids_mannheim/korap/query/QueryBuilder.java
+++ b/src/main/java/de/ids_mannheim/korap/query/QueryBuilder.java
@@ -132,7 +132,8 @@
      */
     public SpanRegexQueryWrapper re (String re, int flags,
             boolean caseinsensitive) {
-        return new SpanRegexQueryWrapper(this.field, re, flags, caseinsensitive);
+        return new SpanRegexQueryWrapper(this.field, re, flags,
+                caseinsensitive);
     };
 
 
@@ -257,7 +258,7 @@
         return ssq;
     };
 
-	
+
     /**
      * Create an empty query segment.
      * 
@@ -312,7 +313,8 @@
      *            [] An array of segment defining terms.
      */
     public SpanSequenceQueryWrapper seq (SpanQueryWrapper ... terms) {
-        SpanSequenceQueryWrapper sssq = new SpanSequenceQueryWrapper(this.field);
+        SpanSequenceQueryWrapper sssq = new SpanSequenceQueryWrapper(
+                this.field);
         for (SpanQueryWrapper t : terms)
             sssq.append(t);
         return sssq;
@@ -431,7 +433,8 @@
     };
 
 
-    public SpanFocusQueryWrapper focus (short number, SpanQueryWrapper element) {
+    public SpanFocusQueryWrapper focus (short number,
+            SpanQueryWrapper element) {
         return new SpanFocusQueryWrapper(element, number);
     };
 
@@ -448,8 +451,8 @@
     };
 
 
-    public SpanRepetitionQueryWrapper repeat (SpanQueryWrapper element,
-            int min, int max) {
+    public SpanRepetitionQueryWrapper repeat (SpanQueryWrapper element, int min,
+            int max) {
         return new SpanRepetitionQueryWrapper(element, min, max);
     };
 };
diff --git a/src/main/java/de/ids_mannheim/korap/query/SimpleSpanQuery.java b/src/main/java/de/ids_mannheim/korap/query/SimpleSpanQuery.java
index 7e428a4..919022e 100644
--- a/src/main/java/de/ids_mannheim/korap/query/SimpleSpanQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/query/SimpleSpanQuery.java
@@ -67,7 +67,7 @@
  * @see SpanQuery
  * 
  * @author margaretha
- * */
+ */
 public abstract class SimpleSpanQuery extends SpanQuery implements Cloneable {
 
     protected SpanQuery firstClause = null, secondClause = null;
@@ -91,7 +91,7 @@
      *            <code>true</code> if payloads are to be collected,
      *            otherwise
      *            <code>false</code>.
-     * */
+     */
     public SimpleSpanQuery (SpanQuery firstClause, boolean collectPayloads) {
         if (firstClause == null) {
             throw new IllegalArgumentException(
@@ -117,7 +117,7 @@
      *            <code>true</code> if payloads are to be collected,
      *            otherwise
      *            <code>false</code>.
-     * */
+     */
     public SimpleSpanQuery (SpanQuery firstClause, SpanQuery secondClause,
                             boolean collectPayloads) {
         this(firstClause, collectPayloads);
@@ -144,7 +144,7 @@
      *            <code>true</code> if payloads are to be collected,
      *            otherwise
      *            <code>false</code>.
-     * */
+     */
     public SimpleSpanQuery (SpanQuery firstClause,
                             List<SpanQuery> secondClauses,
                             boolean collectPayloads) {
@@ -209,7 +209,7 @@
 
     /**
      * {@inheritDoc}
-     * */
+     */
     @Override
     public String getField () {
         return field;
@@ -339,8 +339,8 @@
             throws IOException {
 
         for (int i = 0; i < spanQueries.size(); i++) {
-            final SpanQuery query = (SpanQuery) spanQueries.get(i).rewrite(
-                    reader);
+            final SpanQuery query = (SpanQuery) spanQueries.get(i)
+                    .rewrite(reader);
             if (!query.equals(spanQueries.get(i))) {
                 if (clone == null)
                     clone = clone();
@@ -381,7 +381,7 @@
 
     /**
      * {@inheritDoc}
-     * */
+     */
     // Used in rewriting query
     @Override
     public boolean equals (Object o) {
diff --git a/src/main/java/de/ids_mannheim/korap/query/SpanAttributeQuery.java b/src/main/java/de/ids_mannheim/korap/query/SpanAttributeQuery.java
index 265d2de..0ae6922 100644
--- a/src/main/java/de/ids_mannheim/korap/query/SpanAttributeQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/query/SpanAttributeQuery.java
@@ -42,7 +42,7 @@
  * </pre>
  * 
  * @author margaretha
- * */
+ */
 public class SpanAttributeQuery extends SimpleSpanQuery {
 
     boolean negation;
diff --git a/src/main/java/de/ids_mannheim/korap/query/SpanDistanceQuery.java b/src/main/java/de/ids_mannheim/korap/query/SpanDistanceQuery.java
index da53af7..88c4de1 100644
--- a/src/main/java/de/ids_mannheim/korap/query/SpanDistanceQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/query/SpanDistanceQuery.java
@@ -106,14 +106,14 @@
  * 
  * 
  * @author margaretha
- * */
+ */
 public class SpanDistanceQuery extends SimpleSpanQuery {
 
     private boolean exclusion;
     private boolean isOrdered;
     private int minDistance, maxDistance;
     private SpanElementQuery elementQuery; // element distance unit (sentence or
-                                           // paragraph)
+                                          // paragraph)
     private String distanceUnit;
     private String spanName;
     private DistanceConstraint constraint;
diff --git a/src/main/java/de/ids_mannheim/korap/query/SpanExpansionQuery.java b/src/main/java/de/ids_mannheim/korap/query/SpanExpansionQuery.java
index d7130e1..2d6c29f 100644
--- a/src/main/java/de/ids_mannheim/korap/query/SpanExpansionQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/query/SpanExpansionQuery.java
@@ -97,7 +97,7 @@
  * together with a class number.
  * 
  * @author margaretha
- * */
+ */
 public class SpanExpansionQuery extends SimpleSpanQuery {
 
     private int min, max; // min, max expansion position
diff --git a/src/main/java/de/ids_mannheim/korap/query/SpanMultipleDistanceQuery.java b/src/main/java/de/ids_mannheim/korap/query/SpanMultipleDistanceQuery.java
index 51ba29b..ce65df6 100644
--- a/src/main/java/de/ids_mannheim/korap/query/SpanMultipleDistanceQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/query/SpanMultipleDistanceQuery.java
@@ -73,7 +73,7 @@
  * </ul>
  * 
  * @author margaretha
- * */
+ */
 public class SpanMultipleDistanceQuery extends SimpleSpanQuery {
 
     private List<DistanceConstraint> constraints;
@@ -106,7 +106,8 @@
     public SpanMultipleDistanceQuery (SpanQuery firstClause,
                                       SpanQuery secondClause,
                                       List<DistanceConstraint> constraints,
-                                      boolean isOrdered, boolean collectPayloads) {
+                                      boolean isOrdered,
+                                      boolean collectPayloads) {
         super(firstClause, secondClause, collectPayloads);
         this.constraints = constraints;
         this.isOrdered = isOrdered;
@@ -165,7 +166,7 @@
      * meeting all the constraints.
      * 
      * @return only the span matches meeting all the constraints.
-     * */
+     */
     @Override
     public Spans getSpans (LeafReaderContext context, Bits acceptDocs,
             Map<Term, TermContext> termContexts) throws IOException {
diff --git a/src/main/java/de/ids_mannheim/korap/query/SpanRelationMatchQuery.java b/src/main/java/de/ids_mannheim/korap/query/SpanRelationMatchQuery.java
index 151abf4..311a5fc 100644
--- a/src/main/java/de/ids_mannheim/korap/query/SpanRelationMatchQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/query/SpanRelationMatchQuery.java
@@ -23,44 +23,47 @@
                                    SpanQuery operand, boolean collectPayloads) {
 
         checkVariables(relation, operand);
-        SpanFocusQuery sq = new SpanFocusQuery(new SpanSegmentQuery(
-                relationQuery, operandQuery, true),
+        SpanFocusQuery sq = new SpanFocusQuery(
+                new SpanSegmentQuery(relationQuery, operandQuery, true),
                 relation.getTempClassNumbers());
         sq.setMatchTemporaryClass(true);
         sq.setRemoveTemporaryClasses(true);
         sq.setSorted(false); // which operand to focus might be
-                             // different from that to match
+                            // different from that to match
 
         this.setFirstClause(sq);
         this.collectPayloads = collectPayloads;
     }
 
 
-    public SpanRelationMatchQuery (SpanRelationQuery relation,
-                                   SpanQuery source, SpanQuery target,
-                                   boolean collectPayloads) {
+    public SpanRelationMatchQuery (SpanRelationQuery relation, SpanQuery source,
+                                   SpanQuery target, boolean collectPayloads) {
 
         checkVariables(relation, source, target);
         SpanFocusQuery sq = null;
         SpanFocusQuery sq2 = null;
         // match source and then target
         if (relationQuery.getDirection() == 0) {
-            sq = new SpanFocusQuery(new SpanSegmentQuery(relationQuery,
-                    operandQuery, true), relation.getTempTargetNum());
+            sq = new SpanFocusQuery(
+                    new SpanSegmentQuery(relationQuery, operandQuery, true),
+                    relation.getTempTargetNum());
             sq.setSorted(false);
             sq.setMatchTemporaryClass(true);
 
-            sq2 = new SpanFocusQuery(new SpanSegmentQuery(operand2Query, sq,
-                    true), relation.getTempClassNumbers());
+            sq2 = new SpanFocusQuery(
+                    new SpanSegmentQuery(operand2Query, sq, true),
+                    relation.getTempClassNumbers());
         }
         // match target and then source
         else {
-            sq = new SpanFocusQuery(new SpanSegmentQuery(relationQuery,
-                    operandQuery, true), relation.getTempSourceNum());
+            sq = new SpanFocusQuery(
+                    new SpanSegmentQuery(relationQuery, operandQuery, true),
+                    relation.getTempSourceNum());
             sq.setMatchTemporaryClass(true);
 
-            sq2 = new SpanFocusQuery(new SpanSegmentQuery(sq, operand2Query,
-                    true), relation.getTempClassNumbers());
+            sq2 = new SpanFocusQuery(
+                    new SpanSegmentQuery(sq, operand2Query, true),
+                    relation.getTempClassNumbers());
         }
 
         sq2.setMatchTemporaryClass(true);
@@ -128,8 +131,8 @@
     public Spans getSpans (LeafReaderContext context, Bits acceptDocs,
             Map<Term, TermContext> termContexts) throws IOException {
 
-        return new FocusSpans((SpanFocusQuery) firstClause, context,
-                acceptDocs, termContexts);
+        return new FocusSpans((SpanFocusQuery) firstClause, context, acceptDocs,
+                termContexts);
     }
 
 
diff --git a/src/main/java/de/ids_mannheim/korap/query/SpanRelationQuery.java b/src/main/java/de/ids_mannheim/korap/query/SpanRelationQuery.java
index a2f565c..094e457 100644
--- a/src/main/java/de/ids_mannheim/korap/query/SpanRelationQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/query/SpanRelationQuery.java
@@ -54,7 +54,7 @@
  * </ol>
  * 
  * @author margaretha
- * */
+ */
 public class SpanRelationQuery extends SimpleSpanQuery {
 
     private int direction = 0; // >
diff --git a/src/main/java/de/ids_mannheim/korap/query/SpanRepetitionQuery.java b/src/main/java/de/ids_mannheim/korap/query/SpanRepetitionQuery.java
index 92c6c94..c169e4b 100644
--- a/src/main/java/de/ids_mannheim/korap/query/SpanRepetitionQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/query/SpanRepetitionQuery.java
@@ -47,7 +47,7 @@
  * </pre>
  * 
  * @author margaretha
- * */
+ */
 public class SpanRepetitionQuery extends SimpleSpanQuery {
 
     private int min, max;
@@ -72,6 +72,10 @@
     public SpanRepetitionQuery (SpanQuery sq, int min, int max,
                                 boolean collectPayloads) {
         super(sq, collectPayloads);
+        if (min < 1) {
+            throw new IllegalArgumentException(
+                    "Minimum repetition must not lower than 1.");
+        }
         this.min = min;
         this.max = max;
     }
diff --git a/src/main/java/de/ids_mannheim/korap/query/SpanSegmentQuery.java b/src/main/java/de/ids_mannheim/korap/query/SpanSegmentQuery.java
index 508c7ca..9e36c40 100644
--- a/src/main/java/de/ids_mannheim/korap/query/SpanSegmentQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/query/SpanSegmentQuery.java
@@ -26,7 +26,7 @@
  * </pre>
  * 
  * @author margaretha
- * */
+ */
 public class SpanSegmentQuery extends SimpleSpanQuery {
 
     private boolean isRelation;
@@ -72,7 +72,8 @@
     @Override
     public Spans getSpans (LeafReaderContext context, Bits acceptDocs,
             Map<Term, TermContext> termContexts) throws IOException {
-        return (Spans) new SegmentSpans(this, context, acceptDocs, termContexts);
+        return (Spans) new SegmentSpans(this, context, acceptDocs,
+                termContexts);
     }
 
 
diff --git a/src/main/java/de/ids_mannheim/korap/query/SpanSubspanQuery.java b/src/main/java/de/ids_mannheim/korap/query/SpanSubspanQuery.java
index 9ec9632..5d31352 100644
--- a/src/main/java/de/ids_mannheim/korap/query/SpanSubspanQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/query/SpanSubspanQuery.java
@@ -36,7 +36,7 @@
  * two tokens of all sentences.
  * 
  * @author margaretha
- * */
+ */
 public class SpanSubspanQuery extends SimpleSpanQuery {
 
     private int startOffset, length;
@@ -60,8 +60,8 @@
      *            otherwise
      *            <code>false</code>.
      */
-    public SpanSubspanQuery (SpanQuery firstClause, int startOffset,
-                             int length, boolean collectPayloads) {
+    public SpanSubspanQuery (SpanQuery firstClause, int startOffset, int length,
+                             boolean collectPayloads) {
         super(firstClause, collectPayloads);
         this.startOffset = startOffset;
         this.length = length;
diff --git a/src/main/java/de/ids_mannheim/korap/query/SpanTermWithIdQuery.java b/src/main/java/de/ids_mannheim/korap/query/SpanTermWithIdQuery.java
index 324d560..51ae8d1 100644
--- a/src/main/java/de/ids_mannheim/korap/query/SpanTermWithIdQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/query/SpanTermWithIdQuery.java
@@ -30,7 +30,7 @@
  * the Term "tt:p/NN".
  * 
  * @author margaretha
- * */
+ */
 public class SpanTermWithIdQuery extends SimpleSpanQuery {
 
     /**
diff --git a/src/main/java/de/ids_mannheim/korap/query/SpanWithAttributeQuery.java b/src/main/java/de/ids_mannheim/korap/query/SpanWithAttributeQuery.java
index fae7aa0..915ac3a 100644
--- a/src/main/java/de/ids_mannheim/korap/query/SpanWithAttributeQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/query/SpanWithAttributeQuery.java
@@ -199,8 +199,8 @@
                     termContexts);
         }
 
-        SimpleSpans spans = (SimpleSpans) this.getFirstClause().getSpans(
-                context, acceptDocs, termContexts);
+        SimpleSpans spans = (SimpleSpans) this.getFirstClause()
+                .getSpans(context, acceptDocs, termContexts);
         return new SpansWithAttribute(this, spans, context, acceptDocs,
                 termContexts);
     }
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/AttributeSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/AttributeSpans.java
index 4958bea..ab0576f 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/AttributeSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/AttributeSpans.java
@@ -43,7 +43,7 @@
  * "any element having a specific attribute".
  * 
  * @author margaretha
- * */
+ */
 public class AttributeSpans extends SimpleSpans {
 
     private List<CandidateAttributeSpan> candidateList;
@@ -243,9 +243,9 @@
      * The
      * attributes with smaller spanIds come first on the list.
      * 
-     * */
-    class CandidateAttributeSpan extends CandidateSpan implements
-            Comparable<CandidateSpan> {
+     */
+    class CandidateAttributeSpan extends CandidateSpan
+            implements Comparable<CandidateSpan> {
 
         /**
          * Construct a CandidateAttributeSpan based on the given span,
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/CandidateSpan.java b/src/main/java/de/ids_mannheim/korap/query/spans/CandidateSpan.java
index b132dc7..83e8ba4 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/CandidateSpan.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/CandidateSpan.java
@@ -15,14 +15,14 @@
  * matching.
  * 
  * @author margaretha
- * */
+ */
 public class CandidateSpan implements Comparable<CandidateSpan>, Cloneable {
     protected int doc, start, end;
     private long cost;
     private Collection<byte[]> payloads;
     private int position;
     private CandidateSpan childSpan; // used for example for multiple distance
-                                     // with unordered constraint
+                                    // with unordered constraint
     protected short spanId;
     protected boolean hasSpanId;
 
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/ClassFilteredSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/ClassFilteredSpans.java
index 71e8e42..406247f 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/ClassFilteredSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/ClassFilteredSpans.java
@@ -56,8 +56,8 @@
     private boolean isClassOperationValid () throws IOException {
         setBitsets();
 
-        int cardinality = Math
-                .max(bitset1.cardinality(), bitset2.cardinality());
+        int cardinality = Math.max(bitset1.cardinality(),
+                bitset2.cardinality());
 
         bitset1.and(bitset2);
         // System.out.println("cardinality:" + cardinality);
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/ClassSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/ClassSpans.java
index 47a6998..42e59a1 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/ClassSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/ClassSpans.java
@@ -56,7 +56,8 @@
      */
     public ClassSpans (SpanQuery operand, LeafReaderContext context,
                        Bits acceptDocs, Map<Term, TermContext> termContexts,
-                       byte number) throws IOException {
+                       byte number)
+            throws IOException {
         spans = operand.getSpans(context, acceptDocs, termContexts);
 
         // The number of the class
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/DistanceExclusionSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/DistanceExclusionSpans.java
index f6cd732..b456035 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/DistanceExclusionSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/DistanceExclusionSpans.java
@@ -17,7 +17,7 @@
  * distance.
  * 
  * @author margaretha
- * */
+ */
 public class DistanceExclusionSpans extends DistanceSpans {
 
     private int minDistance, maxDistance;
@@ -105,7 +105,7 @@
      * @return distance the difference between the positions of a
      *         firstspan and
      *         a secondspan.
-     * */
+     */
     private int calculateActualDistance () {
         // right secondSpan
         if (firstSpans.end() <= secondSpans.start())
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/DistanceSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/DistanceSpans.java
index 7bc9136..286f91c 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/DistanceSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/DistanceSpans.java
@@ -29,7 +29,7 @@
  * @see MultipleDistanceSpans
  * 
  * @author margaretha
- * */
+ */
 public abstract class DistanceSpans extends SimpleSpans {
 
     protected CandidateSpan matchFirstSpan, matchSecondSpan;
@@ -88,7 +88,7 @@
      * 
      * @return <code>true</code> if a span match is available,
      *         <code>false</code> otherwise.
-     * */
+     */
     protected abstract boolean advance () throws IOException;
 
 
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/ElementDistanceExclusionSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/ElementDistanceExclusionSpans.java
index 78c0e76..1c5ebdc 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/ElementDistanceExclusionSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/ElementDistanceExclusionSpans.java
@@ -30,7 +30,7 @@
  * Note: The element distance unit does not overlap to each other.
  * 
  * @author margaretha
- * */
+ */
 public class ElementDistanceExclusionSpans extends DistanceSpans {
 
     private Spans elements;
@@ -154,8 +154,8 @@
 
         if (candidateList.isEmpty()) {
             if (isFirstSpanInElement()) {
-                setMatchProperties(new CandidateSpan(firstSpans,
-                        elementPosition));
+                setMatchProperties(
+                        new CandidateSpan(firstSpans, elementPosition));
                 hasMoreSpans = firstSpans.next();
                 return true;
             }
@@ -273,16 +273,16 @@
             if (hasMoreSpans && firstSpans.start() < secondSpans.start()
                     && firstSpans.doc() == currentDocNum) {
                 if (advanceElementTo(firstSpans)) {
-                    targetList.add(new CandidateSpan(firstSpans,
-                            elementPosition));
+                    targetList.add(
+                            new CandidateSpan(firstSpans, elementPosition));
                 }
                 hasMoreSpans = firstSpans.next();
                 continue;
             }
             // collects only second spans occurring inside an element
             if (advanceElementTo(secondSpans)) {
-                candidateList.add(new CandidateSpan(secondSpans,
-                        elementPosition));
+                candidateList
+                        .add(new CandidateSpan(secondSpans, elementPosition));
             }
             hasMoreSecondSpans = secondSpans.next();
         }
@@ -300,8 +300,8 @@
         while (hasMoreSecondSpans && secondSpans.doc() == firstSpans.doc()
                 && secondSpans.start() < firstSpans.end()) {
             if (advanceElementTo(secondSpans)) {
-                candidateList.add(new CandidateSpan(secondSpans,
-                        elementPosition));
+                candidateList
+                        .add(new CandidateSpan(secondSpans, elementPosition));
                 filterCandidateList(elementPosition);
             }
             hasMoreSecondSpans = secondSpans.next();
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/ElementDistanceSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/ElementDistanceSpans.java
index 5f3ded5..dd53ac5 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/ElementDistanceSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/ElementDistanceSpans.java
@@ -24,7 +24,7 @@
  * Note: elements cannot overlap with each other.
  * 
  * @author margaretha
- * */
+ */
 public class ElementDistanceSpans extends OrderedDistanceSpans {
 
     private Spans elements;
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/ExpandedExclusionSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/ExpandedExclusionSpans.java
index 4d64921..d747149 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/ExpandedExclusionSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/ExpandedExclusionSpans.java
@@ -37,7 +37,7 @@
  * grouping them altogether.
  * 
  * @author margaretha
- * */
+ */
 public class ExpandedExclusionSpans extends SimpleSpans {
 
     private int min, max;
@@ -68,10 +68,9 @@
         super(spanExpansionQuery, context, acceptDocs, termContexts);
 
         if (spanExpansionQuery.getSecondClause() == null) {
-            throw new IllegalArgumentException(
-                    "The SpanExpansionQuery "
-                            + "is not valid. The spanquery to exclude (notClause) cannot "
-                            + "be null.");
+            throw new IllegalArgumentException("The SpanExpansionQuery "
+                    + "is not valid. The spanquery to exclude (notClause) cannot "
+                    + "be null.");
         }
 
         /*
@@ -265,8 +264,8 @@
                     end = firstSpans.end();
                     //System.out.println(start+","+end);
                     cs = new CandidateSpan(start, end, firstSpans.doc(),
-                            firstSpans.cost(), createPayloads(start,
-                                    firstSpans.start()));
+                            firstSpans.cost(),
+                            createPayloads(start, firstSpans.start()));
                     candidateSpans.add(cs);
                 }
                 counter--;
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/ExpandedSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/ExpandedSpans.java
index b31abb6..129ef82 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/ExpandedSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/ExpandedSpans.java
@@ -27,7 +27,7 @@
  * grouping them altogether.
  * 
  * @author margaretha
- * */
+ */
 public class ExpandedSpans extends SimpleSpans {
 
     private int min, max;
@@ -117,8 +117,8 @@
             while (counter >= min) {
                 start = Math.max(0, firstSpans.start() - counter);
                 cs = new CandidateSpan(start, firstSpans.end(),
-                        firstSpans.doc(), firstSpans.cost(), createPayloads(
-                                start, firstSpans.start()));
+                        firstSpans.doc(), firstSpans.cost(),
+                        createPayloads(start, firstSpans.start()));
 
                 candidateSpans.add(cs);
                 counter--;
@@ -130,8 +130,8 @@
                 // TODO: How do I know if the end is already too far (over the end of the doc)? 
                 end = firstSpans.end() + counter;
                 cs = new CandidateSpan(firstSpans.start(), end,
-                        firstSpans.doc(), firstSpans.cost(), createPayloads(
-                                firstSpans.end(), end));
+                        firstSpans.doc(), firstSpans.cost(),
+                        createPayloads(firstSpans.end(), end));
                 candidateSpans.add(cs);
                 counter++;
             }
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/FocusSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/FocusSpans.java
index e566637..84e5da9 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/FocusSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/FocusSpans.java
@@ -108,9 +108,8 @@
         while (hasMoreSpans || candidates.size() > 0) {
             if (isSorted) {
 
-                if (firstSpans.isPayloadAvailable()
-                        && updateSpanPositions(cs = new CandidateSpan(
-                                firstSpans))) {
+                if (firstSpans.isPayloadAvailable() && updateSpanPositions(
+                        cs = new CandidateSpan(firstSpans))) {
                     setMatch(cs);
                     hasMoreSpans = firstSpans.next();
                     return true;
@@ -137,8 +136,8 @@
         while (hasMoreSpans && candidates.size() < windowSize
                 && firstSpans.doc() == currentDoc) {
 
-            if (firstSpans.isPayloadAvailable()
-                    && updateSpanPositions(cs = new CandidateSpan(firstSpans))) {
+            if (firstSpans.isPayloadAvailable() && updateSpanPositions(
+                    cs = new CandidateSpan(firstSpans))) {
                 if (cs.getDoc() == prevDoc && cs.getStart() < prevStart) {
                     log.warn("Span (" + cs.getStart() + ", " + cs.getEnd()
                             + ") is out of order and skipped.");
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/MultipleDistanceSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/MultipleDistanceSpans.java
index f1b7973..ce117ea 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/MultipleDistanceSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/MultipleDistanceSpans.java
@@ -31,7 +31,7 @@
  * </ol>
  * 
  * @author margaretha
- * */
+ */
 public class MultipleDistanceSpans extends DistanceSpans {
 
     private DistanceSpans x, y;
@@ -85,7 +85,7 @@
 
     /**
      * Finds the next match.
-     * */
+     */
     protected boolean advance () throws IOException {
         while (hasMoreSpans && ensureSameDoc(x, y)) {
             if (findMatch()) {
@@ -159,7 +159,8 @@
             }
         }
         else if (xf.getStart() == yf.getStart() && xf.getEnd() == yf.getEnd()
-                && xs.getStart() == ys.getStart() && xs.getEnd() == ys.getEnd()) {
+                && xs.getStart() == ys.getStart()
+                && xs.getEnd() == ys.getEnd()) {
             setMatchProperties(x, false);
             return true;
         }
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/NextSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/NextSpans.java
index 3db12a7..75dd930 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/NextSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/NextSpans.java
@@ -77,7 +77,8 @@
      */
     private boolean advance () throws IOException {
 
-        while (hasMoreSpans || !matchList.isEmpty() || !candidateList.isEmpty()) {
+        while (hasMoreSpans || !matchList.isEmpty()
+                || !candidateList.isEmpty()) {
             if (!matchList.isEmpty()) {
                 matchDocNumber = firstSpans.doc();
                 matchStartPosition = firstSpans.start();
@@ -197,8 +198,8 @@
                 payloads.addAll(cs.getPayloads());
         }
 
-        matchList.add(new CandidateSpan(start, cs.getEnd(),
-                candidateListDocNum, cost, payloads));
+        matchList.add(new CandidateSpan(start, cs.getEnd(), candidateListDocNum,
+                cost, payloads));
     }
 
 
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/NonPartialOverlappingSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/NonPartialOverlappingSpans.java
index 07d1526..4464d90 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/NonPartialOverlappingSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/NonPartialOverlappingSpans.java
@@ -19,7 +19,7 @@
  * their positions and do not have a partial overlap.
  * 
  * @author margaretha
- * */
+ */
 public abstract class NonPartialOverlappingSpans extends SimpleSpans {
 
     private Logger log = LoggerFactory
@@ -97,7 +97,7 @@
      * @return 0 iff match is found, -1 to advance the firstspan, 1 to
      *         advance
      *         the secondspan
-     * */
+     */
     protected abstract int findMatch ();
 
 
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/OrderedDistanceSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/OrderedDistanceSpans.java
index 64507ab..52dc507 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/OrderedDistanceSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/OrderedDistanceSpans.java
@@ -16,7 +16,7 @@
  * Base class for calculating a distance between two ordered spans.
  * 
  * @author margaretha
- * */
+ */
 public abstract class OrderedDistanceSpans extends DistanceSpans {
 
     protected boolean hasMoreFirstSpans;
@@ -57,7 +57,7 @@
 
     /**
      * Finds a span match in the candidate list.
-     * */
+     */
     @Override
     protected boolean advance () throws IOException {
         while (hasMoreSpans && candidateListIndex < candidateList.size()) {
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/RelationSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/RelationSpans.java
index 59d678e..ca467fc 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/RelationSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/RelationSpans.java
@@ -48,7 +48,7 @@
  * relation target is always 2 regardless of the relation direction.
  * 
  * @author margaretha
- * */
+ */
 public class RelationSpans extends RelationBaseSpans {
 
     private int currentDoc, currentPosition;
@@ -61,8 +61,8 @@
     private byte sourceClass, targetClass;
 
     public static enum PayloadTypeIdentifier {
-        TERM_TO_TERM(32), TERM_TO_ELEMENT(33), ELEMENT_TO_TERM(34), ELEMENT_TO_ELEMENT(
-                35);
+        TERM_TO_TERM(32), TERM_TO_ELEMENT(33), ELEMENT_TO_TERM(
+                34), ELEMENT_TO_ELEMENT(35);
 
         private byte value;
 
@@ -260,8 +260,8 @@
         if (direction == 0) {
             payload.add(createClassPayload(cs.getLeftStart(), cs.getLeftEnd(),
                     tempSourceNum, false));
-            payload.add(createClassPayload(cs.getRightStart(),
-                    cs.getRightEnd(), tempTargetNum, false));
+            payload.add(createClassPayload(cs.getRightStart(), cs.getRightEnd(),
+                    tempTargetNum, false));
 
             if (sourceClass > 0) {
                 payload.add(createClassPayload(cs.getLeftStart(),
@@ -274,8 +274,8 @@
 
         }
         else {
-            payload.add(createClassPayload(cs.getRightStart(),
-                    cs.getRightEnd(), tempSourceNum, false));
+            payload.add(createClassPayload(cs.getRightStart(), cs.getRightEnd(),
+                    tempSourceNum, false));
             payload.add(createClassPayload(cs.getLeftStart(), cs.getLeftEnd(),
                     tempTargetNum, false));
 
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/RepetitionSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/RepetitionSpans.java
index 843ccd8..cedd25a 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/RepetitionSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/RepetitionSpans.java
@@ -24,7 +24,7 @@
  * repetition depends on the min and max parameters.
  * 
  * @author margaretha
- * */
+ */
 public class RepetitionSpans extends SimpleSpans {
 
     // Logger
@@ -179,8 +179,8 @@
                 if (i == 1) {
                     try {
                         matchSpan = startSpan.clone();
-                        matchSpan.setPayloads(computeMatchPayload(
-                                adjacentSpans, 0, endIndex - 1));
+                        matchSpan.setPayloads(computeMatchPayload(adjacentSpans,
+                                0, endIndex - 1));
                         matchList.add(matchSpan);
                     }
                     catch (CloneNotSupportedException e) {
@@ -250,8 +250,8 @@
      *            the end index
      * @return
      */
-    private long computeMatchCost (List<CandidateSpan> adjacentSpans,
-            int start, int end) {
+    private long computeMatchCost (List<CandidateSpan> adjacentSpans, int start,
+            int end) {
         long matchCost = 0;
         for (int i = start; i <= end; i++) {
             matchCost += adjacentSpans.get(i).getCost();
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/SegmentSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/SegmentSpans.java
index d6b5d12..96b699f 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/SegmentSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/SegmentSpans.java
@@ -17,7 +17,7 @@
  * have exactly the same start and end positions.
  * 
  * @author margaretha
- * */
+ */
 public class SegmentSpans extends SimpleSpans {
 
     private boolean isRelation;
@@ -90,7 +90,7 @@
      * firstspan and
      * secondspan are identical.
      * 
-     * */
+     */
     protected int findMatch () {
         if (firstSpans.start() == secondSpans.start()
                 && firstSpans.end() == secondSpans.end()) {
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/SimpleSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/SimpleSpans.java
index 6918e38..7917eb5 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/SimpleSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/SimpleSpans.java
@@ -20,7 +20,7 @@
  * and basic methods.
  * 
  * @author margaretha
- * */
+ */
 public abstract class SimpleSpans extends Spans {
     private SimpleSpanQuery query;
     protected boolean isStartEnumeration;
@@ -51,7 +51,8 @@
 
     public SimpleSpans (SimpleSpanQuery simpleSpanQuery,
                         LeafReaderContext context, Bits acceptDocs,
-                        Map<Term, TermContext> termContexts) throws IOException {
+                        Map<Term, TermContext> termContexts)
+            throws IOException {
         this();
         query = simpleSpanQuery;
         collectPayloads = query.isCollectPayloads();
@@ -76,7 +77,7 @@
      * document.
      * 
      * @return true iff such a document exists.
-     * */
+     */
     protected boolean ensureSameDoc (Spans x, Spans y) throws IOException {
         while (x.doc() != y.doc()) {
             if (x.doc() < y.doc()) {
@@ -100,7 +101,7 @@
      * Find the same doc shared by element, firstspan and secondspan.
      * 
      * @return true iff such a doc is found.
-     * */
+     */
     protected boolean findSameDoc (Spans x, Spans y, Spans e)
             throws IOException {
 
@@ -148,12 +149,10 @@
 
     @Override
     public String toString () {
-        return getClass().getName()
-                + "("
-                + query.toString()
-                + ")@"
-                + (isStartEnumeration ? "START" : (hasMoreSpans ? (doc() + ":"
-                        + start() + "-" + end()) : "END"));
+        return getClass().getName() + "(" + query.toString() + ")@"
+                + (isStartEnumeration ? "START"
+                        : (hasMoreSpans ? (doc() + ":" + start() + "-" + end())
+                                : "END"));
     }
 
 
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/SpansWithAttribute.java b/src/main/java/de/ids_mannheim/korap/query/spans/SpansWithAttribute.java
index 30e57ef..bc80e69 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/SpansWithAttribute.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/SpansWithAttribute.java
@@ -31,7 +31,7 @@
  * constraints have to be formulated in Conjunctive Normal Form (CNF).
  * 
  * @author margaretha
- * */
+ */
 public class SpansWithAttribute extends SimpleSpans {
 
     private SimpleSpans referentSpans;
@@ -298,7 +298,7 @@
      * Advances the element or attribute spans to be in the same
      * document and
      * start position.
-     * */
+     */
     private boolean ensureSamePosition (SimpleSpans spans,
             AttributeSpans attributes) throws IOException {
 
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/SubSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/SubSpans.java
index 57f8362..4989957 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/SubSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/SubSpans.java
@@ -178,9 +178,10 @@
         cs.setDoc(firstSpans.doc());
 
         if (DEBUG) {
-            log.trace("Start at absolute position {} "
-                    + "and end at absolute position {}", cs.getStart(),
-                    cs.getEnd());
+            log.trace(
+                    "Start at absolute position {} "
+                            + "and end at absolute position {}",
+                    cs.getStart(), cs.getEnd());
         };
 
         return true;
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/TermSpansWithId.java b/src/main/java/de/ids_mannheim/korap/query/spans/TermSpansWithId.java
index 0135fca..a8a4b14 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/TermSpansWithId.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/TermSpansWithId.java
@@ -23,7 +23,7 @@
  * payload.
  * 
  * @author margaretha
- * */
+ */
 public class TermSpansWithId extends SimpleSpans {
 
     private TermSpans termSpans;
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/TokenDistanceSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/TokenDistanceSpans.java
index a33e219..dbdf130 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/TokenDistanceSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/TokenDistanceSpans.java
@@ -24,7 +24,7 @@
  * maximum end positions of the child spans.
  * 
  * @author margaretha
- * */
+ */
 public class TokenDistanceSpans extends OrderedDistanceSpans {
 
     /**
@@ -71,7 +71,7 @@
      * list
      * prepared for the previous second spans.
      * 
-     * */
+     */
     private void copyPossibleCandidates () {
         List<CandidateSpan> temp = new ArrayList<>();
         for (CandidateSpan cs : candidateList) {
@@ -85,7 +85,7 @@
     /**
      * Add new possible firstspan candidates for the current
      * secondspan.
-     * */
+     */
     private void addNewCandidates () throws IOException {
         while (hasMoreFirstSpans && firstSpans.doc() == candidateListDocNum
                 && firstSpans.start() < secondSpans.end()) {
@@ -101,9 +101,8 @@
     @Override
     protected boolean findMatch () throws IOException {
         CandidateSpan candidateSpan = candidateList.get(candidateListIndex);
-        if (minDistance == 0
-                &&
-                // intersection
+        if (minDistance == 0 &&
+        // intersection
                 candidateSpan.getStart() < secondSpans.end()
                 && secondSpans.start() < candidateSpan.getEnd()) {
 
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/UnorderedDistanceSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/UnorderedDistanceSpans.java
index 3088b9f..72876ab 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/UnorderedDistanceSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/UnorderedDistanceSpans.java
@@ -23,7 +23,7 @@
  * order.
  * 
  * @author margaretha
- * */
+ */
 public abstract class UnorderedDistanceSpans extends DistanceSpans {
 
     protected int minDistance, maxDistance;
@@ -260,7 +260,7 @@
      * to the match list.
      * 
      * @return a candidate span match
-     * */
+     */
     protected CandidateSpan createMatchCandidate (CandidateSpan target,
             CandidateSpan cs, boolean isDistanceZero) {
 
@@ -278,7 +278,8 @@
                 payloads.addAll(cs.getPayloads());
             }
         }
-        CandidateSpan match = new CandidateSpan(start, end, doc, cost, payloads);
+        CandidateSpan match = new CandidateSpan(start, end, doc, cost,
+                payloads);
         match.setChildSpan(cs);
         return match;
     }
@@ -288,7 +289,7 @@
      * Assigns the first candidate span in the match list as the
      * current span
      * match, and removes it from the matchList.
-     * */
+     */
     private void setMatchProperties () {
         CandidateSpan cs = matchList.get(0);
         matchDocNumber = cs.getDoc();
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/UnorderedElementDistanceSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/UnorderedElementDistanceSpans.java
index 0fec0af..6850ab4 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/UnorderedElementDistanceSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/UnorderedElementDistanceSpans.java
@@ -26,7 +26,7 @@
  * the spans.
  * 
  * @author margaretha
- * */
+ */
 public class UnorderedElementDistanceSpans extends UnorderedDistanceSpans {
 
     private Spans elements;
@@ -147,9 +147,8 @@
      */
     private int findElementPosition (Spans span) throws IOException {
         // Check in the element list
-        if (!elementList.isEmpty()
-                && span.end() <= elementList.get(elementList.size() - 1)
-                        .getEnd()) {
+        if (!elementList.isEmpty() && span.end() <= elementList
+                .get(elementList.size() - 1).getEnd()) {
 
             for (CandidateSpan e : elementList)
                 if (e.getEnd() >= span.end() && e.getStart() <= span.start()) {
@@ -223,18 +222,20 @@
      * @return <code>true</code> if the target and candidate spans are
      *         within
      *         the maximum distance, <code>false</code> otherwise.
-     * */
+     */
     protected boolean isWithinMaxDistance (CandidateSpan target,
             CandidateSpan candidate) {
         int candidatePos = candidate.getPosition();
         int targetPos = target.getPosition();
 
         // left candidate
-        if (candidatePos < targetPos && candidatePos + maxDistance < targetPos) {
+        if (candidatePos < targetPos
+                && candidatePos + maxDistance < targetPos) {
             return false;
         }
         // right candidate
-        if (candidatePos > targetPos && targetPos + maxDistance < candidatePos) {
+        if (candidatePos > targetPos
+                && targetPos + maxDistance < candidatePos) {
             return false;
         }
         return true;
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/UnorderedTokenDistanceSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/UnorderedTokenDistanceSpans.java
index a8013bb..5c1350c 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/UnorderedTokenDistanceSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/UnorderedTokenDistanceSpans.java
@@ -21,7 +21,7 @@
  * distance is a token position.
  * 
  * @author margaretha
- * */
+ */
 public class UnorderedTokenDistanceSpans extends UnorderedDistanceSpans {
 
     /**
@@ -105,7 +105,8 @@
      *         within
      *         the maximum distance, <code>false</code> otherwise.
      */
-    protected boolean isWithinMaxDistance (CandidateSpan target, Spans candidate) {
+    protected boolean isWithinMaxDistance (CandidateSpan target,
+            Spans candidate) {
         // left candidate
         if (candidate.end() < target.getStart()
                 && candidate.end() + maxDistance <= target.getStart()) {
@@ -127,9 +128,8 @@
         List<CandidateSpan> matches = new ArrayList<>();
         int actualDistance;
         for (CandidateSpan cs : candidateList) {
-            if (minDistance == 0
-                    &&
-                    // intersection
+            if (minDistance == 0 &&
+            // intersection
                     target.getStart() < cs.getEnd()
                     && cs.getStart() < target.getEnd()) {
                 matches.add(createMatchCandidate(target, cs, true));
@@ -144,7 +144,8 @@
                 // right candidate
                 actualDistance = cs.getStart() - target.getEnd() + 1;
             }
-            if (minDistance <= actualDistance && actualDistance <= maxDistance) {
+            if (minDistance <= actualDistance
+                    && actualDistance <= maxDistance) {
                 matches.add(createMatchCandidate(target, cs, false));
             }
         }
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/WithinSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/WithinSpans.java
index 9234716..fe507d9 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/WithinSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/WithinSpans.java
@@ -303,7 +303,9 @@
                 // Fetch from second store?
                 else {
 
-                    /** TODO: Change this to a single embedded object! */
+                    /**
+                     * TODO: Change this to a single embedded object!
+                     */
                     this.embeddedStart = current.start;
                     this.embeddedEnd = current.end;
                     this.embeddedDoc = current.doc;
@@ -338,7 +340,8 @@
             // shift the stored spans
             if (!this.spanStore1.isEmpty()) {
                 if (DEBUG) {
-                    log.trace("Move everything from SpanStore 1 to SpanStore 2:");
+                    log.trace(
+                            "Move everything from SpanStore 1 to SpanStore 2:");
                     for (WithinSpan i : this.spanStore1) {
                         log.trace("     | {}", i.toString());
                     };
@@ -372,8 +375,8 @@
                 this.wrapDoc = this.wrapSpans.doc();
 
                 if (DEBUG)
-                    log.trace("   Forward wrap span to {}", _currentWrap()
-                            .toString());
+                    log.trace("   Forward wrap span to {}",
+                            _currentWrap().toString());
 
                 if (this.embeddedDoc != this.wrapDoc) {
                     if (DEBUG)
@@ -842,8 +845,8 @@
 
     private WithinSpan _currentWrap () {
         WithinSpan _wrap = new WithinSpan();
-        _wrap.start = this.wrapStart != -1 ? this.wrapStart : this.wrapSpans
-                .start();
+        _wrap.start = this.wrapStart != -1 ? this.wrapStart
+                : this.wrapSpans.start();
         _wrap.end = this.wrapEnd != -1 ? this.wrapEnd : this.wrapSpans.end();
         _wrap.doc = this.wrapDoc != -1 ? this.wrapDoc : this.wrapSpans.doc();
         return _wrap;
@@ -874,7 +877,7 @@
           - storeEmbedded -> store span B for later checks
           - nextSpanA     -> forward a
           - nextSpanB     -> forward b
-
+        
           These rules were automatically generated
         */
 
@@ -1174,12 +1177,10 @@
 
     @Override
     public String toString () {
-        return getClass().getName()
-                + "("
-                + query.toString()
-                + ")@"
-                + (embeddedDoc <= 0 ? "START" : (more ? (doc() + ":" + start()
-                        + "-" + end()) : "END"));
+        return getClass().getName() + "(" + query.toString() + ")@"
+                + (embeddedDoc <= 0 ? "START"
+                        : (more ? (doc() + ":" + start() + "-" + end())
+                                : "END"));
     };
 
 
diff --git a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanAlterQueryWrapper.java b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanAlterQueryWrapper.java
index 8fd18cd..9b71cbf 100644
--- a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanAlterQueryWrapper.java
+++ b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanAlterQueryWrapper.java
@@ -48,8 +48,8 @@
         this.alternatives = new ArrayList<>();
         for (String term : terms) {
             this.isNull = false;
-            this.alternatives.add(new SpanSimpleQueryWrapper(new SpanTermQuery(
-                    new Term(this.field, term))));
+            this.alternatives.add(new SpanSimpleQueryWrapper(
+                    new SpanTermQuery(new Term(this.field, term))));
         };
     };
 
diff --git a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanAttributeQueryWrapper.java b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanAttributeQueryWrapper.java
index 0d0fe23..d2941f9 100644
--- a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanAttributeQueryWrapper.java
+++ b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanAttributeQueryWrapper.java
@@ -8,7 +8,7 @@
 
 /**
  * @author margaretha
- * */
+ */
 public class SpanAttributeQueryWrapper extends SpanQueryWrapper {
 
     private SpanQueryWrapper subquery;
diff --git a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanClassQueryWrapper.java b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanClassQueryWrapper.java
index 51d4ab7..c06194f 100644
--- a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanClassQueryWrapper.java
+++ b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanClassQueryWrapper.java
@@ -70,8 +70,8 @@
         if (this.subquery.isNull())
             return (SpanQuery) null;
 
-        SpanQuery sq = (SpanQuery) this.subquery
-                .retrieveNode(this.retrieveNode).toFragmentQuery();
+        SpanQuery sq = (SpanQuery) this.subquery.retrieveNode(this.retrieveNode)
+                .toFragmentQuery();
 
         if (sq == null)
             return (SpanQuery) null;
diff --git a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanExpansionQueryWrapper.java b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanExpansionQueryWrapper.java
index 7c4cf61..f4011c2 100644
--- a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanExpansionQueryWrapper.java
+++ b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanExpansionQueryWrapper.java
@@ -8,7 +8,6 @@
 import de.ids_mannheim.korap.query.SpanExpansionQuery;
 import de.ids_mannheim.korap.util.QueryException;
 
-
 import java.util.*;
 
 /*
@@ -21,48 +20,41 @@
 public class SpanExpansionQueryWrapper extends SpanQueryWrapper {
     private SpanQueryWrapper anchor;
 
-	// < 0 	to the left of anchor span 
+    // < 0 	to the left of anchor span 
     // >= 0  to the right of anchor span
-	private int direction;
+    private int direction;
 
-	// if > 0, collect expansion offsets
-	// using this label
+    // if > 0, collect expansion offsets
+    // using this label
     private byte classNumber;
 
 
-    public SpanExpansionQueryWrapper (SpanQueryWrapper anchor,
-									  int min,
-									  int max,
-									  int direction,
-									  byte classNumber
-		) {
-		this.anchor = anchor;
-		this.isNull = false;
-		this.min = min;
-		this.max = max;
-		this.direction = direction;
-		this.classNumber = classNumber;
-		this.isExtended = true;
-		if (direction >= 0)
-			this.isExtendedToTheRight = true;
+    public SpanExpansionQueryWrapper (SpanQueryWrapper anchor, int min, int max,
+                                      int direction, byte classNumber) {
+        this.anchor = anchor;
+        this.isNull = false;
+        this.min = min;
+        this.max = max;
+        this.direction = direction;
+        this.classNumber = classNumber;
+        this.isExtended = true;
+        if (direction >= 0)
+            this.isExtendedToTheRight = true;
     };
 
-	@Override
+
+    @Override
     public boolean isNull () {
-		// Needs to be overwritten, as min and max do not indicate null value
+        // Needs to be overwritten, as min and max do not indicate null value
         return this.isNull;
     };
-	
 
-	@Override
+
+    @Override
     public SpanQuery toFragmentQuery () throws QueryException {
-		return new SpanExpansionQuery(
-			this.anchor.retrieveNode(this.retrieveNode).toFragmentQuery(),
-			this.getMin(),
-			this.getMax(),
-			this.direction,
-			this.classNumber,
-			true
-			);
+        return new SpanExpansionQuery(
+                this.anchor.retrieveNode(this.retrieveNode).toFragmentQuery(),
+                this.getMin(), this.getMax(), this.direction, this.classNumber,
+                true);
     };
 };
diff --git a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanFocusQueryWrapper.java b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanFocusQueryWrapper.java
index 8fadb3e..89d8f65 100644
--- a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanFocusQueryWrapper.java
+++ b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanFocusQueryWrapper.java
@@ -52,8 +52,9 @@
     public SpanQuery toFragmentQuery () throws QueryException {
         if (this.subquery.isNull())
             return (SpanQuery) null;
-        return new SpanFocusQuery(this.subquery.retrieveNode(this.retrieveNode)
-                .toFragmentQuery(), this.number);
+        return new SpanFocusQuery(
+                this.subquery.retrieveNode(this.retrieveNode).toFragmentQuery(),
+                this.number);
     };
 
 
diff --git a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanQueryWrapper.java b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanQueryWrapper.java
index f0221d5..c6e1355 100644
--- a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanQueryWrapper.java
+++ b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanQueryWrapper.java
@@ -95,8 +95,8 @@
         return this.isOptional;
     };
 
-	
-	public SpanQueryWrapper isOptional (boolean opt) {
+
+    public SpanQueryWrapper isOptional (boolean opt) {
         this.isOptional = opt;
         return this;
     };
@@ -219,6 +219,7 @@
         return this;
     };
 
+
     /**
      * Check, if the wrapped query can be used as an
      * anchor query in a sequence, i.e. a query that
@@ -419,10 +420,10 @@
      */
     public String toString () {
         String string = "" + (this.isNull() ? "isNull" : "notNull") + "-"
-			+ (this.isEmpty() ? "isEmpty" : "notEmpty") + "-"
-			+ (this.isOptional() ? "isOptional" : "notOptional") + "-"
-			+ (this.isExtendedToTheRight() ? "isExtendedToTheRight" : "notExtendedToTheRight");
-		;
+                + (this.isEmpty() ? "isEmpty" : "notEmpty") + "-"
+                + (this.isOptional() ? "isOptional" : "notOptional") + "-"
+                + (this.isExtendedToTheRight() ? "isExtendedToTheRight"
+                        : "notExtendedToTheRight");;
         return string;
     };
 };
diff --git a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanRepetitionQueryWrapper.java b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanRepetitionQueryWrapper.java
index 65c4da6..808b064 100644
--- a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanRepetitionQueryWrapper.java
+++ b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanRepetitionQueryWrapper.java
@@ -101,8 +101,9 @@
                     .toFragmentQuery();
 
         // That's a fine repetition query
-        return new SpanRepetitionQuery(this.subquery.retrieveNode(
-                this.retrieveNode).toFragmentQuery(), this.min, this.max, true);
+        return new SpanRepetitionQuery(
+                this.subquery.retrieveNode(this.retrieveNode).toFragmentQuery(),
+                this.min, this.max, true);
     };
 
 
diff --git a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSegmentQueryWrapper.java b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSegmentQueryWrapper.java
index 1b1929b..8623671 100644
--- a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSegmentQueryWrapper.java
+++ b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSegmentQueryWrapper.java
@@ -196,7 +196,8 @@
 
 
     public SpanQuery toFragmentQuery () throws QueryException {
-        if (this.isNull || (this.inclusive.size() + this.exclusive.size() == 0)) {
+        if (this.isNull
+                || (this.inclusive.size() + this.exclusive.size() == 0)) {
             return (SpanQuery) null;
         }
         else if (this.inclusive.size() >= 1 && this.exclusive.size() >= 1) {
diff --git a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSequenceQueryWrapper.java b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSequenceQueryWrapper.java
index c5aac76..2a263a6 100644
--- a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSequenceQueryWrapper.java
+++ b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSequenceQueryWrapper.java
@@ -89,8 +89,8 @@
     public SpanSequenceQueryWrapper (String field, String ... terms) {
         this(field);
         for (int i = 0; i < terms.length; i++) {
-            this.segments.add(new SpanSimpleQueryWrapper(new SpanTermQuery(
-                    new Term(field, terms[i]))));
+            this.segments.add(new SpanSimpleQueryWrapper(
+                    new SpanTermQuery(new Term(field, terms[i]))));
         };
         // Query can't be null anymore
         this.isNull = false;
@@ -133,8 +133,8 @@
         if (DEBUG) {
             if (!sswq.isEmpty()) {
                 try {
-                    log.trace("New span sequence {}", sswq.toFragmentQuery()
-                            .toString());
+                    log.trace("New span sequence {}",
+                            sswq.toFragmentQuery().toString());
                 }
                 catch (QueryException qe) {
                     log.trace("Unable to serialize query {}", qe.getMessage());
@@ -392,8 +392,8 @@
             this.constraints = new ArrayList<DistanceConstraint>(1);
         if (DEBUG)
             log.trace("With contraint {}-{} (excl {})", min, max, exclusion);
-        this.constraints.add(new DistanceConstraint(min, max, this.isInOrder,
-                exclusion));
+        this.constraints.add(
+                new DistanceConstraint(min, max, this.isInOrder, exclusion));
         return this;
     };
 
@@ -476,8 +476,8 @@
             String unit, boolean exclusion) {
 
         if (DEBUG)
-            log.trace("With contraint {}-{} (unit {}, excl {})", min, max,
-                    unit, exclusion);
+            log.trace("With contraint {}-{} (unit {}, excl {})", min, max, unit,
+                    exclusion);
 
         // Word unit
         if (unit.equals("w")) {
@@ -486,15 +486,15 @@
             if (this.constraints == null)
                 this.constraints = new ArrayList<DistanceConstraint>(1);
 
-            this.constraints.add(new DistanceConstraint(min, max, isInOrder,
-                    exclusion));
+            this.constraints.add(
+                    new DistanceConstraint(min, max, isInOrder, exclusion));
 
             return this;
         };
 
         // Element unit (sentence or paragraph)
-        return this.withConstraint(min, max, new SpanElementQueryWrapper(
-                this.field, unit), exclusion);
+        return this.withConstraint(min, max,
+                new SpanElementQueryWrapper(this.field, unit), exclusion);
     };
 
 
@@ -545,9 +545,10 @@
         // Element unit (sentence or paragraph)
         // Todo: This should possibly be evaluated to a query later on!
         try {
-            this.constraints.add(new DistanceConstraint((SpanElementQuery) unit
-                    .retrieveNode(this.retrieveNode).toFragmentQuery(), min,
-                    max, isInOrder, exclusion));
+            this.constraints.add(new DistanceConstraint(
+                    (SpanElementQuery) unit.retrieveNode(this.retrieveNode)
+                            .toFragmentQuery(),
+                    min, max, isInOrder, exclusion));
         }
         catch (QueryException qe) {
             this.constraintException = qe;
@@ -741,7 +742,7 @@
             return (SpanQuery) query;
         };
 
-		// DistanceQueries with problems
+        // DistanceQueries with problems
         if (this.hasConstraints() && this.isProblematic) {
             throw new QueryException(613,
                     "Distance constraints not supported with empty, optional or negative operands");
@@ -769,8 +770,8 @@
                     if (sq == null)
                         continue;
 
-                    SpanDistanceQuery sdquery = new SpanDistanceQuery(query,
-                            sq, constraint, true);
+                    SpanDistanceQuery sdquery = new SpanDistanceQuery(query, sq,
+                            constraint, true);
                     query = (SpanQuery) sdquery;
                 };
             }
@@ -793,8 +794,8 @@
                     if (sq == null)
                         continue;
 
-                    SpanDistanceQuery sdquery = new SpanDistanceQuery(query,
-                            sq, constraint, true);
+                    SpanDistanceQuery sdquery = new SpanDistanceQuery(query, sq,
+                            constraint, true);
                     query = (SpanQuery) sdquery;
                 };
             };
@@ -828,12 +829,12 @@
       segments to extensions).
       This has to be done as long as there are problematic segments
       In the queries.
-
+    
       While there is a segment isNegative() or isOptional() or isEmpty() do
       - look for an anchor next to it
       - merge the problematic segment with the anchor
       - go on
-
+    
       - This does not work for distance constraints!
     */
     private boolean _solveProblematicSequence () {
@@ -875,8 +876,7 @@
 
                     // Insert the solution
                     try {
-                        this.segments.set(
-                                i + 1,
+                        this.segments.set(i + 1,
                                 _merge(this.segments.get(i + 1), underScrutiny,
                                         false));
                     }
@@ -906,10 +906,8 @@
 
                     // Insert the solution
                     try {
-                        this.segments.set(
-                                i - 1,
-                                _merge(this.segments.get(i - 1), underScrutiny,
-                                        true));
+                        this.segments.set(i - 1, _merge(
+                                this.segments.get(i - 1), underScrutiny, true));
                     }
                     catch (QueryException e) {
                         this.isSolved = true;
@@ -969,8 +967,8 @@
         int direction = mergeLeft ? 1 : -1;
 
         if (DEBUG)
-            log.trace("Will merge two spans to {}", mergeLeft ? "left"
-                    : "right");
+            log.trace("Will merge two spans to {}",
+                    mergeLeft ? "left" : "right");
 
         // Make empty extension to anchor
         if (problem.isEmpty()) {
@@ -980,46 +978,44 @@
                 log.trace("Problem is empty with class {}",
                         problem.getClassNumber());
 
-			// Merge extensions!
-			if (!problem.hasClass() &&
-				!anchor.hasClass() &&
-				anchor.isExtended()) {
+            // Merge extensions!
+            if (!problem.hasClass() && !anchor.hasClass()
+                    && anchor.isExtended()) {
 
-				if (DEBUG)
-					log.trace("It may be possible to extend anchor with problem");
-				
-				if (
-					// Further extend to the right ...
-					(direction >= 0 && anchor.isExtendedToTheRight) ||
+                if (DEBUG)
+                    log.trace(
+                            "It may be possible to extend anchor with problem");
 
-					// or the left
-					(direction < 0 && !anchor.isExtendedToTheRight)) {
+                if (
+                // Further extend to the right ...
+                (direction >= 0 && anchor.isExtendedToTheRight) ||
 
-					if (DEBUG)
-						log.trace("Readjust min and max");
+                // or the left
+                        (direction < 0 && !anchor.isExtendedToTheRight)) {
 
-					// Readjust the anchor
-					anchor.setMin(anchor.getMin() + problem.getMin());
-					anchor.setMax(anchor.getMax() + problem.getMax());
+                    if (DEBUG)
+                        log.trace("Readjust min and max");
 
-					/*
-					 * This is wrong - min is only relevant for extensions
-					if (anchor.getMin() > 0)
-						anchor.isOptional = false;
-					*/					
-					return anchor;
-				};
-			};
+                    // Readjust the anchor
+                    anchor.setMin(anchor.getMin() + problem.getMin());
+                    anchor.setMax(anchor.getMax() + problem.getMax());
 
-			// Can't merge extensions
-			SpanQueryWrapper sqw = new SpanExpansionQueryWrapper(
-				anchor,
-				problem.isOptional() ? 0 : problem.getMin(),
-				problem.getMax(),
-				direction,
-				problem.hasClass() ? problem.getClassNumber() : (byte) 0
-				).isExtended(true);
-				
+                    /*
+                     * This is wrong - min is only relevant for extensions
+                    if (anchor.getMin() > 0)
+                    	anchor.isOptional = false;
+                    */
+                    return anchor;
+                };
+            };
+
+            // Can't merge extensions
+            SpanQueryWrapper sqw = new SpanExpansionQueryWrapper(anchor,
+                    problem.isOptional() ? 0 : problem.getMin(),
+                    problem.getMax(), direction,
+                    problem.hasClass() ? problem.getClassNumber() : (byte) 0)
+                            .isExtended(true);
+
             // Set right extension
             if (direction >= 0)
                 sqw.isExtendedToTheRight(true);
@@ -1036,17 +1032,17 @@
                 log.trace("Problem is negative with class {}",
                         problem.getClassNumber());
 
-			// TODO: Should probably wrapped as well!
-			// A sequence of negative tokens may expand jointly!
-			query = new SpanExpansionQuery(anchor.retrieveNode(
-											   this.retrieveNode).toFragmentQuery(), problem.retrieveNode(
-												   this.retrieveNode).toFragmentQuery(), problem.getMin(),
-										   problem.getMax(), direction,
-										   problem.hasClass() ? problem.getClassNumber() : (byte) 0,
-										   true);
+            // TODO: Should probably wrapped as well!
+            // A sequence of negative tokens may expand jointly!
+            query = new SpanExpansionQuery(
+                    anchor.retrieveNode(this.retrieveNode).toFragmentQuery(),
+                    problem.retrieveNode(this.retrieveNode).toFragmentQuery(),
+                    problem.getMin(), problem.getMax(), direction,
+                    problem.hasClass() ? problem.getClassNumber() : (byte) 0,
+                    true);
 
             SpanQueryWrapper sqw = new SpanSimpleQueryWrapper(query)
-				.isExtended(true);
+                    .isExtended(true);
 
             // Set right extension
             if (direction >= 0)
@@ -1058,29 +1054,25 @@
         if (DEBUG)
             log.trace("Problem is optional");
 
-		// [base=der][][base=Baum]?
+        // [base=der][][base=Baum]?
         // [base=der][base=baum]?
 
         // [base=der]
-        SpanAlterQueryWrapper saqw = new SpanAlterQueryWrapper(
-			this.field,
-			anchor
-			);
+        SpanAlterQueryWrapper saqw = new SpanAlterQueryWrapper(this.field,
+                anchor);
 
         // [base=der]
-        SpanSequenceQueryWrapper ssqw = new SpanSequenceQueryWrapper(
-			this.field,
-			anchor
-			);
+        SpanSequenceQueryWrapper ssqw = new SpanSequenceQueryWrapper(this.field,
+                anchor);
 
         // [base=der][base=baum]
-	    if (mergeLeft) {
+        if (mergeLeft) {
             ssqw.append(problem.isOptional(false));
-		}
+        }
         // [base=baum][base=der]
         else {
             ssqw.prepend(problem.isOptional(false));
-		}
+        }
 
         saqw.or(ssqw);
 
diff --git a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSimpleQueryWrapper.java b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSimpleQueryWrapper.java
index 3d9c76a..cdf4619 100644
--- a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSimpleQueryWrapper.java
+++ b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSimpleQueryWrapper.java
@@ -26,18 +26,20 @@
         this.query = query;
     };
 
-	// This is similar to a clone
-	public SpanSimpleQueryWrapper (SpanQueryWrapper query) throws QueryException {
-		this.hasClass = query.hasClass();
-		this.isOptional = query.isOptional();
-		this.isNegative = query.isNegative();
-		this.isEmpty = query.isEmpty();
-		this.isExtended = query.isExtended();
-		this.isExtendedToTheRight = query.isExtendedToTheRight();
-		this.maybeUnsorted = query.maybeUnsorted();
-		this.retrieveNode = query.retrieveNode;
-		this.query = query.toFragmentQuery();
-		this.isNull = query.isNull();
+
+    // This is similar to a clone
+    public SpanSimpleQueryWrapper (SpanQueryWrapper query)
+            throws QueryException {
+        this.hasClass = query.hasClass();
+        this.isOptional = query.isOptional();
+        this.isNegative = query.isNegative();
+        this.isEmpty = query.isEmpty();
+        this.isExtended = query.isExtended();
+        this.isExtendedToTheRight = query.isExtendedToTheRight();
+        this.maybeUnsorted = query.maybeUnsorted();
+        this.retrieveNode = query.retrieveNode;
+        this.query = query.toFragmentQuery();
+        this.isNull = query.isNull();
     };
 
 
diff --git a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSubspanQueryWrapper.java b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSubspanQueryWrapper.java
index d311a27..7e91844 100644
--- a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSubspanQueryWrapper.java
+++ b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSubspanQueryWrapper.java
@@ -25,7 +25,8 @@
 
 
     public SpanSubspanQueryWrapper (SpanQueryWrapper sqw, int startOffset,
-                                    int length) throws QueryException {
+                                    int length)
+            throws QueryException {
         if (length < 0) {
             throw new QueryException(
                     "SpanSubspanQuery cannot have length less than 0.");
diff --git a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanWithAttributeQueryWrapper.java b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanWithAttributeQueryWrapper.java
index 435b3ee..266e051 100644
--- a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanWithAttributeQueryWrapper.java
+++ b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanWithAttributeQueryWrapper.java
@@ -15,7 +15,7 @@
  * No optimization using expansion
  * 
  * @author margaretha
- * */
+ */
 public class SpanWithAttributeQueryWrapper extends SpanQueryWrapper {
 
     private SpanQueryWrapper withIdQueryWrapper = null;
@@ -33,7 +33,8 @@
             return;
         }
         if (attrQuery.isNegative) {
-            throw new QueryException("The query requires a positive attribute.");
+            throw new QueryException(
+                    "The query requires a positive attribute.");
         }
         this.attrQueryWrapper = attrQuery;
         this.isSingleAttribute = true;
@@ -153,7 +154,8 @@
 
     private SpanWithAttributeQuery createSpanWithSingleAttributeQuery (
             SimpleSpanQuery withIdQuery) throws QueryException {
-        SpanAttributeQuery attrQuery = createSpanAttributeQuery(this.attrQueryWrapper);
+        SpanAttributeQuery attrQuery = createSpanAttributeQuery(
+                this.attrQueryWrapper);
         if (attrQuery != null) {
             if (withIdQuery != null) {
                 return new SpanWithAttributeQuery(withIdQuery, attrQuery, true);
diff --git a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanWithinQueryWrapper.java b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanWithinQueryWrapper.java
index dc1f449..576b1e0 100644
--- a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanWithinQueryWrapper.java
+++ b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanWithinQueryWrapper.java
@@ -96,9 +96,10 @@
 
         // TODO: if (wrap.isNegative())
 
-        return new SpanWithinQuery(this.element.retrieveNode(this.retrieveNode)
-                .toFragmentQuery(), this.wrap.retrieveNode(this.retrieveNode)
-                .toFragmentQuery(), this.flag);
+        return new SpanWithinQuery(
+                this.element.retrieveNode(this.retrieveNode).toFragmentQuery(),
+                this.wrap.retrieveNode(this.retrieveNode).toFragmentQuery(),
+                this.flag);
     };
 
 
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 965c736..4bf7109 100644
--- a/src/main/java/de/ids_mannheim/korap/response/Match.java
+++ b/src/main/java/de/ids_mannheim/korap/response/Match.java
@@ -602,7 +602,8 @@
     /**
      * Get identifier for a specific position.
      * 
-     * @param int Position to get identifier on.
+     * @param int
+     *            Position to get identifier on.
      */
     @JsonIgnore
     public String getPosID (int pos) {
@@ -693,8 +694,8 @@
                         && contextSpans.end() >= this.getStartPos()) {
 
                     // Set as newStart
-                    newStart = contextSpans.start() > newStart ? contextSpans
-                            .start() : newStart;
+                    newStart = contextSpans.start() > newStart
+                            ? contextSpans.start() : newStart;
 
                     if (DEBUG)
                         log.trace("NewStart is at {}", newStart);
@@ -920,7 +921,8 @@
      * This takes a clean string and the tag stack
      * to decorate the string with annotations.
      */
-    private void _processHighlightSnippet (String clean, ArrayList<int[]> stack) {
+    private void _processHighlightSnippet (String clean,
+            ArrayList<int[]> stack) {
 
         if (DEBUG)
             log.trace("--- Process Highlight snippet");
@@ -1294,15 +1296,16 @@
             if (this.context.right.isToken()) {
                 endOffset = this.endPos + this.context.right.getLength() - 1;
                 if (DEBUG)
-                    log.trace("PTO will retrieve {} (Right context)", endOffset);
+                    log.trace("PTO will retrieve {} (Right context)",
+                            endOffset);
                 pto.add(ldid, endOffset);
 
             }
 
             // The right context is defined by characters
             else {
-                endOffsetChar = (endPosChar == -1) ? -1 : endPosChar
-                        + this.context.right.getLength();
+                endOffsetChar = (endPosChar == -1) ? -1
+                        : endPosChar + this.context.right.getLength();
             };
 
             if (startOffset != -1)
@@ -1336,7 +1339,8 @@
                     endOffsetChar);
 
         // Get snippet information from the primary data
-        if (endOffsetChar > -1 && (endOffsetChar < this.getPrimaryDataLength())) {
+        if (endOffsetChar > -1
+                && (endOffsetChar < this.getPrimaryDataLength())) {
             this.tempSnippet = this.getPrimaryData(startOffsetChar,
                     endOffsetChar);
         }
@@ -1351,8 +1355,8 @@
         if (DEBUG)
             log.trace(
                     "The match entry is {}-{} ({}-{}) with absolute offsetChars {}-{}",
-                    startPosChar - startOffsetChar, endPosChar
-                            - startOffsetChar, startPosChar, endPosChar,
+                    startPosChar - startOffsetChar,
+                    endPosChar - startOffsetChar, startPosChar, endPosChar,
                     startOffsetChar, endOffsetChar);
 
         // TODO: Simplify
diff --git a/src/main/java/de/ids_mannheim/korap/response/Response.java b/src/main/java/de/ids_mannheim/korap/response/Response.java
index 5108199..3d27919 100644
--- a/src/main/java/de/ids_mannheim/korap/response/Response.java
+++ b/src/main/java/de/ids_mannheim/korap/response/Response.java
@@ -206,8 +206,7 @@
     public Response setBenchmark (long ts1, long ts2) {
         this.benchmark = (ts2 - ts1) < 100_000_000 ?
         // Store as miliseconds
-        (((double) (ts2 - ts1) * 1e-6) + " ms")
-                :
+                (((double) (ts2 - ts1) * 1e-6) + " ms") :
                 // Store as seconds
                 (((double) (ts2 - ts1) / 1000000000.0) + " s");
         return this;
diff --git a/src/main/java/de/ids_mannheim/korap/response/Result.java b/src/main/java/de/ids_mannheim/korap/response/Result.java
index 83d08f4..0dabb24 100644
--- a/src/main/java/de/ids_mannheim/korap/response/Result.java
+++ b/src/main/java/de/ids_mannheim/korap/response/Result.java
@@ -89,8 +89,8 @@
         this.matches = new ArrayList<>(itemsPerPage);
         this.serialQuery = query;
         this.startIndex = startIndex;
-        this.itemsPerPage = (itemsPerPage > ITEMS_PER_PAGE_MAX || itemsPerPage < 1) ? ITEMS_PER_PAGE
-                : itemsPerPage;
+        this.itemsPerPage = (itemsPerPage > ITEMS_PER_PAGE_MAX
+                || itemsPerPage < 1) ? ITEMS_PER_PAGE : itemsPerPage;
         this.context = context;
     };
 
diff --git a/src/main/java/de/ids_mannheim/korap/response/collector/MatchCollectorDB.java b/src/main/java/de/ids_mannheim/korap/response/collector/MatchCollectorDB.java
index 0c5a604..26c5c97 100644
--- a/src/main/java/de/ids_mannheim/korap/response/collector/MatchCollectorDB.java
+++ b/src/main/java/de/ids_mannheim/korap/response/collector/MatchCollectorDB.java
@@ -140,8 +140,8 @@
             };
 
             // Prepare statement based on the string
-            PreparedStatement prep = this.connection.prepareStatement(sb
-                    .toString());
+            PreparedStatement prep = this.connection
+                    .prepareStatement(sb.toString());
 
             int i = 1;
             ListIterator li = this.matchCollector.listIterator();
diff --git a/src/main/java/de/ids_mannheim/korap/response/match/HighlightCombinator.java b/src/main/java/de/ids_mannheim/korap/response/match/HighlightCombinator.java
index 8292e4a..386afff 100644
--- a/src/main/java/de/ids_mannheim/korap/response/match/HighlightCombinator.java
+++ b/src/main/java/de/ids_mannheim/korap/response/match/HighlightCombinator.java
@@ -109,9 +109,11 @@
             lastComb = this.combine.peekLast();
 
             if (DEBUG)
-                log.trace("Closing element is unbalanced - {} "
-                        + "!= {} with lastComb {}|{}|{}", eold, number,
-                        lastComb.type, lastComb.number, lastComb.characters);
+                log.trace(
+                        "Closing element is unbalanced - {} "
+                                + "!= {} with lastComb {}|{}|{}",
+                        eold, number, lastComb.type, lastComb.number,
+                        lastComb.characters);
 
             // combinator is opening and the number is not equal to the last
             // element on the balanceStack
@@ -128,8 +130,8 @@
                     log.trace("close element a) {}", eold);
 
                 // Add a closer for the old element (this has following elements)
-                this.combine.add(new HighlightCombinatorElement((byte) 2, eold,
-                        false));
+                this.combine.add(
+                        new HighlightCombinatorElement((byte) 2, eold, false));
             };
 
             // add this element number temporarily on the stack
@@ -143,8 +145,8 @@
         lastComb = this.combine.peekLast();
 
         if (DEBUG) {
-            log.trace("LastComb: " + lastComb.type + '|' + lastComb.number
-                    + '|' + lastComb.characters + " for " + number);
+            log.trace("LastComb: " + lastComb.type + '|' + lastComb.number + '|'
+                    + lastComb.characters + " for " + number);
             log.trace("Stack for checking 2: {}|{}|{}|{}", lastComb.type,
                     lastComb.number, lastComb.characters, number);
         };
diff --git a/src/main/java/de/ids_mannheim/korap/response/match/HighlightCombinatorElement.java b/src/main/java/de/ids_mannheim/korap/response/match/HighlightCombinatorElement.java
index 9762aef..ffc9638 100644
--- a/src/main/java/de/ids_mannheim/korap/response/match/HighlightCombinatorElement.java
+++ b/src/main/java/de/ids_mannheim/korap/response/match/HighlightCombinatorElement.java
@@ -33,7 +33,8 @@
     // Constructor for highlighting elements,
     // that may not be terminal, i.e. they were closed and will
     // be reopened for overlapping issues.
-    public HighlightCombinatorElement (byte type, int number, boolean terminal) {
+    public HighlightCombinatorElement (byte type, int number,
+                                       boolean terminal) {
         this.type = type;
         this.number = number;
         this.terminal = terminal;
@@ -60,16 +61,18 @@
 
             else if (this.number < -1) {
                 sb.append("<span xml:id=\"")
-                        .append(escapeHTML(match.getPosID(match
-                                .getClassID(this.number)))).append("\">");
+                        .append(escapeHTML(
+                                match.getPosID(match.getClassID(this.number))))
+                        .append("\">");
             }
 
             else if (this.number >= 256) {
                 sb.append("<span ");
                 if (this.number < 2048) {
                     sb.append("title=\"")
-                            .append(escapeHTML(match
-                                    .getAnnotationID(this.number))).append('"');
+                            .append(escapeHTML(
+                                    match.getAnnotationID(this.number)))
+                            .append('"');
                 }
                 else {
                     Relation rel = match.getRelationID(this.number);
diff --git a/src/main/java/de/ids_mannheim/korap/server/Resource.java b/src/main/java/de/ids_mannheim/korap/server/Resource.java
index e4b94ff..26d9c2c 100644
--- a/src/main/java/de/ids_mannheim/korap/server/Resource.java
+++ b/src/main/java/de/ids_mannheim/korap/server/Resource.java
@@ -292,8 +292,8 @@
 
         // Get the database
         try {
-            final MatchCollectorDB mc = new MatchCollectorDB(1000, "Res_"
-                    + resultID);
+            final MatchCollectorDB mc = new MatchCollectorDB(1000,
+                    "Res_" + resultID);
             final ComboPooledDataSource pool = Node.getDBPool();
             mc.setDBPool("mysql", pool, pool.getConnection());
 
@@ -348,7 +348,8 @@
     @GET
     @Path("/match/{matchID}")
     @Produces(MediaType.APPLICATION_JSON)
-    public String match (@PathParam("matchID") String id, @Context UriInfo uri) {
+    public String match (@PathParam("matchID") String id,
+            @Context UriInfo uri) {
 
         Response kresp = _initResponse();
         if (kresp.hasErrors())
@@ -361,7 +362,8 @@
         // Get query parameters
         MultivaluedMap<String, String> qp = uri.getQueryParameters();
 
-        boolean includeSpans = false, includeHighlights = true, extendToSentence = false, info = false;
+        boolean includeSpans = false, includeHighlights = true,
+                extendToSentence = false, info = false;
 
         // Optional query parameter "info" for more information on the match
         if (!_isNull(qp.getFirst("info")))
@@ -387,8 +389,9 @@
 
         try {
             // Get match info
-            return index.getMatchInfo(id, "tokens", info, foundries, layers,
-                    includeSpans, includeHighlights, extendToSentence)
+            return index
+                    .getMatchInfo(id, "tokens", info, foundries, layers,
+                            includeSpans, includeHighlights, extendToSentence)
                     .toJsonString();
         }
 
@@ -407,9 +410,9 @@
       POST /peek
       POST /?text_id=...
       POST /:text_id/
-
+    
       PUT /:text_id
-
+    
       DELETE /:text_id
       DELETE /:corpus_sigle
       DELETE /:corpus_sigle/:doc_sigle
diff --git a/src/main/java/de/ids_mannheim/korap/util/KrillString.java b/src/main/java/de/ids_mannheim/korap/util/KrillString.java
index d3da39d..3e0095e 100644
--- a/src/main/java/de/ids_mannheim/korap/util/KrillString.java
+++ b/src/main/java/de/ids_mannheim/korap/util/KrillString.java
@@ -28,7 +28,7 @@
      */
     public static String StringfromFile (String path, Charset encoding)
             throws IOException {
-        path = URLDecoder.decode(path,"UTF-8");
+        path = URLDecoder.decode(path, "UTF-8");
         path = path.replaceFirst("^/(.:/)", "$1");
         Path p = Paths.get(path);
         byte[] encoded = Files.readAllBytes(p);
