diff --git a/Changes b/Changes
index a2f7ddf..3e98af2 100644
--- a/Changes
+++ b/Changes
@@ -1,6 +1,9 @@
-0.49.3 2014-01-15
+0.49.3 2014-01-26
         - [documentation] Improved documentation for API classes (diewald)
 	- [documentation] Improved documentation for various queries (margaretha)
+	- [feature] Added deserialization of SpanSubSpanQueries (margaretha)
+	- [bugfix] Null filters are now correctly extended (diewald)
+	- [cleanup] Refactoring of KorapResult and KorapResponse (diewald)
 
 0.49.2 2014-12-05
 	- [documentation] Improved documentation for various queries (margaretha)
diff --git a/src/main/java/de/ids_mannheim/korap/KorapCollection.java b/src/main/java/de/ids_mannheim/korap/KorapCollection.java
index e7b8d02..1e0d173 100644
--- a/src/main/java/de/ids_mannheim/korap/KorapCollection.java
+++ b/src/main/java/de/ids_mannheim/korap/KorapCollection.java
@@ -31,7 +31,7 @@
  * It works - so I got that going for
  * me, which is nice.
  *
- * @author Nils Diewald
+ * @author diewald
  */
 
 
@@ -292,48 +292,40 @@
                 noDoc = false;
             };
 
+            for (FilterOperation kc : filters) {
+                if (DEBUG)
+                    log.trace("FILTER: {}", kc);
+
+                // TODO: BUG???
+                docids = kc.filter.getDocIdSet(atomic, kc.isExtension() ? null : bitset);
+                filterIter = docids.iterator();
+
+                if (filterIter == null) {
+                    // There must be a better way ...
+                    if (kc.isFilter()) {
+                        // TODO: Check if this is really correct!
+                        // Maybe here is the bug
+                        bitset.clear(0, bitset.length());
+                        noDoc = true;
+                    };
+                    continue;
+                };
+                if (kc.isExtension()) {
+                    // System.err.println("Term found!");
+                    // System.err.println("Old Card:" + bitset.cardinality());
+                    bitset.or(filterIter);
+                    // System.err.println("New Card:" + bitset.cardinality());
+                }
+                else {
+                    bitset.and(filterIter);
+                };
+            };
+
             if (!noDoc) {
-                for (FilterOperation kc : filters) {
-                    if (DEBUG)
-                        log.trace("FILTER: {}", kc);
-
-                    // TODO: BUG!!!!!!!!!!
-                    docids = kc.filter.getDocIdSet(atomic, kc.isExtension() ? null : bitset);
-                    filterIter = docids.iterator();
-
-                    if (filterIter == null) {
-                        // There must be a better way ...
-                        if (kc.isFilter()) {
-                            // TODO: Check if this is really correct!
-                            // Maybe here is the bug
-                            bitset.clear(0, bitset.length());
-                            noDoc = true;
-                        }
-                        else {
-                            // System.err.println("No term found");
-                        };
-                        continue;
-                    };
-                    if (kc.isExtension()) {
-                        // System.err.println("Term found!");
-                        // System.err.println("Old Card:" + bitset.cardinality());
-                        bitset.or(filterIter);
-                        // System.err.println("New Card:" + bitset.cardinality());
-                    }
-                    else {
-                        bitset.and(filterIter);
-                    };
+                FixedBitSet livedocs = (FixedBitSet) atomic.reader().getLiveDocs();
+                if (livedocs != null) {
+                    bitset.and(livedocs);
                 };
-
-                if (!noDoc) {
-                    FixedBitSet livedocs = (FixedBitSet) atomic.reader().getLiveDocs();
-                    if (livedocs != null) {
-                        bitset.and(livedocs);
-                    };
-                };
-            }
-            else {
-                return bitset;
             };
         }
         else {
@@ -353,7 +345,7 @@
     public long numberOf (String type) throws IOException {
         if (this.index == null)
             return (long) -1;
-        
+
         return this.index.numberOf(this, "tokens", type);
     };
 
diff --git a/src/main/java/de/ids_mannheim/korap/KorapIndex.java b/src/main/java/de/ids_mannheim/korap/KorapIndex.java
index 9781476..17ffb03 100644
--- a/src/main/java/de/ids_mannheim/korap/KorapIndex.java
+++ b/src/main/java/de/ids_mannheim/korap/KorapIndex.java
@@ -1266,12 +1266,18 @@
                     
                     // Do not load all of this, in case the doc is the same!
                     Document doc = lreader.document(localDocID, fields);
-                    KorapMatch match = kr.addMatch(
+
+                    // Create new KorapMatch
+                    KorapMatch match = new KorapMatch(
                         pto,
                         localDocID,
                         spans.start(),
                         spans.end()
                     );
+                    match.setContext(kr.getContext());
+
+                    // Add match to KorapResult
+                    kr.add(match);
 
                     if (spans.isPayloadAvailable())
                         match.addPayload((List<byte[]>) spans.getPayload());
diff --git a/src/main/java/de/ids_mannheim/korap/KorapResult.java b/src/main/java/de/ids_mannheim/korap/KorapResult.java
index 6b5516e..524f54f 100644
--- a/src/main/java/de/ids_mannheim/korap/KorapResult.java
+++ b/src/main/java/de/ids_mannheim/korap/KorapResult.java
@@ -19,42 +19,56 @@
 import java.util.List;
 
 /*
-TODO: Reuse the KorapSearch code for data serialization!
+  TODO: Reuse the KorapSearch code for data serialization!
 */
-
+/**
+ * Response class for search results.
+ *
+ * @author diewald
+ * @see KorapResponse
+ */
 @JsonInclude(Include.NON_NULL)
 @JsonIgnoreProperties(ignoreUnknown = true)
 public class KorapResult extends KorapResponse {
     ObjectMapper mapper = new ObjectMapper();
 
     @JsonIgnore
-    public static final short ITEMS_PER_PAGE = 25;
+    public static final short ITEMS_PER_PAGE     = 25;
+    public static final short ITEMS_PER_PAGE_MAX = 100;
 
     private int startIndex = 0;
-    private long totalTexts, totalResults;
-
     private String query;
 
     private List<KorapMatch> matches;
 
-
     private SearchContext context;
 
     private short itemsPerPage = ITEMS_PER_PAGE,
-	          itemsPerResource = 0;
+              itemsPerResource = 0;
 
     private JsonNode request;
 
-
     // Logger
     // This is KorapMatch instead of KorapResult!
     private final static Logger log = LoggerFactory.getLogger(KorapMatch.class);
 
-    // Empty result
+
+    /**
+     * Construct a new KorapResult object.
+     */
     public KorapResult() {
         mapper.enable(SerializationFeature.INDENT_OUTPUT);
     };
 
+
+    /**
+     * Construct a new KorapResult object.
+     *
+     * @param query Query representation as a string.
+     * @param startIndex Offset position in match array.
+     * @param itemsPerPage Number of matches per page.
+     * @param context Requested {@link SearchContext}
+     */
     public KorapResult(String query,
                        int startIndex,
                        short itemsPerPage,
@@ -67,71 +81,66 @@
         this.matches = new ArrayList<>(itemsPerPage);
         this.query = query;
         this.startIndex = startIndex;
-        this.itemsPerPage = (itemsPerPage > 50 || itemsPerPage < 1) ?
-	    ITEMS_PER_PAGE : itemsPerPage;
+        this.itemsPerPage =
+            (itemsPerPage > ITEMS_PER_PAGE_MAX || itemsPerPage < 1) ?
+            ITEMS_PER_PAGE : itemsPerPage;
         this.context = context;
     };
 
 
+    /**
+     * Add a new match to the result set.
+     *
+     * @param match A {@link KorapMatch} to add.
+     */
     public void add (KorapMatch km) {
         this.matches.add(km);
     };
 
-    public KorapMatch addMatch (PositionsToOffset pto,
-				int localDocID,
-				int startPos,
-				int endPos) {
-        KorapMatch km = new KorapMatch(pto, localDocID, startPos, endPos);
 
-        // Temporary - should use the same interface like results
-        // in the future:
-        km.setContext(this.context);
-        this.add(km);
-        return km;
-    };
-
-    public short getItemsPerPage() {
+    /**
+     * Get number of items shown per page.
+     *
+     * @return Number of items shown per page.
+     */
+    public short getItemsPerPage () {
         return this.itemsPerPage;
     };
 
-    public void setRequest(JsonNode request) {
-        this.request = request;
+
+    /**
+     * Set number of items shown per page.
+     *
+     * @param count Number of items shown per page.
+     * @return {@link KorapResult} object for chaining.
+     */
+    public KorapResult setItemsPerPage (short count) {
+        this.itemsPerPage = count;
+        return this;
     };
 
-    public JsonNode getRequest() {
+
+    /**
+     * Get serialized query as a {@link JsonNode}.
+     *
+     * @return {@link JsonNode} representation of the query object.
+     */
+    public JsonNode getRequest () {
         return this.request;
     };
 
-    // Make this working in a KorapResult class
-    // that is independent from search and collection
-    public KorapResult setTotalTexts (long i) {
-        this.totalTexts = i;
-	return this;
+
+    /**
+     * Set serialized query as a {@link JsonNode}.
+     *
+     * @param request {@link JsonNode} representation of the query object.
+     * @return {@link KorapResult} object for chaining.
+     */    
+    public KorapResult setRequest (JsonNode request) {
+        this.request = request;
+        return this;
     };
 
-    public KorapResult incrTotalTexts (int i) {
-        this.totalTexts += i;
-	return this;
-    };
-
-    public long getTotalTexts() {
-        return this.totalTexts;
-    };
-
-
-    public KorapResult setTotalResults (long i) {
-        this.totalResults = i;
-	return this;
-    };
-
-    public KorapResult incrTotalResults (int i) {
-        this.totalResults += i;
-	return this;
-    };
-
-    public long getTotalResults() {
-        return this.totalResults;
-    };
 
     @JsonIgnore
     public void setItemsPerResource (short value) {
diff --git a/src/main/java/de/ids_mannheim/korap/KorapSearch.java b/src/main/java/de/ids_mannheim/korap/KorapSearch.java
index bc5d205..08c2da1 100644
--- a/src/main/java/de/ids_mannheim/korap/KorapSearch.java
+++ b/src/main/java/de/ids_mannheim/korap/KorapSearch.java
@@ -15,29 +15,33 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.JsonNode;
 
-// Todo: Use configuration file
-
 /*
-  Todo: Let this class extend KorapResult!
-  KorapResult = new KorapSearch(String json).run(KorapIndex ki);
-*/
+ * Todo: Use configuration file
+ * Todo: Let this class extend KorapResult!
+ *   KorapResult = new KorapSearch(String json).run(KorapIndex ki);
+ * Todo: Set timeout default value per config file
+ */
 
 /**
- * @author Nils Diewald
+ * KorapSearch is the central class for parameterized searches
+ * in the index, including the query, the collection,
+ * and result parameters. 
  *
- * KorapSearch implements an object for all search relevant parameters.
+ * @author diewald
+ *
  */
 public class KorapSearch extends Notifications {
-    private int startIndex = 0,
-	        limit = 0;
-    private short count = 25,
-	          countMax = 50;
+    private int
+        startIndex = 0,
+        limit = 0;
+    private short
+        count = 25,
+        countMax = 50;
     private boolean cutOff = false;
     private short itemsPerResource = 0;
     private SpanQuery query;
     private KorapCollection collection;
     private KorapIndex index;
-    //    private String error, warning;
 
     // Timeout search after milliseconds
     private long timeout = (long) 120_000;
@@ -52,135 +56,143 @@
     private long timeoutStart = Long.MIN_VALUE;
 
     {
-	context  = new SearchContext();
+        context  = new SearchContext();
 
-	// Lift legacy fields per default
-	fields = new HashSet<String>(16);
-	for (String field : new String[]{
-		"ID",
-		"UID",
-		"textSigle",
-		"corpusID",
-		"author",
-		"title",
-		"subTitle",
-		"textClass",
-		"pubPlace",
-		"pubDate",
-		"foundries",
-		"layerInfo",
-		"tokenization"}) {
-	    fields.add(field);
-	};
+        // Lift legacy fields per default
+        fields = new HashSet<String>(16);
+        for (String field : new String[]{
+                "ID",
+                "UID",
+                "textSigle",
+                "corpusID",
+                "author",
+                "title",
+                "subTitle",
+                "textClass",
+                "pubPlace",
+                "pubDate",
+                "foundries",
+                "layerInfo",
+                "tokenization"}) {
+            fields.add(field);
+        };
     };
 
     public KorapSearch (String jsonString) {
-	ObjectMapper mapper = new ObjectMapper();
+        ObjectMapper mapper = new ObjectMapper();
 
-	try {
-	    // Todo - use correct method!
-	    this.request = mapper.readTree(jsonString);
+        try {
+            // Todo - use correct method!
+            this.request = mapper.readTree(jsonString);
+            
+            // "query" value
+            if (this.request.has("query")) {
+                try {
+                    KorapQuery kq = new KorapQuery("tokens");
+                    SpanQueryWrapper qw = kq.fromJson(this.request.get("query"));
+                    
+                    if (qw.isEmpty()) {
+                        
+                        // Unable to process result
+                        this.addError(780, "This query matches everywhere");
+                    }
+                    else {
+                        this.query = qw.toQuery();
+                        if (qw.isOptional())
+                            this.addWarning(781, "Optionality of query is ignored");
+                        if (qw.isNegative())
+                            this.addWarning(782, "Exclusivity of query is ignored");
+                        
+                    };
+                    // Copy notifications from query
+                    this.copyNotificationsFrom(kq);
+                    kq.clearNotifications();
+                }
+                catch (QueryException q) {
+                    this.addError(q.getErrorCode(), q.getMessage());
+                };
+            }
+            else {
+                this.addError(700, "No query given");
+            };
+
+            // <legacycode>
+            if (this.request.has("warning") &&
+                this.request.get("warning").asText().length() > 0) {
+                this.addWarning(
+                    799,
+                    this.request.get("warning").asText()
+                );
+            };
+            // </legacycode>
+
+            // <legacycode>
+            if (this.request.has("warnings")) {
+                JsonNode warnings = this.request.get("warnings");
+                for (JsonNode node : warnings)
+                    if (node.asText().length() > 0)
+                        this.addWarning(799, node.asText());
+            };
+            // </legacycode>
+
+            // Copy notifications from request
+            this.copyNotificationsFrom(this.request);
 	    
-	    // "query" value
-	    if (this.request.has("query")) {
-		try {
-		    KorapQuery kq = new KorapQuery("tokens");
-		    SpanQueryWrapper qw = kq.fromJson(this.request.get("query"));
+            // virtual collections
+            if (this.request.has("collection") ||
+                // <legacycode>
+                this.request.has("collections")
+                // </legacycode>
+                ) {
+                this.setCollection(new KorapCollection(jsonString));
+            };
 
-		    if (qw.isEmpty()) {
+            // No errors - go on with parsing
+            if (!this.hasErrors()) {
+                if (this.request.has("meta")) {
+                    JsonNode meta = this.request.get("meta");
 
-			// Unable to process result
-			this.addError(780, "This query matches everywhere");
-		    }
-		    else {
-			this.query = qw.toQuery();
-			if (qw.isOptional())
-			    this.addWarning(781, "Optionality of query is ignored");
-			if (qw.isNegative())
-			    this.addWarning(782, "Exclusivity of query is ignored");
+                    // Defined count
+                    if (meta.has("count"))
+                        this.setCount(meta.get("count").asInt());
 
-		    };
-		    // Copy notifications from query
-		    this.copyNotificationsFrom(kq);
-		    kq.clearNotifications();
-		}
-		catch (QueryException q) {
-		    this.addError(q.getErrorCode(), q.getMessage());
-		};
-	    }
-	    else {
-		this.addError(700, "No query given");
-	    };
+                    // Defined startIndex
+                    if (meta.has("startIndex"))
+                        this.setStartIndex(meta.get("startIndex").asInt());
 
-	    // <legacycode>
-	    if (this.request.has("warning") &&
-		this.request.get("warning").asText().length() > 0)
-		this.addWarning(
-		    799,
-		    this.request.get("warning").asText()
-		);
-	    // </legacycode>
-	    // <legacycode>
-	    if (this.request.has("warnings")) {
-		JsonNode warnings = this.request.get("warnings");
-		for (JsonNode node : warnings)
-		    if (node.asText().length() > 0)
-			this.addWarning(799, node.asText());
-	    };
-	    // </legacycode>
+                    // Defined startPage
+                    if (meta.has("startPage"))
+                        this.setStartPage(meta.get("startPage").asInt());
 
-	    // Copy notifications from request
-	    this.copyNotificationsFrom(this.request);
-	    
-	    // virtual collections
-	    if (this.request.has("collection") ||
-		// Legacy collections
-		this.request.has("collections"))
-		this.setCollection(new KorapCollection(jsonString));
+                    // Defined cutOff
+                    if (meta.has("cutOff"))
+                        this.setCutOff(meta.get("cutOff").asBoolean());
 
-	    if (!this.hasErrors()) {
-		if (this.request.has("meta")) {
-		    JsonNode meta = this.request.get("meta");
+                    // Defined contexts
+                    if (meta.has("context"))
+                        this.context.fromJson(meta.get("context"));
 
-		    // Defined count
-		    if (meta.has("count"))
-			this.setCount(meta.get("count").asInt());
+                    // Defined resource count
+                    if (meta.has("timeout"))
+                        this.setTimeOut(meta.get("timeout").asLong());
 
-		    // Defined startIndex
-		    if (meta.has("startIndex"))
-			this.setStartIndex(meta.get("startIndex").asInt());
+                    // Defined resource count
+                    if (meta.has("itemsPerResource"))
+                        this.setItemsPerResource(
+                            meta.get("itemsPerResource").asInt()
+                    );
 
-		    // Defined startPage
-		    if (meta.has("startPage"))
-			this.setStartPage(meta.get("startPage").asInt());
+                    // Only lift a limited amount of fields from the metadata
+                    if (meta.has("fields")) {
+                        
+                        // Remove legacy default fields
+                        this.fields.clear();
 
-		    // Defined cutOff
-		    if (meta.has("cutOff"))
-			this.setCutOff(meta.get("cutOff").asBoolean());
-
-		    // Defined contexts
-		    if (meta.has("context"))
-			this.context.fromJson(meta.get("context"));
-
-		    // Defined resource count
-		    if (meta.has("timeout"))
-			this.setTimeOut(meta.get("timeout").asLong());
-
-		    // Defined resource count
-		    if (meta.has("itemsPerResource"))
-			this.setItemsPerResource(meta.get("itemsPerResource").asInt());
-
-		    // Only lift a limited amount of fields from the metadata
-		    if (meta.has("fields")) {
-
-			// Remove legacy default fields
-			this.fields.clear();
-
-			// Add fields
-			if (meta.get("fields").isArray()) {
-			    for (JsonNode field : (JsonNode) meta.get("fields")) {
-				this.addField(field.asText());
-			    };
+                        // Add fields
+                        if (meta.get("fields").isArray()) {
+                            for (JsonNode field : (JsonNode) meta.get("fields")) {
+                                this.addField(field.asText());
+                            };
 			}
 			else
 			    this.addField(meta.get("fields").asText());
diff --git a/src/main/java/de/ids_mannheim/korap/index/FieldDocument.java b/src/main/java/de/ids_mannheim/korap/index/FieldDocument.java
index 8c86a24..4b7b9f8 100644
--- a/src/main/java/de/ids_mannheim/korap/index/FieldDocument.java
+++ b/src/main/java/de/ids_mannheim/korap/index/FieldDocument.java
@@ -129,6 +129,7 @@
         this.setPrimaryData((String) node.get("text"));
 
         String fieldName = (String) node.get("name");
+
         MultiTermTokenStream mtts = this.newMultiTermTokenStream();
 
         // Iterate over all tokens in stream
@@ -138,8 +139,9 @@
             MultiTermToken mtt = new MultiTermToken(token.remove(0));
 
             // Add rest of the list
-            for (String term : token)
+            for (String term : token) {
                 mtt.add(term);
+            };
 
             // Add MultiTermToken to stream
             mtts.addMultiTermToken(mtt);
@@ -164,7 +166,7 @@
     /**
      * Deserialize token stream data (LEGACY).
      */
-    public void setFields (ArrayList<Map<String,Object>> fields) {
+    public void setFields (ArrayList<Map<String, Object>> fields) {
         
         Map<String,Object> primary = fields.remove(0);
         this.setPrimaryData((String) primary.get("primaryData"));
diff --git a/src/main/java/de/ids_mannheim/korap/index/MatchCollector.java b/src/main/java/de/ids_mannheim/korap/index/MatchCollector.java
index 114adac..982002f 100644
--- a/src/main/java/de/ids_mannheim/korap/index/MatchCollector.java
+++ b/src/main/java/de/ids_mannheim/korap/index/MatchCollector.java
@@ -5,55 +5,33 @@
 
 public class MatchCollector extends KorapResponse {
     public int totalResultDocs = 0;
-    private int totalResults;
-    private long totalTexts;
+    /*
+      private int totalResults;
+      private long totalTexts;
+    */
 
     public void add (int uniqueDocID, int matchcount) {
-	this.totalResultDocs++;
-	this.incrTotalResults(matchcount);
+        this.totalResultDocs++;
+        this.incrTotalResults(matchcount);
     };
 
     public MatchCollector setTotalResultDocs (int i) {
-	this.totalResultDocs = i;
-	return this;
+        this.totalResultDocs = i;
+        return this;
     };
 
     public MatchCollector incrTotalResultDocs (int i) {
-	this.totalResultDocs += i;
-	return this;
+        this.totalResultDocs += i;
+        return this;
     };
 
     public int getTotalResultDocs () {
-	return totalResultDocs;
+        return totalResultDocs;
     };
 
-    // Make this working in a KorapResult class
-    // that is independent from search and collection
-    public MatchCollector setTotalTexts (long i) {
-        this.totalTexts = i;
-	return this;
-    };
+    public void commit () {};
 
-    public long getTotalTexts() {
-        return this.totalTexts;
-    };
-
-    public MatchCollector setTotalResults (int i) {
-        this.totalResults = i;
-	return this;
-    };
-
-    public MatchCollector incrTotalResults (int i) {
-        this.totalResults += i;
-	return this;
-    };
-
-    public int getTotalResults() {
-        return this.totalResults;
-    };
-
-    public void commit() {};
-    public void close() {};
+    public void close () {};
 
     /*
      * The following methods are shared and should be used from KorapResult
diff --git a/src/main/java/de/ids_mannheim/korap/response/KorapResponse.java b/src/main/java/de/ids_mannheim/korap/response/KorapResponse.java
index 7ec1e10..806d54c 100644
--- a/src/main/java/de/ids_mannheim/korap/response/KorapResponse.java
+++ b/src/main/java/de/ids_mannheim/korap/response/KorapResponse.java
@@ -31,6 +31,9 @@
     ObjectMapper mapper = new ObjectMapper();
 
     private String version, name, node, listener;
+    private long
+        totalTexts   = -2, // Not set
+        totalResults = -2; // Not set
     private String benchmark;
     private boolean timeExceeded = false;
 
@@ -223,6 +226,92 @@
 
 
     /**
+     * Get the total number of results.
+     *
+     * @return The total number of results.
+     */
+    public long getTotalResults () {
+        if (this.totalResults == -2)
+            return (long) 0;
+        return this.totalResults;
+    };
+
+
+    /**
+     * Set the total number of results.
+     *
+     * @param results The total number of results.
+     * @return {link KorapResponse} object for chaining.
+     */
+    public KorapResponse setTotalResults (long results) {
+        this.totalResults = results;
+        return this;
+    };
+
+
+    /**
+     * Increment the total number of results by a certain value.
+     *
+     * @param incr The number of results the total number should
+     *        be incremented by.
+     * @return {@link KorapResponse} object for chaining.
+     */
+    public KorapResponse incrTotalResults (int incr) {
+        if (this.totalResults < 0)
+            this.totalResults = incr;
+        else
+            this.totalResults += incr;
+        return this;
+    };
+
+
+    /**
+     * Get the total number of texts the total number of
+     * results occur in.
+     *
+     * @return The total number of texts the total number of
+     *         results occur in.
+     */
+    public long getTotalTexts () {
+        if (this.totalTexts == -2)
+            return (long) 0;
+        return this.totalTexts;
+    };
+
+
+    /**
+     * Set the total number of texts the total number of
+     * results occur in.
+     *
+     * @param texts The total number of texts the total
+     *        number of results occur in.
+     * @return {@link KorapResponse} object for chaining.
+     */
+    public KorapResponse setTotalTexts (long texts) {
+        this.totalTexts = texts;
+        return this;
+    };
+
+
+    /**
+     * Increment the total number of texts the total number
+     * of results occur in by a certain value.
+     *
+     * @param incr The number of texts the total number of
+     *        results occur in should be incremented by.
+     *        (I don't care that this isn't English!)
+     * @return {@link KorapResponse} object for chaining.
+     */
+    public KorapResponse incrTotalTexts (int i) {
+        if (this.totalTexts < 0)
+            this.totalTexts = i;
+        else
+            this.totalTexts += i;
+        return this;
+    };
+
+
+    /**
      * Serialize response as a {@link JsonNode}.
      *
      * @return {@link JsonNode} representation of the response
@@ -260,6 +349,14 @@
         if (this.getBenchmark() != null)
             json.put("benchmark", this.getBenchmark());
 
+        // totalTexts is set
+        if (this.totalTexts != -2)
+            json.put("totalTexts", this.totalTexts);
+        
+        // totalResults is set
+        if (this.totalResults != -2)
+            json.put("totalResults", this.totalResults);
+
         return (JsonNode) json;
     };
 
diff --git a/src/main/java/de/ids_mannheim/korap/response/Notifications.java b/src/main/java/de/ids_mannheim/korap/response/Notifications.java
index 68bae83..c3d7edd 100644
--- a/src/main/java/de/ids_mannheim/korap/response/Notifications.java
+++ b/src/main/java/de/ids_mannheim/korap/response/Notifications.java
@@ -74,7 +74,7 @@
      * Set warnings by means of a {@link JsonNode}.
      *
      * @param msgs JSON array of warnings.
-     * @return Notifications object for chaining.
+     * @return {@link Notifications} object for chaining.
      */
     public Notifications setWarnings (JsonNode msgs) {
         for (JsonNode msg : msgs)
diff --git a/src/main/resources/log4j.properties b/src/main/resources/log4j.properties
index 98b2947..71a8d03 100644
--- a/src/main/resources/log4j.properties
+++ b/src/main/resources/log4j.properties
@@ -21,7 +21,7 @@
 
 # Collections
 #log4j.logger.de.ids_mannheim.korap.KorapFilter = TRACE, stdout
-#log4j.logger.de.ids_mannheim.korap.KorapCollection = TRACE, stdout
+# log4j.logger.de.ids_mannheim.korap.KorapCollection = TRACE, stdout
 
 # Results:
 #log4j.logger.de.ids_mannheim.korap.KorapIndex = TRACE, stdout
diff --git a/src/test/java/de/ids_mannheim/korap/search/TestKorapSearch.java b/src/test/java/de/ids_mannheim/korap/search/TestKorapSearch.java
index d7f30a4..87dc893 100644
--- a/src/test/java/de/ids_mannheim/korap/search/TestKorapSearch.java
+++ b/src/test/java/de/ids_mannheim/korap/search/TestKorapSearch.java
@@ -32,929 +32,1133 @@
 public class TestKorapSearch {
     @Test
     public void searchCount () {
-	KorapSearch ks = new KorapSearch(
-	    new KorapQuery("field1").seg("a").with("b")
+        KorapSearch ks = new KorapSearch(
+            new KorapQuery("field1").seg("a").with("b")
         );
-	// Count:
-	ks.setCount(30);
-	assertEquals(ks.getCount(), 30);
-	ks.setCount(20);
-	assertEquals(ks.getCount(), 20);
-	ks.setCount(-50);
-	assertEquals(ks.getCount(), 20);
-	ks.setCount(500);
-	assertEquals(ks.getCount(), ks.getCountMax());
+        // Count:
+        ks.setCount(30);
+        assertEquals(ks.getCount(), 30);
+        ks.setCount(20);
+        assertEquals(ks.getCount(), 20);
+        ks.setCount(-50);
+        assertEquals(ks.getCount(), 20);
+        ks.setCount(500);
+        assertEquals(ks.getCount(), ks.getCountMax());
     };
 
     @Test
     public void searchStartIndex () {
-	KorapSearch ks = new KorapSearch(
-	    new KorapQuery("field1").seg("a").with("b")
+        KorapSearch ks = new KorapSearch(
+            new KorapQuery("field1").seg("a").with("b")
         );
-	// startIndex
-	ks.setStartIndex(5);
-	assertEquals(ks.getStartIndex(), 5);
-	ks.setStartIndex(1);
-	assertEquals(ks.getStartIndex(), 1);
-	ks.setStartIndex(0);
-	assertEquals(ks.getStartIndex(), 0);
-	ks.setStartIndex(70);
-	assertEquals(ks.getStartIndex(), 70);
-	ks.setStartIndex(-5);
-	assertEquals(ks.getStartIndex(), 0);
+        // startIndex
+        ks.setStartIndex(5);
+        assertEquals(ks.getStartIndex(), 5);
+        ks.setStartIndex(1);
+        assertEquals(ks.getStartIndex(), 1);
+        ks.setStartIndex(0);
+        assertEquals(ks.getStartIndex(), 0);
+        ks.setStartIndex(70);
+        assertEquals(ks.getStartIndex(), 70);
+        ks.setStartIndex(-5);
+        assertEquals(ks.getStartIndex(), 0);
     };
 
     @Test
     public void searchQuery () {
-	KorapSearch ks = new KorapSearch(
-	    new KorapQuery("field1").seg("a").with("b")
+        KorapSearch ks = new KorapSearch(
+            new KorapQuery("field1").seg("a").with("b")
         );
-	// query
-	assertEquals(ks.getQuery().toString(), "spanSegment(field1:a, field1:b)");
+        // query
+        assertEquals(ks.getQuery().toString(), "spanSegment(field1:a, field1:b)");
     };
 
+
     @Test
     public void searchIndex () throws IOException {
-
-	// Construct index
-	KorapIndex ki = new KorapIndex();
-	// Indexing test files
-	for (String i : new String[] {"00001",
-				      "00002",
-				      "00003",
-				      "00004",
-				      "00005",
-				      "00006",
-				      "02439"}) {
-	    ki.addDocFile(
-	      getClass().getResource("/wiki/" + i + ".json.gz").getFile(), true
+        // Construct index
+        KorapIndex ki = new KorapIndex();
+        // Indexing test files
+        for (String i : new String[] {"00001",
+                                      "00002",
+                                      "00003",
+                                      "00004",
+                                      "00005",
+                                      "00006",
+                                      "02439"}) {
+            ki.addDocFile(
+                getClass().getResource("/wiki/" + i + ".json.gz").getFile(),
+                true
             );
-	};
-	ki.commit();
+        };
+        ki.commit();
 
-	KorapSearch ks = new KorapSearch(
-	    new KorapQuery("tokens").seg("s:Buchstaben")
-	);
-	ks.getCollection().filter(
+        KorapSearch ks = new KorapSearch(
+	        new KorapQuery("tokens").seg("s:Buchstaben")
+        );
+        ks.getCollection().filter(
             new KorapFilter().and("textClass", "reisen")
         );
-	ks.setCount(3);
-	ks.setStartIndex(5);
-	ks.context.left.setLength(1);
-	ks.context.right.setLength(1);
-	KorapResult kr = ks.run(ki);
-	assertEquals(kr.getTotalResults(), 6);
-	assertEquals(kr.getMatch(0).getSnippetBrackets(), "... dem [Buchstaben] A ...");
+        ks.setCount(3);
+        ks.setStartIndex(5);
+        ks.context.left.setLength(1);
+        ks.context.right.setLength(1);
+        KorapResult kr = ks.run(ki);
+        assertEquals(kr.getTotalResults(), 6);
+        assertEquals(
+            kr.getMatch(0).getSnippetBrackets(),
+            "... dem [Buchstaben] A ..."
+        );
     };
 
+
     @Test
     public void searchJSON () throws IOException {
-
-	// Construct index
-	KorapIndex ki = new KorapIndex();
-	// Indexing test files
-	for (String i : new String[] {"00001",
-				      "00002",
-				      "00003",
-				      "00004",
-				      "00005",
-				      "00006",
-				      "02439"}) {
-	    ki.addDocFile(
-	      getClass().getResource("/wiki/" + i + ".json.gz").getFile(), true
+        // Construct index
+        KorapIndex ki = new KorapIndex();
+        // Indexing test files
+        for (String i : new String[] {"00001",
+                                      "00002",
+                                      "00003",
+                                      "00004",
+                                      "00005",
+                                      "00006",
+                                      "02439"}) {
+            ki.addDocFile(
+                getClass().getResource("/wiki/" + i + ".json.gz").getFile(),
+                true
             );
-	};
-	ki.commit();
+        };
+        ki.commit();
 
-	String json = getString(getClass().getResource("/queries/metaquery3.jsonld").getFile());
+        String json = getString(
+            getClass().getResource("/queries/metaquery3.jsonld").getFile()
+        );
 
-	KorapSearch ks = new KorapSearch(json);
-	
-	KorapResult kr = ks.run(ki);
-	assertEquals(kr.getTotalResults(), 66);
-	assertEquals(5, kr.getItemsPerPage());
-	assertEquals(5, kr.getStartIndex());
-	assertEquals("... a: A ist [der klangreichste] der V ...", kr.getMatch(0).getSnippetBrackets());
+        KorapSearch ks = new KorapSearch(json);
+		KorapResult kr = ks.run(ki);
+        assertEquals(kr.getTotalResults(), 66);
+        assertEquals(5, kr.getItemsPerPage());
+        assertEquals(5, kr.getStartIndex());
+        assertEquals(
+            "... a: A ist [der klangreichste] der V ...",
+            kr.getMatch(0).getSnippetBrackets()
+        );
     };
 
     @Test
     public void searchJSON2 () throws IOException {
-
-	// Construct index
-	KorapIndex ki = new KorapIndex();
-	// Indexing test files
-	for (String i : new String[] {"00001",
-				      "00002",
-				      "00003",
-				      "00004",
-				      "00005",
-				      "00006",
-				      "02439",
-				      "00012-fakemeta",
-				      "00030-fakemeta",
-				      /*
-				      "02035-substring",
-				      "05663-unbalanced",
-				      "07452-deep"
-				      */
-	    }) {
-	    ki.addDocFile(
-	      getClass().getResource("/wiki/" + i + ".json.gz").getFile(), true
+        // Construct index
+        KorapIndex ki = new KorapIndex();
+        // Indexing test files
+        for (String i : new String[] {"00001",
+                                      "00002",
+                                      "00003",
+                                      "00004",
+                                      "00005",
+                                      "00006",
+                                      "02439",
+                                      "00012-fakemeta",
+                                      "00030-fakemeta",
+                                      /*
+                                        "02035-substring",
+                                        "05663-unbalanced",
+                                        "07452-deep"
+                                      */
+            }) {
+            ki.addDocFile(
+                getClass().getResource("/wiki/" + i + ".json.gz").getFile(),
+                true
             );
-	};
-	ki.commit();
+        };
+        ki.commit();
 
-	String json = getString(getClass().getResource("/queries/metaquery4.jsonld").getFile());
+        String json = getString(
+            getClass().getResource("/queries/metaquery4.jsonld").getFile()
+        );
 
-	KorapSearch ks = new KorapSearch(json);
-	KorapResult kr = ks.run(ki);
+        KorapSearch ks = new KorapSearch(json);
+        KorapResult kr = ks.run(ki);
 
-	assertEquals(kr.getTotalResults(), 1);
+        assertEquals(kr.getTotalResults(), 1);
 
-	ks = new KorapSearch(json);
-	// Ignore the collection part of the query!
-	ks.setCollection(new KorapCollection());
-	kr = ks.run(ki);
+        ks = new KorapSearch(json);
+        // Ignore the collection part of the query!
+        ks.setCollection(new KorapCollection());
+        kr = ks.run(ki);
 
-	assertEquals(kr.getTotalResults(), 5);
+        assertEquals(kr.getTotalResults(), 5);
 
-	json = getString(getClass().getResource("/queries/metaquery5.jsonld").getFile());
-	ks = new KorapSearch(json);
-	kr = ks.run(ki);
-	assertEquals(kr.getTotalResults(), 1);
+        json = getString(
+            getClass().getResource("/queries/metaquery5.jsonld").getFile()
+        );
 
-	json = getString(getClass().getResource("/queries/metaquery6.jsonld").getFile());
-	ks = new KorapSearch(json);
-	kr = ks.run(ki);
-	assertEquals(kr.getTotalResults(), 1);
+        ks = new KorapSearch(json);
+        kr = ks.run(ki);
+        assertEquals(kr.getTotalResults(), 1);
+
+        json = getString(
+            getClass().getResource("/queries/metaquery6.jsonld").getFile()
+        );
+        ks = new KorapSearch(json);
+        kr = ks.run(ki);
+        assertEquals(kr.getTotalResults(), 1);
     };
 
 
     @Test
     public void searchJSONFailure () throws IOException {
-
-	// Construct index
-	KorapIndex ki = new KorapIndex();
-	// Indexing test files
-	for (String i : new String[] {"00001",
-				      "00002",
-				      "00003",
-				      "00004",
-				      "00005",
-				      "00006",
-				      "02439"
-	    }) {
-	    ki.addDocFile(
-	      getClass().getResource("/wiki/" + i + ".json.gz").getFile(), true
+        // Construct index
+        KorapIndex ki = new KorapIndex();
+        // Indexing test files
+        for (String i : new String[] {"00001",
+                                      "00002",
+                                      "00003",
+                                      "00004",
+                                      "00005",
+                                      "00006",
+                                      "02439"
+            }) {
+            ki.addDocFile(
+                getClass().getResource("/wiki/" + i + ".json.gz").getFile(),
+                true
             );
-	};
-	ki.commit();
-
-	KorapResult kr = new KorapSearch("{ query").run(ki);
-
-	assertEquals(kr.getTotalResults(), 0);
-	assertEquals(kr.getError(0).getMessage(), "Unable to parse JSON");
+        };
+        ki.commit();
+        KorapResult kr = new KorapSearch("{ query").run(ki);
+        assertEquals(kr.getTotalResults(), 0);
+        assertEquals(kr.getError(0).getMessage(), "Unable to parse JSON");
     };
 
 
-
     @Test
     public void searchJSONindexboundary () throws IOException {
-
-	// Construct index
-	KorapIndex ki = new KorapIndex();
-	// Indexing test files
-	for (String i : new String[] {"00001",
-				      "00002",
-				      "00003",
-				      "00004",
-				      "00005",
-				      "00006",
-				      "02439"}) {
-	    ki.addDocFile(
-	      getClass().getResource("/wiki/" + i + ".json.gz").getFile(), true
+        // Construct index
+        KorapIndex ki = new KorapIndex();
+        // Indexing test files
+        for (String i : new String[] {"00001",
+                                      "00002",
+                                      "00003",
+                                      "00004",
+                                      "00005",
+                                      "00006",
+                                      "02439"}) {
+            ki.addDocFile(
+                getClass().getResource("/wiki/" + i + ".json.gz").getFile(),
+                true
             );
-	};
-	ki.commit();
+        };
+        ki.commit();
 
-	String json = getString(getClass().getResource("/queries/bsp-fail1.jsonld").getFile());
+        String json = getString(
+            getClass().getResource("/queries/bsp-fail1.jsonld").getFile()
+        );
 
-	KorapResult kr = new KorapSearch(json).run(ki);
-	assertEquals(0, kr.getStartIndex());
-	assertEquals(kr.getTotalResults(), 0);
-	assertEquals(25, kr.getItemsPerPage());
+        KorapResult kr = new KorapSearch(json).run(ki);
+        assertEquals(0, kr.getStartIndex());
+        assertEquals(kr.getTotalResults(), 0);
+        assertEquals(25, kr.getItemsPerPage());
     };
 
+
     @Test
     public void searchJSONindexboundary2 () throws IOException {
-
-	// Construct index
-	KorapIndex ki = new KorapIndex();
-	// Indexing test files
-	for (String i : new String[] {"00001",
-				      "00002",
-				      "00003",
-				      "00004",
-				      "00005",
-				      "00006",
-				      "02439"}) {
-	    ki.addDocFile(
-	      getClass().getResource("/wiki/" + i + ".json.gz").getFile(), true
+        // Construct index
+        KorapIndex ki = new KorapIndex();
+        // Indexing test files
+        for (String i : new String[] {"00001",
+                                      "00002",
+                                      "00003",
+                                      "00004",
+                                      "00005",
+                                      "00006",
+                                      "02439"}) {
+            ki.addDocFile(
+                getClass().getResource("/wiki/" + i + ".json.gz").getFile(),
+                true
             );
-	};
-	ki.commit();
+        };
+        ki.commit();
 
-	String json = getString(getClass().getResource("/queries/bsp-fail2.jsonld").getFile());
+        String json = getString(
+            getClass().getResource("/queries/bsp-fail2.jsonld").getFile()
+        );
 
-	KorapResult kr = new KorapSearch(json).run(ki);
-	assertEquals(50, kr.getItemsPerPage());
-	assertEquals(49950, kr.getStartIndex());
-	assertEquals(kr.getTotalResults(), 0);
+        KorapResult kr = new KorapSearch(json).run(ki);
+        assertEquals(50, kr.getItemsPerPage());
+        assertEquals(49950, kr.getStartIndex());
+        assertEquals(kr.getTotalResults(), 0);
     };
 
 
     @Test
     public void searchJSONcontext () throws IOException {
-
-	// Construct index
-	KorapIndex ki = new KorapIndex();
-	// Indexing test files
-	for (String i : new String[] {"00001",
-				      "00002",
-				      "00003",
-				      "00004",
-				      "00005",
-				      "00006",
-				      "02439"}) {
-	    ki.addDocFile(
-	      getClass().getResource("/wiki/" + i + ".json.gz").getFile(), true
+        // Construct index
+        KorapIndex ki = new KorapIndex();
+        // Indexing test files
+        for (String i : new String[] {"00001",
+                                      "00002",
+                                      "00003",
+                                      "00004",
+                                      "00005",
+                                      "00006",
+                                      "02439"}) {
+            ki.addDocFile(
+                getClass().getResource("/wiki/" + i + ".json.gz").getFile(),
+                true
             );
-	};
-	ki.commit();
+        };
+        ki.commit();
 
-	String json = getString(getClass().getResource("/queries/bsp-context.jsonld").getFile());
+        String json = getString(
+            getClass().getResource("/queries/bsp-context.jsonld").getFile()
+        );
 
-	KorapSearch ks = new KorapSearch(json);
-	KorapResult kr = ks.run(ki);
-	assertEquals(kr.getTotalResults(), 10);
-	assertEquals("A bzw. a ist der erste Buchstabe des lateinischen [Alphabets] und ein Vokal. Der Buchstabe A hat in deutschen Texten eine durchschnittliche Häufigkeit  ...", kr.getMatch(0).getSnippetBrackets());
+        KorapSearch ks = new KorapSearch(json);
+        KorapResult kr = ks.run(ki);
+        assertEquals(kr.getTotalResults(), 10);
+        assertEquals("A bzw. a ist der erste Buchstabe des" +
+                     " lateinischen [Alphabets] und ein Vokal." +
+                     " Der Buchstabe A hat in deutschen Texten" +
+                     " eine durchschnittliche Häufigkeit  ...",
+                     kr.getMatch(0).getSnippetBrackets());
 
-	ks.setCount(5);
-	ks.setStartPage(2);
-	kr = ks.run(ki);
-	assertEquals(kr.getTotalResults(), 10);
-	assertEquals(5, kr.getStartIndex());
-	assertEquals(5, kr.getItemsPerPage());
+        ks.setCount(5);
+        ks.setStartPage(2);
+        kr = ks.run(ki);
+        assertEquals(kr.getTotalResults(), 10);
+        assertEquals(5, kr.getStartIndex());
+        assertEquals(5, kr.getItemsPerPage());
 
+        json = getString(
+            getClass().getResource("/queries/bsp-context-2.jsonld").getFile()
+        );
 
-	json = getString(getClass().getResource("/queries/bsp-context-2.jsonld").getFile());
-
-	kr = new KorapSearch(json).run(ki);
-	assertEquals(kr.getTotalResults(), -1);
-	assertEquals("... lls seit den Griechen beibehalten worden. 3. Bedeutungen in der Biologie steht A für das Nukleosid Adenosin steht A die Base Adenin steht A für die Aminosäure Alanin in der Informatik steht a für den dezimalen [Wert] 97 sowohl im ASCII- als auch im Unicode-Zeichensatz steht A für den dezimalen Wert 65 sowohl im ASCII- als auch im Unicode-Zeichensatz als Kfz-Kennzeichen steht A in Deutschland für Augsburg. in Österreich auf ...", kr.getMatch(0).getSnippetBrackets());
+        kr = new KorapSearch(json).run(ki);
+        assertEquals(kr.getTotalResults(), -1);
+        assertEquals("... lls seit den Griechen beibehalten worden." +
+                     " 3. Bedeutungen in der Biologie steht A für"+
+                     " das Nukleosid Adenosin steht A die Base"+
+                     " Adenin steht A für die Aminosäure Alanin"+
+                     " in der Informatik steht a für den dezimalen"+
+                     " [Wert] 97 sowohl im ASCII- als auch im"+
+                     " Unicode-Zeichensatz steht A für den dezimalen"+
+                     " Wert 65 sowohl im ASCII- als auch im"+
+                     " Unicode-Zeichensatz als Kfz-Kennzeichen"+
+                     " steht A in Deutschland für Augsburg."+
+                     " in Österreich auf ...",
+                     kr.getMatch(0).getSnippetBrackets());
     };
 
     @Test
     public void searchJSONstartPage () throws IOException {
-
-	// Construct index
-	KorapIndex ki = new KorapIndex();
-	// Indexing test files
-	for (String i : new String[] {"00001",
-				      "00002",
-				      "00003",
-				      "00004",
-				      "00005",
-				      "00006",
-				      "02439"}) {
-	    ki.addDocFile(
-	      getClass().getResource("/wiki/" + i + ".json.gz").getFile(), true
+        // Construct index
+        KorapIndex ki = new KorapIndex();
+        // Indexing test files
+        for (String i : new String[] {"00001",
+                                      "00002",
+                                      "00003",
+                                      "00004",
+                                      "00005",
+                                      "00006",
+                                      "02439"}) {
+            ki.addDocFile(
+                getClass().getResource("/wiki/" + i + ".json.gz").getFile(),
+                true
             );
-	};
-	ki.commit();
+        };
+        ki.commit();
 
-	String json = getString(getClass().getResource("/queries/bsp-paging.jsonld").getFile());
+        String json = getString(
+            getClass().getResource("/queries/bsp-paging.jsonld").getFile()
+        );
 
-	KorapSearch ks = new KorapSearch(json);
-	KorapResult kr = ks.run(ki);
-	assertEquals(kr.getTotalResults(), 10);
-	assertEquals(5, kr.getStartIndex());
-	assertEquals(5, kr.getItemsPerPage());
+        KorapSearch ks = new KorapSearch(json);
+        KorapResult kr = ks.run(ki);
+        assertEquals(kr.getTotalResults(), 10);
+        assertEquals(5, kr.getStartIndex());
+        assertEquals(5, kr.getItemsPerPage());
 
-	json = getString(getClass().getResource("/queries/bsp-cutoff.jsonld").getFile());
-	ks = ks = new KorapSearch(json);
+        json = getString(
+            getClass().getResource("/queries/bsp-cutoff.jsonld").getFile()
+        );
+        ks = ks = new KorapSearch(json);
+        kr = ks.run(ki);
+        assertEquals(kr.getTotalResults(), -1);
+        assertEquals(2, kr.getStartIndex());
+        assertEquals(2, kr.getItemsPerPage());
 
-	kr = ks.run(ki);
-	assertEquals(kr.getTotalResults(), -1);
-	assertEquals(2, kr.getStartIndex());
-	assertEquals(2, kr.getItemsPerPage());
-
-
-	json = getString(getClass().getResource("/queries/metaquery9.jsonld").getFile());
-	KorapCollection kc = new KorapCollection(json);
-	kc.setIndex(ki);
-	assertEquals(7, kc.numberOf("documents"));
+        json = getString(
+            getClass().getResource("/queries/metaquery9.jsonld").getFile()
+        );
+        KorapCollection kc = new KorapCollection(json);
+        kc.setIndex(ki);
+        assertEquals(7, kc.numberOf("documents"));
     };
 
+
     @Test
     public void searchJSONitemsPerResource () throws IOException {
-
-	// Construct index
-	KorapIndex ki = new KorapIndex();
-	// Indexing test files
-	for (String i : new String[] {"00001",
-				      "00002",
-				      "00003",
-				      "00004",
-				      "00005",
-				      "00006",
-				      "02439"}) {
-	    ki.addDocFile(
-	      getClass().getResource("/wiki/" + i + ".json.gz").getFile(), true
+        // Construct index
+        KorapIndex ki = new KorapIndex();
+        // Indexing test files
+        for (String i : new String[] {"00001",
+                                      "00002",
+                                      "00003",
+                                      "00004",
+                                      "00005",
+                                      "00006",
+                                      "02439"}) {
+            ki.addDocFile(
+                getClass().getResource("/wiki/" + i + ".json.gz").getFile(),
+                true
             );
-	};
-	ki.commit();
+        };
+        ki.commit();
+        String json = getString(
+            getClass().
+            getResource("/queries/bsp-itemsPerResource.jsonld").
+            getFile()
+        );
 
-	String json = getString(getClass().getResource("/queries/bsp-itemsPerResource.jsonld").getFile());
+        KorapSearch ks = new KorapSearch(json);
+        KorapResult kr = ks.run(ki);
+        assertEquals(kr.getTotalResults(), 10);
+        assertEquals(0, kr.getStartIndex());
+        assertEquals(20, kr.getItemsPerPage());
 
-	KorapSearch ks = new KorapSearch(json);
-	KorapResult kr = ks.run(ki);
-	assertEquals(kr.getTotalResults(), 10);
-	assertEquals(0, kr.getStartIndex());
-	assertEquals(20, kr.getItemsPerPage());
+        assertEquals("WPD_AAA.00001", kr.getMatch(0).getDocID());
+        assertEquals("WPD_AAA.00001", kr.getMatch(1).getDocID());
+        assertEquals("WPD_AAA.00001", kr.getMatch(6).getDocID());
+        assertEquals("WPD_AAA.00002", kr.getMatch(7).getDocID());
+        assertEquals("WPD_AAA.00002", kr.getMatch(8).getDocID());
+        assertEquals("WPD_AAA.00004", kr.getMatch(9).getDocID());
 
-	assertEquals("WPD_AAA.00001", kr.getMatch(0).getDocID());
-	assertEquals("WPD_AAA.00001", kr.getMatch(1).getDocID());
-	assertEquals("WPD_AAA.00001", kr.getMatch(6).getDocID());
-	assertEquals("WPD_AAA.00002", kr.getMatch(7).getDocID());
-	assertEquals("WPD_AAA.00002", kr.getMatch(8).getDocID());
-	assertEquals("WPD_AAA.00004", kr.getMatch(9).getDocID());
+        ks = new KorapSearch(json);
+        ks.setItemsPerResource(1);
 
-	ks = new KorapSearch(json);
-	ks.setItemsPerResource(1);
+        kr = ks.run(ki);
 
-	kr = ks.run(ki);
+        assertEquals("WPD_AAA.00001", kr.getMatch(0).getDocID());
+        assertEquals("WPD_AAA.00002", kr.getMatch(1).getDocID());
+        assertEquals("WPD_AAA.00004", kr.getMatch(2).getDocID());
+        
+        assertEquals(kr.getTotalResults(), 3);
+        assertEquals(0, kr.getStartIndex());
+        assertEquals(20, kr.getItemsPerPage());
+        
+        ks = new KorapSearch(json);
+        ks.setItemsPerResource(2);
 
-	assertEquals("WPD_AAA.00001", kr.getMatch(0).getDocID());
-	assertEquals("WPD_AAA.00002", kr.getMatch(1).getDocID());
-	assertEquals("WPD_AAA.00004", kr.getMatch(2).getDocID());
+        kr = ks.run(ki);
 
-	assertEquals(kr.getTotalResults(), 3);
-	assertEquals(0, kr.getStartIndex());
-	assertEquals(20, kr.getItemsPerPage());
+        assertEquals("WPD_AAA.00001", kr.getMatch(0).getDocID());
+        assertEquals("WPD_AAA.00001", kr.getMatch(1).getDocID());
+        assertEquals("WPD_AAA.00002", kr.getMatch(2).getDocID());
+        assertEquals("WPD_AAA.00002", kr.getMatch(3).getDocID());
+        assertEquals("WPD_AAA.00004", kr.getMatch(4).getDocID());
+        
+        assertEquals(kr.getTotalResults(), 5);
+        assertEquals(0, kr.getStartIndex());
+        assertEquals(20, kr.getItemsPerPage());
 
+        ks = new KorapSearch(json);
+        ks.setItemsPerResource(1);
+        ks.setStartIndex(1);
+        ks.setCount(1);
 
-	ks = new KorapSearch(json);
-	ks.setItemsPerResource(2);
-
-	kr = ks.run(ki);
-
-	assertEquals("WPD_AAA.00001", kr.getMatch(0).getDocID());
-	assertEquals("WPD_AAA.00001", kr.getMatch(1).getDocID());
-	assertEquals("WPD_AAA.00002", kr.getMatch(2).getDocID());
-	assertEquals("WPD_AAA.00002", kr.getMatch(3).getDocID());
-	assertEquals("WPD_AAA.00004", kr.getMatch(4).getDocID());
-
-	assertEquals(kr.getTotalResults(), 5);
-	assertEquals(0, kr.getStartIndex());
-	assertEquals(20, kr.getItemsPerPage());
-
-
-	ks = new KorapSearch(json);
-	ks.setItemsPerResource(1);
-	ks.setStartIndex(1);
-	ks.setCount(1);
-
-	kr = ks.run(ki);
+        kr = ks.run(ki);
 	
-	assertEquals("WPD_AAA.00002", kr.getMatch(0).getDocID());
+        assertEquals("WPD_AAA.00002", kr.getMatch(0).getDocID());
 
-	assertEquals(kr.getTotalResults(), 3);
-	assertEquals(1, kr.getStartIndex());
-	assertEquals(1, kr.getItemsPerPage());
+        assertEquals(kr.getTotalResults(), 3);
+        assertEquals(1, kr.getStartIndex());
+        assertEquals(1, kr.getItemsPerPage());
 
-	assertEquals((short) 1, kr.getItemsPerResource());
+        assertEquals((short) 1, kr.getItemsPerResource());
     };
 
+
     @Test
     public void searchJSONitemsPerResourceServer () throws IOException {
-
-	/*
-	 * This test is a server-only implementation of
-	 * TestResource#testCollection
-	 */
-
-
-	// Construct index
-	KorapIndex ki = new KorapIndex();
-	// Indexing test files
-	int uid = 1;
-	for (String i : new String[] {"00001",
-				      "00002",
-				      "00003",
-				      "00004",
-				      "00005",
-				      "00006",
-				      "02439"}) {
-	    ki.addDocFile(
-	        uid++,
-		getClass().getResource("/wiki/" + i + ".json.gz").getFile(),
-		true
+        /*
+         * This test is a server-only implementation of
+         * TestResource#testCollection
+         */
+        // Construct index
+        KorapIndex ki = new KorapIndex();
+        // Indexing test files
+        int uid = 1;
+        for (String i : new String[] {"00001",
+                                      "00002",
+                                      "00003",
+                                      "00004",
+                                      "00005",
+                                      "00006",
+                                      "02439"}) {
+            ki.addDocFile(
+                uid++,
+                getClass().getResource("/wiki/" + i + ".json.gz").getFile(),
+                true
             );
-	};
-	ki.commit();
+        };
+        ki.commit();
 
-	String json = getString(getClass().getResource("/queries/bsp-uid-example.jsonld").getFile());
+        String json = getString(
+            getClass().
+            getResource("/queries/bsp-uid-example.jsonld").
+            getFile()
+        );
 
-	KorapSearch ks = new KorapSearch(json);
-	ks.setItemsPerResource(1);
-	KorapCollection kc = new KorapCollection();
-	kc.filterUIDs(new String[]{"1", "4"});
-	kc.setIndex(ki);
-	ks.setCollection(kc);
+        KorapSearch ks = new KorapSearch(json);
+        ks.setItemsPerResource(1);
+        KorapCollection kc = new KorapCollection();
+        kc.filterUIDs(new String[]{"1", "4"});
+        kc.setIndex(ki);
+        ks.setCollection(kc);
 
-	KorapResult kr = ks.run(ki);
+        KorapResult kr = ks.run(ki);
 
-	assertEquals(kr.getTotalResults(), 2);
-	assertEquals(0, kr.getStartIndex());
-	assertEquals(25, kr.getItemsPerPage());
+        assertEquals(kr.getTotalResults(), 2);
+        assertEquals(0, kr.getStartIndex());
+        assertEquals(25, kr.getItemsPerPage());
     };
 
+
     @Test
     public void searchJSONnewJSON () throws IOException {
-	// Construct index
-	KorapIndex ki = new KorapIndex();
-	// Indexing test files
-	FieldDocument fd = ki.addDocFile(
-            1,getClass().getResource("/goe/AGA-03828.json.gz").getFile(), true
-	);
-	ki.commit();
-
-	assertEquals(fd.getUID(), 1);
-	assertEquals(fd.getTextSigle(),   "GOE_AGA.03828");
-	assertEquals(fd.getDocSigle(),    "GOE_AGA");
-	assertEquals(fd.getCorpusSigle(), "GOE");
-	assertEquals(fd.getTitle()  ,     "Autobiographische Einzelheiten");
-	assertNull(fd.getSubTitle());
-	assertEquals(fd.getTextType(),    "Autobiographie");
-	assertNull(fd.getTextTypeArt());
-	assertNull(fd.getTextTypeRef());
-	assertNull(fd.getTextColumn());
-	assertNull(fd.getTextDomain());
-	assertEquals(fd.getPages(),       "529-547");
-	assertEquals(fd.getLicense(),     "QAO-NC");
-	assertEquals(fd.getCreationDate().toString(), "18200000");
-	assertEquals(fd.getPubDate().toString(),      "19820000");
-	assertEquals(fd.getAuthor(),      "Goethe, Johann Wolfgang von");
-	assertNull(fd.getTextClass());
-	assertEquals(fd.getLanguage(),    "de");
-	assertEquals(fd.getPubPlace(),    "München");
-	assertEquals(fd.getReference(),   "Goethe, Johann Wolfgang von: Autobiographische Einzelheiten, (Geschrieben bis 1832), In: Goethe, Johann Wolfgang von: Goethes Werke, Bd. 10, Autobiographische Schriften II, Hrsg.: Trunz, Erich. München: Verlag C. H. Beck, 1982, S. 529-547");
-	assertEquals(fd.getPublisher(),   "Verlag C. H. Beck");
-	assertNull(fd.getEditor());
-	assertNull(fd.getFileEditionStatement());
-	assertNull(fd.getBiblEditionStatement());
-	assertNull(fd.getKeywords());
-
-	assertEquals(fd.getTokenSource(), "opennlp#tokens");
-	assertEquals(fd.getFoundries(), "base base/paragraphs base/sentences corenlp corenlp/constituency corenlp/morpho corenlp/namedentities corenlp/sentences glemm glemm/morpho mate mate/morpho opennlp opennlp/morpho opennlp/sentences treetagger treetagger/morpho treetagger/sentences");
-	assertEquals(fd.getLayerInfos(), "base/s=spans corenlp/c=spans corenlp/ne=tokens corenlp/p=tokens corenlp/s=spans glemm/l=tokens mate/l=tokens mate/m=tokens mate/p=tokens opennlp/p=tokens opennlp/s=spans tt/l=tokens tt/p=tokens tt/s=spans");
-
-
-	assertEquals(fd.getCorpusTitle(), "Goethes Werke");
-	assertNull(fd.getCorpusSubTitle());
-	assertEquals(fd.getCorpusAuthor(),  "Goethe, Johann Wolfgang von");
-	assertEquals(fd.getCorpusEditor(),  "Trunz, Erich");
-
-	assertEquals(fd.getDocTitle(), "Goethe: Autobiographische Schriften II, (1817-1825, 1832)");
-	assertNull(fd.getDocSubTitle());
-	assertNull(fd.getDocEditor());
-	assertNull(fd.getDocAuthor());
-
-	KorapSearch ks = new KorapSearch(
-	    new KorapQuery("tokens").seg("mate/m:case:nom").with("mate/m:number:pl")
+        // Construct index
+        KorapIndex ki = new KorapIndex();
+        // Indexing test files
+        FieldDocument fd = ki.addDocFile(
+            1,
+            getClass().
+            getResource("/goe/AGA-03828.json.gz").
+            getFile(),
+            true
         );
-	KorapResult kr = ks.run(ki);
+        ki.commit();
 
-	assertEquals(kr.getTotalResults(), 148);
-	assertEquals(0, kr.getStartIndex());
-	assertEquals(25, kr.getItemsPerPage());
+        assertEquals(fd.getUID(), 1);
+        assertEquals(fd.getTextSigle(),   "GOE_AGA.03828");
+        assertEquals(fd.getDocSigle(),    "GOE_AGA");
+        assertEquals(fd.getCorpusSigle(), "GOE");
+        assertEquals(fd.getTitle()  ,     "Autobiographische Einzelheiten");
+        assertNull(fd.getSubTitle());
+        assertEquals(fd.getTextType(),    "Autobiographie");
+        assertNull(fd.getTextTypeArt());
+        assertNull(fd.getTextTypeRef());
+        assertNull(fd.getTextColumn());
+        assertNull(fd.getTextDomain());
+        assertEquals(fd.getPages(),       "529-547");
+        assertEquals(fd.getLicense(),     "QAO-NC");
+        assertEquals(fd.getCreationDate().toString(), "18200000");
+        assertEquals(fd.getPubDate().toString(),      "19820000");
+        assertEquals(fd.getAuthor(),      "Goethe, Johann Wolfgang von");
+        assertNull(fd.getTextClass());
+        assertEquals(fd.getLanguage(),    "de");
+        assertEquals(fd.getPubPlace(),    "München");
+        assertEquals(fd.getReference(),
+                     "Goethe, Johann Wolfgang von:"+
+                     " Autobiographische Einzelheiten,"+
+                     " (Geschrieben bis 1832), In: Goethe,"+
+                     " Johann Wolfgang von: Goethes Werke,"+
+                     " Bd. 10, Autobiographische Schriften"+
+                     " II, Hrsg.: Trunz, Erich. München: "+
+                     "Verlag C. H. Beck, 1982, S. 529-547");
+        assertEquals(fd.getPublisher(),   "Verlag C. H. Beck");
+        assertNull(fd.getEditor());
+        assertNull(fd.getFileEditionStatement());
+        assertNull(fd.getBiblEditionStatement());
+        assertNull(fd.getKeywords());
+
+        assertEquals(fd.getTokenSource(), "opennlp#tokens");
+        assertEquals(fd.getFoundries(),
+                     "base base/paragraphs base/sentences corenlp "+
+                     "corenlp/constituency corenlp/morpho "+
+                     "corenlp/namedentities corenlp/sentences "+
+                     "glemm glemm/morpho mate mate/morpho"+
+                     " opennlp opennlp/morpho opennlp/sentences"+
+                     " treetagger treetagger/morpho "+
+                     "treetagger/sentences");
+        assertEquals(fd.getLayerInfos(),
+                     "base/s=spans corenlp/c=spans corenlp/ne=tokens"+
+                     " corenlp/p=tokens corenlp/s=spans glemm/l=tokens"+
+                     " mate/l=tokens mate/m=tokens mate/p=tokens"+
+                     " opennlp/p=tokens opennlp/s=spans tt/l=tokens"+
+                     " tt/p=tokens tt/s=spans");
+
+        assertEquals(fd.getCorpusTitle(), "Goethes Werke");
+        assertNull(fd.getCorpusSubTitle());
+        assertEquals(fd.getCorpusAuthor(),  "Goethe, Johann Wolfgang von");
+        assertEquals(fd.getCorpusEditor(),  "Trunz, Erich");
+        assertEquals(fd.getDocTitle(),
+            "Goethe: Autobiographische Schriften II, (1817-1825, 1832)"
+        );
+        assertNull(fd.getDocSubTitle());
+        assertNull(fd.getDocEditor());
+        assertNull(fd.getDocAuthor());
+
+        KorapSearch ks = new KorapSearch(
+            new KorapQuery("tokens").
+            seg("mate/m:case:nom").
+            with("mate/m:number:pl")
+        );
+        KorapResult kr = ks.run(ki);
+
+        assertEquals(kr.getTotalResults(), 148);
+        assertEquals(0, kr.getStartIndex());
+        assertEquals(25, kr.getItemsPerPage());
     };
 
+
     @Test
     public void searchJSONnewJSON2 () throws IOException {
-	// Construct index
-	KorapIndex ki = new KorapIndex();
-	// Indexing test files
-	FieldDocument fd = ki.addDocFile(
-            1,getClass().getResource("/bzk/D59-00089.json.gz").getFile(), true
-	);
-	ki.commit();
-
-	assertEquals(fd.getUID(), 1);
-	assertEquals(fd.getTextSigle(),   "BZK_D59.00089");
-	assertEquals(fd.getDocSigle(),    "BZK_D59");
-	assertEquals(fd.getCorpusSigle(), "BZK");
-	assertEquals(fd.getTitle()  ,     "Saragat-Partei zerfällt");
-	assertEquals(fd.getPubDate().toString(),      "19590219");
-
-	assertNull(fd.getSubTitle());
-	assertNull(fd.getAuthor());
-	assertNull(fd.getEditor());
-	assertEquals(fd.getPubPlace(),    "Berlin");
-	assertNull(fd.getPublisher());
-	assertEquals(fd.getTextType(),    "Zeitung: Tageszeitung");
-	assertNull(fd.getTextTypeArt());
-	assertEquals(fd.getTextTypeRef(), "Tageszeitung");
-	assertEquals(fd.getTextDomain(),  "Politik");
-	assertEquals(fd.getCreationDate().toString(), "19590219");
-	assertEquals(fd.getLicense(),     "ACA-NC-LC");
-	assertEquals(fd.getTextColumn(),  "POLITIK");
-	assertNull(fd.getPages());
-	assertEquals(fd.getTextClass(), "politik ausland");
-	assertNull(fd.getFileEditionStatement());
-	assertNull(fd.getBiblEditionStatement());
-
-	assertEquals(fd.getLanguage(),    "de");
-	assertEquals(fd.getReference(),   "Neues Deutschland, [Tageszeitung], 19.02.1959, Jg. 14, Berliner Ausgabe, S. 7. - Sachgebiet: Politik, Originalressort: POLITIK; Saragat-Partei zerfällt");
-	assertNull(fd.getPublisher());
-	assertNull(fd.getKeywords());
-
-	assertEquals(fd.getTokenSource(), "opennlp#tokens");
-
-	assertEquals(fd.getFoundries(), "base base/paragraphs base/sentences corenlp corenlp/constituency corenlp/morpho corenlp/namedentities corenlp/sentences glemm glemm/morpho mate mate/morpho opennlp opennlp/morpho opennlp/sentences treetagger treetagger/morpho treetagger/sentences");
-
-	assertEquals(fd.getLayerInfos(),  "base/s=spans corenlp/c=spans corenlp/ne=tokens corenlp/p=tokens corenlp/s=spans glemm/l=tokens mate/l=tokens mate/m=tokens mate/p=tokens opennlp/p=tokens opennlp/s=spans tt/l=tokens tt/p=tokens tt/s=spans");
-
-	assertEquals(fd.getCorpusTitle(), "Bonner Zeitungskorpus");
-	assertNull(fd.getCorpusSubTitle());
-	assertNull(fd.getCorpusAuthor());
-	assertNull(fd.getCorpusEditor());
-
-	assertEquals(fd.getDocTitle(), "Neues Deutschland");
-	assertEquals(fd.getDocSubTitle(), "Organ des Zentralkomitees der Sozialistischen Einheitspartei Deutschlands");
-	assertNull(fd.getDocEditor());
-	assertNull(fd.getDocAuthor());
-
-	KorapSearch ks = new KorapSearch(
-	    new KorapQuery("tokens").seg("mate/m:case:nom").with("mate/m:number:sg")
+        // Construct index
+        KorapIndex ki = new KorapIndex();
+        // Indexing test files
+        FieldDocument fd = ki.addDocFile(
+            1,
+            getClass().
+            getResource("/bzk/D59-00089.json.gz").
+            getFile(),
+            true
         );
-	KorapResult kr = ks.run(ki);
+        ki.commit();
 
-	assertEquals(kr.getTotalResults(), 6);
-	assertEquals(0, kr.getStartIndex());
-	assertEquals(25, kr.getItemsPerPage());
+        assertEquals(fd.getUID(), 1);
+        assertEquals(fd.getTextSigle(),   "BZK_D59.00089");
+        assertEquals(fd.getDocSigle(),    "BZK_D59");
+        assertEquals(fd.getCorpusSigle(), "BZK");
+        assertEquals(fd.getTitle()  ,     "Saragat-Partei zerfällt");
+        assertEquals(fd.getPubDate().toString(),      "19590219");
+
+        assertNull(fd.getSubTitle());
+        assertNull(fd.getAuthor());
+        assertNull(fd.getEditor());
+        assertEquals(fd.getPubPlace(),    "Berlin");
+        assertNull(fd.getPublisher());
+        assertEquals(fd.getTextType(),    "Zeitung: Tageszeitung");
+        assertNull(fd.getTextTypeArt());
+        assertEquals(fd.getTextTypeRef(), "Tageszeitung");
+        assertEquals(fd.getTextDomain(),  "Politik");
+        assertEquals(fd.getCreationDate().toString(), "19590219");
+        assertEquals(fd.getLicense(),     "ACA-NC-LC");
+        assertEquals(fd.getTextColumn(),  "POLITIK");
+        assertNull(fd.getPages());
+        assertEquals(fd.getTextClass(), "politik ausland");
+        assertNull(fd.getFileEditionStatement());
+        assertNull(fd.getBiblEditionStatement());
+        
+        assertEquals(fd.getLanguage(),    "de");
+        assertEquals(
+            fd.getReference(),
+            "Neues Deutschland, [Tageszeitung], 19.02.1959, Jg. 14,"+
+            " Berliner Ausgabe, S. 7. - Sachgebiet: Politik, "+
+            "Originalressort: POLITIK; Saragat-Partei zerfällt");
+        assertNull(fd.getPublisher());
+        assertNull(fd.getKeywords());
+
+        assertEquals(fd.getTokenSource(), "opennlp#tokens");
+
+        assertEquals(
+            fd.getFoundries(),
+            "base base/paragraphs base/sentences corenlp "+
+            "corenlp/constituency corenlp/morpho corenlp/namedentities"+
+            " corenlp/sentences glemm glemm/morpho mate mate/morpho"+
+            " opennlp opennlp/morpho opennlp/sentences treetagger"+
+            " treetagger/morpho treetagger/sentences");
+
+        assertEquals(
+            fd.getLayerInfos(),
+            "base/s=spans corenlp/c=spans corenlp/ne=tokens"+
+            " corenlp/p=tokens corenlp/s=spans glemm/l=tokens"+
+            " mate/l=tokens mate/m=tokens mate/p=tokens"+
+            " opennlp/p=tokens opennlp/s=spans tt/l=tokens"+
+            " tt/p=tokens tt/s=spans");
+
+        assertEquals(fd.getCorpusTitle(), "Bonner Zeitungskorpus");
+        assertNull(fd.getCorpusSubTitle());
+        assertNull(fd.getCorpusAuthor());
+        assertNull(fd.getCorpusEditor());
+
+        assertEquals(fd.getDocTitle(), "Neues Deutschland");
+        assertEquals(
+            fd.getDocSubTitle(),
+            "Organ des Zentralkomitees der Sozialistischen "+
+            "Einheitspartei Deutschlands");
+        assertNull(fd.getDocEditor());
+        assertNull(fd.getDocAuthor());
+        
+        KorapSearch ks = new KorapSearch(
+            new KorapQuery("tokens").
+            seg("mate/m:case:nom").
+            with("mate/m:number:sg")
+        );
+        KorapResult kr = ks.run(ki);
+
+        assertEquals(kr.getTotalResults(), 6);
+        assertEquals(0, kr.getStartIndex());
+        assertEquals(25, kr.getItemsPerPage());
     };
 
+
     @Test
     public void searchJSONcosmasBoundaryBug () throws IOException {
-	// Construct index
-	KorapIndex ki = new KorapIndex();
-	// Indexing test files
-	FieldDocument fd = ki.addDocFile(
-            1,getClass().getResource("/bzk/D59-00089.json.gz").getFile(), true
-	);
-	ki.commit();
+        // Construct index
+        KorapIndex ki = new KorapIndex();
+        // Indexing test files
+        FieldDocument fd = ki.addDocFile(
+            1,
+            getClass().
+            getResource("/bzk/D59-00089.json.gz").
+            getFile(),
+            true
+	    );
+        ki.commit();
 
-	String json = getString(
-	    getClass().getResource("/queries/bugs/cosmas_boundary.jsonld").getFile()
+        String json = getString(
+	        getClass().
+            getResource("/queries/bugs/cosmas_boundary.jsonld").
+            getFile()
         );
 
-	KorapQuery kq = new KorapQuery("tokens");
+        KorapQuery kq = new KorapQuery("tokens");
+        KorapSearch ks = new KorapSearch(
+            kq.shrink(
+                1,
+                kq.contains(kq.tag("base/s:s"), kq._(1, kq.seg("s:Leben")))
+            )
+        );
 
-	KorapSearch ks = new KorapSearch(
-	    kq.shrink(1,kq.contains(kq.tag("base/s:s"), kq._(1, kq.seg("s:Leben"))))
-	);
-
-	KorapResult kr = ks.run(ki);
-	assertEquals(
+        KorapResult kr = ks.run(ki);
+        assertEquals(
             kr.getQuery(),
-	    "shrink(1: spanContain(<tokens:base/s:s />, {1: tokens:s:Leben}))"
+            "shrink(1: spanContain(<tokens:base/s:s />, {1: tokens:s:Leben}))"
         );
-	assertEquals(
+        assertEquals(
             kr.getMatch(0).getSnippetBrackets(),
             "... Initiative\" eine neue politische Gruppierung ins " +
-	    "[{1:Leben}] gerufen hatten. Pressemeldungen zufolge haben sich ..."
+            "[{1:Leben}] gerufen hatten. Pressemeldungen zufolge haben sich ..."
         );
 
-	// Try with high class - don't highlight
-	ks = new KorapSearch(
-	    kq.shrink(129, kq.contains(kq.tag("base/s:s"), kq._(129, kq.seg("s:Leben"))))
-	);
+        // Try with high class - don't highlight
+        ks = new KorapSearch(
+            kq.shrink(
+                129,
+                kq.contains(kq.tag("base/s:s"), kq._(129, kq.seg("s:Leben")))
+            )
+        );
 
-	kr = ks.run(ki);
-	assertEquals(
+        kr = ks.run(ki);
+        assertEquals(
             kr.getQuery(),
-	    "shrink(129: spanContain(<tokens:base/s:s />, {129: tokens:s:Leben}))"
+            "shrink(129: spanContain(<tokens:base/s:s />, {129: tokens:s:Leben}))"
         );
-	assertEquals(
+        assertEquals(
             kr.getMatch(0).getSnippetBrackets(),
             "... Initiative\" eine neue politische Gruppierung ins " +
-	    "[Leben] gerufen hatten. Pressemeldungen zufolge haben sich ..."
+            "[Leben] gerufen hatten. Pressemeldungen zufolge haben sich ..."
         );
 
-	ks = new KorapSearch(json);
-	kr = ks.run(ki);
-	assertEquals(
+        ks = new KorapSearch(json);
+        kr = ks.run(ki);
+        assertEquals(
             kr.getQuery(),
-	    "shrink(129: spanElementDistance({129: tokens:s:Namen}, " +
-	    "{129: tokens:s:Leben}, [(base/s:s[0:1], notOrdered, notExcluded)]))"
+            "shrink(129: spanElementDistance({129: tokens:s:Namen}, " +
+            "{129: tokens:s:Leben}, [(base/s:s[0:1], notOrdered, notExcluded)]))"
         );
-	assertEquals(
-	    kr.getMatch(0).getSnippetBrackets(),
-	    "... ihren Austritt erklärt und unter dem [Namen \"Einheitsbewegung " +
-	    "der sozialistischen Initiative\" eine neue politische Gruppierung " +
-	    "ins Leben] gerufen hatten. Pressemeldungen zufolge haben sich ..."
+        assertEquals(
+            kr.getMatch(0).getSnippetBrackets(),
+            "... ihren Austritt erklärt und unter dem [Namen \"Einheitsbewegung " +
+            "der sozialistischen Initiative\" eine neue politische Gruppierung " +
+            "ins Leben] gerufen hatten. Pressemeldungen zufolge haben sich ..."
         );
-
-	assertEquals(kr.getTotalResults(), 1);
-	assertEquals(0, kr.getStartIndex());
+        assertEquals(kr.getTotalResults(), 1);
+        assertEquals(0, kr.getStartIndex());
     };
 
     @Test
     public void searchJSONmultipleClassesBug () throws IOException {
-	// Construct index
-	KorapIndex ki = new KorapIndex();
-	// Indexing test files
-	ki.addDocFile(
-            1,getClass().getResource("/bzk/D59-00089.json.gz").getFile(), true
-	);
-	ki.addDocFile(
-            2,getClass().getResource("/bzk/D59-00089.json.gz").getFile(), true
-	);
+        // Construct index
+        KorapIndex ki = new KorapIndex();
+        // Indexing test files
+        ki.addDocFile(
+            1,
+            getClass().
+            getResource("/bzk/D59-00089.json.gz").
+            getFile(),
+            true
+        );
+        ki.addDocFile(
+            2,
+            getClass().
+            getResource("/bzk/D59-00089.json.gz").
+            getFile(),
+            true
+        );
 
-	ki.commit();
+        ki.commit();
 
-	String json = getString(
-	    getClass().getResource("/queries/bugs/multiple_classes.jsonld").getFile()
+        String json = getString(
+            getClass().
+            getResource("/queries/bugs/multiple_classes.jsonld").
+            getFile()
         );
 	
-	KorapSearch ks = new KorapSearch(json);
-	KorapResult kr = ks.run(ki);
-	assertEquals(
+        KorapSearch ks = new KorapSearch(json);
+        KorapResult kr = ks.run(ki);
+        assertEquals(
             kr.getQuery(),
-	    "{4: spanNext({1: spanNext({2: tokens:s:ins}, {3: tokens:s:Leben})}, tokens:s:gerufen)}"
+            "{4: spanNext({1: spanNext({2: tokens:s:ins}, "+
+            "{3: tokens:s:Leben})}, tokens:s:gerufen)}"
         );
-	assertEquals(
-	    kr.getMatch(0).getSnippetBrackets(),
-	    "... sozialistischen Initiative\" eine neue politische Gruppierung " +
-	    "[{4:{1:{2:ins} {3:Leben}} gerufen}] hatten. " +
-	    "Pressemeldungen zufolge haben sich in ..."
+        assertEquals(
+            kr.getMatch(0).getSnippetBrackets(),
+            "... sozialistischen Initiative\" eine neue politische"+
+            " Gruppierung [{4:{1:{2:ins} {3:Leben}} gerufen}] hatten. " +
+            "Pressemeldungen zufolge haben sich in ..."
         );
-
-	assertEquals(kr.getTotalResults(), 2);
-	assertEquals(0, kr.getStartIndex());
+        assertEquals(kr.getTotalResults(), 2);
+        assertEquals(0, kr.getStartIndex());
     };
 
     @Test
     public void searchJSONmultipleClassesBugTokenList () throws IOException {
-	// Construct index
-	KorapIndex ki = new KorapIndex();
-	// Indexing test files
-	ki.addDocFile(
-            1,getClass().getResource("/goe/AGA-03828.json.gz").getFile(), true
-	);
-	ki.addDocFile(
-            2,getClass().getResource("/bzk/D59-00089.json.gz").getFile(), true
-	);
+        // Construct index
+        KorapIndex ki = new KorapIndex();
+        // Indexing test files
+        ki.addDocFile(
+            1,
+            getClass().
+            getResource("/goe/AGA-03828.json.gz").
+            getFile(),
+            true
+        );
+        ki.addDocFile(
+            2,
+            getClass().
+            getResource("/bzk/D59-00089.json.gz").
+            getFile(),
+            true
+        );
 
-	ki.commit();
+        ki.commit();
 
-	String json = getString(
-	    getClass().getResource("/queries/bugs/multiple_classes.jsonld").getFile()
+        String json = getString(
+            getClass().
+            getResource("/queries/bugs/multiple_classes.jsonld").
+            getFile()
         );
 	
-	KorapSearch ks = new KorapSearch(json);
-	KorapResult kr = ks.run(ki);
+        KorapSearch ks = new KorapSearch(json);
+        KorapResult kr = ks.run(ki);
 
-	ObjectMapper mapper = new ObjectMapper();
-	JsonNode res = mapper.readTree(kr.toTokenListJsonString());
+        ObjectMapper mapper = new ObjectMapper();
+        JsonNode res = mapper.readTree(kr.toTokenListJsonString());
 
-	assertEquals(1, res.at("/totalResults").asInt());
-	assertEquals("{4: spanNext({1: spanNext({2: tokens:s:ins}, " +
-		     "{3: tokens:s:Leben})}, tokens:s:gerufen)}", res.at("/query").asText());
-	assertEquals(0, res.at("/startIndex").asInt());
-	assertEquals(25, res.at("/itemsPerPage").asInt());
+        assertEquals(1, res.at("/totalResults").asInt());
+        assertEquals(
+            "{4: spanNext({1: spanNext({2: tokens:s:ins}, " +
+            "{3: tokens:s:Leben})}, tokens:s:gerufen)}",
+            res.at("/query").asText());
+        assertEquals(0, res.at("/startIndex").asInt());
+        assertEquals(25, res.at("/itemsPerPage").asInt());
 
-	assertEquals("BZK_D59.00089", res.at("/matches/0/textSigle").asText());
-	assertEquals(328, res.at("/matches/0/tokens/0/0").asInt());
-	assertEquals(331, res.at("/matches/0/tokens/0/1").asInt());
-	assertEquals(332, res.at("/matches/0/tokens/1/0").asInt());
-	assertEquals(337, res.at("/matches/0/tokens/1/1").asInt());
-	assertEquals(338, res.at("/matches/0/tokens/2/0").asInt());
-	assertEquals(345, res.at("/matches/0/tokens/2/1").asInt());
+        assertEquals("BZK_D59.00089", res.at("/matches/0/textSigle").asText());
+        assertEquals(328, res.at("/matches/0/tokens/0/0").asInt());
+        assertEquals(331, res.at("/matches/0/tokens/0/1").asInt());
+        assertEquals(332, res.at("/matches/0/tokens/1/0").asInt());
+        assertEquals(337, res.at("/matches/0/tokens/1/1").asInt());
+        assertEquals(338, res.at("/matches/0/tokens/2/0").asInt());
+        assertEquals(345, res.at("/matches/0/tokens/2/1").asInt());
     };
 
+
     @Test
     public void searchJSONmultitermRewriteBug () throws IOException {
-	// Construct index
-	KorapIndex ki = new KorapIndex();
-	// Indexing test files
-	ki.addDocFile(
-            1,getClass().getResource("/bzk/D59-00089.json.gz").getFile(), true
-	);
-	ki.commit();
+        // Construct index
+        KorapIndex ki = new KorapIndex();
 
-	// [tt/p="A.*"]{0,3}[tt/p="N.*"]
-	String json = getString(
-	    getClass().getResource("/queries/bugs/multiterm_rewrite.jsonld").getFile()
+        assertEquals(ki.numberOf("documents"), 0);
+
+        // Indexing test files
+        FieldDocument fd = ki.addDocFile(
+            1,
+            getClass().
+            getResource("/bzk/D59-00089.json.gz").
+            getFile(),
+            true
+        );
+        ki.commit();
+
+        assertEquals(ki.numberOf("documents"), 1);
+        assertEquals("BZK", fd.getCorpusSigle());
+
+        // [tt/p="A.*"]{0,3}[tt/p="N.*"]
+        String json = getString(
+            getClass().
+            getResource("/queries/bugs/multiterm_rewrite.jsonld").
+            getFile()
         );
 	
-	KorapSearch ks = new KorapSearch(json);
-	KorapCollection kc = ks.getCollection();
+        KorapSearch ks = new KorapSearch(json);
+        KorapCollection kc = ks.getCollection();
 
-	// No index was set
-	assertEquals(-1, kc.numberOf("documents"));
-	kc.setIndex(ki);
+        // No index was set
+        assertEquals(-1, kc.numberOf("documents"));
+        kc.setIndex(ki);
 
-	// Index was set but vc restricted to WPD
-	assertEquals(0, kc.numberOf("documents"));
+        // Index was set but vc restricted to WPD
+        assertEquals(0, kc.numberOf("documents"));
 
-	kc.extend(
-	    new KorapFilter().or("corpusSigle", "BZK")
+        kc.extend(
+            new KorapFilter().or("corpusSigle", "BZK")
         );
-	/*
-	System.err.println(ks.getCollection().toString());
-	*/
-	assertEquals("Known issue: ", 1, kc.numberOf("documents"));
+        ks.setCollection(kc);
+        assertEquals(1, kc.numberOf("documents"));
 
-	KorapResult kr = ks.run(ki);
-
-	assertEquals(
+        KorapResult kr = ks.run(ki);
+        
+        assertEquals(
             kr.getQuery(),
-	    "spanOr([SpanMultiTermQueryWrapper(tokens:/tt/p:N.*/), " +
-	    "spanNext(spanRepetition(SpanMultiTermQueryWrapper(tokens:/tt/p:A.*/){1,3}), " +
-	    "SpanMultiTermQueryWrapper(tokens:/tt/p:N.*/))])"
+            "spanOr([SpanMultiTermQueryWrapper(tokens:/tt/p:N.*/), " +
+            "spanNext(spanRepetition(SpanMultiTermQueryWrapper"+
+            "(tokens:/tt/p:A.*/){1,3}), " +
+            "SpanMultiTermQueryWrapper(tokens:/tt/p:N.*/))])"
         );
 
-	assertEquals(kr.getTotalResults(), 58);
-	assertEquals(0, kr.getStartIndex());
+        assertEquals(kr.getTotalResults(), 58);
+        assertEquals(0, kr.getStartIndex());
 
-	assertEquals(
-	    kr.getMatch(0).getSnippetBrackets(),
-	    "[Saragat-Partei] zerfällt Rom (ADN) die von dem"
+        assertEquals(
+            kr.getMatch(0).getSnippetBrackets(),
+            "[Saragat-Partei] zerfällt Rom (ADN) die von dem"
         );
-	assertEquals(
-	    kr.getMatch(1).getSnippetBrackets(),
-	    "[Saragat-Partei] zerfällt Rom (ADN) die von dem"
+        assertEquals(
+            kr.getMatch(1).getSnippetBrackets(),
+            "[Saragat-Partei] zerfällt Rom (ADN) die von dem"
         );
-	assertEquals(
-	    kr.getMatch(2).getSnippetBrackets(),
-	    "Saragat-Partei zerfällt [Rom] (ADN) die von dem Rechtssozialisten Saragat"
+        assertEquals(
+            kr.getMatch(2).getSnippetBrackets(),
+            "Saragat-Partei zerfällt [Rom] (ADN) "+
+            "die von dem Rechtssozialisten Saragat"
         );
-	assertEquals(
-	    kr.getMatch(3).getSnippetBrackets(),
-	    "Saragat-Partei zerfällt Rom ([ADN]) die von dem Rechtssozialisten Saragat geführte"
+        assertEquals(
+            kr.getMatch(3).getSnippetBrackets(),
+            "Saragat-Partei zerfällt Rom ([ADN]) "+
+            "die von dem Rechtssozialisten Saragat geführte"
         );
 
-	assertEquals(
-	    kr.getMatch(23).getSnippetBrackets(),
-	    "dem Namen \"Einheitsbewegung der sozialistischen Initiative\" [eine neue politische Gruppierung] ins Leben gerufen hatten. Pressemeldungen zufolge"
+        assertEquals(
+            kr.getMatch(23).getSnippetBrackets(),
+            "dem Namen \"Einheitsbewegung der sozialistischen "+
+            "Initiative\" [eine neue politische Gruppierung] "+
+            "ins Leben gerufen hatten. Pressemeldungen zufolge"
         );
     };
 
 
-
     @Test
     public void searchJSONCollection () throws IOException {
-
-	// Construct index
-	KorapIndex ki = new KorapIndex();
-	// Indexing test files
-	for (String i : new String[] {"00001",
-				      "00002",
-				      "00003",
-				      "00004",
-				      "00005",
-				      "00006",
-				      "02439"}) {
-	    ki.addDocFile(
-	      getClass().getResource("/wiki/" + i + ".json.gz").getFile(), true
+        // Construct index
+        KorapIndex ki = new KorapIndex();
+        // Indexing test files
+        for (String i : new String[] {"00001",
+                                      "00002",
+                                      "00003",
+                                      "00004",
+                                      "00005",
+                                      "00006",
+                                      "02439"}) {
+            ki.addDocFile(
+                getClass().
+                getResource("/wiki/" + i + ".json.gz").
+                getFile(),
+                true
             );
-	};
-	ki.commit();
-
-	String json = getString(
-            getClass().getResource("/queries/metaquery8-nocollection.jsonld").getFile()
+        };
+        ki.commit();
+        String json = getString(
+            getClass().
+            getResource("/queries/metaquery8-nocollection.jsonld").
+            getFile()
         );
 	
-	KorapSearch ks = new KorapSearch(json);
-	KorapResult kr = ks.run(ki);
-	assertEquals(kr.getTotalResults(), 276);
-	assertEquals(0, kr.getStartIndex());
-	assertEquals(10, kr.getItemsPerPage());
+        KorapSearch ks = new KorapSearch(json);
+        KorapResult kr = ks.run(ki);
+        assertEquals(kr.getTotalResults(), 276);
+        assertEquals(0, kr.getStartIndex());
+        assertEquals(10, kr.getItemsPerPage());
 
-	json = getString(getClass().getResource("/queries/metaquery8.jsonld").getFile());
+        json = getString(
+            getClass().
+            getResource("/queries/metaquery8.jsonld").
+            getFile()
+        );
 	
-	ks = new KorapSearch(json);
-	kr = ks.run(ki);
+        ks = new KorapSearch(json);
+        kr = ks.run(ki);
 
-	assertEquals(kr.getTotalResults(), 147);
-	assertEquals("WPD_AAA.00001", kr.getMatch(0).getDocID());
-	assertEquals(0, kr.getStartIndex());
-	assertEquals(10, kr.getItemsPerPage());
+        assertEquals(kr.getTotalResults(), 147);
+        assertEquals("WPD_AAA.00001", kr.getMatch(0).getDocID());
+        assertEquals(0, kr.getStartIndex());
+        assertEquals(10, kr.getItemsPerPage());
 
-	json = getString(getClass().getResource("/queries/metaquery8-filtered.jsonld").getFile());
+        json = getString(
+            getClass().
+            getResource("/queries/metaquery8-filtered.jsonld").
+            getFile()
+        );
 	
-	ks = new KorapSearch(json);
-	kr = ks.run(ki);
+        ks = new KorapSearch(json);
+        kr = ks.run(ki);
 
-	assertEquals(kr.getTotalResults(), 28);
-	assertEquals("WPD_AAA.00002", kr.getMatch(0).getDocID());
-	assertEquals(0, kr.getStartIndex());
-	assertEquals(10, kr.getItemsPerPage());
+        assertEquals(kr.getTotalResults(), 28);
+        assertEquals("WPD_AAA.00002", kr.getMatch(0).getDocID());
+        assertEquals(0, kr.getStartIndex());
+        assertEquals(10, kr.getItemsPerPage());
 
-	json = getString(getClass().getResource("/queries/metaquery8-filtered-further.jsonld").getFile());
+        json = getString(
+            getClass().
+            getResource("/queries/metaquery8-filtered-further.jsonld").
+            getFile()
+        );
 	
-	ks = new KorapSearch(json);
-	kr = ks.run(ki);
+        ks = new KorapSearch(json);
+        kr = ks.run(ki);
 
-	assertEquals(kr.getTotalResults(), 0);
-	assertEquals(0, kr.getStartIndex());
-	assertEquals(10, kr.getItemsPerPage());
-
-	json = getString(getClass().getResource("/queries/metaquery8-filtered-nested.jsonld").getFile());
+        assertEquals(kr.getTotalResults(), 0);
+        assertEquals(0, kr.getStartIndex());
+        assertEquals(10, kr.getItemsPerPage());
+        
+        json = getString(
+            getClass().
+            getResource("/queries/metaquery8-filtered-nested.jsonld").
+            getFile()
+        );
 	
-	ks = new KorapSearch(json);
-	kr = ks.run(ki);
+        ks = new KorapSearch(json);
+        kr = ks.run(ki);
 
-	assertEquals("filter with QueryWrapperFilter(+(ID:WPD_AAA.00003 (+tokens:s:die +tokens:s:Schriftzeichen)))", ks.getCollection().getFilter(1).toString());
+        assertEquals("filter with QueryWrapperFilter("+
+                     "+(ID:WPD_AAA.00003 (+tokens:s:die"+
+                     " +tokens:s:Schriftzeichen)))",
+                     ks.getCollection().getFilter(1).toString());
 
-	assertEquals(kr.getTotalResults(), 119);
-	assertEquals(0, kr.getStartIndex());
-	assertEquals(10, kr.getItemsPerPage());
+        assertEquals(kr.getTotalResults(), 119);
+        assertEquals(0, kr.getStartIndex());
+        assertEquals(10, kr.getItemsPerPage());
     };
 
 
     @Test
     public void searchJSONSentenceContext () throws IOException {
-
-	// Construct index
-	KorapIndex ki = new KorapIndex();
-	// Indexing test files
-	for (String i : new String[] {"00001", "00002", "00003", "00004", "00005", "00006", "02439"}) {
-	    ki.addDocFile(
-	      getClass().getResource("/wiki/" + i + ".json.gz").getFile(), true
+        // Construct index
+        KorapIndex ki = new KorapIndex();
+        // Indexing test files
+        for (String i : new String[] {"00001",
+                                      "00002",
+                                      "00003",
+                                      "00004",
+                                      "00005",
+                                      "00006",
+                                      "02439"}) {
+            ki.addDocFile(
+                getClass().
+                getResource("/wiki/" + i + ".json.gz").
+                getFile(),
+                true
             );
-	};
-	ki.commit();
+        };
+        ki.commit();
 
-	String json = getString(getClass().getResource("/queries/bsp-context-2.jsonld").getFile());
+        String json = getString(
+            getClass().
+            getResource("/queries/bsp-context-2.jsonld").
+            getFile()
+        );
 	
-	KorapSearch ks = new KorapSearch(json);
-	ks.setCutOff(false);
-	SearchContext sc = ks.getContext();
-	sc.left.setLength((short) 10);
-	sc.right.setLength((short) 10);
+        KorapSearch ks = new KorapSearch(json);
+        ks.setCutOff(false);
+        SearchContext sc = ks.getContext();
+        sc.left.setLength((short) 10);
+        sc.right.setLength((short) 10);
+        
+        KorapResult kr = ks.run(ki);
+        assertEquals(
+            kr.getMatch(1).getSnippetBrackets(),
+            "... dezimalen [Wert] 65 sowohl ..."
+        );
+        assertEquals(kr.getTotalResults(), 3);
+        assertEquals(0, kr.getStartIndex());
+        assertEquals(25, kr.getItemsPerPage());
+        assertFalse(kr.getContext().toJsonNode().toString().equals("\"s\""));
 
-	KorapResult kr = ks.run(ki);
-	assertEquals(kr.getMatch(1).getSnippetBrackets(), "... dezimalen [Wert] 65 sowohl ...");
-	assertEquals(kr.getTotalResults(), 3);
-	assertEquals(0, kr.getStartIndex());
-	assertEquals(25, kr.getItemsPerPage());
-	assertFalse(kr.getContext().toJsonNode().toString().equals("\"s\""));
+        json = getString(
+            getClass().
+            getResource("/queries/bsp-context-sentence.jsonld").
+            getFile()
+        );
 
-	json = getString(getClass().getResource("/queries/bsp-context-sentence.jsonld").getFile());
+        kr = new KorapSearch(json).run(ki);
+        assertEquals(
+            kr.getMatch(0).getSnippetBrackets(),
+            "steht a für den dezimalen [Wert] 97 sowohl im ASCII-"+
+            " als auch im Unicode-Zeichensatz"
+        );
+        assertEquals(
+            kr.getMatch(1).getSnippetBrackets(),
+            "steht A für den dezimalen [Wert] 65 sowohl im ASCII-"+
+            " als auch im Unicode-Zeichensatz"
+        );
+        assertEquals(
+            kr.getMatch(2).getSnippetBrackets(),
+            "In einem Zahlensystem mit einer Basis größer "+
+            "als 10 steht A oder a häufig für den dezimalen"+
+            " [Wert] 10, siehe auch Hexadezimalsystem."
+        );
 
-	kr = new KorapSearch(json).run(ki);
-	assertEquals(kr.getMatch(0).getSnippetBrackets(),
-		     "steht a für den dezimalen [Wert] 97 sowohl im ASCII- als auch im Unicode-Zeichensatz");
-	assertEquals(kr.getMatch(1).getSnippetBrackets(),
-		     "steht A für den dezimalen [Wert] 65 sowohl im ASCII- als auch im Unicode-Zeichensatz");
-	assertEquals(kr.getMatch(2).getSnippetBrackets(),
-		     "In einem Zahlensystem mit einer Basis größer als 10 steht A oder a häufig für den dezimalen [Wert] 10, siehe auch Hexadezimalsystem.");
-
-	assertEquals(kr.getContext().toJsonNode().toString(), "\"s\"");
+        assertEquals(kr.getContext().toJsonNode().toString(), "\"s\"");
     };
 
 
     @Test
     public void searchJSONbug () throws IOException {
-
-	// Construct index
-	KorapIndex ki = new KorapIndex();
-	// Indexing test files
-	for (String i : new String[] {"00001",
-				      "00002",
-				      "00003",
-				      "00004",
-				      "00005",
-				      "00006",
-				      "02439"}) {
-	    ki.addDocFile(
-	      getClass().getResource("/wiki/" + i + ".json.gz").getFile(), true
+        // Construct index
+        KorapIndex ki = new KorapIndex();
+        // Indexing test files
+        for (String i : new String[] {"00001",
+                                      "00002",
+                                      "00003",
+                                      "00004",
+                                      "00005",
+                                      "00006",
+                                      "02439"}) {
+            ki.addDocFile(
+                getClass().
+                getResource("/wiki/" + i + ".json.gz").
+                getFile(),
+                true
             );
-	};
-	ki.commit();
+        };
+        ki.commit();
 
-	String json = getString(getClass().getResource("/queries/bsp-bug.jsonld").getFile());
+        String json = getString(
+            getClass().
+            getResource("/queries/bsp-bug.jsonld").
+            getFile()
+        );
 
-	KorapResult kr = new KorapSearch(json).run(ki);
+        KorapResult kr = new KorapSearch(json).run(ki);
 
-	assertEquals(kr.getError(0).getMessage(),
-		     "Number of operands is not acceptable");
+        assertEquals(
+            kr.getError(0).getMessage(),
+            "Number of operands is not acceptable"
+        );
     };
 
+
     /**
      * This is a breaking test for #179
      */
@@ -964,74 +1168,88 @@
 		KorapIndex ki = new KorapIndex();
 		// Indexing test files
 		ki.addDocFile(
-		  getClass().getResource("/wiki/00002.json.gz").getFile(), true
-		);
+            getClass().
+            getResource("/wiki/00002.json.gz").
+            getFile(),
+            true
+        );
 		ki.commit();
 	
 		// Expansion bug
 		// der alte Digraph Aa durch Å
 		String json = getString(
-	            getClass().getResource("/queries/bugs/expansion_bug_2.jsonld").getFile()
-	        );
+            getClass().
+            getResource("/queries/bugs/expansion_bug_2.jsonld").
+            getFile()
+        );
 	
 		KorapResult kr = new KorapSearch(json).run(ki);				
 		assertEquals("... Buchstabe des Alphabetes. In Dänemark ist " +
-			     "[der alte Digraph Aa durch Å] ersetzt worden, " +
-			     "in Eigennamen und Ortsnamen ...",
-			     kr.getMatch(0).getSnippetBrackets());
+                     "[der alte Digraph Aa durch Å] ersetzt worden, " +
+                     "in Eigennamen und Ortsnamen ...",
+                     kr.getMatch(0).getSnippetBrackets());
 		assertEquals("WPD_AAA.00002", kr.getMatch(0).getDocID());
 		assertEquals(kr.getTotalResults(), 1);
-	
+        
 		// der alte Digraph Aa durch []
 		// Works with one document
 		json = getString(
-	            getClass().getResource("/queries/bugs/expansion_bug.jsonld").getFile()
-	        );
+            getClass().
+            getResource("/queries/bugs/expansion_bug.jsonld").
+            getFile()
+        );
 	
 		kr = new KorapSearch(json).run(ki);
 		
 		assertEquals("... Buchstabe des Alphabetes. In Dänemark ist " +
-			     "[der alte Digraph Aa durch Å] ersetzt worden, " +
-			     "in Eigennamen und Ortsnamen ...",
-			     kr.getMatch(0).getSnippetBrackets());
+                     "[der alte Digraph Aa durch Å] ersetzt worden, " +
+                     "in Eigennamen und Ortsnamen ...",
+                     kr.getMatch(0).getSnippetBrackets());
 		assertEquals("WPD_AAA.00002", kr.getMatch(0).getDocID());
 		assertEquals(kr.getTotalResults(), 1);
 	
 		// Now try with one file ahead
 		ki = new KorapIndex();
 		for (String i : new String[] {"00001",
-					      "00002"}) {
+                                      "00002"}) {
 		    ki.addDocFile(
-		      getClass().getResource("/wiki/" + i + ".json.gz").getFile(), true
-	            );
+                getClass().
+                getResource("/wiki/" + i + ".json.gz").
+                getFile(),
+                true
+            );
 		};
 		ki.commit();
 	
 		// Expansion bug
 		// der alte Digraph Aa durch Å
 		json = getString(
-	            getClass().getResource("/queries/bugs/expansion_bug_2.jsonld").getFile()
-	        );
+            getClass().
+            getResource("/queries/bugs/expansion_bug_2.jsonld").
+            getFile()
+        );
 	
 		kr = new KorapSearch(json).run(ki);
 		
 		assertEquals("... Buchstabe des Alphabetes. In Dänemark ist " +
-			     "[der alte Digraph Aa durch Å] ersetzt worden, " +
-			     "in Eigennamen und Ortsnamen ...",
-			     kr.getMatch(0).getSnippetBrackets());
+                     "[der alte Digraph Aa durch Å] ersetzt worden, " +
+                     "in Eigennamen und Ortsnamen ...",
+                     kr.getMatch(0).getSnippetBrackets());
 		assertEquals("WPD_AAA.00002", kr.getMatch(0).getDocID());
 		assertEquals(kr.getTotalResults(), 1);
 	
 		// der alte Digraph Aa durch []
 		json = getString(
-	            getClass().getResource("/queries/bugs/expansion_bug.jsonld").getFile()
-	        );
+            getClass().
+            getResource("/queries/bugs/expansion_bug.jsonld").
+            getFile()
+        );
 	
 		kr = new KorapSearch(json).run(ki);	
 		assertEquals("... Buchstabe des Alphabetes. In Dänemark ist " +
-			     "[der alte Digraph Aa durch Å] ersetzt worden, " +
-			     "in Eigennamen und Ortsnamen ...",
-			     kr.getMatch(0).getSnippetBrackets());
+                     "[der alte Digraph Aa durch Å] ersetzt worden, " +
+                     "in Eigennamen und Ortsnamen ...",
+                     kr.getMatch(0).getSnippetBrackets());
 		assertEquals("WPD_AAA.00002", kr.getMatch(0).getDocID());
 		assertEquals(kr.getTotalResults(), 1);
     };
@@ -1039,43 +1257,45 @@
 
     /*
       This test will crash soon - it's just here for nostalgic reasons!
-     */
+    */
     @Test
     public void getFoundryDistribution () throws Exception {
-
-	// Construct index
-	KorapIndex ki = new KorapIndex();
-	// Indexing test files
-	for (String i : new String[] {"00001",
-				      "00002",
-				      "00003",
-				      "00004",
-				      "00005",
-				      "00006",
-				      "02439"}) {
-	    ki.addDocFile(
-	      getClass().getResource("/wiki/" + i + ".json.gz").getFile(), true
+        // Construct index
+        KorapIndex ki = new KorapIndex();
+        // Indexing test files
+        for (String i : new String[] {"00001",
+                                      "00002",
+                                      "00003",
+                                      "00004",
+                                      "00005",
+                                      "00006",
+                                      "02439"}) {
+            ki.addDocFile(
+                getClass().
+                getResource("/wiki/" + i + ".json.gz").
+                getFile(),
+                true
             );
-	};
-	ki.commit();
+        };
+        ki.commit();
 
-	KorapCollection kc = new KorapCollection(ki);
+        KorapCollection kc = new KorapCollection(ki);
 
-	assertEquals(7, kc.numberOf("documents"));
+        assertEquals(7, kc.numberOf("documents"));
 
     	HashMap map = kc.getTermRelation("foundries");
-	assertEquals((long) 7, map.get("-docs"));
-	assertEquals((long) 7, map.get("treetagger"));
-	assertEquals((long) 6, map.get("opennlp/morpho"));
-	assertEquals((long) 6, map.get("#__opennlp/morpho:###:treetagger"));
-	assertEquals((long) 7, map.get("#__opennlp:###:treetagger"));
+        assertEquals((long) 7, map.get("-docs"));
+        assertEquals((long) 7, map.get("treetagger"));
+        assertEquals((long) 6, map.get("opennlp/morpho"));
+        assertEquals((long) 6, map.get("#__opennlp/morpho:###:treetagger"));
+        assertEquals((long) 7, map.get("#__opennlp:###:treetagger"));
     };
 
+
     @Test
     public void getTextClassDistribution () throws Exception {
-
-	KorapIndex ki = new KorapIndex();
-	ki.addDoc(
+        KorapIndex ki = new KorapIndex();
+        ki.addDoc(
 "{" +
 "  \"fields\" : [" +
 "    { \"primaryData\" : \"abc\" },{" +
@@ -1085,9 +1305,10 @@
 "         [ \"s:b\", \"i:b\", \"_1#1-2\" ]," +
 "         [ \"s:c\", \"i:c\", \"_2#2-3\" ]]}]," +
 "  \"textClass\" : \"music entertainment\"" +
-"}");
+"}"
+        );
 
-	ki.addDoc(
+        ki.addDoc(
 "{" +
 "  \"fields\" : [" +
 "    { \"primaryData\" : \"abc\" },{" +
@@ -1097,9 +1318,10 @@
 "         [ \"s:b\", \"i:b\", \"_1#1-2\" ]," +
 "         [ \"s:c\", \"i:c\", \"_2#2-3\" ]]}]," +
 "  \"textClass\" : \"music singing\"" +
-"}");
+"}"
+        );
 
-	ki.addDoc(
+        ki.addDoc(
 "{" +
 "  \"fields\" : [" +
 "    { \"primaryData\" : \"abc\" },{" +
@@ -1109,35 +1331,35 @@
 "         [ \"s:b\", \"i:b\", \"_1#1-2\" ]," +
 "         [ \"s:c\", \"i:c\", \"_2#2-3\" ]]}]," +
 "  \"textClass\" : \"music entertainment jumping\"" +
-"}");
-	ki.commit();
+"}"
+        );
+        ki.commit();
 
-
-	KorapCollection kc = new KorapCollection(ki);
-	assertEquals(3, kc.numberOf("documents"));
+        KorapCollection kc = new KorapCollection(ki);
+        assertEquals(3, kc.numberOf("documents"));
 
     	HashMap map = kc.getTermRelation("textClass");
-	assertEquals((long) 1, map.get("singing"));
-	assertEquals((long) 1, map.get("jumping"));
-	assertEquals((long) 3, map.get("music"));
-	assertEquals((long) 2, map.get("entertainment"));
-	assertEquals((long) 3, map.get("-docs"));
-	assertEquals((long) 2, map.get("#__entertainment:###:music"));
-	assertEquals((long) 1, map.get("#__entertainment:###:jumping"));
-	assertEquals((long) 0, map.get("#__entertainment:###:singing"));
-	assertEquals((long) 0, map.get("#__jumping:###:singing"));
-	assertEquals((long) 1, map.get("#__jumping:###:music"));
-	assertEquals((long) 1, map.get("#__music:###:singing"));
-	assertEquals(11, map.size());
-
-	// System.err.println(kc.getTermRelationJSON("textClass"));
+        assertEquals((long) 1, map.get("singing"));
+        assertEquals((long) 1, map.get("jumping"));
+        assertEquals((long) 3, map.get("music"));
+        assertEquals((long) 2, map.get("entertainment"));
+        assertEquals((long) 3, map.get("-docs"));
+        assertEquals((long) 2, map.get("#__entertainment:###:music"));
+        assertEquals((long) 1, map.get("#__entertainment:###:jumping"));
+        assertEquals((long) 0, map.get("#__entertainment:###:singing"));
+        assertEquals((long) 0, map.get("#__jumping:###:singing"));
+        assertEquals((long) 1, map.get("#__jumping:###:music"));
+        assertEquals((long) 1, map.get("#__music:###:singing"));
+        assertEquals(11, map.size());
+        
+        // System.err.println(kc.getTermRelationJSON("textClass"));
     };
 
+
     @Test
     public void getTextClassDistribution2 () throws Exception {
-
-	KorapIndex ki = new KorapIndex();
-	ki.addDoc(
+        KorapIndex ki = new KorapIndex();
+        ki.addDoc(
 "{" +
 "  \"fields\" : [" +
 "    { \"primaryData\" : \"abc\" },{" +
@@ -1147,10 +1369,10 @@
 "         [ \"s:b\", \"i:b\", \"_1#1-2\" ]," +
 "         [ \"s:c\", \"i:c\", \"_2#2-3\" ]]}]," +
 "  \"textClass\" : \"\"" +
-"}");
-
-	ki.commit();
-	ki.addDoc(
+"}"
+        );
+        ki.commit();
+        ki.addDoc(
 "{" +
 "  \"fields\" : [" +
 "    { \"primaryData\" : \"abc\" },{" +
@@ -1160,10 +1382,11 @@
 "         [ \"s:b\", \"i:b\", \"_1#1-2\" ]," +
 "         [ \"s:c\", \"i:c\", \"_2#2-3\" ]]}]," +
 "  \"textClass\" : \"music entertainment\"" +
-"}");
+"}"
+        );
 
-	ki.commit();
-	ki.addDoc(
+        ki.commit();
+        ki.addDoc(
 "{" +
 "  \"fields\" : [" +
 "    { \"primaryData\" : \"abc\" },{" +
@@ -1173,9 +1396,10 @@
 "         [ \"s:b\", \"i:b\", \"_1#1-2\" ]," +
 "         [ \"s:c\", \"i:c\", \"_2#2-3\" ]]}]," +
 "  \"textClass\" : \"music singing\"" +
-"}");
+"}"
+        );
 
-	ki.addDoc(
+        ki.addDoc(
 "{" +
 "  \"fields\" : [" +
 "    { \"primaryData\" : \"abc\" },{" +
@@ -1185,25 +1409,25 @@
 "         [ \"s:b\", \"i:b\", \"_1#1-2\" ]," +
 "         [ \"s:c\", \"i:c\", \"_2#2-3\" ]]}]," +
 "  \"textClass\" : \"music entertainment jumping\"" +
-"}");
-	ki.commit();
+"}"
+        );
+        ki.commit();
 
-
-	KorapCollection kc = new KorapCollection(ki);
-	assertEquals(4, kc.numberOf("documents"));
+        KorapCollection kc = new KorapCollection(ki);
+        assertEquals(4, kc.numberOf("documents"));
 
     	HashMap map = kc.getTermRelation("textClass");
-	assertEquals((long) 1, map.get("singing"));
-	assertEquals((long) 1, map.get("jumping"));
-	assertEquals((long) 3, map.get("music"));
-	assertEquals((long) 2, map.get("entertainment"));
-	assertEquals((long) 4, map.get("-docs"));
-	assertEquals((long) 2, map.get("#__entertainment:###:music"));
-	assertEquals((long) 1, map.get("#__entertainment:###:jumping"));
-	assertEquals((long) 0, map.get("#__entertainment:###:singing"));
-	assertEquals((long) 0, map.get("#__jumping:###:singing"));
-	assertEquals((long) 1, map.get("#__jumping:###:music"));
-	assertEquals((long) 1, map.get("#__music:###:singing"));
-	assertEquals(11, map.size());
+        assertEquals((long) 1, map.get("singing"));
+        assertEquals((long) 1, map.get("jumping"));
+        assertEquals((long) 3, map.get("music"));
+        assertEquals((long) 2, map.get("entertainment"));
+        assertEquals((long) 4, map.get("-docs"));
+        assertEquals((long) 2, map.get("#__entertainment:###:music"));
+        assertEquals((long) 1, map.get("#__entertainment:###:jumping"));
+        assertEquals((long) 0, map.get("#__entertainment:###:singing"));
+        assertEquals((long) 0, map.get("#__jumping:###:singing"));
+        assertEquals((long) 1, map.get("#__jumping:###:music"));
+        assertEquals((long) 1, map.get("#__music:###:singing"));
+        assertEquals(11, map.size());
     };
 };
diff --git a/src/test/java/de/ids_mannheim/korap/server/TestResource.java b/src/test/java/de/ids_mannheim/korap/server/TestResource.java
index c6014f7..de1a572 100644
--- a/src/test/java/de/ids_mannheim/korap/server/TestResource.java
+++ b/src/test/java/de/ids_mannheim/korap/server/TestResource.java
@@ -108,11 +108,8 @@
             queryParam("uid", "4").
             request("application/json").
             post(Entity.json(json), KorapResponse.class);
-        /*
-          assertEquals(2, kresp.getTotalResults());
-        */
-        fail("totalResults should be implemented in KorapResponse" +
-             " or KorapResult should be used here");
+
+        assertEquals(2, kresp.getTotalResults());
         assertFalse(kresp.hasErrors());
         assertFalse(kresp.hasWarnings());
         assertFalse(kresp.hasMessages());
