diff --git a/Changes b/Changes
index 8bd48bd..f1ec155 100644
--- a/Changes
+++ b/Changes
@@ -1,10 +1,13 @@
-0.51 2015-03-03
+0.51 2015-03-04
         - This is a major version (prepared for the GitHub release)
         - [cleanup] Changed groupID to "de.ids_mannheim.korap",
 	  renamed korap-style.xml to Format.xml (diewald)
 	- [bugfix] Updated Format.xml to work with
 	  recent versions of Eclipse (diewald)
         - [documentation] Improved documentation for API classes (diewald)
+	- [bugfix] Updated AttributeSpans (margaretha)
+	- [bugfix] Updated SpanRelationQuery (margaretha)
+	- [cleanup] Autoformat (diewald)
 
 0.50.1 2015-03-02
 	- [feature] Deserialization of arbitrary elements with
diff --git a/src/main/java/de/ids_mannheim/korap/Krill.java b/src/main/java/de/ids_mannheim/korap/Krill.java
index 0fdf5d0..85d64b4 100644
--- a/src/main/java/de/ids_mannheim/korap/Krill.java
+++ b/src/main/java/de/ids_mannheim/korap/Krill.java
@@ -18,35 +18,38 @@
 import org.slf4j.LoggerFactory;
 
 /**
- * <p>Krill is a corpus data retrieval index using Lucene for Look-Ups.</p>
- *
+ * <p>Krill is a corpus data retrieval index using Lucene for
+ * Look-Ups.</p>
+ * 
  * <p>
  * It is the reference implementation for KoralQuery consumption,
  * and this class acts as the central point for consuming and
  * responding to KoralQuery requests.
  * </p>
- *
+ * 
  * <p>
- * The processing of the collection section of the request is delegated
- * to {@link KrillCollection}, the query section to {@link KrillQuery},
+ * The processing of the collection section of the request is
+ * delegated
+ * to {@link KrillCollection}, the query section to {@link KrillQuery}
+ * ,
  * and the meta section to {@link KrillMeta}.
  * </p>
- *
+ * 
  * <blockquote><pre>
- *   // Create or receive a KoralQuery JSON string
- *   String koral = "{\"query\":{...}, \"collection\":{...}, ... }";
- *
- *   // Create a new krill search object by passing the Query
- *   Krill krill = new Krill(koral);
- *
- *   // Apply the query to an index and receive a search result
- *   // This may invoke different actions depending on the request
- *   Result result = krill.setIndex(new KrillIndex()).apply();
+ * // Create or receive a KoralQuery JSON string
+ * String koral = "{\"query\":{...}, \"collection\":{...}, ... }";
+ * 
+ * // Create a new krill search object by passing the Query
+ * Krill krill = new Krill(koral);
+ * 
+ * // Apply the query to an index and receive a search result
+ * // This may invoke different actions depending on the request
+ * Result result = krill.setIndex(new KrillIndex()).apply();
  * </pre></blockquote>
- *
+ * 
  * @author diewald
  * @author margaretha
- *
+ * 
  * @see KrillCollection
  * @see KrillQuery
  * @see KrillMeta
@@ -62,6 +65,7 @@
     // Logger
     private final static Logger log = LoggerFactory.getLogger(Krill.class);
 
+
     /**
      * Construct a new Krill object.
      */
@@ -71,8 +75,9 @@
     /**
      * Construct a new Krill object,
      * consuming a KoralQuery json string.
-     *
-     * @param query The KoralQuery json string.
+     * 
+     * @param query
+     *            The KoralQuery json string.
      */
     public Krill (String query) {
         this.fromJson(query);
@@ -82,8 +87,9 @@
     /**
      * Construct a new Krill object,
      * consuming a KoralQuery {@link JsonNode} object.
-     *
-     * @param query The KoralQuery {@link JsonNode} object.
+     * 
+     * @param query
+     *            The KoralQuery {@link JsonNode} object.
      */
     public Krill (JsonNode query) {
         this.fromJson(query);
@@ -93,8 +99,9 @@
     /**
      * Construct a new Krill object,
      * consuming a {@link SpanQueryWrapper} object.
-     *
-     * @param query The {@link SpanQueryWrapper} object.
+     * 
+     * @param query
+     *            The {@link SpanQueryWrapper} object.
      */
     public Krill (SpanQueryWrapper query) {
         try {
@@ -106,13 +113,14 @@
             this.addError(q.getErrorCode(), q.getMessage());
         };
     };
-    
+
 
     /**
      * Construct a new Krill object,
      * consuming a {@link SpanQuery} object.
-     *
-     * @param query The {@link SpanQuery} object.
+     * 
+     * @param query
+     *            The {@link SpanQuery} object.
      */
     public Krill (SpanQuery query) {
         this.spanQuery = query;
@@ -121,8 +129,9 @@
 
     /**
      * Parse KoralQuery as a json string.
-     *
-     * @param query The KoralQuery json string.
+     * 
+     * @param query
+     *            The KoralQuery json string.
      * @return The {@link Krill} object for chaining.
      * @throws QueryException
      */
@@ -145,8 +154,9 @@
 
     /**
      * Parse KoralQuery as a {@link JsonNode} object.
-     *
-     * @param query The KoralQuery {@link JsonNode} object.
+     * 
+     * @param query
+     *            The KoralQuery {@link JsonNode} object.
      * @return The {@link Krill} object for chaining.
      * @throws QueryException
      */
@@ -185,21 +195,19 @@
             this.addError(700, "No query given");
 
         // <legacycode>
-        if (json.has("warning") &&
-            json.get("warning").asText().length() > 0) {
+        if (json.has("warning") && json.get("warning").asText().length() > 0) {
             this.addWarning(799, json.get("warning").asText());
         };
         // </legacycode>
 
         // Copy notifications from request
         this.copyNotificationsFrom(json);
-	    
+
         // Parse "collection" or "collections" attribute
         try {
             if (json.has("collection")) {
-                this.setCollection(
-                    new KrillCollection().fromJson(json.get("collection"))
-                );
+                this.setCollection(new KrillCollection().fromJson(json
+                        .get("collection")));
             }
 
             // <legacycode>
@@ -208,7 +216,7 @@
                 for (JsonNode collection : json.get("collections")) {
                     kc.fromJsonLegacy(collection);
                 };
-                
+
                 this.setCollection(kc);
             };
             // </legacycode>
@@ -227,7 +235,7 @@
 
     /**
      * Get the associated {@link KrillIndex} object.
-     *
+     * 
      * @return The associated {@link KrillIndex} object.
      */
     public KrillIndex getIndex () {
@@ -237,8 +245,9 @@
 
     /**
      * Set the {@link KrillIndex} object.
-     *
-     * @param index The associated {@link KrillIndex} object.
+     * 
+     * @param index
+     *            The associated {@link KrillIndex} object.
      * @return The {@link Krill} object for chaining.
      */
     public Krill setIndex (KrillIndex index) {
@@ -250,11 +259,12 @@
     /**
      * Apply the KoralQuery to an index.
      * This may invoke different actions depending
-     * on the meta information, like {@link KrillIndex#search}
-     * or {@link KrillIndex#collect}.
-     *
-     * @param index The {@link KrillIndex}
-     *        the search should be applyied to.
+     * on the meta information, like {@link KrillIndex#search} or
+     * {@link KrillIndex#collect}.
+     * 
+     * @param index
+     *            The {@link KrillIndex} the search should be applyied
+     *            to.
      * @return The result as a {@link Result} object.
      */
     public Result apply (KrillIndex index) {
@@ -265,9 +275,9 @@
     /**
      * Apply the KoralQuery to an index.
      * This may invoke different actions depending
-     * on the meta information, like {@link KrillIndex#search}
-     * or {@link KrillIndex#collect}.
-     *
+     * on the meta information, like {@link KrillIndex#search} or
+     * {@link KrillIndex#collect}.
+     * 
      * @return The result as a {@link Result} object.
      */
     public Result apply () {
@@ -302,11 +312,12 @@
 
     /**
      * Get the associated {@link SpanQuery} deserialization
-     * (i.e. the internal correspandence to KoralQuery's query object).
-     *
+     * (i.e. the internal correspandence to KoralQuery's query
+     * object).
+     * 
      * <strong>Warning</strong>: SpanQueries may be lazy deserialized
      * in future versions of Krill, rendering this API obsolete.
-     *
+     * 
      * @return The deserialized {@link SpanQuery} object.
      */
     @Deprecated
@@ -317,13 +328,15 @@
 
     /**
      * Set the SpanQuery by means of a {@link SpanQueryWrapper} object
-     * (i.e. the internal correspandence to KoralQuery's query object).
-     *
+     * (i.e. the internal correspandence to KoralQuery's query
+     * object).
+     * 
      * <strong>Warning</strong>: SpanQueries may be lazy deserialized
      * in future versions of Krill, rendering this API obsolete.
-     *
-     * @param query The {@link SpanQueryWrapper} to unwrap
-     *        the {@link SpanQuery} object.
+     * 
+     * @param query
+     *            The {@link SpanQueryWrapper} to unwrap
+     *            the {@link SpanQuery} object.
      * @return The {@link Krill} object for chaining.
      */
     @Deprecated
@@ -340,14 +353,16 @@
 
     /**
      * Set the {@link SpanQuery} object
-     * (i.e. the internal correspandence to KoralQuery's query object).
-     *
+     * (i.e. the internal correspandence to KoralQuery's query
+     * object).
+     * 
      * <strong>Warning</strong>: SpanQueries may be lazy deserialized
      * in future versions of Krill, rendering this API obsolete.
-     *
-     * @param query The {@link SpanQuery} object.
+     * 
+     * @param query
+     *            The {@link SpanQuery} object.
      * @return The {@link Krill} object for chaining.
-     */    
+     */
     @Deprecated
     public Krill setSpanQuery (SpanQuery sq) {
         this.spanQuery = sq;
diff --git a/src/main/java/de/ids_mannheim/korap/KrillCollection.java b/src/main/java/de/ids_mannheim/korap/KrillCollection.java
index 2b7e771..e593eff 100644
--- a/src/main/java/de/ids_mannheim/korap/KrillCollection.java
+++ b/src/main/java/de/ids_mannheim/korap/KrillCollection.java
@@ -30,17 +30,18 @@
 /**
  * Create a Virtual Collection of documents by means of a KoralQuery
  * collection object.
- * Alternatively by applying manual filters and extensions on Lucene fields.
- *
+ * Alternatively by applying manual filters and extensions on Lucene
+ * fields.
+ * 
  * <blockquote><pre>
- *   KrillCollection kc = new KrillCollection(json);
- *   kc.filterUIDS("a1", "a2", "a3");
+ * KrillCollection kc = new KrillCollection(json);
+ * kc.filterUIDS("a1", "a2", "a3");
  * </pre></blockquote>
- *
+ * 
  * <strong>Warning</strong>: This API is deprecated and will
  * be replaced in future versions. It supports legacy versions of
  * KoralQuery that will be disabled.
- *
+ * 
  * @author diewald
  */
 /*
@@ -58,9 +59,10 @@
     private String id;
     private ArrayList<FilterOperation> filter;
     private int filterCount = 0;
-    
+
     // Logger
-    private final static Logger log = LoggerFactory.getLogger(KrillCollection.class);
+    private final static Logger log = LoggerFactory
+            .getLogger(KrillCollection.class);
 
     // This advices the java compiler to ignore all loggings
     public static final boolean DEBUG = false;
@@ -68,8 +70,9 @@
 
     /**
      * Construct a new KrillCollection by passing a KrillIndex.
-     *
-     * @param index The {@link KrillIndex} object.
+     * 
+     * @param index
+     *            The {@link KrillIndex} object.
      */
     public KrillCollection (KrillIndex index) {
         this.index = index;
@@ -81,8 +84,9 @@
      * Construct a new KrillCollection by passing a KoralQuery.
      * This supports collections with the key "collection" and
      * legacy collections with the key "collections".
-     *
-     * @param jsonString The virtual collection as a KoralQuery.
+     * 
+     * @param jsonString
+     *            The virtual collection as a KoralQuery.
      */
     public KrillCollection (String jsonString) {
         ObjectMapper mapper = new ObjectMapper();
@@ -90,19 +94,17 @@
 
         try {
             JsonNode json = mapper.readTree(jsonString);
-            
+
             // Deserialize from recent collections
             if (json.has("collection")) {
                 this.fromJson(json.get("collection"));
             }
-	    
+
             // Legacy collection serialization
             // This will be removed!
             else if (json.has("collections")) {
-                this.addMessage(
-                    850,
-                    "Collections are deprecated in favour of a single collection"
-                );
+                this.addMessage(850,
+                        "Collections are deprecated in favour of a single collection");
                 for (JsonNode collection : json.get("collections")) {
                     this.fromJsonLegacy(collection);
                 };
@@ -113,12 +115,8 @@
             this.addError(qe.getErrorCode(), qe.getMessage());
         }
         catch (IOException e) {
-            this.addError(
-                621,
-                "Unable to parse JSON",
-                "KrillCollection",
-                e.getLocalizedMessage()
-            );
+            this.addError(621, "Unable to parse JSON", "KrillCollection",
+                    e.getLocalizedMessage());
         };
     };
 
@@ -133,8 +131,9 @@
 
     /**
      * Import the "collection" part of a KoralQuery.
-     *
-     * @param jsonString The "collection" part of a KoralQuery.
+     * 
+     * @param jsonString
+     *            The "collection" part of a KoralQuery.
      * @throws QueryException
      */
     public KrillCollection fromJson (String jsonString) throws QueryException {
@@ -152,9 +151,10 @@
 
     /**
      * Import the "collection" part of a KoralQuery.
-     *
-     * @param json The "collection" part of a KoralQuery
-     *        as a {@link JsonNode} object.
+     * 
+     * @param json
+     *            The "collection" part of a KoralQuery
+     *            as a {@link JsonNode} object.
      * @throws QueryException
      */
     public KrillCollection fromJson (JsonNode json) throws QueryException {
@@ -170,25 +170,27 @@
 
 
     // Create a booleanfilter from JSON
-    private BooleanFilter _fromJson (JsonNode json, String field) throws QueryException {
+    private BooleanFilter _fromJson (JsonNode json, String field)
+            throws QueryException {
         BooleanFilter bfilter = new BooleanFilter();
 
         // TODO: THIS UNFORTUNATELY BREAKS TESTS
         if (!json.has("@type"))
-            throw new QueryException(701, "JSON-LD group has no @type attribute");
+            throw new QueryException(701,
+                    "JSON-LD group has no @type attribute");
 
         String type = json.get("@type").asText();
-        
+
         // Single filter
         if (type.equals("koral:doc")) {
 
-            String key     = "tokens";
+            String key = "tokens";
             String valtype = "type:string";
-            String match   = "match:eq";
+            String match = "match:eq";
 
             if (json.has("key"))
                 key = json.get("key").asText();
-            
+
             if (json.has("type"))
                 valtype = json.get("type").asText();
 
@@ -204,15 +206,15 @@
 
                 // TODO: This isn't stable yet
                 switch (match) {
-                case "match:eq":
-                    bfilter.date(dateStr);
-                    break;
-                case "match:geq":
-                    bfilter.since(dateStr);
-                    break;
-                case "match:leq":
-                    bfilter.till(dateStr);
-                    break;
+                    case "match:eq":
+                        bfilter.date(dateStr);
+                        break;
+                    case "match:geq":
+                        bfilter.since(dateStr);
+                        break;
+                    case "match:leq":
+                        bfilter.till(dateStr);
+                        break;
                 };
                 // No good reason for gt or lt
                 return bfilter;
@@ -248,15 +250,18 @@
                     group.or(this._fromJson(operand, field));
 
                 else
-                    throw new QueryException(613, "Unknown document group operation");
+                    throw new QueryException(613,
+                            "Unknown document group operation");
             };
             bfilter.and(group);
             return bfilter;
         }
 
         // Unknown type
-        else throw new QueryException(613, "Collection query type has to be doc or docGroup");
-        
+        else
+            throw new QueryException(613,
+                    "Collection query type has to be doc or docGroup");
+
         return new BooleanFilter();
     };
 
@@ -264,15 +269,18 @@
     /**
      * Import the "collections" part of a KoralQuery.
      * This method is deprecated and will vanish in future versions.
-     *
-     * @param jsonString The "collections" part of a KoralQuery.
+     * 
+     * @param jsonString
+     *            The "collections" part of a KoralQuery.
      * @throws QueryException
      */
     @Deprecated
-    public KrillCollection fromJsonLegacy (String jsonString) throws QueryException {
+    public KrillCollection fromJsonLegacy (String jsonString)
+            throws QueryException {
         ObjectMapper mapper = new ObjectMapper();
         try {
-            this.fromJsonLegacy((JsonNode) mapper.readValue(jsonString, JsonNode.class));
+            this.fromJsonLegacy((JsonNode) mapper.readValue(jsonString,
+                    JsonNode.class));
         }
         catch (Exception e) {
             this.addError(621, "Unable to parse JSON", "KrillCollection");
@@ -284,15 +292,17 @@
     /**
      * Import the "collections" part of a KoralQuery.
      * This method is deprecated and will vanish in future versions.
-     *
-     * @param json The "collections" part of a KoralQuery
-     *        as a {@link JsonNode} object.
+     * 
+     * @param json
+     *            The "collections" part of a KoralQuery
+     *            as a {@link JsonNode} object.
      * @throws QueryException
      */
     @Deprecated
     public KrillCollection fromJsonLegacy (JsonNode json) throws QueryException {
         if (!json.has("@type"))
-            throw new QueryException(701, "JSON-LD group has no @type attribute");
+            throw new QueryException(701,
+                    "JSON-LD group has no @type attribute");
 
         if (!json.has("@value"))
             throw new QueryException(851, "Legacy filter need @value fields");
@@ -306,7 +316,7 @@
                 log.trace("Add Filter LEGACY");
             this.filter(bf);
         }
-        
+
         // Extend the collection
         else if (type.equals("koral:meta-extend")) {
             if (DEBUG)
@@ -321,15 +331,17 @@
     // Create a boolean filter from a Json string
     @Deprecated
     private BooleanFilter _fromJsonLegacy (JsonNode json, String field)
-        throws QueryException {
+            throws QueryException {
         BooleanFilter bfilter = new BooleanFilter();
 
         if (!json.has("@type"))
-            throw new QueryException(612, "JSON-LD group has no @type attribute");
-	
+            throw new QueryException(612,
+                    "JSON-LD group has no @type attribute");
+
         String type = json.get("@type").asText();
-        
-        if (DEBUG) log.trace("@type: " + type);
+
+        if (DEBUG)
+            log.trace("@type: " + type);
 
         if (json.has("@field"))
             field = _getFieldLegacy(json);
@@ -353,62 +365,67 @@
                 throw new QueryException(612, "Group needs operand list");
 
             if (DEBUG)
-                log.trace("relation found {}",  json.get("relation").asText());
+                log.trace("relation found {}", json.get("relation").asText());
 
             BooleanFilter group = new BooleanFilter();
-	    
-            switch (json.get("relation").asText())  {
-            case "between":
-                dateStr = _getDateLegacy(json, 0);
-                till = _getDateLegacy(json, 1);
-                if (dateStr != null && till != null)
-                    bfilter.between(dateStr, till);
-                break;
 
-            case "until":
-                dateStr = _getDateLegacy(json, 0);
-                if (dateStr != null)
-                    bfilter.till(dateStr);
-                break;
+            switch (json.get("relation").asText()) {
+                case "between":
+                    dateStr = _getDateLegacy(json, 0);
+                    till = _getDateLegacy(json, 1);
+                    if (dateStr != null && till != null)
+                        bfilter.between(dateStr, till);
+                    break;
 
-            case "since":
-                dateStr = _getDateLegacy(json, 0);
-                if (dateStr != null)
-                    bfilter.since(dateStr);
-                break;
+                case "until":
+                    dateStr = _getDateLegacy(json, 0);
+                    if (dateStr != null)
+                        bfilter.till(dateStr);
+                    break;
 
-            case "equals":
-                dateStr = _getDateLegacy(json, 0);
-                if (dateStr != null)
-                    bfilter.date(dateStr);
-                break;
+                case "since":
+                    dateStr = _getDateLegacy(json, 0);
+                    if (dateStr != null)
+                        bfilter.since(dateStr);
+                    break;
 
-            case "and":
-                if (operands.size() < 1)
-                    throw new QueryException(612, "Operation needs at least two operands");
+                case "equals":
+                    dateStr = _getDateLegacy(json, 0);
+                    if (dateStr != null)
+                        bfilter.date(dateStr);
+                    break;
 
-                for (JsonNode operand : operands) {
-                    group.and(this._fromJsonLegacy(operand, field));
-                };
-                bfilter.and(group);
-                break;
+                case "and":
+                    if (operands.size() < 1)
+                        throw new QueryException(612,
+                                "Operation needs at least two operands");
 
-            case "or":
-                if (operands.size() < 1)
-                    throw new QueryException(612, "Operation needs at least two operands");
+                    for (JsonNode operand : operands) {
+                        group.and(this._fromJsonLegacy(operand, field));
+                    }
+                    ;
+                    bfilter.and(group);
+                    break;
 
-                for (JsonNode operand : operands) {
-                    group.or(this._fromJsonLegacy(operand, field));
-                };
-                bfilter.and(group);
-                break;
+                case "or":
+                    if (operands.size() < 1)
+                        throw new QueryException(612,
+                                "Operation needs at least two operands");
 
-            default:
-                throw new QueryException(613, "Relation is not supported");
+                    for (JsonNode operand : operands) {
+                        group.or(this._fromJsonLegacy(operand, field));
+                    }
+                    ;
+                    bfilter.and(group);
+                    break;
+
+                default:
+                    throw new QueryException(613, "Relation is not supported");
             };
         }
         else {
-            throw new QueryException(613, "Filter type is not a supported group");
+            throw new QueryException(613,
+                    "Filter type is not a supported group");
         };
         return bfilter;
     };
@@ -416,8 +433,10 @@
 
     /**
      * Set the {@link KrillIndex} the virtual collection refers to.
-     *
-     * @param index The {@link KrillIndex} the virtual collection refers to.
+     * 
+     * @param index
+     *            The {@link KrillIndex} the virtual collection refers
+     *            to.
      */
     public void setIndex (KrillIndex index) {
         this.index = index;
@@ -426,18 +445,19 @@
 
     /**
      * Add a filter by means of a {@link BooleanFilter}.
-     *
+     * 
      * <strong>Warning</strong>: Filters are part of the collections
      * legacy API and may vanish without warning.
-     *
-     * @param filter The filter to add to the collection.
+     * 
+     * @param filter
+     *            The filter to add to the collection.
      * @return The {@link KrillCollection} object for chaining.
      */
     // TODO: The checks may not be necessary
     public KrillCollection filter (BooleanFilter filter) {
         if (DEBUG)
             log.trace("Added filter: {}", filter.toString());
-        
+
         if (filter == null) {
             this.addWarning(830, "Filter was empty");
             return this;
@@ -461,11 +481,12 @@
 
     /**
      * Add a filter by means of a {@link CollectionBuilder} object.
-     *
+     * 
      * <strong>Warning</strong>: Filters are part of the collections
      * legacy API and may vanish without warning.
-     *
-     * @param filter The filter to add to the collection.
+     * 
+     * @param filter
+     *            The filter to add to the collection.
      * @return The {@link KrillCollection} object for chaining.
      */
     public KrillCollection filter (CollectionBuilder filter) {
@@ -475,35 +496,36 @@
 
     /**
      * Add an extension by means of a {@link BooleanFilter}.
-     *
-     * <strong>Warning</strong>: Extensions are part of the collections
+     * 
+     * <strong>Warning</strong>: Extensions are part of the
+     * collections
      * legacy API and may vanish without warning.
-     *
-     * @param extension The extension to add to the collection.
+     * 
+     * @param extension
+     *            The extension to add to the collection.
      * @return The {@link KrillCollection} object for chaining.
      */
     public KrillCollection extend (BooleanFilter extension) {
         if (DEBUG)
             log.trace("Added extension: {}", extension.toString());
 
-        this.filter.add(
-            new FilterOperation(
-                (Filter) new QueryWrapperFilter(extension.toQuery()),
-                true
-            )
-        );
+        this.filter.add(new FilterOperation((Filter) new QueryWrapperFilter(
+                extension.toQuery()), true));
         this.filterCount++;
         return this;
     };
 
 
     /**
-     * Add an extension by means of a {@link CollectionBuilder} object.
-     *
-     * <strong>Warning</strong>: Extensions are part of the collections
+     * Add an extension by means of a {@link CollectionBuilder}
+     * object.
+     * 
+     * <strong>Warning</strong>: Extensions are part of the
+     * collections
      * legacy API and may vanish without warning.
-     *
-     * @param extension The extension to add to the collection.
+     * 
+     * @param extension
+     *            The extension to add to the collection.
      * @return The {@link KrillCollection} object for chaining.
      */
     public KrillCollection extend (CollectionBuilder extension) {
@@ -514,10 +536,11 @@
     /**
      * Add a filter based on a list of unique document identifiers.
      * UIDs may be indexed in the field "UID".
-     *
+     * 
      * This filter is not part of the legacy API!
-     *
-     * @param uids The list of unique document identifier.
+     * 
+     * @param uids
+     *            The list of unique document identifier.
      * @return The {@link KrillCollection} object for chaining.
      */
     public KrillCollection filterUIDs (String ... uids) {
@@ -531,10 +554,10 @@
 
     /**
      * Get the list of filters constructing the collection.
-     *
+     * 
      * <strong>Warning</strong>: This is part of the collections
      * legacy API and may vanish without warning.
-     *
+     * 
      * @return The list of filters.
      */
     public List<FilterOperation> getFilters () {
@@ -545,12 +568,15 @@
     /**
      * Get a certain {@link FilterOperation} from the list of filters
      * constructing the collection by its numerical index.
-     *
+     * 
      * <strong>Warning</strong>: This is part of the collections
      * legacy API and may vanish without warning.
-     *
-     * @param index The index position of the requested {@link FilterOperation}.
-     * @return The {@link FilterOperation} at the certain list position.
+     * 
+     * @param index
+     *            The index position of the requested
+     *            {@link FilterOperation}.
+     * @return The {@link FilterOperation} at the certain list
+     *         position.
      */
     public FilterOperation getFilter (int index) {
         return this.filter.get(index);
@@ -558,24 +584,27 @@
 
 
     /**
-     * Get the number of filter operations constructing this collection.
-     *
+     * Get the number of filter operations constructing this
+     * collection.
+     * 
      * <strong>Warning</strong>: This is part of the collections
      * legacy API and may vanish without warning.
-     *
-     * @return The number of filter operations constructing this collection.
+     * 
+     * @return The number of filter operations constructing this
+     *         collection.
      */
-    public int getCount() {
+    public int getCount () {
         return this.filterCount;
     };
 
 
     /**
      * Generate a string representatio of the virtual collection.
-     *
-     * <strong>Warning</strong>: This currently does not generate a valid
+     * 
+     * <strong>Warning</strong>: This currently does not generate a
+     * valid
      * KoralQuery string, so this may change in a future version.
-     *
+     * 
      * @return A string representation of the virtual collection.
      */
     public String toString () {
@@ -592,69 +621,68 @@
      * This is mostly used for testing purposes
      * and <strong>is not recommended</strong>
      * as a common search API.
-     *
+     * 
      * Please use {@link KrillQuery#run} instead.
-     *
-     * @param query a {@link SpanQuery} to apply on the
-     *        virtual collection.
+     * 
+     * @param query
+     *            a {@link SpanQuery} to apply on the
+     *            virtual collection.
      * @return A {@link Result} object representing the search's
      *         result.
      */
     public Result search (SpanQuery query) {
-        return this.index.search(
-            this,
-            query,
-            0,
-            (short) 20,
-            true, (short) 5,
-            true, (short) 5
-        );
+        return this.index.search(this, query, 0, (short) 20, true, (short) 5,
+                true, (short) 5);
     };
 
 
     /**
      * Create a bit vector representing the live documents of the
      * virtual collection to be used in searches.
-     *
-     * @param The {@link AtomicReaderContext} to search in.
+     * 
+     * @param The
+     *            {@link AtomicReaderContext} to search in.
      * @return A bit vector representing the live documents of the
      *         virtual collection.
      * @throws IOException
      */
-    public FixedBitSet bits (AtomicReaderContext atomic) throws IOException  {
+    public FixedBitSet bits (AtomicReaderContext atomic) throws IOException {
         // TODO: Probably use Bits.MatchAllBits(int len)
         boolean noDoc = true;
         FixedBitSet bitset;
-        
+
         // There are filters set
         if (this.filterCount > 0) {
             bitset = new FixedBitSet(atomic.reader().maxDoc());
 
-            ArrayList<FilterOperation> filters =
-                (ArrayList<FilterOperation>) this.filter.clone();
+            ArrayList<FilterOperation> filters = (ArrayList<FilterOperation>) this.filter
+                    .clone();
 
             FilterOperation kcInit = filters.remove(0);
             if (DEBUG)
                 log.trace("FILTER: {}", kcInit);
-            
+
             // Init vector
             DocIdSet docids = kcInit.filter.getDocIdSet(atomic, null);
 
             DocIdSetIterator filterIter = docids.iterator();
-            
+
             // The filter has an effect
             if (filterIter != null) {
-                if (DEBUG) log.trace("InitFilter has effect");
+                if (DEBUG)
+                    log.trace("InitFilter has effect");
                 bitset.or(filterIter);
                 noDoc = false;
             };
-            
+
             // Apply all filters sequentially
             for (FilterOperation kc : filters) {
-                if (DEBUG) log.trace("FILTER: {}", kc);
+                if (DEBUG)
+                    log.trace("FILTER: {}", kc);
 
                 // TODO: BUG???
-                docids = kc.filter.getDocIdSet(atomic, kc.isExtension() ? null : bitset);
+                docids = kc.filter.getDocIdSet(atomic, kc.isExtension() ? null
+                        : bitset);
                 filterIter = docids.iterator();
 
                 if (filterIter == null) {
@@ -674,7 +702,8 @@
             };
 
             if (!noDoc) {
-                FixedBitSet livedocs = (FixedBitSet) atomic.reader().getLiveDocs();
+                FixedBitSet livedocs = (FixedBitSet) atomic.reader()
+                        .getLiveDocs();
                 if (livedocs != null)
                     bitset.and(livedocs);
             };
@@ -691,11 +720,14 @@
      * Search for the number of occurrences of different types,
      * e.g. <i>documents</i>, <i>sentences</i> etc. in the virtual
      * collection.
-     *
-     * @param field The field containing the textual data and the
-     *        annotations as a string.
-     * @param type The type of meta information,
-     *        e.g. <i>documents</i> or <i>sentences</i> as a string.
+     * 
+     * @param field
+     *            The field containing the textual data and the
+     *            annotations as a string.
+     * @param type
+     *            The type of meta information,
+     *            e.g. <i>documents</i> or <i>sentences</i> as a
+     *            string.
      * @return The number of the occurrences.
      * @throws IOException
      * @see KrillIndex#numberOf
@@ -712,9 +744,11 @@
      * Search for the number of occurrences of different types,
      * e.g. <i>documents</i>, <i>sentences</i> etc. in the virtual
      * collection, in the <i>base</i> foundry.
-     *
-     * @param type The type of meta information,
-     *        e.g. <i>documents</i> or <i>sentences</i> as a string.
+     * 
+     * @param type
+     *            The type of meta information,
+     *            e.g. <i>documents</i> or <i>sentences</i> as a
+     *            string.
      * @return The number of the occurrences.
      * @throws IOException
      * @see KrillIndex#numberOf
@@ -731,7 +765,7 @@
     @Deprecated
     public HashMap getTermRelation (String field) throws Exception {
         if (this.index == null) {
-            HashMap<String,Long> map = new HashMap<>(1);
+            HashMap<String, Long> map = new HashMap<>(1);
             map.put("-docs", (long) 0);
             return map;
         };
@@ -746,26 +780,26 @@
         ObjectMapper mapper = new ObjectMapper();
         StringWriter sw = new StringWriter();
         sw.append("{\"field\":");
-        mapper.writeValue(sw,field);
+        mapper.writeValue(sw, field);
         sw.append(",");
 
         try {
             HashMap<String, Long> map = this.getTermRelation(field);
 
             sw.append("\"documents\":");
-            mapper.writeValue(sw,map.remove("-docs"));
+            mapper.writeValue(sw, map.remove("-docs"));
             sw.append(",");
 
             String[] keys = map.keySet().toArray(new String[map.size()]);
 
-            HashMap<String,Integer> setHash = new HashMap<>(20);
-            ArrayList<HashMap<String,Long>> set = new ArrayList<>(20);
+            HashMap<String, Integer> setHash = new HashMap<>(20);
+            ArrayList<HashMap<String, Long>> set = new ArrayList<>(20);
             ArrayList<Long[]> overlap = new ArrayList<>(100);
-	    
+
             int count = 0;
             for (String key : keys) {
                 if (!key.startsWith("#__")) {
-                    HashMap<String,Long> simpleMap = new HashMap<>();
+                    HashMap<String, Long> simpleMap = new HashMap<>();
                     simpleMap.put(key, map.remove(key));
                     set.add(simpleMap);
                     setHash.put(key, count++);
@@ -790,7 +824,7 @@
         }
         catch (Exception e) {
             sw.append("\"error\":");
-            mapper.writeValue(sw,e.getMessage());
+            mapper.writeValue(sw, e.getMessage());
         };
 
         sw.append("}");
@@ -800,7 +834,7 @@
 
     // Get legacy field
     @Deprecated
-    private static String  _getFieldLegacy (JsonNode json)  {
+    private static String _getFieldLegacy (JsonNode json) {
         if (!json.has("@field"))
             return (String) null;
 
@@ -825,7 +859,7 @@
 
         if (!date.get("@type").asText().equals("koral:date"))
             return (String) null;
-        
+
         if (!date.has("@value"))
             return (String) null;
 
diff --git a/src/main/java/de/ids_mannheim/korap/KrillIndex.java b/src/main/java/de/ids_mannheim/korap/KrillIndex.java
index d77b481..a425f36 100644
--- a/src/main/java/de/ids_mannheim/korap/KrillIndex.java
+++ b/src/main/java/de/ids_mannheim/korap/KrillIndex.java
@@ -38,29 +38,32 @@
 import java.nio.ByteBuffer;
 
 /**
- * <p>KrillIndex implements a simple API for searching in and writing to a
- * Lucene index and requesting several information about the index' nature.
- * Please consult {@link Krill} for the preferred use of this class.</p>
- *
+ * <p>KrillIndex implements a simple API for searching in and writing
+ * to a
+ * Lucene index and requesting several information about the index'
+ * nature.
+ * Please consult {@link Krill} for the preferred use of this
+ * class.</p>
+ * 
  * <blockquote><pre>
- *   // Create new file backed index
- *   KrillIndex ki = new KrillIndex(
- *       new MMapDirectory(new File("/myindex"))
- *   );
- *
- *   // Add documents to the index
- *   ki.addDoc(1, "{\"ID\":\"WPD-001\", ... }");
- *   ki.addDoc(2, "{\"ID\":\"WPD-002\", ... }");
- *
- *   // Apply Krill searches on the index
- *   String koral = "{\"@type\":"koral:group", ... }";
- *   Result result = new Krill(koral).apply(ki);
+ * // Create new file backed index
+ * KrillIndex ki = new KrillIndex(
+ * new MMapDirectory(new File("/myindex"))
+ * );
+ * 
+ * // Add documents to the index
+ * ki.addDoc(1, "{\"ID\":\"WPD-001\", ... }");
+ * ki.addDoc(2, "{\"ID\":\"WPD-002\", ... }");
+ * 
+ * // Apply Krill searches on the index
+ * String koral = "{\"@type\":"koral:group", ... }";
+ * Result result = new Krill(koral).apply(ki);
  * </pre></blockquote>
- *
+ * 
  * <p>Properties can be stored in a properies file called
  * <tt>krill.properties</tt>. Relevant properties are
  * <tt>krill.version</tt> and <tt>krill.name</tt>.</p>
- *
+ * 
  * @author diewald
  */
 /*
@@ -133,10 +136,9 @@
     private ObjectMapper mapper = new ObjectMapper();
 
     private byte[] pl = new byte[4];
-    private static ByteBuffer
-        bb       = ByteBuffer.allocate(4),
-        bbOffset = ByteBuffer.allocate(8),
-        bbTerm   = ByteBuffer.allocate(16);
+    private static ByteBuffer bb = ByteBuffer.allocate(4),
+            bbOffset = ByteBuffer.allocate(8),
+            bbTerm = ByteBuffer.allocate(16);
 
     // Some initializations ...
     // TODO: This should probably happen at a more central point
@@ -151,8 +153,8 @@
             try {
                 InputStream fr = new FileInputStream(f);
                 prop.load(fr);
-                this.version    = prop.getProperty("krill.version");
-                this.name       = prop.getProperty("krill.name");
+                this.version = prop.getProperty("krill.version");
+                this.name = prop.getProperty("krill.name");
 
                 // Check for auto commit value
                 String stringProp = prop.getProperty("krill.index.commit.auto");
@@ -188,7 +190,7 @@
     /**
      * Constructs a new KrillIndex.
      * This will be in-memory.
-     *
+     * 
      * @throws IOException
      */
     public KrillIndex () throws IOException {
@@ -198,8 +200,9 @@
 
     /**
      * Constructs a new KrillIndex bound to a persistant index.
-     *
-     * @param directory A {@link Directory} pointing to an index
+     * 
+     * @param directory
+     *            A {@link Directory} pointing to an index
      * @throws IOException
      */
     public KrillIndex (Directory directory) throws IOException {
@@ -207,13 +210,13 @@
 
         // Add analyzers
         // TODO: Should probably not be here
-        Map<String,Analyzer> analyzerPerField = new HashMap<String,Analyzer>();
-        analyzerPerField.put("textClass", new WhitespaceAnalyzer(Version.LUCENE_CURRENT));
-        analyzerPerField.put("foundries", new WhitespaceAnalyzer(Version.LUCENE_CURRENT));
+        Map<String, Analyzer> analyzerPerField = new HashMap<String, Analyzer>();
+        analyzerPerField.put("textClass", new WhitespaceAnalyzer(
+                Version.LUCENE_CURRENT));
+        analyzerPerField.put("foundries", new WhitespaceAnalyzer(
+                Version.LUCENE_CURRENT));
         PerFieldAnalyzerWrapper analyzer = new PerFieldAnalyzerWrapper(
-            new StandardAnalyzer(Version.LUCENE_CURRENT),
-            analyzerPerField
-        );
+                new StandardAnalyzer(Version.LUCENE_CURRENT), analyzerPerField);
 
         // Create configuration with base analyzer
         this.config = new IndexWriterConfig(Version.LUCENE_CURRENT, analyzer);
@@ -222,9 +225,9 @@
 
     /**
      * Get the version number of the index.
-     *
+     * 
      * @return A string containing the version number.
-     */    
+     */
     public String getVersion () {
         return this.version;
     };
@@ -232,9 +235,9 @@
 
     /**
      * Get the name of the index.
-     *
+     * 
      * @return A string containing the name of the index.
-     */ 
+     */
     public String getName () {
         return this.name;
     };
@@ -242,24 +245,24 @@
 
     /**
      * The Lucene {@link IndexReader} object.
-     *
+     * 
      * Will be opened, in case it's closed.
-     *
+     * 
      * @return The {@link IndexReader} object.
      */
     public IndexReader reader () {
         // Todo: Maybe use DirectoryReader.openIfChanged(DirectoryReader)
         if (!readerOpen)
-            this.openReader();        
+            this.openReader();
         return this.reader;
     };
 
 
     /**
      * The Lucene {@link IndexWriter} object.
-     *
+     * 
      * Will be created, in case it doesn't exist yet.
-     *
+     * 
      * @return The {@link IndexWriter} object.
      * @throws IOException
      */
@@ -273,9 +276,9 @@
 
     /**
      * The Lucene {@link IndexSearcher} object.
-     *
+     * 
      * Will be created, in case it doesn't exist yet.
-     *
+     * 
      * @return The {@link IndexSearcher} object.
      */
     public IndexSearcher searcher () {
@@ -298,7 +301,7 @@
         // Failed to open reader
         catch (IOException e) {
             // e.printStackTrace();
-            log.warn( e.getLocalizedMessage() );
+            log.warn(e.getLocalizedMessage());
         };
     };
 
@@ -320,12 +323,12 @@
 
 
     /**
-     * Close the associated {@link IndexReader}
-     * and the associated {@link IndexWriter},
+     * Close the associated {@link IndexReader} and the associated
+     * {@link IndexWriter},
      * in case they are opened.
-     *
+     * 
      * @throws IOException
-     */ 
+     */
     public void close () throws IOException {
         this.closeReader();
         this.closeWriter();
@@ -335,9 +338,10 @@
     /**
      * Commit staged data to the index,
      * if the commit counter indicates there is staged data.
-     *
-     * @param force Force the commit,
-     *        even if there is no staged data.
+     * 
+     * @param force
+     *            Force the commit,
+     *            even if there is no staged data.
      * @throws IOException
      */
     public void commit (boolean force) throws IOException {
@@ -349,7 +353,7 @@
 
     /**
      * Commit staged data to the index.
-     *
+     * 
      * @throws IOException
      */
     public void commit () throws IOException {
@@ -361,7 +365,7 @@
 
     /**
      * Get autocommit value.
-     *
+     * 
      * @return The autocommit value.
      */
     public int getAutoCommit () {
@@ -371,8 +375,9 @@
 
     /**
      * Set the autocommit value.
-     *
-     * @param value The autocommit value.
+     * 
+     * @param value
+     *            The autocommit value.
      */
     public void setAutoCommit (int value) {
         this.autoCommit = value;
@@ -381,8 +386,9 @@
 
     /**
      * Add a document to the index as a {@link FieldDocument}.
-     *
-     * @param doc The {@link FieldDocument} to add to the index.
+     * 
+     * @param doc
+     *            The {@link FieldDocument} to add to the index.
      * @return The {@link FieldDocument}, which means, the same
      *         object, that was passed to the method.
      */
@@ -393,7 +399,7 @@
         try {
 
             // Add document to writer
-            this.writer().addDocument( doc.doc );
+            this.writer().addDocument(doc.doc);
             if (++commitCounter > autoCommit) {
                 this.commit();
                 commitCounter = 0;
@@ -411,8 +417,9 @@
 
     /**
      * Add a document to the index as a JSON string.
-     *
-     * @param json The document to add to the index as a string.
+     * 
+     * @param json
+     *            The document to add to the index as a string.
      * @return The created {@link FieldDocument}.
      * @throws IOException
      */
@@ -425,9 +432,11 @@
      * Add a document to the index as a JSON string
      * with a unique integer ID (unique throughout the index
      * or even throughout the cluster of indices).
-     *
-     * @param uid The unique document identifier.
-     * @param json The document to add to the index as a string.
+     * 
+     * @param uid
+     *            The unique document identifier.
+     * @param json
+     *            The document to add to the index as a string.
      * @return The created {@link FieldDocument}.
      * @throws IOException
      */
@@ -443,9 +452,10 @@
 
     /**
      * Add a document to the index as a JSON string.
-     *
-     * @param json The document to add to the index as
-     *        an {@link InputStream}.
+     * 
+     * @param json
+     *            The document to add to the index as
+     *            an {@link InputStream}.
      * @return The created {@link FieldDocument}.
      * @throws IOException
      */
@@ -456,10 +466,12 @@
 
     /**
      * Add a document to the index as a JSON string.
-     *
-     * @param json The document to add to the index as
-     *        an {@link InputStream}.
-     * @param gzip Boolean value indicating if the file is gzipped.
+     * 
+     * @param json
+     *            The document to add to the index as
+     *            an {@link InputStream}.
+     * @param gzip
+     *            Boolean value indicating if the file is gzipped.
      * @return The created {@link FieldDocument}.
      * @throws IOException
      */
@@ -472,11 +484,14 @@
      * Add a document to the index as a JSON string
      * with a unique integer ID (unique throughout the index
      * or even throughout the cluster of indices).
-     *
-     * @param uid The unique document identifier.
-     * @param json The document to add to the index as
-     *        an {@link InputStream}.
-     * @param gzip Boolean value indicating if the file is gzipped.
+     * 
+     * @param uid
+     *            The unique document identifier.
+     * @param json
+     *            The document to add to the index as
+     *            an {@link InputStream}.
+     * @param gzip
+     *            Boolean value indicating if the file is gzipped.
      * @return The created {@link FieldDocument}.
      * @throws IOException
      */
@@ -509,10 +524,8 @@
             if (gzip) {
 
                 // Create json field document
-                FieldDocument fd = this.mapper.readValue(
-                    new GZIPInputStream(json),
-                    FieldDocument.class
-                );
+                FieldDocument fd = this.mapper.readValue(new GZIPInputStream(
+                        json), FieldDocument.class);
                 return fd;
             };
             return this.mapper.readValue(json, FieldDocument.class);
@@ -529,19 +542,21 @@
     /**
      * Search for the number of occurrences of different types,
      * e.g. <i>documents</i>, <i>sentences</i> etc.
-     *
-     * @param collection The scope of the numbering by means of a
-     *        {@link KrillCollection}
-     * @param field The field containing the textual data and the
-     *        annotations as a string.
-     * @param type The type of meta information,
-     *        e.g. <i>documents</i> or <i>sentences</i> as a string.
+     * 
+     * @param collection
+     *            The scope of the numbering by means of a
+     *            {@link KrillCollection}
+     * @param field
+     *            The field containing the textual data and the
+     *            annotations as a string.
+     * @param type
+     *            The type of meta information,
+     *            e.g. <i>documents</i> or <i>sentences</i> as a
+     *            string.
      * @return The number of the occurrences.
      * @see KrillCollection#numberOf
      */
-    public long numberOf (KrillCollection collection,
-                          String field,
-                          String type) {
+    public long numberOf (KrillCollection collection, String field, String type) {
         // Short cut for documents
         // This will be only "texts" in the future
         if (type.equals("documents") || type.equals("base/texts")) {
@@ -568,7 +583,7 @@
             };
             return docCount;
         };
-    
+
         // Create search term
         // This may be prefixed by foundries
         Term term = new Term(field, "-:" + type);
@@ -577,17 +592,14 @@
         try {
             // Iterate over all atomic readers and collect occurrences
             for (AtomicReaderContext atomic : this.reader().leaves()) {
-                occurrences += this._numberOfAtomic(
-                    collection.bits(atomic),
-                    atomic,
-                    term
-                );
+                occurrences += this._numberOfAtomic(collection.bits(atomic),
+                        atomic, term);
             };
         }
 
         // Something went wrong
         catch (Exception e) {
-            log.warn( e.getLocalizedMessage() );
+            log.warn(e.getLocalizedMessage());
         };
 
         return occurrences;
@@ -597,11 +609,14 @@
     /**
      * Search for the number of occurrences of different types,
      * e.g. <i>documents</i>, <i>sentences</i> etc.
-     *
-     * @param field The field containing the textual data and the
-     *        annotations as a string.
-     * @param type The type of meta information,
-     *        e.g. <i>documents</i> or <i>sentences</i> as a string.
+     * 
+     * @param field
+     *            The field containing the textual data and the
+     *            annotations as a string.
+     * @param type
+     *            The type of meta information,
+     *            e.g. <i>documents</i> or <i>sentences</i> as a
+     *            string.
      * @return The number of the occurrences.
      * @see KrillCollection#numberOf
      */
@@ -614,9 +629,11 @@
      * Search for the number of occurrences of different types,
      * e.g. <i>documents<i>, <i>sentences</i> etc., in the
      * <i>base</i> foundry.
-     *
-     * @param type The type of meta information,
-     *        e.g. <i>documents</i> or <i>sentences</i> as a string.
+     * 
+     * @param type
+     *            The type of meta information,
+     *            e.g. <i>documents</i> or <i>sentences</i> as a
+     *            string.
      * @return The number of the occurrences.
      * @see KrillCollection#numberOf
      */
@@ -628,23 +645,28 @@
     /**
      * Search for the number of occurrences of different types,
      * e.g. <i>documents</i>, <i>sentences</i> etc.
-     *
-     * @param docvec The scope of the numbering by means of a
-     *        {@link Bits} vector
-     * @param field The field containing the textual data and the
-     *        annotations as a string.
-     * @param type The type of meta information,
-     *        e.g. <i>documents</i> or <i>sentences</i> as a string.
+     * 
+     * @param docvec
+     *            The scope of the numbering by means of a
+     *            {@link Bits} vector
+     * @param field
+     *            The field containing the textual data and the
+     *            annotations as a string.
+     * @param type
+     *            The type of meta information,
+     *            e.g. <i>documents</i> or <i>sentences</i> as a
+     *            string.
      * @return The number of the occurrences.
      * @throws IOException
      */
-    public long numberOf (Bits docvec, String field, String type) throws IOException {
+    public long numberOf (Bits docvec, String field, String type)
+            throws IOException {
         // Shortcut for documents
         if (type.equals("documents")) {
             OpenBitSet os = (OpenBitSet) docvec;
             return os.cardinality();
         };
-    
+
         Term term = new Term(field, "-:" + type);
 
         int occurrences = 0;
@@ -654,21 +676,19 @@
             };
         }
         catch (IOException e) {
-            log.warn( e.getLocalizedMessage() );
+            log.warn(e.getLocalizedMessage());
         };
-        
+
         return occurrences;
     };
 
 
 
-
     // Search for meta information in term vectors
     // This will create the sum of all numerical payloads
     // of the term in the document vector
-    private long _numberOfAtomic (Bits docvec,
-                                  AtomicReaderContext atomic,
-                                  Term term) throws IOException {
+    private long _numberOfAtomic (Bits docvec, AtomicReaderContext atomic,
+            Term term) throws IOException {
 
         // This reimplements docsAndPositionsEnum with payloads
         final Terms terms = atomic.reader().fields().terms(term.field());
@@ -682,11 +702,8 @@
             if (termsEnum.seekExact(term.bytes())) {
 
                 // Start an iterator to fetch all payloads of the term
-                DocsAndPositionsEnum docs = termsEnum.docsAndPositions(
-                    docvec,
-                    null,
-                    DocsAndPositionsEnum.FLAG_PAYLOADS
-                );
+                DocsAndPositionsEnum docs = termsEnum.docsAndPositions(docvec,
+                        null, DocsAndPositionsEnum.FLAG_PAYLOADS);
 
                 // The iterator is empty
                 // This may even be an error, but we return 0
@@ -722,12 +739,6 @@
 
 
 
-
-
-
-
-
-
     public String getMatchIDWithContext (String id) {
         /* No includeHighlights */
         return "";
@@ -735,82 +746,47 @@
 
 
     public Match getMatch (String id) throws QueryException {
-        return this.getMatchInfo(
-            id,       // MatchID
-            "tokens", // field
-            false,    // info
-            (ArrayList) null,     // foundry
-            (ArrayList) null,     // layer
-            false,    // includeSpans
-            true,     // includeHighlights
-            false     // extendToSentence
-        );
+        return this.getMatchInfo(id,       // MatchID
+                "tokens", // field
+                false,    // info
+                (ArrayList) null,     // foundry
+                (ArrayList) null,     // layer
+                false,    // includeSpans
+                true,     // includeHighlights
+                false     // extendToSentence
+                );
     };
 
 
     // There is a good chance that some of these methods will die ...
-    public Match getMatchInfo (String id,
-                                    String field,
-                                    String foundry,
-                                    String layer,
-                                    boolean includeSpans,
-                                    boolean includeHighlights) throws QueryException {
-        return this.getMatchInfo(
-            id,
-            field,
-            true,
-            foundry,
-            layer,
-            includeSpans,
-            includeHighlights,
-            false
-        );
+    public Match getMatchInfo (String id, String field, String foundry,
+            String layer, boolean includeSpans, boolean includeHighlights)
+            throws QueryException {
+        return this.getMatchInfo(id, field, true, foundry, layer, includeSpans,
+                includeHighlights, false);
     };
 
 
-    public Match getMatchInfo (String id,
-                                    String field,
-                                    String foundry,
-                                    String layer,
-                                    boolean includeSpans,
-                                    boolean includeHighlights,
-                                    boolean extendToSentence) throws QueryException {
-        return this.getMatchInfo(
-            id,
-            field,
-            true,
-            foundry,
-            layer,
-            includeSpans,
-            includeHighlights,
-            extendToSentence
-        );
+    public Match getMatchInfo (String id, String field, String foundry,
+            String layer, boolean includeSpans, boolean includeHighlights,
+            boolean extendToSentence) throws QueryException {
+        return this.getMatchInfo(id, field, true, foundry, layer, includeSpans,
+                includeHighlights, extendToSentence);
     };
 
-    public Match getMatchInfo (String id,
-                               String field,
-                               boolean info,
-                               String foundry,
-                               String layer,
-                               boolean includeSpans,
-                               boolean includeHighlights,
-                               boolean extendToSentence) throws QueryException {
-    	ArrayList<String> foundryList = new ArrayList<>(1);
+
+    public Match getMatchInfo (String id, String field, boolean info,
+            String foundry, String layer, boolean includeSpans,
+            boolean includeHighlights, boolean extendToSentence)
+            throws QueryException {
+        ArrayList<String> foundryList = new ArrayList<>(1);
         if (foundry != null)
             foundryList.add(foundry);
         ArrayList<String> layerList = new ArrayList<>(1);
         if (layer != null)
             layerList.add(layer);
-        return this.getMatchInfo(
-            id,
-            field,
-            info,
-            foundryList,
-            layerList,
-            includeSpans,
-            includeHighlights,
-            extendToSentence
-        );
+        return this.getMatchInfo(id, field, info, foundryList, layerList,
+                includeSpans, includeHighlights, extendToSentence);
     };
 
 
@@ -821,14 +797,10 @@
       KorapInfo is associated with a Match and has an array with all informations
       per position in the match.
     */
-    public Match getMatchInfo (String idString,
-                               String field,
-                               boolean info,
-                               List<String> foundry,
-                               List<String> layer,
-                               boolean includeSpans,
-                               boolean includeHighlights,
-                               boolean extendToSentence) throws QueryException {
+    public Match getMatchInfo (String idString, String field, boolean info,
+            List<String> foundry, List<String> layer, boolean includeSpans,
+            boolean includeHighlights, boolean extendToSentence)
+            throws QueryException {
 
         Match match = new Match(idString, includeHighlights);
 
@@ -843,12 +815,14 @@
 
         // Create a filter based on the corpusID and the docID
         BooleanQuery bool = new BooleanQuery();
-        bool.add(new TermQuery(new Term("ID",       match.getDocID())),    BooleanClause.Occur.MUST);
-        bool.add(new TermQuery(new Term("corpusID", match.getCorpusID())), BooleanClause.Occur.MUST);
+        bool.add(new TermQuery(new Term("ID", match.getDocID())),
+                BooleanClause.Occur.MUST);
+        bool.add(new TermQuery(new Term("corpusID", match.getCorpusID())),
+                BooleanClause.Occur.MUST);
         Filter filter = (Filter) new QueryWrapperFilter(bool);
-        
+
         CompiledAutomaton fst = null;
-        
+
         if (info) {
             /* Create an automaton for prefixed terms of interest.
              * You can define the necessary foundry, the necessary layer,
@@ -858,20 +832,21 @@
             StringBuilder regex = new StringBuilder();
             // TODO: Make these static
             Pattern harmlessFoundry = Pattern.compile("^[-a-zA-Z0-9_]+$");
-            Pattern harmlessLayer   = Pattern.compile("^[-a-zA-Z0-9_:]+$");
+            Pattern harmlessLayer = Pattern.compile("^[-a-zA-Z0-9_:]+$");
             Iterator<String> iter;
             int i = 0;
-	    
+
             if (includeSpans)
                 regex.append("((\">\"|\"<\"\">\")\":\")?");
-            
+
             // There is a foundry given
             if (foundry != null && foundry.size() > 0) {
 
                 // Filter out bad foundries
-                for (i = foundry.size() - 1; i >= 0 ; i--) {
+                for (i = foundry.size() - 1; i >= 0; i--) {
                     if (!harmlessFoundry.matcher(foundry.get(i)).matches()) {
-                        throw new QueryException("Invalid foundry requested: '" + foundry.get(i) + "'");
+                        throw new QueryException("Invalid foundry requested: '"
+                                + foundry.get(i) + "'");
                         // foundry.remove(i);
                     };
                 };
@@ -890,9 +865,11 @@
                     if (layer != null && layer.size() > 0) {
 
                         // Filter out bad layers
-                        for (i = layer.size() - 1; i >= 0 ; i--) {
+                        for (i = layer.size() - 1; i >= 0; i--) {
                             if (!harmlessLayer.matcher(layer.get(i)).matches()) {
-                                throw new QueryException("Invalid layer requested: " + layer.get(i));
+                                throw new QueryException(
+                                        "Invalid layer requested: "
+                                                + layer.get(i));
                                 // layer.remove(i);
                             };
                         };
@@ -904,7 +881,8 @@
                             while (iter.hasNext()) {
                                 regex.append(iter.next()).append("|");
                             };
-                            regex.replace(regex.length() - 1, regex.length(), ")");
+                            regex.replace(regex.length() - 1, regex.length(),
+                                    ")");
                             regex.append("\":\"");
                         };
                     };
@@ -919,7 +897,7 @@
                 regex.append("([^-is<>]|[-is>][^:]|<[^:>])");
             };
             regex.append("(.){1,}|_[0-9]+");
-            
+
             if (DEBUG)
                 log.trace("The final regexString is {}", regex.toString());
             RegExp regexObj = new RegExp(regex.toString(), RegExp.COMPLEMENT);
@@ -933,10 +911,8 @@
             for (AtomicReaderContext atomic : this.reader().leaves()) {
 
                 // Retrieve the single document of interest
-                DocIdSet filterSet = filter.getDocIdSet(
-                    atomic,
-                    atomic.reader().getLiveDocs()
-                );
+                DocIdSet filterSet = filter.getDocIdSet(atomic, atomic.reader()
+                        .getLiveDocs());
 
                 // Create a bitset for the correct document
                 Bits bitset = filterSet.bits();
@@ -957,12 +933,13 @@
                 if (DEBUG)
                     log.trace("We've found a matching document");
 
-                HashSet<String> fields = (HashSet<String>)
-                    new Krill().getMeta().getFields().clone();
+                HashSet<String> fields = (HashSet<String>) new Krill()
+                        .getMeta().getFields().clone();
                 fields.add(field);
 
                 // Get terms from the document
-                Terms docTerms = atomic.reader().getTermVector(localDocID, field);
+                Terms docTerms = atomic.reader().getTermVector(localDocID,
+                        field);
 
                 // Load the necessary fields of the document
                 Document doc = atomic.reader().document(localDocID, fields);
@@ -980,7 +957,7 @@
 
                 // Search for minimal surrounding sentences
                 if (extendToSentence) {
-                    int [] spanContext = match.expandContextToSpan("s");
+                    int[] spanContext = match.expandContextToSpan("s");
                     match.setStartPos(spanContext[0]);
                     match.setEndPos(spanContext[1]);
                     match.startMore = false;
@@ -990,7 +967,7 @@
                     if (DEBUG)
                         log.trace("Don't expand context");
                 };
-                
+
                 context.left.setToken(true).setLength(0);
                 context.right.setToken(true).setLength(0);
 
@@ -1004,19 +981,16 @@
 
                 // List of terms to populate
                 SpanInfo termList = new SpanInfo(pto, localDocID);
-        
+
                 // Iterate over all terms in the document
                 while (termsEnum.next() != null) {
-                    
+
                     // Get the positions and payloads of the term in the document
                     // The bitvector may look different (don't know why)
                     // and so the local ID may differ.
                     // That's why the requesting bitset is null.
-                    docs = termsEnum.docsAndPositions(
-                        null,
-                        docs,
-                        DocsAndPositionsEnum.FLAG_PAYLOADS
-                    );
+                    docs = termsEnum.docsAndPositions(null, docs,
+                            DocsAndPositionsEnum.FLAG_PAYLOADS);
 
                     // Init document iterator
                     docs.nextDoc();
@@ -1027,7 +1001,7 @@
 
                     // How often does this term occur in the document?
                     int termOccurrences = docs.freq();
-                    
+
                     // String representation of the term
                     String termString = termsEnum.term().utf8ToString();
 
@@ -1038,29 +1012,23 @@
                         int pos = docs.nextPosition();
 
                         // Check, if the position of the term is in the area of interest
-                        if (pos >= match.getStartPos() && pos < match.getEndPos()) {
+                        if (pos >= match.getStartPos()
+                                && pos < match.getEndPos()) {
 
                             if (DEBUG)
-                                log.trace(
-                                    ">> {}: {}-{}-{}",
-                                    termString, 
-                                    docs.freq(),
-                                    pos,
-                                    docs.getPayload()
-                                );
+                                log.trace(">> {}: {}-{}-{}", termString,
+                                        docs.freq(), pos, docs.getPayload());
 
                             BytesRef payload = docs.getPayload();
 
                             // Copy the payload
                             bbTerm.clear();
                             if (payload != null) {
-                                bbTerm.put(
-                                    payload.bytes,
-                                    payload.offset,
-                                    payload.length
-                                );
+                                bbTerm.put(payload.bytes, payload.offset,
+                                        payload.length);
                             };
-                            TermInfo ti = new TermInfo(termString, pos, bbTerm).analyze();
+                            TermInfo ti = new TermInfo(termString, pos, bbTerm)
+                                    .analyze();
                             if (ti.getEndPos() < match.getEndPos()) {
                                 if (DEBUG)
                                     log.trace("Add {}", ti.toString());
@@ -1073,23 +1041,19 @@
                 // Add annotations based on the retrieved infos
                 for (TermInfo t : termList.getTerms()) {
                     if (DEBUG)
-                        log.trace(
-                            "Add term {}/{}:{} to {}({})-{}({})",
-                            t.getFoundry(),
-                            t.getLayer(),
-                            t.getValue(),
-                            t.getStartChar(),
-                            t.getStartPos(),
-                            t.getEndChar(),
-                            t.getEndPos()
-                        );
+                        log.trace("Add term {}/{}:{} to {}({})-{}({})",
+                                t.getFoundry(), t.getLayer(), t.getValue(),
+                                t.getStartChar(), t.getStartPos(),
+                                t.getEndChar(), t.getEndPos());
 
                     if (t.getType() == "term" || t.getType() == "span")
-                        match.addAnnotation(t.getStartPos(), t.getEndPos(), t.getAnnotation());
+                        match.addAnnotation(t.getStartPos(), t.getEndPos(),
+                                t.getAnnotation());
                     else if (t.getType() == "relSrc")
-                        match.addRelation(t.getStartPos(), t.getEndPos(), t.getAnnotation());
+                        match.addRelation(t.getStartPos(), t.getEndPos(),
+                                t.getAnnotation());
                 };
-                
+
                 break;
             };
         }
@@ -1112,21 +1076,22 @@
      * Analyze how terms relate
      */
     @Deprecated
-    public HashMap getTermRelation (KrillCollection kc, String field) throws Exception {
-        HashMap<String,Long> map = new HashMap<>(100);
+    public HashMap getTermRelation (KrillCollection kc, String field)
+            throws Exception {
+        HashMap<String, Long> map = new HashMap<>(100);
         long docNumber = 0, checkNumber = 0;
-        
+
         try {
             if (kc.getCount() <= 0) {
                 checkNumber = (long) this.reader().numDocs();
             };
 
             for (AtomicReaderContext atomic : this.reader().leaves()) {
-                HashMap<String,FixedBitSet> termVector = new HashMap<>(20);
-        
+                HashMap<String, FixedBitSet> termVector = new HashMap<>(20);
+
                 FixedBitSet docvec = kc.bits(atomic);
                 if (docvec != null) {
-                    docNumber += docvec.cardinality();		    
+                    docNumber += docvec.cardinality();
                 };
 
                 Terms terms = atomic.reader().fields().terms(field);
@@ -1134,7 +1099,7 @@
                 if (terms == null) {
                     continue;
                 };
-		
+
                 int docLength = atomic.reader().maxDoc();
                 FixedBitSet bitset = new FixedBitSet(docLength);
 
@@ -1142,43 +1107,45 @@
                 TermsEnum termsEnum = terms.iterator(null);
 
                 while (termsEnum.next() != null) {
-                    
+
                     String termString = termsEnum.term().utf8ToString();
 
-                    bitset.clear(0,docLength);
-	    
+                    bitset.clear(0, docLength);
+
                     // Get frequency
-                    bitset.or((DocIdSetIterator) termsEnum.docs((Bits) docvec, null));
-            
+                    bitset.or((DocIdSetIterator) termsEnum.docs((Bits) docvec,
+                            null));
+
                     long value = 0;
                     if (map.containsKey(termString))
                         value = map.get(termString);
 
                     map.put(termString, value + bitset.cardinality());
-                    
+
                     termVector.put(termString, bitset.clone());
                 };
-                
+
                 int keySize = termVector.size();
-                String[] keys = termVector.keySet().toArray(new String[keySize]);
+                String[] keys = termVector.keySet()
+                        .toArray(new String[keySize]);
                 java.util.Arrays.sort(keys);
 
                 if (keySize > maxTermRelations) {
-                    throw new Exception(
-                        "termRelations are limited to " + maxTermRelations + " sets" +
-                        " (requested were at least " + keySize + " sets)"
-                    );
+                    throw new Exception("termRelations are limited to "
+                            + maxTermRelations + " sets"
+                            + " (requested were at least " + keySize + " sets)");
                 };
-                
+
                 for (int i = 0; i < keySize; i++) {
-                    for (int j = i+1; j < keySize; j++) {
+                    for (int j = i + 1; j < keySize; j++) {
                         FixedBitSet comby = termVector.get(keys[i]).clone();
                         comby.and(termVector.get(keys[j]));
 
                         StringBuilder sb = new StringBuilder();
-                        sb.append("#__").append(keys[i]).append(":###:").append(keys[j]);
+                        sb.append("#__").append(keys[i]).append(":###:")
+                                .append(keys[j]);
                         String combString = sb.toString();
-                        
+
                         long cap = (long) comby.cardinality();
                         if (map.containsKey(combString)) {
                             cap += map.get(combString);
@@ -1190,12 +1157,12 @@
             map.put("-docs", checkNumber != 0 ? checkNumber : docNumber);
         }
         catch (IOException e) {
-            log.warn(e.getMessage());	    
+            log.warn(e.getMessage());
         };
         return map;
     };
 
-    
+
     /**
      * Search in the index.
      */
@@ -1212,47 +1179,27 @@
 
 
     @Deprecated
-    public Result search (SpanQuery query,
-                               int startIndex,
-                               short count,
-                               boolean leftTokenContext,
-                               short leftContext,
-                               boolean rightTokenContext,
-                               short rightContext) {
+    public Result search (SpanQuery query, int startIndex, short count,
+            boolean leftTokenContext, short leftContext,
+            boolean rightTokenContext, short rightContext) {
 
         Krill ks = new Krill(query);
         KrillMeta meta = ks.getMeta();
         meta.setStartIndex(startIndex).setCount(count);
-        meta.setContext(
-            new SearchContext(
-                leftTokenContext,
-                leftContext,
-                rightTokenContext,
-                rightContext
-            )
-        );	
+        meta.setContext(new SearchContext(leftTokenContext, leftContext,
+                rightTokenContext, rightContext));
         return this.search(ks);
     };
 
 
     @Deprecated
-    public Result search (KrillCollection collection,
-                               SpanQuery query,
-                               int startIndex,
-                               short count,
-                               boolean leftTokenContext,
-                               short leftContext,
-                               boolean rightTokenContext,
-                               short rightContext) {
+    public Result search (KrillCollection collection, SpanQuery query,
+            int startIndex, short count, boolean leftTokenContext,
+            short leftContext, boolean rightTokenContext, short rightContext) {
         Krill ks = new Krill(query);
         ks.getMeta().setContext(
-            new SearchContext(
-                leftTokenContext,
-                leftContext,
-                rightTokenContext,
-                rightContext
-            )
-        );
+                new SearchContext(leftTokenContext, leftContext,
+                        rightTokenContext, rightContext));
         ks.setCollection(collection);
         return this.search(ks);
     };
@@ -1279,12 +1226,8 @@
         KrillMeta meta = ks.getMeta();
 
         // Todo: Make kr subclassing ks - so ks has a method for a new Result!
-        Result kr = new Result(
-            query.toString(),
-            meta.getStartIndex(),
-            meta.getCount(),
-            meta.getContext()
-        );
+        Result kr = new Result(query.toString(), meta.getStartIndex(),
+                meta.getCount(), meta.getContext());
 
         // Set version info to result
         if (this.getVersion() != null)
@@ -1295,14 +1238,11 @@
         fields.add(field);
 
         // Some initializations ...
-        int i                       = 0,
-            startIndex              = kr.getStartIndex(),
-            count                   = kr.getItemsPerPage(),
-            hits                    = kr.getItemsPerPage() + startIndex,
-            limit                   = meta.getLimit(),
-            itemsPerResourceCounter = 0;
-        boolean cutoff              = meta.doCutOff();
-        short itemsPerResource      = meta.getItemsPerResource();
+        int i = 0, startIndex = kr.getStartIndex(), count = kr
+                .getItemsPerPage(), hits = kr.getItemsPerPage() + startIndex, limit = meta
+                .getLimit(), itemsPerResourceCounter = 0;
+        boolean cutoff = meta.doCutOff();
+        short itemsPerResource = meta.getItemsPerResource();
 
         // Check if there is work to do at all
         // TODO: Deprecated
@@ -1316,9 +1256,9 @@
         };
 
         // Collect matches from atomic readers
-        ArrayList<Match> atomicMatches =
-            new ArrayList<Match>(kr.getItemsPerPage());
-        
+        ArrayList<Match> atomicMatches = new ArrayList<Match>(
+                kr.getItemsPerPage());
+
         // Start time out thread
         TimeOutThread tthread = new TimeOutThread();
         tthread.start();
@@ -1332,12 +1272,12 @@
             // Revise!
             // Based on core/src/java/org/apache/lucene/search/IndexSearcher.java
             // and highlighter/src/java/org/apache/lucene/search/postingshighlight/PostingsHighlighter.java
-            for ( Query rewrittenQuery = query.rewrite(this.reader());
-                  !rewrittenQuery.equals(query);
-                  rewrittenQuery = query.rewrite(this.reader())) {
+            for (Query rewrittenQuery = query.rewrite(this.reader()); !rewrittenQuery
+                    .equals(query); rewrittenQuery = query.rewrite(this
+                    .reader())) {
                 query = (SpanQuery) rewrittenQuery;
             };
-	    
+
 
             // Todo: run this in a separated thread
             for (AtomicReaderContext atomic : this.reader().leaves()) {
@@ -1353,16 +1293,17 @@
                 PositionsToOffset pto = new PositionsToOffset(atomic, field);
 
                 // Spans spans = NearSpansOrdered();
-                Spans spans = query.getSpans(atomic, (Bits) bitset, termContexts);
+                Spans spans = query.getSpans(atomic, (Bits) bitset,
+                        termContexts);
 
                 IndexReader lreader = atomic.reader();
-                
+
                 // TODO: Get document information from Cache! Fieldcache?
-                for (; i < hits;i++) {
+                for (; i < hits; i++) {
 
                     if (DEBUG)
                         log.trace("Match Nr {}/{}", i, count);
-                    
+
                     // There are no more spans to find
                     if (!spans.next())
                         break;
@@ -1372,7 +1313,7 @@
                         kr.setTimeExceeded(true);
                         break;
                     };
-                    
+
                     int localDocID = spans.doc();
 
                     // Count hits per resource
@@ -1390,11 +1331,11 @@
                                 };
                             };
                         }
-                        
+
                         // Reset counter
                         else
                             itemsPerResourceCounter = 0;
-                        
+
                         oldLocalDocID = localDocID;
                     };
 
@@ -1403,17 +1344,13 @@
                         continue;
 
                     int docID = atomic.docBase + localDocID;
-                    
+
                     // Do not load all of this, in case the doc is the same!
                     Document doc = lreader.document(localDocID, fields);
 
                     // Create new Match
-                    Match match = new Match(
-                        pto,
-                        localDocID,
-                        spans.start(),
-                        spans.end()
-                    );
+                    Match match = new Match(pto, localDocID, spans.start(),
+                            spans.end());
                     match.setContext(kr.getContext());
 
                     // Add match to Result
@@ -1424,16 +1361,16 @@
 
                     match.internalDocID = docID;
                     match.populateDocument(doc, field, fields);
-		    
+
                     if (DEBUG) {
                         if (match.getDocID() != null)
                             log.trace("I've got a match in {} of {}",
-                                      match.getDocID(), count);
+                                    match.getDocID(), count);
                         else
                             log.trace("I've got a match in {} of {}",
-                                      match.getUID(), count);
+                                    match.getUID(), count);
                     };
-                    
+
                     atomicMatches.add(match);
                 };
 
@@ -1443,7 +1380,7 @@
                     // TODO: Deprecated
                     if (limit > 0 && i >= limit)
                         break;
-                    
+
                     // Timeout!
                     if (tthread.getTime() > timeout) {
                         kr.setTimeExceeded(true);
@@ -1456,7 +1393,7 @@
 
                         if (localDocID == DocIdSetIterator.NO_MORE_DOCS)
                             break;
-			
+
                         // IDS are identical
                         if (localDocID == oldLocalDocID || oldLocalDocID == -1) {
                             if (localDocID == -1)
@@ -1488,12 +1425,8 @@
             kr.setTotalResults(cutoff ? (long) -1 : (long) i);
         }
         catch (IOException e) {
-            kr.addError(
-                600,
-                "Unable to read index",
-                e.getLocalizedMessage()
-            );
-            log.warn( e.getLocalizedMessage() );
+            kr.addError(600, "Unable to read index", e.getLocalizedMessage());
+            log.warn(e.getLocalizedMessage());
         };
 
         // Stop timer thread
@@ -1535,9 +1468,8 @@
         try {
 
             // Rewrite query (for regex and wildcard queries)
-            for (Query rewrittenQuery = query.rewrite(this.reader());
-                 rewrittenQuery != (Query) query;
-                 rewrittenQuery = query.rewrite(this.reader())) {
+            for (Query rewrittenQuery = query.rewrite(this.reader()); rewrittenQuery != (Query) query; rewrittenQuery = query
+                    .rewrite(this.reader())) {
                 query = (SpanQuery) rewrittenQuery;
             };
 
@@ -1555,8 +1487,9 @@
                 Bits bitset = collection.bits(atomic);
 
                 // PositionsToOffset pto = new PositionsToOffset(atomic, field);
-                
-                Spans spans = query.getSpans(atomic, (Bits) bitset, termContexts);
+
+                Spans spans = query.getSpans(atomic, (Bits) bitset,
+                        termContexts);
 
                 IndexReader lreader = atomic.reader();
 
@@ -1582,12 +1515,12 @@
                         };
 
                         // Read document id from index
-                        uniqueDocIDString =
-                            lreader.document(localDocID, fields).get("UID");
+                        uniqueDocIDString = lreader
+                                .document(localDocID, fields).get("UID");
 
                         if (uniqueDocIDString != null)
                             uniqueDocID = Integer.parseInt(uniqueDocIDString);
-                        
+
                         previousDocID = localDocID;
                     }
                     else {
@@ -1607,15 +1540,11 @@
             mc.setBenchmark(t1, System.nanoTime());
         }
         catch (IOException e) {
-            mc.addError(
-                600,
-                "Unable to read index",
-                e.getLocalizedMessage()
-            );
+            mc.addError(600, "Unable to read index", e.getLocalizedMessage());
             log.warn(e.getLocalizedMessage());
         };
 
         mc.close();
-        return mc; 
+        return mc;
     };
 };
diff --git a/src/main/java/de/ids_mannheim/korap/KrillMeta.java b/src/main/java/de/ids_mannheim/korap/KrillMeta.java
index 16b9865..b1023c2 100644
--- a/src/main/java/de/ids_mannheim/korap/KrillMeta.java
+++ b/src/main/java/de/ids_mannheim/korap/KrillMeta.java
@@ -7,7 +7,6 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.*;
 
-
 import de.ids_mannheim.korap.response.SearchContext;
 import de.ids_mannheim.korap.util.QueryException;
 import de.ids_mannheim.korap.response.Notifications;
@@ -28,7 +27,7 @@
     private SearchContext context;
 
     private HashSet<String> fields;
-            HashSet<Integer> highlights;
+    HashSet<Integer> highlights;
 
     // Timeout search after milliseconds
     private long timeout = (long) 120_000;
@@ -42,35 +41,26 @@
 
         // Lift following fields per default
         // These fields are chosen for <legacy /> reasons
-        for (String field : new String[]{
-                "ID",
-                "UID",
-                "textSigle",
-                "corpusID",
-                "author",
-                "title",
-                "subTitle",
-                "textClass",
-                "pubPlace",
-                "pubDate",
-                "foundries",
-                "layerInfo",
-                "tokenization"}) {
+        for (String field : new String[] { "ID", "UID", "textSigle",
+                "corpusID", "author", "title", "subTitle", "textClass",
+                "pubPlace", "pubDate", "foundries", "layerInfo", "tokenization" }) {
             fields.add(field);
         };
 
         // Classes used for highlights
         highlights = new HashSet<Integer>(3);
-        context  = new SearchContext();
+        context = new SearchContext();
     };
 
 
     public KrillMeta () {};
 
+
     public KrillMeta (JsonNode json) {
         this.fromJson(json);
     };
 
+
     public KrillMeta (String json) {
         try {
             this.fromJson(json);
@@ -80,6 +70,7 @@
         };
     };
 
+
     public KrillMeta fromJson (String json) throws QueryException {
         JsonNode jsonN;
         try {
@@ -149,13 +140,13 @@
             else
                 this.addHighlight(json.get("highlight").asInt());
         };
-        
+
         // Defined fields to lift from the index
         if (json.has("fields")) {
-                        
+
             // Remove default fields
             this.fields.clear();
-            
+
             // Add fields
             if (json.get("fields").isArray()) {
                 for (JsonNode field : (JsonNode) json.get("fields")) {
@@ -174,18 +165,21 @@
         return this.count;
     };
 
+
     public KrillMeta setCount (int value) {
         // Todo: Maybe update startIndex with known startPage!
         this.setCount((short) value);
         return this;
     };
 
+
     public KrillMeta setCount (short value) {
         if (value > 0)
             this.count = (value <= this.countMax) ? value : this.countMax;
         return this;
     };
 
+
     public short getCountMax () {
         return this.countMax;
     };
@@ -194,12 +188,14 @@
     public int getStartIndex () {
         return this.startIndex;
     };
-    
+
+
     public KrillMeta setStartIndex (int value) {
         this.startIndex = (value >= 0) ? value : 0;
         return this;
     };
 
+
     public KrillMeta setStartPage (int value) {
         if (value >= 0)
             this.setStartIndex((value * this.getCount()) - this.getCount());
@@ -213,20 +209,24 @@
         return this.timeout;
     };
 
+
     public void setTimeOut (long timeout) {
         this.timeout = timeout;
     };
 
+
     public KrillMeta setItemsPerResource (short value) {
         if (value >= 0)
             this.itemsPerResource = value;
         return this;
     };
 
+
     public KrillMeta setItemsPerResource (int value) {
         return this.setItemsPerResource((short) value);
     };
 
+
     public short getItemsPerResource () {
         return this.itemsPerResource;
     };
@@ -236,6 +236,7 @@
         return this.context;
     };
 
+
     public KrillMeta setContext (SearchContext context) {
         this.context = context;
         return this;
@@ -253,8 +254,9 @@
 
     /**
      * Add a field to the set of fields to retrieve.
-     *
-     * @param field The field to retrieve.
+     * 
+     * @param field
+     *            The field to retrieve.
      * @return The {@link Krill} object for chaining.
      */
     public KrillMeta addField (String field) {
@@ -265,8 +267,9 @@
 
     /**
      * Add class numbers to highlight in KWIC view.
-     *
-     * @param classNumber The number of a class to highlight.
+     * 
+     * @param classNumber
+     *            The number of a class to highlight.
      * @return The {@link Krill} object for chaining.
      */
     public KrillMeta addHighlight (int classNumber) {
@@ -280,6 +283,7 @@
         return this.cutOff;
     };
 
+
     @Deprecated
     public KrillMeta setCutOff (boolean cutOff) {
         this.cutOff = cutOff;
@@ -295,6 +299,7 @@
         return this.limit;
     };
 
+
     // TODO:
     // This limits the search results with offset
     // Maybe can be deprecated!
@@ -309,7 +314,7 @@
     @Override
     public JsonNode toJsonNode () {
         ObjectMapper mapper = new ObjectMapper();
-        ObjectNode json =  mapper.createObjectNode();
+        ObjectNode json = mapper.createObjectNode();
         // json.put("@type", "koral:meta");
 
         ArrayNode fieldNode = mapper.createArrayNode();
@@ -322,23 +327,23 @@
 
         // Add limit attribute
         if (this.limit > 0)
-            json.put("limit",  this.getLimit());
+            json.put("limit", this.getLimit());
         // </legacy>
 
         // Add count attribute
-        json.put("count",      this.getCount());
+        json.put("count", this.getCount());
 
         // Add startindex attribute
         json.put("startIndex", this.getStartIndex());
 
         // Add timeout attribute
-        json.put("timeout",    this.getTimeOut());
+        json.put("timeout", this.getTimeOut());
 
         // Add context attribute
-        json.put("context",    this.getContext().toJsonNode());
+        json.put("context", this.getContext().toJsonNode());
 
         // Add fields attribute
-        json.put("fields",     fieldNode); 
+        json.put("fields", fieldNode);
 
         // Add itemsPerResource attribute
         if (this.itemsPerResource > 0)
diff --git a/src/main/java/de/ids_mannheim/korap/KrillQuery.java b/src/main/java/de/ids_mannheim/korap/KrillQuery.java
index 7ad031e..b5390e3 100644
--- a/src/main/java/de/ids_mannheim/korap/KrillQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/KrillQuery.java
@@ -23,14 +23,15 @@
  * KrillQuery provides deserialization methods
  * for KoralQuery query objects.
  * </p>
- *
+ * 
  * <blockquote><pre>
- *   // Create or receive a KoralQuery JSON string
- *   String koral = "{\"@type\":"koral:group", ... }";
- *
- *   SpanQueryWrapper sqw = new KrillQuery("tokens").fromJson("{... JsonString ...}");
+ * // Create or receive a KoralQuery JSON string
+ * String koral = "{\"@type\":"koral:group", ... }";
+ * 
+ * SpanQueryWrapper sqw = new
+ * KrillQuery("tokens").fromJson("{... JsonString ...}");
  * </pre></blockquote>
- *
+ * 
  * @author diewald
  */
 /*
@@ -62,14 +63,13 @@
     public static final boolean DEBUG = false;
 
     // <legacy>
-    public static final byte
-        OVERLAP      = SpanWithinQuery.OVERLAP,
-        REAL_OVERLAP = SpanWithinQuery.REAL_OVERLAP,
-        WITHIN       = SpanWithinQuery.WITHIN,
-        REAL_WITHIN  = SpanWithinQuery.REAL_WITHIN,
-        ENDSWITH     = SpanWithinQuery.ENDSWITH,
-        STARTSWITH   = SpanWithinQuery.STARTSWITH,
-        MATCH        = SpanWithinQuery.MATCH;
+    public static final byte OVERLAP = SpanWithinQuery.OVERLAP,
+            REAL_OVERLAP = SpanWithinQuery.REAL_OVERLAP,
+            WITHIN = SpanWithinQuery.WITHIN,
+            REAL_WITHIN = SpanWithinQuery.REAL_WITHIN,
+            ENDSWITH = SpanWithinQuery.ENDSWITH,
+            STARTSWITH = SpanWithinQuery.STARTSWITH,
+            MATCH = SpanWithinQuery.MATCH;
     // </legacy>
 
     private static final int MAX_CLASS_NUM = 255; // 127;
@@ -78,16 +78,15 @@
     private class Boundary {
         public int min, max;
 
+
         // Constructor for boundaries
         public Boundary (JsonNode json, int defaultMin, int defaultMax)
-            throws QueryException {
-            
+                throws QueryException {
+
             // No @type defined
             if (!json.has("@type")) {
-                throw new QueryException(
-                    701,
-                    "JSON-LD group has no @type attribute"
-                );
+                throw new QueryException(701,
+                        "JSON-LD group has no @type attribute");
             };
 
             // Wrong @type defined
@@ -95,27 +94,27 @@
                 throw new QueryException(702, "Boundary definition is invalid");
 
             // Set min boundary
-            this.min = json.has("min") ?
-                json.get("min").asInt(defaultMin) :
-                defaultMin;
+            this.min = json.has("min") ? json.get("min").asInt(defaultMin)
+                    : defaultMin;
 
             // Set max boundary
-            this.max = json.has("max") ?
-                json.get("max").asInt(defaultMax) :
-                defaultMax;
-            
+            this.max = json.has("max") ? json.get("max").asInt(defaultMax)
+                    : defaultMax;
+
             if (DEBUG)
                 log.trace("Found koral:boundary with {}:{}", min, max);
         };
     };
 
+
     /**
      * Constructs a new object for query deserialization
      * and building. Expects the name of an index field
      * to apply the query on (this should normally be
      * a token stream field).
-     *
-     * @param field The specific index field for the query.
+     * 
+     * @param field
+     *            The specific index field for the query.
      */
     public KrillQuery (String field) {
         this.field = field;
@@ -123,24 +122,26 @@
 
 
     /**
-     * <p>Deserialize JSON-LD query to a {@link SpanQueryWrapper} object.</p>
-     *
+     * <p>Deserialize JSON-LD query to a {@link SpanQueryWrapper}
+     * object.</p>
+     * 
      * <blockquote><pre>
-     *   KrillQuery kq = new KrillQuery("tokens");
-     *   SpanQueryWrapper sqw = kq.fromJson(
-     *     "{\"@type\" : \"koral:token\","+
-     *      "\"wrap\" : {" +
-     *        "\"@type\" :   \"koral:term\"," +
-     *        "\"foundry\" : \"opennlp\"," +
-     *        "\"key\" :     \"tree\"," +
-     *        "\"layer\" :   \"orth\"," +
-     *        "\"match\" :   \"match:eq\""+
-     *      "}}"
-     *   );
+     * KrillQuery kq = new KrillQuery("tokens");
+     * SpanQueryWrapper sqw = kq.fromJson(
+     * "{\"@type\" : \"koral:token\","+
+     * "\"wrap\" : {" +
+     * "\"@type\" :   \"koral:term\"," +
+     * "\"foundry\" : \"opennlp\"," +
+     * "\"key\" :     \"tree\"," +
+     * "\"layer\" :   \"orth\"," +
+     * "\"match\" :   \"match:eq\""+
+     * "}}"
+     * );
      * </pre></blockquote>
-     *
-     * @param json String representing the JSON query string.
-     * @return {@link SpanQueryWrapper} object. 
+     * 
+     * @param json
+     *            String representing the JSON query string.
+     * @return {@link SpanQueryWrapper} object.
      * @throws QueryException
      */
     public SpanQueryWrapper fromJson (String json) throws QueryException {
@@ -169,9 +170,10 @@
     /**
      * <p>Deserialize JSON-LD query as a {@link JsonNode} object
      * to a {@link SpanQueryWrapper} object.</p>
-     *
-     * @param json {@link JsonNode} representing the JSON query string.
-     * @return {@link SpanQueryWrapper} object. 
+     * 
+     * @param json
+     *            {@link JsonNode} representing the JSON query string.
+     * @return {@link SpanQueryWrapper} object.
      * @throws QueryException
      */
     // TODO: Exception messages are horrible!
@@ -184,7 +186,8 @@
         // Only accept @typed objects for the moment
         // TODO: Support @context for cosmas:...
         if (!json.has("@type"))
-            throw new QueryException(701, "JSON-LD group has no @type attribute");
+            throw new QueryException(701,
+                    "JSON-LD group has no @type attribute");
 
         // Set this for reserialization
         // This may be changed later on
@@ -194,92 +197,92 @@
         String type = json.get("@type").asText();
 
         switch (type) {
-        case "koral:group":
-            return this._groupFromJson(json);
+            case "koral:group":
+                return this._groupFromJson(json);
 
-        case "koral:reference":
-            if (json.has("operation") &&
-                !json.get("operation").asText().equals("operation:focus"))
-                throw new QueryException(712, "Unknown reference operation");
+            case "koral:reference":
+                if (json.has("operation")
+                        && !json.get("operation").asText()
+                                .equals("operation:focus"))
+                    throw new QueryException(712, "Unknown reference operation");
 
-            if (!json.has("operands")) {
-                throw new QueryException(
-                    766,
-                    "Peripheral references are currently not supported"
-                );
-            };
+                if (!json.has("operands")) {
+                    throw new QueryException(766,
+                            "Peripheral references are currently not supported");
+                }
+                ;
 
-            JsonNode operands = json.get("operands");
+                JsonNode operands = json.get("operands");
 
-            if (!operands.isArray())
-                throw new QueryException(704, "Operation needs operand list");
+                if (!operands.isArray())
+                    throw new QueryException(704,
+                            "Operation needs operand list");
 
-            if (operands.size() == 0)
-                throw new QueryException(704, "Operation needs operand list");
+                if (operands.size() == 0)
+                    throw new QueryException(704,
+                            "Operation needs operand list");
 
-            if (operands.size() != 1)
-                throw new QueryException(705, "Number of operands is not acceptable");
+                if (operands.size() != 1)
+                    throw new QueryException(705,
+                            "Number of operands is not acceptable");
 
-            // Reference based on classes
-            if (json.has("classRef")) {
-                if (json.has("classRefOp")) {
-                    throw new QueryException(
-                        761,
-                        "Class reference operators are currently not supported"
-                    );
-                };
+                // Reference based on classes
+                if (json.has("classRef")) {
+                    if (json.has("classRefOp")) {
+                        throw new QueryException(761,
+                                "Class reference operators are currently not supported");
+                    };
 
-                number = json.get("classRef").get(0).asInt();
+                    number = json.get("classRef").get(0).asInt();
 
-                if (number > MAX_CLASS_NUM)
-                    throw new QueryException(
-                        709,
-                        "Valid class numbers exceeded"
-                    );
-            }
+                    if (number > MAX_CLASS_NUM)
+                        throw new QueryException(709,
+                                "Valid class numbers exceeded");
+                }
 
-            // Reference based on spans
-            else if (json.has("spanRef")) {
-                JsonNode spanRef = json.get("spanRef");
-                int length = 0;
-                int startOffset = 0;
-                if (!spanRef.isArray() || spanRef.size() == 0) {
-                    throw new QueryException(
-                        714,
-                        "Span references expect a start position" +
-                        " and a length parameter"
-                    );
-                };
-                
-                if (spanRef.size() > 1)
-                    length = spanRef.get(1).asInt(0);
-	            
-                startOffset = spanRef.get(0).asInt(0);
+                // Reference based on spans
+                else if (json.has("spanRef")) {
+                    JsonNode spanRef = json.get("spanRef");
+                    int length = 0;
+                    int startOffset = 0;
+                    if (!spanRef.isArray() || spanRef.size() == 0) {
+                        throw new QueryException(714,
+                                "Span references expect a start position"
+                                        + " and a length parameter");
+                    };
 
-                if (DEBUG) log.trace("Wrap span reference {},{}", startOffset, length);
+                    if (spanRef.size() > 1)
+                        length = spanRef.get(1).asInt(0);
 
-                SpanQueryWrapper sqw = this.fromJson(operands.get(0));
-				SpanSubspanQueryWrapper ssqw = new SpanSubspanQueryWrapper(
-						sqw, startOffset, length);
-				return ssqw;
-            };
+                    startOffset = spanRef.get(0).asInt(0);
 
-            if (DEBUG) log.trace("Wrap class reference {}", number);
+                    if (DEBUG)
+                        log.trace("Wrap span reference {},{}", startOffset,
+                                length);
 
-            return new SpanFocusQueryWrapper(
-                this.fromJson(operands.get(0)), number
-            );
+                    SpanQueryWrapper sqw = this.fromJson(operands.get(0));
+                    SpanSubspanQueryWrapper ssqw = new SpanSubspanQueryWrapper(
+                            sqw, startOffset, length);
+                    return ssqw;
+                }
+                ;
 
-        case "koral:token":
-            // The token is empty and should be treated like []
-            if (!json.has("wrap"))
-                return new SpanRepetitionQueryWrapper();
+                if (DEBUG)
+                    log.trace("Wrap class reference {}", number);
 
-            // Get wrapped token
-            return this._segFromJson(json.get("wrap"));
+                return new SpanFocusQueryWrapper(
+                        this.fromJson(operands.get(0)), number);
 
-        case "koral:span":
-            return this._termFromJson(json);
+            case "koral:token":
+                // The token is empty and should be treated like []
+                if (!json.has("wrap"))
+                    return new SpanRepetitionQueryWrapper();
+
+                // Get wrapped token
+                return this._segFromJson(json.get("wrap"));
+
+            case "koral:span":
+                return this._termFromJson(json);
         };
 
         // Unknown query type
@@ -292,11 +295,12 @@
      * Get the associated {@link QueryBuilder} object
      * for query building.
      * </p>
-     *
+     * 
      * <blockquote><pre>
-     *   SpanQueryWrapper query = new KrillQuery("tokens").builder().re("mate/p=N.*");
+     * SpanQueryWrapper query = new
+     * KrillQuery("tokens").builder().re("mate/p=N.*");
      * </pre></blockquote>
-     *
+     * 
      * @return The {@link QueryBuilder}.
      */
     public QueryBuilder builder () {
@@ -312,7 +316,7 @@
      * if the object was build using a {@link QueryBuilder},
      * therefore it is limited to mirror a deserialized KoralQuery
      * object.
-     *
+     * 
      * @return The {@link JsonNode} representing the query object
      *         of a deserialized KoralQuery object.
      */
@@ -327,7 +331,7 @@
      * if the object was build using a {@link QueryBuilder},
      * therefore it is limited to mirror a deserialized KoralQuery
      * object.
-     *
+     * 
      * @return A JSON string representing the query object
      *         of a deserialized KoralQuery object.
      */
@@ -339,7 +343,8 @@
 
 
     // Deserialize koral:group
-    private SpanQueryWrapper _groupFromJson (JsonNode json) throws QueryException {
+    private SpanQueryWrapper _groupFromJson (JsonNode json)
+            throws QueryException {
 
         // No operation
         if (!json.has("operation"))
@@ -348,7 +353,8 @@
         // Get operation
         String operation = json.get("operation").asText();
 
-        if (DEBUG) log.trace("Found {} group", operation);
+        if (DEBUG)
+            log.trace("Found {} group", operation);
 
         if (!json.has("operands"))
             throw new QueryException(704, "Operation needs operand list");
@@ -359,34 +365,36 @@
         if (operands == null || !operands.isArray())
             throw new QueryException(704, "Operation needs operand list");
 
-        if (DEBUG) log.trace("Operands are {}", operands);
+        if (DEBUG)
+            log.trace("Operands are {}", operands);
 
         // Branch on operation
         switch (operation) {
-        case "operation:junction":
-            return this._operationJunctionFromJson(operands);
-            
-        case "operation:position":
-            return this._operationPositionFromJson(json, operands);
+            case "operation:junction":
+                return this._operationJunctionFromJson(operands);
 
-        case "operation:sequence":
-            return this._operationSequenceFromJson(json, operands);
+            case "operation:position":
+                return this._operationPositionFromJson(json, operands);
 
-        case "operation:class":
-            return this._operationClassFromJson(json, operands);
+            case "operation:sequence":
+                return this._operationSequenceFromJson(json, operands);
 
-        case "operation:repetition":
-            return this._operationRepetitionFromJson(json, operands);
+            case "operation:class":
+                return this._operationClassFromJson(json, operands);
 
-        case "operation:relation":
-            throw new QueryException(765, "Relations are currently not supported");
+            case "operation:repetition":
+                return this._operationRepetitionFromJson(json, operands);
 
-        case "operation:or": // Deprecated in favor of operation:junction
-            return this._operationJunctionFromJson(operands);
-            /*
-        case "operation:submatch": // Deprecated in favor of koral:reference
-            return this._operationSubmatchFromJson(json, operands);
-            */
+            case "operation:relation":
+                throw new QueryException(765,
+                        "Relations are currently not supported");
+
+            case "operation:or": // Deprecated in favor of operation:junction
+                return this._operationJunctionFromJson(operands);
+                /*
+                case "operation:submatch": // Deprecated in favor of koral:reference
+                return this._operationSubmatchFromJson(json, operands);
+                */
         };
 
         // Unknown
@@ -396,7 +404,7 @@
 
     // Deserialize operation:junction
     private SpanQueryWrapper _operationJunctionFromJson (JsonNode operands)
-        throws QueryException {
+            throws QueryException {
         SpanAlterQueryWrapper ssaq = new SpanAlterQueryWrapper(this.field);
         for (JsonNode operand : operands) {
             ssaq.or(this.fromJson(operand));
@@ -406,10 +414,11 @@
 
 
     // Deserialize operation:position
-    private SpanQueryWrapper _operationPositionFromJson (JsonNode json, JsonNode operands)
-        throws QueryException {
+    private SpanQueryWrapper _operationPositionFromJson (JsonNode json,
+            JsonNode operands) throws QueryException {
         if (operands.size() != 2)
-            throw new QueryException(705, "Number of operands is not acceptable");
+            throw new QueryException(705,
+                    "Number of operands is not acceptable");
 
         String frame = "isAround";
         // Temporary workaround for wrongly set overlaps
@@ -431,86 +440,77 @@
         };
         // </legacyCode>
 
-        if (DEBUG) log.trace("Position frame is '{}'", frame);
+        if (DEBUG)
+            log.trace("Position frame is '{}'", frame);
 
         // Byte flag - should cover all 13 cases, i.e. two bytes long
         byte flag = WITHIN;
         switch (frame) {
-        case "isAround":
-            break;
-        case "strictlyContains":
-            flag = REAL_WITHIN;
-            break;
-        case "isWithin":
-            break;
-        case "startsWith":
-            flag = STARTSWITH;
-            break;
-        case "endsWith":
-            flag = ENDSWITH;
-            break;
-        case "matches":
-            flag = MATCH;
-            break;
-        case "overlaps":
-            flag = OVERLAP;
-            this.addWarning(
-                769,
-                "Overlap variant currently interpreted as overlap"
-            );
-            break;
-        case "overlapsLeft":
-            // Temporary workaround
-            this.addWarning(
-                769,
-                "Overlap variant currently interpreted as overlap"
-            );
-            flag = OVERLAP;
-            break;
-        case "overlapsRight":
-            // Temporary workaround
-            this.addWarning(
-                769,
-                "Overlap variant currently interpreted as overlap"
-            );
-            flag = OVERLAP;
-            break;
-        case "strictlyOverlaps":
-            flag = REAL_OVERLAP;
-            break;
+            case "isAround":
+                break;
+            case "strictlyContains":
+                flag = REAL_WITHIN;
+                break;
+            case "isWithin":
+                break;
+            case "startsWith":
+                flag = STARTSWITH;
+                break;
+            case "endsWith":
+                flag = ENDSWITH;
+                break;
+            case "matches":
+                flag = MATCH;
+                break;
+            case "overlaps":
+                flag = OVERLAP;
+                this.addWarning(769,
+                        "Overlap variant currently interpreted as overlap");
+                break;
+            case "overlapsLeft":
+                // Temporary workaround
+                this.addWarning(769,
+                        "Overlap variant currently interpreted as overlap");
+                flag = OVERLAP;
+                break;
+            case "overlapsRight":
+                // Temporary workaround
+                this.addWarning(769,
+                        "Overlap variant currently interpreted as overlap");
+                flag = OVERLAP;
+                break;
+            case "strictlyOverlaps":
+                flag = REAL_OVERLAP;
+                break;
 
             // alignsLeft
 
-        default:
-            throw new QueryException(706, "Frame type is unknown");
+            default:
+                throw new QueryException(706, "Frame type is unknown");
         };
-        
+
         // The exclusion operator is no longer relevant
         // <legacyCode>
         Boolean exclude;
         if (json.has("exclude") && json.get("exclude").asBoolean()) {
-            throw new QueryException(
-                760,
-                "Exclusion is currently not supported in position operations"
-            );
+            throw new QueryException(760,
+                    "Exclusion is currently not supported in position operations");
         };
         // </legacyCode>
 
         // Create SpanWithin Query
-        return new SpanWithinQueryWrapper(
-            this.fromJson(operands.get(0)),
-            this.fromJson(operands.get(1)),
-            flag
-        );
+        return new SpanWithinQueryWrapper(this.fromJson(operands.get(0)),
+                this.fromJson(operands.get(1)), flag);
     };
 
 
     // Deserialize operation:repetition
-    private SpanQueryWrapper _operationRepetitionFromJson (JsonNode json, JsonNode operands)
-        throws QueryException {
+    private SpanQueryWrapper _operationRepetitionFromJson (JsonNode json,
+            JsonNode operands) throws QueryException {
 
         if (operands.size() != 1)
-            throw new QueryException(705, "Number of operands is not acceptable");
+            throw new QueryException(705,
+                    "Number of operands is not acceptable");
 
         int min = 0, max = 100;
 
@@ -544,13 +544,13 @@
             min = 0;
         else if (min > 100)
             min = 100;
-                
+
         // Check relation between min and max
         if (min > max)
             max = max;
 
         SpanQueryWrapper sqw = this.fromJson(operands.get(0));
-                
+
         if (sqw.maybeExtension())
             return sqw.setMin(min).setMax(max);
 
@@ -560,23 +560,22 @@
 
     // Deserialize operation:submatch
     @Deprecated
-    private SpanQueryWrapper _operationSubmatchFromJson (JsonNode json, JsonNode operands)
-        throws QueryException {
+    private SpanQueryWrapper _operationSubmatchFromJson (JsonNode json,
+            JsonNode operands) throws QueryException {
 
         int number = 1;
 
         this.addMessage(0, "operation:submatch is deprecated");
 
         if (operands.size() != 1)
-            throw new QueryException(705, "Number of operands is not acceptable");
+            throw new QueryException(705,
+                    "Number of operands is not acceptable");
 
         // Use class reference
         if (json.has("classRef")) {
             if (json.has("classRefOp")) {
-                throw new QueryException(
-                    761,
-                    "Class reference operators are currently not supported"
-                );
+                throw new QueryException(761,
+                        "Class reference operators are currently not supported");
             };
 
             number = json.get("classRef").get(0).asInt();
@@ -584,26 +583,23 @@
 
         // Use span reference
         else if (json.has("spanRef")) {
-            throw new QueryException(
-                762,
-                "Span references are currently not supported"
-            );
-        }; 
+            throw new QueryException(762,
+                    "Span references are currently not supported");
+        };
 
-        return new SpanFocusQueryWrapper(
-            this.fromJson(operands.get(0)), number
-        );
+        return new SpanFocusQueryWrapper(this.fromJson(operands.get(0)), number);
     };
 
 
     // Deserialize operation:class
-    private SpanQueryWrapper _operationClassFromJson (JsonNode json, JsonNode operands)
-        throws QueryException {
+    private SpanQueryWrapper _operationClassFromJson (JsonNode json,
+            JsonNode operands) throws QueryException {
         int number = 1;
 
         // Too many operands
         if (operands.size() != 1)
-            throw new QueryException(705, "Number of operands is not acceptable");
+            throw new QueryException(705,
+                    "Number of operands is not acceptable");
 
         // Get class number
         if (json.has("classOut")) {
@@ -618,46 +614,37 @@
 
         // Class reference check
         if (json.has("classRefCheck")) {
-            this.addWarning(
-                764,
-                "Class reference checks are currently " +
-                "not supported - results may not be correct"
-            );
+            this.addWarning(764, "Class reference checks are currently "
+                    + "not supported - results may not be correct");
         };
 
         // Class reference operation
         // This has to be done after class ref check
         if (json.has("classRefOp")) {
-            throw new QueryException(
-                761,
-                "Class reference operators are currently not supported"
-            );
+            throw new QueryException(761,
+                    "Class reference operators are currently not supported");
         };
 
         // Number is set
         if (number > 0) {
             if (operands.size() != 1) {
-                throw new QueryException(
-                    705,
-                    "Number of operands is not acceptable"
-                );
+                throw new QueryException(705,
+                        "Number of operands is not acceptable");
             };
-            
-            if (DEBUG) log.trace("Found Class definition for {}", number);
+
+            if (DEBUG)
+                log.trace("Found Class definition for {}", number);
 
             if (number > MAX_CLASS_NUM) {
-                throw new QueryException(
-                    709,
-                    "Valid class numbers exceeded"
-                );
+                throw new QueryException(709, "Valid class numbers exceeded");
             };
 
             // Serialize operand
             SpanQueryWrapper sqw = this.fromJson(operands.get(0));
 
             // Problematic
-			if (sqw.maybeExtension())
-			return sqw.setClassNumber(number);
+            if (sqw.maybeExtension())
+                return sqw.setClassNumber(number);
 
             return new SpanClassQueryWrapper(sqw, number);
         };
@@ -667,8 +654,8 @@
 
 
     // Deserialize operation:sequence
-    private SpanQueryWrapper _operationSequenceFromJson (JsonNode json, JsonNode operands)
-        throws QueryException {
+    private SpanQueryWrapper _operationSequenceFromJson (JsonNode json,
+            JsonNode operands) throws QueryException {
 
         // Sequence with only one operand
         if (operands.size() == 1)
@@ -686,43 +673,39 @@
 
             // THIS IS NO LONGER NECESSARY, AS IT IS COVERED BY FRAMES
             if (json.has("exclude") && json.get("exclude").asBoolean()) {
-                throw new QueryException(
-                    763,
-                    "Excluding distance constraints are currently not supported"
-                );
+                throw new QueryException(763,
+                        "Excluding distance constraints are currently not supported");
             };
 
             if (!json.get("distances").isArray()) {
-                throw new QueryException(
-                    707,
-                    "Distance Constraints have to be defined as arrays"
-                );
+                throw new QueryException(707,
+                        "Distance Constraints have to be defined as arrays");
             };
 
             // TEMPORARY: Workaround for group distances
             JsonNode firstDistance = json.get("distances").get(0);
-            
+
             if (!firstDistance.has("@type")) {
-                throw new QueryException(
-                    701,
-                    "JSON-LD group has no @type attribute"
-                );
+                throw new QueryException(701,
+                        "JSON-LD group has no @type attribute");
             };
 
             JsonNode distances;
             if (firstDistance.get("@type").asText().equals("koral:group")) {
-                if (!firstDistance.has("operands") ||
-                    !firstDistance.get("operands").isArray())
-                    throw new QueryException(704, "Operation needs operand list");
+                if (!firstDistance.has("operands")
+                        || !firstDistance.get("operands").isArray())
+                    throw new QueryException(704,
+                            "Operation needs operand list");
 
                 distances = firstDistance.get("operands");
             }
 
             // Support korap distances
             // Support cosmas distances
-            else if (firstDistance.get("@type").asText().equals("koral:distance")
-                     ||
-                     firstDistance.get("@type").asText().equals("cosmas:distance")) {
+            else if (firstDistance.get("@type").asText()
+                    .equals("koral:distance")
+                    || firstDistance.get("@type").asText()
+                            .equals("cosmas:distance")) {
                 distances = json.get("distances");
             }
 
@@ -734,11 +717,12 @@
                 String unit = "w";
                 if (constraint.has("key"))
                     unit = constraint.get("key").asText();
-                
+
                 // There is a maximum of 100 fix
                 int min = 0, max = 100;
                 if (constraint.has("boundary")) {
-                    Boundary b = new Boundary(constraint.get("boundary"), 0,100);
+                    Boundary b = new Boundary(constraint.get("boundary"), 0,
+                            100);
                     min = b.min;
                     max = b.max;
                 }
@@ -748,13 +732,12 @@
                     if (constraint.has("max"))
                         max = constraint.get("max").asInt(100);
                 };
-                        
+
                 // Add foundry and layer to the unit for new indices
-                if (constraint.has("foundry") &&
-                    constraint.has("layer") &&
-                    constraint.get("foundry").asText().length() > 0 &&
-                    constraint.get("layer").asText().length() > 0) {
-                            
+                if (constraint.has("foundry") && constraint.has("layer")
+                        && constraint.get("foundry").asText().length() > 0
+                        && constraint.get("layer").asText().length() > 0) {
+
                     StringBuilder value = new StringBuilder();
                     value.append(constraint.get("foundry").asText());
                     value.append('/');
@@ -762,14 +745,15 @@
                     value.append(':').append(unit);
                     unit = value.toString();
                 };
-                
+
                 // Sanitize boundary
-                if (max < min) max = min;
-                        
+                if (max < min)
+                    max = min;
+
                 if (DEBUG)
-                    log.trace("Add distance constraint of '{}': {}-{}",
-                              unit, min, max);
-                        
+                    log.trace("Add distance constraint of '{}': {}-{}", unit,
+                            min, max);
+
                 sseqqw.withConstraint(min, max, unit);
             };
         };
@@ -791,7 +775,8 @@
     // Deserialize koral:token
     private SpanQueryWrapper _segFromJson (JsonNode json) throws QueryException {
         if (!json.has("@type"))
-            throw new QueryException(701, "JSON-LD group has no @type attribute");
+            throw new QueryException(701,
+                    "JSON-LD group has no @type attribute");
 
         String type = json.get("@type").asText();
 
@@ -800,104 +785,108 @@
 
         // Branch on type
         switch (type) {
-        case "koral:term":
-//            String match = "match:eq";
-//            if (json.has("match"))
-//                match = json.get("match").asText();
-//            
-//            switch (match) {
-//
-//            case "match:ne":
-//                if (DEBUG)
-//                    log.trace("Term is negated");
-//
-//                SpanSegmentQueryWrapper ssqw =
-//                    (SpanSegmentQueryWrapper) this._termFromJson(json);
-//
-//                ssqw.makeNegative();
-//
-//                return this.seg().without(ssqw);
-//
-//            case "match:eq":
+            case "koral:term":
+                //            String match = "match:eq";
+                //            if (json.has("match"))
+                //                match = json.get("match").asText();
+                //            
+                //            switch (match) {
+                //
+                //            case "match:ne":
+                //                if (DEBUG)
+                //                    log.trace("Term is negated");
+                //
+                //                SpanSegmentQueryWrapper ssqw =
+                //                    (SpanSegmentQueryWrapper) this._termFromJson(json);
+                //
+                //                ssqw.makeNegative();
+                //
+                //                return this.seg().without(ssqw);
+                //
+                //            case "match:eq":
                 return this._termFromJson(json);
-//            };
-//
-//            throw new QueryException(741, "Match relation unknown");
+                //            };
+                //
+                //            throw new QueryException(741, "Match relation unknown");
 
-        case "koral:termGroup":
+            case "koral:termGroup":
 
-            if (!json.has("operands"))
-                throw new QueryException(742, "Term group needs operand list");
+                if (!json.has("operands"))
+                    throw new QueryException(742,
+                            "Term group needs operand list");
 
-            // Get operands
-            JsonNode operands = json.get("operands");
+                // Get operands
+                JsonNode operands = json.get("operands");
 
-            SpanSegmentQueryWrapper ssegqw = this.builder().seg();
-            
-            if (!json.has("relation"))
-                throw new QueryException(743, "Term group expects a relation");
+                SpanSegmentQueryWrapper ssegqw = this.builder().seg();
 
-            switch (json.get("relation").asText()) {
-            case "relation:and":
+                if (!json.has("relation"))
+                    throw new QueryException(743,
+                            "Term group expects a relation");
 
-                for (JsonNode operand : operands) {
-                    SpanQueryWrapper part = this._segFromJson(operand);
-                    if (part instanceof SpanAlterQueryWrapper) {
-                        ssegqw.with((SpanAlterQueryWrapper) part);			
-                    }
-                    else if (part instanceof SpanRegexQueryWrapper) {
-                        ssegqw.with((SpanRegexQueryWrapper) part);
-                    }
-                    else if (part instanceof SpanSegmentQueryWrapper) {
-                        ssegqw.with((SpanSegmentQueryWrapper) part);
-                    }
-                    else {
-                        throw new QueryException(
-                            744,
-                            "Operand not supported in term group"
-                        );
-                    };
-                };
-                return ssegqw;
+                switch (json.get("relation").asText()) {
+                    case "relation:and":
 
-            case "relation:or":
+                        for (JsonNode operand : operands) {
+                            SpanQueryWrapper part = this._segFromJson(operand);
+                            if (part instanceof SpanAlterQueryWrapper) {
+                                ssegqw.with((SpanAlterQueryWrapper) part);
+                            }
+                            else if (part instanceof SpanRegexQueryWrapper) {
+                                ssegqw.with((SpanRegexQueryWrapper) part);
+                            }
+                            else if (part instanceof SpanSegmentQueryWrapper) {
+                                ssegqw.with((SpanSegmentQueryWrapper) part);
+                            }
+                            else {
+                                throw new QueryException(744,
+                                        "Operand not supported in term group");
+                            };
+                        }
+                        ;
+                        return ssegqw;
 
-                SpanAlterQueryWrapper ssaq = new SpanAlterQueryWrapper(this.field);
-                for (JsonNode operand : operands) {
-                    ssaq.or(this._segFromJson(operand));
-                };
-                return ssaq;
-            };
+                    case "relation:or":
+
+                        SpanAlterQueryWrapper ssaq = new SpanAlterQueryWrapper(
+                                this.field);
+                        for (JsonNode operand : operands) {
+                            ssaq.or(this._segFromJson(operand));
+                        }
+                        ;
+                        return ssaq;
+                }
+                ;
         };
-        throw new QueryException(745, "Token type is not supported");    
+        throw new QueryException(745, "Token type is not supported");
     };
 
 
     // Deserialize koral:term
     private SpanQueryWrapper _termFromJson (JsonNode json)
-        throws QueryException {
-    	
+            throws QueryException {
+
         if (!json.has("key") || json.get("key").asText().length() < 1) {
-			if (!json.has("attr"))
-				throw new QueryException(740,
-						"Key definition is missing in term or span");
-        };
-	    
-        if (!json.has("@type")) {
-            throw new QueryException(
-                701,
-                "JSON-LD group has no @type attribute"
-            );
+            if (!json.has("attr"))
+                throw new QueryException(740,
+                        "Key definition is missing in term or span");
         };
 
-        Boolean isTerm = json.get("@type").asText().equals("koral:term") ? true : false;
+        if (!json.has("@type")) {
+            throw new QueryException(701,
+                    "JSON-LD group has no @type attribute");
+        };
+
+        Boolean isTerm = json.get("@type").asText().equals("koral:term") ? true
+                : false;
         Boolean isCaseInsensitive = false;
 
-        if (json.has("caseInsensitive") && json.get("caseInsensitive").asBoolean())
+        if (json.has("caseInsensitive")
+                && json.get("caseInsensitive").asBoolean())
             isCaseInsensitive = true;
 
         StringBuilder value = new StringBuilder();
-        
+
         // expect orth? expect lemma? 
         // s:den | i:den | cnx/l:die | mate/m:mood:ind | cnx/syn:@PREMOD |
         // mate/m:number:sg | opennlp/p:ART
@@ -910,36 +899,34 @@
             String layer = json.get("layer").asText();
             switch (layer) {
 
-            case "lemma":
-                layer = "l";
-                break;
+                case "lemma":
+                    layer = "l";
+                    break;
 
-            case "pos":
-                layer = "p";
-                break;
+                case "pos":
+                    layer = "p";
+                    break;
 
-            case "orth":
-                // TODO: THIS IS A BUG! AND SHOULD BE NAMED "SURFACE" or .
-                layer = "s";
-                break;
+                case "orth":
+                    // TODO: THIS IS A BUG! AND SHOULD BE NAMED "SURFACE" or .
+                    layer = "s";
+                    break;
 
-            case "struct":
-                layer = "s";
-                break;
+                case "struct":
+                    layer = "s";
+                    break;
 
-            case "const":
-                layer = "c";
-                break;
+                case "const":
+                    layer = "c";
+                    break;
             };
 
             if (isCaseInsensitive && isTerm) {
                 if (layer.equals("s"))
                     layer = "i";
                 else {
-                    this.addWarning(
-                        767,
-                        "Case insensitivity is currently not supported for this layer"
-                    );
+                    this.addWarning(767,
+                            "Case insensitivity is currently not supported for this layer");
                 };
             };
 
@@ -965,174 +952,176 @@
 
             // Branch on type
             switch (json.get("type").asText()) {
-            case "type:regex":
-                return qb.seg(qb.re(value.toString(), isCaseInsensitive));
+                case "type:regex":
+                    return qb.seg(qb.re(value.toString(), isCaseInsensitive));
 
-            case "type:wildcard":
-                return qb.seq(qb.wc(value.toString(), isCaseInsensitive));
+                case "type:wildcard":
+                    return qb.seq(qb.wc(value.toString(), isCaseInsensitive));
 
-            case "type:string":
-                break;
+                case "type:string":
+                    break;
 
-            default:
-                this.addWarning(746, "Term type is not supported - treated as a string");
+                default:
+                    this.addWarning(746,
+                            "Term type is not supported - treated as a string");
             };
         };
 
-        if (isTerm){
+        if (isTerm) {
 
-        	String match = "match:eq";
-			if (json.has("match")) {
-				match = json.get("match").asText();
-			}
+            String match = "match:eq";
+            if (json.has("match")) {
+                match = json.get("match").asText();
+            }
 
-			SpanSegmentQueryWrapper ssqw = this.builder().seg(value.toString());			
-			if (match.equals("match:ne")) {
-				if (DEBUG) log.trace("Term is negated");
-				ssqw.makeNegative();
-				return this.builder().seg().without(ssqw);
-			} 
-			else if (match.equals("match:eq")) {
-				return ssqw;
-			} 
-			else {
-				throw new QueryException(741, "Match relation unknown");
-			}
+            SpanSegmentQueryWrapper ssqw = this.builder().seg(value.toString());
+            if (match.equals("match:ne")) {
+                if (DEBUG)
+                    log.trace("Term is negated");
+                ssqw.makeNegative();
+                return this.builder().seg().without(ssqw);
+            }
+            else if (match.equals("match:eq")) {
+                return ssqw;
+            }
+            else {
+                throw new QueryException(741, "Match relation unknown");
+            }
         }
 
         if (json.has("attr")) {
-			JsonNode attrNode = json.get("attr");
-			if (!attrNode.has("@type")) {
-				throw new QueryException(701,
-						"JSON-LD group has no @type attribute");
-			}
+            JsonNode attrNode = json.get("attr");
+            if (!attrNode.has("@type")) {
+                throw new QueryException(701,
+                        "JSON-LD group has no @type attribute");
+            }
 
-			if (value.toString().isEmpty()) {
-				return _createElementAttrFromJson(null, json, attrNode);
-				// this.addWarning(771,
-				// "Arbitraty elements with attributes are currently not supported.");
-			}
-			else{
-				SpanQueryWrapper elementWithIdWrapper = this.builder().tag(value.toString());
-				if (elementWithIdWrapper == null){ return null; }
-				return _createElementAttrFromJson(elementWithIdWrapper, json,
-						attrNode);
-			}
+            if (value.toString().isEmpty()) {
+                return _createElementAttrFromJson(null, json, attrNode);
+                // this.addWarning(771,
+                // "Arbitraty elements with attributes are currently not supported.");
+            }
+            else {
+                SpanQueryWrapper elementWithIdWrapper = this.builder().tag(
+                        value.toString());
+                if (elementWithIdWrapper == null) {
+                    return null;
+                }
+                return _createElementAttrFromJson(elementWithIdWrapper, json,
+                        attrNode);
+            }
         };
         return this.builder().tag(value.toString());
     };
 
 
     // Deserialize elements with attributes
-	private SpanQueryWrapper _createElementAttrFromJson (
-                SpanQueryWrapper elementWithIdWrapper,
-                JsonNode json,
-                JsonNode attrNode) throws QueryException {
+    private SpanQueryWrapper _createElementAttrFromJson (
+            SpanQueryWrapper elementWithIdWrapper, JsonNode json,
+            JsonNode attrNode) throws QueryException {
 
-		if (attrNode.get("@type").asText().equals("koral:term")) {
-			SpanQueryWrapper attrWrapper = _attrFromJson(json.get("attr"));
-			if (attrWrapper != null) {
-				if (elementWithIdWrapper != null){
-					return new SpanWithAttributeQueryWrapper(elementWithIdWrapper,
-                                                             attrWrapper);
-				}
-				else {
-					return new SpanWithAttributeQueryWrapper(attrWrapper);
-				}
-			} 
-			else {
-				throw new QueryException(747, "Attribute is null");
-			}
-		} 
+        if (attrNode.get("@type").asText().equals("koral:term")) {
+            SpanQueryWrapper attrWrapper = _attrFromJson(json.get("attr"));
+            if (attrWrapper != null) {
+                if (elementWithIdWrapper != null) {
+                    return new SpanWithAttributeQueryWrapper(
+                            elementWithIdWrapper, attrWrapper);
+                }
+                else {
+                    return new SpanWithAttributeQueryWrapper(attrWrapper);
+                }
+            }
+            else {
+                throw new QueryException(747, "Attribute is null");
+            }
+        }
         else if (attrNode.get("@type").asText().equals("koral:termGroup")) {
-			return _handleAttrGroup(elementWithIdWrapper, attrNode);
-		}
-		else {
-			this.addWarning(715, "Attribute type is not supported");
-		}
-		return elementWithIdWrapper;
-	}
+            return _handleAttrGroup(elementWithIdWrapper, attrNode);
+        }
+        else {
+            this.addWarning(715, "Attribute type is not supported");
+        }
+        return elementWithIdWrapper;
+    }
 
 
     // Deserialize attribute groups
-	private SpanQueryWrapper _handleAttrGroup (
-                SpanQueryWrapper elementWithIdWrapper,
-                JsonNode attrNode) throws QueryException {
-		if (!attrNode.has("relation")) {
-			throw new QueryException(743, "Term group expects a relation");
-		}
-		if (!attrNode.has("operands")) {
-			throw new QueryException(742, "Term group needs operand list");
-		}
+    private SpanQueryWrapper _handleAttrGroup (
+            SpanQueryWrapper elementWithIdWrapper, JsonNode attrNode)
+            throws QueryException {
+        if (!attrNode.has("relation")) {
+            throw new QueryException(743, "Term group expects a relation");
+        }
+        if (!attrNode.has("operands")) {
+            throw new QueryException(742, "Term group needs operand list");
+        }
 
-		String relation = attrNode.get("relation").asText();
-		JsonNode operands = attrNode.get("operands");
+        String relation = attrNode.get("relation").asText();
+        JsonNode operands = attrNode.get("operands");
 
-		SpanQueryWrapper attrWrapper;
-		if ("relation:and".equals(relation)) {
-			List<SpanQueryWrapper> wrapperList = new ArrayList<SpanQueryWrapper>();
-			for (JsonNode operand : operands) {
-				attrWrapper = _termFromJson(operand);
-				if (attrWrapper == null) {
-					throw new QueryException(747, "Attribute is null");
-				}
-				wrapperList.add(attrWrapper);
-			}
+        SpanQueryWrapper attrWrapper;
+        if ("relation:and".equals(relation)) {
+            List<SpanQueryWrapper> wrapperList = new ArrayList<SpanQueryWrapper>();
+            for (JsonNode operand : operands) {
+                attrWrapper = _termFromJson(operand);
+                if (attrWrapper == null) {
+                    throw new QueryException(747, "Attribute is null");
+                }
+                wrapperList.add(attrWrapper);
+            }
 
-			if (elementWithIdWrapper != null){
-				return new SpanWithAttributeQueryWrapper(elementWithIdWrapper,
-                                                         wrapperList);
-			}
-			else {
-				return new SpanWithAttributeQueryWrapper(wrapperList);
-			}
-		} 
-		else if ("relation:or".equals(relation)) {
-			SpanAlterQueryWrapper saq = new SpanAlterQueryWrapper(field);
-			SpanWithAttributeQueryWrapper saqw;
-			for (JsonNode operand : operands) {
-				attrWrapper = _termFromJson(operand);
-				if (attrWrapper == null) {
-					throw new QueryException(747, "Attribute is null");
-				}
-				if (elementWithIdWrapper != null) {
-					saqw = new SpanWithAttributeQueryWrapper(
-                        elementWithIdWrapper,
-                        attrWrapper
-                    );
-				} else {
-					saqw = new SpanWithAttributeQueryWrapper(attrWrapper);
-				}
-				saq.or(saqw);
-			}
-			return saq;
-		}
-		else {
-			throw new QueryException(716, "Unknown relation");
-		}
-	}
+            if (elementWithIdWrapper != null) {
+                return new SpanWithAttributeQueryWrapper(elementWithIdWrapper,
+                        wrapperList);
+            }
+            else {
+                return new SpanWithAttributeQueryWrapper(wrapperList);
+            }
+        }
+        else if ("relation:or".equals(relation)) {
+            SpanAlterQueryWrapper saq = new SpanAlterQueryWrapper(field);
+            SpanWithAttributeQueryWrapper saqw;
+            for (JsonNode operand : operands) {
+                attrWrapper = _termFromJson(operand);
+                if (attrWrapper == null) {
+                    throw new QueryException(747, "Attribute is null");
+                }
+                if (elementWithIdWrapper != null) {
+                    saqw = new SpanWithAttributeQueryWrapper(
+                            elementWithIdWrapper, attrWrapper);
+                }
+                else {
+                    saqw = new SpanWithAttributeQueryWrapper(attrWrapper);
+                }
+                saq.or(saqw);
+            }
+            return saq;
+        }
+        else {
+            throw new QueryException(716, "Unknown relation");
+        }
+    }
+
 
     // Get attributes from a json termgroup
     private SpanQueryWrapper _attrFromJson (JsonNode attrNode)
-        throws QueryException {
+            throws QueryException {
 
-		if (attrNode.has("key")) {
-			return _termFromJson(attrNode);
-		} 
-		else if (attrNode.has("tokenarity") || attrNode.has("arity")) {
-			this.addWarning(770, "Arity attributes are currently not supported"
-					+ " - results may not be correct"
-            );
-		} 
-		else if (attrNode.has("root")) {
-			String rootValue = attrNode.get("root").asText();
-			if (rootValue.equals("true") || rootValue.equals("false")) {
-				return new SpanAttributeQueryWrapper(
-						new SpanSimpleQueryWrapper("tokens", "@root",
-								Boolean.valueOf(rootValue))
-                );
+        if (attrNode.has("key")) {
+            return _termFromJson(attrNode);
+        }
+        else if (attrNode.has("tokenarity") || attrNode.has("arity")) {
+            this.addWarning(770, "Arity attributes are currently not supported"
+                    + " - results may not be correct");
+        }
+        else if (attrNode.has("root")) {
+            String rootValue = attrNode.get("root").asText();
+            if (rootValue.equals("true") || rootValue.equals("false")) {
+                return new SpanAttributeQueryWrapper(
+                        new SpanSimpleQueryWrapper("tokens", "@root",
+                                Boolean.valueOf(rootValue)));
             }
         }
-		return null;
+        return null;
     };
 };
diff --git a/src/main/java/de/ids_mannheim/korap/collection/BooleanFilter.java b/src/main/java/de/ids_mannheim/korap/collection/BooleanFilter.java
index 7393a01..2f6853d 100644
--- a/src/main/java/de/ids_mannheim/korap/collection/BooleanFilter.java
+++ b/src/main/java/de/ids_mannheim/korap/collection/BooleanFilter.java
@@ -26,15 +26,17 @@
 
 /**
  * @author Nils Diewald
- *
- * BooleanFilter implements a simple API for boolean operations
- * on constraints for KorapFilter.
+ * 
+ *         BooleanFilter implements a simple API for boolean
+ *         operations
+ *         on constraints for KorapFilter.
  */
 public class BooleanFilter {
     private String type;
 
     // Logger
-    private final static Logger log = LoggerFactory.getLogger(KrillCollection.class);
+    private final static Logger log = LoggerFactory
+            .getLogger(KrillCollection.class);
 
     // This advices the java compiler to ignore all loggings
     public static final boolean DEBUG = false;
@@ -42,195 +44,160 @@
     private BooleanQuery bool;
     private String error;
 
+
     public BooleanFilter () {
-	bool = new BooleanQuery();
+        bool = new BooleanQuery();
     };
 
+
     public BooleanFilter or (String type, String ... terms) {
-	for (String term : terms) {
+        for (String term : terms) {
 
-	    if (DEBUG)
-		log.trace("Filter: OR {}={}", type, term);
+            if (DEBUG)
+                log.trace("Filter: OR {}={}", type, term);
 
-	    bool.add(
-	        new TermQuery(new Term(type, term)),
-		BooleanClause.Occur.SHOULD
-	    );
-	};
-	return this;
+            bool.add(new TermQuery(new Term(type, term)),
+                    BooleanClause.Occur.SHOULD);
+        };
+        return this;
     };
 
+
     public BooleanFilter or (String type, RegexFilter value) {
-	bool.add(
-          value.toQuery(type),
-          BooleanClause.Occur.SHOULD
-        );
-	return this;
+        bool.add(value.toQuery(type), BooleanClause.Occur.SHOULD);
+        return this;
     };
 
+
     public BooleanFilter or (BooleanFilter bf) {
-	if (bf.bool.clauses().size() == 1) {
-	    BooleanClause bc = bf.bool.getClauses()[0];
-	    bc.setOccur(BooleanClause.Occur.SHOULD);
-	    bool.add(bc);
-	    return this;
-	}
-	bool.add(
- 	    bf.toQuery(),
-	    BooleanClause.Occur.SHOULD
-        );
-	return this;
+        if (bf.bool.clauses().size() == 1) {
+            BooleanClause bc = bf.bool.getClauses()[0];
+            bc.setOccur(BooleanClause.Occur.SHOULD);
+            bool.add(bc);
+            return this;
+        }
+        bool.add(bf.toQuery(), BooleanClause.Occur.SHOULD);
+        return this;
     };
 
+
     public BooleanFilter or (NumericRangeQuery<Integer> nrq) {
-	bool.add(nrq, BooleanClause.Occur.SHOULD);
-	return this;
+        bool.add(nrq, BooleanClause.Occur.SHOULD);
+        return this;
     };
 
+
     public BooleanFilter and (String type, String ... terms) {
-	for (String term : terms) {
-	    bool.add(
-	        new TermQuery(new Term(type, term)),
-		BooleanClause.Occur.MUST
-	    );
-	};
-	return this;
+        for (String term : terms) {
+            bool.add(new TermQuery(new Term(type, term)),
+                    BooleanClause.Occur.MUST);
+        };
+        return this;
     };
 
+
     public BooleanFilter and (String type, RegexFilter value) {
-	bool.add(
-          value.toQuery(type),
-          BooleanClause.Occur.MUST
-        );
-	return this;
+        bool.add(value.toQuery(type), BooleanClause.Occur.MUST);
+        return this;
     };
 
+
     public BooleanFilter and (BooleanFilter bf) {
-	if (bf.bool.clauses().size() == 1) {
-	    BooleanClause bc = bf.bool.getClauses()[0];
-	    bc.setOccur(BooleanClause.Occur.MUST);
-	    bool.add(bc);
-	    return this;
-	}
-	bool.add(
- 	    bf.toQuery(),
-	    BooleanClause.Occur.MUST
-        );
-	return this;
+        if (bf.bool.clauses().size() == 1) {
+            BooleanClause bc = bf.bool.getClauses()[0];
+            bc.setOccur(BooleanClause.Occur.MUST);
+            bool.add(bc);
+            return this;
+        }
+        bool.add(bf.toQuery(), BooleanClause.Occur.MUST);
+        return this;
     };
 
+
     public BooleanFilter since (String dateStr) {
-	int since = new KrillDate(dateStr).floor();
+        int since = new KrillDate(dateStr).floor();
 
-	if (since == 0 || since == KrillDate.BEGINNING)
-	    return this;
+        if (since == 0 || since == KrillDate.BEGINNING)
+            return this;
 
-	bool.add(
-	    NumericRangeQuery.newIntRange(
-	        "pubDate",
-		since,
-		KrillDate.END,
-		true,
-		true
-	    ),
-	    BooleanClause.Occur.MUST
-	);
+        bool.add(NumericRangeQuery.newIntRange("pubDate", since, KrillDate.END,
+                true, true), BooleanClause.Occur.MUST);
 
-	return this;
+        return this;
     };
 
 
     public BooleanFilter till (String dateStr) {
-	try {
-	    int till =  new KrillDate(dateStr).ceil();
-	    if (till == 0 || till == KrillDate.END)
-		return this;
+        try {
+            int till = new KrillDate(dateStr).ceil();
+            if (till == 0 || till == KrillDate.END)
+                return this;
 
-	    bool.add(
-                NumericRangeQuery.newIntRange(
-  	            "pubDate",
-                    KrillDate.BEGINNING,
-                    till,
-                    true,
-                    true
-                ),
-	        BooleanClause.Occur.MUST
-	    );
-	}
-	catch (NumberFormatException e) {
-	    log.warn("Parameter of till(date) is invalid");
-	};
-	return this;
+            bool.add(NumericRangeQuery.newIntRange("pubDate",
+                    KrillDate.BEGINNING, till, true, true),
+                    BooleanClause.Occur.MUST);
+        }
+        catch (NumberFormatException e) {
+            log.warn("Parameter of till(date) is invalid");
+        };
+        return this;
     };
 
 
     public BooleanFilter between (String beginStr, String endStr) {
-	KrillDate beginDF = new KrillDate(beginStr);
+        KrillDate beginDF = new KrillDate(beginStr);
 
-	int begin = beginDF.floor();
+        int begin = beginDF.floor();
 
-	int end = new KrillDate(endStr).ceil();
+        int end = new KrillDate(endStr).ceil();
 
-	if (end == 0)
-	    return this;
+        if (end == 0)
+            return this;
 
-	if (begin == KrillDate.BEGINNING && end == KrillDate.END)
-	    return this;
+        if (begin == KrillDate.BEGINNING && end == KrillDate.END)
+            return this;
 
-	if (begin == end) {
-	    this.and("pubDate", beginDF.toString());
-	    return this;
-	};
+        if (begin == end) {
+            this.and("pubDate", beginDF.toString());
+            return this;
+        };
 
-	this.bool.add(
-	    NumericRangeQuery.newIntRange(
-	        "pubDate",
-		begin,
-		end,
-		true,
-		true
-	    ),
-	    BooleanClause.Occur.MUST
-        );
-	return this;
+        this.bool.add(NumericRangeQuery.newIntRange("pubDate", begin, end,
+                true, true), BooleanClause.Occur.MUST);
+        return this;
     };
 
 
     public BooleanFilter date (String dateStr) {
-	KrillDate dateDF = new KrillDate(dateStr);
+        KrillDate dateDF = new KrillDate(dateStr);
 
-	if (dateDF.year == 0)
-	    return this;
+        if (dateDF.year == 0)
+            return this;
 
-	if (dateDF.day == 0 || dateDF.month == 0) {
-	    int begin = dateDF.floor();
-	    int end = dateDF.ceil();
+        if (dateDF.day == 0 || dateDF.month == 0) {
+            int begin = dateDF.floor();
+            int end = dateDF.ceil();
 
-	    if (end == 0 || (begin == KrillDate.BEGINNING && end == KrillDate.END))
-		return this;
-	    
-	    this.bool.add(
-	        NumericRangeQuery.newIntRange(
-		    "pubDate",
-		    begin,
-		    end,
-		    true,
-		    true
-		),
-		BooleanClause.Occur.MUST
-	    );
-	    return this;
-	};
-	
-	this.and("pubDate", dateDF.toString());
-	return this;
+            if (end == 0
+                    || (begin == KrillDate.BEGINNING && end == KrillDate.END))
+                return this;
+
+            this.bool.add(NumericRangeQuery.newIntRange("pubDate", begin, end,
+                    true, true), BooleanClause.Occur.MUST);
+            return this;
+        };
+
+        this.and("pubDate", dateDF.toString());
+        return this;
     };
 
+
     public Query toQuery () {
-	return this.bool;
+        return this.bool;
     };
 
+
     public String toString () {
-	return this.bool.toString();
+        return this.bool.toString();
     };
 };
diff --git a/src/main/java/de/ids_mannheim/korap/collection/CollectionBuilder.java b/src/main/java/de/ids_mannheim/korap/collection/CollectionBuilder.java
index bc5158c..809165f 100644
--- a/src/main/java/de/ids_mannheim/korap/collection/CollectionBuilder.java
+++ b/src/main/java/de/ids_mannheim/korap/collection/CollectionBuilder.java
@@ -16,9 +16,9 @@
 /**
  * CollectionBuilder implements a simple API for creating queries
  * constituing Virtual Collections.
- *
+ * 
  * <strong>Warning</strong>: The API is likely to change.
- *
+ * 
  * @author diewald
  */
 /*
@@ -31,13 +31,12 @@
     private String field = "tokens";
 
     // Logger
-    private final static Logger log = LoggerFactory.getLogger(
-        CollectionBuilder.class
-    );
+    private final static Logger log = LoggerFactory
+            .getLogger(CollectionBuilder.class);
 
     // This advices the java compiler to ignore all loggings
     public static final boolean DEBUG = false;
-    
+
 
     /**
      * Construct a new CollectionBuilder object.
@@ -45,71 +44,84 @@
     public CollectionBuilder () {
         filter = new BooleanFilter();
     };
-    
+
+
     public BooleanFilter and (String type, String ... terms) {
         BooleanFilter bf = new BooleanFilter();
         bf.and(type, terms);
         return bf;
     };
 
+
     public BooleanFilter or (String type, String ... terms) {
         BooleanFilter bf = new BooleanFilter();
         bf.or(type, terms);
         return bf;
     };
 
+
     public BooleanFilter and (String type, RegexFilter re) {
         BooleanFilter bf = new BooleanFilter();
         bf.and(type, re);
         return bf;
     };
 
+
     public BooleanFilter or (String type, RegexFilter re) {
         BooleanFilter bf = new BooleanFilter();
         bf.or(type, re);
         return bf;
     };
 
+
     public BooleanFilter since (String date) {
         BooleanFilter bf = new BooleanFilter();
         bf.since(date);
         return bf;
     };
 
+
     public BooleanFilter till (String date) {
         BooleanFilter bf = new BooleanFilter();
         bf.till(date);
         return bf;
     };
 
+
     public BooleanFilter date (String date) {
         BooleanFilter bf = new BooleanFilter();
         bf.date(date);
         return bf;
     };
 
+
     public BooleanFilter between (String date1, String date2) {
         BooleanFilter bf = new BooleanFilter();
         bf.between(date1, date2);
         return bf;
     };
 
+
     public RegexFilter re (String regex) {
         return new RegexFilter(regex);
     };
 
-    public BooleanFilter getBooleanFilter ()  {
+
+    public BooleanFilter getBooleanFilter () {
         return this.filter;
     };
 
+
     public void setBooleanFilter (BooleanFilter bf) {
         this.filter = bf;
     };
 
+
     public Query toQuery () {
         return this.filter.toQuery();
     };
 
+
     public String toString () {
         return this.filter.toQuery().toString();
     };
diff --git a/src/main/java/de/ids_mannheim/korap/collection/FilterOperation.java b/src/main/java/de/ids_mannheim/korap/collection/FilterOperation.java
index 8f8b07b..5d3be07 100644
--- a/src/main/java/de/ids_mannheim/korap/collection/FilterOperation.java
+++ b/src/main/java/de/ids_mannheim/korap/collection/FilterOperation.java
@@ -5,35 +5,40 @@
 public class FilterOperation {
     private boolean extension;
     public Filter filter;
-    
+
+
     public FilterOperation (Filter filter, boolean extension) {
-	this.extension = extension;
-	this.filter = filter;
+        this.extension = extension;
+        this.filter = filter;
     };
 
+
     public boolean isExtension () {
-	return this.extension;
+        return this.extension;
     };
 
+
     public boolean isFilter () {
-	return !(this.extension);
+        return !(this.extension);
     };
 
+
     @Override
     public Object clone () throws CloneNotSupportedException {
-	return (Object) new FilterOperation(this.filter, this.extension);
+        return (Object) new FilterOperation(this.filter, this.extension);
     };
 
+
     @Override
     public String toString () {
-	StringBuilder sb = new StringBuilder();
-	if (this.extension) {
-	    sb.append("extend with ");
-	}
-	else {
-	    sb.append("filter with ");
-	};
-	sb.append(this.filter.toString());
-	return sb.toString();
-    };	
+        StringBuilder sb = new StringBuilder();
+        if (this.extension) {
+            sb.append("extend with ");
+        }
+        else {
+            sb.append("filter with ");
+        };
+        sb.append(this.filter.toString());
+        return sb.toString();
+    };
 };
diff --git a/src/main/java/de/ids_mannheim/korap/collection/RegexFilter.java b/src/main/java/de/ids_mannheim/korap/collection/RegexFilter.java
index d86270e..f9d881c 100644
--- a/src/main/java/de/ids_mannheim/korap/collection/RegexFilter.java
+++ b/src/main/java/de/ids_mannheim/korap/collection/RegexFilter.java
@@ -7,22 +7,22 @@
 
 /**
  * @author Nils Diewald
- *
- * RegexFilter implements a helper object for
- * regular expressions used in KorapFilter
- * constraints.
+ * 
+ *         RegexFilter implements a helper object for
+ *         regular expressions used in KorapFilter
+ *         constraints.
  */
 
 public class RegexFilter {
     String regex;
 
+
     public RegexFilter (String regex) {
         this.regex = regex;
     };
 
+
     public RegexpQuery toQuery (String field) {
-        return new RegexpQuery(
-            new Term(field, this.regex)
-        );
+        return new RegexpQuery(new Term(field, this.regex));
     };
 };
diff --git a/src/main/java/de/ids_mannheim/korap/index/AbstractDocument.java b/src/main/java/de/ids_mannheim/korap/index/AbstractDocument.java
index f0e9ddc..c140d1e 100644
--- a/src/main/java/de/ids_mannheim/korap/index/AbstractDocument.java
+++ b/src/main/java/de/ids_mannheim/korap/index/AbstractDocument.java
@@ -16,12 +16,12 @@
 /**
  * Abstract class representing a document in the
  * Krill index.
- *
+ * 
  * This model is rather specific to DeReKo data and
  * should be considered experimental. It may be replaced
  * by a more agnostic model.
  * string fields, e.g. may be combined with a prefix.
- *
+ * 
  * @author diewald
  */
 @JsonIgnoreProperties(ignoreUnknown = true)
@@ -29,53 +29,47 @@
     private String primaryData;
 
     @JsonIgnore
-    public int
-        internalDocID,
-        localDocID,
-        UID;
+    public int internalDocID, localDocID, UID;
 
-    private KrillDate
-        pubDate,
-        // newly added
-        creationDate;
+    private KrillDate pubDate,
+    // newly added
+            creationDate;
 
     private String
 
-        // No longer supported
-        ID,
-        corpusID,
-        field,
-        layerInfo,
-        tokenization,
+    // No longer supported
+            ID,
+            corpusID,
+            field,
+            layerInfo,
+            tokenization,
 
-        // Still supported
-        foundries,
-        textClass,
-        pubPlace,
+            // Still supported
+            foundries,
+            textClass,
+            pubPlace,
 
-        // Newly added for the corpus/doc/text distinction of DeReKo
-        textSigle, docSigle, corpusSigle,
-        title,       subTitle,       author,       editor,
-        docTitle,    docSubTitle,    docAuthor,    docEditor,
-        corpusTitle, corpusSubTitle, corpusAuthor, corpusEditor,
-        textType, textTypeArt, textTypeRef, textColumn, textDomain,
-        fileEditionStatement, biblEditionStatement,
-        publisher,
-        reference,
-        language,
-        license,
-        pages,
-        keywords,
+            // Newly added for the corpus/doc/text distinction of DeReKo
+            textSigle, docSigle, corpusSigle, title, subTitle, author,
+            editor,
+            docTitle, docSubTitle, docAuthor, docEditor,
+            corpusTitle,
+            corpusSubTitle, corpusAuthor, corpusEditor, textType,
+            textTypeArt,
+            textTypeRef, textColumn, textDomain,
+            fileEditionStatement,
+            biblEditionStatement, publisher, reference, language,
+            license,
+            pages, keywords,
 
-        // Meta information regarding annotations
-        tokenSource,
-        layerInfos;
+            // Meta information regarding annotations
+            tokenSource, layerInfos;
 
 
     /**
      * Get the publication date of the document
      * as a {@link KrillDate} object.
-     *
+     * 
      * @return A {@link KrillDate} object for chaining.
      */
     @JsonIgnore
@@ -87,9 +81,9 @@
     /**
      * Get the publication date of the document
      * as a string.
-     *
+     * 
      * @return A string containing the {@link KrillDate}.
-     */    
+     */
     @JsonProperty("pubDate")
     public String getPubDateString () {
         if (this.pubDate != null)
@@ -100,9 +94,10 @@
 
     /**
      * Set the publication date of the document.
-     *
-     * @param date The date as a {@link KrillDate}
-     * compatible string representation.
+     * 
+     * @param date
+     *            The date as a {@link KrillDate} compatible string
+     *            representation.
      * @return A {@link KrillDate} object for chaining.
      */
     public KrillDate setPubDate (String date) {
@@ -113,8 +108,9 @@
 
     /**
      * Set the publication date of the document.
-     *
-     * @param date The date as a {@link KrillDate} object.
+     * 
+     * @param date
+     *            The date as a {@link KrillDate} object.
      * @return A {@link KrillDate} object for chaining.
      */
     public KrillDate setPubDate (KrillDate date) {
@@ -125,7 +121,7 @@
     /**
      * Get the creation date of the document
      * as a {@link KrillDate} object.
-     *
+     * 
      * @return A {@link KrillDate} object for chaining.
      */
     @JsonIgnore
@@ -137,7 +133,7 @@
     /**
      * Get the creation date of the document
      * as a string.
-     *
+     * 
      * @return A string containing the {@link KrillDate}.
      */
     @JsonProperty("creationDate")
@@ -150,9 +146,10 @@
 
     /**
      * Set the creation date of the document.
-     *
-     * @param date The date as a {@link KrillDate}
-     * compatible string representation.
+     * 
+     * @param date
+     *            The date as a {@link KrillDate} compatible string
+     *            representation.
      * @return A {@link KrillDate} object for chaining.
      */
     public KrillDate setCreationDate (String date) {
@@ -163,38 +160,40 @@
 
     /**
      * Set the creation date of the document.
-     *
-     * @param date The date as a {@link KrillDate} object.
+     * 
+     * @param date
+     *            The date as a {@link KrillDate} object.
      * @return A {@link KrillDate} object for chaining.
      */
     public KrillDate setCreationDate (KrillDate date) {
         return (this.creationDate = date);
-    };    
+    };
 
 
     /**
      * Get the name of the author of the document.
-     *
+     * 
      * @return The name of the author as a string.
      */
     public String getAuthor () {
         return this.author;
     };
-        
+
 
     /**
      * Set the name of the author of the document.
-     *
-     * @param author The name of the author as a string.
+     * 
+     * @param author
+     *            The name of the author as a string.
      */
     public void setAuthor (String author) {
         this.author = author;
     };
-    
+
 
     /**
      * Get the text class of the document.
-     *
+     * 
      * @return The text class of the document as a string.
      */
     public String getTextClass () {
@@ -204,8 +203,9 @@
 
     /**
      * Set the text class of the document.
-     *
-     * @param textClass The text class of the document as a string.
+     * 
+     * @param textClass
+     *            The text class of the document as a string.
      */
     public void setTextClass (String textClass) {
         this.textClass = textClass;
@@ -214,39 +214,41 @@
 
     /**
      * Get the publication place of the document.
-     *
+     * 
      * @return The publication place of the document as a string.
      */
     public String getPubPlace () {
         return this.pubPlace;
     };
-    
-    
+
+
     /**
      * Set the publication place of the document.
-     *
-     * @param pubPlace The publication place of the document as a string.
+     * 
+     * @param pubPlace
+     *            The publication place of the document as a string.
      */
     public void setPubPlace (String pubPlace) {
         this.pubPlace = pubPlace;
-    };    
+    };
 
 
     /**
      * Get the unique identifier of the document.
-     *
+     * 
      * @return The unique identifier of the document as an integer.
      */
     @JsonProperty("UID")
     public int getUID () {
         return this.UID;
     };
-    
+
 
     /**
      * Set the unique identifier of the document.
-     *
-     * @param UID The unique identifier of the document as an integer.
+     * 
+     * @param UID
+     *            The unique identifier of the document as an integer.
      * @return The invocant for chaining.
      */
     public void setUID (int UID) {
@@ -256,9 +258,10 @@
 
     /**
      * Set the unique identifier of the document.
-     *
-     * @param UID The unique identifier of the document as a
-     *        string representing an integer.
+     * 
+     * @param UID
+     *            The unique identifier of the document as a
+     *            string representing an integer.
      * @return The invocant for chaining.
      * @throws NumberFormatException
      */
@@ -270,7 +273,7 @@
 
     /**
      * Get the title of the document.
-     *
+     * 
      * @return The title of the document as a string.
      */
     public String getTitle () {
@@ -280,17 +283,18 @@
 
     /**
      * Set the title of the document.
-     *
-     * @param title The title of the document as a string.
+     * 
+     * @param title
+     *            The title of the document as a string.
      */
     public void setTitle (String title) {
         this.title = title;
     };
-    
-        
+
+
     /**
      * Get the subtitle of the document.
-     *
+     * 
      * @return The subtitle of the document as a string.
      */
     public String getSubTitle () {
@@ -300,8 +304,9 @@
 
     /**
      * Set the subtitle of the document.
-     *
-     * @param subTitle The subtitle of the document as a string.
+     * 
+     * @param subTitle
+     *            The subtitle of the document as a string.
      */
     public void setSubTitle (String subTitle) {
         this.subTitle = subTitle;
@@ -310,7 +315,7 @@
 
     /**
      * Get the primary data of the document.
-     *
+     * 
      * @return The primary data of the document as a string.
      */
     public String getPrimaryData () {
@@ -323,9 +328,11 @@
     /**
      * Get the primary data of the document,
      * starting with a given character offset.
-     *
-     * @param startOffset The starting character offset.
-     * @return The substring of primary data of the document as a string.
+     * 
+     * @param startOffset
+     *            The starting character offset.
+     * @return The substring of primary data of the document as a
+     *         string.
      */
     public String getPrimaryData (int startOffset) {
         return this.primaryData.substring(startOffset);
@@ -336,10 +343,13 @@
      * Get the primary data of the document,
      * starting with a given character offset and ending
      * with a given character offset.
-     *
-     * @param startOffset The starting character offset.
-     * @param endOffset The ending character offset.
-     * @return The substring of the primary data of the document as a string.
+     * 
+     * @param startOffset
+     *            The starting character offset.
+     * @param endOffset
+     *            The ending character offset.
+     * @return The substring of the primary data of the document as a
+     *         string.
      */
     public String getPrimaryData (int startOffset, int endOffset) {
         return this.primaryData.substring(startOffset, endOffset);
@@ -348,19 +358,22 @@
 
     /**
      * Set the primary data of the document.
-     *
-     * @param primary The primary data of the document
-     *        as a string.
+     * 
+     * @param primary
+     *            The primary data of the document
+     *            as a string.
      */
     public void setPrimaryData (String primary) {
         this.primaryData = primary;
     };
 
+
     /**
      * Get the length of the primary data of the document
      * (i.e. the number of characters).
-     *
-     * @return The length of the primary data of the document as an integer.
+     * 
+     * @return The length of the primary data of the document as an
+     *         integer.
      */
     @JsonIgnore
     public int getPrimaryDataLength () {
@@ -370,8 +383,8 @@
 
     /**
      * Get information on the foundries the document
-     * is annotated with as a string. 
-     *
+     * is annotated with as a string.
+     * 
      * @return The foundry information string.
      */
     public String getFoundries () {
@@ -381,9 +394,10 @@
 
     /**
      * Set information on the foundries the document
-     * is annotated with. 
-     *
-     * @param foundries The foundry information string.
+     * is annotated with.
+     * 
+     * @param foundries
+     *            The foundry information string.
      */
     public void setFoundries (String foundries) {
         this.foundries = foundries;
@@ -392,8 +406,8 @@
 
     /**
      * Get information on the layers the document
-     * is annotated with as a string. 
-     *
+     * is annotated with as a string.
+     * 
      * @return The layer information string.
      */
     public String getLayerInfos () {
@@ -403,9 +417,10 @@
 
     /**
      * Set information on the layers the document
-     * is annotated with as a string. 
-     *
-     * @param layerInfos The layer information string.
+     * is annotated with as a string.
+     * 
+     * @param layerInfos
+     *            The layer information string.
      */
     public void setLayerInfos (String layerInfos) {
         this.layerInfos = layerInfos;
@@ -414,8 +429,8 @@
 
     // This is the new text id
     /**
-     * Get the text sigle as a string. 
-     *
+     * Get the text sigle as a string.
+     * 
      * @return The text sigle as a string.
      */
     public String getTextSigle () {
@@ -425,9 +440,10 @@
 
     // This is the new text id
     /**
-     * Set the text sigle as a string. 
-     *
-     * @param textSigle The text sigle as a string.
+     * Set the text sigle as a string.
+     * 
+     * @param textSigle
+     *            The text sigle as a string.
      */
     public void setTextSigle (String textSigle) {
         this.textSigle = textSigle;
@@ -436,8 +452,8 @@
 
     // This is the new corpus id
     /**
-     * Get the corpus sigle as a string. 
-     *
+     * Get the corpus sigle as a string.
+     * 
      * @return The corpus sigle as a string.
      */
     public String getCorpusSigle () {
@@ -447,9 +463,10 @@
 
     // This is the new corpus id
     /**
-     * Set the corpus sigle as a string. 
-     *
-     * @param corpusSigle The corpus sigle as a string.
+     * Set the corpus sigle as a string.
+     * 
+     * @param corpusSigle
+     *            The corpus sigle as a string.
      */
     public void setCorpusSigle (String corpusSigle) {
         this.corpusSigle = corpusSigle;
@@ -457,8 +474,8 @@
 
 
     /**
-     * Get the document sigle as a string. 
-     *
+     * Get the document sigle as a string.
+     * 
      * @return The document sigle as a string.
      */
     public String getDocSigle () {
@@ -467,9 +484,10 @@
 
 
     /**
-     * Set the document sigle as a string. 
-     *
-     * @param docSigle The document sigle as a string.
+     * Set the document sigle as a string.
+     * 
+     * @param docSigle
+     *            The document sigle as a string.
      */
     public void setDocSigle (String docSigle) {
         this.docSigle = docSigle;
@@ -477,8 +495,8 @@
 
 
     /**
-     * Get the name of the publisher as a string. 
-     *
+     * Get the name of the publisher as a string.
+     * 
      * @return The name of the publisher as a string.
      */
     public String getPublisher () {
@@ -487,9 +505,10 @@
 
 
     /**
-     * Set the name of the publisher as a string. 
-     *
-     * @param publisher The name of the publisher as a string.
+     * Set the name of the publisher as a string.
+     * 
+     * @param publisher
+     *            The name of the publisher as a string.
      */
     public void setPublisher (String publisher) {
         this.publisher = publisher;
@@ -497,8 +516,8 @@
 
 
     /**
-     * Get the name of the editor as a string. 
-     *
+     * Get the name of the editor as a string.
+     * 
      * @return The name of the editor as a string.
      */
     public String getEditor () {
@@ -507,9 +526,10 @@
 
 
     /**
-     * Set the name of the editor as a string. 
-     *
-     * @param editor The name of the editor as a string.
+     * Set the name of the editor as a string.
+     * 
+     * @param editor
+     *            The name of the editor as a string.
      */
     public void setEditor (String editor) {
         this.editor = editor;
@@ -517,8 +537,8 @@
 
 
     /**
-     * Get the type of the text as a string. 
-     *
+     * Get the type of the text as a string.
+     * 
      * @return The type of the text as a string.
      */
     public String getTextType () {
@@ -527,9 +547,10 @@
 
 
     /**
-     * Set the type of the text as a string. 
-     *
-     * @param textType The type of the text as a string.
+     * Set the type of the text as a string.
+     * 
+     * @param textType
+     *            The type of the text as a string.
      */
     public void setTextType (String textType) {
         this.textType = textType;
@@ -537,8 +558,8 @@
 
 
     /**
-     * Get the type art of the text as a string. 
-     *
+     * Get the type art of the text as a string.
+     * 
      * @return The type art of the text as a string.
      */
     public String getTextTypeArt () {
@@ -547,9 +568,10 @@
 
 
     /**
-     * Set the type art of the text as a string. 
-     *
-     * @param textTypeArt The type art of the text as a string.
+     * Set the type art of the text as a string.
+     * 
+     * @param textTypeArt
+     *            The type art of the text as a string.
      */
     public void setTextTypeArt (String textTypeArt) {
         this.textTypeArt = textTypeArt;
@@ -557,9 +579,10 @@
 
 
     /**
-     * Set the type reference of the text as a string. 
-     *
-     * @param textTypeRef The type reference of the text as a string.
+     * Set the type reference of the text as a string.
+     * 
+     * @param textTypeRef
+     *            The type reference of the text as a string.
      */
     public void setTextTypeRef (String textTypeRef) {
         this.textTypeRef = textTypeRef;
@@ -567,8 +590,8 @@
 
 
     /**
-     * Get the type reference of the text as a string. 
-     *
+     * Get the type reference of the text as a string.
+     * 
      * @return The type reference of the text as a string.
      */
     public String getTextTypeRef () {
@@ -577,8 +600,8 @@
 
 
     /**
-     * Get the column of the text as a string. 
-     *
+     * Get the column of the text as a string.
+     * 
      * @return The column of the text as a string.
      */
     public String getTextColumn () {
@@ -587,9 +610,10 @@
 
 
     /**
-     * Set the column of the text as a string. 
-     *
-     * @param textColumn The column of the text as a string.
+     * Set the column of the text as a string.
+     * 
+     * @param textColumn
+     *            The column of the text as a string.
      */
     public void setTextColumn (String textColumn) {
         this.textColumn = textColumn;
@@ -597,8 +621,8 @@
 
 
     /**
-     * Get the domain of the text as a string. 
-     *
+     * Get the domain of the text as a string.
+     * 
      * @return The domain of the text as a string.
      */
     public String getTextDomain () {
@@ -607,9 +631,10 @@
 
 
     /**
-     * Set the domain of the text as a string. 
-     *
-     * @param textDomain The domain of the text as a string.
+     * Set the domain of the text as a string.
+     * 
+     * @param textDomain
+     *            The domain of the text as a string.
      */
     public void setTextDomain (String textDomain) {
         this.textDomain = textDomain;
@@ -617,8 +642,8 @@
 
 
     /**
-     * Get the license of the text as a string. 
-     *
+     * Get the license of the text as a string.
+     * 
      * @return The license of the text as a string.
      */
     public String getLicense () {
@@ -627,9 +652,10 @@
 
 
     /**
-     * Set the license of the text as a string. 
-     *
-     * @param license The license of the text as a string.
+     * Set the license of the text as a string.
+     * 
+     * @param license
+     *            The license of the text as a string.
      */
     public void setLicense (String license) {
         this.license = license;
@@ -637,8 +663,8 @@
 
 
     /**
-     * Get the page numbers of the text as a string. 
-     *
+     * Get the page numbers of the text as a string.
+     * 
      * @return The page numbers of the text as a string.
      */
     public String getPages () {
@@ -647,9 +673,10 @@
 
 
     /**
-     * Set the page numbers of the text as a string. 
-     *
-     * @param pages The page numbers of the text as a string.
+     * Set the page numbers of the text as a string.
+     * 
+     * @param pages
+     *            The page numbers of the text as a string.
      */
     public void setPages (String pages) {
         this.pages = pages;
@@ -657,8 +684,8 @@
 
 
     /**
-     * Get the file edition statement of the text as a string. 
-     *
+     * Get the file edition statement of the text as a string.
+     * 
      * @return The file edition statement of the text as a string.
      */
     public String getFileEditionStatement () {
@@ -667,10 +694,11 @@
 
 
     /**
-     * Set the file edition statement of the text as a string. 
-     *
-     * @param fileEditionStatement The file edition statement
-     *        of the text as a string.
+     * Set the file edition statement of the text as a string.
+     * 
+     * @param fileEditionStatement
+     *            The file edition statement
+     *            of the text as a string.
      */
     public void setFileEditionStatement (String fileEditionStatement) {
         this.fileEditionStatement = fileEditionStatement;
@@ -678,9 +706,10 @@
 
 
     /**
-     * Get the bibliograhic edition statement of the text as a string. 
-     *
-     * @return The bibliograhic edition statement of the text as a string.
+     * Get the bibliograhic edition statement of the text as a string.
+     * 
+     * @return The bibliograhic edition statement of the text as a
+     *         string.
      */
     public String getBiblEditionStatement () {
         return this.biblEditionStatement;
@@ -688,10 +717,11 @@
 
 
     /**
-     * Set the bibliograhic edition statement of the text as a string. 
-     *
-     * @param biblEditionStatement The bibliograhic edition statement
-     *        of the text as a string.
+     * Set the bibliograhic edition statement of the text as a string.
+     * 
+     * @param biblEditionStatement
+     *            The bibliograhic edition statement
+     *            of the text as a string.
      */
     public void setBiblEditionStatement (String biblEditionStatement) {
         this.biblEditionStatement = biblEditionStatement;
@@ -699,8 +729,8 @@
 
 
     /**
-     * Get the reference of the text as a string. 
-     *
+     * Get the reference of the text as a string.
+     * 
      * @return The reference of the text as a string.
      */
     public String getReference () {
@@ -709,9 +739,10 @@
 
 
     /**
-     * Set the reference of the text as a string. 
-     *
-     * @param reference The reference of the text as a string.
+     * Set the reference of the text as a string.
+     * 
+     * @param reference
+     *            The reference of the text as a string.
      */
     public void setReference (String reference) {
         this.reference = reference;
@@ -719,8 +750,8 @@
 
 
     /**
-     * Get the language of the text as a string. 
-     *
+     * Get the language of the text as a string.
+     * 
      * @return The language of the text as a string.
      */
     public String getLanguage () {
@@ -729,9 +760,10 @@
 
 
     /**
-     * Set the language of the text as a string. 
-     *
-     * @param language The language of the text as a string.
+     * Set the language of the text as a string.
+     * 
+     * @param language
+     *            The language of the text as a string.
      */
     public void setLanguage (String language) {
         this.language = language;
@@ -739,8 +771,8 @@
 
 
     /**
-     * Get the corpus title of the text as a string. 
-     *
+     * Get the corpus title of the text as a string.
+     * 
      * @return The corpus title of the text as a string.
      */
     public String getCorpusTitle () {
@@ -749,9 +781,10 @@
 
 
     /**
-     * Set the corpus title of the text as a string. 
-     *
-     * @param corpusTitle The corpus title of the text as a string.
+     * Set the corpus title of the text as a string.
+     * 
+     * @param corpusTitle
+     *            The corpus title of the text as a string.
      */
     public void setCorpusTitle (String corpusTitle) {
         this.corpusTitle = corpusTitle;
@@ -759,8 +792,8 @@
 
 
     /**
-     * Get the corpus subtitle of the text as a string. 
-     *
+     * Get the corpus subtitle of the text as a string.
+     * 
      * @return The corpus subtitle of the text as a string.
      */
     public String getCorpusSubTitle () {
@@ -769,10 +802,11 @@
 
 
     /**
-     * Set the corpus subtitle of the text as a string. 
-     *
-     * @param corpusSubTitle The corpus subtitle of the
-     *        text as a string.
+     * Set the corpus subtitle of the text as a string.
+     * 
+     * @param corpusSubTitle
+     *            The corpus subtitle of the
+     *            text as a string.
      */
     public void setCorpusSubTitle (String corpusSubTitle) {
         this.corpusSubTitle = corpusSubTitle;
@@ -780,8 +814,8 @@
 
 
     /**
-     * Get the corpus author of the text as a string. 
-     *
+     * Get the corpus author of the text as a string.
+     * 
      * @return The corpus author of the text as a string.
      */
     public String getCorpusAuthor () {
@@ -790,8 +824,8 @@
 
 
     /**
-     * Set the corpus author of the text as a string. 
-     *
+     * Set the corpus author of the text as a string.
+     * 
      * @return The corpus author of the text as a string.
      */
     public void setCorpusAuthor (String corpusAuthor) {
@@ -800,8 +834,8 @@
 
 
     /**
-     * Get the corpus editor of the text as a string. 
-     *
+     * Get the corpus editor of the text as a string.
+     * 
      * @return The corpus editor of the text as a string.
      */
     public String getCorpusEditor () {
@@ -810,9 +844,10 @@
 
 
     /**
-     * Set the corpus editor of the text as a string. 
-     *
-     * @param corpusEditor The corpus editor of the text as a string.
+     * Set the corpus editor of the text as a string.
+     * 
+     * @param corpusEditor
+     *            The corpus editor of the text as a string.
      */
     public void setCorpusEditor (String corpusEditor) {
         this.corpusEditor = corpusEditor;
@@ -820,18 +855,20 @@
 
 
     /**
-     * Get the document title of the text as a string. 
-     *
+     * Get the document title of the text as a string.
+     * 
      * @return The document title of the text as a string.
      */
     public String getDocTitle () {
         return this.docTitle;
     };
 
+
     /**
-     * Set the document title of the text as a string. 
-     *
-     * @param docTitle The document title of the text as a string.
+     * Set the document title of the text as a string.
+     * 
+     * @param docTitle
+     *            The document title of the text as a string.
      */
     public void setDocTitle (String docTitle) {
         this.docTitle = docTitle;
@@ -839,8 +876,8 @@
 
 
     /**
-     * Get the subtitle of the document of the text as a string. 
-     *
+     * Get the subtitle of the document of the text as a string.
+     * 
      * @return The subtitle of the document of the text as a string.
      */
     public String getDocSubTitle () {
@@ -849,10 +886,11 @@
 
 
     /**
-     * Set the subtitle of the document of the text as a string. 
-     *
-     * @param docSubTitle The subtitle of the document of the
-     *        text as a string.
+     * Set the subtitle of the document of the text as a string.
+     * 
+     * @param docSubTitle
+     *            The subtitle of the document of the
+     *            text as a string.
      */
     public void setDocSubTitle (String docSubTitle) {
         this.docSubTitle = docSubTitle;
@@ -860,8 +898,8 @@
 
 
     /**
-     * Get the author of the document of the text as a string. 
-     *
+     * Get the author of the document of the text as a string.
+     * 
      * @return The author of the document of the text as a string.
      */
     public String getDocAuthor () {
@@ -870,9 +908,10 @@
 
 
     /**
-     * Set the author of the document of the text as a string. 
-     *
-     * @param docAuthor The author of the document of the text as a string.
+     * Set the author of the document of the text as a string.
+     * 
+     * @param docAuthor
+     *            The author of the document of the text as a string.
      */
     public void setDocAuthor (String docAuthor) {
         this.docAuthor = docAuthor;
@@ -880,8 +919,8 @@
 
 
     /**
-     * Get the editor of the document of the text as a string. 
-     *
+     * Get the editor of the document of the text as a string.
+     * 
      * @return The editor of the document of the text as a string.
      */
     public String getDocEditor () {
@@ -890,9 +929,10 @@
 
 
     /**
-     * Set the editor of the document of the text as a string. 
-     *
-     * @param docEditor The editor of the document of the text as a string.
+     * Set the editor of the document of the text as a string.
+     * 
+     * @param docEditor
+     *            The editor of the document of the text as a string.
      */
     public void setDocEditor (String docEditor) {
         this.docEditor = docEditor;
@@ -900,8 +940,8 @@
 
 
     /**
-     * Get the keywords of the text as a string. 
-     *
+     * Get the keywords of the text as a string.
+     * 
      * @return The keywords of the text as a string.
      */
     public String getKeywords () {
@@ -910,9 +950,10 @@
 
 
     /**
-     * Set the keywords of the text as a string. 
-     *
-     * @param keywords The keywords of the text as a string.
+     * Set the keywords of the text as a string.
+     * 
+     * @param keywords
+     *            The keywords of the text as a string.
      */
     public void setKeywords (String keywords) {
         this.keywords = keywords;
@@ -921,8 +962,8 @@
 
     /**
      * Get information about the source of tokenization
-     * as a string. 
-     *
+     * as a string.
+     * 
      * @return The tokenization information as a string.
      */
     public String getTokenSource () {
@@ -932,9 +973,10 @@
 
     /**
      * Set information about the source of tokenization
-     * as a string. 
-     *
-     * @param tokenSource The tokenization information as a string.
+     * as a string.
+     * 
+     * @param tokenSource
+     *            The tokenization information as a string.
      */
     public void setTokenSource (String tokenSource) {
         this.tokenSource = tokenSource;
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 70d183f..dc16ccf 100644
--- a/src/main/java/de/ids_mannheim/korap/index/FieldDocument.java
+++ b/src/main/java/de/ids_mannheim/korap/index/FieldDocument.java
@@ -30,7 +30,7 @@
  * FieldDocument represents a simple API to create documents
  * for storing with KrillIndex. <i>Field</i> in the name resembles
  * the meaning of Lucene index fields.
- *
+ * 
  * @author diewald
  */
 @JsonIgnoreProperties(ignoreUnknown = true)
@@ -40,9 +40,9 @@
 
     public Document doc = new Document();
 
-    private FieldType tvField   = new FieldType(TextField.TYPE_STORED);
+    private FieldType tvField = new FieldType(TextField.TYPE_STORED);
     private FieldType tvNoField = new FieldType(TextField.TYPE_NOT_STORED);
-    private FieldType keywords  = new FieldType(TextField.TYPE_STORED);
+    private FieldType keywords = new FieldType(TextField.TYPE_STORED);
 
     {
         tvField.setStoreTermVectors(true);
@@ -62,71 +62,86 @@
         keywords.setIndexOptions(IndexOptions.DOCS_ONLY);
     };
 
+
     // see http://www.cowtowncoder.com/blog/archives/2011/07/entry_457.html
 
     public void addInt (String key, int value) {
         doc.add(new IntField(key, value, Field.Store.YES));
     };
 
+
     public void addInt (String key, String value) {
         this.addInt(key, Integer.parseInt(value));
     };
 
+
     public void addText (String key, String value) {
         doc.add(new TextField(key, value, Field.Store.YES));
     };
 
+
     public void addKeyword (String key, String value) {
         doc.add(new Field(key, value, keywords));
     };
 
+
     public void addString (String key, String value) {
         doc.add(new StringField(key, value, Field.Store.YES));
     };
 
+
     public void addStored (String key, String value) {
         doc.add(new StoredField(key, value));
     };
 
+
     public void addStored (String key, int value) {
         doc.add(new StoredField(key, value));
     };
 
+
     public void addTV (String key, String value, String tsString) {
         this.addTV(key, value, new MultiTermTokenStream(tsString));
     };
 
+
     public void addTV (String key, String tsString) {
         this.addTV(key, new MultiTermTokenStream(tsString));
     };
 
+
     public void addTV (String key, String value, MultiTermTokenStream ts) {
-        Field textField = new Field( key, value, tvField );
-        textField.setTokenStream( ts );
+        Field textField = new Field(key, value, tvField);
+        textField.setTokenStream(ts);
         doc.add(textField);
     };
 
+
     public void addTV (String key, MultiTermTokenStream ts) {
-        Field textField = new Field( key, ts, tvNoField );
+        Field textField = new Field(key, ts, tvNoField);
         doc.add(textField);
     };
 
+
     public String toString () {
         return doc.toString();
     };
 
+
     public MultiTermTokenStream newMultiTermTokenStream (String ts) {
         return new MultiTermTokenStream(ts);
     };
 
+
     public MultiTermTokenStream newMultiTermTokenStream () {
         return new MultiTermTokenStream();
     };
 
+
     /**
      * Deserialize token stream data.
      */
-    public void setData (Map<String,Object> node) {
+    public void setData (Map<String, Object> node) {
         this.setPrimaryData((String) node.get("text"));
 
         String fieldName = (String) node.get("name");
@@ -134,7 +149,8 @@
         MultiTermTokenStream mtts = this.newMultiTermTokenStream();
 
         // Iterate over all tokens in stream
-        for (ArrayList<String> token : (ArrayList<ArrayList<String>>) node.get("stream")) {
+        for (ArrayList<String> token : (ArrayList<ArrayList<String>>) node
+                .get("stream")) {
 
             try {
                 // Initialize MultiTermToken
@@ -143,7 +159,7 @@
                 // Add rest of the list
                 for (String term : token) {
                     mtt.add(term);
-                 };
+                };
 
                 // Add MultiTermToken to stream
                 mtts.addMultiTermToken(mtt);
@@ -170,20 +186,22 @@
             this.setTokenSource((String) node.get("tokenSource"));
     };
 
+
     /**
      * Deserialize token stream data (LEGACY).
      */
     public void setFields (ArrayList<Map<String, Object>> fields) {
-        
-        Map<String,Object> primary = fields.remove(0);
+
+        Map<String, Object> primary = fields.remove(0);
         this.setPrimaryData((String) primary.get("primaryData"));
 
-        for (Map<String,Object> field : fields) {
+        for (Map<String, Object> field : fields) {
 
             String fieldName = (String) field.get("name");
             MultiTermTokenStream mtts = this.newMultiTermTokenStream();
 
-            for (ArrayList<String> token : (ArrayList<ArrayList<String>>) field.get("data")) {
+            for (ArrayList<String> token : (ArrayList<ArrayList<String>>) field
+                    .get("data")) {
 
                 try {
                     MultiTermToken mtt = new MultiTermToken(token.remove(0));
@@ -219,36 +237,42 @@
         };
     };
 
+
     @Override
     public void setTextClass (String textClass) {
         super.setTextClass(textClass);
         this.addKeyword("textClass", textClass);
     };
 
+
     @Override
     public void setTitle (String title) {
         super.setTitle(title);
         this.addText("title", title);
     };
 
+
     @Override
     public void setSubTitle (String subTitle) {
         super.setSubTitle(subTitle);
         this.addText("subTitle", subTitle);
     };
 
+
     @Override
     public void setAuthor (String author) {
         super.setAuthor(author);
         this.addText("author", author);
     };
 
+
     @Override
     public void setPubPlace (String pubPlace) {
         super.setPubPlace(pubPlace);
         this.addString("pubPlace", pubPlace);
     };
 
+
     @JsonProperty("pubDate")
     @Override
     public KrillDate setPubDate (String pubDate) {
@@ -257,6 +281,7 @@
         return date;
     };
 
+
     @JsonProperty("creationDate")
     @Override
     public KrillDate setCreationDate (String creationDate) {
@@ -265,6 +290,7 @@
         return date;
     };
 
+
     // No longer supported
     @Override
     public void setCorpusID (String corpusID) {
@@ -272,6 +298,7 @@
         this.addString("corpusID", corpusID);
     };
 
+
     // No longer supported
     @Override
     public void setID (String ID) {
@@ -279,12 +306,14 @@
         this.addString("ID", ID);
     };
 
+
     @Override
     public void setUID (int ID) {
         super.setUID(ID);
         this.addString("UID", new Integer(ID).toString());
     };
 
+
     // No longer supported
     @Override
     public void setLayerInfo (String layerInfo) {
@@ -292,168 +321,196 @@
         this.addStored("layerInfo", layerInfo);
     };
 
+
     @Override
     public void setLayerInfos (String layerInfos) {
         super.setLayerInfos(layerInfos);
         this.addStored("layerInfos", layerInfos);
     };
 
+
     @Override
     public void setTextSigle (String textSigle) {
         super.setTextSigle(textSigle);
         this.addString("textSigle", textSigle);
     };
 
+
     @Override
     public void setDocSigle (String docSigle) {
         super.setDocSigle(docSigle);
         this.addString("docSigle", docSigle);
     };
 
+
     @Override
     public void setCorpusSigle (String corpusSigle) {
         super.setCorpusSigle(corpusSigle);
         this.addString("corpusSigle", corpusSigle);
     };
 
+
     @Override
     public void setPublisher (String publisher) {
         super.setPublisher(publisher);
         this.addStored("publisher", publisher);
     };
 
+
     @Override
     public void setEditor (String editor) {
         super.setEditor(editor);
         this.addStored("editor", editor);
     };
 
+
     @Override
     public void setTextType (String textType) {
         super.setTextType(textType);
         this.addString("textType", textType);
     };
 
+
     @Override
     public void setTextTypeArt (String textTypeArt) {
         super.setTextTypeArt(textTypeArt);
         this.addString("textTypeArt", textTypeArt);
     };
 
+
     @Override
     public void setTextTypeRef (String textTypeRef) {
         super.setTextTypeRef(textTypeRef);
         this.addString("textTypeRef", textTypeRef);
     };
 
+
     @Override
     public void setTextColumn (String textColumn) {
         super.setTextColumn(textColumn);
         this.addString("textColumn", textColumn);
     };
 
+
     @Override
     public void setTextDomain (String textDomain) {
         super.setTextDomain(textDomain);
         this.addString("textDomain", textDomain);
     };
 
+
     @Override
     public void setLicense (String license) {
         super.setLicense(license);
         this.addString("license", license);
     };
 
+
     @Override
     public void setPages (String pages) {
         super.setPages(pages);
         this.addStored("pages", pages);
     };
 
+
     @Override
     public void setFileEditionStatement (String fileEditionStatement) {
         super.setFileEditionStatement(fileEditionStatement);
         this.addStored("fileEditionStatement", fileEditionStatement);
     };
 
+
     @Override
     public void setBiblEditionStatement (String biblEditionStatement) {
         super.setBiblEditionStatement(biblEditionStatement);
         this.addStored("biblEditionStatement", biblEditionStatement);
     };
 
+
     @Override
     public void setReference (String reference) {
         super.setReference(reference);
         this.addStored("reference", reference);
     };
 
+
     @Override
     public void setLanguage (String language) {
         super.setLanguage(language);
         this.addString("language", language);
     };
 
+
     @Override
     public void setDocTitle (String docTitle) {
         super.setDocTitle(docTitle);
         this.addText("docTitle", docTitle);
     };
 
+
     @Override
     public void setDocSubTitle (String docSubTitle) {
         super.setDocSubTitle(docSubTitle);
         this.addText("docSubTitle", docSubTitle);
     };
 
+
     @Override
     public void setDocAuthor (String docAuthor) {
         super.setDocAuthor(docAuthor);
         this.addText("docAuthor", docAuthor);
     };
 
+
     @Override
     public void setDocEditor (String docEditor) {
         super.setDocEditor(docEditor);
         this.addStored("docEditor", docEditor);
     };
 
+
     @Override
     public void setCorpusTitle (String corpusTitle) {
         super.setCorpusTitle(corpusTitle);
         this.addText("corpusTitle", corpusTitle);
     };
 
+
     @Override
     public void setCorpusSubTitle (String corpusSubTitle) {
         super.setCorpusSubTitle(corpusSubTitle);
         this.addText("corpusSubTitle", corpusSubTitle);
     };
 
+
     @Override
     public void setCorpusAuthor (String corpusAuthor) {
         super.setCorpusAuthor(corpusAuthor);
         this.addText("corpusAuthor", corpusAuthor);
     };
 
+
     @Override
     public void setCorpusEditor (String corpusEditor) {
         super.setCorpusEditor(corpusEditor);
         this.addStored("corpusEditor", corpusEditor);
     };
 
+
     @Override
     public void setKeywords (String keywords) {
         super.setKeywords(keywords);
         this.addKeyword("keywords", keywords);
     };
 
+
     @Override
     public void setTokenSource (String tokenSource) {
         super.setTokenSource(tokenSource);
         this.addStored("tokenSource", tokenSource);
     };
 
+
     @Override
     public void setFoundries (String foundries) {
         super.setFoundries(foundries);
diff --git a/src/main/java/de/ids_mannheim/korap/index/Indexer.java b/src/main/java/de/ids_mannheim/korap/index/Indexer.java
index 5af92e5..6eb8099 100644
--- a/src/main/java/de/ids_mannheim/korap/index/Indexer.java
+++ b/src/main/java/de/ids_mannheim/korap/index/Indexer.java
@@ -1,4 +1,5 @@
 package de.ids_mannheim.korap.index;
+
 import java.util.*;
 import java.io.*;
 import org.apache.lucene.store.MMapDirectory;
@@ -12,7 +13,7 @@
  * is using the standalone server system,
  * this tool may be more suitable for your needs
  * (especially as it is way faster).
- *
+ * 
  * Usage: java -jar Krill-X.XX.jar [propfile] [directories]*
  */
 public class Indexer {
@@ -22,25 +23,26 @@
     int commitCount;
 
     // Init logger
-    private final static Logger log =
-        LoggerFactory.getLogger(KrillIndex.class);
+    private final static Logger log = LoggerFactory.getLogger(KrillIndex.class);
 
 
     /**
      * Construct a new indexer object.
-     *
-     * @param prop A {@link Properties} object with
-     *        at least the following information:
-     *        <tt>krill.indexDir</tt>.
+     * 
+     * @param prop
+     *            A {@link Properties} object with
+     *            at least the following information:
+     *            <tt>krill.indexDir</tt>.
      * @throws IOException
      */
     public Indexer (Properties prop) throws IOException {
         this.indexDir = prop.getProperty("krill.indexDir");
 
         System.out.println("Index to " + this.indexDir);
-	
+
         // Default to 1000 documents till the next commit
-        String commitCount = prop.getProperty("krill.index.commit.count", "1000");
+        String commitCount = prop.getProperty("krill.index.commit.count",
+                "1000");
 
         // Create a new index object based on the directory
         this.index = new KrillIndex(new MMapDirectory(new File(indexDir)));
@@ -48,11 +50,13 @@
         this.commitCount = Integer.parseInt(commitCount);
     };
 
+
     /**
      * Parse a directory for document files.
-     *
-     * @param dir The {@link File} directory containing
-     * documents to index.
+     * 
+     * @param dir
+     *            The {@link File} directory containing
+     *            documents to index.
      */
     public void parse (File dir) {
         for (String file : dir.list()) {
@@ -80,6 +84,7 @@
         };
     };
 
+
     /**
      * Commit changes to the index.
      */
@@ -95,12 +100,14 @@
         System.out.println("done.");
     };
 
+
     /**
      * Main method.
-     *
-     * @param argv Argument list,
-     *        expecting the properties file
-     *        and a list of directories
+     * 
+     * @param argv
+     *            Argument list,
+     *            expecting the properties file
+     *            and a list of directories
      * @throws IOException
      */
     public static void main (String[] argv) throws IOException {
@@ -110,11 +117,9 @@
         if (argv.length < 2) {
 
             String jar = new File(Indexer.class.getProtectionDomain()
-                                  .getCodeSource()
-                                  .getLocation()
-                                  .getPath()).getName();
-            System.out.println("Usage: java -jar " + jar +
-                               " [propfile] [directories]*");
+                    .getCodeSource().getLocation().getPath()).getName();
+            System.out.println("Usage: java -jar " + jar
+                    + " [propfile] [directories]*");
             return;
         };
 
@@ -129,7 +134,7 @@
         System.out.println();
 
         // Iterate over list of directories
-        for (String arg :  Arrays.copyOfRange(argv, 1, argv.length)) {
+        for (String arg : Arrays.copyOfRange(argv, 1, argv.length)) {
             File f = new File(arg);
             if (f.isDirectory())
                 ki.parse(f);
diff --git a/src/main/java/de/ids_mannheim/korap/index/MultiTerm.java b/src/main/java/de/ids_mannheim/korap/index/MultiTerm.java
index 33a81cf..1f74f93 100644
--- a/src/main/java/de/ids_mannheim/korap/index/MultiTerm.java
+++ b/src/main/java/de/ids_mannheim/korap/index/MultiTerm.java
@@ -13,30 +13,36 @@
  * Don't use ByteBuffer!
  */
 /**
- * A MultiTerm represents a single term (e.g. a word, an annotation, a relation)
+ * A MultiTerm represents a single term (e.g. a word, an annotation, a
+ * relation)
  * that can be part of a MultiTermToken.
- *
- * A MultiTerm consists of a term representation string, optional character offset
- * information that matches the term to the character stream of the input text,
+ * 
+ * A MultiTerm consists of a term representation string, optional
+ * character offset
+ * information that matches the term to the character stream of the
+ * input text,
  * and an arbitrary payload.
- *
+ * 
  * There is a simple string representation of MultiTerms supported:
  * The string is the first sequence of characters.
- * Offsets are written as an appended and dash separated pair of integers.
+ * Offsets are written as an appended and dash separated pair of
+ * integers.
  * Payloads are written following a dollar sign.
- * Payload segments can be typed as being a short (s), an integer (i), or a long (l)
+ * Payload segments can be typed as being a short (s), an integer (i),
+ * or a long (l)
  * value in leading angular brackets.
- * All other (untyped) payloads are treated as being UTF-8 characer sequences.
- *
+ * All other (untyped) payloads are treated as being UTF-8 characer
+ * sequences.
+ * 
  * <blockquote><pre>
- *   MultiTerm test1 = new MultiTerm("test");
- *   MultiTerm test2 = new MultiTerm("test#0-4");
- *   MultiTerm test3 = new MultiTerm("test#0-4$Example");
- *   MultiTerm test4 = new MultiTerm("test#0-4$&lt;i&gt;1278");
+ * MultiTerm test1 = new MultiTerm("test");
+ * MultiTerm test2 = new MultiTerm("test#0-4");
+ * MultiTerm test3 = new MultiTerm("test#0-4$Example");
+ * MultiTerm test4 = new MultiTerm("test#0-4$&lt;i&gt;1278");
  * </pre></blockquote>
- *
+ * 
  * <strong>Warning</strong>: Strings that are malformed fail silently!
- *
+ * 
  * @author diewald
  */
 public class MultiTerm implements Comparable<MultiTerm> {
@@ -52,7 +58,8 @@
 
     // This advices the java compiler to ignore all loggings
     public static final boolean DEBUG = false;
-    private final Logger log = LoggerFactory.getLogger(MultiTermTokenStream.class);
+    private final Logger log = LoggerFactory
+            .getLogger(MultiTermTokenStream.class);
 
 
     /**
@@ -65,28 +72,31 @@
 
     /**
      * Construct a new MultiTerm object.
-     *
-     * @param term The term surface (see synopsis).
+     * 
+     * @param term
+     *            The term surface (see synopsis).
      */
     public MultiTerm (String term) throws CorpusDataException {
         _fromString(term);
     };
 
-    
+
     /**
      * Construct a new MultiTerm object.
-     *
+     * 
      * In addition to the normal surface representation,
      * this supports a prefix notation.
      * The following expressions are equal:
-     *
+     * 
      * <blockquote><pre>
-     *   MultiTerm test1 = new MultiTerm('a', "bcd");
-     *   MultiTerm test2 = new MultiTerm("a:bcd");
+     * MultiTerm test1 = new MultiTerm('a', "bcd");
+     * MultiTerm test2 = new MultiTerm("a:bcd");
      * </pre></blockquote>
-     *
-     * @param prefix A special prefix for the term.
-     * @param term The term surface (see synopsis).
+     * 
+     * @param prefix
+     *            A special prefix for the term.
+     * @param term
+     *            The term surface (see synopsis).
      */
     public MultiTerm (char prefix, String term) throws CorpusDataException {
         StringBuilder sb = new StringBuilder();
@@ -96,18 +106,19 @@
 
     /**
      * Get the term value of the MultiTerm.
-     *
+     * 
      * @return The term as a string.
      */
     public String getTerm () {
         return this.term;
     };
-    
-    
+
+
     /**
      * Set the term value of the MultiTerm.
-     *
-     * @param term The term as a string.
+     * 
+     * @param term
+     *            The term as a string.
      * @return The {@link MultIterm} object for chaining.
      */
     public MultiTerm setTerm (String term) {
@@ -118,66 +129,71 @@
 
     /**
      * Get the payload.
-     *
+     * 
      * @return The payload as a BytesRef.
      */
     public BytesRef getPayload () {
         return this.payload;
     };
 
-    
+
     /**
      * Set the payload as a {@link Byte} value.
-     *
-     * @param pl The payload.
+     * 
+     * @param pl
+     *            The payload.
      * @return The {@link MultiTerm} object for chaining.
      */
     public MultiTerm setPayload (Byte pl) {
-        this.payload = new BytesRef( ByteBuffer.allocate(1).put(pl).array());
+        this.payload = new BytesRef(ByteBuffer.allocate(1).put(pl).array());
         return this;
     };
 
-    
+
     /**
      * Set the payload as a short value.
-     *
-     * @param pl The payload.
+     * 
+     * @param pl
+     *            The payload.
      * @return The {@link MultiTerm} object for chaining.
      */
     public MultiTerm setPayload (short pl) {
-        this.payload = new BytesRef( ByteBuffer.allocate(2).putShort(pl).array());
+        this.payload = new BytesRef(ByteBuffer.allocate(2).putShort(pl).array());
         return this;
     };
 
 
     /**
      * Set the payload as an integer value.
-     *
-     * @param pl The payload.
+     * 
+     * @param pl
+     *            The payload.
      * @return The {@link MultiTerm} object for chaining.
      */
     public MultiTerm setPayload (int pl) {
-        this.payload = new BytesRef( ByteBuffer.allocate(4).putInt(pl).array());
+        this.payload = new BytesRef(ByteBuffer.allocate(4).putInt(pl).array());
         return this;
     };
 
-    
+
     /**
      * Set the payload as a long value.
-     *
-     * @param pl The payload.
+     * 
+     * @param pl
+     *            The payload.
      * @return The {@link MultiTerm} object for chaining.
      */
     public MultiTerm setPayload (long pl) {
-        this.payload = new BytesRef( ByteBuffer.allocate(8).putLong(pl).array());
+        this.payload = new BytesRef(ByteBuffer.allocate(8).putLong(pl).array());
         return this;
     };
 
 
     /**
      * Set the payload as a string value.
-     *
-     * @param pl The payload.
+     * 
+     * @param pl
+     *            The payload.
      * @return The {@link MultiTerm} object for chaining.
      */
     public MultiTerm setPayload (String pl) {
@@ -188,8 +204,9 @@
 
     /**
      * Set the payload as a byte array.
-     *
-     * @param pl The payload.
+     * 
+     * @param pl
+     *            The payload.
      * @return The {@link MultiTerm} object for chaining.
      */
     public MultiTerm setPayload (byte[] pl) {
@@ -200,8 +217,9 @@
 
     /**
      * Set the payload as a {@link BytesRef} object.
-     *
-     * @param pl The payload.
+     * 
+     * @param pl
+     *            The payload.
      * @return The {@link MultiTerm} object for chaining.
      */
     public MultiTerm setPayload (BytesRef pl) {
@@ -212,7 +230,7 @@
 
     /**
      * Get the start position.
-     *
+     * 
      * @return The start position.
      */
     public int getStart () {
@@ -222,8 +240,9 @@
 
     /**
      * Set the start position.
-     *
-     * @param start The start position.
+     * 
+     * @param start
+     *            The start position.
      * @return The {@link MultiTerm} object for chaining.
      */
     public MultiTerm setStart (int start) {
@@ -234,7 +253,7 @@
 
     /**
      * Get the end position.
-     *
+     * 
      * @return The end position.
      */
     public int getEnd () {
@@ -244,8 +263,9 @@
 
     /**
      * Set the end position.
-     *
-     * @param end The end position.
+     * 
+     * @param end
+     *            The end position.
      * @return The {@link MultiTerm} object for chaining.
      */
     public MultiTerm setEnd (int end) {
@@ -256,7 +276,7 @@
 
     /**
      * Check if there are offsets stored.
-     *
+     * 
      * @return Boolean value indicating that the term
      *         contains stored offsets.
      */
@@ -267,9 +287,10 @@
 
     /**
      * Set the flag for stored offsets, in case they are relevant.
-     *
-     * @param value Boolean value indicating that the term
-     *        contains stored offsets.
+     * 
+     * @param value
+     *            Boolean value indicating that the term
+     *            contains stored offsets.
      * @return The {@link MultiTerm} object for chaining.
      */
     public MultiTerm hasStoredOffsets (boolean value) {
@@ -283,16 +304,13 @@
      * Offsets are attached following a hash sign,
      * payloads are attached following a dollar sign.
      * All payloads are written as UTF-8 character sequences.
-     *
+     * 
      * @see #toStringShort().
      */
     public String toString () {
         StringBuilder sb = new StringBuilder(this.term);
         if (this.start != this.end) {
-            sb.append('#')
-                .append(this.start)
-                .append('-')
-                .append(this.end);
+            sb.append('#').append(this.start).append('-').append(this.end);
         };
 
         if (this.payload != null) {
@@ -301,14 +319,15 @@
                 sb.append(this.payload.utf8ToString());
             }
             catch (AssertionError e) {
-                sb.append("<?>")
-                    .append(this.payload.toString().replace(' ', ','));
+                sb.append("<?>").append(
+                        this.payload.toString().replace(' ', ','));
             };
         };
 
         return sb.toString();
     };
 
+
     @Override
     public int compareTo (MultiTerm o) {
         if (this.payload == null || o.payload == null)
@@ -330,7 +349,7 @@
      * Payloads are attached following a dollar sign.
      * All payloads are written as UTF-8 character sequences.
      * Offsets are neglected.
-     *
+     * 
      * Offsets are ignored.
      * 
      * @see #toString().
@@ -343,8 +362,8 @@
                 sb.append(this.payload.utf8ToString());
             }
             catch (AssertionError e) {
-                sb.append("<?>")
-                    .append(this.payload.toString().replace(' ', ','));
+                sb.append("<?>").append(
+                        this.payload.toString().replace(' ', ','));
             };
         };
         return sb.toString();
@@ -377,32 +396,32 @@
 
                         // Resize the bytebuffer
                         if ((bb.capacity() - l) < 8) {
-                            bb = ByteBuffer.allocate(bb.capacity() + 8).
-                                put(bb.array());
+                            bb = ByteBuffer.allocate(bb.capacity() + 8).put(
+                                    bb.array());
                             bb.position(l);
                         };
 
                         switch (pls[i]) {
-                        case "<b>": // byte
-                            bb.put(Byte.parseByte(pls[i+1]));
-                            l++;
-                            break;
-                        case "<s>": // short
-                            bb.putShort(Short.parseShort(pls[i+1]));
-                            l+=2;
-                            break;
-                        case "<i>": // integer
-                            bb.putInt(Integer.parseInt(pls[i+1]));
-                            l+=4;
-                            break;
-                        case "<l>": // long
-                            bb.putLong(Long.parseLong(pls[i+1]));
-                            l+=8;
-                            break;
+                            case "<b>": // byte
+                                bb.put(Byte.parseByte(pls[i + 1]));
+                                l++;
+                                break;
+                            case "<s>": // short
+                                bb.putShort(Short.parseShort(pls[i + 1]));
+                                l += 2;
+                                break;
+                            case "<i>": // integer
+                                bb.putInt(Integer.parseInt(pls[i + 1]));
+                                l += 4;
+                                break;
+                            case "<l>": // long
+                                bb.putLong(Long.parseLong(pls[i + 1]));
+                                l += 8;
+                                break;
                         };
-                        i+=2;
+                        i += 2;
                     };
-		
+
                     byte[] bytes = new byte[l];
                     System.arraycopy(bb.array(), 0, bytes, 0, l);
                     this.payload = new BytesRef(bytes);
@@ -418,7 +437,7 @@
                 this.payload = new BytesRef(payloadStr);
             };
         };
-	
+
         // Parse offset information
         stringOffset = termSurface[0].split("\\#", 2);
 
@@ -426,26 +445,22 @@
 
             // Split start and end position of the offset
             String[] offset = stringOffset[1].split("\\-", 2);
-   
+
             // Start and end is given
             if (offset.length == 2 && offset[0].length() > 0) {
                 try {
                     this.start = Integer.parseInt(offset[0]);
-                    this.end   = Integer.parseInt(offset[1]);
-                    
+                    this.end = Integer.parseInt(offset[1]);
+
                 }
                 catch (NumberFormatException e) {
-                    throw new CorpusDataException(
-                        952,
-                        "Given offset information is not numeric"
-                    );
+                    throw new CorpusDataException(952,
+                            "Given offset information is not numeric");
                 };
             }
             else {
-                throw new CorpusDataException(
-                    953,
-                    "Given offset information is incomplete"
-                );
+                throw new CorpusDataException(953,
+                        "Given offset information is incomplete");
             };
         };
         this.term = stringOffset[0];
diff --git a/src/main/java/de/ids_mannheim/korap/index/MultiTermToken.java b/src/main/java/de/ids_mannheim/korap/index/MultiTermToken.java
index c3ef720..68ba827 100644
--- a/src/main/java/de/ids_mannheim/korap/index/MultiTermToken.java
+++ b/src/main/java/de/ids_mannheim/korap/index/MultiTermToken.java
@@ -10,18 +10,18 @@
 
 
 /**
- *
+ * 
  * A MultiTermToken represents a set of {@link MultiTerm MultiTerms}
  * starting at the same position, i.e. represents a segment
  * in a {@link MultiTermTokenStream}.
- *
+ * 
  * <blockquote><pre>
- *  MultiTermToken mtt = new MultiTermToken("t:test", "a:abbruch");
- *  mtt.add("b:banane");
- *  System.err.println(mtt.toString());
- *  // [t:test|a:abbruch|b:banane]
+ * MultiTermToken mtt = new MultiTermToken("t:test", "a:abbruch");
+ * mtt.add("b:banane");
+ * System.err.println(mtt.toString());
+ * // [t:test|a:abbruch|b:banane]
  * </pre></blockquote>
- *
+ * 
  * @author diewald
  */
 public class MultiTermToken {
@@ -31,18 +31,22 @@
 
     // This advices the java compiler to ignore all loggings
     public static final boolean DEBUG = false;
-    private final Logger log = LoggerFactory.getLogger(MultiTermTokenStream.class);
+    private final Logger log = LoggerFactory
+            .getLogger(MultiTermTokenStream.class);
+
 
     /**
      * Construct a new MultiTermToken by passing a stream of
      * {@link MultiTerm MultiTerms}.
-     *
-     * @param terms Take at least one {@link MultiTerm} object for a token.
+     * 
+     * @param terms
+     *            Take at least one {@link MultiTerm} object for a
+     *            token.
      */
     public MultiTermToken (MultiTerm terms, MultiTerm ... moreTerms) {
         this.terms = new ArrayList<MultiTerm>(16);
-        
-        this.terms.add( terms );
+
+        this.terms.add(terms);
 
         // Further elements on same position
         for (i = 0; i < moreTerms.length; i++) {
@@ -54,9 +58,11 @@
     /**
      * Construct a new MultiTermToken by passing a {@link MultiTerm}
      * represented as a prefixed string.
-     *
-     * @param prefix The term prefix.
-     * @param surface The term surface.
+     * 
+     * @param prefix
+     *            The term prefix.
+     * @param surface
+     *            The term surface.
      * @see MultiTerm
      */
     public MultiTermToken (char prefix, String surface) {
@@ -67,32 +73,35 @@
             MultiTerm term = new MultiTerm(prefix, surface);
 
             // First word element
-            terms.add( term );
+            terms.add(term);
         }
         catch (CorpusDataException cde) {
             log.error("{}: {}", cde.getErrorCode(), cde.getMessage());
         };
     };
-    
+
 
     /**
      * Construct a new MultiTermToken by passing a stream of
      * {@link MultiTerm MultiTerms} represented as strings.
-     *
-     * @param terms Take at least one {@link MultiTerm} string for a token.
+     * 
+     * @param terms
+     *            Take at least one {@link MultiTerm} string for a
+     *            token.
      */
-    public MultiTermToken (String terms, String ... moreTerms) throws CorpusDataException {
+    public MultiTermToken (String terms, String ... moreTerms)
+            throws CorpusDataException {
         this.terms = new ArrayList<MultiTerm>(16);
 
         MultiTerm term = new MultiTerm(terms);
 
         try {
             // First word element
-            this.terms.add( term );
+            this.terms.add(term);
 
             // Further elements on same position
             for (i = 0; i < moreTerms.length; i++) {
-                term = new MultiTerm( moreTerms[i] );
+                term = new MultiTerm(moreTerms[i]);
                 this.terms.add(term);
             };
         }
@@ -101,11 +110,12 @@
         };
     };
 
-    
+
     /**
      * Add a new {@link MultiTerm} to the MultiTermToken.
-     *
-     * @param term A {@link MultiTerm} object.
+     * 
+     * @param term
+     *            A {@link MultiTerm} object.
      * @return The {@link MultiTermToken} object for chaining.
      */
     public MultiTermToken add (MultiTerm term) {
@@ -117,8 +127,9 @@
 
     /**
      * Add a new {@link MultiTerm} to the MultiTermToken.
-     *
-     * @param term A MultiTerm represented as a surface string.
+     * 
+     * @param term
+     *            A MultiTerm represented as a surface string.
      * @return The {@link MultiTermToken} object for chaining.
      */
     public MultiTermToken add (String term) throws CorpusDataException {
@@ -138,9 +149,11 @@
 
     /**
      * Add a new {@link MultiTerm} to the MultiTermToken.
-     *
-     * @param prefix A MultiTerm prefix.
-     * @param term A MultiTerm represented as a surface string.
+     * 
+     * @param prefix
+     *            A MultiTerm prefix.
+     * @param term
+     *            A MultiTerm represented as a surface string.
      * @return The {@link MultiTermToken} object for chaining.
      */
     public MultiTermToken add (char prefix, String term) {
@@ -160,9 +173,10 @@
 
     /**
      * Get a {@link MultiTerm} by index.
-     *
-     * @param index The index position of a {@link MultiTerm}
-     *        in the {@link MultiTermToken}.
+     * 
+     * @param index
+     *            The index position of a {@link MultiTerm} in the
+     *            {@link MultiTermToken}.
      * @return A {@link MultiTerm}.
      */
     public MultiTerm get (int index) {
@@ -171,11 +185,11 @@
 
 
     /**
-     * Get the number of {@link MultiTerm MultiTerms}
-     * in the MultiTermToken.
-     *
-     * @return The number of {@link MultiTerm MultiTerms}
-     *         in the MultiTermToken.
+     * Get the number of {@link MultiTerm MultiTerms} in the
+     * MultiTermToken.
+     * 
+     * @return The number of {@link MultiTerm MultiTerms} in the
+     *         MultiTermToken.
      */
     public int getSize () {
         return this.terms.size();
@@ -184,7 +198,7 @@
 
     /**
      * Sort the {@link MultiTerm MultiTerms} in the correct order.
-     *
+     * 
      * @return The {@link MultiTermToken} object for chaining.
      */
     public MultiTermToken sort () {
@@ -199,7 +213,7 @@
 
     /**
      * Serialize the MultiTermToken to a string.
-     *
+     * 
      * @return A string representation of the MultiTermToken,
      *         with leading offset information.
      */
@@ -211,7 +225,7 @@
             sb.append(this.terms.get(i).toString()).append('|');
         };
         sb.append(this.terms.get(i).toString()).append(']');
-        
+
         return sb.toString();
     };
 };
diff --git a/src/main/java/de/ids_mannheim/korap/index/MultiTermTokenStream.java b/src/main/java/de/ids_mannheim/korap/index/MultiTermTokenStream.java
index bae942a..de974c3 100644
--- a/src/main/java/de/ids_mannheim/korap/index/MultiTermTokenStream.java
+++ b/src/main/java/de/ids_mannheim/korap/index/MultiTermTokenStream.java
@@ -26,15 +26,15 @@
  */
 
 /**
- * MultiTermTokenStream extends Lucenes {@link TokenStream}
- * to work with {@link MultiTermToken MultiTermTokens}.
- *
+ * MultiTermTokenStream extends Lucenes {@link TokenStream} to work
+ * with {@link MultiTermToken MultiTermTokens}.
+ * 
  * <blockquote><pre>
- *   MultiTermTokenStream mtts = new MultiTermTokenStream(
- *       "[s:den#0-3|i:den|p:DET|l:der|m:c:acc|m:n:sg|m:masc]"
- *   );
+ * MultiTermTokenStream mtts = new MultiTermTokenStream(
+ * "[s:den#0-3|i:den|p:DET|l:der|m:c:acc|m:n:sg|m:masc]"
+ * );
  * </pre></blockquote>
- *
+ * 
  * @author diewald
  * @see TokenStream
  */
@@ -43,33 +43,35 @@
     private PositionIncrementAttribute posIncrAttr;
     private PayloadAttribute payloadAttr;
 
-    private static final Pattern pattern =
-        Pattern.compile("\\[(?:\\([0-9]+-[0-9]+\\))?([^\\]]+?)\\]");
+    private static final Pattern pattern = Pattern
+            .compile("\\[(?:\\([0-9]+-[0-9]+\\))?([^\\]]+?)\\]");
 
     // This advices the java compiler to ignore all loggings
     public static final boolean DEBUG = false;
-    private final Logger log = LoggerFactory.getLogger(MultiTermTokenStream.class);
+    private final Logger log = LoggerFactory
+            .getLogger(MultiTermTokenStream.class);
 
     private List<MultiTermToken> multiTermTokens;
-    private int mttIndex   = 0,
-                mtIndex    = 0;
+    private int mttIndex = 0, mtIndex = 0;
     private short i = 0;
 
+
     /**
      * Construct a new MultiTermTokenStream object.
      */
     public MultiTermTokenStream () {
-        this.charTermAttr    = this.addAttribute(CharTermAttribute.class);
-        this.posIncrAttr     = this.addAttribute(PositionIncrementAttribute.class);
-        this.payloadAttr     = this.addAttribute(PayloadAttribute.class);
+        this.charTermAttr = this.addAttribute(CharTermAttribute.class);
+        this.posIncrAttr = this.addAttribute(PositionIncrementAttribute.class);
+        this.payloadAttr = this.addAttribute(PayloadAttribute.class);
         this.multiTermTokens = new ArrayList<MultiTermToken>(100);
     };
 
 
     /**
      * Construct a new MultiTermTokenStream object
-     *
-     * @param stream The stream as a string representation.
+     * 
+     * @param stream
+     *            The stream as a string representation.
      */
     public MultiTermTokenStream (String stream) {
         this();
@@ -85,13 +87,14 @@
 
     /**
      * Construct a new MultiTermTokenStream object
-     *
-     * @param stream The stream as a {@link Reader} object.
+     * 
+     * @param stream
+     *            The stream as a {@link Reader} object.
      * @throws IOException
      */
     public MultiTermTokenStream (Reader stream) throws IOException {
         this();
-	
+
         StringBuilder sb = new StringBuilder(4096);
         char[] buf = new char[128];
 
@@ -111,8 +114,9 @@
 
     /**
      * Append a {@link MultiTermToken} to the MultiTermTokenStream.
-     *
-     * @param mtt A {@link MultiTermToken}.
+     * 
+     * @param mtt
+     *            A {@link MultiTermToken}.
      * @return The {@link MultiTermTokenStream} object for chaining.
      */
     public MultiTermTokenStream addMultiTermToken (MultiTermToken mtt) {
@@ -124,12 +128,13 @@
     /**
      * Append a {@link MultiTermToken} to the MultiTermTokenStream
      * by means of a set of {@link MultiTerm MultiTerms}.
-     *
-     * @param mts A list of {@link MultiTerm} objects.
+     * 
+     * @param mts
+     *            A list of {@link MultiTerm} objects.
      * @return The {@link MultiTermTokenStream} object for chaining.
      */
-    public MultiTermTokenStream addMultiTermToken
-        (MultiTerm mts, MultiTerm ... moreTerms) {
+    public MultiTermTokenStream addMultiTermToken (MultiTerm mts,
+            MultiTerm ... moreTerms) {
         return this.addMultiTermToken(new MultiTermToken(mts, moreTerms));
     };
 
@@ -137,9 +142,12 @@
     /**
      * Append a {@link MultiTermToken} to the MultiTermTokenStream
      * by means of a single {@link MultiTerm} as a prefixed term.
-     *
-     * @param prefix A prefix character of a surface form of a {@link MultiTerm}.
-     * @param surface A surface string of a {@link MultiTerm}.
+     * 
+     * @param prefix
+     *            A prefix character of a surface form of a
+     *            {@link MultiTerm}.
+     * @param surface
+     *            A surface string of a {@link MultiTerm}.
      * @return The {@link MultiTermTokenStream} object for chaining.
      */
     public MultiTermTokenStream addMultiTermToken (char prefix, String surface) {
@@ -151,12 +159,13 @@
      * Append a {@link MultiTermToken} to the MultiTermTokenStream
      * by means of {@link MultiTerm MultiTerm} represented as a set
      * of terms represented as strings.
-     *
-     * @param surface At least one surface string of a {@link MultiTerm}.
+     * 
+     * @param surface
+     *            At least one surface string of a {@link MultiTerm}.
      * @return The {@link MultiTermTokenStream} object for chaining.
      */
-    public MultiTermTokenStream addMultiTermToken
-        (String surface, String ... moreTerms) {
+    public MultiTermTokenStream addMultiTermToken (String surface,
+            String ... moreTerms) {
         try {
             this.addMultiTermToken(new MultiTermToken(surface, moreTerms));
         }
@@ -168,14 +177,15 @@
 
 
 
-
     /**
      * Add meta information to the MultiTermTokenStream.
-     *
+     * 
      * <strong>This is experimental!</strong>
-     *
-     * @param key A string for denoting the meta information.
-     * @param value The value of the meta key as a string.
+     * 
+     * @param key
+     *            A string for denoting the meta information.
+     * @param value
+     *            The value of the meta key as a string.
      * @return The {@link MultiTermTokenStream} object for chaining.
      */
     public MultiTermTokenStream addMeta (String key, String value) {
@@ -193,11 +203,13 @@
 
     /**
      * Add meta information to the MultiTermTokenStream.
-     *
+     * 
      * <strong>This is experimental!</strong>
-     *
-     * @param key A string for denoting the meta information.
-     * @param value The value of the meta key as a byte array.
+     * 
+     * @param key
+     *            A string for denoting the meta information.
+     * @param value
+     *            The value of the meta key as a byte array.
      * @return The {@link MultiTermTokenStream} object for chaining.
      */
     public MultiTermTokenStream addMeta (String key, byte[] value) {
@@ -215,11 +227,13 @@
 
     /**
      * Add meta information to the MultiTermTokenStream.
-     *
+     * 
      * <strong>This is experimental!</strong>
-     *
-     * @param key A string for denoting the meta information.
-     * @param value The value of the meta key as a short value.
+     * 
+     * @param key
+     *            A string for denoting the meta information.
+     * @param value
+     *            The value of the meta key as a short value.
      * @return The {@link MultiTermTokenStream} object for chaining.
      */
     public MultiTermTokenStream addMeta (String key, short value) {
@@ -237,11 +251,13 @@
 
     /**
      * Add meta information to the MultiTermTokenStream.
-     *
+     * 
      * <strong>This is experimental!</strong>
-     *
-     * @param key A string for denoting the meta information.
-     * @param value The value of the meta key as a long value.
+     * 
+     * @param key
+     *            A string for denoting the meta information.
+     * @param value
+     *            The value of the meta key as a long value.
      * @return The {@link MultiTermTokenStream} object for chaining.
      */
     public MultiTermTokenStream addMeta (String key, long value) {
@@ -259,11 +275,13 @@
 
     /**
      * Add meta information to the MultiTermTokenStream.
-     *
+     * 
      * <strong>This is experimental!</strong>
-     *
-     * @param key A string for denoting the meta information.
-     * @param value The value of the meta key as a integer value.
+     * 
+     * @param key
+     *            A string for denoting the meta information.
+     * @param value
+     *            The value of the meta key as a integer value.
      * @return The {@link MultiTermTokenStream} object for chaining.
      */
     public MultiTermTokenStream addMeta (String key, int value) {
@@ -282,9 +300,10 @@
 
     /**
      * Get a {@link MultiTermToken} by index.
-     *
-     * @param index The index position of a {@link MultiTermToken}
-     *        in the {@link MultiTermTokenStream}.
+     * 
+     * @param index
+     *            The index position of a {@link MultiTermToken} in
+     *            the {@link MultiTermTokenStream}.
      * @return A {@link MultiTermToken}.
      */
     public MultiTermToken get (int index) {
@@ -293,11 +312,11 @@
 
 
     /**
-     * Get the number of {@link MultiTermToken MultiTermTokens}
-     * in the stream.
-     *
-     * @return The number of {@link MultiTermToken MultiTermTokens}
-     *         in the stream.
+     * Get the number of {@link MultiTermToken MultiTermTokens} in the
+     * stream.
+     * 
+     * @return The number of {@link MultiTermToken MultiTermTokens} in
+     *         the stream.
      */
     public int getSize () {
         return this.multiTermTokens.size();
@@ -306,13 +325,13 @@
 
     /**
      * Serialize the MultiTermTokenStream to a string.
-     *
+     * 
      * @return The MultiTermTokenStream as a string.
      */
     public String toString () {
         StringBuffer sb = new StringBuffer();
         for (MultiTermToken mtt : this.multiTermTokens) {
-            sb.append( mtt.toString() );
+            sb.append(mtt.toString());
         };
         return sb.toString();
     };
@@ -324,7 +343,7 @@
 
         while (matcher.find()) {
             String[] seg = matcher.group(1).split("\\|");
-            MultiTermToken mtt = new MultiTermToken( seg[0] );
+            MultiTermToken mtt = new MultiTermToken(seg[0]);
 
             for (i = 1; i < seg.length; i++)
                 mtt.add(seg[i]);
@@ -349,7 +368,7 @@
         };
 
         // Get current token
-        MultiTermToken mtt = this.multiTermTokens.get( this.mttIndex );
+        MultiTermToken mtt = this.multiTermTokens.get(this.mttIndex);
 
         // Sort the MultiTermToken
         mtt.sort();
@@ -367,7 +386,7 @@
 
             // Get last token
             else {
-                mtt = this.multiTermTokens.get( this.mttIndex );
+                mtt = this.multiTermTokens.get(this.mttIndex);
             };
         };
 
@@ -375,16 +394,17 @@
         MultiTerm mt = mtt.terms.get(this.mtIndex);
 
         // Set the relative position to the former term
-        posIncrAttr.setPositionIncrement( this.mtIndex == 0 ? 1 : 0 );
+        posIncrAttr.setPositionIncrement(this.mtIndex == 0 ? 1 : 0);
         charTermAttr.setEmpty();
-        charTermAttr.append( mt.term );
+        charTermAttr.append(mt.term);
 
         BytesRef payload = new BytesRef();
 
         // There is offset information
         if (mt.start != mt.end) {
             if (DEBUG)
-                log.trace("MultiTerm with payload offset: {}-{}", mt.start, mt.end);
+                log.trace("MultiTerm with payload offset: {}-{}", mt.start,
+                        mt.end);
 
             // Add offsets to BytesRef payload
             payload.append(new BytesRef(int2byte(mt.start)));
@@ -397,7 +417,7 @@
             if (DEBUG)
                 log.trace("Create payload[1] {}", payload.toString());
         };
-        
+
         // There is payload in the current token to index
         if (payload.length > 0) {
             payloadAttr.setPayload(payload);
@@ -413,7 +433,7 @@
                 sb.append('$').append(payload.toString());
             sb.append(']');
             sb.append(" with increment ").append(this.mtIndex == 0 ? 1 : 0);
-            
+
             log.trace(sb.toString());
         };
 
@@ -421,9 +441,10 @@
         return true;
     };
 
+
     @Override
     public void reset () {
         this.mttIndex = 0;
-        this.mtIndex  = 0;
+        this.mtIndex = 0;
     };
 };
diff --git a/src/main/java/de/ids_mannheim/korap/index/PositionsToOffset.java b/src/main/java/de/ids_mannheim/korap/index/PositionsToOffset.java
index 3bd0d74..0440286 100644
--- a/src/main/java/de/ids_mannheim/korap/index/PositionsToOffset.java
+++ b/src/main/java/de/ids_mannheim/korap/index/PositionsToOffset.java
@@ -20,235 +20,239 @@
     private AtomicReaderContext atomic;
     private boolean processed = false;
     private Integer[] pair;
-    private static ByteBuffer bbOffset =
-	ByteBuffer.allocate(8);
+    private static ByteBuffer bbOffset = ByteBuffer.allocate(8);
 
     HashSet<PositionsToOffsetArray> positions;
     HashMap<PositionsToOffsetArray, Integer[]> offsets;
 
-    private final static Logger log =
-	LoggerFactory.getLogger(PositionsToOffset.class);
+    private final static Logger log = LoggerFactory
+            .getLogger(PositionsToOffset.class);
 
     // This advices the java compiler to ignore all loggings
     public static final boolean DEBUG = false;
 
     private class PositionsToOffsetArray {
-	public int docID;
-	public int pos;
-   
-	public PositionsToOffsetArray (int docID, int pos) {
-	    this.docID = docID;
-	    this.pos = pos;
-	};
+        public int docID;
+        public int pos;
 
-	public int hashCode(){
-	    long hashCode;
-	    hashCode = (docID * Integer.MAX_VALUE) - Integer.MAX_VALUE + pos;
-	    return new Long(hashCode).hashCode();
-	};
-     
-	public boolean equals(Object obj){
-	    if (obj instanceof PositionsToOffsetArray) {
-		PositionsToOffsetArray ptoa = (PositionsToOffsetArray) obj;
-		return (ptoa.docID == this.docID && ptoa.pos == this.pos);
-	    };
-	    return false;
-	};
+
+        public PositionsToOffsetArray (int docID, int pos) {
+            this.docID = docID;
+            this.pos = pos;
+        };
+
+
+        public int hashCode () {
+            long hashCode;
+            hashCode = (docID * Integer.MAX_VALUE) - Integer.MAX_VALUE + pos;
+            return new Long(hashCode).hashCode();
+        };
+
+
+        public boolean equals (Object obj) {
+            if (obj instanceof PositionsToOffsetArray) {
+                PositionsToOffsetArray ptoa = (PositionsToOffsetArray) obj;
+                return (ptoa.docID == this.docID && ptoa.pos == this.pos);
+            };
+            return false;
+        };
     };
 
+
     public PositionsToOffset (AtomicReaderContext atomic, String field) {
-	this.field = field;
-	this.atomic = atomic;
-	this.positions = new HashSet<>(64);
-	this.offsets = new HashMap<>(64);
+        this.field = field;
+        this.atomic = atomic;
+        this.positions = new HashSet<>(64);
+        this.offsets = new HashMap<>(64);
     };
 
+
     public void clear () {
-	this.positions.clear();
-	this.offsets.clear();
-	this.bbOffset.clear();
-	this.processed = false;
+        this.positions.clear();
+        this.offsets.clear();
+        this.bbOffset.clear();
+        this.processed = false;
     };
 
+
     public void add (int docID, int pos) {
-	this.add(new PositionsToOffsetArray(docID, pos));
+        this.add(new PositionsToOffsetArray(docID, pos));
     };
 
+
     public void add (PositionsToOffsetArray ptoa) {
-	if (DEBUG)
-	    log.trace("Add positionsToOffsetArray {}/{}", ptoa.docID, ptoa.pos);
-	if (ptoa.pos < 0)
-	    return;
+        if (DEBUG)
+            log.trace("Add positionsToOffsetArray {}/{}", ptoa.docID, ptoa.pos);
+        if (ptoa.pos < 0)
+            return;
 
-	if (this.processed && this.exists(ptoa))
-	    return;
+        if (this.processed && this.exists(ptoa))
+            return;
 
-	if (DEBUG)
-	    log.trace("Reopen processing");
+        if (DEBUG)
+            log.trace("Reopen processing");
 
-	this.positions.add(ptoa);
-	this.processed = false;
+        this.positions.add(ptoa);
+        this.processed = false;
     };
 
+
     public boolean exists (int docID, int pos) {
-	return this.offsets.containsKey(new PositionsToOffsetArray(docID, pos));
+        return this.offsets.containsKey(new PositionsToOffsetArray(docID, pos));
     };
 
+
     public boolean exists (PositionsToOffsetArray ptoa) {
-	return this.offsets.containsKey(ptoa);
+        return this.offsets.containsKey(ptoa);
     };
 
+
     public int start (int docID, int pos) {
-	return this.start(new PositionsToOffsetArray(docID, pos));
+        return this.start(new PositionsToOffsetArray(docID, pos));
     };
 
+
     public int start (PositionsToOffsetArray ptoa) {
-	if (ptoa.pos < 0)
-	    return 0;
+        if (ptoa.pos < 0)
+            return 0;
 
-	if (!processed)
-	    this.offsets();
+        if (!processed)
+            this.offsets();
 
-	Integer[] pair = this.offsets.get(ptoa);
+        Integer[] pair = this.offsets.get(ptoa);
 
-	if (pair == null)
-	    return 0;
+        if (pair == null)
+            return 0;
 
-	return pair[0];
+        return pair[0];
     };
 
+
     public int end (int docID, int pos) {
-	return this.end(new PositionsToOffsetArray(docID, pos));
+        return this.end(new PositionsToOffsetArray(docID, pos));
     };
 
+
     public int end (PositionsToOffsetArray ptoa) {
-	if (ptoa.pos < 0)
-	    return -1;
+        if (ptoa.pos < 0)
+            return -1;
 
-	if (!processed)
-	    this.offsets();
+        if (!processed)
+            this.offsets();
 
-	Integer[] pair = this.offsets.get(ptoa);
-	if (pair == null)
-	    return -1;
+        Integer[] pair = this.offsets.get(ptoa);
+        if (pair == null)
+            return -1;
 
-	return  pair[1];
+        return pair[1];
     };
 
+
     public Integer[] span (int docID, int pos) {
-	return this.span(new PositionsToOffsetArray(docID, pos));
+        return this.span(new PositionsToOffsetArray(docID, pos));
     };
 
+
     public Integer[] span (PositionsToOffsetArray ptoa) {
-	if (!processed)
-	    this.offsets();
-	return this.offsets.get(ptoa);
+        if (!processed)
+            this.offsets();
+        return this.offsets.get(ptoa);
     };
 
-    public void addOffset (int docID,
-			   int pos,
-			   int startOffset,
-			   int endOffset) {
-	offsets.put(
-	    new PositionsToOffsetArray(docID, pos),
-            new Integer[]{startOffset, endOffset}
-	);
+
+    public void addOffset (int docID, int pos, int startOffset, int endOffset) {
+        offsets.put(new PositionsToOffsetArray(docID, pos), new Integer[] {
+                startOffset, endOffset });
     };
 
+
     public HashMap<PositionsToOffsetArray, Integer[]> offsets () {
-	if (processed)
-	    return offsets;
+        if (processed)
+            return offsets;
 
-	if (DEBUG)
-	    log.trace("Process offsets");
+        if (DEBUG)
+            log.trace("Process offsets");
 
-	StringBuilder sb = new StringBuilder().append('_');
+        StringBuilder sb = new StringBuilder().append('_');
 
-	try {
-	    Terms terms = atomic.reader().fields().terms(field);
+        try {
+            Terms terms = atomic.reader().fields().terms(field);
 
-	    if (terms != null) {
-		// TODO: Maybe reuse a termsEnum!
+            if (terms != null) {
+                // TODO: Maybe reuse a termsEnum!
 
-		final TermsEnum termsEnum = terms.iterator(null);
+                final TermsEnum termsEnum = terms.iterator(null);
 
-		for (PositionsToOffsetArray posDoc : positions) {
-		    if (this.exists(posDoc))
-			continue;
+                for (PositionsToOffsetArray posDoc : positions) {
+                    if (this.exists(posDoc))
+                        continue;
 
-		    int docID = posDoc.docID;
+                    int docID = posDoc.docID;
 
-		    /*
-		    int pos = posDoc[1];
-		    Integer[] posDoc2 = new Integer[2];
-		    posDoc2[0] = docID;
-		    posDoc2[1] = pos;
-		    */
+                    /*
+                    int pos = posDoc[1];
+                    Integer[] posDoc2 = new Integer[2];
+                    posDoc2[0] = docID;
+                    posDoc2[1] = pos;
+                    */
 
-		    sb.append(posDoc.pos);
+                    sb.append(posDoc.pos);
 
-		    Term term = new Term(field, sb.toString());
-		    sb.setLength(1);
-		    
-		    // Set the position in the iterator to the term that is seeked
-		    if (termsEnum.seekExact(term.bytes())) {
-			
-			if (DEBUG)
-			    log.trace("Search for {} in doc {} with pos {}",
-				      term.toString(),
-				      posDoc.docID,
-				      posDoc.pos);
+                    Term term = new Term(field, sb.toString());
+                    sb.setLength(1);
 
-			// Start an iterator to fetch all payloads of the term
-			DocsAndPositionsEnum docs = termsEnum.docsAndPositions(
-                            null,
-			    null,
-			    DocsAndPositionsEnum.FLAG_PAYLOADS
-		        );
+                    // Set the position in the iterator to the term that is seeked
+                    if (termsEnum.seekExact(term.bytes())) {
 
-			if (docs.advance(docID) == docID) {
-			    docs.nextPosition();
+                        if (DEBUG)
+                            log.trace("Search for {} in doc {} with pos {}",
+                                    term.toString(), posDoc.docID, posDoc.pos);
 
-			    BytesRef payload = docs.getPayload();
+                        // Start an iterator to fetch all payloads of the term
+                        DocsAndPositionsEnum docs = termsEnum.docsAndPositions(
+                                null, null, DocsAndPositionsEnum.FLAG_PAYLOADS);
 
-			    if (payload.length == 8) {
-				bbOffset.clear();
-				bbOffset.put(payload.bytes, payload.offset, 8);
-				bbOffset.rewind();
-				Integer[] offsetArray = new Integer[2];
-				offsetArray[0] = bbOffset.getInt();
-				offsetArray[1] = bbOffset.getInt();
-				offsets.put(posDoc, offsetArray);
+                        if (docs.advance(docID) == docID) {
+                            docs.nextPosition();
 
-				if (DEBUG)
-				    log.trace("Found {}-{} for {}",
-					      offsetArray[0],
-					      offsetArray[1],
-					      term.toString());
-			    }
+                            BytesRef payload = docs.getPayload();
 
-			    else {
-				log.error(
-				    "Doc {} has no offsets stored for {}",
-				    docID,
-				    term.toString()
-				);
-			    };
-			};
-		    };
-		};
-	    };
-	}
-	catch (IOException e) {
-	    log.warn(e.getLocalizedMessage());
-	};
+                            if (payload.length == 8) {
+                                bbOffset.clear();
+                                bbOffset.put(payload.bytes, payload.offset, 8);
+                                bbOffset.rewind();
+                                Integer[] offsetArray = new Integer[2];
+                                offsetArray[0] = bbOffset.getInt();
+                                offsetArray[1] = bbOffset.getInt();
+                                offsets.put(posDoc, offsetArray);
 
-	processed = true;
-	positions.clear();
-	return offsets;
+                                if (DEBUG)
+                                    log.trace("Found {}-{} for {}",
+                                            offsetArray[0], offsetArray[1],
+                                            term.toString());
+                            }
+
+                            else {
+                                log.error(
+                                        "Doc {} has no offsets stored for {}",
+                                        docID, term.toString());
+                            };
+                        };
+                    };
+                };
+            };
+        }
+        catch (IOException e) {
+            log.warn(e.getLocalizedMessage());
+        };
+
+        processed = true;
+        positions.clear();
+        return offsets;
     };
 
+
     public AtomicReaderContext getAtomicReader () {
-	return this.atomic;
+        return this.atomic;
     };
 };
diff --git a/src/main/java/de/ids_mannheim/korap/index/SpanInfo.java b/src/main/java/de/ids_mannheim/korap/index/SpanInfo.java
index b8d5ea5..5c797ce 100644
--- a/src/main/java/de/ids_mannheim/korap/index/SpanInfo.java
+++ b/src/main/java/de/ids_mannheim/korap/index/SpanInfo.java
@@ -1,9 +1,9 @@
 package de.ids_mannheim.korap.index;
+
 import de.ids_mannheim.korap.index.TermInfo;
 import de.ids_mannheim.korap.response.Match;
 import de.ids_mannheim.korap.index.PositionsToOffset;
 
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -11,7 +11,7 @@
 
 public class SpanInfo {
     ArrayList<TermInfo> terms;
-    HashMap<Integer,Integer> startChar, endChar;
+    HashMap<Integer, Integer> startChar, endChar;
     PositionsToOffset pto;
     int localDocID;
 
@@ -20,14 +20,16 @@
     // This advices the java compiler to ignore all loggings
     public static final boolean DEBUG = false;
 
+
     public SpanInfo (PositionsToOffset pto, int localDocID) {
-        this.terms      = new ArrayList<TermInfo>(64);
-        this.startChar  = new HashMap<Integer,Integer>(16);
-        this.endChar    = new HashMap<Integer,Integer>(16);
-        this.pto        = pto;
+        this.terms = new ArrayList<TermInfo>(64);
+        this.startChar = new HashMap<Integer, Integer>(16);
+        this.endChar = new HashMap<Integer, Integer>(16);
+        this.pto = pto;
         this.localDocID = localDocID;
     };
 
+
     public void add (TermInfo info) {
         info.analyze();
         if (info.getType() != "pos") {
@@ -39,6 +41,7 @@
         };
     };
 
+
     public ArrayList<TermInfo> getTerms () {
         // Sort terms (this will also analyze them!)
         Collections.sort(this.terms);
@@ -48,7 +51,8 @@
         // missing this information
         for (TermInfo t : this.terms) {
             if (DEBUG)
-                log.trace("Check offsets for {} and {}", t.getStartPos(), t.getEndPos());
+                log.trace("Check offsets for {} and {}", t.getStartPos(),
+                        t.getEndPos());
             found = true;
             if (t.getStartChar() == -1) {
                 if (this.startChar.containsKey(t.getStartPos()))
@@ -62,15 +66,11 @@
                 else
                     found = false;
             };
-            
+
             // Add this to found offsets
             if (found && t.getStartPos() == t.getEndPos())
-                this.pto.addOffset(
-                    this.localDocID,
-                    t.getStartPos(),
-                    t.getStartChar(),
-                    t.getEndChar()
-                );
+                this.pto.addOffset(this.localDocID, t.getStartPos(),
+                        t.getStartChar(), t.getEndChar());
             else {
                 if (DEBUG)
                     log.trace("{} can't be found!", t.getAnnotation());
diff --git a/src/main/java/de/ids_mannheim/korap/index/TermInfo.java b/src/main/java/de/ids_mannheim/korap/index/TermInfo.java
index 2835be3..6354f82 100644
--- a/src/main/java/de/ids_mannheim/korap/index/TermInfo.java
+++ b/src/main/java/de/ids_mannheim/korap/index/TermInfo.java
@@ -24,23 +24,23 @@
     private ByteBuffer payload;
     private boolean analyzed = false;
 
-    private int startChar = -1,
-        endChar   = -1,
-        startPos  = -1,
-        endPos    = -1;
+    private int startChar = -1, endChar = -1, startPos = -1, endPos = -1;
 
     private byte depth = (byte) 0;
-    
-    private Pattern prefixRegex = Pattern.compile("(?:([^/]+)/)?([^:/]+)(?::(.+?))?");
+
+    private Pattern prefixRegex = Pattern
+            .compile("(?:([^/]+)/)?([^:/]+)(?::(.+?))?");
     private Matcher matcher;
 
+
     public TermInfo (String term, int pos, ByteBuffer payload) {
-        this.term     = term;
+        this.term = term;
         this.startPos = pos;
-        this.endPos   = pos;
-        this.payload  = payload;
+        this.endPos = pos;
+        this.payload = payload;
     };
 
+
     public TermInfo analyze () {
         if (analyzed)
             return this;
@@ -51,39 +51,40 @@
         this.payload.rewind();
 
         switch (tterm.charAt(0)) {
-        case '<':
-            // "<>:mate/l:..."
-            if (tterm.charAt(1) == '>') {
-                // span
-                this.type = "span";
-                tterm = tterm.substring(3);
-                ttype = 2;
-            }
-            // rel-target
-            else {
-                this.type = "relTarget";
+            case '<':
+                // "<>:mate/l:..."
+                if (tterm.charAt(1) == '>') {
+                    // span
+                    this.type = "span";
+                    tterm = tterm.substring(3);
+                    ttype = 2;
+                }
+                // rel-target
+                else {
+                    this.type = "relTarget";
+                    tterm = tterm.substring(2);
+                    ttype = 3;
+                }
+                ;
+                break;
+
+            case '>':
+                // rel-src
+                this.type = "relSrc";
                 tterm = tterm.substring(2);
                 ttype = 3;
-            };
-            break;
+                break;
 
-        case '>':
-            // rel-src
-            this.type = "relSrc";
-            tterm = tterm.substring(2);
-            ttype = 3;
-            break;
-            
-        case '_':
-            // pos
-            this.type = "pos";
-            ttype = 1;
-            tterm = tterm.substring(1);
-            break;
+            case '_':
+                // pos
+                this.type = "pos";
+                ttype = 1;
+                tterm = tterm.substring(1);
+                break;
 
-        default:
-            // term
-            this.type = "term";
+            default:
+                // term
+                this.type = "term";
         };
 
         // Analyze term value
@@ -97,8 +98,8 @@
                     this.foundry = matcher.group(1);
                 else
                     this.foundry = "base";
-                this.layer   = matcher.group(2);
-                this.value   = matcher.group(3);
+                this.layer = matcher.group(2);
+                this.value = matcher.group(3);
             };
         }
 
@@ -106,77 +107,90 @@
         else {
             this.value = tterm;
             this.startChar = this.payload.getInt();
-            this.endChar   = this.payload.getInt();
+            this.endChar = this.payload.getInt();
         };
-        
+
         // for spans
         if (ttype == 2) {
             this.startChar = this.payload.getInt();
-            this.endChar   = this.payload.getInt();
+            this.endChar = this.payload.getInt();
         };
 
         // for spans and relations
         if (ttype > 1)
             // Unsure if this is correct
-            this.endPos = this.payload.getInt() -1;
-        
+            this.endPos = this.payload.getInt() - 1;
+
         if (ttype == 2 && this.payload.position() < lastPos) {
             this.depth = this.payload.get();
         };
-        
+
         // payloads can have different meaning
         analyzed = true;
         return this;
     };
 
+
     public String getType () {
         return this.type;
     };
 
+
     public int getStartChar () {
         return this.startChar;
     };
 
+
     public void setStartChar (int pos) {
         this.startChar = pos;
     };
 
+
     public int getEndChar () {
         return this.endChar;
     };
 
+
     public void setEndChar (int pos) {
         this.endChar = pos;
     };
 
+
     public int getStartPos () {
         return this.startPos;
     };
 
+
     public int getEndPos () {
         return this.endPos;
     };
 
+
     public byte getDepth () {
         return this.depth;
     };
 
+
     public String getFoundry () {
         return this.foundry;
     };
 
+
     public String getLayer () {
         return this.layer;
     };
 
+
     public String getValue () {
         return this.value;
     };
 
+
     public String getAnnotation () {
         return this.annotation;
     };
 
+
     public String toString () {
         this.analyze();
 
@@ -198,6 +212,7 @@
         return sb.toString();
     };
 
+
     @Override
     public int compareTo (TermInfo obj) {
         this.analyze();
diff --git a/src/main/java/de/ids_mannheim/korap/index/TimeOutThread.java b/src/main/java/de/ids_mannheim/korap/index/TimeOutThread.java
index df24db1..ae09567 100644
--- a/src/main/java/de/ids_mannheim/korap/index/TimeOutThread.java
+++ b/src/main/java/de/ids_mannheim/korap/index/TimeOutThread.java
@@ -1,4 +1,5 @@
 package de.ids_mannheim.korap.index;
+
 import org.apache.lucene.util.Counter;
 import java.lang.*;
 import java.lang.InterruptedException.*;
@@ -14,31 +15,35 @@
     private volatile boolean stop = false;
     private Counter counter;
 
+
     public TimeOutThread () {
-	super("TimeOutThread");
-	counter = Counter.newCounter(true);
+        super("TimeOutThread");
+        counter = Counter.newCounter(true);
     };
 
+
     @Override
-    public void run() {
-	while (!stop) {
-	    counter.addAndGet(resolution);
-	    try {
-		Thread.sleep( resolution );
-	    }
-	    catch (InterruptedException ie) {
-		throw new ThreadInterruptedException(ie);
-	    };
-	};
+    public void run () {
+        while (!stop) {
+            counter.addAndGet(resolution);
+            try {
+                Thread.sleep(resolution);
+            }
+            catch (InterruptedException ie) {
+                throw new ThreadInterruptedException(ie);
+            };
+        };
     };
 
+
     // Get miliseconds
     public long getTime () {
-	return counter.get();
+        return counter.get();
     };
-	
+
+
     // Stops the timer thread 
     public void stopTimer () {
-	stop = true;
+        stop = true;
     };
 };
diff --git a/src/main/java/de/ids_mannheim/korap/query/DistanceConstraint.java b/src/main/java/de/ids_mannheim/korap/query/DistanceConstraint.java
index 806384f..7a87bdd 100644
--- a/src/main/java/de/ids_mannheim/korap/query/DistanceConstraint.java
+++ b/src/main/java/de/ids_mannheim/korap/query/DistanceConstraint.java
@@ -4,13 +4,15 @@
  * DistanceConstraint specifies the constraints used in
  * {@link SpanDistanceQuery SpanDistanceQueries} or
  * {@link SpanMultipleDistanceQuery SpanMultipleDistanceQueries}. The
- * constraints comprise the distance unit, the minimum and maximum distances,
+ * constraints comprise the distance unit, the minimum and maximum
+ * distances,
  * the order and the co-occurence of the compared spans.
  * 
  * Distance constraint examples:
  * 
  * <ol>
- * <li>Two terms x and y are separated by minimum two and maximum three other
+ * <li>Two terms x and y are separated by minimum two and maximum
+ * three other
  * words. The order of x and y does not matter.
  * 
  * <pre>
@@ -18,7 +20,8 @@
  * </pre>
  * 
  * </li>
- * <li>Two terms x and y are separated by minimum two and maximum three other
+ * <li>Two terms x and y are separated by minimum two and maximum
+ * three other
  * words. X must precede y.
  * 
  * <pre>
@@ -27,7 +30,8 @@
  * 
  * </li>
  * <li>
- * Term x do not occur with term y in minimum two and maximum three other words.
+ * Term x do not occur with term y in minimum two and maximum three
+ * other words.
  * X must precede y.
  * 
  * <pre>
@@ -39,8 +43,10 @@
  * <em>sentences</em>. X must precede y.
  * 
  * <pre>
- * SpanElementQuery e = new SpanElementQuery(&quot;tokens&quot;, &quot;s&quot;);
- * DistanceConstraint dc = new DistanceConstraint(e, 2, 3, true, false);
+ * SpanElementQuery e = new SpanElementQuery(&quot;tokens&quot;,
+ * &quot;s&quot;);
+ * DistanceConstraint dc = new DistanceConstraint(e, 2, 3, true,
+ * false);
  * </pre>
  * 
  * </li>
@@ -56,22 +62,33 @@
     private boolean exclusion;
     private boolean isOrdered;
 
+
     /**
-     * Constructs a DistanceConstraint object with the specified minimum and
-     * maximum distances. If isOrdered is true, the spans must occur in order.
-     * If exclusion is true, the second span must <em>not</em> occur together
+     * Constructs a DistanceConstraint object with the specified
+     * minimum and
+     * maximum distances. If isOrdered is true, the spans must occur
+     * in order.
+     * If exclusion is true, the second span must <em>not</em> occur
+     * together
      * with the first span.
      * 
-     * @param min the minimum distance
-     * @param max the maximum distance
-     * @param isOrdered a boolean flag representing the value <code>true</code>
-     *        if the spans should occur in order, false otherwise.
-     * @param exclusion a boolean flag representing the value <code>true</code>,
-     *        if the second span should occur together with the first span,
-     *        false otherwise.
+     * @param min
+     *            the minimum distance
+     * @param max
+     *            the maximum distance
+     * @param isOrdered
+     *            a boolean flag representing the value
+     *            <code>true</code>
+     *            if the spans should occur in order, false otherwise.
+     * @param exclusion
+     *            a boolean flag representing the value
+     *            <code>true</code>,
+     *            if the second span should occur together with the
+     *            first span,
+     *            false otherwise.
      */
-    public DistanceConstraint(int min, int max, boolean isOrdered,
-            boolean exclusion) {
+    public DistanceConstraint (int min, int max, boolean isOrdered,
+                               boolean exclusion) {
         this.unit = "w";
         this.minDistance = min;
         this.maxDistance = max;
@@ -79,24 +96,36 @@
         this.exclusion = exclusion;
     }
 
+
     /**
-     * Constructs a DistanceContraint object with the specified SpanElementQuery
+     * Constructs a DistanceContraint object with the specified
+     * SpanElementQuery
      * as the distance unit, and the specified minimum and the maximum
-     * distances. If isOrdered is true, the spans must occur in order. If
-     * exclusion is true, the second span must <em>not</em> occur together with
+     * distances. If isOrdered is true, the spans must occur in order.
+     * If
+     * exclusion is true, the second span must <em>not</em> occur
+     * together with
      * the first span.
      * 
-     * @param elementQuery the distance unit
-     * @param min the minimum distance
-     * @param max the maximum distance
-     * @param isOrdered a boolean flag representing the value <code>true</code>
-     *        if the spans should occur in order, false otherwise.
-     * @param exclusion a boolean flag representing the value <code>true</code>,
-     *        if the second span should occur together with the first span,
-     *        false otherwise.
+     * @param elementQuery
+     *            the distance unit
+     * @param min
+     *            the minimum distance
+     * @param max
+     *            the maximum distance
+     * @param isOrdered
+     *            a boolean flag representing the value
+     *            <code>true</code>
+     *            if the spans should occur in order, false otherwise.
+     * @param exclusion
+     *            a boolean flag representing the value
+     *            <code>true</code>,
+     *            if the second span should occur together with the
+     *            first span,
+     *            false otherwise.
      */
-    public DistanceConstraint(SpanElementQuery elementQuery, int min, int max,
-            boolean isOrdered, boolean exclusion) {
+    public DistanceConstraint (SpanElementQuery elementQuery, int min, int max,
+                               boolean isOrdered, boolean exclusion) {
         if (elementQuery == null) {
             throw new IllegalArgumentException("Element query cannot be null.");
         }
@@ -109,117 +138,141 @@
         this.elementQuery = elementQuery;
     }
 
+
     /**
      * Returns the minimum distance.
      * 
      * @return the minimum distance
      */
-    public int getMinDistance() {
+    public int getMinDistance () {
         return minDistance;
     }
 
+
     /**
      * Sets the minimum distance.
      * 
-     * @param minDistance the minimum distance
+     * @param minDistance
+     *            the minimum distance
      */
-    public void setMinDistance(int minDistance) {
+    public void setMinDistance (int minDistance) {
         this.minDistance = minDistance;
     }
 
+
     /**
      * Returns the maximum distance.
      * 
      * @return the maximum distance
      */
-    public int getMaxDistance() {
+    public int getMaxDistance () {
         return maxDistance;
     }
 
+
     /**
      * Sets the maximum distance.
      * 
-     * @param maxDistance the maximum distance
+     * @param maxDistance
+     *            the maximum distance
      */
-    public void setMaxDistance(int maxDistance) {
+    public void setMaxDistance (int maxDistance) {
         this.maxDistance = maxDistance;
     }
 
+
     /**
      * Returns the distance unit.
      * 
      * @return the distance unit
      */
-    public String getUnit() {
+    public String getUnit () {
         return unit;
     }
 
+
     /**
      * Sets the distance unit.
      * 
-     * @param unit the distance unit
+     * @param unit
+     *            the distance unit
      */
-    public void setUnit(String unit) {
+    public void setUnit (String unit) {
         this.unit = unit;
     }
 
+
     /**
      * Returns the element query used as the distance unit.
      * 
      * @return the element query used as the distance unit
      */
-    public SpanElementQuery getElementQuery() {
+    public SpanElementQuery getElementQuery () {
         return elementQuery;
     }
 
+
     /**
      * Sets the element query used as the distance unit.
      * 
-     * @param elementQuery the element query used as the distance unit.
+     * @param elementQuery
+     *            the element query used as the distance unit.
      */
-    public void setElementQuery(SpanElementQuery elementQuery) {
+    public void setElementQuery (SpanElementQuery elementQuery) {
         this.elementQuery = elementQuery;
     }
 
+
     /**
-     * Tells if the second span must occur together with the first span, or not.
+     * Tells if the second span must occur together with the first
+     * span, or not.
      * 
-     * @return <code>true</code> if the second span must <em>not</em> occur
-     *         together with the first span, <code>false</code> otherwise.
+     * @return <code>true</code> if the second span must <em>not</em>
+     *         occur
+     *         together with the first span, <code>false</code>
+     *         otherwise.
      */
-    public boolean isExclusion() {
+    public boolean isExclusion () {
         return exclusion;
     }
 
+
     /**
-     * Sets <code>true</code> if the second span must <em>not</em> occur
+     * Sets <code>true</code> if the second span must <em>not</em>
+     * occur
      * together with the first span, <code>false</code> otherwise.
      * 
-     * @param exclusion a boolean with value <code>true</code> if the second
-     *        span must <em>not</em> occur together with the first span,
-     *        <code>false</code> otherwise.
+     * @param exclusion
+     *            a boolean with value <code>true</code> if the second
+     *            span must <em>not</em> occur together with the first
+     *            span,
+     *            <code>false</code> otherwise.
      */
-    public void setExclusion(boolean exclusion) {
+    public void setExclusion (boolean exclusion) {
         this.exclusion = exclusion;
     }
 
+
     /**
      * Tells if the spans must occur in order or not.
      * 
      * @return <code>true</code> if the spans must occur in order,
      *         <code>false</code> otherwise.
      */
-    public boolean isOrdered() {
+    public boolean isOrdered () {
         return isOrdered;
     }
 
+
     /**
      * Sets if the spans must occur in order or not.
      * 
-     * @param isOrdered a boolean with value <code>true</code> if the spans must
-     *        occur in order, <code>false</code> otherwise.
+     * @param isOrdered
+     *            a boolean with value <code>true</code> if the spans
+     *            must
+     *            occur in order, <code>false</code> otherwise.
      */
-    public void setOrdered(boolean isOrdered) {
+    public void setOrdered (boolean isOrdered) {
         this.isOrdered = isOrdered;
     }
 }
diff --git a/src/main/java/de/ids_mannheim/korap/query/FrameConstraint.java b/src/main/java/de/ids_mannheim/korap/query/FrameConstraint.java
index c26aba6..e0c3dd6 100644
--- a/src/main/java/de/ids_mannheim/korap/query/FrameConstraint.java
+++ b/src/main/java/de/ids_mannheim/korap/query/FrameConstraint.java
@@ -1,4 +1,5 @@
 package de.ids_mannheim.korap.query;
+
 import de.ids_mannheim.korap.util.QueryException;
 import org.apache.lucene.search.spans.Spans;
 
@@ -10,75 +11,66 @@
  * Multiple constraints are represented as a bit vector,
  * supporting fast checks if a certain condition is met.
  * The following distinctive frame conditions are supported:
- *
+ * 
  * <dl>
- *   <dt>precedes</dt>
- *   <dd>A precedes B</dd>
- *
- *   <dt>precedesDirectly</dt>
- *   <dd>A precedes B directly</dd>
- *
- *   <dt>overlapsLeft</dt>
- *   <dd>A overlaps B to the left</dd>
- *
- *   <dt>alignsLeft</dt>
- *   <dd>A aligns with B to the left</dd>
- *
- *   <dt>startsWith</dt>
- *   <dd>A starts with B</dd>
- *
- *   <dt>matches</dt>
- *   <dd>A matches B</dd>
- *
- *   <dt>isWithin</dt>
- *   <dd>A is within B</dd>
- *
- *   <dt>isAround</dt>
- *   <dd>A is around B</dd>
- *
- *   <dt>endsWith</dt>
- *   <dd>A ends with B</dd>
- *
- *   <dt>alignsRight</dt>
- *   <dd>A aligns with B to the right</dd>
- *
- *   <dt>overlapsRight</dt>
- *   <dd>A overlaps B to the right</dd>
- *
- *   <dt>succeedsDirectly</dt>
- *   <dd>A succeeds B directly</dd>
- *
- *   <dt>succeeds</dt>
- *   <dd>A succeeds B</dd>
+ * <dt>precedes</dt>
+ * <dd>A precedes B</dd>
+ * 
+ * <dt>precedesDirectly</dt>
+ * <dd>A precedes B directly</dd>
+ * 
+ * <dt>overlapsLeft</dt>
+ * <dd>A overlaps B to the left</dd>
+ * 
+ * <dt>alignsLeft</dt>
+ * <dd>A aligns with B to the left</dd>
+ * 
+ * <dt>startsWith</dt>
+ * <dd>A starts with B</dd>
+ * 
+ * <dt>matches</dt>
+ * <dd>A matches B</dd>
+ * 
+ * <dt>isWithin</dt>
+ * <dd>A is within B</dd>
+ * 
+ * <dt>isAround</dt>
+ * <dd>A is around B</dd>
+ * 
+ * <dt>endsWith</dt>
+ * <dd>A ends with B</dd>
+ * 
+ * <dt>alignsRight</dt>
+ * <dd>A aligns with B to the right</dd>
+ * 
+ * <dt>overlapsRight</dt>
+ * <dd>A overlaps B to the right</dd>
+ * 
+ * <dt>succeedsDirectly</dt>
+ * <dd>A succeeds B directly</dd>
+ * 
+ * <dt>succeeds</dt>
+ * <dd>A succeeds B</dd>
  * </dl>
- *
+ * 
  * @author diewald
  */
 public class FrameConstraint {
 
-    public static final int
-        PRECEDES          = 1,
-        PRECEDES_DIRECTLY = 1 << 1,
-        OVERLAPS_LEFT     = 1 << 2,
-        ALIGNS_LEFT       = 1 << 3,
-        STARTS_WITH       = 1 << 4,
-        MATCHES           = 1 << 5,
-        IS_WITHIN         = 1 << 6,
-        IS_AROUND         = 1 << 7,
-        ENDS_WITH         = 1 << 8,
-        ALIGNS_RIGHT      = 1 << 9,
-        OVERLAPS_RIGHT    = 1 << 10,
-        SUCCEEDS_DIRECTLY = 1 << 11,
-        SUCCEEDS          = 1 << 12,
-        ALL               = 1024 * 8 - 1;
+    public static final int PRECEDES = 1, PRECEDES_DIRECTLY = 1 << 1,
+            OVERLAPS_LEFT = 1 << 2, ALIGNS_LEFT = 1 << 3, STARTS_WITH = 1 << 4,
+            MATCHES = 1 << 5, IS_WITHIN = 1 << 6, IS_AROUND = 1 << 7,
+            ENDS_WITH = 1 << 8, ALIGNS_RIGHT = 1 << 9,
+            OVERLAPS_RIGHT = 1 << 10, SUCCEEDS_DIRECTLY = 1 << 11,
+            SUCCEEDS = 1 << 12, ALL = 1024 * 8 - 1;
 
 
-    private static final Map<String,Integer> FRAME;
+    private static final Map<String, Integer> FRAME;
     private static final List<Integer> NEXT_B;
 
     static {
         Map<String, Integer> FRAME_t = new HashMap<>();
-        List<Integer> NEXT_B_t       = new ArrayList(16);
+        List<Integer> NEXT_B_t = new ArrayList(16);
 
         /*
          * A precedes B
@@ -122,7 +114,7 @@
          */
         FRAME_t.put("alignsLeft", ALIGNS_LEFT);
         NEXT_B_t.add(PRECEDES | PRECEDES_DIRECTLY | OVERLAPS_LEFT | ALIGNS_LEFT);
-        
+
         /*
          * A starts with B
          *
@@ -132,10 +124,9 @@
          * a.end > b.end && a.start == b.start
          */
         FRAME_t.put("startsWith", STARTS_WITH);
-        NEXT_B_t.add(PRECEDES | PRECEDES_DIRECTLY | OVERLAPS_LEFT |
-                     ALIGNS_LEFT | STARTS_WITH | MATCHES |
-                     IS_AROUND | ENDS_WITH);
-        
+        NEXT_B_t.add(PRECEDES | PRECEDES_DIRECTLY | OVERLAPS_LEFT | ALIGNS_LEFT
+                | STARTS_WITH | MATCHES | IS_AROUND | ENDS_WITH);
+
         /*
          * A matches B
          *
@@ -145,9 +136,9 @@
          * a.end = b.end && a.start = b.start
          */
         FRAME_t.put("matches", MATCHES);
-        NEXT_B_t.add(PRECEDES | PRECEDES_DIRECTLY | OVERLAPS_LEFT |
-                     ALIGNS_LEFT | MATCHES | ENDS_WITH);
-        
+        NEXT_B_t.add(PRECEDES | PRECEDES_DIRECTLY | OVERLAPS_LEFT | ALIGNS_LEFT
+                | MATCHES | ENDS_WITH);
+
         /*
          * A is within B
          *
@@ -168,8 +159,8 @@
          * a.start < b.start && a.end > b.end
          */
         FRAME_t.put("isAround", IS_AROUND);
-        NEXT_B_t.add(PRECEDES | PRECEDES_DIRECTLY | OVERLAPS_LEFT |
-                     IS_AROUND | ENDS_WITH);
+        NEXT_B_t.add(PRECEDES | PRECEDES_DIRECTLY | OVERLAPS_LEFT | IS_AROUND
+                | ENDS_WITH);
 
         /*
          * A ends with B
@@ -191,8 +182,8 @@
          * a.start > b.start && a.end == b.end
          */
         FRAME_t.put("alignsRight", ALIGNS_RIGHT);
-        NEXT_B_t.add(PRECEDES | PRECEDES_DIRECTLY | ALIGNS_LEFT |
-                     MATCHES | IS_WITHIN | ALIGNS_RIGHT);
+        NEXT_B_t.add(PRECEDES | PRECEDES_DIRECTLY | ALIGNS_LEFT | MATCHES
+                | IS_WITHIN | ALIGNS_RIGHT);
 
         /*
          * A overlaps B to the right
@@ -203,9 +194,9 @@
          * a.start > b.start && a.start < b.end && a.end > b.end
          */
         FRAME_t.put("overlapsRight", OVERLAPS_RIGHT);
-        NEXT_B_t.add(PRECEDES | PRECEDES_DIRECTLY | OVERLAPS_LEFT |
-                     ALIGNS_LEFT | STARTS_WITH | MATCHES | IS_WITHIN |
-                     IS_AROUND | ENDS_WITH | ALIGNS_RIGHT | OVERLAPS_RIGHT);
+        NEXT_B_t.add(PRECEDES | PRECEDES_DIRECTLY | OVERLAPS_LEFT | ALIGNS_LEFT
+                | STARTS_WITH | MATCHES | IS_WITHIN | IS_AROUND | ENDS_WITH
+                | ALIGNS_RIGHT | OVERLAPS_RIGHT);
 
         /*
          * A succeeds B directly
@@ -216,10 +207,9 @@
          * a.start == b.end
          */
         FRAME_t.put("succeedsDirectly", SUCCEEDS_DIRECTLY);
-        NEXT_B_t.add(PRECEDES | PRECEDES_DIRECTLY | OVERLAPS_LEFT |
-                     ALIGNS_LEFT | STARTS_WITH | MATCHES | IS_WITHIN |
-                     IS_AROUND | ENDS_WITH | ALIGNS_RIGHT |
-                     OVERLAPS_RIGHT | SUCCEEDS_DIRECTLY);
+        NEXT_B_t.add(PRECEDES | PRECEDES_DIRECTLY | OVERLAPS_LEFT | ALIGNS_LEFT
+                | STARTS_WITH | MATCHES | IS_WITHIN | IS_AROUND | ENDS_WITH
+                | ALIGNS_RIGHT | OVERLAPS_RIGHT | SUCCEEDS_DIRECTLY);
 
         /*
          * A succeeds B
@@ -230,17 +220,18 @@
          * a.start > b.end
          */
         FRAME_t.put("succeeds", SUCCEEDS);
-        NEXT_B_t.add(PRECEDES | PRECEDES_DIRECTLY | ALIGNS_LEFT |
-                     STARTS_WITH | MATCHES | IS_WITHIN |
-                     ALIGNS_RIGHT | SUCCEEDS_DIRECTLY | SUCCEEDS);
+        NEXT_B_t.add(PRECEDES | PRECEDES_DIRECTLY | ALIGNS_LEFT | STARTS_WITH
+                | MATCHES | IS_WITHIN | ALIGNS_RIGHT | SUCCEEDS_DIRECTLY
+                | SUCCEEDS);
 
-        FRAME  = Collections.unmodifiableMap(FRAME_t);
+        FRAME = Collections.unmodifiableMap(FRAME_t);
         NEXT_B = Collections.unmodifiableList(NEXT_B_t);
     };
 
     // Bitvector representing the frame constraint
     public int vector;
 
+
     /**
      * Constructs a new Frame Constraint.
      */
@@ -248,11 +239,13 @@
         this.vector = 0;
     };
 
+
     /**
      * Add a new valid condition to the Frame Constraint.
-     *
-     * @param condition A string representing a valid condition.
-     *        See the synopsis for valid condition names.
+     * 
+     * @param condition
+     *            A string representing a valid condition.
+     *            See the synopsis for valid condition names.
      * @return The {@link FrameConstraint} for chaining.
      * @throws QueryException
      */
@@ -268,9 +261,10 @@
 
     /**
      * Add new valid conditions to the Frame Constraint.
-     *
-     * @param constraint A Frame constraint representing a set
-     *        of valid conditions.
+     * 
+     * @param constraint
+     *            A Frame constraint representing a set
+     *            of valid conditions.
      * @return The {@link FrameConstraint} for chaining.
      */
     public FrameConstraint add (FrameConstraint constraint) {
@@ -283,7 +277,7 @@
      * Invert the condition set of the frame constraint.
      * All valid conditions become invalid, all invalid
      * conditions become valid.
-     *
+     * 
      * @return The {@link FrameConstraint} for chaining.
      */
     public FrameConstraint invert () {
@@ -294,10 +288,12 @@
 
     /**
      * Check if a condition is valid.
-     *
-     * @param condition A string representing a condition.
-     *        See the synopsis for valid condition names.
-     * @return A boolean value, indicating if a condition is valid or not.
+     * 
+     * @param condition
+     *            A string representing a condition.
+     *            See the synopsis for valid condition names.
+     * @return A boolean value, indicating if a condition is valid or
+     *         not.
      * @throws QueryException
      */
     public boolean check (String condition) throws QueryException {
@@ -312,9 +308,12 @@
 
     /**
      * Check if conditions are valid.
-     *
-     * @param conditions An integer bit vector representing a set of conditions.
-     * @return A boolean value, indicating if at least one condition is valid or not.
+     * 
+     * @param conditions
+     *            An integer bit vector representing a set of
+     *            conditions.
+     * @return A boolean value, indicating if at least one condition
+     *         is valid or not.
      */
     public boolean check (int conditions) {
         return (this.vector & conditions) != 0;
@@ -323,9 +322,12 @@
 
     /**
      * Check if conditions are valid.
-     *
-     * @param conditions A {@link FrameConstraint} representing a set of conditions.
-     * @return A boolean value, indicating if at least one condition is valid or not.
+     * 
+     * @param conditions
+     *            A {@link FrameConstraint} representing a set of
+     *            conditions.
+     * @return A boolean value, indicating if at least one condition
+     *         is valid or not.
      */
     public boolean check (FrameConstraint conditions) {
         return (this.vector & conditions.vector) != 0;
diff --git a/src/main/java/de/ids_mannheim/korap/query/QueryBuilder.java b/src/main/java/de/ids_mannheim/korap/query/QueryBuilder.java
index 28600d5..1e0e0f0 100644
--- a/src/main/java/de/ids_mannheim/korap/query/QueryBuilder.java
+++ b/src/main/java/de/ids_mannheim/korap/query/QueryBuilder.java
@@ -10,20 +10,20 @@
 /**
  * QueryBuilder implements a simple API for wrapping
  * KrillQuery classes.
- *
+ * 
  * Build complex queries.
  * <blockquote><pre>
- *   QueryBuilder qb = new QueryBuilder("tokens");
- *   SpanQueryWrapper sqw = (SpanQueryWrapper)
- *     qb.seq(
- *       qb.empty(),
- *       qb.seg(
- *         qb.re("mate/p=N.*"),
- *         qb.re("opennlp/p=N.*")
- *       )
- *     );
+ * QueryBuilder qb = new QueryBuilder("tokens");
+ * SpanQueryWrapper sqw = (SpanQueryWrapper)
+ * qb.seq(
+ * qb.empty(),
+ * qb.seg(
+ * qb.re("mate/p=N.*"),
+ * qb.re("opennlp/p=N.*")
+ * )
+ * );
  * </pre></blockquote>
- *
+ * 
  * @author diewald
  */
 public class QueryBuilder {
@@ -36,14 +36,15 @@
     public static final boolean DEBUG = false;
 
     // <legacy>
-    public static final byte
-        OVERLAP      = SpanWithinQuery.OVERLAP,
-        REAL_OVERLAP = SpanWithinQuery.REAL_OVERLAP,
-        WITHIN       = SpanWithinQuery.WITHIN,
-        REAL_WITHIN  = SpanWithinQuery.REAL_WITHIN,
-        ENDSWITH     = SpanWithinQuery.ENDSWITH,
-        STARTSWITH   = SpanWithinQuery.STARTSWITH,
-        MATCH        = SpanWithinQuery.MATCH;
+    public static final byte OVERLAP = SpanWithinQuery.OVERLAP,
+            REAL_OVERLAP = SpanWithinQuery.REAL_OVERLAP,
+            WITHIN = SpanWithinQuery.WITHIN,
+            REAL_WITHIN = SpanWithinQuery.REAL_WITHIN,
+            ENDSWITH = SpanWithinQuery.ENDSWITH,
+            STARTSWITH = SpanWithinQuery.STARTSWITH,
+            MATCH = SpanWithinQuery.MATCH;
+
+
     // </legacy>
 
 
@@ -54,15 +55,17 @@
         this.field = field;
     };
 
+
     /**
      * Create a query object based on a regular expression.
-     *
+     * 
      * <blockquote><pre>
-     *   KrillQuery kq = new KrillQuery("tokens");
-     *   SpanRegexQueryWrapper re = kq.re(".+?");
+     * KrillQuery kq = new KrillQuery("tokens");
+     * SpanRegexQueryWrapper re = kq.re(".+?");
      * </pre></blockquote>
-     *
-     * @param re The regular expession as a string.
+     * 
+     * @param re
+     *            The regular expession as a string.
      * @return A {@link SpanRegexQueryWrapper} object.
      */
     public SpanRegexQueryWrapper re (String re) {
@@ -72,26 +75,35 @@
 
     /**
      * Create a query object based on a regular expression.
-     *
-     * Supports flags as defined in {@link org.apache.lucene.util.automaton.RegExp}:
+     * 
+     * Supports flags as defined in
+     * {@link org.apache.lucene.util.automaton.RegExp}:
      * <ul>
-     *   <li><tt>RegExp.ALL</tt> - enables all optional regexp syntax</li>
-     *   <li><tt>RegExp.ANYSTRING</tt> - enables anystring (@)</li>
-     *   <li><tt>RegExp.AUTOMATON</tt> - enables named automata (&lt;identifier&gt;)</li>
-     *   <li><tt>RegExp.COMPLEMENT</tt> - enables complement (~)</li>
-     *   <li><tt>RegExp.EMPTY</tt> - enables empty language (#)</li>
-     *   <li><tt>RegExp.INTERSECTION</tt> - enables intersection (&amp;)</li>
-     *   <li><tt>RegExp.INTERVAL</tt> - enables numerical intervals (&lt;n-m&gt;)</li>
-     *   <li><tt>RegExp.NONE</tt> - enables no optional regexp syntax</li>
+     * <li><tt>RegExp.ALL</tt> - enables all optional regexp
+     * syntax</li>
+     * <li><tt>RegExp.ANYSTRING</tt> - enables anystring (@)</li>
+     * <li><tt>RegExp.AUTOMATON</tt> - enables named automata
+     * (&lt;identifier&gt;)</li>
+     * <li><tt>RegExp.COMPLEMENT</tt> - enables complement (~)</li>
+     * <li><tt>RegExp.EMPTY</tt> - enables empty language (#)</li>
+     * <li><tt>RegExp.INTERSECTION</tt> - enables intersection
+     * (&amp;)</li>
+     * <li><tt>RegExp.INTERVAL</tt> - enables numerical intervals
+     * (&lt;n-m&gt;)</li>
+     * <li><tt>RegExp.NONE</tt> - enables no optional regexp
+     * syntax</li>
      * </ul>
-     *
+     * 
      * <blockquote><pre>
-     *   KrillQuery kq = new KrillQuery("tokens");
-     *   SpanRegexQueryWrapper re = kq.re("[Aa]lternatives?", RegExp.NONE);
+     * KrillQuery kq = new KrillQuery("tokens");
+     * SpanRegexQueryWrapper re = kq.re("[Aa]lternatives?",
+     * RegExp.NONE);
      * </pre></blockquote>
-     *
-     * @param re The regular expession as a string.
-     * @param flags The flag for the regular expression.
+     * 
+     * @param re
+     *            The regular expession as a string.
+     * @param flags
+     *            The flag for the regular expression.
      * @return A {@link SpanRegexQueryWrapper} object.
      */
     public SpanRegexQueryWrapper re (String re, int flags) {
@@ -101,70 +113,85 @@
 
     /**
      * Create a query object based on a regular expression.
-     *
+     * 
      * Supports flags (see above) and case insensitivity.
-     *
+     * 
      * <blockquote><pre>
-     *   KrillQuery kq = new KrillQuery("tokens");
-     *   SpanRegexQueryWrapper re = kq.re("alternatives?", RegExp.NONE, true);
+     * KrillQuery kq = new KrillQuery("tokens");
+     * SpanRegexQueryWrapper re = kq.re("alternatives?", RegExp.NONE,
+     * true);
      * </pre></blockquote>
-     *
-     * @param re The regular expession as a string.
-     * @param flags The flag for the regular expression.
-     * @param caseinsensitive A boolean value indicating case insensitivity.
+     * 
+     * @param re
+     *            The regular expession as a string.
+     * @param flags
+     *            The flag for the regular expression.
+     * @param caseinsensitive
+     *            A boolean value indicating case insensitivity.
      * @return A {@link SpanRegexQueryWrapper} object.
      */
-    public SpanRegexQueryWrapper re (String re, int flags, boolean caseinsensitive) {
+    public SpanRegexQueryWrapper re (String re, int flags,
+            boolean caseinsensitive) {
         return new SpanRegexQueryWrapper(this.field, re, flags, caseinsensitive);
     };
 
 
     /**
      * Create a query object based on a regular expression.
-     *
+     * 
      * Supports case insensitivity.
-     *
+     * 
      * <blockquote><pre>
-     *   KrillQuery kq = new KrillQuery("tokens");
-     *   SpanRegexQueryWrapper re = kq.re("alternatives?", true);
+     * KrillQuery kq = new KrillQuery("tokens");
+     * SpanRegexQueryWrapper re = kq.re("alternatives?", true);
      * </pre></blockquote>
-     *
-     * @param re The regular expession as a string.
-     * @param flags The flag for the regular expression.
+     * 
+     * @param re
+     *            The regular expession as a string.
+     * @param flags
+     *            The flag for the regular expression.
      * @return A {@link SpanRegexQueryWrapper} object.
      */
     public SpanRegexQueryWrapper re (String re, boolean caseinsensitive) {
-        return new SpanRegexQueryWrapper(this.field, re, RegExp.ALL, caseinsensitive);
+        return new SpanRegexQueryWrapper(this.field, re, RegExp.ALL,
+                caseinsensitive);
     };
 
+
     /**
      * Create a query object based on a wildcard term.
-     * <tt>*</tt> indicates an optional sequence of arbitrary characters,
+     * <tt>*</tt> indicates an optional sequence of arbitrary
+     * characters,
      * <tt>?</tt> indicates a single character,
      * <tt>\</tt> can be used for escaping.
-     *
-     * @param wc The wildcard term as a string.
+     * 
+     * @param wc
+     *            The wildcard term as a string.
      * @return A {@link SpanWildcardQueryWrapper} object.
      */
     public SpanWildcardQueryWrapper wc (String wc) {
         return new SpanWildcardQueryWrapper(this.field, wc, false);
     };
 
+
     /**
      * Create a query object based on a wildcard term.
-     * <tt>*</tt> indicates an optional sequence of arbitrary characters,
+     * <tt>*</tt> indicates an optional sequence of arbitrary
+     * characters,
      * <tt>?</tt> indicates a single character,
      * <tt>\</tt> can be used for escaping.
-     *
+     * 
      * Supports case insensitivity.
-     *
+     * 
      * <blockquote><pre>
-     *   KrillQuery kq = new KrillQuery("tokens");
-     *   SpanWildcardQueryWrapper wc = kq.wc("wall*", true);
+     * KrillQuery kq = new KrillQuery("tokens");
+     * SpanWildcardQueryWrapper wc = kq.wc("wall*", true);
      * </pre></blockquote>
-     *
-     * @param wc The wildcard term as a string.
-     * @param caseinsensitive A boolean value indicating case insensitivity.
+     * 
+     * @param wc
+     *            The wildcard term as a string.
+     * @param caseinsensitive
+     *            A boolean value indicating case insensitivity.
      * @return A {@link SpanWildcardQueryWrapper} object.
      */
     public SpanWildcardQueryWrapper wc (String wc, boolean caseinsensitive) {
@@ -174,12 +201,12 @@
 
     /**
      * Create a segment query object.
-     *
+     * 
      * <blockquote><pre>
-     *   KrillQuery kq = new KrillQuery("tokens");
-     *   SpanSegmentQueryWrapper seg = kq.seg();
+     * KrillQuery kq = new KrillQuery("tokens");
+     * SpanSegmentQueryWrapper seg = kq.seg();
      * </pre></blockquote>
-     *
+     * 
      * @return A {@link SpanSegmentQueryWrapper} object.
      */
     public SpanSegmentQueryWrapper seg () {
@@ -191,16 +218,17 @@
      * Create a segment query object.
      * Supports sequences of strings or {@link SpanRegexQueryWrapper},
      * and {@link SpanAlterQueryWrapper} objects.
-     *
+     * 
      * <blockquote><pre>
-     *   KrillQuery kq = new KrillQuery("tokens");
-     *   SpanSegmentQueryWrapper seg = kq.seg(
-     *       kq.re("mate/p=.*?"),
-     *       kq.re("opennlp/p=.*?")
-     *   );
+     * KrillQuery kq = new KrillQuery("tokens");
+     * SpanSegmentQueryWrapper seg = kq.seg(
+     * kq.re("mate/p=.*?"),
+     * kq.re("opennlp/p=.*?")
+     * );
      * </pre></blockquote>
-     *
-     * @param terms[] An array of terms, the segment consists of.
+     * 
+     * @param terms
+     *            [] An array of terms, the segment consists of.
      * @return A {@link SpanSegmentQueryWrapper} object.
      */
     // Sequence of regular expression queries
@@ -211,6 +239,7 @@
         return ssq;
     };
 
+
     // Sequence of alternative queries
     public SpanSegmentQueryWrapper seg (SpanAlterQueryWrapper ... terms) {
         SpanSegmentQueryWrapper ssq = new SpanSegmentQueryWrapper(this.field);
@@ -219,6 +248,7 @@
         return ssq;
     };
 
+
     // Sequence of alternative queries
     public SpanSegmentQueryWrapper seg (String ... terms) {
         SpanSegmentQueryWrapper ssq = new SpanSegmentQueryWrapper(this.field);
@@ -227,12 +257,13 @@
         return ssq;
     };
 
+
     /**
      * Create an empty query segment.
-     *
+     * 
      * <blockquote><pre>
-     *   KrillQuery kq = new KrillQuery("tokens");
-     *   SpanRepetitionQueryWrapper seg = kq.empty();
+     * KrillQuery kq = new KrillQuery("tokens");
+     * SpanRepetitionQueryWrapper seg = kq.empty();
      * </pre></blockquote>
      */
     public SpanRepetitionQueryWrapper empty () {
@@ -245,7 +276,9 @@
 
     /**
      * Create a segment alternation query object.
-     * @param terms[] An array of alternative terms.
+     * 
+     * @param terms
+     *            [] An array of alternative terms.
      */
     public SpanAlterQueryWrapper or (SpanQueryWrapper ... terms) {
         SpanAlterQueryWrapper ssaq = new SpanAlterQueryWrapper(this.field);
@@ -274,7 +307,9 @@
 
     /**
      * Create a sequence of segments query object.
-     * @param terms[] An array of segment defining terms.
+     * 
+     * @param terms
+     *            [] An array of segment defining terms.
      */
     public SpanSequenceQueryWrapper seq (SpanQueryWrapper ... terms) {
         SpanSequenceQueryWrapper sssq = new SpanSequenceQueryWrapper(this.field);
@@ -286,7 +321,9 @@
 
     /**
      * Create a sequence of segments query object.
-     * @param re A SpanSegmentRegexQuery, starting the sequence.
+     * 
+     * @param re
+     *            A SpanSegmentRegexQuery, starting the sequence.
      */
     public SpanSequenceQueryWrapper seq (SpanRegexQueryWrapper re) {
         return new SpanSequenceQueryWrapper(this.field, re);
@@ -303,7 +340,8 @@
                 ssq.append((SpanRegexQueryWrapper) t);
             }
             else {
-                log.error("{} is not an acceptable parameter for seq()", t.getClass());
+                log.error("{} is not an acceptable parameter for seq()",
+                        t.getClass());
                 return ssq;
             };
         };
@@ -315,82 +353,103 @@
         return new SpanElementQueryWrapper(this.field, element);
     };
 
+
     /**
      * Create a wrapping within query object.
-     * @param element A SpanQuery.
-     * @param embedded A SpanQuery that is wrapped in the element.
+     * 
+     * @param element
+     *            A SpanQuery.
+     * @param embedded
+     *            A SpanQuery that is wrapped in the element.
      */
     @Deprecated
     public SpanWithinQueryWrapper within (SpanQueryWrapper element,
-                                          SpanQueryWrapper embedded) {
+            SpanQueryWrapper embedded) {
         return new SpanWithinQueryWrapper(element, embedded);
     };
-    
+
+
     public SpanWithinQueryWrapper contains (SpanQueryWrapper element,
-                                            SpanQueryWrapper embedded) {
+            SpanQueryWrapper embedded) {
         return new SpanWithinQueryWrapper(element, embedded, WITHIN);
     };
 
+
     public SpanWithinQueryWrapper startswith (SpanQueryWrapper element,
-                                              SpanQueryWrapper embedded) {
+            SpanQueryWrapper embedded) {
         return new SpanWithinQueryWrapper(element, embedded, STARTSWITH);
     };
 
+
     public SpanWithinQueryWrapper endswith (SpanQueryWrapper element,
-                                            SpanQueryWrapper embedded) {
+            SpanQueryWrapper embedded) {
         return new SpanWithinQueryWrapper(element, embedded, ENDSWITH);
     };
 
+
     public SpanWithinQueryWrapper overlaps (SpanQueryWrapper element,
-                                            SpanQueryWrapper embedded) {
+            SpanQueryWrapper embedded) {
         return new SpanWithinQueryWrapper(element, embedded, OVERLAP);
-    }; 
+    };
+
 
     public SpanWithinQueryWrapper matches (SpanQueryWrapper element,
-                                           SpanQueryWrapper embedded) {
+            SpanQueryWrapper embedded) {
         return new SpanWithinQueryWrapper(element, embedded, MATCH);
-    }; 
+    };
+
 
     // Class
     public SpanClassQueryWrapper _ (byte number, SpanQueryWrapper element) {
         return new SpanClassQueryWrapper(element, number);
     };
 
+
     public SpanClassQueryWrapper _ (int number, SpanQueryWrapper element) {
         return new SpanClassQueryWrapper(element, number);
     };
 
+
     public SpanClassQueryWrapper _ (short number, SpanQueryWrapper element) {
         return new SpanClassQueryWrapper(element, number);
     };
 
+
     public SpanClassQueryWrapper _ (SpanQueryWrapper element) {
         return new SpanClassQueryWrapper(element);
     };
 
+
     // Focus
     public SpanFocusQueryWrapper focus (byte number, SpanQueryWrapper element) {
         return new SpanFocusQueryWrapper(element, number);
     };
 
+
     public SpanFocusQueryWrapper focus (int number, SpanQueryWrapper element) {
         return new SpanFocusQueryWrapper(element, number);
     };
 
+
     public SpanFocusQueryWrapper focus (short number, SpanQueryWrapper element) {
         return new SpanFocusQueryWrapper(element, number);
     };
 
+
     public SpanFocusQueryWrapper focus (SpanQueryWrapper element) {
         return new SpanFocusQueryWrapper(element);
     };
 
+
     // Repetition
-    public SpanRepetitionQueryWrapper repeat (SpanQueryWrapper element, int exact) {
+    public SpanRepetitionQueryWrapper repeat (SpanQueryWrapper element,
+            int exact) {
         return new SpanRepetitionQueryWrapper(element, exact);
     };
 
-    public SpanRepetitionQueryWrapper repeat (SpanQueryWrapper element, int min, int max) {
+
+    public SpanRepetitionQueryWrapper repeat (SpanQueryWrapper element,
+            int min, int max) {
         return new SpanRepetitionQueryWrapper(element, min, max);
     };
 };
diff --git a/src/main/java/de/ids_mannheim/korap/query/SimpleSpanQuery.java b/src/main/java/de/ids_mannheim/korap/query/SimpleSpanQuery.java
index b490bf8..ff47287 100644
--- a/src/main/java/de/ids_mannheim/korap/query/SimpleSpanQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/query/SimpleSpanQuery.java
@@ -14,21 +14,28 @@
 import de.ids_mannheim.korap.query.spans.ElementSpans;
 
 /**
- * A base class for Spanqueries. It added some properties and methods to the
+ * A base class for Spanqueries. It added some properties and methods
+ * to the
  * Lucene {@link SpanQuery} class.
  * 
- * The constructors of this class specify three kinds of spanqueries: <br/>
+ * The constructors of this class specify three kinds of spanqueries:
+ * <br/>
  * <br/>
  * 
  * <ol>
- * <li>Term span based queries are spanqueries retrieving spans based on a
+ * <li>Term span based queries are spanqueries retrieving spans based
+ * on a
  * single sub/child spanquery. <br/>
- * This kind of query is similar to the Lucene {@link SpanTermQuery}. It
- * searches for term spans in an index and creates a span enumeration of them.
- * Additionally, the retrieved spans contain some information related to the
+ * This kind of query is similar to the Lucene {@link SpanTermQuery}.
+ * It
+ * searches for term spans in an index and creates a span enumeration
+ * of them.
+ * Additionally, the retrieved spans contain some information related
+ * to the
  * type of the term spans, or modified the term span positions.
  * 
- * For instance, a {@link SpanAttributeQuery} retrieves {@link AttributeSpans},
+ * For instance, a {@link SpanAttributeQuery} retrieves
+ * {@link AttributeSpans},
  * which in addition to the Lucene SpanTermQuery properties, also have
  * references to element or relation spans. <br/>
  * <br/>
@@ -36,17 +43,23 @@
  * 
  * <li>Spanqueries based on two sub/child spanqueries. <br/>
  * These queries compare the positions or other properties of two sub
- * spanqueries. Examples of such queries are distance-based queries calculating
- * the distance between two sub/child spans. The resulting spans possibly
- * stretch from the start position of a sub/child span to the end position of
+ * spanqueries. Examples of such queries are distance-based queries
+ * calculating
+ * the distance between two sub/child spans. The resulting spans
+ * possibly
+ * stretch from the start position of a sub/child span to the end
+ * position of
  * the other sub/child span. <br/>
  * <br/>
  * </li>
  * 
- * <li>Spanqueries comparing a sub/child spanquery to a list of spanqueries. <br/>
- * An example of such queries is {@link SpanWithAttributeQuery} matching an
- * {@link SpanElementQuery} and a list of SpanAttributeQueries. In other words,
- * it retrieves {@link ElementSpans} having some specific attributes.<br/>
+ * <li>Spanqueries comparing a sub/child spanquery to a list of
+ * spanqueries. <br/>
+ * An example of such queries is {@link SpanWithAttributeQuery}
+ * matching an {@link SpanElementQuery} and a list of
+ * SpanAttributeQueries. In other words,
+ * it retrieves {@link ElementSpans} having some specific
+ * attributes.<br/>
  * <br/>
  * </li>
  * </ol>
@@ -57,21 +70,26 @@
  * */
 public abstract class SimpleSpanQuery extends SpanQuery implements Cloneable {
 
-	protected SpanQuery firstClause = null, secondClause = null;
+    protected SpanQuery firstClause = null, secondClause = null;
     protected List<SpanQuery> clauseList = null;
     private String field;
     protected boolean collectPayloads;
 
+
     /**
-     * Constructs a new SimpleSpanQuery using the specified {@link SpanQuery}
-     * and set whether payloads are to be collected or not.
+     * Constructs a new SimpleSpanQuery using the specified
+     * {@link SpanQuery} and set whether payloads are to be collected
+     * or not.
      * 
-     * @param firstClause a {@link SpanQuery}
-     * @param collectPayloads a boolean flag representing the value
-     *        <code>true</code> if payloads are to be collected, otherwise
-     *        <code>false</code>.
+     * @param firstClause
+     *            a {@link SpanQuery}
+     * @param collectPayloads
+     *            a boolean flag representing the value
+     *            <code>true</code> if payloads are to be collected,
+     *            otherwise
+     *            <code>false</code>.
      * */
-    public SimpleSpanQuery(SpanQuery firstClause, boolean collectPayloads) {
+    public SimpleSpanQuery (SpanQuery firstClause, boolean collectPayloads) {
         if (firstClause == null) {
             throw new IllegalArgumentException(
                     "The first clause cannot be null.");
@@ -81,18 +99,24 @@
         this.collectPayloads = collectPayloads;
     }
 
+
     /**
-     * Constructs a new SimpleSpanQuery using the specified spanqueries and set
+     * Constructs a new SimpleSpanQuery using the specified
+     * spanqueries and set
      * whether payloads are to be collected or not.
      * 
-     * @param firstClause a {@link SpanQuery}
-     * @param secondClause a {@link SpanQuery}
-     * @param collectPayloads a boolean flag representing the value
-     *        <code>true</code> if payloads are to be collected, otherwise
-     *        <code>false</code>.
+     * @param firstClause
+     *            a {@link SpanQuery}
+     * @param secondClause
+     *            a {@link SpanQuery}
+     * @param collectPayloads
+     *            a boolean flag representing the value
+     *            <code>true</code> if payloads are to be collected,
+     *            otherwise
+     *            <code>false</code>.
      * */
-    public SimpleSpanQuery(SpanQuery firstClause, SpanQuery secondClause,
-            boolean collectPayloads) {
+    public SimpleSpanQuery (SpanQuery firstClause, SpanQuery secondClause,
+                            boolean collectPayloads) {
         this(firstClause, collectPayloads);
         if (secondClause == null) {
             throw new IllegalArgumentException(
@@ -102,140 +126,163 @@
         this.setSecondClause(secondClause);
     }
 
+
     /**
-     * Constructs a new SimpleSpanQuery using the spanqueries in the specified
+     * Constructs a new SimpleSpanQuery using the spanqueries in the
+     * specified
      * list and set whether payloads are to be collected or not.
      * 
-     * @param firstClause a {@link SpanQuery}
-     * @param secondClauses a list of spanqueries
-     * @param collectPayloads a boolean flag representing the value
-     *        <code>true</code> if payloads are to be collected, otherwise
-     *        <code>false</code>.
+     * @param firstClause
+     *            a {@link SpanQuery}
+     * @param secondClauses
+     *            a list of spanqueries
+     * @param collectPayloads
+     *            a boolean flag representing the value
+     *            <code>true</code> if payloads are to be collected,
+     *            otherwise
+     *            <code>false</code>.
      * */
-    public SimpleSpanQuery(SpanQuery firstClause,
-            List<SpanQuery> secondClauses, boolean collectPayloads) {
-		this(firstClause, collectPayloads);
-		setClauseList(secondClauses);
+    public SimpleSpanQuery (SpanQuery firstClause,
+                            List<SpanQuery> secondClauses,
+                            boolean collectPayloads) {
+        this(firstClause, collectPayloads);
+        setClauseList(secondClauses);
     }
 
-	public SimpleSpanQuery(List<SpanQuery> clauses, boolean collectPayloads) {
-		this.collectPayloads = collectPayloads;
-		setClauseList(clauses);
-	}
 
-	private void checkField(SpanQuery clause) {
+    public SimpleSpanQuery (List<SpanQuery> clauses, boolean collectPayloads) {
+        this.collectPayloads = collectPayloads;
+        setClauseList(clauses);
+    }
+
+
+    private void checkField (SpanQuery clause) {
         if (!clause.getField().equals(field)) {
             throw new IllegalArgumentException(
                     "Clauses must have the same field.");
         }
     }
 
+
     /**
      * Returns a set of child spanqueries used in this query.
      * 
      * @return a list of spanqueries
      */
-    public List<SpanQuery> getClauseList() {
+    public List<SpanQuery> getClauseList () {
         return clauseList;
     }
 
+
     /**
      * Sets a list of child spanqueries.
      * 
-     * @param clauseList a list of spanqueries
+     * @param clauseList
+     *            a list of spanqueries
      */
-	public void setClauseList(List<SpanQuery> clauses) {
-		if (clauses == null) {
-			throw new IllegalArgumentException(
-					"The list of clauses cannot be null.");
-		}
-		if (clauses.size() < 1) {
-			throw new IllegalArgumentException(
-					"The list of clauses cannot be empty.");
-		}
+    public void setClauseList (List<SpanQuery> clauses) {
+        if (clauses == null) {
+            throw new IllegalArgumentException(
+                    "The list of clauses cannot be null.");
+        }
+        if (clauses.size() < 1) {
+            throw new IllegalArgumentException(
+                    "The list of clauses cannot be empty.");
+        }
 
-		if (this.field == null) {
-			this.field = clauses.get(0).getField();
-		}
+        if (this.field == null) {
+            this.field = clauses.get(0).getField();
+        }
 
-		for (SpanQuery clause : clauses) {
-			if (clause == null) {
-				throw new IllegalArgumentException("A clause cannot be null.");
-			}
-			checkField(clause);
-		}
-		this.clauseList = clauses;
+        for (SpanQuery clause : clauses) {
+            if (clause == null) {
+                throw new IllegalArgumentException("A clause cannot be null.");
+            }
+            checkField(clause);
+        }
+        this.clauseList = clauses;
     }
 
+
     /**
      * {@inheritDoc}
      * */
     @Override
-    public String getField() {
+    public String getField () {
         return field;
     }
 
+
     /**
      * Returns the first child {@link SpanQuery}.
      * 
      * @return the first child {@link SpanQuery}.
      */
-    public SpanQuery getFirstClause() {
+    public SpanQuery getFirstClause () {
         return firstClause;
     }
 
+
     /**
      * Sets the first child {@link SpanQuery}.
      * 
-     * @param firstClause the first child {@link SpanQuery}.
+     * @param firstClause
+     *            the first child {@link SpanQuery}.
      */
-    public void setFirstClause(SpanQuery firstClause) {
+    public void setFirstClause (SpanQuery firstClause) {
         this.firstClause = firstClause;
     }
 
+
     /**
      * Returns the second child {@link SpanQuery}.
      * 
      * @return the second child {@link SpanQuery}.
      */
-    public SpanQuery getSecondClause() {
+    public SpanQuery getSecondClause () {
         return secondClause;
     }
 
+
     /**
      * Sets the second child {@link SpanQuery}.
      * 
-     * @param secondClause the second child {@link SpanQuery}.
+     * @param secondClause
+     *            the second child {@link SpanQuery}.
      */
-    public void setSecondClause(SpanQuery secondClause) {
+    public void setSecondClause (SpanQuery secondClause) {
         this.secondClause = secondClause;
     }
 
+
     /**
      * Tells if payloads are to be collected or not.
      * 
      * @return <code>true</code> if payloads are to be collected,
      *         <code>false</code> otherwise.
      */
-    public boolean isCollectPayloads() {
+    public boolean isCollectPayloads () {
         return collectPayloads;
     }
 
+
     /**
      * Sets <code>true</code> if payloads are to be collected,
      * <code>false</code> otherwise.
      * 
-     * @param collectPayloads a boolean flag determining if payloads are to be
-     *        collected or not.
+     * @param collectPayloads
+     *            a boolean flag determining if payloads are to be
+     *            collected or not.
      */
-    public void setCollectPayloads(boolean collectPayloads) {
+    public void setCollectPayloads (boolean collectPayloads) {
         this.collectPayloads = collectPayloads;
     }
 
+
     // For rewriting fuzzy searches like wildcard and regex
     /** {@inheritDoc} */
     @Override
-    public void extractTerms(Set<Term> terms) {
+    public void extractTerms (Set<Term> terms) {
 
         if (terms == null) {
             throw new IllegalArgumentException("The term set cannot be null.");
@@ -247,31 +294,35 @@
 
         if (secondClause != null) {
             secondClause.extractTerms(terms);
-        } else if (clauseList != null) {
+        }
+        else if (clauseList != null) {
             for (SpanQuery clause : clauseList) {
                 clause.extractTerms(terms);
             }
         }
     };
 
+
     /** {@inheritDoc} */
     @Override
-    public Query rewrite(IndexReader reader) throws IOException {
+    public Query rewrite (IndexReader reader) throws IOException {
         SimpleSpanQuery clone = null;
-		if (firstClause != null) {
-			clone = updateClone(reader, clone, firstClause, 1);
-		}
+        if (firstClause != null) {
+            clone = updateClone(reader, clone, firstClause, 1);
+        }
         if (secondClause != null) {
             clone = updateClone(reader, clone, secondClause, 2);
-        } 
+        }
         else if (clauseList != null) {
             clone = updateClone(reader, clone, clauseList);
         }
         return (clone != null ? clone : this);
     }
 
+
     /**
-     * Rewrites the spanqueries from the specified list, sets them to the clone,
+     * Rewrites the spanqueries from the specified list, sets them to
+     * the clone,
      * and return the clone.
      * 
      * @param reader
@@ -280,7 +331,7 @@
      * @return a SimpleSpanQuery
      * @throws IOException
      */
-    private SimpleSpanQuery updateClone(IndexReader reader,
+    private SimpleSpanQuery updateClone (IndexReader reader,
             SimpleSpanQuery clone, List<SpanQuery> spanQueries)
             throws IOException {
 
@@ -295,8 +346,10 @@
         return clone;
     }
 
+
     /**
-     * Rewrites the specified {@link SpanQuery} and sets it either as the first
+     * Rewrites the specified {@link SpanQuery} and sets it either as
+     * the first
      * or the second child {@link SpanQuery} of the clone.
      * 
      * @param reader
@@ -306,7 +359,7 @@
      * @return a SimpleSpanQuery
      * @throws IOException
      */
-    private SimpleSpanQuery updateClone(IndexReader reader,
+    private SimpleSpanQuery updateClone (IndexReader reader,
             SimpleSpanQuery clone, SpanQuery sq, int clauseNumber)
             throws IOException {
         SpanQuery query = (SpanQuery) sq.rewrite(reader);
@@ -321,12 +374,13 @@
         return clone;
     }
 
+
     /**
      * {@inheritDoc}
      * */
     // Used in rewriting query
     @Override
-    public boolean equals(Object o) {
+    public boolean equals (Object o) {
         if (this == o)
             return true;
         if (getClass() != o.getClass())
@@ -339,7 +393,8 @@
             return false;
         if (secondClause != null && !secondClause.equals(q.secondClause)) {
             return false;
-        } else if (clauseList != null) {
+        }
+        else if (clauseList != null) {
             for (int i = 0; i < clauseList.size(); i++) {
                 SpanQuery query = (SpanQuery) clauseList.get(i);
                 if (!query.equals(q.getClauseList().get(i))) {
@@ -351,13 +406,15 @@
         return true;
     };
 
+
     /** {@inheritDoc} */
     @Override
-    public int hashCode() {
+    public int hashCode () {
         int hc = firstClause.hashCode();
         if (secondClause != null) {
             hc += secondClause.hashCode();
-        } else if (clauseList != null) {
+        }
+        else if (clauseList != null) {
             for (int i = 0; i < clauseList.size(); i++) {
                 hc += clauseList.get(i).hashCode();
             }
@@ -367,6 +424,7 @@
         return hc;
     };
 
-    public abstract SimpleSpanQuery clone();
+
+    public abstract SimpleSpanQuery clone ();
 
 }
diff --git a/src/main/java/de/ids_mannheim/korap/query/SpanAttributeQuery.java b/src/main/java/de/ids_mannheim/korap/query/SpanAttributeQuery.java
index 6a5038c..2bef713 100644
--- a/src/main/java/de/ids_mannheim/korap/query/SpanAttributeQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/query/SpanAttributeQuery.java
@@ -15,25 +15,30 @@
 import de.ids_mannheim.korap.query.spans.AttributeSpans;
 
 /**
- * SpanAttributeQuery retrieves {@link AttributeSpans}, that are tokens
+ * SpanAttributeQuery retrieves {@link AttributeSpans}, that are
+ * tokens
  * annotated with prefix @, for example {@literal @}:class=header.
- * SpanAttributeQueries are commonly used to search for elements or relations
+ * SpanAttributeQueries are commonly used to search for elements or
+ * relations
  * having some specific attribute(s).
  * 
  * Example: <br/>
  * <br/>
  * 
  * <pre>
- * SpanAttributeQuery saq = new SpanAttributeQuery(new SpanTermQuery(new Term(
- *         &quot;tokens&quot;, &quot;@:class=title&quot;)), true);
+ * SpanAttributeQuery saq = new SpanAttributeQuery(new
+ * SpanTermQuery(new Term(
+ * &quot;tokens&quot;, &quot;@:class=title&quot;)), true);
  * </pre>
  * 
- * Negation enables searching for elements <em>without</em> some attribute(s).
+ * Negation enables searching for elements <em>without</em> some
+ * attribute(s).
  * Example:
  * 
  * <pre>
- * SpanAttributeQuery saq = new SpanAttributeQuery(new SpanTermQuery(new Term(
- *         &quot;token&quot;, &quot;@:class=title&quot;)), true, true);
+ * SpanAttributeQuery saq = new SpanAttributeQuery(new
+ * SpanTermQuery(new Term(
+ * &quot;token&quot;, &quot;@:class=title&quot;)), true, true);
  * </pre>
  * 
  * @author margaretha
@@ -42,43 +47,59 @@
 
     boolean negation;
 
-    /**
-     * Constructs a SpanAttributeQuery based on the specified
-     * {@link SpanTermQuery} and set whether payloads are to be collected or
-     * not.
-     * 
-     * @param firstClause a {@link SpanTermQuery}
-     * @param collectPayloads a boolean flag representing the value
-     *        <code>true</code> if payloads are to be collected, otherwise
-     *        <code>false</code>.
-     */
-    public SpanAttributeQuery(SpanTermQuery firstClause, boolean collectPayloads) {
-        super(firstClause, collectPayloads);
-    }
 
     /**
      * Constructs a SpanAttributeQuery based on the specified
-     * {@link SpanTermQuery}, which is also marked for negation/omission when
-     * matching to element/relation spans. Additionally set whether payloads are
+     * {@link SpanTermQuery} and set whether payloads are to be
+     * collected or
+     * not.
+     * 
+     * @param firstClause
+     *            a {@link SpanTermQuery}
+     * @param collectPayloads
+     *            a boolean flag representing the value
+     *            <code>true</code> if payloads are to be collected,
+     *            otherwise
+     *            <code>false</code>.
+     */
+    public SpanAttributeQuery (SpanTermQuery firstClause,
+                               boolean collectPayloads) {
+        super(firstClause, collectPayloads);
+    }
+
+
+    /**
+     * Constructs a SpanAttributeQuery based on the specified
+     * {@link SpanTermQuery}, which is also marked for
+     * negation/omission when
+     * matching to element/relation spans. Additionally set whether
+     * payloads are
      * to be collected or not.
      * 
-     * @param firstClause a {@link SpanQuery}
-     * @param negation a boolean flag representing the value <code>true</code>
-     *        if the attributes are to be omitted when matching with element or
-     *        relation spans, otherwise <code>false</code>.
-     * @param collectPayloads a boolean flag representing the value
-     *        <code>true</code> if payloads are to be collected, otherwise
-     *        <code>false</code>.
+     * @param firstClause
+     *            a {@link SpanQuery}
+     * @param negation
+     *            a boolean flag representing the value
+     *            <code>true</code>
+     *            if the attributes are to be omitted when matching
+     *            with element or
+     *            relation spans, otherwise <code>false</code>.
+     * @param collectPayloads
+     *            a boolean flag representing the value
+     *            <code>true</code> if payloads are to be collected,
+     *            otherwise
+     *            <code>false</code>.
      */
-    public SpanAttributeQuery(SpanTermQuery firstClause, boolean negation,
-            boolean collectPayloads) {
+    public SpanAttributeQuery (SpanTermQuery firstClause, boolean negation,
+                               boolean collectPayloads) {
         super(firstClause, collectPayloads);
         this.negation = negation;
     }
 
+
     /** {@inheritDoc} */
     @Override
-    public SimpleSpanQuery clone() {
+    public SimpleSpanQuery clone () {
         SpanAttributeQuery sq = new SpanAttributeQuery(
                 (SpanTermQuery) this.firstClause.clone(), this.negation,
                 this.collectPayloads);
@@ -86,44 +107,56 @@
         return sq;
     }
 
+
     @Override
-    public Spans getSpans(AtomicReaderContext context, Bits acceptDocs,
+    public Spans getSpans (AtomicReaderContext context, Bits acceptDocs,
             Map<Term, TermContext> termContexts) throws IOException {
         return new AttributeSpans(this, context, acceptDocs, termContexts);
     }
 
+
     @Override
-    public String toString(String field) {
+    public String toString (String field) {
         StringBuilder sb = new StringBuilder();
         sb.append("spanAttribute(");
-		if (negation) sb.append("!");
+        if (negation)
+            sb.append("!");
         sb.append(firstClause.toString(field));
         sb.append(")");
         sb.append(ToStringUtils.boost(getBoost()));
         return sb.toString();
     }
 
+
     /**
-     * Tells weather the attributes are to be omitted when matching to element
+     * Tells weather the attributes are to be omitted when matching to
+     * element
      * or relation spans, or not.
      * 
-     * @return <code>true</code> if the attributes are to be omitted when
-     *         matching to element or relation spans, <code>false</code>
+     * @return <code>true</code> if the attributes are to be omitted
+     *         when
+     *         matching to element or relation spans,
+     *         <code>false</code>
      *         otherwise.
      */
-    public boolean isNegation() {
+    public boolean isNegation () {
         return negation;
     }
 
+
     /**
-     * Sets true if the attributes are to be omitted when matching to element or
+     * Sets true if the attributes are to be omitted when matching to
+     * element or
      * relation spans, false otherwise.
      * 
-     * @param negation a boolean with value <code>true</code>, if the attributes
-     *        are to be omitted when matching to element or relation spans,
-     *        <code>false</code> otherwise.
+     * @param negation
+     *            a boolean with value <code>true</code>, if the
+     *            attributes
+     *            are to be omitted when matching to element or
+     *            relation spans,
+     *            <code>false</code> otherwise.
      */
-    public void setNegation(boolean negation) {
+    public void setNegation (boolean negation) {
         this.negation = negation;
     }
 
diff --git a/src/main/java/de/ids_mannheim/korap/query/SpanClassQuery.java b/src/main/java/de/ids_mannheim/korap/query/SpanClassQuery.java
index e493c9e..aa9fc7a 100644
--- a/src/main/java/de/ids_mannheim/korap/query/SpanClassQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/query/SpanClassQuery.java
@@ -26,105 +26,112 @@
     protected byte number;
     protected SpanQuery operand;
 
+
     public SpanClassQuery (SpanQuery operand, byte number) {
-	this.field = operand.getField();
-	this.operand = operand;
-	this.number = number;
+        this.field = operand.getField();
+        this.operand = operand;
+        this.number = number;
     };
 
+
     public SpanClassQuery (SpanQuery operand) {
-	this.field = operand.getField();
-	this.operand = operand;
-	this.number = (byte) 1;
+        this.field = operand.getField();
+        this.operand = operand;
+        this.number = (byte) 1;
     };
 
+
     public byte number () {
-	return this.number;
+        return this.number;
     };
 
+
     @Override
-    public String getField () { return field; }
+    public String getField () {
+        return field;
+    }
+
 
     @Override
     public void extractTerms (Set<Term> terms) {
-	this.operand.extractTerms(terms);
+        this.operand.extractTerms(terms);
     };
 
+
     @Override
     public String toString (String field) {
-	StringBuffer buffer = new StringBuffer("{");
-	short classNr = (short) this.number;
-	buffer.append(classNr & 0xFF).append(": ");
+        StringBuffer buffer = new StringBuffer("{");
+        short classNr = (short) this.number;
+        buffer.append(classNr & 0xFF).append(": ");
         buffer.append(this.operand.toString()).append('}');
-	buffer.append(ToStringUtils.boost(getBoost()));
-	return buffer.toString();
+        buffer.append(ToStringUtils.boost(getBoost()));
+        return buffer.toString();
     };
 
+
     @Override
-    public Spans getSpans (final AtomicReaderContext context,
-			   Bits acceptDocs,
-			   Map<Term,TermContext> termContexts) throws IOException {
-	return (Spans) new ClassSpans(
-	    this.operand,
-	    context,
-	    acceptDocs,
-	    termContexts,
-	    number
-        );
+    public Spans getSpans (final AtomicReaderContext context, Bits acceptDocs,
+            Map<Term, TermContext> termContexts) throws IOException {
+        return (Spans) new ClassSpans(this.operand, context, acceptDocs,
+                termContexts, number);
     };
 
+
     @Override
     public Query rewrite (IndexReader reader) throws IOException {
-	SpanClassQuery clone = null;
-	SpanQuery query = (SpanQuery) this.operand.rewrite(reader);
+        SpanClassQuery clone = null;
+        SpanQuery query = (SpanQuery) this.operand.rewrite(reader);
 
-	if (query != this.operand) {
-	    if (clone == null)
-		clone = this.clone();
-	    clone.operand = query;
-	};
+        if (query != this.operand) {
+            if (clone == null)
+                clone = this.clone();
+            clone.operand = query;
+        };
 
-	if (clone != null)
-	    return clone;
+        if (clone != null)
+            return clone;
 
-	return this;
+        return this;
     };
 
+
     @Override
-    public SpanClassQuery clone() {
-	SpanClassQuery spanClassQuery = new SpanClassQuery(
-	    (SpanQuery) this.operand.clone(),
-	    this.number
-        );
-	spanClassQuery.setBoost(getBoost());
-	return spanClassQuery;
+    public SpanClassQuery clone () {
+        SpanClassQuery spanClassQuery = new SpanClassQuery(
+                (SpanQuery) this.operand.clone(), this.number);
+        spanClassQuery.setBoost(getBoost());
+        return spanClassQuery;
     };
 
 
     /** Returns true iff <code>o</code> is equal to this. */
     @Override
     public boolean equals (Object o) {
-	if (this == o) return true;
-	if (!(o instanceof SpanClassQuery)) return false;
-	
-	final SpanClassQuery spanClassQuery = (SpanClassQuery) o;
-	
-	if (!this.operand.equals(spanClassQuery.operand)) return false;
+        if (this == o)
+            return true;
+        if (!(o instanceof SpanClassQuery))
+            return false;
 
-	if (this.number != spanClassQuery.number) return false;
+        final SpanClassQuery spanClassQuery = (SpanClassQuery) o;
 
-	return getBoost() == spanClassQuery.getBoost();
+        if (!this.operand.equals(spanClassQuery.operand))
+            return false;
+
+        if (this.number != spanClassQuery.number)
+            return false;
+
+        return getBoost() == spanClassQuery.getBoost();
     };
 
 
     // I don't know what I am doing here
     @Override
-    public int hashCode() {
-	int result = 1;
-	result = operand.hashCode();
-	result += (int) number;
-	result ^= (result << 15) | (result >>> 18);
-	result += Float.floatToRawIntBits(getBoost());
-	return result;
+    public int hashCode () {
+        int result = 1;
+        result = operand.hashCode();
+        result += (int) number;
+        result ^= (result << 15) | (result >>> 18);
+        result += Float.floatToRawIntBits(getBoost());
+        return result;
     };
 };
diff --git a/src/main/java/de/ids_mannheim/korap/query/SpanDistanceQuery.java b/src/main/java/de/ids_mannheim/korap/query/SpanDistanceQuery.java
index ba07dac..c77bf71 100644
--- a/src/main/java/de/ids_mannheim/korap/query/SpanDistanceQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/query/SpanDistanceQuery.java
@@ -19,20 +19,26 @@
 import de.ids_mannheim.korap.query.spans.UnorderedTokenDistanceSpans;
 
 /**
- * SpanDistanceQuery calculates the distance between two spans and compares it
- * to the distance constraints. The distance constraints are specified as a
- * {@link DistanceConstraint} instance having various properties: the distance
- * unit, the order of the spans (ordered or unordered), co-occurrence (i.e. the
+ * SpanDistanceQuery calculates the distance between two spans and
+ * compares it
+ * to the distance constraints. The distance constraints are specified
+ * as a {@link DistanceConstraint} instance having various properties:
+ * the distance
+ * unit, the order of the spans (ordered or unordered), co-occurrence
+ * (i.e. the
  * spans should co-occur or not), minimum and maximum distance. <br/>
  * <br/>
- * The distance unit can be a word (token), a sentence or a paragraph. The
- * resulting spans typically stretch from the starting position of a former span
+ * The distance unit can be a word (token), a sentence or a paragraph.
+ * The
+ * resulting spans typically stretch from the starting position of a
+ * former span
  * to the end position of the latter span. <br/>
  * <br/>
  * Query examples:
  * 
  * <ol>
- * <li>Search two terms x and y which are separated by minimum two and maximum
+ * <li>Search two terms x and y which are separated by minimum two and
+ * maximum
  * three other words. The order of x and y does not matter.
  * 
  * <pre>
@@ -40,7 +46,8 @@
  * </pre>
  * 
  * </li>
- * <li>Search two terms x and y which are separated by minimum two and maximum
+ * <li>Search two terms x and y which are separated by minimum two and
+ * maximum
  * three other words. X must precede y.
  * 
  * <pre>
@@ -49,7 +56,8 @@
  * 
  * </li>
  * <li>
- * Search term x which do not occur with term y in minimum two and maximum three
+ * Search term x which do not occur with term y in minimum two and
+ * maximum three
  * other words. X must precede y.
  * 
  * <pre>
@@ -57,12 +65,15 @@
  * </pre>
  * 
  * </li>
- * <li>Search two terms x and y separated by minimum one and maximum two
+ * <li>Search two terms x and y separated by minimum one and maximum
+ * two
  * sentences. X must precede y.
  * 
  * <pre>
- * SpanElementQuery e = new SpanElementQuery(&quot;tokens&quot;, &quot;s&quot;);
- * DistanceConstraint dc = new DistanceConstraint(e, 2, 3, true, false);
+ * SpanElementQuery e = new SpanElementQuery(&quot;tokens&quot;,
+ * &quot;s&quot;);
+ * DistanceConstraint dc = new DistanceConstraint(e, 2, 3, true,
+ * false);
  * </pre>
  * 
  * </li>
@@ -74,8 +85,10 @@
  * <li>
  * 
  * <pre>
- * SpanDistanceQuery sq = new SpanDistanceQuery(new SpanTermQuery(new Term(
- *         &quot;tokens&quot;, x)), new SpanTermQuery(new Term(&quot;tokens&quot;, y)), dc, true);
+ * SpanDistanceQuery sq = new SpanDistanceQuery(new SpanTermQuery(new
+ * Term(
+ * &quot;tokens&quot;, x)), new SpanTermQuery(new
+ * Term(&quot;tokens&quot;, y)), dc, true);
  * </pre>
  * 
  * </li>
@@ -83,8 +96,9 @@
  * 
  * <pre>
  * SpanDistanceQuery sq = new SpanDistanceQuery(
- *         new SpanElementQuery(&quot;tokens&quot;, &quot;s&quot;), new SpanElementQuery(&quot;tokens&quot;, y),
- *         dc, true);
+ * new SpanElementQuery(&quot;tokens&quot;, &quot;s&quot;), new
+ * SpanElementQuery(&quot;tokens&quot;, y),
+ * dc, true);
  * </pre>
  * 
  * </li>
@@ -104,21 +118,30 @@
     private String spanName;
     private DistanceConstraint constraint;
 
+
     /**
-     * Constructs a SpanDistanceQuery comparing the distance between the spans
-     * of the two specified spanqueries and based-on the given distance
+     * Constructs a SpanDistanceQuery comparing the distance between
+     * the spans
+     * of the two specified spanqueries and based-on the given
+     * distance
      * constraints.
      * 
-     * @param firstClause a span query
-     * @param secondClause a span query
-     * @param constraint a DistanceConstraint containing all the constraints
-     *        required for the distance query
-     * @param collectPayloads a boolean flag representing the value
-     *        <code>true</code> if payloads are to be collected, otherwise
-     *        <code>false</code>.
+     * @param firstClause
+     *            a span query
+     * @param secondClause
+     *            a span query
+     * @param constraint
+     *            a DistanceConstraint containing all the constraints
+     *            required for the distance query
+     * @param collectPayloads
+     *            a boolean flag representing the value
+     *            <code>true</code> if payloads are to be collected,
+     *            otherwise
+     *            <code>false</code>.
      */
-    public SpanDistanceQuery(SpanQuery firstClause, SpanQuery secondClause,
-            DistanceConstraint constraint, boolean collectPayloads) {
+    public SpanDistanceQuery (SpanQuery firstClause, SpanQuery secondClause,
+                              DistanceConstraint constraint,
+                              boolean collectPayloads) {
         super(firstClause, secondClause, collectPayloads);
 
         if (constraint == null) {
@@ -136,13 +159,15 @@
         if (constraint.getElementQuery() != null) {
             spanName = "spanElementDistance";
             this.elementQuery = constraint.getElementQuery();
-        } else {
+        }
+        else {
             spanName = "spanDistance";
         }
     }
 
+
     @Override
-    public String toString(String field) {
+    public String toString (String field) {
         StringBuilder sb = new StringBuilder();
         sb.append(this.spanName);
         sb.append("(");
@@ -163,8 +188,9 @@
         return sb.toString();
     }
 
+
     @Override
-    public SpanDistanceQuery clone() {
+    public SpanDistanceQuery clone () {
         SpanDistanceQuery spanDistanceQuery = new SpanDistanceQuery(
                 (SpanQuery) firstClause.clone(),
                 (SpanQuery) secondClause.clone(), this.constraint,
@@ -177,25 +203,29 @@
         return spanDistanceQuery;
     }
 
+
     @Override
-    public Spans getSpans(AtomicReaderContext context, Bits acceptDocs,
+    public Spans getSpans (AtomicReaderContext context, Bits acceptDocs,
             Map<Term, TermContext> termContexts) throws IOException {
 
         if (this.elementQuery != null) {
             if (isExclusion()) {
                 return new ElementDistanceExclusionSpans(this, context,
                         acceptDocs, termContexts);
-            } else if (isOrdered) {
+            }
+            else if (isOrdered) {
                 return new ElementDistanceSpans(this, context, acceptDocs,
                         termContexts);
             }
             return new UnorderedElementDistanceSpans(this, context, acceptDocs,
                     termContexts);
 
-        } else if (isExclusion()) {
+        }
+        else if (isExclusion()) {
             return new DistanceExclusionSpans(this, context, acceptDocs,
                     termContexts);
-        } else if (isOrdered) {
+        }
+        else if (isOrdered) {
             return new TokenDistanceSpans(this, context, acceptDocs,
                     termContexts);
         }
@@ -203,99 +233,117 @@
                 termContexts);
     }
 
+
     /**
      * Returns the minimum distance constraint.
      * 
      * @return the minimum distance constraint
      */
-    public int getMinDistance() {
+    public int getMinDistance () {
         return minDistance;
     }
 
+
     /**
      * Sets the minimum distance constraint.
      * 
-     * @param minDistance the minimum distance constraint
+     * @param minDistance
+     *            the minimum distance constraint
      */
-    public void setMinDistance(int minDistance) {
+    public void setMinDistance (int minDistance) {
         this.minDistance = minDistance;
     }
 
+
     /**
      * Returns the maximum distance.
      * 
      * @return the maximum distance constraint
      */
-    public int getMaxDistance() {
+    public int getMaxDistance () {
         return maxDistance;
     }
 
+
     /**
      * Sets a maximum distance.
      * 
-     * @param maxDistance the maximum distance
+     * @param maxDistance
+     *            the maximum distance
      */
-    public void setMaxDistance(int maxDistance) {
+    public void setMaxDistance (int maxDistance) {
         this.maxDistance = maxDistance;
     }
 
+
     /**
      * Returns the element query used as the distance unit.
      * 
      * @return the element distance unit
      */
-    public SpanElementQuery getElementQuery() {
+    public SpanElementQuery getElementQuery () {
         return elementQuery;
     }
 
+
     /**
      * Sets the specified element query used as the distance unit.
      * 
-     * @param elementQuery the SpanElementQuery used as the distance unit
+     * @param elementQuery
+     *            the SpanElementQuery used as the distance unit
      */
-    public void setElementQuery(SpanElementQuery elementQuery) {
+    public void setElementQuery (SpanElementQuery elementQuery) {
         this.elementQuery = elementQuery;
     }
 
+
     /**
      * Tells weather the second sub-span should co-occur or not.
      * 
-     * @return a boolean with <code>true</code> if the second sub-span should
+     * @return a boolean with <code>true</code> if the second sub-span
+     *         should
      *         <em>not</em> co-occur, <code>false</code> otherwise.
      */
-    public boolean isExclusion() {
+    public boolean isExclusion () {
         return exclusion;
     }
 
+
     /**
-     * Sets <code>true</code> if the second sub-span should <em>not</em>
+     * Sets <code>true</code> if the second sub-span should
+     * <em>not</em>
      * co-occur, <code>false</code> otherwise.
      * 
-     * @param exclusion a boolean with value <code>true</code> if the second
-     *        sub-span should <em>not</em> co-occur, <code>false</code>
-     *        otherwise.
+     * @param exclusion
+     *            a boolean with value <code>true</code> if the second
+     *            sub-span should <em>not</em> co-occur,
+     *            <code>false</code>
+     *            otherwise.
      */
-    public void setExclusion(boolean exclusion) {
+    public void setExclusion (boolean exclusion) {
         this.exclusion = exclusion;
     }
 
+
     /**
      * Tells whether the spans must occur in order or not.
      * 
      * @return <code>true</code> if the spans must occur in order,
      *         <code>false</code> otherwise.
      */
-    public boolean isOrdered() {
+    public boolean isOrdered () {
         return isOrdered;
     }
 
+
     /**
      * Sets whether the spans must occur in order or not.
      * 
-     * @param isOrdered <code>true</code> if the spans must occur in order,
-     *        <code>false</code> otherwise.
+     * @param isOrdered
+     *            <code>true</code> if the spans must occur in order,
+     *            <code>false</code> otherwise.
      */
-    public void setOrder(boolean isOrdered) {
+    public void setOrder (boolean isOrdered) {
         this.isOrdered = isOrdered;
     }
 
diff --git a/src/main/java/de/ids_mannheim/korap/query/SpanElementQuery.java b/src/main/java/de/ids_mannheim/korap/query/SpanElementQuery.java
index 1e3f5f6..9aa684a 100644
--- a/src/main/java/de/ids_mannheim/korap/query/SpanElementQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/query/SpanElementQuery.java
@@ -18,7 +18,8 @@
 /**
  * SpanElementQuery retrieves {@link ElementSpans} which are special
  * {@link Term Terms} with prefix &quot;&lt;&gt;&quot;.
- * Unlike {@link TermSpans} ElementSpans may span multiple tokens comprising a
+ * Unlike {@link TermSpans} ElementSpans may span multiple tokens
+ * comprising a
  * phrase, a clause, a sentence and so on. <br/>
  * <br/>
  * Examples of {@link ElementSpans} are
@@ -27,14 +28,16 @@
  * <li>sentences indexed as &lt;&gt;:s
  * 
  * <pre>
- * SpanElementQuery seq = new SpanElementQuery(&quot;tokens&quot;, &quot;s&quot;);
+ * SpanElementQuery seq = new SpanElementQuery(&quot;tokens&quot;,
+ * &quot;s&quot;);
  * </pre>
  * 
  * </li>
  * <li>paragraphs indexed as &lt;&gt;:p
  * 
  * <pre>
- * SpanElementQuery seq = new SpanElementQuery(&quot;tokens&quot;, &quot;p&quot;);
+ * SpanElementQuery seq = new SpanElementQuery(&quot;tokens&quot;,
+ * &quot;p&quot;);
  * </pre>
  * 
  * </li>
@@ -48,66 +51,71 @@
     private static Term elementTerm;
     private String elementStr;
 
+
     /**
-     * Constructs a SpanElementQuery for the given term in the given field.
+     * Constructs a SpanElementQuery for the given term in the given
+     * field.
      * 
-     * @param field a field where a term belongs to
-     * @param term a term
+     * @param field
+     *            a field where a term belongs to
+     * @param term
+     *            a term
      */
-    public SpanElementQuery(String field, String term) {
+    public SpanElementQuery (String field, String term) {
         super(new SpanTermQuery((elementTerm = new Term(field, "<>:" + term))),
-              true);
+                true);
         this.elementStr = term;
     };
 
 
     @Override
-    public Spans getSpans(final AtomicReaderContext context, Bits acceptDocs,
+    public Spans getSpans (final AtomicReaderContext context, Bits acceptDocs,
             Map<Term, TermContext> termContexts) throws IOException {
         return new ElementSpans(this, context, acceptDocs, termContexts);
     };
 
 
     /**
-     * Returns the element name or string, for instance "s" for sentence
+     * Returns the element name or string, for instance "s" for
+     * sentence
      * elements.
      * 
      * @return the element name/string.
      */
-    public String getElementStr() {
+    public String getElementStr () {
         return elementStr;
     };
 
 
     /**
-     * Sets the element name or string, for instance "s" for sentence elements.
+     * Sets the element name or string, for instance "s" for sentence
+     * elements.
      * 
-     * @param elementStr the element name or string
+     * @param elementStr
+     *            the element name or string
      */
-    public void setElementStr(String elementStr) {
+    public void setElementStr (String elementStr) {
         this.elementStr = elementStr;
     }
 
 
     @Override
-    public SimpleSpanQuery clone() {
-        SpanElementQuery sq = new SpanElementQuery(
-            this.getField(),
-            this.getElementStr()
-        );
+    public SimpleSpanQuery clone () {
+        SpanElementQuery sq = new SpanElementQuery(this.getField(),
+                this.getElementStr());
         sq.setBoost(this.getBoost());
         return sq;
     };
 
 
     @Override
-    public void extractTerms(Set<Term> terms) {
+    public void extractTerms (Set<Term> terms) {
         terms.add(elementTerm);
     };
 
 
     @Override
-    public String toString(String field) {
+    public String toString (String field) {
         StringBuilder buffer = new StringBuilder("<");
         buffer.append(getField()).append(':').append(elementStr);
         buffer.append(ToStringUtils.boost(getBoost()));
@@ -116,7 +124,7 @@
 
 
     @Override
-    public int hashCode() {
+    public int hashCode () {
         final int prime = 37; // Instead of 31
         int result = super.hashCode();
         result = prime * result
@@ -126,7 +134,7 @@
 
 
     @Override
-    public boolean equals(Object obj) {
+    public boolean equals (Object obj) {
         if (this == obj)
             return true;
         // if (!super.equals(obj)) return false;
diff --git a/src/main/java/de/ids_mannheim/korap/query/SpanExpansionQuery.java b/src/main/java/de/ids_mannheim/korap/query/SpanExpansionQuery.java
index 65f786a..2fb8e84 100644
--- a/src/main/java/de/ids_mannheim/korap/query/SpanExpansionQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/query/SpanExpansionQuery.java
@@ -15,25 +15,35 @@
 import de.ids_mannheim.korap.query.spans.ExpandedSpans;
 
 /**
- * SpanExpansionQuery makes a span longer by stretching out the start or the end
- * position of the span. The constraints of the expansion, such as how large the
- * expansion should be (min and max position) and the direction of the expansion
- * with respect to the original span, are specified in ExpansionConstraint. The
- * direction is designated with the sign of a number, namely a negative number
- * signifies the left direction, and a positive number (including 0) signifies
+ * SpanExpansionQuery makes a span longer by stretching out the start
+ * or the end
+ * position of the span. The constraints of the expansion, such as how
+ * large the
+ * expansion should be (min and max position) and the direction of the
+ * expansion
+ * with respect to the original span, are specified in
+ * ExpansionConstraint. The
+ * direction is designated with the sign of a number, namely a
+ * negative number
+ * signifies the left direction, and a positive number (including 0)
+ * signifies
  * the right direction.
  * 
  * <pre>
- * SpanTermQuery stq = new SpanTermQuery(new Term(&quot;tokens&quot;, &quot;s:lightning&quot;));
- * SpanExpansionQuery seq = new SpanExpansionQuery(stq, 0, 2, -1, true);
+ * SpanTermQuery stq = new SpanTermQuery(new Term(&quot;tokens&quot;,
+ * &quot;s:lightning&quot;));
+ * SpanExpansionQuery seq = new SpanExpansionQuery(stq, 0, 2, -1,
+ * true);
  * </pre>
  * 
  * In the example above, the SpanExpansionQuery describes that the
- * {@link TermSpans} of "lightning" may be expanded up to two token positions to
+ * {@link TermSpans} of "lightning" may be expanded up to two token
+ * positions to
  * the left.
  * 
  * <pre>
- * &quot;Trees are often struck by lightning because they are natural lightning conductors to the ground.&quot;
+ * &quot;Trees are often struck by lightning because they are natural
+ * lightning conductors to the ground.&quot;
  * </pre>
  * 
  * The matches for the sample text are:
@@ -48,34 +58,42 @@
  * </pre>
  * 
  * The expansion can also be specified to <em>not</em> contain any
- * direct/immediate /adjacent occurrence(s) of another span. Examples in
+ * direct/immediate /adjacent occurrence(s) of another span. Examples
+ * in
  * Poliqarp:
  * 
  * <pre>
- * 	[orth=the][orth!=lightning]         "the" must not be followed by "lightning" 
- * 	[pos!=ADJ]{1,2}[orth=jacket]	    one or two adjectives cannot precedes "jacket"
+ * [orth=the][orth!=lightning] "the" must not be followed by
+ * "lightning"
+ * [pos!=ADJ]{1,2}[orth=jacket] one or two adjectives cannot precedes
+ * "jacket"
  * </pre>
  * 
- * The SpanExpansionQuery for the latter Poliqarp query with left direction from
+ * The SpanExpansionQuery for the latter Poliqarp query with left
+ * direction from
  * "jacket" example is:
  * 
  * <pre>
- * SpanTermQuery notQuery = new SpanTermQuery(new Term(&quot;tokens&quot;, &quot;tt:p:/ADJ&quot;));
- * SpanTermQuery stq = new SpanTermQuery(new Term(&quot;tokens&quot;, &quot;s:jacket&quot;));
- * SpanExpansionQuery seq = new SpanExpansionQuery(stq, notQuery, 1, 2, -1, true);
+ * SpanTermQuery notQuery = new SpanTermQuery(new
+ * Term(&quot;tokens&quot;, &quot;tt:p:/ADJ&quot;));
+ * SpanTermQuery stq = new SpanTermQuery(new Term(&quot;tokens&quot;,
+ * &quot;s:jacket&quot;));
+ * SpanExpansionQuery seq = new SpanExpansionQuery(stq, notQuery, 1,
+ * 2, -1, true);
  * </pre>
  * 
  * Matches and non matches example:
  * 
  * <pre>
- * [a jacket]                         match
- * [such a jacket]                    non match, where such is an ADJ
- * [leather jacket]                   non match
- * [black leather jacket]             non match
- * [large black leather jacket]       non match
+ * [a jacket] match
+ * [such a jacket] non match, where such is an ADJ
+ * [leather jacket] non match
+ * [black leather jacket] non match
+ * [large black leather jacket] non match
  * </pre>
  * 
- * The positions of the expansion parts can be optionally stored in payloads
+ * The positions of the expansion parts can be optionally stored in
+ * payloads
  * together with a class number.
  * 
  * @author margaretha
@@ -95,20 +113,27 @@
     // if true, no occurrence of another span
     final boolean isExclusion;
 
+
     /**
-     * Constructs a SpanExpansionQuery for simple expansion of the specified
-     * {@link SpanQuery}.
+     * Constructs a SpanExpansionQuery for simple expansion of the
+     * specified {@link SpanQuery}.
      * 
-     * @param firstClause a {@link SpanQuery}
-     * @param min the minimum length of the expansion
-     * @param max the maximum length of the expansion
-     * @param direction the direction of the expansion
-     * @param collectPayloads a boolean flag representing the value
-     *        <code>true</code> if payloads are to be collected, otherwise
-     *        <code>false</code>.
+     * @param firstClause
+     *            a {@link SpanQuery}
+     * @param min
+     *            the minimum length of the expansion
+     * @param max
+     *            the maximum length of the expansion
+     * @param direction
+     *            the direction of the expansion
+     * @param collectPayloads
+     *            a boolean flag representing the value
+     *            <code>true</code> if payloads are to be collected,
+     *            otherwise
+     *            <code>false</code>.
      */
-    public SpanExpansionQuery(SpanQuery firstClause, int min, int max,
-            int direction, boolean collectPayloads) {
+    public SpanExpansionQuery (SpanQuery firstClause, int min, int max,
+                               int direction, boolean collectPayloads) {
         super(firstClause, collectPayloads);
         if (max < min) {
             throw new IllegalArgumentException("The max position has to be "
@@ -120,42 +145,62 @@
         this.isExclusion = false;
     }
 
+
     /**
-     * Constructs a SpanExpansionQuery for simple expansion of the specified
-     * {@link SpanQuery} and stores expansion offsets in payloads associated
+     * Constructs a SpanExpansionQuery for simple expansion of the
+     * specified {@link SpanQuery} and stores expansion offsets in
+     * payloads associated
      * with the given class number.
      * 
-     * @param firstClause a {@link SpanQuery}
-     * @param min the minimum length of the expansion
-     * @param max the maximum length of the expansion
-     * @param direction the direction of the expansion
-     * @param classNumber the class number for storing expansion offsets in
-     *        payloads
-     * @param collectPayloads a boolean flag representing the value
-     *        <code>true</code> if payloads are to be collected, otherwise
-     *        <code>false</code>.
+     * @param firstClause
+     *            a {@link SpanQuery}
+     * @param min
+     *            the minimum length of the expansion
+     * @param max
+     *            the maximum length of the expansion
+     * @param direction
+     *            the direction of the expansion
+     * @param classNumber
+     *            the class number for storing expansion offsets in
+     *            payloads
+     * @param collectPayloads
+     *            a boolean flag representing the value
+     *            <code>true</code> if payloads are to be collected,
+     *            otherwise
+     *            <code>false</code>.
      */
-    public SpanExpansionQuery(SpanQuery firstClause, int min, int max,
-            int direction, byte classNumber, boolean collectPayloads) {
+    public SpanExpansionQuery (SpanQuery firstClause, int min, int max,
+                               int direction, byte classNumber,
+                               boolean collectPayloads) {
         this(firstClause, min, max, direction, collectPayloads);
         this.classNumber = classNumber;
     }
 
+
     /**
      * Constructs a SpanExpansionQuery for expansion of the first
-     * {@link SpanQuery} with exclusions of the second {@link SpanQuery}.
+     * {@link SpanQuery} with exclusions of the second
+     * {@link SpanQuery}.
      * 
-     * @param firstClause the SpanQuery to be expanded
-     * @param notClause the SpanQuery to be excluded
-     * @param min the minimum length of the expansion
-     * @param max the maximum length of the expansion
-     * @param direction the direction of the expansion
-     * @param collectPayloads a boolean flag representing the value
-     *        <code>true</code> if payloads are to be collected, otherwise
-     *        <code>false</code>.
+     * @param firstClause
+     *            the SpanQuery to be expanded
+     * @param notClause
+     *            the SpanQuery to be excluded
+     * @param min
+     *            the minimum length of the expansion
+     * @param max
+     *            the maximum length of the expansion
+     * @param direction
+     *            the direction of the expansion
+     * @param collectPayloads
+     *            a boolean flag representing the value
+     *            <code>true</code> if payloads are to be collected,
+     *            otherwise
+     *            <code>false</code>.
      */
-    public SpanExpansionQuery(SpanQuery firstClause, SpanQuery notClause,
-            int min, int max, int direction, boolean collectPayloads) {
+    public SpanExpansionQuery (SpanQuery firstClause, SpanQuery notClause,
+                               int min, int max, int direction,
+                               boolean collectPayloads) {
         super(firstClause, notClause, collectPayloads);
         if (max < min) {
             throw new IllegalArgumentException("The max position has to be "
@@ -167,37 +212,50 @@
         this.isExclusion = true;
     }
 
+
     /**
      * Constructs a SpanExpansionQuery for expansion of the first
-     * {@link SpanQuery} with exclusions of the second {@link SpanQuery}, and
-     * stores expansion offsets in payloads associated with the given class
+     * {@link SpanQuery} with exclusions of the second
+     * {@link SpanQuery}, and
+     * stores expansion offsets in payloads associated with the given
+     * class
      * number.
      * 
-     * @param firstClause the SpanQuery to be expanded
-     * @param notClause the SpanQuery to be excluded
-     * @param min the minimum length of the expansion
-     * @param max the maximum length of the expansion
-     * @param direction the direction of the expansion
-     * @param classNumber the class number for storing expansion offsets in
-     *        payloads
-     * @param collectPayloads a boolean flag representing the value
-     *        <code>true</code> if payloads are to be collected, otherwise
-     *        <code>false</code>.
+     * @param firstClause
+     *            the SpanQuery to be expanded
+     * @param notClause
+     *            the SpanQuery to be excluded
+     * @param min
+     *            the minimum length of the expansion
+     * @param max
+     *            the maximum length of the expansion
+     * @param direction
+     *            the direction of the expansion
+     * @param classNumber
+     *            the class number for storing expansion offsets in
+     *            payloads
+     * @param collectPayloads
+     *            a boolean flag representing the value
+     *            <code>true</code> if payloads are to be collected,
+     *            otherwise
+     *            <code>false</code>.
      */
-    public SpanExpansionQuery(SpanQuery firstClause, SpanQuery notClause,
-            int min, int max, int direction, byte classNumber,
-            boolean collectPayloads) {
+    public SpanExpansionQuery (SpanQuery firstClause, SpanQuery notClause,
+                               int min, int max, int direction,
+                               byte classNumber, boolean collectPayloads) {
         this(firstClause, notClause, min, max, direction, collectPayloads);
         this.classNumber = classNumber;
     }
 
+
     @Override
-    public SimpleSpanQuery clone() {
+    public SimpleSpanQuery clone () {
         SpanExpansionQuery sq = null;
         if (isExclusion) {
             sq = new SpanExpansionQuery(firstClause, secondClause, min, max,
                     direction, classNumber, collectPayloads);
-        } else {
+        }
+        else {
             sq = new SpanExpansionQuery(firstClause, min, max, direction,
                     classNumber, collectPayloads);
         }
@@ -205,8 +263,9 @@
         return sq;
     }
 
+
     @Override
-    public Spans getSpans(AtomicReaderContext context, Bits acceptDocs,
+    public Spans getSpans (AtomicReaderContext context, Bits acceptDocs,
             Map<Term, TermContext> termContexts) throws IOException {
 
         //	      Temporary:
@@ -218,15 +277,17 @@
             return new ExpandedSpans(this, context, acceptDocs, termContexts);
     }
 
+
     @Override
-    public String toString(String field) {
+    public String toString (String field) {
         StringBuilder sb = new StringBuilder();
         sb.append("spanExpansion(");
         sb.append(firstClause.toString());
         if (isExclusion && secondClause != null) {
             sb.append(", !");
             sb.append(secondClause.toString());
-        } else {
+        }
+        else {
             sb.append(", []");
         }
         sb.append("{");
@@ -246,75 +307,88 @@
         return sb.toString();
     }
 
+
     /**
      * Returns the minimum length of the expansion.
      * 
      * @return the minimum length of the expansion
      */
-    public int getMin() {
+    public int getMin () {
         return min;
     }
 
+
     /**
      * Sets the minimum length of the expansion.
      * 
-     * @param min the minimum length of the expansion
+     * @param min
+     *            the minimum length of the expansion
      */
-    public void setMin(int min) {
+    public void setMin (int min) {
         this.min = min;
     }
 
+
     /**
      * Returns the maximum length of the expansion.
      * 
      * @return the maximum length of the expansion
      */
-    public int getMax() {
+    public int getMax () {
         return max;
     }
 
+
     /**
      * Sets the maximum length of the expansion.
      * 
-     * @param max the maximum length of the expansion
+     * @param max
+     *            the maximum length of the expansion
      */
-    public void setMax(int max) {
+    public void setMax (int max) {
         this.max = max;
     }
 
+
     /**
      * Returns the class number associated with the expansion offsets
      * 
      * @return the class number associated with the expansion offsets
      */
-    public byte getClassNumber() {
+    public byte getClassNumber () {
         return classNumber;
     }
 
+
     /**
      * Sets the class number associated with the expansion offsets
      * 
-     * @param classNumber the class number associated with the expansion offsets
+     * @param classNumber
+     *            the class number associated with the expansion
+     *            offsets
      */
-    public void setClassNumber(byte classNumber) {
+    public void setClassNumber (byte classNumber) {
         this.classNumber = classNumber;
     }
 
+
     /**
      * Returns the direction of the expansion
      * 
      * @return the direction of the expansion
      */
-    public int getDirection() {
+    public int getDirection () {
         return direction;
     }
 
+
     /**
      * Sets the direction of the expansion
      * 
-     * @param direction the direction of the expansion
+     * @param direction
+     *            the direction of the expansion
      */
-    public void setDirection(int direction) {
+    public void setDirection (int direction) {
         this.direction = direction;
     }
 }
diff --git a/src/main/java/de/ids_mannheim/korap/query/SpanFocusQuery.java b/src/main/java/de/ids_mannheim/korap/query/SpanFocusQuery.java
index 20fa3ef..30cc536 100644
--- a/src/main/java/de/ids_mannheim/korap/query/SpanFocusQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/query/SpanFocusQuery.java
@@ -20,26 +20,30 @@
 
 /**
  * Modify the span of a match to the boundaries of a certain class.
- *
- * In case multiple classes are found with the very same number, the span
- * is maximized to start on the first occurrence from the left and end on
+ * 
+ * In case multiple classes are found with the very same number, the
+ * span
+ * is maximized to start on the first occurrence from the left and end
+ * on
  * the last occurrence on the right.
- *
+ * 
  * In case the class to modify on is not found in the subquery,
  * the match is ignored.
- *
+ * 
  * @author diewald
- *
+ * 
  * @see FocusSpans
  */
 public class SpanFocusQuery extends SpanClassQuery {
 
     /**
      * Construct a new SpanFocusQuery.
-     *
-     * @param operand The nested {@link SpanQuery}, that contains one or
-     *        more classed spans.
-     * @param number The class number to focus on.
+     * 
+     * @param operand
+     *            The nested {@link SpanQuery}, that contains one or
+     *            more classed spans.
+     * @param number
+     *            The class number to focus on.
      */
     public SpanFocusQuery (SpanQuery operand, byte number) {
         super(operand, number);
@@ -49,9 +53,10 @@
     /**
      * Construct a new SpanFocusQuery.
      * The class to focus on defaults to <tt>1</tt>.
-     *
-     * @param operand The nested {@link SpanQuery}, that contains one or
-     *        more classed spans.
+     * 
+     * @param operand
+     *            The nested {@link SpanQuery}, that contains one or
+     *            more classed spans.
      */
     public SpanFocusQuery (SpanQuery operand) {
         this(operand, (byte) 1);
@@ -72,16 +77,10 @@
 
 
     @Override
-    public Spans getSpans (final AtomicReaderContext context,
-                           Bits acceptDocs,
-                           Map<Term,TermContext> termContexts) throws IOException {
-        return (Spans) new FocusSpans(
-            this.operand,
-            context,
-            acceptDocs,
-            termContexts,
-            number
-        );
+    public Spans getSpans (final AtomicReaderContext context, Bits acceptDocs,
+            Map<Term, TermContext> termContexts) throws IOException {
+        return (Spans) new FocusSpans(this.operand, context, acceptDocs,
+                termContexts, number);
     };
 
 
@@ -89,7 +88,7 @@
     public Query rewrite (IndexReader reader) throws IOException {
         SpanFocusQuery clone = null;
         SpanQuery query = (SpanQuery) this.operand.rewrite(reader);
-        
+
         if (query != this.operand) {
             if (clone == null)
                 clone = this.clone();
@@ -104,11 +103,9 @@
 
 
     @Override
-    public SpanFocusQuery clone() {
+    public SpanFocusQuery clone () {
         SpanFocusQuery spanFocusQuery = new SpanFocusQuery(
-            (SpanQuery) this.operand.clone(),
-            this.number
-        );
+                (SpanQuery) this.operand.clone(), this.number);
         spanFocusQuery.setBoost(getBoost());
         return spanFocusQuery;
     };
@@ -116,14 +113,17 @@
 
     @Override
     public boolean equals (Object o) {
-        if (this == o) return true;
-        if (!(o instanceof SpanFocusQuery)) return false;
-	
-        final SpanFocusQuery spanFocusQuery =
-            (SpanFocusQuery) o;
-	
-        if (!this.operand.equals(spanFocusQuery.operand)) return false;
-        if (this.number != spanFocusQuery.number) return false;
+        if (this == o)
+            return true;
+        if (!(o instanceof SpanFocusQuery))
+            return false;
+
+        final SpanFocusQuery spanFocusQuery = (SpanFocusQuery) o;
+
+        if (!this.operand.equals(spanFocusQuery.operand))
+            return false;
+        if (this.number != spanFocusQuery.number)
+            return false;
 
         // Probably not necessary
         return getBoost() == spanFocusQuery.getBoost();
diff --git a/src/main/java/de/ids_mannheim/korap/query/SpanMultipleDistanceQuery.java b/src/main/java/de/ids_mannheim/korap/query/SpanMultipleDistanceQuery.java
index 31b8f26..b8553d9 100644
--- a/src/main/java/de/ids_mannheim/korap/query/SpanMultipleDistanceQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/query/SpanMultipleDistanceQuery.java
@@ -15,44 +15,58 @@
 import de.ids_mannheim.korap.query.spans.MultipleDistanceSpans;
 
 /**
- * SpanMultipleDistanceQuery matches two spans with respect to a list of
- * distance constraints. No repetition of constraints of the same unit type
- * (e.g. word, sentence, paragraph) is allowed. For example, there must only
- * exactly one constraint for word/token-based distance. A SpanDistanceQuery is
+ * SpanMultipleDistanceQuery matches two spans with respect to a list
+ * of
+ * distance constraints. No repetition of constraints of the same unit
+ * type
+ * (e.g. word, sentence, paragraph) is allowed. For example, there
+ * must only
+ * exactly one constraint for word/token-based distance. A
+ * SpanDistanceQuery is
  * created for each constraint.<br />
  * <br />
  * Examples:
  * <ul>
  * 
  * <li>
- * Search two terms x and y which are separated by minimum two and maximum three
- * other words within the same sentence. The order of x and y does not matter.
+ * Search two terms x and y which are separated by minimum two and
+ * maximum three
+ * other words within the same sentence. The order of x and y does not
+ * matter.
  * 
  * <pre>
- * List&lt;DistanceConstraint&gt; constraints = new ArrayList&lt;DistanceConstraint&gt;();
+ * List&lt;DistanceConstraint&gt; constraints = new
+ * ArrayList&lt;DistanceConstraint&gt;();
  * constraints.add(new DistanceConstraint(2, 3, false, false));
- * constraints.add(DistanceConstraint(new SpanElementQuery(&quot;tokens&quot;, &quot;s&quot;), 0, 0,
- *         false, false));
+ * constraints.add(DistanceConstraint(new
+ * SpanElementQuery(&quot;tokens&quot;, &quot;s&quot;), 0, 0,
+ * false, false));
  * 
- * SpanMultipleDistanceQuery mdq = SpanMultipleDistanceQuery(x, y, constraints,
- *         false, true);
+ * SpanMultipleDistanceQuery mdq = SpanMultipleDistanceQuery(x, y,
+ * constraints,
+ * false, true);
  * </pre>
  * 
  * </li>
  * 
  * <li>
- * Search term x which do <em>not</em> occur with term y in minimum two and
- * maximum three other words and <em>not</em> in the same sentence. X must
+ * Search term x which do <em>not</em> occur with term y in minimum
+ * two and
+ * maximum three other words and <em>not</em> in the same sentence. X
+ * must
  * precede y.
  * 
  * <pre>
- * List&lt;DistanceConstraint&gt; constraints = new ArrayList&lt;DistanceConstraint&gt;();
+ * List&lt;DistanceConstraint&gt; constraints = new
+ * ArrayList&lt;DistanceConstraint&gt;();
  * constraints.add(new DistanceConstraint(2, 3, false, true));
- * constraints.add(DistanceConstraint(new SpanElementQuery(&quot;tokens&quot;, &quot;s&quot;), 0, 0,
- *         false, true));
+ * constraints.add(DistanceConstraint(new
+ * SpanElementQuery(&quot;tokens&quot;, &quot;s&quot;), 0, 0,
+ * false, true));
  * 
- * SpanMultipleDistanceQuery mdq = SpanMultipleDistanceQuery(x, y, constraints,
- *         true, true);
+ * SpanMultipleDistanceQuery mdq = SpanMultipleDistanceQuery(x, y,
+ * constraints,
+ * true, true);
  * </pre>
  * 
  * </li>
@@ -66,30 +80,42 @@
     private boolean isOrdered;
     private String spanName;
 
+
     /**
-     * Constructs a SpanMultipleDistanceQuery for the two given SpanQueries.
+     * Constructs a SpanMultipleDistanceQuery for the two given
+     * SpanQueries.
      * 
-     * @param firstClause the first SpanQuery
-     * @param secondClause the second SpanQuery
-     * @param constraints the list of distance constraints
-     * @param isOrdered a boolean representing the value <code>true</code>, if
-     *        the firstspans must occur before the secondspans, otherwise
-     *        <code>false</code>.
-     * @param collectPayloads a boolean flag representing the value
-     *        <code>true</code> if payloads are to be collected, otherwise
-     *        <code>false</code>.
+     * @param firstClause
+     *            the first SpanQuery
+     * @param secondClause
+     *            the second SpanQuery
+     * @param constraints
+     *            the list of distance constraints
+     * @param isOrdered
+     *            a boolean representing the value <code>true</code>,
+     *            if
+     *            the firstspans must occur before the secondspans,
+     *            otherwise
+     *            <code>false</code>.
+     * @param collectPayloads
+     *            a boolean flag representing the value
+     *            <code>true</code> if payloads are to be collected,
+     *            otherwise
+     *            <code>false</code>.
      */
-    public SpanMultipleDistanceQuery(SpanQuery firstClause,
-            SpanQuery secondClause, List<DistanceConstraint> constraints,
-            boolean isOrdered, boolean collectPayloads) {
+    public SpanMultipleDistanceQuery (SpanQuery firstClause,
+                                      SpanQuery secondClause,
+                                      List<DistanceConstraint> constraints,
+                                      boolean isOrdered, boolean collectPayloads) {
         super(firstClause, secondClause, collectPayloads);
         this.constraints = constraints;
         this.isOrdered = isOrdered;
         spanName = "spanMultipleDistance";
     }
 
+
     @Override
-    public SpanMultipleDistanceQuery clone() {
+    public SpanMultipleDistanceQuery clone () {
         SpanMultipleDistanceQuery query = new SpanMultipleDistanceQuery(
                 (SpanQuery) firstClause.clone(),
                 (SpanQuery) secondClause.clone(), this.constraints,
@@ -99,8 +125,9 @@
         return query;
     }
 
+
     @Override
-    public String toString(String field) {
+    public String toString (String field) {
         StringBuilder sb = new StringBuilder();
         sb.append(this.spanName);
         sb.append("(");
@@ -131,14 +158,16 @@
         return sb.toString();
     }
 
+
     /**
-     * Filters the span matches of each constraint, returning only the matches
+     * Filters the span matches of each constraint, returning only the
+     * matches
      * meeting all the constraints.
      * 
      * @return only the span matches meeting all the constraints.
      * */
     @Override
-    public Spans getSpans(AtomicReaderContext context, Bits acceptDocs,
+    public Spans getSpans (AtomicReaderContext context, Bits acceptDocs,
             Map<Term, TermContext> termContexts) throws IOException {
 
         SpanDistanceQuery sdq, sdq2;
@@ -164,21 +193,24 @@
         return mds;
     }
 
+
     /**
      * Returns the list of distance constraints.
      * 
      * @return the list of distance constraints
      */
-    public List<DistanceConstraint> getConstraints() {
+    public List<DistanceConstraint> getConstraints () {
         return constraints;
     }
 
+
     /**
      * Sets the list of distance constraints.
      * 
-     * @param constraints the list of distance constraints
+     * @param constraints
+     *            the list of distance constraints
      */
-    public void setConstraints(List<DistanceConstraint> constraints) {
+    public void setConstraints (List<DistanceConstraint> constraints) {
         this.constraints = constraints;
     }
 
diff --git a/src/main/java/de/ids_mannheim/korap/query/SpanNextQuery.java b/src/main/java/de/ids_mannheim/korap/query/SpanNextQuery.java
index dbef6db..6a0c679 100644
--- a/src/main/java/de/ids_mannheim/korap/query/SpanNextQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/query/SpanNextQuery.java
@@ -22,18 +22,22 @@
  */
 
 /**
- * SpanNextQuery matches two spans which are directly next to each other. It is
+ * SpanNextQuery matches two spans which are directly next to each
+ * other. It is
  * identical to a phrase query with exactly two clauses.
  * 
- * In the example below, the SpanNextQuery retrieves {@link NextSpans} starting
- * from the start position of {@link TermSpans} "turn" and ending at the end
+ * In the example below, the SpanNextQuery retrieves {@link NextSpans}
+ * starting
+ * from the start position of {@link TermSpans} "turn" and ending at
+ * the end
  * position of {@link TermSpans} "off" occurring immediately after the
  * {@link TermSpans} "turn".
  * 
  * <pre>
  * SpanNextQuery sq = new SpanNextQuery(
- *      new SpanTermQuery(new Term(&quot;tokens&quot;,&quot;s:turn&quot;)), 
- *      new SpanTermQuery(new Term(&quot;tokens&quot;, &quot;s:off&quot;)));
+ * new SpanTermQuery(new Term(&quot;tokens&quot;,&quot;s:turn&quot;)),
+ * new SpanTermQuery(new Term(&quot;tokens&quot;,
+ * &quot;s:off&quot;)));
  * </pre>
  * 
  * @author diewald
@@ -43,42 +47,55 @@
 public class SpanNextQuery extends SimpleSpanQuery implements Cloneable {
 
     /**
-     * Constructs a SpanNextQuery for the two specified {@link SpanQuery
-     * SpanQueries} whose payloads are to be collected for the resulting
-     * {@link NextSpans}. The first SpanQuery is immediately followed by the
+     * Constructs a SpanNextQuery for the two specified
+     * {@link SpanQuery
+     * SpanQueries} whose payloads are to be collected for the
+     * resulting {@link NextSpans}. The first SpanQuery is immediately
+     * followed by the
      * second SpanQuery.
      * 
-     * @param firstClause the first SpanQuery
-     * @param secondClause the second SpanQuery
+     * @param firstClause
+     *            the first SpanQuery
+     * @param secondClause
+     *            the second SpanQuery
      */
-    public SpanNextQuery(SpanQuery firstClause, SpanQuery secondClause) {
+    public SpanNextQuery (SpanQuery firstClause, SpanQuery secondClause) {
         this(firstClause, secondClause, true);
     };
 
+
     /**
-     * Constructs a SpanNextQuery for the two specified {@link SpanQuery
-     * SpanQueries} where the first SpanQuery is immediately followed by the
+     * Constructs a SpanNextQuery for the two specified
+     * {@link SpanQuery
+     * SpanQueries} where the first SpanQuery is immediately followed
+     * by the
      * second SpanQuery.
      * 
-     * @param firstClause the first SpanQuery
-     * @param secondClause the second SpanQuery
-     * @param collectPayloads a boolean flag representing the value
-     *        <code>true</code> if payloads are to be collected, otherwise
-     *        <code>false</code>.
+     * @param firstClause
+     *            the first SpanQuery
+     * @param secondClause
+     *            the second SpanQuery
+     * @param collectPayloads
+     *            a boolean flag representing the value
+     *            <code>true</code> if payloads are to be collected,
+     *            otherwise
+     *            <code>false</code>.
      */
-    public SpanNextQuery(SpanQuery firstClause, SpanQuery secondClause,
-            boolean collectPayloads) {
+    public SpanNextQuery (SpanQuery firstClause, SpanQuery secondClause,
+                          boolean collectPayloads) {
         super(firstClause, secondClause, collectPayloads);
     };
 
+
     @Override
-    public Spans getSpans(final AtomicReaderContext context, Bits acceptDocs,
+    public Spans getSpans (final AtomicReaderContext context, Bits acceptDocs,
             Map<Term, TermContext> termContexts) throws IOException {
         return (Spans) new NextSpans(this, context, acceptDocs, termContexts);
     };
 
+
     @Override
-    public SpanNextQuery clone() {
+    public SpanNextQuery clone () {
         SpanNextQuery spanNextQuery = new SpanNextQuery(
                 (SpanQuery) firstClause.clone(),
                 (SpanQuery) secondClause.clone(), collectPayloads);
@@ -86,11 +103,12 @@
         return spanNextQuery;
     };
 
+
     /*
      * Rewrite query in case it includes regular expressions or wildcards
      */
     @Override
-    public Query rewrite(IndexReader reader) throws IOException {
+    public Query rewrite (IndexReader reader) throws IOException {
         SpanNextQuery clone = null;
 
         // Does the first clause needs a rewrite?
@@ -99,8 +117,7 @@
             if (clone == null)
                 clone = this.clone();
             clone.firstClause = query;
-        }
-        ;
+        };
 
         // Does the second clause needs a rewrite?
         query = (SpanQuery) secondClause.rewrite(reader);
@@ -108,8 +125,7 @@
             if (clone == null)
                 clone = this.clone();
             clone.secondClause = query;
-        }
-        ;
+        };
 
         // There is a clone and it is important
         if (clone != null)
@@ -118,8 +134,9 @@
         return this;
     };
 
+
     @Override
-    public String toString(String field) {
+    public String toString (String field) {
         StringBuilder sb = new StringBuilder();
         sb.append("spanNext(");
         sb.append(firstClause.toString(field));
@@ -130,9 +147,10 @@
         return sb.toString();
     }
 
+
     /** Returns true iff <code>o</code> is equal to this. */
     @Override
-    public boolean equals(Object o) {
+    public boolean equals (Object o) {
         if (this == o)
             return true;
         if (!(o instanceof SpanNextQuery))
@@ -150,9 +168,10 @@
         return getBoost() == spanNextQuery.getBoost();
     };
 
+
     // I don't know what I am doing here
     @Override
-    public int hashCode() {
+    public int hashCode () {
         int result;
         result = firstClause.hashCode() + secondClause.hashCode();
         result ^= (result << 31) | (result >>> 2); // reversible
diff --git a/src/main/java/de/ids_mannheim/korap/query/SpanRelationQuery.java b/src/main/java/de/ids_mannheim/korap/query/SpanRelationQuery.java
index 0433b2f..f19a1dc 100644
--- a/src/main/java/de/ids_mannheim/korap/query/SpanRelationQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/query/SpanRelationQuery.java
@@ -14,29 +14,36 @@
 import de.ids_mannheim.korap.query.spans.RelationSpans;
 
 /**
- * SpanRelationQuery retrieves spans representing a relation between tokens,
- * elements, or a-token-and-an-element. Relation are marked with prefix "<" or
- * ">". The direction of the angle bracket represents the direction of the 
+ * SpanRelationQuery retrieves spans representing a relation between
+ * tokens,
+ * elements, or a-token-and-an-element. Relation are marked with
+ * prefix "<" or
+ * ">". The direction of the angle bracket represents the direction of
+ * the
  * corresponding relation. <br/><br/>
  * 
  * This class provides two types of query:
  * <ol>
- * <li>querying any relations, for instance dependency relation "<:xip/syntax-dep_rel".
+ * <li>querying any relations, for instance dependency relation
+ * "<:xip/syntax-dep_rel".
  * 
  * <pre>SpanRelationQuery sq = new SpanRelationQuery(
- *          new SpanTermQuery(
- *              new Term("tokens","<:xip/syntax-dep_rel")),
- *          true); 
+ * new SpanTermQuery(
+ * new Term("tokens","<:xip/syntax-dep_rel")),
+ * true);
  * </pre>
  * </li>
- * <li>querying relations matching a certain type of sources/targets, that are the
- * left or the right sides of the relations. This query is used within 
- * {@link SpanRelationPartQuery}, for instance, to retrieve all dependency relations 
- * "<:xip/syntax-dep_rel" whose sources (right side) are noun phrases. 
+ * <li>querying relations matching a certain type of sources/targets,
+ * that are the
+ * left or the right sides of the relations. This query is used within
+ * {@link SpanRelationPartQuery}, for instance, to retrieve all
+ * dependency relations
+ * "<:xip/syntax-dep_rel" whose sources (right side) are noun phrases.
  * <pre>
  * SpanRelationPartQuery rv =
- *      new SpanRelationPartQuery(sq, new SpanElementQuery("tokens","np"), true, 
- *      false, true);
+ * new SpanRelationPartQuery(sq, new SpanElementQuery("tokens","np"),
+ * true,
+ * false, true);
  * </pre>
  * </li>
  * 
@@ -48,33 +55,40 @@
 
     private String type;
 
+
     /**
      * Constructs a SpanRelationQuery based on the given span query.
      * 
-     * @param firstClause a SpanQuery.
+     * @param firstClause
+     *            a SpanQuery.
      * @param collectPayloads
-     *            a boolean flag representing the value <code>true</code> if
-     *            payloads are to be collected, otherwise <code>false</code>.
+     *            a boolean flag representing the value
+     *            <code>true</code> if
+     *            payloads are to be collected, otherwise
+     *            <code>false</code>.
      */
-    public SpanRelationQuery(SpanQuery firstClause, boolean collectPayloads) {
+    public SpanRelationQuery (SpanQuery firstClause, boolean collectPayloads) {
         super(firstClause, collectPayloads);
     }
 
+
     @Override
-    public SimpleSpanQuery clone() {
+    public SimpleSpanQuery clone () {
         SimpleSpanQuery sq = new SpanRelationQuery(
                 (SpanQuery) this.firstClause.clone(), this.collectPayloads);
         return sq;
     }
 
+
     @Override
-    public Spans getSpans(AtomicReaderContext context, Bits acceptDocs,
+    public Spans getSpans (AtomicReaderContext context, Bits acceptDocs,
             Map<Term, TermContext> termContexts) throws IOException {
         return new RelationSpans(this, context, acceptDocs, termContexts);
     }
 
+
     @Override
-    public String toString(String field) {
+    public String toString (String field) {
         StringBuilder sb = new StringBuilder();
         sb.append("spanRelation(");
         sb.append(firstClause.toString(field));
diff --git a/src/main/java/de/ids_mannheim/korap/query/SpanRepetitionQuery.java b/src/main/java/de/ids_mannheim/korap/query/SpanRepetitionQuery.java
index 9ea420f..7e95bf6 100644
--- a/src/main/java/de/ids_mannheim/korap/query/SpanRepetitionQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/query/SpanRepetitionQuery.java
@@ -14,30 +14,36 @@
 import de.ids_mannheim.korap.query.spans.RepetitionSpans;
 
 /**
- * SpanRepetitionQuery means that the given SpanQuery must appears multiple
- * times in a sequence. The number of repetition depends on the minimum and the
+ * SpanRepetitionQuery means that the given SpanQuery must appears
+ * multiple
+ * times in a sequence. The number of repetition depends on the
+ * minimum and the
  * maximum number parameters. <br />
  * <br />
  * 
- * In the example below, SpanRepetitionQuery retrieves {@link RepetitionSpans}
- * consisting of the TermSpans "tt:p/ADJ" that must appear at least once or
- * consecutively two times. What appears after the RepetitionSpans is not
+ * In the example below, SpanRepetitionQuery retrieves
+ * {@link RepetitionSpans} consisting of the TermSpans "tt:p/ADJ" that
+ * must appear at least once or
+ * consecutively two times. What appears after the RepetitionSpans is
+ * not
  * considered, so it is possible that it is another "tt:p/ADJ". <br />
  * <br />
  * 
  * <pre>
- * SpanRepetitionQuery sq = new SpanRepetitionQuery(new SpanTermQuery(new Term(
- *         &quot;tokens&quot;, &quot;tt:p/ADJ&quot;)), 1, 2, true);
+ * SpanRepetitionQuery sq = new SpanRepetitionQuery(new
+ * SpanTermQuery(new Term(
+ * &quot;tokens&quot;, &quot;tt:p/ADJ&quot;)), 1, 2, true);
  * </pre>
  * 
- * For instance, "a large black leather jacket" contains the following matches.
+ * For instance, "a large black leather jacket" contains the following
+ * matches.
  * 
  * <pre>
- *  [large]
- *  [large black]
- *  [black]
- *  [black leather]
- *  [leather]
+ * [large]
+ * [large black]
+ * [black]
+ * [black leather]
+ * [leather]
  * </pre>
  * 
  * @author margaretha
@@ -46,25 +52,33 @@
 
     private int min, max;
 
+
     /**
-     * Constructs a SpanRepetitionQuery for the given {@link SpanQuery}.
+     * Constructs a SpanRepetitionQuery for the given
+     * {@link SpanQuery}.
      * 
-     * @param sq a SpanQuery
-     * @param min the minimum number of the required repetition
-     * @param max the maximum number of the required repetition
-     * @param collectPayloads a boolean flag representing the value
-     *        <code>true</code> if payloads are to be collected, otherwise
-     *        <code>false</code>.
+     * @param sq
+     *            a SpanQuery
+     * @param min
+     *            the minimum number of the required repetition
+     * @param max
+     *            the maximum number of the required repetition
+     * @param collectPayloads
+     *            a boolean flag representing the value
+     *            <code>true</code> if payloads are to be collected,
+     *            otherwise
+     *            <code>false</code>.
      */
-    public SpanRepetitionQuery(SpanQuery sq, int min, int max,
-            boolean collectPayloads) {
+    public SpanRepetitionQuery (SpanQuery sq, int min, int max,
+                                boolean collectPayloads) {
         super(sq, collectPayloads);
         this.min = min;
         this.max = max;
     }
 
+
     @Override
-    public SimpleSpanQuery clone() {
+    public SimpleSpanQuery clone () {
         SpanRepetitionQuery sq = new SpanRepetitionQuery(
                 (SpanQuery) this.firstClause.clone(), this.min, this.max,
                 this.collectPayloads);
@@ -72,14 +86,16 @@
         return sq;
     }
 
+
     @Override
-    public Spans getSpans(AtomicReaderContext context, Bits acceptDocs,
+    public Spans getSpans (AtomicReaderContext context, Bits acceptDocs,
             Map<Term, TermContext> termContexts) throws IOException {
         return new RepetitionSpans(this, context, acceptDocs, termContexts);
     }
 
+
     @Override
-    public String toString(String field) {
+    public String toString (String field) {
         StringBuilder sb = new StringBuilder();
         sb.append("spanRepetition(");
         sb.append(firstClause.toString(field));
@@ -92,39 +108,45 @@
         return sb.toString();
     }
 
+
     /**
      * Returns the minimum number of required repetitions.
      * 
      * @return the minimum number of required repetitions
      */
-    public int getMin() {
+    public int getMin () {
         return min;
     }
 
+
     /**
      * Sets the minimum number of required repetitions.
      * 
-     * @param min the minimum number of required repetitions
+     * @param min
+     *            the minimum number of required repetitions
      */
-    public void setMin(int min) {
+    public void setMin (int min) {
         this.min = min;
     }
 
+
     /**
      * Returns the maximum number of required repetitions.
      * 
      * @return the maximum number of required repetitions
      */
-    public int getMax() {
+    public int getMax () {
         return max;
     }
 
+
     /**
      * Sets the maximum number of required repetitions.
      * 
-     * @param max the maximum number of required repetitions
+     * @param max
+     *            the maximum number of required repetitions
      */
-    public void setMax(int max) {
+    public void setMax (int max) {
         this.max = max;
     }
 
diff --git a/src/main/java/de/ids_mannheim/korap/query/SpanSegmentQuery.java b/src/main/java/de/ids_mannheim/korap/query/SpanSegmentQuery.java
index 39c2a59..512adc0 100644
--- a/src/main/java/de/ids_mannheim/korap/query/SpanSegmentQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/query/SpanSegmentQuery.java
@@ -14,59 +14,75 @@
 import de.ids_mannheim.korap.query.spans.SegmentSpans;
 
 /**
- * SpanSegmentQuery matches two spans having exactly the same start and end
+ * SpanSegmentQuery matches two spans having exactly the same start
+ * and end
  * positions, for instance:
  * 
  * <pre>
- * sq = new SpanSegmentQuery(new SpanTermQuery(new Term(&quot;tokens&quot;, &quot;s:Hund&quot;)),
- *         new SpanTermQuery(new Term(&quot;tokens&quot;, &quot;tt/p:NN&quot;)));
+ * sq = new SpanSegmentQuery(new SpanTermQuery(new
+ * Term(&quot;tokens&quot;, &quot;s:Hund&quot;)),
+ * new SpanTermQuery(new Term(&quot;tokens&quot;,
+ * &quot;tt/p:NN&quot;)));
  * </pre>
  * 
  * @author margaretha
  * */
 public class SpanSegmentQuery extends SimpleSpanQuery {
 
-	private boolean isRelation;
+    private boolean isRelation;
+
 
     /**
-     * Constructs a SpanSegmentQuery from the two given SpanQueries, by default
+     * Constructs a SpanSegmentQuery from the two given SpanQueries,
+     * by default
      * payloads are to be collected.
      * 
-     * @param firstClause a {@link SpanQuery}
-     * @param secondClause a {@link SpanQuery}
+     * @param firstClause
+     *            a {@link SpanQuery}
+     * @param secondClause
+     *            a {@link SpanQuery}
      */
-    public SpanSegmentQuery(SpanQuery firstClause, SpanQuery secondClause) {
+    public SpanSegmentQuery (SpanQuery firstClause, SpanQuery secondClause) {
         this(firstClause, secondClause, true);
     }
 
+
     /**
      * Constructs a SpanSegmentQuery from the two given SpanQueries.
      * 
-     * @param firstClause a {@link SpanQuery}
-     * @param secondClause a {@link SpanQuery}
-     * @param collectPayloads a boolean flag representing the value
-     *        <code>true</code> if payloads are to be collected, otherwise
-     *        <code>false</code>.
+     * @param firstClause
+     *            a {@link SpanQuery}
+     * @param secondClause
+     *            a {@link SpanQuery}
+     * @param collectPayloads
+     *            a boolean flag representing the value
+     *            <code>true</code> if payloads are to be collected,
+     *            otherwise
+     *            <code>false</code>.
      */
-    public SpanSegmentQuery(SpanQuery firstClause, SpanQuery secondClause,
-            boolean collectPayloads) {
+    public SpanSegmentQuery (SpanQuery firstClause, SpanQuery secondClause,
+                             boolean collectPayloads) {
         super(firstClause, secondClause, collectPayloads);
     }
 
-	public SpanSegmentQuery(SpanRelationQuery firstClause,
-			SpanWithIdQuery secondClause, boolean collectPayloads) {
-		super(firstClause, secondClause, true);
-		isRelation = true;
+
+    public SpanSegmentQuery (SpanRelationQuery firstClause,
+                             SpanWithIdQuery secondClause,
+                             boolean collectPayloads) {
+        super(firstClause, secondClause, true);
+        isRelation = true;
     }
-    
+
+
     @Override
-    public Spans getSpans(AtomicReaderContext context, Bits acceptDocs,
+    public Spans getSpans (AtomicReaderContext context, Bits acceptDocs,
             Map<Term, TermContext> termContexts) throws IOException {
         return (Spans) new SegmentSpans(this, context, acceptDocs, termContexts);
     }
 
+
     @Override
-    public SpanSegmentQuery clone() {
+    public SpanSegmentQuery clone () {
         SpanSegmentQuery spanSegmentQuery = new SpanSegmentQuery(
                 (SpanQuery) firstClause.clone(),
                 (SpanQuery) secondClause.clone(), collectPayloads);
@@ -74,8 +90,9 @@
         return spanSegmentQuery;
     }
 
+
     @Override
-    public String toString(String field) {
+    public String toString (String field) {
         StringBuilder sb = new StringBuilder();
         sb.append("spanSegment(");
         sb.append(firstClause.toString(field));
@@ -86,8 +103,9 @@
         return sb.toString();
     }
 
+
     @Override
-    public boolean equals(Object o) {
+    public boolean equals (Object o) {
         if (this == o)
             return true;
         if (!(o instanceof SpanSegmentQuery))
@@ -105,21 +123,24 @@
         return getBoost() == spanSegmentQuery.getBoost();
     };
 
+
     @Override
-    public int hashCode() {
+    public int hashCode () {
         int result;
         result = firstClause.hashCode() + secondClause.hashCode();
         result ^= (31 * result) + (result >>> 3);
         result += Float.floatToRawIntBits(getBoost());
         return result;
-	}
+    }
 
-	public boolean isRelation() {
-		return isRelation;
-	}
 
-	public void setRelation(boolean isRelation) {
-		this.isRelation = isRelation;
-	};
+    public boolean isRelation () {
+        return isRelation;
+    }
+
+
+    public void setRelation (boolean isRelation) {
+        this.isRelation = isRelation;
+    };
 
 }
diff --git a/src/main/java/de/ids_mannheim/korap/query/SpanSubspanQuery.java b/src/main/java/de/ids_mannheim/korap/query/SpanSubspanQuery.java
index d16042e..010d077 100644
--- a/src/main/java/de/ids_mannheim/korap/query/SpanSubspanQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/query/SpanSubspanQuery.java
@@ -14,20 +14,26 @@
 import de.ids_mannheim.korap.query.spans.SubSpans;
 
 /**
- * This query extracts a subspan from another span. The subspan starts from a
- * startOffset until startOffset + length. A positive startOffset is counted
- * from the start of the span, while a negative startOffset is calculated from
+ * This query extracts a subspan from another span. The subspan starts
+ * from a
+ * startOffset until startOffset + length. A positive startOffset is
+ * counted
+ * from the start of the span, while a negative startOffset is
+ * calculated from
  * the end of the span. <br />
  * <br />
- * SpanSubspanQuery takes a SpanQuery as its input and creates subspans from the
+ * SpanSubspanQuery takes a SpanQuery as its input and creates
+ * subspans from the
  * resulting spans of the SpanQuery. For instance:
  * 
  * <pre>
- * SpanElementQuery seq = new SpanElementQuery(new SpanElementQuery(&quot;tokens&quot;, &quot;s&quot;);
+ * SpanElementQuery seq = new SpanElementQuery(new
+ * SpanElementQuery(&quot;tokens&quot;, &quot;s&quot;);
  * SpanSubspanQuery ssq = new SpanSubspanQuery(seq, 0, 2, true);
  * </pre>
  * 
- * In this example, the SpanSubspanQuery creates subspans, that are the first
+ * In this example, the SpanSubspanQuery creates subspans, that are
+ * the first
  * two tokens of all sentences. It also collects all payloads from the
  * {@link ElementSpans} for the SubSpans.
  * 
@@ -37,85 +43,100 @@
 
     private int startOffset, length;
 
+
     /**
-     * Creates a SpanSubspanQuery (subspan) from the given {@link SpanQuery}
-     * with the specified startOffset and length.
+     * Creates a SpanSubspanQuery (subspan) from the given
+     * {@link SpanQuery} with the specified startOffset and length.
      * 
-     * @param firstClause a SpanQuery
-     * @param startOffset the start offset of the subspan relative to the
-     *        original span
-     * @param length the length of the subspan
-     * @param collectPayloads a boolean flag representing the value
-     *        <code>true</code> if payloads are to be collected, otherwise
-     *        <code>false</code>.
+     * @param firstClause
+     *            a SpanQuery
+     * @param startOffset
+     *            the start offset of the subspan relative to the
+     *            original span
+     * @param length
+     *            the length of the subspan
+     * @param collectPayloads
+     *            a boolean flag representing the value
+     *            <code>true</code> if payloads are to be collected,
+     *            otherwise
+     *            <code>false</code>.
      */
-    public SpanSubspanQuery(SpanQuery firstClause, int startOffset, int length,
-            boolean collectPayloads) {
+    public SpanSubspanQuery (SpanQuery firstClause, int startOffset,
+                             int length, boolean collectPayloads) {
         super(firstClause, collectPayloads);
         this.startOffset = startOffset;
         this.length = length;
     }
 
+
     @Override
-    public SimpleSpanQuery clone() {
+    public SimpleSpanQuery clone () {
         SpanSubspanQuery sq = new SpanSubspanQuery(this.getFirstClause(),
                 this.startOffset, this.length, this.collectPayloads);
         sq.setBoost(this.getBoost());
         return sq;
     }
 
+
     @Override
-    public Spans getSpans(AtomicReaderContext context, Bits acceptDocs,
+    public Spans getSpans (AtomicReaderContext context, Bits acceptDocs,
             Map<Term, TermContext> termContexts) throws IOException {
         return new SubSpans(this, context, acceptDocs, termContexts);
     }
 
+
     @Override
-    public String toString(String field) {
+    public String toString (String field) {
         StringBuilder sb = new StringBuilder();
         sb.append("subspan(");
         sb.append(this.firstClause.toString());
-		sb.append(", ");
+        sb.append(", ");
         sb.append(this.startOffset);
-		sb.append(", ");
+        sb.append(", ");
         sb.append(this.length);
         sb.append(")");
         return sb.toString();
     }
 
+
     /**
      * Returns the start offset.
      * 
      * @return the start offset.
      */
-    public int getStartOffset() {
+    public int getStartOffset () {
         return startOffset;
     }
 
+
     /**
      * Sets the start offset.
      * 
-     * @param startOffset the start offset
+     * @param startOffset
+     *            the start offset
      */
-    public void setStartOffset(int startOffset) {
+    public void setStartOffset (int startOffset) {
         this.startOffset = startOffset;
     }
 
+
     /**
      * Returns the length of the subspan.
      * 
      * @return the length of the subspan
      */
-    public int getLength() {
+    public int getLength () {
         return length;
     }
 
+
     /**
      * Sets the length of the subspan.
      * 
-     * @param length the length of the subspan.
+     * @param length
+     *            the length of the subspan.
      */
-    public void setLength(int length) {
+    public void setLength (int length) {
         this.length = length;
     }
 }
diff --git a/src/main/java/de/ids_mannheim/korap/query/SpanTermWithIdQuery.java b/src/main/java/de/ids_mannheim/korap/query/SpanTermWithIdQuery.java
index fa70878..84e30b2 100644
--- a/src/main/java/de/ids_mannheim/korap/query/SpanTermWithIdQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/query/SpanTermWithIdQuery.java
@@ -14,16 +14,20 @@
 import de.ids_mannheim.korap.query.spans.TermSpansWithId;
 
 /**
- * SpanTermWithIdQuery wraps a SpanTermQuery retrieving TermSpans and add a
- * spanid to the TermSpans. It is used in other spanqueries requiring spans with
- * id as their child spans, for example in span relation with variable query (
- * {@link SpanRelationPartQuery}).
+ * SpanTermWithIdQuery wraps a SpanTermQuery retrieving TermSpans and
+ * add a
+ * spanid to the TermSpans. It is used in other spanqueries requiring
+ * spans with
+ * id as their child spans, for example in span relation with variable
+ * query ( {@link SpanRelationPartQuery}).
  * 
  * <pre>
- * SpanTermWithIdQuery sq = new SpanTermWithIdQuery(new Term("base","tt:p/NN"),true)
+ * SpanTermWithIdQuery sq = new SpanTermWithIdQuery(new
+ * Term("base","tt:p/NN"),true)
  * </pre>
  * 
- * In this example, the SpanTermWithIdQuery retrieves {@link SpansWithId} for
+ * In this example, the SpanTermWithIdQuery retrieves
+ * {@link SpansWithId} for
  * the Term "tt:p/NN".
  * 
  * @author margaretha
@@ -33,29 +37,35 @@
     /**
      * Constructs a SpanTermWithIdQuery for the given term.
      * 
-     * @param term a {@link Term}
-     * @param collectPayloads a boolean flag representing the value
-     *        <code>true</code> if payloads are to be collected, otherwise
-     *        <code>false</code>.
+     * @param term
+     *            a {@link Term}
+     * @param collectPayloads
+     *            a boolean flag representing the value
+     *            <code>true</code> if payloads are to be collected,
+     *            otherwise
+     *            <code>false</code>.
      */
-    public SpanTermWithIdQuery(Term term, boolean collectPayloads) {
+    public SpanTermWithIdQuery (Term term, boolean collectPayloads) {
         super(new SpanTermQuery(term), collectPayloads);
     }
 
+
     @Override
-    public SimpleSpanQuery clone() {
+    public SimpleSpanQuery clone () {
         SpanTermQuery sq = (SpanTermQuery) this.firstClause;
         return new SpanTermWithIdQuery(sq.getTerm(), this.collectPayloads);
     }
 
+
     @Override
-    public Spans getSpans(AtomicReaderContext context, Bits acceptDocs,
+    public Spans getSpans (AtomicReaderContext context, Bits acceptDocs,
             Map<Term, TermContext> termContexts) throws IOException {
         return new TermSpansWithId(this, context, acceptDocs, termContexts);
     }
 
+
     @Override
-    public String toString(String field) {
+    public String toString (String field) {
         StringBuilder sb = new StringBuilder();
         sb.append("spanTermWithId(");
         sb.append(firstClause.toString(field));
diff --git a/src/main/java/de/ids_mannheim/korap/query/SpanWithAttributeQuery.java b/src/main/java/de/ids_mannheim/korap/query/SpanWithAttributeQuery.java
index 4d5c011..12d6876 100644
--- a/src/main/java/de/ids_mannheim/korap/query/SpanWithAttributeQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/query/SpanWithAttributeQuery.java
@@ -29,10 +29,12 @@
  * <code>@:class=header</code>.
  * 
  * <pre>
- * SpanAttributeQuery saq = new SpanAttributeQuery(new SpanTermQuery(new Term(
- *         &quot;tokens&quot;, &quot;@:class=header&quot;)), true);
- * SpanWithAttributeQuery sq = new SpanWithAttributeQuery(new SpanElementQuery(
- *         &quot;tokens&quot;, &quot;div&quot;), saq, true);
+ * SpanAttributeQuery saq = new SpanAttributeQuery(new
+ * SpanTermQuery(new Term(
+ * &quot;tokens&quot;, &quot;@:class=header&quot;)), true);
+ * SpanWithAttributeQuery sq = new SpanWithAttributeQuery(new
+ * SpanElementQuery(
+ * &quot;tokens&quot;, &quot;div&quot;), saq, true);
  * </pre>
  * 
  * 
@@ -43,6 +45,7 @@
     public boolean isMultipleAttributes;
     private String type;
 
+
     /**
      * Constructs a SpanWithAttributeQuery for any arbitrary
      * SpansWithId (e.g. elements, relations) having the specified
@@ -56,18 +59,20 @@
      *            otherwise <code>false</code>.
      */
     public SpanWithAttributeQuery (SpanAttributeQuery attributeQuery,
-            boolean collectPayloads) {
+                                   boolean collectPayloads) {
         super(attributeQuery, collectPayloads);
         type = "spanWithAttribute";
     }
 
+
     public SpanWithAttributeQuery (List<SpanQuery> attributeQueries,
-            boolean collectPayloads) {
+                                   boolean collectPayloads) {
         super(attributeQueries, collectPayloads);
         isMultipleAttributes = true;
         type = "spanWithAttribute";
     }
 
+
     /**
      * Constructs a SpanWithAttributeQuery for the specified
      * SpanWithIdQuery and SpanAttributeQuery retrieving spans having
@@ -87,11 +92,13 @@
      *            otherwise <code>false</code>.
      */
     public SpanWithAttributeQuery (SpanWithIdQuery firstClause,
-            SpanAttributeQuery secondClause, boolean collectPayloads) {
+                                   SpanAttributeQuery secondClause,
+                                   boolean collectPayloads) {
         super(firstClause, secondClause, collectPayloads);
         setType();
     }
 
+
     /**
      * @param firstClause
      *            a SpanWithIdQuery
@@ -103,27 +110,30 @@
      *            otherwise <code>false</code>.
      */
     public SpanWithAttributeQuery (SpanWithIdQuery firstClause,
-            List<SpanQuery> secondClauses, boolean collectPayloads) {
+                                   List<SpanQuery> secondClauses,
+                                   boolean collectPayloads) {
         super(firstClause, secondClauses, collectPayloads);
         isMultipleAttributes = true;
         setType();
     }
 
+
     /**
      * Returns the type of the query.
      * 
      * @return the type of the query
      */
-    public String getType() {
+    public String getType () {
         return type;
     }
 
+
     /**
      * Sets the type of the query based of the class of the
      * firstClause / first span.
      * 
      */
-    public void setType() {
+    public void setType () {
         if (SpanElementQuery.class.isInstance(firstClause)) {
             type = "spanElementWithAttribute";
         }
@@ -135,8 +145,9 @@
         }
     }
 
+
     @Override
-    public SimpleSpanQuery clone() {
+    public SimpleSpanQuery clone () {
         if (secondClause != null) {
             if (isMultipleAttributes) {
                 return new SpanWithAttributeQuery(
@@ -163,7 +174,8 @@
         }
     }
 
-    private List<SpanQuery> cloneClauseList() {
+
+    private List<SpanQuery> cloneClauseList () {
         List<SpanQuery> clauseList = new ArrayList<SpanQuery>();
         SpanAttributeQuery saq;
         for (SpanQuery q : this.clauseList) {
@@ -173,8 +185,9 @@
         return clauseList;
     }
 
+
     @Override
-    public Spans getSpans(AtomicReaderContext context, Bits acceptDocs,
+    public Spans getSpans (AtomicReaderContext context, Bits acceptDocs,
             Map<Term, TermContext> termContexts) throws IOException {
 
         if (type.equals("spanWithAttribute")) {
@@ -203,8 +216,9 @@
         }
     }
 
+
     @Override
-    public String toString(String field) {
+    public String toString (String field) {
         boolean isFirstClassNull = true;
         StringBuilder sb = new StringBuilder();
         sb.append(type);
@@ -218,7 +232,8 @@
             sb.append(secondClause.toString(field));
         }
         else if (isMultipleAttributes) {
-            if (!isFirstClassNull) sb.append(", ");
+            if (!isFirstClassNull)
+                sb.append(", ");
             sb.append("[");
 
             SpanQuery sq;
@@ -226,7 +241,8 @@
                 sq = clauseList.get(i);
                 sb.append(sq.toString(field));
 
-                if (i < clauseList.size() - 1) sb.append(", ");
+                if (i < clauseList.size() - 1)
+                    sb.append(", ");
             }
 
             sb.append("]");
diff --git a/src/main/java/de/ids_mannheim/korap/query/SpanWithIdQuery.java b/src/main/java/de/ids_mannheim/korap/query/SpanWithIdQuery.java
index 4845a01..3545808 100644
--- a/src/main/java/de/ids_mannheim/korap/query/SpanWithIdQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/query/SpanWithIdQuery.java
@@ -5,7 +5,8 @@
 import org.apache.lucene.search.spans.SpanQuery;
 
 /**
- * Base query for span queries whose resulting spans requires an id, for
+ * Base query for span queries whose resulting spans requires an id,
+ * for
  * instance {@link SpanElementQuery} and {@link SpanRelationQuery}.
  * 
  * @author margaretha
@@ -14,51 +15,69 @@
 public abstract class SpanWithIdQuery extends SimpleSpanQuery {
 
     /**
-     * Constructs SpanWithIdQuery based on the given {@link SpanQuery} and the
+     * Constructs SpanWithIdQuery based on the given {@link SpanQuery}
+     * and the
      * collectPayloads flag, for example, {@link SpanElementQuery}.
      * 
-     * @param firstClause a SpanQuery
-     * @param collectPayloads a boolean flag representing the value
-     *        <code>true</code> if payloads are to be collected, otherwise
-     *        <code>false</code>.
+     * @param firstClause
+     *            a SpanQuery
+     * @param collectPayloads
+     *            a boolean flag representing the value
+     *            <code>true</code> if payloads are to be collected,
+     *            otherwise
+     *            <code>false</code>.
      */
-    public SpanWithIdQuery(SpanQuery firstClause, boolean collectPayloads) {
+    public SpanWithIdQuery (SpanQuery firstClause, boolean collectPayloads) {
         super(firstClause, collectPayloads);
     }
 
+
     /**
      * Constructs SpanWithIdQuery based on two span queries and the
-     * collectPayloads flag, for instance, query a relation having a specific
+     * collectPayloads flag, for instance, query a relation having a
+     * specific
      * attribute.
      * 
-     * @param firstClause a SpanQuery
-     * @param secondClause a SpanQuery
-     * @param collectPayloads a boolean flag representing the value
-     *        <code>true</code> if payloads are to be collected, otherwise
-     *        <code>false</code>.
+     * @param firstClause
+     *            a SpanQuery
+     * @param secondClause
+     *            a SpanQuery
+     * @param collectPayloads
+     *            a boolean flag representing the value
+     *            <code>true</code> if payloads are to be collected,
+     *            otherwise
+     *            <code>false</code>.
      */
-    public SpanWithIdQuery(SpanQuery firstClause, SpanQuery secondClause,
-            boolean collectPayloads) {
+    public SpanWithIdQuery (SpanQuery firstClause, SpanQuery secondClause,
+                            boolean collectPayloads) {
         super(firstClause, secondClause, collectPayloads);
     }
 
+
     /**
-     * Constructs SpanWithIdQuery based on a span query and a list of span
-     * queries, for instance, query an element having two specific attributes.
+     * Constructs SpanWithIdQuery based on a span query and a list of
+     * span
+     * queries, for instance, query an element having two specific
+     * attributes.
      * 
-     * @param firstClause a SpanQuery
-     * @param secondClauses a list of SpanQuery
-     * @param collectPayloads a boolean flag representing the value
-     *        <code>true</code> if payloads are to be collected, otherwise
-     *        <code>false</code>.
+     * @param firstClause
+     *            a SpanQuery
+     * @param secondClauses
+     *            a list of SpanQuery
+     * @param collectPayloads
+     *            a boolean flag representing the value
+     *            <code>true</code> if payloads are to be collected,
+     *            otherwise
+     *            <code>false</code>.
      */
-    public SpanWithIdQuery(SpanQuery firstClause,
-            List<SpanQuery> secondClauses, boolean collectPayloads) {
+    public SpanWithIdQuery (SpanQuery firstClause,
+                            List<SpanQuery> secondClauses,
+                            boolean collectPayloads) {
         super(firstClause, secondClauses, collectPayloads);
     }
 
-	public SpanWithIdQuery(List<SpanQuery> clauses,
-			boolean collectPayloads) {
-		super(clauses, collectPayloads);
-	}
+
+    public SpanWithIdQuery (List<SpanQuery> clauses, boolean collectPayloads) {
+        super(clauses, collectPayloads);
+    }
 }
diff --git a/src/main/java/de/ids_mannheim/korap/query/SpanWithinQuery.java b/src/main/java/de/ids_mannheim/korap/query/SpanWithinQuery.java
index c25b187..ee79869 100644
--- a/src/main/java/de/ids_mannheim/korap/query/SpanWithinQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/query/SpanWithinQuery.java
@@ -35,22 +35,18 @@
     private byte flag;
     private boolean collectPayloads;
 
-    public static final byte
-        OVERLAP      = WithinSpans.OVERLAP,
-        REAL_OVERLAP = WithinSpans.REAL_OVERLAP,
-        WITHIN       = WithinSpans.WITHIN,
-        REAL_WITHIN  = WithinSpans.REAL_WITHIN,
-        ENDSWITH     = WithinSpans.ENDSWITH,
-        STARTSWITH   = WithinSpans.STARTSWITH,
-        MATCH        = WithinSpans.MATCH;
+    public static final byte OVERLAP = WithinSpans.OVERLAP,
+            REAL_OVERLAP = WithinSpans.REAL_OVERLAP,
+            WITHIN = WithinSpans.WITHIN, REAL_WITHIN = WithinSpans.REAL_WITHIN,
+            ENDSWITH = WithinSpans.ENDSWITH,
+            STARTSWITH = WithinSpans.STARTSWITH, MATCH = WithinSpans.MATCH;
+
 
     // may support "starting" and "ending"
 
 
     // Constructor
-    public SpanWithinQuery (SpanQuery wrap,
-                            SpanQuery embedded,
-                            byte flag,
+    public SpanWithinQuery (SpanQuery wrap, SpanQuery embedded, byte flag,
                             boolean collectPayloads) {
 
         this.field = embedded.getField();
@@ -62,72 +58,73 @@
 
 
     // Constructor
-    public SpanWithinQuery(String element,
-                           SpanQuery embedded) {
+    public SpanWithinQuery (String element, SpanQuery embedded) {
         this(element, embedded, WITHIN, true);
     };
 
 
     // Constructor
-    public SpanWithinQuery (String element,
-                            SpanQuery embedded,
-                            byte flag,
+    public SpanWithinQuery (String element, SpanQuery embedded, byte flag,
                             boolean collectPayloads) {
-        this(
-             (SpanQuery) new SpanElementQuery(embedded.getField(), element),
-             embedded,
-             flag,
-             collectPayloads
-             );
+        this((SpanQuery) new SpanElementQuery(embedded.getField(), element),
+                embedded, flag, collectPayloads);
     };
 
 
     // Constructor
-    public SpanWithinQuery(String element,
-                           SpanQuery embedded,
-                           byte flag) {
+    public SpanWithinQuery (String element, SpanQuery embedded, byte flag) {
         this(element, embedded, flag, true);
     };
 
 
     // Constructor
-    public SpanWithinQuery (String element,
-                            SpanQuery embedded,
+    public SpanWithinQuery (String element, SpanQuery embedded,
                             boolean collectPayloads) {
         this(element, embedded, WITHIN, collectPayloads);
     };
 
 
     // Constructor
-    public SpanWithinQuery(SpanQuery wrap,
-                           SpanQuery embedded,
-                           byte flag) {
+    public SpanWithinQuery (SpanQuery wrap, SpanQuery embedded, byte flag) {
         this(wrap, embedded, flag, true);
     };
 
 
     // Constructor
-    public SpanWithinQuery(SpanQuery wrap,
-                           SpanQuery embedded) {
+    public SpanWithinQuery (SpanQuery wrap, SpanQuery embedded) {
         this(wrap, embedded, WITHIN, true);
     };
 
 
     @Override
-    public String getField()    { return field;    };
-    public SpanQuery wrap()     { return wrap;     };
-    public SpanQuery embedded() { return embedded; };
-    public byte flag()          { return flag; };
+    public String getField () {
+        return field;
+    };
 
-    
+
+    public SpanQuery wrap () {
+        return wrap;
+    };
+
+
+    public SpanQuery embedded () {
+        return embedded;
+    };
+
+
+    public byte flag () {
+        return flag;
+    };
+
+
     @Override
-    public void extractTerms(Set<Term> terms) {
+    public void extractTerms (Set<Term> terms) {
         embedded.extractTerms(terms);
     };
-  
+
 
     @Override
-    public String toString(String field) {
+    public String toString (String field) {
         StringBuilder buffer = new StringBuilder();
         buffer.append("span");
         buffer.append(flagToString());
@@ -139,38 +136,36 @@
         buffer.append(ToStringUtils.boost(getBoost()));
         return buffer.toString();
     };
-    
+
 
     private String flagToString () {
         switch (flag) {
-        case OVERLAP:
-            return "Overlap";
-        case REAL_OVERLAP:
-            return "OverlapStrict";
-        case WITHIN:
-            return "Contain";
-        case REAL_WITHIN:
-            return "ContainStrict";
-        case ENDSWITH:
-            return "EndsWith";
-        case STARTSWITH:
-            return "StartsWith";
-        case MATCH:
-            return "Match";
+            case OVERLAP:
+                return "Overlap";
+            case REAL_OVERLAP:
+                return "OverlapStrict";
+            case WITHIN:
+                return "Contain";
+            case REAL_WITHIN:
+                return "ContainStrict";
+            case ENDSWITH:
+                return "EndsWith";
+            case STARTSWITH:
+                return "StartsWith";
+            case MATCH:
+                return "Match";
         };
         return "Contains";
     };
 
 
     @Override
-    public Spans getSpans (final AtomicReaderContext context,
-                           Bits acceptDocs,
-                           Map<Term,TermContext> termContexts) throws IOException {
-        return (Spans) new WithinSpans (
-            this, context, acceptDocs, termContexts, this.flag
-        );
+    public Spans getSpans (final AtomicReaderContext context, Bits acceptDocs,
+            Map<Term, TermContext> termContexts) throws IOException {
+        return (Spans) new WithinSpans(this, context, acceptDocs, termContexts,
+                this.flag);
     };
-    
+
 
     /*
      * Rewrite query in case it includes regular expressions or wildcards
@@ -201,16 +196,13 @@
 
         return this;
     };
-  
+
 
     @Override
     public SpanWithinQuery clone () {
         SpanWithinQuery spanWithinQuery = new SpanWithinQuery(
-            (SpanQuery) wrap.clone(),
-            (SpanQuery) embedded.clone(),
-            this.flag,
-            this.collectPayloads
-        );
+                (SpanQuery) wrap.clone(), (SpanQuery) embedded.clone(),
+                this.flag, this.collectPayloads);
         spanWithinQuery.setBoost(getBoost());
         return spanWithinQuery;
     };
@@ -220,23 +212,28 @@
      * Returns true iff <code>o</code> is equal to this.
      */
     @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (!(o instanceof SpanWithinQuery)) return false;
-        
+    public boolean equals (Object o) {
+        if (this == o)
+            return true;
+        if (!(o instanceof SpanWithinQuery))
+            return false;
+
         final SpanWithinQuery spanWithinQuery = (SpanWithinQuery) o;
-        
-        if (collectPayloads != spanWithinQuery.collectPayloads) return false;
-        if (!wrap.equals(spanWithinQuery.wrap)) return false;
-        if (!embedded.equals(spanWithinQuery.embedded)) return false;
-        
+
+        if (collectPayloads != spanWithinQuery.collectPayloads)
+            return false;
+        if (!wrap.equals(spanWithinQuery.wrap))
+            return false;
+        if (!embedded.equals(spanWithinQuery.embedded))
+            return false;
+
         return getBoost() == spanWithinQuery.getBoost();
     };
 
 
     // I don't know what I am doing here
     @Override
-    public int hashCode() {
+    public int hashCode () {
         int result = flag;
         result = embedded.hashCode();
         result += wrap.hashCode();
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/AttributeSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/AttributeSpans.java
index 4d8d875..2816c96 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/AttributeSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/AttributeSpans.java
@@ -18,19 +18,27 @@
 
 import de.ids_mannheim.korap.query.SpanAttributeQuery;
 
-/** UPDATE THIS!
- * Span enumeration of attributes which are term spans with special payload
- * assignments referring to another span (e.g. element/relation span) to which
- * an attribute span belongs. The class is basically a wrapper of Lucene
- * {@link TermSpans} with additional functionality regarding element/relation
- * reference. Element/relation id is annotated ascendingly starting from the
+/**
+ * UPDATE THIS!
+ * Span enumeration of attributes which are term spans with special
+ * payload
+ * assignments referring to another span (e.g. element/relation span)
+ * to which
+ * an attribute span belongs. The class is basically a wrapper of
+ * Lucene {@link TermSpans} with additional functionality regarding
+ * element/relation
+ * reference. Element/relation id is annotated ascendingly starting
+ * from the
  * left side. <br/>
  * <br/>
- * The enumeration is ordered firstly by the start position of the attribute and
- * secondly by the element/relation id descendingly. This order helps to match
+ * The enumeration is ordered firstly by the start position of the
+ * attribute and
+ * secondly by the element/relation id descendingly. This order helps
+ * to match
  * element and attributes faster.
  * 
- * AttributeSpans contain information about the elements they belongs to, thus
+ * AttributeSpans contain information about the elements they belongs
+ * to, thus
  * querying them alone is sufficient to get
  * "any element having a specific attribute".
  * 
@@ -44,18 +52,22 @@
 
     protected Logger logger = LoggerFactory.getLogger(AttributeSpans.class);
 
+
     /**
-     * Constructs Attributespans based on the specified SpanAttributeQuery.
+     * Constructs Attributespans based on the specified
+     * SpanAttributeQuery.
      * 
-     * @param spanAttributeQuery a spanAttributeQuery
+     * @param spanAttributeQuery
+     *            a spanAttributeQuery
      * @param context
      * @param acceptDocs
      * @param termContexts
      * @throws IOException
      */
-    public AttributeSpans(SpanAttributeQuery spanAttributeQuery,
-            AtomicReaderContext context, Bits acceptDocs,
-            Map<Term, TermContext> termContexts) throws IOException {
+    public AttributeSpans (SpanAttributeQuery spanAttributeQuery,
+                           AtomicReaderContext context, Bits acceptDocs,
+                           Map<Term, TermContext> termContexts)
+            throws IOException {
         super(spanAttributeQuery, context, acceptDocs, termContexts);
         candidateList = new ArrayList<>();
         hasMoreSpans = firstSpans.next();
@@ -65,21 +77,24 @@
         }
     }
 
+
     @Override
-    public boolean next() throws IOException {
+    public boolean next () throws IOException {
         isStartEnumeration = false;
         matchPayload.clear();
         return advance();
     }
 
+
     /**
-     * Moves to the next match by checking the candidate match list or setting
+     * Moves to the next match by checking the candidate match list or
+     * setting
      * the list first when it is empty.
      * 
      * @return true if a match is found
      * @throws IOException
      */
-    private boolean advance() throws IOException {
+    private boolean advance () throws IOException {
         while (hasMoreSpans || !candidateList.isEmpty()) {
             if (!candidateList.isEmpty()) {
                 // set the current match from the first CandidateAttributeSpan
@@ -88,10 +103,11 @@
                 this.matchDocNumber = cs.getDoc();
                 this.matchStartPosition = cs.getStart();
                 this.matchEndPosition = cs.getEnd();
-				this.setSpanId(cs.getSpanId()); // referentId
+                this.setSpanId(cs.getSpanId()); // referentId
                 candidateList.remove(0);
                 return true;
-            } else {
+            }
+            else {
                 setCandidateList();
                 currentDoc = firstSpans.doc();
                 currentPosition = firstSpans.start();
@@ -100,14 +116,17 @@
         return false;
     }
 
+
     /**
-     * Collects all the attributes in the same start position and sort them by
-     * element/relation Id in a reverse order (the ones with the bigger
+     * Collects all the attributes in the same start position and sort
+     * them by
+     * element/relation Id in a reverse order (the ones with the
+     * bigger
      * element/relation Id first).
      * 
      * @throws IOException
      */
-    private void setCandidateList() throws IOException {
+    private void setCandidateList () throws IOException {
 
         while (hasMoreSpans && firstSpans.doc() == currentDoc
                 && firstSpans.start() == currentPosition) {
@@ -120,56 +139,66 @@
         Collections.reverse(candidateList);
     }
 
+
     /**
-     * Creates a CandidateAttributeSpan based on the child span and set the
+     * Creates a CandidateAttributeSpan based on the child span and
+     * set the
      * spanId and elementEnd from its payloads.
      * 
-     * @param firstSpans an AttributeSpans
+     * @param firstSpans
+     *            an AttributeSpans
      * @return a CandidateAttributeSpan
      * @throws IOException
      */
-    private CandidateAttributeSpan createCandidateSpan() throws IOException {
+    private CandidateAttributeSpan createCandidateSpan () throws IOException {
         List<byte[]> payload = (List<byte[]>) firstSpans.getPayload();
         ByteBuffer wrapper = ByteBuffer.wrap(payload.get(0));
 
-		short spanId;
-		int start = 0, end;
+        short spanId;
+        int start = 0, end;
 
-		if (payload.get(0).length == 6) {
-			end = wrapper.getInt(0);
-			spanId = wrapper.getShort(4);
-			return new CandidateAttributeSpan(firstSpans, spanId, end);
-		}
-		else if (payload.get(0).length == 10) {
-			end = wrapper.getInt(4);
-			spanId = wrapper.getShort(8);
-			return new CandidateAttributeSpan(firstSpans, spanId, start, end);
-		}
-        
-		throw new NullPointerException("Missing element end in payloads.");
+        if (payload.get(0).length == 6) {
+            end = wrapper.getInt(0);
+            spanId = wrapper.getShort(4);
+            return new CandidateAttributeSpan(firstSpans, spanId, end);
+        }
+        else if (payload.get(0).length == 10) {
+            end = wrapper.getInt(4);
+            spanId = wrapper.getShort(8);
+            return new CandidateAttributeSpan(firstSpans, spanId, start, end);
+        }
+
+        throw new NullPointerException("Missing element end in payloads.");
     }
 
+
     /**
-     * Tells if the enumeration of the AttributeSpans has come to an end.
+     * Tells if the enumeration of the AttributeSpans has come to an
+     * end.
      * 
      * @return true if the enumeration has finished.
      */
-    public boolean isFinish() {
+    public boolean isFinish () {
         return isFinish;
     }
 
+
     /**
-     * Sets true if the enumeration of the AttributeSpans has come to an end.
+     * Sets true if the enumeration of the AttributeSpans has come to
+     * an end.
      * 
-     * @param isFinish <code>true</code> if the enumeration of the
-     *        AttributeSpans has come to an end, <code>false</code> otherwise.
+     * @param isFinish
+     *            <code>true</code> if the enumeration of the
+     *            AttributeSpans has come to an end,
+     *            <code>false</code> otherwise.
      */
-    public void setFinish(boolean isFinish) {
+    public void setFinish (boolean isFinish) {
         this.isFinish = isFinish;
     }
 
+
     @Override
-    public boolean skipTo(int target) throws IOException {
+    public boolean skipTo (int target) throws IOException {
         if (hasMoreSpans && (firstSpans.doc() < target)) {
             if (!firstSpans.skipTo(target)) {
                 candidateList.clear();
@@ -182,16 +211,21 @@
         return advance();
     }
 
+
     @Override
-    public long cost() {
+    public long cost () {
         return firstSpans.cost();
     }
 
     /**
-     * CandidateAttributeSpan contains information about an Attribute span. All
-     * attribute spans occurring in an identical position are collected as
-     * CandidateAttributeSpans. The list of these CandidateAttributeSpans are
-     * sorted based on the span ids to which the attributes belong to. The
+     * CandidateAttributeSpan contains information about an Attribute
+     * span. All
+     * attribute spans occurring in an identical position are
+     * collected as
+     * CandidateAttributeSpans. The list of these
+     * CandidateAttributeSpans are
+     * sorted based on the span ids to which the attributes belong to.
+     * The
      * attributes with smaller spanIds come first on the list.
      * 
      * */
@@ -200,43 +234,56 @@
 
         private short spanId;
 
+
         /**
-         * Construct a CandidateAttributeSpan based on the given span, spanId,
+         * Construct a CandidateAttributeSpan based on the given span,
+         * spanId,
          * and elementEnd.
          * 
-         * @param span an AttributeSpans
-         * @param spanId the element or relation span id to which the current
-         *        state of the specified AttributeSpans belongs to.
-         * @param elementEnd the end position of the element or relation span to
-         *        which the current state of the specified AttributeSpans
-         *        belongs to.
+         * @param span
+         *            an AttributeSpans
+         * @param spanId
+         *            the element or relation span id to which the
+         *            current
+         *            state of the specified AttributeSpans belongs
+         *            to.
+         * @param elementEnd
+         *            the end position of the element or relation span
+         *            to
+         *            which the current state of the specified
+         *            AttributeSpans
+         *            belongs to.
          * @throws IOException
          */
-        public CandidateAttributeSpan(Spans span, short spanId, int elementEnd)
+        public CandidateAttributeSpan (Spans span, short spanId, int elementEnd)
                 throws IOException {
             super(span);
-			setSpanId(spanId);
-			this.end = elementEnd;
+            setSpanId(spanId);
+            this.end = elementEnd;
         }
 
-		public CandidateAttributeSpan(Spans span, short spanId,
-				int start, int end) throws IOException {
-			super(span);
-			setSpanId(spanId);
-			this.start = start;
-			this.end = end;
-		}
 
-		public void setSpanId(short spanId) {
+        public CandidateAttributeSpan (Spans span, short spanId, int start,
+                                       int end) throws IOException {
+            super(span);
+            setSpanId(spanId);
+            this.start = start;
+            this.end = end;
+        }
+
+
+        public void setSpanId (short spanId) {
             this.spanId = spanId;
         }
 
-        public short getSpanId() {
+
+        public short getSpanId () {
             return spanId;
         }
 
+
         @Override
-        public int compareTo(CandidateSpan o) {
+        public int compareTo (CandidateSpan o) {
             CandidateAttributeSpan cs = (CandidateAttributeSpan) o;
             if (this.spanId == cs.spanId)
                 return 0;
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/CandidateSpan.java b/src/main/java/de/ids_mannheim/korap/query/spans/CandidateSpan.java
index ce930d4..c78eee4 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/CandidateSpan.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/CandidateSpan.java
@@ -7,31 +7,36 @@
 import org.apache.lucene.search.spans.Spans;
 
 /**
- * CandidateSpan stores the current state of a Lucene {@link Spans}, which is an
- * enumeration. CandidateSpan is used for various purposes, such as for
- * collecting spans which will be used in a latter process or next matching.
+ * CandidateSpan stores the current state of a Lucene {@link Spans},
+ * which is an
+ * enumeration. CandidateSpan is used for various purposes, such as
+ * for
+ * collecting spans which will be used in a latter process or next
+ * matching.
  * 
  * @author margaretha
  * */
 public class CandidateSpan implements Comparable<CandidateSpan>, Cloneable {
-	protected int doc, start, end;
+    protected int doc, start, end;
     private long cost;
     private Collection<byte[]> payloads = new ArrayList<>();
     private int position;
     private CandidateSpan childSpan; // used for example for multiple distance
                                      // with unordered constraint
     protected short spanId;
-	private short leftId, rightId;
-	private int leftStart, leftEnd;
-	private int rightStart, rightEnd;
+    private short leftId, rightId;
+    private int leftStart, leftEnd;
+    private int rightStart, rightEnd;
+
 
     /**
      * Constructs a CandidateSpan for the given Span.
      * 
-     * @param span a Span
+     * @param span
+     *            a Span
      * @throws IOException
      */
-    public CandidateSpan(Spans span) throws IOException {
+    public CandidateSpan (Spans span) throws IOException {
         this.doc = span.doc();
         this.start = span.start();
         this.end = span.end();
@@ -40,32 +45,44 @@
             setPayloads(span.getPayload());
     }
 
+
     /**
-     * Constructs a CandidateSpan for the given Span and element position (where
-     * the span is included in a document). The element position is important
+     * Constructs a CandidateSpan for the given Span and element
+     * position (where
+     * the span is included in a document). The element position is
+     * important
      * for the matching process in {@link ElementDistanceSpans}.
      * 
-     * @param span a Span
-     * @param position an element position
+     * @param span
+     *            a Span
+     * @param position
+     *            an element position
      * @throws IOException
      */
-    public CandidateSpan(Spans span, int position) throws IOException {
+    public CandidateSpan (Spans span, int position) throws IOException {
         this(span);
         this.position = position;
     }
 
+
     /**
-     * Constructs a CandidateSpan from all the given variables which are
+     * Constructs a CandidateSpan from all the given variables which
+     * are
      * properties of a Span.
      * 
-     * @param start the start position of a span
-     * @param end the end position of a span
-     * @param doc the document including the span
-     * @param cost the cost of finding a span
-     * @param payloads the payloads of a span
+     * @param start
+     *            the start position of a span
+     * @param end
+     *            the end position of a span
+     * @param doc
+     *            the document including the span
+     * @param cost
+     *            the cost of finding a span
+     * @param payloads
+     *            the payloads of a span
      */
-    public CandidateSpan(int start, int end, int doc, long cost,
-            Collection<byte[]> payloads) {
+    public CandidateSpan (int start, int end, int doc, long cost,
+                          Collection<byte[]> payloads) {
         this.start = start;
         this.end = end;
         this.doc = doc;
@@ -74,81 +91,94 @@
             setPayloads(payloads);
     }
 
+
     @Override
-    protected CandidateSpan clone() throws CloneNotSupportedException {
+    protected CandidateSpan clone () throws CloneNotSupportedException {
         return new CandidateSpan(this.start, this.end, this.doc, this.cost,
                 this.payloads);
     }
 
+
     /**
      * Returns the document number containing the CandidateSpan.
      * 
      * @return the document number
      */
-    public int getDoc() {
+    public int getDoc () {
         return doc;
     }
 
+
     /**
      * Sets the document number containing the CandidateSpan.
      * 
-     * @param doc the document number
+     * @param doc
+     *            the document number
      */
-    public void setDoc(int doc) {
+    public void setDoc (int doc) {
         this.doc = doc;
     }
 
+
     /**
      * Returns the start position of the CandidateSpan.
      * 
      * @return the start position
      */
-    public int getStart() {
+    public int getStart () {
         return start;
     }
 
+
     /**
      * Sets the start position of the CandidateSpan.
      * 
-     * @param start the start position
+     * @param start
+     *            the start position
      */
-    public void setStart(int start) {
+    public void setStart (int start) {
         this.start = start;
     }
 
+
     /**
      * Returns the end position of the CandidateSpan.
      * 
      * @return the end position
      */
-    public int getEnd() {
+    public int getEnd () {
         return end;
     }
 
+
     /**
      * Sets the end position of the CandidateSpan.
      * 
-     * @param end the end position
+     * @param end
+     *            the end position
      */
-    public void setEnd(int end) {
+    public void setEnd (int end) {
         this.end = end;
     }
 
+
     /**
      * Returns the payloads of the CandidateSpan.
      * 
      * @return the payloads
      */
-    public Collection<byte[]> getPayloads() {
+    public Collection<byte[]> getPayloads () {
         return payloads;
     }
 
+
     /**
      * Sets the payloads of the CandidateSpan.
      * 
-     * @param payloads the payloads
+     * @param payloads
+     *            the payloads
      */
-    public void setPayloads(Collection<byte[]> payloads) {
+    public void setPayloads (Collection<byte[]> payloads) {
 
         for (byte[] b : payloads) {
             if (b == null)
@@ -158,134 +188,168 @@
         }
     }
 
+
     /**
      * Returns the cost of finding the CandidateSpan.
      * 
      * @return the cost
      */
-    public long getCost() {
+    public long getCost () {
         return cost;
     }
 
+
     /**
      * Sets the cost of finding the CandidateSpan.
      * 
-     * @param cost the cost
+     * @param cost
+     *            the cost
      */
-    public void setCost(long cost) {
+    public void setCost (long cost) {
         this.cost = cost;
     }
 
+
     /**
-     * Returns the element position number containing the CandidateSpan.
+     * Returns the element position number containing the
+     * CandidateSpan.
      * 
      * @return the element position number
      */
-    public int getPosition() {
+    public int getPosition () {
         return position;
     }
 
+
     /**
      * Sets the element position number containing the CandidateSpan.
      * 
-     * @param position the element position number
+     * @param position
+     *            the element position number
      */
-    public void setPosition(int position) {
+    public void setPosition (int position) {
         this.position = position;
     }
 
+
     /**
      * Returns a child/sub Span of the CandidateSpan.
      * 
      * @return a child/sub span of the CandidateSpan
      */
-    public CandidateSpan getChildSpan() {
+    public CandidateSpan getChildSpan () {
         return childSpan;
     }
 
+
     /**
      * Sets the child/sub span of the CandidateSpan.
      * 
-     * @param childSpan a child/sub span of the CandidateSpan
+     * @param childSpan
+     *            a child/sub span of the CandidateSpan
      */
-    public void setChildSpan(CandidateSpan childSpan) {
+    public void setChildSpan (CandidateSpan childSpan) {
         this.childSpan = childSpan;
     }
 
+
     /**
-     * Returns the span id of another Span related to the CandidateSpan. Only
-     * CandidateSpan of particular Spans such as {@link AttributeSpans} having
-     * this property. For instance, an AttributeSpan has a spanId of the element
+     * Returns the span id of another Span related to the
+     * CandidateSpan. Only
+     * CandidateSpan of particular Spans such as
+     * {@link AttributeSpans} having
+     * this property. For instance, an AttributeSpan has a spanId of
+     * the element
      * it belongs to.
      * 
-     * @return the span id of another Span related to the CandidateSpan
+     * @return the span id of another Span related to the
+     *         CandidateSpan
      */
-    public short getSpanId() {
+    public short getSpanId () {
         return spanId;
     }
 
+
     /**
-     * Sets the span id of another Span related to the CandidateSpan. Only
-     * CandidateSpan of particular Spans such as {@link AttributeSpans} having
-     * this property. For instance, an AttributeSpan has a spanId of the element
+     * Sets the span id of another Span related to the CandidateSpan.
+     * Only
+     * CandidateSpan of particular Spans such as
+     * {@link AttributeSpans} having
+     * this property. For instance, an AttributeSpan has a spanId of
+     * the element
      * it belongs to.
      * 
-     * @param spanId the span id of another Span related to the CandidateSpan
+     * @param spanId
+     *            the span id of another Span related to the
+     *            CandidateSpan
      */
-    public void setSpanId(short spanId) {
+    public void setSpanId (short spanId) {
         this.spanId = spanId;
     }
 
-	public short getLeftId() {
-		return leftId;
-	}
 
-	public void setLeftId(short leftId) {
-		this.leftId = leftId;
-	}
+    public short getLeftId () {
+        return leftId;
+    }
 
-	public short getRightId() {
-		return rightId;
-	}
 
-	public void setRightId(short rightId) {
-		this.rightId = rightId;
-	}
+    public void setLeftId (short leftId) {
+        this.leftId = leftId;
+    }
 
-	public int getLeftStart() {
-		return leftStart;
-	}
 
-	public void setLeftStart(int leftStart) {
-		this.leftStart = leftStart;
-	}
+    public short getRightId () {
+        return rightId;
+    }
 
-	public int getLeftEnd() {
-		return leftEnd;
-	}
 
-	public void setLeftEnd(int leftEnd) {
-		this.leftEnd = leftEnd;
-	}
+    public void setRightId (short rightId) {
+        this.rightId = rightId;
+    }
 
-	public int getRightStart() {
-		return rightStart;
-	}
 
-	public void setRightStart(int rightStart) {
-		this.rightStart = rightStart;
-	}
+    public int getLeftStart () {
+        return leftStart;
+    }
 
-	public int getRightEnd() {
-		return rightEnd;
-	}
 
-	public void setRightEnd(int rightEnd) {
-		this.rightEnd = rightEnd;
-	}
+    public void setLeftStart (int leftStart) {
+        this.leftStart = leftStart;
+    }
 
-	@Override
-    public int compareTo(CandidateSpan o) {
+
+    public int getLeftEnd () {
+        return leftEnd;
+    }
+
+
+    public void setLeftEnd (int leftEnd) {
+        this.leftEnd = leftEnd;
+    }
+
+
+    public int getRightStart () {
+        return rightStart;
+    }
+
+
+    public void setRightStart (int rightStart) {
+        this.rightStart = rightStart;
+    }
+
+
+    public int getRightEnd () {
+        return rightEnd;
+    }
+
+
+    public void setRightEnd (int rightEnd) {
+        this.rightEnd = rightEnd;
+    }
+
+
+    @Override
+    public int compareTo (CandidateSpan o) {
         if (this.doc == o.doc) {
             if (this.getStart() == o.getStart()) {
                 if (this.getEnd() == o.getEnd())
@@ -294,11 +358,13 @@
                     return 1;
                 else
                     return -1;
-            } else if (this.getStart() < o.getStart())
+            }
+            else if (this.getStart() < o.getStart())
                 return -1;
             else
                 return 1;
-        } else if (this.doc < o.doc)
+        }
+        else if (this.doc < o.doc)
             return -1;
         else
             return 1;
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/ClassSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/ClassSpans.java
index b7492e9..35fe53f 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/ClassSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/ClassSpans.java
@@ -21,7 +21,7 @@
  * And the start and end position of the span, so this information
  * can bubble up for later processing (similar to captures in regular
  * expression).
- *
+ * 
  * @author diewald
  */
 
@@ -39,25 +39,29 @@
     // This advices the java compiler to ignore all loggings
     public static final boolean DEBUG = false;
 
+
     /**
      * Construct a new ClassSpans object.
-     *
-     * @param operand An arbitrary nested {@link SpanQuery}.
-     * @param context The {@link AtomicReaderContext}.
-     * @param acceptDocs Bit vector representing the documents
-     *        to be searched in.
-     * @param termContexts A map managing {@link TermState TermStates}.
-     * @param number The identifying class number.
+     * 
+     * @param operand
+     *            An arbitrary nested {@link SpanQuery}.
+     * @param context
+     *            The {@link AtomicReaderContext}.
+     * @param acceptDocs
+     *            Bit vector representing the documents
+     *            to be searched in.
+     * @param termContexts
+     *            A map managing {@link TermState TermStates}.
+     * @param number
+     *            The identifying class number.
      */
-    public ClassSpans (SpanQuery operand,
-                       AtomicReaderContext context,
-                       Bits acceptDocs,
-                       Map<Term,TermContext> termContexts,
+    public ClassSpans (SpanQuery operand, AtomicReaderContext context,
+                       Bits acceptDocs, Map<Term, TermContext> termContexts,
                        byte number) throws IOException {
         spans = operand.getSpans(context, acceptDocs, termContexts);
 
         // The number of the class
-        this.number  = number;
+        this.number = number;
 
         // The current operand
         this.operand = operand;
@@ -100,7 +104,8 @@
 
     @Override
     public boolean next () throws IOException {
-        if (DEBUG) log.trace("Forward next");
+        if (DEBUG)
+            log.trace("Forward next");
 
         if (spans.next())
             return this.addClassPayload();
@@ -108,46 +113,43 @@
         hasmorespans = false;
         return false;
     };
-    
-    private boolean addClassPayload () throws IOException {
-    	hasmorespans = true;
 
-	    classedPayload.clear();
+
+    private boolean addClassPayload () throws IOException {
+        hasmorespans = true;
+
+        classedPayload.clear();
 
         // Subquery has payloads
-	    if (spans.isPayloadAvailable()) {
+        if (spans.isPayloadAvailable()) {
             classedPayload.addAll(spans.getPayload());
-            if (DEBUG) log.trace("Found payload in nested SpanQuery");
-	    };
-
-	    if (DEBUG) {
-            log.trace(
-                "Wrap class {} around span {} - {}",
-                number,
-                spans.start(),
-                spans.end()
-            );
+            if (DEBUG)
+                log.trace("Found payload in nested SpanQuery");
         };
 
-	    // Todo: Better allocate using a Factory!
-	    bb.clear();
-	    bb.putInt(spans.start()).putInt(spans.end()).put(number);
+        if (DEBUG) {
+            log.trace("Wrap class {} around span {} - {}", number,
+                    spans.start(), spans.end());
+        };
 
-	    // Add highlight information as byte array
-	    classedPayload.add(bb.array());
+        // Todo: Better allocate using a Factory!
+        bb.clear();
+        bb.putInt(spans.start()).putInt(spans.end()).put(number);
+
+        // Add highlight information as byte array
+        classedPayload.add(bb.array());
         return true;
-	};
+    };
 
 
     @Override
     public boolean skipTo (int target) throws IOException {
         classedPayload.clear();
 
-        if (DEBUG) log.trace("Skip ClassSpans {} -> {}",
-                             spans.doc(), target);
+        if (DEBUG)
+            log.trace("Skip ClassSpans {} -> {}", spans.doc(), target);
 
-        if (hasmorespans && spans.doc() < target &&
-            spans.skipTo(target))
+        if (hasmorespans && spans.doc() < target && spans.skipTo(target))
             return this.addClassPayload();
         return false;
     };
@@ -155,13 +157,13 @@
 
     @Override
     public String toString () {
-        return getClass().getName() + "(" + this.operand.toString() + ")@" +
-            (doc() + ":" + start() + "-" + end());
+        return getClass().getName() + "(" + this.operand.toString() + ")@"
+                + (doc() + ":" + start() + "-" + end());
     };
 
 
     @Override
-    public long cost() {
+    public long cost () {
         return spans.cost();
     };
 };
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/DistanceExclusionSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/DistanceExclusionSpans.java
index 2bc0cd4..517e8f8 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/DistanceExclusionSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/DistanceExclusionSpans.java
@@ -11,8 +11,10 @@
 import de.ids_mannheim.korap.query.SpanDistanceQuery;
 
 /**
- * Span enumeration of spans (the firstSpans) which do <em>not</em> occur
- * together with other spans (the secondSpans) within a range of distance.
+ * Span enumeration of spans (the firstSpans) which do <em>not</em>
+ * occur
+ * together with other spans (the secondSpans) within a range of
+ * distance.
  * 
  * @author margaretha
  * */
@@ -22,21 +24,28 @@
     private boolean isOrdered;
     private boolean hasMoreSecondSpans;
 
+
     /**
      * Constructs DistanceExclusionSpans for the specified
      * {@link SpanDistanceQuery}.
      * 
-     * @param query a SpanDistanceQuery
+     * @param query
+     *            a SpanDistanceQuery
      * @param context
      * @param acceptDocs
      * @param termContexts
-     * @param isOrdered a boolean flag representing the value <code>true</code>
-     *        if the spans must occur in order, <code>false</code> otherwise.
+     * @param isOrdered
+     *            a boolean flag representing the value
+     *            <code>true</code>
+     *            if the spans must occur in order, <code>false</code>
+     *            otherwise.
      * @throws IOException
      */
-    public DistanceExclusionSpans(SpanDistanceQuery query,
-            AtomicReaderContext context, Bits acceptDocs,
-            Map<Term, TermContext> termContexts) throws IOException {
+    public DistanceExclusionSpans (SpanDistanceQuery query,
+                                   AtomicReaderContext context,
+                                   Bits acceptDocs,
+                                   Map<Term, TermContext> termContexts)
+            throws IOException {
         super(query, context, acceptDocs, termContexts);
         minDistance = query.getMinDistance();
         maxDistance = query.getMaxDistance();
@@ -45,8 +54,9 @@
         hasMoreSecondSpans = secondSpans.next();
     }
 
+
     @Override
-    protected boolean advance() throws IOException {
+    protected boolean advance () throws IOException {
 
         while (hasMoreSpans) {
             if (hasMoreSecondSpans)
@@ -61,13 +71,15 @@
         return false;
     }
 
+
     /**
-     * Advance the second span until it occurs on the right side of the first
+     * Advance the second span until it occurs on the right side of
+     * the first
      * span.
      * 
      * @throws IOException
      */
-    private void forwardSecondSpans() throws IOException {
+    private void forwardSecondSpans () throws IOException {
 
         if (secondSpans.doc() < firstSpans.doc()) {
             hasMoreSecondSpans = secondSpans.skipTo(firstSpans.doc());
@@ -85,14 +97,17 @@
         }
     }
 
+
     /**
-     * Calculate the distance / difference between a firstspan and a secondspan
+     * Calculate the distance / difference between a firstspan and a
+     * secondspan
      * positions.
      * 
-     * @return distance the difference between the positions of a firstspan and
+     * @return distance the difference between the positions of a
+     *         firstspan and
      *         a secondspan.
      * */
-    private int calculateActualDistance() {
+    private int calculateActualDistance () {
         // right secondSpan
         if (firstSpans.end() <= secondSpans.start())
             return secondSpans.start() - firstSpans.end() + 1;
@@ -100,14 +115,18 @@
         return firstSpans.start() - secondSpans.end() + 1;
     }
 
+
     /**
-     * Check the distance between the current first span and second span against
+     * Check the distance between the current first span and second
+     * span against
      * the min and max distance constraints.
      * 
-     * @return true if the distance between the first and the second spans are
-     *         smaller as the minimum distance or bigger than the max distance.
+     * @return true if the distance between the first and the second
+     *         spans are
+     *         smaller as the minimum distance or bigger than the max
+     *         distance.
      */
-    private boolean findMatch() throws IOException {
+    private boolean findMatch () throws IOException {
         if (!hasMoreSecondSpans || secondSpans.doc() > firstSpans.doc()) {
             setMatchProperties();
             return true;
@@ -126,12 +145,13 @@
         return false;
     }
 
+
     /**
      * Set the current firstspan as the current match.
      * 
      * @throws IOException
      */
-    private void setMatchProperties() throws IOException {
+    private void setMatchProperties () throws IOException {
         matchDocNumber = firstSpans.doc();
         matchStartPosition = firstSpans.start();
         matchEndPosition = firstSpans.end();
@@ -142,8 +162,9 @@
         setMatchFirstSpan(new CandidateSpan(firstSpans));
     }
 
+
     @Override
-    public boolean skipTo(int target) throws IOException {
+    public boolean skipTo (int target) throws IOException {
         if (hasMoreSpans && firstSpans.doc() < target) {
             if (!firstSpans.skipTo(target)) {
                 hasMoreSpans = false;
@@ -153,8 +174,9 @@
         return advance();
     }
 
+
     @Override
-    public long cost() {
+    public long cost () {
         return firstSpans.cost() + secondSpans.cost();
     }
 
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/DistanceSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/DistanceSpans.java
index 8559405..b6b6f9f 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/DistanceSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/DistanceSpans.java
@@ -14,10 +14,13 @@
 import de.ids_mannheim.korap.query.SpanMultipleDistanceQuery;
 
 /**
- * DistanceSpan is a base class for enumeration of span matches, whose two child
- * spans have a specific range of distance (within a min and a max distance) and
+ * DistanceSpan is a base class for enumeration of span matches, whose
+ * two child
+ * spans have a specific range of distance (within a min and a max
+ * distance) and
  * other constraints (i.e. order and co-occurrence) depending on the
- * {@link SpanDistanceQuery}. All distance related spans extends this class.
+ * {@link SpanDistanceQuery}. All distance related spans extends this
+ * class.
  * 
  * @see DistanceExclusionSpans
  * @see ElementDistanceExclusionSpans
@@ -33,109 +36,131 @@
     protected Logger log = LoggerFactory.getLogger(DistanceSpans.class);
     protected boolean exclusion; // for MultipleDistanceQuery
 
+
     /**
      * Constructs a DistanceSpans enumeration for the given
      * {@link SpanDistanceQuery}.
      * 
-     * @param query a SpanDistanceQuery
+     * @param query
+     *            a SpanDistanceQuery
      * @param context
      * @param acceptDocs
      * @param termContexts
      * @throws IOException
      */
-    public DistanceSpans(SpanDistanceQuery query, AtomicReaderContext context,
-            Bits acceptDocs, Map<Term, TermContext> termContexts)
+    public DistanceSpans (SpanDistanceQuery query, AtomicReaderContext context,
+                          Bits acceptDocs, Map<Term, TermContext> termContexts)
             throws IOException {
         super(query, context, acceptDocs, termContexts);
         exclusion = query.isExclusion();
     }
 
+
     /**
      * Constructs a DistanceSpans enumeration for the given
      * {@link SpanMultipleDistanceQuery}.
      * 
-     * @param query a SpanMultipleDistanceQuery
+     * @param query
+     *            a SpanMultipleDistanceQuery
      * @param context
      * @param acceptDocs
      * @param termContexts
      * @throws IOException
      */
-    public DistanceSpans(SpanMultipleDistanceQuery query,
-            AtomicReaderContext context, Bits acceptDocs,
-            Map<Term, TermContext> termContexts) throws IOException {
+    public DistanceSpans (SpanMultipleDistanceQuery query,
+                          AtomicReaderContext context, Bits acceptDocs,
+                          Map<Term, TermContext> termContexts)
+            throws IOException {
         super(query, context, acceptDocs, termContexts);
     }
 
+
     @Override
-    public boolean next() throws IOException {
+    public boolean next () throws IOException {
         isStartEnumeration = false;
         matchPayload.clear();
         return advance();
     }
 
+
     /**
      * Advances the current span enumeration to the next span match.
      * 
      * @return <code>true</code> if a span match is available,
      *         <code>false</code> otherwise.
      * */
-    protected abstract boolean advance() throws IOException;
+    protected abstract boolean advance () throws IOException;
+
 
     /**
      * Returns the first span of the current match.
      * 
      * @return the first span of the current match.
      */
-    public CandidateSpan getMatchFirstSpan() {
+    public CandidateSpan getMatchFirstSpan () {
         return matchFirstSpan;
     }
 
+
     /**
      * Sets the first span of the current match.
      * 
-     * @param matchFirstSpan the first span of the current match.
+     * @param matchFirstSpan
+     *            the first span of the current match.
      */
-    public void setMatchFirstSpan(CandidateSpan matchFirstSpan) {
+    public void setMatchFirstSpan (CandidateSpan matchFirstSpan) {
         this.matchFirstSpan = matchFirstSpan;
     }
 
+
     /**
      * Returns the second span of the current match.
      * 
      * @return the second span of the current match.
      */
-    public CandidateSpan getMatchSecondSpan() {
+    public CandidateSpan getMatchSecondSpan () {
         return matchSecondSpan;
     }
 
+
     /**
      * Sets the second span of the current match.
      * 
-     * @param matchSecondSpan the second span of the current match.
+     * @param matchSecondSpan
+     *            the second span of the current match.
      */
-    public void setMatchSecondSpan(CandidateSpan matchSecondSpan) {
+    public void setMatchSecondSpan (CandidateSpan matchSecondSpan) {
         this.matchSecondSpan = matchSecondSpan;
     }
 
+
     /**
-     * Tells if the second span must occur together with the first span, or not.
+     * Tells if the second span must occur together with the first
+     * span, or not.
      * 
-     * @return <code>true</code> if the second span must <em>not</em> occur
-     *         together with the first span, <code>false</code> otherwise.
+     * @return <code>true</code> if the second span must <em>not</em>
+     *         occur
+     *         together with the first span, <code>false</code>
+     *         otherwise.
      */
-    public boolean isExclusion() {
+    public boolean isExclusion () {
         return exclusion;
     }
 
+
     /**
-     * Sets <code>true</code> if the second span must <em>not</em> occur
+     * Sets <code>true</code> if the second span must <em>not</em>
+     * occur
      * together with the first span, <code>false</code> otherwise.
      * 
-     * @param exclusion a boolean with the value <code>true</code> if the second
-     *        span must <em>not</em> occur together with the first span,
-     *        <code>false</code> otherwise.
+     * @param exclusion
+     *            a boolean with the value <code>true</code> if the
+     *            second
+     *            span must <em>not</em> occur together with the first
+     *            span,
+     *            <code>false</code> otherwise.
      */
-    public void setExclusion(boolean exclusion) {
+    public void setExclusion (boolean exclusion) {
         this.exclusion = exclusion;
     }
 
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/ElementDistanceExclusionSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/ElementDistanceExclusionSpans.java
index 3e701b6..f5fc8cb 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/ElementDistanceExclusionSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/ElementDistanceExclusionSpans.java
@@ -15,11 +15,16 @@
 import de.ids_mannheim.korap.query.SpanDistanceQuery;
 
 /**
- * Span enumeration of spans (firstSpans) which do <em>not</em> occur together
- * with other spans (secondSpans) on the right side, within a range of an
- * element-based distance (i.e. a sentence or a paragraph as the distance unit).
- * If the query requires that the spans are ordered, then the firstSpans must
- * occur before the secondSpans. In this class, firstSpans are also referred to
+ * Span enumeration of spans (firstSpans) which do <em>not</em> occur
+ * together
+ * with other spans (secondSpans) on the right side, within a range of
+ * an
+ * element-based distance (i.e. a sentence or a paragraph as the
+ * distance unit).
+ * If the query requires that the spans are ordered, then the
+ * firstSpans must
+ * occur before the secondSpans. In this class, firstSpans are also
+ * referred to
  * as target spans and second spans as candidate spans.<br/>
  * <br/>
  * Note: The element distance unit does not overlap to each other.
@@ -45,19 +50,23 @@
     private int minDistance, maxDistance;
     private int firstSpanPostion;
 
+
     /**
      * Constructs ElementDistanceExclusionSpans from the specified
      * {@link SpanDistanceQuery}.
      * 
-     * @param query a SpanDistanceQuery
+     * @param query
+     *            a SpanDistanceQuery
      * @param context
      * @param acceptDocs
      * @param termContexts
      * @throws IOException
      */
-    public ElementDistanceExclusionSpans(SpanDistanceQuery query,
-            AtomicReaderContext context, Bits acceptDocs,
-            Map<Term, TermContext> termContexts) throws IOException {
+    public ElementDistanceExclusionSpans (SpanDistanceQuery query,
+                                          AtomicReaderContext context,
+                                          Bits acceptDocs,
+                                          Map<Term, TermContext> termContexts)
+            throws IOException {
         super(query, context, acceptDocs, termContexts);
 
         elements = query.getElementQuery().getSpans(context, acceptDocs,
@@ -76,8 +85,9 @@
         maxDistance = query.getMaxDistance();
     }
 
+
     @Override
-    protected boolean advance() throws IOException {
+    protected boolean advance () throws IOException {
         while (!targetList.isEmpty()
                 || (hasMoreSpans && ensureSameDoc(firstSpans, elements))) {
             if (!targetList.isEmpty()) {
@@ -92,14 +102,16 @@
         return false;
     }
 
+
     /**
      * Tells if the first target from the target list is a match.
      * 
-     * @return <code>true</code> if the first target from the target list is a
+     * @return <code>true</code> if the first target from the target
+     *         list is a
      *         match, <code>false</code> otherwise.
      * @throws IOException
      */
-    private boolean isFirstTargetValid() throws IOException {
+    private boolean isFirstTargetValid () throws IOException {
         CandidateSpan target = targetList.get(0);
         targetList.remove(0);
         firstSpanPostion = target.getPosition();
@@ -113,14 +125,16 @@
         return true;
     }
 
+
     /**
      * Validate if the current firstSpan is a match.
      * 
-     * @return <code>true</code> if a match is found, <code>false</code>
+     * @return <code>true</code> if a match is found,
+     *         <code>false</code>
      *         otherwise.
      * @throws IOException
      */
-    private boolean findMatch() throws IOException {
+    private boolean findMatch () throws IOException {
         if (firstSpans.doc() != currentDocNum) {
             currentDocNum = firstSpans.doc();
             candidateList.clear();
@@ -129,7 +143,8 @@
         if (hasMoreSecondSpans) {
             if (secondSpans.doc() == firstSpans.doc()) {
                 return (isFirstSpanValid() ? true : false);
-            } else if (secondSpans.doc() < firstSpans.doc()) {
+            }
+            else if (secondSpans.doc() < firstSpans.doc()) {
                 hasMoreSecondSpans = secondSpans.skipTo(firstSpans.doc());
                 return false;
             }
@@ -150,37 +165,45 @@
         return (isFirstSpanValid() ? true : false);
     }
 
+
     /**
      * Tells if the current firstSpan is a match.
      * 
-     * @return <code>true</code> if a match is found, <code>false</code>
+     * @return <code>true</code> if a match is found,
+     *         <code>false</code>
      *         otherwise.
-     * @throws IOException <pre>
-     * private boolean isFirstSpanValid() throws IOException {
-     *     if (candidateList.isEmpty()) {
-     *         if (isFirstSpanInElement()) {
-     *             setMatchProperties(new CandidateSpan(firstSpans, elementPosition));
+     * @throws IOException
+     *             <pre>
+     *             private boolean isFirstSpanValid() throws
+     *             IOException {
+     *             if (candidateList.isEmpty()) {
+     *             if (isFirstSpanInElement()) {
+     *             setMatchProperties(new CandidateSpan(firstSpans,
+     *             elementPosition));
      *             hasMoreSpans = firstSpans.next();
      *             return true;
-     *         }
-     *         hasMoreSpans = firstSpans.next();
-     *         return false;
-     *     }
-     *     return (findMatch() ? true : false);
-     * }
-     * </pre>
+     *             }
+     *             hasMoreSpans = firstSpans.next();
+     *             return false;
+     *             }
+     *             return (findMatch() ? true : false);
+     *             }
+     *             </pre>
      */
 
     /**
-     * Tells if the given span is in an element distance unit, or not, by
+     * Tells if the given span is in an element distance unit, or not,
+     * by
      * advancing the element distance unit to the span position.
      * 
-     * @param span a span
-     * @return <code>true</code> if the element distance unit can be advanced to
+     * @param span
+     *            a span
+     * @return <code>true</code> if the element distance unit can be
+     *         advanced to
      *         contain the given span, <code>false</code> otherwise.
      * @throws IOException
      */
-    private boolean advanceElementTo(Spans span) throws IOException {
+    private boolean advanceElementTo (Spans span) throws IOException {
         while (hasMoreElements && elements.doc() == currentDocNum
                 && elements.start() < span.end()) {
 
@@ -195,14 +218,16 @@
         return false;
     }
 
+
     /**
      * Tells if the current firstSpan is a match.
      * 
-     * @return <code>true</code> if a match is found, <code>false</code>
+     * @return <code>true</code> if a match is found,
+     *         <code>false</code>
      *         otherwise.
      * @throws IOException
      */
-    private boolean isFirstSpanValid() throws IOException {
+    private boolean isFirstSpanValid () throws IOException {
         if (!isOrdered)
             collectLeftCandidates();
 
@@ -227,14 +252,17 @@
         return false;
     }
 
+
     /**
-     * Collects all second spans (candidates) on the right side of the current
-     * first span (target) position. At the same time, also collects all other
+     * Collects all second spans (candidates) on the right side of the
+     * current
+     * first span (target) position. At the same time, also collects
+     * all other
      * first spans occurring before the second spans.
      * 
      * @throws IOException
      */
-    private void collectRightCandidates() throws IOException {
+    private void collectRightCandidates () throws IOException {
         while (hasMoreSecondSpans && secondSpans.doc() == currentDocNum) {
 
             if (elementPosition > firstSpanPostion + maxDistance) {
@@ -260,13 +288,15 @@
         }
     }
 
+
     /**
-     * Collects all the second spans (candidates) occurring before the first
+     * Collects all the second spans (candidates) occurring before the
+     * first
      * spans, and are within an element distance unit.
      * 
      * @throws IOException
      */
-    private void collectLeftCandidates() throws IOException {
+    private void collectLeftCandidates () throws IOException {
         while (hasMoreSecondSpans && secondSpans.doc() == firstSpans.doc()
                 && secondSpans.start() < firstSpans.end()) {
             if (advanceElementTo(secondSpans)) {
@@ -278,16 +308,22 @@
         }
     }
 
+
     /**
-     * Tells if there is a candidate span (second span) occurring together with
-     * the target span (firstspan) within the minimum and maximum distance
+     * Tells if there is a candidate span (second span) occurring
+     * together with
+     * the target span (firstspan) within the minimum and maximum
+     * distance
      * range.
      * 
-     * @return <code>true</code> if there is a candidate span (second span)
-     *         occurring together with the target span (firstspan) within the
-     *         minimum and maximum distance range, <code>false</code> otherwise.
+     * @return <code>true</code> if there is a candidate span (second
+     *         span)
+     *         occurring together with the target span (firstspan)
+     *         within the
+     *         minimum and maximum distance range, <code>false</code>
+     *         otherwise.
      */
-    private boolean isWithinDistance() {
+    private boolean isWithinDistance () {
         int actualDistance;
         for (CandidateSpan cs : candidateList) {
             actualDistance = cs.getPosition() - firstSpanPostion;
@@ -300,14 +336,16 @@
         return false;
     }
 
+
     /**
      * Tells if the current firstSpans is in an element.
      * 
-     * @return <code>true</code> if the current firstSpans in is an element,
+     * @return <code>true</code> if the current firstSpans in is an
+     *         element,
      *         <code>false</code> otherwise.
      * @throws IOException
      */
-    private boolean isFirstSpanInElement() throws IOException {
+    private boolean isFirstSpanInElement () throws IOException {
         if (advanceElementTo(firstSpans)) {
             firstSpanPostion = elementPosition;
             filterCandidateList(firstSpanPostion);
@@ -316,15 +354,20 @@
         return false;
     }
 
+
     /**
-     * From the candidateList, removes all candidate spans that are too far from
-     * the given target position, and have exactly the same position as the
-     * target position. Only candidate spans occurring within a range of
+     * From the candidateList, removes all candidate spans that are
+     * too far from
+     * the given target position, and have exactly the same position
+     * as the
+     * target position. Only candidate spans occurring within a range
+     * of
      * distance from the target position, are retained.
      * 
-     * @param position target/firstSpan position
+     * @param position
+     *            target/firstSpan position
      */
-    private void filterCandidateList(int position) {
+    private void filterCandidateList (int position) {
 
         Iterator<CandidateSpan> i = candidateList.iterator();
         CandidateSpan cs;
@@ -338,13 +381,15 @@
         }
     }
 
+
     /**
      * Sets the given target/match CandidateSpan as the current match.
      * 
-     * @param match a target/firstSpan wrapped as a CandidateSpan
+     * @param match
+     *            a target/firstSpan wrapped as a CandidateSpan
      * @throws IOException
      */
-    private void setMatchProperties(CandidateSpan match) throws IOException {
+    private void setMatchProperties (CandidateSpan match) throws IOException {
         matchDocNumber = match.getDoc();
         matchStartPosition = match.getStart();
         matchEndPosition = match.getEnd();
@@ -355,8 +400,9 @@
         setMatchFirstSpan(match);
     }
 
+
     @Override
-    public boolean skipTo(int target) throws IOException {
+    public boolean skipTo (int target) throws IOException {
         if (hasMoreSpans && firstSpans.doc() < target) {
             if (!firstSpans.skipTo(target)) {
                 hasMoreSpans = false;
@@ -366,8 +412,9 @@
         return advance();
     }
 
+
     @Override
-    public long cost() {
+    public long cost () {
         return elements.cost() + firstSpans.cost() + secondSpans.cost();
     }
 
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/ElementDistanceSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/ElementDistanceSpans.java
index e4a77d6..5060b31 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/ElementDistanceSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/ElementDistanceSpans.java
@@ -13,11 +13,16 @@
 import de.ids_mannheim.korap.query.SpanDistanceQuery;
 
 /**
- * Span enumeration of element-based distance span matches. Each match consists
- * of two child spans. The element-distance between the child spans is the
- * difference between the element position numbers where the child spans are.
- * The element-distance unit can be a sentence or a paragraph. All other child
- * spans' occurrences which are not in a sentence or a paragraph (with respect
+ * Span enumeration of element-based distance span matches. Each match
+ * consists
+ * of two child spans. The element-distance between the child spans is
+ * the
+ * difference between the element position numbers where the child
+ * spans are.
+ * The element-distance unit can be a sentence or a paragraph. All
+ * other child
+ * spans' occurrences which are not in a sentence or a paragraph (with
+ * respect
  * to the element distance type currently used), are ignored.
  * 
  * Note: elements cannot overlap with each other.
@@ -31,18 +36,22 @@
     private int elementPosition;
     private int secondSpanPostion;
 
+
     /**
-     * Constructs ElementDistanceSpans based on the given SpanDistanceQuery.
+     * Constructs ElementDistanceSpans based on the given
+     * SpanDistanceQuery.
      * 
-     * @param query a SpanDistanceQuery
+     * @param query
+     *            a SpanDistanceQuery
      * @param context
      * @param acceptDocs
      * @param termContexts
      * @throws IOException
      */
-    public ElementDistanceSpans(SpanDistanceQuery query,
-            AtomicReaderContext context, Bits acceptDocs,
-            Map<Term, TermContext> termContexts) throws IOException {
+    public ElementDistanceSpans (SpanDistanceQuery query,
+                                 AtomicReaderContext context, Bits acceptDocs,
+                                 Map<Term, TermContext> termContexts)
+            throws IOException {
         super(query, context, acceptDocs, termContexts);
 
         elements = query.getElementQuery().getSpans(context, acceptDocs,
@@ -53,8 +62,9 @@
         elementPosition = 0;
     }
 
+
     @Override
-    protected boolean findMatch() throws IOException {
+    protected boolean findMatch () throws IOException {
         CandidateSpan candidateSpan = candidateList.get(candidateListIndex);
         int actualDistance = secondSpanPostion - candidateSpan.getPosition();
 
@@ -72,13 +82,15 @@
         return false;
     }
 
+
     @Override
-    protected void setCandidateList() throws IOException {
+    protected void setCandidateList () throws IOException {
         if (candidateListDocNum == elements.doc()
                 && candidateListDocNum == secondSpans.doc()) {
             candidateListIndex = -1;
             addNewCandidates();
-        } else {
+        }
+        else {
             candidateList.clear();
             if (hasMoreFirstSpans
                     && findSameDoc(firstSpans, secondSpans, elements)) {
@@ -90,13 +102,15 @@
         }
     }
 
+
     /**
-     * Add new possible (candidate) firstspans. Candidate firstspans must be in
+     * Add new possible (candidate) firstspans. Candidate firstspans
+     * must be in
      * an element and not too far from the secondspan.
      * 
      * @throws IOException
      */
-    private void addNewCandidates() throws IOException {
+    private void addNewCandidates () throws IOException {
         while (hasMoreFirstSpans && firstSpans.doc() == candidateListDocNum
                 && firstSpans.start() < secondSpans.end()) {
 
@@ -109,12 +123,14 @@
         }
     }
 
+
     /**
-     * Advance elements until encountering a span within the given document.
+     * Advance elements until encountering a span within the given
+     * document.
      * 
      * @return true iff an element containing the span, is found.
      */
-    private boolean advanceElementTo(Spans span) throws IOException {
+    private boolean advanceElementTo (Spans span) throws IOException {
         while (hasMoreElements && elements.doc() == candidateListDocNum
                 && elements.start() < span.end()) {
 
@@ -129,13 +145,16 @@
         return false;
     }
 
+
     /**
-     * Reduce the number of candidates by removing all candidates that are not
+     * Reduce the number of candidates by removing all candidates that
+     * are not
      * within the max distance from the given element position.
      * 
-     * @param position an element position
+     * @param position
+     *            an element position
      */
-    private void filterCandidateList(int position) {
+    private void filterCandidateList (int position) {
 
         Iterator<CandidateSpan> i = candidateList.iterator();
         CandidateSpan cs;
@@ -150,8 +169,9 @@
         // System.out.println("pos "+position+" " +candidateList.size());
     }
 
+
     @Override
-    protected boolean isSecondSpanValid() throws IOException {
+    protected boolean isSecondSpanValid () throws IOException {
         if (advanceElementTo(secondSpans)) {
             secondSpanPostion = elementPosition;
             filterCandidateList(secondSpanPostion);
@@ -161,8 +181,9 @@
         return false;
     }
 
+
     @Override
-    public long cost() {
+    public long cost () {
         CandidateSpan candidateSpan = candidateList.get(candidateListIndex);
         return elements.cost() + candidateSpan.getCost() + secondSpans.cost();
     }
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/ElementSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/ElementSpans.java
index 36b569d..21212c7 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/ElementSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/ElementSpans.java
@@ -21,7 +21,8 @@
 import de.ids_mannheim.korap.query.SpanElementQuery;
 
 /**
- * Enumeration of special spans which length is stored in their payload,
+ * Enumeration of special spans which length is stored in their
+ * payload,
  * representing elements such as phrases, sentences and paragraphs.
  * 
  * @author margaretha
@@ -39,23 +40,29 @@
     /**
      * Constructs ElementSpans for the given {@link SpanElementQuery}.
      * 
-     * @param spanElementQuery A {@link SpanElementQuery}.
-     * @param context The {@link AtomicReaderContext}.
-     * @param acceptDocs Bit vector representing the documents
-     *        to be searched in.
-     * @param termContexts A map managing {@link TermState TermStates}.
+     * @param spanElementQuery
+     *            A {@link SpanElementQuery}.
+     * @param context
+     *            The {@link AtomicReaderContext}.
+     * @param acceptDocs
+     *            Bit vector representing the documents
+     *            to be searched in.
+     * @param termContexts
+     *            A map managing {@link TermState TermStates}.
      * @throws IOException
      */
-    public ElementSpans(SpanElementQuery spanElementQuery,
-                        AtomicReaderContext context, Bits acceptDocs,
-                        Map<Term, TermContext> termContexts) throws IOException {
+    public ElementSpans (SpanElementQuery spanElementQuery,
+                         AtomicReaderContext context, Bits acceptDocs,
+                         Map<Term, TermContext> termContexts)
+            throws IOException {
         super(spanElementQuery, context, acceptDocs, termContexts);
         termSpans = (TermSpans) this.firstSpans;
         hasMoreSpans = true;
     };
 
+
     @Override
-    public boolean next() throws IOException {
+    public boolean next () throws IOException {
         isStartEnumeration = false;
 
         if (!hasMoreSpans || !(hasMoreSpans = termSpans.next()))
@@ -134,18 +141,19 @@
         return this.matchEndPosition;
     };
 
-  	@Override
-  	public Collection<byte[]> getPayload() {
+
+    @Override
+    public Collection<byte[]> getPayload () {
         this.processPayload();
-  		return this.matchPayload;
-  	};
+        return this.matchPayload;
+    };
 
 
-  	@Override
-  	public boolean isPayloadAvailable() {
+    @Override
+    public boolean isPayloadAvailable () {
         this.processPayload();
-  		return !this.matchPayload.isEmpty();
-  	};
+        return !this.matchPayload.isEmpty();
+    };
 
 
     @Override
@@ -156,14 +164,13 @@
 
 
     @Override
-    public boolean skipTo(int target) throws IOException {
+    public boolean skipTo (int target) throws IOException {
 
-        if (DEBUG) log.trace("Skip ElementSpans {} -> {}",
-                             firstSpans.doc(), target);
+        if (DEBUG)
+            log.trace("Skip ElementSpans {} -> {}", firstSpans.doc(), target);
 
-        if (hasMoreSpans &&
-            firstSpans.doc() < target &&
-            firstSpans.skipTo(target)) {
+        if (hasMoreSpans && firstSpans.doc() < target
+                && firstSpans.skipTo(target)) {
             return this.setToCurrent();
         };
 
@@ -172,8 +179,9 @@
         return false;
     };
 
+
     @Override
-    public long cost() {
+    public long cost () {
         return termSpans.cost();
     };
 };
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/ExpandedExclusionSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/ExpandedExclusionSpans.java
index d213425..19f7e7f 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/ExpandedExclusionSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/ExpandedExclusionSpans.java
@@ -15,18 +15,25 @@
 import de.ids_mannheim.korap.query.SpanExpansionQuery;
 
 /**
- * Enumeration of Spans expanded with minimum <code>m</code> and maximum
- * <code>n</code> tokens, and throughout all the expansions do <em>not</em>
+ * Enumeration of Spans expanded with minimum <code>m</code> and
+ * maximum
+ * <code>n</code> tokens, and throughout all the expansions do
+ * <em>not</em>
  * contain a specific Spans (notClause). See examples in
  * {@link SpanExpansionQuery}.
  * 
- * The expansion direction is designated with the sign of a number, namely a
- * negative number signifies the expansion to the <em>left</em> of the original
- * span, and a positive number (including 0) signifies the expansion to the
+ * The expansion direction is designated with the sign of a number,
+ * namely a
+ * negative number signifies the expansion to the <em>left</em> of the
+ * original
+ * span, and a positive number (including 0) signifies the expansion
+ * to the
  * <em>right</em> of the original span.
  * 
- * The expansion offsets, namely the start and end position of an expansion
- * part, can be stored in payloads. A class number is assigned to the offsets
+ * The expansion offsets, namely the start and end position of an
+ * expansion
+ * part, can be stored in payloads. A class number is assigned to the
+ * offsets
  * grouping them altogether.
  * 
  * @author margaretha
@@ -42,19 +49,23 @@
 
     private long matchCost;
 
+
     /**
      * Constructs ExpandedExclusionSpans from the given
      * {@link SpanExpansionQuery}.
      * 
-     * @param spanExpansionQuery a SpanExpansionQuery
+     * @param spanExpansionQuery
+     *            a SpanExpansionQuery
      * @param context
      * @param acceptDocs
      * @param termContexts
      * @throws IOException
      */
-    public ExpandedExclusionSpans(SpanExpansionQuery spanExpansionQuery,
-            AtomicReaderContext context, Bits acceptDocs,
-            Map<Term, TermContext> termContexts) throws IOException {
+    public ExpandedExclusionSpans (SpanExpansionQuery spanExpansionQuery,
+                                   AtomicReaderContext context,
+                                   Bits acceptDocs,
+                                   Map<Term, TermContext> termContexts)
+            throws IOException {
         super(spanExpansionQuery, context, acceptDocs, termContexts);
 
         if (spanExpansionQuery.getSecondClause() == null) {
@@ -82,21 +93,24 @@
         hasMoreSpans = firstSpans.next();
     }
 
+
     @Override
-    public boolean next() throws IOException {
+    public boolean next () throws IOException {
         matchPayload.clear();
         isStartEnumeration = false;
         return advance();
     }
 
+
     /**
      * Advances the ExpandedExclusionSpans to the next match.
      * 
-     * @return <code>true</code> if a match is found, <code>false</code>
+     * @return <code>true</code> if a match is found,
+     *         <code>false</code>
      *         otherwise.
      * @throws IOException
      */
-    private boolean advance() throws IOException {
+    private boolean advance () throws IOException {
         while (hasMoreSpans || candidateSpans.size() > 0) {
             if (candidateSpans.size() > 0) {
                 // set a candidate span as a match
@@ -108,22 +122,26 @@
                 matchCost = cs.getCost() + notClause.cost();
                 candidateSpans.remove(0);
                 return true;
-            } else if (!hasMoreNotClause || notClause.doc() > firstSpans.doc()) {
+            }
+            else if (!hasMoreNotClause || notClause.doc() > firstSpans.doc()) {
                 generateCandidates(min, max, direction);
                 hasMoreSpans = firstSpans.next();
-            } else
+            }
+            else
                 findMatches();
         }
         return false;
     }
 
+
     /**
-     * Finds matches by expanding the firstspans either to the left or to the
+     * Finds matches by expanding the firstspans either to the left or
+     * to the
      * right.
      * 
      * @throws IOException
      */
-    private void findMatches() throws IOException {
+    private void findMatches () throws IOException {
         while (hasMoreNotClause && notClause.doc() <= firstSpans.doc()) {
             if (notClause.doc() == firstSpans.doc()) {
                 if (direction < 0) { // left
@@ -133,17 +151,19 @@
                     expandRight();
                 }
                 break;
-            } else if (!notClause.next())
+            }
+            else if (!notClause.next())
                 hasMoreNotClause = false;
         }
     }
 
+
     /**
      * Expands the firstspans to the left.
      * 
      * @throws IOException
      */
-    private void expandLeft() throws IOException {
+    private void expandLeft () throws IOException {
         //int counter = max;
         int maxPos = max;
         CandidateSpan lastNotClause = null;
@@ -178,12 +198,13 @@
             hasMoreSpans = firstSpans.next();
     }
 
+
     /**
      * Expands the firstspans to the right.
      * 
      * @throws IOException
      */
-    private void expandRight() throws IOException {
+    private void expandRight () throws IOException {
         int expansionEnd = firstSpans.end() + max;
         int maxPos = max;
         boolean isFound = false;
@@ -213,20 +234,26 @@
                 maxPos = firstNotClause.getStart() - firstSpans.end() - 1;
                 generateCandidates(min, maxPos, direction);
             }
-        } else
+        }
+        else
             hasMoreSpans = firstSpans.next();
     }
 
+
     /**
-     * Creates new candidate matches for the given direction, minimum and
+     * Creates new candidate matches for the given direction, minimum
+     * and
      * maximum positions.
      * 
-     * @param minPos minimum position
-     * @param maxPos maximum position
-     * @param direction the expansion direction
+     * @param minPos
+     *            minimum position
+     * @param maxPos
+     *            maximum position
+     * @param direction
+     *            the expansion direction
      * @throws IOException
      */
-    private void generateCandidates(int minPos, int maxPos, int direction)
+    private void generateCandidates (int minPos, int maxPos, int direction)
             throws IOException {
         int counter;
         int start, end;
@@ -245,7 +272,8 @@
                 }
                 counter--;
             }
-        } else { // right
+        }
+        else { // right
             counter = minPos;
             while (counter <= maxPos) {
                 start = firstSpans.start();
@@ -261,17 +289,22 @@
         }
     }
 
+
     /**
-     * Creates payloads for a candiate match by copying the payloads of the
-     * firstspans, and adds expansion offsets with the given start and end
+     * Creates payloads for a candiate match by copying the payloads
+     * of the
+     * firstspans, and adds expansion offsets with the given start and
+     * end
      * positions to the payloads, if the class number is set.
      * 
-     * @param start the start offset
-     * @param end the end offset
+     * @param start
+     *            the start offset
+     * @param end
+     *            the end offset
      * @return payloads
      * @throws IOException
      */
-    private ArrayList<byte[]> createPayloads(int start, int end)
+    private ArrayList<byte[]> createPayloads (int start, int end)
             throws IOException {
 
         ArrayList<byte[]> payload = new ArrayList<byte[]>();
@@ -286,15 +319,19 @@
         return payload;
     }
 
+
     /**
-     * Generates a byte array of extension offsets and class number to be added
+     * Generates a byte array of extension offsets and class number to
+     * be added
      * into the payloads.
      * 
-     * @param start the start offset
-     * @param end the end offset
+     * @param start
+     *            the start offset
+     * @param end
+     *            the end offset
      * @return a byte array of extension offsets and class number
      */
-    private byte[] createExtensionPayloads(int start, int end) {
+    private byte[] createExtensionPayloads (int start, int end) {
         ByteBuffer buffer = ByteBuffer.allocate(9);
         buffer.putInt(start);
         buffer.putInt(end);
@@ -302,8 +339,9 @@
         return buffer.array();
     }
 
+
     @Override
-    public boolean skipTo(int target) throws IOException {
+    public boolean skipTo (int target) throws IOException {
         if (hasMoreSpans && (firstSpans.doc() < target)) {
             if (!firstSpans.skipTo(target)) {
                 hasMoreSpans = false;
@@ -314,8 +352,9 @@
         return advance();
     }
 
+
     @Override
-    public long cost() {
+    public long cost () {
         return matchCost;
     }
 }
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/ExpandedSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/ExpandedSpans.java
index da70fd9..b378d43 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/ExpandedSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/ExpandedSpans.java
@@ -14,12 +14,16 @@
 import de.ids_mannheim.korap.query.SpanExpansionQuery;
 
 /**
- * Enumeration of spans expanded with minimum <code>m</code> and maximum
- * <code>n</code> token positions to either left or right direction from the
+ * Enumeration of spans expanded with minimum <code>m</code> and
+ * maximum
+ * <code>n</code> token positions to either left or right direction
+ * from the
  * original spans. See examples in {@link SpanExpansionQuery}.
  * 
- * The expansion offsets, namely the start and end position of an expansion
- * part, can be stored in payloads. A class number is assigned to the offsets
+ * The expansion offsets, namely the start and end position of an
+ * expansion
+ * part, can be stored in payloads. A class number is assigned to the
+ * offsets
  * grouping them altogether.
  * 
  * @author margaretha
@@ -32,18 +36,22 @@
     private List<CandidateSpan> candidateSpans;
     private long matchCost;
 
+
     /**
-     * Constructs ExpandedSpans from the given {@link SpanExpansionQuery}.
+     * Constructs ExpandedSpans from the given
+     * {@link SpanExpansionQuery}.
      * 
-     * @param spanExpansionQuery a SpanExpansionQuery
+     * @param spanExpansionQuery
+     *            a SpanExpansionQuery
      * @param context
      * @param acceptDocs
      * @param termContexts
      * @throws IOException
      */
-    public ExpandedSpans(SpanExpansionQuery spanExpansionQuery,
-            AtomicReaderContext context, Bits acceptDocs,
-            Map<Term, TermContext> termContexts) throws IOException {
+    public ExpandedSpans (SpanExpansionQuery spanExpansionQuery,
+                          AtomicReaderContext context, Bits acceptDocs,
+                          Map<Term, TermContext> termContexts)
+            throws IOException {
         super(spanExpansionQuery, context, acceptDocs, termContexts);
         this.min = spanExpansionQuery.getMin();
         this.max = spanExpansionQuery.getMax();
@@ -54,8 +62,9 @@
         hasMoreSpans = true;
     }
 
+
     @Override
-    public boolean next() throws IOException {
+    public boolean next () throws IOException {
         matchPayload.clear();
         isStartEnumeration = false;
         if (candidateSpans.size() == 0 && hasMoreSpans)
@@ -63,35 +72,43 @@
         return advance();
     }
 
+
     /**
-     * Advances the ExpandedSpans to the next match by setting the first element
-     * in the candidateList as the match. Set the candidateList, if it is empty
+     * Advances the ExpandedSpans to the next match by setting the
+     * first element
+     * in the candidateList as the match. Set the candidateList, if it
+     * is empty
      * 
-     * @return <code>true</code> if a match is found, <code>false</code>
+     * @return <code>true</code> if a match is found,
+     *         <code>false</code>
      *         otherwise.
      * @throws IOException
      */
-    private boolean advance() throws IOException {
+    private boolean advance () throws IOException {
         while (candidateSpans.size() > 0 || hasMoreSpans) {
             if (candidateSpans.size() > 0) {
                 setMatch(candidateSpans.get(0));
                 candidateSpans.remove(0);
                 return true;
-            } else {
+            }
+            else {
                 setCandidateList();
             }
         }
         return false;
     }
 
+
     /**
-     * Sets the candidateList by adding new candidate match spans for all
-     * possible expansion with respect to the expansion length (min,max)
+     * Sets the candidateList by adding new candidate match spans for
+     * all
+     * possible expansion with respect to the expansion length
+     * (min,max)
      * variables.
      * 
      * @throws IOException
      */
-    private void setCandidateList() throws IOException {
+    private void setCandidateList () throws IOException {
         CandidateSpan cs;
         int counter, start, end;
 
@@ -106,7 +123,8 @@
                 candidateSpans.add(cs);
                 counter--;
             }
-        } else {
+        }
+        else {
             counter = min;
             while (counter <= max) {
                 // TODO: How do I know if the end is already too far (over the end of the doc)? 
@@ -120,9 +138,12 @@
         }
     }
 
+
     /**
-     * Prepares the payloads for a candidate match (ExpandedSpans). If the class
-     * number is set, the extension offsets with the given start and end
+     * Prepares the payloads for a candidate match (ExpandedSpans). If
+     * the class
+     * number is set, the extension offsets with the given start and
+     * end
      * positions are to be stored in the payloads.
      * 
      * @param start
@@ -130,7 +151,7 @@
      * @return the payloads for a candidaete match
      * @throws IOException
      */
-    private ArrayList<byte[]> createPayloads(int start, int end)
+    private ArrayList<byte[]> createPayloads (int start, int end)
             throws IOException {
 
         ArrayList<byte[]> payload = new ArrayList<byte[]>();
@@ -144,15 +165,17 @@
         return payload;
     }
 
+
     /**
-     * Prepares a byte array of extension offsets with the given start and end
+     * Prepares a byte array of extension offsets with the given start
+     * and end
      * positions and the class number, to be stored in payloads.
      * 
      * @param start
      * @param end
      * @return a byte array of extension offsets and the class number
      */
-    private byte[] createExtensionPayloads(int start, int end) {
+    private byte[] createExtensionPayloads (int start, int end) {
         ByteBuffer buffer = ByteBuffer.allocate(9);
         buffer.putInt(start);
         buffer.putInt(end);
@@ -160,13 +183,15 @@
         return buffer.array();
     }
 
+
     /**
-     * Sets the properties of the given candidate match span as the current
+     * Sets the properties of the given candidate match span as the
+     * current
      * match (state of ExpandedSpans).
      * 
      * @param candidateSpan
      */
-    private void setMatch(CandidateSpan candidateSpan) {
+    private void setMatch (CandidateSpan candidateSpan) {
         matchDocNumber = candidateSpan.getDoc();
         matchStartPosition = candidateSpan.getStart();
         matchEndPosition = candidateSpan.getEnd();
@@ -174,8 +199,9 @@
         matchCost = candidateSpan.getCost();
     }
 
+
     @Override
-    public boolean skipTo(int target) throws IOException {
+    public boolean skipTo (int target) throws IOException {
         if (hasMoreSpans && (firstSpans.doc() < target)) {
             if (!firstSpans.skipTo(target)) {
                 hasMoreSpans = false;
@@ -186,8 +212,9 @@
         return advance();
     }
 
+
     @Override
-    public long cost() {
+    public long cost () {
         return matchCost;
     }
 
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/FocusSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/FocusSpans.java
index f2aa2c8..eabb8c0 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/FocusSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/FocusSpans.java
@@ -22,19 +22,22 @@
 
 /**
  * Spans, that can focus on the span boundaries of classed subqueries.
- * The boundaries of the classed subquery may exceed the boundaries of the
+ * The boundaries of the classed subquery may exceed the boundaries of
+ * the
  * nested query.
- *
- * In case multiple classes are found with the very same number, the span
- * is maximized to start on the first occurrence from the left and end on
+ * 
+ * In case multiple classes are found with the very same number, the
+ * span
+ * is maximized to start on the first occurrence from the left and end
+ * on
  * the last occurrence on the right.
- *
+ * 
  * In case the class to focus on is not found in the payloads,
  * the match is ignored.
- *
+ * 
  * <strong>Warning</strong>: Payloads other than class payloads won't
  * bubble up currently. That behaviour may change in the future
- *
+ * 
  * @author diewald
  */
 
@@ -50,36 +53,38 @@
     // This advices the java compiler to ignore all loggings
     public static final boolean DEBUG = false;
 
-    private int start = -1,
-                end;
-    private int tempStart = 0,
-                tempEnd = 0;
+    private int start = -1, end;
+    private int tempStart = 0, tempEnd = 0;
+
 
     /**
      * Construct a FocusSpan for the given {@link SpanQuery}.
      * 
-     * @param wrapQuery A {@link SpanQuery}.
-     * @param context The {@link AtomicReaderContext}.
-     * @param acceptDocs Bit vector representing the documents
-     *        to be searched in.
-     * @param termContexts A map managing {@link TermState TermStates}.
-     * @param number The class number to focus on.
+     * @param wrapQuery
+     *            A {@link SpanQuery}.
+     * @param context
+     *            The {@link AtomicReaderContext}.
+     * @param acceptDocs
+     *            Bit vector representing the documents
+     *            to be searched in.
+     * @param termContexts
+     *            A map managing {@link TermState TermStates}.
+     * @param number
+     *            The class number to focus on.
      * @throws IOException
      */
-    public FocusSpans (SpanQuery wrapQuery,
-                                  AtomicReaderContext context,
-                                  Bits acceptDocs,
-                                  Map<Term,TermContext> termContexts,
-                                  byte number) throws IOException {
-        this.spans     = wrapQuery.getSpans(context, acceptDocs, termContexts);
-        this.number    = number;
+    public FocusSpans (SpanQuery wrapQuery, AtomicReaderContext context,
+                       Bits acceptDocs, Map<Term, TermContext> termContexts,
+                       byte number) throws IOException {
+        this.spans = wrapQuery.getSpans(context, acceptDocs, termContexts);
+        this.number = number;
         this.wrapQuery = wrapQuery;
         this.wrappedPayload = new ArrayList<byte[]>(6);
     };
 
 
     @Override
-    public Collection<byte[]> getPayload() throws IOException {
+    public Collection<byte[]> getPayload () throws IOException {
         return wrappedPayload;
     };
 
@@ -109,13 +114,14 @@
 
 
     @Override
-    public boolean next() throws IOException {
-        if (DEBUG) log.trace("Forward next match in {}",
-                             this.doc());
+    public boolean next () throws IOException {
+        if (DEBUG)
+            log.trace("Forward next match in {}", this.doc());
 
         // Next span
         while (spans.next()) {
-            if (DEBUG) log.trace("Forward next inner span");
+            if (DEBUG)
+                log.trace("Forward next inner span");
 
             // No classes stored
             wrappedPayload.clear();
@@ -130,7 +136,8 @@
                     // No class payload - ignore
                     // this may be problematic for other calculated payloads!
                     if (payload.length != 9) {
-                        if (DEBUG) log.trace("Ignore old payload {}", payload);
+                        if (DEBUG)
+                            log.trace("Ignore old payload {}", payload);
                         continue;
                     };
 
@@ -138,20 +145,17 @@
                     // and classes are matches!
                     if (payload[8] == this.number) {
                         tempStart = byte2int(payload, 0);
-                        tempEnd   = byte2int(payload, 4);
+                        tempEnd = byte2int(payload, 4);
 
                         if (DEBUG) {
-                            log.trace(
-                                "Found matching class {}-{}",
-                                tempStart,
-                                tempEnd
-                            );
+                            log.trace("Found matching class {}-{}", tempStart,
+                                    tempEnd);
                         };
 
                         // Set start position 
                         if (start == -1 || tempStart < start)
                             start = tempStart;
-			
+
                         // Set end position
                         if (tempEnd > end)
                             end = tempEnd;
@@ -168,12 +172,8 @@
                 continue;
 
             if (DEBUG) {
-                log.trace(
-                    "Start to focus on class {} from {} to {}",
-                    number,
-                    start,
-                    end
-                );
+                log.trace("Start to focus on class {} from {} to {}", number,
+                        start, end);
             };
             return true;
         };
@@ -187,11 +187,11 @@
     // Todo: Check for this on document boundaries!
     @Override
     public boolean skipTo (int target) throws IOException {
-        if (DEBUG) log.trace("Skip MatchSpans {} -> {}",
-                             this.doc(), target);
+        if (DEBUG)
+            log.trace("Skip MatchSpans {} -> {}", this.doc(), target);
 
         if (this.doc() < target && spans.skipTo(target)) {
-            
+
         };
         return false;
     };
@@ -199,10 +199,11 @@
 
     @Override
     public String toString () {
-        return getClass().getName() + "(" + this.wrapQuery.toString() + ")@" +
-            (doc() + ":" + start() + "-" + end());
+        return getClass().getName() + "(" + this.wrapQuery.toString() + ")@"
+                + (doc() + ":" + start() + "-" + end());
     };
 
+
     @Override
     public long cost () {
         return spans.cost();
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/MultipleDistanceSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/MultipleDistanceSpans.java
index f972fb2..63d355f 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/MultipleDistanceSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/MultipleDistanceSpans.java
@@ -12,17 +12,21 @@
 import de.ids_mannheim.korap.query.SpanMultipleDistanceQuery;
 
 /**
- * Span enumeration of matches whose two sub-spans have exactly the same first
- * and second sub-sub-spans. To obtain these matches, the span matches of the
+ * Span enumeration of matches whose two sub-spans have exactly the
+ * same first
+ * and second sub-sub-spans. To obtain these matches, the span matches
+ * of the
  * child spans are filtered.
  * 
- * MultipleDistanceSpans accommodates distance constraint with exclusion. <br />
+ * MultipleDistanceSpans accommodates distance constraint with
+ * exclusion. <br />
  * <br />
  * 
  * This class deals with the following cases:
  * <ol>
  * <li>return the match from another non-exclusion constraint.</li>
- * <li>return only the first-span when all constraints are exclusions.</li>
+ * <li>return only the first-span when all constraints are
+ * exclusions.</li>
  * <li>spans are not in the same doc</li>
  * </ol>
  * 
@@ -33,26 +37,34 @@
     private DistanceSpans x, y;
     private boolean isOrdered;
 
+
     /**
-     * Constructs MultipleDistanceSpans for the two given Spans with the given
-     * {@link SpanMultipleDistanceQuery}.
+     * Constructs MultipleDistanceSpans for the two given Spans with
+     * the given {@link SpanMultipleDistanceQuery}.
      * 
-     * @param query a SpanMultipleDistanceQuery
+     * @param query
+     *            a SpanMultipleDistanceQuery
      * @param context
      * @param acceptDocs
      * @param termContexts
-     * @param firstSpans the firstspans
-     * @param secondSpans the secondspans
-     * @param isOrdered <code>true</code> if the spans must occur in order,
-     *        <code>false</code> otherwise.
-     * @param exclusion <code>true</code> if the secondspans must <em>not</em>
-     *        occur together with the firstspans.
+     * @param firstSpans
+     *            the firstspans
+     * @param secondSpans
+     *            the secondspans
+     * @param isOrdered
+     *            <code>true</code> if the spans must occur in order,
+     *            <code>false</code> otherwise.
+     * @param exclusion
+     *            <code>true</code> if the secondspans must
+     *            <em>not</em>
+     *            occur together with the firstspans.
      * @throws IOException
      */
-    public MultipleDistanceSpans(SpanMultipleDistanceQuery query,
-            AtomicReaderContext context, Bits acceptDocs,
-            Map<Term, TermContext> termContexts, Spans firstSpans,
-            Spans secondSpans, boolean isOrdered, boolean exclusion)
+    public MultipleDistanceSpans (SpanMultipleDistanceQuery query,
+                                  AtomicReaderContext context, Bits acceptDocs,
+                                  Map<Term, TermContext> termContexts,
+                                  Spans firstSpans, Spans secondSpans,
+                                  boolean isOrdered, boolean exclusion)
             throws IOException {
         super(query, context, acceptDocs, termContexts);
         this.isOrdered = isOrdered;
@@ -62,17 +74,19 @@
         hasMoreSpans = x.next() && y.next();
     }
 
+
     @Override
-    public boolean next() throws IOException {
+    public boolean next () throws IOException {
         isStartEnumeration = false;
         matchPayload.clear();
         return advance();
     }
 
+
     /**
      * Finds the next match.
      * */
-    protected boolean advance() throws IOException {
+    protected boolean advance () throws IOException {
         while (hasMoreSpans && ensureSameDoc(x, y)) {
             if (findMatch()) {
                 moveForward();
@@ -83,12 +97,13 @@
         return false;
     }
 
+
     /**
      * Finds the next match of one of the sub/child-span.
      * 
      * @throws IOException
      */
-    private void moveForward() throws IOException {
+    private void moveForward () throws IOException {
         if (isOrdered) {
             if (x.end() < y.end()
                     || (x.end() == y.end() && x.start() < y.start()))
@@ -107,14 +122,16 @@
         }
     }
 
+
     /**
-     * Checks if the sub-spans of x and y having exactly the same position. This
+     * Checks if the sub-spans of x and y having exactly the same
+     * position. This
      * is basically an AND operation.
      * 
      * @return true iff the sub-spans are identical.
      * @throws IOException
      */
-    protected boolean findMatch() throws IOException {
+    protected boolean findMatch () throws IOException {
 
         CandidateSpan xf = x.getMatchFirstSpan();
         CandidateSpan xs = x.getMatchSecondSpan();
@@ -140,7 +157,8 @@
                 }
                 return true;
             }
-        } else if (xf.getStart() == yf.getStart() && xf.getEnd() == yf.getEnd()
+        }
+        else if (xf.getStart() == yf.getStart() && xf.getEnd() == yf.getEnd()
                 && xs.getStart() == ys.getStart() && xs.getEnd() == ys.getEnd()) {
             setMatchProperties(x, false);
             return true;
@@ -148,14 +166,19 @@
         return false;
     }
 
+
     /**
-     * Sets the properties of the given span as the current match properties.
+     * Sets the properties of the given span as the current match
+     * properties.
      * 
-     * @param span a DistanceSpan
-     * @param exclusion <code>true</code> if the spans must <em>not</em> occur
-     *        together, <code>false</code> otherwise.
+     * @param span
+     *            a DistanceSpan
+     * @param exclusion
+     *            <code>true</code> if the spans must <em>not</em>
+     *            occur
+     *            together, <code>false</code> otherwise.
      */
-    private void setMatchProperties(DistanceSpans span, boolean exclusion) {
+    private void setMatchProperties (DistanceSpans span, boolean exclusion) {
         matchStartPosition = span.start();
         matchEndPosition = span.end();
         matchDocNumber = span.doc();
@@ -166,8 +189,9 @@
             setMatchSecondSpan(span.getMatchSecondSpan());
     }
 
+
     @Override
-    public boolean skipTo(int target) throws IOException {
+    public boolean skipTo (int target) throws IOException {
         if (hasMoreSpans && (y.doc() < target)) {
             if (!y.skipTo(target)) {
                 return false;
@@ -178,8 +202,9 @@
         return advance();
     }
 
+
     @Override
-    public long cost() {
+    public long cost () {
         return x.cost() + y.cost();
     }
 
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/NextSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/NextSpans.java
index cfd7694..9c8fa28 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/NextSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/NextSpans.java
@@ -16,10 +16,12 @@
 import de.ids_mannheim.korap.query.SpanNextQuery;
 
 /**
- * NextSpans is an enumeration of Span matches, which ensures that a span is
+ * NextSpans is an enumeration of Span matches, which ensures that a
+ * span is
  * immediately followed by another span.
  * 
- * The implementation allows multiple matches at the same firstspan position.
+ * The implementation allows multiple matches at the same firstspan
+ * position.
  * 
  * @author margaretha
  * @author diewald
@@ -33,17 +35,19 @@
 
     private Logger log = LoggerFactory.getLogger(NextSpans.class);
 
+
     /**
      * Constructs NextSpans for the given {@link SpanNextQuery}.
      * 
-     * @param spanNextQuery a SpanNextQuery
+     * @param spanNextQuery
+     *            a SpanNextQuery
      * @param context
      * @param acceptDocs
      * @param termContexts
      * @throws IOException
      */
-    public NextSpans(SpanNextQuery spanNextQuery, AtomicReaderContext context,
-            Bits acceptDocs, Map<Term, TermContext> termContexts)
+    public NextSpans (SpanNextQuery spanNextQuery, AtomicReaderContext context,
+                      Bits acceptDocs, Map<Term, TermContext> termContexts)
             throws IOException {
         super(spanNextQuery, context, acceptDocs, termContexts);
         collectPayloads = spanNextQuery.isCollectPayloads();
@@ -52,22 +56,26 @@
         candidateList = new ArrayList<>();
     }
 
+
     @Override
-    public boolean next() throws IOException {
+    public boolean next () throws IOException {
         isStartEnumeration = false;
         matchPayload.clear();
         return advance();
     }
 
+
     /**
-     * Advances the NextSpans to the next match by checking the matchList or
+     * Advances the NextSpans to the next match by checking the
+     * matchList or
      * setting the matchlist first, if it is empty.
      * 
-     * @return <code>true</code> if a match is found, <code>false</code>
+     * @return <code>true</code> if a match is found,
+     *         <code>false</code>
      *         otherwise.
      * @throws IOException
      */
-    private boolean advance() throws IOException {
+    private boolean advance () throws IOException {
 
         while (hasMoreSpans || !matchList.isEmpty() || !candidateList.isEmpty()) {
             if (!matchList.isEmpty()) {
@@ -91,17 +99,20 @@
         return false;
     }
 
+
     /**
-     * Sets the matchlist by first searching the candidates and then find all
+     * Sets the matchlist by first searching the candidates and then
+     * find all
      * the matches.
      * 
      * @throws IOException
      */
-    private void setMatchList() throws IOException {
+    private void setMatchList () throws IOException {
         if (firstSpans.doc() == candidateListDocNum) {
             searchCandidates();
             searchMatches();
-        } else {
+        }
+        else {
             candidateList.clear();
             if (hasMoreSpans && ensureSameDoc(firstSpans, secondSpans)) {
                 candidateListDocNum = firstSpans.doc();
@@ -110,35 +121,43 @@
         }
     }
 
+
     /**
-     * Removes all second span candidates whose start position is not the same
-     * as the firstspan's end position, otherwise creates a match and add it to
+     * Removes all second span candidates whose start position is not
+     * the same
+     * as the firstspan's end position, otherwise creates a match and
+     * add it to
      * the matchlist.
      * 
      * @throws IOException
      */
-    private void searchCandidates() throws IOException {
+    private void searchCandidates () throws IOException {
         Iterator<CandidateSpan> i = candidateList.iterator();
         CandidateSpan cs;
         while (i.hasNext()) {
             cs = i.next();
             if (cs.getStart() == firstSpans.end()) {
                 addMatch(cs);
-            } else {
+            }
+            else {
                 i.remove();
             }
         }
     }
 
+
     /**
-     * Finds all secondspans whose start position is the same as the end
-     * position of the firstspans, until the secondspans' start position is
-     * bigger than the firstspans' end position. Adds those secondspans to the
+     * Finds all secondspans whose start position is the same as the
+     * end
+     * position of the firstspans, until the secondspans' start
+     * position is
+     * bigger than the firstspans' end position. Adds those
+     * secondspans to the
      * candidateList and creates matches.
      * 
      * @throws IOException
      */
-    private void searchMatches() throws IOException {
+    private void searchMatches () throws IOException {
 
         while (hasMoreSpans && candidateListDocNum == secondSpans.doc()) {
             if (secondSpans.start() > firstSpans.end()) {
@@ -152,15 +171,19 @@
         }
     }
 
+
     /**
-     * Creates a match from the given CandidateSpan representing a secondspan
-     * state whose start position is identical to the end position of the
+     * Creates a match from the given CandidateSpan representing a
+     * secondspan
+     * state whose start position is identical to the end position of
+     * the
      * current firstspan, and adds it to the matchlist.
      * 
-     * @param cs a CandidateSpan
+     * @param cs
+     *            a CandidateSpan
      * @throws IOException
      */
-    private void addMatch(CandidateSpan cs) throws IOException {
+    private void addMatch (CandidateSpan cs) throws IOException {
 
         int start = firstSpans.start();
         long cost = firstSpans.cost() + cs.getCost();
@@ -177,8 +200,9 @@
                 candidateListDocNum, cost, payloads));
     }
 
+
     @Override
-    public boolean skipTo(int target) throws IOException {
+    public boolean skipTo (int target) throws IOException {
         if (hasMoreSpans && (firstSpans.doc() < target)) {
             if (!firstSpans.skipTo(target)) {
                 hasMoreSpans = false;
@@ -189,8 +213,9 @@
         return advance();
     }
 
+
     @Override
-    public long cost() {
+    public long cost () {
         return firstSpans.cost() + secondSpans.cost();
     }
 };
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/NonPartialOverlappingSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/NonPartialOverlappingSpans.java
index 8e56ca7..d7f41da 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/NonPartialOverlappingSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/NonPartialOverlappingSpans.java
@@ -14,7 +14,8 @@
 import de.ids_mannheim.korap.query.SimpleSpanQuery;
 
 /**
- * An abstract class for Span enumeration whose two child spans are matched by
+ * An abstract class for Span enumeration whose two child spans are
+ * matched by
  * their positions and do not have a partial overlap.
  * 
  * @author margaretha
@@ -24,19 +25,23 @@
     private Logger log = LoggerFactory
             .getLogger(NonPartialOverlappingSpans.class);
 
+
     /**
      * Constructs NonPartialOverlappingSpans from the given
      * {@link SimpleSpanQuery}.
      * 
-     * @param simpleSpanQuery a SimpleSpanQuery
+     * @param simpleSpanQuery
+     *            a SimpleSpanQuery
      * @param context
      * @param acceptDocs
      * @param termContexts
      * @throws IOException
      */
-    public NonPartialOverlappingSpans(SimpleSpanQuery simpleSpanQuery,
-            AtomicReaderContext context, Bits acceptDocs,
-            Map<Term, TermContext> termContexts) throws IOException {
+    public NonPartialOverlappingSpans (SimpleSpanQuery simpleSpanQuery,
+                                       AtomicReaderContext context,
+                                       Bits acceptDocs,
+                                       Map<Term, TermContext> termContexts)
+            throws IOException {
         super(simpleSpanQuery, context, acceptDocs, termContexts);
 
         // Warning: not implemented, results in errors for SpanNextQuery 
@@ -46,8 +51,9 @@
 
     }
 
+
     @Override
-    public boolean next() throws IOException {
+    public boolean next () throws IOException {
         // Warning: this does not work for overlapping spans 
         // e.g. get multiple second spans in a firstspan
         hasMoreSpans &= firstSpans.next();
@@ -56,14 +62,16 @@
         return advance();
     }
 
+
     /**
      * Advances to the next match.
      * 
-     * @return <code>true</code> if a match is found, <code>false</code>
+     * @return <code>true</code> if a match is found,
+     *         <code>false</code>
      *         otherwise.
      * @throws IOException
      */
-    protected boolean advance() throws IOException {
+    protected boolean advance () throws IOException {
         // The complexity is linear for searching in a document. 
         // It's better if we can skip to >= position in a document.
         while (hasMoreSpans && ensureSameDoc(firstSpans, secondSpans)) {
@@ -71,29 +79,35 @@
             if (matchCase == 0) {
                 doCollectPayloads();
                 return true;
-            } else if (matchCase == 1) {
+            }
+            else if (matchCase == 1) {
                 hasMoreSpans = secondSpans.next();
-            } else {
+            }
+            else {
                 hasMoreSpans = firstSpans.next();
             }
         }
         return false;
     }
 
+
     /**
      * Specifies the condition for a match.
      * 
-     * @return 0 iff match is found, -1 to advance the firstspan, 1 to advance
+     * @return 0 iff match is found, -1 to advance the firstspan, 1 to
+     *         advance
      *         the secondspan
      * */
-    protected abstract int findMatch();
+    protected abstract int findMatch ();
+
 
     /**
-     * Collects available payloads from the current first and second spans.
+     * Collects available payloads from the current first and second
+     * spans.
      * 
      * @throws IOException
      */
-    private void doCollectPayloads() throws IOException {
+    private void doCollectPayloads () throws IOException {
         Collection<byte[]> payload;
         if (collectPayloads) {
             if (firstSpans.isPayloadAvailable()) {
@@ -107,8 +121,9 @@
         }
     }
 
+
     @Override
-    public boolean skipTo(int target) throws IOException {
+    public boolean skipTo (int target) throws IOException {
         if (hasMoreSpans && (firstSpans.doc() < target)) {
             if (!firstSpans.skipTo(target)) {
                 hasMoreSpans = false;
@@ -119,8 +134,9 @@
         return advance();
     }
 
+
     @Override
-    public long cost() {
+    public long cost () {
         return firstSpans.cost() + secondSpans.cost();
     }
 }
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/OrderedDistanceSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/OrderedDistanceSpans.java
index 761fa95..88d5bc3 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/OrderedDistanceSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/OrderedDistanceSpans.java
@@ -26,18 +26,22 @@
     protected int candidateListIndex;
     protected int candidateListDocNum;
 
+
     /**
-     * Constructs OrderedDistanceSpans based on the given SpanDistanceQuery.
+     * Constructs OrderedDistanceSpans based on the given
+     * SpanDistanceQuery.
      * 
-     * @param query a SpanDistanceQuery
+     * @param query
+     *            a SpanDistanceQuery
      * @param context
      * @param acceptDocs
      * @param termContexts
      * @throws IOException
      */
-    public OrderedDistanceSpans(SpanDistanceQuery query,
-            AtomicReaderContext context, Bits acceptDocs,
-            Map<Term, TermContext> termContexts) throws IOException {
+    public OrderedDistanceSpans (SpanDistanceQuery query,
+                                 AtomicReaderContext context, Bits acceptDocs,
+                                 Map<Term, TermContext> termContexts)
+            throws IOException {
         super(query, context, acceptDocs, termContexts);
 
         minDistance = query.getMinDistance();
@@ -50,11 +54,12 @@
         candidateListDocNum = firstSpans.doc();
     }
 
+
     /**
      * Finds a span match in the candidate list.
      * */
     @Override
-    protected boolean advance() throws IOException {
+    protected boolean advance () throws IOException {
         while (hasMoreSpans && candidateListIndex < candidateList.size()) {
             // Check candidates
             for (candidateListIndex++; candidateListIndex < candidateList
@@ -66,53 +71,70 @@
             do { // Forward secondspan
                 hasMoreSpans = secondSpans.next();
                 setCandidateList();
-            } while (hasMoreSpans && !isSecondSpanValid());
+            }
+            while (hasMoreSpans && !isSecondSpanValid());
         }
         return false;
     }
 
+
     /**
-     * Determines if the current second span is valid (i.e. within an element).
-     * It is always valid in TokenDistanceSpan, but it can be invalid in the
-     * ElementDistanceSpan, namely when it is not within a particular element (a
+     * Determines if the current second span is valid (i.e. within an
+     * element).
+     * It is always valid in TokenDistanceSpan, but it can be invalid
+     * in the
+     * ElementDistanceSpan, namely when it is not within a particular
+     * element (a
      * sentence or a paragraph depends on the element distance unit).
      * 
      * @return <code>true</code> of the current second span is valid,
      *         <code>false</code> otherwise.
      * @throws IOException
      */
-    protected abstract boolean isSecondSpanValid() throws IOException;
+    protected abstract boolean isSecondSpanValid () throws IOException;
+
 
     /**
-     * Stores/collects the states of all possible firstspans as candidate spans
-     * for the current secondspan. The candidate spans must be within the
+     * Stores/collects the states of all possible firstspans as
+     * candidate spans
+     * for the current secondspan. The candidate spans must be within
+     * the
      * maximum distance from the current secondspan.
      * 
      * @throws IOException
      */
-    protected abstract void setCandidateList() throws IOException;
+    protected abstract void setCandidateList () throws IOException;
+
 
     /**
-     * Defines the conditions for a match and tells if a match is found.
+     * Defines the conditions for a match and tells if a match is
+     * found.
      * 
-     * @return <code>true</code> if a match is found, <code>false</code>
+     * @return <code>true</code> if a match is found,
+     *         <code>false</code>
      *         otherwise.
      * @throws IOException
      */
-    protected abstract boolean findMatch() throws IOException;
+    protected abstract boolean findMatch () throws IOException;
+
 
     /**
-     * Defines the properties of a span match. The distance between the first
-     * and the second spans is zero, when there is an intersection between them
-     * in {@link TokenDistanceSpans}, or they occur in the same element in
-     * {@link ElementDistanceSpans}.
+     * Defines the properties of a span match. The distance between
+     * the first
+     * and the second spans is zero, when there is an intersection
+     * between them
+     * in {@link TokenDistanceSpans}, or they occur in the same
+     * element in {@link ElementDistanceSpans}.
      * 
-     * @param candidateSpan a match span
-     * @param isDistanceZero <code>true</code> if the distance between the first
-     *        and the second spans is zero, <code>false</code> otherwise.
+     * @param candidateSpan
+     *            a match span
+     * @param isDistanceZero
+     *            <code>true</code> if the distance between the first
+     *            and the second spans is zero, <code>false</code>
+     *            otherwise.
      * @throws IOException
      */
-    protected void setMatchProperties(CandidateSpan candidateSpan,
+    protected void setMatchProperties (CandidateSpan candidateSpan,
             boolean isDistanceZero) throws IOException {
 
         setMatchFirstSpan(candidateSpan);
@@ -123,7 +145,8 @@
                     secondSpans.start());
             matchEndPosition = Math.max(candidateSpan.getEnd(),
                     secondSpans.end());
-        } else {
+        }
+        else {
             matchStartPosition = candidateSpan.getStart();
             matchEndPosition = secondSpans.end();
         }
@@ -139,8 +162,9 @@
         }
     }
 
+
     @Override
-    public boolean skipTo(int target) throws IOException {
+    public boolean skipTo (int target) throws IOException {
         if (hasMoreSpans && (secondSpans.doc() < target)) {
             if (!secondSpans.skipTo(target)) {
                 candidateList.clear();
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/RelationBaseSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/RelationBaseSpans.java
index 7897308..8f97f35 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/RelationBaseSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/RelationBaseSpans.java
@@ -13,9 +13,12 @@
 import de.ids_mannheim.korap.query.SpanWithIdQuery;
 
 /**
- * RelationBaseSpans is a base class for relation spans containing properties
- * about the start and end positions of right side of the relation. It can also
- * store information about the id of the left/right side, for instance, when it
+ * RelationBaseSpans is a base class for relation spans containing
+ * properties
+ * about the start and end positions of right side of the relation. It
+ * can also
+ * store information about the id of the left/right side, for
+ * instance, when it
  * is an element or another relation.
  * 
  * @author margaretha
@@ -23,114 +26,139 @@
  */
 public abstract class RelationBaseSpans extends SpansWithId {
 
-	protected short leftId, rightId;
-	protected int leftStart, leftEnd;
-	protected int rightStart, rightEnd;
+    protected short leftId, rightId;
+    protected int leftStart, leftEnd;
+    protected int rightStart, rightEnd;
 
-    public RelationBaseSpans(){};
+
+    public RelationBaseSpans () {};
+
 
     /**
-     * Constructs RelationBaseSpans based on the given SpanWithIdQuery.
+     * Constructs RelationBaseSpans based on the given
+     * SpanWithIdQuery.
      * 
-     * @param spanWithIdQuery a SpanWithIdQuery, for instance a
-     *        {@link SpanElementQuery} or {@link SpanRelationQuery}.
+     * @param spanWithIdQuery
+     *            a SpanWithIdQuery, for instance a
+     *            {@link SpanElementQuery} or
+     *            {@link SpanRelationQuery}.
      * @param context
      * @param acceptDocs
      * @param termContexts
      * @throws IOException
      */
-    public RelationBaseSpans(SpanWithIdQuery spanWithIdQuery,
-            AtomicReaderContext context, Bits acceptDocs,
-            Map<Term, TermContext> termContexts) throws IOException {
+    public RelationBaseSpans (SpanWithIdQuery spanWithIdQuery,
+                              AtomicReaderContext context, Bits acceptDocs,
+                              Map<Term, TermContext> termContexts)
+            throws IOException {
         super(spanWithIdQuery, context, acceptDocs, termContexts);
     }
 
+
     /**
      * Returns the id of the left hand side of the relation.
      * 
      * @return an id
      */
-    public short getLeftId() {
+    public short getLeftId () {
         return leftId;
     }
 
+
     /**
      * Sets the id of the left hand side of the relation.
      * 
-     * @param leftId the id of the left hand side of the relation.
+     * @param leftId
+     *            the id of the left hand side of the relation.
      */
-    public void setLeftId(short leftId) {
+    public void setLeftId (short leftId) {
         this.leftId = leftId;
     }
 
-	public int getLeftStart() {
-		return leftStart;
-	}
 
-	public void setLeftStart(int leftStart) {
-		this.leftStart = leftStart;
-	}
+    public int getLeftStart () {
+        return leftStart;
+    }
 
-	public int getLeftEnd() {
-		return leftEnd;
-	}
 
-	public void setLeftEnd(int leftEnd) {
-		this.leftEnd = leftEnd;
-	}
+    public void setLeftStart (int leftStart) {
+        this.leftStart = leftStart;
+    }
 
-	/**
-	 * Returns the id of the right hand side of the relation.
-	 * 
-	 * @return an id
-	 */
-    public short getRightId() {
+
+    public int getLeftEnd () {
+        return leftEnd;
+    }
+
+
+    public void setLeftEnd (int leftEnd) {
+        this.leftEnd = leftEnd;
+    }
+
+
+    /**
+     * Returns the id of the right hand side of the relation.
+     * 
+     * @return an id
+     */
+    public short getRightId () {
         return rightId;
     }
 
+
     /**
      * Sets the id of the right hand side of the relation.
      * 
-     * @param rightId the id of the right hand side of the relation.
+     * @param rightId
+     *            the id of the right hand side of the relation.
      */
-    public void setRightId(short rightId) {
+    public void setRightId (short rightId) {
         this.rightId = rightId;
     }
 
+
     /**
-     * Returns the start position of the right hand side of the relation.
+     * Returns the start position of the right hand side of the
+     * relation.
      * 
      * @return the start position
      */
-    public int getRightStart() {
+    public int getRightStart () {
         return rightStart;
     }
 
+
     /**
      * Sets the start position of the right hand side of the relation.
      * 
-     * @param rightStart the start position of the right hand side of the
-     *        relation.
+     * @param rightStart
+     *            the start position of the right hand side of the
+     *            relation.
      */
-    public void setRightStart(int rightStart) {
+    public void setRightStart (int rightStart) {
         this.rightStart = rightStart;
     }
 
+
     /**
-     * Returns the end position of the right hand side of the relation.
+     * Returns the end position of the right hand side of the
+     * relation.
      * 
      * @return the end position
      */
-    public int getRightEnd() {
+    public int getRightEnd () {
         return rightEnd;
     }
 
+
     /**
      * Sets the start position of the right hand side of the relation.
      * 
-     * @param rightEnd the end position of the right hand side of the relation.
+     * @param rightEnd
+     *            the end position of the right hand side of the
+     *            relation.
      */
-    public void setRightEnd(int rightEnd) {
+    public void setRightEnd (int rightEnd) {
         this.rightEnd = rightEnd;
     }
 }
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/RelationSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/RelationSpans.java
index 9a1d578..38eb5fe 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/RelationSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/RelationSpans.java
@@ -19,11 +19,14 @@
 import de.ids_mannheim.korap.query.SpanRelationQuery;
 
 /**
- * Enumeration of spans denoting relations between two tokens/elements. The
- * start and end of a RelationSpan always denote the start and end of the
+ * Enumeration of spans denoting relations between two
+ * tokens/elements. The
+ * start and end of a RelationSpan always denote the start and end of
+ * the
  * left-side token/element.
  * 
- * There are 4 types of relations, which is differentiated by the payload length
+ * There are 4 types of relations, which is differentiated by the
+ * payload length
  * in bytes.
  * <ol>
  * <li>Token to token relation (1 int & 3 short, length: 10)</li>
@@ -31,17 +34,24 @@
  * <li>Span to token (int, byte, int, 3 short, length: 15)</li>
  * <li>Span to Span (3 int & 3 short, length: 18)</li>
  * </ol>
- * Every integer value denotes the start/end position of the start/target of a
- * relation, in this format: (sourceEndPos?, startTargetPos, endTargetPos?). The
- * end position of a token is identical to its start position, and therefore not
+ * Every integer value denotes the start/end position of the
+ * start/target of a
+ * relation, in this format: (sourceEndPos?, startTargetPos,
+ * endTargetPos?). The
+ * end position of a token is identical to its start position, and
+ * therefore not
  * is saved in a payload.
  * 
- * The short values denote the relation id, left id, and right id. The byte in
- * relation #3 is just a dummy to create a different length from the relation
+ * The short values denote the relation id, left id, and right id. The
+ * byte in
+ * relation #3 is just a dummy to create a different length from the
+ * relation
  * #2.
  * 
- * NOTE: Sorting of the candidate spans can alternatively be done in indexing,
- * instead of here. (first by left positions and then by right positions)
+ * NOTE: Sorting of the candidate spans can alternatively be done in
+ * indexing,
+ * instead of here. (first by left positions and then by right
+ * positions)
  * 
  * @author margaretha
  * */
@@ -53,47 +63,56 @@
     protected Logger logger = LoggerFactory.getLogger(RelationSpans.class);
     private List<CandidateRelationSpan> candidateList;
 
+
     /**
-     * Constructs RelationSpans from the given {@link SpanRelationQuery}.
+     * Constructs RelationSpans from the given
+     * {@link SpanRelationQuery}.
      * 
-     * @param relationSpanQuery a SpanRelationQuery
+     * @param relationSpanQuery
+     *            a SpanRelationQuery
      * @param context
      * @param acceptDocs
      * @param termContexts
      * @throws IOException
      */
-    public RelationSpans(SpanRelationQuery relationSpanQuery,
-            AtomicReaderContext context, Bits acceptDocs,
-            Map<Term, TermContext> termContexts) throws IOException {
+    public RelationSpans (SpanRelationQuery relationSpanQuery,
+                          AtomicReaderContext context, Bits acceptDocs,
+                          Map<Term, TermContext> termContexts)
+            throws IOException {
         super(relationSpanQuery, context, acceptDocs, termContexts);
         candidateList = new ArrayList<>();
         relationTermSpan = (TermSpans) firstSpans;
         hasMoreSpans = relationTermSpan.next();
     }
 
+
     @Override
-    public boolean next() throws IOException {
+    public boolean next () throws IOException {
         isStartEnumeration = false;
         return advance();
     }
 
+
     /**
-     * Returns true if there is a next match by checking if the CandidateList is
-     * not empty and set the first element of the list as the next match.
-     * Otherwise, if the RelationSpan has not ended yet, try to set the
+     * Returns true if there is a next match by checking if the
+     * CandidateList is
+     * not empty and set the first element of the list as the next
+     * match.
+     * Otherwise, if the RelationSpan has not ended yet, try to set
+     * the
      * CandidateList.
      * 
      * @return true if there is a next match.
      * @throws IOException
      */
-    private boolean advance() throws IOException {
+    private boolean advance () throws IOException {
         while (hasMoreSpans || !candidateList.isEmpty()) {
             if (!candidateList.isEmpty()) {
                 CandidateRelationSpan cs = candidateList.get(0);
                 this.matchDocNumber = cs.getDoc();
                 this.matchStartPosition = cs.getStart();
                 this.matchEndPosition = cs.getEnd();
-				this.matchPayload = cs.getPayloads();
+                this.matchPayload = cs.getPayloads();
                 this.setRightStart(cs.getRightStart());
                 this.setRightEnd(cs.getRightEnd());
                 this.spanId = cs.getSpanId(); // relation id
@@ -101,7 +120,7 @@
                 this.rightId = cs.getRightId();
                 candidateList.remove(0);
                 return true;
-            } 
+            }
             else {
                 setCandidateList();
                 currentDoc = relationTermSpan.doc();
@@ -111,33 +130,40 @@
         return false;
     }
 
+
     /**
-     * Setting the CandidateList by adding all relationTermSpan whose start
+     * Setting the CandidateList by adding all relationTermSpan whose
+     * start
      * position is the same as the current span position, and sort the
      * candidateList.
      * 
      * @throws IOException
      */
-    private void setCandidateList() throws IOException {
+    private void setCandidateList () throws IOException {
         while (hasMoreSpans && relationTermSpan.doc() == currentDoc
                 && relationTermSpan.start() == currentPosition) {
-            CandidateRelationSpan cs = new CandidateRelationSpan(relationTermSpan);
+            CandidateRelationSpan cs = new CandidateRelationSpan(
+                    relationTermSpan);
             readPayload(cs);
-			setPayload(cs);
+            setPayload(cs);
             candidateList.add(cs);
             hasMoreSpans = relationTermSpan.next();
         }
         Collections.sort(candidateList);
     }
 
+
     /**
-     * Identify the relation type of the given {@link CandidateRelationSpan} by
-     * checking the length of its payloads, and set some properties of the span
+     * Identify the relation type of the given
+     * {@link CandidateRelationSpan} by
+     * checking the length of its payloads, and set some properties of
+     * the span
      * based on the payloads.
      * 
-     * @param cs a CandidateRelationSpan
+     * @param cs
+     *            a CandidateRelationSpan
      */
-    private void readPayload(CandidateRelationSpan cs) {
+    private void readPayload (CandidateRelationSpan cs) {
         List<byte[]> payload = (List<byte[]>) cs.getPayloads();
         int length = payload.get(0).length;
         ByteBuffer bb = ByteBuffer.allocate(length);
@@ -176,28 +202,31 @@
         // Payload is cleared.		
     }
 
-	private void setPayload(CandidateRelationSpan cs) throws IOException {
-		ArrayList<byte[]> payload = new ArrayList<byte[]>();
-		if (relationTermSpan.isPayloadAvailable()) {
-			payload.addAll(relationTermSpan.getPayload());
-		}
-		payload.add(createClassPayload(cs.getLeftStart(), cs.getLeftEnd(),
-				(byte) 1));
-		payload.add(createClassPayload(cs.getRightStart(), cs.getRightEnd(),
-				(byte) 2));
-		cs.setPayloads(payload);
-	}
 
-	private byte[] createClassPayload(int start, int end, byte classNumber) {
-		ByteBuffer buffer = ByteBuffer.allocate(9);
-		buffer.putInt(start);
-		buffer.putInt(end);
-		buffer.put(classNumber);
-		return buffer.array();
-	}
+    private void setPayload (CandidateRelationSpan cs) throws IOException {
+        ArrayList<byte[]> payload = new ArrayList<byte[]>();
+        if (relationTermSpan.isPayloadAvailable()) {
+            payload.addAll(relationTermSpan.getPayload());
+        }
+        payload.add(createClassPayload(cs.getLeftStart(), cs.getLeftEnd(),
+                (byte) 1));
+        payload.add(createClassPayload(cs.getRightStart(), cs.getRightEnd(),
+                (byte) 2));
+        cs.setPayloads(payload);
+    }
+
+
+    private byte[] createClassPayload (int start, int end, byte classNumber) {
+        ByteBuffer buffer = ByteBuffer.allocate(9);
+        buffer.putInt(start);
+        buffer.putInt(end);
+        buffer.put(classNumber);
+        return buffer.array();
+    }
+
 
     @Override
-    public boolean skipTo(int target) throws IOException {
+    public boolean skipTo (int target) throws IOException {
         if (hasMoreSpans && (firstSpans.doc() < target)) {
             if (!firstSpans.skipTo(target)) {
                 candidateList.clear();
@@ -210,90 +239,108 @@
         return advance();
     }
 
+
     @Override
-    public long cost() {
+    public long cost () {
         return firstSpans.cost();
     }
 
+
     /**
      * Returns the right start position of the current RelationSpan.
      * 
      * @return the right start position of the current RelationSpan.
      */
-    public int getRightStart() {
+    public int getRightStart () {
         return rightStart;
     }
 
+
     /**
      * Sets the right start position of the current RelationSpan.
      * 
-     * @param rightStart the right start position of the current RelationSpan
+     * @param rightStart
+     *            the right start position of the current RelationSpan
      */
-    public void setRightStart(int rightStart) {
+    public void setRightStart (int rightStart) {
         this.rightStart = rightStart;
     }
 
+
     /**
      * Returns the right end position of the current RelationSpan.
      * 
      * @return the right end position of the current RelationSpan.
      */
-    public int getRightEnd() {
+    public int getRightEnd () {
         return rightEnd;
     }
 
+
     /**
      * Sets the right end position of the current RelationSpan.
      * 
-     * @param rightEnd the right end position of the current RelationSpan.
+     * @param rightEnd
+     *            the right end position of the current RelationSpan.
      */
-    public void setRightEnd(int rightEnd) {
+    public void setRightEnd (int rightEnd) {
         this.rightEnd = rightEnd;
     }
 
     /**
-	 * CandidateRelationSpan stores a state of RelationSpans. In a list,
-	 * CandidateRelationSpans are ordered first by the position of the relation
-	 * left side.
-	 */
-	class CandidateRelationSpan extends CandidateSpan {
+     * CandidateRelationSpan stores a state of RelationSpans. In a
+     * list,
+     * CandidateRelationSpans are ordered first by the position of the
+     * relation
+     * left side.
+     */
+    class CandidateRelationSpan extends CandidateSpan {
 
         private int rightStart, rightEnd;
         private short leftId, rightId;
 
-        public CandidateRelationSpan(Spans span) throws IOException {
+
+        public CandidateRelationSpan (Spans span) throws IOException {
             super(span);
         }
 
-        public int getRightEnd() {
+
+        public int getRightEnd () {
             return rightEnd;
         }
 
-        public void setRightEnd(int rightEnd) {
+
+        public void setRightEnd (int rightEnd) {
             this.rightEnd = rightEnd;
         }
 
-        public int getRightStart() {
+
+        public int getRightStart () {
             return rightStart;
         }
 
-        public void setRightStart(int rightStart) {
+
+        public void setRightStart (int rightStart) {
             this.rightStart = rightStart;
         }
 
-        public short getLeftId() {
+
+        public short getLeftId () {
             return leftId;
         }
 
-        public void setLeftId(short leftId) {
+
+        public void setLeftId (short leftId) {
             this.leftId = leftId;
         }
 
-        public short getRightId() {
+
+        public short getRightId () {
             return rightId;
         }
 
-        public void setRightId(short rightId) {
+
+        public void setRightId (short rightId) {
             this.rightId = rightId;
         }
 
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/RepetitionSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/RepetitionSpans.java
index f66d78c..1809309 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/RepetitionSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/RepetitionSpans.java
@@ -15,7 +15,8 @@
 import de.ids_mannheim.korap.query.SpanRepetitionQuery;
 
 /**
- * Enumeration of spans occurring multiple times in a sequence. The number of
+ * Enumeration of spans occurring multiple times in a sequence. The
+ * number of
  * repetition depends on the min and max parameters.
  * 
  * @author margaretha
@@ -26,18 +27,22 @@
     private long matchCost;
     private List<CandidateSpan> matchList;
 
+
     /**
-     * Constructs RepetitionSpans from the given {@link SpanRepetitionQuery}.
+     * Constructs RepetitionSpans from the given
+     * {@link SpanRepetitionQuery}.
      * 
-     * @param query a SpanRepetitionQuery
+     * @param query
+     *            a SpanRepetitionQuery
      * @param context
      * @param acceptDocs
      * @param termContexts
      * @throws IOException
      */
-    public RepetitionSpans(SpanRepetitionQuery query,
-            AtomicReaderContext context, Bits acceptDocs,
-            Map<Term, TermContext> termContexts) throws IOException {
+    public RepetitionSpans (SpanRepetitionQuery query,
+                            AtomicReaderContext context, Bits acceptDocs,
+                            Map<Term, TermContext> termContexts)
+            throws IOException {
         super(query, context, acceptDocs, termContexts);
         this.min = query.getMin();
         this.max = query.getMax();
@@ -45,23 +50,28 @@
         hasMoreSpans = firstSpans.next();
     }
 
+
     @Override
-    public boolean next() throws IOException {
+    public boolean next () throws IOException {
         isStartEnumeration = false;
         matchPayload.clear();
         return advance();
     }
 
+
     /**
-     * Advances the RepetitionSpans to the next match by setting the first
-     * element in the matchlist as the current match. When the matchlist is
+     * Advances the RepetitionSpans to the next match by setting the
+     * first
+     * element in the matchlist as the current match. When the
+     * matchlist is
      * empty, it has to be set first.
      * 
-     * @return <code>true</code> if a match is found, <code>false</code>
+     * @return <code>true</code> if a match is found,
+     *         <code>false</code>
      *         otherwise.
      * @throws IOException
      */
-    private boolean advance() throws IOException {
+    private boolean advance () throws IOException {
 
         while (hasMoreSpans || !matchList.isEmpty()) {
             if (!matchList.isEmpty()) {
@@ -77,13 +87,14 @@
         return false;
     }
 
+
     /**
      * Collects all adjacent firstspans occurring in a sequence.
      * 
      * @return a list of the adjacent spans
      * @throws IOException
      */
-    private List<CandidateSpan> collectAdjacentSpans() throws IOException {
+    private List<CandidateSpan> collectAdjacentSpans () throws IOException {
 
         CandidateSpan startSpan = new CandidateSpan(firstSpans);
 
@@ -97,7 +108,8 @@
 
             if (firstSpans.start() > prevSpan.getEnd()) {
                 break;
-            } else if (firstSpans.start() == prevSpan.getEnd()) {
+            }
+            else if (firstSpans.start() == prevSpan.getEnd()) {
                 prevSpan = new CandidateSpan(firstSpans);
                 adjacentSpans.add(prevSpan);
             }
@@ -105,13 +117,15 @@
         return adjacentSpans;
     }
 
+
     /**
-     * Generates all possible repetition match spans from the given list of
+     * Generates all possible repetition match spans from the given
+     * list of
      * adjacent spans and add them to the match list.
      * 
      * @param adjacentSpans
      */
-    private void setMatchList(List<CandidateSpan> adjacentSpans) {
+    private void setMatchList (List<CandidateSpan> adjacentSpans) {
         CandidateSpan startSpan, endSpan, matchSpan;
         for (int i = min; i < max + 1; i++) {
             int j = 0;
@@ -124,10 +138,12 @@
                         matchSpan.setPayloads(computeMatchPayload(
                                 adjacentSpans, 0, endIndex - 1));
                         matchList.add(matchSpan);
-                    } catch (CloneNotSupportedException e) {
+                    }
+                    catch (CloneNotSupportedException e) {
                         e.printStackTrace();
                     }
-                } else {
+                }
+                else {
                     endSpan = adjacentSpans.get(endIndex);
                     matchSpan = new CandidateSpan(startSpan.getStart(),
                             endSpan.getEnd(), startSpan.getDoc(),
@@ -144,19 +160,27 @@
         Collections.sort(matchList);
     }
 
+
     /**
-     * Creates payloads by adding all the payloads of some adjacent spans, that
-     * are all spans in the given list whose index is between the start and end
+     * Creates payloads by adding all the payloads of some adjacent
+     * spans, that
+     * are all spans in the given list whose index is between the
+     * start and end
      * index (including those with these indexes).
      * 
-     * @param adjacentSpans a list of adjacentSpans
-     * @param start the start index representing the first adjacent span in the
-     *        list to be computed
-     * @param end the end index representing the last adjacent span in the list
-     *        to be computed
+     * @param adjacentSpans
+     *            a list of adjacentSpans
+     * @param start
+     *            the start index representing the first adjacent span
+     *            in the
+     *            list to be computed
+     * @param end
+     *            the end index representing the last adjacent span in
+     *            the list
+     *            to be computed
      * @return payloads
      */
-    private Collection<byte[]> computeMatchPayload(
+    private Collection<byte[]> computeMatchPayload (
             List<CandidateSpan> adjacentSpans, int start, int end) {
         Collection<byte[]> payload = new ArrayList<byte[]>();
         for (int i = start; i <= end; i++) {
@@ -165,17 +189,22 @@
         return payload;
     }
 
+
     /**
-     * Computes the matchcost by adding all the cost of the adjacent spans
+     * Computes the matchcost by adding all the cost of the adjacent
+     * spans
      * between the start and end index in the given list.
      * 
-     * @param adjacentSpans a list of adjacent spans
-     * @param start the start index
-     * @param end the end index
+     * @param adjacentSpans
+     *            a list of adjacent spans
+     * @param start
+     *            the start index
+     * @param end
+     *            the end index
      * @return
      */
-    private long computeMatchCost(List<CandidateSpan> adjacentSpans, int start,
-            int end) {
+    private long computeMatchCost (List<CandidateSpan> adjacentSpans,
+            int start, int end) {
         long matchCost = 0;
         for (int i = start; i <= end; i++) {
             matchCost += adjacentSpans.get(i).getCost();
@@ -183,13 +212,16 @@
         return matchCost;
     }
 
+
     /**
-     * Sets properties for the current match from the given candidate span.
+     * Sets properties for the current match from the given candidate
+     * span.
      * 
-     * @param candidateSpan the match candidate span
+     * @param candidateSpan
+     *            the match candidate span
      * @throws IOException
      */
-    private void setMatchProperties(CandidateSpan candidateSpan)
+    private void setMatchProperties (CandidateSpan candidateSpan)
             throws IOException {
         matchDocNumber = candidateSpan.getDoc();
         matchStartPosition = candidateSpan.getStart();
@@ -199,8 +231,9 @@
         }
     }
 
+
     @Override
-    public boolean skipTo(int target) throws IOException {
+    public boolean skipTo (int target) throws IOException {
         if (hasMoreSpans && firstSpans.doc() < target) {
             if (!firstSpans.skipTo(target)) {
                 hasMoreSpans = false;
@@ -211,8 +244,9 @@
         return advance();
     }
 
+
     @Override
-    public long cost() {
+    public long cost () {
         return matchCost;
     }
 }
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/SegmentSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/SegmentSpans.java
index b601d28..79ef116 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/SegmentSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/SegmentSpans.java
@@ -11,74 +11,82 @@
 import de.ids_mannheim.korap.query.SpanSegmentQuery;
 
 /**
- * SegmentSpans is an enumeration of Span matches in which that two child spans
+ * SegmentSpans is an enumeration of Span matches in which that two
+ * child spans
  * have exactly the same start and end positions.
  * 
  * @author margaretha
  * */
 public class SegmentSpans extends NonPartialOverlappingSpans {
 
-	private boolean isRelation;
+    private boolean isRelation;
+
+
     /**
      * Creates SegmentSpans from the given {@link SpanSegmentQuery}.
      * 
-     * @param spanSegmentQuery a spanSegmentQuery.
+     * @param spanSegmentQuery
+     *            a spanSegmentQuery.
      * @param context
      * @param acceptDocs
      * @param termContexts
      * @throws IOException
      */
-    public SegmentSpans(SpanSegmentQuery spanSegmentQuery,
-            AtomicReaderContext context, Bits acceptDocs,
-            Map<Term, TermContext> termContexts) throws IOException {
-		super(spanSegmentQuery, context, acceptDocs, termContexts);
-		if (spanSegmentQuery.isRelation()) {
-			SpansWithId s2 = (SpansWithId) secondSpans;
-			// hacking for element query
-			s2.hasSpanId = true;
-			isRelation = true;
-		}
+    public SegmentSpans (SpanSegmentQuery spanSegmentQuery,
+                         AtomicReaderContext context, Bits acceptDocs,
+                         Map<Term, TermContext> termContexts)
+            throws IOException {
+        super(spanSegmentQuery, context, acceptDocs, termContexts);
+        if (spanSegmentQuery.isRelation()) {
+            SpansWithId s2 = (SpansWithId) secondSpans;
+            // hacking for element query
+            s2.hasSpanId = true;
+            isRelation = true;
+        }
     }
 
+
     /**
-     * Check weather the start and end positions of the current firstspan and
+     * Check weather the start and end positions of the current
+     * firstspan and
      * secondspan are identical.
      * 
      * */
     @Override
-    protected int findMatch() {
-		RelationSpans s1;
-		SpansWithId s2;
+    protected int findMatch () {
+        RelationSpans s1;
+        SpansWithId s2;
         if (firstSpans.start() == secondSpans.start()
                 && firstSpans.end() == secondSpans.end()) {
 
-			if (isRelation) {
-				s1 = (RelationSpans) firstSpans;
-				s2 = (SpansWithId) secondSpans;
+            if (isRelation) {
+                s1 = (RelationSpans) firstSpans;
+                s2 = (SpansWithId) secondSpans;
 
-				//System.out.println("segment: " + s1.getRightStart() + " "
-				// + s1.getRightEnd());
-				if (s1.getLeftId() == s2.getSpanId()) {
-					setMatch();
-					return 0;
-				}
-			}
-			else {
-				setMatch();
-				return 0;
-			}            
-		}
+                //System.out.println("segment: " + s1.getRightStart() + " "
+                // + s1.getRightEnd());
+                if (s1.getLeftId() == s2.getSpanId()) {
+                    setMatch();
+                    return 0;
+                }
+            }
+            else {
+                setMatch();
+                return 0;
+            }
+        }
 
-		if (firstSpans.start() < secondSpans.start()
+        if (firstSpans.start() < secondSpans.start()
                 || firstSpans.end() < secondSpans.end())
             return -1;
 
         return 1;
     }
 
-	private void setMatch() {
-		matchDocNumber = firstSpans.doc();
-		matchStartPosition = firstSpans.start();
-		matchEndPosition = firstSpans.end();
-	}
+
+    private void setMatch () {
+        matchDocNumber = firstSpans.doc();
+        matchStartPosition = firstSpans.start();
+        matchEndPosition = firstSpans.end();
+    }
 }
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/SimpleSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/SimpleSpans.java
index 5b141a6..f1ec996 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/SimpleSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/SimpleSpans.java
@@ -14,122 +14,141 @@
 
 import de.ids_mannheim.korap.query.SimpleSpanQuery;
 
-/** An abstract class for Span enumeration including span match properties
- * 	and basic methods.
- *  
- * 	@author margaretha 
+/**
+ * An abstract class for Span enumeration including span match
+ * properties
+ * and basic methods.
+ * 
+ * @author margaretha
  * */
-public abstract class SimpleSpans extends Spans{
-	private SimpleSpanQuery query;
-	protected boolean isStartEnumeration;
-	protected boolean collectPayloads;
-	
-	protected boolean hasMoreSpans;
-	// Warning: enumeration of Spans
-	protected Spans firstSpans, secondSpans;
-	
-	protected int matchDocNumber, matchStartPosition, matchEndPosition;	
-	protected Collection<byte[]> matchPayload;	
-      
-	public SimpleSpans() {
-		collectPayloads = true;
-		matchDocNumber = -1;
-		matchStartPosition = -1;
-		matchEndPosition = -1;
-		matchPayload = new ArrayList<byte[]>();
-		isStartEnumeration = true;
-	};
-	
+public abstract class SimpleSpans extends Spans {
+    private SimpleSpanQuery query;
+    protected boolean isStartEnumeration;
+    protected boolean collectPayloads;
+
+    protected boolean hasMoreSpans;
+    // Warning: enumeration of Spans
+    protected Spans firstSpans, secondSpans;
+
+    protected int matchDocNumber, matchStartPosition, matchEndPosition;
+    protected Collection<byte[]> matchPayload;
+
+
+    public SimpleSpans () {
+        collectPayloads = true;
+        matchDocNumber = -1;
+        matchStartPosition = -1;
+        matchEndPosition = -1;
+        matchPayload = new ArrayList<byte[]>();
+        isStartEnumeration = true;
+    };
+
+
     public SimpleSpans (SimpleSpanQuery simpleSpanQuery,
-			AtomicReaderContext context,
-			Bits acceptDocs,
-			Map<Term,TermContext> termContexts) throws IOException {
-		this();
-    	query = simpleSpanQuery;
-    	collectPayloads = query.isCollectPayloads();
-  		// Get the enumeration of the two spans to match
-		SpanQuery sq;
-		if ((sq = simpleSpanQuery.getFirstClause()) != null)
-			firstSpans = sq.getSpans(context, acceptDocs, termContexts);
-  		
-		if ((sq = simpleSpanQuery.getSecondClause()) != null)
-			secondSpans = sq.getSpans(context, acceptDocs, termContexts);
-  		
-      }
-  	
-  	/** If the current x and y are not in the same document, to skip the 
-  	 * 	span with the smaller document number, to the same OR a greater 
-  	 * 	document number than, the document number of the other span. Do 
-  	 * 	this until the x and the y are in the same doc, OR until the last 
-  	 * 	document.	
-  	 *	@return true iff such a document exists.
-  	 * */
-  	protected boolean ensureSameDoc(Spans x, Spans y) throws IOException {		
-  		while (x.doc() != y.doc()) {
-  			if (x.doc() < y.doc()){
-  				if (!x.skipTo(y.doc())){
-  					hasMoreSpans = false;
-  					return false;
-  				}				
-  			}		
-  			else {
-  				if (!y.skipTo(x.doc())){
-  					hasMoreSpans = false;
-  					return false;
-  				}	
-  			}			
-  		}		
-  		return true;
-  	} 	
-  	
-	/** Find the same doc shared by element, firstspan and secondspan.
-	 *  @return true iff such a doc is found.
-	 * */
-	protected boolean findSameDoc(Spans x, 
-			Spans y, Spans e) throws IOException{
-		
-		while (hasMoreSpans) {
-			if (ensureSameDoc(x, y) &&
-					e.doc() == x.doc()){
-				return true;
-			}			
-			if (!ensureSameDoc(e,y)){
-				return false;
-			};
-		}		
-  		return false;
-	}
-  	
-  	@Override
-  	public int doc() {
-  		return matchDocNumber;
-  	}
+                        AtomicReaderContext context, Bits acceptDocs,
+                        Map<Term, TermContext> termContexts) throws IOException {
+        this();
+        query = simpleSpanQuery;
+        collectPayloads = query.isCollectPayloads();
+        // Get the enumeration of the two spans to match
+        SpanQuery sq;
+        if ((sq = simpleSpanQuery.getFirstClause()) != null)
+            firstSpans = sq.getSpans(context, acceptDocs, termContexts);
 
-  	@Override
-  	public int start() {
-  		return matchStartPosition;
-  	}
+        if ((sq = simpleSpanQuery.getSecondClause()) != null)
+            secondSpans = sq.getSpans(context, acceptDocs, termContexts);
 
-  	@Override
-  	public int end() {
-  		return matchEndPosition;
-  	}
+    }
 
-	@Override
-  	public Collection<byte[]> getPayload() throws IOException {
-  		return matchPayload;
-  	}
 
-  	@Override
-  	public boolean isPayloadAvailable() throws IOException {
-  		return !matchPayload.isEmpty();
-  	}
-  	
-  	@Override
-  	public String toString() {				
-  		return getClass().getName() + "("+query.toString()+")@"+
-  		    (isStartEnumeration?"START":(hasMoreSpans?(doc()+":"+
-  		    start()+"-"+end()):"END"));
-  	}
-    
+    /**
+     * If the current x and y are not in the same document, to skip
+     * the
+     * span with the smaller document number, to the same OR a greater
+     * document number than, the document number of the other span. Do
+     * this until the x and the y are in the same doc, OR until the
+     * last
+     * document.
+     * 
+     * @return true iff such a document exists.
+     * */
+    protected boolean ensureSameDoc (Spans x, Spans y) throws IOException {
+        while (x.doc() != y.doc()) {
+            if (x.doc() < y.doc()) {
+                if (!x.skipTo(y.doc())) {
+                    hasMoreSpans = false;
+                    return false;
+                }
+            }
+            else {
+                if (!y.skipTo(x.doc())) {
+                    hasMoreSpans = false;
+                    return false;
+                }
+            }
+        }
+        return true;
+    }
+
+
+    /**
+     * Find the same doc shared by element, firstspan and secondspan.
+     * 
+     * @return true iff such a doc is found.
+     * */
+    protected boolean findSameDoc (Spans x, Spans y, Spans e)
+            throws IOException {
+
+        while (hasMoreSpans) {
+            if (ensureSameDoc(x, y) && e.doc() == x.doc()) {
+                return true;
+            }
+            if (!ensureSameDoc(e, y)) {
+                return false;
+            };
+        }
+        return false;
+    }
+
+
+    @Override
+    public int doc () {
+        return matchDocNumber;
+    }
+
+
+    @Override
+    public int start () {
+        return matchStartPosition;
+    }
+
+
+    @Override
+    public int end () {
+        return matchEndPosition;
+    }
+
+
+    @Override
+    public Collection<byte[]> getPayload () throws IOException {
+        return matchPayload;
+    }
+
+
+    @Override
+    public boolean isPayloadAvailable () throws IOException {
+        return !matchPayload.isEmpty();
+    }
+
+
+    @Override
+    public String toString () {
+        return getClass().getName()
+                + "("
+                + query.toString()
+                + ")@"
+                + (isStartEnumeration ? "START" : (hasMoreSpans ? (doc() + ":"
+                        + start() + "-" + end()) : "END"));
+    }
+
 }
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/SpansWithAttribute.java b/src/main/java/de/ids_mannheim/korap/query/spans/SpansWithAttribute.java
index 4446555..d7fa03f 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/SpansWithAttribute.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/SpansWithAttribute.java
@@ -18,12 +18,16 @@
 import de.ids_mannheim.korap.query.SpanWithAttributeQuery;
 
 /**
- * Span enumeration of element or relation spans (referent spans) having and/or
- * <em>not</em> having some attributes. This class only handles <em>and</em>
+ * Span enumeration of element or relation spans (referent spans)
+ * having and/or
+ * <em>not</em> having some attributes. This class only handles
+ * <em>and</em>
  * operation on attributes.
  * 
- * Use SpanOrQuery to perform <em>or</em> operation on attributes, i.e. choose
- * between two elements with some attribute constraints. Note that the attribute
+ * Use SpanOrQuery to perform <em>or</em> operation on attributes,
+ * i.e. choose
+ * between two elements with some attribute constraints. Note that the
+ * attribute
  * constraints have to be formulated in Conjunctive Normal Form (CNF).
  * 
  * @author margaretha
@@ -36,150 +40,169 @@
 
     protected Logger logger = LoggerFactory.getLogger(SpansWithAttribute.class);
 
+
     /**
      * Constructs SpansWithAttribute from the given
      * {@link SpanWithAttributeQuery} and {@link SpansWithId}, such as
      * elementSpans and relationSpans.
      * 
-     * @param spanWithAttributeQuery a spanWithAttributeQuery
-     * @param spansWithId a SpansWithId
+     * @param spanWithAttributeQuery
+     *            a spanWithAttributeQuery
+     * @param spansWithId
+     *            a SpansWithId
      * @param context
      * @param acceptDocs
      * @param termContexts
      * @throws IOException
      */
-    public SpansWithAttribute(SpanWithAttributeQuery spanWithAttributeQuery,
-            SpansWithId spansWithId, AtomicReaderContext context,
-            Bits acceptDocs, Map<Term, TermContext> termContexts)
+    public SpansWithAttribute (SpanWithAttributeQuery spanWithAttributeQuery,
+                               SpansWithId spansWithId,
+                               AtomicReaderContext context, Bits acceptDocs,
+                               Map<Term, TermContext> termContexts)
             throws IOException {
         super(spanWithAttributeQuery, context, acceptDocs, termContexts);
         referentSpans = spansWithId;
         referentSpans.hasSpanId = true; // dummy setting enabling reading elementRef
         hasMoreSpans = referentSpans.next();
-		setAttributeList(spanWithAttributeQuery, context, acceptDocs,
-				termContexts);
+        setAttributeList(spanWithAttributeQuery, context, acceptDocs,
+                termContexts);
     }
 
-	// if there is no (positive) attributes, but there are *not attributes*
-	// hasmorespan = true
-	public SpansWithAttribute(SpanWithAttributeQuery spanWithAttributeQuery,
-			AtomicReaderContext context,
-			Bits acceptDocs, Map<Term, TermContext> termContexts)
-			throws IOException {
-		super(spanWithAttributeQuery, context, acceptDocs, termContexts);
-		hasMoreSpans = true;
-		setAttributeList(spanWithAttributeQuery, context, acceptDocs,
-				termContexts);
-		if (attributeList.size() == 0){
-			throw new IllegalArgumentException("No (positive) attribute is defined."); 
-		}
-		else if (attributeList.size() > 1) {
-			referentSpans = attributeList.get(0);
-			attributeList.remove(0);
-		}
-	}
 
-	public void setAttributeList(SpanWithAttributeQuery swaq,
-			AtomicReaderContext context, Bits acceptDocs,
-			Map<Term, TermContext> termContexts) throws IOException {
-		
-		attributeList = new ArrayList<AttributeSpans>();
-		notAttributeList = new ArrayList<AttributeSpans>();
+    // if there is no (positive) attributes, but there are *not attributes*
+    // hasmorespan = true
+    public SpansWithAttribute (SpanWithAttributeQuery spanWithAttributeQuery,
+                               AtomicReaderContext context, Bits acceptDocs,
+                               Map<Term, TermContext> termContexts)
+            throws IOException {
+        super(spanWithAttributeQuery, context, acceptDocs, termContexts);
+        hasMoreSpans = true;
+        setAttributeList(spanWithAttributeQuery, context, acceptDocs,
+                termContexts);
+        if (attributeList.size() == 0) {
+            throw new IllegalArgumentException(
+                    "No (positive) attribute is defined.");
+        }
+        else if (attributeList.size() > 1) {
+            referentSpans = attributeList.get(0);
+            attributeList.remove(0);
+        }
+    }
 
-		List<SpanQuery> attributeList = swaq.getClauseList();
-		if (swaq.isMultipleAttributes) {
-			if (attributeList != null) {
-				for (SpanQuery sq : attributeList) {
-					addAttributes((SpanAttributeQuery) sq, context, acceptDocs,
-							termContexts);
-				}
-			}
-			else {
-				throw new NullPointerException("Attribute list is null.");
-			}
-		} 
-		else if (swaq.getSecondClause() != null) {
-			addAttributes((SpanAttributeQuery) swaq.getSecondClause(),
-					context, acceptDocs, termContexts);
-		}
-		else if (swaq.getType().equals("spanWithAttribute") &&
-				swaq.getFirstClause() != null) {
-			addAttributes((SpanAttributeQuery) swaq.getFirstClause(),
-					context, acceptDocs, termContexts);
-		}
-		else {
-			throw new NullPointerException("No attribute is defined.");
-		}
-	}
+
+    public void setAttributeList (SpanWithAttributeQuery swaq,
+            AtomicReaderContext context, Bits acceptDocs,
+            Map<Term, TermContext> termContexts) throws IOException {
+
+        attributeList = new ArrayList<AttributeSpans>();
+        notAttributeList = new ArrayList<AttributeSpans>();
+
+        List<SpanQuery> attributeList = swaq.getClauseList();
+        if (swaq.isMultipleAttributes) {
+            if (attributeList != null) {
+                for (SpanQuery sq : attributeList) {
+                    addAttributes((SpanAttributeQuery) sq, context, acceptDocs,
+                            termContexts);
+                }
+            }
+            else {
+                throw new NullPointerException("Attribute list is null.");
+            }
+        }
+        else if (swaq.getSecondClause() != null) {
+            addAttributes((SpanAttributeQuery) swaq.getSecondClause(), context,
+                    acceptDocs, termContexts);
+        }
+        else if (swaq.getType().equals("spanWithAttribute")
+                && swaq.getFirstClause() != null) {
+            addAttributes((SpanAttributeQuery) swaq.getFirstClause(), context,
+                    acceptDocs, termContexts);
+        }
+        else {
+            throw new NullPointerException("No attribute is defined.");
+        }
+    }
+
 
     /**
-     * Adds the given {@link SpanAttributeQuery} to the attributeList or
-     * notAttributeList depending on the query, whether it is a negation or not.
+     * Adds the given {@link SpanAttributeQuery} to the attributeList
+     * or
+     * notAttributeList depending on the query, whether it is a
+     * negation or not.
      * 
-     * @param sq a SpanAttributeQuery
+     * @param sq
+     *            a SpanAttributeQuery
      * @param context
      * @param acceptDocs
      * @param termContexts
      * @throws IOException
      */
-    private void addAttributes(SpanAttributeQuery sq,
+    private void addAttributes (SpanAttributeQuery sq,
             AtomicReaderContext context, Bits acceptDocs,
             Map<Term, TermContext> termContexts) throws IOException {
-    	
+
         AttributeSpans as = (AttributeSpans) sq.getSpans(context, acceptDocs,
                 termContexts);
         if (sq.isNegation()) {
             notAttributeList.add(as);
             as.next();
-        } 
+        }
         else {
             attributeList.add(as);
             hasMoreSpans &= as.next();
         }
     }
 
+
     @Override
-    public boolean next() throws IOException {
+    public boolean next () throws IOException {
         isStartEnumeration = false;
-		if (referentSpans == null) { // only one (positive) attribute
-			return advanceAttribute();
-		}
-		else { return advance(); }
+        if (referentSpans == null) { // only one (positive) attribute
+            return advanceAttribute();
+        }
+        else {
+            return advance();
+        }
     }
 
-	private boolean advanceAttribute() throws IOException {
-		while(hasMoreSpans){
-			SpansWithId referentSpans = attributeList.get(0);
-			advanceNotAttributes(referentSpans);
-			if (checkNotReferentId(referentSpans)) {
-				this.matchDocNumber = referentSpans.doc();
-				this.matchStartPosition = referentSpans.start();
-				this.matchEndPosition = referentSpans.end();
-				this.matchPayload = referentSpans.getPayload();
-				this.spanId = referentSpans.getSpanId();
-				hasMoreSpans = referentSpans.next();
-				return true;
-			}
-		}
-		return false;
-	}
 
-	/**
-	 * Searches for the next match by first identify a possible element
-	 * position, and then ensuring that the element contains all the attributes
-	 * and <em>do not</em> contain any of the not attributes.
-	 * 
-	 * @return <code>true</code> if the a match is found, <code>false</code>
-	 *         otherwise.
-	 * @throws IOException
-	 */
-    private boolean advance() throws IOException {
+    private boolean advanceAttribute () throws IOException {
+        while (hasMoreSpans) {
+            SpansWithId referentSpans = attributeList.get(0);
+            advanceNotAttributes(referentSpans);
+            if (checkNotReferentId(referentSpans)) {
+                this.matchDocNumber = referentSpans.doc();
+                this.matchStartPosition = referentSpans.start();
+                this.matchEndPosition = referentSpans.end();
+                this.matchPayload = referentSpans.getPayload();
+                this.spanId = referentSpans.getSpanId();
+                hasMoreSpans = referentSpans.next();
+                return true;
+            }
+        }
+        return false;
+    }
+
+
+    /**
+     * Searches for the next match by first identify a possible
+     * element
+     * position, and then ensuring that the element contains all the
+     * attributes
+     * and <em>do not</em> contain any of the not attributes.
+     * 
+     * @return <code>true</code> if the a match is found,
+     *         <code>false</code>
+     *         otherwise.
+     * @throws IOException
+     */
+    private boolean advance () throws IOException {
 
         while (hasMoreSpans && searchSpanPosition()) {
-//			System.out.println("element: " + referentSpans.start() + ","
-//					+ referentSpans.end() + " ref:"+ referentSpans.getSpanId());
+            //			System.out.println("element: " + referentSpans.start() + ","
+            //					+ referentSpans.end() + " ref:"+ referentSpans.getSpanId());
 
-			if (checkReferentId() && checkNotReferentId(referentSpans)) {
+            if (checkReferentId() && checkNotReferentId(referentSpans)) {
                 this.matchDocNumber = referentSpans.doc();
                 this.matchStartPosition = referentSpans.start();
                 this.matchEndPosition = referentSpans.end();
@@ -196,23 +219,27 @@
         return false;
     }
 
+
     /**
-     * Searches for a possible referentSpan having the same document number and
-     * start position as the attributes', and the position is different from the
+     * Searches for a possible referentSpan having the same document
+     * number and
+     * start position as the attributes', and the position is
+     * different from the
      * <em>not attributes'</em> positions.
      * 
-     * @return <code>true</code> if the referentSpan position is valid,
+     * @return <code>true</code> if the referentSpan position is
+     *         valid,
      *         <code>false</code> otherwise.
      * @throws IOException
      */
-    private boolean searchSpanPosition() throws IOException {
+    private boolean searchSpanPosition () throws IOException {
         while (hasMoreSpans) {
             if (referentSpans.getSpanId() < 1) { // the element does not have an attribute
                 hasMoreSpans = referentSpans.next();
                 continue;
             }
             if (checkAttributeListPosition()) {
-				advanceNotAttributes(referentSpans);
+                advanceNotAttributes(referentSpans);
                 // logger.info("element is found: "+ withAttributeSpans.start());
                 return true;
             }
@@ -220,15 +247,18 @@
         return false;
     }
 
+
     /**
-     * Advances the attributes to be in the same document and start position as
+     * Advances the attributes to be in the same document and start
+     * position as
      * the referentSpan.
      * 
-     * @return <code>true</code> if the attributes are in the same document and
+     * @return <code>true</code> if the attributes are in the same
+     *         document and
      *         start position as the referentSpan.
      * @throws IOException
      */
-    private boolean checkAttributeListPosition() throws IOException {
+    private boolean checkAttributeListPosition () throws IOException {
         int currentPosition = referentSpans.start();
         boolean isSame = true;
         boolean isFirst = true;
@@ -240,7 +270,8 @@
             if (isFirst) {
                 isFirst = false;
                 currentPosition = referentSpans.start();
-            } else if (currentPosition != referentSpans.start()) {
+            }
+            else if (currentPosition != referentSpans.start()) {
                 currentPosition = referentSpans.start();
                 isSame = false;
 
@@ -250,18 +281,20 @@
         return isSame;
     }
 
+
     /**
-     * Advances the element or attribute spans to be in the same document and
+     * Advances the element or attribute spans to be in the same
+     * document and
      * start position.
      * */
-    private boolean ensureSamePosition(SpansWithId spans,
+    private boolean ensureSamePosition (SpansWithId spans,
             AttributeSpans attributes) throws IOException {
 
         while (hasMoreSpans && ensureSameDoc(spans, attributes)) {
-			if (attributes.start() == spans.start()
-					&& attributes.end() == spans.end())
+            if (attributes.start() == spans.start()
+                    && attributes.end() == spans.end())
                 return true;
-			else if (attributes.start() >= spans.start())
+            else if (attributes.start() >= spans.start())
                 hasMoreSpans = spans.next();
             else
                 hasMoreSpans = attributes.next();
@@ -270,15 +303,19 @@
         return false;
     }
 
+
     /**
-     * Advances the <em>not-attributes</em> to be in the same or greater
+     * Advances the <em>not-attributes</em> to be in the same or
+     * greater
      * document number than referentSpans' document number. If a
-     * <em>not-attribute</em> is in the same document, it is advanced to be in
-     * the same as or greater start position than the current referentSpan.
+     * <em>not-attribute</em> is in the same document, it is advanced
+     * to be in
+     * the same as or greater start position than the current
+     * referentSpan.
      * 
      * @throws IOException
      */
-	private void advanceNotAttributes(Spans referentSpans) throws IOException {
+    private void advanceNotAttributes (Spans referentSpans) throws IOException {
 
         for (AttributeSpans a : notAttributeList) {
             // advance the doc# of not AttributeSpans
@@ -295,19 +332,23 @@
         }
     }
 
+
     /**
-     * Ensures that the referent id of each attributeSpans in the attributeList
+     * Ensures that the referent id of each attributeSpans in the
+     * attributeList
      * is the same as the spanId of the actual referentSpans.
      * 
-     * @return <code>true</code> if the spanId of the current referentSpans is
-     *         the same as all the referentId of all the attributeSpans in the
+     * @return <code>true</code> if the spanId of the current
+     *         referentSpans is
+     *         the same as all the referentId of all the
+     *         attributeSpans in the
      *         attributeList, <code>false</code> otherwise.
      * @throws IOException
      */
-    private boolean checkReferentId() throws IOException {
+    private boolean checkReferentId () throws IOException {
         for (AttributeSpans attribute : attributeList) {
-			if (referentSpans.getSpanId() != attribute.getSpanId()) {
-				if (referentSpans.getSpanId() < attribute.getSpanId())
+            if (referentSpans.getSpanId() != attribute.getSpanId()) {
+                if (referentSpans.getSpanId() < attribute.getSpanId())
                     hasMoreSpans = attribute.next();
                 else {
                     hasMoreSpans = referentSpans.next();
@@ -319,22 +360,25 @@
         return true;
     }
 
+
     /**
      * Ensures that the referentSpans do <em>not</em> contain the
-     * <em>not attributes</em> (with negation). In other words, the spanId must
+     * <em>not attributes</em> (with negation). In other words, the
+     * spanId must
      * not the same as the <em>not attribute</em>'s referentId.
      * 
-     * @return <code>true</code> if the referentSpan does not have the same
+     * @return <code>true</code> if the referentSpan does not have the
+     *         same
      *         spanId as the referentIds of all the not attributes,
      *         <code>false</code> otherwise.
      * @throws IOException
      */
-	private boolean checkNotReferentId(SpansWithId referentSpans) throws IOException {
+    private boolean checkNotReferentId (SpansWithId referentSpans)
+            throws IOException {
         for (AttributeSpans notAttribute : notAttributeList) {
             if (!notAttribute.isFinish()
                     && referentSpans.start() == notAttribute.start()
-                    && referentSpans.getSpanId() == notAttribute
-                            .getSpanId()) {
+                    && referentSpans.getSpanId() == notAttribute.getSpanId()) {
                 hasMoreSpans = referentSpans.next();
                 return false;
             }
@@ -342,8 +386,9 @@
         return true;
     }
 
+
     @Override
-    public boolean skipTo(int target) throws IOException {
+    public boolean skipTo (int target) throws IOException {
         if (hasMoreSpans && (referentSpans.doc() < target)) {
             if (!referentSpans.skipTo(target)) {
                 return false;
@@ -353,8 +398,9 @@
         return advance();
     }
 
+
     @Override
-    public long cost() {
+    public long cost () {
 
         long cost = 0;
         for (AttributeSpans as : attributeList) {
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/SpansWithId.java b/src/main/java/de/ids_mannheim/korap/query/spans/SpansWithId.java
index 77c975e..9b54565 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/SpansWithId.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/SpansWithId.java
@@ -11,7 +11,8 @@
 import de.ids_mannheim.korap.query.SpanWithIdQuery;
 
 /**
- * Base class for enumeration of span requiring an id, such as elements and
+ * Base class for enumeration of span requiring an id, such as
+ * elements and
  * relations.
  * 
  * @author margaretha
@@ -21,38 +22,44 @@
     protected short spanId;
     protected boolean hasSpanId = false; // A dummy flag
 
+
     /**
      * Constructs SpansWithId for the given {@link SpanWithIdQuery}.
      * 
-     * @param spanWithIdQuery a SpanWithIdQuery
+     * @param spanWithIdQuery
+     *            a SpanWithIdQuery
      * @param context
      * @param acceptDocs
      * @param termContexts
      * @throws IOException
      */
-    public SpansWithId(SpanWithIdQuery spanWithIdQuery,
-            AtomicReaderContext context, Bits acceptDocs,
-            Map<Term, TermContext> termContexts) throws IOException {
+    public SpansWithId (SpanWithIdQuery spanWithIdQuery,
+                        AtomicReaderContext context, Bits acceptDocs,
+                        Map<Term, TermContext> termContexts) throws IOException {
         super(spanWithIdQuery, context, acceptDocs, termContexts);
     }
 
-	public SpansWithId() {}
 
-	/**
-	 * Returns the span id of the current span
-	 * 
-	 * @return the span id of the current span
-	 */
-    public short getSpanId() {
+    public SpansWithId () {}
+
+
+    /**
+     * Returns the span id of the current span
+     * 
+     * @return the span id of the current span
+     */
+    public short getSpanId () {
         return spanId;
     }
 
+
     /**
      * Sets the span id of the current span
      * 
-     * @param spanId span id
+     * @param spanId
+     *            span id
      */
-    public void setSpanId(short spanId) {
+    public void setSpanId (short spanId) {
         this.spanId = spanId;
     }
 }
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/SubSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/SubSpans.java
index c95afcc..6abec55 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/SubSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/SubSpans.java
@@ -23,6 +23,7 @@
 
     private int startOffset, length;
 
+
     /**
      * Constructs SubSpans for the given {@link SpanSubspanQuery}
      * specifiying the start offset and the length of the subspans.
@@ -35,20 +36,22 @@
      * @throws IOException
      */
     public SubSpans (SpanSubspanQuery subspanQuery,
-            AtomicReaderContext context, Bits acceptDocs,
-            Map<Term, TermContext> termContexts) throws IOException {
+                     AtomicReaderContext context, Bits acceptDocs,
+                     Map<Term, TermContext> termContexts) throws IOException {
         super(subspanQuery, context, acceptDocs, termContexts);
         this.startOffset = subspanQuery.getStartOffset();
         this.length = subspanQuery.getLength();
         hasMoreSpans = firstSpans.next();
     }
 
+
     @Override
-    public boolean next() throws IOException {
+    public boolean next () throws IOException {
         isStartEnumeration = false;
         return advance();
     }
 
+
     /**
      * Advances the SubSpans to the next match.
      * 
@@ -56,7 +59,7 @@
      *         <code>false</code> otherwise.
      * @throws IOException
      */
-    private boolean advance() throws IOException {
+    private boolean advance () throws IOException {
         while (hasMoreSpans) {
             if (findMatch()) {
                 hasMoreSpans = firstSpans.next();
@@ -67,12 +70,13 @@
         return false;
     }
 
+
     /**
      * Sets the properties of the current match/subspan.
      * 
      * @throws IOException
      */
-    public boolean findMatch() throws IOException {
+    public boolean findMatch () throws IOException {
         if (this.startOffset < 0) {
             matchStartPosition = firstSpans.end() + startOffset;
             if (matchStartPosition < firstSpans.start()) {
@@ -100,8 +104,9 @@
         return true;
     }
 
+
     @Override
-    public boolean skipTo(int target) throws IOException {
+    public boolean skipTo (int target) throws IOException {
         if (hasMoreSpans && (firstSpans.doc() < target)) {
             if (!firstSpans.skipTo(target)) {
                 hasMoreSpans = false;
@@ -112,8 +117,9 @@
         return advance();
     }
 
+
     @Override
-    public long cost() {
+    public long cost () {
         return firstSpans.cost() + 1;
     }
 
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/TermSpansWithId.java b/src/main/java/de/ids_mannheim/korap/query/spans/TermSpansWithId.java
index b34a3f5..cf12aa0 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/TermSpansWithId.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/TermSpansWithId.java
@@ -14,9 +14,12 @@
 import de.ids_mannheim.korap.query.SpanTermWithIdQuery;
 
 /**
- * Enumeration of termSpans having an id. This class just wraps the usual Lucene
- * TermSpans, and adds spanid property. It reads the term-id from a term span
- * payload. The term-id is encoded in a short, starting from (offset) 0 in the
+ * Enumeration of termSpans having an id. This class just wraps the
+ * usual Lucene
+ * TermSpans, and adds spanid property. It reads the term-id from a
+ * term span
+ * payload. The term-id is encoded in a short, starting from (offset)
+ * 0 in the
  * payload.
  * 
  * @author margaretha
@@ -25,37 +28,43 @@
 
     private TermSpans termSpans;
 
+
     /**
      * Creates TermSpansWithId from the given spanTermWithIdQuery.
      * 
-     * @param spanTermWithIdQuery a spanTermWithIdQuery
+     * @param spanTermWithIdQuery
+     *            a spanTermWithIdQuery
      * @param context
      * @param acceptDocs
      * @param termContexts
      * @throws IOException
      */
-    public TermSpansWithId(SpanTermWithIdQuery spanTermWithIdQuery,
-            AtomicReaderContext context, Bits acceptDocs,
-            Map<Term, TermContext> termContexts) throws IOException {
+    public TermSpansWithId (SpanTermWithIdQuery spanTermWithIdQuery,
+                            AtomicReaderContext context, Bits acceptDocs,
+                            Map<Term, TermContext> termContexts)
+            throws IOException {
         super(spanTermWithIdQuery, context, acceptDocs, termContexts);
         termSpans = (TermSpans) firstSpans;
         hasMoreSpans = termSpans.next();
     }
 
+
     @Override
-    public boolean next() throws IOException {
+    public boolean next () throws IOException {
         isStartEnumeration = false;
         return advance();
     }
 
+
     /**
      * Advances to the next match and set it as the current match.
      * 
-     * @return <code>true</code> if a match is found, <code>false</code>
+     * @return <code>true</code> if a match is found,
+     *         <code>false</code>
      *         otherwise.
      * @throws IOException
      */
-    private boolean advance() throws IOException {
+    private boolean advance () throws IOException {
         while (hasMoreSpans) {
             readPayload();
             matchDocNumber = firstSpans.doc();
@@ -67,21 +76,24 @@
         return false;
     }
 
+
     /**
-     * Read the payloads of the current firstspan and set the term id info from
+     * Read the payloads of the current firstspan and set the term id
+     * info from
      * the payloads.
      * 
      * @throws IOException
      */
-    private void readPayload() throws IOException {
+    private void readPayload () throws IOException {
         List<byte[]> payload = (List<byte[]>) firstSpans.getPayload();
         ByteBuffer bb = ByteBuffer.allocate(payload.get(0).length);
         bb.put(payload.get(0));
         setSpanId(bb.getShort(0)); //term id
     }
 
+
     @Override
-    public boolean skipTo(int target) throws IOException {
+    public boolean skipTo (int target) throws IOException {
         if (hasMoreSpans && (firstSpans.doc() < target)) {
             if (!firstSpans.skipTo(target)) {
                 return false;
@@ -92,8 +104,9 @@
         return advance();
     }
 
+
     @Override
-    public long cost() {
+    public long cost () {
         return firstSpans.cost(); // plus cost from reading payload
     }
 
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/TokenDistanceSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/TokenDistanceSpans.java
index 99a83a4..9044c5e 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/TokenDistanceSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/TokenDistanceSpans.java
@@ -13,10 +13,14 @@
 import de.ids_mannheim.korap.query.SpanDistanceQuery;
 
 /**
- * Enumeration of token-based distance span matches consisting of two child
- * spans having an actual distance in the range of the minimum and maximum
- * distance parameters specified in the corresponding query. A TokenDistanceSpan
- * starts from the minimum start positions of its child spans and ends at the
+ * Enumeration of token-based distance span matches consisting of two
+ * child
+ * spans having an actual distance in the range of the minimum and
+ * maximum
+ * distance parameters specified in the corresponding query. A
+ * TokenDistanceSpan
+ * starts from the minimum start positions of its child spans and ends
+ * at the
  * maximum end positions of the child spans.
  * 
  * @author margaretha
@@ -26,26 +30,30 @@
     /**
      * Constructs TokenDistanceSpans from the given query.
      * 
-     * @param query a SpanDistanceQuery
+     * @param query
+     *            a SpanDistanceQuery
      * @param context
      * @param acceptDocs
      * @param termContexts
      * @throws IOException
      */
-    public TokenDistanceSpans(SpanDistanceQuery query,
-            AtomicReaderContext context, Bits acceptDocs,
-            Map<Term, TermContext> termContexts) throws IOException {
+    public TokenDistanceSpans (SpanDistanceQuery query,
+                               AtomicReaderContext context, Bits acceptDocs,
+                               Map<Term, TermContext> termContexts)
+            throws IOException {
         super(query, context, acceptDocs, termContexts);
         hasMoreSpans = hasMoreFirstSpans;
     }
 
+
     @Override
-    protected void setCandidateList() throws IOException {
+    protected void setCandidateList () throws IOException {
         if (candidateListDocNum == secondSpans.doc()) {
             copyPossibleCandidates();
             addNewCandidates();
             candidateListIndex = -1;
-        } else {
+        }
+        else {
             candidateList.clear();
             if (hasMoreFirstSpans && ensureSameDoc(firstSpans, secondSpans)) {
                 candidateListDocNum = firstSpans.doc();
@@ -55,13 +63,16 @@
         }
     }
 
+
     /**
-     * Restructures the candidateList to contain only candidate (first) spans
-     * which are still possible to create a match, from the candidate list
+     * Restructures the candidateList to contain only candidate
+     * (first) spans
+     * which are still possible to create a match, from the candidate
+     * list
      * prepared for the previous second spans.
      * 
      * */
-    private void copyPossibleCandidates() {
+    private void copyPossibleCandidates () {
         List<CandidateSpan> temp = new ArrayList<>();
         for (CandidateSpan cs : candidateList) {
             if (cs.getEnd() + maxDistance > secondSpans.start())
@@ -70,10 +81,12 @@
         candidateList = temp;
     }
 
+
     /**
-     * Add new possible firstspan candidates for the current secondspan.
+     * Add new possible firstspan candidates for the current
+     * secondspan.
      * */
-    private void addNewCandidates() throws IOException {
+    private void addNewCandidates () throws IOException {
         while (hasMoreFirstSpans && firstSpans.doc() == candidateListDocNum
                 && firstSpans.start() < secondSpans.end()) {
 
@@ -84,8 +97,9 @@
         }
     }
 
+
     @Override
-    protected boolean findMatch() throws IOException {
+    protected boolean findMatch () throws IOException {
         CandidateSpan candidateSpan = candidateList.get(candidateListIndex);
         if (minDistance == 0
                 &&
@@ -108,14 +122,16 @@
         return false;
     }
 
+
     @Override
-    public long cost() {
+    public long cost () {
         CandidateSpan candidateSpan = candidateList.get(candidateListIndex);
         return candidateSpan.getCost() + secondSpans.cost();
     }
 
+
     @Override
-    protected boolean isSecondSpanValid() throws IOException {
+    protected boolean isSecondSpanValid () throws IOException {
         return true;
     }
 }
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/UnorderedDistanceSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/UnorderedDistanceSpans.java
index 0d29645..2b93ece 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/UnorderedDistanceSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/UnorderedDistanceSpans.java
@@ -16,8 +16,10 @@
 import de.ids_mannheim.korap.query.SpanDistanceQuery;
 
 /**
- * Enumeration of span matches, whose two child spans have a specific range of
- * distance (within a minimum and a maximum distance) and can occur in any
+ * Enumeration of span matches, whose two child spans have a specific
+ * range of
+ * distance (within a minimum and a maximum distance) and can occur in
+ * any
  * order.
  * 
  * @author margaretha
@@ -32,19 +34,23 @@
     private int matchListSpanNum;
     protected int currentDocNum;
 
+
     /**
-     * Constructs UnorderedDistanceSpans for the given {@link SpanDistanceQuery}
-     * .
+     * Constructs UnorderedDistanceSpans for the given
+     * {@link SpanDistanceQuery} .
      * 
-     * @param query a SpanDistanceQuery
+     * @param query
+     *            a SpanDistanceQuery
      * @param context
      * @param acceptDocs
      * @param termContexts
      * @throws IOException
      */
-    public UnorderedDistanceSpans(SpanDistanceQuery query,
-            AtomicReaderContext context, Bits acceptDocs,
-            Map<Term, TermContext> termContexts) throws IOException {
+    public UnorderedDistanceSpans (SpanDistanceQuery query,
+                                   AtomicReaderContext context,
+                                   Bits acceptDocs,
+                                   Map<Term, TermContext> termContexts)
+            throws IOException {
         super(query, context, acceptDocs, termContexts);
         minDistance = query.getMinDistance();
         maxDistance = query.getMaxDistance();
@@ -58,8 +64,9 @@
         hasMoreSpans = hasMoreFirstSpans && hasMoreSecondSpans;
     }
 
+
     @Override
-    protected boolean advance() throws IOException {
+    protected boolean advance () throws IOException {
         while (hasMoreSpans || !matchList.isEmpty()) {
             if (!matchList.isEmpty()) {
                 setMatchProperties();
@@ -71,28 +78,38 @@
         return false;
     }
 
+
     /**
-     * Updates the firstSpanList and secondSpanList by adding the next possible
-     * first and second spans. Both the spans must be in the same document. In
-     * UnorderedElementDistanceSpans, a span that is not in an element (distance
-     * unit), is not added to its candidate list. The element must also be in
+     * Updates the firstSpanList and secondSpanList by adding the next
+     * possible
+     * first and second spans. Both the spans must be in the same
+     * document. In
+     * UnorderedElementDistanceSpans, a span that is not in an element
+     * (distance
+     * unit), is not added to its candidate list. The element must
+     * also be in
      * the same document.
      * 
-     * @return <code>true</code> if at least one of the candidate lists can be
+     * @return <code>true</code> if at least one of the candidate
+     *         lists can be
      *         filled, <code>false</code> otherwise.
      * @throws IOException
      */
-    protected abstract boolean prepareLists() throws IOException;
+    protected abstract boolean prepareLists () throws IOException;
+
 
     /**
-     * Sets the list of matches for the span having the smallest position (i.e.
-     * between the first and the second spans), and its candidates (i.e. its
-     * counterparts). The candidates also must have smaller positions. Simply
+     * Sets the list of matches for the span having the smallest
+     * position (i.e.
+     * between the first and the second spans), and its candidates
+     * (i.e. its
+     * counterparts). The candidates also must have smaller positions.
+     * Simply
      * remove the span if it does not have any candidates.
      * 
      * @throws IOException
      */
-    protected void setMatchList() throws IOException {
+    protected void setMatchList () throws IOException {
 
         hasMoreFirstSpans = setCandidateList(firstSpanList, firstSpans,
                 hasMoreFirstSpans, secondSpanList);
@@ -130,7 +147,8 @@
                 setMatchFirstSpan(currentFirstSpan);
                 matchListSpanNum = 2;
                 updateList(firstSpanList);
-            } else {
+            }
+            else {
                 // log.trace("current target: "
                 // + secondSpanList.get(0).getStart() + " "
                 // + secondSpanList.get(0).getEnd());
@@ -144,12 +162,14 @@
                 matchListSpanNum = 1;
                 updateList(secondSpanList);
             }
-        } else if (firstSpanList.isEmpty()) {
+        }
+        else if (firstSpanList.isEmpty()) {
             // log.trace("current target: " + secondSpanList.get(0).getStart()
             // + " " + secondSpanList.get(0).getEnd());
             // log.trace("candidates: empty");
             updateList(secondSpanList);
-        } else {
+        }
+        else {
             // log.trace("current target: " + firstSpanList.get(0).getStart()
             // + " " + firstSpanList.get(0).getEnd());
             // log.trace("candidates: empty");
@@ -157,18 +177,25 @@
         }
     }
 
+
     /**
-     * Tells if the last candidate from the secondSpanList has a smaller end
-     * position than the end position of the the last candidate from the
+     * Tells if the last candidate from the secondSpanList has a
+     * smaller end
+     * position than the end position of the the last candidate from
+     * the
      * firstSpanList.
      * 
-     * @param currentFirstSpan the current firstspan
-     * @param currentSecondSpan the current secondspan
-     * @return <code>true</code> if the end position of the last candidate from
-     *         the secondSpanList is smaller than that from the firstSpanList,
+     * @param currentFirstSpan
+     *            the current firstspan
+     * @param currentSecondSpan
+     *            the current secondspan
+     * @return <code>true</code> if the end position of the last
+     *         candidate from
+     *         the secondSpanList is smaller than that from the
+     *         firstSpanList,
      *         <code>false</code> otherwise.
      */
-    private boolean isLastCandidateSmaller(CandidateSpan currentFirstSpan,
+    private boolean isLastCandidateSmaller (CandidateSpan currentFirstSpan,
             CandidateSpan currentSecondSpan) {
         if (currentFirstSpan.getEnd() == currentSecondSpan.getEnd()) {
             int secondEnd = secondSpanList.get(secondSpanList.size() - 1)
@@ -180,51 +207,68 @@
         return false;
     }
 
+
     /**
      * Performs an update based on the given candidateList. In
      * {@link UnorderedTokenDistanceSpans}, the first candidate in the
-     * candidateList is simply removed. In {@link UnorderedElementDistanceSpans}
-     * , the elementList is also updated.
+     * candidateList is simply removed. In
+     * {@link UnorderedElementDistanceSpans} , the elementList is also
+     * updated.
      * 
-     * @param candidateList a candidateList
+     * @param candidateList
+     *            a candidateList
      */
-    protected abstract void updateList(List<CandidateSpan> candidateList);
+    protected abstract void updateList (List<CandidateSpan> candidateList);
+
 
     /**
-     * Sets the candidate list for the first element in the target list and
+     * Sets the candidate list for the first element in the target
+     * list and
      * tells if the the specified spans has finished or not.
      * 
-     * @param candidateList a list of candidate spans
-     * @param candidate a Spans
-     * @param hasMoreCandidates a boolean
-     * @param targetList a list of target spans
-     * @return <code>true</code> if the span enumeration still has a next
-     *         element to be a candidate, <code>false</code> otherwise.
+     * @param candidateList
+     *            a list of candidate spans
+     * @param candidate
+     *            a Spans
+     * @param hasMoreCandidates
+     *            a boolean
+     * @param targetList
+     *            a list of target spans
+     * @return <code>true</code> if the span enumeration still has a
+     *         next
+     *         element to be a candidate, <code>false</code>
+     *         otherwise.
      * @throws IOException
      */
-    protected abstract boolean setCandidateList(
+    protected abstract boolean setCandidateList (
             List<CandidateSpan> candidateList, Spans candidate,
             boolean hasMoreCandidates, List<CandidateSpan> targetList)
             throws IOException;
 
-    /**
-     * Finds all matches between the target span and its candidates in the
-     * candidate list.
-     * 
-     * @param target a target span
-     * @param candidateList a candidate list
-     * @return the matches in a list
-     */
-    protected abstract List<CandidateSpan> findMatches(CandidateSpan target,
-            List<CandidateSpan> candidateList);
 
     /**
-     * Computes match properties and creates a candidate span match to be added
+     * Finds all matches between the target span and its candidates in
+     * the
+     * candidate list.
+     * 
+     * @param target
+     *            a target span
+     * @param candidateList
+     *            a candidate list
+     * @return the matches in a list
+     */
+    protected abstract List<CandidateSpan> findMatches (CandidateSpan target,
+            List<CandidateSpan> candidateList);
+
+
+    /**
+     * Computes match properties and creates a candidate span match to
+     * be added
      * to the match list.
      * 
      * @return a candidate span match
      * */
-    protected CandidateSpan createMatchCandidate(CandidateSpan target,
+    protected CandidateSpan createMatchCandidate (CandidateSpan target,
             CandidateSpan cs, boolean isDistanceZero) {
 
         int start = Math.min(target.getStart(), cs.getStart());
@@ -247,11 +291,13 @@
         return match;
     }
 
+
     /**
-     * Assigns the first candidate span in the match list as the current span
+     * Assigns the first candidate span in the match list as the
+     * current span
      * match, and removes it from the matchList.
      * */
-    private void setMatchProperties() {
+    private void setMatchProperties () {
         CandidateSpan cs = matchList.get(0);
         matchDocNumber = cs.getDoc();
         matchStartPosition = cs.getStart();
@@ -273,8 +319,9 @@
         // + getMatchSecondSpan().getEnd());
     }
 
+
     @Override
-    public boolean skipTo(int target) throws IOException {
+    public boolean skipTo (int target) throws IOException {
         if (hasMoreSpans && (secondSpans.doc() < target)) {
             if (!secondSpans.skipTo(target)) {
                 hasMoreSpans = false;
@@ -289,8 +336,9 @@
         return advance();
     }
 
+
     @Override
-    public long cost() {
+    public long cost () {
         return matchCost;
     }
 
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/UnorderedElementDistanceSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/UnorderedElementDistanceSpans.java
index f0df28e..8489970 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/UnorderedElementDistanceSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/UnorderedElementDistanceSpans.java
@@ -15,10 +15,14 @@
 import de.ids_mannheim.korap.query.SpanDistanceQuery;
 
 /**
- * Enumeration of span matches, whose two child spans have a specific range of
- * distance (within a min and a max distance) and can be in any order. The unit
- * distance is an element, which can be a sentence or a paragraph for instance.
- * The distance is the difference between the positions of elements containing
+ * Enumeration of span matches, whose two child spans have a specific
+ * range of
+ * distance (within a min and a max distance) and can be in any order.
+ * The unit
+ * distance is an element, which can be a sentence or a paragraph for
+ * instance.
+ * The distance is the difference between the positions of elements
+ * containing
  * the spans.
  * 
  * @author margaretha
@@ -33,19 +37,23 @@
     // target span
     private List<CandidateSpan> elementList;
 
+
     /**
      * Constructs UnorderedElementDistanceSpans for the given
      * {@link SpanDistanceQuery}.
      * 
-     * @param query a SpanDistanceQuery
+     * @param query
+     *            a SpanDistanceQuery
      * @param context
      * @param acceptDocs
      * @param termContexts
      * @throws IOException
      */
-    public UnorderedElementDistanceSpans(SpanDistanceQuery query,
-            AtomicReaderContext context, Bits acceptDocs,
-            Map<Term, TermContext> termContexts) throws IOException {
+    public UnorderedElementDistanceSpans (SpanDistanceQuery query,
+                                          AtomicReaderContext context,
+                                          Bits acceptDocs,
+                                          Map<Term, TermContext> termContexts)
+            throws IOException {
         super(query, context, acceptDocs, termContexts);
         elements = query.getElementQuery().getSpans(context, acceptDocs,
                 termContexts);
@@ -54,8 +62,9 @@
         elementList = new ArrayList<CandidateSpan>();
     }
 
+
     @Override
-    protected boolean prepareLists() throws IOException {
+    protected boolean prepareLists () throws IOException {
 
         if (firstSpanList.isEmpty() && secondSpanList.isEmpty()) {
             if (hasMoreFirstSpans && hasMoreSecondSpans && hasMoreElements
@@ -70,15 +79,18 @@
                         hasMoreFirstSpans);
                 hasMoreSecondSpans = addSpan(secondSpans, secondSpanList,
                         hasMoreSecondSpans);
-            } else {
+            }
+            else {
                 hasMoreSpans = false;
                 return false;
             }
-        } else if (firstSpanList.isEmpty() && hasMoreFirstSpans
+        }
+        else if (firstSpanList.isEmpty() && hasMoreFirstSpans
                 && firstSpans.doc() == currentDocNum) {
             hasMoreFirstSpans = addSpan(firstSpans, firstSpanList,
                     hasMoreFirstSpans);
-        } else if (secondSpanList.isEmpty() && hasMoreSecondSpans
+        }
+        else if (secondSpanList.isEmpty() && hasMoreSecondSpans
                 && secondSpans.doc() == currentDocNum) {
             hasMoreSecondSpans = addSpan(secondSpans, secondSpanList,
                     hasMoreSecondSpans);
@@ -87,20 +99,27 @@
         return true;
     }
 
+
     /**
-     * Adds all the spans occurring in the current document, as CandidateSpans
-     * to the specified candidate list, and tells if the enumeration of the
+     * Adds all the spans occurring in the current document, as
+     * CandidateSpans
+     * to the specified candidate list, and tells if the enumeration
+     * of the
      * spans has finished, or not.
      * 
-     * @param span a Span
-     * @param list a candidateList
-     * @param hasMoreSpan a boolean describing if the span enumeration has
-     *        finished or not.
-     * @return <code>true</code> if the the span enumeration has finished,
+     * @param span
+     *            a Span
+     * @param list
+     *            a candidateList
+     * @param hasMoreSpan
+     *            a boolean describing if the span enumeration has
+     *            finished or not.
+     * @return <code>true</code> if the the span enumeration has
+     *         finished,
      *         <code>false</code> otherwise.
      * @throws IOException
      */
-    private boolean addSpan(Spans span, List<CandidateSpan> list,
+    private boolean addSpan (Spans span, List<CandidateSpan> list,
             boolean hasMoreSpan) throws IOException {
         int position;
         while (hasMoreSpan && span.doc() == currentDocNum) {
@@ -115,15 +134,18 @@
         return hasMoreSpan;
     }
 
+
     /**
-     * Finds the element position of the specified span in the element list or
+     * Finds the element position of the specified span in the element
+     * list or
      * by advancing the element spans until encountering the span.
      * 
-     * @param span a Span
+     * @param span
+     *            a Span
      * @return the element position
      * @throws IOException
      */
-    private int findElementPosition(Spans span) throws IOException {
+    private int findElementPosition (Spans span) throws IOException {
         // Check in the element list
         if (!elementList.isEmpty()
                 && span.end() <= elementList.get(elementList.size() - 1)
@@ -139,15 +161,17 @@
         return (advanceElementTo(span) ? elementPosition : -1);
     }
 
+
     /**
      * Advances the element spans until encountering the given span.
      * 
      * @param span
-     * @return <code>true</code> if such an element is found, <code>false</code>
+     * @return <code>true</code> if such an element is found,
+     *         <code>false</code>
      *         if the span is not in an element.
      * @throws IOException
      */
-    private boolean advanceElementTo(Spans span) throws IOException {
+    private boolean advanceElementTo (Spans span) throws IOException {
         while (hasMoreElements && elements.doc() == currentDocNum
                 && elements.start() < span.end()) {
 
@@ -163,8 +187,9 @@
         return false; // invalid
     }
 
+
     @Override
-    protected boolean setCandidateList(List<CandidateSpan> candidateList,
+    protected boolean setCandidateList (List<CandidateSpan> candidateList,
             Spans candidate, boolean hasMoreCandidates,
             List<CandidateSpan> targetList) throws IOException {
 
@@ -179,7 +204,8 @@
 
                     if (isWithinMaxDistance(target, cs)) {
                         candidateList.add(cs);
-                    } else
+                    }
+                    else
                         break;
                 }
                 hasMoreCandidates = candidate.next();
@@ -188,14 +214,17 @@
         return hasMoreCandidates;
     }
 
+
     /**
-     * Tells if the target and candidate spans are not too far from each other
+     * Tells if the target and candidate spans are not too far from
+     * each other
      * (within the maximum distance).
      * 
-     * @return <code>true</code> if the target and candidate spans are within
+     * @return <code>true</code> if the target and candidate spans are
+     *         within
      *         the maximum distance, <code>false</code> otherwise.
      * */
-    protected boolean isWithinMaxDistance(CandidateSpan target,
+    protected boolean isWithinMaxDistance (CandidateSpan target,
             CandidateSpan candidate) {
         int candidatePos = candidate.getPosition();
         int targetPos = target.getPosition();
@@ -211,8 +240,9 @@
         return true;
     }
 
+
     @Override
-    protected List<CandidateSpan> findMatches(CandidateSpan target,
+    protected List<CandidateSpan> findMatches (CandidateSpan target,
             List<CandidateSpan> candidateList) {
 
         List<CandidateSpan> matches = new ArrayList<>();
@@ -234,20 +264,25 @@
         return matches;
     }
 
+
     @Override
-    protected void updateList(List<CandidateSpan> candidateList) {
+    protected void updateList (List<CandidateSpan> candidateList) {
         updateElementList(candidateList.get(0).getPosition());
         candidateList.remove(0);
     }
 
+
     /**
-     * Reduces the number of elements kept in the element list by removing the
-     * elements whose position is smaller than or identical to the position of
+     * Reduces the number of elements kept in the element list by
+     * removing the
+     * elements whose position is smaller than or identical to the
+     * position of
      * the last target span.
      * 
-     * @param position the last target span position
+     * @param position
+     *            the last target span position
      */
-    private void updateElementList(int position) {
+    private void updateElementList (int position) {
         Iterator<CandidateSpan> i = elementList.iterator();
         CandidateSpan e;
         while (i.hasNext()) {
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/UnorderedTokenDistanceSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/UnorderedTokenDistanceSpans.java
index c5061d3..3e50e76 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/UnorderedTokenDistanceSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/UnorderedTokenDistanceSpans.java
@@ -14,8 +14,10 @@
 import de.ids_mannheim.korap.query.SpanDistanceQuery;
 
 /**
- * Enumeration of span matches, whose two child spans have a specific range of
- * distance (within a min and a max distance) and can be in any order. The unit
+ * Enumeration of span matches, whose two child spans have a specific
+ * range of
+ * distance (within a min and a max distance) and can be in any order.
+ * The unit
  * distance is a token position.
  * 
  * @author margaretha
@@ -23,22 +25,27 @@
 public class UnorderedTokenDistanceSpans extends UnorderedDistanceSpans {
 
     /**
-     * Constructs UnorderedTokenDistanceSpans for the given SpanDistanceQuery.
+     * Constructs UnorderedTokenDistanceSpans for the given
+     * SpanDistanceQuery.
      * 
-     * @param query a SpanDistanceQuery
+     * @param query
+     *            a SpanDistanceQuery
      * @param context
      * @param acceptDocs
      * @param termContexts
      * @throws IOException
      */
-    public UnorderedTokenDistanceSpans(SpanDistanceQuery query,
-            AtomicReaderContext context, Bits acceptDocs,
-            Map<Term, TermContext> termContexts) throws IOException {
+    public UnorderedTokenDistanceSpans (SpanDistanceQuery query,
+                                        AtomicReaderContext context,
+                                        Bits acceptDocs,
+                                        Map<Term, TermContext> termContexts)
+            throws IOException {
         super(query, context, acceptDocs, termContexts);
     }
 
+
     @Override
-    protected boolean prepareLists() throws IOException {
+    protected boolean prepareLists () throws IOException {
 
         if (firstSpanList.isEmpty() && secondSpanList.isEmpty()) {
             if (hasMoreFirstSpans && hasMoreSecondSpans
@@ -48,15 +55,18 @@
                 currentDocNum = firstSpans.doc();
                 hasMoreFirstSpans = firstSpans.next();
                 hasMoreSecondSpans = secondSpans.next();
-            } else {
+            }
+            else {
                 hasMoreSpans = false;
                 return false;
             }
-        } else if (firstSpanList.isEmpty() && hasMoreFirstSpans
+        }
+        else if (firstSpanList.isEmpty() && hasMoreFirstSpans
                 && firstSpans.doc() == currentDocNum) {
             firstSpanList.add(new CandidateSpan(firstSpans));
             hasMoreFirstSpans = firstSpans.next();
-        } else if (secondSpanList.isEmpty() && hasMoreSecondSpans
+        }
+        else if (secondSpanList.isEmpty() && hasMoreSecondSpans
                 && secondSpans.doc() == currentDocNum) {
             secondSpanList.add(new CandidateSpan(secondSpans));
             hasMoreSecondSpans = secondSpans.next();
@@ -64,8 +74,9 @@
         return true;
     }
 
+
     @Override
-    protected boolean setCandidateList(List<CandidateSpan> candidateList,
+    protected boolean setCandidateList (List<CandidateSpan> candidateList,
             Spans candidate, boolean hasMoreCandidates,
             List<CandidateSpan> targetList) throws IOException {
 
@@ -80,16 +91,21 @@
         return hasMoreCandidates;
     }
 
+
     /**
-     * Tells if the target and candidate spans are not too far from each other
+     * Tells if the target and candidate spans are not too far from
+     * each other
      * (within the maximum distance).
      * 
-     * @param target a target span
-     * @param candidate a candidate span
-     * @return <code>true</code> if the target and candidate spans are within
+     * @param target
+     *            a target span
+     * @param candidate
+     *            a candidate span
+     * @return <code>true</code> if the target and candidate spans are
+     *         within
      *         the maximum distance, <code>false</code> otherwise.
      */
-    protected boolean isWithinMaxDistance(CandidateSpan target, Spans candidate) {
+    protected boolean isWithinMaxDistance (CandidateSpan target, Spans candidate) {
         // left candidate
         if (candidate.end() < target.getStart()
                 && candidate.end() + maxDistance <= target.getStart()) {
@@ -103,8 +119,9 @@
         return true;
     }
 
+
     @Override
-    protected List<CandidateSpan> findMatches(CandidateSpan target,
+    protected List<CandidateSpan> findMatches (CandidateSpan target,
             List<CandidateSpan> candidateList) {
 
         List<CandidateSpan> matches = new ArrayList<>();
@@ -132,8 +149,9 @@
         return matches;
     }
 
+
     @Override
-    protected void updateList(List<CandidateSpan> candidateList) {
+    protected void updateList (List<CandidateSpan> candidateList) {
         candidateList.remove(0);
     }
 
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/WithinSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/WithinSpans.java
index 5240580..4358f45 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/WithinSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/WithinSpans.java
@@ -28,7 +28,7 @@
 
 /**
  * Compare two spans and check how they relate positionally.
- *
+ * 
  * @author diewald
  */
 public class WithinSpans extends Spans {
@@ -38,7 +38,7 @@
 
     // This advices the java compiler to ignore all loggings
     public static final boolean DEBUG = false;
-    
+
     private boolean more = false;
 
     // Boolean value indicating if span B
@@ -46,20 +46,13 @@
     // or span A (false);
     boolean nextSpanB = true;
 
-    private int
-        wrapStart     = -1,
-        wrapEnd       = -1,
-        embeddedStart = -1,
-        embeddedEnd   = -1,
-        wrapDoc       = -1,
-        embeddedDoc   = -1,
-        matchDoc      = -1,
-        matchStart    = -1,
-        matchEnd      = -1;
-    
+    private int wrapStart = -1, wrapEnd = -1, embeddedStart = -1,
+            embeddedEnd = -1, wrapDoc = -1, embeddedDoc = -1, matchDoc = -1,
+            matchStart = -1, matchEnd = -1;
+
     private Collection<byte[]> matchPayload;
     private Collection<byte[]> embeddedPayload;
-    
+
     // Indicates that the wrap and the embedded spans are in the same doc
     private boolean inSameDoc = false;
 
@@ -78,14 +71,9 @@
                                  A.end = B.end
       m   -> 12 |                A = B
     */
-    public static final byte
-        OVERLAP      = (byte) 0,
-        REAL_OVERLAP = (byte) 2,
-        WITHIN       = (byte) 4,
-        REAL_WITHIN  = (byte) 6,
-        ENDSWITH     = (byte) 8,
-        STARTSWITH   = (byte) 10,
-        MATCH        = (byte) 12;
+    public static final byte OVERLAP = (byte) 0, REAL_OVERLAP = (byte) 2,
+            WITHIN = (byte) 4, REAL_WITHIN = (byte) 6, ENDSWITH = (byte) 8,
+            STARTSWITH = (byte) 10, MATCH = (byte) 12;
 
     private byte flag;
 
@@ -103,25 +91,29 @@
     private boolean tryMatch = true;
 
     // Two buffers for storing candidates
-    private LinkedList<WithinSpan>
-        spanStore1,
-        spanStore2;
+    private LinkedList<WithinSpan> spanStore1, spanStore2;
+
 
     /**
      * Construct a new WithinSpans object.
-     *
-     * @param spanWithinQuery The parental {@link SpanWithinQuery}.
-     * @param context The {@link AtomicReaderContext}.
-     * @param acceptDocs Bit vector representing the documents
-     *        to be searched in.
-     * @param termContexts A map managing {@link TermState TermStates}.
-     * @param flag A byte flag indicating the positional condition of the sub spans.
+     * 
+     * @param spanWithinQuery
+     *            The parental {@link SpanWithinQuery}.
+     * @param context
+     *            The {@link AtomicReaderContext}.
+     * @param acceptDocs
+     *            Bit vector representing the documents
+     *            to be searched in.
+     * @param termContexts
+     *            A map managing {@link TermState TermStates}.
+     * @param flag
+     *            A byte flag indicating the positional condition of
+     *            the sub spans.
      */
     public WithinSpans (SpanWithinQuery spanWithinQuery,
-                        AtomicReaderContext context,
-                        Bits acceptDocs,
-                        Map<Term,TermContext> termContexts,
-                        byte flag) throws IOException {
+                        AtomicReaderContext context, Bits acceptDocs,
+                        Map<Term, TermContext> termContexts, byte flag)
+            throws IOException {
 
         if (DEBUG)
             log.trace("Construct WithinSpans");
@@ -130,16 +122,10 @@
         this.matchPayload = new LinkedList<byte[]>();
 
         // Get spans
-        this.wrapSpans = spanWithinQuery.wrap().getSpans(
-            context,
-            acceptDocs,
-            termContexts
-        );
-        this.embeddedSpans = spanWithinQuery.embedded().getSpans(
-            context,
-            acceptDocs,
-            termContexts
-        );
+        this.wrapSpans = spanWithinQuery.wrap().getSpans(context, acceptDocs,
+                termContexts);
+        this.embeddedSpans = spanWithinQuery.embedded().getSpans(context,
+                acceptDocs, termContexts);
 
         this.flag = flag;
 
@@ -150,7 +136,7 @@
         // kept for toString() only.
         this.query = spanWithinQuery;
     };
-    
+
 
     // Move to next match, returning true iff any such exists.
     @Override
@@ -161,32 +147,34 @@
 
         // Initialize spans
         if (!this.init()) {
-            this.more        = false;
-            this.inSameDoc   = false;
-            this.wrapDoc     = DocIdSetIterator.NO_MORE_DOCS;
+            this.more = false;
+            this.inSameDoc = false;
+            this.wrapDoc = DocIdSetIterator.NO_MORE_DOCS;
             this.embeddedDoc = DocIdSetIterator.NO_MORE_DOCS;
-            this.matchDoc    = DocIdSetIterator.NO_MORE_DOCS;
+            this.matchDoc = DocIdSetIterator.NO_MORE_DOCS;
             return false;
         };
 
         // There are more spans and they are in the same document
 
         while (this.more && (wrapDoc == embeddedDoc ||
-                             // this.inSameDoc ||
-                             this.toSameDoc())) {
+        // this.inSameDoc ||
+                this.toSameDoc())) {
             if (DEBUG)
-                log.trace("We are in the same doc: {}, {}", wrapDoc, embeddedDoc);
+                log.trace("We are in the same doc: {}, {}", wrapDoc,
+                        embeddedDoc);
 
             // Both spans match according to the flag
             // Silently the next operations are prepared
             if (this.tryMatch && this.doesMatch()) {
-                
+
                 if (this.wrapEnd == -1)
                     this.wrapEnd = this.wrapSpans.end();
-		
-                this.matchStart = embeddedStart < wrapStart ? embeddedStart : wrapStart;
-                this.matchEnd   = embeddedEnd   > wrapEnd   ? embeddedEnd   : wrapEnd;
-                this.matchDoc   = embeddedDoc;
+
+                this.matchStart = embeddedStart < wrapStart ? embeddedStart
+                        : wrapStart;
+                this.matchEnd = embeddedEnd > wrapEnd ? embeddedEnd : wrapEnd;
+                this.matchDoc = embeddedDoc;
                 this.matchPayload.clear();
 
                 if (this.embeddedPayload != null)
@@ -196,12 +184,8 @@
                     this.matchPayload.addAll(wrapSpans.getPayload());
 
                 if (DEBUG)
-                    log.trace(
-                              "   ---- MATCH ---- {}-{} ({})",
-                              matchStart,
-                              matchEnd,
-                              matchDoc
-                              );
+                    log.trace("   ---- MATCH ---- {}-{} ({})", matchStart,
+                            matchEnd, matchDoc);
 
                 this.tryMatch = false;
                 return true;
@@ -212,10 +196,10 @@
 
                 // Next time try the match
                 this.tryMatch = true;
-		
+
                 if (DEBUG)
                     log.trace("In the next embedded branch");
-		
+
                 WithinSpan current = null;
 
                 // New - fetch until theres a span in the correct doc or bigger
@@ -230,7 +214,7 @@
                 if (current == null) {
                     if (DEBUG)
                         log.trace("SpanStore 2 is empty");
-                    
+
                     // Forward with embedding
                     if (!this.embeddedSpans.next()) {
                         this.nextSpanA();
@@ -240,20 +224,20 @@
                     else if (DEBUG) {
                         log.trace("Fetch next embedded span");
                     };
-		    
+
                     this.embeddedStart = this.embeddedSpans.start();
                     this.embeddedEnd = -1;
                     this.embeddedPayload = null;
                     this.embeddedDoc = this.embeddedSpans.doc();
 
                     if (this.embeddedDoc != this.wrapDoc) {
-                        
+
                         if (DEBUG) {
                             log.trace("Embedded span is in a new document {}",
-                                      _currentEmbedded().toString());
+                                    _currentEmbedded().toString());
                             log.trace("Reset current embedded doc");
-                        };	
-	
+                        };
+
                         /*
                         if (DEBUG)
                             log.trace("Clear all span stores");
@@ -271,15 +255,13 @@
                         this.nextSpanA();
                         continue;
                     };
-		    
+
                     if (DEBUG)
-                        log.trace(
-                            "   Forward embedded span to {}",
-                            _currentEmbedded().toString()
-                        );
-                    
+                        log.trace("   Forward embedded span to {}",
+                                _currentEmbedded().toString());
+
                     if (this.embeddedDoc != this.wrapDoc) {
-                     
+
                         // Is this always a good idea?
                         /*
                         this.spanStore1.clear();
@@ -289,7 +271,7 @@
                         this.embeddedStart = -1;
                         this.embeddedEnd = -1;
                         this.embeddedPayload = null;
-			
+
                         if (!this.toSameDoc()) {
                             this.more = false;
                             this.inSameDoc = false;
@@ -304,7 +286,7 @@
                     this.nextSpanB();
                     continue;
                 }
-		
+
                 // Fetch from second store?
                 else {
                     /** TODO: Change this to a single embedded object! */
@@ -313,7 +295,8 @@
                     this.embeddedDoc = current.doc;
 
                     if (current.payload != null) {
-                        this.embeddedPayload = new ArrayList<byte[]>(current.payload.size());
+                        this.embeddedPayload = new ArrayList<byte[]>(
+                                current.payload.size());
                         this.embeddedPayload.addAll(current.payload);
                     }
                     else {
@@ -321,8 +304,9 @@
                     };
 
                     if (DEBUG)
-                        log.trace("Fetch current from SpanStore 2: {}", current.toString());
-		    
+                        log.trace("Fetch current from SpanStore 2: {}",
+                                current.toString());
+
                     this.tryMatch = true;
                 };
                 continue;
@@ -347,10 +331,8 @@
                 };
 
                 // Move everything to spanStore2
-                this.spanStore2.addAll(
-                    0,
-                    (LinkedList<WithinSpan>) this.spanStore1.clone()
-                );
+                this.spanStore2.addAll(0,
+                        (LinkedList<WithinSpan>) this.spanStore1.clone());
                 this.spanStore1.clear();
 
                 if (DEBUG) {
@@ -359,7 +341,7 @@
                         log.trace("     | {}", i.toString());
                     };
                 };
-                
+
             }
             else if (DEBUG) {
                 log.trace("spanStore 1 is empty");
@@ -371,15 +353,13 @@
                 // Reset wrapping information
                 this.wrapStart = this.wrapSpans.start();
                 this.wrapEnd = -1;
-		
+
                 // Retrieve doc information
                 this.wrapDoc = this.wrapSpans.doc();
 
                 if (DEBUG)
-                    log.trace(
-                        "   Forward wrap span to {}",
-                        _currentWrap().toString()
-                    );
+                    log.trace("   Forward wrap span to {}", _currentWrap()
+                            .toString());
 
                 if (this.embeddedDoc != this.wrapDoc) {
                     if (DEBUG)
@@ -403,7 +383,7 @@
                     // Do not match with the current state
                     this.tryMatch = false;
                 };
-                
+
                 this.nextSpanB();
                 continue;
             }
@@ -439,7 +419,7 @@
         this.more = true;
         this.inSameDoc = true;
 
-        this.wrapDoc     = this.wrapSpans.doc();
+        this.wrapDoc = this.wrapSpans.doc();
         this.embeddedDoc = this.embeddedSpans.doc();
 
         // Clear all spanStores
@@ -455,13 +435,13 @@
 
         // Last doc was reached
         else if (this.wrapDoc == DocIdSetIterator.NO_MORE_DOCS) {
-            this.more      = false;
-            this.matchDoc  = DocIdSetIterator.NO_MORE_DOCS;
+            this.more = false;
+            this.matchDoc = DocIdSetIterator.NO_MORE_DOCS;
             this.inSameDoc = false;
             return false;
         }
         else {
-            if (DEBUG)  {
+            if (DEBUG) {
                 log.trace("Current position already is in the same doc");
                 log.trace("Embedded: {}", _currentEmbedded().toString());
             };
@@ -480,15 +460,15 @@
                 if (!wrapSpans.skipTo(this.embeddedDoc)) {
                     this.more = false;
                     this.inSameDoc = false;
-                    this.matchDoc  = DocIdSetIterator.NO_MORE_DOCS;
+                    this.matchDoc = DocIdSetIterator.NO_MORE_DOCS;
                     return false;
                 };
-                
+
                 if (DEBUG)
                     log.trace("Skip wrap to doc {}", this.embeddedDoc);
-		
+
                 this.wrapDoc = this.wrapSpans.doc();
-                
+
                 if (wrapDoc == DocIdSetIterator.NO_MORE_DOCS) {
                     this.more = false;
                     this.inSameDoc = false;
@@ -505,57 +485,57 @@
 
                 this.spanStore1.clear();
                 this.spanStore2.clear();
-		              
+
                 if (wrapDoc == embeddedDoc) {
                     this.wrapStart = this.wrapSpans.start();
                     this.embeddedStart = this.embeddedSpans.start();
                     this.matchDoc = this.embeddedDoc;
                     return true;
                 };
-                
+
                 this.wrapStart = -1;
                 this.embeddedStart = -1;
             }
-	
+
             // Forward embedInfo
             else if (this.wrapDoc > this.embeddedDoc) {
-                
+
                 // Set document information
                 if (!this.embeddedSpans.skipTo(this.wrapDoc)) {
                     this.more = false;
                     this.inSameDoc = false;
-                    this.matchDoc  = DocIdSetIterator.NO_MORE_DOCS;
+                    this.matchDoc = DocIdSetIterator.NO_MORE_DOCS;
                     return false;
                 };
-                               
+
                 this.embeddedDoc = this.embeddedSpans.doc();
-                
+
                 if (this.embeddedDoc == DocIdSetIterator.NO_MORE_DOCS) {
-                    this.more      = false;
+                    this.more = false;
                     this.inSameDoc = false;
-                    this.wrapDoc   = DocIdSetIterator.NO_MORE_DOCS;
-                    this.matchDoc  = DocIdSetIterator.NO_MORE_DOCS;
+                    this.wrapDoc = DocIdSetIterator.NO_MORE_DOCS;
+                    this.matchDoc = DocIdSetIterator.NO_MORE_DOCS;
                     return false;
                 };
 
                 if (DEBUG)
                     log.trace("Skip embedded to doc {}", this.embeddedDoc);
-                
+
                 this.embeddedStart = this.embeddedSpans.start();
                 this.embeddedEnd = -1;
                 this.embeddedPayload = null;
-                
+
                 if (this.wrapDoc == this.embeddedDoc) {
                     this.matchDoc = this.embeddedDoc;
                     return true;
                 };
             }
             else {
-                this.matchDoc  = DocIdSetIterator.NO_MORE_DOCS;
+                this.matchDoc = DocIdSetIterator.NO_MORE_DOCS;
                 return false;
             };
         };
-        
+
         this.matchDoc = this.wrapDoc;
         return true;
     };
@@ -576,7 +556,7 @@
 
             if (DEBUG)
                 log.trace("No spans initialized");
-	    
+
             this.embeddedDoc = -1;
             this.more = false;
             return false;
@@ -584,39 +564,38 @@
         this.more = true;
 
         // Store current positions for wrapping and embedded spans
-        this.wrapDoc     = this.wrapSpans.doc();
+        this.wrapDoc = this.wrapSpans.doc();
         this.embeddedDoc = this.embeddedSpans.doc();
 
         // Set inSameDoc to true, if it is true
         if (this.embeddedDoc == this.wrapDoc)
             this.inSameDoc = true;
-	
+
         return true;
     };
 
 
-    /** Skips to the first match beyond the current, whose document number is
-     * greater than or equal to <i>target</i>. <p>Returns true iff there is such
-     * a match.  <p>Behaves as if written: <pre class="prettyprint">
-     *   boolean skipTo(int target) {
-     *     do {
-     *       if (!next())
-     *         return false;
-     *     } while (target > doc());
-     *     return true;
-     *   }
+    /**
+     * Skips to the first match beyond the current, whose document
+     * number is
+     * greater than or equal to <i>target</i>. <p>Returns true iff
+     * there is such
+     * a match. <p>Behaves as if written: <pre class="prettyprint">
+     * boolean skipTo(int target) {
+     * do {
+     * if (!next())
+     * return false;
+     * } while (target > doc());
+     * return true;
+     * }
      * </pre>
      * Most implementations are considerably more efficient than that.
      */
     public boolean skipTo (int target) throws IOException {
 
         if (DEBUG)
-            log.trace(
-                "skipTo document {}/{} -> {}",
-                this.embeddedDoc,
-                this.wrapDoc,
-                target
-            );
+            log.trace("skipTo document {}/{} -> {}", this.embeddedDoc,
+                    this.wrapDoc, target);
 
         // Initialize spans
         if (!this.init())
@@ -646,6 +625,7 @@
         return this.toSameDoc();
     };
 
+
     private void nextSpanA () {
         if (DEBUG)
             log.trace("Try wrap next time");
@@ -653,6 +633,7 @@
         this.nextSpanB = false;
     };
 
+
     private void nextSpanB () {
         if (DEBUG)
             log.trace("Try embedded next time");
@@ -668,14 +649,14 @@
 
         if (this.wrapStart == -1)
             this.wrapStart = this.wrapSpans.start();
-	
+
         if (this.embeddedStart == -1) {
             this.embeddedStart = this.embeddedSpans.start();
-            this.embeddedEnd   = this.embeddedSpans.end();
+            this.embeddedEnd = this.embeddedSpans.end();
         };
 
         this.wrapEnd = -1;
-	
+
         // Shortcut to prevent lazyloading of .end()
         if (this.wrapStart > this.embeddedStart) {
             // Can't match for in, rin, ew, sw, and m
@@ -711,44 +692,41 @@
         if (currentCase >= (byte) 3 && currentCase <= (byte) 11) {
             switch (flag) {
 
-            case WITHIN:
-                if (currentCase >= 6  && currentCase <= 10 && currentCase != 8)
-                    match = true;
-                break;
+                case WITHIN:
+                    if (currentCase >= 6 && currentCase <= 10
+                            && currentCase != 8)
+                        match = true;
+                    break;
 
-            case REAL_WITHIN:
-                if (currentCase == 6 ||
-                    currentCase == 9 ||
-                    currentCase == 10)
-                    match = true;
-                break;
-        
-            case MATCH:
-                if (currentCase == 7)
-                    match = true;
-                break;
+                case REAL_WITHIN:
+                    if (currentCase == 6 || currentCase == 9
+                            || currentCase == 10)
+                        match = true;
+                    break;
 
-            case STARTSWITH:
-                if (currentCase == 7 ||
-                    currentCase == 6)
-                    match = true;
-                break;
+                case MATCH:
+                    if (currentCase == 7)
+                        match = true;
+                    break;
 
-            case ENDSWITH:
-                if (currentCase == 7 ||
-                    currentCase == 10)
-                    match = true;
-                break;
+                case STARTSWITH:
+                    if (currentCase == 7 || currentCase == 6)
+                        match = true;
+                    break;
 
-            case OVERLAP:
-                match = true;
-                break;
+                case ENDSWITH:
+                    if (currentCase == 7 || currentCase == 10)
+                        match = true;
+                    break;
 
-            case REAL_OVERLAP:
-                if (currentCase == 3 ||
-                    currentCase == 11)
+                case OVERLAP:
                     match = true;
-                break;
+                    break;
+
+                case REAL_OVERLAP:
+                    if (currentCase == 3 || currentCase == 11)
+                        match = true;
+                    break;
             };
         };
 
@@ -764,173 +742,176 @@
 
     private void _logCurrentCase (byte currentCase) {
         log.trace("Current Case is {}", currentCase);
-	
+
         String _e = _currentEmbedded().toString();
-	    
+
         log.trace("    |---|    {}", _currentWrap().toString());
 
         switch (currentCase) {
-        case 1:
-            log.trace("|-|          {}", _e);
-            break;
-        case 2:
-            log.trace("|---|        {}", _e);
-	    break;
-        case 3:
-            log.trace("  |---|      {}", _e);
-            break;
-        case 4:
-            log.trace("  |-----|    {}", _e);
-            break;
-        case 5:
-            log.trace("  |-------|  {}", _e);
-            break;
-        case 6:
-            log.trace("    |-|      {}", _e);
-            break;
-        case 7:
-            log.trace("    |---|    {}", _e);
-            break;
-        case 8:
-            log.trace("    |-----|  {}", _e);
-            break;
-        case 9:
-            log.trace("     |-|     {}", _e);
-            break;
-        case 10:
-            log.trace("      |-|    {}", _e);
-            break;
-        case 11:
-            log.trace("      |---|  {}", _e);
-            break;
-        case 12:
-            log.trace("        |-|  {}", _e);
-            break;
-        case 13:
-            log.trace("         |-| {}", _e);
-            break;
-	    
-        case 15:
-            // Fake case
-            log.trace("      |---?  {}", _e);
-            break;
+            case 1:
+                log.trace("|-|          {}", _e);
+                break;
+            case 2:
+                log.trace("|---|        {}", _e);
+                break;
+            case 3:
+                log.trace("  |---|      {}", _e);
+                break;
+            case 4:
+                log.trace("  |-----|    {}", _e);
+                break;
+            case 5:
+                log.trace("  |-------|  {}", _e);
+                break;
+            case 6:
+                log.trace("    |-|      {}", _e);
+                break;
+            case 7:
+                log.trace("    |---|    {}", _e);
+                break;
+            case 8:
+                log.trace("    |-----|  {}", _e);
+                break;
+            case 9:
+                log.trace("     |-|     {}", _e);
+                break;
+            case 10:
+                log.trace("      |-|    {}", _e);
+                break;
+            case 11:
+                log.trace("      |---|  {}", _e);
+                break;
+            case 12:
+                log.trace("        |-|  {}", _e);
+                break;
+            case 13:
+                log.trace("         |-| {}", _e);
+                break;
 
-        case 16:
-            // Fake case
-            log.trace("  |---?      {}", _e);
-            break;
+            case 15:
+                // Fake case
+                log.trace("      |---?  {}", _e);
+                break;
+
+            case 16:
+                // Fake case
+                log.trace("  |---?      {}", _e);
+                break;
         };
     };
-    
+
 
     private WithinSpan _currentWrap () {
         WithinSpan _wrap = new WithinSpan();
-        _wrap.start = this.wrapStart != -1 ? this.wrapStart : this.wrapSpans.start();
-        _wrap.end   = this.wrapEnd   != -1 ? this.wrapEnd   : this.wrapSpans.end();
-        _wrap.doc   = this.wrapDoc   != -1 ? this.wrapDoc   : this.wrapSpans.doc();
+        _wrap.start = this.wrapStart != -1 ? this.wrapStart : this.wrapSpans
+                .start();
+        _wrap.end = this.wrapEnd != -1 ? this.wrapEnd : this.wrapSpans.end();
+        _wrap.doc = this.wrapDoc != -1 ? this.wrapDoc : this.wrapSpans.doc();
         return _wrap;
     };
-	    
+
+
     private WithinSpan _currentEmbedded () {
         WithinSpan _embedded = new WithinSpan();
-        _embedded.start = this.embeddedStart != -1 ?
-                          this.embeddedStart : this.embeddedSpans.start();
-        _embedded.end   = this.embeddedEnd   != -1 ?
-                          this.embeddedEnd   : this.embeddedSpans.end();
-        _embedded.doc   = this.embeddedDoc   != -1 ?
-                          this.embeddedDoc   : this.embeddedSpans.doc();
+        _embedded.start = this.embeddedStart != -1 ? this.embeddedStart
+                : this.embeddedSpans.start();
+        _embedded.end = this.embeddedEnd != -1 ? this.embeddedEnd
+                : this.embeddedSpans.end();
+        _embedded.doc = this.embeddedDoc != -1 ? this.embeddedDoc
+                : this.embeddedSpans.doc();
         return _embedded;
     };
-    
+
 
     private void todo (byte currentCase) throws IOException {
-	/*
-	  Check what to do next with the spans.
-	  
-	  The different follow up steps are:
-	  - storeEmbedded -> store span B for later checks
-	  - nextSpanA     -> forward a
-	  - nextSpanB     -> forward b
+        /*
+          Check what to do next with the spans.
+          
+          The different follow up steps are:
+          - storeEmbedded -> store span B for later checks
+          - nextSpanA     -> forward a
+          - nextSpanB     -> forward b
 
-	  These rules were automatically generated
-	*/
+          These rules were automatically generated
+        */
 
-	// Case 1, 2
-	if (currentCase <= (byte) 2) {
-	    this.nextSpanB();
-	}
-
-	// Case 12, 13
-	else if (currentCase >= (byte) 12) {
-	    this.storeEmbedded();
-	    this.nextSpanA();
-	}
-
-	// Case 3, 4, 5, 8
-	else if (currentCase <= (byte) 5 ||
-             currentCase == (byte) 8) {
-	    if (flag <= 2)
-            this.storeEmbedded();
-	    this.nextSpanB();
-	}
-
-	// Case 11
-	else if (currentCase == (byte) 11) {
-	    if (this.flag == REAL_WITHIN) {
+        // Case 1, 2
+        if (currentCase <= (byte) 2) {
             this.nextSpanB();
-	    }
-	    else if (this.flag >= STARTSWITH) {
+        }
+
+        // Case 12, 13
+        else if (currentCase >= (byte) 12) {
+            this.storeEmbedded();
             this.nextSpanA();
-	    }
-	    else {
-            this.storeEmbedded();
+        }
+
+        // Case 3, 4, 5, 8
+        else if (currentCase <= (byte) 5 || currentCase == (byte) 8) {
+            if (flag <= 2)
+                this.storeEmbedded();
             this.nextSpanB();
-	    };
-	}
+        }
+
+        // Case 11
+        else if (currentCase == (byte) 11) {
+            if (this.flag == REAL_WITHIN) {
+                this.nextSpanB();
+            }
+            else if (this.flag >= STARTSWITH) {
+                this.nextSpanA();
+            }
+            else {
+                this.storeEmbedded();
+                this.nextSpanB();
+            };
+        }
 
 
-	// Case 6, 7, 9, 10
-	else {
-	    
-	    if (
-		// Case 6
-		(currentCase == (byte) 6 && this.flag == MATCH) ||
+        // Case 6, 7, 9, 10
+        else {
 
-		// Case 7
-		(currentCase == (byte) 7 && this.flag == REAL_WITHIN) ||
+            if (
+            // Case 6
+            (currentCase == (byte) 6 && this.flag == MATCH) ||
 
-		// Case 9, 10
-		(currentCase >= (byte) 9 && this.flag >= STARTSWITH)) {
-	    
-		this.nextSpanA();
-	    }
-	    else {
-		this.storeEmbedded();
-		this.nextSpanB();
-	    };
-	};
+            // Case 7
+                    (currentCase == (byte) 7 && this.flag == REAL_WITHIN) ||
+
+                    // Case 9, 10
+                    (currentCase >= (byte) 9 && this.flag >= STARTSWITH)) {
+
+                this.nextSpanA();
+            }
+            else {
+                this.storeEmbedded();
+                this.nextSpanB();
+            };
+        };
     };
 
+
     // Store the current embedded span in the first spanStore
     private void storeEmbedded () throws IOException {
 
         // Create a current copy
         WithinSpan embedded = new WithinSpan();
-        embedded.start = this.embeddedStart != -1 ?
-                         this.embeddedStart : this.embeddedSpans.start();
-        embedded.end   = this.embeddedEnd   != -1 ?
-                         this.embeddedEnd : this.embeddedSpans.end();
-        embedded.doc   = this.embeddedDoc;
+        embedded.start = this.embeddedStart != -1 ? this.embeddedStart
+                : this.embeddedSpans.start();
+        embedded.end = this.embeddedEnd != -1 ? this.embeddedEnd
+                : this.embeddedSpans.end();
+        embedded.doc = this.embeddedDoc;
 
         // Copy payloads
         if (this.embeddedPayload != null) {
-            embedded.payload = new ArrayList<byte[]>(this.embeddedPayload.size());
+            embedded.payload = new ArrayList<byte[]>(
+                    this.embeddedPayload.size());
             embedded.payload.addAll(this.embeddedPayload);
         }
         else if (this.embeddedSpans.isPayloadAvailable()) {
             embedded.payload = new ArrayList<byte[]>(3);
             Collection<byte[]> payload = this.embeddedSpans.getPayload();
-            
+
             this.embeddedPayload = new ArrayList<byte[]>(payload.size());
             this.embeddedPayload.addAll(payload);
             embedded.payload.addAll(payload);
@@ -939,9 +920,10 @@
         this.spanStore1.add(embedded);
 
         if (DEBUG)
-            log.trace("Pushed to spanStore 1 {} (in storeEmbedded)", embedded.toString());
+            log.trace("Pushed to spanStore 1 {} (in storeEmbedded)",
+                    embedded.toString());
     };
-    
+
 
     // Return case number
     private byte withinCase () {
@@ -955,17 +937,17 @@
             if (this.wrapStart > this.embeddedEnd) {
                 return (byte) 1;
             }
-            
+
             // Case 2
             //   |-|
             // |-|
             else if (this.wrapStart == this.embeddedEnd) {
                 return (byte) 2;
             };
-            
+
             // Load wrapEnd
             this.wrapEnd = this.wrapSpans.end();
-            
+
             // Case 3
             //   |---|
             // |---|
@@ -979,13 +961,13 @@
             else if (this.wrapEnd == this.embeddedEnd) {
                 return (byte) 4;
             };
-            
+
             // Case 5
             //  |-|
             // |---|
             return (byte) 5;
         }
-        
+
         // case 6-8
         else if (this.wrapStart == this.embeddedStart) {
 
@@ -1011,7 +993,7 @@
             // |---|
             return (byte) 8;
         }
-        
+
         // wrapStart < embeddedStart
 
         // Load wrapEnd
@@ -1023,56 +1005,65 @@
         if (this.wrapEnd < this.embeddedStart) {
             return (byte) 13;
         }
-        
+
         // Case 9
         // |---|
         //  |-|
         else if (this.wrapEnd > this.embeddedEnd) {
             return (byte) 9;
         }
-        
+
         // Case 10
         // |---|
         //   |-|
         else if (this.wrapEnd == this.embeddedEnd) {
             return (byte) 10;
         }
-        
+
         // Case 11
         // |---|
         //   |---|
         else if (this.wrapEnd > this.embeddedStart) {
             return (byte) 11;
         }
-	
+
         // case 12
         // |-|
         //   |-|
         return (byte) 12;
-    };   
+    };
 
 
-    /** Returns the document number of the current match.  Initially invalid. */
+    /**
+     * Returns the document number of the current match. Initially
+     * invalid.
+     */
     @Override
     public int doc () {
         return matchDoc;
     };
 
-    
-    /** Returns the start position of the embedding wrap.  Initially invalid. */
+
+    /**
+     * Returns the start position of the embedding wrap. Initially
+     * invalid.
+     */
     @Override
     public int start () {
         return matchStart;
     };
 
-    
-    /** Returns the end position of the embedding wrap.  Initially invalid. */
+
+    /**
+     * Returns the end position of the embedding wrap. Initially
+     * invalid.
+     */
     @Override
     public int end () {
-	return matchEnd;
+        return matchEnd;
     };
 
-    
+
     /**
      * Returns the payload data for the current span.
      * This is invalid until {@link #next()} is called for
@@ -1080,72 +1071,82 @@
      * This method must not be called more than once after each call
      * of {@link #next()}. However, most payloads are loaded lazily,
      * so if the payload data for the current position is not needed,
-     * this method may not be called at all for performance reasons. An ordered
-     * SpanQuery does not lazy load, so if you have payloads in your index and
-     * you do not want ordered SpanNearQuerys to collect payloads, you can
+     * this method may not be called at all for performance reasons.
+     * An ordered
+     * SpanQuery does not lazy load, so if you have payloads in your
+     * index and
+     * you do not want ordered SpanNearQuerys to collect payloads, you
+     * can
      * disable collection with a constructor option.<br>
      * <br>
-     * Note that the return type is a collection, thus the ordering should not be relied upon.
+     * Note that the return type is a collection, thus the ordering
+     * should not be relied upon.
      * <br/>
+     * 
      * @lucene.experimental
-     *
-     * @return a List of byte arrays containing the data of this payload, otherwise null if isPayloadAvailable is false
-     * @throws IOException if there is a low-level I/O error
+     * 
+     * @return a List of byte arrays containing the data of this
+     *         payload, otherwise null if isPayloadAvailable is false
+     * @throws IOException
+     *             if there is a low-level I/O error
      */
     // public abstract Collection<byte[]> getPayload() throws IOException;
     @Override
-    public Collection<byte[]> getPayload() throws IOException {
-	return matchPayload;
+    public Collection<byte[]> getPayload () throws IOException {
+        return matchPayload;
     };
-    
+
 
     /**
      * Checks if a payload can be loaded at this position.
      * <p/>
-     * Payloads can only be loaded once per call to
-     * {@link #next()}.
-     *
-     * @return true if there is a payload available at this position that can be loaded
+     * Payloads can only be loaded once per call to {@link #next()}.
+     * 
+     * @return true if there is a payload available at this position
+     *         that can be loaded
      */
     @Override
-    public boolean isPayloadAvailable() {
-	return matchPayload.isEmpty() == false;
+    public boolean isPayloadAvailable () {
+        return matchPayload.isEmpty() == false;
     };
 
-    
+
     // Todo: This may be in the wrong version
     @Override
-    public long cost() {
-	return wrapSpans.cost() + embeddedSpans.cost();
+    public long cost () {
+        return wrapSpans.cost() + embeddedSpans.cost();
     };
 
-    
+
     @Override
-    public String toString() {
-	return getClass().getName() + "("+query.toString()+")@"+
-	    (embeddedDoc <= 0?"START":(more?(doc()+":"+start()+"-"+end()):"END"));
+    public String toString () {
+        return getClass().getName()
+                + "("
+                + query.toString()
+                + ")@"
+                + (embeddedDoc <= 0 ? "START" : (more ? (doc() + ":" + start()
+                        + "-" + end()) : "END"));
     };
 
 
     // This was formerly the default candidate span class,
     // before it was refactored out
-    private class WithinSpan implements Comparable<WithinSpan>, Cloneable  {
-        public int
-            start = -1,
-            end   = -1,
-            doc   = -1;
+    private class WithinSpan implements Comparable<WithinSpan>, Cloneable {
+        public int start = -1, end = -1, doc = -1;
 
         public Collection<byte[]> payload;
 
         public short elementRef = -1;
-    
+
+
         public void clear () {
             this.start = -1;
             this.end = -1;
             this.doc = -1;
             clearPayload();
         };
-    
+
+
         @Override
         public int compareTo (WithinSpan o) {
             /* optimizable for short numbers to return o.end - this.end */
@@ -1164,16 +1165,19 @@
             return 1;
         };
 
-        public short getElementRef() {
+
+        public short getElementRef () {
             return elementRef;
         }
 
-        public void setElementRef(short elementRef) {
+
+        public void setElementRef (short elementRef) {
             this.elementRef = elementRef;
         };
-    
+
+
         @Override
-        public Object clone() {
+        public Object clone () {
             WithinSpan span = new WithinSpan();
             span.start = this.start;
             span.end = this.end;
@@ -1182,6 +1186,7 @@
             return span;
         };
 
+
         public WithinSpan copyFrom (WithinSpan o) {
             this.start = o.start;
             this.end = o.end;
@@ -1190,19 +1195,19 @@
             this.payload.addAll(o.payload);
             return this;
         };
-        
+
+
         public void clearPayload () {
             if (this.payload != null)
                 this.payload.clear();
         };
 
+
         public String toString () {
             StringBuilder sb = new StringBuilder("[");
-            return sb.append(this.start).append('-')
-                .append(this.end)
-                .append('(').append(this.doc).append(')')
-                .append(']')
-                .toString();
+            return sb.append(this.start).append('-').append(this.end)
+                    .append('(').append(this.doc).append(')').append(']')
+                    .toString();
         };
     };
 };
diff --git a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanAlterQueryWrapper.java b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanAlterQueryWrapper.java
index e60ca21..6503b3f 100644
--- a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanAlterQueryWrapper.java
+++ b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanAlterQueryWrapper.java
@@ -20,19 +20,20 @@
     private SpanQuery query;
     private List<SpanQueryWrapper> alternatives;
 
+
     public SpanAlterQueryWrapper (String field) {
         this.field = field;
         this.alternatives = new ArrayList<>();
     };
 
+
     public SpanAlterQueryWrapper (String field, SpanQuery query) {
         this.field = field;
         this.alternatives = new ArrayList<>();
-        this.alternatives.add(
-            new SpanSimpleQueryWrapper(query)
-        );
+        this.alternatives.add(new SpanSimpleQueryWrapper(query));
     };
 
+
     public SpanAlterQueryWrapper (String field, SpanQueryWrapper query) {
         this.field = field;
         this.alternatives = new ArrayList<>();
@@ -41,35 +42,30 @@
         this.alternatives.add(query);
     };
 
+
     public SpanAlterQueryWrapper (String field, String ... terms) {
         this.field = field;
         this.alternatives = new ArrayList<>();
         for (String term : terms) {
             this.isNull = false;
-            this.alternatives.add(
-                new SpanSimpleQueryWrapper(
-                    new SpanTermQuery(
-                        new Term(this.field, term)
-                    )
-                )
-            );
+            this.alternatives.add(new SpanSimpleQueryWrapper(new SpanTermQuery(
+                    new Term(this.field, term))));
         };
     };
 
+
     public SpanAlterQueryWrapper or (String term) {
-        return this.or(
-            new SpanTermQuery(new Term(this.field, term))
-        );
+        return this.or(new SpanTermQuery(new Term(this.field, term)));
     };
 
+
     public SpanAlterQueryWrapper or (SpanQuery query) {
-        this.alternatives.add(
-            new SpanSimpleQueryWrapper(query)
-        );
+        this.alternatives.add(new SpanSimpleQueryWrapper(query));
         this.isNull = false;
         return this;
     };
 
+
     public SpanAlterQueryWrapper or (SpanQueryWrapper term) {
         if (term.isNull())
             return this;
@@ -82,7 +78,7 @@
         if (term.isOptional())
             this.isOptional = true;
 
-        this.alternatives.add( term );
+        this.alternatives.add(term);
 
         if (term.maybeUnsorted())
             this.maybeUnsorted = true;
@@ -92,37 +88,37 @@
         return this;
     };
 
+
     public SpanAlterQueryWrapper or (SpanRegexQueryWrapper term) {
-        this.alternatives.add( term );
+        this.alternatives.add(term);
         this.isNull = false;
         return this;
     };
 
+
     public SpanAlterQueryWrapper or (SpanWildcardQueryWrapper wc) {
-        this.alternatives.add( wc );
+        this.alternatives.add(wc);
         this.isNull = false;
         return this;
     };
 
+
     @Override
-    public SpanQuery toQuery() throws QueryException {
+    public SpanQuery toQuery () throws QueryException {
         if (this.isNull || this.alternatives.size() == 0)
             return (SpanQuery) null;
-	    
+
         if (this.alternatives.size() == 1) {
-            return (SpanQuery) this.alternatives.get(0).
-                retrieveNode(this.retrieveNode).
-                toQuery();
+            return (SpanQuery) this.alternatives.get(0)
+                    .retrieveNode(this.retrieveNode).toQuery();
         };
 
         Iterator<SpanQueryWrapper> clause = this.alternatives.iterator();
-        SpanOrQuery soquery = new SpanOrQuery(
-            clause.next().retrieveNode(this.retrieveNode).toQuery()
-        );
+        SpanOrQuery soquery = new SpanOrQuery(clause.next()
+                .retrieveNode(this.retrieveNode).toQuery());
         while (clause.hasNext()) {
-            soquery.addClause(
-                clause.next().retrieveNode(this.retrieveNode).toQuery()
-            );
+            soquery.addClause(clause.next().retrieveNode(this.retrieveNode)
+                    .toQuery());
         };
         return (SpanQuery) soquery;
     };
diff --git a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanAttributeQueryWrapper.java b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanAttributeQueryWrapper.java
index 87c9d90..90e9a2b 100644
--- a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanAttributeQueryWrapper.java
+++ b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanAttributeQueryWrapper.java
@@ -13,40 +13,44 @@
 
     private SpanQueryWrapper subquery;
 
-	public SpanAttributeQueryWrapper(SpanQueryWrapper sqw) {
-		if (sqw == null) {
-			isNull = true;
-			return;
-		}
-		if (sqw.isEmpty()) {
-			isEmpty = true;
-			return;
-		}
+
+    public SpanAttributeQueryWrapper (SpanQueryWrapper sqw) {
+        if (sqw == null) {
+            isNull = true;
+            return;
+        }
+        if (sqw.isEmpty()) {
+            isEmpty = true;
+            return;
+        }
 
         this.subquery = sqw;
-		if (sqw.isNegative) {
-			this.isNegative = true;
+        if (sqw.isNegative) {
+            this.isNegative = true;
         };
 
         if (sqw.maybeUnsorted())
             this.maybeUnsorted = true;
     };
 
+
     @Override
-	public SpanQuery toQuery() throws QueryException {
-    	if (isNull || isEmpty) return null;
-    		
+    public SpanQuery toQuery () throws QueryException {
+        if (isNull || isEmpty)
+            return null;
+
         SpanQuery sq = subquery.retrieveNode(this.retrieveNode).toQuery();
-		if (sq == null) {
-			isNull = true;
-			return null;
-		}
-		
+        if (sq == null) {
+            isNull = true;
+            return null;
+        }
+
         if (sq instanceof SpanTermQuery) {
-			return new SpanAttributeQuery((SpanTermQuery) sq, isNegative, true);
+            return new SpanAttributeQuery((SpanTermQuery) sq, isNegative, true);
         }
         else {
-        	throw new IllegalArgumentException("The subquery is not a SpanTermQuery.");
-        }		
+            throw new IllegalArgumentException(
+                    "The subquery is not a SpanTermQuery.");
+        }
     }
 }
diff --git a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanClassQueryWrapper.java b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanClassQueryWrapper.java
index 96c9a3b..05edf76 100644
--- a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanClassQueryWrapper.java
+++ b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanClassQueryWrapper.java
@@ -12,21 +12,25 @@
 public class SpanClassQueryWrapper extends SpanQueryWrapper {
     private SpanQueryWrapper subquery;
 
+
     public SpanClassQueryWrapper (SpanQueryWrapper subquery, byte number) {
         this.subquery = subquery;
-        this.number   = number;
+        this.number = number;
         if (number != (byte) 0)
             this.hasClass = true;
     };
 
+
     public SpanClassQueryWrapper (SpanQueryWrapper subquery, short number) {
         this(subquery, (byte) number);
     };
 
+
     public SpanClassQueryWrapper (SpanQueryWrapper subquery, int number) {
         this(subquery, (byte) number);
     };
 
+
     public SpanClassQueryWrapper (SpanQueryWrapper subquery) {
         this(subquery, (byte) 0);
     };
@@ -63,13 +67,15 @@
 
 
     public SpanQuery toQuery () throws QueryException {
-		if (this.subquery.isNull())
+        if (this.subquery.isNull())
             return (SpanQuery) null;
 
-        SpanQuery sq = (SpanQuery) this.subquery.retrieveNode(this.retrieveNode).toQuery();
+        SpanQuery sq = (SpanQuery) this.subquery
+                .retrieveNode(this.retrieveNode).toQuery();
 
-        if (sq == null) return (SpanQuery) null;
-	
+        if (sq == null)
+            return (SpanQuery) null;
+
         if (this.number == (byte) 0) {
             return new SpanClassQuery(sq);
         };
diff --git a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanElementQueryWrapper.java b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanElementQueryWrapper.java
index c12f1dd..bb9ddc2 100644
--- a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanElementQueryWrapper.java
+++ b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanElementQueryWrapper.java
@@ -18,6 +18,7 @@
     String element;
     String field;
 
+
     public SpanElementQueryWrapper (String field, String element) {
         this.field = field;
         this.element = element;
diff --git a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanFocusQueryWrapper.java b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanFocusQueryWrapper.java
index 19269ae..adcce08 100644
--- a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanFocusQueryWrapper.java
+++ b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanFocusQueryWrapper.java
@@ -24,43 +24,50 @@
     private SpanQueryWrapper subquery;
     private byte number;
 
+
     public SpanFocusQueryWrapper (SpanQueryWrapper subquery, byte number) {
-	this.subquery = subquery;
-	this.number = number;
+        this.subquery = subquery;
+        this.number = number;
     };
 
+
     public SpanFocusQueryWrapper (SpanQueryWrapper subquery, short number) {
-	this.subquery = subquery;
-	this.number = (byte) number;
+        this.subquery = subquery;
+        this.number = (byte) number;
     };
 
+
     public SpanFocusQueryWrapper (SpanQueryWrapper subquery, int number) {
-	this.subquery = subquery;
-	this.number = (byte) number;
+        this.subquery = subquery;
+        this.number = (byte) number;
     };
 
+
     public SpanFocusQueryWrapper (SpanQueryWrapper subquery) {
-	this.subquery = subquery;
-	this.number = (byte) 1;
+        this.subquery = subquery;
+        this.number = (byte) 1;
     };
 
+
     public SpanQuery toQuery () throws QueryException {
         if (this.subquery.isNull())
             return (SpanQuery) null;
-        return new SpanFocusQuery(
-            this.subquery.retrieveNode(this.retrieveNode).toQuery(), this.number
-        );
+        return new SpanFocusQuery(this.subquery.retrieveNode(this.retrieveNode)
+                .toQuery(), this.number);
     };
 
+
     public boolean isOptional () {
-	return this.subquery.isOptional();
+        return this.subquery.isOptional();
     };
 
+
     public boolean isNull () {
-	return this.subquery.isNull();
+        return this.subquery.isNull();
     };
 
+
     public boolean isNegative () {
-	return this.subquery.isNegative();
+        return this.subquery.isNegative();
     };
 };
diff --git a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanQueryWrapper.java b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanQueryWrapper.java
index dd6bac6..987d21a 100644
--- a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanQueryWrapper.java
+++ b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanQueryWrapper.java
@@ -11,14 +11,14 @@
  * that add certain information,
  * necessary for the correct and optimized
  * deserialization of nested queries.
- *
+ * 
  * This class is meant to be extended by
  * wrapper classes.
- *
+ * 
  * <strong>Warning</strong>: SpanQueryWrapper
- * will probably be merged with {@link KrillQuery}
- * in near future. Use of this API is on your own risk.
- *
+ * will probably be merged with {@link KrillQuery} in near future. Use
+ * of this API is on your own risk.
+ * 
  * @author diewald
  */
 public class SpanQueryWrapper {
@@ -30,21 +30,16 @@
     protected byte number = (byte) 0;
 
     // Boolean properties
-    protected boolean
-        hasClass   = false,
-        isNull     = true,
-        isOptional = false,
-        isNegative = false,
-        isEmpty    = false,
-        isExtended = false,
-        isExtendedToTheRight = false,
-        maybeUnsorted = false,
-        retrieveNode = false;
+    protected boolean hasClass = false, isNull = true, isOptional = false,
+            isNegative = false, isEmpty = false, isExtended = false,
+            isExtendedToTheRight = false, maybeUnsorted = false,
+            retrieveNode = false;
+
 
     /**
      * Serialize the wrapped query and return a SpanQuery.
      * This should be overwritten.
-     *
+     * 
      * @return A {@link SpanQuery} object.
      * @throws QueryException
      */
@@ -56,14 +51,14 @@
     /**
      * Boolean value indicating that the wrapped query
      * is optional.
-     *
+     * 
      * For example the segment denoting an adjective
      * in the following Poliqarp expression is optional.
-     *
+     * 
      * <blockquote><pre>
-     *   the [pos=ADJ]? tree
+     * the [pos=ADJ]? tree
      * </pre></blockquote>
-     *
+     * 
      * @return <tt>true</tt> in case the wrapped query is
      *         optional and <tt>false</tt> in case it is
      *         mandatory.
@@ -77,15 +72,15 @@
      * Boolean value indicating that the wrapped query is
      * <tt>null</tt>, meaning it doesn't match anything at
      * all.
-     *
+     * 
      * For example the segment denoting an adjective
      * in the following Poliqarp expression doen't match
      * anything.
-     *
+     * 
      * <blockquote><pre>
-     *   the [pos=ADJ]{0} tree
+     * the [pos=ADJ]{0} tree
      * </pre></blockquote>
-     *
+     * 
      * @return <tt>true</tt> in case the wrapped query can't
      *         match anything, otherwise <tt>false</tt>.
      */
@@ -99,14 +94,14 @@
     /**
      * Boolean value indicating that the wrapped query matches
      * in case the condition of the query is not true.
-     *
+     * 
      * For example the segment denoting an adjective
      * in the following Poliqarp expression is negative.
-     *
+     * 
      * <blockquote><pre>
-     *   the [pos!=ADJ]
+     * the [pos!=ADJ]
      * </pre></blockquote>
-     *
+     * 
      * @return <tt>true</tt> in case the wrapped query is
      *         negative, otherwise <tt>false</tt>.
      */
@@ -114,18 +109,19 @@
         return this.isNegative;
     };
 
+
     /**
      * Boolean value indicating that the wrapped query has
      * no further condition for matching and therefore
      * matches everywhere.
-     *
+     * 
      * For example the empty segment in the following
      * Poliqarp expression matches without any condition.
-     *
+     * 
      * <blockquote><pre>
-     *   the []
+     * the []
      * </pre></blockquote>
-     *
+     * 
      * @return <tt>true</tt> in case the wrapped query is
      *         empty, otherwise <tt>false</tt>.
      */
@@ -137,14 +133,14 @@
     /**
      * Boolean value indicating that the wrapped query
      * is extended by subquery.
-     *
+     * 
      * For example the segment denoting an adjective may
      * be wrapped as having an extension to the left.
-     *
+     * 
      * <blockquote><pre>
-     *   []{3,4}[base=tree]
+     * []{3,4}[base=tree]
      * </pre></blockquote>
-     *
+     * 
      * @return <tt>true</tt> in case the wrapped query is
      *         extended, otherwise <tt>false</tt>.
      */
@@ -156,18 +152,18 @@
     /**
      * Boolean value indicating that the wrapped query
      * is extended by a subquery to the right.
-     *
+     * 
      * For example the segment denoting the lemma tree
      * may be wrapped as being extended to the right
      * in the following Poliqarp expression.
-     *
+     * 
      * <blockquote><pre>
-     *   [base=tree][]{3,4}
+     * [base=tree][]{3,4}
      * </pre></blockquote>
-     *
+     * 
      * This information is necessary to ensure a match
      * is valid even at the end of a document.
-     *
+     * 
      * @return <tt>true</tt> in case the wrapped query is
      *         extended to the right, otherwise <tt>false</tt>.
      */
@@ -180,21 +176,25 @@
      * Check, if the wrapped query can be used as an
      * anchor query in a sequence, i.e. a query that
      * has a condition that must be positively evaluated.
-     *
+     * 
      * Wrapped queries with positive conditions are neither
      * negative, optional, nor empty.
-     *
+     * 
      * This is the opposite of {@link #maybeExtension}.
-     *
+     * 
      * @return <tt>true</tt> in case the wrapped query
      *         can be used as an anchor in a sequence,
      *         otherwise <tt>false</tt>.
      * @see SpanSequenceQueryWrapper
      */
     public boolean maybeAnchor () {
-        if (this.isNegative()) return false;
-        if (this.isOptional()) return false;
-		if (this.isEmpty()) { return false;}		
+        if (this.isNegative())
+            return false;
+        if (this.isOptional())
+            return false;
+        if (this.isEmpty()) {
+            return false;
+        }
         return true;
     };
 
@@ -203,12 +203,12 @@
      * Check, if the wrapped query can't be used as an
      * anchor query in a sequence, meaning it has to be
      * constructed as an extension to an anchor query.
-     *
+     * 
      * Wrapped queries with negative conditions are either
      * negative, optional, or empty.
-     *
+     * 
      * This is the opposite of {@link #maybeAnchor}.
-     *
+     * 
      * @return <tt>true</tt> in case the wrapped query
      *         has to be used as an extension in a sequence,
      *         otherwise <tt>false</tt>.
@@ -222,12 +222,12 @@
     /**
      * Check, if the wrapped query may need to be sorted
      * on focussing on a specific class.
-     *
+     * 
      * Normally spans are always sorted, but in case of
      * a wrapped relation query, classed operands may
      * be in arbitrary order. When focussing on these
      * classes, the span has to me reordered.
-     *
+     * 
      * @return <tt>true</tt> in case the wrapped query
      *         has to be sorted on focussing,
      *         otherwise <tt>false</tt>.
@@ -240,7 +240,7 @@
     /**
      * Get the minimum number of repetitions of the
      * wrapped query.
-     *
+     * 
      * @return The minimum number of repetions.
      * @see SpanRepetitionQueryWrapper
      */
@@ -252,8 +252,9 @@
     /**
      * Set the minimum number of repetitions of the
      * wrapped query.
-     *
-     * @param min The minimum number of repetions.
+     * 
+     * @param min
+     *            The minimum number of repetions.
      * @return The {@link SpanQueryWrapper} object for chaining.
      */
     public SpanQueryWrapper setMin (int min) {
@@ -265,7 +266,7 @@
     /**
      * Get the maximum number of repetitions of the
      * wrapped query.
-     *
+     * 
      * @return The maximum number of repetions.
      * @see SpanRepetitionQueryWrapper
      */
@@ -277,8 +278,9 @@
     /**
      * Set the maximum number of repetitions of the
      * wrapped query.
-     *
-     * @param max The maximum number of repetions.
+     * 
+     * @param max
+     *            The maximum number of repetions.
      * @return The {@link SpanQueryWrapper} object for chaining.
      */
     public SpanQueryWrapper setMax (int max) {
@@ -290,9 +292,10 @@
     /**
      * Make the query request node information in addition to
      * span information.
-     *
-     * @param retrieve Boolean value saying the wrapper
-     *        has or has not to respect node information.
+     * 
+     * @param retrieve
+     *            Boolean value saying the wrapper
+     *            has or has not to respect node information.
      * @return The {@link SpanQueryWrapper} object for chaining.
      */
     public SpanQueryWrapper retrieveNode (boolean retrieve) {
@@ -314,7 +317,7 @@
     /**
      * Get the class number, if set.
      * Returns <tt>0</tt> in case no class is set.
-     *
+     * 
      * @return The class number.
      */
     public byte getClassNumber () {
@@ -324,8 +327,9 @@
 
     /**
      * Set the class number.
-     *
-     * @param number The class number as a byte value.
+     * 
+     * @param number
+     *            The class number as a byte value.
      * @return The {@link SpanQueryWrapper} object for chaining.
      */
     public SpanQueryWrapper setClassNumber (byte number) {
@@ -337,8 +341,9 @@
 
     /**
      * Set the class number.
-     *
-     * @param number The class number as a short value.
+     * 
+     * @param number
+     *            The class number as a short value.
      * @return The {@link SpanQueryWrapper} object for chaining.
      */
     public SpanQueryWrapper setClassNumber (short number) {
@@ -348,8 +353,9 @@
 
     /**
      * Set the class number.
-     *
-     * @param number The class number as an integer value.
+     * 
+     * @param number
+     *            The class number as an integer value.
      * @return The {@link SpanQueryWrapper} object for chaining.
      */
     public SpanQueryWrapper setClassNumber (int number) {
@@ -359,18 +365,15 @@
 
     /**
      * Serialize the wrapped query to a string representation.
-     *
+     * 
      * This is meant to be overwritten.
-     *
+     * 
      * @return A string containg the query representation.
      */
     public String toString () {
-        String string = "" +
-            (this.isNull() ? "isNull" : "notNull") +
-            "-" +
-            (this.isEmpty() ? "isEmpty" : "notEmpty") +
-            "-" +
-            (this.isOptional() ? "isOptional" : "notOptional");
+        String string = "" + (this.isNull() ? "isNull" : "notNull") + "-"
+                + (this.isEmpty() ? "isEmpty" : "notEmpty") + "-"
+                + (this.isOptional() ? "isOptional" : "notOptional");
         return string;
     };
 };
diff --git a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanRegexQueryWrapper.java b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanRegexQueryWrapper.java
index d39a960..24317ad 100644
--- a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanRegexQueryWrapper.java
+++ b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanRegexQueryWrapper.java
@@ -16,35 +16,43 @@
 public class SpanRegexQueryWrapper extends SpanQueryWrapper {
     private SpanQuery query;
 
+
     public SpanRegexQueryWrapper (String field, String re) {
-	this(field, re, RegExp.ALL, false);
+        this(field, re, RegExp.ALL, false);
     };
 
+
     public SpanRegexQueryWrapper (String field, String re, int flags) {
-	this(field, re, flags, false);
+        this(field, re, flags, false);
     };
 
-    public SpanRegexQueryWrapper (String field, String re, boolean caseinsensitive) {
-	this(field, re, RegExp.ALL, caseinsensitive);
+
+    public SpanRegexQueryWrapper (String field, String re,
+                                  boolean caseinsensitive) {
+        this(field, re, RegExp.ALL, caseinsensitive);
     };
 
-    public SpanRegexQueryWrapper (String field, String re, int flags, boolean caseinsensitive) {
-	if (caseinsensitive) {
-	    if (re.startsWith("s:")) {
-		re = re.replaceFirst("s:", "i:");
-	    };
-	    re = re.toLowerCase();
-	};
-	RegexpQuery requery = new RegexpQuery(new Term(field, re), flags);
-	query = new SpanMultiTermQueryWrapper<RegexpQuery>( requery );
+
+    public SpanRegexQueryWrapper (String field, String re, int flags,
+                                  boolean caseinsensitive) {
+        if (caseinsensitive) {
+            if (re.startsWith("s:")) {
+                re = re.replaceFirst("s:", "i:");
+            };
+            re = re.toLowerCase();
+        };
+        RegexpQuery requery = new RegexpQuery(new Term(field, re), flags);
+        query = new SpanMultiTermQueryWrapper<RegexpQuery>(requery);
 
     };
 
-    public SpanQuery toQuery() {
-	return this.query;
+
+    public SpanQuery toQuery () {
+        return this.query;
     };
 
+
     public boolean isNull () {
-	return false;
+        return false;
     };
 };
diff --git a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanRepetitionQueryWrapper.java b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanRepetitionQueryWrapper.java
index 8785098..8a8a008 100644
--- a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanRepetitionQueryWrapper.java
+++ b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanRepetitionQueryWrapper.java
@@ -15,13 +15,16 @@
     private SpanQueryWrapper subquery;
 
     // Logger
-    private final static Logger log = LoggerFactory.getLogger(SpanSequenceQueryWrapper.class);
+    private final static Logger log = LoggerFactory
+            .getLogger(SpanSequenceQueryWrapper.class);
+
 
     public SpanRepetitionQueryWrapper () {
         this.isEmpty = true;
         this.isNull = false;
     };
 
+
     // This is for exact enumbered repetition, like in a{3}
     public SpanRepetitionQueryWrapper (SpanQueryWrapper subquery, int exact) {
         if (!subquery.isEmpty()) {
@@ -39,13 +42,15 @@
             this.max = 0;
             return;
         };
-	
+
         this.min = exact;
         this.max = exact;
     };
 
+
     // This is for a range of repetitions, like in a{2,3}, a{,4}, a{3,}, a+, a*, a?
-    public SpanRepetitionQueryWrapper (SpanQueryWrapper subquery, int min, int max) {
+    public SpanRepetitionQueryWrapper (SpanQueryWrapper subquery, int min,
+                                       int max) {
 
         if (!subquery.isEmpty()) {
             this.subquery = subquery;
@@ -64,14 +69,14 @@
         else {
             this.isNull = false;
         };
-	
+
         if (min == 0) {
             this.isOptional = true;
             min = 1;
             if (max == 0)
                 this.isNull = true;
         };
-        
+
         this.min = min;
         this.max = max;
     };
@@ -83,7 +88,7 @@
         // The query is null
         if (this.isNull)
             return (SpanQuery) null;
-        
+
         if (this.isEmpty) {
             log.error("You can't queryize an empty query");
             return (SpanQuery) null;
@@ -94,14 +99,11 @@
             return this.subquery.retrieveNode(this.retrieveNode).toQuery();
 
         // That's a fine repetition query
-        return new SpanRepetitionQuery(
-            this.subquery.retrieveNode(this.retrieveNode).toQuery(),
-            this.min,
-            this.max,
-            true
-        );
+        return new SpanRepetitionQuery(this.subquery.retrieveNode(
+                this.retrieveNode).toQuery(), this.min, this.max, true);
     };
 
+
     public boolean isNegative () {
         if (this.subquery == null)
             return false;
diff --git a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSegmentQueryWrapper.java b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSegmentQueryWrapper.java
index 3265e15..f89c5b7 100644
--- a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSegmentQueryWrapper.java
+++ b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSegmentQueryWrapper.java
@@ -18,10 +18,13 @@
 
 /**
  * @author Nils Diewald
- *
- * Creates a query object for segments, i.e. terms in a term vector
- * sharing the same position. A SpanSegment can include simple string terms,
- * regular expressions and alternatives. These elements can also be excluded.
+ * 
+ *         Creates a query object for segments, i.e. terms in a term
+ *         vector
+ *         sharing the same position. A SpanSegment can include simple
+ *         string terms,
+ *         regular expressions and alternatives. These elements can
+ *         also be excluded.
  */
 
 public class SpanSegmentQueryWrapper extends SpanQueryWrapper {
@@ -29,218 +32,243 @@
     public ArrayList<SpanQueryWrapper> exclusive;
     private String field;
 
+
     /**
      * Constructor.
-     *
-     * @param field The field name
+     * 
+     * @param field
+     *            The field name
      */
     public SpanSegmentQueryWrapper (String field) {
-	this.field = field;
-	this.inclusive = new ArrayList<SpanQueryWrapper>();
-	this.exclusive = new ArrayList<SpanQueryWrapper>();
+        this.field = field;
+        this.inclusive = new ArrayList<SpanQueryWrapper>();
+        this.exclusive = new ArrayList<SpanQueryWrapper>();
     };
 
+
     /**
      * Constructor.
-     *
-     * @param field The field name
-     * @param terms An arbitrary number of terms
+     * 
+     * @param field
+     *            The field name
+     * @param terms
+     *            An arbitrary number of terms
      */
     public SpanSegmentQueryWrapper (String field, String ... terms) {
-	this(field);
-	for (int i = 0; i < terms.length; i++) {
-	    this.inclusive.add(new SpanSimpleQueryWrapper(field, terms[i]));
-	    this.isNull = false;
-	};
+        this(field);
+        for (int i = 0; i < terms.length; i++) {
+            this.inclusive.add(new SpanSimpleQueryWrapper(field, terms[i]));
+            this.isNull = false;
+        };
     };
 
+
     public SpanSegmentQueryWrapper (String field, SpanRegexQueryWrapper re) {
-	this(field);
-	this.inclusive.add(re);
-	this.isNull = false;
+        this(field);
+        this.inclusive.add(re);
+        this.isNull = false;
     };
 
+
     public SpanSegmentQueryWrapper (String field, SpanAlterQueryWrapper alter) {
-	this(field);
-	if (!alter.isNull()) {
-	    if (alter.isNegative())
-		this.isNegative = true;
-	    this.inclusive.add(alter);
-	    this.isNull = false;
-	};
+        this(field);
+        if (!alter.isNull()) {
+            if (alter.isNegative())
+                this.isNegative = true;
+            this.inclusive.add(alter);
+            this.isNull = false;
+        };
     };
 
+
     public SpanSegmentQueryWrapper (String field, SpanSegmentQueryWrapper ssq) {
-	this(field);
+        this(field);
 
-	if (!ssq.isNull()) {
-	    Iterator<SpanQueryWrapper> clause = ssq.inclusive.iterator();
-	    while (clause.hasNext()) {
-		this.inclusive.add( (SpanQueryWrapper) clause.next() ); 
-		// .clone()
-	    };
+        if (!ssq.isNull()) {
+            Iterator<SpanQueryWrapper> clause = ssq.inclusive.iterator();
+            while (clause.hasNext()) {
+                this.inclusive.add((SpanQueryWrapper) clause.next());
+                // .clone()
+            };
 
-	    clause = ssq.exclusive.iterator();
-	    while (clause.hasNext()) {
-		this.exclusive.add( (SpanQueryWrapper) clause.next() );  
-		// .clone()
-	    };
-	    this.isNull = false;
-	};
+            clause = ssq.exclusive.iterator();
+            while (clause.hasNext()) {
+                this.exclusive.add((SpanQueryWrapper) clause.next());
+                // .clone()
+            };
+            this.isNull = false;
+        };
     };
 
+
     public SpanSegmentQueryWrapper with (String term) {
-	this.inclusive.add(new SpanSimpleQueryWrapper(field, term));
-	this.isNull = false;
-	return this;
+        this.inclusive.add(new SpanSimpleQueryWrapper(field, term));
+        this.isNull = false;
+        return this;
     };
 
+
     public SpanSegmentQueryWrapper with (SpanQueryWrapper re) {
-	this.inclusive.add((SpanQueryWrapper) re);
-	this.isNull = false;
-	return this;
+        this.inclusive.add((SpanQueryWrapper) re);
+        this.isNull = false;
+        return this;
     };
 
+
     public SpanSegmentQueryWrapper with (SpanWildcardQueryWrapper wc) {
-	this.inclusive.add((SpanQueryWrapper) wc);
-	this.isNull = false;
-	return this;
+        this.inclusive.add((SpanQueryWrapper) wc);
+        this.isNull = false;
+        return this;
     };
 
+
     public SpanSegmentQueryWrapper with (SpanAlterQueryWrapper alter) {
-	if (!alter.isNull()) {
-	    if (alter.isNegative())
-		this.isNegative = true;
-	    this.inclusive.add(alter);
-	    this.isNull = false;
-	};
-	return this;
+        if (!alter.isNull()) {
+            if (alter.isNegative())
+                this.isNegative = true;
+            this.inclusive.add(alter);
+            this.isNull = false;
+        };
+        return this;
     };
 
+
     // Identical to without
     public SpanSegmentQueryWrapper with (SpanSegmentQueryWrapper seg) {
-	if (!seg.isNull()) {
-	    for (SpanQueryWrapper sq : seg.inclusive) {
-		this.inclusive.add(sq);
-	    };
-	    for (SpanQueryWrapper sq : seg.exclusive) {
-		this.exclusive.add(sq);
-	    };
-	    this.isNull = false;
-	};
-	return this;
+        if (!seg.isNull()) {
+            for (SpanQueryWrapper sq : seg.inclusive) {
+                this.inclusive.add(sq);
+            };
+            for (SpanQueryWrapper sq : seg.exclusive) {
+                this.exclusive.add(sq);
+            };
+            this.isNull = false;
+        };
+        return this;
     };
 
+
     public SpanSegmentQueryWrapper without (String term) {
-	this.exclusive.add(new SpanSimpleQueryWrapper(field, term));
-	this.isNull = false;
-	return this;
+        this.exclusive.add(new SpanSimpleQueryWrapper(field, term));
+        this.isNull = false;
+        return this;
     };
 
+
     // TODO: THESE MAYBE NOT NECESSARY:
 
     public SpanSegmentQueryWrapper without (SpanRegexQueryWrapper re) {
-	this.exclusive.add(re);
-	this.isNull = false;
-	return this;
+        this.exclusive.add(re);
+        this.isNull = false;
+        return this;
     };
 
+
     public SpanSegmentQueryWrapper without (SpanWildcardQueryWrapper wc) {
-	this.exclusive.add(wc);
-	this.isNull = false;
-	return this;
+        this.exclusive.add(wc);
+        this.isNull = false;
+        return this;
     };
 
+
     public SpanSegmentQueryWrapper without (SpanAlterQueryWrapper alter) {
-	if (!alter.isNull()) {
-	    if (alter.isNegative()) {
-		this.inclusive.add(alter);
-	    }
-	    else {
-		this.exclusive.add(alter);
-	    };
-	    this.isNull = false;
-	};
-	return this;
+        if (!alter.isNull()) {
+            if (alter.isNegative()) {
+                this.inclusive.add(alter);
+            }
+            else {
+                this.exclusive.add(alter);
+            };
+            this.isNull = false;
+        };
+        return this;
     };
 
+
     public SpanSegmentQueryWrapper without (SpanSegmentQueryWrapper seg) {
-	if (!seg.isNull()) {
-	    this.with(seg);
-	    this.isNull = false;
-	};
-	isNegative = true;
-	return this;
+        if (!seg.isNull()) {
+            this.with(seg);
+            this.isNull = false;
+        };
+        isNegative = true;
+        return this;
     };
 
+
     public SpanQuery toQuery () throws QueryException {
-	if (this.isNull || (this.inclusive.size() + this.exclusive.size() == 0)) {
-	    return (SpanQuery) null;
-	}
-	else if (this.inclusive.size() >= 1 && this.exclusive.size() >= 1) {
-	    return (SpanQuery) new SpanNotQuery(
-		this._listToQuery(this.inclusive),
-	        this._listToOrQuery(this.exclusive)
-            );
-	}
+        if (this.isNull || (this.inclusive.size() + this.exclusive.size() == 0)) {
+            return (SpanQuery) null;
+        }
+        else if (this.inclusive.size() >= 1 && this.exclusive.size() >= 1) {
+            return (SpanQuery) new SpanNotQuery(
+                    this._listToQuery(this.inclusive),
+                    this._listToOrQuery(this.exclusive));
+        }
 
-	// These are now identical but may be negative
-	else if (this.inclusive.size() == 0 && this.exclusive.size() >= 1) {
-	    return (SpanQuery) this._listToQuery(this.exclusive);
-	}
-	else if (this.inclusive.size() >= 1 && this.exclusive.size() == 0) {
-	    return (SpanQuery) this._listToQuery(this.inclusive);
-	};
+        // These are now identical but may be negative
+        else if (this.inclusive.size() == 0 && this.exclusive.size() >= 1) {
+            return (SpanQuery) this._listToQuery(this.exclusive);
+        }
+        else if (this.inclusive.size() >= 1 && this.exclusive.size() == 0) {
+            return (SpanQuery) this._listToQuery(this.inclusive);
+        };
 
-	return (SpanQuery) null;
+        return (SpanQuery) null;
     };
 
-    private SpanQuery _listToQuery (ArrayList<SpanQueryWrapper> list) throws QueryException {
-	SpanQuery query = list.get(0).toQuery();
 
-	for (int i = 1; i < list.size(); i++) {
-	    query = new SpanSegmentQuery(query, list.get(i).toQuery());
-	};
+    private SpanQuery _listToQuery (ArrayList<SpanQueryWrapper> list)
+            throws QueryException {
+        SpanQuery query = list.get(0).toQuery();
 
-	return (SpanQuery) query;
+        for (int i = 1; i < list.size(); i++) {
+            query = new SpanSegmentQuery(query, list.get(i).toQuery());
+        };
+
+        return (SpanQuery) query;
     };
 
-    private SpanQuery _listToOrQuery (ArrayList<SpanQueryWrapper> list) throws QueryException {
-	if (list.size() == 1) {
-	    return (SpanQuery) list.get(0).toQuery();
-	};
 
-	Iterator<SpanQueryWrapper> clause = list.iterator();
-	SpanOrQuery soquery = new SpanOrQuery( clause.next().toQuery() );
-	while (clause.hasNext()) {
-	    soquery.addClause( clause.next().toQuery() );
-	};
-	return (SpanQuery) soquery;
+    private SpanQuery _listToOrQuery (ArrayList<SpanQueryWrapper> list)
+            throws QueryException {
+        if (list.size() == 1) {
+            return (SpanQuery) list.get(0).toQuery();
+        };
+
+        Iterator<SpanQueryWrapper> clause = list.iterator();
+        SpanOrQuery soquery = new SpanOrQuery(clause.next().toQuery());
+        while (clause.hasNext()) {
+            soquery.addClause(clause.next().toQuery());
+        };
+        return (SpanQuery) soquery;
     };
 
+
     public SpanSegmentQueryWrapper clone () {
-	return new SpanSegmentQueryWrapper(this.field, this);
+        return new SpanSegmentQueryWrapper(this.field, this);
     };
 
+
     public boolean isOptional () {
-	return false;
+        return false;
     };
 
+
     public boolean isNegative () {
-	if (this.inclusive.size() == 0 && this.exclusive.size() >= 1) {
-	    return true;
-	};
-	return false;
+        if (this.inclusive.size() == 0 && this.exclusive.size() >= 1) {
+            return true;
+        };
+        return false;
     };
 
+
     public void makeNegative () {
-	/*
-	  TODO: THIS IS A BIT MORE COMPLICATED!
-	  and and or groups have to be switched
-	 */
+        /*
+          TODO: THIS IS A BIT MORE COMPLICATED!
+          and and or groups have to be switched
+         */
 
-	this.exclusive.addAll(this.inclusive);
-	this.inclusive.clear();
+        this.exclusive.addAll(this.inclusive);
+        this.inclusive.clear();
     };
 };
-
diff --git a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSequenceQueryWrapper.java b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSequenceQueryWrapper.java
index 97cb24f..78a80db 100644
--- a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSequenceQueryWrapper.java
+++ b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSequenceQueryWrapper.java
@@ -28,11 +28,11 @@
 /**
  * Deserialize complexe sequence queries to SpanQueries.
  * This will try to make queries work, that by simple nesting won't
- * (like queries with empty sequences), and will optimize queries 
+ * (like queries with empty sequences), and will optimize queries
  * if possible.
- *
+ * 
  * Todo: Synopsis
- *
+ * 
  * @author diewald
  */
 public class SpanSequenceQueryWrapper extends SpanQueryWrapper {
@@ -41,14 +41,13 @@
     private ArrayList<DistanceConstraint> constraints;
 
     private QueryException constraintException = null;
-    
-    private final String limitationError =
-        "Distance constraints not supported with " +
-        "empty or negative operands";
+
+    private final String limitationError = "Distance constraints not supported with "
+            + "empty or negative operands";
 
     // Logger
-    private final static Logger log =
-        LoggerFactory.getLogger(SpanSequenceQueryWrapper.class);
+    private final static Logger log = LoggerFactory
+            .getLogger(SpanSequenceQueryWrapper.class);
 
     // This advices the java compiler to ignore all loggings
     public static final boolean DEBUG = false;
@@ -61,9 +60,10 @@
 
     /**
      * Constructs a new object for sequence deserialization.
-     *
-     * @param field The fields the nested SpanQueries should
-     *        search in.
+     * 
+     * @param field
+     *            The fields the nested SpanQueries should
+     *            search in.
      */
     public SpanSequenceQueryWrapper (String field) {
         this.field = field;
@@ -74,26 +74,25 @@
     /**
      * Constructs a new object for sequence deserialization
      * by passing a sequence of terms.
-     *
+     * 
      * <blockquote><pre>
-     *   SpanSequenceQueryWrapper ssqw =
-     *     new SpanSequenceQueryWrapper("tokens", "der", "Baum");
-     *   System.out.println(ssqw.toQuery());
-     *   // spanNext(tokens:der, tokens:Baum)
+     * SpanSequenceQueryWrapper ssqw =
+     * new SpanSequenceQueryWrapper("tokens", "der", "Baum");
+     * System.out.println(ssqw.toQuery());
+     * // spanNext(tokens:der, tokens:Baum)
      * </pre></blockquote>
-     *
-     * @param field The fields the nested SpanQueries should
-     *        search in.
-     * @param terms[] Arbitrary list of terms to search for.
+     * 
+     * @param field
+     *            The fields the nested SpanQueries should
+     *            search in.
+     * @param terms
+     *            [] Arbitrary list of terms to search for.
      */
     public SpanSequenceQueryWrapper (String field, String ... terms) {
         this(field);
         for (int i = 0; i < terms.length; i++) {
-            this.segments.add(
-                new SpanSimpleQueryWrapper(
-                    new SpanTermQuery(new Term(field, terms[i]))
-                )
-            );
+            this.segments.add(new SpanSimpleQueryWrapper(new SpanTermQuery(
+                    new Term(field, terms[i]))));
         };
         // Query can't be null anymore
         this.isNull = false;
@@ -103,8 +102,9 @@
     /**
      * Constructs a new object for sequence deserialization
      * by passing a single {@link SpanQuery} object.
-     *
-     * @param query Initial {@link SpanQuery} to search for.
+     * 
+     * @param query
+     *            Initial {@link SpanQuery} to search for.
      */
     public SpanSequenceQueryWrapper (SpanQuery query) {
         this(query.getField());
@@ -117,8 +117,9 @@
      * Constructs a new object for sequence deserialization
      * by passing a single {@link SpanQueryWrapper} object.
      * These wrapper queries may be optional, negative, or empty.
-     *
-     * @param query Initial {@link SpanQueryWrapper} to search for.
+     * 
+     * @param query
+     *            Initial {@link SpanQueryWrapper} to search for.
      */
     public SpanSequenceQueryWrapper (String field, SpanQueryWrapper sswq) {
         this(field);
@@ -153,17 +154,19 @@
 
     /**
      * Append a new term to the sequence.
-     *
+     * 
      * <blockquote><pre>
-     *   SpanSequenceQueryWrapper ssqw =
-     *     new SpanSequenceQueryWrapper("tokens");
-     *   ssqw.append("der").append("Baum");
-     *   System.out.println(ssqw.toQuery());
-     *   // spanNext(tokens:der, tokens:Baum)
+     * SpanSequenceQueryWrapper ssqw =
+     * new SpanSequenceQueryWrapper("tokens");
+     * ssqw.append("der").append("Baum");
+     * System.out.println(ssqw.toQuery());
+     * // spanNext(tokens:der, tokens:Baum)
      * </pre></blockquote>
-     *
-     * @param term A new string to search for.
-     * @return The {@link SpanSequenceQueryWrapper} object for chaining.
+     * 
+     * @param term
+     *            A new string to search for.
+     * @return The {@link SpanSequenceQueryWrapper} object for
+     *         chaining.
      */
     public SpanSequenceQueryWrapper append (String term) {
         return this.append(new SpanTermQuery(new Term(field, term)));
@@ -172,9 +175,11 @@
 
     /**
      * Append a new {@link SpanQuery} object to the sequence.
-     *
-     * @param query A new {@link SpanQuery} to search for.
-     * @return The {@link SpanSequenceQueryWrapper} object for chaining.
+     * 
+     * @param query
+     *            A new {@link SpanQuery} to search for.
+     * @return The {@link SpanSequenceQueryWrapper} object for
+     *         chaining.
      */
     public SpanSequenceQueryWrapper append (SpanQuery query) {
         return this.append(new SpanSimpleQueryWrapper(query));
@@ -183,11 +188,13 @@
 
     /**
      * Append a new {@link SpanQueryWrapper} object to the sequence.
-     *
-     * @param query A new {@link SpanQueryWrapper} to search for.
-     * @return The {@link SpanSequenceQueryWrapper} object for chaining.
+     * 
+     * @param query
+     *            A new {@link SpanQueryWrapper} to search for.
+     * @return The {@link SpanSequenceQueryWrapper} object for
+     *         chaining.
      */
-	public SpanSequenceQueryWrapper append(SpanQueryWrapper ssq) {
+    public SpanSequenceQueryWrapper append (SpanQueryWrapper ssq) {
 
         // The wrapper is null - ignore this in the sequence
         if (ssq.isNull())
@@ -213,8 +220,8 @@
             SpanSequenceQueryWrapper ssqw = (SpanSequenceQueryWrapper) ssq;
 
             // There are no constraints and the order is equal - Flatten!
-            if (!this.hasConstraints() && !ssqw.hasConstraints() &&
-                this.isInOrder() == ssqw.isInOrder()) {
+            if (!this.hasConstraints() && !ssqw.hasConstraints()
+                    && this.isInOrder() == ssqw.isInOrder()) {
                 for (int i = 0; i < ssqw.segments.size(); i++) {
                     this.append(ssqw.segments.get(i));
                 };
@@ -237,17 +244,19 @@
 
     /**
      * Prepend a new term to the sequence.
-     *
+     * 
      * <blockquote><pre>
-     *   SpanSequenceQueryWrapper ssqw =
-     *     new SpanSequenceQueryWrapper("tokens", "Baum");
-     *   ssqw.prepend("der");
-     *   System.out.println(ssqw.toQuery());
-     *   // spanNext(tokens:der, tokens:Baum)
+     * SpanSequenceQueryWrapper ssqw =
+     * new SpanSequenceQueryWrapper("tokens", "Baum");
+     * ssqw.prepend("der");
+     * System.out.println(ssqw.toQuery());
+     * // spanNext(tokens:der, tokens:Baum)
      * </pre></blockquote>
-     *
-     * @param term A new string to search for.
-     * @return The {@link SpanSequenceQueryWrapper} object for chaining.
+     * 
+     * @param term
+     *            A new string to search for.
+     * @return The {@link SpanSequenceQueryWrapper} object for
+     *         chaining.
      */
     public SpanSequenceQueryWrapper prepend (String term) {
         return this.prepend(new SpanTermQuery(new Term(field, term)));
@@ -256,9 +265,11 @@
 
     /**
      * Prepend a new {@link SpanQuery} object to the sequence.
-     *
-     * @param query A new {@link SpanQuery} to search for.
-     * @return The {@link SpanSequenceQueryWrapper} object for chaining.
+     * 
+     * @param query
+     *            A new {@link SpanQuery} to search for.
+     * @return The {@link SpanSequenceQueryWrapper} object for
+     *         chaining.
      */
     public SpanSequenceQueryWrapper prepend (SpanQuery query) {
         return this.prepend(new SpanSimpleQueryWrapper(query));
@@ -267,9 +278,11 @@
 
     /**
      * Prepend a new {@link SpanQueryWrapper} object to the sequence.
-     *
-     * @param query A new {@link SpanQueryWrapper} to search for.
-     * @return The {@link SpanSequenceQueryWrapper} object for chaining.
+     * 
+     * @param query
+     *            A new {@link SpanQueryWrapper} to search for.
+     * @return The {@link SpanSequenceQueryWrapper} object for
+     *         chaining.
      */
     public SpanSequenceQueryWrapper prepend (SpanQueryWrapper ssq) {
 
@@ -292,9 +305,8 @@
 
             // There are no constraints and the order is equal - Flatten!
             SpanSequenceQueryWrapper ssqw = (SpanSequenceQueryWrapper) ssq;
-            if (!this.hasConstraints() &&
-                !ssqw.hasConstraints() &&
-                this.isInOrder() == ssqw.isInOrder()) {
+            if (!this.hasConstraints() && !ssqw.hasConstraints()
+                    && this.isInOrder() == ssqw.isInOrder()) {
                 for (int i = ssqw.segments.size() - 1; i >= 0; i--) {
                     this.prepend(ssqw.segments.get(i));
                 };
@@ -318,21 +330,27 @@
     /**
      * Add a token based sequence constraint (aka distance constraint)
      * to the sequence.
-     *
+     * 
      * Multiple constraints are supported.
-     *
+     * 
      * A minimum value of zero means, there may be an overlap,
-     * a minimum value of 1 means, there is no token between the spans.
-     * It's weird - we know and dislike that. That's why we have to say:
-     *
-     * <strong>Warning!</strong> Sequence constraints are experimental and
+     * a minimum value of 1 means, there is no token between the
+     * spans.
+     * It's weird - we know and dislike that. That's why we have to
+     * say:
+     * 
+     * <strong>Warning!</strong> Sequence constraints are experimental
+     * and
      * may (hopefully) change in future versions!
-     *
-     * @param min The minimum number of tokens between the elements
-     *        of the sequence.
-     * @param max The minimum number of tokens between the elements
-     *        of the sequence.
-     * @return The {@link SpanSequenceQueryWrapper} object for chaining.
+     * 
+     * @param min
+     *            The minimum number of tokens between the elements
+     *            of the sequence.
+     * @param max
+     *            The minimum number of tokens between the elements
+     *            of the sequence.
+     * @return The {@link SpanSequenceQueryWrapper} object for
+     *         chaining.
      * @see DistanceConstraint
      */
     public SpanSequenceQueryWrapper withConstraint (int min, int max) {
@@ -345,29 +363,38 @@
      * to the sequence with an exclusion constraint, meaning
      * the constraint is fine in case the operands are <em>not</em>
      * within the distance.
-     *
+     * 
      * Multiple constraints are supported.
-     *
+     * 
      * A minimum value of zero means, there may be an overlap,
-     * a minimum value of 1 means, there is no token between the spans.
-     * It's weird - we know and dislike that. That's why we have to say:
-     *
-     * <strong>Warning!</strong> Sequence constraints are experimental and
+     * a minimum value of 1 means, there is no token between the
+     * spans.
+     * It's weird - we know and dislike that. That's why we have to
+     * say:
+     * 
+     * <strong>Warning!</strong> Sequence constraints are experimental
+     * and
      * may (hopefully) change in future versions!
-     *
-     * @param min The minimum number of tokens between the elements
-     *        of the sequence.
-     * @param max The minimum number of tokens between the elements
-     *        of the sequence.
-     * @param exclusion Boolean value indicating, the distance constraint
-     *        has to fail.
-     * @return The {@link SpanSequenceQueryWrapper} object for chaining.
+     * 
+     * @param min
+     *            The minimum number of tokens between the elements
+     *            of the sequence.
+     * @param max
+     *            The minimum number of tokens between the elements
+     *            of the sequence.
+     * @param exclusion
+     *            Boolean value indicating, the distance constraint
+     *            has to fail.
+     * @return The {@link SpanSequenceQueryWrapper} object for
+     *         chaining.
      * @see DistanceConstraint
      */
-    public SpanSequenceQueryWrapper withConstraint (int min, int max, boolean exclusion) {
+    public SpanSequenceQueryWrapper withConstraint (int min, int max,
+            boolean exclusion) {
         if (this.constraints == null)
             this.constraints = new ArrayList<DistanceConstraint>(1);
-        this.constraints.add(new DistanceConstraint(min, max, this.isInOrder, exclusion));
+        this.constraints.add(new DistanceConstraint(min, max, this.isInOrder,
+                exclusion));
         return this;
     };
 
@@ -377,29 +404,38 @@
      * to the sequence based on a certain unit.
      * The unit has to be a valid {@link SpanElementQuery} term
      * or <tt>w</tt> for tokens.
-     *
+     * 
      * Multiple constraints are supported.
-     *
+     * 
      * A minimum value of zero means, there may be an overlap,
-     * a minimum value of 1 means, there is no token between the spans.
-     * It's weird - we know and dislike that. That's why we have to say:
-     *
-     * <strong>Warning!</strong> Sequence constraints are experimental and
+     * a minimum value of 1 means, there is no token between the
+     * spans.
+     * It's weird - we know and dislike that. That's why we have to
+     * say:
+     * 
+     * <strong>Warning!</strong> Sequence constraints are experimental
+     * and
      * may (hopefully) change in future versions!
-     *
-     * @param min The minimum number of tokens between the elements
-     *        of the sequence.
-     * @param max The minimum number of tokens between the elements
-     *        of the sequence.
-     * @param unit Unit for distance - will be evaluated to a {@link SpanElementQuery}.
-     * @return The {@link SpanSequenceQueryWrapper} object for chaining.
+     * 
+     * @param min
+     *            The minimum number of tokens between the elements
+     *            of the sequence.
+     * @param max
+     *            The minimum number of tokens between the elements
+     *            of the sequence.
+     * @param unit
+     *            Unit for distance - will be evaluated to a
+     *            {@link SpanElementQuery}.
+     * @return The {@link SpanSequenceQueryWrapper} object for
+     *         chaining.
      * @see DistanceConstraint
      */
-    public SpanSequenceQueryWrapper withConstraint (int min, int max, String unit) {
+    public SpanSequenceQueryWrapper withConstraint (int min, int max,
+            String unit) {
         return this.withConstraint(min, max, unit, false);
     };
 
-    
+
 
     /**
      * Add a sequence constraint (aka distance constraint)
@@ -408,41 +444,50 @@
      * in case the operands are <em>not</em> within the distance.
      * The unit has to be a valid {@link SpanElementQuery} term
      * or <tt>w</tt> for tokens.
-     *
+     * 
      * Multiple constraints are supported.
-     *
+     * 
      * A minimum value of zero means, there may be an overlap,
-     * a minimum value of 1 means, there is no token between the spans.
-     * It's weird - we know and dislike that. That's why we have to say:
-     *
-     * <strong>Warning!</strong> Sequence constraints are experimental and
+     * a minimum value of 1 means, there is no token between the
+     * spans.
+     * It's weird - we know and dislike that. That's why we have to
+     * say:
+     * 
+     * <strong>Warning!</strong> Sequence constraints are experimental
+     * and
      * may (hopefully) change in future versions!
-     *
-     * @param min The minimum number of tokens between the elements
-     *        of the sequence.
-     * @param max The minimum number of tokens between the elements
-     *        of the sequence.
-     * @param unit Unit for distance - will be evaluated to a {@link SpanElementQuery}.
-     * @param exclusion Boolean value indicating, the distance constraint
-     *        has to fail.
-     * @return The {@link SpanSequenceQueryWrapper} object for chaining.
+     * 
+     * @param min
+     *            The minimum number of tokens between the elements
+     *            of the sequence.
+     * @param max
+     *            The minimum number of tokens between the elements
+     *            of the sequence.
+     * @param unit
+     *            Unit for distance - will be evaluated to a
+     *            {@link SpanElementQuery}.
+     * @param exclusion
+     *            Boolean value indicating, the distance constraint
+     *            has to fail.
+     * @return The {@link SpanSequenceQueryWrapper} object for
+     *         chaining.
      * @see DistanceConstraint
      */
-    public SpanSequenceQueryWrapper withConstraint
-        (int min, int max, String unit, boolean exclusion) {
+    public SpanSequenceQueryWrapper withConstraint (int min, int max,
+            String unit, boolean exclusion) {
 
         // Word unit
         if (unit.equals("w")) {
             if (this.constraints == null)
                 this.constraints = new ArrayList<DistanceConstraint>(1);
-            this.constraints.add(new DistanceConstraint(min, max, isInOrder, exclusion));
+            this.constraints.add(new DistanceConstraint(min, max, isInOrder,
+                    exclusion));
             return this;
         };
 
         // Element unit (sentence or paragraph)
-        return this.withConstraint(
-            min, max, new SpanElementQueryWrapper(this.field, unit), exclusion
-        );
+        return this.withConstraint(min, max, new SpanElementQueryWrapper(
+                this.field, unit), exclusion);
     };
 
 
@@ -451,43 +496,46 @@
      * to the sequence based on a certain unit and with an
      * exclusion constraint, meaning the constraint is fine
      * in case the operands are <em>not</em> within the distance.
-     *
+     * 
      * Multiple constraints are supported.
-     *
+     * 
      * A minimum value of zero means, there may be an overlap,
-     * a minimum value of 1 means, there is no token between the spans.
-     * It's weird - we know and dislike that. That's why we have to say:
-     *
-     * <strong>Warning!</strong> Sequence constraints are experimental and
+     * a minimum value of 1 means, there is no token between the
+     * spans.
+     * It's weird - we know and dislike that. That's why we have to
+     * say:
+     * 
+     * <strong>Warning!</strong> Sequence constraints are experimental
+     * and
      * may (hopefully) change in future versions!
-     *
-     * @param min The minimum number of tokens between the elements
-     *        of the sequence.
-     * @param max The minimum number of tokens between the elements
-     *        of the sequence.
-     * @param unit A {@link SpanElementQueryWrapper} as the unit for distance.
-     * @param exclusion Boolean value indicating, the distance constraint
-     *        has to fail.
-     * @return The {@link SpanSequenceQueryWrapper} object for chaining.
+     * 
+     * @param min
+     *            The minimum number of tokens between the elements
+     *            of the sequence.
+     * @param max
+     *            The minimum number of tokens between the elements
+     *            of the sequence.
+     * @param unit
+     *            A {@link SpanElementQueryWrapper} as the unit for
+     *            distance.
+     * @param exclusion
+     *            Boolean value indicating, the distance constraint
+     *            has to fail.
+     * @return The {@link SpanSequenceQueryWrapper} object for
+     *         chaining.
      * @see DistanceConstraint
      */
-    public SpanSequenceQueryWrapper withConstraint
-        (int min, int max, SpanElementQueryWrapper unit, boolean exclusion) {
+    public SpanSequenceQueryWrapper withConstraint (int min, int max,
+            SpanElementQueryWrapper unit, boolean exclusion) {
         if (this.constraints == null)
             this.constraints = new ArrayList<DistanceConstraint>(1);
 
         // Element unit (sentence or paragraph)
         // Todo: This should possibly be evaluated to a query later on!
         try {
-            this.constraints.add(
-                new DistanceConstraint(
-                    (SpanElementQuery) unit.retrieveNode(this.retrieveNode).toQuery(),
-                    min,
-                    max,
-                    isInOrder,
-                    exclusion
-                )
-            );
+            this.constraints.add(new DistanceConstraint((SpanElementQuery) unit
+                    .retrieveNode(this.retrieveNode).toQuery(), min, max,
+                    isInOrder, exclusion));
         }
         catch (QueryException qe) {
             this.constraintException = qe;
@@ -498,7 +546,7 @@
 
     /**
      * Check if the sequence has to be in order.
-     *
+     * 
      * @return <tt>true</tt> in case the sequence
      *         has to be in order and <tt>false</tt>
      *         in case the order is not relevant.
@@ -511,10 +559,11 @@
     /**
      * Set the boolean value indicating if the sequence
      * has to be in order.
-     *
-     * @param order <tt>true</tt> in case the sequence
-     *        has to be in order and <tt>false</tt>
-     *        in case the order is not relevant.
+     * 
+     * @param order
+     *            <tt>true</tt> in case the sequence
+     *            has to be in order and <tt>false</tt>
+     *            in case the order is not relevant.
      */
     public void setInOrder (boolean order) {
         this.isInOrder = order;
@@ -523,7 +572,7 @@
 
     /**
      * Check if the sequence has constraints.
-     *
+     * 
      * @return <tt>true</tt> in case the sequence
      *         has any constraints and <tt>false</tt>
      *         in case it is a simple next query.
@@ -534,14 +583,13 @@
 
         if (this.constraints.size() <= 0)
             return false;
-        
+
         // The constraint is in fact a next query,
         // that will be optimized away later on
         if (this.constraints.size() == 1) {
             DistanceConstraint dc = this.constraints.get(0);
-            if (dc.getUnit().equals("w") &&
-                dc.getMinDistance() == 1 &&
-                dc.getMaxDistance() == 1) {
+            if (dc.getUnit().equals("w") && dc.getMinDistance() == 1
+                    && dc.getMaxDistance() == 1) {
                 return false;
             };
         };
@@ -568,6 +616,7 @@
         return super.isOptional();
     };
 
+
     public boolean isNegative () {
         if (this.segments.size() == 1)
             return this.segments.get(0).isNegative();
@@ -576,6 +625,7 @@
         return super.isNegative();
     };
 
+
     public boolean isExtendedToTheRight () {
         if (!this.isSolved)
             _solveProblematicSequence();
@@ -585,7 +635,7 @@
 
     /**
      * Serialize the wrapped sequence to a {@link SpanQuery} object.
-     *
+     * 
      * @return A {@link SpanQuery} object.
      * @throws QueryException
      */
@@ -605,47 +655,42 @@
         if (size == 1) {
 
             // But the element may be expanded
-            if (this.segments.get(0).isExtended() &&
-                (this.hasConstraints() || !this.isInOrder())) {
+            if (this.segments.get(0).isExtended()
+                    && (this.hasConstraints() || !this.isInOrder())) {
                 throw new QueryException(613, limitationError);
             };
 
             // Unproblematic single query
             if (this.segments.get(0).maybeAnchor())
-                return (SpanQuery) this.segments.get(0).retrieveNode(this.retrieveNode).toQuery();
+                return (SpanQuery) this.segments.get(0)
+                        .retrieveNode(this.retrieveNode).toQuery();
 
             if (this.segments.get(0).isEmpty())
-                throw new QueryException(
-                    613, "Sequence is not allowed to be empty"
-                );
+                throw new QueryException(613,
+                        "Sequence is not allowed to be empty");
 
             if (this.segments.get(0).isOptional())
-                throw new QueryException(
-                    613, "Sequence is not allowed to be optional"
-                );
+                throw new QueryException(613,
+                        "Sequence is not allowed to be optional");
 
             if (this.segments.get(0).isNegative())
-                throw new QueryException(
-                    613, "Sequence is not allowed to be negative"
-                );
+                throw new QueryException(613,
+                        "Sequence is not allowed to be negative");
         };
 
         if (!this.isSolved) {
             if (!_solveProblematicSequence()) {
                 if (this.segments.get(0).maybeExtension()) {
-                    throw new QueryException(
-                        613,
-                        "Sequence contains unresolvable " +
-                        "empty, optional, or negative segments"
-                    );
+                    throw new QueryException(613,
+                            "Sequence contains unresolvable "
+                                    + "empty, optional, or negative segments");
                 };
             };
         };
 
         // The element may be expanded
-        if (this.segments.size() == 1 &&
-            this.segments.get(0).isExtended() &&
-            (this.hasConstraints() || !this.isInOrder())) {
+        if (this.segments.size() == 1 && this.segments.get(0).isExtended()
+                && (this.hasConstraints() || !this.isInOrder())) {
             throw new QueryException(613, limitationError);
         };
 
@@ -653,7 +698,8 @@
         SpanQuery query = null;// = this.segments.get(0).toQuery();
         int i = 0;
         while (query == null && i < this.segments.size()) {
-            query = this.segments.get(i).retrieveNode(this.retrieveNode).toQuery();
+            query = this.segments.get(i).retrieveNode(this.retrieveNode)
+                    .toQuery();
             i++;
         };
 
@@ -664,18 +710,16 @@
         if (!this.hasConstraints() && this.isInOrder()) {
             for (; i < this.segments.size(); i++) {
 
-                SpanQuery second = this.segments.get(i).retrieveNode(this.retrieveNode).toQuery();
+                SpanQuery second = this.segments.get(i)
+                        .retrieveNode(this.retrieveNode).toQuery();
                 if (second == null)
                     continue;
 
-                query = new SpanNextQuery(
-                    query,
-                    second
-                );
+                query = new SpanNextQuery(query, second);
             };
             return (SpanQuery) query;
         };
-        
+
         // DistanceQueries
         if (this.constraints.size() == 1) {
             DistanceConstraint constraint = this.constraints.get(0);
@@ -688,15 +732,13 @@
                     if (this.segments.get(i).isExtended())
                         throw new QueryException(613, limitationError);
 
-                    SpanQuery sq = (SpanQuery) this.segments.get(i).retrieveNode(this.retrieveNode).toQuery();
-                    if (sq == null) continue;
+                    SpanQuery sq = (SpanQuery) this.segments.get(i)
+                            .retrieveNode(this.retrieveNode).toQuery();
+                    if (sq == null)
+                        continue;
 
-                    SpanDistanceQuery sdquery = new SpanDistanceQuery(
-                        query,
-                        sq,
-                        constraint,
-                        true
-                    );
+                    SpanDistanceQuery sdquery = new SpanDistanceQuery(query,
+                            sq, constraint, true);
                     query = (SpanQuery) sdquery;
                 };
             }
@@ -709,15 +751,13 @@
                     if (this.segments.get(i).isExtended())
                         throw new QueryException(613, limitationError);
 
-                    SpanQuery sq = (SpanQuery) this.segments.get(i).retrieveNode(this.retrieveNode).toQuery();
-                    if (sq == null) continue;
-                    
-                    SpanDistanceQuery sdquery = new SpanDistanceQuery(
-                        query,
-                        sq,
-                        constraint,
-                        true
-                    );
+                    SpanQuery sq = (SpanQuery) this.segments.get(i)
+                            .retrieveNode(this.retrieveNode).toQuery();
+                    if (sq == null)
+                        continue;
+
+                    SpanDistanceQuery sdquery = new SpanDistanceQuery(query,
+                            sq, constraint, true);
                     query = (SpanQuery) sdquery;
                 };
             };
@@ -732,16 +772,13 @@
             if (this.segments.get(i).isExtended())
                 throw new QueryException(613, limitationError);
 
-            SpanQuery sq = (SpanQuery) this.segments.get(i).retrieveNode(this.retrieveNode).toQuery();
-            if (sq == null) continue;
+            SpanQuery sq = (SpanQuery) this.segments.get(i)
+                    .retrieveNode(this.retrieveNode).toQuery();
+            if (sq == null)
+                continue;
 
-            query = new SpanMultipleDistanceQuery(
-                query,
-                sq,
-                this.constraints,
-                isInOrder,
-                true
-	        );
+            query = new SpanMultipleDistanceQuery(query, sq, this.constraints,
+                    isInOrder, true);
         };
         return (SpanQuery) query;
     };
@@ -782,16 +819,16 @@
                     log.trace("segment {} is problematic", i);
 
                 // [problem][anchor]
-                if (i < (size-1) && this.segments.get(i+1).maybeAnchor()) {
+                if (i < (size - 1) && this.segments.get(i + 1).maybeAnchor()) {
                     if (DEBUG)
                         log.trace("Situation is [problem][anchor]");
 
                     // Insert the solution
                     try {
                         this.segments.set(
-                          i+1,
-                          _merge(this.segments.get(i+1), underScrutiny, false)
-                        );
+                                i + 1,
+                                _merge(this.segments.get(i + 1), underScrutiny,
+                                        false));
                     }
 
                     // An error occurred while solving the problem
@@ -811,16 +848,16 @@
                 }
 
                 // [anchor][problem]
-                else if (i >= 1 && this.segments.get(i-1).maybeAnchor()) {
+                else if (i >= 1 && this.segments.get(i - 1).maybeAnchor()) {
                     if (DEBUG)
                         log.trace("Situation is [anchor][problem]");
 
                     // Insert the solution
                     try {
                         this.segments.set(
-                            i-1,
-                            _merge(this.segments.get(i-1), underScrutiny, true)
-                        );
+                                i - 1,
+                                _merge(this.segments.get(i - 1), underScrutiny,
+                                        true));
                     }
                     catch (QueryException e) {
                         return false;
@@ -870,32 +907,28 @@
     // Todo: Deal with negative and optional!
     // [base=der][base!=Baum]?
     private SpanQueryWrapper _merge (SpanQueryWrapper anchor,
-                                     SpanQueryWrapper problem,
-                                     boolean mergeLeft) throws QueryException {
+            SpanQueryWrapper problem, boolean mergeLeft) throws QueryException {
 
         // Extend to the right - merge to the left
         int direction = mergeLeft ? 1 : -1;
 
         if (DEBUG)
-            log.trace("Will merge two spans to {}",
-                      mergeLeft ? "left" : "right");
-	    
+            log.trace("Will merge two spans to {}", mergeLeft ? "left"
+                    : "right");
+
         // Make empty extension to anchor
         if (problem.isEmpty()) {
             SpanQuery query;
 
             if (DEBUG)
                 log.trace("Problem is empty with class {}",
-                          problem.getClassNumber());
+                        problem.getClassNumber());
 
-            query = new SpanExpansionQuery(
-                anchor.retrieveNode(this.retrieveNode).toQuery(),
-                problem.getMin(),
-                problem.getMax(),
-                direction,
-                problem.hasClass() ? problem.getClassNumber() : (byte) 0,
-                true
-            );
+            query = new SpanExpansionQuery(anchor.retrieveNode(
+                    this.retrieveNode).toQuery(), problem.getMin(),
+                    problem.getMax(), direction,
+                    problem.hasClass() ? problem.getClassNumber() : (byte) 0,
+                    true);
             return new SpanSimpleQueryWrapper(query).isExtended(true);
         }
 
@@ -906,17 +939,14 @@
 
             if (DEBUG)
                 log.trace("Problem is negative with class {}",
-                          problem.getClassNumber());
+                        problem.getClassNumber());
 
-            query = new SpanExpansionQuery(
-                anchor.retrieveNode(this.retrieveNode).toQuery(),
-                problem.retrieveNode(this.retrieveNode).toQuery(),
-                problem.getMin(),
-                problem.getMax(),
-                direction,
-                problem.hasClass() ? problem.getClassNumber() : (byte) 0,
-                true
-            );
+            query = new SpanExpansionQuery(anchor.retrieveNode(
+                    this.retrieveNode).toQuery(), problem.retrieveNode(
+                    this.retrieveNode).toQuery(), problem.getMin(),
+                    problem.getMax(), direction,
+                    problem.hasClass() ? problem.getClassNumber() : (byte) 0,
+                    true);
             return new SpanSimpleQueryWrapper(query).isExtended(true);
         };
 
@@ -926,20 +956,22 @@
         // [base=der][base=baum]?
 
         // [base=der]
-        SpanAlterQueryWrapper saqw =
-            new SpanAlterQueryWrapper(this.field, anchor);
+        SpanAlterQueryWrapper saqw = new SpanAlterQueryWrapper(this.field,
+                anchor);
 
         // [base=der]
-        SpanSequenceQueryWrapper ssqw =
-            new SpanSequenceQueryWrapper(this.field, anchor);
+        SpanSequenceQueryWrapper ssqw = new SpanSequenceQueryWrapper(
+                this.field, anchor);
 
         // [base=der][base=baum]
         if (mergeLeft)
-            ssqw.append(new SpanSimpleQueryWrapper(problem.retrieveNode(this.retrieveNode).toQuery()));
+            ssqw.append(new SpanSimpleQueryWrapper(problem.retrieveNode(
+                    this.retrieveNode).toQuery()));
         // [base=baum][base=der]
         else
-            ssqw.prepend(new SpanSimpleQueryWrapper(problem.retrieveNode(this.retrieveNode).toQuery()));
-	
+            ssqw.prepend(new SpanSimpleQueryWrapper(problem.retrieveNode(
+                    this.retrieveNode).toQuery()));
+
         saqw.or(ssqw);
 
         return (SpanQueryWrapper) saqw;
diff --git a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSimpleQueryWrapper.java b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSimpleQueryWrapper.java
index ad72570..28edbf6 100644
--- a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSimpleQueryWrapper.java
+++ b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSimpleQueryWrapper.java
@@ -7,25 +7,30 @@
 public class SpanSimpleQueryWrapper extends SpanQueryWrapper {
     private SpanQuery query;
 
+
     public SpanSimpleQueryWrapper (String field, String term) {
         this.isNull = false;
         this.query = new SpanTermQuery(new Term(field, term));
     };
 
-	public SpanSimpleQueryWrapper(String field, String term, boolean value) {
-		this(field, term);
-		this.isNegative = !value;
-	}
+
+    public SpanSimpleQueryWrapper (String field, String term, boolean value) {
+        this(field, term);
+        this.isNegative = !value;
+    }
+
 
     public SpanSimpleQueryWrapper (SpanQuery query) {
         this.isNull = false;
         this.query = query;
     };
 
+
     public SpanQuery toQuery () {
         return this.query;
     };
 
+
     public SpanSimpleQueryWrapper isExtended (boolean extended) {
         this.isExtended = true;
         return this;
diff --git a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSubspanQueryWrapper.java b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSubspanQueryWrapper.java
index 5ae86c8..ec61e70 100644
--- a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSubspanQueryWrapper.java
+++ b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSubspanQueryWrapper.java
@@ -14,128 +14,138 @@
  */
 public class SpanSubspanQueryWrapper extends SpanQueryWrapper {
 
-	private SpanQueryWrapper subquery;
-	private int startOffset, length;
+    private SpanQueryWrapper subquery;
+    private int startOffset, length;
 
-	private final static Logger log = LoggerFactory
-			.getLogger(SpanSubspanQueryWrapper.class);
+    private final static Logger log = LoggerFactory
+            .getLogger(SpanSubspanQueryWrapper.class);
 
-	// This advices the java compiler to ignore all loggings
-	public static final boolean DEBUG = false;
-
-	public SpanSubspanQueryWrapper(SpanQueryWrapper sqw, int startOffset,
-			int length) throws QueryException {
-		if (length < 0) {
-			throw new QueryException(
-					"SpanSubspanQuery cannot have length less than 0.");
-		}
-
-		this.subquery = sqw;
-		if (subquery != null) {
-			this.isNull = false;
-		} else
-			return;
-
-		this.startOffset = startOffset;
-		this.length = length;
-
-		if (subquery.isEmpty()) {
-			handleEmptySubquery();
-		} 
-		else if (subquery.isNegative()) {
-			handleNegativeSubquery();
-		}
-	}
-
-	private void handleNegativeSubquery() {
-		this.isNegative = true;
-		if (startOffset < 0) {
-			int max = Math.abs(startOffset) + length;
-			subquery.setMax(max);
-			startOffset = max + startOffset;
-		} 
-		else {
-			int endOffset = startOffset + length;
-			if (subquery.getMax() > endOffset) {
-				subquery.setMax(startOffset + length);
-			}
-		}
-		subquery.setMin(startOffset);
-		subquery.isOptional = false;
-
-		max = subquery.max - subquery.min;
-		min = max;
-	}
-
-	private void handleEmptySubquery() {
-		if (subquery instanceof SpanRepetitionQueryWrapper) {
-			this.isEmpty = true;
-		}
-		// subspan([]{,5}, 2) -> subspan([]{2,5}, 2)
-		// e.g. subspan([]{0,6}, 8)
-		if (startOffset >= subquery.getMax()) {
-			this.isNull = true;
-			return;
-		}
-		if (startOffset < 0) {
-			startOffset = subquery.getMax() + startOffset;
-		}
-		subquery.isOptional = false;
-		subquery.setMin(startOffset);
-
-		// subspan([]{2,}, 2,5) -> subspan([]{2,5}, 2,5)
-		int endOffset = startOffset + length;
-		if (length == 0) {
-			length = subquery.getMax() - startOffset;
-		}
-		else if (subquery.getMax() > endOffset || subquery.getMax() == 0) {
-			subquery.setMax(endOffset);
-		}
-		else if (subquery.getMax() < endOffset) {
-			length = subquery.max - subquery.min;
-		}
-
-		setMax(subquery.max);
-		setMin(subquery.min);
-	}
-
-	@Override
-	public SpanQuery toQuery() throws QueryException {
-		if (this.isNull()) { return null; }
-
-		SpanQuery sq = subquery.retrieveNode(this.retrieveNode).toQuery();
-		if (sq == null) return null;
-		if (sq instanceof SpanTermQuery) {
-			if (subquery.isNegative()) {
-				return sq;
-			}
-			else if ((startOffset == 0 || startOffset == -1) &&
-					(length == 1 || length == 0)) {
-				// if (DEBUG) log.warn("Not SpanSubspanQuery. " +
-				// "Creating only a SpanQuery for the subquery.");
-				return sq;
-			}
-			return null;
-		}
-
-		return new SpanSubspanQuery(sq, startOffset, length, true);
-	}
-
-	@Override
-	public boolean isNegative() {
-		return this.subquery.isNegative();
-	};
-
-	@Override
-	public boolean isOptional() {
-		if (startOffset > 0)
-			return false;
-		return this.subquery.isOptional();
-	};
+    // This advices the java compiler to ignore all loggings
+    public static final boolean DEBUG = false;
 
 
-	@Override
-	public boolean maybeUnsorted () {
+    public SpanSubspanQueryWrapper (SpanQueryWrapper sqw, int startOffset,
+                                    int length) throws QueryException {
+        if (length < 0) {
+            throw new QueryException(
+                    "SpanSubspanQuery cannot have length less than 0.");
+        }
+
+        this.subquery = sqw;
+        if (subquery != null) {
+            this.isNull = false;
+        }
+        else
+            return;
+
+        this.startOffset = startOffset;
+        this.length = length;
+
+        if (subquery.isEmpty()) {
+            handleEmptySubquery();
+        }
+        else if (subquery.isNegative()) {
+            handleNegativeSubquery();
+        }
+    }
+
+
+    private void handleNegativeSubquery () {
+        this.isNegative = true;
+        if (startOffset < 0) {
+            int max = Math.abs(startOffset) + length;
+            subquery.setMax(max);
+            startOffset = max + startOffset;
+        }
+        else {
+            int endOffset = startOffset + length;
+            if (subquery.getMax() > endOffset) {
+                subquery.setMax(startOffset + length);
+            }
+        }
+        subquery.setMin(startOffset);
+        subquery.isOptional = false;
+
+        max = subquery.max - subquery.min;
+        min = max;
+    }
+
+
+    private void handleEmptySubquery () {
+        if (subquery instanceof SpanRepetitionQueryWrapper) {
+            this.isEmpty = true;
+        }
+        // subspan([]{,5}, 2) -> subspan([]{2,5}, 2)
+        // e.g. subspan([]{0,6}, 8)
+        if (startOffset >= subquery.getMax()) {
+            this.isNull = true;
+            return;
+        }
+        if (startOffset < 0) {
+            startOffset = subquery.getMax() + startOffset;
+        }
+        subquery.isOptional = false;
+        subquery.setMin(startOffset);
+
+        // subspan([]{2,}, 2,5) -> subspan([]{2,5}, 2,5)
+        int endOffset = startOffset + length;
+        if (length == 0) {
+            length = subquery.getMax() - startOffset;
+        }
+        else if (subquery.getMax() > endOffset || subquery.getMax() == 0) {
+            subquery.setMax(endOffset);
+        }
+        else if (subquery.getMax() < endOffset) {
+            length = subquery.max - subquery.min;
+        }
+
+        setMax(subquery.max);
+        setMin(subquery.min);
+    }
+
+
+    @Override
+    public SpanQuery toQuery () throws QueryException {
+        if (this.isNull()) {
+            return null;
+        }
+
+        SpanQuery sq = subquery.retrieveNode(this.retrieveNode).toQuery();
+        if (sq == null)
+            return null;
+        if (sq instanceof SpanTermQuery) {
+            if (subquery.isNegative()) {
+                return sq;
+            }
+            else if ((startOffset == 0 || startOffset == -1)
+                    && (length == 1 || length == 0)) {
+                // if (DEBUG) log.warn("Not SpanSubspanQuery. " +
+                // "Creating only a SpanQuery for the subquery.");
+                return sq;
+            }
+            return null;
+        }
+
+        return new SpanSubspanQuery(sq, startOffset, length, true);
+    }
+
+
+    @Override
+    public boolean isNegative () {
+        return this.subquery.isNegative();
+    };
+
+
+    @Override
+    public boolean isOptional () {
+        if (startOffset > 0)
+            return false;
+        return this.subquery.isOptional();
+    };
+
+
+    @Override
+    public boolean maybeUnsorted () {
         return this.subquery.maybeUnsorted();
     };
 }
diff --git a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanWildcardQueryWrapper.java b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanWildcardQueryWrapper.java
index 4332856..6eb6bdf 100644
--- a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanWildcardQueryWrapper.java
+++ b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanWildcardQueryWrapper.java
@@ -10,12 +10,15 @@
 
 public class SpanWildcardQueryWrapper extends SpanQueryWrapper {
     private SpanQuery query;
-    
+
+
     public SpanWildcardQueryWrapper (String field, String wc) {
         this(field, wc, false);
     };
 
-    public SpanWildcardQueryWrapper (String field, String wc, boolean caseinsensitive) {
+
+    public SpanWildcardQueryWrapper (String field, String wc,
+                                     boolean caseinsensitive) {
         if (caseinsensitive) {
             if (wc.startsWith("s:")) {
                 wc = wc.replaceFirst("s:", "i:");
@@ -23,13 +26,15 @@
             wc = wc.toLowerCase();
         };
         WildcardQuery wcquery = new WildcardQuery(new Term(field, wc));
-        query = new SpanMultiTermQueryWrapper<WildcardQuery>( wcquery );
+        query = new SpanMultiTermQueryWrapper<WildcardQuery>(wcquery);
     };
 
-    public SpanQuery toQuery() {
+
+    public SpanQuery toQuery () {
         return this.query;
     };
 
+
     public boolean isNull () {
         return false;
     };
diff --git a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanWithAttributeQueryWrapper.java b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanWithAttributeQueryWrapper.java
index 7b633c0..8916bda 100644
--- a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanWithAttributeQueryWrapper.java
+++ b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanWithAttributeQueryWrapper.java
@@ -18,195 +18,206 @@
  * */
 public class SpanWithAttributeQueryWrapper extends SpanQueryWrapper {
 
-	private SpanQueryWrapper withIdQueryWrapper = null;
-	private SpanQueryWrapper attrQueryWrapper = null;
-	private List<SpanQueryWrapper> queryWrapperList = null;
-	private boolean isSingleAttribute = false;
+    private SpanQueryWrapper withIdQueryWrapper = null;
+    private SpanQueryWrapper attrQueryWrapper = null;
+    private List<SpanQueryWrapper> queryWrapperList = null;
+    private boolean isSingleAttribute = false;
 
-	public SpanWithAttributeQueryWrapper(SpanQueryWrapper attrQuery)
-			throws QueryException {
-		if (attrQuery != null) isNull = false;
-		if (attrQuery.isEmpty()) {
-			isEmpty = true;
-			return;
-		}
-		if (attrQuery.isNegative) {
-			throw new QueryException("The query requires a positive attribute.");
-		}
-		this.attrQueryWrapper = attrQuery;
-		this.isSingleAttribute = true;
-	}
 
-	public SpanWithAttributeQueryWrapper(List<SpanQueryWrapper> attrList)
-			throws QueryException {
+    public SpanWithAttributeQueryWrapper (SpanQueryWrapper attrQuery)
+            throws QueryException {
+        if (attrQuery != null)
+            isNull = false;
+        if (attrQuery.isEmpty()) {
+            isEmpty = true;
+            return;
+        }
+        if (attrQuery.isNegative) {
+            throw new QueryException("The query requires a positive attribute.");
+        }
+        this.attrQueryWrapper = attrQuery;
+        this.isSingleAttribute = true;
+    }
 
-		if (attrList != null) isNull = false;
-		if (attrList.isEmpty()) {
-			throw new QueryException("No attribute is defined.");
-		}
 
-		boolean isAllNegative = true;
-		for (SpanQueryWrapper sqw : attrList) {
-			if (sqw == null) {
-				isNull = true;
-				return;
-			}
-			if (sqw.isEmpty) {
-				isEmpty = true;
-				return;
-			}
-			if (!sqw.isNegative) {
-				isAllNegative = false;
-			}
-		}
-		if (isAllNegative) {
-			throw new QueryException("No positive attribute is defined.");
-		}
-		this.queryWrapperList = attrList;
-	}
+    public SpanWithAttributeQueryWrapper (List<SpanQueryWrapper> attrList)
+            throws QueryException {
 
-	public SpanWithAttributeQueryWrapper(SpanQueryWrapper withIdQuery,
-			SpanQueryWrapper attrQuery) {
+        if (attrList != null)
+            isNull = false;
+        if (attrList.isEmpty()) {
+            throw new QueryException("No attribute is defined.");
+        }
 
-		if (withIdQuery != null || attrQuery != null) {
-			isNull = false;
-		}
-		if (withIdQuery.isEmpty || attrQuery.isEmpty()) {
-			isEmpty = true;
-			return;
-		}
+        boolean isAllNegative = true;
+        for (SpanQueryWrapper sqw : attrList) {
+            if (sqw == null) {
+                isNull = true;
+                return;
+            }
+            if (sqw.isEmpty) {
+                isEmpty = true;
+                return;
+            }
+            if (!sqw.isNegative) {
+                isAllNegative = false;
+            }
+        }
+        if (isAllNegative) {
+            throw new QueryException("No positive attribute is defined.");
+        }
+        this.queryWrapperList = attrList;
+    }
 
-		this.attrQueryWrapper = attrQuery;
-		this.withIdQueryWrapper = withIdQuery;
-		this.isSingleAttribute = true;
-	}
 
-	public SpanWithAttributeQueryWrapper(SpanQueryWrapper withIdQuery,
-			List<SpanQueryWrapper> attrList) {
+    public SpanWithAttributeQueryWrapper (SpanQueryWrapper withIdQuery,
+                                          SpanQueryWrapper attrQuery) {
 
-		if (withIdQuery != null || attrList != null) {
-			isNull = false;
-		}
-		if (withIdQuery.isEmpty) {
-			isEmpty = true;
-			return;
-		}
-		// if (attrList.isEmpty()) {
-			// not withattribute query, just a normal query
-		// }
+        if (withIdQuery != null || attrQuery != null) {
+            isNull = false;
+        }
+        if (withIdQuery.isEmpty || attrQuery.isEmpty()) {
+            isEmpty = true;
+            return;
+        }
 
-		for (SpanQueryWrapper sqw : attrList) {
-			if (sqw == null) {
-				isNull = true;
-				return;
-			}
-			if (sqw.isEmpty) {
-				isEmpty = true;
-				return;
-			}
-		}
-		
-		this.queryWrapperList = attrList;
-		this.withIdQueryWrapper = withIdQuery;
-	}
+        this.attrQueryWrapper = attrQuery;
+        this.withIdQueryWrapper = withIdQuery;
+        this.isSingleAttribute = true;
+    }
 
-	@Override
-	public SpanQuery toQuery() throws QueryException {
 
-		if (isNull || isEmpty) return null;		
-		if (withIdQueryWrapper != null){
-			return createSpecificSpanWithAttributeQuery();
-		}
-		else{
-			return createArbitrarySpanWithAttributeQuery(); 
-		}
-	}
-	
-	private SpanQuery createSpecificSpanWithAttributeQuery()
-			throws QueryException {
-		SpanWithIdQuery withIdQuery = (SpanWithIdQuery) withIdQueryWrapper
-				.toQuery();
-		if (withIdQuery == null) {
-			isNull = true;
-			return null;
-		}
-		if (isSingleAttribute) {
-			return createSpanWithSingleAttributeQuery(withIdQuery);
-		}
-		else if (queryWrapperList.isEmpty()) {
-			return withIdQuery;
-		}
-		else{
-			return createSpanWithAttributeListQuery(withIdQuery);
-		}
-	}
-	
-	private SpanWithAttributeQuery createSpanWithSingleAttributeQuery(
-			SpanWithIdQuery withIdQuery)
-			throws QueryException {
-		SpanAttributeQuery attrQuery = createSpanAttributeQuery(this.attrQueryWrapper);
-		if (attrQuery != null) {
-			if (withIdQuery != null) {
-				return new SpanWithAttributeQuery(withIdQuery, attrQuery, true);
-			} 
-			else {
-				return new SpanWithAttributeQuery(attrQuery, true);
-			}
-		}
-		isNull = true;
-		return null;
-	}
+    public SpanWithAttributeQueryWrapper (SpanQueryWrapper withIdQuery,
+                                          List<SpanQueryWrapper> attrList) {
 
-	private SpanAttributeQuery createSpanAttributeQuery(
-			SpanQueryWrapper attrQueryWrapper) throws QueryException {
-		SpanQuery sq = attrQueryWrapper.toQuery();
-		if (sq != null) {
-			if (sq instanceof SpanTermQuery) {
-				return new SpanAttributeQuery((SpanTermQuery) sq,
-						attrQueryWrapper.isNegative, true);
-			} 
-			else {
-				throw new IllegalArgumentException(
-						"The subquery is not a SpanTermQuery.");
-			}
-		}
-		return null;
-	}
+        if (withIdQuery != null || attrList != null) {
+            isNull = false;
+        }
+        if (withIdQuery.isEmpty) {
+            isEmpty = true;
+            return;
+        }
+        // if (attrList.isEmpty()) {
+        // not withattribute query, just a normal query
+        // }
 
-	private SpanWithAttributeQuery createSpanWithAttributeListQuery(
-			SpanWithIdQuery withIdQuery)
-			throws QueryException {
-		List<SpanQuery> attrQueries = new ArrayList<SpanQuery>();
-		SpanQuery attrQuery = null;
-		for (SpanQueryWrapper sqw : queryWrapperList) {
-			attrQuery = createSpanAttributeQuery(sqw);
-			if (attrQuery == null) {
-				isNull = true;
-				return null;
-			}
-			attrQueries.add(attrQuery);
-		}
-		
-		if (withIdQuery != null) {
-			return new SpanWithAttributeQuery(withIdQuery, attrQueries, true);
-		} 
-		else {
-			return new SpanWithAttributeQuery(attrQueries, true);
-		}
-	}
+        for (SpanQueryWrapper sqw : attrList) {
+            if (sqw == null) {
+                isNull = true;
+                return;
+            }
+            if (sqw.isEmpty) {
+                isEmpty = true;
+                return;
+            }
+        }
 
-	private SpanQuery createArbitrarySpanWithAttributeQuery()
-			throws QueryException {
-		if (isSingleAttribute) {
-			return createSpanWithSingleAttributeQuery(null);
-		}
-		else if (queryWrapperList.isEmpty()) {
-			throw new QueryException("No attribute is defined.");
-		}
-		else{
-			return createSpanWithAttributeListQuery(null);
-		}				
-	}
+        this.queryWrapperList = attrList;
+        this.withIdQueryWrapper = withIdQuery;
+    }
+
+
+    @Override
+    public SpanQuery toQuery () throws QueryException {
+
+        if (isNull || isEmpty)
+            return null;
+        if (withIdQueryWrapper != null) {
+            return createSpecificSpanWithAttributeQuery();
+        }
+        else {
+            return createArbitrarySpanWithAttributeQuery();
+        }
+    }
+
+
+    private SpanQuery createSpecificSpanWithAttributeQuery ()
+            throws QueryException {
+        SpanWithIdQuery withIdQuery = (SpanWithIdQuery) withIdQueryWrapper
+                .toQuery();
+        if (withIdQuery == null) {
+            isNull = true;
+            return null;
+        }
+        if (isSingleAttribute) {
+            return createSpanWithSingleAttributeQuery(withIdQuery);
+        }
+        else if (queryWrapperList.isEmpty()) {
+            return withIdQuery;
+        }
+        else {
+            return createSpanWithAttributeListQuery(withIdQuery);
+        }
+    }
+
+
+    private SpanWithAttributeQuery createSpanWithSingleAttributeQuery (
+            SpanWithIdQuery withIdQuery) throws QueryException {
+        SpanAttributeQuery attrQuery = createSpanAttributeQuery(this.attrQueryWrapper);
+        if (attrQuery != null) {
+            if (withIdQuery != null) {
+                return new SpanWithAttributeQuery(withIdQuery, attrQuery, true);
+            }
+            else {
+                return new SpanWithAttributeQuery(attrQuery, true);
+            }
+        }
+        isNull = true;
+        return null;
+    }
+
+
+    private SpanAttributeQuery createSpanAttributeQuery (
+            SpanQueryWrapper attrQueryWrapper) throws QueryException {
+        SpanQuery sq = attrQueryWrapper.toQuery();
+        if (sq != null) {
+            if (sq instanceof SpanTermQuery) {
+                return new SpanAttributeQuery((SpanTermQuery) sq,
+                        attrQueryWrapper.isNegative, true);
+            }
+            else {
+                throw new IllegalArgumentException(
+                        "The subquery is not a SpanTermQuery.");
+            }
+        }
+        return null;
+    }
+
+
+    private SpanWithAttributeQuery createSpanWithAttributeListQuery (
+            SpanWithIdQuery withIdQuery) throws QueryException {
+        List<SpanQuery> attrQueries = new ArrayList<SpanQuery>();
+        SpanQuery attrQuery = null;
+        for (SpanQueryWrapper sqw : queryWrapperList) {
+            attrQuery = createSpanAttributeQuery(sqw);
+            if (attrQuery == null) {
+                isNull = true;
+                return null;
+            }
+            attrQueries.add(attrQuery);
+        }
+
+        if (withIdQuery != null) {
+            return new SpanWithAttributeQuery(withIdQuery, attrQueries, true);
+        }
+        else {
+            return new SpanWithAttributeQuery(attrQueries, true);
+        }
+    }
+
+
+    private SpanQuery createArbitrarySpanWithAttributeQuery ()
+            throws QueryException {
+        if (isSingleAttribute) {
+            return createSpanWithSingleAttributeQuery(null);
+        }
+        else if (queryWrapperList.isEmpty()) {
+            throw new QueryException("No attribute is defined.");
+        }
+        else {
+            return createSpanWithAttributeListQuery(null);
+        }
+    }
 
 
 }
diff --git a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanWithinQueryWrapper.java b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanWithinQueryWrapper.java
index a04b33a..904d771 100644
--- a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanWithinQueryWrapper.java
+++ b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanWithinQueryWrapper.java
@@ -62,7 +62,9 @@
     private SpanQueryWrapper wrap;
     private byte flag;
 
-    public SpanWithinQueryWrapper (SpanQueryWrapper element, SpanQueryWrapper wrap) {
+
+    public SpanWithinQueryWrapper (SpanQueryWrapper element,
+                                   SpanQueryWrapper wrap) {
         this.element = element;
         this.wrap = wrap;
 
@@ -74,8 +76,8 @@
     };
 
 
-    public SpanWithinQueryWrapper
-        (SpanQueryWrapper element, SpanQueryWrapper wrap, byte flag) {
+    public SpanWithinQueryWrapper (SpanQueryWrapper element,
+                                   SpanQueryWrapper wrap, byte flag) {
         this.element = element;
         this.wrap = wrap;
         this.flag = flag;
@@ -90,14 +92,12 @@
     public SpanQuery toQuery () throws QueryException {
         if (this.isNull)
             return (SpanQuery) null;
-	
+
         // TODO: if (wrap.isNegative())
 
-        return new SpanWithinQuery(
-            this.element.retrieveNode(this.retrieveNode).toQuery(),
-            this.wrap.retrieveNode(this.retrieveNode).toQuery(),
-            this.flag
-        );
+        return new SpanWithinQuery(this.element.retrieveNode(this.retrieveNode)
+                .toQuery(),
+                this.wrap.retrieveNode(this.retrieveNode).toQuery(), this.flag);
     };
 
 
diff --git a/src/main/java/de/ids_mannheim/korap/response/Match.java b/src/main/java/de/ids_mannheim/korap/response/Match.java
index db32550..17f6cae 100644
--- a/src/main/java/de/ids_mannheim/korap/response/Match.java
+++ b/src/main/java/de/ids_mannheim/korap/response/Match.java
@@ -1,4 +1,5 @@
 package de.ids_mannheim.korap.response;
+
 import java.util.*;
 import java.io.*;
 
@@ -43,7 +44,7 @@
 
 /**
  * Representation of Matches in a Result.
- *
+ * 
  * @author Nils Diewald
  * @see Result
  */
@@ -68,8 +69,7 @@
     public int startPos, endPos = -1;
 
     @JsonIgnore
-    public int potentialStartPosChar = -1,
-	       potentialEndPosChar   = -1;
+    public int potentialStartPosChar = -1, potentialEndPosChar = -1;
 
     private String error = null;
     private String version;
@@ -78,24 +78,20 @@
     @JsonIgnore
     public int localDocID = -1;
 
-    private HashMap<Integer, String>   annotationNumber = new HashMap<>(16);
-    private HashMap<Integer, Relation> relationNumber   = new HashMap<>(16);
-    private HashMap<Integer, Integer>  identifierNumber = new HashMap<>(16);
+    private HashMap<Integer, String> annotationNumber = new HashMap<>(16);
+    private HashMap<Integer, Relation> relationNumber = new HashMap<>(16);
+    private HashMap<Integer, Integer> identifierNumber = new HashMap<>(16);
 
     // -1 is match highlight
     int annotationNumberCounter = 256;
-    int relationNumberCounter   = 2048;
+    int relationNumberCounter = 2048;
     int identifierNumberCounter = -2;
 
-    private String tempSnippet,
-	           snippetHTML,
-	           snippetBrackets,
-	           identifier;
+    private String tempSnippet, snippetHTML, snippetBrackets, identifier;
 
     private HighlightCombinator snippetArray;
 
-    public boolean startMore = true,
-	           endMore = true;
+    public boolean startMore = true, endMore = true;
 
     private Collection<byte[]> payload;
     private ArrayList<Highlight> highlight;
@@ -104,298 +100,317 @@
     private PositionsToOffset positionsToOffset;
     private boolean processed = false;
 
+
     /**
      * Constructs a new Match object.
      * Todo: Maybe that's not necessary!
-     *
-     * @param pto The PositionsToOffset object, containing relevant
+     * 
+     * @param pto
+     *            The PositionsToOffset object, containing relevant
      *            positional information for highlighting
-     * @param localDocID Document ID based on the atomic reader.
-     * @param startPos Start position of the match in the document.
-     * @param endPos End position of the match in the document.
-     *
+     * @param localDocID
+     *            Document ID based on the atomic reader.
+     * @param startPos
+     *            Start position of the match in the document.
+     * @param endPos
+     *            End position of the match in the document.
+     * 
      * @see #snippetHTML()
      * @see #snippetBrackets()
      * @see PositionsToOffset
      */
-    public Match (PositionsToOffset pto,
-		       int localDocID,
-		       int startPos,
-		       int endPos) {
-	this.positionsToOffset = pto;
-	this.localDocID = localDocID;
-	this.startPos   = startPos;
-	this.endPos     = endPos;
+    public Match (PositionsToOffset pto, int localDocID, int startPos,
+                  int endPos) {
+        this.positionsToOffset = pto;
+        this.localDocID = localDocID;
+        this.startPos = startPos;
+        this.endPos = endPos;
     };
 
-    
+
     /**
      * Constructs a new Match object.
      */
     public Match () {};
 
-    
+
     /**
      * Constructs a new Match object.
-     *
-     * @param idString Match identifier string as provided by Result.
-     * @param includeHighlights Boolean value indicating if possible provided
-     *        highlight information should be ignored or not.
+     * 
+     * @param idString
+     *            Match identifier string as provided by Result.
+     * @param includeHighlights
+     *            Boolean value indicating if possible provided
+     *            highlight information should be ignored or not.
      */
     public Match (String idString, boolean includeHighlights) {
-	MatchIdentifier id = new MatchIdentifier(idString);
-	if (id.getStartPos() > -1) {
-	    this.setCorpusID(id.getCorpusID());
-	    this.setDocID(id.getDocID());
-	    this.setStartPos(id.getStartPos());
-	    this.setEndPos(id.getEndPos());
+        MatchIdentifier id = new MatchIdentifier(idString);
+        if (id.getStartPos() > -1) {
+            this.setCorpusID(id.getCorpusID());
+            this.setDocID(id.getDocID());
+            this.setStartPos(id.getStartPos());
+            this.setEndPos(id.getEndPos());
 
-	    if (includeHighlights)
-		for (int[] pos : id.getPos()) {
-		    if (pos[0] < id.getStartPos() || pos[1] > id.getEndPos())
-			continue;
-		    
-		    this.addHighlight(pos[0], pos[1], pos[2]);
-		};
-	};
+            if (includeHighlights)
+                for (int[] pos : id.getPos()) {
+                    if (pos[0] < id.getStartPos() || pos[1] > id.getEndPos())
+                        continue;
+
+                    this.addHighlight(pos[0], pos[1], pos[2]);
+                };
+        };
     };
 
-    
+
     /**
      * Private class of highlights.
-     */   
+     */
     private class Highlight {
-	public int start, end;
-	public int number = -1;
+        public int start, end;
+        public int number = -1;
 
-	// Relational highlight
-       	public Highlight (int start, int end, String annotation, int ref) {
-	    this.start = start;
-	    this.end   = end;
-	    // TODO: This can overflow!
-	    this.number = relationNumberCounter++;
-	    relationNumber.put(this.number, new Relation(annotation, ref));
-	};
 
-	// Span highlight
-	public Highlight (int start, int end, String annotation) {
-	    this.start = start;
-	    this.end   = end;
-	    // TODO: This can overflow!
-	    if (annotationNumberCounter < 2048) {
-		this.number = annotationNumberCounter++;
-		annotationNumber.put(this.number, annotation);
-	    };
-	};
+        // Relational highlight
+        public Highlight (int start, int end, String annotation, int ref) {
+            this.start = start;
+            this.end = end;
+            // TODO: This can overflow!
+            this.number = relationNumberCounter++;
+            relationNumber.put(this.number, new Relation(annotation, ref));
+        };
 
-	// Simple highlight
-	public Highlight (int start, int end, int number) {
-	    this.start  = start;
-	    this.end    = end;
-	    this.number = number;
-	};
+
+        // Span highlight
+        public Highlight (int start, int end, String annotation) {
+            this.start = start;
+            this.end = end;
+            // TODO: This can overflow!
+            if (annotationNumberCounter < 2048) {
+                this.number = annotationNumberCounter++;
+                annotationNumber.put(this.number, annotation);
+            };
+        };
+
+
+        // Simple highlight
+        public Highlight (int start, int end, int number) {
+            this.start = start;
+            this.end = end;
+            this.number = number;
+        };
     };
 
-    
+
     // TODO: Here are offsets and highlight offsets!
     // <> payloads have 12 bytes (iii) or 8!?
     // highlightoffsets have 11 bytes (iis)!
     public void addPayload (List<byte[]> payload) {
 
-	if (DEBUG)
-	    log.trace("Add payloads to match");
+        if (DEBUG)
+            log.trace("Add payloads to match");
 
-	// Reverse to make embedding of highlights correct
-	Collections.reverse(payload);
-	try {
-	    ByteBuffer bb = ByteBuffer.allocate(10);
+        // Reverse to make embedding of highlights correct
+        Collections.reverse(payload);
+        try {
+            ByteBuffer bb = ByteBuffer.allocate(10);
 
-	    // TODO: REVERSE ITERATOR!
-	    for (byte[] b : payload) {
+            // TODO: REVERSE ITERATOR!
+            for (byte[] b : payload) {
 
-		if (DEBUG)
-		    log.trace("Found a payload with length {}", b.length);
+                if (DEBUG)
+                    log.trace("Found a payload with length {}", b.length);
 
-		// Todo element searches!
+                // Todo element searches!
 
-		// Highlights!
-		if (b.length == 9) {
-		    bb.put(b);
-		    bb.rewind();
+                // Highlights!
+                if (b.length == 9) {
+                    bb.put(b);
+                    bb.rewind();
 
-		    int start   = bb.getInt();
-		    int end     = bb.getInt();
-		    byte number = bb.get();
+                    int start = bb.getInt();
+                    int end = bb.getInt();
+                    byte number = bb.get();
 
-		    if (DEBUG)
-			log.trace(
-			    "Have a highlight of class {} in {}-{} inside of {}-{}",
-			    number,
-			    start,
-			    end,
-			    this.getStartPos(),
-			    this.getEndPos()
-			);
+                    if (DEBUG)
+                        log.trace(
+                                "Have a highlight of class {} in {}-{} inside of {}-{}",
+                                number, start, end, this.getStartPos(),
+                                this.getEndPos());
 
-		    // Ignore classes out of match range and set by the system
-		    if ((number & 0xFF) <= 128 &&
-			start >= this.getStartPos() &&
-			end <= this.getEndPos())
-			this.addHighlight(start, end - 1, number);
-		}
+                    // Ignore classes out of match range and set by the system
+                    if ((number & 0xFF) <= 128 && start >= this.getStartPos()
+                            && end <= this.getEndPos())
+                        this.addHighlight(start, end - 1, number);
+                }
 
-		// Element payload for match!
-		// This MAY BE the correct match
-		else if (b.length == 8) {
-		    bb.put(b);
-		    bb.rewind();
+                // Element payload for match!
+                // This MAY BE the correct match
+                else if (b.length == 8) {
+                    bb.put(b);
+                    bb.rewind();
 
-		    if (this.potentialStartPosChar == -1) {
-			this.potentialStartPosChar = bb.getInt(0);
-		    }
-		    else {
-			if (bb.getInt(0) < this.potentialStartPosChar)
-			    this.potentialStartPosChar = bb.getInt(0);
-		    };
-		    
-		    if (bb.getInt(4) > this.potentialEndPosChar)
-			this.potentialEndPosChar = bb.getInt(4);
+                    if (this.potentialStartPosChar == -1) {
+                        this.potentialStartPosChar = bb.getInt(0);
+                    }
+                    else {
+                        if (bb.getInt(0) < this.potentialStartPosChar)
+                            this.potentialStartPosChar = bb.getInt(0);
+                    };
 
-		    if (DEBUG)
-			log.trace(
-			    "Element payload from {} to {}",
-			    this.potentialStartPosChar,
-			    this.potentialEndPosChar
-			);
-		};
-	
-		// Clear bytebuffer
-		bb.clear();
-	    };
-	}
+                    if (bb.getInt(4) > this.potentialEndPosChar)
+                        this.potentialEndPosChar = bb.getInt(4);
 
-	catch (Exception e) {
-	    log.error(e.getMessage());
-	}
+                    if (DEBUG)
+                        log.trace("Element payload from {} to {}",
+                                this.potentialStartPosChar,
+                                this.potentialEndPosChar);
+                };
+
+                // Clear bytebuffer
+                bb.clear();
+            };
+        }
+
+        catch (Exception e) {
+            log.error(e.getMessage());
+        }
     };
 
 
     /**
      * Insert a highlight for the snippet view by means of positional
      * offsets and an optional class number.
-     *
-     * @param start  Integer value of a span's positional start offset.
-     * @param end    Integer value of a span's positional end offset.
-     * @param number Optional class number of the highlight.
+     * 
+     * @param start
+     *            Integer value of a span's positional start offset.
+     * @param end
+     *            Integer value of a span's positional end offset.
+     * @param number
+     *            Optional class number of the highlight.
      */
     public void addHighlight (int start, int end) {
-	this.addHighlight(new Highlight(start, end, (int) 0));
+        this.addHighlight(new Highlight(start, end, (int) 0));
     };
 
+
     public void addHighlight (int start, int end, byte number) {
-	this.addHighlight(new Highlight(start, end, (int) number));
+        this.addHighlight(new Highlight(start, end, (int) number));
     };
 
+
     public void addHighlight (int start, int end, short number) {
-	this.addHighlight(new Highlight(start, end, (int) number));
+        this.addHighlight(new Highlight(start, end, (int) number));
     };
 
+
     public void addHighlight (int start, int end, int number) {
-	this.addHighlight(new Highlight(start, end, number));
+        this.addHighlight(new Highlight(start, end, number));
     };
 
-    
+
     /**
      * Insert a highlight for the snippet view.
-     *
-     * @param hl A highlight object to add to the match.
+     * 
+     * @param hl
+     *            A highlight object to add to the match.
      */
     public void addHighlight (Highlight hl) {
 
-	if (this.highlight == null)
-	    this.highlight = new ArrayList<Highlight>(16);
+        if (this.highlight == null)
+            this.highlight = new ArrayList<Highlight>(16);
 
-	if (DEBUG)
-	    log.trace("Add highlight from pos {}-{} of class {}",
-		      hl.start, hl.end, hl.number);
+        if (DEBUG)
+            log.trace("Add highlight from pos {}-{} of class {}", hl.start,
+                    hl.end, hl.number);
 
-	// Reset the fetched match data
-	this._reset();
+        // Reset the fetched match data
+        this._reset();
 
-	this.highlight.add(hl);
+        this.highlight.add(hl);
     };
 
 
     /**
      * Insert a textual annotation for the snippet view by
      * means of positional offsets and an annotation string.
-     *
-     * @param start      Integer value of a span's positional start offset.
-     * @param end        Integer value of a span's positional end offset.
-     * @param annotation Annotation string.
+     * 
+     * @param start
+     *            Integer value of a span's positional start offset.
+     * @param end
+     *            Integer value of a span's positional end offset.
+     * @param annotation
+     *            Annotation string.
      */
     public void addAnnotation (int start, int end, String annotation) {
-	this.addHighlight(new Highlight(start, end, annotation));
+        this.addHighlight(new Highlight(start, end, annotation));
     };
 
-    
+
     /**
      * Insert an annotated relation for the snippet view by
-     * means of relational participant positions and an annotation string.
-     *
-     * @param src        Integer value of a span's positional source object.
-     * @param target     Integer value of a span's positional target object.
-     * @param annotation Annotation string.
+     * means of relational participant positions and an annotation
+     * string.
+     * 
+     * @param src
+     *            Integer value of a span's positional source object.
+     * @param target
+     *            Integer value of a span's positional target object.
+     * @param annotation
+     *            Annotation string.
      */
     public void addRelation (int src, int target, String annotation) {
-	this.addHighlight(new Highlight(src, src, annotation, target));
-	int id = identifierNumberCounter--;
-	identifierNumber.put(id, target);
-	this.addHighlight(new Highlight(target, target, id));
+        this.addHighlight(new Highlight(src, src, annotation, target));
+        int id = identifierNumberCounter--;
+        identifierNumber.put(id, target);
+        this.addHighlight(new Highlight(target, target, id));
     };
 
 
     /**
-     * Populate document meta information with information coming from the index.
-     *
-     * @param doc    Document object.
-     * @param field  Primary data field.
-     * @param fields Hash object with all supported fields.
+     * Populate document meta information with information coming from
+     * the index.
+     * 
+     * @param doc
+     *            Document object.
+     * @param field
+     *            Primary data field.
+     * @param fields
+     *            Hash object with all supported fields.
      */
-    public void populateDocument (Document doc,
-                                  String field, HashSet<String> fields) {
-	this.setField(field);
-	this.setPrimaryData( doc.get(field) );
-	if (fields.contains("corpusID"))
-	    this.setCorpusID(doc.get("corpusID"));
-	if (fields.contains("ID"))
-	    this.setDocID(doc.get("ID"));
-	if (fields.contains("UID"))
-	    this.setUID(doc.get("UID"));
-	if (fields.contains("author"))
-	    this.setAuthor(doc.get("author"));
-	if (fields.contains("textClass"))
-	    this.setTextClass(doc.get("textClass"));
-	if (fields.contains("title"))
-	    this.setTitle(doc.get("title"));
-	if (fields.contains("subTitle"))
-	    this.setSubTitle(doc.get("subTitle"));
-	if (fields.contains("pubDate"))
-	    this.setPubDate(doc.get("pubDate"));
-	if (fields.contains("pubPlace"))
-	    this.setPubPlace(doc.get("pubPlace"));
+    public void populateDocument (Document doc, String field,
+            HashSet<String> fields) {
+        this.setField(field);
+        this.setPrimaryData(doc.get(field));
+        if (fields.contains("corpusID"))
+            this.setCorpusID(doc.get("corpusID"));
+        if (fields.contains("ID"))
+            this.setDocID(doc.get("ID"));
+        if (fields.contains("UID"))
+            this.setUID(doc.get("UID"));
+        if (fields.contains("author"))
+            this.setAuthor(doc.get("author"));
+        if (fields.contains("textClass"))
+            this.setTextClass(doc.get("textClass"));
+        if (fields.contains("title"))
+            this.setTitle(doc.get("title"));
+        if (fields.contains("subTitle"))
+            this.setSubTitle(doc.get("subTitle"));
+        if (fields.contains("pubDate"))
+            this.setPubDate(doc.get("pubDate"));
+        if (fields.contains("pubPlace"))
+            this.setPubPlace(doc.get("pubPlace"));
 
-	// Temporary (later meta fields in term vector)
-	if (fields.contains("foundries"))
-	    this.setFoundries(doc.get("foundries"));
-	if (fields.contains("tokenization"))
-	    this.setTokenization(doc.get("tokenization"));
-	if (fields.contains("layerInfo"))
-	    this.setLayerInfo(doc.get("layerInfo"));
+        // Temporary (later meta fields in term vector)
+        if (fields.contains("foundries"))
+            this.setFoundries(doc.get("foundries"));
+        if (fields.contains("tokenization"))
+            this.setTokenization(doc.get("tokenization"));
+        if (fields.contains("layerInfo"))
+            this.setLayerInfo(doc.get("layerInfo"));
 
-	// New fields
-	if (fields.contains("textSigle"))
-	    this.setTextSigle(doc.get("textSigle"));
+        // New fields
+        if (fields.contains("textSigle"))
+            this.setTextSigle(doc.get("textSigle"));
 
     };
 
@@ -405,56 +420,60 @@
      */
     @JsonProperty("docID")
     public String getDocID () {
-	return super.getID();
+        return super.getID();
     };
 
-    
+
     /**
      * Set document id.
-     *
-     * @param id String representation of document ID.
+     * 
+     * @param id
+     *            String representation of document ID.
      */
     public void setDocID (String id) {
-	super.setID(id);
+        super.setID(id);
     };
 
+
     /**
      * Get the positional start offset of the match.
      */
     @JsonIgnore
-    public int getStartPos() {
-	return this.startPos;
+    public int getStartPos () {
+        return this.startPos;
     };
 
 
     /**
      * Get the positional start offset of the class.
-     *
-     * @param number Class number of the highlight.
+     * 
+     * @param number
+     *            Class number of the highlight.
      */
     @JsonIgnore
     public int getStartPos (int number) {
-	if (number > 256 || this.highlight == null)
-	    return -1;
+        if (number > 256 || this.highlight == null)
+            return -1;
 
-	// Iterate over highlights to find matching class
-	for (Highlight h : this.highlight) {
-	    if (h.number == number)
-		return h.start;
-	};
+        // Iterate over highlights to find matching class
+        for (Highlight h : this.highlight) {
+            if (h.number == number)
+                return h.start;
+        };
 
-	return -1;
+        return -1;
     };
 
 
     /**
      * Set the positional start offset of the match.
-     *
-     * @param pos The positional offset.
+     * 
+     * @param pos
+     *            The positional offset.
      */
     @JsonIgnore
-    public void setStartPos(int pos) {
-	this.startPos = pos;
+    public void setStartPos (int pos) {
+        this.startPos = pos;
     };
 
 
@@ -463,407 +482,406 @@
      */
     @JsonIgnore
     public int getEndPos () {
-	return this.endPos;
+        return this.endPos;
     };
 
 
     /**
      * Get the positional end offset of the class.
-     *
-     * @param number Class number of the highlight.
+     * 
+     * @param number
+     *            Class number of the highlight.
      */
     @JsonIgnore
     public int getEndPos (int number) {
-	if (number > 256 || this.highlight == null)
-	    return -1;
+        if (number > 256 || this.highlight == null)
+            return -1;
 
-	// Iterate over highlights to find matching class
-	for (Highlight h : this.highlight) {
+        // Iterate over highlights to find matching class
+        for (Highlight h : this.highlight) {
 
-	    // Get the number (incremented by 1)
-	    if (h.number == number)
-		return h.end + 1;
-	};
+            // Get the number (incremented by 1)
+            if (h.number == number)
+                return h.end + 1;
+        };
 
-	return -1;
+        return -1;
     };
 
 
     /**
      * Set the positional end offset of the match.
-     *
-     * @param pos The positional offset.
+     * 
+     * @param pos
+     *            The positional offset.
      */
     @JsonIgnore
-    public void setEndPos(int pos) {
-	this.endPos = pos;
+    public void setEndPos (int pos) {
+        this.endPos = pos;
     };
 
-    
+
     /**
      * Get the local (i.e. Lucene given) ID of the document.
      */
     @JsonIgnore
     public int getLocalDocID () {
-	return this.localDocID;
+        return this.localDocID;
     };
 
 
     /**
      * Set the local (i.e. Lucene given) ID of the document.
-     *
-     * @param id The id of the document.
+     * 
+     * @param id
+     *            The id of the document.
      */
     @JsonIgnore
     public void setLocalDocID (int id) {
-	this.localDocID = id;
+        this.localDocID = id;
     };
 
-    
+
     /**
      * Get the PositionsToOffset object.
-     *
+     * 
      * @see PositionsToOffset
      */
     @JsonIgnore
     public PositionsToOffset getPositionsToOffset () {
-	return this.positionsToOffset;
+        return this.positionsToOffset;
     };
 
 
     /**
      * Set the PositionsToOffset object.
-     *
-     * @param pto The PositionsToOffset object
+     * 
+     * @param pto
+     *            The PositionsToOffset object
      * @see PositionsToOffset
      */
     @JsonIgnore
     public void setPositionsToOffset (PositionsToOffset pto) {
-	this.positionsToOffset = pto;
+        this.positionsToOffset = pto;
     };
 
 
     /**
      * Get match ID (for later retrieval).
-     *
+     * 
      * @see MatchIdentifier
      */
     @Override
     @JsonProperty("ID")
     public String getID () {
 
-	// Identifier already given
-	if (this.identifier != null)
-	    return this.identifier;
+        // Identifier already given
+        if (this.identifier != null)
+            return this.identifier;
 
-	// No, nada, nix
-	if (this.localDocID == -1)
-	    return null;
+        // No, nada, nix
+        if (this.localDocID == -1)
+            return null;
 
-	MatchIdentifier id = this.getMatchIdentifier();
+        MatchIdentifier id = this.getMatchIdentifier();
 
-	// Get prefix string corpus/doc
-	id.setCorpusID(this.getCorpusID());
-	id.setDocID(this.getDocID());
+        // Get prefix string corpus/doc
+        id.setCorpusID(this.getCorpusID());
+        id.setDocID(this.getDocID());
 
-	return (this.identifier = id.toString());
+        return (this.identifier = id.toString());
     };
 
+
     @JsonIgnore
     public MatchIdentifier getMatchIdentifier () {
-	MatchIdentifier id = new MatchIdentifier();
+        MatchIdentifier id = new MatchIdentifier();
 
-	id.setStartPos(startPos);
-	id.setEndPos(endPos);
+        id.setStartPos(startPos);
+        id.setEndPos(endPos);
 
-	// There are highlights to integrate
-	if (this.highlight != null) {
-	    for (Highlight h : this.highlight) {
-		if (h.number >= 256)
-		    continue;
+        // There are highlights to integrate
+        if (this.highlight != null) {
+            for (Highlight h : this.highlight) {
+                if (h.number >= 256)
+                    continue;
 
-		// Add highlight to the snippet
-		id.addPos(h.start, h.end, h.number);
-	    };
-	};
+                // Add highlight to the snippet
+                id.addPos(h.start, h.end, h.number);
+            };
+        };
 
-	return id;
+        return id;
     };
 
 
     /**
      * Get identifier for a specific position.
-     *
+     * 
      * @param int Position to get identifier on.
      */
     @JsonIgnore
     public String getPosID (int pos) {
 
-	// Identifier already given
-	if (this.identifier != null)
-	    return this.identifier;
+        // Identifier already given
+        if (this.identifier != null)
+            return this.identifier;
 
-	// Nothing here
-	if (this.localDocID == -1)
-	    return null;
+        // Nothing here
+        if (this.localDocID == -1)
+            return null;
 
-	PosIdentifier id = new PosIdentifier();
+        PosIdentifier id = new PosIdentifier();
 
-	// Get prefix string corpus/doc
-	id.setCorpusID(this.getCorpusID());
-	id.setDocID(this.getDocID());
-	id.setPos(pos);
+        // Get prefix string corpus/doc
+        id.setCorpusID(this.getCorpusID());
+        id.setDocID(this.getDocID());
+        id.setPos(pos);
 
-	return id.toString();
+        return id.toString();
     };
 
+
     /**
      * Get possible error message.
      */
     // Identical to Result
     public String getError () {
-	return this.error;
+        return this.error;
     };
 
+
     /**
      * Set error message.
-     *
-     * @param msg The error message.
+     * 
+     * @param msg
+     *            The error message.
      */
     public void setError (String msg) {
-	this.error = msg;
+        this.error = msg;
     };
 
 
     public Match setContext (SearchContext context) {
-	this.context = context;
-	return this;
+        this.context = context;
+        return this;
     };
 
+
     @JsonIgnore
     public SearchContext getContext () {
-	if (this.context == null)
-	    this.context = new SearchContext();
-	return this.context;
+        if (this.context == null)
+            this.context = new SearchContext();
+        return this.context;
     };
-    
+
 
     // Expand the context to a span
     public int[] expandContextToSpan (String element) {
 
-	// TODO: THE BITS HAVE TO BE SET!
-	
-	if (this.positionsToOffset != null)
-	    return this.expandContextToSpan(
-	        this.positionsToOffset.getAtomicReader(),
-		(Bits) null,
-		"tokens",
-		element
-	    );
-	return new int[]{0,0,0,0};
+        // TODO: THE BITS HAVE TO BE SET!
+
+        if (this.positionsToOffset != null)
+            return this.expandContextToSpan(
+                    this.positionsToOffset.getAtomicReader(), (Bits) null,
+                    "tokens", element);
+        return new int[] { 0, 0, 0, 0 };
     };
 
+
     // Expand the context to a span
     // THIS IS NOT VERY CLEVER - MAKE IT MORE CLEVER!
-    public int[] expandContextToSpan (AtomicReaderContext atomic,
-				      Bits bitset,
-				      String field,
-				      String element) {
+    public int[] expandContextToSpan (AtomicReaderContext atomic, Bits bitset,
+            String field, String element) {
 
-	try {
-	    // Store character offsets in ByteBuffer
-	    ByteBuffer bb = ByteBuffer.allocate(8);
+        try {
+            // Store character offsets in ByteBuffer
+            ByteBuffer bb = ByteBuffer.allocate(8);
 
-	    SpanElementQuery cquery =
-		new SpanElementQuery(field, element);
+            SpanElementQuery cquery = new SpanElementQuery(field, element);
 
-	    Spans contextSpans = cquery.getSpans(
-	        atomic,
-		bitset,
-		new HashMap<Term, TermContext>()
-	    );
+            Spans contextSpans = cquery.getSpans(atomic, bitset,
+                    new HashMap<Term, TermContext>());
 
-	    int newStart = -1,
-		newEnd = -1;
-	    int newStartChar = -1,
-		newEndChar = -1;
+            int newStart = -1, newEnd = -1;
+            int newStartChar = -1, newEndChar = -1;
 
-	    if (DEBUG)
-		log.trace("Extend match to context boundary with {} in {}",
-			  cquery.toString(),
-			  this.localDocID);
+            if (DEBUG)
+                log.trace("Extend match to context boundary with {} in {}",
+                        cquery.toString(), this.localDocID);
 
-	    while (true) {
+            while (true) {
 
-		// Game over
-		if (contextSpans.next() != true)
-		    break;
+                // Game over
+                if (contextSpans.next() != true)
+                    break;
 
-		if (contextSpans.doc() != this.localDocID) {
-		    contextSpans.skipTo(this.localDocID);
-		    if (contextSpans.doc() != this.localDocID)
-			break;
-		};
+                if (contextSpans.doc() != this.localDocID) {
+                    contextSpans.skipTo(this.localDocID);
+                    if (contextSpans.doc() != this.localDocID)
+                        break;
+                };
 
-		// There's a <context> found -- I'm curious,
-		// if it's closer to the match than everything before
-		if (contextSpans.start() <= this.getStartPos() &&
-		    contextSpans.end() >= this.getStartPos()) {
+                // There's a <context> found -- I'm curious,
+                // if it's closer to the match than everything before
+                if (contextSpans.start() <= this.getStartPos()
+                        && contextSpans.end() >= this.getStartPos()) {
 
-		    // Set as newStart
-		    newStart = contextSpans.start() > newStart ?
-			contextSpans.start() : newStart;
+                    // Set as newStart
+                    newStart = contextSpans.start() > newStart ? contextSpans
+                            .start() : newStart;
 
-		    if (DEBUG)
-			log.trace("NewStart is at {}", newStart);
+                    if (DEBUG)
+                        log.trace("NewStart is at {}", newStart);
 
-		    // Get character offset (start)
-		    if (contextSpans.isPayloadAvailable()) {
-			try {
-			    bb.rewind();
-			    for (byte[] b : contextSpans.getPayload()) {
+                    // Get character offset (start)
+                    if (contextSpans.isPayloadAvailable()) {
+                        try {
+                            bb.rewind();
+                            for (byte[] b : contextSpans.getPayload()) {
 
-				// Not an element span
-				if (b.length != 8)
-				    continue;
+                                // Not an element span
+                                if (b.length != 8)
+                                    continue;
 
-				bb.put(b);
-				bb.rewind();
-				newStartChar = bb.getInt();
-				newEndChar = bb.getInt();
-				break;
-			    };
-			}
-			catch (Exception e) {
-			    log.warn(e.getMessage());
-			};
-		    };
-		}
-		else {
-		    // Has to be resettet to avoid multiple readings of the payload
-		    newEndChar = 0;
-		};
-		
-		// There's an s found, that ends after the match
-		if (contextSpans.end() >= this.getEndPos()) {
-		    newEnd = contextSpans.end();
+                                bb.put(b);
+                                bb.rewind();
+                                newStartChar = bb.getInt();
+                                newEndChar = bb.getInt();
+                                break;
+                            };
+                        }
+                        catch (Exception e) {
+                            log.warn(e.getMessage());
+                        };
+                    };
+                }
+                else {
+                    // Has to be resettet to avoid multiple readings of the payload
+                    newEndChar = 0;
+                };
 
-		    // Get character offset (end)
-		    if (newEndChar == 0 && contextSpans.isPayloadAvailable()) {
-			try {
-			    bb.rewind();
-			    for (byte[] b : contextSpans.getPayload()) {
+                // There's an s found, that ends after the match
+                if (contextSpans.end() >= this.getEndPos()) {
+                    newEnd = contextSpans.end();
 
-				// Not an element span
-				if (b.length != 8)
-				    continue;
+                    // Get character offset (end)
+                    if (newEndChar == 0 && contextSpans.isPayloadAvailable()) {
+                        try {
+                            bb.rewind();
+                            for (byte[] b : contextSpans.getPayload()) {
 
-				bb.put(b);
-				bb.rewind();
-				newEndChar = bb.getInt(1);
-				break;
-			    };
-			}
-			catch (Exception e) {
-			    log.warn(e.getMessage());
-			};
-		    };
-		    break;
-		};
-	    };
-	    
-	    // We have a new match surrounding
-	    if (DEBUG)
-		log.trace("New match spans from {}-{}/{}-{}", newStart, newEnd, newStartChar, newEndChar);
+                                // Not an element span
+                                if (b.length != 8)
+                                    continue;
 
-	    return new int[]{newStart, newEnd, newStartChar, newEndChar};
-	}
-	catch (IOException e) {
-	    log.error(e.getMessage());
-	};
-	
-	return new int[]{-1,-1,-1,-1};
+                                bb.put(b);
+                                bb.rewind();
+                                newEndChar = bb.getInt(1);
+                                break;
+                            };
+                        }
+                        catch (Exception e) {
+                            log.warn(e.getMessage());
+                        };
+                    };
+                    break;
+                };
+            };
+
+            // We have a new match surrounding
+            if (DEBUG)
+                log.trace("New match spans from {}-{}/{}-{}", newStart, newEnd,
+                        newStartChar, newEndChar);
+
+            return new int[] { newStart, newEnd, newStartChar, newEndChar };
+        }
+        catch (IOException e) {
+            log.error(e.getMessage());
+        };
+
+        return new int[] { -1, -1, -1, -1 };
     };
 
-    
+
     // Reset all internal data
     private void _reset () {
-	this.processed       = false;
-	this.snippetHTML     = null;
-	this.snippetBrackets = null;
-	this.identifier      = null;
+        this.processed = false;
+        this.snippetHTML = null;
+        this.snippetBrackets = null;
+        this.identifier = null;
 
-	// Delete all spans
-	if (this.span != null)
-	    this.span.clear();
+        // Delete all spans
+        if (this.span != null)
+            this.span.clear();
     };
 
-    
+
     // Start building highlighted snippets
     private boolean _processHighlight () {
-	if (processed)
-	    return true;
+        if (processed)
+            return true;
 
-	// Relevant details are missing
-	if (this.positionsToOffset == null || this.localDocID == -1) {
-	    log.warn("You have to define " +
-		     "positionsToOffset and localDocID first " +
-		     "before");
-	    return false;
-	};
+        // Relevant details are missing
+        if (this.positionsToOffset == null || this.localDocID == -1) {
+            log.warn("You have to define "
+                    + "positionsToOffset and localDocID first " + "before");
+            return false;
+        };
 
-	if (DEBUG)
-	    log.trace("--- Start highlight processing ...");
+        if (DEBUG)
+            log.trace("--- Start highlight processing ...");
 
-	// Get pto object
-	PositionsToOffset pto = this.positionsToOffset;
-	pto.add(this.localDocID, this.getStartPos());
-	pto.add(this.localDocID, this.getEndPos() - 1);
+        // Get pto object
+        PositionsToOffset pto = this.positionsToOffset;
+        pto.add(this.localDocID, this.getStartPos());
+        pto.add(this.localDocID, this.getEndPos() - 1);
 
-	if (DEBUG)
-	    log.trace("PTO will retrieve {} & {} (Match boundary)",
-		      this.getStartPos(),
-		      this.getEndPos());
+        if (DEBUG)
+            log.trace("PTO will retrieve {} & {} (Match boundary)",
+                    this.getStartPos(), this.getEndPos());
 
-	// Add all highlights for character retrieval
-	if (this.highlight != null) {
-	    for (Highlight hl : this.highlight) {
-		if (hl.start >= this.getStartPos() && hl.end <= this.getEndPos()) {
-		    pto.add(this.localDocID, hl.start);
-		    pto.add(this.localDocID, hl.end);
+        // Add all highlights for character retrieval
+        if (this.highlight != null) {
+            for (Highlight hl : this.highlight) {
+                if (hl.start >= this.getStartPos()
+                        && hl.end <= this.getEndPos()) {
+                    pto.add(this.localDocID, hl.start);
+                    pto.add(this.localDocID, hl.end);
 
-		    if (DEBUG)
-			log.trace("PTO will retrieve {} & {} (Highlight boundary)",
-				  hl.start, hl.end);
-		};
-	    };
-	};
-	
-	// Get the list of spans for matches and highlighting
-	if (this.span == null || this.span.size() == 0) {
-	    if (!this._processHighlightSpans())
-		return false;
-	};
+                    if (DEBUG)
+                        log.trace(
+                                "PTO will retrieve {} & {} (Highlight boundary)",
+                                hl.start, hl.end);
+                };
+            };
+        };
 
-	// Create a stack for highlighted elements
-	// (opening and closing elements)
-	ArrayList<int[]> stack = this._processHighlightStack();
+        // Get the list of spans for matches and highlighting
+        if (this.span == null || this.span.size() == 0) {
+            if (!this._processHighlightSpans())
+                return false;
+        };
 
-	if (DEBUG)
-	    log.trace("The snippet is {}", this.tempSnippet);
+        // Create a stack for highlighted elements
+        // (opening and closing elements)
+        ArrayList<int[]> stack = this._processHighlightStack();
+
+        if (DEBUG)
+            log.trace("The snippet is {}", this.tempSnippet);
 
 
-	// The temporary snippet is empty, nothing to do
-	if (this.tempSnippet == null) {
-	    processed = true;
-	    return false;
-	};
+        // The temporary snippet is empty, nothing to do
+        if (this.tempSnippet == null) {
+            processed = true;
+            return false;
+        };
 
-	// Merge the element stack with the primary textual data
-	this._processHighlightSnippet(this.tempSnippet, stack);
+        // Merge the element stack with the primary textual data
+        this._processHighlightSnippet(this.tempSnippet, stack);
 
-	// Match is processed - done
-	return (processed = true);
+        // Match is processed - done
+        return (processed = true);
     };
 
 
@@ -871,181 +889,181 @@
       Comparator class for opening tags
      */
     private class OpeningTagComparator implements Comparator<int[]> {
-	@Override
-	public int compare (int[] arg0, int[] arg1) {
-	    // Check start positions
-	    if (arg0[0] > arg1[0]) {
-		return 1;
-	    }
-	    else if (arg0[0] == arg1[0]) {
-		// Check endpositions
-		if (arg0[1] > arg1[1]) {
-		    return -1;
-		}
-		else if (arg0[1] == arg1[1]) {
-		    return 0;
-		}
-		return 1;
-	    };
-	    return -1;
-	};
+        @Override
+        public int compare (int[] arg0, int[] arg1) {
+            // Check start positions
+            if (arg0[0] > arg1[0]) {
+                return 1;
+            }
+            else if (arg0[0] == arg1[0]) {
+                // Check endpositions
+                if (arg0[1] > arg1[1]) {
+                    return -1;
+                }
+                else if (arg0[1] == arg1[1]) {
+                    return 0;
+                }
+                return 1;
+            };
+            return -1;
+        };
     };
 
     /*
       Comparator class for closing tags
      */
     private class ClosingTagComparator implements Comparator<int[]> {
-	@Override
-	public int compare (int[] arg0, int[] arg1) {
-	    // Check end positions
-	    if (arg0[1] > arg1[1]) {
-		return 1;
-	    }
-	    else if (arg0[1] == arg1[1]) {
-		// Check start positions
-		if (arg0[0] < arg1[0]) {
-		    return 1;
-		}
-		else if (arg0[0] == arg1[0]) {
-		    return 0;
-		};
-		return -1;
-	    };
-	    return -1;
-	};
+        @Override
+        public int compare (int[] arg0, int[] arg1) {
+            // Check end positions
+            if (arg0[1] > arg1[1]) {
+                return 1;
+            }
+            else if (arg0[1] == arg1[1]) {
+                // Check start positions
+                if (arg0[0] < arg1[0]) {
+                    return 1;
+                }
+                else if (arg0[0] == arg1[0]) {
+                    return 0;
+                };
+                return -1;
+            };
+            return -1;
+        };
     };
 
 
 
-    private void _processHighlightSnippet (String clean,
-					   ArrayList<int[]> stack) {
+    private void _processHighlightSnippet (String clean, ArrayList<int[]> stack) {
 
-	if (DEBUG)
-	    log.trace("--- Process Highlight snippet");
+        if (DEBUG)
+            log.trace("--- Process Highlight snippet");
 
-	int pos = 0, oldPos = 0;
+        int pos = 0, oldPos = 0;
 
-	this.snippetArray = new HighlightCombinator();
+        this.snippetArray = new HighlightCombinator();
 
-	for (int[] element : stack) {
-	    pos = element[3] != 0 ? element[0] : element[1];
+        for (int[] element : stack) {
+            pos = element[3] != 0 ? element[0] : element[1];
 
-	    if (pos > oldPos) {
+            if (pos > oldPos) {
 
-	      if (pos > clean.length()) {
-		pos = clean.length() - 1;
-	      };
+                if (pos > clean.length()) {
+                    pos = clean.length() - 1;
+                };
 
-		snippetArray.addString(clean.substring(oldPos, pos));
+                snippetArray.addString(clean.substring(oldPos, pos));
 
-		oldPos = pos;
-	    };
+                oldPos = pos;
+            };
 
-	    if (element[3] != 0) {
-		snippetArray.addOpen(element[2]);
-	    }
-	    else {
-		snippetArray.addClose(element[2]);
-	    };
-	};
+            if (element[3] != 0) {
+                snippetArray.addOpen(element[2]);
+            }
+            else {
+                snippetArray.addClose(element[2]);
+            };
+        };
 
-	if (clean.length() > pos) {
-	    snippetArray.addString(clean.substring(pos));
-	};
+        if (clean.length() > pos) {
+            snippetArray.addString(clean.substring(pos));
+        };
     };
 
 
     @JsonProperty("snippet")
     public String getSnippetHTML () {
 
-	if (!this._processHighlight())
-	    return null;
+        if (!this._processHighlight())
+            return null;
 
-	if (this.processed && this.snippetHTML != null)
-	    return this.snippetHTML;
+        if (this.processed && this.snippetHTML != null)
+            return this.snippetHTML;
 
-	if (DEBUG)
-	    log.trace("Create HTML Snippet");
+        if (DEBUG)
+            log.trace("Create HTML Snippet");
 
-	StringBuilder sb = new StringBuilder();
+        StringBuilder sb = new StringBuilder();
 
-	// Snippet stack sizes
-	short start = (short) 0;
-	short end = this.snippetArray.size();
-	end--;
+        // Snippet stack sizes
+        short start = (short) 0;
+        short end = this.snippetArray.size();
+        end--;
 
-	// Set levels for highlights 
-	FixedBitSet level = new FixedBitSet(255);
-	level.set(0, 255);
-	byte[] levelCache = new byte[255];
+        // Set levels for highlights 
+        FixedBitSet level = new FixedBitSet(255);
+        level.set(0, 255);
+        byte[] levelCache = new byte[255];
 
-	// First element of sorted array
-	HighlightCombinatorElement elem = this.snippetArray.getFirst();
+        // First element of sorted array
+        HighlightCombinatorElement elem = this.snippetArray.getFirst();
 
-	// Create context
-	sb.append("<span class=\"context-left\">");
-	if (this.startMore)
-	    sb.append("<span class=\"more\"></span>");
+        // Create context
+        sb.append("<span class=\"context-left\">");
+        if (this.startMore)
+            sb.append("<span class=\"more\"></span>");
 
-	// First element is textual
-	if (elem.type == 0) {
-	    sb.append(elem.toHTML(this, level, levelCache));
-	    // Move start position
-	    start++;
-	};
-	sb.append("</span>");
+        // First element is textual
+        if (elem.type == 0) {
+            sb.append(elem.toHTML(this, level, levelCache));
+            // Move start position
+            start++;
+        };
+        sb.append("</span>");
 
-	// Last element of sorted array
-	elem = this.snippetArray.getLast();
+        // Last element of sorted array
+        elem = this.snippetArray.getLast();
 
-	StringBuilder rightContext = new StringBuilder();
+        StringBuilder rightContext = new StringBuilder();
 
-	// Create right context, if there is any
-	rightContext.append("<span class=\"context-right\">");
+        // Create right context, if there is any
+        rightContext.append("<span class=\"context-right\">");
 
-	// Last element is textual
-	if (elem != null && elem.type == 0) {
-	    rightContext.append(elem.toHTML(this, level, levelCache));
+        // Last element is textual
+        if (elem != null && elem.type == 0) {
+            rightContext.append(elem.toHTML(this, level, levelCache));
 
-	    // decrement end
-	    end--;
-	};
-	if (this.endMore)
-	    rightContext.append("<span class=\"more\"></span>");
-	rightContext.append("</span>");
+            // decrement end
+            end--;
+        };
+        if (this.endMore)
+            rightContext.append("<span class=\"more\"></span>");
+        rightContext.append("</span>");
 
-	// Iterate through all remaining elements
-	for (short i = start; i <= end; i++) {
-	    sb.append(this.snippetArray.get(i).toHTML(this, level,levelCache));
-	};
+        // Iterate through all remaining elements
+        for (short i = start; i <= end; i++) {
+            sb.append(this.snippetArray.get(i).toHTML(this, level, levelCache));
+        };
 
-	sb.append(rightContext);
+        sb.append(rightContext);
 
-	return (this.snippetHTML = sb.toString());
+        return (this.snippetHTML = sb.toString());
     };
-    
+
+
     @JsonIgnore
     public String getSnippetBrackets () {
 
-	if (!this._processHighlight())
-	    return null;
+        if (!this._processHighlight())
+            return null;
 
-	if (this.processed && this.snippetBrackets != null)
-	    return this.snippetBrackets;
+        if (this.processed && this.snippetBrackets != null)
+            return this.snippetBrackets;
 
-	StringBuilder sb = new StringBuilder();
+        StringBuilder sb = new StringBuilder();
 
-	if (this.startMore)
-	    sb.append("... ");
+        if (this.startMore)
+            sb.append("... ");
 
-	for (HighlightCombinatorElement hce : this.snippetArray.list()) {
-	    sb.append(hce.toBrackets(this));
-	};
+        for (HighlightCombinatorElement hce : this.snippetArray.list()) {
+            sb.append(hce.toBrackets(this));
+        };
 
-	if (this.endMore)
-	    sb.append(" ...");
+        if (this.endMore)
+            sb.append(" ...");
 
-	return (this.snippetBrackets = sb.toString());
+        return (this.snippetBrackets = sb.toString());
     };
 
 
@@ -1053,371 +1071,350 @@
     // even in case they overlap
     // TODO: Not very fast - improve!
     private ArrayList<int[]> _processHighlightStack () {
-	if (DEBUG)
-	    log.trace("--- Process Highlight stack");
+        if (DEBUG)
+            log.trace("--- Process Highlight stack");
 
-	LinkedList<int[]> openList  = new LinkedList<int[]>();
-	LinkedList<int[]> closeList = new LinkedList<int[]>();
+        LinkedList<int[]> openList = new LinkedList<int[]>();
+        LinkedList<int[]> closeList = new LinkedList<int[]>();
 
-	// Filter multiple identifiers, that may be introduced and would
-	// result in invalid xml
-	this._filterMultipleIdentifiers();
+        // Filter multiple identifiers, that may be introduced and would
+        // result in invalid xml
+        this._filterMultipleIdentifiers();
 
-	// Add highlight spans to balance lists
-	openList.addAll(this.span);
-	closeList.addAll(this.span);
+        // Add highlight spans to balance lists
+        openList.addAll(this.span);
+        closeList.addAll(this.span);
 
-	// Sort balance lists
-	Collections.sort(openList, new OpeningTagComparator());
-	Collections.sort(closeList, new ClosingTagComparator());
+        // Sort balance lists
+        Collections.sort(openList, new OpeningTagComparator());
+        Collections.sort(closeList, new ClosingTagComparator());
 
-	// New stack array
-	ArrayList<int[]> stack = new ArrayList<>(openList.size() * 2);
+        // New stack array
+        ArrayList<int[]> stack = new ArrayList<>(openList.size() * 2);
 
-	// Create stack unless both lists are empty
-	while (!openList.isEmpty() || !closeList.isEmpty()) {
+        // Create stack unless both lists are empty
+        while (!openList.isEmpty() || !closeList.isEmpty()) {
 
-	    if (openList.isEmpty()) {
-		stack.addAll(closeList);
-		break;
-	    }
+            if (openList.isEmpty()) {
+                stack.addAll(closeList);
+                break;
+            }
 
-	    // Not sure about this, but it can happen
-	    else if (closeList.isEmpty()) {
-		break;
-	    };
+            // Not sure about this, but it can happen
+            else if (closeList.isEmpty()) {
+                break;
+            };
 
-	    if (openList.peekFirst()[0] < closeList.peekFirst()[1]) {
-		int[] e = openList.removeFirst().clone();
-		e[3] = 1;
-		stack.add(e);
-	    }
-	    else {
-		stack.add(closeList.removeFirst());
-	    };
-	};
-	return stack;
+            if (openList.peekFirst()[0] < closeList.peekFirst()[1]) {
+                int[] e = openList.removeFirst().clone();
+                e[3] = 1;
+                stack.add(e);
+            }
+            else {
+                stack.add(closeList.removeFirst());
+            };
+        };
+        return stack;
     };
 
+
     /**
      * This will retrieve character offsets for all spans.
      */
     private boolean _processHighlightSpans () {
 
-	if (DEBUG)
-	    log.trace("--- Process Highlight spans");
+        if (DEBUG)
+            log.trace("--- Process Highlight spans");
 
-	// Local document ID
-	int ldid = this.localDocID;
+        // Local document ID
+        int ldid = this.localDocID;
 
-	int startPosChar = -1, endPosChar = -1;
+        int startPosChar = -1, endPosChar = -1;
 
-	// No positionsToOffset object found
-	if (this.positionsToOffset == null)
-	    return false;
+        // No positionsToOffset object found
+        if (this.positionsToOffset == null)
+            return false;
 
-	// Match position
-	startPosChar = this.positionsToOffset.start(ldid, this.startPos);
+        // Match position
+        startPosChar = this.positionsToOffset.start(ldid, this.startPos);
 
-	if (DEBUG)
-	    log.trace("Unaltered startPosChar is {}", startPosChar);
+        if (DEBUG)
+            log.trace("Unaltered startPosChar is {}", startPosChar);
 
-	// Check potential differing start characters
-	// e.g. from element spans
-	if (potentialStartPosChar != -1 &&
-	    (startPosChar > this.potentialStartPosChar))
-	    startPosChar = this.potentialStartPosChar;
+        // Check potential differing start characters
+        // e.g. from element spans
+        if (potentialStartPosChar != -1
+                && (startPosChar > this.potentialStartPosChar))
+            startPosChar = this.potentialStartPosChar;
 
-	endPosChar = this.positionsToOffset.end(ldid, this.endPos - 1);
+        endPosChar = this.positionsToOffset.end(ldid, this.endPos - 1);
 
-	if (DEBUG)
-	    log.trace("Unaltered endPosChar is {}", endPosChar);
+        if (DEBUG)
+            log.trace("Unaltered endPosChar is {}", endPosChar);
 
-	// Potential end characters may come from spans with
-	// defined character offsets like sentences including .", ... etc.
-	if (endPosChar < potentialEndPosChar)
-	    endPosChar = potentialEndPosChar;
+        // Potential end characters may come from spans with
+        // defined character offsets like sentences including .", ... etc.
+        if (endPosChar < potentialEndPosChar)
+            endPosChar = potentialEndPosChar;
 
-	if (DEBUG)
-	    log.trace("Refined: Match offset is pos {}-{} (chars {}-{})",
-		      this.startPos,
-		      this.endPos,
-		      startPosChar,
-		      endPosChar);
+        if (DEBUG)
+            log.trace("Refined: Match offset is pos {}-{} (chars {}-{})",
+                    this.startPos, this.endPos, startPosChar, endPosChar);
 
-	this.identifier = null;
+        this.identifier = null;
 
-	// No spans yet
-	if (this.span == null)
-	    this.span = new LinkedList<int[]>();
+        // No spans yet
+        if (this.span == null)
+            this.span = new LinkedList<int[]>();
 
-	// Process offset char findings
-	int[] intArray = this._processOffsetChars(ldid, startPosChar, endPosChar);
+        // Process offset char findings
+        int[] intArray = this._processOffsetChars(ldid, startPosChar,
+                endPosChar);
 
-	// Recalculate startOffsetChar
-	int startOffsetChar = startPosChar - intArray[0];
+        // Recalculate startOffsetChar
+        int startOffsetChar = startPosChar - intArray[0];
 
-	// Add match span
-	this.span.add(intArray);
+        // Add match span
+        this.span.add(intArray);
 
-	// highlights
-	// -- I'm not sure about this.
-	if (this.highlight != null) {
-	    if (DEBUG)
-		log.trace("There are highlights!");
-	    
-	    for (Highlight highlight : this.highlight) {
-		int start = this.positionsToOffset.start(
-		  ldid, highlight.start
-	        );
-		
-		int end = this.positionsToOffset.end(
-	          ldid,
-		  highlight.end
-		);
+        // highlights
+        // -- I'm not sure about this.
+        if (this.highlight != null) {
+            if (DEBUG)
+                log.trace("There are highlights!");
 
-		if (DEBUG)
-		    log.trace("PTO has retrieved {}-{} for class {}",
-			      start,
-			      end,
-			      highlight.number);
-		
-		start -= startOffsetChar;
-		end   -= startOffsetChar;
-		
-		if (start < 0 || end < 0)
-		    continue;
+            for (Highlight highlight : this.highlight) {
+                int start = this.positionsToOffset.start(ldid, highlight.start);
 
-		// Create intArray for highlight
-		intArray = new int[]{
-		    start,
-		    end,
-		    highlight.number,
-		    0 // Dummy value for later
-		};
+                int end = this.positionsToOffset.end(ldid, highlight.end);
 
-		this.span.add(intArray);
-	    };
-	};
-	return true;
+                if (DEBUG)
+                    log.trace("PTO has retrieved {}-{} for class {}", start,
+                            end, highlight.number);
+
+                start -= startOffsetChar;
+                end -= startOffsetChar;
+
+                if (start < 0 || end < 0)
+                    continue;
+
+                // Create intArray for highlight
+                intArray = new int[] { start, end, highlight.number, 0 // Dummy value for later
+                };
+
+                this.span.add(intArray);
+            };
+        };
+        return true;
     };
 
 
     // Pass the local docid to retrieve character positions for the offset
-    private int[] _processOffsetChars (int ldid, int startPosChar, int endPosChar) {
+    private int[] _processOffsetChars (int ldid, int startPosChar,
+            int endPosChar) {
 
-	int startOffsetChar = -1, endOffsetChar = -1;
-	int startOffset = -1, endOffset = -1;
+        int startOffsetChar = -1, endOffsetChar = -1;
+        int startOffset = -1, endOffset = -1;
 
-	// The offset is defined by a span
-	if (this.getContext().isSpanDefined()) {
+        // The offset is defined by a span
+        if (this.getContext().isSpanDefined()) {
 
-	    if (DEBUG)
-		log.trace("Try to expand to <{}>",
-			  this.context.getSpanContext());
+            if (DEBUG)
+                log.trace("Try to expand to <{}>",
+                        this.context.getSpanContext());
 
-	    this.startMore = false;
-	    this.endMore = false;
+            this.startMore = false;
+            this.endMore = false;
 
-	    int [] spanContext = this.expandContextToSpan(
-	        this.positionsToOffset.getAtomicReader(),
-	        (Bits) null,
-	        "tokens",
-	        this.context.getSpanContext()
-	    );
-	    startOffset = spanContext[0];
-	    endOffset = spanContext[1];
-	    startOffsetChar = spanContext[2];
-	    endOffsetChar = spanContext[3];
-	    if (DEBUG)
-		log.trace("Got context is based from span {}-{}/{}-{}",
-			  startOffset, endOffset, startOffsetChar, endOffsetChar);
-	};
+            int[] spanContext = this.expandContextToSpan(
+                    this.positionsToOffset.getAtomicReader(), (Bits) null,
+                    "tokens", this.context.getSpanContext());
+            startOffset = spanContext[0];
+            endOffset = spanContext[1];
+            startOffsetChar = spanContext[2];
+            endOffsetChar = spanContext[3];
+            if (DEBUG)
+                log.trace("Got context is based from span {}-{}/{}-{}",
+                        startOffset, endOffset, startOffsetChar, endOffsetChar);
+        };
 
-	// The offset is defined by tokens or characters
-	if (endOffset == -1) {
+        // The offset is defined by tokens or characters
+        if (endOffset == -1) {
 
-	    PositionsToOffset pto = this.positionsToOffset;
-	    
-	    // The left offset is defined by tokens
-	    if (this.context.left.isToken()) {
-		startOffset = this.startPos - this.context.left.getLength();
-		if (DEBUG)
-		    log.trace("PTO will retrieve {} (Left context)", startOffset);
-		pto.add(ldid, startOffset);
-	    }
+            PositionsToOffset pto = this.positionsToOffset;
 
-	    // The left offset is defined by characters
-	    else {
-		startOffsetChar = startPosChar - this.context.left.getLength();
-	    };
+            // The left offset is defined by tokens
+            if (this.context.left.isToken()) {
+                startOffset = this.startPos - this.context.left.getLength();
+                if (DEBUG)
+                    log.trace("PTO will retrieve {} (Left context)",
+                            startOffset);
+                pto.add(ldid, startOffset);
+            }
 
-	    // The right context is defined by tokens
-	    if (this.context.right.isToken()) {
-		endOffset = this.endPos + this.context.right.getLength() -1;
-		if (DEBUG)
-		    log.trace("PTO will retrieve {} (Right context)", endOffset);
-		pto.add(ldid, endOffset);
+            // The left offset is defined by characters
+            else {
+                startOffsetChar = startPosChar - this.context.left.getLength();
+            };
 
-	    }
+            // The right context is defined by tokens
+            if (this.context.right.isToken()) {
+                endOffset = this.endPos + this.context.right.getLength() - 1;
+                if (DEBUG)
+                    log.trace("PTO will retrieve {} (Right context)", endOffset);
+                pto.add(ldid, endOffset);
 
-	    // The right context is defined by characters
-	    else {
-		endOffsetChar = (endPosChar == -1) ? -1 :
-		    endPosChar + this.context.right.getLength();
-	    };
+            }
 
-	    if (startOffset != -1)
-		startOffsetChar = pto.start(ldid, startOffset);
+            // The right context is defined by characters
+            else {
+                endOffsetChar = (endPosChar == -1) ? -1 : endPosChar
+                        + this.context.right.getLength();
+            };
 
-	    if (endOffset != -1)
-		endOffsetChar = pto.end(ldid, endOffset);
-	};
+            if (startOffset != -1)
+                startOffsetChar = pto.start(ldid, startOffset);
 
-	if (DEBUG)
-	    log.trace("Premature found offsets at {}-{}",
-		      startOffsetChar,
-		      endOffsetChar);
-	
+            if (endOffset != -1)
+                endOffsetChar = pto.end(ldid, endOffset);
+        };
 
-	// This can happen in case of non-token characters
-	// in the match and null offsets
-	if (startOffsetChar > startPosChar)
-	    startOffsetChar = startPosChar;
-	else if (startOffsetChar < 0)
-	    startOffsetChar = 0;
+        if (DEBUG)
+            log.trace("Premature found offsets at {}-{}", startOffsetChar,
+                    endOffsetChar);
 
-	// No "..." at the beginning
-	if (startOffsetChar == 0)
-	    this.startMore = false;
 
-	if (endOffsetChar != -1 && endOffsetChar < endPosChar)
-	    endOffsetChar = endPosChar;
+        // This can happen in case of non-token characters
+        // in the match and null offsets
+        if (startOffsetChar > startPosChar)
+            startOffsetChar = startPosChar;
+        else if (startOffsetChar < 0)
+            startOffsetChar = 0;
 
-	if (DEBUG)
-	    log.trace("The context spans from chars {}-{}",
-		      startOffsetChar, endOffsetChar);
+        // No "..." at the beginning
+        if (startOffsetChar == 0)
+            this.startMore = false;
 
-	// Get snippet information from the primary data
-	if (endOffsetChar > -1 &&
-	    (endOffsetChar < this.getPrimaryDataLength())) {
-	    this.tempSnippet = this.getPrimaryData(
-		startOffsetChar,
-		endOffsetChar
-	    );
-	}
-	else {
-	    this.tempSnippet = this.getPrimaryData(startOffsetChar);
-	    this.endMore = false;
-	};
+        if (endOffsetChar != -1 && endOffsetChar < endPosChar)
+            endOffsetChar = endPosChar;
 
-	if (DEBUG)
-	    log.trace("Snippet: '" + this.tempSnippet + "'");
+        if (DEBUG)
+            log.trace("The context spans from chars {}-{}", startOffsetChar,
+                    endOffsetChar);
 
-	if (DEBUG)
-	    log.trace("The match entry is {}-{} ({}-{}) with absolute offsetChars {}-{}",
-		      startPosChar - startOffsetChar,
-		      endPosChar - startOffsetChar,
-		      startPosChar,
-		      endPosChar,
-		      startOffsetChar,
-		      endOffsetChar);
+        // Get snippet information from the primary data
+        if (endOffsetChar > -1 && (endOffsetChar < this.getPrimaryDataLength())) {
+            this.tempSnippet = this.getPrimaryData(startOffsetChar,
+                    endOffsetChar);
+        }
+        else {
+            this.tempSnippet = this.getPrimaryData(startOffsetChar);
+            this.endMore = false;
+        };
 
-	// TODO: Simplify
-	return new int[]{
-	    startPosChar - startOffsetChar,
-	    endPosChar - startOffsetChar,
-	    -1,
-	    0};
+        if (DEBUG)
+            log.trace("Snippet: '" + this.tempSnippet + "'");
+
+        if (DEBUG)
+            log.trace(
+                    "The match entry is {}-{} ({}-{}) with absolute offsetChars {}-{}",
+                    startPosChar - startOffsetChar, endPosChar
+                            - startOffsetChar, startPosChar, endPosChar,
+                    startOffsetChar, endOffsetChar);
+
+        // TODO: Simplify
+        return new int[] { startPosChar - startOffsetChar,
+                endPosChar - startOffsetChar, -1, 0 };
     };
-    
+
 
     // Identical to Result!
     public String toJsonString () {
-	ObjectNode json = (ObjectNode) mapper.valueToTree(this);
+        ObjectNode json = (ObjectNode) mapper.valueToTree(this);
 
-	// Match was no match
-	if (json.size() == 0)
-	    return "{}";
+        // Match was no match
+        if (json.size() == 0)
+            return "{}";
 
-	if (this.context != null)
-	    json.put("context", this.getContext().toJsonNode());
+        if (this.context != null)
+            json.put("context", this.getContext().toJsonNode());
 
-	if (this.version != null)
-	    json.put("version", this.getVersion());
+        if (this.version != null)
+            json.put("version", this.getVersion());
 
-	try {
-	    return mapper.writeValueAsString(json);
-	}
-	catch (Exception e) {
-	    log.warn(e.getLocalizedMessage());
-	};
+        try {
+            return mapper.writeValueAsString(json);
+        }
+        catch (Exception e) {
+            log.warn(e.getLocalizedMessage());
+        };
 
-	return "{}";
+        return "{}";
     };
 
+
     // Return match as token list
     public ObjectNode toTokenList () {
-	ObjectNode json = mapper.createObjectNode();
+        ObjectNode json = mapper.createObjectNode();
 
-	if (this.getDocID() != null)
-	    json.put("textSigle", this.getDocID());
-	else if (this.getTextSigle() != null)
-	    json.put("textSigle", this.getTextSigle());
+        if (this.getDocID() != null)
+            json.put("textSigle", this.getDocID());
+        else if (this.getTextSigle() != null)
+            json.put("textSigle", this.getTextSigle());
 
-	ArrayNode tokens = json.putArray("tokens");
+        ArrayNode tokens = json.putArray("tokens");
 
-	// Get pto object
-	PositionsToOffset pto = this.positionsToOffset;
+        // Get pto object
+        PositionsToOffset pto = this.positionsToOffset;
 
-	// Add for position retrieval
-	for (int i = this.getStartPos(); i < this.getEndPos(); i++) {
-	    pto.add(this.localDocID, i);
-	};
+        // Add for position retrieval
+        for (int i = this.getStartPos(); i < this.getEndPos(); i++) {
+            pto.add(this.localDocID, i);
+        };
 
-	// Retrieve positions
-	for (int i = this.getStartPos(); i < this.getEndPos(); i++) {
-	    ArrayNode token = tokens.addArray();
-	    for (int offset : pto.span(this.localDocID, i)) {
-		token.add(offset);
-	    };
-	};
+        // Retrieve positions
+        for (int i = this.getStartPos(); i < this.getEndPos(); i++) {
+            ArrayNode token = tokens.addArray();
+            for (int offset : pto.span(this.localDocID, i)) {
+                token.add(offset);
+            };
+        };
 
-	return json;
+        return json;
     };
 
 
     // Remove duplicate identifiers
     // Yeah ... I mean ... why not?
     private void _filterMultipleIdentifiers () {
-	ArrayList<Integer> removeDuplicate = new ArrayList<>(10);
-	HashSet<Integer> identifiers = new HashSet<>(20);
-	for (int i = 0; i < this.span.size(); i++) {
-	    // span is an int array: [Start, End, Number, Dummy]
-	    int highlightNumber = this.span.get(i)[2];
+        ArrayList<Integer> removeDuplicate = new ArrayList<>(10);
+        HashSet<Integer> identifiers = new HashSet<>(20);
+        for (int i = 0; i < this.span.size(); i++) {
+            // span is an int array: [Start, End, Number, Dummy]
+            int highlightNumber = this.span.get(i)[2];
 
-	    // Number is an identifier
-	    if (highlightNumber < -1) {
+            // Number is an identifier
+            if (highlightNumber < -1) {
 
-		// Get the real identifier
-		int idNumber = identifierNumber.get(highlightNumber);
-		if (identifiers.contains(idNumber)) {
-		    removeDuplicate.add(i);
-		}
-		else {
-		    identifiers.add(idNumber);
-		};
-	    };
-	};
+                // Get the real identifier
+                int idNumber = identifierNumber.get(highlightNumber);
+                if (identifiers.contains(idNumber)) {
+                    removeDuplicate.add(i);
+                }
+                else {
+                    identifiers.add(idNumber);
+                };
+            };
+        };
 
-	// Order the duplicates to filter from the tail
-	Collections.sort(removeDuplicate);
-	Collections.reverse(removeDuplicate);
+        // Order the duplicates to filter from the tail
+        Collections.sort(removeDuplicate);
+        Collections.reverse(removeDuplicate);
 
-	// Delete all duplicate identifiers
-	for (int delete : removeDuplicate) {
-	    this.span.remove(delete);
-	};
+        // Delete all duplicate identifiers
+        for (int delete : removeDuplicate) {
+            this.span.remove(delete);
+        };
     };
 
 
@@ -1425,14 +1422,15 @@
      * Get identifier based on class number
      */
     public int getClassID (int nr) {
-	return this.identifierNumber.get(nr);
+        return this.identifierNumber.get(nr);
     };
 
+
     /*
      * Get annotation based on id
      */
     public String getAnnotationID (int nr) {
-	return this.annotationNumber.get(nr);
+        return this.annotationNumber.get(nr);
     };
 
 
@@ -1440,6 +1438,6 @@
      * Get relation based on id
      */
     public Relation getRelationID (int nr) {
-	return this.relationNumber.get(nr);
+        return this.relationNumber.get(nr);
     };
 };
diff --git a/src/main/java/de/ids_mannheim/korap/response/MatchCollector.java b/src/main/java/de/ids_mannheim/korap/response/MatchCollector.java
index afab8b7..46ad3dd 100644
--- a/src/main/java/de/ids_mannheim/korap/response/MatchCollector.java
+++ b/src/main/java/de/ids_mannheim/korap/response/MatchCollector.java
@@ -1,10 +1,13 @@
 package de.ids_mannheim.korap.response;
+
 import de.ids_mannheim.korap.response.Match;
 import de.ids_mannheim.korap.response.Response;
 import java.util.*;
 
 public class MatchCollector extends Response {
     public int totalResultDocs = 0;
+
+
     /*
       private int totalResults;
       private long totalTexts;
@@ -15,22 +18,27 @@
         this.incrTotalResults(matchcount);
     };
 
+
     public MatchCollector setTotalResultDocs (int i) {
         this.totalResultDocs = i;
         return this;
     };
 
+
     public MatchCollector incrTotalResultDocs (int i) {
         this.totalResultDocs += i;
         return this;
     };
 
+
     public int getTotalResultDocs () {
         return totalResultDocs;
     };
 
+
     public void commit () {};
 
+
     public void close () {};
 
     /*
diff --git a/src/main/java/de/ids_mannheim/korap/response/Message.java b/src/main/java/de/ids_mannheim/korap/response/Message.java
index c121c9d..cef0150 100644
--- a/src/main/java/de/ids_mannheim/korap/response/Message.java
+++ b/src/main/java/de/ids_mannheim/korap/response/Message.java
@@ -9,15 +9,15 @@
 
 /**
  * A message for Notifications.
- *
+ * 
  * <p>
  * <blockquote><pre>
- *   Message m = new Message();
- *   m.setCode(614);
- *   m.setMessage("This is a new message");
- *   m.addParameter("MyClass");
+ * Message m = new Message();
+ * m.setCode(614);
+ * m.setMessage("This is a new message");
+ * m.addParameter("MyClass");
  * </pre></blockquote>
- *
+ * 
  * @author Nils Diewald
  * @see de.ids_mannheim.korap.response.Messages
  */
@@ -32,19 +32,22 @@
 
     /**
      * Construct a new message object.
-     *
-     * @param code Code number representing the message code
-     * @param msg String representation of the message
+     * 
+     * @param code
+     *            Code number representing the message code
+     * @param msg
+     *            String representation of the message
      * @return The new message object
      */
     public Message (int code, String msg) {
         this.code = code;
-        this.msg  = msg;
+        this.msg = msg;
     };
 
+
     /**
      * Construct a new message object.
-     *
+     * 
      * @return The new empty message object
      */
     public Message () {};
@@ -52,7 +55,7 @@
 
     /**
      * Return the string representation of the message.
-     *
+     * 
      * @return String representation of the message
      */
     @JsonIgnore
@@ -63,8 +66,9 @@
 
     /**
      * Set the string representation of the message.
-     *
-     * @param msg String representation of the message
+     * 
+     * @param msg
+     *            String representation of the message
      * @return Message object for chaining
      */
     @JsonIgnore
@@ -76,7 +80,7 @@
 
     /**
      * Return the integer code representation of the message.
-     *
+     * 
      * @return Integer code representation of the message
      */
     @JsonIgnore
@@ -88,8 +92,9 @@
 
     /**
      * Set the integer representation of the message.
-     *
-     * @param code Integer code representation of the message
+     * 
+     * @param code
+     *            Integer code representation of the message
      * @return Message object for chaining
      */
     @JsonIgnore
@@ -101,7 +106,7 @@
 
     /**
      * Add additional string parameters to the message.
-     *
+     * 
      * @return Message object for chaining
      */
     public Message addParameter (String param) {
@@ -114,9 +119,10 @@
 
     /**
      * Create a clone of the Message.
-     *
-     * @return The cloned message object 
-     * @throws CloneNotSupportedException if message can't be cloned
+     * 
+     * @return The cloned message object
+     * @throws CloneNotSupportedException
+     *             if message can't be cloned
      */
     public Object clone () throws CloneNotSupportedException {
         Message clone = new Message();
@@ -127,7 +133,7 @@
 
         // Copy message code
         clone.code = this.code;
-        
+
         // Copy parameters
         if (this.parameters != null) {
             for (String p : this.parameters) {
@@ -138,9 +144,10 @@
         return clone;
     };
 
+
     /**
      * Serialize Message as a JsonNode.
-     *
+     * 
      * @return JsonNode representation of the message
      */
     public JsonNode toJsonNode () {
@@ -148,7 +155,7 @@
 
         if (this.code != 0)
             message.add(this.getCode());
-        
+
         message.add(this.getMessage());
         if (parameters != null)
             for (String p : parameters)
@@ -163,7 +170,7 @@
      * <blockquote><pre>
      * [123, "You are not allowed to serialize these messages"]
      * </pre></blockquote>
-     *
+     * 
      * @return String representation of the message
      */
     public String toJsonString () {
@@ -175,8 +182,6 @@
             // Bad in case the message contains quotes!
             msg = ", \"" + e.getLocalizedMessage() + "\"";
         };
-        return
-            "[620, " +
-            "\"Unable to generate JSON\"" + msg + "]";
+        return "[620, " + "\"Unable to generate JSON\"" + msg + "]";
     };
 };
diff --git a/src/main/java/de/ids_mannheim/korap/response/Messages.java b/src/main/java/de/ids_mannheim/korap/response/Messages.java
index 2881185..d9d0627 100644
--- a/src/main/java/de/ids_mannheim/korap/response/Messages.java
+++ b/src/main/java/de/ids_mannheim/korap/response/Messages.java
@@ -13,13 +13,13 @@
 
 /**
  * A list of messages for Notifications.
- *
+ * 
  * <p>
  * <blockquote><pre>
- *   Messages m = new Messages();
- *   m.add(614, "This is a new message");
+ * Messages m = new Messages();
+ * m.add(614, "This is a new message");
  * </pre></blockquote>
- *
+ * 
  * @author diewald
  * @see Notifications
  * @see Message
@@ -36,21 +36,25 @@
     private class MessageIterator implements Iterator<Message> {
         int index;
 
+
         // Constructor
         public MessageIterator () {
             this.index = 0;
         };
 
+
         @Override
         public boolean hasNext () {
             return this.index < messages.size();
         };
 
+
         @Override
         public Message next () {
             return messages.get(this.index++);
         };
 
+
         @Override
         public void remove () {
             messages.remove(this.index);
@@ -68,25 +72,26 @@
 
     /**
      * Get the iterator object.
-     *
+     * 
      * @return Iterator for Message object.
      */
-    public Iterator<Message> iterator() {
+    public Iterator<Message> iterator () {
         return new MessageIterator();
     };
 
 
     /**
      * Append a new message.
-     *
-     * @param code  Integer code representation of the warning
-     * @param msg   String representation of the warning
-     * @param terms Optional strings of additional information
+     * 
+     * @param code
+     *            Integer code representation of the warning
+     * @param msg
+     *            String representation of the warning
+     * @param terms
+     *            Optional strings of additional information
      * @return New Message object
      */
-    public Message add (int code,
-                        String message,
-                        String ... terms) {
+    public Message add (int code, String message, String ... terms) {
         Message newMsg = new Message(code, message);
         messages.add(newMsg);
         if (terms != null)
@@ -98,8 +103,9 @@
 
     /**
      * Append an existing message.
-     *
-     * @param msg Message object to be added. Message will be cloned.
+     * 
+     * @param msg
+     *            Message object to be added. Message will be cloned.
      * @return Cloned Message object
      */
     public Message add (Message msg) {
@@ -108,23 +114,24 @@
             messages.add(msgClone);
             return msgClone;
         }
-        catch (CloneNotSupportedException e) {
-        };
+        catch (CloneNotSupportedException e) {};
         return (Message) null;
     };
 
+
     /**
      * Append an existing message comming from a JsonNode.
-     *
-     * @param node  <code>JsonNode</code> representing a message
+     * 
+     * @param node
+     *            <code>JsonNode</code> representing a message
      * @return New Message object
-     * @throws QueryException if notification is not well formed (Error 750)
+     * @throws QueryException
+     *             if notification is not well formed (Error 750)
      */
     public Message add (JsonNode msg) throws QueryException {
         if (!msg.isArray() || !msg.has(0))
-            throw new QueryException(
-                750, "Passed notifications are not well formed"
-            );
+            throw new QueryException(750,
+                    "Passed notifications are not well formed");
 
         // Valid message
         Message newMsg = new Message();
@@ -132,9 +139,8 @@
         if (msg.get(0).isNumber()) {
             newMsg.setCode(msg.get(0).asInt());
             if (!msg.has(1))
-                throw new QueryException(
-                    750, "Passed notifications are not well formed"
-	            );
+                throw new QueryException(750,
+                        "Passed notifications are not well formed");
             newMsg.setMessage(msg.get(1).asText());
             i++;
         }
@@ -145,7 +151,7 @@
         // Add parameters
         while (msg.has(i))
             newMsg.addParameter(msg.get(i++).asText());
-        
+
         // Add messages to list
         this.add(newMsg);
         return newMsg;
@@ -154,8 +160,10 @@
 
     /**
      * Append existing messages.
-     *
-     * @param msgs Messages object to be added. Messages will be cloned.
+     * 
+     * @param msgs
+     *            Messages object to be added. Messages will be
+     *            cloned.
      * @return Messages object for chaining.
      */
     public Messages add (Messages msgs) {
@@ -163,15 +171,14 @@
             for (Message msg : msgs.getMessages())
                 this.add((Message) msg.clone());
         }
-        catch (CloneNotSupportedException e) {
-        };
+        catch (CloneNotSupportedException e) {};
         return this;
     };
 
 
     /**
      * Clear all messages.
-     *
+     * 
      * @return Messages object for chaining
      */
     public Messages clear () {
@@ -182,8 +189,9 @@
 
     /**
      * Get the number of the messages.
-     *
-     * @param Integer representing the number of messages in the list.
+     * 
+     * @param Integer
+     *            representing the number of messages in the list.
      */
     public int size () {
         return this.messages.size();
@@ -192,9 +200,11 @@
 
     /**
      * Return a specific message based on an index.
-     *
-     * @param index The index of the message in the list of messages.
-     * @return The message in case it exists, otherwise <code>null</code>
+     * 
+     * @param index
+     *            The index of the message in the list of messages.
+     * @return The message in case it exists, otherwise
+     *         <code>null</code>
      */
     @JsonIgnore
     public Message get (int index) {
@@ -206,7 +216,7 @@
 
     /**
      * Return all messages.
-     *
+     * 
      * @return List of all Message objects
      */
     @JsonIgnore
@@ -217,9 +227,10 @@
 
     /**
      * Create a clone of the Messages.
-     *
-     * @return The cloned messages object 
-     * @throws CloneNotSupportedException if messages can't be cloned
+     * 
+     * @return The cloned messages object
+     * @throws CloneNotSupportedException
+     *             if messages can't be cloned
      */
     public Object clone () throws CloneNotSupportedException {
         Messages clone = new Messages();
@@ -233,7 +244,7 @@
 
     /**
      * Serialize Messages as a JsonNode.
-     *
+     * 
      * @return JsonNode representation of all messages
      */
     public JsonNode toJsonNode () {
@@ -249,11 +260,11 @@
      * <p>
      * <blockquote><pre>
      * [
-     *   [123, "You are not allowed to serialize these messages"],
-     *   [124, "Your request was invalid"]
+     * [123, "You are not allowed to serialize these messages"],
+     * [124, "Your request was invalid"]
      * ]
      * </pre></blockquote>
-     *
+     * 
      * @return String representation of all messages
      */
     public String toJsonString () {
@@ -266,8 +277,6 @@
             msg = ", \"" + e.getLocalizedMessage() + "\"";
         };
 
-        return
-            "[620, " +
-            "\"Unable to generate JSON\"" + msg + "]";
+        return "[620, " + "\"Unable to generate JSON\"" + msg + "]";
     };
 };
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 e99d515..0485a0e 100644
--- a/src/main/java/de/ids_mannheim/korap/response/Notifications.java
+++ b/src/main/java/de/ids_mannheim/korap/response/Notifications.java
@@ -15,22 +15,22 @@
 /**
  * A unified notification class for KorAP related errors,
  * warnings and messages.
- *
+ * 
  * <p>
  * The object contains lists of errors, warnings and messages
  * and new warnings, errors or messages are appended to these lists.
- *
+ * 
  * <p>
  * <blockquote><pre>
- *   Notifications n = new Notifications();
- *   n.addWarning(456, "Something went wrong");
- *   if (n.hasWarnings()) {
- *     for (Message msg : n.getWarnings())
- *       System.err.out(msg.getCode() + ": " + msg.getMessage());
- *   };
- *   System.err.println(n.toJsonString());
+ * Notifications n = new Notifications();
+ * n.addWarning(456, "Something went wrong");
+ * if (n.hasWarnings()) {
+ * for (Message msg : n.getWarnings())
+ * System.err.out(msg.getCode() + ": " + msg.getMessage());
+ * };
+ * System.err.println(n.toJsonString());
  * </pre></blockquote>
- *
+ * 
  * @author Nils Diewald
  * @see de.ids_mannheim.korap.response.Messages
  */
@@ -47,10 +47,12 @@
 
     private Messages warnings, errors, messages;
 
+
     /**
      * Check for warnings.
-     *
-     * @return <tt>true</tt> in case there are warnings, otherwise <tt>false</tt>
+     * 
+     * @return <tt>true</tt> in case there are warnings, otherwise
+     *         <tt>false</tt>
      */
     public boolean hasWarnings () {
         if (this.warnings == null || this.warnings.size() == 0)
@@ -61,7 +63,7 @@
 
     /**
      * Return all warnings.
-     *
+     * 
      * @return {@link Messages} representing all warnings
      */
     public Messages getWarnings () {
@@ -71,8 +73,9 @@
 
     /**
      * Set warnings by means of a {@link JsonNode}.
-     *
-     * @param msgs JSON array of warnings.
+     * 
+     * @param msgs
+     *            JSON array of warnings.
      * @return {@link Notifications} object for chaining.
      */
     public Notifications setWarnings (JsonNode msgs) {
@@ -85,9 +88,11 @@
 
     /**
      * Return a specific warning based on an index.
-     *
-     * @param index The index of the warning in the list of warnings.
-     * @return The message in case it exists, otherwise <code>null</code>
+     * 
+     * @param index
+     *            The index of the warning in the list of warnings.
+     * @return The message in case it exists, otherwise
+     *         <code>null</code>
      */
     public Message getWarning (int index) {
         if (this.warnings != null)
@@ -98,10 +103,13 @@
 
     /**
      * Appends a new warning.
-     *
-     * @param code  Integer code representation of the warning
-     * @param msg   String representation of the warning
-     * @param terms Optional strings of additional information
+     * 
+     * @param code
+     *            Integer code representation of the warning
+     * @param msg
+     *            String representation of the warning
+     * @param terms
+     *            Optional strings of additional information
      * @return Notification object for chaining
      */
     public Notifications addWarning (int code, String msg, String ... terms) {
@@ -111,31 +119,34 @@
         return this;
     };
 
+
     /**
      * Appends a new warning.
-     *
-     * @param node  {@link JsonNode} representing a warning message
+     * 
+     * @param node
+     *            {@link JsonNode} representing a warning message
      * @return Notification object for chaining
      */
     public Notifications addWarning (JsonNode node) {
         if (this.warnings == null)
             this.warnings = new Messages();
-    
+
         try {
             this.warnings.add(node);
         }
         catch (QueryException qe) {
             this.warnings.add(qe.getErrorCode(), qe.getMessage());
         };
-        
+
         return this;
     };
 
 
     /**
      * Appends new warnings.
-     *
-     * @param msgs  {@link Messages} representing multiple warnings
+     * 
+     * @param msgs
+     *            {@link Messages} representing multiple warnings
      * @return Notification object for chaining
      */
     public Notifications addWarnings (Messages msgs) {
@@ -149,7 +160,7 @@
 
     /**
      * Return all errors.
-     *
+     * 
      * @return The {@link Messages} object representing all errors
      */
     public Messages getErrors () {
@@ -159,8 +170,9 @@
 
     /**
      * Set errors by means of a {@link JsonNode}.
-     *
-     * @param msgs JSON array of errors.
+     * 
+     * @param msgs
+     *            JSON array of errors.
      * @return Notifications object for chaining.
      */
     public Notifications setErrors (JsonNode msgs) {
@@ -172,9 +184,11 @@
 
     /**
      * Return a specific error based on an index.
-     *
-     * @param index The index of the error in the list of errors.
-     * @return The message in case it exists, otherwise <code>null</code>
+     * 
+     * @param index
+     *            The index of the error in the list of errors.
+     * @return The message in case it exists, otherwise
+     *         <code>null</code>
      */
     public Message getError (int index) {
         if (this.errors != null)
@@ -185,8 +199,9 @@
 
     /**
      * Check for errors.
-     *
-     * @return <tt>true</tt> in case there are errors, otherwise <tt>false</tt>
+     * 
+     * @return <tt>true</tt> in case there are errors, otherwise
+     *         <tt>false</tt>
      */
     public boolean hasErrors () {
         if (this.errors == null || this.errors.size() == 0)
@@ -197,10 +212,13 @@
 
     /**
      * Appends a new error.
-     *
-     * @param code  Integer code representation of the error
-     * @param msg   String representation of the error
-     * @param terms Optional strings of additional information
+     * 
+     * @param code
+     *            Integer code representation of the error
+     * @param msg
+     *            String representation of the error
+     * @param terms
+     *            Optional strings of additional information
      * @return Notification object for chaining
      */
     public Notifications addError (int code, String msg, String ... terms) {
@@ -213,8 +231,9 @@
 
     /**
      * Appends a new error.
-     *
-     * @param node  {@link JsonNode} representing an error message
+     * 
+     * @param node
+     *            {@link JsonNode} representing an error message
      * @return Notification object for chaining
      */
     public Notifications addError (JsonNode msg) {
@@ -226,15 +245,16 @@
         catch (QueryException qe) {
             this.errors.add(qe.getErrorCode(), qe.getMessage());
         };
-        
+
         return this;
     };
 
 
     /**
      * Appends new errors.
-     *
-     * @param msgs  {@link Messages} representing multiple errors
+     * 
+     * @param msgs
+     *            {@link Messages} representing multiple errors
      * @return Notification object for chaining
      */
     public Notifications addErrors (Messages msgs) {
@@ -248,7 +268,7 @@
 
     /**
      * Return all messages.
-     *
+     * 
      * @return {@link Messages} representing all messages
      */
     public Messages getMessages () {
@@ -258,8 +278,9 @@
 
     /**
      * Set messages by means of a {@link JsonNode}.
-     *
-     * @param msgs JSON array of messages.
+     * 
+     * @param msgs
+     *            JSON array of messages.
      * @return Notifications object for chaining.
      */
     public Notifications setMessages (JsonNode msgs) {
@@ -271,9 +292,11 @@
 
     /**
      * Return a specific message based on an index.
-     *
-     * @param index The index of the message in the list of messages.
-     * @return The message in case it exists, otherwise <code>null</code>
+     * 
+     * @param index
+     *            The index of the message in the list of messages.
+     * @return The message in case it exists, otherwise
+     *         <code>null</code>
      */
     public Message getMessage (int index) {
         if (this.messages != null)
@@ -284,8 +307,9 @@
 
     /**
      * Check for messages.
-     *
-     * @return <tt>true</tt> in case there are messages, otherwise <tt>false</tt>
+     * 
+     * @return <tt>true</tt> in case there are messages, otherwise
+     *         <tt>false</tt>
      */
     public boolean hasMessages () {
         if (this.messages == null || this.messages.size() == 0)
@@ -296,10 +320,13 @@
 
     /**
      * Appends a new message.
-     *
-     * @param code  Integer code representation of the message
-     * @param msg   String representation of the message
-     * @param terms Optional strings of additional information
+     * 
+     * @param code
+     *            Integer code representation of the message
+     * @param msg
+     *            String representation of the message
+     * @param terms
+     *            Optional strings of additional information
      * @return Notification object for chaining
      */
     public Notifications addMessage (int code, String msg, String ... terms) {
@@ -312,8 +339,9 @@
 
     /**
      * Appends a new message.
-     *
-     * @param node  {@link JsonNode} representing a message
+     * 
+     * @param node
+     *            {@link JsonNode} representing a message
      * @return Notification object for chaining
      */
     public Notifications addMessage (JsonNode msg) {
@@ -331,8 +359,9 @@
 
     /**
      * Appends new messages.
-     *
-     * @param msgs  {@link Messages} representing multiple messages
+     * 
+     * @param msgs
+     *            {@link Messages} representing multiple messages
      * @return Notification object for chaining
      */
     public Notifications addMessages (Messages msgs) {
@@ -346,8 +375,9 @@
 
     /**
      * Copy notifications from another notification object.
-     *
-     * @param notes Notification object to copy notifications from.
+     * 
+     * @param notes
+     *            Notification object to copy notifications from.
      * @return Notification object for chaining
      */
     public Notifications copyNotificationsFrom (Notifications notes) {
@@ -359,31 +389,29 @@
             if (notes.hasMessages())
                 this.addMessages((Messages) notes.getMessages().clone());
         }
-        catch (CloneNotSupportedException cnse) {
-        };
+        catch (CloneNotSupportedException cnse) {};
         return this;
     };
 
 
     /**
      * Copy notifications from a {@link JsonNode} object.
-     *
-     * @param request Notifications containing {@link JsonNode}.
+     * 
+     * @param request
+     *            Notifications containing {@link JsonNode}.
      * @return Notification object for chaining
      */
     public Notifications copyNotificationsFrom (JsonNode request) {
 
         // Add warnings from JSON
-        if (request.has("warnings") &&
-            request.get("warnings").isArray()) {
+        if (request.has("warnings") && request.get("warnings").isArray()) {
             JsonNode msgs = request.get("warnings");
             for (JsonNode msg : msgs)
                 this.addWarning(msg);
         };
 
         // Add messages from JSON
-        if (request.has("messages") &&
-            request.get("messages").isArray()) {
+        if (request.has("messages") && request.get("messages").isArray()) {
             JsonNode msgs = request.get("messages");
             if (msgs.isArray())
                 for (JsonNode msg : msgs)
@@ -391,14 +419,13 @@
         };
 
         // Add errors from JSON
-        if (request.has("errors") &&
-            request.get("errors").isArray()) {
+        if (request.has("errors") && request.get("errors").isArray()) {
             JsonNode msgs = request.get("errors");
             if (msgs.isArray())
                 for (JsonNode msg : msgs)
                     this.addError(msg);
         };
-        
+
         return this;
     };
 
@@ -406,8 +433,9 @@
     /**
      * Move notifications from a passed {@link Notification} object
      * to the invocant.
-     *
-     * @param notes Notification object.
+     * 
+     * @param notes
+     *            Notification object.
      * @return The invocant object for chaining
      */
     public Notifications moveNotificationsFrom (Notifications notes) {
@@ -419,7 +447,7 @@
 
     /**
      * Clear all notifications.
-     *
+     * 
      * @return Notification object for chaining
      */
     public Notifications clearNotifications () {
@@ -436,12 +464,12 @@
 
     /**
      * Serialize Notifications as a {@link JsonNode}.
-     *
+     * 
      * @return {@link JsonNode} representation of all warnings,
      *         errors, and messages.
      */
     public JsonNode toJsonNode () {
-        ObjectNode json =  mapper.createObjectNode();
+        ObjectNode json = mapper.createObjectNode();
 
         // Add messages
         if (this.hasWarnings())
@@ -450,7 +478,7 @@
             json.put("errors", this.getErrors().toJsonNode());
         if (this.hasMessages())
             json.put("messages", this.getMessages().toJsonNode());
-        
+
         return (JsonNode) json;
     };
 
@@ -460,17 +488,18 @@
      * <p>
      * <blockquote><pre>
      * {
-     *   "errors": [
-     *     [123, "You are not allowed to serialize these messages"],
-     *     [124, "Your request was invalid"]
-     *   ],
-     *   "messages" : [
-     *     [125, "Class is deprecated", "Notifications"]
-     *   ]
+     * "errors": [
+     * [123, "You are not allowed to serialize these messages"],
+     * [124, "Your request was invalid"]
+     * ],
+     * "messages" : [
+     * [125, "Class is deprecated", "Notifications"]
+     * ]
      * }
      * </pre></blockquote>
-     *
-     * @return String representation of all warnings, errors, and messages
+     * 
+     * @return String representation of all warnings, errors, and
+     *         messages
      */
     public String toJsonString () {
         String msg = "";
@@ -485,10 +514,7 @@
             msg = ", \"" + e.getLocalizedMessage() + "\"";
         };
 
-        return
-            "{\"errors\" : [" +
-            "[620, " +
-            "\"Unable to generate JSON\"" + msg + "]" +
-            "]}";
+        return "{\"errors\" : [" + "[620, " + "\"Unable to generate JSON\""
+                + msg + "]" + "]}";
     };
 };
diff --git a/src/main/java/de/ids_mannheim/korap/response/Response.java b/src/main/java/de/ids_mannheim/korap/response/Response.java
index 9e2e603..576d2ad 100644
--- a/src/main/java/de/ids_mannheim/korap/response/Response.java
+++ b/src/main/java/de/ids_mannheim/korap/response/Response.java
@@ -17,15 +17,15 @@
 /**
  * Base class for objects meant to be responded by the server.
  * This inherits KoralQuery requests.
- *
+ * 
  * <p>
  * <blockquote><pre>
- *   Response km = new Response();
- *   System.out.println(
- *     km.toJsonString()
- *   );
+ * Response km = new Response();
+ * System.out.println(
+ * km.toJsonString()
+ * );
  * </pre></blockquote>
- *
+ * 
  * @author diewald
  * @see Notifications
  */
@@ -41,9 +41,8 @@
     private String version, name, node, listener;
     private KrillQuery query;
 
-    private long
-        totalResources = -2, // Not set
-        totalResults   = -2; // Not set
+    private long totalResources = -2, // Not set
+            totalResults = -2; // Not set
     private String benchmark;
     private boolean timeExceeded = false;
 
@@ -56,7 +55,7 @@
 
     /**
      * Get string representation of the backend's version.
-     *
+     * 
      * @return String representation of the backend's version
      */
     public String getVersion () {
@@ -66,8 +65,9 @@
 
     /**
      * Set the string representation of the backend's version.
-     *
-     * @param version The string representation of the backend's version
+     * 
+     * @param version
+     *            The string representation of the backend's version
      * @return Response object for chaining
      */
     public Response setVersion (String fullVersion) {
@@ -89,7 +89,7 @@
     /**
      * Get string representation of the backend's name.
      * All nodes in a cluster should have the same backend name.
-     *
+     * 
      * @return String representation of the backend's name
      */
     public String getName () {
@@ -100,8 +100,9 @@
     /**
      * Set the string representation of the backend's name.
      * All nodes in a cluster should have the same backend name.
-     *
-     * @param name The string representation of the backend's name
+     * 
+     * @param name
+     *            The string representation of the backend's name
      * @return Response object for chaining
      */
     public Response setName (String name) {
@@ -113,7 +114,7 @@
     /**
      * Get string representation of the node's name.
      * Each node in a cluster has a unique name.
-     *
+     * 
      * @return String representation of the node's name
      */
     public String getNode () {
@@ -124,8 +125,9 @@
     /**
      * Set the string representation of the node's name.
      * Each node in a cluster has a unique name.
-     *
-     * @param version The string representation of the node's name
+     * 
+     * @param version
+     *            The string representation of the node's name
      * @return Response object for chaining
      */
     public Response setNode (String name) {
@@ -136,7 +138,7 @@
 
     /**
      * Check if the response time was exceeded.
-     *
+     * 
      * @return <tt>true</tt> in case the response had a timeout,
      *         otherwise <tt>false</tt>
      */
@@ -144,17 +146,18 @@
     public boolean hasTimeExceeded () {
         return this.timeExceeded;
     };
-    
+
 
     /**
      * Set to <tt>true</tt> if time is exceeded
      * based on a timeout.
-     *
+     * 
      * <p>
      * Will add a warning (682) to the output.
-     *
-     * @param timeout Either <tt>true</tt> or <tt>false</tt>,
-     * in case the response timed out
+     * 
+     * @param timeout
+     *            Either <tt>true</tt> or <tt>false</tt>,
+     *            in case the response timed out
      * @return Response object for chaining
      */
     public Response setTimeExceeded (boolean timeout) {
@@ -167,50 +170,53 @@
 
     /**
      * Get the benchmark time as a string.
-     *
+     * 
      * @return String representation of the benchmark
      *         (including trailing time unit)
      */
     public String getBenchmark () {
         return this.benchmark;
     };
-    
+
 
     /**
      * Set the benchmark as timestamp differences.
-     *
-     * @param ts1 Starting time of the benchmark
-     * @param ts2 Ending time of the benchmark
+     * 
+     * @param ts1
+     *            Starting time of the benchmark
+     * @param ts2
+     *            Ending time of the benchmark
      * @return Response object for chaining
      */
     @JsonIgnore
     public Response setBenchmark (long ts1, long ts2) {
-        this.benchmark =
-            (ts2 - ts1) < 100_000_000 ?
-            // Store as miliseconds
-            (((double) (ts2 - ts1) * 1e-6) + " ms") :
-            // Store as seconds
-            (((double) (ts2 - ts1) / 1000000000.0) + " s");
+        this.benchmark = (ts2 - ts1) < 100_000_000 ?
+        // Store as miliseconds
+        (((double) (ts2 - ts1) * 1e-6) + " ms")
+                :
+                // Store as seconds
+                (((double) (ts2 - ts1) / 1000000000.0) + " s");
         return this;
     };
-    
+
 
     /**
      * Set the benchmark as a string representation.
-     *
-     * @param bm String representation of a benchmark
-     *           (including trailing time unit)
+     * 
+     * @param bm
+     *            String representation of a benchmark
+     *            (including trailing time unit)
      * @return Response for chaining
      */
     public Response setBenchmark (String bm) {
         this.benchmark = bm;
         return this;
     };
-    
+
 
     /**
      * Get the listener URI as a string.
-     *
+     * 
      * @return The listener URI as a string representation
      */
     public String getListener () {
@@ -219,15 +225,17 @@
 
 
     /**
-     * Set the listener URI as a String. This is probably the localhost
+     * Set the listener URI as a String. This is probably the
+     * localhost
      * with an arbitrary port, like
-     *
+     * 
      * <p>
      * <blockquote><pre>
-     *   http://localhost:8080/
+     * http://localhost:8080/
      * </pre></blockquote>
-     *
-     * @param listener String representation of the listener URI
+     * 
+     * @param listener
+     *            String representation of the listener URI
      * @return Response object for chaining
      */
     public Response setListener (String listener) {
@@ -238,7 +246,7 @@
 
     /**
      * Get the total number of results.
-     *
+     * 
      * @return The total number of results.
      */
     public long getTotalResults () {
@@ -250,8 +258,9 @@
 
     /**
      * Set the total number of results.
-     *
-     * @param results The total number of results.
+     * 
+     * @param results
+     *            The total number of results.
      * @return {link Response} object for chaining.
      */
     public Response setTotalResults (long results) {
@@ -262,9 +271,10 @@
 
     /**
      * Increment the total number of results by a certain value.
-     *
-     * @param incr The number of results the total number should
-     *        be incremented by.
+     * 
+     * @param incr
+     *            The number of results the total number should
+     *            be incremented by.
      * @return {@link Response} object for chaining.
      */
     public Response incrTotalResults (int incr) {
@@ -279,7 +289,7 @@
     /**
      * Get the total number of resources the total number of
      * results occur in.
-     *
+     * 
      * @return The total number of resources the total number of
      *         results occur in.
      */
@@ -293,9 +303,10 @@
     /**
      * Set the total number of resources the total number of
      * results occur in.
-     *
-     * @param resources The total number of resources the total
-     *        number of results occur in.
+     * 
+     * @param resources
+     *            The total number of resources the total
+     *            number of results occur in.
      * @return {@link Response} object for chaining.
      */
     public Response setTotalResources (long resources) {
@@ -307,10 +318,11 @@
     /**
      * Increment the total number of resources the total number
      * of results occur in by a certain value.
-     *
-     * @param incr The number of resources the total number of
-     *        results occur in should be incremented by.
-     *        (I don't care that this isn't English!)
+     * 
+     * @param incr
+     *            The number of resources the total number of
+     *            results occur in should be incremented by.
+     *            (I don't care that this isn't English!)
      * @return {@link Response} object for chaining.
      */
     public Response incrTotalResources (int i) {
@@ -324,7 +336,7 @@
 
     /**
      * Get the KoralQuery query object.
-     *
+     * 
      * @return The {@link KrillQuery} object,
      *         representing the KoralQuery query object.
      */
@@ -339,9 +351,10 @@
 
     /**
      * Set the KoralQuery query object.
-     *
-     * @param query The {@link KrillQuery} object,
-     *        representing the KoralQuery query object.
+     * 
+     * @param query
+     *            The {@link KrillQuery} object,
+     *            representing the KoralQuery query object.
      * @return The {@link Response} object for chaining
      */
     @JsonIgnore
@@ -357,7 +370,7 @@
      * Get the associated collection object.
      * In case no collection information was defined yet,
      * a new {@link KrillCollection} object will be created.
-     *
+     * 
      * @return The attached {@link KrillCollection} object.
      */
     @JsonIgnore
@@ -370,24 +383,25 @@
 
     /**
      * Set a new {@link KrillCollection} object.
-     *
-     * @param collection A {@link KrillCollection} object.
+     * 
+     * @param collection
+     *            A {@link KrillCollection} object.
      * @return The {@link Response} object for chaining
      */
     @JsonIgnore
     public Response setCollection (KrillCollection collection) {
         this.collection = collection;
-        
+
         // Move messages from the collection
         return (Response) this.moveNotificationsFrom(collection);
     };
 
-    
+
     /**
      * Get the associated meta object.
      * In case no meta information was defined yet,
      * a new {@link KrillMeta} object will be created.
-     *
+     * 
      * @return The attached {@link KrillMeta} object.
      */
     @JsonIgnore
@@ -400,14 +414,15 @@
 
     /**
      * Set a new {@link KrillMeta} object.
-     *
-     * @param meta A {@link KrillMeta} object.
+     * 
+     * @param meta
+     *            A {@link KrillMeta} object.
      * @return The {@link Response} object for chaining
      */
     @JsonIgnore
     public Response setMeta (KrillMeta meta) {
         this.meta = meta;
-        
+
         // Move messages from the collection
         return (Response) this.moveNotificationsFrom(meta);
     };
@@ -415,7 +430,7 @@
 
     /**
      * Serialize response as a {@link JsonNode}.
-     *
+     * 
      * @return {@link JsonNode} representation of the response
      */
     @Override
@@ -427,7 +442,7 @@
         StringBuilder sb = new StringBuilder();
         if (this.getName() != null) {
             sb.append(this.getName());
-            
+
             if (this.getVersion() != null)
                 sb.append("-");
         };
@@ -438,10 +453,10 @@
 
         if (sb.length() > 0)
             json.put("version", sb.toString());
-        
+
         if (this.timeExceeded)
             json.put("timeExceeded", true);
-        
+
         if (this.getNode() != null)
             json.put("node", this.getNode());
 
@@ -454,7 +469,7 @@
         // totalResources is set
         if (this.totalResources != -2)
             json.put("totalResources", this.totalResources);
-        
+
         // totalResults is set
         if (this.totalResults != -2)
             json.put("totalResults", this.totalResults);
@@ -474,8 +489,8 @@
         };
 
         // KoralQuery collection object
-        if (this.collection != null &&
-            this.collection.getFilters().toArray().length > 0) {
+        if (this.collection != null
+                && this.collection.getFilters().toArray().length > 0) {
             JsonNode collNode = this.collection.toJsonNode();
             if (collNode != null)
                 json.put("collection", collNode);
@@ -490,21 +505,21 @@
      * <p>
      * <blockquote><pre>
      * {
-     *   "version" : "Lucene-Backend-0.49.1",
-     *   "timeExceeded" : true,
-     *   "node" : "Tanja",
-     *   "listener" : "http://localhost:8080/",
-     *   "benchmark" : "12.3s",
-     *   "errors": [
-     *     [123, "You are not allowed to serialize these messages"],
-     *     [124, "Your request was invalid"]
-     *   ],
-     *   "messages" : [
-     *     [125, "Class is deprecated", "Notifications"]
-     *   ]
+     * "version" : "Lucene-Backend-0.49.1",
+     * "timeExceeded" : true,
+     * "node" : "Tanja",
+     * "listener" : "http://localhost:8080/",
+     * "benchmark" : "12.3s",
+     * "errors": [
+     * [123, "You are not allowed to serialize these messages"],
+     * [124, "Your request was invalid"]
+     * ],
+     * "messages" : [
+     * [125, "Class is deprecated", "Notifications"]
+     * ]
      * }
      * </pre></blockquote>
-     *
+     * 
      * @return String representation of the response
      */
     public String toJsonString () {
@@ -517,10 +532,7 @@
             msg = ", \"" + e.getLocalizedMessage() + "\"";
         };
 
-        return
-            "{\"errors\":["+
-            "[620, " +
-            "\"Unable to generate JSON\"" + msg + "]" +
-            "]}";
+        return "{\"errors\":[" + "[620, " + "\"Unable to generate JSON\"" + msg
+                + "]" + "]}";
     };
 };
diff --git a/src/main/java/de/ids_mannheim/korap/response/Result.java b/src/main/java/de/ids_mannheim/korap/response/Result.java
index 23bbcca..e6df367 100644
--- a/src/main/java/de/ids_mannheim/korap/response/Result.java
+++ b/src/main/java/de/ids_mannheim/korap/response/Result.java
@@ -28,9 +28,9 @@
 */
 /**
  * Response class for search results.
- *
+ * 
  * TODO: Synopsis and let it base on KoralQuery
- *
+ * 
  * @author diewald
  * @see Response
  */
@@ -40,7 +40,7 @@
     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;
@@ -50,9 +50,7 @@
 
     private SearchContext context;
 
-    private short
-        itemsPerPage     = ITEMS_PER_PAGE,
-        itemsPerResource = 0;
+    private short itemsPerPage = ITEMS_PER_PAGE, itemsPerResource = 0;
 
     private JsonNode request;
 
@@ -64,23 +62,25 @@
     /**
      * Construct a new Result object.
      */
-    public Result() {
+    public Result () {
         mapper.enable(SerializationFeature.INDENT_OUTPUT);
     };
 
 
     /**
      * Construct a new Result object.
-     *
-     * @param serialQuery Query representation as a string.
-     * @param startIndex Offset position in match array.
-     * @param itemsPerPage Number of matches per page.
-     * @param context Requested {@link SearchContext}
+     * 
+     * @param serialQuery
+     *            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 Result(String query,
-                       int startIndex,
-                       short itemsPerPage,
-                       SearchContext context) {
+    public Result (String query, int startIndex, short itemsPerPage,
+                   SearchContext context) {
 
         mapper.enable(SerializationFeature.INDENT_OUTPUT);
         // mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
@@ -89,17 +89,17 @@
         this.matches = new ArrayList<>(itemsPerPage);
         this.serialQuery = query;
         this.startIndex = startIndex;
-        this.itemsPerPage =
-            (itemsPerPage > ITEMS_PER_PAGE_MAX || itemsPerPage < 1) ?
-            ITEMS_PER_PAGE : itemsPerPage;
+        this.itemsPerPage = (itemsPerPage > ITEMS_PER_PAGE_MAX || itemsPerPage < 1) ? ITEMS_PER_PAGE
+                : itemsPerPage;
         this.context = context;
     };
 
 
     /**
      * Add a new match to the result set.
-     *
-     * @param match A {@link Match} to add.
+     * 
+     * @param match
+     *            A {@link Match} to add.
      */
     public void add (Match km) {
         this.matches.add(km);
@@ -108,7 +108,7 @@
 
     /**
      * Get the number of items (documents) shown per page.
-     *
+     * 
      * @return Number of items shown per page.
      */
     public short getItemsPerPage () {
@@ -118,8 +118,9 @@
 
     /**
      * Set the number of items (documents) shown per page.
-     *
-     * @param count Number of items shown per page.
+     * 
+     * @param count
+     *            Number of items shown per page.
      * @return {@link Result} object for chaining.
      */
     public Result setItemsPerPage (short count) {
@@ -130,7 +131,7 @@
 
     /**
      * Get serialized query as a {@link JsonNode}.
-     *
+     * 
      * @return {@link JsonNode} representation of the query object.
      */
     public JsonNode getRequest () {
@@ -140,10 +141,11 @@
 
     /**
      * Set serialized query as a {@link JsonNode}.
-     *
-     * @param request {@link JsonNode} representation of the query object.
+     * 
+     * @param request
+     *            {@link JsonNode} representation of the query object.
      * @return {@link Result} object for chaining.
-     */    
+     */
     public Result setRequest (JsonNode request) {
         this.request = request;
         return this;
@@ -153,7 +155,7 @@
     /**
      * Get the number of items shown per resource (document).
      * Defaults to <tt>0</tt>, which is infinite.
-     *
+     * 
      * @return The number of items shown per resource.
      */
     public short getItemsPerResource () {
@@ -164,8 +166,9 @@
     /**
      * Set the number of items (matches) shown per resource (text).
      * Defaults to <tt>0</tt>, which is infinite.
-     *
-     * @param value The number of items shown per resource.
+     * 
+     * @param value
+     *            The number of items shown per resource.
      * @return {@link Result} object for chaining.
      */
     public Result setItemsPerResource (short value) {
@@ -175,10 +178,12 @@
 
 
     /**
-     * Set the number of items (matches) shown per resource (document).
+     * Set the number of items (matches) shown per resource
+     * (document).
      * Defaults to <tt>0</tt>, which is infinite.
-     *
-     * @param value The number of items shown per resource.
+     * 
+     * @param value
+     *            The number of items shown per resource.
      * @return {@link Result} object for chaining.
      */
     public Result setItemsPerResource (int value) {
@@ -189,7 +194,7 @@
 
     /**
      * Get the string representation of the search query.
-     *
+     * 
      * @return The string representation of the search query.
      */
     public String getSerialQuery () {
@@ -199,9 +204,10 @@
 
     /**
      * Get a certain {@link Match} by index.
-     *
-     * @param index The numerical index of the match,
-     *        starts with <tt>0</tt>.
+     * 
+     * @param index
+     *            The numerical index of the match,
+     *            starts with <tt>0</tt>.
      * @return The {@link Match} object.
      */
     @JsonIgnore
@@ -212,10 +218,10 @@
 
     /**
      * Get the list of {@link Match} matches.
-     *
+     * 
      * @return The list of {@link Match} objects.
      */
-    public List<Match> getMatches() {
+    public List<Match> getMatches () {
         return this.matches;
     };
 
@@ -223,7 +229,7 @@
     /**
      * Get the number of the first match in the result set
      * (<i>aka</i> the offset). Starts with <tt>0</tt>.
-     *
+     * 
      * @return The index number of the first match in the result set.
      */
     public int getStartIndex () {
@@ -234,7 +240,7 @@
     /**
      * Get the context parameters of the search by means of a
      * {@link SearchContext} object.
-     *
+     * 
      * @return The {@link SearchContext} object.
      */
     public SearchContext getContext () {
@@ -245,9 +251,10 @@
     /**
      * Set the context parameters of the search by means of a
      * {@link SearchContext} object.
-     *
-     * @param context The {@link SearchContext} object providing
-     *        search context parameters.
+     * 
+     * @param context
+     *            The {@link SearchContext} object providing
+     *            search context parameters.
      * @return {@link Result} object for chaining.
      */
     public Result setContext (SearchContext context) {
@@ -258,7 +265,7 @@
 
     /**
      * Serialize the result set as a {@link JsonNode}.
-     *
+     * 
      * @return {@link JsonNode} representation of the search results.
      */
     public JsonNode toJsonNode () {
@@ -293,29 +300,24 @@
         return json;
     };
 
+
     /**
      * Stringifies the matches to give a brief overview on
      * the result. Mainly used for testing.
-     *
-     * @return The stringified matches 
+     * 
+     * @return The stringified matches
      */
     public String getOverview () {
         StringBuilder sb = new StringBuilder();
 
-        sb.append("Search for: ")
-            .append(this.serialQuery)
-            .append("\n");
+        sb.append("Search for: ").append(this.serialQuery).append("\n");
 
         int i = 1;
 
         // Add matches as bracket strings
         for (Match km : this.getMatches())
-            sb.append(i++)
-                .append(": ")
-                .append(km.getSnippetBrackets())
-                .append(" (Doc ")
-                .append(km.getLocalDocID())
-                .append(")\n");
+            sb.append(i++).append(": ").append(km.getSnippetBrackets())
+                    .append(" (Doc ").append(km.getLocalDocID()).append(")\n");
 
         return sb.toString();
     };
@@ -325,9 +327,9 @@
     @Deprecated
     public String toTokenListJsonString () {
         ObjectNode json = (ObjectNode) mapper.valueToTree(this);
-        
+
         ArrayNode array = json.putArray("matches");
-	
+
         // Add matches as token lists
         for (Match km : this.getMatches())
             array.add(km.toTokenList());
@@ -338,7 +340,7 @@
         catch (Exception e) {
             log.warn(e.getLocalizedMessage());
         };
-        
+
         return "{}";
     };
 };
diff --git a/src/main/java/de/ids_mannheim/korap/response/SearchContext.java b/src/main/java/de/ids_mannheim/korap/response/SearchContext.java
index 451dcd2..91ebaa6 100644
--- a/src/main/java/de/ids_mannheim/korap/response/SearchContext.java
+++ b/src/main/java/de/ids_mannheim/korap/response/SearchContext.java
@@ -1,4 +1,5 @@
 package de.ids_mannheim.korap.response;
+
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.SerializationFeature;
 import com.fasterxml.jackson.databind.JsonNode;
@@ -18,21 +19,22 @@
     public String spanContext;
 
     {
-        left  = new SearchContextSide();
+        left = new SearchContextSide();
         right = new SearchContextSide();
     };
 
+
     public SearchContext () {};
 
+
     public SearchContext (String spanContext) {
         this.spanType = true;
         this.spanContext = spanContext;
     };
 
-    public SearchContext (boolean leftTokenContext,
-                          short leftContext,
-                          boolean rightTokenContext,
-                          short rightContext) {
+
+    public SearchContext (boolean leftTokenContext, short leftContext,
+                          boolean rightTokenContext, short rightContext) {
         this.spanType = false;
         this.left.setToken(leftTokenContext);
         this.left.setLength(leftContext);
@@ -40,24 +42,27 @@
         this.right.setLength(rightContext);
     };
 
+
     public boolean isSpanDefined () {
         return this.spanType;
     };
 
+
     public String getSpanContext () {
         return this.spanContext;
     };
 
+
     public SearchContext setSpanContext (String spanContext) {
         this.spanType = true;
-        
+
         if (spanContext.equals("sentence")) {
             spanContext = "s";
         }
         else if (spanContext.equals("paragraph")) {
             spanContext = "p";
         };
-	
+
         this.spanContext = spanContext;
         return this;
     };
@@ -66,29 +71,35 @@
         private boolean type = true;
         private short length = 6;
         private short maxLength = 500;
-        
+
+
         public boolean isToken () {
             return this.type;
         };
-        
+
+
         public boolean isCharacter () {
             return !(this.type);
         };
 
+
         public SearchContextSide setToken (boolean value) {
             this.type = value;
             return this;
         };
 
+
         public SearchContextSide setCharacter (boolean value) {
             this.type = !(value);
             return this;
         };
 
-        public short getLength() {
+
+        public short getLength () {
             return this.length;
         };
-	
+
+
         public SearchContextSide setLength (short value) {
             if (value >= 0) {
                 if (value <= maxLength) {
@@ -100,11 +111,13 @@
             };
             return this;
         };
-        
+
+
         public SearchContextSide setLength (int value) {
             return this.setLength((short) value);
         };
 
+
         public void fromJson (JsonNode json) {
             String type = json.get(0).asText();
             if (type.equals("token")) {
@@ -122,7 +135,7 @@
         if (context.isContainerNode()) {
             if (context.has("left"))
                 this.left.fromJson(context.get("left"));
-            
+
             if (context.has("right"))
                 this.right.fromJson(context.get("right"));
         }
@@ -131,15 +144,16 @@
         };
     };
 
+
     public JsonNode toJsonNode () {
-        
+
         if (this.isSpanDefined())
             return new TextNode(this.spanContext);
-	
+
         ArrayNode leftContext = mapper.createArrayNode();
         leftContext.add(this.left.isToken() ? "token" : "char");
         leftContext.add(this.left.getLength());
-        
+
         ArrayNode rightContext = mapper.createArrayNode();
         rightContext.add(this.right.isToken() ? "token" : "char");
         rightContext.add(this.right.getLength());
@@ -147,7 +161,7 @@
         ObjectNode context = mapper.createObjectNode();
         context.put("left", leftContext);
         context.put("right", rightContext);
-        
+
         return context;
     };
 };
diff --git a/src/main/java/de/ids_mannheim/korap/response/collector/MatchCollectorDB.java b/src/main/java/de/ids_mannheim/korap/response/collector/MatchCollectorDB.java
index d58b473..2cfa252 100644
--- a/src/main/java/de/ids_mannheim/korap/response/collector/MatchCollectorDB.java
+++ b/src/main/java/de/ids_mannheim/korap/response/collector/MatchCollectorDB.java
@@ -1,4 +1,5 @@
 package de.ids_mannheim.korap.response.collector;
+
 import de.ids_mannheim.korap.server.Node;
 import de.ids_mannheim.korap.response.Match;
 import de.ids_mannheim.korap.response.MatchCollector;
@@ -31,6 +32,7 @@
     private Connection connection;
     private PreparedStatement prepared;
 
+
     /*
      * Create a new collector for database connections
      */
@@ -40,6 +42,7 @@
         this.matchCollector = new ArrayList<int[]>(bufferSize + 2);
     };
 
+
     /*
      * Add matches till the bufferSize exceeds - then commit to the database.
      */
@@ -49,22 +52,26 @@
 
         this.incrTotalResultDocs(1);
         this.incrTotalResults(matchCount);
-        this.matchCollector.add(new int[]{UID, matchCount});
+        this.matchCollector.add(new int[] { UID, matchCount });
         this.docCollect++;
     };
 
+
     @JsonIgnore
     public void setDatabaseType (String type) {
         this.databaseType = type;
     };
 
+
     @JsonIgnore
     public String getDatabaseType () {
         return this.databaseType;
     };
 
+
     @JsonIgnore
-    public void setDBPool (String type, DataSource ds, Connection conn) throws SQLException {
+    public void setDBPool (String type, DataSource ds, Connection conn)
+            throws SQLException {
         this.setDatabaseType(type);
         this.connection = conn;
         this.pool = ds;
@@ -76,6 +83,8 @@
         this.setDatabaseType(type);
         this.pool = ds;
     };
+
+
     /*
       Create prepared statement for multiple requests
       this.prepared = this.conn.prepareStatement(
@@ -85,25 +94,24 @@
       Difference between mariadb and sqlite!
     */
 
-    
+
     /* TODO: Ensure the commit was successful! */
-    public void commit () {	
+    public void commit () {
         if (this.pool == null)
             return;
 
         try {
-	    /*
-	     * This should be heavily optimized! It's aweful!
-	     * ARGHHHHHHH!
-	     */
+            /*
+             * This should be heavily optimized! It's aweful!
+             * ARGHHHHHHH!
+             */
             if (this.connection.isClosed())
                 this.connection = this.pool.getConnection();
 
             StringBuilder sb = new StringBuilder();
-            sb.append("INSERT INTO ")
-                .append(this.resultID)
-                .append(" (text_id, match_count) ");
-            
+            sb.append("INSERT INTO ").append(this.resultID)
+                    .append(" (text_id, match_count) ");
+
             // SQLite batch insertion idiom
             if (this.getDatabaseType().equals("sqlite")) {
                 for (int i = 1; i < this.docCollect; i++) {
@@ -123,7 +131,7 @@
                 };
                 sb.append("(?,?)");
             }
-            
+
             // Unknown idiom
             else {
                 log.error("Unsupported Database type");
@@ -131,10 +139,11 @@
             };
 
             // Prepare statement based on the string
-            PreparedStatement prep = this.connection.prepareStatement(sb.toString());
+            PreparedStatement prep = this.connection.prepareStatement(sb
+                    .toString());
 
             int i = 1;
-            ListIterator li = this.matchCollector.listIterator(); 
+            ListIterator li = this.matchCollector.listIterator();
             while (li.hasNext()) {
                 int[] v = (int[]) li.next();
                 prep.setInt(i++, v[0]);
@@ -156,6 +165,7 @@
         return;
     };
 
+
     /*
      * Close collector and connection
      */
@@ -164,11 +174,12 @@
         try {
             this.connection.close();
         }
-       	catch (SQLException e) {
+        catch (SQLException e) {
             log.warn(e.getLocalizedMessage());
         }
     };
 
+
     /*
      * Close collector and probably connection
      */
diff --git a/src/main/java/de/ids_mannheim/korap/response/match/DocIdentifier.java b/src/main/java/de/ids_mannheim/korap/response/match/DocIdentifier.java
index 8680742..2526e94 100644
--- a/src/main/java/de/ids_mannheim/korap/response/match/DocIdentifier.java
+++ b/src/main/java/de/ids_mannheim/korap/response/match/DocIdentifier.java
@@ -1,4 +1,5 @@
 package de.ids_mannheim.korap.response.match;
+
 import java.util.*;
 import java.util.regex.*;
 
@@ -6,19 +7,23 @@
 public class DocIdentifier {
     protected String corpusID, docID;
 
+
     public String getCorpusID () {
         return this.corpusID;
     };
 
+
     public void setCorpusID (String id) {
         if (id != null && !id.contains("!"))
             this.corpusID = id;
     };
 
+
     public String getDocID () {
         return this.docID;
     };
 
+
     public void setDocID (String id) {
         if (id != null && !id.contains("!"))
             this.docID = id;
diff --git a/src/main/java/de/ids_mannheim/korap/response/match/HighlightCombinator.java b/src/main/java/de/ids_mannheim/korap/response/match/HighlightCombinator.java
index adce408..8292e4a 100644
--- a/src/main/java/de/ids_mannheim/korap/response/match/HighlightCombinator.java
+++ b/src/main/java/de/ids_mannheim/korap/response/match/HighlightCombinator.java
@@ -21,56 +21,65 @@
 
     private LinkedList<HighlightCombinatorElement> combine;
     private Stack<Integer> balanceStack = new Stack<>();
-    private Stack<Integer> tempStack    = new Stack<>();
+    private Stack<Integer> tempStack = new Stack<>();
+
 
     // Empty constructor
     public HighlightCombinator () {
         this.combine = new LinkedList<>();
     };
 
+
     // Return the combination list
     public LinkedList<HighlightCombinatorElement> list () {
         return this.combine;
     };
 
+
     // get the first element (without removing)
     public HighlightCombinatorElement getFirst () {
         return this.combine.getFirst();
     };
 
+
     // get the last element (without removing)
     public HighlightCombinatorElement getLast () {
         return this.combine.getLast();
     };
 
+
     // get an element by index (without removing)
     public HighlightCombinatorElement get (int index) {
         return this.combine.get(index);
     };
 
+
     // Get the size of the combinator stack
     public short size () {
         return (short) this.combine.size();
     };
 
+
     // Add primary data to the stack
     public void addString (String characters) {
         this.combine.add(new HighlightCombinatorElement(characters));
     };
 
+
     // Add opening highlight combinator to the stack
     public void addOpen (int number) {
         this.combine.add(new HighlightCombinatorElement((byte) 1, number));
         this.balanceStack.push(number);
     };
 
+
     // Add closing highlight combinator to the stack
     public void addClose (int number) {
         HighlightCombinatorElement lastComb;
 
         // Clean up temporary stack
         this.tempStack.clear();
-        
+
         // Check if there is an opening tag at least
         if (this.balanceStack.empty()) {
             if (DEBUG)
@@ -80,7 +89,8 @@
 
         // Just some debug information
         if (DEBUG) {
-            StringBuilder sb = new StringBuilder("Stack for checking with class ");
+            StringBuilder sb = new StringBuilder(
+                    "Stack for checking with class ");
             sb.append(number).append(" is ");
             for (int s : this.balanceStack) {
                 sb.append('[').append(s).append(']');
@@ -91,26 +101,22 @@
         // class number of the last element
         // It's already ensured the stack is not empty
         int eold = this.balanceStack.pop();
-        
+
         // the closing element is not balanced, i.e. the last element differs
         while (eold != number) {
-            
+
             // Retrieve last combinator on stack
             lastComb = this.combine.peekLast();
-            
+
             if (DEBUG)
-                log.trace("Closing element is unbalanced - {} " +
-                          "!= {} with lastComb {}|{}|{}",
-                          eold,
-                          number,
-                          lastComb.type,
-                          lastComb.number,
-                          lastComb.characters);
+                log.trace("Closing element is unbalanced - {} "
+                        + "!= {} with lastComb {}|{}|{}", eold, number,
+                        lastComb.type, lastComb.number, lastComb.characters);
 
             // combinator is opening and the number is not equal to the last
             // element on the balanceStack
             if (lastComb.type == 1 && lastComb.number == eold) {
-                
+
                 // Remove the last element - it's empty and uninteresting!
                 this.combine.removeLast();
             }
@@ -120,9 +126,10 @@
 
                 if (DEBUG)
                     log.trace("close element a) {}", eold);
-		
+
                 // Add a closer for the old element (this has following elements)
-                this.combine.add(new HighlightCombinatorElement((byte) 2, eold, false));
+                this.combine.add(new HighlightCombinatorElement((byte) 2, eold,
+                        false));
             };
 
             // add this element number temporarily on the stack
@@ -136,20 +143,12 @@
         lastComb = this.combine.peekLast();
 
         if (DEBUG) {
-            log.trace("LastComb: " +
-                      lastComb.type +
-                      '|' +
-                      lastComb.number +
-                      '|' + lastComb.characters +
-                      " for " +
-                      number);
-            log.trace("Stack for checking 2: {}|{}|{}|{}",
-                      lastComb.type,
-                      lastComb.number,
-                      lastComb.characters,
-                      number);
+            log.trace("LastComb: " + lastComb.type + '|' + lastComb.number
+                    + '|' + lastComb.characters + " for " + number);
+            log.trace("Stack for checking 2: {}|{}|{}|{}", lastComb.type,
+                    lastComb.number, lastComb.characters, number);
         };
-        
+
         if (lastComb.type == 1 && lastComb.number == number) {
             while (lastComb.type == 1 && lastComb.number == number) {
                 // Remove the damn thing - It's empty and uninteresting!
@@ -160,7 +159,7 @@
         else {
             if (DEBUG)
                 log.trace("close element b) {}", number);
-	    
+
             // Add a closer
             this.combine.add(new HighlightCombinatorElement((byte) 2, number));
         };
@@ -174,6 +173,7 @@
         };
     };
 
+
     // Get all combined elements as a string
     public String toString () {
         StringBuilder sb = new StringBuilder();
diff --git a/src/main/java/de/ids_mannheim/korap/response/match/HighlightCombinatorElement.java b/src/main/java/de/ids_mannheim/korap/response/match/HighlightCombinatorElement.java
index 8eee7f0..55837b8 100644
--- a/src/main/java/de/ids_mannheim/korap/response/match/HighlightCombinatorElement.java
+++ b/src/main/java/de/ids_mannheim/korap/response/match/HighlightCombinatorElement.java
@@ -22,29 +22,33 @@
     public String characters;
     public boolean terminal = true;
 
+
     // Constructor for highlighting elements
     public HighlightCombinatorElement (byte type, int number) {
         this.type = type;
         this.number = number;
     };
 
+
     // Constructor for highlighting elements,
     // that may not be terminal, i.e. they were closed and will
     // be reopened for overlapping issues.
     public HighlightCombinatorElement (byte type, int number, boolean terminal) {
-        this.type     = type;
-        this.number   = number;
+        this.type = type;
+        this.number = number;
         this.terminal = terminal;
     };
 
+
     // Constructor for textual data
     public HighlightCombinatorElement (String characters) {
         this.type = (byte) 0;
         this.characters = characters;
     };
 
+
     // Return html fragment for this combinator element
-    public String toHTML (Match match, FixedBitSet level, byte[] levelCache) {	    
+    public String toHTML (Match match, FixedBitSet level, byte[] levelCache) {
         // Opening
         if (this.type == 1) {
             StringBuilder sb = new StringBuilder();
@@ -54,24 +58,22 @@
 
             else if (this.number < -1) {
                 sb.append("<span xml:id=\"")
-                    .append(match.getPosID(match.getClassID(this.number)))
-                    .append("\">");
+                        .append(match.getPosID(match.getClassID(this.number)))
+                        .append("\">");
             }
-            
+
             else if (this.number >= 256) {
                 sb.append("<span ");
                 if (this.number < 2048) {
                     sb.append("title=\"")
-                        .append(match.getAnnotationID(this.number))
-                        .append('"');
+                            .append(match.getAnnotationID(this.number))
+                            .append('"');
                 }
                 else {
                     Relation rel = match.getRelationID(this.number);
-                    sb.append("xlink:title=\"")
-                        .append(rel.annotation)
-                        .append("\" xlink:type=\"simple\" xlink:href=\"#")
-                        .append(match.getPosID(rel.ref))
-                        .append('"');
+                    sb.append("xlink:title=\"").append(rel.annotation)
+                            .append("\" xlink:type=\"simple\" xlink:href=\"#")
+                            .append(match.getPosID(rel.ref)).append('"');
                 };
                 sb.append('>');
             }
@@ -88,11 +90,8 @@
                     level.clear(pos);
                     levelCache[this.number] = pos;
                 };
-                sb.append("<mark class=\"class-")
-                    .append(this.number)
-                    .append(" level-")
-                    .append(pos)
-                    .append("\">");
+                sb.append("<mark class=\"class-").append(this.number)
+                        .append(" level-").append(pos).append("\">");
             };
             return sb.toString();
         }
@@ -100,59 +99,60 @@
         else if (this.type == 2) {
             if (this.number < -1 || this.number >= 256)
                 return "</span>";
-           
+
             if (this.number == -1)
                 return "</mark>";
-         
+
             if (this.terminal)
                 level.set((int) levelCache[this.number]);
             return "</mark>";
-	};
+        };
 
-	// HTML encode primary data
-	return escapeHTML(this.characters);
+        // HTML encode primary data
+        return escapeHTML(this.characters);
     };
 
+
     // Return bracket fragment for this combinator element
     public String toBrackets (Match match) {
-	if (this.type == 1) {
-	    StringBuilder sb = new StringBuilder();
-	    
-	    // Match
-	    if (this.number == -1) {
-		sb.append("[");
-	    }
+        if (this.type == 1) {
+            StringBuilder sb = new StringBuilder();
 
-	    // Identifier
-	    else if (this.number < -1) {
-		sb.append("{#");
-		sb.append(match.getClassID(this.number));
-		sb.append(':');
-	    }
+            // Match
+            if (this.number == -1) {
+                sb.append("[");
+            }
 
-	    // Highlight, Relation, Span
-	    else {
-		sb.append("{");
-		if (this.number >= 256) {
-		    if (this.number < 2048)
-			sb.append(match.getAnnotationID(this.number));
-		    else {
-			Relation rel = match.getRelationID(this.number);
-			sb.append(rel.annotation);
-			sb.append('>').append(rel.ref);
-		    };
-		    sb.append(':');
-		}
-		else if (this.number != 0)
-		    sb.append(this.number).append(':');
-	    };
-	    return sb.toString();
-	}
-	else if (this.type == 2) {
-	    if (this.number == -1)
-		return "]";
-	    return "}";
-	};
-	return this.characters;
+            // Identifier
+            else if (this.number < -1) {
+                sb.append("{#");
+                sb.append(match.getClassID(this.number));
+                sb.append(':');
+            }
+
+            // Highlight, Relation, Span
+            else {
+                sb.append("{");
+                if (this.number >= 256) {
+                    if (this.number < 2048)
+                        sb.append(match.getAnnotationID(this.number));
+                    else {
+                        Relation rel = match.getRelationID(this.number);
+                        sb.append(rel.annotation);
+                        sb.append('>').append(rel.ref);
+                    };
+                    sb.append(':');
+                }
+                else if (this.number != 0)
+                    sb.append(this.number).append(':');
+            };
+            return sb.toString();
+        }
+        else if (this.type == 2) {
+            if (this.number == -1)
+                return "]";
+            return "}";
+        };
+        return this.characters;
     };
 };
diff --git a/src/main/java/de/ids_mannheim/korap/response/match/MatchIdentifier.java b/src/main/java/de/ids_mannheim/korap/response/match/MatchIdentifier.java
index 5b954d6..5f13a3b 100644
--- a/src/main/java/de/ids_mannheim/korap/response/match/MatchIdentifier.java
+++ b/src/main/java/de/ids_mannheim/korap/response/match/MatchIdentifier.java
@@ -1,4 +1,5 @@
 package de.ids_mannheim.korap.response.match;
+
 import java.util.*;
 import java.util.regex.*;
 
@@ -7,16 +8,15 @@
 
     private ArrayList<int[]> pos = new ArrayList<>(8);
 
-    Pattern idRegex = Pattern.compile(
-		        "^match-(?:([^!]+?)!)?" +
-			"([^!]+)-p([0-9]+)-([0-9]+)" +
-			"((?:\\(-?[0-9]+\\)-?[0-9]+--?[0-9]+)*)" +
-			"(?:c.+?)?$");
-    Pattern posRegex = Pattern.compile(
-		        "\\(([0-9]+)\\)([0-9]+)-([0-9]+)");
+    Pattern idRegex = Pattern.compile("^match-(?:([^!]+?)!)?"
+            + "([^!]+)-p([0-9]+)-([0-9]+)"
+            + "((?:\\(-?[0-9]+\\)-?[0-9]+--?[0-9]+)*)" + "(?:c.+?)?$");
+    Pattern posRegex = Pattern.compile("\\(([0-9]+)\\)([0-9]+)-([0-9]+)");
+
 
     public MatchIdentifier () {};
-    
+
+
     public MatchIdentifier (String id) {
         Matcher matcher = idRegex.matcher(id);
         if (matcher.matches()) {
@@ -28,45 +28,51 @@
             if (matcher.group(5) != null) {
                 matcher = posRegex.matcher(matcher.group(5));
                 while (matcher.find()) {
-                    this.addPos(
-                        Integer.parseInt(matcher.group(2)),
-                        Integer.parseInt(matcher.group(3)),
-                        Integer.parseInt(matcher.group(1))
-                    );
+                    this.addPos(Integer.parseInt(matcher.group(2)),
+                            Integer.parseInt(matcher.group(3)),
+                            Integer.parseInt(matcher.group(1)));
                 };
             };
         };
     };
 
+
     public int getStartPos () {
         return this.startPos;
     };
 
+
     public void setStartPos (int pos) {
         if (pos >= 0)
             this.startPos = pos;
     };
 
+
     public int getEndPos () {
         return this.endPos;
     };
 
+
     public void setEndPos (int pos) {
         if (pos >= 0)
             this.endPos = pos;
     };
 
-    public void addPos(int start, int end, int number) {
+
+    public void addPos (int start, int end, int number) {
         if (start >= 0 && end >= 0 && number >= 0)
-            this.pos.add(new int[]{start, end, number});
+            this.pos.add(new int[] { start, end, number });
     };
 
+
     public ArrayList<int[]> getPos () {
         return this.pos;
     };
 
+
     public String toString () {
-        if (this.docID == null) return null;
+        if (this.docID == null)
+            return null;
 
         StringBuilder sb = new StringBuilder("match-");
 
@@ -77,7 +83,7 @@
         sb.append(this.docID);
 
         sb.append('-');
-        sb.append(this.getPositionString());	
+        sb.append(this.getPositionString());
         return sb.toString();
     };
 
@@ -91,7 +97,7 @@
             sb.append('(').append(i[2]).append(')');
             sb.append(i[0]).append('-').append(i[1]);
         };
-        
+
         return sb.toString();
     };
 };
diff --git a/src/main/java/de/ids_mannheim/korap/response/match/PosIdentifier.java b/src/main/java/de/ids_mannheim/korap/response/match/PosIdentifier.java
index 8606aa6..eaa8d9e 100644
--- a/src/main/java/de/ids_mannheim/korap/response/match/PosIdentifier.java
+++ b/src/main/java/de/ids_mannheim/korap/response/match/PosIdentifier.java
@@ -1,22 +1,28 @@
 package de.ids_mannheim.korap.response.match;
+
 import java.util.*;
 
 public class PosIdentifier extends DocIdentifier {
     private int pos;
 
+
     public PosIdentifier () {};
 
+
     public void setPos (int pos) {
         if (pos >= 0)
             this.pos = pos;
     };
 
+
     public int getPos () {
         return this.pos;
     };
 
+
     public String toString () {
-        if (this.docID == null) return null;
+        if (this.docID == null)
+            return null;
 
         StringBuilder sb = new StringBuilder("word-");
 
diff --git a/src/main/java/de/ids_mannheim/korap/response/match/Relation.java b/src/main/java/de/ids_mannheim/korap/response/match/Relation.java
index 1587ed3..fc34b23 100644
--- a/src/main/java/de/ids_mannheim/korap/response/match/Relation.java
+++ b/src/main/java/de/ids_mannheim/korap/response/match/Relation.java
@@ -2,10 +2,12 @@
 
 /**
  * Class for relational highlights.
- */   
+ */
 public class Relation {
     public int ref;
     public String annotation;
+
+
     public Relation (String annotation, int ref) {
         this.annotation = annotation;
         this.ref = ref;
diff --git a/src/main/java/de/ids_mannheim/korap/server/Node.java b/src/main/java/de/ids_mannheim/korap/server/Node.java
index 6aebd2d..6267bb9 100644
--- a/src/main/java/de/ids_mannheim/korap/server/Node.java
+++ b/src/main/java/de/ids_mannheim/korap/server/Node.java
@@ -20,28 +20,27 @@
 
 /**
  * Standalone REST-Service for the Lucene Search Backend.
- *
+ * 
  * @author diewald
  */
 public class Node {
 
     // Base URI the Grizzly HTTP server will listen on
     public static String BASE_URI = "http://localhost:8080/";
-    
+
     // Logger
     private final static Logger log = LoggerFactory.getLogger(Node.class);
 
     // Index
     private static KrillIndex index;
     private static ComboPooledDataSource cpds;
-    private static String path,
-                          name = "unknown";
+    private static String path, name = "unknown";
 
     private static String dbUser, dbPwd;
 
-    private static String dbClass = "org.sqlite.JDBC",
-                          dbURL   = "jdbc:sqlite:";
-    
+    private static String dbClass = "org.sqlite.JDBC", dbURL = "jdbc:sqlite:";
+
+
     /*
      * Todo: Add shutdown hook,
      * Then also close cdps.close();
@@ -52,31 +51,28 @@
     /**
      * Starts Grizzly HTTP server exposing JAX-RS
      * resources defined in this application.
-     *
+     * 
      * @return Grizzly HTTP server.
      */
-    public static HttpServer startServer() {
+    public static HttpServer startServer () {
 
         // Load configuration
         try {
-            InputStream file = new FileInputStream(
-                Node.class.getClassLoader()
-                .getResource("krill.properties")
-                .getFile()
-            );
+            InputStream file = new FileInputStream(Node.class.getClassLoader()
+                    .getResource("krill.properties").getFile());
             Properties prop = new Properties();
             prop.load(file);
 
             // Node properties
-            path     = prop.getProperty("krill.indexDir", path);
-            name     = prop.getProperty("krill.server.name", name);
+            path = prop.getProperty("krill.indexDir", path);
+            name = prop.getProperty("krill.server.name", name);
             BASE_URI = prop.getProperty("krill.server.baseURI", BASE_URI);
 
             // Database properties
-            dbUser  = prop.getProperty("krill.db.user",    dbUser);
-            dbPwd   = prop.getProperty("krill.db.pwd",     dbPwd);
-            dbClass = prop.getProperty("krill.db.class",   dbClass);
-            dbURL   = prop.getProperty("krill.db.jdbcURL", dbURL);
+            dbUser = prop.getProperty("krill.db.user", dbUser);
+            dbPwd = prop.getProperty("krill.db.pwd", dbPwd);
+            dbClass = prop.getProperty("krill.db.class", dbClass);
+            dbURL = prop.getProperty("krill.db.jdbcURL", dbURL);
 
         }
         catch (IOException e) {
@@ -85,32 +81,36 @@
 
         // create a resource config that scans for JAX-RS resources and providers
         // in de.ids_mannheim.korap.server package
-        final ResourceConfig rc =
-            new ResourceConfig().packages("de.ids_mannheim.korap.server");
+        final ResourceConfig rc = new ResourceConfig()
+                .packages("de.ids_mannheim.korap.server");
 
         // create and start a new instance of grizzly http server
         // exposing the Jersey application at BASE_URI
-        return GrizzlyHttpServerFactory.createHttpServer(URI.create(BASE_URI), rc);
+        return GrizzlyHttpServerFactory.createHttpServer(URI.create(BASE_URI),
+                rc);
     };
 
-    public static HttpServer startServer(String nodeName, String indexPath) {
+
+    public static HttpServer startServer (String nodeName, String indexPath) {
 
         // create a resource config that scans for JAX-RS resources and providers
         // in de.ids_mannheim.korap.server package
-        final ResourceConfig rc =
-            new ResourceConfig().packages("de.ids_mannheim.korap.server");
+        final ResourceConfig rc = new ResourceConfig()
+                .packages("de.ids_mannheim.korap.server");
 
         name = nodeName;
         path = indexPath;
 
         // create and start a new instance of grizzly http server
         // exposing the Jersey application at BASE_URI
-        return GrizzlyHttpServerFactory.createHttpServer(URI.create(BASE_URI), rc);
+        return GrizzlyHttpServerFactory.createHttpServer(URI.create(BASE_URI),
+                rc);
     };
 
 
     /**
      * Main method.
+     * 
      * @param args
      * @throws IOException
      */
@@ -120,19 +120,14 @@
         final HttpServer server = startServer();
 
         // Establish shutdown hook
-        Runtime.getRuntime().addShutdownHook(
-            new Thread(
-                new Runnable() {
-                    @Override
-                    public void run() {
-                        log.info("Stop Server");
-                        // staaahp!
-                        server.stop();
-                    }
-                },
-                "shutdownHook"
-            )
-        );
+        Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
+            @Override
+            public void run () {
+                log.info("Stop Server");
+                // staaahp!
+                server.stop();
+            }
+        }, "shutdownHook"));
 
         // Start server
         try {
@@ -145,6 +140,7 @@
         };
     };
 
+
     // What's the servers name?
     public static String getName () {
         return name;
@@ -163,7 +159,7 @@
         // Pool already initiated
         if (cpds != null)
             return cpds;
-        
+
         try {
 
             // Parameters are defined in the property file
@@ -190,8 +186,8 @@
         // Index already instantiated
         if (index != null)
             return index;
-        
-    	try {
+
+        try {
 
             // Get a temporary index
             if (path == null)
diff --git a/src/main/java/de/ids_mannheim/korap/server/Ping.java b/src/main/java/de/ids_mannheim/korap/server/Ping.java
index ebaba96..f47cadb 100644
--- a/src/main/java/de/ids_mannheim/korap/server/Ping.java
+++ b/src/main/java/de/ids_mannheim/korap/server/Ping.java
@@ -7,14 +7,14 @@
 
 /**
  * A useful ping service.
- *
+ * 
  * @author Nils Diewald
  */
 @Path("ping")
 public class Ping {
     @GET
     @Produces(MediaType.TEXT_PLAIN)
-    public String getIt() {
+    public String getIt () {
         return "Gimme 5 minutes, please!";
     };
 };
diff --git a/src/main/java/de/ids_mannheim/korap/server/Resource.java b/src/main/java/de/ids_mannheim/korap/server/Resource.java
index 2c47e63..4b4fa31 100644
--- a/src/main/java/de/ids_mannheim/korap/server/Resource.java
+++ b/src/main/java/de/ids_mannheim/korap/server/Resource.java
@@ -46,12 +46,15 @@
 
 /**
  * Root resource (exposed at root path)
- * The responses only represent JSON responses, although HTML responses
+ * The responses only represent JSON responses, although HTML
+ * responses
  * may be handy.
- *
+ * 
  * @author Nils Diewald
- *
- * Look at http://www.mkyong.com/webservices/jax-rs/json-example-with-jersey-jackson/
+ * 
+ *         Look at
+ *         http://www.mkyong.com/webservices/jax-rs/json-example
+ *         -with-jersey-jackson/
  */
 @Path("/")
 public class Resource {
@@ -65,9 +68,9 @@
     public static final boolean DEBUG = false;
 
     // Slightly based on String::BooleanSimple
-    static Pattern p = Pattern.compile(
-        "\\s*(?i:false|no|inactive|disabled|off|n|neg(?:ative)?|not|null|undef)\\s*"
-    );
+    static Pattern p = Pattern
+            .compile("\\s*(?i:false|no|inactive|disabled|off|n|neg(?:ative)?|not|null|undef)\\s*");
+
 
     // Check if a string is meant to represent null
     private static boolean isNull (String value) {
@@ -105,12 +108,14 @@
         kresp.addMessage(680, "Server is up and running!");
         return kresp.toJsonString();
     };
-    
+
 
     /**
      * Add new documents to the index
-     *
-     * @param json JSON-LD string with search and potential meta filters.
+     * 
+     * @param json
+     *            JSON-LD string with search and potential meta
+     *            filters.
      */
     /*
      * Support GZip:
@@ -121,9 +126,8 @@
     @Path("/index/{textID}")
     @Produces(MediaType.APPLICATION_JSON)
     @Consumes(MediaType.APPLICATION_JSON)
-    public String add (@PathParam("textID") Integer uid,
-                       @Context UriInfo uri,
-                       String json) {
+    public String add (@PathParam("textID") Integer uid, @Context UriInfo uri,
+            String json) {
         /*
          * See
          * http://www.mkyong.com/webservices/jax-rs/file-upload-example-in-jersey/
@@ -189,7 +193,7 @@
 
         kresp.setVersion(index.getVersion());
         kresp.setName(index.getName());
-        
+
         // There are documents to commit
         try {
             index.commit();
@@ -207,8 +211,9 @@
 
 
     /**
-     * Find matches in the lucene index based on UIDs and return one match per doc.
-     *
+     * Find matches in the lucene index based on UIDs and return one
+     * match per doc.
+     * 
      * @param text_id
      */
     @POST
@@ -224,7 +229,7 @@
             Krill ks = new Krill(json);
 
             // Get query parameters
-            MultivaluedMap<String,String> qp = uri.getQueryParameters();
+            MultivaluedMap<String, String> qp = uri.getQueryParameters();
 
             if (qp.get("uid") != null) {
 
@@ -232,9 +237,9 @@
                 List<String> uids = qp.get("uid");
                 KrillCollection kc = new KrillCollection();
                 kc.filterUIDs(uids.toArray(new String[uids.size()]));
-                
+
                 // TODO: RESTRICT COLLECTION TO ONLY RESPECT SELF DOCS (REPLICATION)
-                
+
                 // Override old collection
                 ks.setCollection(kc);
 
@@ -245,7 +250,8 @@
             };
             Result kr = new Result();
             kr.setNode(Node.getName());
-            kr.addError(610, "Missing request parameters", "No unique IDs were given");
+            kr.addError(610, "Missing request parameters",
+                    "No unique IDs were given");
             return kr.toJsonString();
         };
 
@@ -253,25 +259,25 @@
         kresp.setNode(Node.getName());
         kresp.setName(index.getName());
         kresp.setVersion(index.getVersion());
-        
+
         kresp.addError(601, "Unable to find index");
-        
+
         return kresp.toJsonString();
     };
 
 
     /**
-     * Collect matches and aggregate the UIDs plus matchcount in the database.
-     *
+     * Collect matches and aggregate the UIDs plus matchcount in the
+     * database.
+     * 
      * @param text_id
      */
     @PUT
     @Path("/collect/{resultID}")
     @Produces(MediaType.APPLICATION_JSON)
     @Consumes(MediaType.APPLICATION_JSON)
-    public String collect (String json,
-                           @PathParam("resultID") String resultID,
-                           @Context UriInfo uri) {
+    public String collect (String json, @PathParam("resultID") String resultID,
+            @Context UriInfo uri) {
 
         // Get index
         KrillIndex index = Node.getIndex();
@@ -289,9 +295,9 @@
             MatchCollectorDB mc = new MatchCollectorDB(1000, "Res_" + resultID);
             Connection conn = Node.getDBPool().getConnection();
             mc.setDBPool("mysql", Node.getDBPool(), conn);
-            
+
             // TODO: Only search in self documents (REPLICATION FTW!)
-            
+
             Krill ks = new Krill(json);
             MatchCollector result = index.collect(ks, mc);
 
@@ -313,17 +319,16 @@
 
 
 
-
-
     /* These routes are still wip: */
 
 
 
-
     /**
      * Search the lucene index.
-     *
-     * @param json JSON-LD string with search and potential meta filters.
+     * 
+     * @param json
+     *            JSON-LD string with search and potential meta
+     *            filters.
      */
     @POST
     @Path("/search")
@@ -331,96 +336,87 @@
     @Consumes(MediaType.APPLICATION_JSON)
     public String search (String json) {
 
-	// Get index
-	KrillIndex index = Node.getIndex();
+        // Get index
+        KrillIndex index = Node.getIndex();
 
-	// Search index
+        // Search index
         if (index != null) {
             Result kr = new Krill(json).apply(index);
-	    kr.setNode(Node.getName());
-	    return kr.toJsonString();
-	};
+            kr.setNode(Node.getName());
+            return kr.toJsonString();
+        };
 
-	Response kresp = new Response();
-	kresp.setNode(Node.getName());
-	kresp.setName(index.getName());
-	kresp.setVersion(index.getVersion());
+        Response kresp = new Response();
+        kresp.setNode(Node.getName());
+        kresp.setName(index.getName());
+        kresp.setVersion(index.getVersion());
 
-	kresp.addError(601, "Unable to find index");
-	return kresp.toJsonString();
+        kresp.addError(601, "Unable to find index");
+        return kresp.toJsonString();
     };
 
+
     @GET
     @Path("/match/{matchID}")
     @Produces(MediaType.APPLICATION_JSON)
-    public String match (@PathParam("matchID") String id,
-			 @Context UriInfo uri) {
+    public String match (@PathParam("matchID") String id, @Context UriInfo uri) {
 
-	// Get index
-	KrillIndex index = Node.getIndex();
+        // Get index
+        KrillIndex index = Node.getIndex();
 
-	// Search index
+        // Search index
         if (index != null) {
 
-	    // Get query parameters
-	    MultivaluedMap<String,String> qp = uri.getQueryParameters();
+            // Get query parameters
+            MultivaluedMap<String, String> qp = uri.getQueryParameters();
 
-	    boolean includeSpans = false,
-		includeHighlights = true,
-		extendToSentence = false,
-		info = false;
+            boolean includeSpans = false, includeHighlights = true, extendToSentence = false, info = false;
 
-	    // Optional query parameter "info" for more information on the match
-	    if (!isNull(qp.getFirst("info")))
-		info = true;
-	    
-	    // Optional query parameter "spans" for span information inclusion
-	    if (!isNull(qp.getFirst("spans"))) {
-		includeSpans = true;
-		info = true;
-	    };
+            // Optional query parameter "info" for more information on the match
+            if (!isNull(qp.getFirst("info")))
+                info = true;
 
-	    // Optional query parameter "highlights" for highlight information inclusion
-	    String highlights = qp.getFirst("highlights");
-	    if (highlights != null && isNull(highlights))
-		includeHighlights = false;
+            // Optional query parameter "spans" for span information inclusion
+            if (!isNull(qp.getFirst("spans"))) {
+                includeSpans = true;
+                info = true;
+            };
 
-	    // Optional query parameter "extended" for sentence expansion
-	    if (!isNull(qp.getFirst("extended")))
-		extendToSentence = true;
+            // Optional query parameter "highlights" for highlight information inclusion
+            String highlights = qp.getFirst("highlights");
+            if (highlights != null && isNull(highlights))
+                includeHighlights = false;
 
-	    List<String> foundries = qp.get("foundry");
-	    List<String> layers    = qp.get("layer");
+            // Optional query parameter "extended" for sentence expansion
+            if (!isNull(qp.getFirst("extended")))
+                extendToSentence = true;
 
-            try {		
-		// Get match info
-                return index.getMatchInfo(
-		    id,
-		    "tokens",
-		    info,
-		    foundries,
-		    layers,
-		    includeSpans,
-		    includeHighlights,
-		    extendToSentence
-		).toJsonString();
+            List<String> foundries = qp.get("foundry");
+            List<String> layers = qp.get("layer");
+
+            try {
+                // Get match info
+                return index.getMatchInfo(id, "tokens", info, foundries,
+                        layers, includeSpans, includeHighlights,
+                        extendToSentence).toJsonString();
             }
 
-	    // Nothing found
-	    catch (QueryException qe) {
-		// Todo: Make Match rely on Response!
+            // Nothing found
+            catch (QueryException qe) {
+                // Todo: Make Match rely on Response!
                 Match km = new Match();
                 km.addError(qe.getErrorCode(), qe.getMessage());
                 return km.toJsonString();
             }
-	};
+        };
 
-	// Response with error message
+        // Response with error message
         Match km = new Match();
         km.addError(601, "Unable to find index");
         return km.toJsonString();
     };
 
+
     /*
       POST /collect/:result_id
       POST /peek
@@ -441,35 +437,35 @@
     @Consumes(MediaType.APPLICATION_JSON)
     public String collection (String json) {
 
-	// Get index
-	KrillIndex index = Node.getIndex();
+        // Get index
+        KrillIndex index = Node.getIndex();
 
-	if (index == null)
-	    return "{\"documents\" : -1, error\" : \"No index given\" }";
+        if (index == null)
+            return "{\"documents\" : -1, error\" : \"No index given\" }";
 
-	return "{}";
+        return "{}";
     };
 
 
 
     // Interceptor class
     public class GZIPReaderInterceptor implements ReaderInterceptor {
-	@Override
-	public Object aroundReadFrom(ReaderInterceptorContext context)
-	    throws IOException, WebApplicationException {
-	    final InputStream originalInputStream = context.getInputStream();
-	    context.setInputStream(new GZIPInputStream(originalInputStream));
-	    return context.proceed();
-	};
+        @Override
+        public Object aroundReadFrom (ReaderInterceptorContext context)
+                throws IOException, WebApplicationException {
+            final InputStream originalInputStream = context.getInputStream();
+            context.setInputStream(new GZIPInputStream(originalInputStream));
+            return context.proceed();
+        };
     };
 
     public class GZIPWriterInterceptor implements WriterInterceptor {
-	@Override
-	public void aroundWriteTo(WriterInterceptorContext context)
-	    throws IOException, WebApplicationException {
-	    final OutputStream outputStream = context.getOutputStream();
-	    context.setOutputStream(new GZIPOutputStream(outputStream));
-	    context.proceed();
-	};
+        @Override
+        public void aroundWriteTo (WriterInterceptorContext context)
+                throws IOException, WebApplicationException {
+            final OutputStream outputStream = context.getOutputStream();
+            context.setOutputStream(new GZIPOutputStream(outputStream));
+            context.proceed();
+        };
     };
 };
diff --git a/src/main/java/de/ids_mannheim/korap/util/CorpusDataException.java b/src/main/java/de/ids_mannheim/korap/util/CorpusDataException.java
index 9b5ed23..963094e 100644
--- a/src/main/java/de/ids_mannheim/korap/util/CorpusDataException.java
+++ b/src/main/java/de/ids_mannheim/korap/util/CorpusDataException.java
@@ -2,25 +2,27 @@
 
 /**
  * Exception class for corpus data processing problems.
- *
+ * 
  * @author diewald
  */
 public class CorpusDataException extends Exception {
-	
+
     private int errorCode = 0;
-  
+
+
     /**
      * Construct a new CorpusDataException.
      */
-    public CorpusDataException() {
+    public CorpusDataException () {
         super();
     };
 
 
     /**
      * Construct a new CorpusDataException.
-     *
-     * @param message Exception message.
+     * 
+     * @param message
+     *            Exception message.
      */
     public CorpusDataException (String message) {
         super(message);
@@ -29,21 +31,25 @@
 
     /**
      * Construct a new CorpusDataException.
-     *
-     * @param code An integer value as an error code.
-     * @param message Exception message.
+     * 
+     * @param code
+     *            An integer value as an error code.
+     * @param message
+     *            Exception message.
      */
-    public CorpusDataException (int code, String message) {	  
+    public CorpusDataException (int code, String message) {
         super(message);
-        this.setErrorCode(code);      
+        this.setErrorCode(code);
     };
 
 
     /**
      * Construct a new CorpusDataException.
-     *
-     * @param message Exception message.
-     * @param cause A {@link Throwable} object.
+     * 
+     * @param message
+     *            Exception message.
+     * @param cause
+     *            A {@link Throwable} object.
      */
     public CorpusDataException (String message, Throwable cause) {
         super(message, cause);
@@ -52,28 +58,30 @@
 
     /**
      * Construct a new CorpusDataException.
-     *
-     * @param cause A {@link Throwable} object.
-     */    
+     * 
+     * @param cause
+     *            A {@link Throwable} object.
+     */
     public CorpusDataException (Throwable cause) {
         super(cause);
-    };  
-  
+    };
+
 
     /**
      * Get the error code of the exception.
-     *
+     * 
      * @return The error code of the exception as an integer.
      */
-    public int getErrorCode() {
+    public int getErrorCode () {
         return this.errorCode;
     };
 
 
     /**
      * Set the error code of the exception.
-     *
-     * @param code The error code of the exception as an integer.
+     * 
+     * @param code
+     *            The error code of the exception as an integer.
      */
     public void setErrorCode (int code) {
         this.errorCode = code;
diff --git a/src/main/java/de/ids_mannheim/korap/util/KrillArray.java b/src/main/java/de/ids_mannheim/korap/util/KrillArray.java
index 210df78..206e587 100644
--- a/src/main/java/de/ids_mannheim/korap/util/KrillArray.java
+++ b/src/main/java/de/ids_mannheim/korap/util/KrillArray.java
@@ -5,16 +5,18 @@
 /**
  * A collection of string array related
  * utility functions.
- *
+ * 
  * @author diewald
  */
 public class KrillArray {
 
     /**
      * Join a sequence of strings to a single string.
-     *
-     * @param separator String to separate joined segments
-     * @param strings Segments to join
+     * 
+     * @param separator
+     *            String to separate joined segments
+     * @param strings
+     *            Segments to join
      * @return The joined string.
      */
     public static String join (String separator, String ... strings) {
@@ -34,9 +36,11 @@
 
     /**
      * Join a sequence of strings to a single string.
-     *
-     * @param separator Character to separate joined segments
-     * @param strings Segments to join
+     * 
+     * @param separator
+     *            Character to separate joined segments
+     * @param strings
+     *            Segments to join
      * @return The joined string.
      */
     public static String join (char separator, String ... strings) {
@@ -44,12 +48,12 @@
             return "";
 
         StringBuffer sb = new StringBuffer(strings[0]);
-        
+
         for (int i = 1; i < strings.length; i++) {
             sb.append(separator);
             sb.append(strings[i]);
         };
-        
+
         return sb.toString();
     };
 };
diff --git a/src/main/java/de/ids_mannheim/korap/util/KrillByte.java b/src/main/java/de/ids_mannheim/korap/util/KrillByte.java
index 8dd6b16..6ae3256 100644
--- a/src/main/java/de/ids_mannheim/korap/util/KrillByte.java
+++ b/src/main/java/de/ids_mannheim/korap/util/KrillByte.java
@@ -5,15 +5,16 @@
 /**
  * A collection of byte and byte array related
  * utility functions.
- *
+ * 
  * @author diewald
  */
 public class KrillByte {
 
     /**
      * Convert an integer to a byte array.
-     *
-     * @param number The number to convert.
+     * 
+     * @param number
+     *            The number to convert.
      * @return The translated byte array.
      */
     // Based on
@@ -22,7 +23,7 @@
         byte[] data = new byte[4];
         for (int i = 0; i < 4; ++i) {
             int shift = i << 3; // That's identical to i * 8
-            data[3-i] = (byte)((number & (0xff << shift)) >>> shift);
+            data[3 - i] = (byte) ((number & (0xff << shift)) >>> shift);
         };
         return data;
     };
@@ -30,8 +31,9 @@
 
     /**
      * Convert a byte array to an integer.
-     *
-     * @param data The byte array to convert.
+     * 
+     * @param data
+     *            The byte array to convert.
      * @return The translated integer.
      */
     // Based on
@@ -43,9 +45,11 @@
 
     /**
      * Convert a byte array to an integer.
-     *
-     * @param data The byte array to convert.
-     * @param offset The byte offset (Not integer offset!).
+     * 
+     * @param data
+     *            The byte array to convert.
+     * @param offset
+     *            The byte offset (Not integer offset!).
      * @return The translated integer.
      */
     // Roughly based on
@@ -54,7 +58,7 @@
         offset += 3;
         int number = 0;
         for (int i = 0; i < 4; ++i)
-            number |= (data[offset-i] & 0xff) << (i << 3);
+            number |= (data[offset - i] & 0xff) << (i << 3);
         return number;
     };
 };
diff --git a/src/main/java/de/ids_mannheim/korap/util/KrillDate.java b/src/main/java/de/ids_mannheim/korap/util/KrillDate.java
index e5f7c99..a578fdd 100644
--- a/src/main/java/de/ids_mannheim/korap/util/KrillDate.java
+++ b/src/main/java/de/ids_mannheim/korap/util/KrillDate.java
@@ -8,22 +8,22 @@
  * and parse date strings optimized
  * for integer range queries in Lucene.
  * No support for b.c. dates.
- *
- * Strings are parsed and serialized to
- * {@link http://tools.ietf.org/html/rfc3339 RFC3339}
- * compatible strings with a day granularity according to
- * {@link http://www.w3.org/TR/NOTE-datetime W3-DateTimes}.
- *
+ * 
+ * Strings are parsed and serialized to {@link http
+ * ://tools.ietf.org/html/rfc3339 RFC3339} compatible strings with a
+ * day granularity according to {@link http
+ * ://www.w3.org/TR/NOTE-datetime W3-DateTimes}.
+ * 
  * <blockquote><pre>
- *   KrillDate kd = new KrillDate("2005-06-03");
- *   System.err.println(kd.day());
- *   // 3
-
- *   kd = new KrillDate("2005-06");
- *   System.err.println(kd.month());
- *   // 6
+ * KrillDate kd = new KrillDate("2005-06-03");
+ * System.err.println(kd.day());
+ * // 3
+ * 
+ * kd = new KrillDate("2005-06");
+ * System.err.println(kd.month());
+ * // 6
  * </pre></blockquote>
- *
+ * 
  * @author diewald
  */
 public class KrillDate {
@@ -47,11 +47,9 @@
 
 
     // Date string regex pattern
-    private static final Pattern datePattern = Pattern.compile(
-        "\\s*(\\d\\d\\d\\d)" +
-        "(?:\\s*[-/]?\\s*(\\d\\d)" +
-        "(?:\\s*[-/]?\\s*(\\d\\d))?)?\\s*"
-    );
+    private static final Pattern datePattern = Pattern
+            .compile("\\s*(\\d\\d\\d\\d)" + "(?:\\s*[-/]?\\s*(\\d\\d)"
+                    + "(?:\\s*[-/]?\\s*(\\d\\d))?)?\\s*");
 
     /**
      * Static value representing the minimum date.
@@ -68,13 +66,14 @@
     /**
      * Construct a new KrillDate object.
      */
-    public KrillDate () { };
+    public KrillDate () {};
 
 
     /**
      * Construct a new KrillDate object.
-     *
-     * @param date The date as a string (see synopsis).
+     * 
+     * @param date
+     *            The date as a string (see synopsis).
      */
     public KrillDate (String date) {
         if (date == null || date.isEmpty())
@@ -87,7 +86,7 @@
             if (m.group(2) != null)
                 this.month = Integer.parseInt(m.group(2));
             if (m.group(3) != null)
-                this.day   = Integer.parseInt(m.group(3));
+                this.day = Integer.parseInt(m.group(3));
         };
     };
 
@@ -95,33 +94,32 @@
     /**
      * Get the date as an integer with ceiled values for
      * undefined date segments.
-     *
+     * 
      * <blockquote><pre>
-     *   KrillDate kd = new KrillDate("2005-06");
-     *   System.err.println(kd.ceil());
-     *   // 20050699
+     * KrillDate kd = new KrillDate("2005-06");
+     * System.err.println(kd.ceil());
+     * // 20050699
      * </pre></blockquote>
-     *
+     * 
      * @return ceiled integer value.
      */
     public int ceil () {
-        return
-            (ceil((byte) 4, this.year) * 10_000) +
-            (ceil((byte) 2, this.month) * 100) +
-            (ceil((byte) 2, this.day));
+        return (ceil((byte) 4, this.year) * 10_000)
+                + (ceil((byte) 2, this.month) * 100)
+                + (ceil((byte) 2, this.day));
     };
 
 
     /**
      * Get the date as an integer with floored values for
      * undefined date segments.
-     *
+     * 
      * <blockquote><pre>
-     *   KrillDate kd = new KrillDate("2005-06");
-     *   System.err.println(kd.floor());
-     *   // 20050600
+     * KrillDate kd = new KrillDate("2005-06");
+     * System.err.println(kd.floor());
+     * // 20050600
      * </pre></blockquote>
-     *
+     * 
      * @return floored integer value.
      */
     public int floor () {
@@ -146,10 +144,10 @@
     /**
      * Serialize date to string, appended by zeros,
      * in the form of &quot;20050300&quot;.
-     *
+     * 
      * @return The date as a string.
      */
-    public String toString() {
+    public String toString () {
         StringBuilder sb = this.toStringBuilder();
         if (sb.length() < 4)
             return null;
@@ -167,10 +165,10 @@
 
     /**
      * Serialize ceiled date to string.
-     *
+     * 
      * @return The date as a string.
      */
-    public String toCeilString() {
+    public String toCeilString () {
         StringBuilder sb = new StringBuilder();
         return sb.append(this.ceil()).toString();
     };
@@ -178,10 +176,10 @@
 
     /**
      * Serialize floored date to string.
-     *
+     * 
      * @return The date as a string.
      */
-    public String toFloorString() {
+    public String toFloorString () {
         StringBuilder sb = new StringBuilder();
         return sb.append(this.floor()).toString();
     };
@@ -190,10 +188,10 @@
     /**
      * Serialize date to displayable string.
      * See format description in the class description.
-     *
+     * 
      * @return The date as a string.
      */
-    public String toDisplay() {
+    public String toDisplay () {
         StringBuilder sb = this.toStringBuilder();
         if (sb.length() == 8)
             sb.insert(6, '-');
@@ -217,9 +215,9 @@
                 sb.append("20");
 
             sb.append(this.year);
-	    
+
             if (this.month != 0) {
-                
+
                 // Append month
                 if (this.month < 10)
                     sb.append('0');
diff --git a/src/main/java/de/ids_mannheim/korap/util/KrillString.java b/src/main/java/de/ids_mannheim/korap/util/KrillString.java
index 07af4d6..cfc92f3 100644
--- a/src/main/java/de/ids_mannheim/korap/util/KrillString.java
+++ b/src/main/java/de/ids_mannheim/korap/util/KrillString.java
@@ -9,21 +9,23 @@
 /**
  * A collection of string related utility
  * functions.
- *
+ * 
  * @author diewald
  */
 public class KrillString {
 
     /**
      * Get String from file.
-     *
-     * @param path The path of the file represented as a string. 
-     * @param path The expected {@link Charset}. 
+     * 
+     * @param path
+     *            The path of the file represented as a string.
+     * @param path
+     *            The expected {@link Charset}.
      * @return The content of the file
      * @throws IOException
      */
     public static String StringfromFile (String path, Charset encoding)
-        throws IOException {
+            throws IOException {
         byte[] encoded = Files.readAllBytes(Paths.get(path));
         return new String(encoded, encoding);
     };
@@ -31,8 +33,9 @@
 
     /**
      * Get String from file (expecting UTF-8).
-     *
-     * @param path The path of the file represented as a string. 
+     * 
+     * @param path
+     *            The path of the file represented as a string.
      * @return The content of the file
      * @throws IOException
      */
@@ -43,14 +46,13 @@
 
     /**
      * Escape HTML relevant characters as entities.
-     *
-     * @param text The string to escape.
+     * 
+     * @param text
+     *            The string to escape.
      * @return The secured string.
      */
     public static String escapeHTML (String text) {
-        return text.replace("&", "&amp;")
-            .replace("<", "&lt;")
-            .replace(">", "&gt;")
-            .replace("\"", "&quot;");
+        return text.replace("&", "&amp;").replace("<", "&lt;")
+                .replace(">", "&gt;").replace("\"", "&quot;");
     };
 };
diff --git a/src/main/java/de/ids_mannheim/korap/util/QueryException.java b/src/main/java/de/ids_mannheim/korap/util/QueryException.java
index 7dca966..f65dc95 100644
--- a/src/main/java/de/ids_mannheim/korap/util/QueryException.java
+++ b/src/main/java/de/ids_mannheim/korap/util/QueryException.java
@@ -2,25 +2,27 @@
 
 /**
  * Exception class for query processing problems.
- *
+ * 
  * @author diewald
  */
 public class QueryException extends Exception {
-	
+
     private int errorCode = 0;
-  
+
+
     /**
      * Construct a new QueryException.
      */
-    public QueryException() {
+    public QueryException () {
         super();
     };
 
 
     /**
      * Construct a new QueryException.
-     *
-     * @param message Exception message.
+     * 
+     * @param message
+     *            Exception message.
      */
     public QueryException (String message) {
         super(message);
@@ -29,21 +31,25 @@
 
     /**
      * Construct a new QueryException.
-     *
-     * @param code An integer value as an error code.
-     * @param message Exception message.
+     * 
+     * @param code
+     *            An integer value as an error code.
+     * @param message
+     *            Exception message.
      */
-    public QueryException (int code, String message) {	  
+    public QueryException (int code, String message) {
         super(message);
-        this.setErrorCode(code);      
+        this.setErrorCode(code);
     };
 
 
     /**
      * Construct a new QueryException.
-     *
-     * @param message Exception message.
-     * @param cause A {@link Throwable} object.
+     * 
+     * @param message
+     *            Exception message.
+     * @param cause
+     *            A {@link Throwable} object.
      */
     public QueryException (String message, Throwable cause) {
         super(message, cause);
@@ -52,28 +58,30 @@
 
     /**
      * Construct a new QueryException.
-     *
-     * @param cause A {@link Throwable} object.
-     */    
+     * 
+     * @param cause
+     *            A {@link Throwable} object.
+     */
     public QueryException (Throwable cause) {
         super(cause);
-    };  
-  
+    };
+
 
     /**
      * Get the error code of the exception.
-     *
+     * 
      * @return The error code of the exception as an integer.
      */
-    public int getErrorCode() {
+    public int getErrorCode () {
         return this.errorCode;
     };
 
 
     /**
      * Set the error code of the exception.
-     *
-     * @param code The error code of the exception as an integer.
+     * 
+     * @param code
+     *            The error code of the exception as an integer.
      */
     public void setErrorCode (int code) {
         this.errorCode = code;
diff --git a/src/test/java/de/ids_mannheim/korap/Test.java b/src/test/java/de/ids_mannheim/korap/Test.java
index 8475cd4..9f33803 100644
--- a/src/test/java/de/ids_mannheim/korap/Test.java
+++ b/src/test/java/de/ids_mannheim/korap/Test.java
@@ -19,12 +19,13 @@
 
 /**
  * Helper class for testing the KrillIndex framework (Normal).
- *
+ * 
  * @author diewald
  */
 public class Test {
 
-    public static void addDoc(IndexWriter w, Map<String, String> m) throws IOException {
+    public static void addDoc (IndexWriter w, Map<String, String> m)
+            throws IOException {
         Document doc = new Document();
         String[] strInt = { "pubDate" };
         String[] strStr = { "id", "corpus", "pubPlace" };
@@ -45,21 +46,19 @@
             doc.add(new IntField(s, Integer.parseInt(m.get(s)), Field.Store.YES));
         };
 
-        FieldType textFieldWithTermVectors = new FieldType(TextField.TYPE_STORED);
+        FieldType textFieldWithTermVectors = new FieldType(
+                TextField.TYPE_STORED);
         textFieldWithTermVectors.setStoreTermVectors(true);
         textFieldWithTermVectors.setStoreTermVectorOffsets(true);
         textFieldWithTermVectors.setStoreTermVectorPositions(true);
         textFieldWithTermVectors.setStoreTermVectorPayloads(true);
 
-        Field textFieldAnalyzed = new Field(
-            "text",
-            m.get("textStr"),
-            textFieldWithTermVectors
-        );
+        Field textFieldAnalyzed = new Field("text", m.get("textStr"),
+                textFieldWithTermVectors);
 
         MultiTermTokenStream ts = getTermVector(m.get("text"));
 
-        textFieldAnalyzed.setTokenStream( ts );
+        textFieldAnalyzed.setTokenStream(ts);
 
         doc.add(textFieldAnalyzed);
 
@@ -67,17 +66,18 @@
         w.addDocument(doc);
     };
 
+
     public static MultiTermTokenStream getTermVector (String stream) {
         MultiTermTokenStream ts = new MultiTermTokenStream();
 
         int pos = 0;
         for (String seg : stream.split(" ")) {
-            
+
             String[] tokseg = seg.split("\\|");
 
             try {
                 MultiTermToken mtt = new MultiTermToken('s', tokseg[0]);
-            
+
                 mtt.add("T");
                 mtt.add('i', tokseg[0].toLowerCase());
                 mtt.add('p', tokseg[1]);
@@ -91,14 +91,14 @@
                 if (tokseg.length == 5) {
                     mtt.add('e', tokseg[4]);
                 };
-                
+
                 ts.addMultiTermToken(mtt);
             }
             catch (CorpusDataException cde) {
                 fail(cde.getErrorCode() + ": " + cde.getMessage());
             };
         };
-        
+
         return ts;
     };
 };
diff --git a/src/test/java/de/ids_mannheim/korap/TestSimple.java b/src/test/java/de/ids_mannheim/korap/TestSimple.java
index fad4419..abda3c8 100644
--- a/src/test/java/de/ids_mannheim/korap/TestSimple.java
+++ b/src/test/java/de/ids_mannheim/korap/TestSimple.java
@@ -22,16 +22,18 @@
 
 /**
  * Helper class for testing the KrillIndex framework (Simple).
- *
+ * 
  * @author diewald
  */
 public class TestSimple {
 
     // Add document
-    public static void addDoc(IndexWriter w, Map<String, String> m) throws IOException {
+    public static void addDoc (IndexWriter w, Map<String, String> m)
+            throws IOException {
         Document doc = new Document();
 
-        FieldType textFieldWithTermVectors = new FieldType(TextField.TYPE_STORED);
+        FieldType textFieldWithTermVectors = new FieldType(
+                TextField.TYPE_STORED);
         textFieldWithTermVectors.setStoreTermVectors(true);
         /*
           No offsets are stored.
@@ -40,15 +42,12 @@
         textFieldWithTermVectors.setStoreTermVectorPositions(true);
         textFieldWithTermVectors.setStoreTermVectorPayloads(true);
 
-        Field textFieldAnalyzed = new Field(
-            "text",
-            m.get("textStr"),
-            textFieldWithTermVectors
-        );
+        Field textFieldAnalyzed = new Field("text", m.get("textStr"),
+                textFieldWithTermVectors);
 
         MultiTermTokenStream ts = getTermVector(m.get("text"));
 
-        textFieldAnalyzed.setTokenStream( ts );
+        textFieldAnalyzed.setTokenStream(ts);
 
         doc.add(textFieldAnalyzed);
 
@@ -56,6 +55,7 @@
         w.addDocument(doc);
     };
 
+
     // Get Term Vector
     public static MultiTermTokenStream getTermVector (String stream) {
         MultiTermTokenStream ts = new MultiTermTokenStream();
@@ -85,7 +85,7 @@
                 fail(cde.getErrorCode() + ": " + cde.getMessage());
             };
         };
-        
+
         return ts;
     };
 
@@ -93,7 +93,7 @@
     // Get query wrapper based on json file
     public static SpanQueryWrapper getJSONQuery (String jsonFile) {
         SpanQueryWrapper sqwi;
-	
+
         try {
             String json = getString(jsonFile);
             sqwi = new KrillQuery("tokens").fromJson(json);
@@ -116,7 +116,8 @@
                 contentBuilder.append(str);
             };
             in.close();
-        } catch (IOException e) {
+        }
+        catch (IOException e) {
             fail(e.getMessage());
         }
         return contentBuilder.toString();
@@ -125,10 +126,10 @@
 
     // getSpan Info
     public static List<String> getSpanInfo (IndexReader reader, SpanQuery query)
-        throws IOException {
+            throws IOException {
         Map<Term, TermContext> termContexts = new HashMap<>();
         List<String> spanArray = new ArrayList<>();
-        
+
         for (AtomicReaderContext atomic : reader.leaves()) {
             Bits bitset = atomic.reader().getLiveDocs();
             // Spans spans = NearSpansOrdered();
@@ -140,7 +141,7 @@
                 if (spans.isPayloadAvailable()) {
                     for (byte[] payload : spans.getPayload()) {
                         /* retrieve payload for current matching span */
-                        
+
                         payloadString.append(byte2int(payload)).append(",");
                         payloadString.append(byte2int(payload, 2));
                         //			payloadString.append(byte2int(payload, 1));
@@ -148,16 +149,8 @@
                         payloadString.append(" | ");
                     };
                 };
-                spanArray.add(
-                    "Doc: " +
-                    docid +
-                    " with " +
-                    spans.start() +
-                    "-" +
-                    spans.end() +
-                    " || " +
-                    payloadString.toString()
-                );
+                spanArray.add("Doc: " + docid + " with " + spans.start() + "-"
+                        + spans.end() + " || " + payloadString.toString());
             };
         };
         return spanArray;
diff --git a/src/test/java/de/ids_mannheim/korap/benchmark/TestBenchmarkSpans.java b/src/test/java/de/ids_mannheim/korap/benchmark/TestBenchmarkSpans.java
index 3f9f91d..4f7ba16 100644
--- a/src/test/java/de/ids_mannheim/korap/benchmark/TestBenchmarkSpans.java
+++ b/src/test/java/de/ids_mannheim/korap/benchmark/TestBenchmarkSpans.java
@@ -28,18 +28,21 @@
     @Test
     public void checkBenchmark1 () throws IOException {
         Properties prop = new Properties();
-        InputStream fr = new FileInputStream(getClass().getResource("/krill.properties").getFile());
+        InputStream fr = new FileInputStream(getClass().getResource(
+                "/krill.properties").getFile());
         prop.load(fr);
 
         // Get the real index
-        KrillIndex ki = new KrillIndex(new MMapDirectory(new File(prop.getProperty("krill.indexDir"))));
+        KrillIndex ki = new KrillIndex(new MMapDirectory(new File(
+                prop.getProperty("krill.indexDir"))));
 
         // Create a container for virtual collections:
         KrillCollection kc = new KrillCollection(ki);
 
         long t1 = 0, t2 = 0;
         /// cosmas20.json!!!
-        String json = getString(getClass().getResource("/queries/benchmark1.jsonld").getFile());
+        String json = getString(getClass().getResource(
+                "/queries/benchmark1.jsonld").getFile());
 
         int rounds = 100;
 
@@ -52,24 +55,24 @@
         t2 = System.nanoTime();
 
         // assertEquals("TotalResults", 30751, kr.getTotalResults());
-        assertEquals("TotalResults",  kr.getTotalResults(), 4803739);
+        assertEquals("TotalResults", kr.getTotalResults(), 4803739);
 
         //	long seconds = (long) (t2 - t1 / 1000) % 60 ;
-        double seconds = (double)(t2-t1) / 1000000000.0;
-	
+        double seconds = (double) (t2 - t1) / 1000000000.0;
+
         // System.out.println("It took " + seconds + " seconds");
 
         // 100 times:
         // 43,538 sec
         // 4.874
-        
+
         // 1000 times:
         // 36.613 sec
 
         // After refactoring
         // 100 times
         // 273.58114372 seconds
-        
+
         // After intro of attributes
         // 100 times
         // 350.171506379 seconds
@@ -79,24 +82,27 @@
     @Test
     public void checkBenchmark2JSON () throws IOException {
         Properties prop = new Properties();
-        InputStream fr = new FileInputStream(getClass().getResource("/krill.properties").getFile());
+        InputStream fr = new FileInputStream(getClass().getResource(
+                "/krill.properties").getFile());
         prop.load(fr);
 
         // Get the real index
-        KrillIndex ki = new KrillIndex(new MMapDirectory(new File(prop.getProperty("krill.indexDir"))));
-        
+        KrillIndex ki = new KrillIndex(new MMapDirectory(new File(
+                prop.getProperty("krill.indexDir"))));
+
         // Create a container for virtual collections:
         KrillCollection kc = new KrillCollection(ki);
 
         long t1 = 0, t2 = 0;
         /// cosmas20.json!!!
-        String json = getString(getClass().getResource("/queries/benchmark2.jsonld").getFile());
-        
+        String json = getString(getClass().getResource(
+                "/queries/benchmark2.jsonld").getFile());
+
         int rounds = 10000;
-        
+
         Result kr = new Result();
         String result = new String("");
-        
+
         t1 = System.nanoTime();
         double length = 0;
         for (int i = 1; i <= rounds; i++) {
@@ -110,8 +116,8 @@
         // System.err.println(kr.toJSON());
 
         //	long seconds = (long) (t2 - t1 / 1000) % 60 ;
-        double seconds = (double)(t2-t1) / 1000000000.0;
-	
+        double seconds = (double) (t2 - t1) / 1000000000.0;
+
         // System.out.println("It took " + seconds + " seconds");
 
         // 10000 times:
@@ -122,18 +128,21 @@
     @Test
     public void checkBenchmarkSentences () throws IOException {
         Properties prop = new Properties();
-        InputStream fr = new FileInputStream(getClass().getResource("/krill.properties").getFile());
+        InputStream fr = new FileInputStream(getClass().getResource(
+                "/krill.properties").getFile());
         prop.load(fr);
 
         // Get the real index
-        KrillIndex ki = new KrillIndex(new MMapDirectory(new File(prop.getProperty("krill.indexDir"))));
+        KrillIndex ki = new KrillIndex(new MMapDirectory(new File(
+                prop.getProperty("krill.indexDir"))));
 
         // Create a container for virtual collections:
         KrillCollection kc = new KrillCollection(ki);
 
         long t1 = 0, t2 = 0;
         /// cosmas20.json!!!
-        String json = getString(getClass().getResource("/queries/benchmark4.jsonld").getFile());
+        String json = getString(getClass().getResource(
+                "/queries/benchmark4.jsonld").getFile());
 
         int rounds = 10;
 
@@ -147,38 +156,42 @@
         t2 = System.nanoTime();
 
         // System.err.println(kr.getMatch(0).toJSON());
-        
-        assertEquals("TotalResults1", kr.getTotalResults(), 4116282);
-        assertEquals("TotalResults2", kr.getTotalResults(), ki.numberOf("sentences"));
 
-        double seconds = (double)(t2-t1) / 1000000000.0;
-        
+        assertEquals("TotalResults1", kr.getTotalResults(), 4116282);
+        assertEquals("TotalResults2", kr.getTotalResults(),
+                ki.numberOf("sentences"));
+
+        double seconds = (double) (t2 - t1) / 1000000000.0;
+
         // System.out.println("It took " + seconds + " seconds");
         // 100 rounds
         // 56.253 secs
     };
 
-    
+
     @Test
     public void checkBenchmarkClasses () throws IOException {
         // [orth=Der]{1:[orth=Mann]{2:[orth=und]}}
 
         Properties prop = new Properties();
-        InputStream fr = new FileInputStream(getClass().getResource("/krill.properties").getFile());
+        InputStream fr = new FileInputStream(getClass().getResource(
+                "/krill.properties").getFile());
         prop.load(fr);
 
         // Get the real index
-        KrillIndex ki = new KrillIndex(new MMapDirectory(new File(prop.getProperty("krill.indexDir"))));
+        KrillIndex ki = new KrillIndex(new MMapDirectory(new File(
+                prop.getProperty("krill.indexDir"))));
 
         // Create a container for virtual collections:
         KrillCollection kc = new KrillCollection(ki);
 
         long t1 = 0, t2 = 0;
         // Without classes
-        String json = getString(getClass().getResource("/queries/benchmark5-ohne.jsonld").getFile());
+        String json = getString(getClass().getResource(
+                "/queries/benchmark5-ohne.jsonld").getFile());
 
         int rounds = 2000;
-        
+
         Result kr = new Result();
 
         t1 = System.nanoTime();
@@ -187,29 +200,31 @@
         };
         t2 = System.nanoTime();
 
-        double seconds = (double)(t2-t1) / 1000000000.0;
-        
+        double seconds = (double) (t2 - t1) / 1000000000.0;
+
         // System.out.println("It took " + seconds + " seconds without classes");
 
         t1 = 0;
         t2 = 0;
         // With classes
-        json = getString(getClass().getResource("/queries/benchmark5.jsonld").getFile());
-        
+        json = getString(getClass().getResource("/queries/benchmark5.jsonld")
+                .getFile());
+
         t1 = System.nanoTime();
         for (int i = 1; i <= rounds; i++) {
             kr = new Krill(json).apply(ki);
         };
         t2 = System.nanoTime();
 
-        seconds = (double)(t2-t1) / 1000000000.0;
-        
+        seconds = (double) (t2 - t1) / 1000000000.0;
+
         // System.out.println("It took " + seconds + " seconds with classes");
 
         t1 = 0;
         t2 = 0;
         // With submatch
-        json = getString(getClass().getResource("/queries/benchmark5-submatch.jsonld").getFile());
+        json = getString(getClass().getResource(
+                "/queries/benchmark5-submatch.jsonld").getFile());
 
         t1 = System.nanoTime();
         for (int i = 1; i <= rounds; i++) {
@@ -217,12 +232,12 @@
         };
         t2 = System.nanoTime();
 
-        seconds = (double)(t2-t1) / 1000000000.0;
-        
+        seconds = (double) (t2 - t1) / 1000000000.0;
+
         // System.out.println("It took " + seconds + " seconds with submatches");
 
         /** HERE IS A BUG! */
-        
+
         // System.err.println(kr.toJsonString());
 
         // System.err.println(kr.toJSON());
@@ -249,12 +264,13 @@
         // It took 15.368675425 seconds without classes
         // It took 18.347603186 seconds with classes
         // It took 15.941057294 seconds with submatches
-        
+
         // It took 15.241253549 seconds without classes
         // It took 17.30375624 seconds with classes
         // It took 15.367171254 seconds with submatches
     };
 
+
     @Test
     public void checkBenchmarkIndexDocuments () throws IOException {
         long t1 = 0, t2 = 0;
@@ -264,14 +280,8 @@
         ArrayList<String> docs = new ArrayList<String>(700);
 
         for (int a = 0; a < 50; a++) {
-            for (String d : new String[] {
-                    "00001",
-                    "00002",
-                    "00003",
-                    "00004",
-                    "00005",
-                    "00006",
-                    "02439"}) {
+            for (String d : new String[] { "00001", "00002", "00003", "00004",
+                    "00005", "00006", "02439" }) {
                 docs.add(d);
             };
         };
@@ -281,19 +291,18 @@
         for (int i = 1; i <= rounds; i++) {
             // Construct index
             KrillIndex ki = new KrillIndex();
-            
+
             // Indexing test files
             for (String d : docs) {
                 FieldDocument fd = ki.addDoc(
-                    getClass().getResourceAsStream("/wiki/" + d + ".json.gz"),
-                    true
-                );
+                        getClass().getResourceAsStream(
+                                "/wiki/" + d + ".json.gz"), true);
             };
             ki.commit();
         };
         t2 = System.nanoTime();
 
-        double seconds = (double)(t2-t1) / 1000000000.0;
+        double seconds = (double) (t2 - t1) / 1000000000.0;
         // System.out.println("It took " + seconds + " seconds");
 
         // 10 times / 350 docs:
@@ -311,21 +320,24 @@
     @Test
     public void checkBenchmark3 () throws IOException {
         Properties prop = new Properties();
-        InputStream fr = new FileInputStream(getClass().getResource("/krill.properties").getFile());
+        InputStream fr = new FileInputStream(getClass().getResource(
+                "/krill.properties").getFile());
         prop.load(fr);
 
         // Get the real index
-        KrillIndex ki = new KrillIndex(new MMapDirectory(new File(prop.getProperty("krill.indexDir"))));
+        KrillIndex ki = new KrillIndex(new MMapDirectory(new File(
+                prop.getProperty("krill.indexDir"))));
 
         // Create a container for virtual collections:
         KrillCollection kc = new KrillCollection(ki);
 
         long t1 = 0, t2 = 0;
         /// cosmas20.json!!!
-        String json = getString(getClass().getResource("/queries/benchmark3.jsonld").getFile());
+        String json = getString(getClass().getResource(
+                "/queries/benchmark3.jsonld").getFile());
 
         int rounds = 500;
-    
+
         Result kr = new Result();
 
         t1 = System.nanoTime();
@@ -339,8 +351,8 @@
         // System.err.println(kr.toJSON());
 
         //	long seconds = (long) (t2 - t1 / 1000) % 60 ;
-        double seconds = (double)(t2-t1) / 1000000000.0;
-	
+        double seconds = (double) (t2 - t1) / 1000000000.0;
+
         System.out.println("It took " + seconds + " seconds");
 
         // 500 times:
@@ -357,15 +369,17 @@
                 contentBuilder.append(str);
             };
             in.close();
-        } catch (IOException e) {
+        }
+        catch (IOException e) {
             fail(e.getMessage());
         }
         return contentBuilder.toString();
     };
-    
+
+
     public static SpanQueryWrapper jsonQuery (String jsonFile) {
         SpanQueryWrapper sqwi;
-	
+
         try {
             String json = getString(jsonFile);
             sqwi = new KrillQuery("tokens").fromJson(json);
diff --git a/src/test/java/de/ids_mannheim/korap/cache/TestCache.java b/src/test/java/de/ids_mannheim/korap/cache/TestCache.java
index d968f82..06a882d 100644
--- a/src/test/java/de/ids_mannheim/korap/cache/TestCache.java
+++ b/src/test/java/de/ids_mannheim/korap/cache/TestCache.java
@@ -7,7 +7,6 @@
 import net.sf.jsr107cache.CacheFactory;
 import net.sf.jsr107cache.CacheManager;
 
-
 import static org.junit.Assert.*;
 import org.junit.Test;
 import org.junit.Ignore;
@@ -20,24 +19,25 @@
     @Test
     public void cache1 () {
 
-	Cache cache;
+        Cache cache;
 
         try {
-            CacheFactory cacheFactory = CacheManager.getInstance().getCacheFactory();
+            CacheFactory cacheFactory = CacheManager.getInstance()
+                    .getCacheFactory();
             cache = cacheFactory.createCache(Collections.emptyMap());
         }
 
-	catch (CacheException e) {
+        catch (CacheException e) {
             // ...
-	    return;
+            return;
         };
 
-	cache.put("beispiel1", "Das ist ein Test");
-	cache.put("beispiel2", "Das ist ein Versuch");
-	cache.put("beispiel3", "Das ist ein Beispiel");
+        cache.put("beispiel1", "Das ist ein Test");
+        cache.put("beispiel2", "Das ist ein Versuch");
+        cache.put("beispiel3", "Das ist ein Beispiel");
 
-	assertEquals(cache.get("beispiel1"), "Das ist ein Test");
-	assertEquals(cache.get("beispiel2"), "Das ist ein Versuch");
-	assertEquals(cache.get("beispiel3"), "Das ist ein Beispiel");
+        assertEquals(cache.get("beispiel1"), "Das ist ein Test");
+        assertEquals(cache.get("beispiel2"), "Das ist ein Versuch");
+        assertEquals(cache.get("beispiel3"), "Das ist ein Beispiel");
     };
 };
diff --git a/src/test/java/de/ids_mannheim/korap/collection/TestCollectionBuilder.java b/src/test/java/de/ids_mannheim/korap/collection/TestCollectionBuilder.java
index 18c8e57..417de65 100644
--- a/src/test/java/de/ids_mannheim/korap/collection/TestCollectionBuilder.java
+++ b/src/test/java/de/ids_mannheim/korap/collection/TestCollectionBuilder.java
@@ -22,21 +22,31 @@
     public void filterExample () throws IOException {
         CollectionBuilder kf = new CollectionBuilder();
 
-        assertEquals("+textClass:tree", kf.and("textClass","tree").toString());
-        assertEquals("+textClass:tree +textClass:sport", kf.and("textClass","tree").and("textClass","sport").toString());
-        assertEquals("+textClass:tree +textClass:sport textClass:news", kf.and("textClass","tree").and("textClass","sport").or("textClass","news").toString());
-        assertEquals("+textClass:tree +textClass:sport +textClass:news", kf.and("textClass", "tree", "sport", "news").toString());
+        assertEquals("+textClass:tree", kf.and("textClass", "tree").toString());
+        assertEquals("+textClass:tree +textClass:sport",
+                kf.and("textClass", "tree").and("textClass", "sport")
+                        .toString());
+        assertEquals(
+                "+textClass:tree +textClass:sport textClass:news",
+                kf.and("textClass", "tree").and("textClass", "sport")
+                        .or("textClass", "news").toString());
+        assertEquals("+textClass:tree +textClass:sport +textClass:news", kf
+                .and("textClass", "tree", "sport", "news").toString());
 
-        assertEquals("corpusID:c-1 corpusID:c-2 corpusID:c-3", kf.or("corpusID", "c-1", "c-2", "c-3").toString());
+        assertEquals("corpusID:c-1 corpusID:c-2 corpusID:c-3",
+                kf.or("corpusID", "c-1", "c-2", "c-3").toString());
     };
 
 
     @Test
     public void rangeExample () throws IOException {
         CollectionBuilder kf = new CollectionBuilder();
-        assertEquals("+pubDate:[20030604 TO 20030899]", kf.between("2003-06-04", "2003-08-99").toString());
-        assertEquals("+pubDate:[0 TO 20030604]", kf.till("2003-06-04").toString());
-        assertEquals("+pubDate:[20030604 TO 99999999]", kf.since("2003-06-04").toString());
+        assertEquals("+pubDate:[20030604 TO 20030899]",
+                kf.between("2003-06-04", "2003-08-99").toString());
+        assertEquals("+pubDate:[0 TO 20030604]", kf.till("2003-06-04")
+                .toString());
+        assertEquals("+pubDate:[20030604 TO 99999999]", kf.since("2003-06-04")
+                .toString());
         assertEquals("+pubDate:20030604", kf.date("2003-06-04").toString());
     };
 
@@ -44,31 +54,47 @@
     @Test
     public void rangeLimited () throws IOException {
         CollectionBuilder kf = new CollectionBuilder();
-        assertEquals("+pubDate:[20050000 TO 20099999]", kf.between("2005", "2009").toString());
-       	assertEquals("+pubDate:[20051000 TO 20090899]", kf.between("200510", "200908").toString());
-        assertEquals("+pubDate:[20051000 TO 20090899]", kf.between("2005-10", "2009-08").toString());
-        assertEquals("+pubDate:[20051006 TO 20090803]", kf.between("2005-1006", "2009-0803").toString());
-        assertEquals("+pubDate:[20051006 TO 20090803]", kf.between("2005-10-06", "2009-08-03").toString());
-        
+        assertEquals("+pubDate:[20050000 TO 20099999]",
+                kf.between("2005", "2009").toString());
+        assertEquals("+pubDate:[20051000 TO 20090899]",
+                kf.between("200510", "200908").toString());
+        assertEquals("+pubDate:[20051000 TO 20090899]",
+                kf.between("2005-10", "2009-08").toString());
+        assertEquals("+pubDate:[20051006 TO 20090803]",
+                kf.between("2005-1006", "2009-0803").toString());
+        assertEquals("+pubDate:[20051006 TO 20090803]",
+                kf.between("2005-10-06", "2009-08-03").toString());
+
         assertEquals("+pubDate:[0 TO 20059999]", kf.till("2005").toString());
         assertEquals("+pubDate:[0 TO 20051099]", kf.till("200510").toString());
         assertEquals("+pubDate:[0 TO 20051099]", kf.till("2005-10").toString());
-        assertEquals("+pubDate:[0 TO 20051006]", kf.till("2005-1006").toString());
-        assertEquals("+pubDate:[0 TO 20051006]", kf.till("2005-10-06").toString());
+        assertEquals("+pubDate:[0 TO 20051006]", kf.till("2005-1006")
+                .toString());
+        assertEquals("+pubDate:[0 TO 20051006]", kf.till("2005-10-06")
+                .toString());
 
-        assertEquals("+pubDate:[20050000 TO 99999999]", kf.since("2005").toString());
-        assertEquals("+pubDate:[20051000 TO 99999999]", kf.since("200510").toString());
-        assertEquals("+pubDate:[20051000 TO 99999999]", kf.since("2005-10").toString());
-        assertEquals("+pubDate:[20051006 TO 99999999]", kf.since("2005-1006").toString());
-        assertEquals("+pubDate:[20051006 TO 99999999]", kf.since("2005-10-06").toString());
-        
-        assertEquals("+pubDate:[20050000 TO 20059999]", kf.date("2005").toString());
-        assertEquals("+pubDate:[20051000 TO 20051099]", kf.date("200510").toString());
-        assertEquals("+pubDate:[20051000 TO 20051099]", kf.date("2005-10").toString());
+        assertEquals("+pubDate:[20050000 TO 99999999]", kf.since("2005")
+                .toString());
+        assertEquals("+pubDate:[20051000 TO 99999999]", kf.since("200510")
+                .toString());
+        assertEquals("+pubDate:[20051000 TO 99999999]", kf.since("2005-10")
+                .toString());
+        assertEquals("+pubDate:[20051006 TO 99999999]", kf.since("2005-1006")
+                .toString());
+        assertEquals("+pubDate:[20051006 TO 99999999]", kf.since("2005-10-06")
+                .toString());
+
+        assertEquals("+pubDate:[20050000 TO 20059999]", kf.date("2005")
+                .toString());
+        assertEquals("+pubDate:[20051000 TO 20051099]", kf.date("200510")
+                .toString());
+        assertEquals("+pubDate:[20051000 TO 20051099]", kf.date("2005-10")
+                .toString());
         assertEquals("+pubDate:20051006", kf.date("2005-1006").toString());
         assertEquals("+pubDate:20051006", kf.date("2005-10-06").toString());
     };
-    
+
+
     @Test
     public void rangeFailure () throws IOException {
         CollectionBuilder kf = new CollectionBuilder();
diff --git a/src/test/java/de/ids_mannheim/korap/collection/TestKrillCollectionJSON.java b/src/test/java/de/ids_mannheim/korap/collection/TestKrillCollectionJSON.java
index 0e6a806..37c33f4 100644
--- a/src/test/java/de/ids_mannheim/korap/collection/TestKrillCollectionJSON.java
+++ b/src/test/java/de/ids_mannheim/korap/collection/TestKrillCollectionJSON.java
@@ -18,25 +18,23 @@
 
     final String path = "/queries/collections/";
 
+
     @Test
     public void collection1 () {
         String metaQuery = _getJSONString("collection_1.jsonld");
         KrillCollection kc = new KrillCollection(metaQuery);
-        assertEquals(
-            kc.toString(),
-            "filter with QueryWrapperFilter(+pubDate:20000101); "
-        );
+        assertEquals(kc.toString(),
+                "filter with QueryWrapperFilter(+pubDate:20000101); ");
     };
 
+
     @Test
     public void collection2 () {
         String metaQuery = _getJSONString("collection_2.jsonld");
         KrillCollection kc = new KrillCollection(metaQuery);
-        assertEquals(
-            kc.toString(),
-            "filter with QueryWrapperFilter(+(+pubDate:"+
-            "[19900000 TO 99999999] +pubDate:[0 TO 20061099])); "
-        );
+        assertEquals(kc.toString(),
+                "filter with QueryWrapperFilter(+(+pubDate:"
+                        + "[19900000 TO 99999999] +pubDate:[0 TO 20061099])); ");
     };
 
 
@@ -52,11 +50,8 @@
     public void collection5 () {
         String metaQuery = _getJSONString("collection_5.jsonld");
         KrillCollection kc = new KrillCollection(metaQuery);
-        assertEquals(
-            kc.toString(),
-            "filter with QueryWrapperFilter(+(pubDate:"+
-            "[19900000 TO 99999999] title:Mannheim)); "
-        );
+        assertEquals(kc.toString(), "filter with QueryWrapperFilter(+(pubDate:"
+                + "[19900000 TO 99999999] title:Mannheim)); ");
     };
 
 
@@ -72,10 +67,8 @@
     public void noCollection () {
         String metaQuery = _getJSONString("no_collection.jsonld");
         KrillCollection kc = new KrillCollection(metaQuery);
-        assertEquals(
-            "filter with QueryWrapperFilter(+corpusID:WPD); ",
-            kc.toString()
-        );
+        assertEquals("filter with QueryWrapperFilter(+corpusID:WPD); ",
+                kc.toString());
     };
 
 
diff --git a/src/test/java/de/ids_mannheim/korap/collection/TestKrillCollectionJSONLegacy.java b/src/test/java/de/ids_mannheim/korap/collection/TestKrillCollectionJSONLegacy.java
index 41a0d41..f83804f 100644
--- a/src/test/java/de/ids_mannheim/korap/collection/TestKrillCollectionJSONLegacy.java
+++ b/src/test/java/de/ids_mannheim/korap/collection/TestKrillCollectionJSONLegacy.java
@@ -18,46 +18,68 @@
 
     @Test
     public void metaQuery1 () {
-	String metaQuery = getString(getClass().getResource("/queries/metaquery.jsonld").getFile());
-	KrillCollection kc = new KrillCollection(metaQuery);
+        String metaQuery = getString(getClass().getResource(
+                "/queries/metaquery.jsonld").getFile());
+        KrillCollection kc = new KrillCollection(metaQuery);
 
-	assertEquals("filter with QueryWrapperFilter(+textClass:wissenschaft)", kc.getFilter(0).toString());
-	assertEquals("filter with QueryWrapperFilter(+(+pubPlace:Erfurt +author:Hesse))", kc.getFilter(1).toString());
-	assertEquals("extend with QueryWrapperFilter(+(+pubDate:[20110429 TO 20131231] +textClass:freizeit))", kc.getFilter(2).toString());
-	assertEquals(3, kc.getCount());
+        assertEquals("filter with QueryWrapperFilter(+textClass:wissenschaft)",
+                kc.getFilter(0).toString());
+        assertEquals(
+                "filter with QueryWrapperFilter(+(+pubPlace:Erfurt +author:Hesse))",
+                kc.getFilter(1).toString());
+        assertEquals(
+                "extend with QueryWrapperFilter(+(+pubDate:[20110429 TO 20131231] +textClass:freizeit))",
+                kc.getFilter(2).toString());
+        assertEquals(3, kc.getCount());
     };
 
 
     @Test
     public void metaQuery2 () {
-	String metaQuery = getString(getClass().getResource("/queries/metaquery2.jsonld").getFile());
-	KrillCollection kc = new KrillCollection(metaQuery);
-	assertEquals(1,kc.getCount());
-	assertEquals("filter with QueryWrapperFilter(+(+author:Hesse +pubDate:[0 TO 20131205]))",kc.getFilter(0).toString());
+        String metaQuery = getString(getClass().getResource(
+                "/queries/metaquery2.jsonld").getFile());
+        KrillCollection kc = new KrillCollection(metaQuery);
+        assertEquals(1, kc.getCount());
+        assertEquals(
+                "filter with QueryWrapperFilter(+(+author:Hesse +pubDate:[0 TO 20131205]))",
+                kc.getFilter(0).toString());
     };
 
+
     @Test
     public void metaQuery3 () {
-	String metaQuery = getString(getClass().getResource("/queries/metaquery4.jsonld").getFile());
-	KrillCollection kc = new KrillCollection(metaQuery);
-	assertEquals(1,kc.getCount());
-	assertEquals("filter with QueryWrapperFilter(+pubDate:[20000101 TO 20131231])",kc.getFilter(0).toString());
+        String metaQuery = getString(getClass().getResource(
+                "/queries/metaquery4.jsonld").getFile());
+        KrillCollection kc = new KrillCollection(metaQuery);
+        assertEquals(1, kc.getCount());
+        assertEquals(
+                "filter with QueryWrapperFilter(+pubDate:[20000101 TO 20131231])",
+                kc.getFilter(0).toString());
     };
 
+
     @Test
     public void metaQuery7 () {
-	String metaQuery = getString(getClass().getResource("/queries/metaquery7.jsonld").getFile());
-	KrillCollection kc = new KrillCollection(metaQuery);
-	assertEquals(2,kc.getCount());
-	assertEquals("filter with QueryWrapperFilter(+(corpusID:c-1 corpusID:c-2))",kc.getFilter(0).toString());
-	assertEquals("filter with QueryWrapperFilter(+(+corpusID:d-1 +corpusID:d-2))",kc.getFilter(1).toString());
+        String metaQuery = getString(getClass().getResource(
+                "/queries/metaquery7.jsonld").getFile());
+        KrillCollection kc = new KrillCollection(metaQuery);
+        assertEquals(2, kc.getCount());
+        assertEquals(
+                "filter with QueryWrapperFilter(+(corpusID:c-1 corpusID:c-2))",
+                kc.getFilter(0).toString());
+        assertEquals(
+                "filter with QueryWrapperFilter(+(+corpusID:d-1 +corpusID:d-2))",
+                kc.getFilter(1).toString());
     };
 
+
     @Test
     public void metaQuery9 () {
-	String metaQuery = getString(getClass().getResource("/queries/metaquery9.jsonld").getFile());
-	KrillCollection kc = new KrillCollection(metaQuery);
-	assertEquals(1,kc.getCount());
-	assertEquals("filter with QueryWrapperFilter(+corpusID:WPD)",kc.getFilter(0).toString());
+        String metaQuery = getString(getClass().getResource(
+                "/queries/metaquery9.jsonld").getFile());
+        KrillCollection kc = new KrillCollection(metaQuery);
+        assertEquals(1, kc.getCount());
+        assertEquals("filter with QueryWrapperFilter(+corpusID:WPD)", kc
+                .getFilter(0).toString());
     };
 };
diff --git a/src/test/java/de/ids_mannheim/korap/collection/TestKrillCollectionLegacy.java b/src/test/java/de/ids_mannheim/korap/collection/TestKrillCollectionLegacy.java
index 4c2a83b..8341c1c 100644
--- a/src/test/java/de/ids_mannheim/korap/collection/TestKrillCollectionLegacy.java
+++ b/src/test/java/de/ids_mannheim/korap/collection/TestKrillCollectionLegacy.java
@@ -26,247 +26,227 @@
 
     @Test
     public void filterExample () throws Exception {
-	
-	// Construct index
-	KrillIndex ki = new KrillIndex();
-	// Indexing test files
-	for (String i : new String[] {"00001",
-				      "00002",
-				      "00003",
-				      "00004",
-				      "00005",
-				      "00006",
-				      "02439"}) {
-	    ki.addDoc(
-	        getClass().getResourceAsStream("/wiki/" + i + ".json.gz"), true
-            );
-	};
-	ki.commit();
 
-	CollectionBuilder kf = new CollectionBuilder();
+        // Construct index
+        KrillIndex ki = new KrillIndex();
+        // Indexing test files
+        for (String i : new String[] { "00001", "00002", "00003", "00004",
+                "00005", "00006", "02439" }) {
+            ki.addDoc(
+                    getClass().getResourceAsStream("/wiki/" + i + ".json.gz"),
+                    true);
+        };
+        ki.commit();
 
-	// Create Virtual collections:
-	KrillCollection kc = new KrillCollection(ki);
+        CollectionBuilder kf = new CollectionBuilder();
 
-	assertEquals("Documents", 7, kc.numberOf("documents"));
+        // Create Virtual collections:
+        KrillCollection kc = new KrillCollection(ki);
 
-	// The virtual collection consists of all documents that have
-	// the textClass "reisen" and "freizeit"
+        assertEquals("Documents", 7, kc.numberOf("documents"));
 
-	kc.filter(
-            kf.and("textClass", "reisen")
-	      .and("textClass", "freizeit-unterhaltung")
-	);
+        // The virtual collection consists of all documents that have
+        // the textClass "reisen" and "freizeit"
 
-	assertEquals("Documents", 5, kc.numberOf("documents"));
-	assertEquals("Tokens", 1678, kc.numberOf("tokens"));
-	assertEquals("Sentences", 194, kc.numberOf("sentences"));
-	assertEquals("Paragraphs", 139, kc.numberOf("paragraphs"));
+        kc.filter(kf.and("textClass", "reisen").and("textClass",
+                "freizeit-unterhaltung"));
 
-	// Subset this to all documents that have also the text
-	kc.filter(kf.and("textClass", "kultur"));
+        assertEquals("Documents", 5, kc.numberOf("documents"));
+        assertEquals("Tokens", 1678, kc.numberOf("tokens"));
+        assertEquals("Sentences", 194, kc.numberOf("sentences"));
+        assertEquals("Paragraphs", 139, kc.numberOf("paragraphs"));
 
-	assertEquals("Documents", 1, kc.numberOf("documents"));
-	assertEquals("Tokens", 405, kc.numberOf("tokens"));
-	assertEquals("Sentences", 75, kc.numberOf("sentences"));
-	assertEquals("Paragraphs", 48, kc.numberOf("paragraphs"));
+        // Subset this to all documents that have also the text
+        kc.filter(kf.and("textClass", "kultur"));
 
-	kc.filter(kf.and("corpusID", "WPD"));
+        assertEquals("Documents", 1, kc.numberOf("documents"));
+        assertEquals("Tokens", 405, kc.numberOf("tokens"));
+        assertEquals("Sentences", 75, kc.numberOf("sentences"));
+        assertEquals("Paragraphs", 48, kc.numberOf("paragraphs"));
 
-	assertEquals("Documents", 1, kc.numberOf("documents"));
-	assertEquals("Tokens", 405, kc.numberOf("tokens"));
-	assertEquals("Sentences", 75, kc.numberOf("sentences"));
-	assertEquals("Paragraphs", 48, kc.numberOf("paragraphs"));
+        kc.filter(kf.and("corpusID", "WPD"));
 
-	// Create a query
-	QueryBuilder kq = new QueryBuilder("tokens");
-	SpanQuery query = kq.seg("opennlp/p:NN").with("tt/p:NN").toQuery();
+        assertEquals("Documents", 1, kc.numberOf("documents"));
+        assertEquals("Tokens", 405, kc.numberOf("tokens"));
+        assertEquals("Sentences", 75, kc.numberOf("sentences"));
+        assertEquals("Paragraphs", 48, kc.numberOf("paragraphs"));
 
-	Result kr = kc.search(query);
-	assertEquals(kr.getTotalResults(), 70);
+        // Create a query
+        QueryBuilder kq = new QueryBuilder("tokens");
+        SpanQuery query = kq.seg("opennlp/p:NN").with("tt/p:NN").toQuery();
 
-	kc.extend( kf.and("textClass", "uninteresting") );
-	assertEquals("Documents", 1, kc.numberOf("documents"));
+        Result kr = kc.search(query);
+        assertEquals(kr.getTotalResults(), 70);
 
-	kc.extend( kf.and("textClass", "wissenschaft") );
+        kc.extend(kf.and("textClass", "uninteresting"));
+        assertEquals("Documents", 1, kc.numberOf("documents"));
 
-	assertEquals("Documents", 3, kc.numberOf("documents"));
-	assertEquals("Tokens", 1669, kc.numberOf("tokens"));
-	assertEquals("Sentences", 188, kc.numberOf("sentences"));
-	assertEquals("Paragraphs", 130, kc.numberOf("paragraphs"));
-	// System.err.println(kr.toJSON());
+        kc.extend(kf.and("textClass", "wissenschaft"));
+
+        assertEquals("Documents", 3, kc.numberOf("documents"));
+        assertEquals("Tokens", 1669, kc.numberOf("tokens"));
+        assertEquals("Sentences", 188, kc.numberOf("sentences"));
+        assertEquals("Paragraphs", 130, kc.numberOf("paragraphs"));
+        // System.err.println(kr.toJSON());
     };
 
+
     @Test
     public void filterExampleAtomic () throws Exception {
-	
-	// That's exactly the same test class, but with multiple atomic indices
 
-	// Construct index
-	KrillIndex ki = new KrillIndex();
-	// Indexing test files
-	for (String i : new String[] {"00001",
-				      "00002",
-				      "00003",
-				      "00004",
-				      "00005",
-				      "00006",
-				      "02439"}) {
-	    ki.addDoc(
-	      getClass().getResourceAsStream("/wiki/" + i + ".json.gz"), true
-            );
-	    ki.commit();
-	};
+        // That's exactly the same test class, but with multiple atomic indices
 
-	CollectionBuilder kf = new CollectionBuilder();
+        // Construct index
+        KrillIndex ki = new KrillIndex();
+        // Indexing test files
+        for (String i : new String[] { "00001", "00002", "00003", "00004",
+                "00005", "00006", "02439" }) {
+            ki.addDoc(
+                    getClass().getResourceAsStream("/wiki/" + i + ".json.gz"),
+                    true);
+            ki.commit();
+        };
 
-	// Create Virtual collections:
-	KrillCollection kc = new KrillCollection(ki);
+        CollectionBuilder kf = new CollectionBuilder();
 
-	assertEquals("Documents", 7, kc.numberOf("documents"));
+        // Create Virtual collections:
+        KrillCollection kc = new KrillCollection(ki);
 
-	// If this is set - everything is fine automatically ...
-	kc.filter(kf.and("corpusID", "WPD"));
-	assertEquals("Documents", 7, kc.numberOf("documents"));
+        assertEquals("Documents", 7, kc.numberOf("documents"));
+
+        // If this is set - everything is fine automatically ...
+        kc.filter(kf.and("corpusID", "WPD"));
+        assertEquals("Documents", 7, kc.numberOf("documents"));
 
 
-	// The virtual collection consists of all documents that have the textClass "reisen" and "freizeit"
+        // The virtual collection consists of all documents that have the textClass "reisen" and "freizeit"
 
-	kc.filter( kf.and("textClass", "reisen").and("textClass", "freizeit-unterhaltung") );
+        kc.filter(kf.and("textClass", "reisen").and("textClass",
+                "freizeit-unterhaltung"));
 
-	assertEquals("Documents", 5, kc.numberOf("documents"));
-	assertEquals("Tokens", 1678, kc.numberOf("tokens"));
-	assertEquals("Sentences", 194, kc.numberOf("sentences"));
-	assertEquals("Paragraphs", 139, kc.numberOf("paragraphs"));
+        assertEquals("Documents", 5, kc.numberOf("documents"));
+        assertEquals("Tokens", 1678, kc.numberOf("tokens"));
+        assertEquals("Sentences", 194, kc.numberOf("sentences"));
+        assertEquals("Paragraphs", 139, kc.numberOf("paragraphs"));
 
-	// Subset this to all documents that have also the text
-	kc.filter(kf.and("textClass", "kultur"));
+        // Subset this to all documents that have also the text
+        kc.filter(kf.and("textClass", "kultur"));
 
-	assertEquals("Documents", 1, kc.numberOf("documents"));
-	assertEquals("Tokens", 405, kc.numberOf("tokens"));
-	assertEquals("Sentences", 75, kc.numberOf("sentences"));
-	assertEquals("Paragraphs", 48, kc.numberOf("paragraphs"));
+        assertEquals("Documents", 1, kc.numberOf("documents"));
+        assertEquals("Tokens", 405, kc.numberOf("tokens"));
+        assertEquals("Sentences", 75, kc.numberOf("sentences"));
+        assertEquals("Paragraphs", 48, kc.numberOf("paragraphs"));
 
-	// This is already filtered though ...
-	kc.filter(kf.and("corpusID", "WPD"));
+        // This is already filtered though ...
+        kc.filter(kf.and("corpusID", "WPD"));
 
-	assertEquals("Documents", 1, kc.numberOf("documents"));
-	assertEquals("Tokens", 405, kc.numberOf("tokens"));
-	assertEquals("Sentences", 75, kc.numberOf("sentences"));
-	assertEquals("Paragraphs", 48, kc.numberOf("paragraphs"));
+        assertEquals("Documents", 1, kc.numberOf("documents"));
+        assertEquals("Tokens", 405, kc.numberOf("tokens"));
+        assertEquals("Sentences", 75, kc.numberOf("sentences"));
+        assertEquals("Paragraphs", 48, kc.numberOf("paragraphs"));
 
-	// Create a query
-	QueryBuilder kq = new QueryBuilder("tokens");
-	SpanQuery query = kq.seg("opennlp/p:NN").with("tt/p:NN").toQuery();
+        // Create a query
+        QueryBuilder kq = new QueryBuilder("tokens");
+        SpanQuery query = kq.seg("opennlp/p:NN").with("tt/p:NN").toQuery();
 
-	Result kr = kc.search(query);
-	assertEquals(kr.getTotalResults(), 70);
+        Result kr = kc.search(query);
+        assertEquals(kr.getTotalResults(), 70);
 
-	kc.extend( kf.and("textClass", "uninteresting") );
-	assertEquals("Documents", 1, kc.numberOf("documents"));
+        kc.extend(kf.and("textClass", "uninteresting"));
+        assertEquals("Documents", 1, kc.numberOf("documents"));
 
-	kc.extend( kf.and("textClass", "wissenschaft") );
+        kc.extend(kf.and("textClass", "wissenschaft"));
 
-	assertEquals("Documents", 3, kc.numberOf("documents"));
-	assertEquals("Tokens", 1669, kc.numberOf("tokens"));
-	assertEquals("Sentences", 188, kc.numberOf("sentences"));
-	assertEquals("Paragraphs", 130, kc.numberOf("paragraphs"));
+        assertEquals("Documents", 3, kc.numberOf("documents"));
+        assertEquals("Tokens", 1669, kc.numberOf("tokens"));
+        assertEquals("Sentences", 188, kc.numberOf("sentences"));
+        assertEquals("Paragraphs", 130, kc.numberOf("paragraphs"));
     };
 
 
 
     @Test
     public void filterExample2 () throws Exception {
-	
-	// Construct index
-	KrillIndex ki = new KrillIndex();
-	// Indexing test files
-	for (String i : new String[] {"00001",
-				      "00002",
-				      "00003",
-				      "00004",
-				      "00005",
-				      "00006",
-				      "02439"}) {
-	  ki.addDoc(
-	      getClass().getResourceAsStream("/wiki/" + i + ".json.gz"), true
-            );
-	};
-	ki.commit();
 
-	ki.addDoc(getClass().getResourceAsStream("/wiki/00012-fakemeta.json.gz"), true);
+        // Construct index
+        KrillIndex ki = new KrillIndex();
+        // Indexing test files
+        for (String i : new String[] { "00001", "00002", "00003", "00004",
+                "00005", "00006", "02439" }) {
+            ki.addDoc(
+                    getClass().getResourceAsStream("/wiki/" + i + ".json.gz"),
+                    true);
+        };
+        ki.commit();
 
-	ki.commit();
+        ki.addDoc(getClass()
+                .getResourceAsStream("/wiki/00012-fakemeta.json.gz"), true);
 
-	CollectionBuilder kf = new CollectionBuilder();
+        ki.commit();
 
-	// Create Virtual collections:
-	KrillCollection kc = new KrillCollection(ki);
-	kc.filter( kf.and("textClass", "reisen").and("textClass", "freizeit-unterhaltung") );
-	assertEquals("Documents", 5, kc.numberOf("documents"));
-	assertEquals("Tokens", 1678, kc.numberOf("tokens"));
-	assertEquals("Sentences", 194, kc.numberOf("sentences"));
-	assertEquals("Paragraphs", 139, kc.numberOf("paragraphs"));
+        CollectionBuilder kf = new CollectionBuilder();
 
-	// Create a query
-	QueryBuilder kq = new QueryBuilder("tokens");
-	SpanQuery query = kq.seg("opennlp/p:NN").with("tt/p:NN").toQuery();
+        // Create Virtual collections:
+        KrillCollection kc = new KrillCollection(ki);
+        kc.filter(kf.and("textClass", "reisen").and("textClass",
+                "freizeit-unterhaltung"));
+        assertEquals("Documents", 5, kc.numberOf("documents"));
+        assertEquals("Tokens", 1678, kc.numberOf("tokens"));
+        assertEquals("Sentences", 194, kc.numberOf("sentences"));
+        assertEquals("Paragraphs", 139, kc.numberOf("paragraphs"));
 
-	Result kr = kc.search(query);
+        // Create a query
+        QueryBuilder kq = new QueryBuilder("tokens");
+        SpanQuery query = kq.seg("opennlp/p:NN").with("tt/p:NN").toQuery();
 
-	assertEquals(kr.getTotalResults(), 369);
+        Result kr = kc.search(query);
 
-	kc.filter( kf.and("corpusID", "QQQ") );
+        assertEquals(kr.getTotalResults(), 369);
 
-	assertEquals("Documents", 0, kc.numberOf("documents"));
-	assertEquals("Tokens", 0, kc.numberOf("tokens"));
-	assertEquals("Sentences", 0, kc.numberOf("sentences"));
-	assertEquals("Paragraphs", 0, kc.numberOf("paragraphs"));
+        kc.filter(kf.and("corpusID", "QQQ"));
+
+        assertEquals("Documents", 0, kc.numberOf("documents"));
+        assertEquals("Tokens", 0, kc.numberOf("tokens"));
+        assertEquals("Sentences", 0, kc.numberOf("sentences"));
+        assertEquals("Paragraphs", 0, kc.numberOf("paragraphs"));
     };
 
 
     @Test
     public void uidCollection () throws IOException {
-	
-	// Construct index
-	KrillIndex ki = new KrillIndex();
-	// Indexing test files
-	int uid = 1;
-	for (String i : new String[] {"00001",
-				      "00002",
-				      "00003",
-				      "00004",
-				      "00005",
-				      "00006",
-				      "02439"}) {
-	    FieldDocument fd = ki.addDoc(
-                                     uid++,
-	        getClass().getResourceAsStream("/wiki/" + i + ".json.gz"),
-		true
-	    );
-	};
-	ki.commit();
 
-	assertEquals("Documents",    7, ki.numberOf("documents"));
-	assertEquals("Paragraphs", 174, ki.numberOf("paragraphs"));
-	assertEquals("Sentences",  281, ki.numberOf("sentences"));
-	assertEquals("Tokens",    2661, ki.numberOf("tokens"));
+        // Construct index
+        KrillIndex ki = new KrillIndex();
+        // Indexing test files
+        int uid = 1;
+        for (String i : new String[] { "00001", "00002", "00003", "00004",
+                "00005", "00006", "02439" }) {
+            FieldDocument fd = ki.addDoc(uid++,
+                    getClass().getResourceAsStream("/wiki/" + i + ".json.gz"),
+                    true);
+        };
+        ki.commit();
 
-	SpanQuery sq = new SpanTermQuery(new Term("tokens", "s:der"));
-	Result kr = ki.search(sq, (short) 10);
-        assertEquals(86,kr.getTotalResults());
+        assertEquals("Documents", 7, ki.numberOf("documents"));
+        assertEquals("Paragraphs", 174, ki.numberOf("paragraphs"));
+        assertEquals("Sentences", 281, ki.numberOf("sentences"));
+        assertEquals("Tokens", 2661, ki.numberOf("tokens"));
 
-	// Create Virtual collections:
-	KrillCollection kc = new KrillCollection();
-	kc.filterUIDs(new String[]{"2", "3", "4"});
-	kc.setIndex(ki);
-	assertEquals("Documents", 3, kc.numberOf("documents"));
+        SpanQuery sq = new SpanTermQuery(new Term("tokens", "s:der"));
+        Result kr = ki.search(sq, (short) 10);
+        assertEquals(86, kr.getTotalResults());
 
-	assertEquals("Paragraphs", 46, kc.numberOf("paragraphs"));
-	assertEquals("Sentences", 103, kc.numberOf("sentences"));
-	assertEquals("Tokens",   1229, kc.numberOf("tokens"));
+        // Create Virtual collections:
+        KrillCollection kc = new KrillCollection();
+        kc.filterUIDs(new String[] { "2", "3", "4" });
+        kc.setIndex(ki);
+        assertEquals("Documents", 3, kc.numberOf("documents"));
 
-	kr = kc.search(sq);
+        assertEquals("Paragraphs", 46, kc.numberOf("paragraphs"));
+        assertEquals("Sentences", 103, kc.numberOf("sentences"));
+        assertEquals("Tokens", 1229, kc.numberOf("tokens"));
+
+        kr = kc.search(sq);
         assertEquals((long) 39, kr.getTotalResults());
     };
 };
diff --git a/src/test/java/de/ids_mannheim/korap/highlight/TestClass.java b/src/test/java/de/ids_mannheim/korap/highlight/TestClass.java
index 003b129..b4ec124 100644
--- a/src/test/java/de/ids_mannheim/korap/highlight/TestClass.java
+++ b/src/test/java/de/ids_mannheim/korap/highlight/TestClass.java
@@ -21,90 +21,93 @@
 
 
 public class TestClass {
-	KrillIndex ki;
-	Result kr;
-	Krill ks;
-	
-	@Test
-	public void queryJSONpoly1() throws QueryException, IOException {
-		
-		String jsonPath = getClass().getResource("/queries/poly1.json").getFile();
-		String jsonQuery = readFile(jsonPath);
-		SpanQueryWrapper sqwi = new KrillQuery("tokens").fromJson(
-				jsonQuery
-		);
-		
-		SpanNextQuery sq = (SpanNextQuery) sqwi.toQuery();
-		//System.out.println(sq.toString());
-		
-		ki = new KrillIndex();
-	    ki.addDoc(
-	    	getClass().getResourceAsStream("/wiki/JJJ-00785.json.gz"),true);
-	    ki.addDoc(
-		        getClass().getResourceAsStream("/wiki/DDD-01402.json.gz"),true);
-		ki.commit();
-		kr = ki.search(sq, (short) 10);
+    KrillIndex ki;
+    Result kr;
+    Krill ks;
 
-		assertEquals(61, kr.getMatch(0).getStartPos());
-		assertEquals(64, kr.getMatch(0).getEndPos());
-		assertEquals("... Bruckner (Wien) und Mathis Lussy (Paris). [{1:Inspiriert} " +
-				"{2:durch die}] additiven Modelle arabischer Rhythmik (er half ...", 
-				kr.getMatch(0).getSnippetBrackets());
-		
-		assertEquals(31, kr.getMatch(1).getStartPos());
-		assertEquals(34, kr.getMatch(1).getEndPos());
-		assertEquals("... des Sendens wird ein unhörbarer Unterton [{1:mitgesendet}, " +
-				"{2:auf den}] das angesprochene Funkgerät reagiert. Die Abkürzung ...", 
-				kr.getMatch(1).getSnippetBrackets());
-	}
 
     @Test
-	public void queryJSONpoly4() throws QueryException, IOException {
-		
-		String jsonPath = getClass().getResource("/queries/poly4.json").getFile();
-		String jsonQuery = readFile(jsonPath);
-		SpanQueryWrapper sqwi = new KrillQuery("tokens").fromJson(
-				jsonQuery
-		);
-		SpanQuery sq = sqwi.toQuery();
-		
-		// System.out.println(sq.toString());
-		
+    public void queryJSONpoly1 () throws QueryException, IOException {
 
-		ki = new KrillIndex();
-	    ki.addDoc(
-	    	getClass().getResourceAsStream("/wiki/SSS-09803.json.gz"), true);
-	    
-	    ki.commit();
-		kr = ki.search(sq, (short) 10);
-				
-		/*
-		for (Match km : kr.getMatches()){
-			System.out.println(km.getStartPos() +","+km.getEndPos()+" "
-					+km.getSnippetBrackets()
-			);
-		}
-		*/
-		assertEquals((long) 495, kr.getTotalResults());
-		assertEquals(3, kr.getMatch(0).getStartPos());
-		assertEquals(5, kr.getMatch(0).getEndPos());
-		
-		//fail("Tests have to be updated");
-	}
-	
-	
-	private String readFile(String path) {
-		StringBuilder sb = new StringBuilder();
-		try {
-		    BufferedReader in = new BufferedReader(new FileReader(path));
-		    String str;
-		    while ((str = in.readLine()) != null) {
-		    	sb.append(str);
-		    };
-		    in.close();
-		} catch (IOException e) {
-		    fail(e.getMessage());
-		}
-		return sb.toString();
-	}
+        String jsonPath = getClass().getResource("/queries/poly1.json")
+                .getFile();
+        String jsonQuery = readFile(jsonPath);
+        SpanQueryWrapper sqwi = new KrillQuery("tokens").fromJson(jsonQuery);
+
+        SpanNextQuery sq = (SpanNextQuery) sqwi.toQuery();
+        //System.out.println(sq.toString());
+
+        ki = new KrillIndex();
+        ki.addDoc(getClass().getResourceAsStream("/wiki/JJJ-00785.json.gz"),
+                true);
+        ki.addDoc(getClass().getResourceAsStream("/wiki/DDD-01402.json.gz"),
+                true);
+        ki.commit();
+        kr = ki.search(sq, (short) 10);
+
+        assertEquals(61, kr.getMatch(0).getStartPos());
+        assertEquals(64, kr.getMatch(0).getEndPos());
+        assertEquals(
+                "... Bruckner (Wien) und Mathis Lussy (Paris). [{1:Inspiriert} "
+                        + "{2:durch die}] additiven Modelle arabischer Rhythmik (er half ...",
+                kr.getMatch(0).getSnippetBrackets());
+
+        assertEquals(31, kr.getMatch(1).getStartPos());
+        assertEquals(34, kr.getMatch(1).getEndPos());
+        assertEquals(
+                "... des Sendens wird ein unhörbarer Unterton [{1:mitgesendet}, "
+                        + "{2:auf den}] das angesprochene Funkgerät reagiert. Die Abkürzung ...",
+                kr.getMatch(1).getSnippetBrackets());
+    }
+
+
+    @Test
+    public void queryJSONpoly4 () throws QueryException, IOException {
+
+        String jsonPath = getClass().getResource("/queries/poly4.json")
+                .getFile();
+        String jsonQuery = readFile(jsonPath);
+        SpanQueryWrapper sqwi = new KrillQuery("tokens").fromJson(jsonQuery);
+        SpanQuery sq = sqwi.toQuery();
+
+        // System.out.println(sq.toString());
+
+
+        ki = new KrillIndex();
+        ki.addDoc(getClass().getResourceAsStream("/wiki/SSS-09803.json.gz"),
+                true);
+
+        ki.commit();
+        kr = ki.search(sq, (short) 10);
+
+        /*
+        for (Match km : kr.getMatches()){
+        	System.out.println(km.getStartPos() +","+km.getEndPos()+" "
+        			+km.getSnippetBrackets()
+        	);
+        }
+        */
+        assertEquals((long) 495, kr.getTotalResults());
+        assertEquals(3, kr.getMatch(0).getStartPos());
+        assertEquals(5, kr.getMatch(0).getEndPos());
+
+        //fail("Tests have to be updated");
+    }
+
+
+    private String readFile (String path) {
+        StringBuilder sb = new StringBuilder();
+        try {
+            BufferedReader in = new BufferedReader(new FileReader(path));
+            String str;
+            while ((str = in.readLine()) != null) {
+                sb.append(str);
+            };
+            in.close();
+        }
+        catch (IOException e) {
+            fail(e.getMessage());
+        }
+        return sb.toString();
+    }
 }
diff --git a/src/test/java/de/ids_mannheim/korap/highlight/TestHighlight.java b/src/test/java/de/ids_mannheim/korap/highlight/TestHighlight.java
index bb5b236..c2da28b 100644
--- a/src/test/java/de/ids_mannheim/korap/highlight/TestHighlight.java
+++ b/src/test/java/de/ids_mannheim/korap/highlight/TestHighlight.java
@@ -27,137 +27,135 @@
 public class TestHighlight { // extends LuceneTestCase {
 
     @Test
-    public void checkHighlights () throws IOException, QueryException  {
+    public void checkHighlights () throws IOException, QueryException {
 
         KrillIndex ki = new KrillIndex();
-        String json = new String(
-"{" +
-"  \"fields\" : [" +
-"    { "+
-"      \"primaryData\" : \"abc\"" +
-"    }," +
-"    {" +
-"      \"name\" : \"tokens\"," +
-"      \"data\" : [" +
-"         [ \"s:a\", \"i:a\", \"_0#0-1\", \"-:t$<i>3\"]," +
-"         [ \"s:b\", \"i:b\", \"_1#1-2\" ]," +
-"         [ \"s:c\", \"i:c\", \"_2#2-3\" ]" +
-"      ]" +
-"    }" +
-"  ]" +
-"}");
+        String json = new String("{" + "  \"fields\" : [" + "    { "
+                + "      \"primaryData\" : \"abc\"" + "    }," + "    {"
+                + "      \"name\" : \"tokens\"," + "      \"data\" : ["
+                + "         [ \"s:a\", \"i:a\", \"_0#0-1\", \"-:t$<i>3\"],"
+                + "         [ \"s:b\", \"i:b\", \"_1#1-2\" ],"
+                + "         [ \"s:c\", \"i:c\", \"_2#2-3\" ]" + "      ]"
+                + "    }" + "  ]" + "}");
 
         FieldDocument fd = ki.addDoc(json);
         ki.commit();
 
 
         QueryBuilder kq = new QueryBuilder("tokens");
-        Result kr = ki.search(
-            (SpanQuery) kq.seq(kq._(1, kq.seg("s:b"))).toQuery()
-        );
+        Result kr = ki.search((SpanQuery) kq.seq(kq._(1, kq.seg("s:b")))
+                .toQuery());
         Match km = kr.getMatch(0);
-        assertEquals(km.getStartPos(),  1);
-        assertEquals(km.getEndPos(),    2);
+        assertEquals(km.getStartPos(), 1);
+        assertEquals(km.getEndPos(), 2);
         assertEquals(km.getStartPos(1), 1);
-        assertEquals(km.getEndPos(1),   2);
-        assertEquals("<span class=\"context-left\">a</span><mark><mark class=\"class-1 level-0\">b</mark></mark><span class=\"context-right\">c</span>", km.getSnippetHTML());
+        assertEquals(km.getEndPos(1), 2);
+        assertEquals(
+                "<span class=\"context-left\">a</span><mark><mark class=\"class-1 level-0\">b</mark></mark><span class=\"context-right\">c</span>",
+                km.getSnippetHTML());
 
-        kr = ki.search((SpanQuery) kq.seq(kq._(1, kq.seg("s:b"))).append(kq._(2, kq.seg("s:c"))).toQuery());
+        kr = ki.search((SpanQuery) kq.seq(kq._(1, kq.seg("s:b")))
+                .append(kq._(2, kq.seg("s:c"))).toQuery());
         km = kr.getMatch(0);
-        assertEquals(km.getStartPos(),  1);
-        assertEquals(km.getEndPos(),    3);
+        assertEquals(km.getStartPos(), 1);
+        assertEquals(km.getEndPos(), 3);
         assertEquals(km.getStartPos(1), 1);
-        assertEquals(km.getEndPos(1),   2);
+        assertEquals(km.getEndPos(1), 2);
         assertEquals(km.getStartPos(2), 2);
-        assertEquals(km.getEndPos(2),   3);
-        assertEquals("<span class=\"context-left\">a</span><mark><mark class=\"class-1 level-0\">b</mark><mark class=\"class-2 level-0\">c</mark></mark><span class=\"context-right\"></span>", km.getSnippetHTML());
+        assertEquals(km.getEndPos(2), 3);
+        assertEquals(
+                "<span class=\"context-left\">a</span><mark><mark class=\"class-1 level-0\">b</mark><mark class=\"class-2 level-0\">c</mark></mark><span class=\"context-right\"></span>",
+                km.getSnippetHTML());
 
 
-        kr = ki.search((SpanQuery) kq.seq(kq._(1, kq.seq(kq.seg("s:a")).append(kq.seg("s:b")))).append(kq._(2, kq.seg("s:c"))).toQuery());
+        kr = ki.search((SpanQuery) kq
+                .seq(kq._(1, kq.seq(kq.seg("s:a")).append(kq.seg("s:b"))))
+                .append(kq._(2, kq.seg("s:c"))).toQuery());
         km = kr.getMatch(0);
         assertEquals(km.getStartPos(), 0);
-        assertEquals(km.getEndPos(),   3);
+        assertEquals(km.getEndPos(), 3);
         assertEquals(km.getStartPos(1), 0);
-        assertEquals(km.getEndPos(1),   2);
+        assertEquals(km.getEndPos(1), 2);
         assertEquals(km.getStartPos(2), 2);
-        assertEquals(km.getEndPos(2),   3);
-        assertEquals("<span class=\"context-left\"></span><mark><mark class=\"class-1 level-0\">ab</mark><mark class=\"class-2 level-0\">c</mark></mark><span class=\"context-right\"></span>", km.getSnippetHTML());
+        assertEquals(km.getEndPos(2), 3);
+        assertEquals(
+                "<span class=\"context-left\"></span><mark><mark class=\"class-1 level-0\">ab</mark><mark class=\"class-2 level-0\">c</mark></mark><span class=\"context-right\"></span>",
+                km.getSnippetHTML());
 
 
-        kr = ki.search((SpanQuery) kq._(3, kq.seq(kq._(1, kq.seq(kq.seg("s:a")).append(kq.seg("s:b")))).append(kq._(2, kq.seg("s:c")))).toQuery());
+        kr = ki.search((SpanQuery) kq._(
+                3,
+                kq.seq(kq._(1, kq.seq(kq.seg("s:a")).append(kq.seg("s:b"))))
+                        .append(kq._(2, kq.seg("s:c")))).toQuery());
         km = kr.getMatch(0);
         assertEquals(km.getStartPos(), 0);
-        assertEquals(km.getEndPos(),   3);
+        assertEquals(km.getEndPos(), 3);
         assertEquals(km.getStartPos(1), 0);
-        assertEquals(km.getEndPos(1),   2);
+        assertEquals(km.getEndPos(1), 2);
         assertEquals(km.getStartPos(2), 2);
-        assertEquals(km.getEndPos(2),   3);
+        assertEquals(km.getEndPos(2), 3);
         assertEquals(km.getStartPos(3), 0);
-        assertEquals(km.getEndPos(3),   3);
-        assertEquals("<span class=\"context-left\"></span><mark><mark class=\"class-3 level-0\"><mark class=\"class-1 level-1\">ab</mark><mark class=\"class-2 level-1\">c</mark></mark></mark><span class=\"context-right\"></span>", km.getSnippetHTML());
+        assertEquals(km.getEndPos(3), 3);
+        assertEquals(
+                "<span class=\"context-left\"></span><mark><mark class=\"class-3 level-0\"><mark class=\"class-1 level-1\">ab</mark><mark class=\"class-2 level-1\">c</mark></mark></mark><span class=\"context-right\"></span>",
+                km.getSnippetHTML());
     };
 
+
     @Test
-    public void checkHighlightsManually () throws IOException, QueryException  {
+    public void checkHighlightsManually () throws IOException, QueryException {
 
         KrillIndex ki = new KrillIndex();
-        String json = new String(
-"{" +
-"  \"fields\" : [" +
-"    { "+
-"      \"primaryData\" : \"abc\"" +
-"    }," +
-"    {" +
-"      \"name\" : \"tokens\"," +
-"      \"data\" : [" +
-"         [ \"s:a\", \"i:a\", \"_0#0-1\", \"-:t$<i>3\"]," +
-"         [ \"s:b\", \"i:b\", \"_1#1-2\" ]," +
-"         [ \"s:c\", \"i:c\", \"_2#2-3\" ]" +
-"      ]" +
-"    }" +
-"  ]" +
-"}");
+        String json = new String("{" + "  \"fields\" : [" + "    { "
+                + "      \"primaryData\" : \"abc\"" + "    }," + "    {"
+                + "      \"name\" : \"tokens\"," + "      \"data\" : ["
+                + "         [ \"s:a\", \"i:a\", \"_0#0-1\", \"-:t$<i>3\"],"
+                + "         [ \"s:b\", \"i:b\", \"_1#1-2\" ],"
+                + "         [ \"s:c\", \"i:c\", \"_2#2-3\" ]" + "      ]"
+                + "    }" + "  ]" + "}");
 
         FieldDocument fd = ki.addDoc(json);
         ki.commit();
 
         QueryBuilder kq = new QueryBuilder("tokens");
 
-        Result kr = ki.search((SpanQuery) kq.seq(kq.seg("s:a")).append(kq.seg("s:b")).append(kq.seg("s:c")).toQuery());
+        Result kr = ki.search((SpanQuery) kq.seq(kq.seg("s:a"))
+                .append(kq.seg("s:b")).append(kq.seg("s:c")).toQuery());
         Match km = kr.getMatch(0);
         km.addHighlight(0, 1, (short) 7);
-        assertEquals("<span class=\"context-left\"></span><mark><mark class=\"class-7 level-0\">ab</mark>c</mark><span class=\"context-right\"></span>", km.getSnippetHTML());
+        assertEquals(
+                "<span class=\"context-left\"></span><mark><mark class=\"class-7 level-0\">ab</mark>c</mark><span class=\"context-right\"></span>",
+                km.getSnippetHTML());
 
         km.addHighlight(1, 2, (short) 6);
-        assertEquals("<span class=\"context-left\"></span><mark><mark class=\"class-7 level-0\">a<mark class=\"class-6 level-1\">b</mark></mark><mark class=\"class-6 level-1\">c</mark></mark><span class=\"context-right\"></span>", km.getSnippetHTML());
+        assertEquals(
+                "<span class=\"context-left\"></span><mark><mark class=\"class-7 level-0\">a<mark class=\"class-6 level-1\">b</mark></mark><mark class=\"class-6 level-1\">c</mark></mark><span class=\"context-right\"></span>",
+                km.getSnippetHTML());
 
         km.addHighlight(0, 1, (short) 5);
         assertEquals("[{7:{5:a{6:b}}}{6:c}]", km.getSnippetBrackets());
-        assertEquals("<span class=\"context-left\"></span><mark><mark class=\"class-7 level-0\"><mark class=\"class-5 level-1\">a<mark class=\"class-6 level-2\">b</mark></mark></mark><mark class=\"class-6 level-2\">c</mark></mark><span class=\"context-right\"></span>", km.getSnippetHTML());
+        assertEquals(
+                "<span class=\"context-left\"></span><mark><mark class=\"class-7 level-0\"><mark class=\"class-5 level-1\">a<mark class=\"class-6 level-2\">b</mark></mark></mark><mark class=\"class-6 level-2\">c</mark></mark><span class=\"context-right\"></span>",
+                km.getSnippetHTML());
 
     };
 
+
     @Test
-    public void highlightMissingBug () throws IOException, QueryException  {
+    public void highlightMissingBug () throws IOException, QueryException {
         KrillIndex ki = new KrillIndex();
         FieldDocument fd = new FieldDocument();
         fd.addString("ID", "doc-1");
         fd.addString("UID", "1");
-        fd.addTV("base",
-                 "abab",
-                 "[(0-1)s:a|i:a|_0#0-1|-:t$<i>4]" +
-                 "[(1-2)s:b|i:b|_1#1-2]" +
-                 "[(2-3)s:a|i:c|_2#2-3]" +
-                 "[(3-4)s:b|i:a|_3#3-4]");
+        fd.addTV("base", "abab", "[(0-1)s:a|i:a|_0#0-1|-:t$<i>4]"
+                + "[(1-2)s:b|i:b|_1#1-2]" + "[(2-3)s:a|i:c|_2#2-3]"
+                + "[(3-4)s:b|i:a|_3#3-4]");
         ki.addDoc(fd);
         fd = new FieldDocument();
         fd.addString("ID", "doc-2");
         fd.addString("UID", "2");
-        fd.addTV("base",
-                 "aba",
-                 "[(0-1)s:a|i:a|_0#0-1|-:t$<i>3]" +
-                 "[(1-2)s:b|i:b|_1#1-2]" +
-                 "[(2-3)s:a|i:c|_2#2-3]");
+        fd.addTV("base", "aba", "[(0-1)s:a|i:a|_0#0-1|-:t$<i>3]"
+                + "[(1-2)s:b|i:b|_1#1-2]" + "[(2-3)s:a|i:c|_2#2-3]");
         ki.addDoc(fd);
 
         // Commit!
@@ -165,38 +163,33 @@
         fd = new FieldDocument();
         fd.addString("ID", "doc-3");
         fd.addString("UID", "3");
-        fd.addTV("base",
-                 "abab",
-                 "[(0-1)s:a|i:a|_0#0-1|-:t$<i>4]" +
-                 "[(1-2)s:b|i:b|_1#1-2]" +
-                 "[(2-3)s:a|i:c|_2#2-3]" +
-                 "[(3-4)s:b|i:a|_3#3-4]");
+        fd.addTV("base", "abab", "[(0-1)s:a|i:a|_0#0-1|-:t$<i>4]"
+                + "[(1-2)s:b|i:b|_1#1-2]" + "[(2-3)s:a|i:c|_2#2-3]"
+                + "[(3-4)s:b|i:a|_3#3-4]");
         ki.addDoc(fd);
-        
+
         // Commit!
         ki.commit();
         fd = new FieldDocument();
         fd.addString("ID", "doc-4");
         fd.addString("UID", "4");
-        fd.addTV("base",
-                 "aba",
-                 "[(0-1)s:a|i:a|_0#0-1|-:t$<i>3]" +
-                 "[(1-2)s:b|i:b|_1#1-2]" +
-                 "[(2-3)s:a|i:c|_2#2-3]");
+        fd.addTV("base", "aba", "[(0-1)s:a|i:a|_0#0-1|-:t$<i>3]"
+                + "[(1-2)s:b|i:b|_1#1-2]" + "[(2-3)s:a|i:c|_2#2-3]");
         ki.addDoc(fd);
-        
+
         // Commit!
         ki.commit();
 
         QueryBuilder kq = new QueryBuilder("base");
-        SpanQuery q = (SpanQuery) kq.or(kq._(1, kq.seg("s:a"))).or(kq._(2, kq.seg("s:b"))).toQuery();
+        SpanQuery q = (SpanQuery) kq.or(kq._(1, kq.seg("s:a")))
+                .or(kq._(2, kq.seg("s:b"))).toQuery();
         Result kr = ki.search(q);
         assertEquals((long) 14, kr.getTotalResults());
         assertEquals("[{1:a}]bab", kr.getMatch(0).getSnippetBrackets());
         assertEquals("a[{2:b}]ab", kr.getMatch(1).getSnippetBrackets());
         assertEquals("ab[{1:a}]b", kr.getMatch(2).getSnippetBrackets());
         assertEquals("aba[{2:b}]", kr.getMatch(3).getSnippetBrackets());
-        
+
         assertEquals("[{1:a}]ba", kr.getMatch(4).getSnippetBrackets());
         assertEquals("a[{2:b}]a", kr.getMatch(5).getSnippetBrackets());
         assertEquals("ab[{1:a}]", kr.getMatch(6).getSnippetBrackets());
@@ -211,7 +204,8 @@
         assertEquals("ab[{1:a}]", kr.getMatch(13).getSnippetBrackets());
 
         kq = new QueryBuilder("base");
-        q = (SpanQuery) kq.or(kq._(1, kq.seg("i:a"))).or(kq._(2, kq.seg("i:c"))).toQuery();
+        q = (SpanQuery) kq.or(kq._(1, kq.seg("i:a")))
+                .or(kq._(2, kq.seg("i:c"))).toQuery();
         Krill qs = new Krill(q);
         qs.getMeta().getContext().left.setToken(true).setLength((short) 1);
         qs.getMeta().getContext().right.setToken(true).setLength((short) 1);
@@ -245,9 +239,9 @@
         assertEquals("[{1:a}] ...", kr.getMatch(8).getSnippetBrackets());
         assertEquals("... [{2:a}]", kr.getMatch(9).getSnippetBrackets());
 
-        q = (SpanQuery) kq._(
-            3, kq.or(kq._(1, kq.seg("i:a"))).or(kq._(2, kq.seg("i:c")))
-        ).toQuery();
+        q = (SpanQuery) kq._(3,
+                kq.or(kq._(1, kq.seg("i:a"))).or(kq._(2, kq.seg("i:c"))))
+                .toQuery();
         qs = new Krill(q);
         qs.getMeta().getContext().left.setToken(true).setLength((short) 0);
         qs.getMeta().getContext().right.setToken(true).setLength((short) 0);
@@ -266,71 +260,95 @@
         assertEquals("... [{3:{2:a}}]", kr.getMatch(9).getSnippetBrackets());
     };
 
+
     @Test
-    public void highlightGreaterClassBug () throws IOException, QueryException  {
+    public void highlightGreaterClassBug () throws IOException, QueryException {
 
         // Construct index
         KrillIndex ki = new KrillIndex();
         // Indexing test files
-        for (String i : new String[] {"00001", "00002"}) {
+        for (String i : new String[] { "00001", "00002" }) {
             ki.addDoc(
-                getClass().getResourceAsStream("/wiki/" + i + ".json.gz"), true
-            );
+                    getClass().getResourceAsStream("/wiki/" + i + ".json.gz"),
+                    true);
         };
         ki.commit();
 
         // 15
-        String json = getString(getClass().getResource("/queries/bugs/greater_highlights_15.jsonld").getFile());
-	
+        String json = getString(getClass().getResource(
+                "/queries/bugs/greater_highlights_15.jsonld").getFile());
+
         Krill ks = new Krill(json);
         Result kr = ks.apply(ki);
-        assertEquals(kr.getSerialQuery(),"{15: tokens:s:Alphabet}");
-        assertEquals(kr.getTotalResults(),7);
-        assertEquals(kr.getStartIndex(),0);
-        assertEquals(kr.getMatch(0).getSnippetBrackets(),"... 2. Herkunft Die aus dem proto-semitischen [{15:Alphabet}] stammende Urform des Buchstaben ist wahrscheinlich ...");
-        assertEquals(kr.getMatch(0).getSnippetHTML(),"<span class=\"context-left\"><span class=\"more\"></span>2. Herkunft Die aus dem proto-semitischen </span><mark><mark class=\"class-15 level-0\">Alphabet</mark></mark><span class=\"context-right\"> stammende Urform des Buchstaben ist wahrscheinlich<span class=\"more\"></span></span>");
+        assertEquals(kr.getSerialQuery(), "{15: tokens:s:Alphabet}");
+        assertEquals(kr.getTotalResults(), 7);
+        assertEquals(kr.getStartIndex(), 0);
+        assertEquals(
+                kr.getMatch(0).getSnippetBrackets(),
+                "... 2. Herkunft Die aus dem proto-semitischen [{15:Alphabet}] stammende Urform des Buchstaben ist wahrscheinlich ...");
+        assertEquals(
+                kr.getMatch(0).getSnippetHTML(),
+                "<span class=\"context-left\"><span class=\"more\"></span>2. Herkunft Die aus dem proto-semitischen </span><mark><mark class=\"class-15 level-0\">Alphabet</mark></mark><span class=\"context-right\"> stammende Urform des Buchstaben ist wahrscheinlich<span class=\"more\"></span></span>");
 
-        json = getString(getClass().getResource("/queries/bugs/greater_highlights_16.jsonld").getFile());
+        json = getString(getClass().getResource(
+                "/queries/bugs/greater_highlights_16.jsonld").getFile());
 
         // 16
         ks = new Krill(json);
         kr = ks.apply(ki);
-        assertEquals(kr.getSerialQuery(),"{16: tokens:s:Alphabet}");
-        assertEquals(kr.getTotalResults(),7);
-        assertEquals(kr.getStartIndex(),0);
-        assertEquals(kr.getMatch(0).getSnippetBrackets(),"... 2. Herkunft Die aus dem proto-semitischen [{16:Alphabet}] stammende Urform des Buchstaben ist wahrscheinlich ...");
-        assertEquals(kr.getMatch(0).getSnippetHTML(),"<span class=\"context-left\"><span class=\"more\"></span>2. Herkunft Die aus dem proto-semitischen </span><mark><mark class=\"class-16 level-0\">Alphabet</mark></mark><span class=\"context-right\"> stammende Urform des Buchstaben ist wahrscheinlich<span class=\"more\"></span></span>");
+        assertEquals(kr.getSerialQuery(), "{16: tokens:s:Alphabet}");
+        assertEquals(kr.getTotalResults(), 7);
+        assertEquals(kr.getStartIndex(), 0);
+        assertEquals(
+                kr.getMatch(0).getSnippetBrackets(),
+                "... 2. Herkunft Die aus dem proto-semitischen [{16:Alphabet}] stammende Urform des Buchstaben ist wahrscheinlich ...");
+        assertEquals(
+                kr.getMatch(0).getSnippetHTML(),
+                "<span class=\"context-left\"><span class=\"more\"></span>2. Herkunft Die aus dem proto-semitischen </span><mark><mark class=\"class-16 level-0\">Alphabet</mark></mark><span class=\"context-right\"> stammende Urform des Buchstaben ist wahrscheinlich<span class=\"more\"></span></span>");
 
         // 127
-        json = getString(getClass().getResource("/queries/bugs/greater_highlights_127.jsonld").getFile());
-	
+        json = getString(getClass().getResource(
+                "/queries/bugs/greater_highlights_127.jsonld").getFile());
+
         ks = new Krill(json);
         kr = ks.apply(ki);
-        assertEquals(kr.getSerialQuery(),"{127: tokens:s:Alphabet}");
-        assertEquals(kr.getTotalResults(),7);
-        assertEquals(kr.getStartIndex(),0);
-        assertEquals(kr.getMatch(0).getSnippetBrackets(),"... 2. Herkunft Die aus dem proto-semitischen [{127:Alphabet}] stammende Urform des Buchstaben ist wahrscheinlich ...");
-        assertEquals(kr.getMatch(0).getSnippetHTML(),"<span class=\"context-left\"><span class=\"more\"></span>2. Herkunft Die aus dem proto-semitischen </span><mark><mark class=\"class-127 level-0\">Alphabet</mark></mark><span class=\"context-right\"> stammende Urform des Buchstaben ist wahrscheinlich<span class=\"more\"></span></span>");
+        assertEquals(kr.getSerialQuery(), "{127: tokens:s:Alphabet}");
+        assertEquals(kr.getTotalResults(), 7);
+        assertEquals(kr.getStartIndex(), 0);
+        assertEquals(
+                kr.getMatch(0).getSnippetBrackets(),
+                "... 2. Herkunft Die aus dem proto-semitischen [{127:Alphabet}] stammende Urform des Buchstaben ist wahrscheinlich ...");
+        assertEquals(
+                kr.getMatch(0).getSnippetHTML(),
+                "<span class=\"context-left\"><span class=\"more\"></span>2. Herkunft Die aus dem proto-semitischen </span><mark><mark class=\"class-127 level-0\">Alphabet</mark></mark><span class=\"context-right\"> stammende Urform des Buchstaben ist wahrscheinlich<span class=\"more\"></span></span>");
 
         // 255
-        json = getString(getClass().getResource("/queries/bugs/greater_highlights_255.jsonld").getFile());
+        json = getString(getClass().getResource(
+                "/queries/bugs/greater_highlights_255.jsonld").getFile());
 
         ks = new Krill(json);
         kr = ks.apply(ki);
-        assertEquals(kr.getSerialQuery(),"{255: tokens:s:Alphabet}");
-        assertEquals(kr.getTotalResults(),7);
-        assertEquals(kr.getStartIndex(),0);
-        assertEquals(kr.getMatch(0).getSnippetBrackets(),"... 2. Herkunft Die aus dem proto-semitischen [Alphabet] stammende Urform des Buchstaben ist wahrscheinlich ...");
-        assertEquals(kr.getMatch(0).getSnippetHTML(),"<span class=\"context-left\"><span class=\"more\"></span>2. Herkunft Die aus dem proto-semitischen </span><mark>Alphabet</mark><span class=\"context-right\"> stammende Urform des Buchstaben ist wahrscheinlich<span class=\"more\"></span></span>");
+        assertEquals(kr.getSerialQuery(), "{255: tokens:s:Alphabet}");
+        assertEquals(kr.getTotalResults(), 7);
+        assertEquals(kr.getStartIndex(), 0);
+        assertEquals(
+                kr.getMatch(0).getSnippetBrackets(),
+                "... 2. Herkunft Die aus dem proto-semitischen [Alphabet] stammende Urform des Buchstaben ist wahrscheinlich ...");
+        assertEquals(
+                kr.getMatch(0).getSnippetHTML(),
+                "<span class=\"context-left\"><span class=\"more\"></span>2. Herkunft Die aus dem proto-semitischen </span><mark>Alphabet</mark><span class=\"context-right\"> stammende Urform des Buchstaben ist wahrscheinlich<span class=\"more\"></span></span>");
 
         // 300
-        json = getString(getClass().getResource("/queries/bugs/greater_highlights_300.jsonld").getFile());
+        json = getString(getClass().getResource(
+                "/queries/bugs/greater_highlights_300.jsonld").getFile());
 
         ks = new Krill(json);
         kr = ks.apply(ki);
         assertEquals(709, kr.getError(0).getCode());
-        assertEquals("Valid class numbers exceeded", kr.getError(0).getMessage());
+        assertEquals("Valid class numbers exceeded", kr.getError(0)
+                .getMessage());
 
-        assertEquals(kr.getError(0).getMessage(),"Valid class numbers exceeded");
+        assertEquals(kr.getError(0).getMessage(),
+                "Valid class numbers exceeded");
     };
 };
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestAttributeIndex.java b/src/test/java/de/ids_mannheim/korap/index/TestAttributeIndex.java
index 2172288..fb61883 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestAttributeIndex.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestAttributeIndex.java
@@ -24,28 +24,31 @@
     private Result kr;
     private FieldDocument fd;
 
-    public TestAttributeIndex() throws IOException {
+
+    public TestAttributeIndex () throws IOException {
         ki = new KrillIndex();
     }
 
-    private FieldDocument createFieldDoc0() {
+
+    private FieldDocument createFieldDoc0 () {
         fd = new FieldDocument();
         fd.addString("ID", "doc-0");
         fd.addTV(
-				"base",
-				"bcbabd",
-				"[(0-1)s:a|_1#0-1|<>:s#0-5$<i>5<s>-1|<>:div#0-3$<i>3<s>1|<>:div#0-2$<i>2<s>2|@:class=header$<i>3<s>1|@:class=header$<i>2<s>2]"
-						+ "[(1-2)s:e|_2#1-2|<>:a#1-2$<i>2<s>1|@:class=header$<i>2<s>1]"
-						+ "[(2-3)s:e|_3#2-3|<>:div#2-3$<i>5<s>1|@:class=time$<i>5<s>1]"
-						+ "[(3-4)s:a|_4#3-4|<>:div#3-5$<i>5<s>1|@:class=header$<i>5<s>1]"
-						+ "[(4-5)s:b|_5#4-5|<>:div#4-5$<i>5<s>1|<>:a#4-5$<i>5<s>2|@:class=header$<i>5<s>2]"
-						+ "[(5-6)s:d|_6#5-6|<>:s#5-6$<i>6<s>1|<>:div#5-6$<i>6<s>-1|@:class=header$<i>6<s>1]"
-						+ "[(6-7)s:d|_7#6-7|<>:s#6-7$<i>7<s>2|<>:div#6-7$<i>7<s>1|@:class=header$<i>7<s>1|@:class=header$<i>7<s>2]");
+                "base",
+                "bcbabd",
+                "[(0-1)s:a|_1#0-1|<>:s#0-5$<i>5<s>-1|<>:div#0-3$<i>3<s>1|<>:div#0-2$<i>2<s>2|@:class=header$<i>3<s>1|@:class=header$<i>2<s>2]"
+                        + "[(1-2)s:e|_2#1-2|<>:a#1-2$<i>2<s>1|@:class=header$<i>2<s>1]"
+                        + "[(2-3)s:e|_3#2-3|<>:div#2-3$<i>5<s>1|@:class=time$<i>5<s>1]"
+                        + "[(3-4)s:a|_4#3-4|<>:div#3-5$<i>5<s>1|@:class=header$<i>5<s>1]"
+                        + "[(4-5)s:b|_5#4-5|<>:div#4-5$<i>5<s>1|<>:a#4-5$<i>5<s>2|@:class=header$<i>5<s>2]"
+                        + "[(5-6)s:d|_6#5-6|<>:s#5-6$<i>6<s>1|<>:div#5-6$<i>6<s>-1|@:class=header$<i>6<s>1]"
+                        + "[(6-7)s:d|_7#6-7|<>:s#6-7$<i>7<s>2|<>:div#6-7$<i>7<s>1|@:class=header$<i>7<s>1|@:class=header$<i>7<s>2]");
 
         return fd;
     }
 
-    private FieldDocument createFieldDoc1() {
+
+    private FieldDocument createFieldDoc1 () {
         fd = new FieldDocument();
         fd.addString("ID", "doc-1");
         fd.addTV(
@@ -55,37 +58,39 @@
                         + "[(1-2)s:c|_2#1-2|<>:div#1-2$<i>2<s>1|@:class=header$<i>2<s>1|@:class=title$<i>2<s>1]"
                         + "[(2-3)s:b|_3#2-3|<>:div#2-3$<i>5<s>1|@:class=book$<i>5<s>1]"
                         + "[(3-4)s:a|_4#3-4|<>:div#3-5$<i>5<s>1|@:class=title$<i>5<s>1]"
-						+ "[(4-5)s:b|_5#4-5|<>:div#4-5$<i>5<s>1|@:class=header$<i>5<s>1|@:class=book$<i>5<s>1|@:class=title$<i>5<s>1]"
+                        + "[(4-5)s:b|_5#4-5|<>:div#4-5$<i>5<s>1|@:class=header$<i>5<s>1|@:class=book$<i>5<s>1|@:class=title$<i>5<s>1]"
                         + "[(5-6)s:d|_6#5-6|<>:s#5-6$<i>6<s>-1|<>:div#5-6$<i>6<s>1|@:class=header$<i>6<s>1]"
                         + "[(6-7)s:d|_7#6-7|<>:s#6-7$<i>7<s>2|<>:div#6-7$<i>7<s>1|@:class=header$<i>7<s>1|@:class=title$<i>7<s>1]");
 
         return fd;
     }
 
-    private FieldDocument createFieldDoc2() {
+
+    private FieldDocument createFieldDoc2 () {
         fd = new FieldDocument();
         fd.addString("ID", "doc-1");
         fd.addTV(
                 "base",
                 "bcbabd",
-				"[(0-1)s:b|_1#0-1|<>:s#0-5$<i>5<s>1|<>:div#0-3$<i>3<s>2|@:class=header$<i>3<s>2|@:class=book$<i>5<s>1|@:class=book$<i>3<s>2]"
-						+ "[(1-2)s:e|_2#1-2|<>:div#1-2$<i>2<s>1|<>:a#1-2$<i>2<s>2|@:class=book$<i>2<s>2|@:class=header$<i>2<s>1]"
-						+ "[(2-3)s:b|_3#2-3|<>:div#2-3$<i>5<s>1|<>:a#1-2$<i>2<s>2|@:class=header$<i>2<s>2|@:class=book$<i>5<s>1]"
-						+ "[(3-4)s:a|_4#3-4|<>:div#3-5$<i>5<s>1|@:class=title$<i>5<s>1]"
-						+ "[(4-5)s:b|_5#4-5|<>:div#4-5$<i>5<s>1|@:class=header$<i>5<s>1|@:class=book$<i>5<s>1]"
-						+ "[(5-6)s:d|_6#5-6|<>:s#5-6$<i>6<s>-1|<>:div#5-6$<i>6<s>1|@:class=header$<i>6<s>1]"
-						+ "[(6-7)s:d|_7#6-7|<>:s#6-7$<i>7<s>2|<>:div#6-7$<i>7<s>1|@:class=header$<i>7<s>1|@:class=book$<i>7<s>2]");
+                "[(0-1)s:b|_1#0-1|<>:s#0-5$<i>5<s>1|<>:div#0-3$<i>3<s>2|@:class=header$<i>3<s>2|@:class=book$<i>5<s>1|@:class=book$<i>3<s>2]"
+                        + "[(1-2)s:e|_2#1-2|<>:div#1-2$<i>2<s>1|<>:a#1-2$<i>2<s>2|@:class=book$<i>2<s>2|@:class=header$<i>2<s>1]"
+                        + "[(2-3)s:b|_3#2-3|<>:div#2-3$<i>5<s>1|<>:a#1-2$<i>2<s>2|@:class=header$<i>2<s>2|@:class=book$<i>5<s>1]"
+                        + "[(3-4)s:a|_4#3-4|<>:div#3-5$<i>5<s>1|@:class=title$<i>5<s>1]"
+                        + "[(4-5)s:b|_5#4-5|<>:div#4-5$<i>5<s>1|@:class=header$<i>5<s>1|@:class=book$<i>5<s>1]"
+                        + "[(5-6)s:d|_6#5-6|<>:s#5-6$<i>6<s>-1|<>:div#5-6$<i>6<s>1|@:class=header$<i>6<s>1]"
+                        + "[(6-7)s:d|_7#6-7|<>:s#6-7$<i>7<s>2|<>:div#6-7$<i>7<s>1|@:class=header$<i>7<s>1|@:class=book$<i>7<s>2]");
 
         return fd;
     }
 
+
     /**
      * Test matching elementRef
      * 
      * @throws IOException
      * */
     @Test
-    public void testCase1() throws IOException {
+    public void testCase1 () throws IOException {
         ki.addDoc(createFieldDoc0());
         ki.commit();
 
@@ -109,13 +114,14 @@
         assertEquals(7, kr.getMatch(3).getEndPos());
     }
 
+
     /**
      * Test multiple attributes and negation
      * 
      * @throws IOException
      * */
     @Test
-    public void testCase2() throws IOException {
+    public void testCase2 () throws IOException {
         ki.addDoc(createFieldDoc1());
         ki.commit();
         // header and title
@@ -171,56 +177,58 @@
         assertEquals(6, kr.getMatch(0).getEndPos());
     }
 
-	/**
-	 * Element with only not attributes
-	 * 
-	 * @throws IOException
-	 * */
-	@Test
-	public void testcase9() throws IOException {
 
-		ki.addDoc(createFieldDoc2());
-		ki.commit();
+    /**
+     * Element with only not attributes
+     * 
+     * @throws IOException
+     * */
+    @Test
+    public void testcase9 () throws IOException {
 
-		SpanAttributeQuery saq = new SpanAttributeQuery(new SpanTermQuery(
-				new Term("base", "@:class=book")), true, true);
-		SpanQuery sq = new SpanWithAttributeQuery(new SpanElementQuery("base",
-				"div"), saq, true);
+        ki.addDoc(createFieldDoc2());
+        ki.commit();
 
-		kr = ki.search(sq, (short) 10);
-		assertEquals(4, kr.getTotalResults());
-		assertEquals(1, kr.getMatch(0).getStartPos());
-		assertEquals(2, kr.getMatch(0).getEndPos());
-		assertEquals(3, kr.getMatch(1).getStartPos());
-		assertEquals(5, kr.getMatch(1).getEndPos());
-		assertEquals(5, kr.getMatch(2).getStartPos());
-		assertEquals(6, kr.getMatch(2).getEndPos());
-		assertEquals(6, kr.getMatch(3).getStartPos());
-		assertEquals(7, kr.getMatch(3).getEndPos());
+        SpanAttributeQuery saq = new SpanAttributeQuery(new SpanTermQuery(
+                new Term("base", "@:class=book")), true, true);
+        SpanQuery sq = new SpanWithAttributeQuery(new SpanElementQuery("base",
+                "div"), saq, true);
 
-		List<SpanQuery> sql = new ArrayList<>();
-		sql.add(saq);
-		sql.add(new SpanAttributeQuery(new SpanTermQuery(new Term("base",
-				"@:class=header")), true, true));
-		sq = new SpanWithAttributeQuery(new SpanElementQuery("base", "div"),
-				sql, true);
+        kr = ki.search(sq, (short) 10);
+        assertEquals(4, kr.getTotalResults());
+        assertEquals(1, kr.getMatch(0).getStartPos());
+        assertEquals(2, kr.getMatch(0).getEndPos());
+        assertEquals(3, kr.getMatch(1).getStartPos());
+        assertEquals(5, kr.getMatch(1).getEndPos());
+        assertEquals(5, kr.getMatch(2).getStartPos());
+        assertEquals(6, kr.getMatch(2).getEndPos());
+        assertEquals(6, kr.getMatch(3).getStartPos());
+        assertEquals(7, kr.getMatch(3).getEndPos());
 
-		kr = ki.search(sq, (short) 10);
-		assertEquals(1, kr.getTotalResults());
-		assertEquals(3, kr.getMatch(0).getStartPos());
-		assertEquals(5, kr.getMatch(0).getEndPos());
+        List<SpanQuery> sql = new ArrayList<>();
+        sql.add(saq);
+        sql.add(new SpanAttributeQuery(new SpanTermQuery(new Term("base",
+                "@:class=header")), true, true));
+        sq = new SpanWithAttributeQuery(new SpanElementQuery("base", "div"),
+                sql, true);
 
-//		for (int i = 0; i < kr.getTotalResults(); i++) {
-//			System.out.println(kr.getMatch(i).getLocalDocID() + " "
-//					+ kr.getMatch(i).startPos + " " + kr.getMatch(i).endPos);
-//		}
-	}
+        kr = ki.search(sq, (short) 10);
+        assertEquals(1, kr.getTotalResults());
+        assertEquals(3, kr.getMatch(0).getStartPos());
+        assertEquals(5, kr.getMatch(0).getEndPos());
+
+        //		for (int i = 0; i < kr.getTotalResults(); i++) {
+        //			System.out.println(kr.getMatch(i).getLocalDocID() + " "
+        //					+ kr.getMatch(i).startPos + " " + kr.getMatch(i).endPos);
+        //		}
+    }
+
 
     /**
      * same attribute types referring to different element types
      * */
     @Test
-    public void testCase3() throws IOException {
+    public void testCase3 () throws IOException {
         ki.addDoc(createFieldDoc2());
         ki.commit();
 
@@ -243,9 +251,10 @@
         assertEquals(7, kr.getMatch(2).getEndPos());
     }
 
+
     /** Test skipto doc for spanWithAttribute */
     @Test
-    public void testCase4() throws IOException {
+    public void testCase4 () throws IOException {
         ki.addDoc(createFieldDoc1());
         ki.addDoc(createFieldDoc0());
         ki.addDoc(createFieldDoc2());
@@ -274,112 +283,116 @@
         assertEquals(5, kr.getMatch(0).getEndPos());
     }
 
+
     /**
-	 * Arbitrary elements with a specific attribute.
-	 * */
+     * Arbitrary elements with a specific attribute.
+     * */
     @Test
-    public void testCase5() throws IOException {
-		ki.addDoc(createFieldDoc2());
+    public void testCase5 () throws IOException {
+        ki.addDoc(createFieldDoc2());
         ki.commit();
-		SpanAttributeQuery saq = new SpanAttributeQuery(new SpanTermQuery(
-				new Term("base", "@:class=book")), true);
+        SpanAttributeQuery saq = new SpanAttributeQuery(new SpanTermQuery(
+                new Term("base", "@:class=book")), true);
 
-		SpanWithAttributeQuery swaq = new SpanWithAttributeQuery(saq, true);
-		kr = ki.search(swaq, (short) 10);
-		assertEquals(6, kr.getTotalResults());
+        SpanWithAttributeQuery swaq = new SpanWithAttributeQuery(saq, true);
+        kr = ki.search(swaq, (short) 10);
+        assertEquals(6, kr.getTotalResults());
 
-		assertEquals(0, kr.getMatch(0).getStartPos());
-		assertEquals(3, kr.getMatch(0).getEndPos());
-		assertEquals(0, kr.getMatch(1).getStartPos());
-		assertEquals(5, kr.getMatch(1).getEndPos());
-		assertEquals(1, kr.getMatch(2).getStartPos());
-		assertEquals(2, kr.getMatch(2).getEndPos());
-		assertEquals(2, kr.getMatch(3).getStartPos());
-		assertEquals(5, kr.getMatch(3).getEndPos());
-		assertEquals(4, kr.getMatch(4).getStartPos());
-		assertEquals(5, kr.getMatch(4).getEndPos());
-		assertEquals(6, kr.getMatch(5).getStartPos());
-		assertEquals(7, kr.getMatch(5).getEndPos());
+        assertEquals(0, kr.getMatch(0).getStartPos());
+        assertEquals(3, kr.getMatch(0).getEndPos());
+        assertEquals(0, kr.getMatch(1).getStartPos());
+        assertEquals(5, kr.getMatch(1).getEndPos());
+        assertEquals(1, kr.getMatch(2).getStartPos());
+        assertEquals(2, kr.getMatch(2).getEndPos());
+        assertEquals(2, kr.getMatch(3).getStartPos());
+        assertEquals(5, kr.getMatch(3).getEndPos());
+        assertEquals(4, kr.getMatch(4).getStartPos());
+        assertEquals(5, kr.getMatch(4).getEndPos());
+        assertEquals(6, kr.getMatch(5).getStartPos());
+        assertEquals(7, kr.getMatch(5).getEndPos());
     }
 
-	/**
-	 * Arbitrary elements with multiple attributes.
-	 * */
-	@Test
-	public void testCase6() throws IOException {
-		ki.addDoc(createFieldDoc2());
-		ki.commit();
 
-		List<SpanQuery> sql = new ArrayList<>();
-		sql.add(new SpanAttributeQuery(new SpanTermQuery(new Term("base",
-				"@:class=header")), true));
-		sql.add(new SpanAttributeQuery(new SpanTermQuery(new Term("base",
-				"@:class=book")), true));
+    /**
+     * Arbitrary elements with multiple attributes.
+     * */
+    @Test
+    public void testCase6 () throws IOException {
+        ki.addDoc(createFieldDoc2());
+        ki.commit();
 
-		SpanWithAttributeQuery swaq = new SpanWithAttributeQuery(sql, true);
-		kr = ki.search(swaq, (short) 10);
-		assertEquals(2, kr.getTotalResults());
+        List<SpanQuery> sql = new ArrayList<>();
+        sql.add(new SpanAttributeQuery(new SpanTermQuery(new Term("base",
+                "@:class=header")), true));
+        sql.add(new SpanAttributeQuery(new SpanTermQuery(new Term("base",
+                "@:class=book")), true));
 
-		assertEquals(0, kr.getMatch(0).getStartPos());
-		assertEquals(3, kr.getMatch(0).getEndPos());
-		assertEquals(4, kr.getMatch(1).getStartPos());
-		assertEquals(5, kr.getMatch(1).getEndPos());
+        SpanWithAttributeQuery swaq = new SpanWithAttributeQuery(sql, true);
+        kr = ki.search(swaq, (short) 10);
+        assertEquals(2, kr.getTotalResults());
 
-//		for (int i = 0; i < kr.getTotalResults(); i++) {
-//			System.out.println(kr.getMatch(i).getLocalDocID() + " "
-//					+ kr.getMatch(i).startPos + " " + kr.getMatch(i).endPos);
-//		}
-	}
+        assertEquals(0, kr.getMatch(0).getStartPos());
+        assertEquals(3, kr.getMatch(0).getEndPos());
+        assertEquals(4, kr.getMatch(1).getStartPos());
+        assertEquals(5, kr.getMatch(1).getEndPos());
 
-	/**
-	 * Arbitrary elements with an attribute and a not attribute.
-	 * */
-	@Test
-	public void testCase7() throws IOException {
-		ki.addDoc(createFieldDoc2());
-		ki.commit();
+        //		for (int i = 0; i < kr.getTotalResults(); i++) {
+        //			System.out.println(kr.getMatch(i).getLocalDocID() + " "
+        //					+ kr.getMatch(i).startPos + " " + kr.getMatch(i).endPos);
+        //		}
+    }
 
-		List<SpanQuery> sql = new ArrayList<>();
-		sql.add(new SpanAttributeQuery(new SpanTermQuery(new Term("base",
-				"@:class=header")), true, true));
-		sql.add(new SpanAttributeQuery(new SpanTermQuery(new Term("base",
-				"@:class=book")), true));
 
-		SpanWithAttributeQuery swaq = new SpanWithAttributeQuery(sql, true);
-		kr = ki.search(swaq, (short) 10);
-		assertEquals(4, kr.getTotalResults());
+    /**
+     * Arbitrary elements with an attribute and a not attribute.
+     * */
+    @Test
+    public void testCase7 () throws IOException {
+        ki.addDoc(createFieldDoc2());
+        ki.commit();
 
-		assertEquals(0, kr.getMatch(0).getStartPos());
-		assertEquals(5, kr.getMatch(0).getEndPos());
-		assertEquals(1, kr.getMatch(1).getStartPos());
-		assertEquals(2, kr.getMatch(1).getEndPos());
-		assertEquals(2, kr.getMatch(2).getStartPos());
-		assertEquals(5, kr.getMatch(2).getEndPos());
-		assertEquals(6, kr.getMatch(3).getStartPos());
-		assertEquals(7, kr.getMatch(3).getEndPos());
+        List<SpanQuery> sql = new ArrayList<>();
+        sql.add(new SpanAttributeQuery(new SpanTermQuery(new Term("base",
+                "@:class=header")), true, true));
+        sql.add(new SpanAttributeQuery(new SpanTermQuery(new Term("base",
+                "@:class=book")), true));
 
-//		for (int i = 0; i < kr.getTotalResults(); i++) {
-//			System.out.println(kr.getMatch(i).getLocalDocID() + " "
-//					+ kr.getMatch(i).startPos + " " + kr.getMatch(i).endPos);
-//		}
-	}
+        SpanWithAttributeQuery swaq = new SpanWithAttributeQuery(sql, true);
+        kr = ki.search(swaq, (short) 10);
+        assertEquals(4, kr.getTotalResults());
 
-	/**
-	 * Arbitrary elements with only not attributes.
-	 * */
-	@Test(expected = IllegalArgumentException.class)
-	public void testCase8() throws IOException {
-		ki.addDoc(createFieldDoc2());
-		ki.commit();
+        assertEquals(0, kr.getMatch(0).getStartPos());
+        assertEquals(5, kr.getMatch(0).getEndPos());
+        assertEquals(1, kr.getMatch(1).getStartPos());
+        assertEquals(2, kr.getMatch(1).getEndPos());
+        assertEquals(2, kr.getMatch(2).getStartPos());
+        assertEquals(5, kr.getMatch(2).getEndPos());
+        assertEquals(6, kr.getMatch(3).getStartPos());
+        assertEquals(7, kr.getMatch(3).getEndPos());
 
-		List<SpanQuery> sql = new ArrayList<>();
-		sql.add(new SpanAttributeQuery(new SpanTermQuery(new Term("base",
-				"@:class=header")), true, true));
-		sql.add(new SpanAttributeQuery(new SpanTermQuery(new Term("base",
-				"@:class=book")), true, true));
+        //		for (int i = 0; i < kr.getTotalResults(); i++) {
+        //			System.out.println(kr.getMatch(i).getLocalDocID() + " "
+        //					+ kr.getMatch(i).startPos + " " + kr.getMatch(i).endPos);
+        //		}
+    }
 
-		SpanWithAttributeQuery swaq = new SpanWithAttributeQuery(sql, true);
-		kr = ki.search(swaq, (short) 10);
-	}
+
+    /**
+     * Arbitrary elements with only not attributes.
+     * */
+    @Test(expected = IllegalArgumentException.class)
+    public void testCase8 () throws IOException {
+        ki.addDoc(createFieldDoc2());
+        ki.commit();
+
+        List<SpanQuery> sql = new ArrayList<>();
+        sql.add(new SpanAttributeQuery(new SpanTermQuery(new Term("base",
+                "@:class=header")), true, true));
+        sql.add(new SpanAttributeQuery(new SpanTermQuery(new Term("base",
+                "@:class=book")), true, true));
+
+        SpanWithAttributeQuery swaq = new SpanWithAttributeQuery(sql, true);
+        kr = ki.search(swaq, (short) 10);
+    }
 
 }
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestClassIndex.java b/src/test/java/de/ids_mannheim/korap/index/TestClassIndex.java
index 274cc25..42b56b6 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestClassIndex.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestClassIndex.java
@@ -34,257 +34,266 @@
 
     @Test
     public void indexExample1 () throws IOException {
-	KrillIndex ki = new KrillIndex();
+        KrillIndex ki = new KrillIndex();
 
-	// abcabcabac
-	FieldDocument fd = new FieldDocument();
-	fd.addTV("base",
-		 "abcabcabac",
-		 "[(0-1)s:a|i:a|_0#0-1|-:t$<i>10]" +
-		 "[(1-2)s:b|i:b|_1#1-2]" +
-		 "[(2-3)s:c|i:c|_2#2-3]" +
-		 "[(3-4)s:a|i:a|_3#3-4]" +
-		 "[(4-5)s:b|i:b|_4#4-5]" +
-		 "[(5-6)s:c|i:c|_5#5-6]" +
-		 "[(6-7)s:a|i:a|_6#6-7]" +
-		 "[(7-8)s:b|i:b|_7#7-8]" +
-		 "[(8-9)s:a|i:a|_8#8-9]" +
-		 "[(9-10)s:c|i:c|_9#9-10]");
-	ki.addDoc(fd);
+        // abcabcabac
+        FieldDocument fd = new FieldDocument();
+        fd.addTV("base", "abcabcabac", "[(0-1)s:a|i:a|_0#0-1|-:t$<i>10]"
+                + "[(1-2)s:b|i:b|_1#1-2]" + "[(2-3)s:c|i:c|_2#2-3]"
+                + "[(3-4)s:a|i:a|_3#3-4]" + "[(4-5)s:b|i:b|_4#4-5]"
+                + "[(5-6)s:c|i:c|_5#5-6]" + "[(6-7)s:a|i:a|_6#6-7]"
+                + "[(7-8)s:b|i:b|_7#7-8]" + "[(8-9)s:a|i:a|_8#8-9]"
+                + "[(9-10)s:c|i:c|_9#9-10]");
+        ki.addDoc(fd);
 
-	ki.commit();
+        ki.commit();
 
-	SpanQuery sq;
-	Result kr;
+        SpanQuery sq;
+        Result kr;
 
-	sq = new SpanNextQuery(
-            new SpanTermQuery(new Term("base", "s:b")),
-            new SpanTermQuery(new Term("base", "s:a"))
-        );
-	kr = ki.search(sq, (short) 10);
+        sq = new SpanNextQuery(new SpanTermQuery(new Term("base", "s:b")),
+                new SpanTermQuery(new Term("base", "s:a")));
+        kr = ki.search(sq, (short) 10);
 
-	assertEquals("totalResults", kr.getTotalResults(), 1);
-	assertEquals("StartPos (0)", 7, kr.getMatch(0).startPos);
-	assertEquals("EndPos (0)", 9, kr.getMatch(0).endPos);
-	assertEquals("SnippetBrackets (0)", "... bcabca[ba]c", kr.getMatch(0).getSnippetBrackets());
-	assertEquals("SnippetHTML (0)", "<span class=\"context-left\"><span class=\"more\">" +
-			"</span>bcabca</span><mark>ba</mark><span class=\"context-right" +
-			"\">c</span>", kr.getMatch(0).getSnippetHTML());
+        assertEquals("totalResults", kr.getTotalResults(), 1);
+        assertEquals("StartPos (0)", 7, kr.getMatch(0).startPos);
+        assertEquals("EndPos (0)", 9, kr.getMatch(0).endPos);
+        assertEquals("SnippetBrackets (0)", "... bcabca[ba]c", kr.getMatch(0)
+                .getSnippetBrackets());
+        assertEquals(
+                "SnippetHTML (0)",
+                "<span class=\"context-left\"><span class=\"more\">"
+                        + "</span>bcabca</span><mark>ba</mark><span class=\"context-right"
+                        + "\">c</span>", kr.getMatch(0).getSnippetHTML());
 
-	sq = new SpanTermQuery(new Term("base", "s:b"));
-	kr = ki.search(sq, (short) 10);
+        sq = new SpanTermQuery(new Term("base", "s:b"));
+        kr = ki.search(sq, (short) 10);
 
-	assertEquals("totalResults", kr.getTotalResults(), 3);
-	assertEquals("StartPos (0)", 1, kr.getMatch(0).startPos);
-	assertEquals("EndPos (0)", 2, kr.getMatch(0).endPos);
-	assertEquals("SnippetBrackets (0)", "a[b]cabcab ...", kr.getMatch(0).getSnippetBrackets());
+        assertEquals("totalResults", kr.getTotalResults(), 3);
+        assertEquals("StartPos (0)", 1, kr.getMatch(0).startPos);
+        assertEquals("EndPos (0)", 2, kr.getMatch(0).endPos);
+        assertEquals("SnippetBrackets (0)", "a[b]cabcab ...", kr.getMatch(0)
+                .getSnippetBrackets());
 
 
-	assertEquals("SnippetHTML (0)", "<span class=\"context-left\">a</span><mark>" +
-			"b</mark><span class=\"context-right\">cabcab<span class=\"more\"></span></span>", 
-			kr.getMatch(0).getSnippetHTML());
+        assertEquals(
+                "SnippetHTML (0)",
+                "<span class=\"context-left\">a</span><mark>"
+                        + "b</mark><span class=\"context-right\">cabcab<span class=\"more\"></span></span>",
+                kr.getMatch(0).getSnippetHTML());
 
-	assertEquals("StartPos (1)", 4, kr.getMatch(1).startPos);
-	assertEquals("EndPos (1)", 5, kr.getMatch(1).endPos);
-	assertEquals("SnippetBrackets (1)", "abca[b]cabac", kr.getMatch(1).getSnippetBrackets());
-	assertEquals("StartPos (2)", 7, kr.getMatch(2).startPos);
-	assertEquals("EndPos (2)", 8, kr.getMatch(2).endPos);
-	assertEquals("SnippetBrackets (2)", "... bcabca[b]ac", kr.getMatch(2).getSnippetBrackets());
+        assertEquals("StartPos (1)", 4, kr.getMatch(1).startPos);
+        assertEquals("EndPos (1)", 5, kr.getMatch(1).endPos);
+        assertEquals("SnippetBrackets (1)", "abca[b]cabac", kr.getMatch(1)
+                .getSnippetBrackets());
+        assertEquals("StartPos (2)", 7, kr.getMatch(2).startPos);
+        assertEquals("EndPos (2)", 8, kr.getMatch(2).endPos);
+        assertEquals("SnippetBrackets (2)", "... bcabca[b]ac", kr.getMatch(2)
+                .getSnippetBrackets());
 
-	sq = new SpanClassQuery(new SpanTermQuery(new Term("base", "s:b")));
-	kr = ki.search(sq, (short) 10);
+        sq = new SpanClassQuery(new SpanTermQuery(new Term("base", "s:b")));
+        kr = ki.search(sq, (short) 10);
 
-	assertEquals("totalResults", kr.getTotalResults(), 3);
-	assertEquals("StartPos (0)", 1, kr.getMatch(0).startPos);
-	assertEquals("EndPos (0)", 2, kr.getMatch(0).endPos);
-	assertEquals("snippetBrackets (0)", "a[{1:b}]cabcab ...", kr.getMatch(0).getSnippetBrackets());
-	assertEquals("snippetHTML (0)", "<span class=\"context-left\">a</span><mark>" +
-			"<mark class=\"class-1 level-0\">b</mark></mark><span class=\"context-right\">cabcab<span " +
-			"class=\"more\"></span></span>", kr.getMatch(0).getSnippetHTML());
+        assertEquals("totalResults", kr.getTotalResults(), 3);
+        assertEquals("StartPos (0)", 1, kr.getMatch(0).startPos);
+        assertEquals("EndPos (0)", 2, kr.getMatch(0).endPos);
+        assertEquals("snippetBrackets (0)", "a[{1:b}]cabcab ...", kr
+                .getMatch(0).getSnippetBrackets());
+        assertEquals(
+                "snippetHTML (0)",
+                "<span class=\"context-left\">a</span><mark>"
+                        + "<mark class=\"class-1 level-0\">b</mark></mark><span class=\"context-right\">cabcab<span "
+                        + "class=\"more\"></span></span>", kr.getMatch(0)
+                        .getSnippetHTML());
 
-	assertEquals("StartPos (1)", 4, kr.getMatch(1).startPos);
-	assertEquals("EndPos (1)", 5, kr.getMatch(1).endPos);
-	assertEquals("snippetBrackets (1)", "abca[{1:b}]cabac", kr.getMatch(1).getSnippetBrackets());
-	
-	assertEquals("StartPos (2)", 7, kr.getMatch(2).startPos);
-	assertEquals("EndPos (2)", 8, kr.getMatch(2).endPos);
-	assertEquals("snippetBrackets (2)", "... bcabca[{1:b}]ac", kr.getMatch(2).getSnippetBrackets());
+        assertEquals("StartPos (1)", 4, kr.getMatch(1).startPos);
+        assertEquals("EndPos (1)", 5, kr.getMatch(1).endPos);
+        assertEquals("snippetBrackets (1)", "abca[{1:b}]cabac", kr.getMatch(1)
+                .getSnippetBrackets());
+
+        assertEquals("StartPos (2)", 7, kr.getMatch(2).startPos);
+        assertEquals("EndPos (2)", 8, kr.getMatch(2).endPos);
+        assertEquals("snippetBrackets (2)", "... bcabca[{1:b}]ac",
+                kr.getMatch(2).getSnippetBrackets());
 
 
-	sq = new SpanNextQuery(
-            new SpanTermQuery(new Term("base", "s:a")),
-            new SpanClassQuery(new SpanTermQuery(new Term("base", "s:b")), (byte) 1)
-        );
+        sq = new SpanNextQuery(new SpanTermQuery(new Term("base", "s:a")),
+                new SpanClassQuery(new SpanTermQuery(new Term("base", "s:b")),
+                        (byte) 1));
 
-	kr = ki.search(sq, (short) 10);
+        kr = ki.search(sq, (short) 10);
 
-	assertEquals("totalResults", kr.getTotalResults(), 3);
-	assertEquals("StartPos (0)", 0, kr.getMatch(0).startPos);
-	assertEquals("EndPos (0)", 2, kr.getMatch(0).endPos);
-	assertEquals("SnippetBrackets (0)", "[a{1:b}]cabcab ...", kr.getMatch(0).getSnippetBrackets());
+        assertEquals("totalResults", kr.getTotalResults(), 3);
+        assertEquals("StartPos (0)", 0, kr.getMatch(0).startPos);
+        assertEquals("EndPos (0)", 2, kr.getMatch(0).endPos);
+        assertEquals("SnippetBrackets (0)", "[a{1:b}]cabcab ...", kr
+                .getMatch(0).getSnippetBrackets());
 
-	assertEquals("SnippetHTML (0)", "<span class=\"context-left\"></span><mark>a<mark class=\"class-1 level-0\">b</mark></mark><span class=\"context-right\">cabcab<span class=\"more\"></span></span>", kr.getMatch(0).getSnippetHTML());
+        assertEquals(
+                "SnippetHTML (0)",
+                "<span class=\"context-left\"></span><mark>a<mark class=\"class-1 level-0\">b</mark></mark><span class=\"context-right\">cabcab<span class=\"more\"></span></span>",
+                kr.getMatch(0).getSnippetHTML());
 
-	assertEquals("StartPos (1)", 3, kr.getMatch(1).startPos);
-	assertEquals("EndPos (1)", 5, kr.getMatch(1).endPos);
-	assertEquals("SnippetBrackets (1)", "abc[a{1:b}]cabac", kr.getMatch(1).getSnippetBrackets());
-	assertEquals("StartPos (2)", 6, kr.getMatch(2).startPos);
-	assertEquals("EndPos (2)", 8, kr.getMatch(2).endPos);
-	assertEquals("SnippetBrackets (2)", "abcabc[a{1:b}]ac", kr.getMatch(2).getSnippetBrackets());
+        assertEquals("StartPos (1)", 3, kr.getMatch(1).startPos);
+        assertEquals("EndPos (1)", 5, kr.getMatch(1).endPos);
+        assertEquals("SnippetBrackets (1)", "abc[a{1:b}]cabac", kr.getMatch(1)
+                .getSnippetBrackets());
+        assertEquals("StartPos (2)", 6, kr.getMatch(2).startPos);
+        assertEquals("EndPos (2)", 8, kr.getMatch(2).endPos);
+        assertEquals("SnippetBrackets (2)", "abcabc[a{1:b}]ac", kr.getMatch(2)
+                .getSnippetBrackets());
 
 
-	// abcabcabac
-	sq = new SpanNextQuery(
-	    new SpanClassQuery(new SpanTermQuery(new Term("base", "s:a")), (byte) 2),
-            new SpanClassQuery(new SpanTermQuery(new Term("base", "s:b")), (byte) 3)
-        );
+        // abcabcabac
+        sq = new SpanNextQuery(new SpanClassQuery(new SpanTermQuery(new Term(
+                "base", "s:a")), (byte) 2), new SpanClassQuery(
+                new SpanTermQuery(new Term("base", "s:b")), (byte) 3));
 
-	kr = ki.search(sq, (short) 10);
+        kr = ki.search(sq, (short) 10);
 
-	assertEquals("StartPos (0)", 0, kr.getMatch(0).startPos);
-	assertEquals("EndPos (0)", 2, kr.getMatch(0).endPos);
-	assertEquals("SnippetBrackets (0)", "[{2:a}{3:b}]cabcab ...", kr.getMatch(0).getSnippetBrackets());
-	assertEquals("StartPos (1)", 3, kr.getMatch(1).startPos);
-	assertEquals("EndPos (1)", 5, kr.getMatch(1).endPos);
-	assertEquals("SnippetBrackets (1)", "abc[{2:a}{3:b}]cabac", kr.getMatch(1).getSnippetBrackets());
+        assertEquals("StartPos (0)", 0, kr.getMatch(0).startPos);
+        assertEquals("EndPos (0)", 2, kr.getMatch(0).endPos);
+        assertEquals("SnippetBrackets (0)", "[{2:a}{3:b}]cabcab ...", kr
+                .getMatch(0).getSnippetBrackets());
+        assertEquals("StartPos (1)", 3, kr.getMatch(1).startPos);
+        assertEquals("EndPos (1)", 5, kr.getMatch(1).endPos);
+        assertEquals("SnippetBrackets (1)", "abc[{2:a}{3:b}]cabac", kr
+                .getMatch(1).getSnippetBrackets());
 
-	assertEquals("StartPos (2)", 6, kr.getMatch(2).startPos);
-	assertEquals("EndPos (2)", 8, kr.getMatch(2).endPos);
-	assertEquals("SnippetBrackets (2)", "abcabc[{2:a}{3:b}]ac", kr.getMatch(2).getSnippetBrackets());
+        assertEquals("StartPos (2)", 6, kr.getMatch(2).startPos);
+        assertEquals("EndPos (2)", 8, kr.getMatch(2).endPos);
+        assertEquals("SnippetBrackets (2)", "abcabc[{2:a}{3:b}]ac", kr
+                .getMatch(2).getSnippetBrackets());
 
-	// abcabcabac
-	sq = new SpanNextQuery(
-            new SpanTermQuery(new Term("base", "s:a")),
-            new SpanClassQuery(
-	        new SpanNextQuery(
-		    new SpanTermQuery(new Term("base", "s:b")),
-	    	    new SpanClassQuery(new SpanTermQuery(new Term("base", "s:a")))
-		), (byte) 2
-	));
+        // abcabcabac
+        sq = new SpanNextQuery(new SpanTermQuery(new Term("base", "s:a")),
+                new SpanClassQuery(new SpanNextQuery(new SpanTermQuery(
+                        new Term("base", "s:b")), new SpanClassQuery(
+                        new SpanTermQuery(new Term("base", "s:a")))), (byte) 2));
 
-	kr = ki.search(sq, (short) 10);
+        kr = ki.search(sq, (short) 10);
 
-	assertEquals("totalResults", kr.getTotalResults(), 1);
-	assertEquals("SnippetBrackets (0)", "abcabc[a{2:b{1:a}}]c", kr.getMatch(0).getSnippetBrackets());
-	assertEquals("SnippetHTML (0)", "<span class=\"context-left\">abcabc</span><mark>a<mark class=\"class-2 level-0\">b<mark class=\"class-1 level-1\">a</mark></mark></mark><span class=\"context-right\">c</span>", kr.getMatch(0).getSnippetHTML());
+        assertEquals("totalResults", kr.getTotalResults(), 1);
+        assertEquals("SnippetBrackets (0)", "abcabc[a{2:b{1:a}}]c", kr
+                .getMatch(0).getSnippetBrackets());
+        assertEquals(
+                "SnippetHTML (0)",
+                "<span class=\"context-left\">abcabc</span><mark>a<mark class=\"class-2 level-0\">b<mark class=\"class-1 level-1\">a</mark></mark></mark><span class=\"context-right\">c</span>",
+                kr.getMatch(0).getSnippetHTML());
 
-	// Offset tokens
-	kr = ki.search(sq, 0, (short) 10, true, (short) 2, true, (short) 2);
-	assertEquals("totalResults", kr.getTotalResults(), 1);
-	assertEquals("SnippetBrackets (0)", "... bc[a{2:b{1:a}}]c", kr.getMatch(0).getSnippetBrackets());
-	assertEquals("SnippetHTML (0)", "<span class=\"context-left\"><span class=\"more\"></span>bc</span><mark>a<mark class=\"class-2 level-0\">b<mark class=\"class-1 level-1\">a</mark></mark></mark><span class=\"context-right\">c</span>", kr.getMatch(0).getSnippetHTML());
+        // Offset tokens
+        kr = ki.search(sq, 0, (short) 10, true, (short) 2, true, (short) 2);
+        assertEquals("totalResults", kr.getTotalResults(), 1);
+        assertEquals("SnippetBrackets (0)", "... bc[a{2:b{1:a}}]c", kr
+                .getMatch(0).getSnippetBrackets());
+        assertEquals(
+                "SnippetHTML (0)",
+                "<span class=\"context-left\"><span class=\"more\"></span>bc</span><mark>a<mark class=\"class-2 level-0\">b<mark class=\"class-1 level-1\">a</mark></mark></mark><span class=\"context-right\">c</span>",
+                kr.getMatch(0).getSnippetHTML());
 
-	// Offset Characters
-	kr = ki.search(sq, 0, (short) 10, false, (short) 2, false, (short) 2);
-	assertEquals("totalResults", kr.getTotalResults(), 1);
-	assertEquals("SnippetBrackets (0)", "... bc[a{2:b{1:a}}]c", kr.getMatch(0).getSnippetBrackets());
-	assertEquals("SnippetHTML (0)", "<span class=\"context-left\"><span class=\"more\"></span>bc</span><mark>a<mark class=\"class-2 level-0\">b<mark class=\"class-1 level-1\">a</mark></mark></mark><span class=\"context-right\">c</span>", kr.getMatch(0).getSnippetHTML());
+        // Offset Characters
+        kr = ki.search(sq, 0, (short) 10, false, (short) 2, false, (short) 2);
+        assertEquals("totalResults", kr.getTotalResults(), 1);
+        assertEquals("SnippetBrackets (0)", "... bc[a{2:b{1:a}}]c", kr
+                .getMatch(0).getSnippetBrackets());
+        assertEquals(
+                "SnippetHTML (0)",
+                "<span class=\"context-left\"><span class=\"more\"></span>bc</span><mark>a<mark class=\"class-2 level-0\">b<mark class=\"class-1 level-1\">a</mark></mark></mark><span class=\"context-right\">c</span>",
+                kr.getMatch(0).getSnippetHTML());
 
 
-	// System.err.println(kr.toJSON());
+        // System.err.println(kr.toJSON());
 
-	sq = new SpanNextQuery(
-	    new SpanClassQuery(new SpanTermQuery(new Term("base", "s:b")), (byte) 1),
-            new SpanClassQuery(new SpanTermQuery(new Term("base", "s:c")), (byte) 2)
-        );
+        sq = new SpanNextQuery(new SpanClassQuery(new SpanTermQuery(new Term(
+                "base", "s:b")), (byte) 1), new SpanClassQuery(
+                new SpanTermQuery(new Term("base", "s:c")), (byte) 2));
 
-	kr = ki.search(sq, (short) 10);
-	
-	assertEquals("totalResults", kr.getTotalResults(), 2);
-	assertEquals("StartPos (0)", 1, kr.getMatch(0).startPos);
-	assertEquals("EndPos (0)", 3, kr.getMatch(0).endPos);
-	assertEquals("StartPos (1)", 4, kr.getMatch(1).startPos);
-	assertEquals("EndPos (1)", 6, kr.getMatch(1).endPos);
+        kr = ki.search(sq, (short) 10);
 
-	assertEquals("Document count", 1, ki.numberOf("base", "documents"));
-	assertEquals("Token count", 10, ki.numberOf("base", "t"));
+        assertEquals("totalResults", kr.getTotalResults(), 2);
+        assertEquals("StartPos (0)", 1, kr.getMatch(0).startPos);
+        assertEquals("EndPos (0)", 3, kr.getMatch(0).endPos);
+        assertEquals("StartPos (1)", 4, kr.getMatch(1).startPos);
+        assertEquals("EndPos (1)", 6, kr.getMatch(1).endPos);
+
+        assertEquals("Document count", 1, ki.numberOf("base", "documents"));
+        assertEquals("Token count", 10, ki.numberOf("base", "t"));
 
 
-	sq = new SpanNextQuery(
-            new SpanTermQuery(new Term("base", "s:a")),
-            new SpanClassQuery(
-	      new SpanNextQuery(
-	        new SpanTermQuery(new Term("base", "s:b")),
-	        new SpanTermQuery(new Term("base", "s:c"))
-	      )
-	   )
-        );
+        sq = new SpanNextQuery(new SpanTermQuery(new Term("base", "s:a")),
+                new SpanClassQuery(new SpanNextQuery(new SpanTermQuery(
+                        new Term("base", "s:b")), new SpanTermQuery(new Term(
+                        "base", "s:c")))));
 
-	kr = ki.search(sq, (short) 2);
-	
-	assertEquals("totalResults", kr.getTotalResults(), 2);
-	assertEquals("StartPos (0)", 0, kr.getMatch(0).startPos);
-	assertEquals("EndPos (0)", 3, kr.getMatch(0).endPos);
-	assertEquals("StartPos (1)", 3, kr.getMatch(1).startPos);
-	assertEquals("EndPos (1)", 6, kr.getMatch(1).endPos);
+        kr = ki.search(sq, (short) 2);
 
-	assertEquals(1, ki.numberOf("base", "documents"));
-	assertEquals(10, ki.numberOf("base", "t"));
+        assertEquals("totalResults", kr.getTotalResults(), 2);
+        assertEquals("StartPos (0)", 0, kr.getMatch(0).startPos);
+        assertEquals("EndPos (0)", 3, kr.getMatch(0).endPos);
+        assertEquals("StartPos (1)", 3, kr.getMatch(1).startPos);
+        assertEquals("EndPos (1)", 6, kr.getMatch(1).endPos);
+
+        assertEquals(1, ki.numberOf("base", "documents"));
+        assertEquals(10, ki.numberOf("base", "t"));
     };
 
 
     @Test
     public void indexExample2 () throws IOException {
-	KrillIndex ki = new KrillIndex();
+        KrillIndex ki = new KrillIndex();
 
-	// abcabcabac
-	FieldDocument fd = new FieldDocument();
-	fd.addTV("base",
-		 "abcabcabac",
-		 "[(0-1)s:a|i:a|_0#0-1|-:t$<i>10]" +
-		 "[(1-2)s:b|i:b|_1#1-2]" +
-		 "[(2-3)s:c|i:c|_2#2-3]" +
-		 "[(3-4)s:a|i:a|_3#3-4|<>:x#3-7$<i>7]" +
-		 "[(4-5)s:b|i:b|_4#4-5]" +
-		 "[(5-6)s:c|i:c|_5#5-6]" +
-		 "[(6-7)s:a|i:a|_6#6-7]" +
-		 "[(7-8)s:b|i:b|_7#7-8]" +
-		 "[(8-9)s:a|i:a|_8#8-9]" +
-		 "[(9-10)s:c|i:c|_9#9-10]");
-	ki.addDoc(fd);
+        // abcabcabac
+        FieldDocument fd = new FieldDocument();
+        fd.addTV("base", "abcabcabac", "[(0-1)s:a|i:a|_0#0-1|-:t$<i>10]"
+                + "[(1-2)s:b|i:b|_1#1-2]" + "[(2-3)s:c|i:c|_2#2-3]"
+                + "[(3-4)s:a|i:a|_3#3-4|<>:x#3-7$<i>7]"
+                + "[(4-5)s:b|i:b|_4#4-5]" + "[(5-6)s:c|i:c|_5#5-6]"
+                + "[(6-7)s:a|i:a|_6#6-7]" + "[(7-8)s:b|i:b|_7#7-8]"
+                + "[(8-9)s:a|i:a|_8#8-9]" + "[(9-10)s:c|i:c|_9#9-10]");
+        ki.addDoc(fd);
 
-	ki.commit();
+        ki.commit();
 
-	SpanQuery sq;
-	Result kr;
+        SpanQuery sq;
+        Result kr;
 
-	/*
-	sq = new SpanNextQuery(
-	       new SpanTermQuery(new Term("base", "s:c")),
- 	       new SpanElementQuery("base", "x")
-	);
-	
-	kr = ki.search(sq, (short) 10);
-	assertEquals("ab[cabca]bac", kr.getMatch(0).getSnippetBrackets());
-	System.err.println();
-	*/
-
-	/*
-	sq = new SpanNextQuery(
-	       new SpanElementQuery("base", "x"),
-	       new SpanTermQuery(new Term("base", "s:b"))
-	);
-	
-	kr = ki.search(sq, (short) 10);
-	assertEquals("abc[abcab}ac]", kr.getMatch(0).getSnippetBrackets());
-	System.err.println();
-
-	*/
-
-	/*
-	sq = new SpanWithinQuery(
-            new SpanElementQuery("base", "x"),
-            new SpanClassQuery(
-              new SpanTermQuery(new Term("base", "s:a"))
-            )
+        /*
+        sq = new SpanNextQuery(
+               new SpanTermQuery(new Term("base", "s:c")),
+               new SpanElementQuery("base", "x")
         );
+        
+        kr = ki.search(sq, (short) 10);
+        assertEquals("ab[cabca]bac", kr.getMatch(0).getSnippetBrackets());
+        System.err.println();
+        */
 
-	       //	       new SpanTermQuery(new Term("base", "s:a")),
-	    //            new SpanClassQuery(
-	    //            )
-	    //        );
+        /*
+        sq = new SpanNextQuery(
+               new SpanElementQuery("base", "x"),
+               new SpanTermQuery(new Term("base", "s:b"))
+        );
+        
+        kr = ki.search(sq, (short) 10);
+        assertEquals("abc[abcab}ac]", kr.getMatch(0).getSnippetBrackets());
+        System.err.println();
 
-	*/
+        */
+
+        /*
+        sq = new SpanWithinQuery(
+                new SpanElementQuery("base", "x"),
+                new SpanClassQuery(
+                  new SpanTermQuery(new Term("base", "s:a"))
+                )
+            );
+
+               //	       new SpanTermQuery(new Term("base", "s:a")),
+            //            new SpanClassQuery(
+            //            )
+            //        );
+
+        */
 
     }
 };
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestDistanceExclusionIndex.java b/src/test/java/de/ids_mannheim/korap/index/TestDistanceExclusionIndex.java
index d97e44a..6309d59 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestDistanceExclusionIndex.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestDistanceExclusionIndex.java
@@ -19,200 +19,194 @@
 public class TestDistanceExclusionIndex {
 
     private KrillIndex ki;
-	private Result kr;
+    private Result kr;
 
-	/** Ordered, unordered
-	 * */
-	@Test
-    public void testCase1() throws IOException{
-    	ki = new KrillIndex();
-        ki.addDoc(createFieldDoc0()); 
+
+    /**
+     * Ordered, unordered
+     * */
+    @Test
+    public void testCase1 () throws IOException {
+        ki = new KrillIndex();
+        ki.addDoc(createFieldDoc0());
         ki.commit();
         SpanQuery sq;
         //ordered distance 0 to 1
-        sq = createQuery("s:c","s:e",0,1,true);                
-        kr = ki.search(sq, (short) 10);        
-        assertEquals((long) 3, kr.getTotalResults());	    
-	    assertEquals(2, kr.getMatch(0).getStartPos());
-	    assertEquals(3, kr.getMatch(0).getEndPos());
-	    assertEquals(3, kr.getMatch(1).getStartPos());
-	    assertEquals(4, kr.getMatch(1).getEndPos());
-	    assertEquals(5, kr.getMatch(2).getStartPos());
-	    assertEquals(6, kr.getMatch(2).getEndPos());
-        
+        sq = createQuery("s:c", "s:e", 0, 1, true);
+        kr = ki.search(sq, (short) 10);
+        assertEquals((long) 3, kr.getTotalResults());
+        assertEquals(2, kr.getMatch(0).getStartPos());
+        assertEquals(3, kr.getMatch(0).getEndPos());
+        assertEquals(3, kr.getMatch(1).getStartPos());
+        assertEquals(4, kr.getMatch(1).getEndPos());
+        assertEquals(5, kr.getMatch(2).getStartPos());
+        assertEquals(6, kr.getMatch(2).getEndPos());
+
         // Unordered
-        sq = createQuery("s:c","s:e",0,1,false);                
+        sq = createQuery("s:c", "s:e", 0, 1, false);
         kr = ki.search(sq, (short) 10);
         assertEquals((long) 2, kr.getTotalResults());
     }
-	
-	/** Multiple docs, unordered
-	 * 	No more secondSpans
-	 * */
-	@Test
-    public void testCase2() throws IOException{
-    	ki = new KrillIndex();
-        ki.addDoc(createFieldDoc0()); 
+
+
+    /**
+     * Multiple docs, unordered
+     * No more secondSpans
+     * */
+    @Test
+    public void testCase2 () throws IOException {
+        ki = new KrillIndex();
+        ki.addDoc(createFieldDoc0());
         ki.addDoc(createFieldDoc1());
         ki.commit();
         SpanQuery sq;
         // ---- Distance 0 to 1
-        sq = createQuery("s:c","s:e",0,1,false);                
-        kr = ki.search(sq, (short) 10);        
-        assertEquals((long) 5, kr.getTotalResults());	    
-	    assertEquals(1, kr.getMatch(3).getLocalDocID());
-	}
-	
-	/** Secondspans' document number is bigger than firstspans' 
-	 * 	Actual distance is smaller than min distance.
-	 * */
-	@Test
-    public void testCase3() throws IOException{
-		ki = new KrillIndex();
-		ki.addDoc(createFieldDoc1());
-		ki.addDoc(createFieldDoc0());        
-        ki.commit();
-        
-        SpanQuery sq;
-        // Unordered
-        sq = createQuery("s:c","s:e",2,2,false);                
+        sq = createQuery("s:c", "s:e", 0, 1, false);
         kr = ki.search(sq, (short) 10);
         assertEquals((long) 5, kr.getTotalResults());
-	}
-	
-	/** Unordered: firstspan in on the right side of the secondspan, 
-	 * 	but within max distance.
-	 * */
-	@Test
-    public void testCase4() throws IOException{
-		ki = new KrillIndex();
-		ki.addDoc(createFieldDoc2());		        
+        assertEquals(1, kr.getMatch(3).getLocalDocID());
+    }
+
+
+    /**
+     * Secondspans' document number is bigger than firstspans'
+     * Actual distance is smaller than min distance.
+     * */
+    @Test
+    public void testCase3 () throws IOException {
+        ki = new KrillIndex();
+        ki.addDoc(createFieldDoc1());
+        ki.addDoc(createFieldDoc0());
         ki.commit();
-        
+
         SpanQuery sq;
         // Unordered
-        sq = createQuery("s:b","s:c",2,2,false);                
+        sq = createQuery("s:c", "s:e", 2, 2, false);
+        kr = ki.search(sq, (short) 10);
+        assertEquals((long) 5, kr.getTotalResults());
+    }
+
+
+    /**
+     * Unordered: firstspan in on the right side of the secondspan,
+     * but within max distance.
+     * */
+    @Test
+    public void testCase4 () throws IOException {
+        ki = new KrillIndex();
+        ki.addDoc(createFieldDoc2());
+        ki.commit();
+
+        SpanQuery sq;
+        // Unordered
+        sq = createQuery("s:b", "s:c", 2, 2, false);
         kr = ki.search(sq, (short) 10);
         assertEquals((long) 1, kr.getTotalResults());
         assertEquals(1, kr.getMatch(0).getStartPos());
-	    assertEquals(2, kr.getMatch(0).getEndPos());
+        assertEquals(2, kr.getMatch(0).getEndPos());
     }
-	
-	/**	Element queries
-	 * */
-	@Test
-    public void testCase5() throws IOException{
-		ki = new KrillIndex();
-		ki.addDoc(createFieldDoc0());		        
+
+
+    /**
+     * Element queries
+     * */
+    @Test
+    public void testCase5 () throws IOException {
+        ki = new KrillIndex();
+        ki.addDoc(createFieldDoc0());
         ki.commit();
-        
-        SpanDistanceQuery sq;        
-        sq = new SpanDistanceQuery(
-        		new SpanElementQuery("base", "x"),
-        		new SpanElementQuery("base", "y"),
-        		new DistanceConstraint(0, 1, false, true),
-        		true);        
-        
+
+        SpanDistanceQuery sq;
+        sq = new SpanDistanceQuery(new SpanElementQuery("base", "x"),
+                new SpanElementQuery("base", "y"), new DistanceConstraint(0, 1,
+                        false, true), true);
+
         kr = ki.search(sq, (short) 10);
         assertEquals((long) 1, kr.getTotalResults());
         assertEquals(9, kr.getMatch(0).getStartPos());
-	    assertEquals(10, kr.getMatch(0).getEndPos());
+        assertEquals(10, kr.getMatch(0).getEndPos());
     }
-	
-	// Add skipTo test	
-	@Test
-	public void testCase6() throws IOException{
-		ki = new KrillIndex();
-		ki.addDoc(createFieldDoc1());
-		ki.addDoc(createFieldDoc2());
+
+
+    // Add skipTo test	
+    @Test
+    public void testCase6 () throws IOException {
+        ki = new KrillIndex();
+        ki.addDoc(createFieldDoc1());
+        ki.addDoc(createFieldDoc2());
         ki.commit();
-        
+
         SpanQuery sq;
         //ordered distance 0 to 1
-        sq = createQuery("s:d","s:b",0,1,true);
+        sq = createQuery("s:d", "s:b", 0, 1, true);
         kr = ki.search(sq, (short) 10);
         assertEquals((long) 4, kr.getTotalResults());
-        
-		SpanTermQuery stq = new SpanTermQuery(new Term("base", "s:c"));
-		kr = ki.search(stq, (short) 10);
-		assertEquals((long) 6, kr.getTotalResults());
-		
-		SpanNextQuery snq = new SpanNextQuery(stq,sq);		
+
+        SpanTermQuery stq = new SpanTermQuery(new Term("base", "s:c"));
+        kr = ki.search(stq, (short) 10);
+        assertEquals((long) 6, kr.getTotalResults());
+
+        SpanNextQuery snq = new SpanNextQuery(stq, sq);
         kr = ki.search(snq, (short) 10);
         assertEquals((long) 2, kr.getTotalResults());
         assertEquals(3, kr.getMatch(0).getStartPos());
-	    assertEquals(5, kr.getMatch(0).getEndPos());
-	    assertEquals(8, kr.getMatch(1).getStartPos());
-	    assertEquals(10, kr.getMatch(1).getEndPos());
-	    
+        assertEquals(5, kr.getMatch(0).getEndPos());
+        assertEquals(8, kr.getMatch(1).getStartPos());
+        assertEquals(10, kr.getMatch(1).getEndPos());
+
         /*System.out.print(kr.getTotalResults()+"\n");
-		for (int i=0; i< kr.getTotalResults(); i++){
-			System.out.println(
-				kr.getMatch(i).getLocalDocID()+" "+
-				kr.getMatch(i).startPos + " " +
-				kr.getMatch(i).endPos
-		    );
-		}*/
-	}
-	
-    private SpanQuery createQuery(String x, String y, int min, int max, boolean isOrdered){
-    	SpanDistanceQuery sq = new SpanDistanceQuery(
-        		new SpanTermQuery(new Term("base",x)),
-        		new SpanTermQuery(new Term("base",y)),
-        		new DistanceConstraint(min, max, isOrdered,true),
-        		true
-        );    	
-    	return sq;
+        for (int i=0; i< kr.getTotalResults(); i++){
+        	System.out.println(
+        		kr.getMatch(i).getLocalDocID()+" "+
+        		kr.getMatch(i).startPos + " " +
+        		kr.getMatch(i).endPos
+            );
+        }*/
     }
-    
-    private FieldDocument createFieldDoc0(){
-    	FieldDocument fd = new FieldDocument();
+
+
+    private SpanQuery createQuery (String x, String y, int min, int max,
+            boolean isOrdered) {
+        SpanDistanceQuery sq = new SpanDistanceQuery(new SpanTermQuery(
+                new Term("base", x)), new SpanTermQuery(new Term("base", y)),
+                new DistanceConstraint(min, max, isOrdered, true), true);
+        return sq;
+    }
+
+
+    private FieldDocument createFieldDoc0 () {
+        FieldDocument fd = new FieldDocument();
         fd.addString("ID", "doc-0");
-        fd.addTV("base",
-            "text",             
-            "[(0-1)s:c|_1#0-1]" +
-            "[(1-2)s:e|_2#1-2]" +             
-            "[(2-3)s:c|_3#2-3|<>:y#2-4$<i>4]" +
-            "[(3-4)s:c|_4#3-4|<>:x#3-7$<i>7]" + 
-            "[(4-5)s:d|_5#4-5|<>:y#4-6$<i>6]" +             
-            "[(5-6)s:c|_6#5-6|<>:y#5-8$<i>8]" +
-            "[(6-7)s:d|_7#6-7]" +
-            "[(7-8)s:e|_8#7-8|<>:x#7-9$<i>9]" + 
-            "[(8-9)s:e|_9#8-9]" + 
-            "[(9-10)s:d|_10#9-10|<>:x#9-10$<i>10]");
+        fd.addTV("base", "text", "[(0-1)s:c|_1#0-1]" + "[(1-2)s:e|_2#1-2]"
+                + "[(2-3)s:c|_3#2-3|<>:y#2-4$<i>4]"
+                + "[(3-4)s:c|_4#3-4|<>:x#3-7$<i>7]"
+                + "[(4-5)s:d|_5#4-5|<>:y#4-6$<i>6]"
+                + "[(5-6)s:c|_6#5-6|<>:y#5-8$<i>8]" + "[(6-7)s:d|_7#6-7]"
+                + "[(7-8)s:e|_8#7-8|<>:x#7-9$<i>9]" + "[(8-9)s:e|_9#8-9]"
+                + "[(9-10)s:d|_10#9-10|<>:x#9-10$<i>10]");
         return fd;
     }
-    
-    private FieldDocument createFieldDoc1() {
-    	FieldDocument fd = new FieldDocument();
+
+
+    private FieldDocument createFieldDoc1 () {
+        FieldDocument fd = new FieldDocument();
         fd.addString("ID", "doc-1");
-        fd.addTV("base",
-            "text",             
-            "[(0-1)s:b|s:c|_1#0-1]" +
-            "[(1-2)s:b|_2#1-2]" +             
-            "[(2-3)s:c|_3#2-3]" +
-            "[(3-4)s:c|_4#3-4]" + 
-            "[(4-5)s:d|_5#4-5]" +             
-            "[(5-6)s:d|_6#5-6]");
+        fd.addTV("base", "text", "[(0-1)s:b|s:c|_1#0-1]" + "[(1-2)s:b|_2#1-2]"
+                + "[(2-3)s:c|_3#2-3]" + "[(3-4)s:c|_4#3-4]"
+                + "[(4-5)s:d|_5#4-5]" + "[(5-6)s:d|_6#5-6]");
         return fd;
-	}
-    
-    private FieldDocument createFieldDoc2() {
-    	FieldDocument fd = new FieldDocument();
+    }
+
+
+    private FieldDocument createFieldDoc2 () {
+        FieldDocument fd = new FieldDocument();
         fd.addString("ID", "doc-2");
-        fd.addTV("base",
-            "text",             
-            "[(0-1)s:b|_1#0-1]" +
-            "[(1-2)s:b|_2#1-2]" +             
-            "[(2-3)s:c|_3#2-3]" +
-            "[(3-4)s:c|_4#3-4]" + 
-            "[(4-5)s:b|_5#4-5]" +             
-            "[(5-6)s:d|_6#5-6]" + 
-            "[(6-7)s:b|_7#6-7]" +
-            "[(7-8)s:d|_8#7-8]" + 
-            "[(8-9)s:c|_9#8-9]" + 
-            "[(9-10)s:d|_10#9-10]");
+        fd.addTV("base", "text", "[(0-1)s:b|_1#0-1]" + "[(1-2)s:b|_2#1-2]"
+                + "[(2-3)s:c|_3#2-3]" + "[(3-4)s:c|_4#3-4]"
+                + "[(4-5)s:b|_5#4-5]" + "[(5-6)s:d|_6#5-6]"
+                + "[(6-7)s:b|_7#6-7]" + "[(7-8)s:d|_8#7-8]"
+                + "[(8-9)s:c|_9#8-9]" + "[(9-10)s:d|_10#9-10]");
         return fd;
-	}
-    
+    }
+
 }
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestDistanceIndex.java b/src/test/java/de/ids_mannheim/korap/index/TestDistanceIndex.java
index df9b00e..70900f2 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestDistanceIndex.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestDistanceIndex.java
@@ -21,303 +21,299 @@
 @RunWith(JUnit4.class)
 public class TestDistanceIndex {
     Result kr;
-    KrillIndex ki;   
- 
-    private FieldDocument createFieldDoc0() {
-    	FieldDocument fd = new FieldDocument();
+    KrillIndex ki;
+
+
+    private FieldDocument createFieldDoc0 () {
+        FieldDocument fd = new FieldDocument();
         fd.addString("ID", "doc-0");
-        fd.addTV("base",
-            "text",             
-            "[(0-1)s:b|s:c|_1#0-1]" +
-            "[(1-2)s:b|_2#1-2]" +             
-            "[(2-3)s:c|_3#2-3]" +
-            "[(3-4)s:c|_4#3-4]" + 
-            "[(4-5)s:d|_5#4-5]" +             
-            "[(5-6)s:d|_6#5-6]");
+        fd.addTV("base", "text", "[(0-1)s:b|s:c|_1#0-1]" + "[(1-2)s:b|_2#1-2]"
+                + "[(2-3)s:c|_3#2-3]" + "[(3-4)s:c|_4#3-4]"
+                + "[(4-5)s:d|_5#4-5]" + "[(5-6)s:d|_6#5-6]");
         return fd;
-	}
-    
-    private FieldDocument createFieldDoc1(){
-    	FieldDocument fd = new FieldDocument();
+    }
+
+
+    private FieldDocument createFieldDoc1 () {
+        FieldDocument fd = new FieldDocument();
         fd.addString("ID", "doc-1");
-        fd.addTV("base",
-            "text",             
-            "[(0-1)s:c|_1#0-1]" +
-            "[(1-2)s:e|_2#1-2]" +             
-            "[(2-3)s:c|_3#2-3|<>:y#2-4$<i>4]" +
-            "[(3-4)s:c|_4#3-4|<>:x#3-7$<i>7]" + 
-            "[(4-5)s:d|_5#4-5|<>:y#4-6$<i>6]" +             
-            "[(5-6)s:c|_6#5-6|<>:y#5-8$<i>8]" +
-            "[(6-7)s:d|_7#6-7]" +
-            "[(7-8)s:e|_8#7-8|<>:x#7-9$<i>9]" + 
-            "[(8-9)s:e|_9#8-9|<>:x#8-10$<i>10]" + 
-            "[(9-10)s:d|_10#9-10]");
+        fd.addTV("base", "text", "[(0-1)s:c|_1#0-1]" + "[(1-2)s:e|_2#1-2]"
+                + "[(2-3)s:c|_3#2-3|<>:y#2-4$<i>4]"
+                + "[(3-4)s:c|_4#3-4|<>:x#3-7$<i>7]"
+                + "[(4-5)s:d|_5#4-5|<>:y#4-6$<i>6]"
+                + "[(5-6)s:c|_6#5-6|<>:y#5-8$<i>8]" + "[(6-7)s:d|_7#6-7]"
+                + "[(7-8)s:e|_8#7-8|<>:x#7-9$<i>9]"
+                + "[(8-9)s:e|_9#8-9|<>:x#8-10$<i>10]" + "[(9-10)s:d|_10#9-10]");
         return fd;
     }
-    
-    private FieldDocument createFieldDoc2() {
-    	FieldDocument fd = new FieldDocument();
+
+
+    private FieldDocument createFieldDoc2 () {
+        FieldDocument fd = new FieldDocument();
         fd.addString("ID", "doc-2");
-        fd.addTV("base",
-            "text",             
-            "[(0-1)s:b|_1#0-1]" +
-            "[(1-2)s:b|_2#1-2]" +             
-            "[(2-3)s:d|_3#2-3]" +
-            "[(3-4)s:e|_4#3-4]" + 
-            "[(4-5)s:d|_5#4-5]" +             
-            "[(5-6)s:e|_6#5-6]");
+        fd.addTV("base", "text", "[(0-1)s:b|_1#0-1]" + "[(1-2)s:b|_2#1-2]"
+                + "[(2-3)s:d|_3#2-3]" + "[(3-4)s:e|_4#3-4]"
+                + "[(4-5)s:d|_5#4-5]" + "[(5-6)s:e|_6#5-6]");
         return fd;
-	}
-    
-    private SpanQuery createQuery(String x, String y, int min, int max, boolean isOrdered){    	
-    	SpanQuery sq = new SpanDistanceQuery(
-        		new SpanTermQuery(new Term("base",x)),
-        		new SpanTermQuery(new Term("base",y)),
-        		new DistanceConstraint(min, max, isOrdered, false),
-        		true
-        );
-    	return sq;
     }
-    
-    private SpanQuery createElementQuery(String x, String y, int min, int max, boolean isOrdered){
-    	SpanQuery sq = new SpanDistanceQuery(
-        		new SpanElementQuery("base",x),
-        		new SpanElementQuery("base",y),
-        		new DistanceConstraint(min, max, isOrdered, false),
-        		true
-        );
-    	return sq;
+
+
+    private SpanQuery createQuery (String x, String y, int min, int max,
+            boolean isOrdered) {
+        SpanQuery sq = new SpanDistanceQuery(new SpanTermQuery(new Term("base",
+                x)), new SpanTermQuery(new Term("base", y)),
+                new DistanceConstraint(min, max, isOrdered, false), true);
+        return sq;
     }
-    
-    /**	- Intersection 
-     * 	- Multiple occurrences in the same doc  
-     *  - hasMoreFirstSpans = false for the current secondspan  
+
+
+    private SpanQuery createElementQuery (String x, String y, int min, int max,
+            boolean isOrdered) {
+        SpanQuery sq = new SpanDistanceQuery(new SpanElementQuery("base", x),
+                new SpanElementQuery("base", y), new DistanceConstraint(min,
+                        max, isOrdered, false), true);
+        return sq;
+    }
+
+
+    /**
+     * - Intersection
+     * - Multiple occurrences in the same doc
+     * - hasMoreFirstSpans = false for the current secondspan
      * */
     @Test
-    public void testCase1() throws IOException{
-    	ki = new KrillIndex();
-        ki.addDoc(createFieldDoc0()); 
+    public void testCase1 () throws IOException {
+        ki = new KrillIndex();
+        ki.addDoc(createFieldDoc0());
         ki.commit();
         SpanQuery sq;
         // ---- Distance 0 to 1
-        sq = createQuery("s:b","s:c",0,1,true);                
+        sq = createQuery("s:b", "s:c", 0, 1, true);
         kr = ki.search(sq, (short) 10);
-//        System.out.println(sq);
+        //        System.out.println(sq);
         assertEquals(kr.getTotalResults(), 2);
         assertEquals(0, kr.getMatch(0).startPos);
         assertEquals(1, kr.getMatch(0).endPos);
         assertEquals(1, kr.getMatch(1).startPos);
         assertEquals(3, kr.getMatch(1).endPos);
-        
+
         // ---- Distance 2 to 2
-        sq = createQuery("s:b","s:c",2,2,true);                
+        sq = createQuery("s:b", "s:c", 2, 2, true);
         kr = ki.search(sq, (short) 10);
-        
+
         assertEquals(kr.getTotalResults(), 2);
         assertEquals(0, kr.getMatch(0).startPos);
         assertEquals(3, kr.getMatch(0).endPos);
         assertEquals(1, kr.getMatch(1).startPos);
         assertEquals(4, kr.getMatch(1).endPos);
-        
+
         // ---- Distance 2 to 3
-        sq = createQuery("s:b","s:c",2,3,true);                
+        sq = createQuery("s:b", "s:c", 2, 3, true);
         kr = ki.search(sq, (short) 10);
-        
+
         assertEquals(kr.getTotalResults(), 3);
-        
+
         ki.close();
     }
-    
-    /** - Check candidate list: 
-     * 	- CandidateList should not contain firstspans that are too far from 
-     * 	  the current secondspan
-     * 	- Add new candidates  
-     * */
-    @Test
-    public void testCase2() throws IOException{
-    	ki = new KrillIndex();
-	    ki.addDoc(createFieldDoc1()); 
-	    ki.commit();    
-	    
-	    // ---- Distance 1 to 3
-	    // Candidate list for the current secondspan, is empty
-	    SpanQuery sq = createQuery("s:c","s:d",1,3,true);                
-	    kr = ki.search(sq, (short) 10);
-	        	    
-	    assertEquals((long) 4, kr.getTotalResults());
-	    assertEquals(2, kr.getMatch(0).startPos);
-	    assertEquals(5, kr.getMatch(0).endPos);
-	    assertEquals(3, kr.getMatch(2).startPos);
-	    assertEquals(7, kr.getMatch(2).endPos);
-	    
-	    ki.addDoc(createFieldDoc0());
-	    ki.commit();
 
-	    // ---- Distance 3 to 3
-	    // Candidate list is empty, but there are secondspans in the other doc
-	    sq = createQuery("s:c","s:d",3,3,true);                
-	    kr = ki.search(sq, (short) 10);
-	    assertEquals((long) 2, kr.getTotalResults());
-	    
-	    ki.close();
-    }
-        
-    /** - Ensure the same document
-     *  - Multiple matches in multiple documents and atomic indices
+
+    /**
+     * - Check candidate list:
+     * - CandidateList should not contain firstspans that are too far
+     * from
+     * the current secondspan
+     * - Add new candidates
      * */
     @Test
-    public void testCase3() throws IOException{
-    	ki = new KrillIndex();
-    	ki.addDoc(createFieldDoc0());
+    public void testCase2 () throws IOException {
+        ki = new KrillIndex();
+        ki.addDoc(createFieldDoc1());
+        ki.commit();
+
+        // ---- Distance 1 to 3
+        // Candidate list for the current secondspan, is empty
+        SpanQuery sq = createQuery("s:c", "s:d", 1, 3, true);
+        kr = ki.search(sq, (short) 10);
+
+        assertEquals((long) 4, kr.getTotalResults());
+        assertEquals(2, kr.getMatch(0).startPos);
+        assertEquals(5, kr.getMatch(0).endPos);
+        assertEquals(3, kr.getMatch(2).startPos);
+        assertEquals(7, kr.getMatch(2).endPos);
+
+        ki.addDoc(createFieldDoc0());
+        ki.commit();
+
+        // ---- Distance 3 to 3
+        // Candidate list is empty, but there are secondspans in the other doc
+        sq = createQuery("s:c", "s:d", 3, 3, true);
+        kr = ki.search(sq, (short) 10);
+        assertEquals((long) 2, kr.getTotalResults());
+
+        ki.close();
+    }
+
+
+    /**
+     * - Ensure the same document
+     * - Multiple matches in multiple documents and atomic indices
+     * */
+    @Test
+    public void testCase3 () throws IOException {
+        ki = new KrillIndex();
+        ki.addDoc(createFieldDoc0());
         ki.commit();
         ki.addDoc(createFieldDoc2());
         ki.addDoc(createFieldDoc1());
         ki.commit();
-        
+
         SpanQuery sq;
-        sq = createQuery("s:c","s:d",3,3,true);    
+        sq = createQuery("s:c", "s:d", 3, 3, true);
         kr = ki.search(sq, (short) 10);
-        
+
         assertEquals(kr.getTotalResults(), 2);
     }
-    
-    /** - Firstspan.next() is in the other doc, but there is
-     *    still a secondspans in the same doc
-     *  - hasMoreFirstSpan and secondspans.next() are true,
-     *    but ensureSameDoc() = false 
-     * */ 
+
+
+    /**
+     * - Firstspan.next() is in the other doc, but there is
+     * still a secondspans in the same doc
+     * - hasMoreFirstSpan and secondspans.next() are true,
+     * but ensureSameDoc() = false
+     * */
     @Test
-    public void testCase4() throws IOException{
-    	ki = new KrillIndex();
-    	ki.addDoc(createFieldDoc0());
+    public void testCase4 () throws IOException {
+        ki = new KrillIndex();
+        ki.addDoc(createFieldDoc0());
         ki.commit();
         ki.addDoc(createFieldDoc2());
         ki.addDoc(createFieldDoc1());
         ki.commit();
-               
+
         // ---- Distance 1 to 2
-        SpanQuery sq = createQuery("s:b","s:c",1,2,true);                
+        SpanQuery sq = createQuery("s:b", "s:c", 1, 2, true);
         kr = ki.search(sq, (short) 10);
-        
+
         assertEquals(kr.getTotalResults(), 3);
         assertEquals(0, kr.getMatch(0).startPos);
-	    assertEquals(3, kr.getMatch(0).endPos);
-	    assertEquals(1, kr.getMatch(1).startPos);
-	    assertEquals(3, kr.getMatch(1).endPos);
-	    assertEquals(1, kr.getMatch(2).startPos);
-	    assertEquals(4, kr.getMatch(2).endPos);
-	    ki.close();      
+        assertEquals(3, kr.getMatch(0).endPos);
+        assertEquals(1, kr.getMatch(1).startPos);
+        assertEquals(3, kr.getMatch(1).endPos);
+        assertEquals(1, kr.getMatch(2).startPos);
+        assertEquals(4, kr.getMatch(2).endPos);
+        ki.close();
     }
-    
-    /** ElementQueries */    
+
+
+    /** ElementQueries */
     @Test
-    public void testCase5() throws IOException{    	
-    	ki = new KrillIndex();
-	    ki.addDoc(createFieldDoc1()); 
-	    ki.commit();    
-	    
-	    // Intersection ---- Distance 0:0
-	    SpanQuery sq = createElementQuery("x","y",0,0,true);                
-	    kr = ki.search(sq, (short) 10);
-    	
-	    assertEquals(kr.getTotalResults(), 4);
-	    assertEquals(2, kr.getMatch(0).startPos);
-	    assertEquals(7, kr.getMatch(0).endPos);
-	    assertEquals(3, kr.getMatch(1).startPos);
-	    assertEquals(7, kr.getMatch(1).endPos);
-	    assertEquals(3, kr.getMatch(2).startPos);
-	    assertEquals(8, kr.getMatch(2).endPos);
-    	
-	    // Next to ---- Distance 1:1
-	    sq = createElementQuery("y","x",1,1,true);                
-	    kr = ki.search(sq, (short) 10);
-	    
-	    assertEquals(kr.getTotalResults(), 1);
-	    assertEquals(5, kr.getMatch(0).startPos);
-	    assertEquals(10, kr.getMatch(0).endPos);
-	    
-	    // ---- Distance 1:2
-	    sq = createElementQuery("y","x",1,2,true);                
-	    kr = ki.search(sq, (short) 10);
-	    
-	    assertEquals(kr.getTotalResults(), 2);	    
-	    assertEquals(4, kr.getMatch(0).startPos);
-	    assertEquals(9, kr.getMatch(0).endPos);
-	    assertEquals(5, kr.getMatch(1).startPos);
-	    assertEquals(10, kr.getMatch(1).endPos);
-	    
-	    // The same element type ---- Distance 1:2
-	    sq = createElementQuery("x","x",1,2,true);
-	    kr = ki.search(sq, (short) 10);
-	    
-	    assertEquals(kr.getTotalResults(), 2);
+    public void testCase5 () throws IOException {
+        ki = new KrillIndex();
+        ki.addDoc(createFieldDoc1());
+        ki.commit();
+
+        // Intersection ---- Distance 0:0
+        SpanQuery sq = createElementQuery("x", "y", 0, 0, true);
+        kr = ki.search(sq, (short) 10);
+
+        assertEquals(kr.getTotalResults(), 4);
+        assertEquals(2, kr.getMatch(0).startPos);
+        assertEquals(7, kr.getMatch(0).endPos);
+        assertEquals(3, kr.getMatch(1).startPos);
+        assertEquals(7, kr.getMatch(1).endPos);
+        assertEquals(3, kr.getMatch(2).startPos);
+        assertEquals(8, kr.getMatch(2).endPos);
+
+        // Next to ---- Distance 1:1
+        sq = createElementQuery("y", "x", 1, 1, true);
+        kr = ki.search(sq, (short) 10);
+
+        assertEquals(kr.getTotalResults(), 1);
+        assertEquals(5, kr.getMatch(0).startPos);
+        assertEquals(10, kr.getMatch(0).endPos);
+
+        // ---- Distance 1:2
+        sq = createElementQuery("y", "x", 1, 2, true);
+        kr = ki.search(sq, (short) 10);
+
+        assertEquals(kr.getTotalResults(), 2);
+        assertEquals(4, kr.getMatch(0).startPos);
+        assertEquals(9, kr.getMatch(0).endPos);
+        assertEquals(5, kr.getMatch(1).startPos);
+        assertEquals(10, kr.getMatch(1).endPos);
+
+        // The same element type ---- Distance 1:2
+        sq = createElementQuery("x", "x", 1, 2, true);
+        kr = ki.search(sq, (short) 10);
+
+        assertEquals(kr.getTotalResults(), 2);
     }
-    
-    /** Skip to */    
+
+
+    /** Skip to */
     @Test
-    public void testCase6() throws IOException{    	
-    	ki = new KrillIndex();
-    	ki.addDoc(createFieldDoc2());
-	    ki.addDoc(createFieldDoc1());
-	    ki.commit();
-	    	    
-	    SpanQuery firstClause = createQuery("s:d", "s:e", 3, 4,true);
-	    kr = ki.search(firstClause, (short) 10); 
-	    
-	    assertEquals(kr.getTotalResults(), 3);
-	    assertEquals(0, kr.getMatch(0).getLocalDocID());
-	    assertEquals(2, kr.getMatch(0).startPos);
-	    assertEquals(6, kr.getMatch(0).endPos);
-	    assertEquals(1, kr.getMatch(1).getLocalDocID());
-	    assertEquals(4, kr.getMatch(1).startPos);
-	    assertEquals(8, kr.getMatch(1).endPos);
-	    assertEquals(4, kr.getMatch(2).startPos);
-	    assertEquals(9, kr.getMatch(2).endPos);	    
-	    
-		// The secondspans is skipped to doc# of the current firstspans
-		SpanQuery sq = new SpanSegmentQuery(
-	    		createQuery("s:d","s:e",3,4,true),
-	    		createElementQuery("y","x",1,2,true)
-		);	    
-	    kr = ki.search(sq, (short) 10);
-	    
-	    assertEquals(kr.getTotalResults(), 1);
-	    assertEquals(4, kr.getMatch(0).startPos);
-	    assertEquals(9, kr.getMatch(0).endPos);	    
+    public void testCase6 () throws IOException {
+        ki = new KrillIndex();
+        ki.addDoc(createFieldDoc2());
+        ki.addDoc(createFieldDoc1());
+        ki.commit();
+
+        SpanQuery firstClause = createQuery("s:d", "s:e", 3, 4, true);
+        kr = ki.search(firstClause, (short) 10);
+
+        assertEquals(kr.getTotalResults(), 3);
+        assertEquals(0, kr.getMatch(0).getLocalDocID());
+        assertEquals(2, kr.getMatch(0).startPos);
+        assertEquals(6, kr.getMatch(0).endPos);
+        assertEquals(1, kr.getMatch(1).getLocalDocID());
+        assertEquals(4, kr.getMatch(1).startPos);
+        assertEquals(8, kr.getMatch(1).endPos);
+        assertEquals(4, kr.getMatch(2).startPos);
+        assertEquals(9, kr.getMatch(2).endPos);
+
+        // The secondspans is skipped to doc# of the current firstspans
+        SpanQuery sq = new SpanSegmentQuery(createQuery("s:d", "s:e", 3, 4,
+                true), createElementQuery("y", "x", 1, 2, true));
+        kr = ki.search(sq, (short) 10);
+
+        assertEquals(kr.getTotalResults(), 1);
+        assertEquals(4, kr.getMatch(0).startPos);
+        assertEquals(9, kr.getMatch(0).endPos);
     }
-    
+
+
     /** Same tokens */
     @Test
-    public void testCase7() throws IOException{    	
-    	ki = new KrillIndex();    	
-	    ki.addDoc(createFieldDoc1());
-	    ki.commit();
-	    	    
-	    SpanQuery sq = createQuery("s:c", "s:c", 1, 2,true);
-	    kr = ki.search(sq, (short) 10); 
-    
-	    assertEquals(kr.getTotalResults(), 3);
+    public void testCase7 () throws IOException {
+        ki = new KrillIndex();
+        ki.addDoc(createFieldDoc1());
+        ki.commit();
+
+        SpanQuery sq = createQuery("s:c", "s:c", 1, 2, true);
+        kr = ki.search(sq, (short) 10);
+
+        assertEquals(kr.getTotalResults(), 3);
         assertEquals(0, kr.getMatch(0).startPos);
-	    assertEquals(3, kr.getMatch(0).endPos);
-	    assertEquals(2, kr.getMatch(1).startPos);
-	    assertEquals(4, kr.getMatch(1).endPos);
-	    assertEquals(3, kr.getMatch(2).startPos);
-	    assertEquals(6, kr.getMatch(2).endPos);
-	    
-	    ki.addDoc(createFieldDoc2());
-	    ki.commit();
-	    
-	    // with order
-	    sq = createQuery("s:e", "s:e", 1, 1,true);
-	    kr = ki.search(sq, (short) 10);
-	    
-	    assertEquals(kr.getTotalResults(), 1);
-	    
-	    // without order
-	    sq = createQuery("s:e", "s:e", 1, 1,false);
-	    kr = ki.search(sq, (short) 10);
-	    
-	    assertEquals(kr.getTotalResults(), 2);
-    }    
-    
+        assertEquals(3, kr.getMatch(0).endPos);
+        assertEquals(2, kr.getMatch(1).startPos);
+        assertEquals(4, kr.getMatch(1).endPos);
+        assertEquals(3, kr.getMatch(2).startPos);
+        assertEquals(6, kr.getMatch(2).endPos);
+
+        ki.addDoc(createFieldDoc2());
+        ki.commit();
+
+        // with order
+        sq = createQuery("s:e", "s:e", 1, 1, true);
+        kr = ki.search(sq, (short) 10);
+
+        assertEquals(kr.getTotalResults(), 1);
+
+        // without order
+        sq = createQuery("s:e", "s:e", 1, 1, false);
+        kr = ki.search(sq, (short) 10);
+
+        assertEquals(kr.getTotalResults(), 2);
+    }
+
 }
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestElementDistanceExclusionIndex.java b/src/test/java/de/ids_mannheim/korap/index/TestElementDistanceExclusionIndex.java
index 0ac7bad..13309d6 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestElementDistanceExclusionIndex.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestElementDistanceExclusionIndex.java
@@ -17,105 +17,96 @@
 import de.ids_mannheim.korap.query.SpanNextQuery;
 
 public class TestElementDistanceExclusionIndex {
-	
+
     Result kr;
-    KrillIndex ki; 
-    
-    private SpanQuery createQuery(String e, String x, String y, int min, int max, boolean isOrdered,
-    		boolean exclusion){
-    	SpanElementQuery eq = new SpanElementQuery("base",e);
-    	SpanDistanceQuery sq = new SpanDistanceQuery(        		
-        		new SpanTermQuery(new Term("base",x)),
-        		new SpanTermQuery(new Term("base",y)),
-        		new DistanceConstraint(eq, min, max, isOrdered, exclusion),
-        		true
-        );
-    	return sq;
+    KrillIndex ki;
+
+
+    private SpanQuery createQuery (String e, String x, String y, int min,
+            int max, boolean isOrdered, boolean exclusion) {
+        SpanElementQuery eq = new SpanElementQuery("base", e);
+        SpanDistanceQuery sq = new SpanDistanceQuery(new SpanTermQuery(
+                new Term("base", x)), new SpanTermQuery(new Term("base", y)),
+                new DistanceConstraint(eq, min, max, isOrdered, exclusion),
+                true);
+        return sq;
     }
-	
-	private FieldDocument createFieldDoc0(){
-    	FieldDocument fd = new FieldDocument();
+
+
+    private FieldDocument createFieldDoc0 () {
+        FieldDocument fd = new FieldDocument();
         fd.addString("ID", "doc-0");
-        fd.addTV("base",
-            "ceccdcdecd",             
-            "[(0-1)s:c|_1#0-1|<>:s#0-1$<i>1]" +
-            "[(1-2)s:e|_2#1-2|<>:s#1-2$<i>2]" +         
-            "[(2-3)s:c|_3#2-3|<>:s#2-4$<i>4]" +
-            "[(3-4)s:c|_4#3-4]" + 
-            "[(4-5)s:d|_5#4-5|<>:s#4-6$<i>6]" +
-            "[(5-6)s:c|_6#5-6]" +
-            "[(6-7)s:d|_7#6-7|<>:s#6-7$<i>7]" +
-            "[(7-8)s:e|_8#7-8|<>:s#7-9$<i>9]" + 
-            "[(8-9)s:c|_9#8-9]" + 
-            "[(9-10)s:d|_10#9-10]");
+        fd.addTV("base", "ceccdcdecd", "[(0-1)s:c|_1#0-1|<>:s#0-1$<i>1]"
+                + "[(1-2)s:e|_2#1-2|<>:s#1-2$<i>2]"
+                + "[(2-3)s:c|_3#2-3|<>:s#2-4$<i>4]" + "[(3-4)s:c|_4#3-4]"
+                + "[(4-5)s:d|_5#4-5|<>:s#4-6$<i>6]" + "[(5-6)s:c|_6#5-6]"
+                + "[(6-7)s:d|_7#6-7|<>:s#6-7$<i>7]"
+                + "[(7-8)s:e|_8#7-8|<>:s#7-9$<i>9]" + "[(8-9)s:c|_9#8-9]"
+                + "[(9-10)s:d|_10#9-10]");
         return fd;
     }
-    
-	private FieldDocument createFieldDoc1() {
-    	FieldDocument fd = new FieldDocument();
+
+
+    private FieldDocument createFieldDoc1 () {
+        FieldDocument fd = new FieldDocument();
         fd.addString("ID", "doc-1");
-        fd.addTV("base",
-            "eedadaeed",             
-            "[(0-1)s:e|_1#0-1|<>:s#0-1$<i>1]" +
-            "[(1-2)s:e|_2#1-2|<>:s#1-2$<i>2]" +             
-            "[(2-3)s:d|_3#2-3|<>:s#2-4$<i>4]" +
-            "[(3-4)s:a|_4#3-4]" + 
-            "[(4-5)s:d|_5#4-5|<>:s#4-7$<i>6]" +             
-            "[(5-6)s:a|_6#5-6]" +
-            "[(6-7)s:e|_7#6-7|<>:s#6-7$<i>9]" +
-            "[(7-8)s:e|_8#7-8]" + 
-            "[(8-9)s:d|_9#8-9]");
-        return fd;
-	}
-	
-	private FieldDocument createFieldDoc2(){
-    	FieldDocument fd = new FieldDocument();
-        fd.addString("ID", "doc-");
-        fd.addTV("base",
-            "dcacacdac",             
-            "[(0-1)s:d|_1#0-1|<>:s#0-1$<i>1]" +
-            "[(1-2)s:c|_2#1-2|<>:s#1-2$<i>2]" +         
-            "[(2-3)s:a|_3#2-3|<>:s#2-4$<i>4]" +
-            "[(3-4)s:c|_4#3-4]" + 
-            "[(4-5)s:a|_5#4-5|<>:s#4-6$<i>6]" +
-            "[(5-6)s:c|_6#5-6]" +
-            "[(6-7)s:d|_7#6-7|<>:s#6-7$<i>7]" +
-            "[(7-8)s:a|_8#7-8|<>:s#7-9$<i>9]" + 
-            "[(8-9)s:c|_9#8-9]");
+        fd.addTV("base", "eedadaeed", "[(0-1)s:e|_1#0-1|<>:s#0-1$<i>1]"
+                + "[(1-2)s:e|_2#1-2|<>:s#1-2$<i>2]"
+                + "[(2-3)s:d|_3#2-3|<>:s#2-4$<i>4]" + "[(3-4)s:a|_4#3-4]"
+                + "[(4-5)s:d|_5#4-5|<>:s#4-7$<i>6]" + "[(5-6)s:a|_6#5-6]"
+                + "[(6-7)s:e|_7#6-7|<>:s#6-7$<i>9]" + "[(7-8)s:e|_8#7-8]"
+                + "[(8-9)s:d|_9#8-9]");
         return fd;
     }
-	
-    /** Distance Zero, unordered
-     * 	There is a secondspan on the right side
+
+
+    private FieldDocument createFieldDoc2 () {
+        FieldDocument fd = new FieldDocument();
+        fd.addString("ID", "doc-");
+        fd.addTV("base", "dcacacdac", "[(0-1)s:d|_1#0-1|<>:s#0-1$<i>1]"
+                + "[(1-2)s:c|_2#1-2|<>:s#1-2$<i>2]"
+                + "[(2-3)s:a|_3#2-3|<>:s#2-4$<i>4]" + "[(3-4)s:c|_4#3-4]"
+                + "[(4-5)s:a|_5#4-5|<>:s#4-6$<i>6]" + "[(5-6)s:c|_6#5-6]"
+                + "[(6-7)s:d|_7#6-7|<>:s#6-7$<i>7]"
+                + "[(7-8)s:a|_8#7-8|<>:s#7-9$<i>9]" + "[(8-9)s:c|_9#8-9]");
+        return fd;
+    }
+
+
+    /**
+     * Distance Zero, unordered
+     * There is a secondspan on the right side
      * */
     @Test
-    public void testCase1() throws IOException{
-    	ki = new KrillIndex();
-        ki.addDoc(createFieldDoc0()); 
+    public void testCase1 () throws IOException {
+        ki = new KrillIndex();
+        ki.addDoc(createFieldDoc0());
         ki.commit();
         SpanQuery sq;
-        sq = createQuery("s","s:d","s:c",0,0,false,true);                
+        sq = createQuery("s", "s:d", "s:c", 0, 0, false, true);
         kr = ki.search(sq, (short) 10);
         assertEquals(kr.getTotalResults(), 1);
         assertEquals(6, kr.getMatch(0).startPos);
         assertEquals(7, kr.getMatch(0).endPos);
     }
-    
-    /** There is another firstspan within max distance
-     * 	Unordered
+
+
+    /**
+     * There is another firstspan within max distance
+     * Unordered
      * */
     @Test
-    public void testCase2() throws IOException{
-    	ki = new KrillIndex();
-        ki.addDoc(createFieldDoc0()); 
+    public void testCase2 () throws IOException {
+        ki = new KrillIndex();
+        ki.addDoc(createFieldDoc0());
         ki.commit();
-        SpanQuery sq;       
-		        
-	    sq = createQuery("s","s:c","s:d",0,0,false,true);                
-	    kr = ki.search(sq, (short) 10);
-	    
-	    assertEquals(kr.getTotalResults(), 4);
-	    assertEquals(0, kr.getMatch(0).startPos);
+        SpanQuery sq;
+
+        sq = createQuery("s", "s:c", "s:d", 0, 0, false, true);
+        kr = ki.search(sq, (short) 10);
+
+        assertEquals(kr.getTotalResults(), 4);
+        assertEquals(0, kr.getMatch(0).startPos);
         assertEquals(1, kr.getMatch(0).endPos);
         assertEquals(2, kr.getMatch(1).startPos);
         assertEquals(3, kr.getMatch(1).endPos);
@@ -124,24 +115,26 @@
         assertEquals(8, kr.getMatch(3).startPos);
         assertEquals(9, kr.getMatch(3).endPos);
     }
-    
-    /** Distance 0-1, ordered, unordered
+
+
+    /**
+     * Distance 0-1, ordered, unordered
      * */
     @Test
-    public void testCase3() throws IOException{
-    	ki = new KrillIndex();
-        ki.addDoc(createFieldDoc0()); 
+    public void testCase3 () throws IOException {
+        ki = new KrillIndex();
+        ki.addDoc(createFieldDoc0());
         ki.commit();
         SpanQuery sq;
         // unordered
-        sq = createQuery("s","s:c","s:e",0,1,false,true);                
+        sq = createQuery("s", "s:c", "s:e", 0, 1, false, true);
         kr = ki.search(sq, (short) 10);
         assertEquals(kr.getTotalResults(), 1);
         assertEquals(5, kr.getMatch(0).startPos);
         assertEquals(6, kr.getMatch(0).endPos);
-        
+
         //ordered 
-        sq = createQuery("s","s:c","s:e",0,1,true,true);                
+        sq = createQuery("s", "s:c", "s:e", 0, 1, true, true);
         kr = ki.search(sq, (short) 10);
         assertEquals(kr.getTotalResults(), 3);
         assertEquals(2, kr.getMatch(0).startPos);
@@ -149,58 +142,62 @@
         assertEquals(3, kr.getMatch(1).startPos);
         assertEquals(4, kr.getMatch(1).endPos);
     }
-    
-	/** Multiple documents, ordered
-	 * 	No more secondspans, but there is still a firstspan
-	 * */
-	@Test
-    public void testCase4() throws IOException{
-    	ki = new KrillIndex();
-    	ki.addDoc(createFieldDoc0());
-        ki.addDoc(createFieldDoc1()); 
+
+
+    /**
+     * Multiple documents, ordered
+     * No more secondspans, but there is still a firstspan
+     * */
+    @Test
+    public void testCase4 () throws IOException {
+        ki = new KrillIndex();
+        ki.addDoc(createFieldDoc0());
+        ki.addDoc(createFieldDoc1());
         ki.commit();
         SpanQuery sq;
-        
-        sq = createQuery("s","s:d","s:e",1,1,true,true);                
+
+        sq = createQuery("s", "s:d", "s:e", 1, 1, true, true);
         kr = ki.search(sq, (short) 10);
-        
+
         assertEquals(kr.getTotalResults(), 3);
-	    assertEquals(4, kr.getMatch(0).startPos);
+        assertEquals(4, kr.getMatch(0).startPos);
         assertEquals(5, kr.getMatch(0).endPos);
         assertEquals(1, kr.getMatch(1).getLocalDocID());
         assertEquals(2, kr.getMatch(1).startPos);
         assertEquals(3, kr.getMatch(1).endPos);
         assertEquals(8, kr.getMatch(2).startPos);
         assertEquals(9, kr.getMatch(2).endPos);
-	}
-    
-	/** Skip to
-	 * */
-	@Test
-    public void testCase5() throws IOException{
-    	ki = new KrillIndex();
-    	ki.addDoc(createFieldDoc0());
+    }
+
+
+    /**
+     * Skip to
+     * */
+    @Test
+    public void testCase5 () throws IOException {
+        ki = new KrillIndex();
+        ki.addDoc(createFieldDoc0());
         ki.addDoc(createFieldDoc1());
         ki.addDoc(createFieldDoc0());
-        ki.addDoc(createFieldDoc2());        
+        ki.addDoc(createFieldDoc2());
         ki.commit();
-        
-        SpanQuery sq = createQuery("s","s:c","s:d",1,1,false,true);
+
+        SpanQuery sq = createQuery("s", "s:c", "s:d", 1, 1, false, true);
         kr = ki.search(sq, (short) 10);
 
-        assertEquals(kr.getTotalResults(), 3);        
+        assertEquals(kr.getTotalResults(), 3);
         assertEquals(3, kr.getMatch(2).getLocalDocID());
         assertEquals(3, kr.getMatch(2).startPos);
         assertEquals(4, kr.getMatch(2).endPos);
-        
+
         sq = new SpanNextQuery(
-        		createQuery("s","s:c","s:d",1,1,false,true), 
-        		new SpanTermQuery(new Term("base", "s:a")));
-        
+                createQuery("s", "s:c", "s:d", 1, 1, false, true),
+                new SpanTermQuery(new Term("base", "s:a")));
+
         kr = ki.search(sq, (short) 10);
         assertEquals(kr.getTotalResults(), 1);
         assertEquals(3, kr.getMatch(0).getLocalDocID());
         assertEquals(3, kr.getMatch(0).startPos);
         assertEquals(5, kr.getMatch(0).endPos);
-	}
+    }
 }
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestElementDistanceIndex.java b/src/test/java/de/ids_mannheim/korap/index/TestElementDistanceIndex.java
index 8b52266..4ee6b09 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestElementDistanceIndex.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestElementDistanceIndex.java
@@ -29,212 +29,208 @@
 
 @RunWith(JUnit4.class)
 public class TestElementDistanceIndex {
-	
-	Result kr;
-    KrillIndex ki;   
-    
-	private FieldDocument createFieldDoc0() {
-    	FieldDocument fd = new FieldDocument();
+
+    Result kr;
+    KrillIndex ki;
+
+
+    private FieldDocument createFieldDoc0 () {
+        FieldDocument fd = new FieldDocument();
         fd.addString("ID", "doc-0");
-        fd.addTV("base",
-            "text",             
-            "[(0-1)s:b|s:c|_1#0-1|<>:s#0-1$<i>1]" +
-            "[(1-2)s:b|_2#1-2]" +             
-            "[(2-3)s:c|_3#2-3|<>:s#2-3$<i>3]" +
-            "[(3-4)s:b|_4#3-4|<>:s#3-4$<i>4]" + 
-            "[(4-5)s:b|_5#4-5|<>:s#4-5$<i>5]" +             
-            "[(5-6)s:b|_6#5-6]" +
-            "[(6-7)s:c|_7#6-7]");
+        fd.addTV("base", "text", "[(0-1)s:b|s:c|_1#0-1|<>:s#0-1$<i>1]"
+                + "[(1-2)s:b|_2#1-2]" + "[(2-3)s:c|_3#2-3|<>:s#2-3$<i>3]"
+                + "[(3-4)s:b|_4#3-4|<>:s#3-4$<i>4]"
+                + "[(4-5)s:b|_5#4-5|<>:s#4-5$<i>5]" + "[(5-6)s:b|_6#5-6]"
+                + "[(6-7)s:c|_7#6-7]");
         return fd;
-	}
-		
-	private FieldDocument createFieldDoc1() {
-    	FieldDocument fd = new FieldDocument();
+    }
+
+
+    private FieldDocument createFieldDoc1 () {
+        FieldDocument fd = new FieldDocument();
         fd.addString("ID", "doc-1");
-        fd.addTV("base",
-            "text",             
-            "[(0-1)s:e|_1#0-1|<>:s#0-2$<i>1]" +
-            "[(1-2)s:c|s:b|_2#1-2|<>:s#1-2$<i>2]" +             
-            "[(2-3)s:e|_3#2-3|<>:s#2-3$<i>3]" +
-            "[(3-4)s:b|_4#3-4|<>:s#3-4$<i>4]" + 
-            "[(4-5)s:d|_5#4-5|<>:s#4-5$<i>5]" +             
-            "[(5-6)s:c|_6#5-6|<>:s#5-6$<i>6]");
+        fd.addTV("base", "text", "[(0-1)s:e|_1#0-1|<>:s#0-2$<i>1]"
+                + "[(1-2)s:c|s:b|_2#1-2|<>:s#1-2$<i>2]"
+                + "[(2-3)s:e|_3#2-3|<>:s#2-3$<i>3]"
+                + "[(3-4)s:b|_4#3-4|<>:s#3-4$<i>4]"
+                + "[(4-5)s:d|_5#4-5|<>:s#4-5$<i>5]"
+                + "[(5-6)s:c|_6#5-6|<>:s#5-6$<i>6]");
         return fd;
-	}
-	
-	private FieldDocument createFieldDoc2() {
-    	FieldDocument fd = new FieldDocument();
+    }
+
+
+    private FieldDocument createFieldDoc2 () {
+        FieldDocument fd = new FieldDocument();
         fd.addString("ID", "doc-2");
-        fd.addTV("base",
-            "text",             
-            "[(0-1)s:b|_1#0-1|<>:p#0-2$<i>1]" +
-            "[(1-2)s:b|_2#1-2]" +             
-            "[(2-3)s:b|_3#2-3|<>:p#2-3$<i>3]" +
-            "[(3-4)s:d|_4#3-4|<>:p#3-4$<i>4]" + 
-            "[(4-5)s:d|_5#4-5|<>:p#4-5$<i>5]" +             
-            "[(5-6)s:d|_6#5-6]");
+        fd.addTV("base", "text", "[(0-1)s:b|_1#0-1|<>:p#0-2$<i>1]"
+                + "[(1-2)s:b|_2#1-2]" + "[(2-3)s:b|_3#2-3|<>:p#2-3$<i>3]"
+                + "[(3-4)s:d|_4#3-4|<>:p#3-4$<i>4]"
+                + "[(4-5)s:d|_5#4-5|<>:p#4-5$<i>5]" + "[(5-6)s:d|_6#5-6]");
         return fd;
-	}
-	
-	private FieldDocument createFieldDoc3() {
-    	FieldDocument fd = new FieldDocument();
+    }
+
+
+    private FieldDocument createFieldDoc3 () {
+        FieldDocument fd = new FieldDocument();
         fd.addString("ID", "doc-3");
-        fd.addTV("base",
-            "text",             
-            "[(0-1)s:b|_1#0-1|<>:s#0-2$<i>1]" +
-            "[(1-2)s:d|_2#1-2]" +             
-            "[(2-3)s:b|_3#2-3|<>:s#2-3$<i>3]" +
-            "[(3-4)s:c|_4#3-4|<>:s#3-4$<i>4]" + 
-            "[(4-5)s:d|_5#4-5|<>:s#4-5$<i>5]" +             
-            "[(5-6)s:d|_6#5-6]");
+        fd.addTV("base", "text", "[(0-1)s:b|_1#0-1|<>:s#0-2$<i>1]"
+                + "[(1-2)s:d|_2#1-2]" + "[(2-3)s:b|_3#2-3|<>:s#2-3$<i>3]"
+                + "[(3-4)s:c|_4#3-4|<>:s#3-4$<i>4]"
+                + "[(4-5)s:d|_5#4-5|<>:s#4-5$<i>5]" + "[(5-6)s:d|_6#5-6]");
         return fd;
-	}
-	
-	public SpanQuery createQuery(String elementType, String x, String y, 
-			int min, int max, boolean isOrdered){
-		
-		SpanElementQuery e = new SpanElementQuery("base", elementType);
-		return new SpanDistanceQuery(        		 
-        		new SpanTermQuery(new Term("base",x)), 
-        		new SpanTermQuery(new Term("base",y)), 
-        		new DistanceConstraint( e, min, max, isOrdered, false),
-        		true);
-	}
-	
-	
-	/**	Multiple documents
-	 * 	Ensure terms and elements are in the same doc
-	 * 	Ensure terms are in elements
-	 *  Check filter candidate list
-	 * */
-	@Test
-	public void testCase1() throws IOException{
-		//System.out.println("testCase1");
-		ki = new KrillIndex();
-        ki.addDoc(createFieldDoc0()); 
-        ki.addDoc(createFieldDoc1());        
+    }
+
+
+    public SpanQuery createQuery (String elementType, String x, String y,
+            int min, int max, boolean isOrdered) {
+
+        SpanElementQuery e = new SpanElementQuery("base", elementType);
+        return new SpanDistanceQuery(new SpanTermQuery(new Term("base", x)),
+                new SpanTermQuery(new Term("base", y)), new DistanceConstraint(
+                        e, min, max, isOrdered, false), true);
+    }
+
+
+    /**
+     * Multiple documents
+     * Ensure terms and elements are in the same doc
+     * Ensure terms are in elements
+     * Check filter candidate list
+     * */
+    @Test
+    public void testCase1 () throws IOException {
+        //System.out.println("testCase1");
+        ki = new KrillIndex();
+        ki.addDoc(createFieldDoc0());
+        ki.addDoc(createFieldDoc1());
         ki.commit();
-        
-        SpanQuery sq;        
-        sq = createQuery("s", "s:b", "s:c", 0, 2,true);        
+
+        SpanQuery sq;
+        sq = createQuery("s", "s:b", "s:c", 0, 2, true);
         kr = ki.search(sq, (short) 10);
-        
+
         assertEquals(kr.getTotalResults(), 4);
         assertEquals(0, kr.getMatch(0).startPos);
         assertEquals(1, kr.getMatch(0).endPos);
         assertEquals(0, kr.getMatch(1).startPos);
-        assertEquals(3, kr.getMatch(1).endPos);         
-	}
-	
-	/** Ensure terms and elements are in the same doc
-	 * */
-	@Test
-	public void testCase2() throws IOException{
-		//System.out.println("testCase2");
-		ki = new KrillIndex();
-        ki.addDoc(createFieldDoc0()); 
+        assertEquals(3, kr.getMatch(1).endPos);
+    }
+
+
+    /**
+     * Ensure terms and elements are in the same doc
+     * */
+    @Test
+    public void testCase2 () throws IOException {
+        //System.out.println("testCase2");
+        ki = new KrillIndex();
+        ki.addDoc(createFieldDoc0());
         ki.addDoc(createFieldDoc1());
         ki.addDoc(createFieldDoc2());
         ki.commit();
-        
+
         SpanQuery sq;
-        sq = createQuery("p", "s:b", "s:d", 1, 1,true);
+        sq = createQuery("p", "s:b", "s:d", 1, 1, true);
         kr = ki.search(sq, (short) 10);
-        
+
         assertEquals(kr.getTotalResults(), 1);
         assertEquals(2, kr.getMatch(0).getLocalDocID());
         assertEquals(2, kr.getMatch(0).startPos);
         assertEquals(4, kr.getMatch(0).endPos);
-        
-	}	
-	
-	/** Skip to */
-	@Test
-	public void testCase3() throws IOException{
-		//System.out.println("testCase3");
-		ki = new KrillIndex();
-		ki.addDoc(createFieldDoc0());
+
+    }
+
+
+    /** Skip to */
+    @Test
+    public void testCase3 () throws IOException {
+        //System.out.println("testCase3");
+        ki = new KrillIndex();
+        ki.addDoc(createFieldDoc0());
         ki.addDoc(createFieldDoc1());
         ki.addDoc(createFieldDoc3());
         ki.commit();
-        
+
         SpanQuery sq, edq;
-        edq = createQuery("s", "s:b", "s:c", 1, 1,true);
-		
-        sq = new SpanNextQuery(edq, 
-        		new SpanTermQuery(new Term("base", "s:d")));
-        
+        edq = createQuery("s", "s:b", "s:c", 1, 1, true);
+
+        sq = new SpanNextQuery(edq, new SpanTermQuery(new Term("base", "s:d")));
+
         kr = ki.search(sq, (short) 10);
-        
+
         assertEquals(kr.getTotalResults(), 1);
         assertEquals(2, kr.getMatch(0).getLocalDocID());
         assertEquals(2, kr.getMatch(0).startPos);
         assertEquals(5, kr.getMatch(0).endPos);
-        
-	}
-	
-	/** Same tokens in different elements */
-	@Test
-	public void testCase4() throws IOException{
-		//System.out.println("testCase4");
-		ki = new KrillIndex();
-		ki.addDoc(createFieldDoc0());       
+
+    }
+
+
+    /** Same tokens in different elements */
+    @Test
+    public void testCase4 () throws IOException {
+        //System.out.println("testCase4");
+        ki = new KrillIndex();
+        ki.addDoc(createFieldDoc0());
         ki.commit();
-        
+
         SpanQuery sq;
-        sq = createQuery("s", "s:b", "s:b", 1, 2,true);
+        sq = createQuery("s", "s:b", "s:b", 1, 2, true);
         kr = ki.search(sq, (short) 10);
-    		
+
         assertEquals(kr.getTotalResults(), 2);
         assertEquals(0, kr.getMatch(0).startPos);
         assertEquals(4, kr.getMatch(0).endPos);
         assertEquals(3, kr.getMatch(1).startPos);
         assertEquals(5, kr.getMatch(1).endPos);
-        
+
     }
-	
-	/** Test query from json */
-	@Test
-	public void testCase5() throws Exception{
-		//System.out.println("testCase4");
-		ki = new KrillIndex();
-		ki.addDoc(getClass().getResourceAsStream("/wiki/00001.json.gz"),true);       
+
+
+    /** Test query from json */
+    @Test
+    public void testCase5 () throws Exception {
+        //System.out.println("testCase4");
+        ki = new KrillIndex();
+        ki.addDoc(getClass().getResourceAsStream("/wiki/00001.json.gz"), true);
         ki.commit();
-        
-        InputStream is = getClass().getResourceAsStream("/queries/cosmas1.json");        
-        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
+
+        InputStream is = getClass()
+                .getResourceAsStream("/queries/cosmas1.json");
+        BufferedReader bufferedReader = new BufferedReader(
+                new InputStreamReader(is, "UTF-8"));
         StringBuilder sb = new StringBuilder();
         String json;
-        while((json = bufferedReader.readLine()) != null){
+        while ((json = bufferedReader.readLine()) != null) {
             sb.append(json);
-        }                
+        }
         json = sb.toString();
-        
+
         SpanQueryWrapper sqwi;
-        try {    	    
-    	    sqwi = new KrillQuery("tokens").fromJson(json);
-    	}
-    	catch (QueryException e) {
-    	    fail(e.getMessage());
-    	    sqwi = new QueryBuilder("tokens").seg("???");
-    	};        
-    	
-        
+        try {
+            sqwi = new KrillQuery("tokens").fromJson(json);
+        }
+        catch (QueryException e) {
+            fail(e.getMessage());
+            sqwi = new QueryBuilder("tokens").seg("???");
+        };
+
+
         SpanQuery sq;
         sq = sqwi.toQuery();
         kr = ki.search(sq, (short) 10);
-    	
+
         assertEquals((long) 3, kr.getTotalResults());
         assertEquals(14, kr.getMatch(0).startPos);
         assertEquals(19, kr.getMatch(0).endPos);
         assertEquals(30, kr.getMatch(1).startPos);
         assertEquals(33, kr.getMatch(1).endPos);
-        
-      /*  for (Match km : kr.getMatches()){		
-        	System.out.println(km.getStartPos() +","+km.getEndPos()+" "
-        			+km.getSnippetBrackets());
-        }*/
+
+        /*  for (Match km : kr.getMatches()){		
+          	System.out.println(km.getStartPos() +","+km.getEndPos()+" "
+          			+km.getSnippetBrackets());
+          }*/
     }
-	
-		
+
+
 }
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestElementIndex.java b/src/test/java/de/ids_mannheim/korap/index/TestElementIndex.java
index cf869c1..b2ec752 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestElementIndex.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestElementIndex.java
@@ -31,383 +31,323 @@
 
     @Test
     public void indexExample1 () throws IOException {
-	KrillIndex ki = new KrillIndex();
+        KrillIndex ki = new KrillIndex();
 
-	// <a>x<a>y<a>zhij</a>hij</a>hij</a>hij</a>
-	FieldDocument fd = new FieldDocument();
-	fd.addTV("base",
-		 "x  y  z  h  i  j  h  i  j  h  i  j  ",
-		 "[(0-3)s:x|<>:a#0-3$<i>12]" +
-		 "[(3-6)s:y|<>:a#3-6$<i>9]" +
-		 "[(6-9)s:z|<>:a#6-9$<i>6]" +
-		 "[(9-12)s:h]" +
-		 "[(12-15)s:i]" +
-		 "[(15-18)s:j]" +
-		 "[(18-21)s:h]" +
-		 "[(21-24)s:i]" +
-		 "[(24-27)s:j]" +
-		 "[(27-30)s:h]" +
-		 "[(30-33)s:i]" +
-		 "[(33-36)s:j]");
-	ki.addDoc(fd);
+        // <a>x<a>y<a>zhij</a>hij</a>hij</a>hij</a>
+        FieldDocument fd = new FieldDocument();
+        fd.addTV("base", "x  y  z  h  i  j  h  i  j  h  i  j  ",
+                "[(0-3)s:x|<>:a#0-3$<i>12]" + "[(3-6)s:y|<>:a#3-6$<i>9]"
+                        + "[(6-9)s:z|<>:a#6-9$<i>6]" + "[(9-12)s:h]"
+                        + "[(12-15)s:i]" + "[(15-18)s:j]" + "[(18-21)s:h]"
+                        + "[(21-24)s:i]" + "[(24-27)s:j]" + "[(27-30)s:h]"
+                        + "[(30-33)s:i]" + "[(33-36)s:j]");
+        ki.addDoc(fd);
 
-	// <a>x<a>y<a>zcde</a>cde</a>cde</a>cde</a>
-	fd = new FieldDocument();
-	fd.addTV("base",
-		 "x  y  z  c  d  e  c  d  e  c  d  e  ",
-		 "[(0-3)s:x|<>:a#0-3$<i>12]" +
-		 "[(3-6)s:y|<>:a#3-6$<i>9]" +
-		 "[(6-9)s:z|<>:a#6-9$<i>6]" +
-		 "[(9-12)s:c]" +
-		 "[(12-15)s:d]" +
-		 "[(15-18)s:e]" +
-		 "[(18-21)s:c]" +
-		 "[(21-24)s:d]" +
-		 "[(24-27)s:e]" +
-		 "[(27-30)s:c]" +
-		 "[(30-33)s:d]" +
-		 "[(33-36)s:e]");
-	ki.addDoc(fd);
+        // <a>x<a>y<a>zcde</a>cde</a>cde</a>cde</a>
+        fd = new FieldDocument();
+        fd.addTV("base", "x  y  z  c  d  e  c  d  e  c  d  e  ",
+                "[(0-3)s:x|<>:a#0-3$<i>12]" + "[(3-6)s:y|<>:a#3-6$<i>9]"
+                        + "[(6-9)s:z|<>:a#6-9$<i>6]" + "[(9-12)s:c]"
+                        + "[(12-15)s:d]" + "[(15-18)s:e]" + "[(18-21)s:c]"
+                        + "[(21-24)s:d]" + "[(24-27)s:e]" + "[(27-30)s:c]"
+                        + "[(30-33)s:d]" + "[(33-36)s:e]");
+        ki.addDoc(fd);
 
-	// Save documents
-	ki.commit();
+        // Save documents
+        ki.commit();
 
-	assertEquals(2, ki.numberOf("documents"));
+        assertEquals(2, ki.numberOf("documents"));
 
-	SpanQuery sq = new SpanElementQuery("base", "a");
+        SpanQuery sq = new SpanElementQuery("base", "a");
 
-	Result kr = ki.search(sq, (short) 10);
+        Result kr = ki.search(sq, (short) 10);
 
-	assertEquals("totalResults", kr.getTotalResults(), 6);
+        assertEquals("totalResults", kr.getTotalResults(), 6);
 
-	assertEquals("StartPos (0)", 0, kr.getMatch(0).startPos);
-	assertEquals("EndPos (0)", 12, kr.getMatch(0).endPos);
-	assertEquals("StartPos (1)", 1, kr.getMatch(1).startPos);
-	assertEquals("EndPos (1)", 9, kr.getMatch(1).endPos);
-	assertEquals("StartPos (2)", 2, kr.getMatch(2).startPos);
-	assertEquals("EndPos (2)", 6, kr.getMatch(2).endPos);
+        assertEquals("StartPos (0)", 0, kr.getMatch(0).startPos);
+        assertEquals("EndPos (0)", 12, kr.getMatch(0).endPos);
+        assertEquals("StartPos (1)", 1, kr.getMatch(1).startPos);
+        assertEquals("EndPos (1)", 9, kr.getMatch(1).endPos);
+        assertEquals("StartPos (2)", 2, kr.getMatch(2).startPos);
+        assertEquals("EndPos (2)", 6, kr.getMatch(2).endPos);
 
-	assertEquals("StartPos (0)", 0, kr.getMatch(3).startPos);
-	assertEquals("EndPos (0)", 12, kr.getMatch(3).endPos);
-	assertEquals("StartPos (1)", 1, kr.getMatch(4).startPos);
-	assertEquals("EndPos (1)", 9, kr.getMatch(4).endPos);
-	assertEquals("StartPos (2)", 2, kr.getMatch(5).startPos);
-	assertEquals("EndPos (2)", 6, kr.getMatch(5).endPos);
+        assertEquals("StartPos (0)", 0, kr.getMatch(3).startPos);
+        assertEquals("EndPos (0)", 12, kr.getMatch(3).endPos);
+        assertEquals("StartPos (1)", 1, kr.getMatch(4).startPos);
+        assertEquals("EndPos (1)", 9, kr.getMatch(4).endPos);
+        assertEquals("StartPos (2)", 2, kr.getMatch(5).startPos);
+        assertEquals("EndPos (2)", 6, kr.getMatch(5).endPos);
 
-	// System.err.println(kr.toJSON());
+        // System.err.println(kr.toJSON());
     };
 
+
     @Test
     public void indexExample2 () throws IOException {
-	KrillIndex ki = new KrillIndex();
+        KrillIndex ki = new KrillIndex();
 
-	// <a><a><a>h</a>hhij</a>hij</a>hij</a>
-	FieldDocument fd = new FieldDocument();
-	fd.addTV("base",
-		 "h  h        i  j   h  i  j  h  i  j  ",
-		 "[(0-3)s:h|<>:a#0-27$<i>6|<>:a#0-18$<i>3|<>:a#0-36$<i>9]" +
-		 "[(3-6)s:h]" +
-		 "[(12-15)s:i]" +
-		 "[(15-18)s:j]" +
-		 "[(18-21)s:h]" +
-		 "[(21-24)s:i]" +
-		 "[(24-27)s:j]" +
-		 "[(27-30)s:h]" +
-		 "[(30-33)s:i]" +
-		 "[(33-36)s:j]");
-	ki.addDoc(fd);
+        // <a><a><a>h</a>hhij</a>hij</a>hij</a>
+        FieldDocument fd = new FieldDocument();
+        fd.addTV("base", "h  h        i  j   h  i  j  h  i  j  ",
+                "[(0-3)s:h|<>:a#0-27$<i>6|<>:a#0-18$<i>3|<>:a#0-36$<i>9]"
+                        + "[(3-6)s:h]" + "[(12-15)s:i]" + "[(15-18)s:j]"
+                        + "[(18-21)s:h]" + "[(21-24)s:i]" + "[(24-27)s:j]"
+                        + "[(27-30)s:h]" + "[(30-33)s:i]" + "[(33-36)s:j]");
+        ki.addDoc(fd);
 
-	// Save documents
-	ki.commit();
+        // Save documents
+        ki.commit();
 
-	assertEquals(1, ki.numberOf("documents"));
+        assertEquals(1, ki.numberOf("documents"));
 
-	SpanQuery sq = new SpanElementQuery("base", "a");
+        SpanQuery sq = new SpanElementQuery("base", "a");
 
-	Result kr = ki.search(sq, (short) 10);
+        Result kr = ki.search(sq, (short) 10);
 
-	assertEquals("totalResults", kr.getTotalResults(), 3);
-	assertEquals("StartPos (0)", 0, kr.getMatch(0).startPos);
-	assertEquals("EndPos (0)", 3, kr.getMatch(0).endPos);
-	assertEquals("StartPos (1)", 0, kr.getMatch(1).startPos);
-	assertEquals("EndPos (1)", 6, kr.getMatch(1).endPos);
-	assertEquals("StartPos (2)", 0, kr.getMatch(2).startPos);
-	assertEquals("EndPos (2)", 9, kr.getMatch(2).endPos);
+        assertEquals("totalResults", kr.getTotalResults(), 3);
+        assertEquals("StartPos (0)", 0, kr.getMatch(0).startPos);
+        assertEquals("EndPos (0)", 3, kr.getMatch(0).endPos);
+        assertEquals("StartPos (1)", 0, kr.getMatch(1).startPos);
+        assertEquals("EndPos (1)", 6, kr.getMatch(1).endPos);
+        assertEquals("StartPos (2)", 0, kr.getMatch(2).startPos);
+        assertEquals("EndPos (2)", 9, kr.getMatch(2).endPos);
     };
 
+
     @Test
     public void indexExample3 () throws IOException {
-	KrillIndex ki = new KrillIndex();
+        KrillIndex ki = new KrillIndex();
 
-	// <a><a><a>u</a></a></a>
-	FieldDocument fd = new FieldDocument();
-	fd.addTV("base",
-		 "xyz",
-		 "[(0-3)s:xyz|<>:a#0-3$<i>0|<>:a#0-3$<i>0|<>:a#0-3$<i>0|<>:b#0-3$<i>0]");
-	ki.addDoc(fd);
+        // <a><a><a>u</a></a></a>
+        FieldDocument fd = new FieldDocument();
+        fd.addTV("base", "xyz",
+                "[(0-3)s:xyz|<>:a#0-3$<i>0|<>:a#0-3$<i>0|<>:a#0-3$<i>0|<>:b#0-3$<i>0]");
+        ki.addDoc(fd);
 
-	// <a><b>x<a>y<a>zcde</a>cde</a>cde</b></a>
-	fd = new FieldDocument();
-	fd.addTV("base",
-		 "x  y  z  c  d  e  c  d  e  c  d  e  ",
-		 "[(0-3)s:x|<>:a#0-36$<i>12|<>:b#0-36$<i>12]" +
-		 "[(3-6)s:y|<>:a#3-27$<i>9]" +
-		 "[(6-9)s:z|<>:a#6-18$<i>6]" +
-		 "[(9-12)s:c]" +
-		 "[(12-15)s:d]" +
-		 "[(15-18)s:e]" +
-		 "[(18-21)s:c]" +
-		 "[(21-24)s:d]" +
-		 "[(24-27)s:e]" +
-		 "[(27-30)s:c]" +
-		 "[(30-33)s:d]" +
-		 "[(33-36)s:e]");
-	ki.addDoc(fd);
+        // <a><b>x<a>y<a>zcde</a>cde</a>cde</b></a>
+        fd = new FieldDocument();
+        fd.addTV("base", "x  y  z  c  d  e  c  d  e  c  d  e  ",
+                "[(0-3)s:x|<>:a#0-36$<i>12|<>:b#0-36$<i>12]"
+                        + "[(3-6)s:y|<>:a#3-27$<i>9]"
+                        + "[(6-9)s:z|<>:a#6-18$<i>6]" + "[(9-12)s:c]"
+                        + "[(12-15)s:d]" + "[(15-18)s:e]" + "[(18-21)s:c]"
+                        + "[(21-24)s:d]" + "[(24-27)s:e]" + "[(27-30)s:c]"
+                        + "[(30-33)s:d]" + "[(33-36)s:e]");
+        ki.addDoc(fd);
 
-	// xyz
-	fd = new FieldDocument();
-	fd.addTV("base",
-		 "x  y  z  ",
-		 "[(0-3)s:x]" +
-		 "[(3-6)s:y]" +
-		 "[(6-9)s:z]");
-	ki.addDoc(fd);
+        // xyz
+        fd = new FieldDocument();
+        fd.addTV("base", "x  y  z  ", "[(0-3)s:x]" + "[(3-6)s:y]"
+                + "[(6-9)s:z]");
+        ki.addDoc(fd);
 
-	// <a>x<a><b>y<a>zcde</a>cde</b></a>cde</a>
-	fd = new FieldDocument();
-	fd.addTV("base",
-		 "x  y  z  k  l  m  k  l  m  k  l  m  ",
-		 "[(0-3)s:x|<>:a#0-3$<i>12]" +
-		 "[(3-6)s:y|<>:a#3-6$<i>9|<>:b#3-6$<i>9]" +
-		 "[(6-9)s:z|<>:a#6-9$<i>6]" +
-		 "[(9-12)s:k]" +
-		 "[(12-15)s:l]" +
-		 "[(15-18)s:m]" +
-		 "[(18-21)s:k]" +
-		 "[(21-24)s:l]" +
-		 "[(24-27)s:m]" +
-		 "[(27-30)s:k]" +
-		 "[(30-33)s:l]" +
-		 "[(33-36)s:m]");
-	ki.addDoc(fd);
+        // <a>x<a><b>y<a>zcde</a>cde</b></a>cde</a>
+        fd = new FieldDocument();
+        fd.addTV("base", "x  y  z  k  l  m  k  l  m  k  l  m  ",
+                "[(0-3)s:x|<>:a#0-3$<i>12]"
+                        + "[(3-6)s:y|<>:a#3-6$<i>9|<>:b#3-6$<i>9]"
+                        + "[(6-9)s:z|<>:a#6-9$<i>6]" + "[(9-12)s:k]"
+                        + "[(12-15)s:l]" + "[(15-18)s:m]" + "[(18-21)s:k]"
+                        + "[(21-24)s:l]" + "[(24-27)s:m]" + "[(27-30)s:k]"
+                        + "[(30-33)s:l]" + "[(33-36)s:m]");
+        ki.addDoc(fd);
 
-	// <a><a><a>h</a>hhij</a>hij</a>hij</a>
-	fd = new FieldDocument();
-	fd.addTV("base",
-		 "h  h        i  j  h  i  j  h  i  j  ",
-		 "[(0-3)s:h|<>:a#0-27$<i>6|<>:a#0-18$<i>3|<>:a#0-36$<i>9]" +
-		 "[(3-6)s:h]" +
-		 "[(12-15)s:i]" +
-		 "[(15-18)s:j]" +
-		 "[(18-21)s:h]" +
-		 "[(21-24)s:i]" +
-		 "[(24-27)s:j]" +
-		 "[(27-30)s:h]" +
-		 "[(30-33)s:i]" +
-		 "[(33-36)s:j]");
-	ki.addDoc(fd);
+        // <a><a><a>h</a>hhij</a>hij</a>hij</a>
+        fd = new FieldDocument();
+        fd.addTV("base", "h  h        i  j  h  i  j  h  i  j  ",
+                "[(0-3)s:h|<>:a#0-27$<i>6|<>:a#0-18$<i>3|<>:a#0-36$<i>9]"
+                        + "[(3-6)s:h]" + "[(12-15)s:i]" + "[(15-18)s:j]"
+                        + "[(18-21)s:h]" + "[(21-24)s:i]" + "[(24-27)s:j]"
+                        + "[(27-30)s:h]" + "[(30-33)s:i]" + "[(33-36)s:j]");
+        ki.addDoc(fd);
 
-	// xyz
-	fd = new FieldDocument();
-	fd.addTV("base",
-		 "a  b  c  ",
-		 "[(0-3)s:a]" +
-		 "[(3-6)s:b]" +
-		 "[(6-9)s:c]");
-	ki.addDoc(fd);
+        // xyz
+        fd = new FieldDocument();
+        fd.addTV("base", "a  b  c  ", "[(0-3)s:a]" + "[(3-6)s:b]"
+                + "[(6-9)s:c]");
+        ki.addDoc(fd);
 
 
-	// Save documents
-	ki.commit();
+        // Save documents
+        ki.commit();
 
-	assertEquals(6, ki.numberOf("documents"));
+        assertEquals(6, ki.numberOf("documents"));
 
-	SpanQuery sq = new SpanElementQuery("base", "a");
+        SpanQuery sq = new SpanElementQuery("base", "a");
 
-	Result kr = ki.search(sq, (short) 15);
+        Result kr = ki.search(sq, (short) 15);
 
-	// System.err.println(kr.toJSON());
+        // System.err.println(kr.toJSON());
 
-	assertEquals("totalResults", kr.getTotalResults(), 12);
+        assertEquals("totalResults", kr.getTotalResults(), 12);
 
-	assertEquals("StartPos (0)", 0, kr.getMatch(0).startPos);
-	assertEquals("EndPos (0)", 0, kr.getMatch(0).endPos);
-	assertEquals("StartPos (1)", 0, kr.getMatch(1).startPos);
-	assertEquals("EndPos (1)", 0, kr.getMatch(1).endPos);
-	assertEquals("StartPos (2)", 0, kr.getMatch(2).startPos);
-	assertEquals("EndPos (2)", 0, kr.getMatch(2).endPos);
+        assertEquals("StartPos (0)", 0, kr.getMatch(0).startPos);
+        assertEquals("EndPos (0)", 0, kr.getMatch(0).endPos);
+        assertEquals("StartPos (1)", 0, kr.getMatch(1).startPos);
+        assertEquals("EndPos (1)", 0, kr.getMatch(1).endPos);
+        assertEquals("StartPos (2)", 0, kr.getMatch(2).startPos);
+        assertEquals("EndPos (2)", 0, kr.getMatch(2).endPos);
 
-	assertEquals("StartPos (3)", 0, kr.getMatch(3).startPos);
-	assertEquals("EndPos (3)", 12, kr.getMatch(3).endPos);
-	assertEquals("StartPos (4)", 1, kr.getMatch(4).startPos);
-	assertEquals("EndPos (4)", 9, kr.getMatch(4).endPos);
-	assertEquals("StartPos (5)", 2, kr.getMatch(5).startPos);
-	assertEquals("EndPos (5)", 6, kr.getMatch(5).endPos);
+        assertEquals("StartPos (3)", 0, kr.getMatch(3).startPos);
+        assertEquals("EndPos (3)", 12, kr.getMatch(3).endPos);
+        assertEquals("StartPos (4)", 1, kr.getMatch(4).startPos);
+        assertEquals("EndPos (4)", 9, kr.getMatch(4).endPos);
+        assertEquals("StartPos (5)", 2, kr.getMatch(5).startPos);
+        assertEquals("EndPos (5)", 6, kr.getMatch(5).endPos);
 
-	assertEquals("StartPos (6)", 0, kr.getMatch(6).startPos);
-	assertEquals("EndPos (6)", 12, kr.getMatch(6).endPos);
-	assertEquals("StartPos (7)", 1, kr.getMatch(7).startPos);
-	assertEquals("EndPos (7)", 9, kr.getMatch(7).endPos);
-	assertEquals("StartPos (8)", 2, kr.getMatch(8).startPos);
-	assertEquals("EndPos (8)", 6, kr.getMatch(8).endPos);
+        assertEquals("StartPos (6)", 0, kr.getMatch(6).startPos);
+        assertEquals("EndPos (6)", 12, kr.getMatch(6).endPos);
+        assertEquals("StartPos (7)", 1, kr.getMatch(7).startPos);
+        assertEquals("EndPos (7)", 9, kr.getMatch(7).endPos);
+        assertEquals("StartPos (8)", 2, kr.getMatch(8).startPos);
+        assertEquals("EndPos (8)", 6, kr.getMatch(8).endPos);
 
-	assertEquals("StartPos (9)", 0, kr.getMatch(9).startPos);
-	assertEquals("EndPos (9)", 3, kr.getMatch(9).endPos);
-	assertEquals("StartPos (10)", 0, kr.getMatch(10).startPos);
-	assertEquals("EndPos (10)", 6, kr.getMatch(10).endPos);
-	assertEquals("StartPos (11)", 0, kr.getMatch(11).startPos);
-	assertEquals("EndPos (11)", 9, kr.getMatch(11).endPos);
+        assertEquals("StartPos (9)", 0, kr.getMatch(9).startPos);
+        assertEquals("EndPos (9)", 3, kr.getMatch(9).endPos);
+        assertEquals("StartPos (10)", 0, kr.getMatch(10).startPos);
+        assertEquals("EndPos (10)", 6, kr.getMatch(10).endPos);
+        assertEquals("StartPos (11)", 0, kr.getMatch(11).startPos);
+        assertEquals("EndPos (11)", 9, kr.getMatch(11).endPos);
     };
 
 
     @Test
     public void indexExample4 () throws IOException {
-	KrillIndex ki = new KrillIndex();
+        KrillIndex ki = new KrillIndex();
 
-	FieldDocument fd = new FieldDocument();
-	fd.addTV("base",
-		 "111111ccc222222fff333333iiijjj",
-		 "[(0-3)s:a|_0#0-3]" +
-		 "[(3-6)s:b|_1#3-6]" +
-		 "[(6-9)s:c|_2#6-9]" +
-		 "[(9-12)s:d|_3#9-12|<>:a#9-15$<i>4]" +
-		 "[(12-15)s:e|_4#12-15]" +
-		 "[(15-18)s:f|_5#15-18]" +
-		 "[(18-21)s:g|_6#18-21|<>:a#18-24$<i>8]" +
-		 "[(21-24)s:h|_7#21-24]" +
-		 "[(24-27)s:i|_8#24-27]" +
-		 "[(27-30)s:j|_9#27-30]");
-	ki.addDoc(fd);
+        FieldDocument fd = new FieldDocument();
+        fd.addTV("base", "111111ccc222222fff333333iiijjj", "[(0-3)s:a|_0#0-3]"
+                + "[(3-6)s:b|_1#3-6]" + "[(6-9)s:c|_2#6-9]"
+                + "[(9-12)s:d|_3#9-12|<>:a#9-15$<i>4]"
+                + "[(12-15)s:e|_4#12-15]" + "[(15-18)s:f|_5#15-18]"
+                + "[(18-21)s:g|_6#18-21|<>:a#18-24$<i>8]"
+                + "[(21-24)s:h|_7#21-24]" + "[(24-27)s:i|_8#24-27]"
+                + "[(27-30)s:j|_9#27-30]");
+        ki.addDoc(fd);
 
-	// Save documents
-	ki.commit();
+        // Save documents
+        ki.commit();
 
-	assertEquals(1, ki.numberOf("documents"));
+        assertEquals(1, ki.numberOf("documents"));
 
-	SpanQuery sq = new SpanElementQuery("base", "a");
+        SpanQuery sq = new SpanElementQuery("base", "a");
 
-	Result kr = ki.search(sq, 0, (short) 15, false, (short) 3, false, (short) 3);
-	
-	assertEquals("... ccc[222222]fff ...", kr.getMatch(0).getSnippetBrackets());
-	assertEquals("... fff[333333]iii ...", kr.getMatch(1).getSnippetBrackets());
+        Result kr = ki.search(sq, 0, (short) 15, false, (short) 3, false,
+                (short) 3);
+
+        assertEquals("... ccc[222222]fff ...", kr.getMatch(0)
+                .getSnippetBrackets());
+        assertEquals("... fff[333333]iii ...", kr.getMatch(1)
+                .getSnippetBrackets());
     };
 
 
     @Test
     public void indexExample5 () throws IOException {
-	KrillIndex ki = new KrillIndex();
+        KrillIndex ki = new KrillIndex();
 
-	FieldDocument fd = new FieldDocument();
-	fd.addTV("base",
-		 "111111ccc222222fff333333iiijjj",
-		 "[(0-3)s:a|_0#0-3|<>:a#0-6$<i>1]" +
-		 "[(3-6)s:b|_1#3-6]" +
-		 "[(6-9)s:c|_2#6-9]" +
-		 "[(9-12)s:d|_3#9-12|<>:a#9-15$<i>4]" +
-		 "[(12-15)s:e|_4#12-15]" +
-		 "[(15-18)s:f|_5#15-18]" +
-		 "[(18-21)s:g|_6#18-21|<>:a#18-24$<i>8]" +
-		 "[(21-24)s:h|_7#21-24]" +
-		 "[(24-27)s:i|_8#24-27]" +
-		 "[(27-30)s:j|_9#27-30]");
-	ki.addDoc(fd);
+        FieldDocument fd = new FieldDocument();
+        fd.addTV("base", "111111ccc222222fff333333iiijjj",
+                "[(0-3)s:a|_0#0-3|<>:a#0-6$<i>1]" + "[(3-6)s:b|_1#3-6]"
+                        + "[(6-9)s:c|_2#6-9]"
+                        + "[(9-12)s:d|_3#9-12|<>:a#9-15$<i>4]"
+                        + "[(12-15)s:e|_4#12-15]" + "[(15-18)s:f|_5#15-18]"
+                        + "[(18-21)s:g|_6#18-21|<>:a#18-24$<i>8]"
+                        + "[(21-24)s:h|_7#21-24]" + "[(24-27)s:i|_8#24-27]"
+                        + "[(27-30)s:j|_9#27-30]");
+        ki.addDoc(fd);
 
-	// Save documents
-	ki.commit();
+        // Save documents
+        ki.commit();
 
-	assertEquals(1, ki.numberOf("documents"));
+        assertEquals(1, ki.numberOf("documents"));
 
-	SpanQuery sq = new SpanElementQuery("base", "a");
+        SpanQuery sq = new SpanElementQuery("base", "a");
 
-	Result kr = ki.search(sq, 0, (short) 15, false, (short) 3, false, (short) 3);
+        Result kr = ki.search(sq, 0, (short) 15, false, (short) 3, false,
+                (short) 3);
 
-	assertEquals("[111111]ccc ...", kr.getMatch(0).getSnippetBrackets());
-	assertEquals("... ccc[222222]fff ...", kr.getMatch(1).getSnippetBrackets());
-	assertEquals("... fff[333333]iii ...", kr.getMatch(2).getSnippetBrackets());
+        assertEquals("[111111]ccc ...", kr.getMatch(0).getSnippetBrackets());
+        assertEquals("... ccc[222222]fff ...", kr.getMatch(1)
+                .getSnippetBrackets());
+        assertEquals("... fff[333333]iii ...", kr.getMatch(2)
+                .getSnippetBrackets());
     };
 
 
     @Test
     public void indexExample6 () throws IOException {
 
-	KrillIndex ki = new KrillIndex();
+        KrillIndex ki = new KrillIndex();
 
-	// <a>x<a>y<a>zhij</a>hij</a>hij</a>
-	FieldDocument fd = new FieldDocument();
-	fd.addTV("base",
-		 "x  y  z  h  i  j  h  i  j  h  i  j  ",
-		 "[(0-3)s:x|_0#0-3|<>:a#0-36$<i>12]" + // 1
-		 "[(3-6)s:y|_1#3-6|<>:a#3-27$<i>9]" +  // 2
-		 "[(6-9)s:z|_2#6-9|<>:a#6-18$<i>6]" +  // 3
-		 "[(9-12)s:h|_3#9-12]" +   // 4
-		 "[(12-15)s:i|_4#12-15]" +  // 5
-		 "[(15-18)s:j|_5#15-18]" +  // 6
-		 "[(18-21)s:h|_6#18-21]" +  // 7
-		 "[(21-24)s:i|_7#21-24]" +  // 8
-		 "[(24-27)s:j|_8#24-27]" +  // 9
-		 "[(27-30)s:h|_9#27-30]" +  // 10
-		 "[(30-33)s:i|_10#30-33]" +  // 11
-		 "[(33-36)s:j|_11#33-36]");  // 12
-	ki.addDoc(fd);
+        // <a>x<a>y<a>zhij</a>hij</a>hij</a>
+        FieldDocument fd = new FieldDocument();
+        fd.addTV("base", "x  y  z  h  i  j  h  i  j  h  i  j  ",
+                "[(0-3)s:x|_0#0-3|<>:a#0-36$<i>12]" + // 1
+                        "[(3-6)s:y|_1#3-6|<>:a#3-27$<i>9]" +  // 2
+                        "[(6-9)s:z|_2#6-9|<>:a#6-18$<i>6]" +  // 3
+                        "[(9-12)s:h|_3#9-12]" +   // 4
+                        "[(12-15)s:i|_4#12-15]" +  // 5
+                        "[(15-18)s:j|_5#15-18]" +  // 6
+                        "[(18-21)s:h|_6#18-21]" +  // 7
+                        "[(21-24)s:i|_7#21-24]" +  // 8
+                        "[(24-27)s:j|_8#24-27]" +  // 9
+                        "[(27-30)s:h|_9#27-30]" +  // 10
+                        "[(30-33)s:i|_10#30-33]" +  // 11
+                        "[(33-36)s:j|_11#33-36]");  // 12
+        ki.addDoc(fd);
 
-	fd = new FieldDocument();
-	fd.addTV("base",
-		 "x  y  z  h  ",
-		 "[(0-3)s:x|_0#0-3]" +  // 1
-		 "[(3-6)s:y|_1#3-6]" +  // 2
-		 "[(6-9)s:z|_2#6-9]" +  // 3
-		 "[(9-12)s:h|_3#9-12]"); // 4
-	ki.addDoc(fd);
+        fd = new FieldDocument();
+        fd.addTV("base", "x  y  z  h  ", "[(0-3)s:x|_0#0-3]" +  // 1
+                "[(3-6)s:y|_1#3-6]" +  // 2
+                "[(6-9)s:z|_2#6-9]" +  // 3
+                "[(9-12)s:h|_3#9-12]"); // 4
+        ki.addDoc(fd);
 
-	// Here is a larger offset than expected
-	fd = new FieldDocument();
-	fd.addTV("base",
-		 "x  y  z  h  ",
-		 "[(0-3)s:x|_0#0-3|<>:a#0-36$<i>12]" +  // 1
-		 "[(3-6)s:y|_1#3-6]" +  // 2
-		 "[(6-9)s:z|_2#6-9]" +  // 3
-		 "[(9-12)s:h|_3#9-12]"); // 4
-	ki.addDoc(fd);
-	
-	// <a>x<a>y<a>zabc</a>abc</a>abc</a>
-	fd = new FieldDocument();
-	fd.addTV("base",
-		 "x  y  z  a  b  c  a  b  c  a  b  c  ",
-		 "[(0-3)s:x|_0#0-3|<>:a#0-36$<i>12]" + // 1
-		 "[(3-6)s:y|_1#3-6|<>:a#3-27$<i>9]" +  // 2
-		 "[(6-9)s:z|_2#6-9|<>:a#6-18$<i>6]" +  // 3
-		 "[(9-12)s:a|_3#9-12]" +   // 4
-		 "[(12-15)s:b|_4#12-15]" +  // 5
-		 "[(15-18)s:c|_5#15-18]" +  // 6
-		 "[(18-21)s:a|_6#18-21]" +  // 7
-		 "[(21-24)s:b|_7#21-24]" +  // 8
-		 "[(24-27)s:c|_8#24-27]" +  // 9
-		 "[(27-30)s:a|_9#27-30]" +  // 10
-		 "[(30-33)s:b|_10#30-33]" +  // 11
-		 "[(33-36)s:c|_11#33-36]");  // 12
-	ki.addDoc(fd);
+        // Here is a larger offset than expected
+        fd = new FieldDocument();
+        fd.addTV("base", "x  y  z  h  ", "[(0-3)s:x|_0#0-3|<>:a#0-36$<i>12]" +  // 1
+                "[(3-6)s:y|_1#3-6]" +  // 2
+                "[(6-9)s:z|_2#6-9]" +  // 3
+                "[(9-12)s:h|_3#9-12]"); // 4
+        ki.addDoc(fd);
 
-	fd = new FieldDocument();
-	fd.addTV("base",
-		 "x  y  z  h  ",
-		 "[(0-3)s:x|_0#0-3]" +  // 1
-		 "[(3-6)s:y|_1#3-6]" +  // 2
-		 "[(6-9)s:z|_2#6-9]" +  // 3
-		 "[(9-12)s:h|_3#9-12]"); // 4
-	ki.addDoc(fd);
+        // <a>x<a>y<a>zabc</a>abc</a>abc</a>
+        fd = new FieldDocument();
+        fd.addTV("base", "x  y  z  a  b  c  a  b  c  a  b  c  ",
+                "[(0-3)s:x|_0#0-3|<>:a#0-36$<i>12]" + // 1
+                        "[(3-6)s:y|_1#3-6|<>:a#3-27$<i>9]" +  // 2
+                        "[(6-9)s:z|_2#6-9|<>:a#6-18$<i>6]" +  // 3
+                        "[(9-12)s:a|_3#9-12]" +   // 4
+                        "[(12-15)s:b|_4#12-15]" +  // 5
+                        "[(15-18)s:c|_5#15-18]" +  // 6
+                        "[(18-21)s:a|_6#18-21]" +  // 7
+                        "[(21-24)s:b|_7#21-24]" +  // 8
+                        "[(24-27)s:c|_8#24-27]" +  // 9
+                        "[(27-30)s:a|_9#27-30]" +  // 10
+                        "[(30-33)s:b|_10#30-33]" +  // 11
+                        "[(33-36)s:c|_11#33-36]");  // 12
+        ki.addDoc(fd);
 
-	// Save documents
-	ki.commit();
+        fd = new FieldDocument();
+        fd.addTV("base", "x  y  z  h  ", "[(0-3)s:x|_0#0-3]" +  // 1
+                "[(3-6)s:y|_1#3-6]" +  // 2
+                "[(6-9)s:z|_2#6-9]" +  // 3
+                "[(9-12)s:h|_3#9-12]"); // 4
+        ki.addDoc(fd);
 
-	SpanQuery sq;
-	Result kr;
+        // Save documents
+        ki.commit();
 
-	sq = new SpanElementQuery("base", "a");
-	kr = ki.search(sq, (short) 15);
+        SpanQuery sq;
+        Result kr;
 
-	// System.err.println(kr.toJSON());
-	
-	assertEquals(5, ki.numberOf("documents"));
-	assertEquals("totalResults", kr.getTotalResults(), 7);
+        sq = new SpanElementQuery("base", "a");
+        kr = ki.search(sq, (short) 15);
+
+        // System.err.println(kr.toJSON());
+
+        assertEquals(5, ki.numberOf("documents"));
+        assertEquals("totalResults", kr.getTotalResults(), 7);
     };
 };
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestFieldDocument.java b/src/test/java/de/ids_mannheim/korap/index/TestFieldDocument.java
index 38d53e4..00b9874 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestFieldDocument.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestFieldDocument.java
@@ -43,212 +43,198 @@
 
     @Test
     public void indexExample1 () throws IOException {
-	FieldDocument fd = new FieldDocument();
+        FieldDocument fd = new FieldDocument();
 
-	fd.addString("corpusID", "WPD");
-	fd.addString("ID", "WPD-AAA-00001");
-	fd.addText("textClass", "music entertainment");
-	fd.addText("author", "Peter Frankenfeld");
-	fd.addInt("pubDate", 20130617);
-	fd.addText("title", "Wikipedia");
-	fd.addText("subTitle", "Die freie Enzyklopädie");
-	fd.addStored("layerInfo", "opennlp/p=pos");
-	fd.addString("pubPlace", "Bochum");
-	fd.addInt("lastModified", 20130717);
-	fd.addTV("tokens",
-		 "abc",
-		 "[(0-1)s:a|i:a|_0#0-1|-:t$<i>10]" +
-		 "[(1-2)s:b|i:b|_1#1-2]" +
-		 "[(2-3)s:c|i:c|_2#2-3]");
+        fd.addString("corpusID", "WPD");
+        fd.addString("ID", "WPD-AAA-00001");
+        fd.addText("textClass", "music entertainment");
+        fd.addText("author", "Peter Frankenfeld");
+        fd.addInt("pubDate", 20130617);
+        fd.addText("title", "Wikipedia");
+        fd.addText("subTitle", "Die freie Enzyklopädie");
+        fd.addStored("layerInfo", "opennlp/p=pos");
+        fd.addString("pubPlace", "Bochum");
+        fd.addInt("lastModified", 20130717);
+        fd.addTV("tokens", "abc", "[(0-1)s:a|i:a|_0#0-1|-:t$<i>10]"
+                + "[(1-2)s:b|i:b|_1#1-2]" + "[(2-3)s:c|i:c|_2#2-3]");
 
-	assertEquals(fd.doc.getField("title").name(), "title");
-	assertEquals(fd.doc.getField("title").stringValue(), "Wikipedia");
+        assertEquals(fd.doc.getField("title").name(), "title");
+        assertEquals(fd.doc.getField("title").stringValue(), "Wikipedia");
 
-	assertEquals(fd.doc.getField("corpusID").name(), "corpusID");
-	assertEquals(fd.doc.getField("corpusID").stringValue(), "WPD");
+        assertEquals(fd.doc.getField("corpusID").name(), "corpusID");
+        assertEquals(fd.doc.getField("corpusID").stringValue(), "WPD");
 
-	assertEquals(fd.doc.getField("ID").name(), "ID");
-	assertEquals(fd.doc.getField("ID").stringValue(), "WPD-AAA-00001");
+        assertEquals(fd.doc.getField("ID").name(), "ID");
+        assertEquals(fd.doc.getField("ID").stringValue(), "WPD-AAA-00001");
 
-	assertEquals(fd.doc.getField("subTitle").name(), "subTitle");
-	assertEquals(fd.doc.getField("subTitle").stringValue(), "Die freie Enzyklopädie");
+        assertEquals(fd.doc.getField("subTitle").name(), "subTitle");
+        assertEquals(fd.doc.getField("subTitle").stringValue(),
+                "Die freie Enzyklopädie");
 
-	assertEquals(fd.doc.getField("pubPlace").name(), "pubPlace");
-	assertEquals(fd.doc.getField("pubPlace").stringValue(), "Bochum");
+        assertEquals(fd.doc.getField("pubPlace").name(), "pubPlace");
+        assertEquals(fd.doc.getField("pubPlace").stringValue(), "Bochum");
 
-	assertEquals(fd.doc.getField("lastModified").name(), "lastModified");
-	assertEquals(fd.doc.getField("lastModified").stringValue(), "20130717");
+        assertEquals(fd.doc.getField("lastModified").name(), "lastModified");
+        assertEquals(fd.doc.getField("lastModified").stringValue(), "20130717");
 
-	assertEquals(fd.doc.getField("tokens").name(), "tokens");
-	assertEquals(fd.doc.getField("tokens").stringValue(), "abc");
+        assertEquals(fd.doc.getField("tokens").name(), "tokens");
+        assertEquals(fd.doc.getField("tokens").stringValue(), "abc");
 
-	assertEquals(fd.doc.getField("author").name(), "author");
-	assertEquals(fd.doc.getField("author").stringValue(), "Peter Frankenfeld");
+        assertEquals(fd.doc.getField("author").name(), "author");
+        assertEquals(fd.doc.getField("author").stringValue(),
+                "Peter Frankenfeld");
 
-	assertEquals(fd.doc.getField("layerInfo").name(), "layerInfo");
-	assertEquals(fd.doc.getField("layerInfo").stringValue(), "opennlp/p=pos");
+        assertEquals(fd.doc.getField("layerInfo").name(), "layerInfo");
+        assertEquals(fd.doc.getField("layerInfo").stringValue(),
+                "opennlp/p=pos");
 
-	assertEquals(fd.doc.getField("textClass").name(), "textClass");
-	assertEquals(fd.doc.getField("textClass").stringValue(), "music entertainment");
+        assertEquals(fd.doc.getField("textClass").name(), "textClass");
+        assertEquals(fd.doc.getField("textClass").stringValue(),
+                "music entertainment");
     };
 
+
     @Test
     public void indexExample2 () throws Exception {
 
-	String json = new String(
-"{" +
-"  \"fields\" : [" +
-"    { "+
-"      \"primaryData\" : \"abc\"" +
-"    }," +
-"    {" +
-"      \"name\" : \"tokens\"," +
-"      \"data\" : [" +
-"         [ \"s:a\", \"i:a\", \"_0#0-1\", \"-:t$<i>3\"]," +
-"         [ \"s:b\", \"i:b\", \"_1#1-2\" ]," +
-"         [ \"s:c\", \"i:c\", \"_2#2-3\" ]" +
-"      ]" +
-"    }" +
-"  ]," +
-"  \"corpusID\"  : \"WPD\"," +
-"  \"ID\"        : \"WPD-AAA-00001\"," +
-"  \"textClass\" : \"music entertainment\"," +
-"  \"author\"    : \"Peter Frankenfeld\"," +
-"  \"pubDate\"   : 20130617," +
-"  \"title\"     : \"Wikipedia\"," +
-"  \"subTitle\"  : \"Die freie Enzyklopädie\"," +
-"  \"pubPlace\"  : \"Bochum\"" +
-"}");
+        String json = new String("{" + "  \"fields\" : [" + "    { "
+                + "      \"primaryData\" : \"abc\"" + "    }," + "    {"
+                + "      \"name\" : \"tokens\"," + "      \"data\" : ["
+                + "         [ \"s:a\", \"i:a\", \"_0#0-1\", \"-:t$<i>3\"],"
+                + "         [ \"s:b\", \"i:b\", \"_1#1-2\" ],"
+                + "         [ \"s:c\", \"i:c\", \"_2#2-3\" ]" + "      ]"
+                + "    }" + "  ]," + "  \"corpusID\"  : \"WPD\","
+                + "  \"ID\"        : \"WPD-AAA-00001\","
+                + "  \"textClass\" : \"music entertainment\","
+                + "  \"author\"    : \"Peter Frankenfeld\","
+                + "  \"pubDate\"   : 20130617,"
+                + "  \"title\"     : \"Wikipedia\","
+                + "  \"subTitle\"  : \"Die freie Enzyklopädie\","
+                + "  \"pubPlace\"  : \"Bochum\"" + "}");
 
-	KrillIndex ki = new KrillIndex();
-	FieldDocument fd = ki.addDoc(json);
+        KrillIndex ki = new KrillIndex();
+        FieldDocument fd = ki.addDoc(json);
 
-	ki.commit();
+        ki.commit();
 
-	assertEquals(fd.getPrimaryData(),"abc");
-	assertEquals(fd.getCorpusID(),"WPD");
-	assertEquals(fd.getID(),"WPD-AAA-00001");
-	assertEquals(fd.getTextClass(),"music entertainment");
-	assertEquals(fd.getAuthor(),"Peter Frankenfeld");
-	assertEquals(fd.getTitle(),"Wikipedia");
-	assertEquals(fd.getSubTitle(),"Die freie Enzyklopädie");
-	assertEquals(fd.getPubPlace(),"Bochum");
-	assertEquals(fd.getPubDate().toDisplay(),"2013-06-17");
+        assertEquals(fd.getPrimaryData(), "abc");
+        assertEquals(fd.getCorpusID(), "WPD");
+        assertEquals(fd.getID(), "WPD-AAA-00001");
+        assertEquals(fd.getTextClass(), "music entertainment");
+        assertEquals(fd.getAuthor(), "Peter Frankenfeld");
+        assertEquals(fd.getTitle(), "Wikipedia");
+        assertEquals(fd.getSubTitle(), "Die freie Enzyklopädie");
+        assertEquals(fd.getPubPlace(), "Bochum");
+        assertEquals(fd.getPubDate().toDisplay(), "2013-06-17");
 
-	QueryBuilder kq = new QueryBuilder("tokens");
-	Result kr = ki.search((SpanQuery) kq.seq(kq._(3, kq.seg("s:b"))).toQuery());
+        QueryBuilder kq = new QueryBuilder("tokens");
+        Result kr = ki.search((SpanQuery) kq.seq(kq._(3, kq.seg("s:b")))
+                .toQuery());
 
-	Match km = kr.getMatch(0);
+        Match km = kr.getMatch(0);
 
-	assertEquals(km.getPrimaryData(),"abc");
-	assertEquals(km.getCorpusID(),"WPD");
-	assertEquals(km.getDocID(),"WPD-AAA-00001");
-	assertEquals(km.getTextClass(),"music entertainment");
-	assertEquals(km.getAuthor(),"Peter Frankenfeld");
-	assertEquals(km.getTitle(),"Wikipedia");
-	assertEquals(km.getSubTitle(),"Die freie Enzyklopädie");
-	assertEquals(km.getPubPlace(),"Bochum");
-	assertEquals(km.getPubDate().toDisplay(),"2013-06-17");
+        assertEquals(km.getPrimaryData(), "abc");
+        assertEquals(km.getCorpusID(), "WPD");
+        assertEquals(km.getDocID(), "WPD-AAA-00001");
+        assertEquals(km.getTextClass(), "music entertainment");
+        assertEquals(km.getAuthor(), "Peter Frankenfeld");
+        assertEquals(km.getTitle(), "Wikipedia");
+        assertEquals(km.getSubTitle(), "Die freie Enzyklopädie");
+        assertEquals(km.getPubPlace(), "Bochum");
+        assertEquals(km.getPubDate().toDisplay(), "2013-06-17");
 
-	assertEquals(km.getSnippetBrackets(),"a[{3:b}]c");
+        assertEquals(km.getSnippetBrackets(), "a[{3:b}]c");
     };
 
 
     @Test
     public void indexExample3 () throws IOException {
 
-	// Construct index
-	KrillIndex ki = new KrillIndex();
+        // Construct index
+        KrillIndex ki = new KrillIndex();
 
-	// Indexing test files
-	for (String i : new String[] {"00001",
-				      "00002",
-				      "00003",
-				      "00004",
-				      "00005",
-				      "00006",
-				      "02439"}) {
-	    FieldDocument fd = ki.addDoc(
-	        getClass().getResourceAsStream("/wiki/" + i + ".json.gz"), true
-            );
-	};
-	ki.commit();
+        // Indexing test files
+        for (String i : new String[] { "00001", "00002", "00003", "00004",
+                "00005", "00006", "02439" }) {
+            FieldDocument fd = ki.addDoc(
+                    getClass().getResourceAsStream("/wiki/" + i + ".json.gz"),
+                    true);
+        };
+        ki.commit();
 
-	QueryBuilder kq = new QueryBuilder("tokens");
+        QueryBuilder kq = new QueryBuilder("tokens");
 
-	Krill ks;
-	Result kr;
+        Krill ks;
+        Result kr;
 
-	// Start creating query
-	// within(<s>, {1: {2: [mate/p=ADJA & mate/m=number:sg]}[opennlp/p=NN & tt/p=NN]})
+        // Start creating query
+        // within(<s>, {1: {2: [mate/p=ADJA & mate/m=number:sg]}[opennlp/p=NN & tt/p=NN]})
 
-	ks = new Krill(kq.within(
-              kq.tag("s"),
-              kq._(1,
-                kq.seq(
-	          kq.seg("mate/p:ADJA")
-                ).append(
-		  kq.seg("opennlp/p:NN")
-	        )
-	      )
-            ));
-	
-    KrillMeta meta = ks.getMeta();
-	meta.setCount(1);
-	meta.setCutOff(true);
+        ks = new Krill(kq.within(
+                kq.tag("s"),
+                kq._(1,
+                        kq.seq(kq.seg("mate/p:ADJA")).append(
+                                kq.seg("opennlp/p:NN")))));
 
-	meta.getContext().left.setCharacter(true).setLength(6);
-	meta.getContext().right.setToken(true).setLength(6);
+        KrillMeta meta = ks.getMeta();
+        meta.setCount(1);
+        meta.setCutOff(true);
 
-	assertEquals("... okal. [Der Buchstabe A hat in {1:deutschen Texten} eine durchschnittliche Häufigkeit von 6,51 %.] Er ist damit der sechsthäufigste Buchstabe ...", ks.apply(ki).getMatch(0).getSnippetBrackets());
+        meta.getContext().left.setCharacter(true).setLength(6);
+        meta.getContext().right.setToken(true).setLength(6);
+
+        assertEquals(
+                "... okal. [Der Buchstabe A hat in {1:deutschen Texten} eine durchschnittliche Häufigkeit von 6,51 %.] Er ist damit der sechsthäufigste Buchstabe ...",
+                ks.apply(ki).getMatch(0).getSnippetBrackets());
     };
 
+
     @Test
     public void queryJSONBsp18 () throws Exception {
 
-	// Construct index
-	KrillIndex ki = new KrillIndex();
+        // Construct index
+        KrillIndex ki = new KrillIndex();
 
-	// Indexing test files
-	for (String i : new String[] {"00001",
-				      "00002",
-				      "00003",
-				      "00004",
-				      "00005",
-				      "00006",
-				      "02439"}) {
-	    FieldDocument fd = ki.addDoc(
-	        getClass().getResourceAsStream("/wiki/" + i + ".json.gz"), true
-            );
-	};
-	ki.commit();
+        // Indexing test files
+        for (String i : new String[] { "00001", "00002", "00003", "00004",
+                "00005", "00006", "02439" }) {
+            FieldDocument fd = ki.addDoc(
+                    getClass().getResourceAsStream("/wiki/" + i + ".json.gz"),
+                    true);
+        };
+        ki.commit();
 
-	SpanQueryWrapper sqwi = jsonQuery(getClass().getResource("/queries/bsp18.jsonld").getFile());
+        SpanQueryWrapper sqwi = jsonQuery(getClass().getResource(
+                "/queries/bsp18.jsonld").getFile());
 
-	Result kr = ki.search(sqwi.toQuery(), 0, (short) 5, true, (short) 2, false, (short) 5);
+        Result kr = ki.search(sqwi.toQuery(), 0, (short) 5, true, (short) 2,
+                false, (short) 5);
 
-	// Bug:
-	// System.err.println(kr.toJSON());
+        // Bug:
+        // System.err.println(kr.toJSON());
     };
 
+
     public static String getString (String path) {
-	StringBuilder contentBuilder = new StringBuilder();
-	try {
-	    BufferedReader in = new BufferedReader(new FileReader(path));
-	    String str;
-	    while ((str = in.readLine()) != null) {
-		contentBuilder.append(str);
-	    };
-	    in.close();
-	} catch (IOException e) {
-	    fail(e.getMessage());
-	}
-	return contentBuilder.toString();
+        StringBuilder contentBuilder = new StringBuilder();
+        try {
+            BufferedReader in = new BufferedReader(new FileReader(path));
+            String str;
+            while ((str = in.readLine()) != null) {
+                contentBuilder.append(str);
+            };
+            in.close();
+        }
+        catch (IOException e) {
+            fail(e.getMessage());
+        }
+        return contentBuilder.toString();
     };
 
+
     public static SpanQueryWrapper jsonQuery (String jsonFile) {
         SpanQueryWrapper sqwi;
-	
+
         try {
             String json = getString(jsonFile);
             sqwi = new KrillQuery("tokens").fromJson(json);
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestIndex.java b/src/test/java/de/ids_mannheim/korap/index/TestIndex.java
index 59b779f..97f132b 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestIndex.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestIndex.java
@@ -74,724 +74,625 @@
 
     private Directory index = new RAMDirectory();
 
+
     @Test
     public void multiTermToken () throws CorpusDataException {
-	MultiTermToken test = new MultiTermToken("hunde", "pos:n", "m:gen:pl");
-	assertEquals(test.terms.get(0).term, "hunde");
-	assertEquals(test.terms.get(1).term, "pos:n");
-	assertEquals(test.terms.get(2).term, "m:gen:pl");
+        MultiTermToken test = new MultiTermToken("hunde", "pos:n", "m:gen:pl");
+        assertEquals(test.terms.get(0).term, "hunde");
+        assertEquals(test.terms.get(1).term, "pos:n");
+        assertEquals(test.terms.get(2).term, "m:gen:pl");
 
-	test = new MultiTermToken("hunde", "pos:n", "m:gen:pl");
-	assertEquals(test.terms.get(0).term, "hunde");
-	assertEquals(test.terms.get(1).term, "pos:n");
-	assertEquals(test.terms.get(2).term, "m:gen:pl");
+        test = new MultiTermToken("hunde", "pos:n", "m:gen:pl");
+        assertEquals(test.terms.get(0).term, "hunde");
+        assertEquals(test.terms.get(1).term, "pos:n");
+        assertEquals(test.terms.get(2).term, "m:gen:pl");
     };
 
+
     private List initIndexer () throws IOException {
-	List<Map<String, String>> list = new ArrayList<>();
+        List<Map<String, String>> list = new ArrayList<>();
 
-	Map<String, String> d1 = new HashMap<String, String>();
-	d1.put("id",        "w1");
-	d1.put("corpus",    "wiki");
-	d1.put("author",    "Nils Diewald");
-	d1.put("title",     "Wikipedia");
-	d1.put("subtitle",  "A test");
-	d1.put("pubDate",   "20130701");
-	d1.put("pubPlace",  "Mannheim");
-	d1.put("textClass", "news sports");
-	d1.put("textStr",   "Er nahm den Hunden die Angst.");
-	d1.put("text",      "Er#0-2|PPER|er|c:nom;p:3;n:sg;g:masc|<>:s#0-29$<i>7 " +
-                            "nahm#3-7|VVFIN|nehmen|p:3;n:sg;t:past;m:ind| " +
-                            "den#8-11|ART|der|c:acc;n:sg;g:masc| " +
-                            "Hunden#12-18|NN|hund|c:acc;n:sg;g:masc| " +
-	                    "die#19-22|ART|der|c:nom;n:sg;g:fem| " +
-                            "Angst#23-28|NN|angst|c:nom;n:sg;g:fem| " +
-	                    ".#28-29|$.|.||");
-	list.add(d1);
+        Map<String, String> d1 = new HashMap<String, String>();
+        d1.put("id", "w1");
+        d1.put("corpus", "wiki");
+        d1.put("author", "Nils Diewald");
+        d1.put("title", "Wikipedia");
+        d1.put("subtitle", "A test");
+        d1.put("pubDate", "20130701");
+        d1.put("pubPlace", "Mannheim");
+        d1.put("textClass", "news sports");
+        d1.put("textStr", "Er nahm den Hunden die Angst.");
+        d1.put("text", "Er#0-2|PPER|er|c:nom;p:3;n:sg;g:masc|<>:s#0-29$<i>7 "
+                + "nahm#3-7|VVFIN|nehmen|p:3;n:sg;t:past;m:ind| "
+                + "den#8-11|ART|der|c:acc;n:sg;g:masc| "
+                + "Hunden#12-18|NN|hund|c:acc;n:sg;g:masc| "
+                + "die#19-22|ART|der|c:nom;n:sg;g:fem| "
+                + "Angst#23-28|NN|angst|c:nom;n:sg;g:fem| " + ".#28-29|$.|.||");
+        list.add(d1);
 
-	Map<String, String> d2 = new HashMap<String, String>();
+        Map<String, String> d2 = new HashMap<String, String>();
 
-	d2.put("id",        "w2");
-	d2.put("corpus",    "wiki");
-	d2.put("author",    "Peter Thomas");
-	d2.put("title",     "Waldartikel");
-	d2.put("subtitle",  "Another test");
-	d2.put("pubDate",   "20130723");
-	d2.put("pubPlace",  "Bielefeld");
-	d2.put("textClass", "news");
-	d2.put("textStr",   "Sie liefen durch den Wald.");
-	d2.put("text",      "Sie#0-3|PPER|sie|c:nom;p:3;n:pl;g:all|<>:s#0-26$<i>6 " +
-                            "liefen#4-10|VVFIN|laufen|p:3;n:pl;t:past;m:ind| " +
-                            "durch#11-16|APPR|durch|| " +
-                            "den#17-20|ART|der|c:acc;n:sg;g:masc| " +
-	                    "Wald#21-25|NN|wald|c:acc;n:sg;g:masc| " +
-	                    ".#25-26|$.|.||");
-	list.add(d2);
+        d2.put("id", "w2");
+        d2.put("corpus", "wiki");
+        d2.put("author", "Peter Thomas");
+        d2.put("title", "Waldartikel");
+        d2.put("subtitle", "Another test");
+        d2.put("pubDate", "20130723");
+        d2.put("pubPlace", "Bielefeld");
+        d2.put("textClass", "news");
+        d2.put("textStr", "Sie liefen durch den Wald.");
+        d2.put("text", "Sie#0-3|PPER|sie|c:nom;p:3;n:pl;g:all|<>:s#0-26$<i>6 "
+                + "liefen#4-10|VVFIN|laufen|p:3;n:pl;t:past;m:ind| "
+                + "durch#11-16|APPR|durch|| "
+                + "den#17-20|ART|der|c:acc;n:sg;g:masc| "
+                + "Wald#21-25|NN|wald|c:acc;n:sg;g:masc| " + ".#25-26|$.|.||");
+        list.add(d2);
 
-	Map<String, String> d3 = new HashMap<String, String>();
-	d3.put("id",        "w3");
-	d3.put("corpus",    "zeitung");
-	d3.put("author",    "Michael Meier");
-	d3.put("title",     "Angst");
-	d3.put("subtitle",  "Starr vor Angst");
-	d3.put("pubDate",   "20130713");
-	d3.put("pubPlace",  "Bielefeld");
-	d3.put("textClass", "sports");
-	d3.put("textStr",   "Er wagte nicht, sich zu ruehren. Er war starr vor Angst.");
-	d3.put("text",      "Er#0-2|PPER|er|c:nom;n:sg;g:masc;p:3|<>:s#0-32$<i>8 " +
-	                    "wagte#3-8|VVFIN|wagen|p:3;n:sg;t:past;m:ind| " +
-	                    "nicht#9-14|PTKNEG|nicht|| " +
-	                    ",#14-15|$,|,|| " +
-                            "sich#16-20|PRF|sich|c:acc;p:3;n:sg| " +
-	                    "zu#21-23|PTKZU|zu|| " +
-	                    "ruehren#24-31|VVFIN|ruehren|| " +
-	                    ".#31-32|$.|.|| " +
-	                    "Er#33-35|PPER|er|c:nom;p:3;n:sg;g:masc|<>:s#33-56$<i>14 " +
-	                    "war#36-39|VAFIN|sein|p:3;n:sg;t:past;m:ind| " +
-	                    "starr#40-45|ADJD|starr|comp:pos| " +
-	                    "vor#46-49|APPR|vor|| " +
-	                    "Angst#50-55|NN|angst|c:dat;n:sg;g:fem| " +
-	                    ".#55-56|$.|.||");
-	list.add(d3);
+        Map<String, String> d3 = new HashMap<String, String>();
+        d3.put("id", "w3");
+        d3.put("corpus", "zeitung");
+        d3.put("author", "Michael Meier");
+        d3.put("title", "Angst");
+        d3.put("subtitle", "Starr vor Angst");
+        d3.put("pubDate", "20130713");
+        d3.put("pubPlace", "Bielefeld");
+        d3.put("textClass", "sports");
+        d3.put("textStr",
+                "Er wagte nicht, sich zu ruehren. Er war starr vor Angst.");
+        d3.put("text", "Er#0-2|PPER|er|c:nom;n:sg;g:masc;p:3|<>:s#0-32$<i>8 "
+                + "wagte#3-8|VVFIN|wagen|p:3;n:sg;t:past;m:ind| "
+                + "nicht#9-14|PTKNEG|nicht|| " + ",#14-15|$,|,|| "
+                + "sich#16-20|PRF|sich|c:acc;p:3;n:sg| "
+                + "zu#21-23|PTKZU|zu|| " + "ruehren#24-31|VVFIN|ruehren|| "
+                + ".#31-32|$.|.|| "
+                + "Er#33-35|PPER|er|c:nom;p:3;n:sg;g:masc|<>:s#33-56$<i>14 "
+                + "war#36-39|VAFIN|sein|p:3;n:sg;t:past;m:ind| "
+                + "starr#40-45|ADJD|starr|comp:pos| " + "vor#46-49|APPR|vor|| "
+                + "Angst#50-55|NN|angst|c:dat;n:sg;g:fem| " + ".#55-56|$.|.||");
+        list.add(d3);
 
-	return list;
+        return list;
     };
 
+
     @Test
     public void indexLucene () throws Exception {
 
-	// Base analyzer for searching and indexing
-	StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_43);
+        // Base analyzer for searching and indexing
+        StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_43);
 
-	// Based on
-	// http://lucene.apache.org/core/4_0_0/core/org/apache/lucene/
-	// analysis/Analyzer.html?is-external=true
+        // Based on
+        // http://lucene.apache.org/core/4_0_0/core/org/apache/lucene/
+        // analysis/Analyzer.html?is-external=true
 
-	// Create configuration with base analyzer
-	IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_43, analyzer);
+        // Create configuration with base analyzer
+        IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_43,
+                analyzer);
 
-	// Add a document 1 with the correct fields
-	IndexWriter w = new IndexWriter(index, config);
+        // Add a document 1 with the correct fields
+        IndexWriter w = new IndexWriter(index, config);
 
-	Collection docs = initIndexer();
+        Collection docs = initIndexer();
 
-	@SuppressWarnings("unchecked")
-	Iterator<Map<String,String>> i = (Iterator<Map<String,String>>) docs.iterator();
+        @SuppressWarnings("unchecked")
+        Iterator<Map<String, String>> i = (Iterator<Map<String, String>>) docs
+                .iterator();
 
-	for (; i.hasNext(); ) {
-	    addDoc(w, i.next());
-	};
+        for (; i.hasNext();) {
+            addDoc(w, i.next());
+        };
 
-	assertEquals(3, w.numDocs());
+        assertEquals(3, w.numDocs());
 
-	w.close();
+        w.close();
 
-	// Check directory
-	DirectoryReader reader = DirectoryReader.open( index );
-	assertEquals(docs.size(), reader.maxDoc());
-	assertEquals(docs.size(), reader.numDocs());
+        // Check directory
+        DirectoryReader reader = DirectoryReader.open(index);
+        assertEquals(docs.size(), reader.maxDoc());
+        assertEquals(docs.size(), reader.numDocs());
 
-	// Check searcher
-	IndexSearcher searcher = new IndexSearcher( reader );
+        // Check searcher
+        IndexSearcher searcher = new IndexSearcher(reader);
 
-	// textClass
-	// All texts of text class "news"
-	assertEquals(2,
-	  searcher.search(
-	    new TermQuery(
-	      new Term("textClass", "news")
-	    ), 10
-	  ).totalHits
+        // textClass
+        // All texts of text class "news"
+        assertEquals(2, searcher.search(new TermQuery(new Term("textClass",
+                "news")), 10).totalHits);
+
+        // textClass
+        // All texts of text class "sports"
+        assertEquals(2, searcher.search(new TermQuery(new Term("textClass",
+                "sports")), 10).totalHits);
+
+        // TextIndex
+        // All docs containing "l:nehmen"
+        assertEquals(1, searcher.search(new TermQuery(new Term("text",
+                "l:nehmen")), 10).totalHits);
+
+        // TextIndex
+        // All docs containing "s:den"
+        assertEquals(
+                2,
+                searcher.search(new TermQuery(new Term("text", "s:den")), 10).totalHits);
+
+        /*
+        assertEquals(3,
+              searcher.search(
+                new TermQuery(
+                  new Term("text", "T")
+            ), 10
+          ).totalHits
+            );
+        */
+
+        // BooleanQuery
+        // All docs containing "s:den" and "l:sie"
+        TermQuery s_den = new TermQuery(new Term("text", "s:den"));
+        TermQuery l_sie = new TermQuery(new Term("text", "l:sie"));
+        BooleanQuery bool = new BooleanQuery();
+        bool.add(s_den, BooleanClause.Occur.MUST);
+        bool.add(l_sie, BooleanClause.Occur.MUST);
+
+        assertEquals(1, searcher.search(bool, 10).totalHits);
+
+        // BooleanQuery
+        // All docs containing "s:den" or "l:sie"
+        bool = new BooleanQuery();
+        bool.add(s_den, BooleanClause.Occur.SHOULD);
+        bool.add(l_sie, BooleanClause.Occur.SHOULD);
+        assertEquals(2, searcher.search(bool, 10).totalHits);
+
+
+        // RegexpQuery
+        // All docs containing ".{4}en" (liefen und Hunden)
+        RegexpQuery srquery = new RegexpQuery(new Term("text", "s:.{4}en"));
+        assertEquals(2, searcher.search(srquery, 10).totalHits);
+
+        // RegexpQuery
+        // All docs containing "E." (Er) (2x)
+        srquery = new RegexpQuery(new Term("text", "s:E."));
+        assertEquals(2, searcher.search(srquery, 10).totalHits);
+
+        SpanRegexQueryWrapper ssrquery = new SpanRegexQueryWrapper("text",
+                "s:E.");
+        assertEquals(2, searcher.search(ssrquery.toQuery(), 10).totalHits);
+
+
+        // RegexpQuery
+        // All docs containing "E." (er) (0x)
+        srquery = new RegexpQuery(new Term("text", "s:e."));
+        assertEquals(0, searcher.search(srquery, 10).totalHits);
+
+        ssrquery = new SpanRegexQueryWrapper("text", "s:e.");
+        assertEquals(0, searcher.search(ssrquery.toQuery(), 10).totalHits);
+
+        // Check http://comments.gmane.org/gmane.comp.jakarta.lucene.user/52283
+        // for Carstens question on wildcards
+
+        // RegexpQuery
+        // All docs containing "E."/i ([Ee]r) (2x)
+        srquery = new RegexpQuery(new Term("text", "i:e."));
+        assertEquals(2, searcher.search(srquery, 10).totalHits);
+
+        ssrquery = new SpanRegexQueryWrapper("text", "s:e.", true);
+        assertEquals("SpanMultiTermQueryWrapper(text:/i:e./)", ssrquery
+                .toQuery().toString());
+        assertEquals(2, searcher.search(ssrquery.toQuery(), 10).totalHits);
+
+        // All docs containing "ng"/x (Angst) (2x)
+        srquery = new RegexpQuery(new Term("text", "s:.*ng.*"));
+        assertEquals(2, searcher.search(srquery, 10).totalHits);
+
+        // [base=angst]
+        SpanTermQuery stq = new SpanTermQuery(new Term("text", "l:angst"));
+        assertEquals(2, searcher.search(srquery, 10).totalHits);
+
+        // vor Angst
+        // [orth=vor][orth=Angst]
+        SpanNearQuery snquery = new SpanNearQuery(new SpanQuery[] {
+                new SpanTermQuery(new Term("text", "s:vor")),
+                new SpanTermQuery(new Term("text", "s:Angst")) }, 1, true);
+        assertEquals(1, searcher.search(snquery, 10).totalHits);
+
+        // Spannearquery [p:VVFIN][]{,5}[m:nom:sg:fem]
+        snquery = new SpanNearQuery(new SpanQuery[] {
+                new SpanTermQuery(new Term("text", "p:VVFIN")),
+                new SpanSegmentQueryWrapper("text", "m:c:nom", "m:n:sg",
+                        "m:g:fem").toQuery() }, 5,     // slop
+                true   // inOrder
+                     // Possible: CollectPayloads
         );
+        assertEquals(1, searcher.search(snquery, 10).totalHits);
 
-	// textClass
-	// All texts of text class "sports"
-	assertEquals(2,
-	  searcher.search(
-	    new TermQuery(
-	      new Term("textClass", "sports")
-	    ), 10
-	  ).totalHits
+
+        // Spannearquery [p:VVFIN][m:acc:sg:masc]
+        snquery = new SpanNearQuery(new SpanQuery[] {
+                new SpanTermQuery(new Term("text", "p:VVFIN")),
+                new SpanNearQuery(new SpanQuery[] {
+                        new SpanTermQuery(new Term("text", "m:c:acc")),
+                        new SpanNearQuery(
+                                new SpanQuery[] {
+                                        new SpanTermQuery(new Term("text",
+                                                "m:n:sg")),
+                                        new SpanTermQuery(new Term("text",
+                                                "m:g:masc")) }, -1, false) },
+                        -1,     // slop
+                        false   // inOrder
+                // Possible: CollectPayloads
+                )
+        // new SpanTermQuery(new Term("text", "m:-acc:--sg:masc"))
+                }, 0,     // slop
+                true   // inOrder
+                     // Possible: CollectPayloads
         );
+        assertEquals(1, searcher.search(snquery, 10).totalHits);
 
-	// TextIndex
-	// All docs containing "l:nehmen"
-	assertEquals(1,
-	  searcher.search(
-	    new TermQuery(
-	      new Term("text", "l:nehmen")
-	    ), 10
-	  ).totalHits
+
+        // Spannearquery [p:VVFIN|m:3:sg:past:ind]
+        // Exact match!
+        snquery = new SpanNearQuery(new SpanQuery[] {
+                new SpanTermQuery(new Term("text", "p:VVFIN")),
+                new SpanNearQuery(new SpanQuery[] {
+                        new SpanTermQuery(new Term("text", "m:p:3")),
+                        new SpanNearQuery(new SpanQuery[] {
+                                new SpanTermQuery(new Term("text", "m:n:sg")),
+                                new SpanNearQuery(new SpanQuery[] {
+                                        new SpanTermQuery(new Term("text",
+                                                "m:t:past")),
+                                        new SpanTermQuery(new Term("text",
+                                                "m:m:ind")), }, -1, false) },
+                                -1, false) }, -1, false) },
+        // new SpanTermQuery(new Term("text", "m:---3:--sg:past:-ind"))
+                -1,     // slop
+                false   // inOrder
+        // Possible: CollectPayloads
         );
+        assertEquals(2, searcher.search(snquery, 10).totalHits);
 
-	// TextIndex
-	// All docs containing "s:den"
-	assertEquals(2,
-          searcher.search(
-            new TermQuery(
-              new Term("text", "s:den")
-	    ), 10
-	  ).totalHits
+        // To make sure, this is not equal:
+        // Spannearquery [p:VVFIN & m:3:sg:past:ind]
+        // Exact match!
+        // Maybe it IS equal
+        snquery = new SpanNearQuery(new SpanQuery[] {
+                new SpanTermQuery(new Term("text", "p:VVFIN")),
+                new SpanTermQuery(new Term("text", "m:p:3")),
+                new SpanTermQuery(new Term("text", "m:n:sg")),
+                new SpanTermQuery(new Term("text", "m:t:past")),
+                new SpanTermQuery(new Term("text", "m:m:ind")), }, -1,     // slop
+                false   // inOrder
+        // Possible: CollectPayloads
         );
+        assertNotEquals(2, searcher.search(snquery, 10).totalHits);
+        // assertEquals(2, searcher.search(snquery, 10).totalHits);
 
-	/*
-	assertEquals(3,
-          searcher.search(
-            new TermQuery(
-              new Term("text", "T")
-	    ), 10
-	  ).totalHits
+        // Spannearquery [p:VVFIN & m:3:sg & past:ind]
+        SpanSegmentQueryWrapper sniquery = new SpanSegmentQueryWrapper("text",
+                "p:VVFIN", "m:p:3", "m:n:sg", "m:t:past", "m:m:ind");
+        assertEquals(2, searcher.search(sniquery.toQuery(), 10).totalHits);
+
+
+        // Todo:
+
+        /*
+        sniquery = new SpanSegmentQuery(
+              "text",
+          "p:VVFIN",
+          "m:p:3",
+          "m:n:sg",
+          "m:t:past",
+          "m:m:ind"
+            );
+        */
+
+        // Spannearquery [p:VVFIN][]{,5}[m:nom:sg:fem]
+        snquery = new SpanNearQuery(new SpanQuery[] {
+                new SpanTermQuery(new Term("text", "p:VVFIN")),
+                new SpanSegmentQueryWrapper("text", "m:c:nom", "m:n:sg",
+                        "m:g:fem").toQuery() }, 5,     // slop
+                true   // inOrder
+                     // Possible: CollectPayloads
         );
-	*/
+        assertEquals(1, searcher.search(snquery, 10).totalHits);
 
-	// BooleanQuery
-	// All docs containing "s:den" and "l:sie"
-	TermQuery s_den = new TermQuery(new Term("text", "s:den"));
-	TermQuery l_sie = new TermQuery(new Term("text", "l:sie"));
-	BooleanQuery bool = new BooleanQuery();
-	bool.add(s_den, BooleanClause.Occur.MUST);
-	bool.add(l_sie, BooleanClause.Occur.MUST);
+        sniquery = new SpanSegmentQueryWrapper("text", "p:VVFIN", "m:p:3",
+                "m:t:past", "m:m:ind", "m:n:sg");
+        assertEquals(2, searcher.search(sniquery.toQuery(), 10).totalHits);
 
-	assertEquals(1, searcher.search(bool, 10).totalHits);
+        // [p = VVFIN & m:p = 3 & m:t = past & m:n != pl] or
+        // [p = VVFIN & m:p = 3 & m:t = past & !m:n = pl]
+        // TODO: Problem: What should happen in case the category does not exist?
+        // pssible solution: & ( m:n != pl & exists(m:n))
+        sniquery = new SpanSegmentQueryWrapper("text", "p:VVFIN", "m:p:3",
+                "m:t:past");
+        SpanQuery snqquery = new SpanNotQuery(sniquery.toQuery(),
+                new SpanTermQuery(new Term("text", "m:n:pl")));
+        assertEquals(2, searcher.search(snqquery, 10).totalHits);
 
-	// BooleanQuery
-	// All docs containing "s:den" or "l:sie"
-	bool = new BooleanQuery();
-	bool.add(s_den, BooleanClause.Occur.SHOULD);
-	bool.add(l_sie, BooleanClause.Occur.SHOULD);
-	assertEquals(2, searcher.search(bool, 10).totalHits);
+        // [p = NN & (m:c: = dat | m:c = acc)]
+        snquery = new SpanNearQuery(new SpanQuery[] {
+                new SpanTermQuery(new Term("text", "p:NN")),
+                new SpanOrQuery(new SpanTermQuery(new Term("text", "m:c:nom")),
+                        new SpanTermQuery(new Term("text", "m:c:acc"))) }, -1,
+                false);
+
+        assertEquals(2, searcher.search(snqquery, 10).totalHits);
+
+        // [p = NN & !(m:c: = nom | m:c = acc)]
+        snqquery = new SpanNotQuery(
+                new SpanTermQuery(new Term("text", "p:NN")), new SpanOrQuery(
+                        new SpanTermQuery(new Term("text", "m:c:nom")),
+                        new SpanTermQuery(new Term("text", "m:c:acc"))));
+        assertEquals(1, searcher.search(snqquery, 10).totalHits);
+
+        // [p = NN & !(m:c = nom)]
+        snqquery = new SpanNotQuery(
+                new SpanTermQuery(new Term("text", "p:NN")), new SpanTermQuery(
+                        new Term("text", "m:c:nom")));
+        assertEquals(3, searcher.search(snqquery, 10).totalHits);
+
+        // [p=NN & !(m:c = acc)]
+        snqquery = new SpanNotQuery(
+                new SpanTermQuery(new Term("text", "p:NN")), new SpanTermQuery(
+                        new Term("text", "m:c:acc")));
+        assertEquals(2, searcher.search(snqquery, 10).totalHits);
+
+        // [p=PPER][][p=ART]
+        snquery = new SpanNearQuery(
+                new SpanQuery[] {
+                        new SpanTermQuery(new Term("text", "p:PPER")),
+                        new SpanNearQuery(new SpanQuery[] {
+                                new SpanTermQuery(new Term("text", "T")),
+                                new SpanTermQuery(new Term("text", "p:ART")) },
+                                0, true), }, 0, true);
+        assertEquals(1, searcher.search(snquery, 10).totalHits);
 
 
-	// RegexpQuery
-	// All docs containing ".{4}en" (liefen und Hunden)
-	RegexpQuery srquery = new RegexpQuery(
-            new Term("text", "s:.{4}en")
-        );
-	assertEquals(2, searcher.search(srquery, 10).totalHits);
+        // Todo:
+        // [orth=się][]{2,4}[base=bać]
+        // [orth=się][orth!="[.!?,:]"]{,5}[base=bać]|[base=bać][base="on|ja|ty|my|wy"]?[orth=się]
+        // [pos=subst & orth="a.*"]{2}
+        // [tag=subst:sg:nom:n]
+        // [case==acc & case==gen] ??
+        // [case~acc & case~gen]
+        // [case~~acc]
+        // [base=bać][orth!=się]+[orth=się] within s
 
-	// RegexpQuery
-	// All docs containing "E." (Er) (2x)
-        srquery = new RegexpQuery(
-            new Term("text", "s:E.")
-        );
-	assertEquals(2, searcher.search(srquery, 10).totalHits);
-
-	SpanRegexQueryWrapper ssrquery = new SpanRegexQueryWrapper("text", "s:E.");
-	assertEquals(2, searcher.search(ssrquery.toQuery(), 10).totalHits);
+        // [][][p:VAFIN] within s
+        // [][p:VAFIN] within s
 
 
-	// RegexpQuery
-	// All docs containing "E." (er) (0x)
-	srquery = new RegexpQuery(
-            new Term("text", "s:e.")
-        );
-	assertEquals(0, searcher.search(srquery, 10).totalHits);
+        // [][][p:VAFIN]
+        snquery = new SpanNearQuery(new SpanQuery[] {
+                new SpanNearQuery(new SpanQuery[] {
+                        new SpanTermQuery(new Term("text", "T")),
+                        new SpanTermQuery(new Term("text", "T")) }, 0, true),
+                new SpanTermQuery(new Term("text", "p:VAFIN")) }, 0, true);
+        assertEquals(1, searcher.search(snquery, 10).totalHits);
 
-	ssrquery = new SpanRegexQueryWrapper("text", "s:e.");
-	assertEquals(0, searcher.search(ssrquery.toQuery(), 10).totalHits);
+        /*
+        http://stackoverflow.com/questions/1311199/finding-the-position-of-search-hits-from-lucene
+        */
 
-	// Check http://comments.gmane.org/gmane.comp.jakarta.lucene.user/52283
-	// for Carstens question on wildcards
+        StringBuilder payloadString = new StringBuilder();
+        Map<Term, TermContext> termContexts = new HashMap<>();
+        for (AtomicReaderContext atomic : reader.leaves()) {
+            Bits bitset = atomic.reader().getLiveDocs();
+            //	    Spans spans = NearSpansOrdered();
+            Spans spans = snquery.getSpans(atomic, bitset, termContexts);
 
-	// RegexpQuery
-	// All docs containing "E."/i ([Ee]r) (2x)
-	srquery = new RegexpQuery(
-            new Term("text", "i:e.")
-        );
-	assertEquals(2, searcher.search(srquery, 10).totalHits);
-
-	ssrquery = new SpanRegexQueryWrapper("text", "s:e.", true);
-	assertEquals("SpanMultiTermQueryWrapper(text:/i:e./)", ssrquery.toQuery().toString());
-	assertEquals(2, searcher.search(ssrquery.toQuery(), 10).totalHits);
-
-	// All docs containing "ng"/x (Angst) (2x)
-	srquery = new RegexpQuery(
-            new Term("text", "s:.*ng.*")
-        );
-	assertEquals(2, searcher.search(srquery, 10).totalHits);
-
-	// [base=angst]
-	SpanTermQuery stq = new SpanTermQuery(new Term("text", "l:angst"));
-	assertEquals(2, searcher.search(srquery, 10).totalHits);
-
-	// vor Angst
-	// [orth=vor][orth=Angst]
-	SpanNearQuery snquery = new SpanNearQuery(
-          new SpanQuery[] {
-	      new SpanTermQuery(new Term("text", "s:vor")),
-	      new SpanTermQuery(new Term("text", "s:Angst"))
-	  },
-	  1,
-	  true
-        );
-	assertEquals(1, searcher.search(snquery, 10).totalHits);
-
-	// Spannearquery [p:VVFIN][]{,5}[m:nom:sg:fem]
-	snquery = new SpanNearQuery(
-          new SpanQuery[] {
-	    new SpanTermQuery(new Term("text", "p:VVFIN")),
-	    new SpanSegmentQueryWrapper("text", "m:c:nom", "m:n:sg", "m:g:fem").toQuery()
-          },
-	  5,     // slop
-	  true   // inOrder
-          // Possible: CollectPayloads
-	);
-	assertEquals(1, searcher.search(snquery, 10).totalHits);
-
-
-	// Spannearquery [p:VVFIN][m:acc:sg:masc]
-	snquery = new SpanNearQuery(
-          new SpanQuery[] {
-	    new SpanTermQuery(new Term("text", "p:VVFIN")),
-	    new SpanNearQuery(
-	      new SpanQuery[] {
-                new SpanTermQuery(new Term("text", "m:c:acc")),
-	        new SpanNearQuery(
-	          new SpanQuery[] {
-                    new SpanTermQuery(new Term("text", "m:n:sg")),
-                    new SpanTermQuery(new Term("text", "m:g:masc"))
-                  },
-		  -1,
-		  false
-		)
-       	      },
-	      -1,     // slop
-	      false   // inOrder
-	      // Possible: CollectPayloads
-	    )
-            // new SpanTermQuery(new Term("text", "m:-acc:--sg:masc"))
-          },
-	  0,     // slop
-	  true   // inOrder
-          // Possible: CollectPayloads
-	);
-	assertEquals(1, searcher.search(snquery, 10).totalHits);
-
-
-	// Spannearquery [p:VVFIN|m:3:sg:past:ind]
-	// Exact match!
-	snquery = new SpanNearQuery(
-	  new SpanQuery[] {
-	    new SpanTermQuery(new Term("text", "p:VVFIN")),
-            new SpanNearQuery(
-              new SpanQuery[] {
-	        new SpanTermQuery(new Term("text", "m:p:3")),
-	        new SpanNearQuery(
-                  new SpanQuery[] {
-	            new SpanTermQuery(new Term("text", "m:n:sg")),
-	            new SpanNearQuery(
-		      new SpanQuery[] {
-		        new SpanTermQuery(new Term("text", "m:t:past")),
-	                new SpanTermQuery(new Term("text", "m:m:ind")),
-                      },
-		      -1,
-		      false
-		    )
-		  },
-		  -1,
-		  false
-	        )
-              },
-	      -1,
-	      false
-	    )
-	  },
-	  // new SpanTermQuery(new Term("text", "m:---3:--sg:past:-ind"))
-	  -1,     // slop
-	  false   // inOrder
-          // Possible: CollectPayloads
-	);
-	assertEquals(2, searcher.search(snquery, 10).totalHits);
-
-	// To make sure, this is not equal:
-	// Spannearquery [p:VVFIN & m:3:sg:past:ind]
-	// Exact match!
-	// Maybe it IS equal
-	snquery = new SpanNearQuery(
-	  new SpanQuery[] {
-	    new SpanTermQuery(new Term("text", "p:VVFIN")),
-	    new SpanTermQuery(new Term("text", "m:p:3")),
-	    new SpanTermQuery(new Term("text", "m:n:sg")),
-	    new SpanTermQuery(new Term("text", "m:t:past")),
-	    new SpanTermQuery(new Term("text", "m:m:ind")),
-	  },
-	  -1,     // slop
-	  false   // inOrder
-          // Possible: CollectPayloads
-	);
-	assertNotEquals(2, searcher.search(snquery, 10).totalHits);
-	// assertEquals(2, searcher.search(snquery, 10).totalHits);
-
-	// Spannearquery [p:VVFIN & m:3:sg & past:ind]
-	SpanSegmentQueryWrapper sniquery = new SpanSegmentQueryWrapper(
-          "text",
-	  "p:VVFIN",
-	  "m:p:3",
-	  "m:n:sg",
-	  "m:t:past",
-	  "m:m:ind"
-        );
-	assertEquals(2, searcher.search(sniquery.toQuery(), 10).totalHits);
-
-
-	// Todo:
-
-	/*
-	sniquery = new SpanSegmentQuery(
-          "text",
-	  "p:VVFIN",
-	  "m:p:3",
-	  "m:n:sg",
-	  "m:t:past",
-	  "m:m:ind"
-        );
-	*/
-
-	// Spannearquery [p:VVFIN][]{,5}[m:nom:sg:fem]
-	snquery = new SpanNearQuery(
-          new SpanQuery[] {
-	    new SpanTermQuery(new Term("text", "p:VVFIN")),
-	    new SpanSegmentQueryWrapper("text", "m:c:nom", "m:n:sg", "m:g:fem").toQuery()
-          },
-	  5,     // slop
-	  true   // inOrder
-          // Possible: CollectPayloads
-	);
-	assertEquals(1, searcher.search(snquery, 10).totalHits);
-
-	sniquery = new SpanSegmentQueryWrapper("text", "p:VVFIN", "m:p:3", "m:t:past", "m:m:ind", "m:n:sg");
-	assertEquals(2, searcher.search(sniquery.toQuery(), 10).totalHits);
-
-	// [p = VVFIN & m:p = 3 & m:t = past & m:n != pl] or
-	// [p = VVFIN & m:p = 3 & m:t = past & !m:n = pl]
-	// TODO: Problem: What should happen in case the category does not exist?
-	// pssible solution: & ( m:n != pl & exists(m:n))
-	sniquery = new SpanSegmentQueryWrapper("text", "p:VVFIN", "m:p:3", "m:t:past");
-	SpanQuery snqquery = new SpanNotQuery(sniquery.toQuery(), new SpanTermQuery(new Term("text", "m:n:pl")));
-	assertEquals(2, searcher.search(snqquery, 10).totalHits);
-
-	// [p = NN & (m:c: = dat | m:c = acc)]
-	snquery = new SpanNearQuery(
-	    new SpanQuery[] {
-		new SpanTermQuery(new Term("text", "p:NN")),
-  	        new SpanOrQuery(
-			new SpanTermQuery( new Term("text", "m:c:nom" )),
-		        new SpanTermQuery( new Term("text", "m:c:acc" ))
-	        )
-	    },
-	    -1,
-	    false
-	);
-
-	assertEquals(2, searcher.search(snqquery, 10).totalHits);
-
-	// [p = NN & !(m:c: = nom | m:c = acc)]
-	snqquery = new SpanNotQuery(
-	   new SpanTermQuery(new Term("text", "p:NN")),
-	   new SpanOrQuery(
-		new SpanTermQuery( new Term("text", "m:c:nom" )),
-		new SpanTermQuery( new Term("text", "m:c:acc" ))
-	   )
-        );
-	assertEquals(1, searcher.search(snqquery, 10).totalHits);
-
-	// [p = NN & !(m:c = nom)]
-	snqquery = new SpanNotQuery(
-	   new SpanTermQuery( new Term("text", "p:NN")),
-	   new SpanTermQuery( new Term("text", "m:c:nom" ))
-        );
-	assertEquals(3, searcher.search(snqquery, 10).totalHits);
-
-	// [p=NN & !(m:c = acc)]
-	snqquery = new SpanNotQuery(
-	   new SpanTermQuery( new Term("text", "p:NN")),
-	   new SpanTermQuery( new Term("text", "m:c:acc" ))
-        );
-	assertEquals(2, searcher.search(snqquery, 10).totalHits);
-
-	// [p=PPER][][p=ART]
-	snquery = new SpanNearQuery(
-  	    new SpanQuery[] {
-		new SpanTermQuery( new Term("text", "p:PPER")),
-		new SpanNearQuery(
-		    new SpanQuery[] {
-			new SpanTermQuery( new Term("text", "T")),
-			new SpanTermQuery( new Term("text", "p:ART"))
-		    },
-		    0,
-		    true),
-	    },
-	    0, 
-	    true
-        );
-	assertEquals(1, searcher.search(snquery, 10).totalHits);
-
-
-	// Todo:
-	// [orth=się][]{2,4}[base=bać]
-	// [orth=się][orth!="[.!?,:]"]{,5}[base=bać]|[base=bać][base="on|ja|ty|my|wy"]?[orth=się]
-	// [pos=subst & orth="a.*"]{2}
-	// [tag=subst:sg:nom:n]
-	// [case==acc & case==gen] ??
-	// [case~acc & case~gen]
-	// [case~~acc]
-	// [base=bać][orth!=się]+[orth=się] within s
-
-	// [][][p:VAFIN] within s
-	// [][p:VAFIN] within s
-
-
-	// [][][p:VAFIN]
-	snquery = new SpanNearQuery(
-  	    new SpanQuery[] {
-		new SpanNearQuery(
-  	            new SpanQuery[] {
-		        new SpanTermQuery( new Term("text", "T") ),
-		        new SpanTermQuery( new Term("text", "T") )
-                    },
-		    0,
-		    true
- 	        ),
-		new SpanTermQuery( new Term("text", "p:VAFIN") )
-	    },
-	    0,
-	    true
-        );
-	assertEquals(1, searcher.search(snquery, 10).totalHits);
-
-/*
-http://stackoverflow.com/questions/1311199/finding-the-position-of-search-hits-from-lucene
-*/
-
-	StringBuilder payloadString = new StringBuilder();
-	Map<Term, TermContext> termContexts = new HashMap<>();
-	for (AtomicReaderContext atomic : reader.leaves()) {
-	    Bits bitset = atomic.reader().getLiveDocs();
-	    //	    Spans spans = NearSpansOrdered();
-	    Spans spans = snquery.getSpans(atomic, bitset, termContexts);
-
-	    while (spans.next()) {
-		int docid = atomic.docBase + spans.doc();
-		if (spans.isPayloadAvailable()) {
-		    for (byte[] payload : spans.getPayload()) {
-			/* retrieve payload for current matching span */
-			payloadString.append(new String(payload));
-			payloadString.append(" | ");
-		    };
-		};
-	    };
-	};
-	//	assertEquals(33, payloadString.length());
-	assertEquals(0, payloadString.length());
+            while (spans.next()) {
+                int docid = atomic.docBase + spans.doc();
+                if (spans.isPayloadAvailable()) {
+                    for (byte[] payload : spans.getPayload()) {
+                        /* retrieve payload for current matching span */
+                        payloadString.append(new String(payload));
+                        payloadString.append(" | ");
+                    };
+                };
+            };
+        };
+        //	assertEquals(33, payloadString.length());
+        assertEquals(0, payloadString.length());
 
 
 
-	// [][][p:VAFIN]
-	// without collecting payloads
-	snquery = new SpanNearQuery(
-  	    new SpanQuery[] {
-		new SpanNearQuery(
-  	            new SpanQuery[] {
-		        new SpanTermQuery( new Term("text", "T") ),
-		        new SpanTermQuery( new Term("text", "T") )
-                    },
-		    0,
-		    true,
-		    false
- 	        ),
-		new SpanTermQuery( new Term("text", "p:VAFIN") )
-	    },
-	    0,
-	    true,
-	    false
-        );
-	assertEquals(1, searcher.search(snquery, 10).totalHits);
+        // [][][p:VAFIN]
+        // without collecting payloads
+        snquery = new SpanNearQuery(
+                new SpanQuery[] {
+                        new SpanNearQuery(new SpanQuery[] {
+                                new SpanTermQuery(new Term("text", "T")),
+                                new SpanTermQuery(new Term("text", "T")) }, 0,
+                                true, false),
+                        new SpanTermQuery(new Term("text", "p:VAFIN")) }, 0,
+                true, false);
+        assertEquals(1, searcher.search(snquery, 10).totalHits);
 
-	payloadString = new StringBuilder();
-	termContexts = new HashMap<>();
-	for (AtomicReaderContext atomic : reader.leaves()) {
-	    Bits bitset = atomic.reader().getLiveDocs();
-	    //	    Spans spans = NearSpansOrdered();
-	    Spans spans = snquery.getSpans(atomic, bitset, termContexts);
+        payloadString = new StringBuilder();
+        termContexts = new HashMap<>();
+        for (AtomicReaderContext atomic : reader.leaves()) {
+            Bits bitset = atomic.reader().getLiveDocs();
+            //	    Spans spans = NearSpansOrdered();
+            Spans spans = snquery.getSpans(atomic, bitset, termContexts);
 
-	    while (spans.next()) {
-		int docid = atomic.docBase + spans.doc();
-		for (byte[] payload : spans.getPayload()) {
-		    /* retrieve payload for current matching span */
-		    payloadString.append(new String(payload));
-		    payloadString.append(" | ");
-		};
-	    };
-	};
-	assertEquals(0, payloadString.length());
+            while (spans.next()) {
+                int docid = atomic.docBase + spans.doc();
+                for (byte[] payload : spans.getPayload()) {
+                    /* retrieve payload for current matching span */
+                    payloadString.append(new String(payload));
+                    payloadString.append(" | ");
+                };
+            };
+        };
+        assertEquals(0, payloadString.length());
 
 
-	// [][][p:VAFIN] in s
-	// ([e:s:<][]*[T] | [T & e:s:<]) [T] ([p:VAFIN & e:s:>] | [T][]*[e:s:>]
+        // [][][p:VAFIN] in s
+        // ([e:s:<][]*[T] | [T & e:s:<]) [T] ([p:VAFIN & e:s:>] | [T][]*[e:s:>]
 
-	/*
+        /*
 
-	SpanSegmentWithinQuery ssequery = new SpanSegmentWithinQuery(
-	    "text","s", new SpanSegmentSequenceQuery("text", "T", "T", "p:VAFIN")
-        );
-	assertEquals(0, searcher.search(ssequery.toQuery(), 10).totalHits);
+        SpanSegmentWithinQuery ssequery = new SpanSegmentWithinQuery(
+            "text","s", new SpanSegmentSequenceQuery("text", "T", "T", "p:VAFIN")
+            );
+        assertEquals(0, searcher.search(ssequery.toQuery(), 10).totalHits);
 
-	payloadString = new StringBuilder();
-	termContexts = new HashMap<>();
-	for (AtomicReaderContext atomic : reader.leaves()) {
-	    Bits bitset = atomic.reader().getLiveDocs();
-	    // Spans spans = NearSpansOrdered();
-	    Spans spans = ssequery.toQuery().getSpans(atomic, bitset, termContexts);
+        payloadString = new StringBuilder();
+        termContexts = new HashMap<>();
+        for (AtomicReaderContext atomic : reader.leaves()) {
+            Bits bitset = atomic.reader().getLiveDocs();
+            // Spans spans = NearSpansOrdered();
+            Spans spans = ssequery.toQuery().getSpans(atomic, bitset, termContexts);
 
-	    while (spans.next()) {
-		int docid = atomic.docBase + spans.doc();
-		for (byte[] payload : spans.getPayload()) {
-		/// retrieve payload for current matching span
-		    payloadString.append(new String(payload));
-		    payloadString.append(" | ");
-		};
-	    };
-	};
-	assertEquals(0, payloadString.length(), 1);
+            while (spans.next()) {
+        	int docid = atomic.docBase + spans.doc();
+        	for (byte[] payload : spans.getPayload()) {
+        	/// retrieve payload for current matching span
+        	    payloadString.append(new String(payload));
+        	    payloadString.append(" | ");
+        	};
+            };
+        };
+        assertEquals(0, payloadString.length(), 1);
 
-	ssequery = new SpanSegmentWithinQuery(
-	    "text","s", new SpanSegmentSequenceQuery("text", "T", "p:VAFIN")
-        );
+        ssequery = new SpanSegmentWithinQuery(
+            "text","s", new SpanSegmentSequenceQuery("text", "T", "p:VAFIN")
+            );
 
-	assertEquals("for " + ssequery.toQuery(),
-		     1, searcher.search(ssequery.toQuery(), 10).totalHits);
+        assertEquals("for " + ssequery.toQuery(),
+        	     1, searcher.search(ssequery.toQuery(), 10).totalHits);
 
-	payloadString = new StringBuilder();
-	termContexts = new HashMap<>();
-	for (AtomicReaderContext atomic : reader.leaves()) {
-	    Bits bitset = atomic.reader().getLiveDocs();
-	    // Spans spans = NearSpansOrdered();
-	    Spans spans = ssequery.toQuery().getSpans(atomic, bitset, termContexts);
+        payloadString = new StringBuilder();
+        termContexts = new HashMap<>();
+        for (AtomicReaderContext atomic : reader.leaves()) {
+            Bits bitset = atomic.reader().getLiveDocs();
+            // Spans spans = NearSpansOrdered();
+            Spans spans = ssequery.toQuery().getSpans(atomic, bitset, termContexts);
 
-	    while (spans.next()) {
-		int docid = atomic.docBase + spans.doc();
-		for (byte[] payload : spans.getPayload()) {
-		    // retrieve payload for current matching span
-		    payloadString.append(new String(payload));
-		    payloadString.append(" | ");
-		};
-		fail("Doc: " + docid + " with " + spans.start() + "-" + spans.end() + " || " + payloadString.toString());
-	    };
-	};
-	assertEquals(20, payloadString.length());
+            while (spans.next()) {
+        	int docid = atomic.docBase + spans.doc();
+        	for (byte[] payload : spans.getPayload()) {
+        	    // retrieve payload for current matching span
+        	    payloadString.append(new String(payload));
+        	    payloadString.append(" | ");
+        	};
+        	fail("Doc: " + docid + " with " + spans.start() + "-" + spans.end() + " || " + payloadString.toString());
+            };
+        };
+        assertEquals(20, payloadString.length());
 
-	*/
+        */
 
-	// --------------------______>
+        // --------------------______>
 
 
 
-	//	Spans spans = MultiSpansWrapper.wrap(searcher.getTopReaderContext(), ssequery.toQuery());
-	/*
-    TopDocs topDocs = is.search(snq, 1);
-    Set<String> payloadSet = new HashSet<String>();
-    for (int i = 0; i < topDocs.scoreDocs.length; i++) {
-      while (spans.next()) {
-        Collection<byte[]> payloads = spans.getPayload();
+        //	Spans spans = MultiSpansWrapper.wrap(searcher.getTopReaderContext(), ssequery.toQuery());
+        /*
+        TopDocs topDocs = is.search(snq, 1);
+        Set<String> payloadSet = new HashSet<String>();
+        for (int i = 0; i < topDocs.scoreDocs.length; i++) {
+          while (spans.next()) {
+            Collection<byte[]> payloads = spans.getPayload();
 
-        for (final byte [] payload : payloads) {
-          payloadSet.add(new String(payload, "UTF-8"));
+            for (final byte [] payload : payloads) {
+              payloadSet.add(new String(payload, "UTF-8"));
+            }
+          }
         }
-      }
-    }
-	*/
+        */
 
 
-	/*
-Alternativ:
-    IndexReader reader = writer.getReader();
-    writer.close();
-    IndexSearcher searcher = newSearcher(reader);
+        /*
+        Alternativ:
+        IndexReader reader = writer.getReader();
+        writer.close();
+        IndexSearcher searcher = newSearcher(reader);
 
-    PayloadSpanUtil psu = new PayloadSpanUtil(searcher.getTopReaderContext());
-    
-    Collection<byte[]> payloads = psu.getPayloadsForQuery(new TermQuery(new Term(PayloadHelper.FIELD, "rr")));
-    if(VERBOSE)
-      System.out.println("Num payloads:" + payloads.size());
-    for (final byte [] bytes : payloads) {
-      if(VERBOSE)
-        System.out.println(new String(bytes, "UTF-8"));
-    }
-*/
+        PayloadSpanUtil psu = new PayloadSpanUtil(searcher.getTopReaderContext());
+        
+        Collection<byte[]> payloads = psu.getPayloadsForQuery(new TermQuery(new Term(PayloadHelper.FIELD, "rr")));
+        if(VERBOSE)
+          System.out.println("Num payloads:" + payloads.size());
+        for (final byte [] bytes : payloads) {
+          if(VERBOSE)
+            System.out.println(new String(bytes, "UTF-8"));
+        }
+        */
 
 
 
-	/* new: */
+        /* new: */
 
-	// PayloadHelper helper = new PayloadHelper();
+        // PayloadHelper helper = new PayloadHelper();
 
-	// Map<Term, TermContext> termContexts = new HashMap<>();
-//Spans spans;
-//spans = snquery.getSpans(searcher.getIndexReader());
-//    searcher = helper.setUp(similarity, 1000);
-	/*
-	IndexReader reader = search.getReader(querycontainer.getFoundry());
-	Spans luceneSpans;
-	Bits bitset = atomic.reader().getLiveDocs();
-	for (byte[] payload : luceneSpans.getPayload())
+        // Map<Term, TermContext> termContexts = new HashMap<>();
+        //Spans spans;
+        //spans = snquery.getSpans(searcher.getIndexReader());
+        //    searcher = helper.setUp(similarity, 1000);
+        /*
+        IndexReader reader = search.getReader(querycontainer.getFoundry());
+        Spans luceneSpans;
+        Bits bitset = atomic.reader().getLiveDocs();
+        for (byte[] payload : luceneSpans.getPayload())
 
-	/* Iterate over all matching documents */
-	/*
-	    while (luceneSpans.next() && total < config.getMaxhits()) {
-		Span matchSpan;
-		StringBuilder payloadString = new StringBuilder();
-		int docid = atomic.docBase + luceneSpans.doc();
-		String docname = search.retrieveDocname(docid,
-						querycontainer.getFoundry());
-						total++;
+        /* Iterate over all matching documents */
+        /*
+            while (luceneSpans.next() && total < config.getMaxhits()) {
+        	Span matchSpan;
+        	StringBuilder payloadString = new StringBuilder();
+        	int docid = atomic.docBase + luceneSpans.doc();
+        	String docname = search.retrieveDocname(docid,
+        					querycontainer.getFoundry());
+        					total++;
 
-		for (byte[] payload : luceneSpans.getPayload())
-	*/
-					/* retrieve payload for current matching span */
-	//				payloadString.append(new String(payload));
+        	for (byte[] payload : luceneSpans.getPayload())
+        */
+        /* retrieve payload for current matching span */
+        //				payloadString.append(new String(payload));
 
-				/* create span containing result */
-		/*
-				matchSpan = new Span(docname);
-				matchSpan.setIndexdocid(docid);
-				matchSpan.setLayer(querycontainer.getLayer());
-				matchSpan.storePayloads(payloadString.toString());
-				matchSpans.add(matchSpan);
-*/
-				/*
-				 * topdocs = searcher.search(new ConstantScoreQuery(corpusQ add
-				 * position to list of positions to be considered for later
-				 * searches
-				 */
-				/*
-				validValues.put(docname,
-						matchSpan.getPayload(config.getPrefix()));
-			}
-*/
+        /* create span containing result */
+        /*
+        		matchSpan = new Span(docname);
+        		matchSpan.setIndexdocid(docid);
+        		matchSpan.setLayer(querycontainer.getLayer());
+        		matchSpan.storePayloads(payloadString.toString());
+        		matchSpans.add(matchSpan);
+        */
+        /*
+         * topdocs = searcher.search(new ConstantScoreQuery(corpusQ add
+         * position to list of positions to be considered for later
+         * searches
+         */
+        /*
+        validValues.put(docname,
+        		matchSpan.getPayload(config.getPrefix()));
+        }
+        */
 
 
-	// Todo: API made by add() typisiert für queries, strings
+        // Todo: API made by add() typisiert für queries, strings
 
-	// SpanPayloadCheckQuery for sentences!
+        // SpanPayloadCheckQuery for sentences!
 
-	/* Support regular expression in SpanSegmentQuery */
-	// new Regexp();
-	// new Term();
+        /* Support regular expression in SpanSegmentQuery */
+        // new Regexp();
+        // new Term();
 
-	/*
-	  Vielleicht: spanSegmentQuery(new Term(), new Wildcard(), new Regex());
-	 */
+        /*
+          Vielleicht: spanSegmentQuery(new Term(), new Wildcard(), new Regex());
+         */
 
-	// And Not ->
-	//	SpanTermDiffQuery
+        // And Not ->
+        //	SpanTermDiffQuery
 
-	/*
-	SpanNearQuery poquery = new SpanNearQuery(
+        /*
+        SpanNearQuery poquery = new SpanNearQuery(
 
-	);
-	*/
+        );
+        */
 
-	reader.close();
+        reader.close();
 
 
     };
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestKrillDocument.java b/src/test/java/de/ids_mannheim/korap/index/TestKrillDocument.java
index a653358..162e5eb 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestKrillDocument.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestKrillDocument.java
@@ -22,6 +22,7 @@
 
     private class KrillRealDocument extends AbstractDocument {};
 
+
     @Test
     public void createDocument () throws IOException {
         KrillRealDocument krd = new KrillRealDocument();
@@ -48,8 +49,7 @@
         try {
             krd.setUID("zzz");
         }
-        catch (NumberFormatException e) {
-        };
+        catch (NumberFormatException e) {};
         assertEquals(561, krd.getUID());
 
         krd.setTitle("An Example");
@@ -61,7 +61,7 @@
         krd.setPrimaryData("We don't need no education");
         assertEquals("We don't need no education", krd.getPrimaryData());
         assertEquals("don't need no education", krd.getPrimaryData(3));
-        assertEquals("do", krd.getPrimaryData(3,5));
+        assertEquals("do", krd.getPrimaryData(3, 5));
         assertEquals(26, krd.getPrimaryDataLength());
 
         krd.setPrimaryData("abc");
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestKrillIndex.java b/src/test/java/de/ids_mannheim/korap/index/TestKrillIndex.java
index f909b42..653549a 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestKrillIndex.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestKrillIndex.java
@@ -36,10 +36,9 @@
         fd.addInt("zahl1", 56);
         fd.addInt("zahl2", "58");
         fd.addText("teaser", "Das ist der Name der Rose");
-        fd.addTV("base",
-                 "ich bau",
-                 "[(0-3)s:ich|l:ich|p:PPER|-:sentences$<i>2]" +
-                 "[(4-7)s:bau|l:bauen|p:VVFIN]");
+        fd.addTV("base", "ich bau",
+                "[(0-3)s:ich|l:ich|p:PPER|-:sentences$<i>2]"
+                        + "[(4-7)s:bau|l:bauen|p:VVFIN]");
         ki.addDoc(fd);
 
         fd = new FieldDocument();
@@ -53,7 +52,7 @@
         mtts.addMultiTermToken("s:sind#4-8", "l:sein", "p:VVFIN");
         mtts.addMeta("sentences", (int) 5);
         fd.addTV("base", "wir sind", mtts);
-        
+
         ki.addDoc(fd);
 
         /* Save documents */
@@ -68,10 +67,8 @@
         fd.addInt("zahl1", 59);
         fd.addInt("zahl2", 65);
         fd.addText("teaser", "Noch ein Versuch");
-        fd.addTV("base",
-                 "ich bau",
-                 "[(0-3)s:der|l:der|p:DET|-:sentences$<i>3]" +
-                 "[(4-8)s:baum|l:baum|p:NN]");
+        fd.addTV("base", "ich bau", "[(0-3)s:der|l:der|p:DET|-:sentences$<i>3]"
+                + "[(4-8)s:baum|l:baum|p:NN]");
         ki.addDoc(fd);
 
         /* Save documents */
@@ -84,16 +81,17 @@
         // ki.search();
     };
 
+
     @Test
     public void indexAlteration () throws IOException {
         KrillIndex ki = new KrillIndex();
-        
+
         assertEquals(0, ki.numberOf("base", "documents"));
 
         FieldDocument fd = new FieldDocument();
         fd.addString("name", "Peter");
         ki.addDoc(fd);
-        
+
         assertEquals(0, ki.numberOf("base", "documents"));
 
         fd = new FieldDocument();
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestMatchCollector.java b/src/test/java/de/ids_mannheim/korap/index/TestMatchCollector.java
index 1b856c9..fcc7ebf 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestMatchCollector.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestMatchCollector.java
@@ -38,52 +38,41 @@
 
     @Test
     public void indexExample1 () throws IOException {
-	KrillIndex ki = new KrillIndex();
+        KrillIndex ki = new KrillIndex();
 
-	// abcabcabac
-	FieldDocument fd = new FieldDocument();
-	fd.addString("ID", "doc-1");
-	fd.addString("UID", "1");
-	fd.addTV("base",
-		 "abcabcabac",
-		 "[(0-1)s:a|i:a|_0#0-1|-:t$<i>10]" +
-		 "[(1-2)s:b|i:b|_1#1-2]" +
-		 "[(2-3)s:c|i:c|_2#2-3]" +
-		 "[(3-4)s:a|i:a|_3#3-4]" +
-		 "[(4-5)s:b|i:b|_4#4-5]" +
-		 "[(5-6)s:c|i:c|_5#5-6]" +
-		 "[(6-7)s:a|i:a|_6#6-7]" +
-		 "[(7-8)s:b|i:b|_7#7-8]" +
-		 "[(8-9)s:a|i:a|_8#8-9]" +
-		 "[(9-10)s:c|i:c|_9#9-10]");
-	ki.addDoc(fd);
+        // abcabcabac
+        FieldDocument fd = new FieldDocument();
+        fd.addString("ID", "doc-1");
+        fd.addString("UID", "1");
+        fd.addTV("base", "abcabcabac", "[(0-1)s:a|i:a|_0#0-1|-:t$<i>10]"
+                + "[(1-2)s:b|i:b|_1#1-2]" + "[(2-3)s:c|i:c|_2#2-3]"
+                + "[(3-4)s:a|i:a|_3#3-4]" + "[(4-5)s:b|i:b|_4#4-5]"
+                + "[(5-6)s:c|i:c|_5#5-6]" + "[(6-7)s:a|i:a|_6#6-7]"
+                + "[(7-8)s:b|i:b|_7#7-8]" + "[(8-9)s:a|i:a|_8#8-9]"
+                + "[(9-10)s:c|i:c|_9#9-10]");
+        ki.addDoc(fd);
 
-	fd = new FieldDocument();
-	fd.addString("ID", "doc-2");
-	fd.addString("UID", "2");
-	fd.addTV("base",
-		 "bcbabd",			 
-		 "[(0-1)s:b|i:b|_1#0-1]" +
-		 "[(1-2)s:c|i:c|s:b|_2#1-2]" +			 
-		 "[(2-3)s:b|i:b|_3#2-3|<>:e#2-4$<i>4]" +
-		 "[(3-4)s:a|i:a|_4#3-4|<>:e#3-5$<i>5|<>:e2#3-5$<i>5]" + 
-		 "[(4-5)s:b|i:b|s:c|_5#4-5]" +			 
-		 "[(5-6)s:d|i:d|_6#5-6|<>:e2#5-6$<i>6]");
-	ki.addDoc(fd);
+        fd = new FieldDocument();
+        fd.addString("ID", "doc-2");
+        fd.addString("UID", "2");
+        fd.addTV("base", "bcbabd", "[(0-1)s:b|i:b|_1#0-1]"
+                + "[(1-2)s:c|i:c|s:b|_2#1-2]"
+                + "[(2-3)s:b|i:b|_3#2-3|<>:e#2-4$<i>4]"
+                + "[(3-4)s:a|i:a|_4#3-4|<>:e#3-5$<i>5|<>:e2#3-5$<i>5]"
+                + "[(4-5)s:b|i:b|s:c|_5#4-5]"
+                + "[(5-6)s:d|i:d|_6#5-6|<>:e2#5-6$<i>6]");
+        ki.addDoc(fd);
 
-	ki.commit();
+        ki.commit();
 
-	SpanQuery sq;
+        SpanQuery sq;
 
-	sq = new SpanTermQuery(new Term("base", "s:b"));
-    Krill krill = new Krill(sq);
-    krill.getMeta().setCount((short) 10);
-	MatchCollector mc = ki.collect(
-	  krill,
-	  new MatchCollector()
-	);
+        sq = new SpanTermQuery(new Term("base", "s:b"));
+        Krill krill = new Krill(sq);
+        krill.getMeta().setCount((short) 10);
+        MatchCollector mc = ki.collect(krill, new MatchCollector());
 
-	assertEquals(mc.getTotalResults(), 5);
-	assertEquals(mc.getTotalResultDocs(), 2);
+        assertEquals(mc.getTotalResults(), 5);
+        assertEquals(mc.getTotalResultDocs(), 2);
     };
 };
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestMatchIdentifier.java b/src/test/java/de/ids_mannheim/korap/index/TestMatchIdentifier.java
index d3184ae..a77a82b 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestMatchIdentifier.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestMatchIdentifier.java
@@ -20,7 +20,6 @@
 import de.ids_mannheim.korap.response.Match;
 import de.ids_mannheim.korap.util.QueryException;
 
-
 import de.ids_mannheim.korap.index.FieldDocument;
 
 @RunWith(JUnit4.class)
@@ -28,765 +27,556 @@
 
     @Test
     public void identifierExample1 () throws IOException, QueryException {
-	MatchIdentifier id = new MatchIdentifier("match-c1!d1-p4-20");
-	assertEquals(id.getCorpusID(), "c1");
-	assertEquals(id.getDocID(), "d1");
-	assertEquals(id.getStartPos(), 4);
-	assertEquals(id.getEndPos(), 20);
+        MatchIdentifier id = new MatchIdentifier("match-c1!d1-p4-20");
+        assertEquals(id.getCorpusID(), "c1");
+        assertEquals(id.getDocID(), "d1");
+        assertEquals(id.getStartPos(), 4);
+        assertEquals(id.getEndPos(), 20);
 
-	assertEquals(id.toString(), "match-c1!d1-p4-20");
-	id.addPos(10,14,2);
-	assertEquals(id.toString(), "match-c1!d1-p4-20(2)10-14");
-	id.addPos(11,12,5);
-	assertEquals(id.toString(), "match-c1!d1-p4-20(2)10-14(5)11-12");
-	// Ignore
-	id.addPos(11,12,-8);
-	assertEquals(id.toString(), "match-c1!d1-p4-20(2)10-14(5)11-12");
-	id.addPos(11,-12,8);
-	assertEquals(id.toString(), "match-c1!d1-p4-20(2)10-14(5)11-12");
-	id.addPos(-11,12,8);
-	assertEquals(id.toString(), "match-c1!d1-p4-20(2)10-14(5)11-12");
+        assertEquals(id.toString(), "match-c1!d1-p4-20");
+        id.addPos(10, 14, 2);
+        assertEquals(id.toString(), "match-c1!d1-p4-20(2)10-14");
+        id.addPos(11, 12, 5);
+        assertEquals(id.toString(), "match-c1!d1-p4-20(2)10-14(5)11-12");
+        // Ignore
+        id.addPos(11, 12, -8);
+        assertEquals(id.toString(), "match-c1!d1-p4-20(2)10-14(5)11-12");
+        id.addPos(11, -12, 8);
+        assertEquals(id.toString(), "match-c1!d1-p4-20(2)10-14(5)11-12");
+        id.addPos(-11, 12, 8);
+        assertEquals(id.toString(), "match-c1!d1-p4-20(2)10-14(5)11-12");
 
-	id = new MatchIdentifier("matc-c1!d1-p4-20");
-	assertNull(id.toString());
-	id = new MatchIdentifier("match-d1-p4-20");
-	assertNull(id.getCorpusID());
-	assertEquals(id.getDocID(), "d1");
-	id = new MatchIdentifier("match-p4-20");
-	assertNull(id.toString());
+        id = new MatchIdentifier("matc-c1!d1-p4-20");
+        assertNull(id.toString());
+        id = new MatchIdentifier("match-d1-p4-20");
+        assertNull(id.getCorpusID());
+        assertEquals(id.getDocID(), "d1");
+        id = new MatchIdentifier("match-p4-20");
+        assertNull(id.toString());
 
-	id = new MatchIdentifier("match-c1!d1-p4-20");
-	assertEquals(id.toString(), "match-c1!d1-p4-20");
+        id = new MatchIdentifier("match-c1!d1-p4-20");
+        assertEquals(id.toString(), "match-c1!d1-p4-20");
 
-	id = new MatchIdentifier("match-c1!d1-p4-20(5)7-8");
-	assertEquals(id.toString(), "match-c1!d1-p4-20(5)7-8");
+        id = new MatchIdentifier("match-c1!d1-p4-20(5)7-8");
+        assertEquals(id.toString(), "match-c1!d1-p4-20(5)7-8");
 
-	id = new MatchIdentifier("match-c1!d1-p4-20(5)7-8(-2)9-10");
-	assertEquals(id.toString(), "match-c1!d1-p4-20(5)7-8");
+        id = new MatchIdentifier("match-c1!d1-p4-20(5)7-8(-2)9-10");
+        assertEquals(id.toString(), "match-c1!d1-p4-20(5)7-8");
 
-	id = new MatchIdentifier("match-c1!d1-p4-20(5)7-8(-2)9-10(2)3-4(3)-5-6");
-	assertEquals(id.toString(), "match-c1!d1-p4-20(5)7-8(2)3-4");
+        id = new MatchIdentifier("match-c1!d1-p4-20(5)7-8(-2)9-10(2)3-4(3)-5-6");
+        assertEquals(id.toString(), "match-c1!d1-p4-20(5)7-8(2)3-4");
 
-	id = new MatchIdentifier("match-c1!d1-p4-20(5)7-8(-2)9-10(2)3-4(3)-5-6(4)7-8");
-	assertEquals(id.toString(), "match-c1!d1-p4-20(5)7-8(2)3-4(4)7-8");
+        id = new MatchIdentifier(
+                "match-c1!d1-p4-20(5)7-8(-2)9-10(2)3-4(3)-5-6(4)7-8");
+        assertEquals(id.toString(), "match-c1!d1-p4-20(5)7-8(2)3-4(4)7-8");
 
-	id = new MatchIdentifier("match-c1!d1-p4-20(5)7-8(-2)9-10(2)3-4(3)-5-6(4)7-8(5)9--10");
-	assertEquals(id.toString(), "match-c1!d1-p4-20(5)7-8(2)3-4(4)7-8");
+        id = new MatchIdentifier(
+                "match-c1!d1-p4-20(5)7-8(-2)9-10(2)3-4(3)-5-6(4)7-8(5)9--10");
+        assertEquals(id.toString(), "match-c1!d1-p4-20(5)7-8(2)3-4(4)7-8");
     };
 
+
     @Test
     public void posIdentifierExample1 () throws IOException {
-	PosIdentifier id = new PosIdentifier();
-	id.setCorpusID("c1");
-	id.setDocID("d1");
-	id.setPos(8);
-	assertEquals(id.getCorpusID(), "c1");
-	assertEquals(id.getDocID(), "d1");
-	assertEquals(id.getPos(), 8);
-	assertEquals(id.toString(), "word-c1!d1-p8");
+        PosIdentifier id = new PosIdentifier();
+        id.setCorpusID("c1");
+        id.setDocID("d1");
+        id.setPos(8);
+        assertEquals(id.getCorpusID(), "c1");
+        assertEquals(id.getDocID(), "d1");
+        assertEquals(id.getPos(), 8);
+        assertEquals(id.toString(), "word-c1!d1-p8");
     };
 
+
     @Test
     public void indexExample1 () throws IOException {
-	KrillIndex ki = new KrillIndex();
-	ki.addDoc(createSimpleFieldDoc());
-	ki.commit();
+        KrillIndex ki = new KrillIndex();
+        ki.addDoc(createSimpleFieldDoc());
+        ki.commit();
 
-	QueryBuilder kq = new QueryBuilder("tokens");
-	Krill ks = new Krill(
-	    kq._(2,kq.seq(kq.seg("s:b")).append(kq._(kq.seg("s:a"))))
-        );
-	Result kr = ki.search(ks);
+        QueryBuilder kq = new QueryBuilder("tokens");
+        Krill ks = new Krill(kq._(2,
+                kq.seq(kq.seg("s:b")).append(kq._(kq.seg("s:a")))));
+        Result kr = ki.search(ks);
 
-	assertEquals("totalResults", kr.getTotalResults(),    1);
-	assertEquals("StartPos (0)", kr.getMatch(0).startPos, 7);
-	assertEquals("EndPos (0)",   kr.getMatch(0).endPos,   9);
+        assertEquals("totalResults", kr.getTotalResults(), 1);
+        assertEquals("StartPos (0)", kr.getMatch(0).startPos, 7);
+        assertEquals("EndPos (0)", kr.getMatch(0).endPos, 9);
 
-	Match km = kr.getMatch(0);
+        Match km = kr.getMatch(0);
 
-	assertEquals("SnippetBrackets (0)", "... bcabca[{2:b{1:a}}]c", km.getSnippetBrackets());
-	assertEquals("ID (0)", "match-c1!d1-p7-9(2)7-8(1)8-8", km.getID());
+        assertEquals("SnippetBrackets (0)", "... bcabca[{2:b{1:a}}]c",
+                km.getSnippetBrackets());
+        assertEquals("ID (0)", "match-c1!d1-p7-9(2)7-8(1)8-8", km.getID());
     };
 
+
     @Test
     public void indexExample2 () throws IOException, QueryException {
-	KrillIndex ki = new KrillIndex();
-	ki.addDoc(createSimpleFieldDoc());
-	ki.commit();
+        KrillIndex ki = new KrillIndex();
+        ki.addDoc(createSimpleFieldDoc());
+        ki.commit();
 
-	Match km = ki.getMatch("match-c1!d1-p7-9(0)8-8(2)7-8");
+        Match km = ki.getMatch("match-c1!d1-p7-9(0)8-8(2)7-8");
 
-	assertEquals("StartPos (0)", 7, km.getStartPos());
-	assertEquals("EndPos (0)", 9, km.getEndPos());
+        assertEquals("StartPos (0)", 7, km.getStartPos());
+        assertEquals("EndPos (0)", 9, km.getEndPos());
 
-	assertEquals("SnippetBrackets (0)",
-		     "... [{2:b{a}}] ...",
-		     km.getSnippetBrackets());
+        assertEquals("SnippetBrackets (0)", "... [{2:b{a}}] ...",
+                km.getSnippetBrackets());
 
-	assertEquals("ID (0)", "match-c1!d1-p7-9(0)8-8(2)7-8", km.getID());
+        assertEquals("ID (0)", "match-c1!d1-p7-9(0)8-8(2)7-8", km.getID());
 
-	km = ki.getMatchInfo("match-c1!d1-p7-9(0)8-8(2)7-8",
-			     "tokens",
-			     "f",
-			     "m",
-			     false,
-			     false);
+        km = ki.getMatchInfo("match-c1!d1-p7-9(0)8-8(2)7-8", "tokens", "f",
+                "m", false, false);
 
-	assertEquals("SnippetBrackets (1)",
-		     "... [{f/m:acht:b}{f/m:neun:a}] ...",
-		     km.getSnippetBrackets());
+        assertEquals("SnippetBrackets (1)",
+                "... [{f/m:acht:b}{f/m:neun:a}] ...", km.getSnippetBrackets());
 
 
-	/*
-	km = ki.getMatchInfo("match-c1!d1-p7-9(0)8-8(2)7-8",
-			     "tokens",
-			     "f",
-			     null,
-			     false,
-			     false);
+        /*
+        km = ki.getMatchInfo("match-c1!d1-p7-9(0)8-8(2)7-8",
+        		     "tokens",
+        		     "f",
+        		     null,
+        		     false,
+        		     false);
 
-	System.err.println(km.toJSON());
-	*/
+        System.err.println(km.toJSON());
+        */
 
-	
-	km = ki.getMatchInfo("match-c1!d1-p7-9(0)8-8(2)7-8",
-			     "tokens",
-			     "f",
-			     "m",
-			     false,
-			     true);
 
-	assertEquals("SnippetBrackets (2)",
-		     "... [{2:{f/m:acht:b}{{f/m:neun:a}}}] ...",
-		     km.getSnippetBrackets());
+        km = ki.getMatchInfo("match-c1!d1-p7-9(0)8-8(2)7-8", "tokens", "f",
+                "m", false, true);
 
-	km = ki.getMatchInfo("match-c1!d1-p7-9(4)8-8(2)7-8",
-			     "tokens",
-			     "f",
-			     "m",
-			     false,
-			     true);
+        assertEquals("SnippetBrackets (2)",
+                "... [{2:{f/m:acht:b}{{f/m:neun:a}}}] ...",
+                km.getSnippetBrackets());
 
-	assertEquals("SnippetBrackets (3)",
-		     "... [{2:{f/m:acht:b}{4:{f/m:neun:a}}}] ...",
-		     km.getSnippetBrackets());
+        km = ki.getMatchInfo("match-c1!d1-p7-9(4)8-8(2)7-8", "tokens", "f",
+                "m", false, true);
 
-	km = ki.getMatchInfo("match-c1!d1-p7-9(4)8-8(2)7-8",
-			     "tokens",
-			     "f",
-			     null,
-			     false,
-			     true);
+        assertEquals("SnippetBrackets (3)",
+                "... [{2:{f/m:acht:b}{4:{f/m:neun:a}}}] ...",
+                km.getSnippetBrackets());
 
-	assertEquals("SnippetBrackets (4)",
-		     "... [{2:{f/m:acht:{f/y:eight:b}}{4:{f/m:neun:{f/y:nine:a}}}}] ...",
-		     km.getSnippetBrackets());
+        km = ki.getMatchInfo("match-c1!d1-p7-9(4)8-8(2)7-8", "tokens", "f",
+                null, false, true);
 
-	assertEquals("SnippetHTML (4)",
-		     "<span class=\"context-left\">"+
-		     "<span class=\"more\">"+
-		     "</span>"+
-		     "</span>"+
-		     "<mark>"+
-		     "<mark class=\"class-2 level-0\">"+
-		     "<span title=\"f/m:acht\">"+
-		     "<span title=\"f/y:eight\">"+
-		     "b"+
-		     "</span>"+
-		     "</span>"+
-		     "<mark class=\"class-4 level-1\">"+
-		     "<span title=\"f/m:neun\">"+
-		     "<span title=\"f/y:nine\">"+
-		     "a"+
-		     "</span>"+
-		     "</span>"+
-		     "</mark>"+
-		     "</mark>"+
-		     "</mark>"+
-		     "<span class=\"context-right\">"+
-		     "<span class=\"more\">"+
-		     "</span>"+
-		     "</span>",
-		     km.getSnippetHTML());
+        assertEquals(
+                "SnippetBrackets (4)",
+                "... [{2:{f/m:acht:{f/y:eight:b}}{4:{f/m:neun:{f/y:nine:a}}}}] ...",
+                km.getSnippetBrackets());
+
+        assertEquals("SnippetHTML (4)", "<span class=\"context-left\">"
+                + "<span class=\"more\">" + "</span>" + "</span>" + "<mark>"
+                + "<mark class=\"class-2 level-0\">"
+                + "<span title=\"f/m:acht\">" + "<span title=\"f/y:eight\">"
+                + "b" + "</span>" + "</span>"
+                + "<mark class=\"class-4 level-1\">"
+                + "<span title=\"f/m:neun\">" + "<span title=\"f/y:nine\">"
+                + "a" + "</span>" + "</span>" + "</mark>" + "</mark>"
+                + "</mark>" + "<span class=\"context-right\">"
+                + "<span class=\"more\">" + "</span>" + "</span>",
+                km.getSnippetHTML());
     };
 
 
     @Test
     public void indexExample3 () throws IOException, QueryException {
-	KrillIndex ki = new KrillIndex();
-	ki.addDoc(createSimpleFieldDoc());
-	ki.commit();
+        KrillIndex ki = new KrillIndex();
+        ki.addDoc(createSimpleFieldDoc());
+        ki.commit();
 
-	Match km = ki.getMatchInfo("match-c1!d1-p7-9(4)8-8(2)7-8",
-			     "tokens",
-			     null,
-			     null,
-			     false,
-			     true);
+        Match km = ki.getMatchInfo("match-c1!d1-p7-9(4)8-8(2)7-8", "tokens",
+                null, null, false, true);
 
 
-	assertEquals("SnippetHTML (1)",
-		     "<span class=\"context-left\">" +
-		     "<span class=\"more\">" +
-		     "</span>" +
-		     "</span>" +
-		     "<mark>" +
-		     "<mark class=\"class-2 level-0\">" +
-		     "<span title=\"f/m:acht\">" +
-		     "<span title=\"f/y:eight\">" +
-		     "<span title=\"it/is:8\">" +
-		     "<span title=\"x/o:achtens\">" +
-		     "b" +
-		     "</span>" +
-		     "</span>" +
-		     "</span>" +
-		     "</span>" +
-		     "<mark class=\"class-4 level-1\">" +
-		     "<span title=\"f/m:neun\">" +
-		     "<span title=\"f/y:nine\">" +
-		     "<span title=\"it/is:9\">" +
-		     "<span title=\"x/o:neuntens\">" +
-		     "a" +
-		     "</span>" +
-		     "</span>" +
-		     "</span>" +
-		     "</span>" +
-		     "</mark>" +
-		     "</mark>" +
-		     "</mark>" +
-		     "<span class=\"context-right\">" +
-		     "<span class=\"more\">" +
-		     "</span>" +
-		     "</span>",
-		     km.getSnippetHTML());
+        assertEquals("SnippetHTML (1)", "<span class=\"context-left\">"
+                + "<span class=\"more\">" + "</span>" + "</span>" + "<mark>"
+                + "<mark class=\"class-2 level-0\">"
+                + "<span title=\"f/m:acht\">" + "<span title=\"f/y:eight\">"
+                + "<span title=\"it/is:8\">" + "<span title=\"x/o:achtens\">"
+                + "b" + "</span>" + "</span>" + "</span>" + "</span>"
+                + "<mark class=\"class-4 level-1\">"
+                + "<span title=\"f/m:neun\">" + "<span title=\"f/y:nine\">"
+                + "<span title=\"it/is:9\">" + "<span title=\"x/o:neuntens\">"
+                + "a" + "</span>" + "</span>" + "</span>" + "</span>"
+                + "</mark>" + "</mark>" + "</mark>"
+                + "<span class=\"context-right\">" + "<span class=\"more\">"
+                + "</span>" + "</span>", km.getSnippetHTML());
     };
 
+
     @Test
     public void indexExample4 () throws IOException, QueryException {
-	KrillIndex ki = new KrillIndex();
-	ki.addDoc(createSimpleFieldDoc());
-	ki.commit();
+        KrillIndex ki = new KrillIndex();
+        ki.addDoc(createSimpleFieldDoc());
+        ki.commit();
 
-	Match km = ki.getMatchInfo("match-c1!d1-p7-9(4)8-8(2)7-8",
-			     "tokens",
-			     null,
-			     null,
-			     false,
-			     false);
+        Match km = ki.getMatchInfo("match-c1!d1-p7-9(4)8-8(2)7-8", "tokens",
+                null, null, false, false);
 
 
-	assertEquals("SnippetHTML (1)",
-		     "<span class=\"context-left\">" +
-		     "<span class=\"more\">" +
-		     "</span>" +
-		     "</span>" +
-		     "<mark>" +
-		     "<span title=\"f/m:acht\">" +
-		     "<span title=\"f/y:eight\">" +
-		     "<span title=\"it/is:8\">" +
-		     "<span title=\"x/o:achtens\">" +
-		     "b" +
-		     "</span>" +
-		     "</span>" +
-		     "</span>" +
-		     "</span>" +
-		     "<span title=\"f/m:neun\">" +
-		     "<span title=\"f/y:nine\">" +
-		     "<span title=\"it/is:9\">" +
-		     "<span title=\"x/o:neuntens\">" +
-		     "a" +
-		     "</span>" +
-		     "</span>" +
-		     "</span>" +
-		     "</span>" +
-		     "</mark>" +
-		     "<span class=\"context-right\">" +
-		     "<span class=\"more\">" +
-		     "</span>" +
-		     "</span>",
-		     km.getSnippetHTML());
+        assertEquals("SnippetHTML (1)", "<span class=\"context-left\">"
+                + "<span class=\"more\">" + "</span>" + "</span>" + "<mark>"
+                + "<span title=\"f/m:acht\">" + "<span title=\"f/y:eight\">"
+                + "<span title=\"it/is:8\">" + "<span title=\"x/o:achtens\">"
+                + "b" + "</span>" + "</span>" + "</span>" + "</span>"
+                + "<span title=\"f/m:neun\">" + "<span title=\"f/y:nine\">"
+                + "<span title=\"it/is:9\">" + "<span title=\"x/o:neuntens\">"
+                + "a" + "</span>" + "</span>" + "</span>" + "</span>"
+                + "</mark>" + "<span class=\"context-right\">"
+                + "<span class=\"more\">" + "</span>" + "</span>",
+                km.getSnippetHTML());
     };
 
+
     @Test
     public void indexExample5Spans () throws IOException, QueryException {
-	KrillIndex ki = new KrillIndex();
-	ki.addDoc(createSimpleFieldDoc());
-	ki.commit();
+        KrillIndex ki = new KrillIndex();
+        ki.addDoc(createSimpleFieldDoc());
+        ki.commit();
 
-	Match km = ki.getMatchInfo("match-c1!d1-p7-9(4)8-8(2)7-8",
-			     "tokens",
-			     null,
-			     null,
-			     true,
-			     false);
+        Match km = ki.getMatchInfo("match-c1!d1-p7-9(4)8-8(2)7-8", "tokens",
+                null, null, true, false);
 
 
-	assertEquals("SnippetBrackets (1)",
-		     "... [{f/m:acht:{f/y:eight:{it/is:8:{x/o:achtens:b}}}}{f/m:neun:{f/y:nine:{it/is:9:{x/o:neuntens:a}}}}] ...",
-		     km.getSnippetBrackets());
+        assertEquals(
+                "SnippetBrackets (1)",
+                "... [{f/m:acht:{f/y:eight:{it/is:8:{x/o:achtens:b}}}}{f/m:neun:{f/y:nine:{it/is:9:{x/o:neuntens:a}}}}] ...",
+                km.getSnippetBrackets());
     };
 
+
     @Test
     public void indexExample6Spans () throws IOException, QueryException {
-	KrillIndex ki = new KrillIndex();
-	ki.addDoc(createSimpleFieldDoc());
-	ki.commit();
+        KrillIndex ki = new KrillIndex();
+        ki.addDoc(createSimpleFieldDoc());
+        ki.commit();
 
-	Match km = ki.getMatchInfo("match-c1!d1-p7-10(4)8-8(2)7-8",
-			     "tokens",
-			     null,
-			     null,
-			     true,
-			     false);
+        Match km = ki.getMatchInfo("match-c1!d1-p7-10(4)8-8(2)7-8", "tokens",
+                null, null, true, false);
 
 
-	assertEquals("SnippetBrackets (1)",
-		     "... [{x/tag:{f/m:acht:{f/y:eight:{it/is:8:{x/o:achtens:b}}}}{f/m:neun:{f/y:nine:{it/is:9:{x/o:neuntens:a}}}}{f/m:zehn:{f/y:ten:{it/is:10:{x/o:zehntens:c}}}}}]",
-		     km.getSnippetBrackets());
+        assertEquals(
+                "SnippetBrackets (1)",
+                "... [{x/tag:{f/m:acht:{f/y:eight:{it/is:8:{x/o:achtens:b}}}}{f/m:neun:{f/y:nine:{it/is:9:{x/o:neuntens:a}}}}{f/m:zehn:{f/y:ten:{it/is:10:{x/o:zehntens:c}}}}}]",
+                km.getSnippetBrackets());
     };
 
+
     @Test
     public void indexExample7Spans () throws IOException, QueryException {
-	KrillIndex ki = new KrillIndex();
-	ki.addDoc(createSimpleFieldDoc());
-	ki.commit();
+        KrillIndex ki = new KrillIndex();
+        ki.addDoc(createSimpleFieldDoc());
+        ki.commit();
 
-	Match km = ki.getMatchInfo("match-c1!d1-p7-10(4)8-8(2)7-8",
-			     "tokens",
-			     null,
-			     null,
-			     true,
-			     true);
+        Match km = ki.getMatchInfo("match-c1!d1-p7-10(4)8-8(2)7-8", "tokens",
+                null, null, true, true);
 
 
-	assertEquals("SnippetBrackets (1)",
-		     "... [{x/tag:{2:{f/m:acht:{f/y:eight:{it/is:8:{x/o:achtens:b}}}}{4:{f/m:neun:{f/y:nine:{it/is:9:{x/o:neuntens:a}}}}}}{f/m:zehn:{f/y:ten:{it/is:10:{x/o:zehntens:c}}}}}]",
-		     km.getSnippetBrackets());
+        assertEquals(
+                "SnippetBrackets (1)",
+                "... [{x/tag:{2:{f/m:acht:{f/y:eight:{it/is:8:{x/o:achtens:b}}}}{4:{f/m:neun:{f/y:nine:{it/is:9:{x/o:neuntens:a}}}}}}{f/m:zehn:{f/y:ten:{it/is:10:{x/o:zehntens:c}}}}}]",
+                km.getSnippetBrackets());
 
-	assertEquals("SnippetHTML (1)",
-		     "<span class=\"context-left\">" +
-		     "<span class=\"more\">" +
-		     "</span>" +
-		     "</span>" +
-		     "<mark>" +
-		     "<span title=\"x/tag\">" +
-		     "<mark class=\"class-2 level-0\">" +
-		     "<span title=\"f/m:acht\">" +
-		     "<span title=\"f/y:eight\">" +
-		     "<span title=\"it/is:8\">" +
-		     "<span title=\"x/o:achtens\">" +
-		     "b" +
-		     "</span>" +
-		     "</span>" +
-		     "</span>" +
-		     "</span>" +
-		     "<mark class=\"class-4 level-1\">" +
-		     "<span title=\"f/m:neun\">" +
-		     "<span title=\"f/y:nine\">" +
-		     "<span title=\"it/is:9\">" +
-		     "<span title=\"x/o:neuntens\">" +
-		     "a" +
-		     "</span>" +
-		     "</span>" +
-		     "</span>" +
-		     "</span>" +
-		     "</mark>" +
-		     "</mark>" +
-		     "<span title=\"f/m:zehn\">" +
-		     "<span title=\"f/y:ten\">" +
-		     "<span title=\"it/is:10\">" +
-		     "<span title=\"x/o:zehntens\">" +
-		     "c" +
-		     "</span>" +
-		     "</span>" +
-		     "</span>" +
-		     "</span>" +
-		     "</span>" +
-		     "</mark>" +
-		     "<span class=\"context-right\">" +
-		     "</span>",
-		     km.getSnippetHTML());
+        assertEquals("SnippetHTML (1)", "<span class=\"context-left\">"
+                + "<span class=\"more\">" + "</span>" + "</span>" + "<mark>"
+                + "<span title=\"x/tag\">" + "<mark class=\"class-2 level-0\">"
+                + "<span title=\"f/m:acht\">" + "<span title=\"f/y:eight\">"
+                + "<span title=\"it/is:8\">" + "<span title=\"x/o:achtens\">"
+                + "b" + "</span>" + "</span>" + "</span>" + "</span>"
+                + "<mark class=\"class-4 level-1\">"
+                + "<span title=\"f/m:neun\">" + "<span title=\"f/y:nine\">"
+                + "<span title=\"it/is:9\">" + "<span title=\"x/o:neuntens\">"
+                + "a" + "</span>" + "</span>" + "</span>" + "</span>"
+                + "</mark>" + "</mark>" + "<span title=\"f/m:zehn\">"
+                + "<span title=\"f/y:ten\">" + "<span title=\"it/is:10\">"
+                + "<span title=\"x/o:zehntens\">" + "c" + "</span>" + "</span>"
+                + "</span>" + "</span>" + "</span>" + "</mark>"
+                + "<span class=\"context-right\">" + "</span>",
+                km.getSnippetHTML());
     };
 
+
     @Test
     public void indexExample6Relations () throws IOException, QueryException {
-	KrillIndex ki = new KrillIndex();
-	ki.addDoc(createSimpleFieldDoc());
-	ki.commit();
+        KrillIndex ki = new KrillIndex();
+        ki.addDoc(createSimpleFieldDoc());
+        ki.commit();
 
-	Match km = ki.getMatchInfo("match-c1!d1-p0-5(4)8-8(2)7-8",
-			     "tokens",
-			     "x",
-			     null,
-			     true,
-			     false);
+        Match km = ki.getMatchInfo("match-c1!d1-p0-5(4)8-8(2)7-8", "tokens",
+                "x", null, true, false);
 
-	assertEquals("SnippetBrackets (1)",
-		     "[{x/rel:a>3:{x/o:erstens:a}}{x/o:zweitens:b}{x/o:drittens:c}{#3:{x/o:viertens:a}}{x/o:fünftens:b}] ...",
-		     km.getSnippetBrackets());
+        assertEquals(
+                "SnippetBrackets (1)",
+                "[{x/rel:a>3:{x/o:erstens:a}}{x/o:zweitens:b}{x/o:drittens:c}{#3:{x/o:viertens:a}}{x/o:fünftens:b}] ...",
+                km.getSnippetBrackets());
 
-	assertEquals("SnippetBrackets (1)",
-		     "<span class=\"context-left\">" +
-		     "</span>" +
-		     "<mark>" +
-		     "<span xlink:title=\"x/rel:a\" " +
-		     "xlink:type=\"simple\" " +
-		     "xlink:href=\"#word-c1!d1-p3\">" +
-		     "<span title=\"x/o:erstens\">" +
-		     "a" +
-		     "</span>" +
-		     "</span>" +
-		     "<span title=\"x/o:zweitens\">" +
-		     "b" +
-		     "</span>" +
-		     "<span title=\"x/o:drittens\">" +
-		     "c" +
-		     "</span>" +
-		     "<span xml:id=\"word-c1!d1-p3\">" +
-		     "<span title=\"x/o:viertens\">" +
-		     "a" +
-		     "</span>" +
-		     "</span>" +
-		     "<span title=\"x/o:fünftens\">" +
-		     "b" +
-		     "</span>" +
-		     "</mark>" +
-		     "<span class=\"context-right\">" +
-		     "<span class=\"more\">" +
-		     "</span>" +
-		     "</span>",
-		     km.getSnippetHTML());
+        assertEquals("SnippetBrackets (1)", "<span class=\"context-left\">"
+                + "</span>" + "<mark>" + "<span xlink:title=\"x/rel:a\" "
+                + "xlink:type=\"simple\" " + "xlink:href=\"#word-c1!d1-p3\">"
+                + "<span title=\"x/o:erstens\">" + "a" + "</span>" + "</span>"
+                + "<span title=\"x/o:zweitens\">" + "b" + "</span>"
+                + "<span title=\"x/o:drittens\">" + "c" + "</span>"
+                + "<span xml:id=\"word-c1!d1-p3\">"
+                + "<span title=\"x/o:viertens\">" + "a" + "</span>" + "</span>"
+                + "<span title=\"x/o:fünftens\">" + "b" + "</span>" + "</mark>"
+                + "<span class=\"context-right\">" + "<span class=\"more\">"
+                + "</span>" + "</span>", km.getSnippetHTML());
 
-	km = ki.getMatchInfo("match-c1!d1-p0-5(7)2-3(4)8-8(2)7-8",
-			     "tokens",
-			     "x",
-			     null,
-			     true,
-			     true);
+        km = ki.getMatchInfo("match-c1!d1-p0-5(7)2-3(4)8-8(2)7-8", "tokens",
+                "x", null, true, true);
 
-	assertEquals("SnippetBrackets (1)",
-		     "<span class=\"context-left\">" +
-		     "</span>" +
-		     "<mark>" +
-		     "<span xlink:title=\"x/rel:a\" " +
-		     "xlink:type=\"simple\" " +
-		     "xlink:href=\"#word-c1!d1-p3\">" +
-		     "<span title=\"x/o:erstens\">" +
-		     "a" +
-		     "</span>" +
-		     "</span>" +
-		     "<span title=\"x/o:zweitens\">" +
-		     "b" +
-		     "</span>" +
-		     "<mark class=\"class-7 level-0\">" +
-		     "<span title=\"x/o:drittens\">" +
-		     "c" +
-		     "</span>" +
-		     "<span xml:id=\"word-c1!d1-p3\">" +
-		     "<span title=\"x/o:viertens\">" +
-		     "a" +
-		     "</span>" +
-		     "</span>" +
-		     "</mark>" +
-		     "<span title=\"x/o:fünftens\">" +
-		     "b" +
-		     "</span>" +
-		     "</mark>" +
-		     "<span class=\"context-right\">" +
-		     "<span class=\"more\">" +
-		     "</span>" +
-		     "</span>",
-		     km.getSnippetHTML());
+        assertEquals("SnippetBrackets (1)", "<span class=\"context-left\">"
+                + "</span>" + "<mark>" + "<span xlink:title=\"x/rel:a\" "
+                + "xlink:type=\"simple\" " + "xlink:href=\"#word-c1!d1-p3\">"
+                + "<span title=\"x/o:erstens\">" + "a" + "</span>" + "</span>"
+                + "<span title=\"x/o:zweitens\">" + "b" + "</span>"
+                + "<mark class=\"class-7 level-0\">"
+                + "<span title=\"x/o:drittens\">" + "c" + "</span>"
+                + "<span xml:id=\"word-c1!d1-p3\">"
+                + "<span title=\"x/o:viertens\">" + "a" + "</span>" + "</span>"
+                + "</mark>" + "<span title=\"x/o:fünftens\">" + "b" + "</span>"
+                + "</mark>" + "<span class=\"context-right\">"
+                + "<span class=\"more\">" + "</span>" + "</span>",
+                km.getSnippetHTML());
     };
 
 
     @Test
-    public void indexExample7SentenceExpansion () throws IOException, QueryException {
-	KrillIndex ki = new KrillIndex();
-	ki.addDoc(createSimpleFieldDoc());
-	ki.addDoc(createSimpleFieldDoc2());
-	ki.addDoc(createSimpleFieldDoc3());
-	ki.addDoc(createSimpleFieldDoc4());
-	ki.commit();
-	Match km;
+    public void indexExample7SentenceExpansion () throws IOException,
+            QueryException {
+        KrillIndex ki = new KrillIndex();
+        ki.addDoc(createSimpleFieldDoc());
+        ki.addDoc(createSimpleFieldDoc2());
+        ki.addDoc(createSimpleFieldDoc3());
+        ki.addDoc(createSimpleFieldDoc4());
+        ki.commit();
+        Match km;
 
-	km = ki.getMatchInfo("match-c1!d1-p3-4",
-			     "tokens",
-			     null,
-			     null,
-			     false,
-			     false);
+        km = ki.getMatchInfo("match-c1!d1-p3-4", "tokens", null, null, false,
+                false);
 
-	assertEquals("... [{f/m:vier:{f/y:four:{it/is:4:{x/o:viertens:a}}}}] ...",
-		     km.getSnippetBrackets());
+        assertEquals(
+                "... [{f/m:vier:{f/y:four:{it/is:4:{x/o:viertens:a}}}}] ...",
+                km.getSnippetBrackets());
 
 
-	km = ki.getMatchInfo("match-c1!d1-p3-4",
-			     "tokens",
-			     null,
-			     null,
-			     false,
-			     false,
-			     true); // extendToSentence
+        km = ki.getMatchInfo("match-c1!d1-p3-4", "tokens", null, null, false,
+                false, true); // extendToSentence
 
-	assertEquals("[{f/m:drei:{f/y:three:{it/is:3:{x/o:drittens:c}}}}{f/m:vier:{f/y:four:{it/is:4:{x/o:viertens:a}}}}{f/m:fuenf:{f/y:five:{it/is:5:{x/o:fünftens:b}}}}]",
-		     km.getSnippetBrackets());
+        assertEquals(
+                "[{f/m:drei:{f/y:three:{it/is:3:{x/o:drittens:c}}}}{f/m:vier:{f/y:four:{it/is:4:{x/o:viertens:a}}}}{f/m:fuenf:{f/y:five:{it/is:5:{x/o:fünftens:b}}}}]",
+                km.getSnippetBrackets());
 
-	km = ki.getMatchInfo("match-c1!d3-p3-4",
-			     "tokens",
-			     null,
-			     null,
-			     false,
-			     false,
-			     true); // extendToSentence
+        km = ki.getMatchInfo("match-c1!d3-p3-4", "tokens", null, null, false,
+                false, true); // extendToSentence
 
-	assertEquals("[{f/m:drei:{f/y:three:{it/is:3:{x/o:drittens:cc}}}} {f/m:vier:{f/y:four:{it/is:4:{x/o:viertens:aa}}}} {f/m:fuenf:{f/y:five:{it/is:5:{x/o:fünftens:bb}}}}]",
-		     km.getSnippetBrackets());
+        assertEquals(
+                "[{f/m:drei:{f/y:three:{it/is:3:{x/o:drittens:cc}}}} {f/m:vier:{f/y:four:{it/is:4:{x/o:viertens:aa}}}} {f/m:fuenf:{f/y:five:{it/is:5:{x/o:fünftens:bb}}}}]",
+                km.getSnippetBrackets());
 
 
-	km = ki.getMatchInfo("match-c1!d4-p4-6",
-			     "tokens",
-			     null,
-			     null,
-			     false,
-			     false,
-			     true); // extendToSentence
-	assertEquals("[{f/m:drei:{f/y:three:{it/is:3:{x/o:drittens:c}}}}{f/m:vier:{f/y:four:{it/is:4:{x/o:viertens:a}}}}{f/m:fuenf:{f/y:five:{it/is:5:{x/o:fünftens:b}}}}{f/m:sechs:{f/y:six:{it/is:6:{x/o:sechstens:c}}}}{f/m:sieben:{f/y:seven:{it/is:7:{x/o:siebtens:a}}}}]",
-		     km.getSnippetBrackets());
+        km = ki.getMatchInfo("match-c1!d4-p4-6", "tokens", null, null, false,
+                false, true); // extendToSentence
+        assertEquals(
+                "[{f/m:drei:{f/y:three:{it/is:3:{x/o:drittens:c}}}}{f/m:vier:{f/y:four:{it/is:4:{x/o:viertens:a}}}}{f/m:fuenf:{f/y:five:{it/is:5:{x/o:fünftens:b}}}}{f/m:sechs:{f/y:six:{it/is:6:{x/o:sechstens:c}}}}{f/m:sieben:{f/y:seven:{it/is:7:{x/o:siebtens:a}}}}]",
+                km.getSnippetBrackets());
 
     };
 
-    @Test
-    public void indexExample7Dependencies () throws IOException, QueryException {
-	KrillIndex ki = new KrillIndex();
-	ki.addDoc(createSimpleFieldDoc2());
-	ki.commit();
-
-	Match km = ki.getMatchInfo("match-c1!d1-p0-4",
-			     "tokens",
-			     null,
-			     null,
-			     true,
-			     true);
-
-
-	assertEquals("SnippetHTML (2)",
-		     "<span class=\"context-left\">" +
-		     "</span>" +
-		     "<mark>"+
-		     "<span xlink:title=\"x/rel:a\" xlink:type=\"simple\" xlink:href=\"#word-c1!d1-p3\">"+
-		     "<span title=\"f/m:eins\">"+
-		     "<span title=\"f/y:one\">"+
-		     "<span title=\"it/is:1\">" +
-		     "<span title=\"x/o:erstens\">a</span>" +
-		     "</span>" +
-		     "</span>" +
-		     "</span>" +
-		     "</span>" +
-		     "<span xlink:title=\"x/rel:b\" xlink:type=\"simple\" xlink:href=\"#word-c1!d1-p3\">"+
-		     "<span title=\"f/m:zwei\">"+
-		     "<span title=\"f/y:two\">"+
-		     "<span title=\"it/is:2\">"+
-		     "<span title=\"x/o:zweitens\">b</span>"+
-		     "</span>"+
-		     "</span>"+
-		     "</span>"+
-		     "</span>"+
-		     "<span title=\"f/m:drei\">"+
-		     "<span title=\"f/y:three\">"+
-		     "<span title=\"it/is:3\">"+
-		     "<span title=\"x/o:drittens\">c</span>"+
-		     "</span>"+
-		     "</span>"+
-		     "</span>"+
-		     "<span xml:id=\"word-c1!d1-p3\">"+
-		     "<span title=\"f/m:vier\">"+
-		     "<span title=\"f/y:four\">"+
-		     "<span title=\"it/is:4\">"+
-		     "<span title=\"x/o:viertens\">a</span>"+
-		     "</span>"+
-		     "</span>"+
-		     "</span>"+
-		     "</span>"+
-		     "</mark>"+
-		     "<span class=\"context-right\">"+
-		     "<span class=\"more\">"+
-		     "</span>"+
-		     "</span>",
-		     km.getSnippetHTML());
-    };
-
 
     @Test
-    public void indexExampleMultipleFoundries () throws IOException, QueryException {
-	KrillIndex ki = new KrillIndex();
-	ki.addDoc(createSimpleFieldDoc4());
-	ki.commit();
+    public void indexExample7Dependencies () throws IOException, QueryException {
+        KrillIndex ki = new KrillIndex();
+        ki.addDoc(createSimpleFieldDoc2());
+        ki.commit();
 
-	Match km = ki.getMatchInfo("match-c1!d4-p3-9",
-					"tokens",
-					"f",
-					"m",
-					false,
-					false);
-	assertEquals("f:m info",
-		     km.getSnippetBrackets(),
-		     "... [{f/m:vier:a}{f/m:fuenf:b}{f/m:sechs:c}{f/m:sieben:a}{f/m:acht:b}{f/m:neun:a}] ...");
-
-	km = ki.getMatchInfo("match-c1!d4-p3-9",
-			     "tokens",
-			     "f",
-			     null,
-			     false,
-			     false);
-	assertEquals("f info",
-		     km.getSnippetBrackets(),
-		     "... [{f/m:vier:{f/y:four:a}}{f/m:fuenf:{f/y:five:b}}{f/m:sechs:{f/y:six:c}}{f/m:sieben:{f/y:seven:a}}{f/m:acht:{f/y:eight:b}}{f/m:neun:{f/y:nine:a}}] ..."
-		     );
+        Match km = ki.getMatchInfo("match-c1!d1-p0-4", "tokens", null, null,
+                true, true);
 
 
-	km = ki.getMatchInfo("match-c1!d4-p3-4",
-			     "tokens",
-			     null,
-			     null,
-			     false,
-			     false);
-	assertEquals("all info",
-		     km.getSnippetBrackets(),
-		     "... [{f/m:vier:{f/y:four:{it/is:4:{x/o:viertens:a}}}}] ..."
-		     );
-
-	ArrayList<String> foundryList = new ArrayList<>(2);
-	foundryList.add("f");
-	foundryList.add("x");
-
-	km = ki.getMatchInfo("match-c1!d4-p3-4",
-			     "tokens",
-			     true,
-			     foundryList,
-			     (ArrayList<String>) null,
-			     false,
-			     false,
-			     false);
-	assertEquals("f|x info",
-		     km.getSnippetBrackets(),
-		     "... [{f/m:vier:{f/y:four:{x/o:viertens:a}}}] ..."
-		     );
-
-	foundryList.clear();
-	foundryList.add("y");
-	foundryList.add("x");
-
-	km = ki.getMatchInfo("match-c1!d4-p3-4",
-			     "tokens",
-			     true,
-			     foundryList,
-			     (ArrayList<String>) null,
-			     false,
-			     false,
-			     false);
-	assertEquals("y|x info",
-		     km.getSnippetBrackets(),
-		     "... [{x/o:viertens:a}] ..."
-		     );
-
-
-	foundryList.clear();
-	foundryList.add("f");
-	foundryList.add("it");
-
-	ArrayList<String> layerList = new ArrayList<>(2);
-	layerList.add("is");
-
-	km = ki.getMatchInfo("match-c1!d4-p3-4",
-			     "tokens",
-			     true,
-			     foundryList,
-			     layerList,
-			     false,
-			     false,
-			     false);
-	assertEquals("f|it/is",
-		     km.getSnippetBrackets(),
-		     "... [{it/is:4:a}] ..."
-		     );
-    };
-    
-
-    private FieldDocument createSimpleFieldDoc(){
-	FieldDocument fd = new FieldDocument();
-	fd.addString("corpusID", "c1");
-	fd.addString("ID", "d1");
-	fd.addTV("tokens",
-		 "abcabcabac",
-		 "[(0-1)s:a|i:a|f/m:eins|f/y:one|x/o:erstens|it/is:1|>:x/rel:a$<i>4|_0#0-1|-:t$<i>10]" +
-		 "[(1-2)s:b|i:b|f/m:zwei|f/y:two|x/o:zweitens|it/is:2|_1#1-2]" +
-		 "[(2-3)s:c|i:c|f/m:drei|f/y:three|x/o:drittens|it/is:3|_2#2-3|<>:s#2-5$<i>5]" +
-		 "[(3-4)s:a|i:a|f/m:vier|f/y:four|x/o:viertens|it/is:4|<:x/rel:b$<i>1|_3#3-4]" +
-		 "[(4-5)s:b|i:b|f/m:fuenf|f/y:five|x/o:fünftens|it/is:5|_4#4-5]" +
-		 "[(5-6)s:c|i:c|f/m:sechs|f/y:six|x/o:sechstens|it/is:6|_5#5-6]" +
-		 "[(6-7)s:a|i:a|f/m:sieben|f/y:seven|x/o:siebtens|it/is:7|_6#6-7]" +
-		 "[(7-8)s:b|i:b|f/m:acht|f/y:eight|x/o:achtens|it/is:8|<>:x/tag#7-10$<i>10|_7#7-8]" +
-		 "[(8-9)s:a|i:a|f/m:neun|f/y:nine|x/o:neuntens|it/is:9|_8#8-9]" +
-		 "[(9-10)s:c|i:c|f/m:zehn|f/y:ten|x/o:zehntens|it/is:10|_9#9-10]");
-	return fd;
+        assertEquals(
+                "SnippetHTML (2)",
+                "<span class=\"context-left\">"
+                        + "</span>"
+                        + "<mark>"
+                        + "<span xlink:title=\"x/rel:a\" xlink:type=\"simple\" xlink:href=\"#word-c1!d1-p3\">"
+                        + "<span title=\"f/m:eins\">"
+                        + "<span title=\"f/y:one\">"
+                        + "<span title=\"it/is:1\">"
+                        + "<span title=\"x/o:erstens\">a</span>"
+                        + "</span>"
+                        + "</span>"
+                        + "</span>"
+                        + "</span>"
+                        + "<span xlink:title=\"x/rel:b\" xlink:type=\"simple\" xlink:href=\"#word-c1!d1-p3\">"
+                        + "<span title=\"f/m:zwei\">"
+                        + "<span title=\"f/y:two\">"
+                        + "<span title=\"it/is:2\">"
+                        + "<span title=\"x/o:zweitens\">b</span>" + "</span>"
+                        + "</span>" + "</span>" + "</span>"
+                        + "<span title=\"f/m:drei\">"
+                        + "<span title=\"f/y:three\">"
+                        + "<span title=\"it/is:3\">"
+                        + "<span title=\"x/o:drittens\">c</span>" + "</span>"
+                        + "</span>" + "</span>"
+                        + "<span xml:id=\"word-c1!d1-p3\">"
+                        + "<span title=\"f/m:vier\">"
+                        + "<span title=\"f/y:four\">"
+                        + "<span title=\"it/is:4\">"
+                        + "<span title=\"x/o:viertens\">a</span>" + "</span>"
+                        + "</span>" + "</span>" + "</span>" + "</mark>"
+                        + "<span class=\"context-right\">"
+                        + "<span class=\"more\">" + "</span>" + "</span>",
+                km.getSnippetHTML());
     };
 
-    private FieldDocument createSimpleFieldDoc2(){
-	FieldDocument fd = new FieldDocument();
-	fd.addString("corpusID", "c1");
-	fd.addString("ID", "d1");
-	fd.addTV("tokens",
-		 "abcabcabac",
-		 "[(0-1)s:a|i:a|f/m:eins|f/y:one|x/o:erstens|it/is:1|>:x/rel:a$<i>4|_0#0-1|-:t$<i>10]" +
-		 "[(1-2)s:b|i:b|f/m:zwei|f/y:two|x/o:zweitens|it/is:2|>:x/rel:b$<i>4|_1#1-2]" +
-		 "[(2-3)s:c|i:c|f/m:drei|f/y:three|x/o:drittens|it/is:3|_2#2-3|<>:s#2-5$<i>5]" +
-		 "[(3-4)s:a|i:a|f/m:vier|f/y:four|x/o:viertens|it/is:4|<:x/rel:b$<i>1|_3#3-4]" +
-		 "[(4-5)s:b|i:b|f/m:fuenf|f/y:five|x/o:fünftens|it/is:5|_4#4-5]" +
-		 "[(5-6)s:c|i:c|f/m:sechs|f/y:six|x/o:sechstens|it/is:6|_5#5-6]" +
-		 "[(6-7)s:a|i:a|f/m:sieben|f/y:seven|x/o:siebtens|it/is:7|_6#6-7]" +
-		 "[(7-8)s:b|i:b|f/m:acht|f/y:eight|x/o:achtens|it/is:8|<>:x/tag#7-10$<i>10|_7#7-8]" +
-		 "[(8-9)s:a|i:a|f/m:neun|f/y:nine|x/o:neuntens|it/is:9|_8#8-9]" +
-		 "[(9-10)s:c|i:c|f/m:zehn|f/y:ten|x/o:zehntens|it/is:10|_9#9-10]");
-	return fd;
+
+    @Test
+    public void indexExampleMultipleFoundries () throws IOException,
+            QueryException {
+        KrillIndex ki = new KrillIndex();
+        ki.addDoc(createSimpleFieldDoc4());
+        ki.commit();
+
+        Match km = ki.getMatchInfo("match-c1!d4-p3-9", "tokens", "f", "m",
+                false, false);
+        assertEquals(
+                "f:m info",
+                km.getSnippetBrackets(),
+                "... [{f/m:vier:a}{f/m:fuenf:b}{f/m:sechs:c}{f/m:sieben:a}{f/m:acht:b}{f/m:neun:a}] ...");
+
+        km = ki.getMatchInfo("match-c1!d4-p3-9", "tokens", "f", null, false,
+                false);
+        assertEquals(
+                "f info",
+                km.getSnippetBrackets(),
+                "... [{f/m:vier:{f/y:four:a}}{f/m:fuenf:{f/y:five:b}}{f/m:sechs:{f/y:six:c}}{f/m:sieben:{f/y:seven:a}}{f/m:acht:{f/y:eight:b}}{f/m:neun:{f/y:nine:a}}] ...");
+
+
+        km = ki.getMatchInfo("match-c1!d4-p3-4", "tokens", null, null, false,
+                false);
+        assertEquals("all info", km.getSnippetBrackets(),
+                "... [{f/m:vier:{f/y:four:{it/is:4:{x/o:viertens:a}}}}] ...");
+
+        ArrayList<String> foundryList = new ArrayList<>(2);
+        foundryList.add("f");
+        foundryList.add("x");
+
+        km = ki.getMatchInfo("match-c1!d4-p3-4", "tokens", true, foundryList,
+                (ArrayList<String>) null, false, false, false);
+        assertEquals("f|x info", km.getSnippetBrackets(),
+                "... [{f/m:vier:{f/y:four:{x/o:viertens:a}}}] ...");
+
+        foundryList.clear();
+        foundryList.add("y");
+        foundryList.add("x");
+
+        km = ki.getMatchInfo("match-c1!d4-p3-4", "tokens", true, foundryList,
+                (ArrayList<String>) null, false, false, false);
+        assertEquals("y|x info", km.getSnippetBrackets(),
+                "... [{x/o:viertens:a}] ...");
+
+
+        foundryList.clear();
+        foundryList.add("f");
+        foundryList.add("it");
+
+        ArrayList<String> layerList = new ArrayList<>(2);
+        layerList.add("is");
+
+        km = ki.getMatchInfo("match-c1!d4-p3-4", "tokens", true, foundryList,
+                layerList, false, false, false);
+        assertEquals("f|it/is", km.getSnippetBrackets(),
+                "... [{it/is:4:a}] ...");
     };
 
-    private FieldDocument createSimpleFieldDoc3(){
-	FieldDocument fd = new FieldDocument();
-	fd.addString("corpusID", "c1");
-	fd.addString("ID", "d3");
-	fd.addTV("tokens",
-		 "aa bb cc aa bb cc aa bb aa cc ",
-		 "[(0-2)s:aa|i:a|f/m:eins|f/y:one|x/o:erstens|it/is:1|>:x/rel:a$<i>4|_0#0-2|-:t$<i>10]" +
-		 "[(3-5)s:bb|i:b|f/m:zwei|f/y:two|x/o:zweitens|it/is:2|_1#3-5]" +
-		 "[(6-8)s:cc|i:c|f/m:drei|f/y:three|x/o:drittens|it/is:3|_2#6-8|<>:s#6-14$<i>5]" +
-		 "[(9-11)s:aa|i:a|f/m:vier|f/y:four|x/o:viertens|it/is:4|<:x/rel:b$<i>1|_3#9-11]" +
-		 "[(12-14)s:bb|i:b|f/m:fuenf|f/y:five|x/o:fünftens|it/is:5|_4#12-14]" +
-		 "[(15-17)s:cc|i:c|f/m:sechs|f/y:six|x/o:sechstens|it/is:6|_5#15-17]" +
-		 "[(18-20)s:aa|i:a|f/m:sieben|f/y:seven|x/o:siebtens|it/is:7|_6#18-20]" +
-		 "[(21-23)s:bb|i:b|f/m:acht|f/y:eight|x/o:achtens|it/is:8|<>:x/tag#7-10$<i>10|_7#21-23]" +
-		 "[(24-26)s:aa|i:a|f/m:neun|f/y:nine|x/o:neuntens|it/is:9|_8#24-26]" +
-		 "[(27-29)s:cc|i:c|f/m:zehn|f/y:ten|x/o:zehntens|it/is:10|_9#27-29]");
-	return fd;
+
+    private FieldDocument createSimpleFieldDoc () {
+        FieldDocument fd = new FieldDocument();
+        fd.addString("corpusID", "c1");
+        fd.addString("ID", "d1");
+        fd.addTV(
+                "tokens",
+                "abcabcabac",
+                "[(0-1)s:a|i:a|f/m:eins|f/y:one|x/o:erstens|it/is:1|>:x/rel:a$<i>4|_0#0-1|-:t$<i>10]"
+                        + "[(1-2)s:b|i:b|f/m:zwei|f/y:two|x/o:zweitens|it/is:2|_1#1-2]"
+                        + "[(2-3)s:c|i:c|f/m:drei|f/y:three|x/o:drittens|it/is:3|_2#2-3|<>:s#2-5$<i>5]"
+                        + "[(3-4)s:a|i:a|f/m:vier|f/y:four|x/o:viertens|it/is:4|<:x/rel:b$<i>1|_3#3-4]"
+                        + "[(4-5)s:b|i:b|f/m:fuenf|f/y:five|x/o:fünftens|it/is:5|_4#4-5]"
+                        + "[(5-6)s:c|i:c|f/m:sechs|f/y:six|x/o:sechstens|it/is:6|_5#5-6]"
+                        + "[(6-7)s:a|i:a|f/m:sieben|f/y:seven|x/o:siebtens|it/is:7|_6#6-7]"
+                        + "[(7-8)s:b|i:b|f/m:acht|f/y:eight|x/o:achtens|it/is:8|<>:x/tag#7-10$<i>10|_7#7-8]"
+                        + "[(8-9)s:a|i:a|f/m:neun|f/y:nine|x/o:neuntens|it/is:9|_8#8-9]"
+                        + "[(9-10)s:c|i:c|f/m:zehn|f/y:ten|x/o:zehntens|it/is:10|_9#9-10]");
+        return fd;
     };
 
-    private FieldDocument createSimpleFieldDoc4(){
-	FieldDocument fd = new FieldDocument();
-	fd.addString("corpusID", "c1");
-	fd.addString("ID", "d4");
-	fd.addTV("tokens",
-		 "abcabcabac",
-		 "[(0-1)s:a|i:a|f/m:eins|f/y:one|x/o:erstens|it/is:1|>:x/rel:a$<i>4|_0#0-1|-:t$<i>10]" +
-		 "[(1-2)s:b|i:b|f/m:zwei|f/y:two|x/o:zweitens|it/is:2|_1#1-2]" +
-		 "[(2-3)s:c|i:c|f/m:drei|f/y:three|x/o:drittens|it/is:3|_2#2-3|<>:s#2-5$<i>5]" +
-		 "[(3-4)s:a|i:a|f/m:vier|f/y:four|x/o:viertens|it/is:4|<:x/rel:b$<i>1|_3#3-4]" +
-		 "[(4-5)s:b|i:b|f/m:fuenf|f/y:five|x/o:fünftens|it/is:5|_4#4-5]" +
-		 "[(5-6)s:c|i:c|f/m:sechs|f/y:six|x/o:sechstens|it/is:6|_5#5-6|<>:s#5-7$<i>7]" +
-		 "[(6-7)s:a|i:a|f/m:sieben|f/y:seven|x/o:siebtens|it/is:7|_6#6-7]" +
-		 "[(7-8)s:b|i:b|f/m:acht|f/y:eight|x/o:achtens|it/is:8|<>:x/tag#7-10$<i>10|_7#7-8]" +
-		 "[(8-9)s:a|i:a|f/m:neun|f/y:nine|x/o:neuntens|it/is:9|_8#8-9]" +
-		 "[(9-10)s:c|i:c|f/m:zehn|f/y:ten|x/o:zehntens|it/is:10|_9#9-10]");
-	return fd;
+
+    private FieldDocument createSimpleFieldDoc2 () {
+        FieldDocument fd = new FieldDocument();
+        fd.addString("corpusID", "c1");
+        fd.addString("ID", "d1");
+        fd.addTV(
+                "tokens",
+                "abcabcabac",
+                "[(0-1)s:a|i:a|f/m:eins|f/y:one|x/o:erstens|it/is:1|>:x/rel:a$<i>4|_0#0-1|-:t$<i>10]"
+                        + "[(1-2)s:b|i:b|f/m:zwei|f/y:two|x/o:zweitens|it/is:2|>:x/rel:b$<i>4|_1#1-2]"
+                        + "[(2-3)s:c|i:c|f/m:drei|f/y:three|x/o:drittens|it/is:3|_2#2-3|<>:s#2-5$<i>5]"
+                        + "[(3-4)s:a|i:a|f/m:vier|f/y:four|x/o:viertens|it/is:4|<:x/rel:b$<i>1|_3#3-4]"
+                        + "[(4-5)s:b|i:b|f/m:fuenf|f/y:five|x/o:fünftens|it/is:5|_4#4-5]"
+                        + "[(5-6)s:c|i:c|f/m:sechs|f/y:six|x/o:sechstens|it/is:6|_5#5-6]"
+                        + "[(6-7)s:a|i:a|f/m:sieben|f/y:seven|x/o:siebtens|it/is:7|_6#6-7]"
+                        + "[(7-8)s:b|i:b|f/m:acht|f/y:eight|x/o:achtens|it/is:8|<>:x/tag#7-10$<i>10|_7#7-8]"
+                        + "[(8-9)s:a|i:a|f/m:neun|f/y:nine|x/o:neuntens|it/is:9|_8#8-9]"
+                        + "[(9-10)s:c|i:c|f/m:zehn|f/y:ten|x/o:zehntens|it/is:10|_9#9-10]");
+        return fd;
+    };
+
+
+    private FieldDocument createSimpleFieldDoc3 () {
+        FieldDocument fd = new FieldDocument();
+        fd.addString("corpusID", "c1");
+        fd.addString("ID", "d3");
+        fd.addTV(
+                "tokens",
+                "aa bb cc aa bb cc aa bb aa cc ",
+                "[(0-2)s:aa|i:a|f/m:eins|f/y:one|x/o:erstens|it/is:1|>:x/rel:a$<i>4|_0#0-2|-:t$<i>10]"
+                        + "[(3-5)s:bb|i:b|f/m:zwei|f/y:two|x/o:zweitens|it/is:2|_1#3-5]"
+                        + "[(6-8)s:cc|i:c|f/m:drei|f/y:three|x/o:drittens|it/is:3|_2#6-8|<>:s#6-14$<i>5]"
+                        + "[(9-11)s:aa|i:a|f/m:vier|f/y:four|x/o:viertens|it/is:4|<:x/rel:b$<i>1|_3#9-11]"
+                        + "[(12-14)s:bb|i:b|f/m:fuenf|f/y:five|x/o:fünftens|it/is:5|_4#12-14]"
+                        + "[(15-17)s:cc|i:c|f/m:sechs|f/y:six|x/o:sechstens|it/is:6|_5#15-17]"
+                        + "[(18-20)s:aa|i:a|f/m:sieben|f/y:seven|x/o:siebtens|it/is:7|_6#18-20]"
+                        + "[(21-23)s:bb|i:b|f/m:acht|f/y:eight|x/o:achtens|it/is:8|<>:x/tag#7-10$<i>10|_7#21-23]"
+                        + "[(24-26)s:aa|i:a|f/m:neun|f/y:nine|x/o:neuntens|it/is:9|_8#24-26]"
+                        + "[(27-29)s:cc|i:c|f/m:zehn|f/y:ten|x/o:zehntens|it/is:10|_9#27-29]");
+        return fd;
+    };
+
+
+    private FieldDocument createSimpleFieldDoc4 () {
+        FieldDocument fd = new FieldDocument();
+        fd.addString("corpusID", "c1");
+        fd.addString("ID", "d4");
+        fd.addTV(
+                "tokens",
+                "abcabcabac",
+                "[(0-1)s:a|i:a|f/m:eins|f/y:one|x/o:erstens|it/is:1|>:x/rel:a$<i>4|_0#0-1|-:t$<i>10]"
+                        + "[(1-2)s:b|i:b|f/m:zwei|f/y:two|x/o:zweitens|it/is:2|_1#1-2]"
+                        + "[(2-3)s:c|i:c|f/m:drei|f/y:three|x/o:drittens|it/is:3|_2#2-3|<>:s#2-5$<i>5]"
+                        + "[(3-4)s:a|i:a|f/m:vier|f/y:four|x/o:viertens|it/is:4|<:x/rel:b$<i>1|_3#3-4]"
+                        + "[(4-5)s:b|i:b|f/m:fuenf|f/y:five|x/o:fünftens|it/is:5|_4#4-5]"
+                        + "[(5-6)s:c|i:c|f/m:sechs|f/y:six|x/o:sechstens|it/is:6|_5#5-6|<>:s#5-7$<i>7]"
+                        + "[(6-7)s:a|i:a|f/m:sieben|f/y:seven|x/o:siebtens|it/is:7|_6#6-7]"
+                        + "[(7-8)s:b|i:b|f/m:acht|f/y:eight|x/o:achtens|it/is:8|<>:x/tag#7-10$<i>10|_7#7-8]"
+                        + "[(8-9)s:a|i:a|f/m:neun|f/y:nine|x/o:neuntens|it/is:9|_8#8-9]"
+                        + "[(9-10)s:c|i:c|f/m:zehn|f/y:ten|x/o:zehntens|it/is:10|_9#9-10]");
+        return fd;
     };
 
 };
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestMatchIndex.java b/src/test/java/de/ids_mannheim/korap/index/TestMatchIndex.java
index d253e42..5995ded 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestMatchIndex.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestMatchIndex.java
@@ -36,176 +36,169 @@
 
     @Test
     public void indexExample1 () throws IOException {
-	KrillIndex ki = new KrillIndex();
+        KrillIndex ki = new KrillIndex();
 
-	// abcabcabac
-	FieldDocument fd = new FieldDocument();
-	fd.addTV("base",
-             "abcabcabac",
-             "[(0-1)s:a|i:a|_0#0-1|-:t$<i>10]" +
-             "[(1-2)s:b|i:b|_1#1-2]" +
-             "[(2-3)s:c|i:c|_2#2-3]" +
-             "[(3-4)s:a|i:a|_3#3-4]" +
-             "[(4-5)s:b|i:b|_4#4-5]" +
-             "[(5-6)s:c|i:c|_5#5-6]" +
-             "[(6-7)s:a|i:a|_6#6-7]" +
-             "[(7-8)s:b|i:b|_7#7-8]" +
-             "[(8-9)s:a|i:a|_8#8-9]" +
-             "[(9-10)s:c|i:c|_9#9-10]");
-	ki.addDoc(fd);
+        // abcabcabac
+        FieldDocument fd = new FieldDocument();
+        fd.addTV("base", "abcabcabac", "[(0-1)s:a|i:a|_0#0-1|-:t$<i>10]"
+                + "[(1-2)s:b|i:b|_1#1-2]" + "[(2-3)s:c|i:c|_2#2-3]"
+                + "[(3-4)s:a|i:a|_3#3-4]" + "[(4-5)s:b|i:b|_4#4-5]"
+                + "[(5-6)s:c|i:c|_5#5-6]" + "[(6-7)s:a|i:a|_6#6-7]"
+                + "[(7-8)s:b|i:b|_7#7-8]" + "[(8-9)s:a|i:a|_8#8-9]"
+                + "[(9-10)s:c|i:c|_9#9-10]");
+        ki.addDoc(fd);
 
-	ki.commit();
+        ki.commit();
 
-	SpanQuery sq;
-	Result kr;
+        SpanQuery sq;
+        Result kr;
 
-	sq = new SpanNextQuery(
-            new SpanTermQuery(new Term("base", "s:b")),
-            new SpanClassQuery(
-              new SpanTermQuery(new Term("base", "s:a"))
-	    )
-        );
-	kr = ki.search(sq, (short) 10);
+        sq = new SpanNextQuery(new SpanTermQuery(new Term("base", "s:b")),
+                new SpanClassQuery(new SpanTermQuery(new Term("base", "s:a"))));
+        kr = ki.search(sq, (short) 10);
 
-	assertEquals("totalResults", kr.getTotalResults(), 1);
-	assertEquals("StartPos (0)", 7, kr.getMatch(0).startPos);
-	assertEquals("EndPos (0)", 9, kr.getMatch(0).endPos);
-	assertEquals("SnippetBrackets (0)", "... bcabca[b{1:a}]c", kr.getMatch(0).getSnippetBrackets());
+        assertEquals("totalResults", kr.getTotalResults(), 1);
+        assertEquals("StartPos (0)", 7, kr.getMatch(0).startPos);
+        assertEquals("EndPos (0)", 9, kr.getMatch(0).endPos);
+        assertEquals("SnippetBrackets (0)", "... bcabca[b{1:a}]c",
+                kr.getMatch(0).getSnippetBrackets());
 
-	assertEquals("Test no 'more' context", "<span class=\"context-left\"><span class=\"more\"></span>bcabca</span><mark>b<mark class=\"class-1 level-0\">a</mark></mark><span class=\"context-right\">c</span>", kr.getMatch(0).getSnippetHTML());
-	sq = new SpanFocusQuery(
-  	     new SpanNextQuery(
-                new SpanTermQuery(new Term("base", "s:b")),
-                new SpanClassQuery(
-                    new SpanTermQuery(new Term("base", "s:a"))
-	        )
-            )
-	);
-	kr = ki.search(sq, (short) 10);
+        assertEquals(
+                "Test no 'more' context",
+                "<span class=\"context-left\"><span class=\"more\"></span>bcabca</span><mark>b<mark class=\"class-1 level-0\">a</mark></mark><span class=\"context-right\">c</span>",
+                kr.getMatch(0).getSnippetHTML());
+        sq = new SpanFocusQuery(new SpanNextQuery(new SpanTermQuery(new Term(
+                "base", "s:b")), new SpanClassQuery(new SpanTermQuery(new Term(
+                "base", "s:a")))));
+        kr = ki.search(sq, (short) 10);
 
-	assertEquals("totalResults", kr.getTotalResults(), 1);
-	assertEquals("StartPos (0)", 8, kr.getMatch(0).startPos);
-	assertEquals("EndPos (0)", 9, kr.getMatch(0).endPos);
-	assertEquals("SnippetBrackets (0)", "... cabcab[{1:a}]c", kr.getMatch(0).getSnippetBrackets());
-	sq = new SpanFocusQuery(
-            new SpanNextQuery(
-	        new SpanClassQuery(new SpanTermQuery(new Term("base", "s:a")), (byte) 2),
-                new SpanClassQuery(new SpanTermQuery(new Term("base", "s:b")), (byte) 3)
-            ), (byte) 3
-        );
+        assertEquals("totalResults", kr.getTotalResults(), 1);
+        assertEquals("StartPos (0)", 8, kr.getMatch(0).startPos);
+        assertEquals("EndPos (0)", 9, kr.getMatch(0).endPos);
+        assertEquals("SnippetBrackets (0)", "... cabcab[{1:a}]c", kr
+                .getMatch(0).getSnippetBrackets());
+        sq = new SpanFocusQuery(new SpanNextQuery(new SpanClassQuery(
+                new SpanTermQuery(new Term("base", "s:a")), (byte) 2),
+                new SpanClassQuery(new SpanTermQuery(new Term("base", "s:b")),
+                        (byte) 3)), (byte) 3);
 
-	kr = ki.search(sq, (short) 10);
+        kr = ki.search(sq, (short) 10);
 
-	assertEquals("totalResults", kr.getTotalResults(), 3);
-	assertEquals("StartPos (0)", 1, kr.getMatch(0).startPos);
-	assertEquals("EndPos (0)", 2, kr.getMatch(0).endPos);
-	assertEquals("SnippetBrackets (0)", "a[{3:b}]cabcab ...", kr.getMatch(0).getSnippetBrackets());
-	
+        assertEquals("totalResults", kr.getTotalResults(), 3);
+        assertEquals("StartPos (0)", 1, kr.getMatch(0).startPos);
+        assertEquals("EndPos (0)", 2, kr.getMatch(0).endPos);
+        assertEquals("SnippetBrackets (0)", "a[{3:b}]cabcab ...", kr
+                .getMatch(0).getSnippetBrackets());
 
-	assertEquals("<span class=\"context-left\">a</span><mark><mark class=\"class-3 level-0\">b</mark></mark><span class=\"context-right\">cabcab<span class=\"more\"></span></span>", kr.getMatch(0).getSnippetHTML());
 
-	assertEquals("StartPos (1)", 4, kr.getMatch(1).startPos);
-	assertEquals("EndPos (1)", 5, kr.getMatch(1).endPos);
-	assertEquals("SnippetBrackets (1)", "abca[{3:b}]cabac", kr.getMatch(1).getSnippetBrackets());
+        assertEquals(
+                "<span class=\"context-left\">a</span><mark><mark class=\"class-3 level-0\">b</mark></mark><span class=\"context-right\">cabcab<span class=\"more\"></span></span>",
+                kr.getMatch(0).getSnippetHTML());
 
-	assertEquals("<span class=\"context-left\">abca</span><mark><mark class=\"class-3 level-0\">b</mark></mark><span class=\"context-right\">cabac</span>", kr.getMatch(1).getSnippetHTML());
+        assertEquals("StartPos (1)", 4, kr.getMatch(1).startPos);
+        assertEquals("EndPos (1)", 5, kr.getMatch(1).endPos);
+        assertEquals("SnippetBrackets (1)", "abca[{3:b}]cabac", kr.getMatch(1)
+                .getSnippetBrackets());
 
-	assertEquals("StartPos (2)", 7, kr.getMatch(2).startPos);
-	assertEquals("EndPos (2)", 8, kr.getMatch(2).endPos);
-	assertEquals("SnippetBrackets (2)", "... bcabca[{3:b}]ac", kr.getMatch(2).getSnippetBrackets());
+        assertEquals(
+                "<span class=\"context-left\">abca</span><mark><mark class=\"class-3 level-0\">b</mark></mark><span class=\"context-right\">cabac</span>",
+                kr.getMatch(1).getSnippetHTML());
+
+        assertEquals("StartPos (2)", 7, kr.getMatch(2).startPos);
+        assertEquals("EndPos (2)", 8, kr.getMatch(2).endPos);
+        assertEquals("SnippetBrackets (2)", "... bcabca[{3:b}]ac",
+                kr.getMatch(2).getSnippetBrackets());
 
 
 
-	// abcabcabac
-	sq = new SpanFocusQuery( 
-            new SpanNextQuery(
-                new SpanTermQuery(new Term("base", "s:a")),
-                new SpanClassQuery(
-	            new SpanNextQuery(
-	   	        new SpanTermQuery(new Term("base", "s:b")),
-	    	        new SpanClassQuery(new SpanTermQuery(new Term("base", "s:a")))
-		    ), (byte) 2
-        )), (byte) 2);
+        // abcabcabac
+        sq = new SpanFocusQuery(
+                new SpanNextQuery(new SpanTermQuery(new Term("base", "s:a")),
+                        new SpanClassQuery(new SpanNextQuery(new SpanTermQuery(
+                                new Term("base", "s:b")), new SpanClassQuery(
+                                new SpanTermQuery(new Term("base", "s:a")))),
+                                (byte) 2)), (byte) 2);
 
-	kr = ki.search(sq, (short) 10);
+        kr = ki.search(sq, (short) 10);
 
-	assertEquals("totalResults", kr.getTotalResults(), 1);
-	assertEquals("SnippetBrackets (0)", "... bcabca[{2:b{1:a}}]c", kr.getMatch(0).getSnippetBrackets());
+        assertEquals("totalResults", kr.getTotalResults(), 1);
+        assertEquals("SnippetBrackets (0)", "... bcabca[{2:b{1:a}}]c", kr
+                .getMatch(0).getSnippetBrackets());
 
-	assertEquals("SnippetHTML (0) 1", "<span class=\"context-left\"><span class=\"more\"></span>bcabca</span><mark><mark class=\"class-2 level-0\">b<mark class=\"class-1 level-1\">a</mark></mark></mark><span class=\"context-right\">c</span>", kr.getMatch(0).getSnippetHTML());
+        assertEquals(
+                "SnippetHTML (0) 1",
+                "<span class=\"context-left\"><span class=\"more\"></span>bcabca</span><mark><mark class=\"class-2 level-0\">b<mark class=\"class-1 level-1\">a</mark></mark></mark><span class=\"context-right\">c</span>",
+                kr.getMatch(0).getSnippetHTML());
 
-	// Offset tokens
-	kr = ki.search(sq, 0, (short) 10, true, (short) 2, true, (short) 2);
-	assertEquals("totalResults", kr.getTotalResults(), 1);
-	assertEquals("SnippetBrackets (0)", "... ca[{2:b{1:a}}]c", kr.getMatch(0).getSnippetBrackets());
+        // Offset tokens
+        kr = ki.search(sq, 0, (short) 10, true, (short) 2, true, (short) 2);
+        assertEquals("totalResults", kr.getTotalResults(), 1);
+        assertEquals("SnippetBrackets (0)", "... ca[{2:b{1:a}}]c",
+                kr.getMatch(0).getSnippetBrackets());
 
 
 
-	// Offset Characters
-	kr = ki.search(sq, 0, (short) 10, false, (short) 1, false, (short) 0);
-	assertEquals("totalResults", kr.getTotalResults(), 1);
-	assertEquals("SnippetBrackets (0)", "... a[{2:b{1:a}}] ...", kr.getMatch(0).getSnippetBrackets());
+        // Offset Characters
+        kr = ki.search(sq, 0, (short) 10, false, (short) 1, false, (short) 0);
+        assertEquals("totalResults", kr.getTotalResults(), 1);
+        assertEquals("SnippetBrackets (0)", "... a[{2:b{1:a}}] ...", kr
+                .getMatch(0).getSnippetBrackets());
 
-	assertEquals("SnippetHTML (0) 2", "<span class=\"context-left\"><span class=\"more\"></span>a</span><mark><mark class=\"class-2 level-0\">b<mark class=\"class-1 level-1\">a</mark></mark></mark><span class=\"context-right\"><span class=\"more\"></span></span>", kr.getMatch(0).getSnippetHTML());
+        assertEquals(
+                "SnippetHTML (0) 2",
+                "<span class=\"context-left\"><span class=\"more\"></span>a</span><mark><mark class=\"class-2 level-0\">b<mark class=\"class-1 level-1\">a</mark></mark></mark><span class=\"context-right\"><span class=\"more\"></span></span>",
+                kr.getMatch(0).getSnippetHTML());
 
-	sq = new SpanFocusQuery(
-            new SpanClassQuery(
-                new SpanNextQuery(
-	            new SpanClassQuery(new SpanTermQuery(new Term("base", "s:b")), (byte) 1),
-                    new SpanClassQuery(new SpanTermQuery(new Term("base", "s:c")), (byte) 2)
-		), (byte) 3
-            ), (byte) 3
-	);
+        sq = new SpanFocusQuery(new SpanClassQuery(new SpanNextQuery(
+                new SpanClassQuery(new SpanTermQuery(new Term("base", "s:b")),
+                        (byte) 1), new SpanClassQuery(new SpanTermQuery(
+                        new Term("base", "s:c")), (byte) 2)), (byte) 3),
+                (byte) 3);
 
-	kr = ki.search(sq, (short) 10);
-	
-	assertEquals("totalResults", kr.getTotalResults(), 2);
-	assertEquals("StartPos (0)", 1, kr.getMatch(0).startPos);
-	assertEquals("EndPos (0)", 3, kr.getMatch(0).endPos);
-	assertEquals("SnippetBrackets (0)", "a[{3:{1:b}{2:c}}]abcaba ...", kr.getMatch(0).getSnippetBrackets());
-	assertEquals("StartPos (1)", 4, kr.getMatch(1).startPos);
-	assertEquals("EndPos (1)", 6, kr.getMatch(1).endPos);
-	assertEquals("SnippetBrackets (1)", "abca[{3:{1:b}{2:c}}]abac", kr.getMatch(1).getSnippetBrackets());
+        kr = ki.search(sq, (short) 10);
 
-	assertEquals("Document count", 1, ki.numberOf("base", "documents"));
-	assertEquals("Token count", 10, ki.numberOf("base", "t"));
+        assertEquals("totalResults", kr.getTotalResults(), 2);
+        assertEquals("StartPos (0)", 1, kr.getMatch(0).startPos);
+        assertEquals("EndPos (0)", 3, kr.getMatch(0).endPos);
+        assertEquals("SnippetBrackets (0)", "a[{3:{1:b}{2:c}}]abcaba ...", kr
+                .getMatch(0).getSnippetBrackets());
+        assertEquals("StartPos (1)", 4, kr.getMatch(1).startPos);
+        assertEquals("EndPos (1)", 6, kr.getMatch(1).endPos);
+        assertEquals("SnippetBrackets (1)", "abca[{3:{1:b}{2:c}}]abac", kr
+                .getMatch(1).getSnippetBrackets());
 
-	// Don't match the expected class!
-	sq = new SpanFocusQuery(
-            new SpanNextQuery(
-	        new SpanClassQuery(new SpanTermQuery(new Term("base", "s:b")), (byte) 1),
-		new SpanClassQuery(new SpanTermQuery(new Term("base", "s:c")), (byte) 2)
-	    ), (byte) 3
-	);
+        assertEquals("Document count", 1, ki.numberOf("base", "documents"));
+        assertEquals("Token count", 10, ki.numberOf("base", "t"));
 
-	kr = ki.search(sq, (short) 10);
-	
-	assertEquals("totalResults", kr.getTotalResults(), 0);
+        // Don't match the expected class!
+        sq = new SpanFocusQuery(new SpanNextQuery(new SpanClassQuery(
+                new SpanTermQuery(new Term("base", "s:b")), (byte) 1),
+                new SpanClassQuery(new SpanTermQuery(new Term("base", "s:c")),
+                        (byte) 2)), (byte) 3);
 
-	sq = new SpanFocusQuery(
-            new SpanNextQuery(
-                new SpanTermQuery(new Term("base", "s:a")),
-                new SpanClassQuery(
-	            new SpanNextQuery(
-	                new SpanTermQuery(new Term("base", "s:b")),
-	                new SpanTermQuery(new Term("base", "s:c"))
-  	            )
-	       )
-            )
-        );
+        kr = ki.search(sq, (short) 10);
 
-	kr = ki.search(sq, (short) 2);
-	
-	assertEquals("totalResults", kr.getTotalResults(), 2);
-	assertEquals("StartPos (0)", 1, kr.getMatch(0).startPos);
-	assertEquals("EndPos (0)", 3, kr.getMatch(0).endPos);
-	assertEquals("SnippetBrackets (0)", "a[{1:bc}]abcaba ...", kr.getMatch(0).getSnippetBrackets());
-	assertEquals("StartPos (1)", 4, kr.getMatch(1).startPos);
-	assertEquals("EndPos (1)", 6, kr.getMatch(1).endPos);
-	assertEquals("SnippetBrackets (1)", "abca[{1:bc}]abac", kr.getMatch(1).getSnippetBrackets());
+        assertEquals("totalResults", kr.getTotalResults(), 0);
 
-	assertEquals(1, ki.numberOf("base", "documents"));
-	assertEquals(10, ki.numberOf("base", "t"));
+        sq = new SpanFocusQuery(new SpanNextQuery(new SpanTermQuery(new Term(
+                "base", "s:a")), new SpanClassQuery(new SpanNextQuery(
+                new SpanTermQuery(new Term("base", "s:b")), new SpanTermQuery(
+                        new Term("base", "s:c"))))));
+
+        kr = ki.search(sq, (short) 2);
+
+        assertEquals("totalResults", kr.getTotalResults(), 2);
+        assertEquals("StartPos (0)", 1, kr.getMatch(0).startPos);
+        assertEquals("EndPos (0)", 3, kr.getMatch(0).endPos);
+        assertEquals("SnippetBrackets (0)", "a[{1:bc}]abcaba ...",
+                kr.getMatch(0).getSnippetBrackets());
+        assertEquals("StartPos (1)", 4, kr.getMatch(1).startPos);
+        assertEquals("EndPos (1)", 6, kr.getMatch(1).endPos);
+        assertEquals("SnippetBrackets (1)", "abca[{1:bc}]abac", kr.getMatch(1)
+                .getSnippetBrackets());
+
+        assertEquals(1, ki.numberOf("base", "documents"));
+        assertEquals(10, ki.numberOf("base", "t"));
     };
 
 
@@ -215,18 +208,12 @@
 
         // abcabcabac
         FieldDocument fd = new FieldDocument();
-        fd.addTV("base",
-                 "abcabcabac",
-                 "[(0-1)s:a|i:a|_0#0-1|-:t$<i>10]" +
-                 "[(1-2)s:b|i:b|_1#1-2]" +
-                 "[(2-3)s:c|i:c|_2#2-3]" +
-                 "[(3-4)s:a|i:a|_3#3-4]" +
-                 "[(4-5)s:b|i:b|_4#4-5]" +
-                 "[(5-6)s:c|i:c|_5#5-6]" +
-                 "[(6-7)s:a|i:a|_6#6-7]" +
-                 "[(7-8)s:b|i:b|_7#7-8]" +
-                 "[(8-9)s:a|i:a|_8#8-9]" +
-                 "[(9-10)s:c|i:c|_9#9-10]");
+        fd.addTV("base", "abcabcabac", "[(0-1)s:a|i:a|_0#0-1|-:t$<i>10]"
+                + "[(1-2)s:b|i:b|_1#1-2]" + "[(2-3)s:c|i:c|_2#2-3]"
+                + "[(3-4)s:a|i:a|_3#3-4]" + "[(4-5)s:b|i:b|_4#4-5]"
+                + "[(5-6)s:c|i:c|_5#5-6]" + "[(6-7)s:a|i:a|_6#6-7]"
+                + "[(7-8)s:b|i:b|_7#7-8]" + "[(8-9)s:a|i:a|_8#8-9]"
+                + "[(9-10)s:c|i:c|_9#9-10]");
         ki.addDoc(fd);
         ki.commit();
 
@@ -234,33 +221,55 @@
         Result kr;
 
         // No contexts:
-        sq = new SpanOrQuery(
-            new SpanTermQuery(new Term("base", "s:a")),
-            new SpanTermQuery(new Term("base", "s:c"))
-        );
+        sq = new SpanOrQuery(new SpanTermQuery(new Term("base", "s:a")),
+                new SpanTermQuery(new Term("base", "s:c")));
         kr = ki.search(sq, (short) 20);
 
         assertEquals("totalResults", kr.getTotalResults(), 7);
-        assertEquals("SnippetBrackets (0)", "<span class=\"context-left\"></span><mark>a</mark><span class=\"context-right\">bcabca<span class=\"more\"></span></span>", kr.getMatch(0).getSnippetHTML());
-        assertEquals("SnippetBrackets (0)", "[a]bcabca ...", kr.getMatch(0).getSnippetBrackets());
+        assertEquals(
+                "SnippetBrackets (0)",
+                "<span class=\"context-left\"></span><mark>a</mark><span class=\"context-right\">bcabca<span class=\"more\"></span></span>",
+                kr.getMatch(0).getSnippetHTML());
+        assertEquals("SnippetBrackets (0)", "[a]bcabca ...", kr.getMatch(0)
+                .getSnippetBrackets());
 
-        assertEquals("SnippetBrackets (1)", "ab[c]abcaba ...", kr.getMatch(1).getSnippetBrackets());
-        assertEquals("SnippetBrackets (1)", "<span class=\"context-left\">ab</span><mark>c</mark><span class=\"context-right\">abcaba<span class=\"more\"></span></span>", kr.getMatch(1).getSnippetHTML());
-        
-        assertEquals("SnippetBrackets (6)", "... abcaba[c]", kr.getMatch(6).getSnippetBrackets());
-        assertEquals("SnippetBrackets (6)", "<span class=\"context-left\"><span class=\"more\"></span>abcaba</span><mark>c</mark><span class=\"context-right\"></span>", kr.getMatch(6).getSnippetHTML());
+        assertEquals("SnippetBrackets (1)", "ab[c]abcaba ...", kr.getMatch(1)
+                .getSnippetBrackets());
+        assertEquals(
+                "SnippetBrackets (1)",
+                "<span class=\"context-left\">ab</span><mark>c</mark><span class=\"context-right\">abcaba<span class=\"more\"></span></span>",
+                kr.getMatch(1).getSnippetHTML());
+
+        assertEquals("SnippetBrackets (6)", "... abcaba[c]", kr.getMatch(6)
+                .getSnippetBrackets());
+        assertEquals(
+                "SnippetBrackets (6)",
+                "<span class=\"context-left\"><span class=\"more\"></span>abcaba</span><mark>c</mark><span class=\"context-right\"></span>",
+                kr.getMatch(6).getSnippetHTML());
 
         kr = ki.search(sq, 0, (short) 20, true, (short) 0, true, (short) 0);
 
         assertEquals("totalResults", kr.getTotalResults(), 7);
-        assertEquals("SnippetBrackets (0)", "[a] ...", kr.getMatch(0).getSnippetBrackets());
-        assertEquals("SnippetHTML (0)", "<span class=\"context-left\"></span><mark>a</mark><span class=\"context-right\"><span class=\"more\"></span></span>", kr.getMatch(0).getSnippetHTML());
+        assertEquals("SnippetBrackets (0)", "[a] ...", kr.getMatch(0)
+                .getSnippetBrackets());
+        assertEquals(
+                "SnippetHTML (0)",
+                "<span class=\"context-left\"></span><mark>a</mark><span class=\"context-right\"><span class=\"more\"></span></span>",
+                kr.getMatch(0).getSnippetHTML());
 
-        assertEquals("SnippetBrackets (1)", "... [c] ...", kr.getMatch(1).getSnippetBrackets());
-        assertEquals("SnippetHTML (1)", "<span class=\"context-left\"><span class=\"more\"></span></span><mark>c</mark><span class=\"context-right\"><span class=\"more\"></span></span>", kr.getMatch(1).getSnippetHTML());
+        assertEquals("SnippetBrackets (1)", "... [c] ...", kr.getMatch(1)
+                .getSnippetBrackets());
+        assertEquals(
+                "SnippetHTML (1)",
+                "<span class=\"context-left\"><span class=\"more\"></span></span><mark>c</mark><span class=\"context-right\"><span class=\"more\"></span></span>",
+                kr.getMatch(1).getSnippetHTML());
 
-        assertEquals("SnippetBrackets (6)", "... [c]", kr.getMatch(6).getSnippetBrackets());
-        assertEquals("SnippetBrackets (6)", "<span class=\"context-left\"><span class=\"more\"></span></span><mark>c</mark><span class=\"context-right\"></span>", kr.getMatch(6).getSnippetHTML());
+        assertEquals("SnippetBrackets (6)", "... [c]", kr.getMatch(6)
+                .getSnippetBrackets());
+        assertEquals(
+                "SnippetBrackets (6)",
+                "<span class=\"context-left\"><span class=\"more\"></span></span><mark>c</mark><span class=\"context-right\"></span>",
+                kr.getMatch(6).getSnippetHTML());
     };
 
 
@@ -270,18 +279,12 @@
 
         // abcabcabac
         FieldDocument fd = new FieldDocument();
-        fd.addTV("base",
-                 "abcabcabac",
-                 "[(0-1)s:a|i:a|_0#0-1|-:t$<i>10]" +
-                 "[(1-2)s:b|i:b|_1#1-2]" +
-                 "[(2-3)s:c|i:c|_2#2-3]" +
-                 "[(3-4)s:a|i:a|_3#3-4]" +
-                 "[(4-5)s:b|i:b|_4#4-5]" +
-                 "[(5-6)s:c|i:c|_5#5-6]" +
-                 "[(6-7)s:a|i:a|_6#6-7]" +
-                 "[(7-8)s:b|i:b|_7#7-8]" +
-                 "[(8-9)s:a|i:a|_8#8-9]" +
-                 "[(9-10)s:c|i:c|_9#9-10]");
+        fd.addTV("base", "abcabcabac", "[(0-1)s:a|i:a|_0#0-1|-:t$<i>10]"
+                + "[(1-2)s:b|i:b|_1#1-2]" + "[(2-3)s:c|i:c|_2#2-3]"
+                + "[(3-4)s:a|i:a|_3#3-4]" + "[(4-5)s:b|i:b|_4#4-5]"
+                + "[(5-6)s:c|i:c|_5#5-6]" + "[(6-7)s:a|i:a|_6#6-7]"
+                + "[(7-8)s:b|i:b|_7#7-8]" + "[(8-9)s:a|i:a|_8#8-9]"
+                + "[(9-10)s:c|i:c|_9#9-10]");
         ki.addDoc(fd);
         ki.commit();
 
@@ -289,12 +292,16 @@
 
         QueryBuilder kq = new QueryBuilder("base");
 
-        SpanQuery sq = kq._(1,kq.seq(kq.seg("s:b")).append(kq.seg("s:a")).append(kq._(2,kq.seg("s:c")))).toQuery();
-        
+        SpanQuery sq = kq._(
+                1,
+                kq.seq(kq.seg("s:b")).append(kq.seg("s:a"))
+                        .append(kq._(2, kq.seg("s:c")))).toQuery();
+
         kr = ki.search(sq, 0, (short) 20, true, (short) 2, true, (short) 5);
 
         assertEquals("totalResults", kr.getTotalResults(), 1);
-        assertEquals("SnippetBrackets (0)", "... ca[{1:ba{2:c}}]", kr.getMatch(0).getSnippetBrackets());
+        assertEquals("SnippetBrackets (0)", "... ca[{1:ba{2:c}}]",
+                kr.getMatch(0).getSnippetBrackets());
     };
 
 
@@ -304,30 +311,22 @@
 
         // abcabcabac
         FieldDocument fd = new FieldDocument();
-        fd.addTV("base",
-                 "abcabcabac",
-                 "[(0-1)s:a|i:a|_0#0-1|-:t$<i>10]" +
-                 "[(1-2)s:b|i:b|_1#1-2]" +
-                 "[(2-3)s:c|i:c|_2#2-3]" +
-                 "[(3-4)s:a|i:a|_3#3-4]" +
-                 "[(4-5)s:b|i:b|_4#4-5]" +
-                 "[(5-6)s:c|i:c|_5#5-6]" +
-                 "[(6-7)s:a|i:a|_6#6-7]" +
-                 "[(7-8)s:b|i:b|_7#7-8]" +
-                 "[(8-9)s:a|i:a|_8#8-9]" +
-                 "[(9-10)s:c|i:c|_9#9-10]");
+        fd.addTV("base", "abcabcabac", "[(0-1)s:a|i:a|_0#0-1|-:t$<i>10]"
+                + "[(1-2)s:b|i:b|_1#1-2]" + "[(2-3)s:c|i:c|_2#2-3]"
+                + "[(3-4)s:a|i:a|_3#3-4]" + "[(4-5)s:b|i:b|_4#4-5]"
+                + "[(5-6)s:c|i:c|_5#5-6]" + "[(6-7)s:a|i:a|_6#6-7]"
+                + "[(7-8)s:b|i:b|_7#7-8]" + "[(8-9)s:a|i:a|_8#8-9]"
+                + "[(9-10)s:c|i:c|_9#9-10]");
         ki.addDoc(fd);
         ki.commit();
 
         SpanQuery sq;
         Result kr;
 
-        sq = new SpanFocusQuery(
-            new SpanNextQuery(
-                new SpanClassQuery(new SpanTermQuery(new Term("base", "s:a")), (byte) 2),
-                new SpanClassQuery(new SpanTermQuery(new Term("base", "s:b")), (byte) 3)
-            ), (byte) 3
-        );
+        sq = new SpanFocusQuery(new SpanNextQuery(new SpanClassQuery(
+                new SpanTermQuery(new Term("base", "s:a")), (byte) 2),
+                new SpanClassQuery(new SpanTermQuery(new Term("base", "s:b")),
+                        (byte) 3)), (byte) 3);
 
         kr = ki.search(sq, (short) 10);
 
@@ -336,23 +335,22 @@
         Match km = kr.getMatch(0);
         assertEquals("StartPos (0)", 1, km.startPos);
         assertEquals("EndPos (0)", 2, km.endPos);
-        assertEquals("SnippetBrackets (0)", "a[{3:b}]cabcab ...", km.getSnippetBrackets());
+        assertEquals("SnippetBrackets (0)", "a[{3:b}]cabcab ...",
+                km.getSnippetBrackets());
 
-        sq = new SpanFocusQuery(
-            new SpanFocusQuery(
-                new SpanNextQuery(
-	            new SpanClassQuery(new SpanTermQuery(new Term("base", "s:a")), (byte) 2),
-                    new SpanClassQuery(new SpanTermQuery(new Term("base", "s:b")), (byte) 3)
-                ), (byte) 3
-	        ), (byte) 2
-        );
-	
+        sq = new SpanFocusQuery(new SpanFocusQuery(new SpanNextQuery(
+                new SpanClassQuery(new SpanTermQuery(new Term("base", "s:a")),
+                        (byte) 2), new SpanClassQuery(new SpanTermQuery(
+                        new Term("base", "s:b")), (byte) 3)), (byte) 3),
+                (byte) 2);
+
         kr = ki.search(sq, (short) 10);
 
         km = kr.getMatch(0);
         assertEquals("StartPos (0)", 0, km.startPos);
         assertEquals("EndPos (0)", 1, km.endPos);
-        assertEquals("SnippetBrackets (0)", "[{2:a}]bcabca ...", km.getSnippetBrackets());
+        assertEquals("SnippetBrackets (0)", "[{2:a}]bcabca ...",
+                km.getSnippetBrackets());
 
         // TODO: Check ID
     };
@@ -361,45 +359,40 @@
     @Test
     public void indexExampleFocusWithSpan () throws IOException {
         KrillIndex ki = new KrillIndex();
-        
+
         // abcabcabac
         FieldDocument fd = new FieldDocument();
-        fd.addTV("base",
-                 "abcabcabac",
-                 "[(0-1)s:a|i:a|_0#0-1|-:t$<i>10]" +
-                 "[(1-2)s:b|i:b|_1#1-2|<>:s#1-5$<i>5]" +
-                 "[(2-3)s:c|i:c|_2#2-3|<>:s#2-7$<i>7]" +
-                 "[(3-4)s:a|i:a|_3#3-4]" +
-                 "[(4-5)s:b|i:b|_4#4-5]" +
-                 "[(5-6)s:c|i:c|_5#5-6]" +
-                 "[(6-7)s:a|i:a|_6#6-7]" +
-                 "[(7-8)s:b|i:b|_7#7-8]" +
-                 "[(8-9)s:a|i:a|_8#8-9]" +
-                 "[(9-10)s:c|i:c|_9#9-10]");
+        fd.addTV("base", "abcabcabac", "[(0-1)s:a|i:a|_0#0-1|-:t$<i>10]"
+                + "[(1-2)s:b|i:b|_1#1-2|<>:s#1-5$<i>5]"
+                + "[(2-3)s:c|i:c|_2#2-3|<>:s#2-7$<i>7]"
+                + "[(3-4)s:a|i:a|_3#3-4]" + "[(4-5)s:b|i:b|_4#4-5]"
+                + "[(5-6)s:c|i:c|_5#5-6]" + "[(6-7)s:a|i:a|_6#6-7]"
+                + "[(7-8)s:b|i:b|_7#7-8]" + "[(8-9)s:a|i:a|_8#8-9]"
+                + "[(9-10)s:c|i:c|_9#9-10]");
         ki.addDoc(fd);
         ki.commit();
 
         SpanQuery sq;
         Result kr;
-        
-        sq = new SpanWithinQuery(
-            new SpanClassQuery(new SpanElementQuery("base", "s"), (byte) 2),
-            new SpanClassQuery(new SpanTermQuery(new Term("base", "s:b")), (byte) 3)
-        );
+
+        sq = new SpanWithinQuery(new SpanClassQuery(new SpanElementQuery(
+                "base", "s"), (byte) 2), new SpanClassQuery(new SpanTermQuery(
+                new Term("base", "s:b")), (byte) 3));
 
         kr = ki.search(sq, (short) 10);
-        assertEquals(kr.getSerialQuery(), "spanContain({2: <base:s />}, {3: base:s:b})");
-        assertEquals(kr.getMatch(0).getSnippetBrackets(), "a[{2:{3:b}cab}]cabac");
+        assertEquals(kr.getSerialQuery(),
+                "spanContain({2: <base:s />}, {3: base:s:b})");
+        assertEquals(kr.getMatch(0).getSnippetBrackets(),
+                "a[{2:{3:b}cab}]cabac");
 
-        sq = new SpanFocusQuery(
-            new SpanWithinQuery(
-	        new SpanClassQuery(new SpanElementQuery("base", "s"), (byte) 2),
-                new SpanClassQuery(new SpanTermQuery(new Term("base", "s:b")), (byte) 3)
-            ), (byte) 3
-        );
+        sq = new SpanFocusQuery(new SpanWithinQuery(new SpanClassQuery(
+                new SpanElementQuery("base", "s"), (byte) 2),
+                new SpanClassQuery(new SpanTermQuery(new Term("base", "s:b")),
+                        (byte) 3)), (byte) 3);
 
         kr = ki.search(sq, (short) 10);
-        assertEquals(kr.getSerialQuery(), "focus(3: spanContain({2: <base:s />}, {3: base:s:b}))");
+        assertEquals(kr.getSerialQuery(),
+                "focus(3: spanContain({2: <base:s />}, {3: base:s:b}))");
         assertEquals(kr.getMatch(0).getSnippetBrackets(), "a[{3:b}]cabcab ...");
     };
 
@@ -407,64 +400,47 @@
     @Ignore
     public void indexExampleFocusWithSkip () throws IOException {
         KrillIndex ki = new KrillIndex();
-        
+
         // abcabcabac
         FieldDocument fd = new FieldDocument();
-        fd.addTV("base",
-                 "abcabcabac",
-                 // The payload should be ignored
-                 "[(0-1)s:a|i:a|_0#0-1|-:t$<i>10]" + // |<>:p#0-10<i>9]" +
-                 "[(1-2)s:b|i:b|_1#1-2|<>:s#1-5$<i>5]" +
-                 "[(2-3)s:c|i:c|_2#2-3|<>:s#2-7$<i>7]" +
-                 "[(3-4)s:a|i:a|_3#3-4]" +
-                 "[(4-5)s:b|i:b|_4#4-5]" +
-                 "[(5-6)s:c|i:c|_5#5-6]" +
-                 "[(6-7)s:a|i:a|_6#6-7]" +
-                 "[(7-8)s:b|i:b|_7#7-8]" +
-                 "[(8-9)s:a|i:a|_8#8-9]" +
-                 "[(9-10)s:c|i:c|_9#9-10]");
+        fd.addTV("base", "abcabcabac",
+        // The payload should be ignored
+                "[(0-1)s:a|i:a|_0#0-1|-:t$<i>10]"
+                        + // |<>:p#0-10<i>9]" +
+                        "[(1-2)s:b|i:b|_1#1-2|<>:s#1-5$<i>5]"
+                        + "[(2-3)s:c|i:c|_2#2-3|<>:s#2-7$<i>7]"
+                        + "[(3-4)s:a|i:a|_3#3-4]" + "[(4-5)s:b|i:b|_4#4-5]"
+                        + "[(5-6)s:c|i:c|_5#5-6]" + "[(6-7)s:a|i:a|_6#6-7]"
+                        + "[(7-8)s:b|i:b|_7#7-8]" + "[(8-9)s:a|i:a|_8#8-9]"
+                        + "[(9-10)s:c|i:c|_9#9-10]");
         ki.addDoc(fd);
         fd = new FieldDocument();
-        fd.addTV("base",
-                 "gbcgbcgbgc",
-                 "[(0-1)s:g|i:g|_0#0-1|-:t$<i>10|<>:p#0-10$<i>9]" +
-                 "[(1-2)s:b|i:b|_1#1-2|<>:s#1-5$<i>5]" +
-                 "[(2-3)s:c|i:c|_2#2-3|<>:s#2-7$<i>7]" +
-                 "[(3-4)s:g|i:g|_3#3-4]" +
-                 "[(4-5)s:b|i:b|_4#4-5]" +
-                 "[(5-6)s:c|i:c|_5#5-6]" +
-                 "[(6-7)s:g|i:g|_6#6-7]" +
-                 "[(7-8)s:b|i:b|_7#7-8]" +
-                 "[(8-9)s:g|i:g|_8#8-9]" +
-                 "[(9-10)s:c|i:c|_9#9-10]");
+        fd.addTV("base", "gbcgbcgbgc",
+                "[(0-1)s:g|i:g|_0#0-1|-:t$<i>10|<>:p#0-10$<i>9]"
+                        + "[(1-2)s:b|i:b|_1#1-2|<>:s#1-5$<i>5]"
+                        + "[(2-3)s:c|i:c|_2#2-3|<>:s#2-7$<i>7]"
+                        + "[(3-4)s:g|i:g|_3#3-4]" + "[(4-5)s:b|i:b|_4#4-5]"
+                        + "[(5-6)s:c|i:c|_5#5-6]" + "[(6-7)s:g|i:g|_6#6-7]"
+                        + "[(7-8)s:b|i:b|_7#7-8]" + "[(8-9)s:g|i:g|_8#8-9]"
+                        + "[(9-10)s:c|i:c|_9#9-10]");
         ki.addDoc(fd);
         fd = new FieldDocument();
-        fd.addTV("base",
-                 "gbcgbcgbgc",
-                 "[(0-1)s:g|i:g|_0#0-1|-:t$<i>10]" +
-                 "[(1-2)s:b|i:b|_1#1-2]" +
-                 "[(2-3)s:c|i:c|_2#2-3]" +
-                 "[(3-4)s:g|i:g|_3#3-4]" +
-                 "[(4-5)s:b|i:b|_4#4-5]" +
-                 "[(5-6)s:c|i:c|_5#5-6]" +
-                 "[(6-7)s:g|i:g|_6#6-7]" +
-                 "[(7-8)s:b|i:b|_7#7-8]" +
-                 "[(8-9)s:g|i:g|_8#8-9]" +
-                 "[(9-10)s:c|i:c|_9#9-10]");
+        fd.addTV("base", "gbcgbcgbgc", "[(0-1)s:g|i:g|_0#0-1|-:t$<i>10]"
+                + "[(1-2)s:b|i:b|_1#1-2]" + "[(2-3)s:c|i:c|_2#2-3]"
+                + "[(3-4)s:g|i:g|_3#3-4]" + "[(4-5)s:b|i:b|_4#4-5]"
+                + "[(5-6)s:c|i:c|_5#5-6]" + "[(6-7)s:g|i:g|_6#6-7]"
+                + "[(7-8)s:b|i:b|_7#7-8]" + "[(8-9)s:g|i:g|_8#8-9]"
+                + "[(9-10)s:c|i:c|_9#9-10]");
         ki.addDoc(fd);
         fd = new FieldDocument();
         // contains(<p>, focus(3: contains({2:<s>}, {3:a})))
-        fd.addTV("base",
-                 "acabcabac",
-                 "[(0-1)s:a|i:a|_0#0-1|-:t$<i>10|<>:p#0-9$<i>8]" +
-                 "[(1-2)s:b|i:b|_1#1-2|<>:s#1-5$<i>5]" +
-                 "[(2-3)s:a|i:a|_2#2-3|<>:s#2-7$<i>7]" +
-                 "[(3-4)s:b|i:b|_3#3-4]" +
-                 "[(4-5)s:c|i:c|_4#4-5]" +
-                 "[(5-6)s:a|i:a|_5#5-6]" +
-                 "[(6-7)s:b|i:b|_6#6-7]" +
-                 "[(7-8)s:a|i:a|_7#7-8]" +
-                 "[(8-9)s:c|i:c|_8#8-9]");
+        fd.addTV("base", "acabcabac",
+                "[(0-1)s:a|i:a|_0#0-1|-:t$<i>10|<>:p#0-9$<i>8]"
+                        + "[(1-2)s:b|i:b|_1#1-2|<>:s#1-5$<i>5]"
+                        + "[(2-3)s:a|i:a|_2#2-3|<>:s#2-7$<i>7]"
+                        + "[(3-4)s:b|i:b|_3#3-4]" + "[(4-5)s:c|i:c|_4#4-5]"
+                        + "[(5-6)s:a|i:a|_5#5-6]" + "[(6-7)s:b|i:b|_6#6-7]"
+                        + "[(7-8)s:a|i:a|_7#7-8]" + "[(8-9)s:c|i:c|_8#8-9]");
         ki.addDoc(fd);
         ki.commit();
 
@@ -475,15 +451,11 @@
         assertEquals("Documents", 4, kc.numberOf("documents"));
 
         // within(<p>, focus(3:within({2:<s>}, {3:a})))
-        sq = new SpanWithinQuery(
-                 new SpanElementQuery("base", "p"),
-                 new SpanFocusQuery(
-                     new SpanWithinQuery(
-                         new SpanClassQuery(new SpanElementQuery("base", "s"), (byte) 2),
-                         new SpanClassQuery(new SpanTermQuery(new Term("base", "s:a")), (byte) 3)
-                     ), (byte) 3
-                 )
-             );
+        sq = new SpanWithinQuery(new SpanElementQuery("base", "p"),
+                new SpanFocusQuery(new SpanWithinQuery(new SpanClassQuery(
+                        new SpanElementQuery("base", "s"), (byte) 2),
+                        new SpanClassQuery(new SpanTermQuery(new Term("base",
+                                "s:a")), (byte) 3)), (byte) 3));
 
         fail("Skipping may go horribly wrong! (Known issue)");
 
@@ -491,11 +463,16 @@
         //        System.err.println(kr.getOverview());
 
 
-        assertEquals(kr.getSerialQuery(), "spanContain(<base:p />, focus(3: spanContain({2: <base:s />}, {3: base:s:a})))");
+        assertEquals(
+                kr.getSerialQuery(),
+                "spanContain(<base:p />, focus(3: spanContain({2: <base:s />}, {3: base:s:a})))");
         assertEquals(12, kr.getTotalResults());
-        assertEquals("[a{2:bc{3:a}b}cabac]", kr.getMatch(0).getSnippetBrackets());
-        assertEquals("[ab{2:c{3:a}bcab}ac]", kr.getMatch(1).getSnippetBrackets());
-        assertEquals("[ab{2:cabc{3:a}}bac]", kr.getMatch(2).getSnippetBrackets());
+        assertEquals("[a{2:bc{3:a}b}cabac]", kr.getMatch(0)
+                .getSnippetBrackets());
+        assertEquals("[ab{2:c{3:a}bcab}ac]", kr.getMatch(1)
+                .getSnippetBrackets());
+        assertEquals("[ab{2:cabc{3:a}}bac]", kr.getMatch(2)
+                .getSnippetBrackets());
     };
 
 };
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestMultipleDistanceIndex.java b/src/test/java/de/ids_mannheim/korap/index/TestMultipleDistanceIndex.java
index 666216b..ee97464 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestMultipleDistanceIndex.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestMultipleDistanceIndex.java
@@ -23,361 +23,373 @@
 
 @RunWith(JUnit4.class)
 public class TestMultipleDistanceIndex {
-	
-	private KrillIndex ki;
-	private Result kr;
 
-	public SpanQuery createQuery(String x, String y, List<DistanceConstraint> 
-			constraints, boolean isOrdered){
-		
-		SpanQuery sx = new SpanTermQuery(new Term("base",x)); 
-		SpanQuery sy = new SpanTermQuery(new Term("base",y));
-		
-		return new SpanMultipleDistanceQuery(sx, sy, constraints, isOrdered, true);
-	}
-	
-	public DistanceConstraint createConstraint(String unit, int min, int max, 
-			boolean isOrdered, boolean exclusion){
-		
-		if (unit.equals("w")){
-			return new DistanceConstraint(min, max,isOrdered,exclusion);
-		}		
-		return new DistanceConstraint(new SpanElementQuery("base", unit), 
-				min, max, isOrdered, exclusion);	
-	}
-	
-    private FieldDocument createFieldDoc0() {
-    	FieldDocument fd = new FieldDocument();
+    private KrillIndex ki;
+    private Result kr;
+
+
+    public SpanQuery createQuery (String x, String y,
+            List<DistanceConstraint> constraints, boolean isOrdered) {
+
+        SpanQuery sx = new SpanTermQuery(new Term("base", x));
+        SpanQuery sy = new SpanTermQuery(new Term("base", y));
+
+        return new SpanMultipleDistanceQuery(sx, sy, constraints, isOrdered,
+                true);
+    }
+
+
+    public DistanceConstraint createConstraint (String unit, int min, int max,
+            boolean isOrdered, boolean exclusion) {
+
+        if (unit.equals("w")) {
+            return new DistanceConstraint(min, max, isOrdered, exclusion);
+        }
+        return new DistanceConstraint(new SpanElementQuery("base", unit), min,
+                max, isOrdered, exclusion);
+    }
+
+
+    private FieldDocument createFieldDoc0 () {
+        FieldDocument fd = new FieldDocument();
         fd.addString("ID", "doc-0");
-        fd.addTV("base",
-            "text",             
-            "[(0-1)s:b|_1#0-1|<>:s#0-2$<i>2|<>:p#0-4$<i>4]" +
-            "[(1-2)s:b|s:c|_2#1-2]" +             
-            "[(2-3)s:c|_3#2-3|<>:s#2-3$<i>4]" +
-            "[(3-4)s:b|_4#3-4]" + 
-            "[(4-5)s:c|_5#4-5|<>:s#4-6$<i>6|<>:p#4-6$<i>6]" +             
-            "[(5-6)s:e|_6#5-6]");
+        fd.addTV("base", "text",
+                "[(0-1)s:b|_1#0-1|<>:s#0-2$<i>2|<>:p#0-4$<i>4]"
+                        + "[(1-2)s:b|s:c|_2#1-2]"
+                        + "[(2-3)s:c|_3#2-3|<>:s#2-3$<i>4]"
+                        + "[(3-4)s:b|_4#3-4]"
+                        + "[(4-5)s:c|_5#4-5|<>:s#4-6$<i>6|<>:p#4-6$<i>6]"
+                        + "[(5-6)s:e|_6#5-6]");
         return fd;
-	}
-    
-    private FieldDocument createFieldDoc1() {
-    	FieldDocument fd = new FieldDocument();
+    }
+
+
+    private FieldDocument createFieldDoc1 () {
+        FieldDocument fd = new FieldDocument();
         fd.addString("ID", "doc-1");
-        fd.addTV("base",
-            "text",             
-            "[(0-1)s:c|_1#0-1|<>:s#0-2$<i>2|<>:p#0-4$<i>4]" +
-            "[(1-2)s:c|s:e|_2#1-2]" +             
-            "[(2-3)s:e|_3#2-3|<>:s#2-3$<i>4]" +
-            "[(3-4)s:c|_4#3-4]" + 
-            "[(4-5)s:e|_5#4-5|<>:s#4-6$<i>6|<>:p#4-6$<i>6]" +             
-            "[(5-6)s:c|_6#5-6]");
+        fd.addTV("base", "text",
+                "[(0-1)s:c|_1#0-1|<>:s#0-2$<i>2|<>:p#0-4$<i>4]"
+                        + "[(1-2)s:c|s:e|_2#1-2]"
+                        + "[(2-3)s:e|_3#2-3|<>:s#2-3$<i>4]"
+                        + "[(3-4)s:c|_4#3-4]"
+                        + "[(4-5)s:e|_5#4-5|<>:s#4-6$<i>6|<>:p#4-6$<i>6]"
+                        + "[(5-6)s:c|_6#5-6]");
         return fd;
-    }   
-    
-    private FieldDocument createFieldDoc2() {
-    	FieldDocument fd = new FieldDocument();
+    }
+
+
+    private FieldDocument createFieldDoc2 () {
+        FieldDocument fd = new FieldDocument();
         fd.addString("ID", "doc-2");
-        fd.addTV("base",
-            "text",             
-            "[(0-1)s:b|_1#0-1|<>:s#0-2$<i>2|<>:p#0-4$<i>4]" +
-            "[(1-2)s:b|s:e|_2#1-2]" +             
-            "[(2-3)s:e|_3#2-3|<>:s#2-3$<i>4]" +
-            "[(3-4)s:b|s:c|_4#3-4]" + 
-            "[(4-5)s:e|_5#4-5|<>:s#4-6$<i>6|<>:p#4-6$<i>6]" +             
-            "[(5-6)s:d|_6#5-6]" +
-        	"[(6-7)s:b|_7#6-7|<>:s#6-7$<i>7|<>:p#6-7$<i>7]" );
+        fd.addTV("base", "text",
+                "[(0-1)s:b|_1#0-1|<>:s#0-2$<i>2|<>:p#0-4$<i>4]"
+                        + "[(1-2)s:b|s:e|_2#1-2]"
+                        + "[(2-3)s:e|_3#2-3|<>:s#2-3$<i>4]"
+                        + "[(3-4)s:b|s:c|_4#3-4]"
+                        + "[(4-5)s:e|_5#4-5|<>:s#4-6$<i>6|<>:p#4-6$<i>6]"
+                        + "[(5-6)s:d|_6#5-6]"
+                        + "[(6-7)s:b|_7#6-7|<>:s#6-7$<i>7|<>:p#6-7$<i>7]");
         return fd;
-	}
-    
-    private FieldDocument createFieldDoc3() {
-    	FieldDocument fd = new FieldDocument();
+    }
+
+
+    private FieldDocument createFieldDoc3 () {
+        FieldDocument fd = new FieldDocument();
         fd.addString("ID", "doc-0");
-        fd.addTV("base",
-            "text",             
-            "[(0-1)s:b|_1#0-1|<>:s#0-2$<i>2|<>:p#0-4$<i>4]" +
-            "[(1-2)s:b|s:c|_2#1-2]" +             
-            "[(2-3)s:c|_3#2-3|<>:s#2-3$<i>5]" +
-            "[(3-4)s:b|_4#3-4]" +
-            "[(4-5)s:b|_5#4-5]" + 
-            "[(5-6)s:b|_6#5-6]" + // gap
-            "[(6-7)s:c|_7#6-7|<>:s#6-7$<i>7|<>:p#6-7$<i>7]" );
+        fd.addTV("base", "text",
+                "[(0-1)s:b|_1#0-1|<>:s#0-2$<i>2|<>:p#0-4$<i>4]"
+                        + "[(1-2)s:b|s:c|_2#1-2]"
+                        + "[(2-3)s:c|_3#2-3|<>:s#2-3$<i>5]"
+                        + "[(3-4)s:b|_4#3-4]" + "[(4-5)s:b|_5#4-5]"
+                        + "[(5-6)s:b|_6#5-6]" + // gap
+                        "[(6-7)s:c|_7#6-7|<>:s#6-7$<i>7|<>:p#6-7$<i>7]");
         return fd;
-	}
-    
-    /** Unordered, same sentence
+    }
+
+
+    /**
+     * Unordered, same sentence
      * */
     @Test
-	public void testCase1() throws IOException {
-    	ki = new KrillIndex();
-        ki.addDoc(createFieldDoc0()); 
+    public void testCase1 () throws IOException {
+        ki = new KrillIndex();
+        ki.addDoc(createFieldDoc0());
         ki.commit();
-        
-    	List<DistanceConstraint> constraints = new ArrayList<DistanceConstraint>();
- 	    constraints.add(createConstraint("w", 0, 2, false, false));	    
- 	    constraints.add(createConstraint("s", 0, 0, false, false));
- 	    
- 	    SpanQuery mdq;	   
-		mdq = createQuery("s:b", "s:c", constraints,false);
-		kr = ki.search(mdq, (short) 10);
-		// System.out.println(mdq);
-		
-		assertEquals((long) 3, kr.getTotalResults());
-	    assertEquals(0, kr.getMatch(0).getStartPos());
-	    assertEquals(2, kr.getMatch(0).getEndPos());
-	    assertEquals(1, kr.getMatch(1).getStartPos());
-	    assertEquals(2, kr.getMatch(1).getEndPos());
-	    assertEquals(2, kr.getMatch(2).getStartPos());
-	    assertEquals(4, kr.getMatch(2).getEndPos());
+
+        List<DistanceConstraint> constraints = new ArrayList<DistanceConstraint>();
+        constraints.add(createConstraint("w", 0, 2, false, false));
+        constraints.add(createConstraint("s", 0, 0, false, false));
+
+        SpanQuery mdq;
+        mdq = createQuery("s:b", "s:c", constraints, false);
+        kr = ki.search(mdq, (short) 10);
+        // System.out.println(mdq);
+
+        assertEquals((long) 3, kr.getTotalResults());
+        assertEquals(0, kr.getMatch(0).getStartPos());
+        assertEquals(2, kr.getMatch(0).getEndPos());
+        assertEquals(1, kr.getMatch(1).getStartPos());
+        assertEquals(2, kr.getMatch(1).getEndPos());
+        assertEquals(2, kr.getMatch(2).getStartPos());
+        assertEquals(4, kr.getMatch(2).getEndPos());
     }
-	
-    /** Ordered
-     * 	Unordered
-     * 	Two constraints
-     * 	Three constraints 	
+
+
+    /**
+     * Ordered
+     * Unordered
+     * Two constraints
+     * Three constraints
      * */
-	@Test
-	public void testCase2() throws IOException {
-		ki = new KrillIndex();
-        ki.addDoc(createFieldDoc0()); 
+    @Test
+    public void testCase2 () throws IOException {
+        ki = new KrillIndex();
+        ki.addDoc(createFieldDoc0());
         ki.commit();
-		
+
         // Ordered - two constraints
-	    List<DistanceConstraint> constraints = new ArrayList<DistanceConstraint>();
-	    constraints.add(createConstraint("w", 0, 2, true, false));	    
-	    constraints.add(createConstraint("s", 1, 1, true, false));
-	    
-	    SpanQuery mdq;	    
-		mdq = createQuery("s:b", "s:c", constraints,true);
-		kr = ki.search(mdq, (short) 10);		
-	    assertEquals((long) 3, kr.getTotalResults());
-	    assertEquals(0, kr.getMatch(0).getStartPos());
-	    assertEquals(3, kr.getMatch(0).getEndPos());
-	    assertEquals(1, kr.getMatch(1).getStartPos());
-	    assertEquals(3, kr.getMatch(1).getEndPos());
-	    assertEquals(3, kr.getMatch(2).getStartPos());
-	    assertEquals(5, kr.getMatch(2).getEndPos());	   
-	   				
-		// Three constraints
-		constraints.add(createConstraint("p", 0, 0, true, false));		
-		mdq = createQuery("s:b", "s:c", constraints,true);
-		kr = ki.search(mdq, (short) 10);
-		assertEquals((long) 2, kr.getTotalResults());
-		
-		
-		// Unordered - two constraints
-		constraints.clear();
-	    constraints.add(createConstraint("w", 0, 2, false, false));	    
-	    constraints.add(createConstraint("s", 1, 1, false, false));
-	    	   
-	    mdq = createQuery("s:c", "s:b", constraints,false);
-	    kr = ki.search(mdq, (short) 10);
-	    assertEquals((long) 4, kr.getTotalResults());
-	    assertEquals(1, kr.getMatch(2).getStartPos());
-	    assertEquals(4, kr.getMatch(2).getEndPos());
-		
-	    // Three constraints
-		constraints.add(createConstraint("p", 0, 0, false, false));
-		mdq = createQuery("s:b", "s:c", constraints,false);
-		kr = ki.search(mdq, (short) 10);		
-		assertEquals((long) 3, kr.getTotalResults());	
+        List<DistanceConstraint> constraints = new ArrayList<DistanceConstraint>();
+        constraints.add(createConstraint("w", 0, 2, true, false));
+        constraints.add(createConstraint("s", 1, 1, true, false));
 
-	}
-    
-    /** Multiple documents
-     * 	Ensure same doc (inner term span)
-     * */
-    @Test
-   	public void testCase3() throws IOException {
-    	ki = new KrillIndex();
-    	ki.addDoc(createFieldDoc0()); 
-    	ki.addDoc(createFieldDoc1());
-    	ki.addDoc(createFieldDoc2());
-    	ki.commit();
-           
-       	List<DistanceConstraint> constraints = new ArrayList<DistanceConstraint>();
-	    constraints.add(createConstraint("w", 1, 2, false, false));	    
-	    constraints.add(createConstraint("s", 1, 2, false, false));
-    	    
-	    SpanQuery mdq;	   
-		mdq = createQuery("s:b", "s:e", constraints,false);
-		kr = ki.search(mdq, (short) 10);		
+        SpanQuery mdq;
+        mdq = createQuery("s:b", "s:c", constraints, true);
+        kr = ki.search(mdq, (short) 10);
+        assertEquals((long) 3, kr.getTotalResults());
+        assertEquals(0, kr.getMatch(0).getStartPos());
+        assertEquals(3, kr.getMatch(0).getEndPos());
+        assertEquals(1, kr.getMatch(1).getStartPos());
+        assertEquals(3, kr.getMatch(1).getEndPos());
+        assertEquals(3, kr.getMatch(2).getStartPos());
+        assertEquals(5, kr.getMatch(2).getEndPos());
 
-		assertEquals((long) 5, kr.getTotalResults());		
-	    assertEquals(3, kr.getMatch(0).getStartPos());
-	    assertEquals(6, kr.getMatch(0).getEndPos());
-	    assertEquals(2, kr.getMatch(1).getLocalDocID());
-	    assertEquals(1, kr.getMatch(2).getStartPos());
-	    assertEquals(4, kr.getMatch(2).getEndPos());
-	    assertEquals(3, kr.getMatch(3).getStartPos());
-	    assertEquals(5, kr.getMatch(3).getEndPos());	
-	    assertEquals(4, kr.getMatch(4).getStartPos());
-	    assertEquals(7, kr.getMatch(4).getEndPos());
-	    
-//	    System.out.print(kr.getTotalResults()+"\n");
-//		for (int i=0; i< kr.getTotalResults(); i++){
-//			System.out.println(
-//				kr.match(i).getLocalDocID()+" "+
-//				kr.match(i).startPos + " " +
-//				kr.match(i).endPos
-//		    );
-//		}
-		
-    }
-    
-	/**	Skip to
-     * */
-    @Test
-   	public void testCase4() throws IOException {
-    	ki = new KrillIndex();
-    	ki.addDoc(createFieldDoc0());
-    	ki.addDoc(createFieldDoc3());
-    	ki.addDoc(createFieldDoc1());
-    	ki.addDoc(createFieldDoc2());
-    	ki.commit();
-    	
-    	List<DistanceConstraint> constraints = new ArrayList<DistanceConstraint>();
-	    constraints.add(createConstraint("w", 1, 2, false, false));	    
-	    constraints.add(createConstraint("s", 1, 2, false, false));
-		
-	    SpanQuery mdq;	   
-		mdq = createQuery("s:b", "s:c", constraints,false);
-		
-		SpanQuery sq = new SpanNextQuery(mdq, 
-				new SpanTermQuery(new Term("base","s:e")));
-		kr = ki.search(sq, (short) 10);
-		
-		assertEquals((long) 2, kr.getTotalResults());
-	    assertEquals(3, kr.getMatch(0).getStartPos());
-	    assertEquals(6, kr.getMatch(0).getEndPos());
-	    assertEquals(3, kr.getMatch(1).getLocalDocID());
-	    assertEquals(1, kr.getMatch(1).getStartPos());
-	    assertEquals(5, kr.getMatch(1).getEndPos());
+        // Three constraints
+        constraints.add(createConstraint("p", 0, 0, true, false));
+        mdq = createQuery("s:b", "s:c", constraints, true);
+        kr = ki.search(mdq, (short) 10);
+        assertEquals((long) 2, kr.getTotalResults());
+
+
+        // Unordered - two constraints
+        constraints.clear();
+        constraints.add(createConstraint("w", 0, 2, false, false));
+        constraints.add(createConstraint("s", 1, 1, false, false));
+
+        mdq = createQuery("s:c", "s:b", constraints, false);
+        kr = ki.search(mdq, (short) 10);
+        assertEquals((long) 4, kr.getTotalResults());
+        assertEquals(1, kr.getMatch(2).getStartPos());
+        assertEquals(4, kr.getMatch(2).getEndPos());
+
+        // Three constraints
+        constraints.add(createConstraint("p", 0, 0, false, false));
+        mdq = createQuery("s:b", "s:c", constraints, false);
+        kr = ki.search(mdq, (short) 10);
+        assertEquals((long) 3, kr.getTotalResults());
 
     }
-    
-    /** Same tokens: ordered and unordered yield the same results
-	 * */
-    @Test
-   	public void testCase5() throws IOException {
-    	ki = new KrillIndex();
-    	ki.addDoc(createFieldDoc0());    	
-    	ki.addDoc(createFieldDoc1());    	
-    	ki.commit();
-    	
-    	List<DistanceConstraint> constraints = new ArrayList<DistanceConstraint>();
-	    constraints.add(createConstraint("w", 1, 2, false, false));	    
-	    constraints.add(createConstraint("s", 1, 2, false, false));
-		
-	    SpanQuery mdq;	   
-		mdq = createQuery("s:c", "s:c", constraints,false);
-		kr = ki.search(mdq, (short) 10);
-		
-		assertEquals((long) 4, kr.getTotalResults());
-	    assertEquals(1, kr.getMatch(0).getStartPos());
-	    assertEquals(3, kr.getMatch(0).getEndPos());
-	    assertEquals(2, kr.getMatch(1).getStartPos());
-	    assertEquals(5, kr.getMatch(1).getEndPos());
-	    assertEquals(1, kr.getMatch(2).getLocalDocID());
-	    assertEquals(1, kr.getMatch(2).getStartPos());
-	    assertEquals(4, kr.getMatch(2).getEndPos());
-	    assertEquals(3, kr.getMatch(3).getStartPos());
-	    assertEquals(6, kr.getMatch(3).getEndPos());	
 
-    }
-	
-    /** Exclusion
-     * 	Gaps
+
+    /**
+     * Multiple documents
+     * Ensure same doc (inner term span)
      * */
     @Test
-   	public void testCase6() throws IOException {
-    	ki = new KrillIndex();
-    	ki.addDoc(createFieldDoc3());    	
-    	ki.commit();
-    	
-    	// First constraint - token exclusion
-    	SpanQuery sx = new SpanTermQuery(new Term("base","s:b")); 
-		SpanQuery sy = new SpanTermQuery(new Term("base","s:c"));
-		
-		DistanceConstraint dc1 = createConstraint("w", 0, 1, false, true);
-		SpanDistanceQuery sq = new SpanDistanceQuery(sx, sy, dc1, true);
-		
-		kr = ki.search(sq, (short) 10);
-		assertEquals((long) 1, kr.getTotalResults());
-		// 4-5
-		
-    	// Second constraint - element distance
-		DistanceConstraint  dc2 = createConstraint("s", 1, 1, false, false);
-		sq = new SpanDistanceQuery(sx, sy, dc2, true);		
-		kr = ki.search(sq, (short) 10);		
-		// 0-3, 1-3, 1-4, 1-5, 3-7, 4-7
-		assertEquals((long) 6, kr.getTotalResults());
-		
-		
-    	List<DistanceConstraint> constraints = new ArrayList<DistanceConstraint>();
-	    constraints.add(dc1);
-	    constraints.add(dc2);
-	    	    
-	    SpanQuery mdq;	   
-		mdq = createQuery("s:b", "s:c", constraints,false);
-		kr = ki.search(mdq, (short) 10);
-		
-		assertEquals((long) 2, kr.getTotalResults());
-	    assertEquals(1, kr.getMatch(0).getStartPos());
-	    assertEquals(5, kr.getMatch(0).getEndPos());
-	    assertEquals(4, kr.getMatch(1).getStartPos());
-	    assertEquals(7, kr.getMatch(1).getEndPos());
+    public void testCase3 () throws IOException {
+        ki = new KrillIndex();
+        ki.addDoc(createFieldDoc0());
+        ki.addDoc(createFieldDoc1());
+        ki.addDoc(createFieldDoc2());
+        ki.commit();
+
+        List<DistanceConstraint> constraints = new ArrayList<DistanceConstraint>();
+        constraints.add(createConstraint("w", 1, 2, false, false));
+        constraints.add(createConstraint("s", 1, 2, false, false));
+
+        SpanQuery mdq;
+        mdq = createQuery("s:b", "s:e", constraints, false);
+        kr = ki.search(mdq, (short) 10);
+
+        assertEquals((long) 5, kr.getTotalResults());
+        assertEquals(3, kr.getMatch(0).getStartPos());
+        assertEquals(6, kr.getMatch(0).getEndPos());
+        assertEquals(2, kr.getMatch(1).getLocalDocID());
+        assertEquals(1, kr.getMatch(2).getStartPos());
+        assertEquals(4, kr.getMatch(2).getEndPos());
+        assertEquals(3, kr.getMatch(3).getStartPos());
+        assertEquals(5, kr.getMatch(3).getEndPos());
+        assertEquals(4, kr.getMatch(4).getStartPos());
+        assertEquals(7, kr.getMatch(4).getEndPos());
+
+        //	    System.out.print(kr.getTotalResults()+"\n");
+        //		for (int i=0; i< kr.getTotalResults(); i++){
+        //			System.out.println(
+        //				kr.match(i).getLocalDocID()+" "+
+        //				kr.match(i).startPos + " " +
+        //				kr.match(i).endPos
+        //		    );
+        //		}
+
     }
-    
-    
-    /** Exclusion, multiple documents
+
+
+    /**
+     * Skip to
      * */
     @Test
-    public void testCase7() throws IOException {
-    	ki = new KrillIndex();   	
-    	ki.addDoc(createFieldDoc2());    	
-    	ki.commit();
-    	
-    	SpanQuery sx = new SpanTermQuery(new Term("base","s:b")); 
-		SpanQuery sy = new SpanTermQuery(new Term("base","s:c"));
-    	// Second constraint
-		SpanDistanceQuery sq = new SpanDistanceQuery(sx,sy, 
-				createConstraint("s", 0, 0, false, true),
-				true);
-		kr = ki.search(sq, (short) 10);
-		assertEquals((long) 3, kr.getTotalResults());
-    	// 0-1, 1-2, 6-7
-				
-	    // Exclusion within the same sentence
-    	List<DistanceConstraint> constraints = new ArrayList<DistanceConstraint>();
-	    constraints.add(createConstraint("w", 0, 2,false,true));
-	    constraints.add(createConstraint("s", 0, 0,false,true));
+    public void testCase4 () throws IOException {
+        ki = new KrillIndex();
+        ki.addDoc(createFieldDoc0());
+        ki.addDoc(createFieldDoc3());
+        ki.addDoc(createFieldDoc1());
+        ki.addDoc(createFieldDoc2());
+        ki.commit();
 
-	    SpanQuery mdq;	   
-		mdq = createQuery("s:b", "s:c", constraints,false);
-		kr = ki.search(mdq, (short) 10);		
-		assertEquals((long) 2, kr.getTotalResults());
-	    assertEquals(0, kr.getMatch(0).getStartPos());
-	    assertEquals(1, kr.getMatch(0).getEndPos());
-	    assertEquals(6, kr.getMatch(1).getStartPos());
-	    assertEquals(7, kr.getMatch(1).getEndPos());
-		
-	    
-	    // Third constraint
-	    sq = new SpanDistanceQuery(sx, sy, 
-				createConstraint("p", 0, 0, false, true), 
-				true);
-	    kr = ki.search(sq, (short) 10);
-		assertEquals((long) 1, kr.getTotalResults());
-		// 6-7
-	    
-		constraints.add(createConstraint("p", 0, 0, false, true));
-	    mdq = createQuery("s:b", "s:c", constraints,false);
-		kr = ki.search(mdq, (short) 10);			
-		
-	    assertEquals((long) 1, kr.getTotalResults());
-	    assertEquals(6, kr.getMatch(0).getStartPos());
-	    assertEquals(7, kr.getMatch(0).getEndPos());
+        List<DistanceConstraint> constraints = new ArrayList<DistanceConstraint>();
+        constraints.add(createConstraint("w", 1, 2, false, false));
+        constraints.add(createConstraint("s", 1, 2, false, false));
 
-	}
+        SpanQuery mdq;
+        mdq = createQuery("s:b", "s:c", constraints, false);
+
+        SpanQuery sq = new SpanNextQuery(mdq, new SpanTermQuery(new Term(
+                "base", "s:e")));
+        kr = ki.search(sq, (short) 10);
+
+        assertEquals((long) 2, kr.getTotalResults());
+        assertEquals(3, kr.getMatch(0).getStartPos());
+        assertEquals(6, kr.getMatch(0).getEndPos());
+        assertEquals(3, kr.getMatch(1).getLocalDocID());
+        assertEquals(1, kr.getMatch(1).getStartPos());
+        assertEquals(5, kr.getMatch(1).getEndPos());
+
+    }
+
+
+    /**
+     * Same tokens: ordered and unordered yield the same results
+     * */
+    @Test
+    public void testCase5 () throws IOException {
+        ki = new KrillIndex();
+        ki.addDoc(createFieldDoc0());
+        ki.addDoc(createFieldDoc1());
+        ki.commit();
+
+        List<DistanceConstraint> constraints = new ArrayList<DistanceConstraint>();
+        constraints.add(createConstraint("w", 1, 2, false, false));
+        constraints.add(createConstraint("s", 1, 2, false, false));
+
+        SpanQuery mdq;
+        mdq = createQuery("s:c", "s:c", constraints, false);
+        kr = ki.search(mdq, (short) 10);
+
+        assertEquals((long) 4, kr.getTotalResults());
+        assertEquals(1, kr.getMatch(0).getStartPos());
+        assertEquals(3, kr.getMatch(0).getEndPos());
+        assertEquals(2, kr.getMatch(1).getStartPos());
+        assertEquals(5, kr.getMatch(1).getEndPos());
+        assertEquals(1, kr.getMatch(2).getLocalDocID());
+        assertEquals(1, kr.getMatch(2).getStartPos());
+        assertEquals(4, kr.getMatch(2).getEndPos());
+        assertEquals(3, kr.getMatch(3).getStartPos());
+        assertEquals(6, kr.getMatch(3).getEndPos());
+
+    }
+
+
+    /**
+     * Exclusion
+     * Gaps
+     * */
+    @Test
+    public void testCase6 () throws IOException {
+        ki = new KrillIndex();
+        ki.addDoc(createFieldDoc3());
+        ki.commit();
+
+        // First constraint - token exclusion
+        SpanQuery sx = new SpanTermQuery(new Term("base", "s:b"));
+        SpanQuery sy = new SpanTermQuery(new Term("base", "s:c"));
+
+        DistanceConstraint dc1 = createConstraint("w", 0, 1, false, true);
+        SpanDistanceQuery sq = new SpanDistanceQuery(sx, sy, dc1, true);
+
+        kr = ki.search(sq, (short) 10);
+        assertEquals((long) 1, kr.getTotalResults());
+        // 4-5
+
+        // Second constraint - element distance
+        DistanceConstraint dc2 = createConstraint("s", 1, 1, false, false);
+        sq = new SpanDistanceQuery(sx, sy, dc2, true);
+        kr = ki.search(sq, (short) 10);
+        // 0-3, 1-3, 1-4, 1-5, 3-7, 4-7
+        assertEquals((long) 6, kr.getTotalResults());
+
+
+        List<DistanceConstraint> constraints = new ArrayList<DistanceConstraint>();
+        constraints.add(dc1);
+        constraints.add(dc2);
+
+        SpanQuery mdq;
+        mdq = createQuery("s:b", "s:c", constraints, false);
+        kr = ki.search(mdq, (short) 10);
+
+        assertEquals((long) 2, kr.getTotalResults());
+        assertEquals(1, kr.getMatch(0).getStartPos());
+        assertEquals(5, kr.getMatch(0).getEndPos());
+        assertEquals(4, kr.getMatch(1).getStartPos());
+        assertEquals(7, kr.getMatch(1).getEndPos());
+    }
+
+
+    /**
+     * Exclusion, multiple documents
+     * */
+    @Test
+    public void testCase7 () throws IOException {
+        ki = new KrillIndex();
+        ki.addDoc(createFieldDoc2());
+        ki.commit();
+
+        SpanQuery sx = new SpanTermQuery(new Term("base", "s:b"));
+        SpanQuery sy = new SpanTermQuery(new Term("base", "s:c"));
+        // Second constraint
+        SpanDistanceQuery sq = new SpanDistanceQuery(sx, sy, createConstraint(
+                "s", 0, 0, false, true), true);
+        kr = ki.search(sq, (short) 10);
+        assertEquals((long) 3, kr.getTotalResults());
+        // 0-1, 1-2, 6-7
+
+        // Exclusion within the same sentence
+        List<DistanceConstraint> constraints = new ArrayList<DistanceConstraint>();
+        constraints.add(createConstraint("w", 0, 2, false, true));
+        constraints.add(createConstraint("s", 0, 0, false, true));
+
+        SpanQuery mdq;
+        mdq = createQuery("s:b", "s:c", constraints, false);
+        kr = ki.search(mdq, (short) 10);
+        assertEquals((long) 2, kr.getTotalResults());
+        assertEquals(0, kr.getMatch(0).getStartPos());
+        assertEquals(1, kr.getMatch(0).getEndPos());
+        assertEquals(6, kr.getMatch(1).getStartPos());
+        assertEquals(7, kr.getMatch(1).getEndPos());
+
+
+        // Third constraint
+        sq = new SpanDistanceQuery(sx, sy, createConstraint("p", 0, 0, false,
+                true), true);
+        kr = ki.search(sq, (short) 10);
+        assertEquals((long) 1, kr.getTotalResults());
+        // 6-7
+
+        constraints.add(createConstraint("p", 0, 0, false, true));
+        mdq = createQuery("s:b", "s:c", constraints, false);
+        kr = ki.search(mdq, (short) 10);
+
+        assertEquals((long) 1, kr.getTotalResults());
+        assertEquals(6, kr.getMatch(0).getStartPos());
+        assertEquals(7, kr.getMatch(0).getEndPos());
+
+    }
 }
-
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestNextIndex.java b/src/test/java/de/ids_mannheim/korap/index/TestNextIndex.java
index 0d14991..ffcaed4 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestNextIndex.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestNextIndex.java
@@ -45,146 +45,119 @@
 
         // abcabcabac
         FieldDocument fd = new FieldDocument();
-        fd.addTV("base",
-                 "abcabcabac",
-                 "[(0-1)s:a|i:a|_0#0-1|-:t$<i>10]" +
-                 "[(1-2)s:b|i:b|_1#1-2]" +
-                 "[(2-3)s:c|i:c|_2#2-3]" +
-                 "[(3-4)s:a|i:a|_3#3-4]" +
-                 "[(4-5)s:b|i:b|_4#4-5]" +
-                 "[(5-6)s:c|i:c|_5#5-6]" +
-                 "[(6-7)s:a|i:a|_6#6-7]" +
-                 "[(7-8)s:b|i:b|_7#7-8]" +
-                 "[(8-9)s:a|i:a|_8#8-9]" +
-                 "[(9-10)s:c|i:c|_9#9-10]");
+        fd.addTV("base", "abcabcabac", "[(0-1)s:a|i:a|_0#0-1|-:t$<i>10]"
+                + "[(1-2)s:b|i:b|_1#1-2]" + "[(2-3)s:c|i:c|_2#2-3]"
+                + "[(3-4)s:a|i:a|_3#3-4]" + "[(4-5)s:b|i:b|_4#4-5]"
+                + "[(5-6)s:c|i:c|_5#5-6]" + "[(6-7)s:a|i:a|_6#6-7]"
+                + "[(7-8)s:b|i:b|_7#7-8]" + "[(8-9)s:a|i:a|_8#8-9]"
+                + "[(9-10)s:c|i:c|_9#9-10]");
         ki.addDoc(fd);
         ki.commit();
 
         SpanQuery sq;
         Result kr;
 
-        sq = new SpanNextQuery(
-            new SpanTermQuery(new Term("base", "s:a")),
-            new SpanTermQuery(new Term("base", "s:b"))
-        );
+        sq = new SpanNextQuery(new SpanTermQuery(new Term("base", "s:a")),
+                new SpanTermQuery(new Term("base", "s:b")));
 
-	kr = ki.search(sq, (short) 10);
-	
-	assertEquals("totalResults", kr.getTotalResults(), 3);
-	assertEquals("StartPos (0)", 0, kr.getMatch(0).startPos);
-	assertEquals("EndPos (0)", 2, kr.getMatch(0).endPos);
-	assertEquals("StartPos (1)", 3, kr.getMatch(1).startPos);
-	assertEquals("EndPos (1)", 5, kr.getMatch(1).endPos);
-	assertEquals("StartPos (2)", 6, kr.getMatch(2).startPos);
-	assertEquals("EndPos (2)", 8, kr.getMatch(2).endPos);
-	
-	sq = new SpanNextQuery(
-            new SpanTermQuery(new Term("base", "s:b")),
-            new SpanTermQuery(new Term("base", "s:c"))
-        );
+        kr = ki.search(sq, (short) 10);
 
-	kr = ki.search(sq, (short) 10);
-	
-	assertEquals("totalResults", kr.getTotalResults(), 2);
-	assertEquals("StartPos (0)", 1, kr.getMatch(0).startPos);
-	assertEquals("EndPos (0)", 3, kr.getMatch(0).endPos);
-	assertEquals("StartPos (1)", 4, kr.getMatch(1).startPos);
-	assertEquals("EndPos (1)", 6, kr.getMatch(1).endPos);
+        assertEquals("totalResults", kr.getTotalResults(), 3);
+        assertEquals("StartPos (0)", 0, kr.getMatch(0).startPos);
+        assertEquals("EndPos (0)", 2, kr.getMatch(0).endPos);
+        assertEquals("StartPos (1)", 3, kr.getMatch(1).startPos);
+        assertEquals("EndPos (1)", 5, kr.getMatch(1).endPos);
+        assertEquals("StartPos (2)", 6, kr.getMatch(2).startPos);
+        assertEquals("EndPos (2)", 8, kr.getMatch(2).endPos);
 
-	assertEquals(1, ki.numberOf("base", "documents"));
-	assertEquals(10, ki.numberOf("base", "t"));
+        sq = new SpanNextQuery(new SpanTermQuery(new Term("base", "s:b")),
+                new SpanTermQuery(new Term("base", "s:c")));
+
+        kr = ki.search(sq, (short) 10);
+
+        assertEquals("totalResults", kr.getTotalResults(), 2);
+        assertEquals("StartPos (0)", 1, kr.getMatch(0).startPos);
+        assertEquals("EndPos (0)", 3, kr.getMatch(0).endPos);
+        assertEquals("StartPos (1)", 4, kr.getMatch(1).startPos);
+        assertEquals("EndPos (1)", 6, kr.getMatch(1).endPos);
+
+        assertEquals(1, ki.numberOf("base", "documents"));
+        assertEquals(10, ki.numberOf("base", "t"));
 
 
-	sq = new SpanNextQuery(
-            new SpanTermQuery(new Term("base", "s:a")),
-	    new SpanNextQuery(
-	      new SpanTermQuery(new Term("base", "s:b")),
-	      new SpanTermQuery(new Term("base", "s:c"))
-	    )
-        );
+        sq = new SpanNextQuery(new SpanTermQuery(new Term("base", "s:a")),
+                new SpanNextQuery(new SpanTermQuery(new Term("base", "s:b")),
+                        new SpanTermQuery(new Term("base", "s:c"))));
 
-	kr = ki.search(sq, (short) 2);
-	
-	assertEquals("totalResults", kr.getTotalResults(), 2);
-	assertEquals("StartPos (0)", 0, kr.getMatch(0).startPos);
-	assertEquals("EndPos (0)", 3, kr.getMatch(0).endPos);
-	assertEquals("StartPos (1)", 3, kr.getMatch(1).startPos);
-	assertEquals("EndPos (1)", 6, kr.getMatch(1).endPos);
+        kr = ki.search(sq, (short) 2);
 
-	assertEquals(1, ki.numberOf("base", "documents"));
-	assertEquals(10, ki.numberOf("base", "t"));
+        assertEquals("totalResults", kr.getTotalResults(), 2);
+        assertEquals("StartPos (0)", 0, kr.getMatch(0).startPos);
+        assertEquals("EndPos (0)", 3, kr.getMatch(0).endPos);
+        assertEquals("StartPos (1)", 3, kr.getMatch(1).startPos);
+        assertEquals("EndPos (1)", 6, kr.getMatch(1).endPos);
+
+        assertEquals(1, ki.numberOf("base", "documents"));
+        assertEquals(10, ki.numberOf("base", "t"));
 
     };
 
+
     @Test
     public void indexExample2 () throws IOException {
-	KrillIndex ki = new KrillIndex();
+        KrillIndex ki = new KrillIndex();
 
-	// abcabcabac
-	FieldDocument fd = new FieldDocument();
-	fd.addTV("base",
-		 "abcabcabac",
-		 "[(0-1)s:a|i:a|_0#0-1|-:t$<i>10]" +
-		 "[(1-2)s:b|i:b|_1#1-2]" +
-		 "[(2-3)s:c|i:c|_2#2-3]" +
-		 "[(3-4)s:a|i:a|_3#3-4|<>:x#3-4$<i>4|<>:x#3-7$<i>7]" +
-		 "[(4-5)s:b|i:b|_4#4-5]" +
-		 "[(5-6)s:c|i:c|_5#5-6]" +
-		 "[(6-7)s:a|i:a|_6#6-7]" +
-		 "[(7-8)s:b|i:b|_7#7-8]" +
-		 "[(8-9)s:a|i:a|_8#8-9]" +
-		 "[(9-10)s:c|i:c|_9#9-10]");
-	ki.addDoc(fd);
+        // abcabcabac
+        FieldDocument fd = new FieldDocument();
+        fd.addTV("base", "abcabcabac", "[(0-1)s:a|i:a|_0#0-1|-:t$<i>10]"
+                + "[(1-2)s:b|i:b|_1#1-2]" + "[(2-3)s:c|i:c|_2#2-3]"
+                + "[(3-4)s:a|i:a|_3#3-4|<>:x#3-4$<i>4|<>:x#3-7$<i>7]"
+                + "[(4-5)s:b|i:b|_4#4-5]" + "[(5-6)s:c|i:c|_5#5-6]"
+                + "[(6-7)s:a|i:a|_6#6-7]" + "[(7-8)s:b|i:b|_7#7-8]"
+                + "[(8-9)s:a|i:a|_8#8-9]" + "[(9-10)s:c|i:c|_9#9-10]");
+        ki.addDoc(fd);
 
-	ki.commit();
+        ki.commit();
 
-	SpanQuery sq;
-	Result kr;
+        SpanQuery sq;
+        Result kr;
 
-	sq = new SpanNextQuery(
-	       new SpanTermQuery(new Term("base", "s:c")),
- 	       new SpanElementQuery("base", "x")
-	);
-	
-	kr = ki.search(sq, (short) 10);
-	assertEquals("ab[cabca]bac", kr.getMatch(1).getSnippetBrackets());
+        sq = new SpanNextQuery(new SpanTermQuery(new Term("base", "s:c")),
+                new SpanElementQuery("base", "x"));
+
+        kr = ki.search(sq, (short) 10);
+        assertEquals("ab[cabca]bac", kr.getMatch(1).getSnippetBrackets());
 
     };
 
+
     @Test
     public void indexExample3 () throws IOException {
-	KrillIndex ki = new KrillIndex();
+        KrillIndex ki = new KrillIndex();
 
-	// abcabcabac
-	FieldDocument fd = new FieldDocument();
-	fd.addTV("base",
-		 "abcabcabac",
-		 "[(0-1)s:a|i:a|_0#0-1|-:t$<i>10]" +
-		 "[(1-2)s:b|i:b|_1#1-2]" +
-		 "[(2-3)s:c|i:c|_2#2-3]" +
-		 "[(3-4)s:a|i:a|_3#3-4|<>:x#3-7$<i>7]" +
-		 "[(4-5)s:b|i:b|_4#4-5]" +
-		 "[(5-6)s:c|i:c|_5#5-6]" +
-		 "[(6-7)s:a|i:a|_6#6-7]" +
-		 "[(7-8)s:b|i:b|_7#7-8]" +
-		 "[(8-9)s:a|i:a|_8#8-9]" +
-		 "[(9-10)s:c|i:c|_9#9-10]");
-	ki.addDoc(fd);
+        // abcabcabac
+        FieldDocument fd = new FieldDocument();
+        fd.addTV("base", "abcabcabac", "[(0-1)s:a|i:a|_0#0-1|-:t$<i>10]"
+                + "[(1-2)s:b|i:b|_1#1-2]" + "[(2-3)s:c|i:c|_2#2-3]"
+                + "[(3-4)s:a|i:a|_3#3-4|<>:x#3-7$<i>7]"
+                + "[(4-5)s:b|i:b|_4#4-5]" + "[(5-6)s:c|i:c|_5#5-6]"
+                + "[(6-7)s:a|i:a|_6#6-7]" + "[(7-8)s:b|i:b|_7#7-8]"
+                + "[(8-9)s:a|i:a|_8#8-9]" + "[(9-10)s:c|i:c|_9#9-10]");
+        ki.addDoc(fd);
 
-	ki.commit();
+        ki.commit();
 
-	SpanQuery sq;
-	Result kr;
+        SpanQuery sq;
+        Result kr;
 
-	sq = new SpanNextQuery(
-	       new SpanElementQuery("base", "x"),
-	       new SpanTermQuery(new Term("base", "s:b"))
-	);
-	
-	kr = ki.search(sq, (short) 10);
-	assertEquals("abc[abcab]ac", kr.getMatch(0).getSnippetBrackets());
+        sq = new SpanNextQuery(new SpanElementQuery("base", "x"),
+                new SpanTermQuery(new Term("base", "s:b")));
+
+        kr = ki.search(sq, (short) 10);
+        assertEquals("abc[abcab]ac", kr.getMatch(0).getSnippetBrackets());
     };
 
+
     @Test
     public void indexExample4 () throws IOException {
         KrillIndex ki = new KrillIndex();
@@ -193,250 +166,217 @@
         // abc<x>abc<x>a</x>b</x>ac
         FieldDocument fd = new FieldDocument();
         fd.addString("ID", "doc-1");
-        fd.addTV("base",
-                 "abcabcabac",
-                 "[(0-1)s:a|i:a|_0#0-1|-:t$<i>10]" +
-                 "[(1-2)s:b|i:b|_1#1-2]" +
-                 "[(2-3)s:c|i:c|_2#2-3]" +
-                 "[(3-4)s:a|i:a|_3#3-4|<>:x#3-7$<i>7]" +
-                 "[(4-5)s:b|i:b|_4#4-5]" +
-                 "[(5-6)s:c|i:c|_5#5-6]" +
-                 "[(6-7)s:a|i:a|_6#6-7]<>:x#6-8$<i>8]" +
-                 "[(7-8)s:b|i:b|_7#7-8]" +
-                 "[(8-9)s:a|i:a|_8#8-9]" +
-                 "[(9-10)s:c|i:c|_9#9-10]");
+        fd.addTV("base", "abcabcabac", "[(0-1)s:a|i:a|_0#0-1|-:t$<i>10]"
+                + "[(1-2)s:b|i:b|_1#1-2]" + "[(2-3)s:c|i:c|_2#2-3]"
+                + "[(3-4)s:a|i:a|_3#3-4|<>:x#3-7$<i>7]"
+                + "[(4-5)s:b|i:b|_4#4-5]" + "[(5-6)s:c|i:c|_5#5-6]"
+                + "[(6-7)s:a|i:a|_6#6-7]<>:x#6-8$<i>8]"
+                + "[(7-8)s:b|i:b|_7#7-8]" + "[(8-9)s:a|i:a|_8#8-9]"
+                + "[(9-10)s:c|i:c|_9#9-10]");
         ki.addDoc(fd);
-        
+
         // xbz<x>xbzx</x>bxz
         fd = new FieldDocument();
         fd.addString("ID", "doc-2");
-        fd.addTV("base",
-                 "xbzxbzxbxz",
-                 "[(0-1)s:x|i:x|_0#0-1|-:t$<i>10]" +
-                 "[(1-2)s:b|i:b|_1#1-2]" +
-                 "[(2-3)s:z|i:z|_2#2-3]" +
-                 "[(3-4)s:x|i:x|_3#3-4|<>:x#3-7$<i>7]" +
-                 "[(4-5)s:b|i:b|_4#4-5]" +
-                 "[(5-6)s:z|i:z|_5#5-6]" +
-                 "[(6-7)s:x|i:x|_6#6-7]" +
-                 "[(7-8)s:b|i:b|_7#7-8]" +
-                 "[(8-9)s:x|i:x|_8#8-9]" +
-                 "[(9-10)s:z|i:z|_9#9-10]");
+        fd.addTV("base", "xbzxbzxbxz", "[(0-1)s:x|i:x|_0#0-1|-:t$<i>10]"
+                + "[(1-2)s:b|i:b|_1#1-2]" + "[(2-3)s:z|i:z|_2#2-3]"
+                + "[(3-4)s:x|i:x|_3#3-4|<>:x#3-7$<i>7]"
+                + "[(4-5)s:b|i:b|_4#4-5]" + "[(5-6)s:z|i:z|_5#5-6]"
+                + "[(6-7)s:x|i:x|_6#6-7]" + "[(7-8)s:b|i:b|_7#7-8]"
+                + "[(8-9)s:x|i:x|_8#8-9]" + "[(9-10)s:z|i:z|_9#9-10]");
         ki.addDoc(fd);
         ki.commit();
 
         SpanQuery sq;
         Result kr;
 
-        sq = new SpanNextQuery(
-            new SpanElementQuery("base", "x"),
-            new SpanTermQuery(new Term("base", "s:b"))
-        );
-	
+        sq = new SpanNextQuery(new SpanElementQuery("base", "x"),
+                new SpanTermQuery(new Term("base", "s:b")));
+
         kr = ki.search(sq, (short) 10);
         assertEquals("TotalResults", kr.getTotalResults(), 2);
         assertEquals("abc[abcab]ac", kr.getMatch(0).getSnippetBrackets());
         assertEquals("xbz[xbzxb]xz", kr.getMatch(1).getSnippetBrackets());
 
-        sq = new SpanNextQuery(
-            new SpanTermQuery(new Term("base", "s:c")),
-            new SpanElementQuery("base", "x")
-        );
-        
+        sq = new SpanNextQuery(new SpanTermQuery(new Term("base", "s:c")),
+                new SpanElementQuery("base", "x"));
+
         kr = ki.search(sq, (short) 10);
         assertEquals(kr.getTotalResults(), 1);
         assertEquals("ab[cabca]bac", kr.getMatch(0).getSnippetBrackets());
-        
-        sq = new SpanNextQuery(
-            new SpanTermQuery(new Term("base", "s:z")),
-            new SpanElementQuery("base", "x")
-        );
-        
+
+        sq = new SpanNextQuery(new SpanTermQuery(new Term("base", "s:z")),
+                new SpanElementQuery("base", "x"));
+
         kr = ki.search(sq, (short) 10);
         assertEquals(1, kr.getTotalResults());
         assertEquals("xb[zxbzx]bxz", kr.getMatch(0).getSnippetBrackets());
     };
-    
+
+
     /**
      * Multiple atomic indices
      * Skip to a greater doc#
      * */
-	@Test
-	public void indexExample5 () throws IOException {
-		KrillIndex ki = new KrillIndex();
-		ki.addDoc(createFieldDoc1());		
-		ki.addDoc(createFieldDoc2());
-		ki.commit();
-		ki.addDoc(createFieldDoc3());
-		ki.commit();
-		
-		SpanQuery sq = new SpanNextQuery(
-					new SpanTermQuery(new Term("base","s:d")),
-					new SpanTermQuery(new Term("base","s:b"))
-				);
-		Result kr = ki.search(sq, (short) 10);			
-				
-		assertEquals("totalResults", kr.getTotalResults(), 2);
-		// Match #0
-		assertEquals("doc-number", 0, kr.getMatch(0).getLocalDocID());
-		assertEquals("StartPos", 4, kr.getMatch(0).startPos);
-		assertEquals("EndPos", 6, kr.getMatch(0).endPos);
-		// Match #1
-		assertEquals("doc-number", 0, kr.getMatch(1).getLocalDocID());
-		assertEquals("StartPos", 1, kr.getMatch(1).startPos);
-		assertEquals("EndPos", 3, kr.getMatch(1).endPos);
-		
-		sq = new SpanNextQuery(
-				new SpanTermQuery(new Term("base","s:b")),
-				new SpanTermQuery(new Term("base","s:d"))
-			);
-		kr = ki.search(sq, (short) 10);
-		
-		assertEquals("totalResults", kr.getTotalResults(), 1);
-		assertEquals("doc-number", 0, kr.getMatch(0).getLocalDocID());
-		assertEquals("StartPos", 2, kr.getMatch(0).startPos);
-		assertEquals("EndPos", 4, kr.getMatch(0).endPos);
-	}
-	
-	/** Skip to NextSpan */
-	@Test
-	public void indexExample6() throws IOException{
-		KrillIndex ki = new KrillIndex();
-		ki.addDoc(createFieldDoc1());		
-		ki.addDoc(createFieldDoc2());		
-		ki.addDoc(createFieldDoc3());
-		ki.commit();
-		
-		SpanQuery sq = new SpanNextQuery(
-				new SpanTermQuery(new Term("base","s:c")), 
-				new SpanNextQuery(
-						new SpanTermQuery(new Term("base","s:d")),
-						new SpanTermQuery(new Term("base","s:b"))
-				)
-			);
-		
-		Result kr = ki.search(sq, (short) 10);			
-		assertEquals("totalResults", kr.getTotalResults(), 1);
-		assertEquals("doc-number", 2, kr.getMatch(0).getLocalDocID());
-		assertEquals("StartPos", 0, kr.getMatch(0).startPos);
-		assertEquals("EndPos", 3, kr.getMatch(0).endPos);	
-		
-	}
+    @Test
+    public void indexExample5 () throws IOException {
+        KrillIndex ki = new KrillIndex();
+        ki.addDoc(createFieldDoc1());
+        ki.addDoc(createFieldDoc2());
+        ki.commit();
+        ki.addDoc(createFieldDoc3());
+        ki.commit();
 
-	@Test
-	public void indexExample7Distances () throws Exception{
-		KrillIndex ki = new KrillIndex();
-		ki.addDoc(createFieldDoc1());		
-		ki.addDoc(createFieldDoc2());		
-		ki.addDoc(createFieldDoc3());
-		ki.addDoc(createFieldDoc4());
-		ki.commit();
-		
-		SpanSequenceQueryWrapper sq = new SpanSequenceQueryWrapper("base");
-		sq.append("i:b").append("i:d").withConstraint(1,3);
-		
-		Result kr = ki.search(sq.toQuery(), (short) 10);			
+        SpanQuery sq = new SpanNextQuery(new SpanTermQuery(new Term("base",
+                "s:d")), new SpanTermQuery(new Term("base", "s:b")));
+        Result kr = ki.search(sq, (short) 10);
 
-		assertEquals("totalResults", kr.getTotalResults(), 3);
-		assertEquals("doc-number", "match-doc-0-p2-5", kr.getMatch(0).getID());
-		assertEquals("doc-number", "match-doc-2-p2-4", kr.getMatch(1).getID());
-		assertEquals("doc-number", "match-doc-3-p2-5", kr.getMatch(2).getID());
-	};
+        assertEquals("totalResults", kr.getTotalResults(), 2);
+        // Match #0
+        assertEquals("doc-number", 0, kr.getMatch(0).getLocalDocID());
+        assertEquals("StartPos", 4, kr.getMatch(0).startPos);
+        assertEquals("EndPos", 6, kr.getMatch(0).endPos);
+        // Match #1
+        assertEquals("doc-number", 0, kr.getMatch(1).getLocalDocID());
+        assertEquals("StartPos", 1, kr.getMatch(1).startPos);
+        assertEquals("EndPos", 3, kr.getMatch(1).endPos);
 
-	@Test
-	public void indexExample8Distances () throws Exception{
-		KrillIndex ki = new KrillIndex();
-		ki.addDoc(createFieldDoc1());		
-		ki.addDoc(createFieldDoc2());		
-		ki.addDoc(createFieldDoc3());
-		ki.addDoc(createFieldDoc4());
-		ki.commit();
-		
-		SpanSequenceQueryWrapper sq = new SpanSequenceQueryWrapper("base");
-		sq.append("i:a").append("i:b").withConstraint(0, 3, "e");
-		
-		Result kr = ki.search(sq.toQuery(), (short) 10);			
+        sq = new SpanNextQuery(new SpanTermQuery(new Term("base", "s:b")),
+                new SpanTermQuery(new Term("base", "s:d")));
+        kr = ki.search(sq, (short) 10);
 
-		assertEquals("totalResults", kr.getTotalResults(), 3);
-		assertEquals("doc-number", "match-doc-0-p3-6", kr.getMatch(0).getID());
-		assertEquals("doc-number", "match-doc-1-p1-3", kr.getMatch(1).getID());
-		assertEquals("doc-number", "match-doc-3-p3-6", kr.getMatch(2).getID());
-	};
+        assertEquals("totalResults", kr.getTotalResults(), 1);
+        assertEquals("doc-number", 0, kr.getMatch(0).getLocalDocID());
+        assertEquals("StartPos", 2, kr.getMatch(0).startPos);
+        assertEquals("EndPos", 4, kr.getMatch(0).endPos);
+    }
 
-	@Test
-	public void indexExample9() throws IOException{
-		KrillIndex ki = new KrillIndex();
-		ki.addDoc(createFieldDoc1());	
-		ki.commit();
-		
-		SpanQuery sq = new SpanNextQuery(
-				new SpanOrQuery(
-					new SpanTermQuery(new Term("base","s:a")),
-					new SpanTermQuery(new Term("base","s:b"))),
-				new SpanTermQuery(new Term("base","s:c"))
-			);
-		
-		Result kr = ki.search(sq, (short) 10);
-		
-		assertEquals(0, kr.getMatch(0).getStartPos());
-		assertEquals(2, kr.getMatch(0).getEndPos());
-		assertEquals(3, kr.getMatch(1).getStartPos());
-		assertEquals(5, kr.getMatch(1).getEndPos());
-	}
-	
-	
-	private FieldDocument createFieldDoc1(){
-		FieldDocument fd = new FieldDocument();
-		fd.addString("ID", "doc-0");
-		fd.addTV("base",
-			 "bcbadb",			 
-			 "[(0-1)s:b|i:b|_0#0-1]" +
-			 "[(1-2)s:c|i:c|s:b|_1#1-2]" +			 
-			 "[(2-3)s:b|i:b|_2#2-3]" +
-			 "[(3-4)s:a|i:a|_3#3-4|<>:e#3-6$<i>6]" + 
-			 "[(4-5)s:d|i:d|s:c|_4#4-5]" +			 
-			 "[(5-6)s:b|i:b|_5#5-6]");
-		return fd;
-	}
-	
-	private FieldDocument createFieldDoc2(){
-		FieldDocument fd = new FieldDocument();
-		fd.addString("ID", "doc-1");
-		fd.addTV("base",
-			 "caba",			 
-			 "[(0-1)s:c|i:c|_0#0-1]" +
-			 "[(1-2)s:a|i:a|s:c|_1#1-2|<>:e#1-3$<i>3]" +			 
-			 "[(2-3)s:b|i:b|s:a|_2#2-3]" +
-			 "[(3-4)s:a|i:a|_3#3-4]");
-		return fd;
-	} 
-	
-	private FieldDocument createFieldDoc3(){
-		FieldDocument fd = new FieldDocument();
-		fd.addString("ID", "doc-2");
-		fd.addTV("base",
-			 "cdbd",			 
-			 "[(0-1)s:c|i:c|_0#0-1]" +
-			 "[(1-2)s:d|i:d|_1#1-2]"+
-			 "[(2-3)s:b|i:b|s:a|_2#2-3]"+
-			 "[(3-4)s:d|i:d|_3#3-4]");
-			 	
-		return fd;
-	}
 
-	private FieldDocument createFieldDoc4(){
-		FieldDocument fd = new FieldDocument();
-		fd.addString("ID", "doc-3");
-		fd.addTV("base",
-			 "bcbadb",			 
-			 "[(0-1)s:b|i:b|_0#0-1]" +
-			 "[(1-2)s:c|i:c|s:b|<>:s#1-3$<i>3|_1#1-2]" +			 
-			 "[(2-3)s:b|i:b|_2#2-3]" +
-			 "[(3-4)s:a|i:a|_3#3-4|<>:e#3-6$<i>6]" + 
-			 "[(4-5)s:d|i:d|s:c|_4#4-5]" +			 
-			 "[(5-6)s:b|i:b|_5#5-6]");
-		return fd;
-	}
-	
-	
+    /** Skip to NextSpan */
+    @Test
+    public void indexExample6 () throws IOException {
+        KrillIndex ki = new KrillIndex();
+        ki.addDoc(createFieldDoc1());
+        ki.addDoc(createFieldDoc2());
+        ki.addDoc(createFieldDoc3());
+        ki.commit();
+
+        SpanQuery sq = new SpanNextQuery(new SpanTermQuery(new Term("base",
+                "s:c")), new SpanNextQuery(new SpanTermQuery(new Term("base",
+                "s:d")), new SpanTermQuery(new Term("base", "s:b"))));
+
+        Result kr = ki.search(sq, (short) 10);
+        assertEquals("totalResults", kr.getTotalResults(), 1);
+        assertEquals("doc-number", 2, kr.getMatch(0).getLocalDocID());
+        assertEquals("StartPos", 0, kr.getMatch(0).startPos);
+        assertEquals("EndPos", 3, kr.getMatch(0).endPos);
+
+    }
+
+
+    @Test
+    public void indexExample7Distances () throws Exception {
+        KrillIndex ki = new KrillIndex();
+        ki.addDoc(createFieldDoc1());
+        ki.addDoc(createFieldDoc2());
+        ki.addDoc(createFieldDoc3());
+        ki.addDoc(createFieldDoc4());
+        ki.commit();
+
+        SpanSequenceQueryWrapper sq = new SpanSequenceQueryWrapper("base");
+        sq.append("i:b").append("i:d").withConstraint(1, 3);
+
+        Result kr = ki.search(sq.toQuery(), (short) 10);
+
+        assertEquals("totalResults", kr.getTotalResults(), 3);
+        assertEquals("doc-number", "match-doc-0-p2-5", kr.getMatch(0).getID());
+        assertEquals("doc-number", "match-doc-2-p2-4", kr.getMatch(1).getID());
+        assertEquals("doc-number", "match-doc-3-p2-5", kr.getMatch(2).getID());
+    };
+
+
+    @Test
+    public void indexExample8Distances () throws Exception {
+        KrillIndex ki = new KrillIndex();
+        ki.addDoc(createFieldDoc1());
+        ki.addDoc(createFieldDoc2());
+        ki.addDoc(createFieldDoc3());
+        ki.addDoc(createFieldDoc4());
+        ki.commit();
+
+        SpanSequenceQueryWrapper sq = new SpanSequenceQueryWrapper("base");
+        sq.append("i:a").append("i:b").withConstraint(0, 3, "e");
+
+        Result kr = ki.search(sq.toQuery(), (short) 10);
+
+        assertEquals("totalResults", kr.getTotalResults(), 3);
+        assertEquals("doc-number", "match-doc-0-p3-6", kr.getMatch(0).getID());
+        assertEquals("doc-number", "match-doc-1-p1-3", kr.getMatch(1).getID());
+        assertEquals("doc-number", "match-doc-3-p3-6", kr.getMatch(2).getID());
+    };
+
+
+    @Test
+    public void indexExample9 () throws IOException {
+        KrillIndex ki = new KrillIndex();
+        ki.addDoc(createFieldDoc1());
+        ki.commit();
+
+        SpanQuery sq = new SpanNextQuery(new SpanOrQuery(new SpanTermQuery(
+                new Term("base", "s:a")), new SpanTermQuery(new Term("base",
+                "s:b"))), new SpanTermQuery(new Term("base", "s:c")));
+
+        Result kr = ki.search(sq, (short) 10);
+
+        assertEquals(0, kr.getMatch(0).getStartPos());
+        assertEquals(2, kr.getMatch(0).getEndPos());
+        assertEquals(3, kr.getMatch(1).getStartPos());
+        assertEquals(5, kr.getMatch(1).getEndPos());
+    }
+
+
+    private FieldDocument createFieldDoc1 () {
+        FieldDocument fd = new FieldDocument();
+        fd.addString("ID", "doc-0");
+        fd.addTV("base", "bcbadb", "[(0-1)s:b|i:b|_0#0-1]"
+                + "[(1-2)s:c|i:c|s:b|_1#1-2]" + "[(2-3)s:b|i:b|_2#2-3]"
+                + "[(3-4)s:a|i:a|_3#3-4|<>:e#3-6$<i>6]"
+                + "[(4-5)s:d|i:d|s:c|_4#4-5]" + "[(5-6)s:b|i:b|_5#5-6]");
+        return fd;
+    }
+
+
+    private FieldDocument createFieldDoc2 () {
+        FieldDocument fd = new FieldDocument();
+        fd.addString("ID", "doc-1");
+        fd.addTV("base", "caba", "[(0-1)s:c|i:c|_0#0-1]"
+                + "[(1-2)s:a|i:a|s:c|_1#1-2|<>:e#1-3$<i>3]"
+                + "[(2-3)s:b|i:b|s:a|_2#2-3]" + "[(3-4)s:a|i:a|_3#3-4]");
+        return fd;
+    }
+
+
+    private FieldDocument createFieldDoc3 () {
+        FieldDocument fd = new FieldDocument();
+        fd.addString("ID", "doc-2");
+        fd.addTV("base", "cdbd", "[(0-1)s:c|i:c|_0#0-1]"
+                + "[(1-2)s:d|i:d|_1#1-2]" + "[(2-3)s:b|i:b|s:a|_2#2-3]"
+                + "[(3-4)s:d|i:d|_3#3-4]");
+
+        return fd;
+    }
+
+
+    private FieldDocument createFieldDoc4 () {
+        FieldDocument fd = new FieldDocument();
+        fd.addString("ID", "doc-3");
+        fd.addTV("base", "bcbadb", "[(0-1)s:b|i:b|_0#0-1]"
+                + "[(1-2)s:c|i:c|s:b|<>:s#1-3$<i>3|_1#1-2]"
+                + "[(2-3)s:b|i:b|_2#2-3]"
+                + "[(3-4)s:a|i:a|_3#3-4|<>:e#3-6$<i>6]"
+                + "[(4-5)s:d|i:d|s:c|_4#4-5]" + "[(5-6)s:b|i:b|_5#5-6]");
+        return fd;
+    }
+
+
 };
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestPosToOffset.java b/src/test/java/de/ids_mannheim/korap/index/TestPosToOffset.java
index d9baef3..c31fa1f 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestPosToOffset.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestPosToOffset.java
@@ -40,46 +40,40 @@
         KrillIndex ki = new KrillIndex();
 
         FieldDocument fd = new FieldDocument();
-        fd.addTV("base",
-                 "a b c",
-                 "[(0-1)s:a|i:a|_0#0-1|-:t$<i>3]" +
-                 "[(2-3)s:b|i:b|_1#2-3]" +
-                 "[(4-5)s:c|i:c|_2#4-5]");
+        fd.addTV("base", "a b c", "[(0-1)s:a|i:a|_0#0-1|-:t$<i>3]"
+                + "[(2-3)s:b|i:b|_1#2-3]" + "[(4-5)s:c|i:c|_2#4-5]");
         ki.addDoc(fd);
 
         fd = new FieldDocument();
-        fd.addTV("base",
-                 "x  y  z",
-                 "[(0-1)s:x|i:x|_0#0-2|-:t$<i>3]" +
-                 "[(3-4)s:y|i:y|_1#3-4]" +
-                 "[(6-7)s:z|i:z|_2#6-7]");  // 3
+        fd.addTV("base", "x  y  z", "[(0-1)s:x|i:x|_0#0-2|-:t$<i>3]"
+                + "[(3-4)s:y|i:y|_1#3-4]" + "[(6-7)s:z|i:z|_2#6-7]");  // 3
         ki.addDoc(fd);
-                ki.commit();
-        
+        ki.commit();
+
         String field = "base";
         for (AtomicReaderContext atomic : ki.reader().leaves()) {
             PositionsToOffset pto = new PositionsToOffset(atomic, field);
 
-            pto.add(0,1);
-            pto.add(0,2);
-            pto.add(1,2);
-            pto.add(1,1);
-            pto.add(1,20);
+            pto.add(0, 1);
+            pto.add(0, 2);
+            pto.add(1, 2);
+            pto.add(1, 1);
+            pto.add(1, 20);
 
-            assertEquals("Start 0,1", pto.start(0,1), 2);
-            assertEquals("End 0,1", pto.end(0,1), 3);
+            assertEquals("Start 0,1", pto.start(0, 1), 2);
+            assertEquals("End 0,1", pto.end(0, 1), 3);
 
-            assertEquals("Start 0,2", pto.start(0,2), 4);
-            assertEquals("End 0,2", pto.end(0,2), 5);
+            assertEquals("Start 0,2", pto.start(0, 2), 4);
+            assertEquals("End 0,2", pto.end(0, 2), 5);
 
-            assertEquals("Start 1,2", pto.start(1,2), 6);
-            assertEquals("End 1,2", pto.end(1,2), 7);
+            assertEquals("Start 1,2", pto.start(1, 2), 6);
+            assertEquals("End 1,2", pto.end(1, 2), 7);
 
-            assertEquals("Start 1,1", pto.start(1,1), 3);
-            assertEquals("End 1,1", pto.end(1,1), 4);
-            
-            assertEquals("Start 1,20", pto.start(1,20), 0);
-            assertEquals("End 1,20", pto.end(1,20), -1);
+            assertEquals("Start 1,1", pto.start(1, 1), 3);
+            assertEquals("End 1,1", pto.end(1, 1), 4);
+
+            assertEquals("Start 1,20", pto.start(1, 20), 0);
+            assertEquals("End 1,20", pto.end(1, 20), -1);
         };
     };
 };
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestRealIndex.java b/src/test/java/de/ids_mannheim/korap/index/TestRealIndex.java
index aa1478e..837da00 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestRealIndex.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestRealIndex.java
@@ -22,22 +22,25 @@
     KrillIndex ki;
     Result kr;
     Krill ks;
-	
-    public TestRealIndex() throws IOException {
+
+
+    public TestRealIndex () throws IOException {
         InputStream is = getClass().getResourceAsStream("/server.properties");
         Properties prop = new Properties();
         prop.load(is);
-	
+
         String indexPath = prop.getProperty("lucene.indexDir");
         System.err.println(indexPath);
         MMapDirectory md = new MMapDirectory(new File(indexPath));
         ki = new KrillIndex(md);
     };
 
+
     @Test
-    public void testCase1() throws IOException, QueryException {
+    public void testCase1 () throws IOException, QueryException {
         QueryBuilder kq = new QueryBuilder("tokens");
-        ks = new Krill(kq.within(kq.tag("base/s:s"), kq.seq(kq.re("s:.*")).append(kq._(kq.re("s:.*")))).toQuery());
+        ks = new Krill(kq.within(kq.tag("base/s:s"),
+                kq.seq(kq.re("s:.*")).append(kq._(kq.re("s:.*")))).toQuery());
         ks.getMeta().setTimeOut(10000);
         kr = ks.apply(ki);
         System.err.println(kr.toJsonString());
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestRegexWildcardIndex.java b/src/test/java/de/ids_mannheim/korap/index/TestRegexWildcardIndex.java
index c8bd475..fdb1c81 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestRegexWildcardIndex.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestRegexWildcardIndex.java
@@ -29,258 +29,304 @@
 
     @Test
     public void indexRegex () throws Exception {
-	KrillIndex ki = new KrillIndex();
+        KrillIndex ki = new KrillIndex();
 
-	// abcabcabac
-	FieldDocument fd = new FieldDocument();
-	fd.addTV("base",
-		 "affe afffe baum baumgarten steingarten franz hans haus efeu effe",
-		 "[(0-4)s:affe|_0#0-4|-:t$<i>10]" +
-		 "[(5-10)s:afffe|_1#5-10]" +
-		 "[(11-15)s:baum|_2#11-15]" +
-		 "[(16-26)s:baumgarten|_3#16-26]" +
-		 "[(27-38)s:steingarten|_4#27-38]" +
-		 "[(39-44)s:franz|_5#39-44]" +
-		 "[(45-49)s:hans|_6#45-49]" +
-		 "[(50-54)s:haus|_7#50-54]" +
-		 "[(55-59)s:efeu|_8#55-59]" +
-		 "[(60-64)s:effe|_9#60-64]");
-	ki.addDoc(fd);
+        // abcabcabac
+        FieldDocument fd = new FieldDocument();
+        fd.addTV(
+                "base",
+                "affe afffe baum baumgarten steingarten franz hans haus efeu effe",
+                "[(0-4)s:affe|_0#0-4|-:t$<i>10]" + "[(5-10)s:afffe|_1#5-10]"
+                        + "[(11-15)s:baum|_2#11-15]"
+                        + "[(16-26)s:baumgarten|_3#16-26]"
+                        + "[(27-38)s:steingarten|_4#27-38]"
+                        + "[(39-44)s:franz|_5#39-44]"
+                        + "[(45-49)s:hans|_6#45-49]"
+                        + "[(50-54)s:haus|_7#50-54]"
+                        + "[(55-59)s:efeu|_8#55-59]"
+                        + "[(60-64)s:effe|_9#60-64]");
+        ki.addDoc(fd);
 
-	ki.commit();
+        ki.commit();
 
-	QueryBuilder kq = new QueryBuilder("base");
-	SpanQuery sq = kq.re("s:af*e").toQuery();
-	assertEquals("SpanMultiTermQueryWrapper(base:/s:af*e/)", sq.toString());
-			
-	Krill ks = new Krill(sq);
-	ks.getMeta().getContext().left.setToken(true).setLength(1);
-	ks.getMeta().getContext().right.setToken(true).setLength(1);
+        QueryBuilder kq = new QueryBuilder("base");
+        SpanQuery sq = kq.re("s:af*e").toQuery();
+        assertEquals("SpanMultiTermQueryWrapper(base:/s:af*e/)", sq.toString());
 
-	Result kr = ki.search(ks);
-	assertEquals((long) 2, kr.getTotalResults());
-	assertEquals("[affe] afffe ...", kr.getMatch(0).getSnippetBrackets());
-	assertEquals("affe [afffe] baum ...", kr.getMatch(1).getSnippetBrackets());
+        Krill ks = new Krill(sq);
+        ks.getMeta().getContext().left.setToken(true).setLength(1);
+        ks.getMeta().getContext().right.setToken(true).setLength(1);
 
-	kr = ki.search(ks.setSpanQuery(new QueryBuilder("base").re("s:baum.*").toQuery()));
-	assertEquals((long) 2, kr.getTotalResults());
-	assertEquals("... afffe [baum] baumgarten ...", kr.getMatch(0).getSnippetBrackets());
-	assertEquals("... baum [baumgarten] steingarten ...", kr.getMatch(1).getSnippetBrackets());
+        Result kr = ki.search(ks);
+        assertEquals((long) 2, kr.getTotalResults());
+        assertEquals("[affe] afffe ...", kr.getMatch(0).getSnippetBrackets());
+        assertEquals("affe [afffe] baum ...", kr.getMatch(1)
+                .getSnippetBrackets());
 
-	kr = ki.search(ks.setSpanQuery(new QueryBuilder("base").re("s:.....?garten").toQuery()));
-	assertEquals((long) 2, kr.getTotalResults());
-	assertEquals("... baum [baumgarten] steingarten ...", kr.getMatch(0).getSnippetBrackets());
-	assertEquals("... baumgarten [steingarten] franz ...", kr.getMatch(1).getSnippetBrackets());
+        kr = ki.search(ks.setSpanQuery(new QueryBuilder("base").re("s:baum.*")
+                .toQuery()));
+        assertEquals((long) 2, kr.getTotalResults());
+        assertEquals("... afffe [baum] baumgarten ...", kr.getMatch(0)
+                .getSnippetBrackets());
+        assertEquals("... baum [baumgarten] steingarten ...", kr.getMatch(1)
+                .getSnippetBrackets());
 
-	kr = ki.search(ks.setSpanQuery(new QueryBuilder("base").re("s:ha.s").toQuery()));
-	assertEquals((long) 2, kr.getTotalResults());
-	assertEquals("... franz [hans] haus ...", kr.getMatch(0).getSnippetBrackets());
-	assertEquals("... hans [haus] efeu ...", kr.getMatch(1).getSnippetBrackets());
+        kr = ki.search(ks.setSpanQuery(new QueryBuilder("base").re(
+                "s:.....?garten").toQuery()));
+        assertEquals((long) 2, kr.getTotalResults());
+        assertEquals("... baum [baumgarten] steingarten ...", kr.getMatch(0)
+                .getSnippetBrackets());
+        assertEquals("... baumgarten [steingarten] franz ...", kr.getMatch(1)
+                .getSnippetBrackets());
 
-	kr = ki.search(ks.setSpanQuery(new QueryBuilder("base").re("s:.*ff.*").toQuery()));
-	assertEquals((long) 3, kr.getTotalResults());
-	assertEquals("[affe] afffe ...", kr.getMatch(0).getSnippetBrackets());
-	assertEquals("affe [afffe] baum ...", kr.getMatch(1).getSnippetBrackets());
-	assertEquals("... efeu [effe]", kr.getMatch(2).getSnippetBrackets());
+        kr = ki.search(ks.setSpanQuery(new QueryBuilder("base").re("s:ha.s")
+                .toQuery()));
+        assertEquals((long) 2, kr.getTotalResults());
+        assertEquals("... franz [hans] haus ...", kr.getMatch(0)
+                .getSnippetBrackets());
+        assertEquals("... hans [haus] efeu ...", kr.getMatch(1)
+                .getSnippetBrackets());
+
+        kr = ki.search(ks.setSpanQuery(new QueryBuilder("base").re("s:.*ff.*")
+                .toQuery()));
+        assertEquals((long) 3, kr.getTotalResults());
+        assertEquals("[affe] afffe ...", kr.getMatch(0).getSnippetBrackets());
+        assertEquals("affe [afffe] baum ...", kr.getMatch(1)
+                .getSnippetBrackets());
+        assertEquals("... efeu [effe]", kr.getMatch(2).getSnippetBrackets());
     };
 
+
     @Test
     public void indexWildcard () throws Exception {
-	KrillIndex ki = new KrillIndex();
+        KrillIndex ki = new KrillIndex();
 
-	// abcabcabac
-	FieldDocument fd = new FieldDocument();
-	fd.addTV("base",
-		 "affe afffe baum baumgarten steingarten franz hans haus efeu effe",
-		 "[(0-4)s:affe|_0#0-4|-:t$<i>10]" +
-		 "[(5-10)s:afffe|_1#5-10]" +
-		 "[(11-15)s:baum|_2#11-15]" +
-		 "[(16-26)s:baumgarten|_3#16-26]" +
-		 "[(27-38)s:steingarten|_4#27-38]" +
-		 "[(39-44)s:franz|_5#39-44]" +
-		 "[(45-49)s:hans|_6#45-49]" +
-		 "[(50-54)s:haus|_7#50-54]" +
-		 "[(55-59)s:efeu|_8#55-59]" +
-		 "[(60-64)s:effe|_9#60-64]");
-	ki.addDoc(fd);
+        // abcabcabac
+        FieldDocument fd = new FieldDocument();
+        fd.addTV(
+                "base",
+                "affe afffe baum baumgarten steingarten franz hans haus efeu effe",
+                "[(0-4)s:affe|_0#0-4|-:t$<i>10]" + "[(5-10)s:afffe|_1#5-10]"
+                        + "[(11-15)s:baum|_2#11-15]"
+                        + "[(16-26)s:baumgarten|_3#16-26]"
+                        + "[(27-38)s:steingarten|_4#27-38]"
+                        + "[(39-44)s:franz|_5#39-44]"
+                        + "[(45-49)s:hans|_6#45-49]"
+                        + "[(50-54)s:haus|_7#50-54]"
+                        + "[(55-59)s:efeu|_8#55-59]"
+                        + "[(60-64)s:effe|_9#60-64]");
+        ki.addDoc(fd);
 
-	ki.commit();
+        ki.commit();
 
-	QueryBuilder kq = new QueryBuilder("base");
-	SpanQuery sq = kq.wc("s:af*e").toQuery();
-	assertEquals("SpanMultiTermQueryWrapper(base:s:af*e)", sq.toString());
+        QueryBuilder kq = new QueryBuilder("base");
+        SpanQuery sq = kq.wc("s:af*e").toQuery();
+        assertEquals("SpanMultiTermQueryWrapper(base:s:af*e)", sq.toString());
 
-	Krill ks = new Krill(sq);
-	ks.getMeta().getContext().left.setToken(true).setLength(1);
-	ks.getMeta().getContext().right.setToken(true).setLength(1);
+        Krill ks = new Krill(sq);
+        ks.getMeta().getContext().left.setToken(true).setLength(1);
+        ks.getMeta().getContext().right.setToken(true).setLength(1);
 
-	Result kr = ki.search(ks);
-	assertEquals((long) 2, kr.getTotalResults());
-	assertEquals("[affe] afffe ...", kr.getMatch(0).getSnippetBrackets());
-	assertEquals("affe [afffe] baum ...", kr.getMatch(1).getSnippetBrackets());
+        Result kr = ki.search(ks);
+        assertEquals((long) 2, kr.getTotalResults());
+        assertEquals("[affe] afffe ...", kr.getMatch(0).getSnippetBrackets());
+        assertEquals("affe [afffe] baum ...", kr.getMatch(1)
+                .getSnippetBrackets());
 
-	kr = ki.search(ks.setSpanQuery(new QueryBuilder("base").wc("s:baum.*").toQuery()));
-	assertEquals((long) 0, kr.getTotalResults());
+        kr = ki.search(ks.setSpanQuery(new QueryBuilder("base").wc("s:baum.*")
+                .toQuery()));
+        assertEquals((long) 0, kr.getTotalResults());
 
-	kr = ki.search(ks.setSpanQuery(new QueryBuilder("base").wc("s:baum*").toQuery()));
-	assertEquals((long) 2, kr.getTotalResults());
-	assertEquals("... afffe [baum] baumgarten ...", kr.getMatch(0).getSnippetBrackets());
-	assertEquals("... baum [baumgarten] steingarten ...", kr.getMatch(1).getSnippetBrackets());
+        kr = ki.search(ks.setSpanQuery(new QueryBuilder("base").wc("s:baum*")
+                .toQuery()));
+        assertEquals((long) 2, kr.getTotalResults());
+        assertEquals("... afffe [baum] baumgarten ...", kr.getMatch(0)
+                .getSnippetBrackets());
+        assertEquals("... baum [baumgarten] steingarten ...", kr.getMatch(1)
+                .getSnippetBrackets());
 
-	kr = ki.search(ks.setSpanQuery(new QueryBuilder("base").wc("s:*garten").toQuery()));
-	assertEquals((long) 2, kr.getTotalResults());
-	assertEquals("... baum [baumgarten] steingarten ...", kr.getMatch(0).getSnippetBrackets());
-	assertEquals("... baumgarten [steingarten] franz ...", kr.getMatch(1).getSnippetBrackets());
+        kr = ki.search(ks.setSpanQuery(new QueryBuilder("base").wc("s:*garten")
+                .toQuery()));
+        assertEquals((long) 2, kr.getTotalResults());
+        assertEquals("... baum [baumgarten] steingarten ...", kr.getMatch(0)
+                .getSnippetBrackets());
+        assertEquals("... baumgarten [steingarten] franz ...", kr.getMatch(1)
+                .getSnippetBrackets());
 
-	kr = ki.search(ks.setSpanQuery(new QueryBuilder("base").wc("s:ha?s").toQuery()));
-	assertEquals((long) 2, kr.getTotalResults());
-	assertEquals("... franz [hans] haus ...", kr.getMatch(0).getSnippetBrackets());
-	assertEquals("... hans [haus] efeu ...", kr.getMatch(1).getSnippetBrackets());
+        kr = ki.search(ks.setSpanQuery(new QueryBuilder("base").wc("s:ha?s")
+                .toQuery()));
+        assertEquals((long) 2, kr.getTotalResults());
+        assertEquals("... franz [hans] haus ...", kr.getMatch(0)
+                .getSnippetBrackets());
+        assertEquals("... hans [haus] efeu ...", kr.getMatch(1)
+                .getSnippetBrackets());
 
-	kr = ki.search(ks.setSpanQuery(new QueryBuilder("base").wc("s:?ff?").toQuery()));
-	assertEquals((long) 2, kr.getTotalResults());
-	assertEquals("[affe] afffe ...", kr.getMatch(0).getSnippetBrackets());
-	assertEquals("... efeu [effe]", kr.getMatch(1).getSnippetBrackets());
+        kr = ki.search(ks.setSpanQuery(new QueryBuilder("base").wc("s:?ff?")
+                .toQuery()));
+        assertEquals((long) 2, kr.getTotalResults());
+        assertEquals("[affe] afffe ...", kr.getMatch(0).getSnippetBrackets());
+        assertEquals("... efeu [effe]", kr.getMatch(1).getSnippetBrackets());
     };
 
+
     @Test
     public void indexRegexCaseInsensitive () throws Exception {
-	KrillIndex ki = new KrillIndex();
+        KrillIndex ki = new KrillIndex();
 
-	// abcabcabac
-	FieldDocument fd = new FieldDocument();
-	fd.addTV("base",
-		 "AfFe aFfFE Baum Baumgarten SteinGarten franZ HaNs Haus Efeu effe",
-		 "[(0-4)s:AfFe|i:affe|_0#0-4|-:t$<i>10]" +
-		 "[(5-10)s:aFfFE|i:afffe|_1#5-10]" +
-		 "[(11-15)s:Baum|i:baum|_2#11-15]" +
-		 "[(16-26)s:Baumgarten|i:baumgarten|_3#16-26]" +
-		 "[(27-38)s:SteinGarten|i:steingarten|_4#27-38]" +
-		 "[(39-44)s:franZ|i:franz|_5#39-44]" +
-		 "[(45-49)s:HaNs|i:hans|_6#45-49]" +
-		 "[(50-54)s:Haus|i:haus|_7#50-54]" +
-		 "[(55-59)s:Efeu|i:efeu|_8#55-59]" +
-		 "[(60-64)s:effe|i:effe|_9#60-64]");
-	ki.addDoc(fd);
+        // abcabcabac
+        FieldDocument fd = new FieldDocument();
+        fd.addTV(
+                "base",
+                "AfFe aFfFE Baum Baumgarten SteinGarten franZ HaNs Haus Efeu effe",
+                "[(0-4)s:AfFe|i:affe|_0#0-4|-:t$<i>10]"
+                        + "[(5-10)s:aFfFE|i:afffe|_1#5-10]"
+                        + "[(11-15)s:Baum|i:baum|_2#11-15]"
+                        + "[(16-26)s:Baumgarten|i:baumgarten|_3#16-26]"
+                        + "[(27-38)s:SteinGarten|i:steingarten|_4#27-38]"
+                        + "[(39-44)s:franZ|i:franz|_5#39-44]"
+                        + "[(45-49)s:HaNs|i:hans|_6#45-49]"
+                        + "[(50-54)s:Haus|i:haus|_7#50-54]"
+                        + "[(55-59)s:Efeu|i:efeu|_8#55-59]"
+                        + "[(60-64)s:effe|i:effe|_9#60-64]");
+        ki.addDoc(fd);
 
-	ki.commit();
+        ki.commit();
 
-	QueryBuilder kq = new QueryBuilder("base");
-	SpanQuery sq = kq.re("s:Af*e", true).toQuery();
-	assertEquals("SpanMultiTermQueryWrapper(base:/i:af*e/)", sq.toString());
+        QueryBuilder kq = new QueryBuilder("base");
+        SpanQuery sq = kq.re("s:Af*e", true).toQuery();
+        assertEquals("SpanMultiTermQueryWrapper(base:/i:af*e/)", sq.toString());
 
-	Krill ks = new Krill(sq);
-	ks.getMeta().getContext().left.setToken(true).setLength(1);
-	ks.getMeta().getContext().right.setToken(true).setLength(1);
+        Krill ks = new Krill(sq);
+        ks.getMeta().getContext().left.setToken(true).setLength(1);
+        ks.getMeta().getContext().right.setToken(true).setLength(1);
 
-	Result kr = ki.search(ks);
-	assertEquals((long) 2, kr.getTotalResults());
-	assertEquals("[AfFe] aFfFE ...", kr.getMatch(0).getSnippetBrackets());
-	assertEquals("AfFe [aFfFE] Baum ...", kr.getMatch(1).getSnippetBrackets());
+        Result kr = ki.search(ks);
+        assertEquals((long) 2, kr.getTotalResults());
+        assertEquals("[AfFe] aFfFE ...", kr.getMatch(0).getSnippetBrackets());
+        assertEquals("AfFe [aFfFE] Baum ...", kr.getMatch(1)
+                .getSnippetBrackets());
 
-	kr = ki.search(ks.setSpanQuery(new QueryBuilder("base").re("s:Af.*e").toQuery()));
-	assertEquals((long) 1, kr.getTotalResults());
-	assertEquals("[AfFe] aFfFE ...", kr.getMatch(0).getSnippetBrackets());
+        kr = ki.search(ks.setSpanQuery(new QueryBuilder("base").re("s:Af.*e")
+                .toQuery()));
+        assertEquals((long) 1, kr.getTotalResults());
+        assertEquals("[AfFe] aFfFE ...", kr.getMatch(0).getSnippetBrackets());
 
-	kr = ki.search(ks.setSpanQuery(new QueryBuilder("base").re("s:baum.*", true).toQuery()));
-	assertEquals((long) 2, kr.getTotalResults());
-	assertEquals("... aFfFE [Baum] Baumgarten ...", kr.getMatch(0).getSnippetBrackets());
-	assertEquals("... Baum [Baumgarten] SteinGarten ...", kr.getMatch(1).getSnippetBrackets());
+        kr = ki.search(ks.setSpanQuery(new QueryBuilder("base").re("s:baum.*",
+                true).toQuery()));
+        assertEquals((long) 2, kr.getTotalResults());
+        assertEquals("... aFfFE [Baum] Baumgarten ...", kr.getMatch(0)
+                .getSnippetBrackets());
+        assertEquals("... Baum [Baumgarten] SteinGarten ...", kr.getMatch(1)
+                .getSnippetBrackets());
 
-	kr = ki.search(ks.setSpanQuery(new QueryBuilder("base").re("s:.*garten", true).toQuery()));
-	assertEquals((long) 2, kr.getTotalResults());
-	assertEquals("... Baum [Baumgarten] SteinGarten ...", kr.getMatch(0).getSnippetBrackets());
-	assertEquals("... Baumgarten [SteinGarten] franZ ...", kr.getMatch(1).getSnippetBrackets());
+        kr = ki.search(ks.setSpanQuery(new QueryBuilder("base").re(
+                "s:.*garten", true).toQuery()));
+        assertEquals((long) 2, kr.getTotalResults());
+        assertEquals("... Baum [Baumgarten] SteinGarten ...", kr.getMatch(0)
+                .getSnippetBrackets());
+        assertEquals("... Baumgarten [SteinGarten] franZ ...", kr.getMatch(1)
+                .getSnippetBrackets());
 
-	kr = ki.search(ks.setSpanQuery(new QueryBuilder("base").re("s:.*garten", false).toQuery()));
-	assertEquals((long) 1, kr.getTotalResults());
-	assertEquals("... Baum [Baumgarten] SteinGarten ...", kr.getMatch(0).getSnippetBrackets());
+        kr = ki.search(ks.setSpanQuery(new QueryBuilder("base").re(
+                "s:.*garten", false).toQuery()));
+        assertEquals((long) 1, kr.getTotalResults());
+        assertEquals("... Baum [Baumgarten] SteinGarten ...", kr.getMatch(0)
+                .getSnippetBrackets());
 
-	kr = ki.search(ks.setSpanQuery(new QueryBuilder("base").re("s:ha.s", true).toQuery()));
-	assertEquals((long) 2, kr.getTotalResults());
-	assertEquals("... franZ [HaNs] Haus ...", kr.getMatch(0).getSnippetBrackets());
-	assertEquals("... HaNs [Haus] Efeu ...", kr.getMatch(1).getSnippetBrackets());
+        kr = ki.search(ks.setSpanQuery(new QueryBuilder("base").re("s:ha.s",
+                true).toQuery()));
+        assertEquals((long) 2, kr.getTotalResults());
+        assertEquals("... franZ [HaNs] Haus ...", kr.getMatch(0)
+                .getSnippetBrackets());
+        assertEquals("... HaNs [Haus] Efeu ...", kr.getMatch(1)
+                .getSnippetBrackets());
 
-	kr = ki.search(ks.setSpanQuery(new QueryBuilder("base").re("s:.*f*e", true).toQuery()));
-	assertEquals((long) 3, kr.getTotalResults());
-	assertEquals("[AfFe] aFfFE ...", kr.getMatch(0).getSnippetBrackets());
-	assertEquals("AfFe [aFfFE] Baum ...", kr.getMatch(1).getSnippetBrackets());
-	assertEquals("... Efeu [effe]", kr.getMatch(2).getSnippetBrackets());
+        kr = ki.search(ks.setSpanQuery(new QueryBuilder("base").re("s:.*f*e",
+                true).toQuery()));
+        assertEquals((long) 3, kr.getTotalResults());
+        assertEquals("[AfFe] aFfFE ...", kr.getMatch(0).getSnippetBrackets());
+        assertEquals("AfFe [aFfFE] Baum ...", kr.getMatch(1)
+                .getSnippetBrackets());
+        assertEquals("... Efeu [effe]", kr.getMatch(2).getSnippetBrackets());
     };
 
+
     @Test
     public void indexRegexCombined () throws Exception {
-	KrillIndex ki = new KrillIndex();
+        KrillIndex ki = new KrillIndex();
 
-	// abcabcabac
-	FieldDocument fd = new FieldDocument();
-	fd.addTV("base",
-		 "affe afffe baum baumgarten steingarten franz hans haus efeu effe",
-		 "[(0-4)s:affe|_0#0-4|-:t$<i>10]" +
-		 "[(5-10)s:afffe|_1#5-10]" +
-		 "[(11-15)s:baum|_2#11-15]" +
-		 "[(16-26)s:baumgarten|_3#16-26]" +
-		 "[(27-38)s:steingarten|_4#27-38]" +
-		 "[(39-44)s:franz|_5#39-44]" +
-		 "[(45-49)s:hans|_6#45-49]" +
-		 "[(50-54)s:haus|_7#50-54]" +
-		 "[(55-59)s:efeu|_8#55-59]" +
-		 "[(60-64)s:effe|_9#60-64]");
-	ki.addDoc(fd);
+        // abcabcabac
+        FieldDocument fd = new FieldDocument();
+        fd.addTV(
+                "base",
+                "affe afffe baum baumgarten steingarten franz hans haus efeu effe",
+                "[(0-4)s:affe|_0#0-4|-:t$<i>10]" + "[(5-10)s:afffe|_1#5-10]"
+                        + "[(11-15)s:baum|_2#11-15]"
+                        + "[(16-26)s:baumgarten|_3#16-26]"
+                        + "[(27-38)s:steingarten|_4#27-38]"
+                        + "[(39-44)s:franz|_5#39-44]"
+                        + "[(45-49)s:hans|_6#45-49]"
+                        + "[(50-54)s:haus|_7#50-54]"
+                        + "[(55-59)s:efeu|_8#55-59]"
+                        + "[(60-64)s:effe|_9#60-64]");
+        ki.addDoc(fd);
 
-	ki.commit();
+        ki.commit();
 
-	QueryBuilder kq = new QueryBuilder("base");
-	SpanQuery sq = kq.seq(kq.seg("s:affe")).append(kq.re("s:af*e")).toQuery();
-	assertEquals("spanNext(base:s:affe, SpanMultiTermQueryWrapper(base:/s:af*e/))", sq.toString());
+        QueryBuilder kq = new QueryBuilder("base");
+        SpanQuery sq = kq.seq(kq.seg("s:affe")).append(kq.re("s:af*e"))
+                .toQuery();
+        assertEquals(
+                "spanNext(base:s:affe, SpanMultiTermQueryWrapper(base:/s:af*e/))",
+                sq.toString());
 
-	Krill ks = new Krill(sq);
-	ks.getMeta().getContext().left.setToken(true).setLength(1);
-	ks.getMeta().getContext().right.setToken(true).setLength(1);
+        Krill ks = new Krill(sq);
+        ks.getMeta().getContext().left.setToken(true).setLength(1);
+        ks.getMeta().getContext().right.setToken(true).setLength(1);
 
-	Result kr = ki.search(ks);
-	assertEquals((long) 1, kr.getTotalResults());
-	assertEquals("[affe afffe] baum ...", kr.getMatch(0).getSnippetBrackets());
+        Result kr = ki.search(ks);
+        assertEquals((long) 1, kr.getTotalResults());
+        assertEquals("[affe afffe] baum ...", kr.getMatch(0)
+                .getSnippetBrackets());
     };
 
 
     @Test
     public void indexRegexWithinRewrite () throws Exception {
-	KrillIndex ki = new KrillIndex();
+        KrillIndex ki = new KrillIndex();
 
-	// abcabcabac
-	FieldDocument fd = new FieldDocument();
-	fd.addTV("base",
-		 "affe afffe baum baumgarten steingarten franz hans haus efeu effe",
-		 "[(0-4)s:affe|_0#0-4|-:t$<i>10]" +
-		 "[(5-10)s:afffe|_1#5-10]" +
-		 "[(11-15)s:baum|_2#11-15]" +
-		 "[(16-26)s:baumgarten|_3#16-26]" +
-		 "[(27-38)s:steingarten|_4#27-38]" +
-		 "[(39-44)s:franz|_5#39-44]" +
-		 "[(45-49)s:hans|_6#45-49]" +
-		 "[(50-54)s:haus|_7#50-54]" +
-		 "[(55-59)s:efeu|_8#55-59]" +
-		 "[(60-64)s:effe|_9#60-64]");
-	ki.addDoc(fd);
+        // abcabcabac
+        FieldDocument fd = new FieldDocument();
+        fd.addTV(
+                "base",
+                "affe afffe baum baumgarten steingarten franz hans haus efeu effe",
+                "[(0-4)s:affe|_0#0-4|-:t$<i>10]" + "[(5-10)s:afffe|_1#5-10]"
+                        + "[(11-15)s:baum|_2#11-15]"
+                        + "[(16-26)s:baumgarten|_3#16-26]"
+                        + "[(27-38)s:steingarten|_4#27-38]"
+                        + "[(39-44)s:franz|_5#39-44]"
+                        + "[(45-49)s:hans|_6#45-49]"
+                        + "[(50-54)s:haus|_7#50-54]"
+                        + "[(55-59)s:efeu|_8#55-59]"
+                        + "[(60-64)s:effe|_9#60-64]");
+        ki.addDoc(fd);
 
-	ki.commit();
+        ki.commit();
 
-	QueryBuilder kq = new QueryBuilder("base");
-	SpanQuery sq = kq.contains(
-				   kq.seq(
-					  kq.re("s:a.*e")
-					  ).append(
-						   kq.re("s:af*e")
-						   ),
-				   kq.seg("s:affe")).toQuery();
-	assertEquals("spanContain(spanNext(SpanMultiTermQueryWrapper(base:/s:a.*e/), SpanMultiTermQueryWrapper(base:/s:af*e/)), base:s:affe)", sq.toString());
-	Krill ks = new Krill(sq);
-	ks.getMeta().getContext().left.setToken(true).setLength(1);
-	ks.getMeta().getContext().right.setToken(true).setLength(1);
+        QueryBuilder kq = new QueryBuilder("base");
+        SpanQuery sq = kq.contains(
+                kq.seq(kq.re("s:a.*e")).append(kq.re("s:af*e")),
+                kq.seg("s:affe")).toQuery();
+        assertEquals(
+                "spanContain(spanNext(SpanMultiTermQueryWrapper(base:/s:a.*e/), SpanMultiTermQueryWrapper(base:/s:af*e/)), base:s:affe)",
+                sq.toString());
+        Krill ks = new Krill(sq);
+        ks.getMeta().getContext().left.setToken(true).setLength(1);
+        ks.getMeta().getContext().right.setToken(true).setLength(1);
 
-	Result kr = ki.search(ks);
-	assertEquals((long) 1, kr.getTotalResults());
-	assertEquals("[affe afffe] baum ...", kr.getMatch(0).getSnippetBrackets());
+        Result kr = ki.search(ks);
+        assertEquals((long) 1, kr.getTotalResults());
+        assertEquals("[affe afffe] baum ...", kr.getMatch(0)
+                .getSnippetBrackets());
     };
 };
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestRelationIndex.java b/src/test/java/de/ids_mannheim/korap/index/TestRelationIndex.java
index c38135a..838a572 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestRelationIndex.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestRelationIndex.java
@@ -20,7 +20,7 @@
 import de.ids_mannheim.korap.response.Match;
 import de.ids_mannheim.korap.response.Result;
 
-    /*
+/*
 
 within(x,y)
 
@@ -57,481 +57,491 @@
 -> [p:VVFIN](>SUBJ[nr:sg] & >OBJ[c:dat])
 
 
-     */
+ */
 
 public class TestRelationIndex {
-	private KrillIndex ki;
-	private Result kr;
+    private KrillIndex ki;
+    private Result kr;
 
-	public TestRelationIndex() throws IOException {
-		ki = new KrillIndex();
-	}
-	
-	private FieldDocument createFieldDoc0(){
-    	FieldDocument fd = new FieldDocument();
+
+    public TestRelationIndex () throws IOException {
+        ki = new KrillIndex();
+    }
+
+
+    private FieldDocument createFieldDoc0 () {
+        FieldDocument fd = new FieldDocument();
         fd.addString("ID", "doc-0");
-        fd.addTV("base", "ceccecdeed",
-			"[(0-1)s:c$<s>1|_0#0-1|>:xip/syntax-dep_rel$<i>6<s>1<s>1<s>1]"+
-            "[(1-2)s:e$<s>1|_1#1-2|<:xip/syntax-dep_rel$<i>9<s>1<s>1<s>1|>:xip/syntax-dep_rel$<i>4<s>1<s>1<s>1]" +             
-            "[(2-3)s:c|_2#2-3]" +
-            "[(3-4)s:c$<s>1|s:b$<s>2|_3#3-4|<:xip/syntax-dep_rel$<i>9<s>1<s>1<s>1]" + 
-            "[(4-5)s:e$<s>1|s:d$<s>2|_4#4-5|<:xip/syntax-dep_rel$<i>1<s>1<s>1<s>1]" +
-            "[(5-6)s:c|_5#5-6]" +
-            "[(6-7)s:d$<s>1|_6#6-7|<:xip/syntax-dep_rel$<i>1<s>1<s>1<s>1]" +
-            "[(7-8)s:e|_7#7-8]" + 
-            "[(8-9)s:e|s:b|_8#8-9]" + 
-            "[(9-10)s:d$<s>1|_9#9-10|>:xip/syntax-dep_rel$<i>1<s>2<s>1<s>1|>:xip/syntax-dep_rel$<i>3<s>1<s>1<s>1]");
+        fd.addTV(
+                "base",
+                "ceccecdeed",
+                "[(0-1)s:c$<s>1|_0#0-1|>:xip/syntax-dep_rel$<i>6<s>1<s>1<s>1]"
+                        + "[(1-2)s:e$<s>1|_1#1-2|<:xip/syntax-dep_rel$<i>9<s>1<s>1<s>1|>:xip/syntax-dep_rel$<i>4<s>1<s>1<s>1]"
+                        + "[(2-3)s:c|_2#2-3]"
+                        + "[(3-4)s:c$<s>1|s:b$<s>2|_3#3-4|<:xip/syntax-dep_rel$<i>9<s>1<s>1<s>1]"
+                        + "[(4-5)s:e$<s>1|s:d$<s>2|_4#4-5|<:xip/syntax-dep_rel$<i>1<s>1<s>1<s>1]"
+                        + "[(5-6)s:c|_5#5-6]"
+                        + "[(6-7)s:d$<s>1|_6#6-7|<:xip/syntax-dep_rel$<i>1<s>1<s>1<s>1]"
+                        + "[(7-8)s:e|_7#7-8]"
+                        + "[(8-9)s:e|s:b|_8#8-9]"
+                        + "[(9-10)s:d$<s>1|_9#9-10|>:xip/syntax-dep_rel$<i>1<s>2<s>1<s>1|>:xip/syntax-dep_rel$<i>3<s>1<s>1<s>1]");
         return fd;
     }
-	
-	private FieldDocument createFieldDoc1(){
-    	FieldDocument fd = new FieldDocument();
+
+
+    private FieldDocument createFieldDoc1 () {
+        FieldDocument fd = new FieldDocument();
         fd.addString("ID", "doc-1");
-        fd.addTV("base", "ceccecdeed",
-            "[(0-1)s:c$<s>2|<>:p$#0-3$<i>3<s>1|_0#0-1|" +
-            	">:xip/syntax-dep_rel$<i>3<i>6<i>9<s>2<s>1<s>1|" +
-            	">:xip/syntax-dep_rel$<i>6<i>9<s>1<s>2<s>1|" +
-            	"r@:func=subj$<s>2]"+
-            "[(1-2)s:e|_1#1-2|<>:p#1-3$<i>3<s>1]" +             
-            "[(2-3)s:c|_2#2-3]" +
-            "[(3-4)s:c|s:b|_3#3-4]" + 
-            "[(4-5)s:e|s:d|_4#4-5]" +
-            "[(5-6)s:c|_5#5-6]" +
-            "[(6-7)s:d$<s>2|<>:p$#6-9$<i>9<s>1|_6#6-7|" +
-            	"<:xip/syntax-dep_rel$<i>9<b>0<i>1<s>1<s>1<s>2|" +
-            	">:xip/syntax-dep_rel$<i>9<b>0<i>9<s>3<s>1<s>1|"+
-            	"<:xip/syntax-dep_rel$<i>9<i>1<i>3<s>2<s>1<s>1|" +
-            	"r@:func=obj$<s>2]" + 
-            "[(7-8)s:e|_7#7-8]" +
-            "[(8-9)s:e|s:b|_8#8-9]" + 
-            "[(9-10)s:d$<s>1|_9#9-10|<:xip/syntax-dep_rel$<i>6<i>9<s>2<s>1<s>1]");
+        fd.addTV(
+                "base",
+                "ceccecdeed",
+                "[(0-1)s:c$<s>2|<>:p$#0-3$<i>3<s>1|_0#0-1|"
+                        + ">:xip/syntax-dep_rel$<i>3<i>6<i>9<s>2<s>1<s>1|"
+                        + ">:xip/syntax-dep_rel$<i>6<i>9<s>1<s>2<s>1|"
+                        + "r@:func=subj$<s>2]"
+                        + "[(1-2)s:e|_1#1-2|<>:p#1-3$<i>3<s>1]"
+                        + "[(2-3)s:c|_2#2-3]"
+                        + "[(3-4)s:c|s:b|_3#3-4]"
+                        + "[(4-5)s:e|s:d|_4#4-5]"
+                        + "[(5-6)s:c|_5#5-6]"
+                        + "[(6-7)s:d$<s>2|<>:p$#6-9$<i>9<s>1|_6#6-7|"
+                        + "<:xip/syntax-dep_rel$<i>9<b>0<i>1<s>1<s>1<s>2|"
+                        + ">:xip/syntax-dep_rel$<i>9<b>0<i>9<s>3<s>1<s>1|"
+                        + "<:xip/syntax-dep_rel$<i>9<i>1<i>3<s>2<s>1<s>1|"
+                        + "r@:func=obj$<s>2]"
+                        + "[(7-8)s:e|_7#7-8]"
+                        + "[(8-9)s:e|s:b|_8#8-9]"
+                        + "[(9-10)s:d$<s>1|_9#9-10|<:xip/syntax-dep_rel$<i>6<i>9<s>2<s>1<s>1]");
         return fd;
     }
-	
-	private FieldDocument createFieldDoc2(){
-    	FieldDocument fd = new FieldDocument();
+
+
+    private FieldDocument createFieldDoc2 () {
+        FieldDocument fd = new FieldDocument();
         fd.addString("ID", "doc-2");
-        fd.addTV("base",
-            "Ich kaufe die Blümen für meine Mutter.",             
-            "[(0-3)s:Ich|_0#0-3|pos:NN$<s>1|<>:s#0-38$<i>7<s>2|<>:np#0-3$<i>1<s>3|" +
-            	">:child-of$<i>0<i>7<s>1<s>3<s>2|" +
-            	">:child-of$<i>0<i>1<s>6<s>1<s>3|" +
-            	"<:child-of$<i>1<b>0<i>1<s>3<s>3<s>1|" +
-            	"<:child-of$<i>7<i>0<i>1<s>4<s>2<s>3|" +
-            	"<:child-of$<i>7<i>1<i>7<s>5<s>2<s>2|" +
-            	"<:dep$<i>2<s>2<s>1<s>1|" +
-            	"r@:func=sbj$<i>0<i>7<s>1]"+            	
-            	
-            "[(1-2)s:kaufe|_1#4-9|pos:V$<s>1|<>:vp#4-38$<i>7<s>2|" +
-            	">:child-of$<i>7<i>0<i>7<s>1<s>2<s>2|"+
-            	">:child-of$<i>1<i>7<s>2<s>1<s>2|" +
-            	"<:child-of$<i>7<b>0<i>2<s>5<s>2<s>1|" +
-            	"<:child-of$<i>7<i>2<i>7<s>6<s>2<s>4|" +
-            	">:dep$<i>1<s>3<s>1<s>1|" +
-            	">:dep$<i>4<s>4<s>1<s>1]" +
-            	
-            "[(2-3)s:die|_2#10-13|pos:ART$<s>1|tt:DET$<s>2|<>:np#10-20$<i>4<s>3|<>:np#10-38$<i>7<s>4|" +
-            	">:child-of$<i>4<i>2<i>7<s>1<s>3<s>4|" +
-            	">:child-of$<i>2<i>4<s>2<s>1<s>3|" +
-            	">:child-of$<i>7<i>1<i>7<s>2<s>4<s>2|" +
-            	"<:child-of$<i>4<b>0<i>3<s>3<s>3<s>1|" +
-            	"<:child-of$<i>4<b>0<i>4<s>4<s>3<s>1|" +
-            	"<:child-of$<i>7<i>2<i>4<s>5<s>4<s>3|" +
-            	"<:child-of$<i>7<i>4<i>7<s>6<s>4<s>2|" +
-            	"<:dep$<i>4<s>3<s>1<s>1|" +
-            	"r@:func=obj$<i>2<i>7<s>1]" +
-            
-            "[(3-4)s:Blümen|_3#14-20|pos:NN$<s>1|" +
-            	">:child-of$<i>2<i>4<s>1<s>1<s>3|" +            	
-            	"<:dep$<i>2<s>2<s>1<s>2|" +
-            	">:dep$<i>3<s>3<s>1<s>1|" +
-            	">:dep$<i>5<s>4<s>1<s>1|" +
-            	"r@:func=head$<i>2<i>4<s>2]" +
-            	
-            "[(4-5)s:für|_4#21-24|pos:PREP$<s>1|<>:pp#21-38$<i>7<s>2|" +
-            	">:child-of$<i>4<i>7<s>1<s>1<s>2|" +
-            	">:child-of$<i>7<i>2<i>7<s>2<s>2<s>4|" +
-            	"<:child-of$<i>7<b>0<i>5<s>4<s>2<s>1|" +
-            	"<:child-of$<i>7<i>5<i>7<s>5<s>2<s>2|" +
-            	"<:dep$<i>4<s>1<s>1<s>1|" +
-            	">:dep$<i>7<s>3<s>1<s>1]" +
-            
-            "[(5-6)s:meine|_5#25-30|pos:ART$<s>1|<>:np#25-38$<i>7<s>2|" +
-            	">:child-of$<i>5<i>7<s>1<s>1<s>2|" +
-            	">:child-of$<i>7<i>4<i>7<s>2<s>2<s>2|" +
-            	"<:child-of$<i>7<b>0<i>6<s>4<s>2<s>1|" +
-            	"<:child-of$<i>7<b>0<i>7<s>5<s>2<s>1|" +
-            	"<:dep$<i>7<s>3<s>1<s>1]" +
-            	
-            "[(6-7)s:Mutter.|_6#31-38|pos:NN$<s>1|" +
-            	">:child-of$<i>5<i>7<s>1<s>1<s>2|" +
-            	">:dep$<i>6<s>2<s>1<s>1|" +
-            	"<:dep$<i>5<s>3<s>1<s>1|" +
-        		"r@:func=head$<i>6<i>7<s>3]");
-        
+        fd.addTV(
+                "base",
+                "Ich kaufe die Blümen für meine Mutter.",
+                "[(0-3)s:Ich|_0#0-3|pos:NN$<s>1|<>:s#0-38$<i>7<s>2|<>:np#0-3$<i>1<s>3|"
+                        + ">:child-of$<i>0<i>7<s>1<s>3<s>2|"
+                        + ">:child-of$<i>0<i>1<s>6<s>1<s>3|"
+                        + "<:child-of$<i>1<b>0<i>1<s>3<s>3<s>1|"
+                        + "<:child-of$<i>7<i>0<i>1<s>4<s>2<s>3|"
+                        + "<:child-of$<i>7<i>1<i>7<s>5<s>2<s>2|"
+                        + "<:dep$<i>2<s>2<s>1<s>1|"
+                        + "r@:func=sbj$<i>0<i>7<s>1]"
+                        +
+
+                        "[(1-2)s:kaufe|_1#4-9|pos:V$<s>1|<>:vp#4-38$<i>7<s>2|"
+                        + ">:child-of$<i>7<i>0<i>7<s>1<s>2<s>2|"
+                        + ">:child-of$<i>1<i>7<s>2<s>1<s>2|"
+                        + "<:child-of$<i>7<b>0<i>2<s>5<s>2<s>1|"
+                        + "<:child-of$<i>7<i>2<i>7<s>6<s>2<s>4|"
+                        + ">:dep$<i>1<s>3<s>1<s>1|"
+                        + ">:dep$<i>4<s>4<s>1<s>1]"
+                        +
+
+                        "[(2-3)s:die|_2#10-13|pos:ART$<s>1|tt:DET$<s>2|<>:np#10-20$<i>4<s>3|<>:np#10-38$<i>7<s>4|"
+                        + ">:child-of$<i>4<i>2<i>7<s>1<s>3<s>4|"
+                        + ">:child-of$<i>2<i>4<s>2<s>1<s>3|"
+                        + ">:child-of$<i>7<i>1<i>7<s>2<s>4<s>2|"
+                        + "<:child-of$<i>4<b>0<i>3<s>3<s>3<s>1|"
+                        + "<:child-of$<i>4<b>0<i>4<s>4<s>3<s>1|"
+                        + "<:child-of$<i>7<i>2<i>4<s>5<s>4<s>3|"
+                        + "<:child-of$<i>7<i>4<i>7<s>6<s>4<s>2|"
+                        + "<:dep$<i>4<s>3<s>1<s>1|"
+                        + "r@:func=obj$<i>2<i>7<s>1]" +
+
+                        "[(3-4)s:Blümen|_3#14-20|pos:NN$<s>1|"
+                        + ">:child-of$<i>2<i>4<s>1<s>1<s>3|"
+                        + "<:dep$<i>2<s>2<s>1<s>2|" + ">:dep$<i>3<s>3<s>1<s>1|"
+                        + ">:dep$<i>5<s>4<s>1<s>1|"
+                        + "r@:func=head$<i>2<i>4<s>2]" +
+
+                        "[(4-5)s:für|_4#21-24|pos:PREP$<s>1|<>:pp#21-38$<i>7<s>2|"
+                        + ">:child-of$<i>4<i>7<s>1<s>1<s>2|"
+                        + ">:child-of$<i>7<i>2<i>7<s>2<s>2<s>4|"
+                        + "<:child-of$<i>7<b>0<i>5<s>4<s>2<s>1|"
+                        + "<:child-of$<i>7<i>5<i>7<s>5<s>2<s>2|"
+                        + "<:dep$<i>4<s>1<s>1<s>1|" + ">:dep$<i>7<s>3<s>1<s>1]"
+                        +
+
+                        "[(5-6)s:meine|_5#25-30|pos:ART$<s>1|<>:np#25-38$<i>7<s>2|"
+                        + ">:child-of$<i>5<i>7<s>1<s>1<s>2|"
+                        + ">:child-of$<i>7<i>4<i>7<s>2<s>2<s>2|"
+                        + "<:child-of$<i>7<b>0<i>6<s>4<s>2<s>1|"
+                        + "<:child-of$<i>7<b>0<i>7<s>5<s>2<s>1|"
+                        + "<:dep$<i>7<s>3<s>1<s>1]" +
+
+                        "[(6-7)s:Mutter.|_6#31-38|pos:NN$<s>1|"
+                        + ">:child-of$<i>5<i>7<s>1<s>1<s>2|"
+                        + ">:dep$<i>6<s>2<s>1<s>1|" + "<:dep$<i>5<s>3<s>1<s>1|"
+                        + "r@:func=head$<i>6<i>7<s>3]");
+
         return fd;
     }
-	
-	/** Relations: token to token, token to span, span to span
-	 * */
-	@Test
-	public void testCase1() throws IOException {
-		ki.addDoc(createFieldDoc0());
-		ki.addDoc(createFieldDoc1());
-		ki.commit();
-		
-		SpanRelationQuery sq = new SpanRelationQuery(new SpanTermQuery(
-				new Term("base", ">:xip/syntax-dep_rel")), true);
-		kr = ki.search(sq, (short) 10);
-		
-		assertEquals((long) 7, kr.getTotalResults());
-		// token to token
-		assertEquals(0, kr.getMatch(0).getLocalDocID());
-		assertEquals(0, kr.getMatch(0).getStartPos());
-		assertEquals(1, kr.getMatch(0).getEndPos());
-		assertEquals(1, kr.getMatch(1).getStartPos());
-		assertEquals(2, kr.getMatch(1).getEndPos());
-		assertEquals(9, kr.getMatch(2).getStartPos());
-		assertEquals(10, kr.getMatch(2).getEndPos());
-		assertEquals(9, kr.getMatch(3).getStartPos());
-		assertEquals(10, kr.getMatch(3).getEndPos());
 
-		// token to span
-		assertEquals(1,kr.getMatch(4).getLocalDocID());
-		assertEquals(0,kr.getMatch(4).getStartPos());
-		assertEquals(1, kr.getMatch(4).getEndPos());
-		assertEquals(0,kr.getMatch(5).getStartPos());
-		assertEquals(3, kr.getMatch(5).getEndPos());
-		
-		// span to span
-		assertEquals(6,kr.getMatch(6).getStartPos());
-		assertEquals(9, kr.getMatch(6).getEndPos());
 
-		// check target
+    /**
+     * Relations: token to token, token to span, span to span
+     * */
+    @Test
+    public void testCase1 () throws IOException {
+        ki.addDoc(createFieldDoc0());
+        ki.addDoc(createFieldDoc1());
+        ki.commit();
 
-	}
-	
-	/** Relation span to token
-	 * */
-	@Test
-	public void testCase2() throws IOException {
-		ki.addDoc(createFieldDoc0());
-		ki.addDoc(createFieldDoc1());
-		ki.commit();
-		
-		SpanRelationQuery sq = new SpanRelationQuery(new SpanTermQuery(
-				new Term("base", "<:xip/syntax-dep_rel")), true);
-		kr = ki.search(sq,(short) 10);
-		
-		assertEquals((long) 7, kr.getTotalResults());
-		// token to token
-		assertEquals(0,kr.getMatch(0).getLocalDocID());
-		assertEquals(1,kr.getMatch(0).getStartPos());
-		assertEquals(2, kr.getMatch(0).getEndPos());
-		assertEquals(3, kr.getMatch(1).getStartPos());
-		assertEquals(4, kr.getMatch(1).getEndPos());
-		assertEquals(4, kr.getMatch(2).getStartPos());
-		assertEquals(5, kr.getMatch(2).getEndPos());
-		assertEquals(6, kr.getMatch(3).getStartPos());
-		assertEquals(7, kr.getMatch(3).getEndPos());
-		
-		assertEquals(1,kr.getMatch(4).getLocalDocID());
-		// span to token
-		assertEquals(6, kr.getMatch(4).getStartPos());
-		assertEquals(9,kr.getMatch(4).getEndPos());
-		assertEquals(6, kr.getMatch(5).getStartPos());
-		assertEquals(9,kr.getMatch(5).getEndPos());
-		// span to span
-		assertEquals(9, kr.getMatch(6).getStartPos());
-		assertEquals(10,kr.getMatch(6).getEndPos());
-	}
-	
-	/** Relations with attributes
-	 * 	NEED focusMulti on span relation query before SpanWithAttributeQuery 
-	 * */
-	/* @Test
-	public void testCase3() throws IOException {
-		ki.addDoc(createFieldDoc2());
-		ki.commit();
-		
-		// child-of relations
-		SpanRelationQuery srq= new SpanRelationQuery(new SpanTermQuery(
-				new Term("base", ">:child-of")), true);
-		kr = ki.search(srq,(short) 20);
-		
-		assertEquals((long) 13, kr.getTotalResults());
+        SpanRelationQuery sq = new SpanRelationQuery(new SpanTermQuery(
+                new Term("base", ">:xip/syntax-dep_rel")), true);
+        kr = ki.search(sq, (short) 10);
 
-		// child-of with attr func=sbj
-		SpanWithAttributeQuery wq = 
-			new SpanWithAttributeQuery(srq, 
-				new SpanAttributeQuery( 
-					new SpanTermQuery(new Term("base", "r@:func=sbj")),
-					true), 
-				true
-		);
-		
-		kr = ki.search(wq,(short) 10);		
-		assertEquals((long) 1, kr.getTotalResults());
-		assertEquals(0,kr.getMatch(0).getStartPos()); // token
-		assertEquals(1, kr.getMatch(0).getEndPos());
-		
-		// child-of without attr func=sbj
-		wq = 
-			new SpanWithAttributeQuery(srq, 
-				new SpanAttributeQuery( 
-					new SpanTermQuery(new Term("base", "r@:func=sbj")),
-					true, true), 
-				true
-		);
-		kr = ki.search(wq,(short) 20);
-		assertEquals((long) 12, kr.getTotalResults());
+        assertEquals((long) 7, kr.getTotalResults());
+        // token to token
+        assertEquals(0, kr.getMatch(0).getLocalDocID());
+        assertEquals(0, kr.getMatch(0).getStartPos());
+        assertEquals(1, kr.getMatch(0).getEndPos());
+        assertEquals(1, kr.getMatch(1).getStartPos());
+        assertEquals(2, kr.getMatch(1).getEndPos());
+        assertEquals(9, kr.getMatch(2).getStartPos());
+        assertEquals(10, kr.getMatch(2).getEndPos());
+        assertEquals(9, kr.getMatch(3).getStartPos());
+        assertEquals(10, kr.getMatch(3).getEndPos());
 
-		// child-of with attr func-obj
-		wq = new SpanWithAttributeQuery(srq,
-				new SpanAttributeQuery( 
-					new SpanTermQuery( new Term("base", "r@:func=obj")),
-					true), 
-				true
-		);
-		
-		kr = ki.search(wq,(short) 10);
-		assertEquals((long) 1, kr.getTotalResults());
-		assertEquals(2,kr.getMatch(0).getStartPos()); // element
-		assertEquals(4,kr.getMatch(0).getEndPos());
+        // token to span
+        assertEquals(1, kr.getMatch(4).getLocalDocID());
+        assertEquals(0, kr.getMatch(4).getStartPos());
+        assertEquals(1, kr.getMatch(4).getEndPos());
+        assertEquals(0, kr.getMatch(5).getStartPos());
+        assertEquals(3, kr.getMatch(5).getEndPos());
 
-		// target of a dependency relation		
-		srq = new SpanRelationQuery(
-				new SpanTermQuery(new Term("base", "<:dep")), true);
-		kr = ki.search(srq,(short) 10);
-		
-		assertEquals((long) 6, kr.getTotalResults());
+        // span to span
+        assertEquals(6, kr.getMatch(6).getStartPos());
+        assertEquals(9, kr.getMatch(6).getEndPos());
 
-		// target of a dependency relation, which is also a head
-		wq = new SpanWithAttributeQuery(srq, 
-					new SpanAttributeQuery( 
-						new SpanTermQuery( new Term("base", "r@:func=head")),
-						true), 
-					true
-			);
-		
-		kr = ki.search(wq,(short) 20);
-		// for (Match km : kr.getMatches()) {
-		// System.out.println(km.getStartPos() + "," + km.getEndPos() + " "
-		// + km.getSnippetBrackets());
-		// }
-		assertEquals((long) 2, kr.getTotalResults());
-		assertEquals(3, kr.getMatch(0).getStartPos());
-		assertEquals(4,kr.getMatch(0).getEndPos());
-		assertEquals(6, kr.getMatch(1).getStartPos());
-		assertEquals(7, kr.getMatch(1).getEndPos());
-		
-	}
-	
-	// FOCUS has not sorted
-	/** Relation with variable
-	 * 	match right, return left
-	 * 	sort by right, then sort by left
-	 * @throws IOException 
-	 * */
-	/*@Test
-	public void testCase4() throws IOException {
-		ki.addDoc(createFieldDoc2());
-		ki.commit();
-		
-		//return all children of np
-		SpanQuery rv = new SpanFocusQuery(
-		    new SpanSegmentQuery(
-			    new SpanRelationQuery(
-			       new SpanTermQuery(new Term("base","<:child-of")), true), 
-			       new SpanElementQuery("base","np"),
-			true),
-		(byte) 2);
-				
-		kr = ki.search(rv,(short) 10);
-		for (Match km : kr.getMatches()) {
-			System.out.println(km.getStartPos() + "," + km.getEndPos() 
-			// + " "+ km.getSnippetBrackets()
-					);
-		}
+        // check target
 
-		assertEquals((long) 7, kr.getTotalResults());
-		assertEquals(0,kr.getMatch(0).getStartPos());
-		assertEquals(1,kr.getMatch(0).getEndPos());
-		assertEquals(2,kr.getMatch(1).getStartPos());
-		assertEquals(3,kr.getMatch(1).getEndPos());
-		assertEquals(2,kr.getMatch(2).getStartPos());
-		assertEquals(4,kr.getMatch(2).getEndPos());
-		assertEquals(3,kr.getMatch(3).getStartPos());
-		assertEquals(4,kr.getMatch(3).getEndPos());
-		assertEquals(4,kr.getMatch(4).getStartPos());
-		assertEquals(7,kr.getMatch(4).getEndPos());
-		assertEquals(5,kr.getMatch(5).getStartPos());
-		assertEquals(6,kr.getMatch(5).getEndPos());
-		assertEquals(6,kr.getMatch(6).getStartPos());
-		assertEquals(7,kr.getMatch(6).getEndPos());		
-		// sorting left problem (solved)
-		
-		//return all children of np that are articles
-		SpanSegmentQuery rv2 = new SpanSegmentQuery(rv, new SpanTermQuery(new Term("base","pos:ART")));		
-		kr = ki.search(rv2,(short) 10);
-				
-		assertEquals((long) 2, kr.getTotalResults());
-		assertEquals(2,kr.getMatch(0).getStartPos());
-		assertEquals(3,kr.getMatch(0).getEndPos());
-		assertEquals(5,kr.getMatch(1).getStartPos());
-		assertEquals(6,kr.getMatch(1).getEndPos());
-		
-		// return all nps whose children are articles
-		/*SpanRelationPartQuery rv3 = 
-			new SpanRelationPartQuery(rv, 
-				new SpanTermWithIdQuery(new Term("base","pos:ART"), true), 
-				false, true, true); 
-		kr = ki.search(rv3,(short) 10);
-		 
-		assertEquals((long) 2, kr.getTotalResults());
-		assertEquals(2,kr.getMatch(0).getStartPos());
-		assertEquals(4,kr.getMatch(0).getEndPos());
-		assertEquals(5,kr.getMatch(1).getStartPos());
-		assertEquals(7,kr.getMatch(1).getEndPos());
-		
-		*/
-	//}
-	
-	/** Match left return left
-	 *  Match right return right
-	 * */
-	@Test
-    public void testCase5() throws IOException {
+    }
+
+
+    /**
+     * Relation span to token
+     * */
+    @Test
+    public void testCase2 () throws IOException {
+        ki.addDoc(createFieldDoc0());
+        ki.addDoc(createFieldDoc1());
+        ki.commit();
+
+        SpanRelationQuery sq = new SpanRelationQuery(new SpanTermQuery(
+                new Term("base", "<:xip/syntax-dep_rel")), true);
+        kr = ki.search(sq, (short) 10);
+
+        assertEquals((long) 7, kr.getTotalResults());
+        // token to token
+        assertEquals(0, kr.getMatch(0).getLocalDocID());
+        assertEquals(1, kr.getMatch(0).getStartPos());
+        assertEquals(2, kr.getMatch(0).getEndPos());
+        assertEquals(3, kr.getMatch(1).getStartPos());
+        assertEquals(4, kr.getMatch(1).getEndPos());
+        assertEquals(4, kr.getMatch(2).getStartPos());
+        assertEquals(5, kr.getMatch(2).getEndPos());
+        assertEquals(6, kr.getMatch(3).getStartPos());
+        assertEquals(7, kr.getMatch(3).getEndPos());
+
+        assertEquals(1, kr.getMatch(4).getLocalDocID());
+        // span to token
+        assertEquals(6, kr.getMatch(4).getStartPos());
+        assertEquals(9, kr.getMatch(4).getEndPos());
+        assertEquals(6, kr.getMatch(5).getStartPos());
+        assertEquals(9, kr.getMatch(5).getEndPos());
+        // span to span
+        assertEquals(9, kr.getMatch(6).getStartPos());
+        assertEquals(10, kr.getMatch(6).getEndPos());
+    }
+
+
+    /**
+     * Relations with attributes
+     * NEED focusMulti on span relation query before
+     * SpanWithAttributeQuery
+     * */
+    /* @Test
+    public void testCase3() throws IOException {
+    	ki.addDoc(createFieldDoc2());
+    	ki.commit();
+    	
+    	// child-of relations
+    	SpanRelationQuery srq= new SpanRelationQuery(new SpanTermQuery(
+    			new Term("base", ">:child-of")), true);
+    	kr = ki.search(srq,(short) 20);
+    	
+    	assertEquals((long) 13, kr.getTotalResults());
+
+    	// child-of with attr func=sbj
+    	SpanWithAttributeQuery wq = 
+    		new SpanWithAttributeQuery(srq, 
+    			new SpanAttributeQuery( 
+    				new SpanTermQuery(new Term("base", "r@:func=sbj")),
+    				true), 
+    			true
+    	);
+    	
+    	kr = ki.search(wq,(short) 10);		
+    	assertEquals((long) 1, kr.getTotalResults());
+    	assertEquals(0,kr.getMatch(0).getStartPos()); // token
+    	assertEquals(1, kr.getMatch(0).getEndPos());
+    	
+    	// child-of without attr func=sbj
+    	wq = 
+    		new SpanWithAttributeQuery(srq, 
+    			new SpanAttributeQuery( 
+    				new SpanTermQuery(new Term("base", "r@:func=sbj")),
+    				true, true), 
+    			true
+    	);
+    	kr = ki.search(wq,(short) 20);
+    	assertEquals((long) 12, kr.getTotalResults());
+
+    	// child-of with attr func-obj
+    	wq = new SpanWithAttributeQuery(srq,
+    			new SpanAttributeQuery( 
+    				new SpanTermQuery( new Term("base", "r@:func=obj")),
+    				true), 
+    			true
+    	);
+    	
+    	kr = ki.search(wq,(short) 10);
+    	assertEquals((long) 1, kr.getTotalResults());
+    	assertEquals(2,kr.getMatch(0).getStartPos()); // element
+    	assertEquals(4,kr.getMatch(0).getEndPos());
+
+    	// target of a dependency relation		
+    	srq = new SpanRelationQuery(
+    			new SpanTermQuery(new Term("base", "<:dep")), true);
+    	kr = ki.search(srq,(short) 10);
+    	
+    	assertEquals((long) 6, kr.getTotalResults());
+
+    	// target of a dependency relation, which is also a head
+    	wq = new SpanWithAttributeQuery(srq, 
+    				new SpanAttributeQuery( 
+    					new SpanTermQuery( new Term("base", "r@:func=head")),
+    					true), 
+    				true
+    		);
+    	
+    	kr = ki.search(wq,(short) 20);
+    	// for (Match km : kr.getMatches()) {
+    	// System.out.println(km.getStartPos() + "," + km.getEndPos() + " "
+    	// + km.getSnippetBrackets());
+    	// }
+    	assertEquals((long) 2, kr.getTotalResults());
+    	assertEquals(3, kr.getMatch(0).getStartPos());
+    	assertEquals(4,kr.getMatch(0).getEndPos());
+    	assertEquals(6, kr.getMatch(1).getStartPos());
+    	assertEquals(7, kr.getMatch(1).getEndPos());
+    	
+    }
+    
+    // FOCUS has not sorted
+    /** Relation with variable
+     * 	match right, return left
+     * 	sort by right, then sort by left
+     * @throws IOException 
+     * */
+    /*@Test
+    public void testCase4() throws IOException {
+    	ki.addDoc(createFieldDoc2());
+    	ki.commit();
+    	
+    	//return all children of np
+    	SpanQuery rv = new SpanFocusQuery(
+    	    new SpanSegmentQuery(
+    		    new SpanRelationQuery(
+    		       new SpanTermQuery(new Term("base","<:child-of")), true), 
+    		       new SpanElementQuery("base","np"),
+    		true),
+    	(byte) 2);
+    			
+    	kr = ki.search(rv,(short) 10);
+    	for (Match km : kr.getMatches()) {
+    		System.out.println(km.getStartPos() + "," + km.getEndPos() 
+    		// + " "+ km.getSnippetBrackets()
+    				);
+    	}
+
+    	assertEquals((long) 7, kr.getTotalResults());
+    	assertEquals(0,kr.getMatch(0).getStartPos());
+    	assertEquals(1,kr.getMatch(0).getEndPos());
+    	assertEquals(2,kr.getMatch(1).getStartPos());
+    	assertEquals(3,kr.getMatch(1).getEndPos());
+    	assertEquals(2,kr.getMatch(2).getStartPos());
+    	assertEquals(4,kr.getMatch(2).getEndPos());
+    	assertEquals(3,kr.getMatch(3).getStartPos());
+    	assertEquals(4,kr.getMatch(3).getEndPos());
+    	assertEquals(4,kr.getMatch(4).getStartPos());
+    	assertEquals(7,kr.getMatch(4).getEndPos());
+    	assertEquals(5,kr.getMatch(5).getStartPos());
+    	assertEquals(6,kr.getMatch(5).getEndPos());
+    	assertEquals(6,kr.getMatch(6).getStartPos());
+    	assertEquals(7,kr.getMatch(6).getEndPos());		
+    	// sorting left problem (solved)
+    	
+    	//return all children of np that are articles
+    	SpanSegmentQuery rv2 = new SpanSegmentQuery(rv, new SpanTermQuery(new Term("base","pos:ART")));		
+    	kr = ki.search(rv2,(short) 10);
+    			
+    	assertEquals((long) 2, kr.getTotalResults());
+    	assertEquals(2,kr.getMatch(0).getStartPos());
+    	assertEquals(3,kr.getMatch(0).getEndPos());
+    	assertEquals(5,kr.getMatch(1).getStartPos());
+    	assertEquals(6,kr.getMatch(1).getEndPos());
+    	
+    	// return all nps whose children are articles
+    	/*SpanRelationPartQuery rv3 = 
+    		new SpanRelationPartQuery(rv, 
+    			new SpanTermWithIdQuery(new Term("base","pos:ART"), true), 
+    			false, true, true); 
+    	kr = ki.search(rv3,(short) 10);
+    	 
+    	assertEquals((long) 2, kr.getTotalResults());
+    	assertEquals(2,kr.getMatch(0).getStartPos());
+    	assertEquals(4,kr.getMatch(0).getEndPos());
+    	assertEquals(5,kr.getMatch(1).getStartPos());
+    	assertEquals(7,kr.getMatch(1).getEndPos());
+    	
+    	*/
+    //}
+
+    /**
+     * Match left return left
+     * Match right return right
+     * */
+    @Test
+    public void testCase5 () throws IOException {
         ki.addDoc(createFieldDoc2());
         ki.commit();
-        
+
         // return all children that are NP
-		SpanQuery rv = new SpanSegmentQuery(
-		    new SpanRelationQuery(
-		       new SpanTermQuery(new Term("base",">:child-of")), true), 
-		       new SpanElementQuery("base","np"),
-		    true);
-                
-        kr = ki.search(rv,(short) 10);
+        SpanQuery rv = new SpanSegmentQuery(new SpanRelationQuery(
+                new SpanTermQuery(new Term("base", ">:child-of")), true),
+                new SpanElementQuery("base", "np"), true);
+
+        kr = ki.search(rv, (short) 10);
 
         assertEquals(4, kr.getTotalResults());
-        assertEquals(0,kr.getMatch(0).getStartPos());
-        assertEquals(1,kr.getMatch(0).getEndPos());
-        assertEquals(2,kr.getMatch(1).getStartPos());
-        assertEquals(4,kr.getMatch(1).getEndPos());
-        assertEquals(2,kr.getMatch(2).getStartPos());
-        assertEquals(7,kr.getMatch(2).getEndPos());
-        assertEquals(5,kr.getMatch(3).getStartPos());
-        assertEquals(7,kr.getMatch(3).getEndPos());
-        
+        assertEquals(0, kr.getMatch(0).getStartPos());
+        assertEquals(1, kr.getMatch(0).getEndPos());
+        assertEquals(2, kr.getMatch(1).getStartPos());
+        assertEquals(4, kr.getMatch(1).getEndPos());
+        assertEquals(2, kr.getMatch(2).getStartPos());
+        assertEquals(7, kr.getMatch(2).getEndPos());
+        assertEquals(5, kr.getMatch(3).getStartPos());
+        assertEquals(7, kr.getMatch(3).getEndPos());
+
         // return all parents that are NP
-		rv = new SpanSegmentQuery(
-            new SpanRelationQuery(
-                new SpanTermQuery(new Term("base", "<:child-of")), true), 
-            new SpanElementQuery("base", "np"), 
-            true);
-                
-        kr = ki.search(rv,(short) 10);
+        rv = new SpanSegmentQuery(new SpanRelationQuery(new SpanTermQuery(
+                new Term("base", "<:child-of")), true), new SpanElementQuery(
+                "base", "np"), true);
+
+        kr = ki.search(rv, (short) 10);
 
         assertEquals(7, kr.getTotalResults());
-        assertEquals(0,kr.getMatch(0).getStartPos());
-        assertEquals(1,kr.getMatch(0).getEndPos());
-        assertEquals(2,kr.getMatch(1).getStartPos());
-        assertEquals(4,kr.getMatch(1).getEndPos());
-        assertEquals(2,kr.getMatch(2).getStartPos());
-        assertEquals(4,kr.getMatch(2).getEndPos());
-        assertEquals(2,kr.getMatch(3).getStartPos());
-        assertEquals(7,kr.getMatch(3).getEndPos());
-        assertEquals(2,kr.getMatch(4).getStartPos());
-        assertEquals(7,kr.getMatch(4).getEndPos());
-        assertEquals(5,kr.getMatch(5).getStartPos());
-        assertEquals(7,kr.getMatch(5).getEndPos());
-        assertEquals(5,kr.getMatch(6).getStartPos());
-        assertEquals(7,kr.getMatch(6).getEndPos());     
-   }
-	
-	// FOCUS has not sorted
-	/** Match left, return right
-	 * 	sort by left, then sort by right
-	 * */
-	/*@Test
-	public void testCase7() throws IOException {
-		ki.addDoc(createFieldDoc2());
-		ki.commit();
-		
-		// return all children that are NP
-		SpanQuery rv = new SpanSegmentQuery(
-		    new SpanRelationQuery(
-		       new SpanTermQuery(new Term("base",">:child-of")), true), 
-		       new SpanElementQuery("base","np"),
-		    true);
-		
-		//return all parents of np
-		SpanQuery rv2 = new SpanFocusQuery(rv, (byte) 2);
-		kr = ki.search(rv2, (short) 10);
-		for (Match km : kr.getMatches()) {
-			System.out.println(km.getStartPos() + "," + km.getEndPos()
-			// + " "+ km.getSnippetBrackets()
-					);
-		}
-		assertEquals((long) 4, kr.getTotalResults());
-		assertEquals(0,kr.getMatch(0).getStartPos());
-		assertEquals(7,kr.getMatch(0).getEndPos());
-		assertEquals(1,kr.getMatch(1).getStartPos());
-		assertEquals(7,kr.getMatch(1).getEndPos());
-		assertEquals(2,kr.getMatch(2).getStartPos());
-		assertEquals(7,kr.getMatch(2).getEndPos());
-		assertEquals(4,kr.getMatch(3).getStartPos());
-		assertEquals(7,kr.getMatch(3).getEndPos());
-		// id problem (solved)
+        assertEquals(0, kr.getMatch(0).getStartPos());
+        assertEquals(1, kr.getMatch(0).getEndPos());
+        assertEquals(2, kr.getMatch(1).getStartPos());
+        assertEquals(4, kr.getMatch(1).getEndPos());
+        assertEquals(2, kr.getMatch(2).getStartPos());
+        assertEquals(4, kr.getMatch(2).getEndPos());
+        assertEquals(2, kr.getMatch(3).getStartPos());
+        assertEquals(7, kr.getMatch(3).getEndPos());
+        assertEquals(2, kr.getMatch(4).getStartPos());
+        assertEquals(7, kr.getMatch(4).getEndPos());
+        assertEquals(5, kr.getMatch(5).getStartPos());
+        assertEquals(7, kr.getMatch(5).getEndPos());
+        assertEquals(5, kr.getMatch(6).getStartPos());
+        assertEquals(7, kr.getMatch(6).getEndPos());
+    }
 
-		// return all parents of np that are PP
-		
-	}
-	
-	/** Relations whose source/target do not embed 
-	 * 	its counterparts.
-	 * */	
-	@Test
-	public void testCase8() throws IOException {
-		ki.addDoc(createFieldDoc2());
-		ki.commit();
-		
-		//return source of dep relations to pos:NN
-		SpanQuery rv = new SpanFocusQuery( 
-		        new SpanSegmentQuery(
-				    new SpanRelationQuery(
-                        new SpanTermQuery(new Term("base", "<:dep")), true), 
-				    new SpanTermWithIdQuery(new Term("base","pos:NN"), true), 
-		        true),
-        (byte) 2);
 
-		kr = ki.search(rv,(short) 10);
-		assertEquals((long) 3, kr.getTotalResults());
-		assertEquals(1,kr.getMatch(0).getStartPos());
-		assertEquals(2,kr.getMatch(0).getEndPos());
-		assertEquals(1,kr.getMatch(1).getStartPos());
-		assertEquals(2,kr.getMatch(1).getEndPos());
-		assertEquals(4,kr.getMatch(2).getStartPos());
-		assertEquals(5,kr.getMatch(2).getEndPos());
-		
-		//return target of dep relations from pos:NN
-		rv = new SpanFocusQuery( 
-		        new SpanSegmentQuery(
-				    new SpanRelationQuery(
-                        new SpanTermQuery(new Term("base", ">:dep")), true), 
-				    new SpanTermWithIdQuery(new Term("base","pos:NN"), true), 
-		        true),
-        (byte) 2);
-		kr = ki.search(rv,(short) 10);
-		assertEquals((long) 3, kr.getTotalResults());
-		assertEquals(2,kr.getMatch(0).getStartPos());
-		assertEquals(3,kr.getMatch(0).getEndPos());
-		assertEquals(4,kr.getMatch(1).getStartPos());
-		assertEquals(5,kr.getMatch(1).getEndPos());
-		assertEquals(5,kr.getMatch(2).getStartPos());
-		assertEquals(6,kr.getMatch(2).getEndPos());
+    // FOCUS has not sorted
+    /**
+     * Match left, return right
+     * sort by left, then sort by right
+     * */
+    /*@Test
+    public void testCase7() throws IOException {
+    	ki.addDoc(createFieldDoc2());
+    	ki.commit();
+    	
+    	// return all children that are NP
+    	SpanQuery rv = new SpanSegmentQuery(
+    	    new SpanRelationQuery(
+    	       new SpanTermQuery(new Term("base",">:child-of")), true), 
+    	       new SpanElementQuery("base","np"),
+    	    true);
+    	
+    	//return all parents of np
+    	SpanQuery rv2 = new SpanFocusQuery(rv, (byte) 2);
+    	kr = ki.search(rv2, (short) 10);
+    	for (Match km : kr.getMatches()) {
+    		System.out.println(km.getStartPos() + "," + km.getEndPos()
+    		// + " "+ km.getSnippetBrackets()
+    				);
+    	}
+    	assertEquals((long) 4, kr.getTotalResults());
+    	assertEquals(0,kr.getMatch(0).getStartPos());
+    	assertEquals(7,kr.getMatch(0).getEndPos());
+    	assertEquals(1,kr.getMatch(1).getStartPos());
+    	assertEquals(7,kr.getMatch(1).getEndPos());
+    	assertEquals(2,kr.getMatch(2).getStartPos());
+    	assertEquals(7,kr.getMatch(2).getEndPos());
+    	assertEquals(4,kr.getMatch(3).getStartPos());
+    	assertEquals(7,kr.getMatch(3).getEndPos());
+    	// id problem (solved)
 
-	}
-	
+    	// return all parents of np that are PP
+    	
+    }
+    
+    /** Relations whose source/target do not embed 
+     * 	its counterparts.
+     * */
+    @Test
+    public void testCase8 () throws IOException {
+        ki.addDoc(createFieldDoc2());
+        ki.commit();
+
+        //return source of dep relations to pos:NN
+        SpanQuery rv = new SpanFocusQuery(new SpanSegmentQuery(
+                new SpanRelationQuery(new SpanTermQuery(new Term("base",
+                        "<:dep")), true), new SpanTermWithIdQuery(new Term(
+                        "base", "pos:NN"), true), true), (byte) 2);
+
+        kr = ki.search(rv, (short) 10);
+        assertEquals((long) 3, kr.getTotalResults());
+        assertEquals(1, kr.getMatch(0).getStartPos());
+        assertEquals(2, kr.getMatch(0).getEndPos());
+        assertEquals(1, kr.getMatch(1).getStartPos());
+        assertEquals(2, kr.getMatch(1).getEndPos());
+        assertEquals(4, kr.getMatch(2).getStartPos());
+        assertEquals(5, kr.getMatch(2).getEndPos());
+
+        //return target of dep relations from pos:NN
+        rv = new SpanFocusQuery(
+                new SpanSegmentQuery(new SpanRelationQuery(new SpanTermQuery(
+                        new Term("base", ">:dep")), true),
+                        new SpanTermWithIdQuery(new Term("base", "pos:NN"),
+                                true), true), (byte) 2);
+        kr = ki.search(rv, (short) 10);
+        assertEquals((long) 3, kr.getTotalResults());
+        assertEquals(2, kr.getMatch(0).getStartPos());
+        assertEquals(3, kr.getMatch(0).getEndPos());
+        assertEquals(4, kr.getMatch(1).getStartPos());
+        assertEquals(5, kr.getMatch(1).getEndPos());
+        assertEquals(5, kr.getMatch(2).getStartPos());
+        assertEquals(6, kr.getMatch(2).getEndPos());
+
+    }
+
 }
\ No newline at end of file
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestRepetitionIndex.java b/src/test/java/de/ids_mannheim/korap/index/TestRepetitionIndex.java
index 087bd9f..63093fc 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestRepetitionIndex.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestRepetitionIndex.java
@@ -17,160 +17,147 @@
 import de.ids_mannheim.korap.query.SpanRepetitionQuery;
 
 public class TestRepetitionIndex {
-	
-    private KrillIndex ki;
-	private Result kr;
 
-	private FieldDocument createFieldDoc0(){
-    	FieldDocument fd = new FieldDocument();
+    private KrillIndex ki;
+    private Result kr;
+
+
+    private FieldDocument createFieldDoc0 () {
+        FieldDocument fd = new FieldDocument();
         fd.addString("ID", "doc-0");
-        fd.addTV("base",
-            "text",             
-            "[(0-1)s:c|_1#0-1]" +
-            "[(1-2)s:e|_2#1-2]" +             
-            "[(2-3)s:c|_3#2-3|<>:y#2-4$<i>4]" +
-            "[(3-4)s:c|s:b|_4#3-4|<>:x#3-7$<i>7]" + 
-            "[(4-5)s:e|s:d|_5#4-5|<>:y#4-6$<i>6]" +             
-            "[(5-6)s:c|_6#5-6|<>:y#5-8$<i>8]" +
-            "[(6-7)s:d|_7#6-7]" +
-            "[(7-8)s:e|_8#7-8|<>:x#7-9$<i>9]" + 
-            "[(8-9)s:e|s:b|_9#8-9|<>:x#8-10$<i>10]" + 
-            "[(9-10)s:d|_10#9-10]");
+        fd.addTV("base", "text", "[(0-1)s:c|_1#0-1]" + "[(1-2)s:e|_2#1-2]"
+                + "[(2-3)s:c|_3#2-3|<>:y#2-4$<i>4]"
+                + "[(3-4)s:c|s:b|_4#3-4|<>:x#3-7$<i>7]"
+                + "[(4-5)s:e|s:d|_5#4-5|<>:y#4-6$<i>6]"
+                + "[(5-6)s:c|_6#5-6|<>:y#5-8$<i>8]" + "[(6-7)s:d|_7#6-7]"
+                + "[(7-8)s:e|_8#7-8|<>:x#7-9$<i>9]"
+                + "[(8-9)s:e|s:b|_9#8-9|<>:x#8-10$<i>10]"
+                + "[(9-10)s:d|_10#9-10]");
         return fd;
     }
-	
-	private FieldDocument createFieldDoc1() {
-    	FieldDocument fd = new FieldDocument();
-        fd.addString("ID", "doc-1");
-        fd.addTV("base",
-            "text",             
-            "[(0-1)s:b|_1#0-1]" +
-            "[(1-2)s:e|_2#1-2]" +             
-            "[(2-3)s:c|_3#2-3]" +
-            "[(3-4)s:c|s:d]" + 
-            "[(4-5)s:d|s:c|_5#4-5]" +             
-            "[(5-6)s:e|s:c|_6#5-6]" +
-    		"[(6-7)s:e|_7#6-7]" +	
-	        "[(7-8)s:c|_8#7-8]" + 
-	        "[(8-9)s:d|_9#8-9]" + 
-	        "[(9-10)s:d|_10#9-10]");
-        return fd;
-	}
-	
-	private FieldDocument createFieldDoc2() {
-    	FieldDocument fd = new FieldDocument();
-        fd.addString("ID", "doc-2");
-        fd.addTV("base",
-            "text",             
-            "[(0-1)s:b|s:c|_1#0-1|<>:s#0-2$<i>1]" +
-            "[(1-2)s:c|_2#1-2]" +             
-            "[(2-3)s:b|_3#2-3|<>:s#2-3$<i>3]" +
-            "[(3-4)s:c|_4#3-4|<>:s#3-4$<i>4]" + 
-            "[(4-5)s:c|_5#4-5|<>:s#4-5$<i>5]" +             
-            "[(5-6)s:b|_6#5-6]" +
-            "[(6-7)s:c|_7#6-7|<>:s#6-7$<i>7]");
-        return fd;
-	}
-	
-	private FieldDocument createFieldDoc3() {
-    	FieldDocument fd = new FieldDocument();
-        fd.addString("ID", "doc-3");
-        fd.addTV("base",
-            "text",             
-            "[(0-1)s:a|_1#0-1|<>:s#0-2$<i>1]" +
-            "[(1-2)s:d|_2#1-2|<>:s#1-2$<i>3]" +             
-            "[(2-3)s:e|_3#2-3]");	
-        return fd;
-	}
 
-	@Test
-	public void testCase1() throws IOException{
-		ki = new KrillIndex();
+
+    private FieldDocument createFieldDoc1 () {
+        FieldDocument fd = new FieldDocument();
+        fd.addString("ID", "doc-1");
+        fd.addTV("base", "text", "[(0-1)s:b|_1#0-1]" + "[(1-2)s:e|_2#1-2]"
+                + "[(2-3)s:c|_3#2-3]" + "[(3-4)s:c|s:d]"
+                + "[(4-5)s:d|s:c|_5#4-5]" + "[(5-6)s:e|s:c|_6#5-6]"
+                + "[(6-7)s:e|_7#6-7]" + "[(7-8)s:c|_8#7-8]"
+                + "[(8-9)s:d|_9#8-9]" + "[(9-10)s:d|_10#9-10]");
+        return fd;
+    }
+
+
+    private FieldDocument createFieldDoc2 () {
+        FieldDocument fd = new FieldDocument();
+        fd.addString("ID", "doc-2");
+        fd.addTV("base", "text", "[(0-1)s:b|s:c|_1#0-1|<>:s#0-2$<i>1]"
+                + "[(1-2)s:c|_2#1-2]" + "[(2-3)s:b|_3#2-3|<>:s#2-3$<i>3]"
+                + "[(3-4)s:c|_4#3-4|<>:s#3-4$<i>4]"
+                + "[(4-5)s:c|_5#4-5|<>:s#4-5$<i>5]" + "[(5-6)s:b|_6#5-6]"
+                + "[(6-7)s:c|_7#6-7|<>:s#6-7$<i>7]");
+        return fd;
+    }
+
+
+    private FieldDocument createFieldDoc3 () {
+        FieldDocument fd = new FieldDocument();
+        fd.addString("ID", "doc-3");
+        fd.addTV("base", "text", "[(0-1)s:a|_1#0-1|<>:s#0-2$<i>1]"
+                + "[(1-2)s:d|_2#1-2|<>:s#1-2$<i>3]" + "[(2-3)s:e|_3#2-3]");
+        return fd;
+    }
+
+
+    @Test
+    public void testCase1 () throws IOException {
+        ki = new KrillIndex();
         ki.addDoc(createFieldDoc0());
         ki.commit();
-        
+
         SpanQuery sq, sq2;
         // Quantifier only
         // c{1,2}
-        sq = new SpanRepetitionQuery(new SpanTermQuery(new Term("base","s:c")),1,2, true);
+        sq = new SpanRepetitionQuery(
+                new SpanTermQuery(new Term("base", "s:c")), 1, 2, true);
         kr = ki.search(sq, (short) 10);
         // 0-1, 2-3, 2-4, 3-4, 5-6
-        assertEquals((long) 5,kr.getTotalResults());        
-        
+        assertEquals((long) 5, kr.getTotalResults());
+
         // ec{1,2}
-        sq = new SpanNextQuery(
-        		new SpanTermQuery(new Term("base", "s:e")),
-        		new SpanRepetitionQuery(new SpanTermQuery(new Term("base","s:c")),1,2, true)
-    		);
-        
+        sq = new SpanNextQuery(new SpanTermQuery(new Term("base", "s:e")),
+                new SpanRepetitionQuery(new SpanTermQuery(new Term("base",
+                        "s:c")), 1, 2, true));
+
         kr = ki.search(sq, (short) 10);
         // 1-3, 1-4, 4-6
-        assertEquals((long) 3, kr.getTotalResults());   
-        
+        assertEquals((long) 3, kr.getTotalResults());
+
         // ec{1,2}d
-        sq2 = new SpanNextQuery(sq, new SpanTermQuery(new Term("base", "s:d")));        
-        kr = ki.search(sq2, (short) 10);        
-        assertEquals((long) 2,kr.getTotalResults());
+        sq2 = new SpanNextQuery(sq, new SpanTermQuery(new Term("base", "s:d")));
+        kr = ki.search(sq2, (short) 10);
+        assertEquals((long) 2, kr.getTotalResults());
         assertEquals(1, kr.getMatch(0).startPos);
         assertEquals(5, kr.getMatch(0).endPos);
         assertEquals(4, kr.getMatch(1).startPos);
         assertEquals(7, kr.getMatch(1).endPos);
-        
+
         // Multiple documents        
         ki.addDoc(createFieldDoc1());
         ki.commit();
         kr = ki.search(sq2, (short) 10);
         assertEquals((long) 5, kr.getTotalResults());
-	}
-	
-	/** Skip to */
-	@Test
-	public void testCase2() throws IOException{
-		ki = new KrillIndex();
+    }
+
+
+    /** Skip to */
+    @Test
+    public void testCase2 () throws IOException {
+        ki = new KrillIndex();
         ki.addDoc(createFieldDoc0());
         ki.addDoc(createFieldDoc3());
         ki.addDoc(createFieldDoc2());
         ki.addDoc(createFieldDoc1());
         ki.commit();
-        
+
         SpanQuery sq;
         // c{2,2}
-        sq = new SpanRepetitionQuery(new SpanTermQuery(new Term("base","s:c")),2,2, true);
+        sq = new SpanRepetitionQuery(
+                new SpanTermQuery(new Term("base", "s:c")), 2, 2, true);
         kr = ki.search(sq, (short) 10);
         // doc1 2-4, 3-5, 4-6
-        assertEquals((long)6,kr.getTotalResults());
-        
+        assertEquals((long) 6, kr.getTotalResults());
+
         // ec{2,2}
-        kr = ki.search(sq, (short) 10); 
-        sq = new SpanNextQuery(
-        		new SpanTermQuery(new Term("base", "s:e")),
-        		new SpanRepetitionQuery(new SpanTermQuery(new Term("base","s:c")),2,2, true)
-    		);
-        
-        kr = ki.search(sq, (short) 10); 
-        assertEquals((long)2,kr.getTotalResults());
-        assertEquals(3,kr.getMatch(1).getLocalDocID());        
-       
-	}
-	
-	/** OR */
-	@Test
-	public void testCase3() throws IOException{
-		ki = new KrillIndex();
+        kr = ki.search(sq, (short) 10);
+        sq = new SpanNextQuery(new SpanTermQuery(new Term("base", "s:e")),
+                new SpanRepetitionQuery(new SpanTermQuery(new Term("base",
+                        "s:c")), 2, 2, true));
+
+        kr = ki.search(sq, (short) 10);
+        assertEquals((long) 2, kr.getTotalResults());
+        assertEquals(3, kr.getMatch(1).getLocalDocID());
+
+    }
+
+
+    /** OR */
+    @Test
+    public void testCase3 () throws IOException {
+        ki = new KrillIndex();
         ki.addDoc(createFieldDoc0());
         ki.commit();
-        
-        SpanQuery sq,sq2;
-     // ec{1,2}
-        sq = new SpanNextQuery(
-        		new SpanTermQuery(new Term("base", "s:e")),
-        		new SpanOrQuery(
-    				new SpanRepetitionQuery(new SpanTermQuery(new Term("base","s:c")),1,1, true),
-    				new SpanRepetitionQuery(new SpanTermQuery(new Term("base","s:b")),1,1, true)
-				)
-    		);        
-        kr = ki.search(sq, (short) 10); 
-        assertEquals((long)3,kr.getTotalResults());
+
+        SpanQuery sq, sq2;
+        // ec{1,2}
+        sq = new SpanNextQuery(new SpanTermQuery(new Term("base", "s:e")),
+                new SpanOrQuery(new SpanRepetitionQuery(new SpanTermQuery(
+                        new Term("base", "s:c")), 1, 1, true),
+                        new SpanRepetitionQuery(new SpanTermQuery(new Term(
+                                "base", "s:b")), 1, 1, true)));
+        kr = ki.search(sq, (short) 10);
+        assertEquals((long) 3, kr.getTotalResults());
         assertEquals(1, kr.getMatch(0).startPos);
         assertEquals(3, kr.getMatch(0).endPos);
         assertEquals(4, kr.getMatch(1).startPos);
@@ -178,66 +165,68 @@
         assertEquals(7, kr.getMatch(2).startPos);
         assertEquals(9, kr.getMatch(2).endPos);
 
-	}
-	
-	@Test
-	public void testCase4() throws IOException {
-		ki = new KrillIndex();
+    }
+
+
+    @Test
+    public void testCase4 () throws IOException {
+        ki = new KrillIndex();
         ki.addDoc(createFieldDoc1());
         ki.commit();
-        
-		SpanQuery sq;
+
+        SpanQuery sq;
         // c{2,2}
-        sq = new SpanRepetitionQuery(new SpanTermQuery(new Term("base","s:c")),1,3, true);
+        sq = new SpanRepetitionQuery(
+                new SpanTermQuery(new Term("base", "s:c")), 1, 3, true);
         kr = ki.search(sq, (short) 10);
         // 2-3, 2-4, 2-5, 3-4, 3-5, 3-6, 4-5, 4-6, 5-6, 7-8  
-        assertEquals((long)10,kr.getTotalResults());
-        
-        sq = new SpanRepetitionQuery(new SpanTermQuery(new Term("base","s:c")),2,3, true);
+        assertEquals((long) 10, kr.getTotalResults());
+
+        sq = new SpanRepetitionQuery(
+                new SpanTermQuery(new Term("base", "s:c")), 2, 3, true);
         kr = ki.search(sq, (short) 10);
         // 2-4, 2-5, 3-5, 3-6, 4-6 
-        assertEquals((long)5,kr.getTotalResults());
-        
-//        System.out.print(kr.getTotalResults()+"\n");
-//		for (int i=0; i< kr.getTotalResults(); i++){
-//			System.out.println(
-//				kr.match(i).getLocalDocID()+" "+
-//				kr.match(i).startPos + " " +
-//				kr.match(i).endPos
-//			);
-//		}
-	}
-	
-	@Test
-	public void testCase5() throws IOException {
-		ki = new KrillIndex();
-	    ki.addDoc(
-	        getClass().getResourceAsStream("/wiki/00001.json.gz"), true
-        );
-		ki.commit();
-		
-		SpanQuery sq0, sq1, sq2;
-		sq0 = new SpanTermQuery(new Term("tokens", "tt/p:NN"));
-		sq1 = new SpanRepetitionQuery(new SpanTermQuery(new Term("tokens","tt/p:ADJA")),2,3, true);
-        sq2 = new SpanNextQuery(sq1,sq0);        
+        assertEquals((long) 5, kr.getTotalResults());
+
+        //        System.out.print(kr.getTotalResults()+"\n");
+        //		for (int i=0; i< kr.getTotalResults(); i++){
+        //			System.out.println(
+        //				kr.match(i).getLocalDocID()+" "+
+        //				kr.match(i).startPos + " " +
+        //				kr.match(i).endPos
+        //			);
+        //		}
+    }
+
+
+    @Test
+    public void testCase5 () throws IOException {
+        ki = new KrillIndex();
+        ki.addDoc(getClass().getResourceAsStream("/wiki/00001.json.gz"), true);
+        ki.commit();
+
+        SpanQuery sq0, sq1, sq2;
+        sq0 = new SpanTermQuery(new Term("tokens", "tt/p:NN"));
+        sq1 = new SpanRepetitionQuery(new SpanTermQuery(new Term("tokens",
+                "tt/p:ADJA")), 2, 3, true);
+        sq2 = new SpanNextQuery(sq1, sq0);
         kr = ki.search(sq2, (short) 10);
-        
-        assertEquals((long)2,kr.getTotalResults());
+
+        assertEquals((long) 2, kr.getTotalResults());
         assertEquals(73, kr.getMatch(0).getStartPos());
         assertEquals(77, kr.getMatch(0).getEndPos());
         assertEquals(74, kr.getMatch(1).getStartPos());
         assertEquals(77, kr.getMatch(1).getEndPos());
-       /* for (Match km : kr.getMatches()){
-        	System.out.println(km.getSnippetBrackets());
-        	System.out.println(km.getStartPos() +","+km.getEndPos());
-        }*/
-        
-        sq2 = new SpanNextQuery(
-        		new SpanTermQuery(new Term("tokens", "s:offenen")),
-        		sq2);
+        /* for (Match km : kr.getMatches()){
+         	System.out.println(km.getSnippetBrackets());
+         	System.out.println(km.getStartPos() +","+km.getEndPos());
+         }*/
+
+        sq2 = new SpanNextQuery(new SpanTermQuery(new Term("tokens",
+                "s:offenen")), sq2);
         kr = ki.search(sq2, (short) 10);
-        
-        assertEquals((long)1,kr.getTotalResults());
+
+        assertEquals((long) 1, kr.getTotalResults());
         assertEquals(73, kr.getMatch(0).getStartPos());
         assertEquals(77, kr.getMatch(0).getEndPos());
         /*
@@ -245,5 +234,5 @@
         	System.out.println(km.getSnippetBrackets());
         	System.out.println(km.getStartPos() +","+km.getEndPos());
         }*/
-	}
+    }
 }
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestSegmentIndex.java b/src/test/java/de/ids_mannheim/korap/index/TestSegmentIndex.java
index 01e9aa3..da6851e 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestSegmentIndex.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestSegmentIndex.java
@@ -24,213 +24,198 @@
 
 @RunWith(JUnit4.class)
 public class TestSegmentIndex {
-	private SpanQuery sq;
-	private KrillIndex ki;
-	private Result kr;
-	private FieldDocument fd;
-	private Logger log;	
-	
-	public TestSegmentIndex() throws IOException {
-		ki = new KrillIndex();
-		ki.addDoc(createFieldDoc0());
-		ki.addDoc(createFieldDoc1());
-		ki.addDoc(createFieldDoc2());
-		ki.commit();
-		
-		log = LoggerFactory.getLogger(getClass());
-	}
+    private SpanQuery sq;
+    private KrillIndex ki;
+    private Result kr;
+    private FieldDocument fd;
+    private Logger log;
 
-	/** Multiple matches in one document. */
-	@Test
-	public void testCase1() throws IOException {
-		sq = new SpanSegmentQuery(
-				new SpanTermQuery(new Term("base","s:b")),
-				new SpanTermQuery(new Term("base","s:c"))
-		);
-		
-		kr = ki.search(sq, (short) 10);
-		ki.close();
-		
-		assertEquals("totalResults", kr.getTotalResults(), 3);
-		assertEquals("StartPos (0)", 1, kr.getMatch(0).startPos);
-		assertEquals("EndPos (0)", 2, kr.getMatch(0).endPos);
-		assertEquals("StartPos (1)", 4, kr.getMatch(1).startPos);
-		assertEquals("EndPos (1)", 5, kr.getMatch(1).endPos);		
-	}
-	
-	/** Matches in multiple documents.
-	 * 	Ensure the same document. The current secondspan is skipped to 
-	 * 	the doc number of the firstspan.  */
-	@Test
-	public void testCase2() throws IOException {		
-//		log.trace("Testcase2");
-		sq = new SpanSegmentQuery(
-				new SpanTermQuery(new Term("base","s:a")),				
-				new SpanTermQuery(new Term("base","s:b"))
-		);
-		
-		kr = ki.search(sq, (short) 10);
-		ki.close();
-				
-		assertEquals("totalResults", kr.getTotalResults(), 3);
-		// Match #0
-		assertEquals("doc-number", 1, kr.getMatch(0).getLocalDocID());
-		assertEquals("StartPos", 1, kr.getMatch(0).startPos);
-		assertEquals("EndPos", 2, kr.getMatch(0).endPos);
-		// Match #2
-		assertEquals("doc-number", 2, kr.getMatch(2).getLocalDocID());
-		assertEquals("StartPos", 2, kr.getMatch(2).startPos);
-		assertEquals("EndPos", 3, kr.getMatch(2).endPos);		
-	}
-	
-	
-	/** Ensure the same document, skip to a greater doc number */
-	@Test
-	public void testCase3() throws IOException{
-//		log.trace("Testcase3");
-		sq = new SpanSegmentQuery(
-				new SpanTermQuery(new Term("base","s:d")),
-				new SpanTermQuery(new Term("base","s:b"))
-		);
-		
-		kr = ki.search(sq, (short) 10);
-		ki.close();
-		
-		assertEquals("totalResults", kr.getTotalResults(), 1);
-		assertEquals("doc-number", 2, kr.getMatch(0).getLocalDocID());
-		assertEquals("StartPos (0)", 1, kr.getMatch(0).startPos);
-		assertEquals("EndPos (0)", 2, kr.getMatch(0).endPos);		
-	}
-	
-	/** Matching a SpanElementQuery and a SpanNextQuery 
-	 * 	Multiple atomic indices
-	 * */
-	@Test
-	public void testCase4() throws IOException{
-//		log.trace("Testcase4");
-		
-		ki = new KrillIndex();
-		ki.addDoc(createFieldDoc0());
-		ki.commit();
-		ki.addDoc(createFieldDoc1());		
-		ki.addDoc(createFieldDoc2());
-		ki.commit();
-		
-		sq = new SpanSegmentQuery(
-				new SpanElementQuery("base","e"),
-				new SpanNextQuery(
-					new SpanTermQuery(new Term("base","s:a")),
-					new SpanTermQuery(new Term("base","s:b"))
-				)
-		);
-		
-		kr = ki.search(sq, (short) 10);
-		ki.close();
-		
-		assertEquals("totalResults", kr.getTotalResults(), 2);
-		// Match #0
-		assertEquals("doc-number", 0, kr.getMatch(0).getLocalDocID());
-		assertEquals("StartPos", 3, kr.getMatch(0).startPos);
-		assertEquals("EndPos", 5, kr.getMatch(0).endPos);
-		// Match #1
-		assertEquals("doc-number", 0, kr.getMatch(1).getLocalDocID());
-		assertEquals("StartPos", 1, kr.getMatch(1).startPos);
-		assertEquals("EndPos", 3, kr.getMatch(1).endPos);				
-	}
-	
-	/** Matching SpanElementQueries */
-	@Test
-	public void testCase5() throws IOException{
-//		log.trace("Testcase5");
-		sq = new SpanSegmentQuery(
-				new SpanElementQuery("base","e"),
-				new SpanElementQuery("base","e2")
-		);
-		
-		kr = ki.search(sq, (short) 10);
-		ki.close();			
-		
-		assertEquals("totalResults", kr.getTotalResults(), 1);
-		// Match #0
-		assertEquals("doc-number", 0, kr.getMatch(0).getLocalDocID());
-		assertEquals("StartPos", 3, kr.getMatch(0).startPos);
-		assertEquals("EndPos", 5, kr.getMatch(0).endPos);				
-	}
-		
-	/** Skip to SegmentSpan */
-	@Test
-	public void testcase6() throws IOException{
-		ki.addDoc(createFieldDoc4());
-		ki.commit();
-		sq = new SpanNextQuery(
-				new SpanSegmentQuery(
-					new SpanTermQuery(new Term("base","s:b")),
-					new SpanTermQuery(new Term("base","s:c"))
-				),
-				new SpanTermQuery(new Term("base","s:d"))
-			);		
-		
-		kr = ki.search(sq, (short) 10);
-		ki.close();
-		
-		assertEquals("totalResults", kr.getTotalResults(), 2);				
-		// Match #0
-		assertEquals("doc-number", 0, kr.getMatch(0).getLocalDocID());
-		assertEquals("StartPos (0)", 4, kr.getMatch(0).startPos);
-		assertEquals("EndPos (0)", 6, kr.getMatch(0).endPos);
-		// Match #1 in the other atomic index
-		assertEquals("doc-number", 0, kr.getMatch(1).getLocalDocID());
-		assertEquals("StartPos (0)", 0, kr.getMatch(1).startPos);
-		assertEquals("EndPos (0)", 2, kr.getMatch(1).endPos);
-	}
 
-    
-	private FieldDocument createFieldDoc0(){
-		fd = new FieldDocument();
-		fd.addString("ID", "doc-0");
-		fd.addTV("base",
-			 "bcbabd",			 
-			 "[(0-1)s:b|i:b|_1#0-1]" +
-			 "[(1-2)s:c|i:c|s:b|_2#1-2]" +			 
-			 "[(2-3)s:b|i:b|_3#2-3|<>:e#2-4$<i>4]" +
-			 "[(3-4)s:a|i:a|_4#3-4|<>:e#3-5$<i>5|<>:e2#3-5$<i>5]" + 
-			 "[(4-5)s:b|i:b|s:c|_5#4-5]" +			 
-			 "[(5-6)s:d|i:d|_6#5-6|<>:e2#5-6$<i>6]");
-		return fd;
-	}
-	
-	private FieldDocument createFieldDoc1(){
-		fd = new FieldDocument();
-		fd.addString("ID", "doc-1");
-		fd.addTV("base",
-			 "babaa",			 
-			 "[(0-1)s:b|i:b|s:c|_1#0-1]" +
-			 "[(1-2)s:a|i:a|s:b|_2#1-2|<>:e#1-3$<i>3]" +			 
-			 "[(2-3)s:b|i:b|s:a|_3#2-3]" +
-			 "[(3-4)s:a|i:a|_4#3-4]" +
-			 "[(4-5)s:a|i:a|_5#4-5]");
-		return fd;
-	} 
-	
-	private FieldDocument createFieldDoc2(){
-		fd = new FieldDocument();
-		fd.addString("ID", "doc-2");
-		fd.addTV("base",
-			 "bdb",			 
-			 "[(0-1)s:b|i:b|_1#0-1]" +
-			 "[(1-2)s:d|i:d|s:b|_2#1-2]"+
-			 "[(2-3)s:b|i:b|s:a|_3#2-3]");			 	
-		return fd;
-	}
-	
-	private FieldDocument createFieldDoc4(){
-		fd = new FieldDocument();
-		fd.addString("ID", "doc-4");
-		fd.addTV("base",
-			 "bdb",			 
-			 "[(0-1)s:b|i:b|s:c|_1#0-1]" +
-			 "[(1-2)s:d|_2#1-2]"+
-			 "[(2-3)s:d|i:d|_3#2-3]");			 	
-		return fd;
-	}
+    public TestSegmentIndex () throws IOException {
+        ki = new KrillIndex();
+        ki.addDoc(createFieldDoc0());
+        ki.addDoc(createFieldDoc1());
+        ki.addDoc(createFieldDoc2());
+        ki.commit();
+
+        log = LoggerFactory.getLogger(getClass());
+    }
+
+
+    /** Multiple matches in one document. */
+    @Test
+    public void testCase1 () throws IOException {
+        sq = new SpanSegmentQuery(new SpanTermQuery(new Term("base", "s:b")),
+                new SpanTermQuery(new Term("base", "s:c")));
+
+        kr = ki.search(sq, (short) 10);
+        ki.close();
+
+        assertEquals("totalResults", kr.getTotalResults(), 3);
+        assertEquals("StartPos (0)", 1, kr.getMatch(0).startPos);
+        assertEquals("EndPos (0)", 2, kr.getMatch(0).endPos);
+        assertEquals("StartPos (1)", 4, kr.getMatch(1).startPos);
+        assertEquals("EndPos (1)", 5, kr.getMatch(1).endPos);
+    }
+
+
+    /**
+     * Matches in multiple documents.
+     * Ensure the same document. The current secondspan is skipped to
+     * the doc number of the firstspan.
+     */
+    @Test
+    public void testCase2 () throws IOException {
+        //		log.trace("Testcase2");
+        sq = new SpanSegmentQuery(new SpanTermQuery(new Term("base", "s:a")),
+                new SpanTermQuery(new Term("base", "s:b")));
+
+        kr = ki.search(sq, (short) 10);
+        ki.close();
+
+        assertEquals("totalResults", kr.getTotalResults(), 3);
+        // Match #0
+        assertEquals("doc-number", 1, kr.getMatch(0).getLocalDocID());
+        assertEquals("StartPos", 1, kr.getMatch(0).startPos);
+        assertEquals("EndPos", 2, kr.getMatch(0).endPos);
+        // Match #2
+        assertEquals("doc-number", 2, kr.getMatch(2).getLocalDocID());
+        assertEquals("StartPos", 2, kr.getMatch(2).startPos);
+        assertEquals("EndPos", 3, kr.getMatch(2).endPos);
+    }
+
+
+    /** Ensure the same document, skip to a greater doc number */
+    @Test
+    public void testCase3 () throws IOException {
+        //		log.trace("Testcase3");
+        sq = new SpanSegmentQuery(new SpanTermQuery(new Term("base", "s:d")),
+                new SpanTermQuery(new Term("base", "s:b")));
+
+        kr = ki.search(sq, (short) 10);
+        ki.close();
+
+        assertEquals("totalResults", kr.getTotalResults(), 1);
+        assertEquals("doc-number", 2, kr.getMatch(0).getLocalDocID());
+        assertEquals("StartPos (0)", 1, kr.getMatch(0).startPos);
+        assertEquals("EndPos (0)", 2, kr.getMatch(0).endPos);
+    }
+
+
+    /**
+     * Matching a SpanElementQuery and a SpanNextQuery
+     * Multiple atomic indices
+     * */
+    @Test
+    public void testCase4 () throws IOException {
+        //		log.trace("Testcase4");
+
+        ki = new KrillIndex();
+        ki.addDoc(createFieldDoc0());
+        ki.commit();
+        ki.addDoc(createFieldDoc1());
+        ki.addDoc(createFieldDoc2());
+        ki.commit();
+
+        sq = new SpanSegmentQuery(new SpanElementQuery("base", "e"),
+                new SpanNextQuery(new SpanTermQuery(new Term("base", "s:a")),
+                        new SpanTermQuery(new Term("base", "s:b"))));
+
+        kr = ki.search(sq, (short) 10);
+        ki.close();
+
+        assertEquals("totalResults", kr.getTotalResults(), 2);
+        // Match #0
+        assertEquals("doc-number", 0, kr.getMatch(0).getLocalDocID());
+        assertEquals("StartPos", 3, kr.getMatch(0).startPos);
+        assertEquals("EndPos", 5, kr.getMatch(0).endPos);
+        // Match #1
+        assertEquals("doc-number", 0, kr.getMatch(1).getLocalDocID());
+        assertEquals("StartPos", 1, kr.getMatch(1).startPos);
+        assertEquals("EndPos", 3, kr.getMatch(1).endPos);
+    }
+
+
+    /** Matching SpanElementQueries */
+    @Test
+    public void testCase5 () throws IOException {
+        //		log.trace("Testcase5");
+        sq = new SpanSegmentQuery(new SpanElementQuery("base", "e"),
+                new SpanElementQuery("base", "e2"));
+
+        kr = ki.search(sq, (short) 10);
+        ki.close();
+
+        assertEquals("totalResults", kr.getTotalResults(), 1);
+        // Match #0
+        assertEquals("doc-number", 0, kr.getMatch(0).getLocalDocID());
+        assertEquals("StartPos", 3, kr.getMatch(0).startPos);
+        assertEquals("EndPos", 5, kr.getMatch(0).endPos);
+    }
+
+
+    /** Skip to SegmentSpan */
+    @Test
+    public void testcase6 () throws IOException {
+        ki.addDoc(createFieldDoc4());
+        ki.commit();
+        sq = new SpanNextQuery(new SpanSegmentQuery(new SpanTermQuery(new Term(
+                "base", "s:b")), new SpanTermQuery(new Term("base", "s:c"))),
+                new SpanTermQuery(new Term("base", "s:d")));
+
+        kr = ki.search(sq, (short) 10);
+        ki.close();
+
+        assertEquals("totalResults", kr.getTotalResults(), 2);
+        // Match #0
+        assertEquals("doc-number", 0, kr.getMatch(0).getLocalDocID());
+        assertEquals("StartPos (0)", 4, kr.getMatch(0).startPos);
+        assertEquals("EndPos (0)", 6, kr.getMatch(0).endPos);
+        // Match #1 in the other atomic index
+        assertEquals("doc-number", 0, kr.getMatch(1).getLocalDocID());
+        assertEquals("StartPos (0)", 0, kr.getMatch(1).startPos);
+        assertEquals("EndPos (0)", 2, kr.getMatch(1).endPos);
+    }
+
+
+    private FieldDocument createFieldDoc0 () {
+        fd = new FieldDocument();
+        fd.addString("ID", "doc-0");
+        fd.addTV("base", "bcbabd", "[(0-1)s:b|i:b|_1#0-1]"
+                + "[(1-2)s:c|i:c|s:b|_2#1-2]"
+                + "[(2-3)s:b|i:b|_3#2-3|<>:e#2-4$<i>4]"
+                + "[(3-4)s:a|i:a|_4#3-4|<>:e#3-5$<i>5|<>:e2#3-5$<i>5]"
+                + "[(4-5)s:b|i:b|s:c|_5#4-5]"
+                + "[(5-6)s:d|i:d|_6#5-6|<>:e2#5-6$<i>6]");
+        return fd;
+    }
+
+
+    private FieldDocument createFieldDoc1 () {
+        fd = new FieldDocument();
+        fd.addString("ID", "doc-1");
+        fd.addTV("base", "babaa", "[(0-1)s:b|i:b|s:c|_1#0-1]"
+                + "[(1-2)s:a|i:a|s:b|_2#1-2|<>:e#1-3$<i>3]"
+                + "[(2-3)s:b|i:b|s:a|_3#2-3]" + "[(3-4)s:a|i:a|_4#3-4]"
+                + "[(4-5)s:a|i:a|_5#4-5]");
+        return fd;
+    }
+
+
+    private FieldDocument createFieldDoc2 () {
+        fd = new FieldDocument();
+        fd.addString("ID", "doc-2");
+        fd.addTV("base", "bdb", "[(0-1)s:b|i:b|_1#0-1]"
+                + "[(1-2)s:d|i:d|s:b|_2#1-2]" + "[(2-3)s:b|i:b|s:a|_3#2-3]");
+        return fd;
+    }
+
+
+    private FieldDocument createFieldDoc4 () {
+        fd = new FieldDocument();
+        fd.addString("ID", "doc-4");
+        fd.addTV("base", "bdb", "[(0-1)s:b|i:b|s:c|_1#0-1]"
+                + "[(1-2)s:d|_2#1-2]" + "[(2-3)s:d|i:d|_3#2-3]");
+        return fd;
+    }
 }
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestSegmentNegationIndex.java b/src/test/java/de/ids_mannheim/korap/index/TestSegmentNegationIndex.java
index 9f1571a..7554b20 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestSegmentNegationIndex.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestSegmentNegationIndex.java
@@ -27,102 +27,98 @@
     private KrillIndex ki;
     private Result kr;
     private FieldDocument fd;
-    private Logger log;	
-	
+    private Logger log;
+
+
     @Test
-    public void testcaseNegation() throws Exception {
-	ki = new KrillIndex();
-	ki.addDoc(createFieldDoc0());
-	ki.addDoc(createFieldDoc1());
-	ki.addDoc(createFieldDoc2());
-	ki.addDoc(createFieldDoc3());
-	ki.commit();
-	SpanSegmentQueryWrapper ssqw = new SpanSegmentQueryWrapper("base","s:b");
-	ssqw.with("s:c");
-	SpanSequenceQueryWrapper sqw = new SpanSequenceQueryWrapper("base", ssqw).append("s:d");
+    public void testcaseNegation () throws Exception {
+        ki = new KrillIndex();
+        ki.addDoc(createFieldDoc0());
+        ki.addDoc(createFieldDoc1());
+        ki.addDoc(createFieldDoc2());
+        ki.addDoc(createFieldDoc3());
+        ki.commit();
+        SpanSegmentQueryWrapper ssqw = new SpanSegmentQueryWrapper("base",
+                "s:b");
+        ssqw.with("s:c");
+        SpanSequenceQueryWrapper sqw = new SpanSequenceQueryWrapper("base",
+                ssqw).append("s:d");
 
-	kr = ki.search(sqw.toQuery(), (short) 10);
-		
-	assertEquals("totalResults", kr.getTotalResults(), 2);				
-	// Match #0
-	assertEquals("doc-number", 0, kr.getMatch(0).getLocalDocID());
-	assertEquals("StartPos (0)", 4, kr.getMatch(0).startPos);
-	assertEquals("EndPos (0)", 6, kr.getMatch(0).endPos);
+        kr = ki.search(sqw.toQuery(), (short) 10);
 
-	// Match #1 in the other atomic index
-	assertEquals("doc-number", 3, kr.getMatch(1).getLocalDocID());
-	assertEquals("StartPos (0)", 0, kr.getMatch(1).startPos);
-	assertEquals("EndPos (0)", 2, kr.getMatch(1).endPos);
-		
-	ssqw = new SpanSegmentQueryWrapper("base","s:b");
-	ssqw.without("s:c");
-	sqw = new SpanSequenceQueryWrapper("base", ssqw).append("s:a");
+        assertEquals("totalResults", kr.getTotalResults(), 2);
+        // Match #0
+        assertEquals("doc-number", 0, kr.getMatch(0).getLocalDocID());
+        assertEquals("StartPos (0)", 4, kr.getMatch(0).startPos);
+        assertEquals("EndPos (0)", 6, kr.getMatch(0).endPos);
 
-	kr = ki.search(sqw.toQuery(), (short) 10);
+        // Match #1 in the other atomic index
+        assertEquals("doc-number", 3, kr.getMatch(1).getLocalDocID());
+        assertEquals("StartPos (0)", 0, kr.getMatch(1).startPos);
+        assertEquals("EndPos (0)", 2, kr.getMatch(1).endPos);
 
-	assertEquals("doc-number", 0, kr.getMatch(0).getLocalDocID());
-	assertEquals("StartPos (0)", 2, kr.getMatch(0).startPos);
-	assertEquals("EndPos (0)", 4, kr.getMatch(0).endPos);
+        ssqw = new SpanSegmentQueryWrapper("base", "s:b");
+        ssqw.without("s:c");
+        sqw = new SpanSequenceQueryWrapper("base", ssqw).append("s:a");
 
-	assertEquals("doc-number", 1, kr.getMatch(1).getLocalDocID());
-	assertEquals("StartPos (1)", 1, kr.getMatch(1).startPos);
-	assertEquals("EndPos (1)", 3, kr.getMatch(1).endPos);
+        kr = ki.search(sqw.toQuery(), (short) 10);
 
-	assertEquals("doc-number", 1, kr.getMatch(2).getLocalDocID());
-	assertEquals("StartPos (2)", 2, kr.getMatch(2).startPos);
-	assertEquals("EndPos (2)", 4, kr.getMatch(2).endPos);
+        assertEquals("doc-number", 0, kr.getMatch(0).getLocalDocID());
+        assertEquals("StartPos (0)", 2, kr.getMatch(0).startPos);
+        assertEquals("EndPos (0)", 4, kr.getMatch(0).endPos);
 
-	assertEquals("doc-number", 2, kr.getMatch(3).getLocalDocID());
-	assertEquals("StartPos (3)", 1, kr.getMatch(3).startPos);
-	assertEquals("EndPos (3)", 3, kr.getMatch(3).endPos);
+        assertEquals("doc-number", 1, kr.getMatch(1).getLocalDocID());
+        assertEquals("StartPos (1)", 1, kr.getMatch(1).startPos);
+        assertEquals("EndPos (1)", 3, kr.getMatch(1).endPos);
+
+        assertEquals("doc-number", 1, kr.getMatch(2).getLocalDocID());
+        assertEquals("StartPos (2)", 2, kr.getMatch(2).startPos);
+        assertEquals("EndPos (2)", 4, kr.getMatch(2).endPos);
+
+        assertEquals("doc-number", 2, kr.getMatch(3).getLocalDocID());
+        assertEquals("StartPos (3)", 1, kr.getMatch(3).startPos);
+        assertEquals("EndPos (3)", 3, kr.getMatch(3).endPos);
     }
-    
-    private FieldDocument createFieldDoc0(){
-	fd = new FieldDocument();
-	fd.addString("ID", "doc-0");
-	fd.addTV("base",
-		 "bcbabd",			 
-		 "[(0-1)s:b|i:b|_1#0-1]" +
-		 "[(1-2)s:c|i:c|s:b|_2#1-2]" +			 
-		 "[(2-3)s:b|i:b|_3#2-3|<>:e#2-4$<i>4]" +
-		 "[(3-4)s:a|i:a|_4#3-4|<>:e#3-5$<i>5|<>:e2#3-5$<i>5]" + 
-		 "[(4-5)s:b|i:b|s:c|_5#4-5]" +			 
-		 "[(5-6)s:d|i:d|_6#5-6|<>:e2#5-6$<i>6]");
-	return fd;
+
+
+    private FieldDocument createFieldDoc0 () {
+        fd = new FieldDocument();
+        fd.addString("ID", "doc-0");
+        fd.addTV("base", "bcbabd", "[(0-1)s:b|i:b|_1#0-1]"
+                + "[(1-2)s:c|i:c|s:b|_2#1-2]"
+                + "[(2-3)s:b|i:b|_3#2-3|<>:e#2-4$<i>4]"
+                + "[(3-4)s:a|i:a|_4#3-4|<>:e#3-5$<i>5|<>:e2#3-5$<i>5]"
+                + "[(4-5)s:b|i:b|s:c|_5#4-5]"
+                + "[(5-6)s:d|i:d|_6#5-6|<>:e2#5-6$<i>6]");
+        return fd;
     }
-	
-    private FieldDocument createFieldDoc1(){
-	fd = new FieldDocument();
-	fd.addString("ID", "doc-1");
-	fd.addTV("base",
-		 "babaa",			 
-		 "[(0-1)s:b|i:b|s:c|_1#0-1]" +
-		 "[(1-2)s:a|i:a|s:b|_2#1-2|<>:e#1-3$<i>3]" +			 
-		 "[(2-3)s:b|i:b|s:a|_3#2-3]" +
-		 "[(3-4)s:a|i:a|_4#3-4]" +
-		 "[(4-5)s:a|i:a|_5#4-5]");
-	return fd;
-    } 
-    
-    private FieldDocument createFieldDoc2(){
-	fd = new FieldDocument();
-	fd.addString("ID", "doc-2");
-	fd.addTV("base",
-		 "bdb",			 
-		 "[(0-1)s:b|i:b|_1#0-1]" +
-		 "[(1-2)s:d|i:d|s:b|_2#1-2]"+
-		 "[(2-3)s:b|i:b|s:a|_3#2-3]");			 	
-	return fd;
+
+
+    private FieldDocument createFieldDoc1 () {
+        fd = new FieldDocument();
+        fd.addString("ID", "doc-1");
+        fd.addTV("base", "babaa", "[(0-1)s:b|i:b|s:c|_1#0-1]"
+                + "[(1-2)s:a|i:a|s:b|_2#1-2|<>:e#1-3$<i>3]"
+                + "[(2-3)s:b|i:b|s:a|_3#2-3]" + "[(3-4)s:a|i:a|_4#3-4]"
+                + "[(4-5)s:a|i:a|_5#4-5]");
+        return fd;
     }
-	
-    private FieldDocument createFieldDoc3(){
-	fd = new FieldDocument();
-	fd.addString("ID", "doc-3");
-	fd.addTV("base",
-		 "bdb",			 
-		 "[(0-1)s:b|i:b|s:c|_1#0-1]" +
-		 "[(1-2)s:d|_2#1-2]"+
-		 "[(2-3)s:d|i:d|_3#2-3]");			 	
-	return fd;
+
+
+    private FieldDocument createFieldDoc2 () {
+        fd = new FieldDocument();
+        fd.addString("ID", "doc-2");
+        fd.addTV("base", "bdb", "[(0-1)s:b|i:b|_1#0-1]"
+                + "[(1-2)s:d|i:d|s:b|_2#1-2]" + "[(2-3)s:b|i:b|s:a|_3#2-3]");
+        return fd;
+    }
+
+
+    private FieldDocument createFieldDoc3 () {
+        fd = new FieldDocument();
+        fd.addString("ID", "doc-3");
+        fd.addTV("base", "bdb", "[(0-1)s:b|i:b|s:c|_1#0-1]"
+                + "[(1-2)s:d|_2#1-2]" + "[(2-3)s:d|i:d|_3#2-3]");
+        return fd;
     }
 }
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestSpanExpansionIndex.java b/src/test/java/de/ids_mannheim/korap/index/TestSpanExpansionIndex.java
index 2731cf4..3ed9dc6 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestSpanExpansionIndex.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestSpanExpansionIndex.java
@@ -29,18 +29,19 @@
     Result kr;
     KrillIndex ki;
 
-    public TestSpanExpansionIndex() throws IOException {
+
+    public TestSpanExpansionIndex () throws IOException {
         ki = new KrillIndex();
-        ki.addDoc(getClass().getResourceAsStream("/wiki/00001.json.gz"),
-                true);
+        ki.addDoc(getClass().getResourceAsStream("/wiki/00001.json.gz"), true);
         ki.commit();
     }
 
+
     /**
      * Left and right expansions
      * */
     @Test
-    public void testCase1() throws IOException {
+    public void testCase1 () throws IOException {
 
         SpanTermQuery stq = new SpanTermQuery(new Term("tokens", "s:des"));
         // left
@@ -75,12 +76,13 @@
         assertEquals(161, kr.getMatch(3).getEndPos());
     }
 
+
     /**
-     * Classnumber 
+     * Classnumber
      * Check the expansion offsets
      * */
     @Test
-    public void testCase2() {
+    public void testCase2 () {
         byte classNumber = 1;
         SpanExpansionQuery sq;
         // create new payload for the expansion offsets
@@ -133,11 +135,12 @@
          */
     }
 
+
     /**
      * Right expansion with exclusion
      * */
     @Test
-    public void testCase3() throws IOException {
+    public void testCase3 () throws IOException {
         byte classNumber = 1;
         SpanTermQuery stq = new SpanTermQuery(new Term("tokens", "tt/p:NN"));
         SpanTermQuery notQuery = new SpanTermQuery(new Term("tokens",
@@ -167,12 +170,13 @@
          */
     }
 
+
     /**
-     * Left expansion with exclusion 
+     * Left expansion with exclusion
      * No expansion
      * */
     @Test
-    public void testCase4() throws IOException {
+    public void testCase4 () throws IOException {
         byte classNumber = 1;
         SpanTermQuery stq = new SpanTermQuery(new Term("tokens", "tt/p:NN"));
         SpanTermQuery notQuery = new SpanTermQuery(new Term("tokens",
@@ -208,14 +212,15 @@
 
     }
 
+
     /**
-     * Expansion over start and end documents start => cut to 0 
+     * Expansion over start and end documents start => cut to 0
      * TODO: end => to be handled in rendering process
      * 
      * @throws IOException
      * */
     @Test
-    public void testCase5() throws IOException {
+    public void testCase5 () throws IOException {
         KrillIndex ki = new KrillIndex();
         ki.addDoc(createFieldDoc0());
         ki.commit();
@@ -246,13 +251,14 @@
          */
     }
 
+
     /**
      * Expansion exclusion : multiple documents
      * 
      * @throws IOException
      * */
     @Test
-    public void testCase6() throws IOException {
+    public void testCase6 () throws IOException {
         KrillIndex ki = new KrillIndex();
         ki.addDoc(createFieldDoc0()); // same doc
         ki.addDoc(createFieldDoc1()); // only not clause
@@ -277,16 +283,15 @@
         assertEquals(4, kr.getMatch(4).getEndPos());
     }
 
+
     /**
      * Skip to
      * */
     @Test
-    public void testCase7() throws IOException, QueryException {
+    public void testCase7 () throws IOException, QueryException {
         KrillIndex ki = new KrillIndex();
-        ki.addDoc(getClass().getResourceAsStream("/wiki/00001.json.gz"),
-                true);
-        ki.addDoc(getClass().getResourceAsStream("/wiki/00002.json.gz"),
-                true);
+        ki.addDoc(getClass().getResourceAsStream("/wiki/00001.json.gz"), true);
+        ki.addDoc(getClass().getResourceAsStream("/wiki/00002.json.gz"), true);
         ki.commit();
 
         String jsonPath = getClass().getResource("/queries/poly3.json")
@@ -308,13 +313,14 @@
          */
     }
 
+
     /**
      * Query rewrite bug
      * 
      * @throws IOException
      * */
     @Test
-    public void testQueryRewriteBug() throws IOException {
+    public void testQueryRewriteBug () throws IOException {
         KrillIndex ki = new KrillIndex();
         ki.addDoc(createFieldDoc0()); // same doc
         ki.addDoc(createFieldDoc1()); // only not clause
@@ -342,7 +348,8 @@
          */
     }
 
-    private FieldDocument createFieldDoc0() {
+
+    private FieldDocument createFieldDoc0 () {
         FieldDocument fd = new FieldDocument();
         fd.addString("ID", "doc-0");
         fd.addTV("base", "ceccecdeec", "[(0-1)s:c|_0#0-1]"
@@ -354,7 +361,8 @@
         return fd;
     }
 
-    private FieldDocument createFieldDoc1() {
+
+    private FieldDocument createFieldDoc1 () {
         FieldDocument fd = new FieldDocument();
         fd.addString("ID", "doc-1");
         fd.addTV("base", "bbccdd", "[(0-1)s:b|s:c|_0#0-1]"
@@ -364,7 +372,8 @@
         return fd;
     }
 
-    private FieldDocument createFieldDoc2() {
+
+    private FieldDocument createFieldDoc2 () {
         FieldDocument fd = new FieldDocument();
         fd.addString("ID", "doc-2");
         fd.addTV("base", "beccea", "[(0-1)s:b|s:c|_0#0-1]"
@@ -374,7 +383,8 @@
         return fd;
     }
 
-    private String readFile(String path) {
+
+    private String readFile (String path) {
         StringBuilder sb = new StringBuilder();
         try {
             BufferedReader in = new BufferedReader(new FileReader(path));
@@ -383,7 +393,8 @@
                 sb.append(str);
             }
             in.close();
-        } catch (IOException e) {
+        }
+        catch (IOException e) {
             fail(e.getMessage());
         }
         return sb.toString();
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestSubSpanIndex.java b/src/test/java/de/ids_mannheim/korap/index/TestSubSpanIndex.java
index b9b41cf..fe59ad3 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestSubSpanIndex.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestSubSpanIndex.java
@@ -19,15 +19,16 @@
     Result kr;
     KrillIndex ki;
 
+
     public TestSubSpanIndex () throws IOException {
         ki = new KrillIndex();
-        ki.addDoc(getClass().getResourceAsStream("/wiki/00001.json.gz"),
-                true);
+        ki.addDoc(getClass().getResourceAsStream("/wiki/00001.json.gz"), true);
         ki.commit();
     }
 
+
     @Test
-    public void testCase1() throws IOException {
+    public void testCase1 () throws IOException {
         SpanDistanceQuery sdq = new SpanDistanceQuery(new SpanTermQuery(
                 new Term("tokens", "tt/p:NN")), new SpanTermQuery(new Term(
                 "tokens", "tt/p:VAFIN")), new DistanceConstraint(5, 5, true,
@@ -57,8 +58,9 @@
          */
     }
 
+
     @Test
-    public void testCase2() {
+    public void testCase2 () {
         SpanDistanceQuery sdq = new SpanDistanceQuery(new SpanTermQuery(
                 new Term("tokens", "tt/p:NN")), new SpanTermQuery(new Term(
                 "tokens", "tt/p:VAFIN")), new DistanceConstraint(5, 5, true,
@@ -85,9 +87,10 @@
 
     }
 
+
     // Length 0
     @Test
-    public void testCase3() {
+    public void testCase3 () {
         SpanDistanceQuery sdq = new SpanDistanceQuery(new SpanTermQuery(
                 new Term("tokens", "tt/p:NN")), new SpanTermQuery(new Term(
                 "tokens", "tt/p:VAFIN")), new DistanceConstraint(5, 5, true,
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestTermInfo.java b/src/test/java/de/ids_mannheim/korap/index/TestTermInfo.java
index 28f5b2b..0f281ea 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestTermInfo.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestTermInfo.java
@@ -19,103 +19,103 @@
     @Test
     public void termExample1 () throws IOException {
 
-	byte[] b = new byte[16];
-	ByteBuffer bb = ByteBuffer.allocate(16);
-	bb.putInt(20); // startOffset
-	bb.putInt(25); // endOffset
-	bb.putInt(7);  // endPos
-	bb.put((byte) 4);
+        byte[] b = new byte[16];
+        ByteBuffer bb = ByteBuffer.allocate(16);
+        bb.putInt(20); // startOffset
+        bb.putInt(25); // endOffset
+        bb.putInt(7);  // endPos
+        bb.put((byte) 4);
 
-	TermInfo term = new TermInfo("<>:mate/p:NN", 4, bb).analyze();
-	assertEquals("type", term.getType(), "span");
-	assertEquals("value", term.getValue(), "NN");
-	assertEquals("foundry", term.getFoundry(), "mate");
-	assertEquals("layer", term.getLayer(), "p");
-	assertEquals("startPos", term.getStartPos(), 4);
-	assertEquals("endPos", term.getEndPos(), 6);
-	assertEquals("startChar", term.getStartChar(), 20);
-	assertEquals("endChar", term.getEndChar(), 25);
-	assertEquals("depth", term.getDepth(), (byte) 4);
+        TermInfo term = new TermInfo("<>:mate/p:NN", 4, bb).analyze();
+        assertEquals("type", term.getType(), "span");
+        assertEquals("value", term.getValue(), "NN");
+        assertEquals("foundry", term.getFoundry(), "mate");
+        assertEquals("layer", term.getLayer(), "p");
+        assertEquals("startPos", term.getStartPos(), 4);
+        assertEquals("endPos", term.getEndPos(), 6);
+        assertEquals("startChar", term.getStartChar(), 20);
+        assertEquals("endChar", term.getEndChar(), 25);
+        assertEquals("depth", term.getDepth(), (byte) 4);
 
-	bb.clear();
-	term = new TermInfo("mate/p:NN", 9, bb).analyze();
-	assertEquals("type", term.getType(), "term");
-	assertEquals("value", term.getValue(), "NN");
-	assertEquals("foundry", term.getFoundry(), "mate");
-	assertEquals("layer", term.getLayer(), "p");
-	assertEquals("startPos", term.getStartPos(), 9);
-	assertEquals("endPos", term.getEndPos(), 9);
-	assertEquals("startChar", term.getStartChar(), -1);
-	assertEquals("endChar", term.getEndChar(), -1);
-	assertEquals("depth", term.getDepth(), 0);
+        bb.clear();
+        term = new TermInfo("mate/p:NN", 9, bb).analyze();
+        assertEquals("type", term.getType(), "term");
+        assertEquals("value", term.getValue(), "NN");
+        assertEquals("foundry", term.getFoundry(), "mate");
+        assertEquals("layer", term.getLayer(), "p");
+        assertEquals("startPos", term.getStartPos(), 9);
+        assertEquals("endPos", term.getEndPos(), 9);
+        assertEquals("startChar", term.getStartChar(), -1);
+        assertEquals("endChar", term.getEndChar(), -1);
+        assertEquals("depth", term.getDepth(), 0);
 
-	bb.clear();
-	bb.putInt(17).put((byte) 2);
-	term = new TermInfo(">:xip/p:ADJ", 11, bb).analyze();
-	assertEquals("type", term.getType(), "relSrc");
-	assertEquals("value", term.getValue(), "ADJ");
-	assertEquals("foundry", term.getFoundry(), "xip");
-	assertEquals("layer", term.getLayer(), "p");
-	assertEquals("startPos", term.getStartPos(), 11);
-	assertEquals("endPos", term.getEndPos(), 16);
-	assertEquals("startChar", term.getStartChar(), -1);
-	assertEquals("endChar", term.getEndChar(), -1);
-	assertEquals("depth", term.getDepth(), 0);
+        bb.clear();
+        bb.putInt(17).put((byte) 2);
+        term = new TermInfo(">:xip/p:ADJ", 11, bb).analyze();
+        assertEquals("type", term.getType(), "relSrc");
+        assertEquals("value", term.getValue(), "ADJ");
+        assertEquals("foundry", term.getFoundry(), "xip");
+        assertEquals("layer", term.getLayer(), "p");
+        assertEquals("startPos", term.getStartPos(), 11);
+        assertEquals("endPos", term.getEndPos(), 16);
+        assertEquals("startChar", term.getStartChar(), -1);
+        assertEquals("endChar", term.getEndChar(), -1);
+        assertEquals("depth", term.getDepth(), 0);
 
-	bb.clear();
-	bb.putInt(24);
-	term = new TermInfo("<:xip/m:number:pl", 20, bb).analyze();
-	assertEquals("type", term.getType(), "relTarget");
-	assertEquals("value", term.getValue(), "number:pl");
-	assertEquals("foundry", term.getFoundry(), "xip");
-	assertEquals("layer", term.getLayer(), "m");
-	assertEquals("startPos", term.getStartPos(), 20);
-	assertEquals("endPos", term.getEndPos(), 23);
-	assertEquals("startChar", term.getStartChar(), -1);
-	assertEquals("endChar", term.getEndChar(), -1);
-	assertEquals("depth", term.getDepth(), 0);
+        bb.clear();
+        bb.putInt(24);
+        term = new TermInfo("<:xip/m:number:pl", 20, bb).analyze();
+        assertEquals("type", term.getType(), "relTarget");
+        assertEquals("value", term.getValue(), "number:pl");
+        assertEquals("foundry", term.getFoundry(), "xip");
+        assertEquals("layer", term.getLayer(), "m");
+        assertEquals("startPos", term.getStartPos(), 20);
+        assertEquals("endPos", term.getEndPos(), 23);
+        assertEquals("startChar", term.getStartChar(), -1);
+        assertEquals("endChar", term.getEndChar(), -1);
+        assertEquals("depth", term.getDepth(), 0);
 
-	bb.clear();
-	bb.putInt(240).putInt(400);
-	term = new TermInfo("_30", 30, bb).analyze();
-	assertEquals("type", term.getType(), "pos");
-	assertEquals("value", term.getValue(), "30");
-	assertNull("foundry", term.getFoundry());
-	assertNull("layer", term.getLayer());
-	assertEquals("startPos", term.getStartPos(), 30);
-	assertEquals("endPos", term.getEndPos(), 30);
-	assertEquals("startChar", term.getStartChar(), 240);
-	assertEquals("endChar", term.getEndChar(), 400);
-	assertEquals("depth", term.getDepth(), 0);
+        bb.clear();
+        bb.putInt(240).putInt(400);
+        term = new TermInfo("_30", 30, bb).analyze();
+        assertEquals("type", term.getType(), "pos");
+        assertEquals("value", term.getValue(), "30");
+        assertNull("foundry", term.getFoundry());
+        assertNull("layer", term.getLayer());
+        assertEquals("startPos", term.getStartPos(), 30);
+        assertEquals("endPos", term.getEndPos(), 30);
+        assertEquals("startChar", term.getStartChar(), 240);
+        assertEquals("endChar", term.getEndChar(), 400);
+        assertEquals("depth", term.getDepth(), 0);
 
-	bb.clear();
-	bb.putInt(20); // startOffset
-	bb.putInt(25); // endOffset
-	bb.putInt(24); // endPos
-	term = new TermInfo("<>:s", 20, bb).analyze();
-	assertEquals("type", term.getType(), "span");
-	assertNull("value", term.getValue());
-	assertEquals("foundry", term.getFoundry(), "base");
-	assertEquals("layer", term.getLayer(), "s");
-	assertEquals("startPos", term.getStartPos(), 20);
-	assertEquals("endPos", term.getEndPos(), 23);
-	assertEquals("startChar", term.getStartChar(), 20);
-	assertEquals("endChar", term.getEndChar(), 25);
-	assertEquals("depth", term.getDepth(), 0);
+        bb.clear();
+        bb.putInt(20); // startOffset
+        bb.putInt(25); // endOffset
+        bb.putInt(24); // endPos
+        term = new TermInfo("<>:s", 20, bb).analyze();
+        assertEquals("type", term.getType(), "span");
+        assertNull("value", term.getValue());
+        assertEquals("foundry", term.getFoundry(), "base");
+        assertEquals("layer", term.getLayer(), "s");
+        assertEquals("startPos", term.getStartPos(), 20);
+        assertEquals("endPos", term.getEndPos(), 23);
+        assertEquals("startChar", term.getStartChar(), 20);
+        assertEquals("endChar", term.getEndChar(), 25);
+        assertEquals("depth", term.getDepth(), 0);
 
-	bb.clear();
-	bb.putInt(20); // startOffset
-	bb.putInt(25); // endOffset
-	bb.putInt(24); // endPos
-	term = new TermInfo("<>:tag/x", 20, bb).analyze();
-	assertEquals("type", term.getType(), "span");
-	assertNull("value", term.getValue());
-	assertEquals("foundry", term.getFoundry(), "tag");
-	assertEquals("layer", term.getLayer(), "x");
-	assertEquals("startPos", term.getStartPos(), 20);
-	assertEquals("endPos", term.getEndPos(), 23);
-	assertEquals("startChar", term.getStartChar(), 20);
-	assertEquals("endChar", term.getEndChar(), 25);
-	assertEquals("depth", term.getDepth(), 0);
+        bb.clear();
+        bb.putInt(20); // startOffset
+        bb.putInt(25); // endOffset
+        bb.putInt(24); // endPos
+        term = new TermInfo("<>:tag/x", 20, bb).analyze();
+        assertEquals("type", term.getType(), "span");
+        assertNull("value", term.getValue());
+        assertEquals("foundry", term.getFoundry(), "tag");
+        assertEquals("layer", term.getLayer(), "x");
+        assertEquals("startPos", term.getStartPos(), 20);
+        assertEquals("endPos", term.getEndPos(), 23);
+        assertEquals("startChar", term.getStartChar(), 20);
+        assertEquals("endChar", term.getEndChar(), 25);
+        assertEquals("depth", term.getDepth(), 0);
     };
 };
\ No newline at end of file
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestUnorderedDistanceIndex.java b/src/test/java/de/ids_mannheim/korap/index/TestUnorderedDistanceIndex.java
index e19b719..1cb78c9 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestUnorderedDistanceIndex.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestUnorderedDistanceIndex.java
@@ -19,278 +19,276 @@
 import de.ids_mannheim.korap.query.SpanNextQuery;
 
 @RunWith(JUnit4.class)
-public class TestUnorderedDistanceIndex{
-	
+public class TestUnorderedDistanceIndex {
+
     private KrillIndex ki;
-	private Result kr;
+    private Result kr;
 
-	private FieldDocument createFieldDoc0(){
-    	FieldDocument fd = new FieldDocument();
+
+    private FieldDocument createFieldDoc0 () {
+        FieldDocument fd = new FieldDocument();
         fd.addString("ID", "doc-0");
-        fd.addTV("base",
-            "text",
-            "[(0-1)s:c|_1#0-1]" +
-            "[(1-2)s:e|_2#1-2]" +             
-            "[(2-3)s:c|_3#2-3|<>:y#2-4$<i>4]" +
-            "[(3-4)s:c|_4#3-4|<>:x#3-7$<i>7]" + 
-            "[(4-5)s:d|_5#4-5|<>:y#4-6$<i>6]" +             
-            "[(5-6)s:c|_6#5-6|<>:y#5-8$<i>8]" +
-            "[(6-7)s:d|_7#6-7]" +
-            "[(7-8)s:f|_8#7-8|<>:x#7-9$<i>9]" + 
-            "[(8-9)s:e|_9#8-9|<>:x#8-10$<i>10]" + 
-            "[(9-10)s:d|_10#9-10]");
+        fd.addTV("base", "text", "[(0-1)s:c|_1#0-1]" + "[(1-2)s:e|_2#1-2]"
+                + "[(2-3)s:c|_3#2-3|<>:y#2-4$<i>4]"
+                + "[(3-4)s:c|_4#3-4|<>:x#3-7$<i>7]"
+                + "[(4-5)s:d|_5#4-5|<>:y#4-6$<i>6]"
+                + "[(5-6)s:c|_6#5-6|<>:y#5-8$<i>8]" + "[(6-7)s:d|_7#6-7]"
+                + "[(7-8)s:f|_8#7-8|<>:x#7-9$<i>9]"
+                + "[(8-9)s:e|_9#8-9|<>:x#8-10$<i>10]" + "[(9-10)s:d|_10#9-10]");
         return fd;
     }
-	
-	private FieldDocument createFieldDoc1(){
-		FieldDocument fd = new FieldDocument();
+
+
+    private FieldDocument createFieldDoc1 () {
+        FieldDocument fd = new FieldDocument();
         fd.addString("ID", "doc-1");
-        fd.addTV("base",
-            "text",             
-            "[(0-1)s:d|_1#0-1]" +
-            "[(1-2)s:c|_2#1-2]" +             
-            "[(2-3)s:e|_3#2-3]" +
-            "[(3-4)s:e|_4#3-4]" + 
-            "[(4-5)s:d|_5#4-5]" +             
-            "[(5-6)s:e|_6#5-6]" +
-            "[(6-7)s:e|_7#6-7]" +
-            "[(7-8)s:c|_8#7-8]" + 
-            "[(8-9)s:e|_9#8-9]" + 
-            "[(9-10)s:d|_10#9-10]");
+        fd.addTV("base", "text", "[(0-1)s:d|_1#0-1]" + "[(1-2)s:c|_2#1-2]"
+                + "[(2-3)s:e|_3#2-3]" + "[(3-4)s:e|_4#3-4]"
+                + "[(4-5)s:d|_5#4-5]" + "[(5-6)s:e|_6#5-6]"
+                + "[(6-7)s:e|_7#6-7]" + "[(7-8)s:c|_8#7-8]"
+                + "[(8-9)s:e|_9#8-9]" + "[(9-10)s:d|_10#9-10]");
         return fd;
-	}
-	
-	private FieldDocument createFieldDoc2(){
-		FieldDocument fd = new FieldDocument();
+    }
+
+
+    private FieldDocument createFieldDoc2 () {
+        FieldDocument fd = new FieldDocument();
         fd.addString("ID", "doc-2");
-        fd.addTV("base",
-            "text",             
-            "[(0-1)s:f|_1#0-1]" +
-            "[(1-2)s:c|_2#1-2]" +             
-            "[(2-3)s:e|_3#2-3]" +
-            "[(3-4)s:e|_4#3-4]" + 
-            "[(4-5)s:d|_5#4-5]" +             
-            "[(5-6)s:f|_6#5-6]" +
-            "[(6-7)s:f|_7#6-7]" );
+        fd.addTV("base", "text", "[(0-1)s:f|_1#0-1]" + "[(1-2)s:c|_2#1-2]"
+                + "[(2-3)s:e|_3#2-3]" + "[(3-4)s:e|_4#3-4]"
+                + "[(4-5)s:d|_5#4-5]" + "[(5-6)s:f|_6#5-6]"
+                + "[(6-7)s:f|_7#6-7]");
         return fd;
-	}
-	
-    private SpanQuery createQuery(String x, String y, int min, int max, 
-    		boolean isOrdered){
-    	SpanQuery sq = new SpanDistanceQuery(
-        		new SpanTermQuery(new Term("base",x)),
-        		new SpanTermQuery(new Term("base",y)),
-        		new DistanceConstraint(min, max, isOrdered, false),        		
-        		true
-        );    	 
-    	return sq;
     }
-	
-    private SpanQuery createElementQuery(String x, String y, int min, int max, 
-    		boolean isOrdered){
-    	SpanQuery sq = new SpanDistanceQuery(
-        		new SpanElementQuery("base",x),
-        		new SpanElementQuery("base",y),
-        		new DistanceConstraint(min, max, isOrdered, false),
-        		true
-        );
-    	return sq;
+
+
+    private SpanQuery createQuery (String x, String y, int min, int max,
+            boolean isOrdered) {
+        SpanQuery sq = new SpanDistanceQuery(new SpanTermQuery(new Term("base",
+                x)), new SpanTermQuery(new Term("base", y)),
+                new DistanceConstraint(min, max, isOrdered, false), true);
+        return sq;
     }
-    
-    /** One document, multiple occurrences
-     * 	The first first and second spans are too far from each other
-     * 	One of the spans ends first
-     * 	One of the candidate list is empty
+
+
+    private SpanQuery createElementQuery (String x, String y, int min, int max,
+            boolean isOrdered) {
+        SpanQuery sq = new SpanDistanceQuery(new SpanElementQuery("base", x),
+                new SpanElementQuery("base", y), new DistanceConstraint(min,
+                        max, isOrdered, false), true);
+        return sq;
+    }
+
+
+    /**
+     * One document, multiple occurrences
+     * The first first and second spans are too far from each other
+     * One of the spans ends first
+     * One of the candidate list is empty
      * */
-	@Test
-	public void testCase1() throws IOException{
-		//System.out.println("testcase 1");
-		ki = new KrillIndex();
-	    ki.addDoc(createFieldDoc0()); 
-	    ki.commit();    
-	    
-	    SpanQuery sq = createQuery("s:c","s:d",0,3,false);                
-	    kr = ki.search(sq, (short) 10);
-	    	    
-	    assertEquals(kr.getTotalResults(), 5);	    
-	}
-	
-	/** Multiple documents 
-	 * 	Ensure same doc
-	 * 	Both candidate lists are empty, but there is a span left in the doc
-	 * 	Both candidate lists are empty, but there are more matches in the doc
-	 * @throws IOException 
-	 * */
-	@Test
-	public void testCase2() throws IOException{
-		//System.out.println("testcase 2");
-		ki = new KrillIndex();
-		ki.addDoc(createFieldDoc0());
-	    ki.addDoc(createFieldDoc1()); 
-	    ki.commit();    
-	    
-	    SpanQuery sq = createQuery("s:c","s:d",1,2,false);                
-	    kr = ki.search(sq, (short) 10);
-	    	    
-	    assertEquals(kr.getTotalResults(), 6);	    
-	}
-	
-	/** Multiple documents 
-	 * 	Ensure same Doc
-	 * @throws IOException 
-	 * */
-	@Test
-	public void testCase3() throws IOException{		
-		//System.out.println("testcase 3");
-		ki = new KrillIndex();
-		ki.addDoc(createFieldDoc0());
-	    ki.addDoc(createFieldDoc1()); 
-	    ki.addDoc(createFieldDoc2());
-	    ki.commit();    
-	    
-	    SpanQuery sq = createQuery("s:e","s:f",1,2,false);                
-	    kr = ki.search(sq, (short) 10);
-	    	    
-	    assertEquals(kr.getTotalResults(), 3);
-	    assertEquals(0, kr.getMatch(0).getLocalDocID());
-	    assertEquals(7, kr.getMatch(0).getStartPos());
-	    assertEquals(9, kr.getMatch(0).getEndPos());
-	    assertEquals(2, kr.getMatch(1).getLocalDocID());
-	    assertEquals(0, kr.getMatch(1).getStartPos());
-	    assertEquals(3, kr.getMatch(1).getEndPos());
-	}
-	
-	/** Skip to */
-	@Test
-	public void testCase4() throws IOException{
-		//System.out.println("testcase 4");
-		ki = new KrillIndex();
-		ki.addDoc(createFieldDoc0());
-	    ki.addDoc(createFieldDoc1()); 
-	    ki.addDoc(createFieldDoc2());
-	    ki.commit();
-	    
-	    SpanQuery sq = new SpanNextQuery(
-	    		createQuery("s:d","s:e",1,2,false),
-	    		new SpanTermQuery(new Term("base","s:f"))	    		
-		);
-	    
-	    kr = ki.search(sq, (short) 10);
-	    assertEquals(kr.getTotalResults(), 2);
-	    assertEquals(2,kr.getMatch(0).getLocalDocID());
-	    assertEquals(2,kr.getMatch(0).getStartPos());
-	    assertEquals(6,kr.getMatch(0).getEndPos());
-	    assertEquals(3,kr.getMatch(1).getStartPos());
-	    assertEquals(6,kr.getMatch(1).getEndPos());
-	}
-	
-	 /** ElementQueries */    
     @Test
-    public void testCase5() throws IOException{    	
-    	ki = new KrillIndex();
-	    ki.addDoc(createFieldDoc0()); 
-	    ki.commit();    
-	    
-	    // Intersection ---- Distance 0:0
-	    //System.out.println("Intersection ---- Distance 0:0");
-	    SpanQuery sq = createElementQuery("x","y",0,0,false);                
-	    kr = ki.search(sq, (short) 10);
-    	
-	    assertEquals(kr.getTotalResults(), 4);
-	    assertEquals(2, kr.getMatch(0).startPos);
-	    assertEquals(7, kr.getMatch(0).endPos);
-	    assertEquals(3, kr.getMatch(1).startPos);
-	    assertEquals(7, kr.getMatch(1).endPos);
-	    assertEquals(3, kr.getMatch(2).startPos);
-	    assertEquals(8, kr.getMatch(2).endPos);
-    	
-	    // Next to ---- Distance 1:1
-	    //System.out.println("Next to ---- Distance 1:1");
-	    sq = createElementQuery("x","y",1,1,false);                
-	    kr = ki.search(sq, (short) 10);
-	    
-	    assertEquals(kr.getTotalResults(), 1);
-	    assertEquals(5, kr.getMatch(0).startPos);
-	    assertEquals(10, kr.getMatch(0).endPos);
-	    
-	    // ---- Distance 1:2
-	    //System.out.println("---- Distance 1:2");
-	    sq = createElementQuery("x","y",1,2,false);                
-	    kr = ki.search(sq, (short) 10);
-	    
-	    assertEquals(kr.getTotalResults(), 2);	    
-	    assertEquals(4, kr.getMatch(0).startPos);
-	    assertEquals(9, kr.getMatch(0).endPos);
-	    assertEquals(5, kr.getMatch(1).startPos);
-	    assertEquals(10, kr.getMatch(1).endPos);
-	    
+    public void testCase1 () throws IOException {
+        //System.out.println("testcase 1");
+        ki = new KrillIndex();
+        ki.addDoc(createFieldDoc0());
+        ki.commit();
+
+        SpanQuery sq = createQuery("s:c", "s:d", 0, 3, false);
+        kr = ki.search(sq, (short) 10);
+
+        assertEquals(kr.getTotalResults(), 5);
     }
-    
-    /** The same element type 
+
+
+    /**
+     * Multiple documents
+     * Ensure same doc
+     * Both candidate lists are empty, but there is a span left in the
+     * doc
+     * Both candidate lists are empty, but there are more matches in
+     * the doc
      * 
-     * 	WARNING: 
-     * 	This kind of query is not appropriate for an unordered distance span query.
-     * 	Instead, it must be an ordered distance span query. Such an unordered distance 
-     * 	span query yields "redundant results" because matches are searched for each 
-     * 	child span.
+     * @throws IOException
      * */
     @Test
-    public void testCase6() throws IOException{    	
-    	ki = new KrillIndex();
-	    ki.addDoc(createFieldDoc0()); 
-	    ki.commit();    
-	    
-	    //---- Distance 1:2
-	    SpanQuery sq = createElementQuery("x","x",1,2,false);
-	    kr = ki.search(sq, (short) 10);
-	    
-	    assertEquals(kr.getTotalResults(), 4);
+    public void testCase2 () throws IOException {
+        //System.out.println("testcase 2");
+        ki = new KrillIndex();
+        ki.addDoc(createFieldDoc0());
+        ki.addDoc(createFieldDoc1());
+        ki.commit();
+
+        SpanQuery sq = createQuery("s:c", "s:d", 1, 2, false);
+        kr = ki.search(sq, (short) 10);
+
+        assertEquals(kr.getTotalResults(), 6);
     }
 
-    /** Nested distance queries
-     * */
-	@Test
-	public void testCase7() throws IOException{
-		//System.out.println("testcase 7");
-		ki = new KrillIndex();
-		ki.addDoc(createFieldDoc0());
-	    ki.addDoc(createFieldDoc1()); 
-	    ki.commit();    
-	    
-	    SpanQuery sq = createQuery("s:c","s:d",1,2,false);
-	    SpanQuery sq2 = new SpanDistanceQuery(
-        		sq,
-        		new SpanTermQuery(new Term("base","s:e")),
-        		new DistanceConstraint(1, 2, true, false),        		
-        		true);
-	    kr = ki.search(sq2, (short) 10);	    
-	    assertEquals(kr.getTotalResults(), 3);	
-	    assertEquals(5, kr.getMatch(0).getStartPos());
-	    assertEquals(9, kr.getMatch(0).getEndPos());
-	    assertEquals(1, kr.getMatch(1).getLocalDocID());
-	    assertEquals(0, kr.getMatch(1).getStartPos());
-	    assertEquals(3, kr.getMatch(1).getEndPos());
-	    assertEquals(0, kr.getMatch(2).getStartPos());
-	    assertEquals(4, kr.getMatch(2).getEndPos());
-	}
 
-	/** Multiple NextSpans in the same first span position
-	 * */
-	@Test
-	public void testCase8() throws IOException{
-		ki = new KrillIndex();
-	    ki.addDoc(createFieldDoc1()); 
-	    ki.commit();
-	    SpanQuery sq = new SpanNextQuery(
-	    		new SpanTermQuery(new Term("base","s:d")),
-	    		createQuery("s:c","s:e",1,2,false)
-		);
-	    kr = ki.search(sq, (short) 10);
-    
-	    assertEquals(kr.getTotalResults(), 3);
-	    assertEquals(0,kr.getMatch(1).getStartPos());
-	    assertEquals(4,kr.getMatch(1).getEndPos());
-	    
-	}
-	
+    /**
+     * Multiple documents
+     * Ensure same Doc
+     * 
+     * @throws IOException
+     * */
+    @Test
+    public void testCase3 () throws IOException {
+        //System.out.println("testcase 3");
+        ki = new KrillIndex();
+        ki.addDoc(createFieldDoc0());
+        ki.addDoc(createFieldDoc1());
+        ki.addDoc(createFieldDoc2());
+        ki.commit();
+
+        SpanQuery sq = createQuery("s:e", "s:f", 1, 2, false);
+        kr = ki.search(sq, (short) 10);
+
+        assertEquals(kr.getTotalResults(), 3);
+        assertEquals(0, kr.getMatch(0).getLocalDocID());
+        assertEquals(7, kr.getMatch(0).getStartPos());
+        assertEquals(9, kr.getMatch(0).getEndPos());
+        assertEquals(2, kr.getMatch(1).getLocalDocID());
+        assertEquals(0, kr.getMatch(1).getStartPos());
+        assertEquals(3, kr.getMatch(1).getEndPos());
+    }
+
+
+    /** Skip to */
+    @Test
+    public void testCase4 () throws IOException {
+        //System.out.println("testcase 4");
+        ki = new KrillIndex();
+        ki.addDoc(createFieldDoc0());
+        ki.addDoc(createFieldDoc1());
+        ki.addDoc(createFieldDoc2());
+        ki.commit();
+
+        SpanQuery sq = new SpanNextQuery(
+                createQuery("s:d", "s:e", 1, 2, false), new SpanTermQuery(
+                        new Term("base", "s:f")));
+
+        kr = ki.search(sq, (short) 10);
+        assertEquals(kr.getTotalResults(), 2);
+        assertEquals(2, kr.getMatch(0).getLocalDocID());
+        assertEquals(2, kr.getMatch(0).getStartPos());
+        assertEquals(6, kr.getMatch(0).getEndPos());
+        assertEquals(3, kr.getMatch(1).getStartPos());
+        assertEquals(6, kr.getMatch(1).getEndPos());
+    }
+
+
+    /** ElementQueries */
+    @Test
+    public void testCase5 () throws IOException {
+        ki = new KrillIndex();
+        ki.addDoc(createFieldDoc0());
+        ki.commit();
+
+        // Intersection ---- Distance 0:0
+        //System.out.println("Intersection ---- Distance 0:0");
+        SpanQuery sq = createElementQuery("x", "y", 0, 0, false);
+        kr = ki.search(sq, (short) 10);
+
+        assertEquals(kr.getTotalResults(), 4);
+        assertEquals(2, kr.getMatch(0).startPos);
+        assertEquals(7, kr.getMatch(0).endPos);
+        assertEquals(3, kr.getMatch(1).startPos);
+        assertEquals(7, kr.getMatch(1).endPos);
+        assertEquals(3, kr.getMatch(2).startPos);
+        assertEquals(8, kr.getMatch(2).endPos);
+
+        // Next to ---- Distance 1:1
+        //System.out.println("Next to ---- Distance 1:1");
+        sq = createElementQuery("x", "y", 1, 1, false);
+        kr = ki.search(sq, (short) 10);
+
+        assertEquals(kr.getTotalResults(), 1);
+        assertEquals(5, kr.getMatch(0).startPos);
+        assertEquals(10, kr.getMatch(0).endPos);
+
+        // ---- Distance 1:2
+        //System.out.println("---- Distance 1:2");
+        sq = createElementQuery("x", "y", 1, 2, false);
+        kr = ki.search(sq, (short) 10);
+
+        assertEquals(kr.getTotalResults(), 2);
+        assertEquals(4, kr.getMatch(0).startPos);
+        assertEquals(9, kr.getMatch(0).endPos);
+        assertEquals(5, kr.getMatch(1).startPos);
+        assertEquals(10, kr.getMatch(1).endPos);
+
+    }
+
+
+    /**
+     * The same element type
+     * 
+     * WARNING:
+     * This kind of query is not appropriate for an unordered distance
+     * span query.
+     * Instead, it must be an ordered distance span query. Such an
+     * unordered distance
+     * span query yields "redundant results" because matches are
+     * searched for each
+     * child span.
+     * */
+    @Test
+    public void testCase6 () throws IOException {
+        ki = new KrillIndex();
+        ki.addDoc(createFieldDoc0());
+        ki.commit();
+
+        //---- Distance 1:2
+        SpanQuery sq = createElementQuery("x", "x", 1, 2, false);
+        kr = ki.search(sq, (short) 10);
+
+        assertEquals(kr.getTotalResults(), 4);
+    }
+
+
+    /**
+     * Nested distance queries
+     * */
+    @Test
+    public void testCase7 () throws IOException {
+        //System.out.println("testcase 7");
+        ki = new KrillIndex();
+        ki.addDoc(createFieldDoc0());
+        ki.addDoc(createFieldDoc1());
+        ki.commit();
+
+        SpanQuery sq = createQuery("s:c", "s:d", 1, 2, false);
+        SpanQuery sq2 = new SpanDistanceQuery(sq, new SpanTermQuery(new Term(
+                "base", "s:e")), new DistanceConstraint(1, 2, true, false),
+                true);
+        kr = ki.search(sq2, (short) 10);
+        assertEquals(kr.getTotalResults(), 3);
+        assertEquals(5, kr.getMatch(0).getStartPos());
+        assertEquals(9, kr.getMatch(0).getEndPos());
+        assertEquals(1, kr.getMatch(1).getLocalDocID());
+        assertEquals(0, kr.getMatch(1).getStartPos());
+        assertEquals(3, kr.getMatch(1).getEndPos());
+        assertEquals(0, kr.getMatch(2).getStartPos());
+        assertEquals(4, kr.getMatch(2).getEndPos());
+    }
+
+
+    /**
+     * Multiple NextSpans in the same first span position
+     * */
+    @Test
+    public void testCase8 () throws IOException {
+        ki = new KrillIndex();
+        ki.addDoc(createFieldDoc1());
+        ki.commit();
+        SpanQuery sq = new SpanNextQuery(new SpanTermQuery(new Term("base",
+                "s:d")), createQuery("s:c", "s:e", 1, 2, false));
+        kr = ki.search(sq, (short) 10);
+
+        assertEquals(kr.getTotalResults(), 3);
+        assertEquals(0, kr.getMatch(1).getStartPos());
+        assertEquals(4, kr.getMatch(1).getEndPos());
+
+    }
+
 }
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestUnorderedElementDistanceIndex.java b/src/test/java/de/ids_mannheim/korap/index/TestUnorderedElementDistanceIndex.java
index 305e574..7700678 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestUnorderedElementDistanceIndex.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestUnorderedElementDistanceIndex.java
@@ -20,103 +20,92 @@
 
 @RunWith(JUnit4.class)
 public class TestUnorderedElementDistanceIndex {
-	
-	private KrillIndex ki;
-	private Result kr;
-	
-	private FieldDocument createFieldDoc0() {
-    	FieldDocument fd = new FieldDocument();
+
+    private KrillIndex ki;
+    private Result kr;
+
+
+    private FieldDocument createFieldDoc0 () {
+        FieldDocument fd = new FieldDocument();
         fd.addString("ID", "doc-0");
-        fd.addTV("base",
-            "text",             
-            "[(0-1)s:b|s:c|_1#0-1|<>:s#0-2$<i>1]" +
-            "[(1-2)s:b|_2#1-2]" +             
-            "[(2-3)s:b|_3#2-3|<>:s#2-3$<i>3]" +
-            "[(3-4)s:c|_4#3-4|<>:s#3-4$<i>4]" + 
-            "[(4-5)s:b|_5#4-5|<>:s#4-5$<i>5]" +             
-            "[(5-6)s:b|_6#5-6]" +
-            "[(6-7)s:c|_7#6-7|<>:s#6-7$<i>7]");
+        fd.addTV("base", "text", "[(0-1)s:b|s:c|_1#0-1|<>:s#0-2$<i>1]"
+                + "[(1-2)s:b|_2#1-2]" + "[(2-3)s:b|_3#2-3|<>:s#2-3$<i>3]"
+                + "[(3-4)s:c|_4#3-4|<>:s#3-4$<i>4]"
+                + "[(4-5)s:b|_5#4-5|<>:s#4-5$<i>5]" + "[(5-6)s:b|_6#5-6]"
+                + "[(6-7)s:c|_7#6-7|<>:s#6-7$<i>7]");
         return fd;
-	}
-	
-	private FieldDocument createFieldDoc1() {
-    	FieldDocument fd = new FieldDocument();
+    }
+
+
+    private FieldDocument createFieldDoc1 () {
+        FieldDocument fd = new FieldDocument();
         fd.addString("ID", "doc-1");
-        fd.addTV("base",
-            "text",             
-            "[(0-1)s:b|_1#0-1|<>:s#0-2$<i>1]" +
-            "[(1-2)s:c|_2#1-2|<>:s#1-2$<i>4]" +             
-            "[(2-3)s:e|_3#2-3]" +
-            "[(3-4)s:c|_4#3-4]" + 
-            "[(4-5)s:b|_5#4-5|<>:s#4-5$<i>7]" +             
-            "[(5-6)s:e|_6#5-6]" +
-    		"[(6-7)s:e|_7#6-7]");	
+        fd.addTV("base", "text", "[(0-1)s:b|_1#0-1|<>:s#0-2$<i>1]"
+                + "[(1-2)s:c|_2#1-2|<>:s#1-2$<i>4]" + "[(2-3)s:e|_3#2-3]"
+                + "[(3-4)s:c|_4#3-4]" + "[(4-5)s:b|_5#4-5|<>:s#4-5$<i>7]"
+                + "[(5-6)s:e|_6#5-6]" + "[(6-7)s:e|_7#6-7]");
         return fd;
-	}
-	
-	private FieldDocument createFieldDoc2() {
-    	FieldDocument fd = new FieldDocument();
+    }
+
+
+    private FieldDocument createFieldDoc2 () {
+        FieldDocument fd = new FieldDocument();
         fd.addString("ID", "doc-2");
-        fd.addTV("base",
-            "text",             
-            "[(0-1)s:e|_1#0-1|<>:p#0-2$<i>1]" +
-            "[(1-2)s:e|_2#1-2|<>:p#1-2$<i>2]" +             
-            "[(2-3)s:c|_3#2-3|<>:p#2-3$<i>3]" +
-            "[(3-4)s:e|_4#3-4|<>:p#3-4$<i>4]" + 
-            "[(4-5)s:b|_5#4-5|<>:p#4-5$<i>5]" +             
-            "[(5-6)s:c|_6#5-6|<>:p#5-6$<i>6]" +
-    		"[(6-7)s:e|_7#6-7|<>:p#6-7$<i>7]" +
-        	"[(7-8)s:b|_8#7-8|<>:p#7-8$<i>8]");	
+        fd.addTV("base", "text", "[(0-1)s:e|_1#0-1|<>:p#0-2$<i>1]"
+                + "[(1-2)s:e|_2#1-2|<>:p#1-2$<i>2]"
+                + "[(2-3)s:c|_3#2-3|<>:p#2-3$<i>3]"
+                + "[(3-4)s:e|_4#3-4|<>:p#3-4$<i>4]"
+                + "[(4-5)s:b|_5#4-5|<>:p#4-5$<i>5]"
+                + "[(5-6)s:c|_6#5-6|<>:p#5-6$<i>6]"
+                + "[(6-7)s:e|_7#6-7|<>:p#6-7$<i>7]"
+                + "[(7-8)s:b|_8#7-8|<>:p#7-8$<i>8]");
         return fd;
-	}
-	
-	private FieldDocument createFieldDoc3() {
-    	FieldDocument fd = new FieldDocument();
+    }
+
+
+    private FieldDocument createFieldDoc3 () {
+        FieldDocument fd = new FieldDocument();
         fd.addString("ID", "doc-3");
-        fd.addTV("base",
-            "text",             
-            "[(0-1)s:a|_1#0-1|<>:s#0-2$<i>1]" +
-            "[(1-2)s:d|_2#1-2|<>:s#1-2$<i>3]" +             
-            "[(2-3)s:e|_3#2-3]");	
+        fd.addTV("base", "text", "[(0-1)s:a|_1#0-1|<>:s#0-2$<i>1]"
+                + "[(1-2)s:d|_2#1-2|<>:s#1-2$<i>3]" + "[(2-3)s:e|_3#2-3]");
         return fd;
-	}
-	
-	private FieldDocument createFieldDoc4() {
-    	FieldDocument fd = new FieldDocument();
+    }
+
+
+    private FieldDocument createFieldDoc4 () {
+        FieldDocument fd = new FieldDocument();
         fd.addString("ID", "doc-4");
-        fd.addTV("base",
-            "text",             
-            "[(0-1)s:c|_1#0-1|<>:s#0-2$<i>2]" +
-            "[(1-2)s:e|_2#1-2]" +             
-            "[(2-3)s:b|_3#2-3|<>:s#2-3$<i>3]" +
-            "[(3-4)s:e|_4#3-4|<>:s#3-4$<i>4]");
+        fd.addTV("base", "text", "[(0-1)s:c|_1#0-1|<>:s#0-2$<i>2]"
+                + "[(1-2)s:e|_2#1-2]" + "[(2-3)s:b|_3#2-3|<>:s#2-3$<i>3]"
+                + "[(3-4)s:e|_4#3-4|<>:s#3-4$<i>4]");
         return fd;
-	}
-	
-	public SpanQuery createQuery(String elementType, String x, String y, 
-			int minDistance, int maxDistance, boolean isOrdered){
-		SpanElementQuery e = new SpanElementQuery("base", elementType);
-		return new SpanDistanceQuery(        		 
-        		new SpanTermQuery(new Term("base",x)), 
-        		new SpanTermQuery(new Term("base",y)),
-        		new DistanceConstraint(e,minDistance, maxDistance, isOrdered, false),
-        		true);
-	}
-	
-	/** Only terms within an element are matched. 
-	 * */
-	@Test
-	public void testCase1() throws IOException{
-		//System.out.println("testCase1");
-		ki = new KrillIndex();
+    }
+
+
+    public SpanQuery createQuery (String elementType, String x, String y,
+            int minDistance, int maxDistance, boolean isOrdered) {
+        SpanElementQuery e = new SpanElementQuery("base", elementType);
+        return new SpanDistanceQuery(new SpanTermQuery(new Term("base", x)),
+                new SpanTermQuery(new Term("base", y)), new DistanceConstraint(
+                        e, minDistance, maxDistance, isOrdered, false), true);
+    }
+
+
+    /**
+     * Only terms within an element are matched.
+     * */
+    @Test
+    public void testCase1 () throws IOException {
+        //System.out.println("testCase1");
+        ki = new KrillIndex();
         ki.addDoc(createFieldDoc0());
         ki.commit();
-        
-        SpanQuery sq;        
-        sq = createQuery("s", "s:b", "s:c", 0, 1,false);        
+
+        SpanQuery sq;
+        sq = createQuery("s", "s:b", "s:c", 0, 1, false);
         kr = ki.search(sq, (short) 10);
-		
-        assertEquals((long) 5,kr.getTotalResults());
+
+        assertEquals((long) 5, kr.getTotalResults());
         assertEquals(0, kr.getMatch(0).startPos);
         assertEquals(1, kr.getMatch(0).endPos);
         assertEquals(0, kr.getMatch(1).startPos);
@@ -126,29 +115,32 @@
         assertEquals(3, kr.getMatch(3).startPos);
         assertEquals(5, kr.getMatch(3).endPos);
         assertEquals(4, kr.getMatch(4).startPos);
-        assertEquals(7, kr.getMatch(4).endPos);        
+        assertEquals(7, kr.getMatch(4).endPos);
 
-	}
-	
-	/** Ensure same doc.
-	 * 	In the beginning, first and second spans are already too far from each other
-	 * 	(one-list-empty case, both-list-empty-case).
-	 * */
-	@Test
-	public void testCase2() throws IOException{
-		//System.out.println("testCase2");
-		ki = new KrillIndex();
+    }
+
+
+    /**
+     * Ensure same doc.
+     * In the beginning, first and second spans are already too far
+     * from each other
+     * (one-list-empty case, both-list-empty-case).
+     * */
+    @Test
+    public void testCase2 () throws IOException {
+        //System.out.println("testCase2");
+        ki = new KrillIndex();
         ki.addDoc(createFieldDoc0());
         ki.addDoc(createFieldDoc1());
         ki.addDoc(createFieldDoc2());
         ki.commit();
-        
-        SpanQuery sq;        
-        sq = createQuery("p", "s:b", "s:e", 0, 2,false);        
+
+        SpanQuery sq;
+        sq = createQuery("p", "s:b", "s:e", 0, 2, false);
         kr = ki.search(sq, (short) 10);
 
-        assertEquals((long) 3,kr.getTotalResults());
-        assertEquals(2,kr.getMatch(0).getLocalDocID());
+        assertEquals((long) 3, kr.getTotalResults());
+        assertEquals(2, kr.getMatch(0).getLocalDocID());
         assertEquals(3, kr.getMatch(0).startPos);
         assertEquals(5, kr.getMatch(0).endPos);
         assertEquals(4, kr.getMatch(1).startPos);
@@ -156,21 +148,23 @@
         assertEquals(6, kr.getMatch(2).startPos);
         assertEquals(8, kr.getMatch(2).endPos);
     }
-	
-	/** Multiple occurrences in an element. 	 
-	 * */
-	@Test
-	public void testCase3() throws IOException{
-		//System.out.println("testCase3");
-		ki = new KrillIndex();
+
+
+    /**
+     * Multiple occurrences in an element.
+     * */
+    @Test
+    public void testCase3 () throws IOException {
+        //System.out.println("testCase3");
+        ki = new KrillIndex();
         ki.addDoc(createFieldDoc1());
         ki.commit();
-        
-        SpanQuery sq;        
-        sq = createQuery("s", "s:c", "s:e", 1, 2,false);        
+
+        SpanQuery sq;
+        sq = createQuery("s", "s:c", "s:e", 1, 2, false);
         kr = ki.search(sq, (short) 10);
-	
-        assertEquals((long) 4,kr.getTotalResults());
+
+        assertEquals((long) 4, kr.getTotalResults());
         assertEquals(1, kr.getMatch(0).startPos);
         assertEquals(6, kr.getMatch(0).endPos);
         assertEquals(1, kr.getMatch(1).startPos);
@@ -179,70 +173,71 @@
         assertEquals(6, kr.getMatch(2).endPos);
         assertEquals(3, kr.getMatch(3).startPos);
         assertEquals(7, kr.getMatch(3).endPos);
-	}
-	
-	/** Multiple documents  
-	 * 	Skip to */
-	@Test
-	public void testCase4() throws IOException{
-		//System.out.println("testCase4");
-		ki = new KrillIndex();		
+    }
+
+
+    /**
+     * Multiple documents
+     * Skip to
+     */
+    @Test
+    public void testCase4 () throws IOException {
+        //System.out.println("testCase4");
+        ki = new KrillIndex();
         ki.addDoc(createFieldDoc1());
-        ki.addDoc(createFieldDoc0());        
+        ki.addDoc(createFieldDoc0());
         ki.addDoc(createFieldDoc3());
         ki.addDoc(createFieldDoc4());
         ki.commit();
-        
+
         SpanQuery sq, edq;
-        edq = createQuery("s", "s:b", "s:c", 1, 1,false);
-		
-        sq = new SpanNextQuery(edq, 
-        		new SpanTermQuery(new Term("base", "s:e")));
-        
+        edq = createQuery("s", "s:b", "s:c", 1, 1, false);
+
+        sq = new SpanNextQuery(edq, new SpanTermQuery(new Term("base", "s:e")));
+
         kr = ki.search(sq, (short) 10);
-        
-        assertEquals((long) 4,kr.getTotalResults());
+
+        assertEquals((long) 4, kr.getTotalResults());
         assertEquals(0, kr.getMatch(0).startPos);
         assertEquals(3, kr.getMatch(0).endPos);
         assertEquals(1, kr.getMatch(1).startPos);
         assertEquals(6, kr.getMatch(1).endPos);
         assertEquals(3, kr.getMatch(2).startPos);
         assertEquals(6, kr.getMatch(2).endPos);
-        assertEquals(3,kr.getMatch(3).getLocalDocID());
+        assertEquals(3, kr.getMatch(3).getLocalDocID());
         assertEquals(0, kr.getMatch(3).startPos);
-        assertEquals(4, kr.getMatch(3).endPos);       
+        assertEquals(4, kr.getMatch(3).endPos);
 
     }
-	
-	/** Next */
-	@Test
-	public void testCase5() throws IOException{
-		ki = new KrillIndex();		
+
+
+    /** Next */
+    @Test
+    public void testCase5 () throws IOException {
+        ki = new KrillIndex();
         ki.addDoc(createFieldDoc0());
         ki.commit();
-		
+
         SpanQuery sq, edq;
-        edq = createQuery("s", "s:b", "s:c", 0, 2,false);
+        edq = createQuery("s", "s:b", "s:c", 0, 2, false);
         kr = ki.search(edq, (short) 10);
         assertEquals((long) 6, kr.getTotalResults());
 
-        sq = new SpanNextQuery( 
-        		new SpanTermQuery(new Term("base", "s:b"))
-        		,edq);
+        sq = new SpanNextQuery(new SpanTermQuery(new Term("base", "s:b")), edq);
         kr = ki.search(sq, (short) 10);
         assertEquals((long) 2, kr.getTotalResults());
         assertEquals(1, kr.getMatch(0).getStartPos());
         assertEquals(4, kr.getMatch(0).getEndPos());
         assertEquals(2, kr.getMatch(1).getStartPos());
         assertEquals(5, kr.getMatch(1).getEndPos());
-        
-//        System.out.print(kr.getTotalResults()+"\n");
-//		for (int i=0; i< kr.getTotalResults(); i++){
-//			System.out.println(
-//				kr.match(i).getLocalDocID()+" "+
-//				kr.match(i).startPos + " " +
-//				kr.match(i).endPos
-//		    );
-//		}
-	}
+
+        //        System.out.print(kr.getTotalResults()+"\n");
+        //		for (int i=0; i< kr.getTotalResults(); i++){
+        //			System.out.println(
+        //				kr.match(i).getLocalDocID()+" "+
+        //				kr.match(i).startPos + " " +
+        //				kr.match(i).endPos
+        //		    );
+        //		}
+    }
 }
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestWPDIndex.java b/src/test/java/de/ids_mannheim/korap/index/TestWPDIndex.java
index dc3b4da..1b1ef4d 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestWPDIndex.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestWPDIndex.java
@@ -26,188 +26,200 @@
 import de.ids_mannheim.korap.query.SpanRepetitionQuery;
 
 public class TestWPDIndex {
-	long start, end;
-	KrillIndex ki;
-	Result kr;
-	Krill ks;
-	
-	private SpanDistanceQuery createElementDistanceQuery(String e, String x, String y, 
-			int min, int max, boolean isOrdered, boolean exclusion){
-		SpanElementQuery eq = new SpanElementQuery("tokens", e);
-		SpanDistanceQuery sq = new SpanDistanceQuery(
-				new SpanTermQuery(new Term("tokens",x)),
-				new SpanTermQuery(new Term("tokens",y)),
-				new DistanceConstraint(eq, min, max, isOrdered, exclusion),
-        		true
-        ); 
-		return sq;
-	}
-	
-	private SpanDistanceQuery createDistanceQuery(String x, String y, int min, int max, 
-			boolean isOrdered, boolean exclusion){
-		SpanDistanceQuery sq = new SpanDistanceQuery(
-        		new SpanTermQuery(new Term("tokens",x)),
-        		new SpanTermQuery(new Term("tokens",y)),
-        		new DistanceConstraint(min, max, isOrdered, exclusion),
-        		true
-        );
-    	return sq;
+    long start, end;
+    KrillIndex ki;
+    Result kr;
+    Krill ks;
+
+
+    private SpanDistanceQuery createElementDistanceQuery (String e, String x,
+            String y, int min, int max, boolean isOrdered, boolean exclusion) {
+        SpanElementQuery eq = new SpanElementQuery("tokens", e);
+        SpanDistanceQuery sq = new SpanDistanceQuery(new SpanTermQuery(
+                new Term("tokens", x)),
+                new SpanTermQuery(new Term("tokens", y)),
+                new DistanceConstraint(eq, min, max, isOrdered, exclusion),
+                true);
+        return sq;
     }
-	
-	public TestWPDIndex() throws IOException {
-		InputStream is = getClass().getResourceAsStream("/korap.conf");
-		Properties prop = new Properties();
-		prop.load(is);
-		
-		String indexPath = prop.getProperty("lucene.indexDir");
-		MMapDirectory md = new MMapDirectory(new File(indexPath));
-		ki = new KrillIndex(md);
-	}
-	
-	/** Token distance spans */
-	@Test
-	public void testCase1() throws IOException{
-		SpanDistanceQuery sq;
-		// ordered
-		sq = createDistanceQuery("s:Wir", "s:kommen", 1, 1, true,false);
-		ks = new Krill(sq);
-		kr = ks.apply(ki);
-		assertEquals(kr.getTotalResults(), 8);
 
-		// unordered
-		sq = createDistanceQuery("s:Wir", "s:kommen", 1, 1, false,false);				
-		ks = new Krill(sq);
-		kr = ks.apply(ki);
-		assertEquals(kr.getTotalResults(), 11);
-		
-		sq = createDistanceQuery("s:kommen", "s:Wir", 1, 1, false,false);				
-		ks = new Krill(sq);
-		kr = ks.apply(ki);
-		assertEquals(kr.getTotalResults(), 11);
-		//System.out.println(kr.getTotalResults());
-		//for (Match km : kr.getMatches()){
-			//System.out.println(km.getDocID() +" "+km.getStartPos() +" "+ km.getEndPos());
-        	//System.out.println(km.getSnippetBrackets());
-        	//System.out.println(km.toJSON());
+
+    private SpanDistanceQuery createDistanceQuery (String x, String y, int min,
+            int max, boolean isOrdered, boolean exclusion) {
+        SpanDistanceQuery sq = new SpanDistanceQuery(new SpanTermQuery(
+                new Term("tokens", x)),
+                new SpanTermQuery(new Term("tokens", y)),
+                new DistanceConstraint(min, max, isOrdered, exclusion), true);
+        return sq;
+    }
+
+
+    public TestWPDIndex () throws IOException {
+        InputStream is = getClass().getResourceAsStream("/korap.conf");
+        Properties prop = new Properties();
+        prop.load(is);
+
+        String indexPath = prop.getProperty("lucene.indexDir");
+        MMapDirectory md = new MMapDirectory(new File(indexPath));
+        ki = new KrillIndex(md);
+    }
+
+
+    /** Token distance spans */
+    @Test
+    public void testCase1 () throws IOException {
+        SpanDistanceQuery sq;
+        // ordered
+        sq = createDistanceQuery("s:Wir", "s:kommen", 1, 1, true, false);
+        ks = new Krill(sq);
+        kr = ks.apply(ki);
+        assertEquals(kr.getTotalResults(), 8);
+
+        // unordered
+        sq = createDistanceQuery("s:Wir", "s:kommen", 1, 1, false, false);
+        ks = new Krill(sq);
+        kr = ks.apply(ki);
+        assertEquals(kr.getTotalResults(), 11);
+
+        sq = createDistanceQuery("s:kommen", "s:Wir", 1, 1, false, false);
+        ks = new Krill(sq);
+        kr = ks.apply(ki);
+        assertEquals(kr.getTotalResults(), 11);
+        //System.out.println(kr.getTotalResults());
+        //for (Match km : kr.getMatches()){
+        //System.out.println(km.getDocID() +" "+km.getStartPos() +" "+ km.getEndPos());
+        //System.out.println(km.getSnippetBrackets());
+        //System.out.println(km.toJSON());
         //}	
-	}
-	
-	/** Token exclusion distance spans */
-	@Test
-	public void testCase2() throws IOException{
+    }
 
-		SpanQuery q = new SpanTermQuery(new Term("tokens","s:Wir"));
-		ks = new Krill(q);
-		kr = ks.apply(ki);
-		assertEquals(kr.getTotalResults(), 1907);
-		
-		SpanDistanceQuery sq;
-		// ordered
-		sq = createDistanceQuery("s:Wir", "s:kommen", 1, 1, true, true);				
-		ks = new Krill(sq);
-		kr = ks.apply(ki);
-		assertEquals(kr.getTotalResults(), 1899);
-		
-		// unordered
-		sq = createDistanceQuery("s:Wir", "s:kommen", 1, 1, false, true);				
-		ks = new Krill(sq);
-		kr = ks.apply(ki);
-		assertEquals(kr.getTotalResults(), 1896);	
-	}
-	
-	/** Element distance spans */
-	@Test
-	public void testCase3() throws IOException{
-		// ordered
-		SpanDistanceQuery sq = createElementDistanceQuery("s","s:weg", "s:fahren", 
-				0, 1, true, false);
-		ks = new Krill(sq);
-		kr = ks.apply(ki);		
-		assertEquals(kr.getTotalResults(), 3);
-		
-		// unordered
-		sq = createElementDistanceQuery("s","s:weg", "s:fahren", 0, 1, false,false);
-		ks = new Krill(sq);
-		kr = ks.apply(ki);
-		assertEquals(kr.getTotalResults(), 5);
-		
-		// only 0
-		sq = createElementDistanceQuery("s","s:weg", "s:fahren", 0, 0, false,false);
-		kr = ki.search(sq, (short) 100);
-		assertEquals(kr.getTotalResults(), 2);
-		assertEquals("WPD_BBB.04463", kr.getMatch(0).getDocID());
-		assertEquals(1094,kr.getMatch(0).getStartPos());
-		assertEquals(1115,kr.getMatch(0).getEndPos());
-		assertEquals("WPD_III.00758", kr.getMatch(1).getDocID());
-		assertEquals(444,kr.getMatch(1).getStartPos());
-		assertEquals(451,kr.getMatch(1).getEndPos());
-		
-		// only 1
-		sq = createElementDistanceQuery("s","s:weg", "s:fahren", 1, 1, false,false);
-		ks = new Krill(sq);
-		kr = ks.apply(ki);
-		assertEquals(kr.getTotalResults(), 3);		
-	}
-	
-	/** Element distance exclusion */
-	@Test
-	public void testCase4() throws IOException{
-		SpanDistanceQuery sq = createElementDistanceQuery("s","s:weg", "s:fahren", 1, 1, false, true);
-		ks = new Krill(sq);
-		kr = ks.apply(ki);
-		assertEquals(kr.getTotalResults(), 979);
-		//0.8s
-		
-		// Check if it includes some results
-		BooleanFilter bf = new BooleanFilter();
-		bf.or("ID", "WPD_BBB.04463", "WPD_III.00758");
-		KrillCollection kc = new KrillCollection();	
-		kc.filter(bf);
-		ks.setCollection(kc);
-		kr = ks.apply(ki);		
-		assertEquals(1094,kr.getMatch(0).getStartPos());
-		assertEquals(451,kr.getMatch(1).getEndPos());		
-	}
-			
-	/** Repetition */
-	@Test
-	public void testCase5() throws IOException{
-		SpanQuery sq;
-		sq = new SpanRepetitionQuery(new SpanTermQuery(new Term("tokens","mate/p:ADJA")),1,2, true);
-		ks = new Krill(sq);
-		kr = ks.apply(ki);
-		assertEquals(kr.getTotalResults(), 4116416);
-		//0.9s
-		
-		sq = new SpanRepetitionQuery(new SpanTermQuery(new Term("tokens","mate/p:ADJA")),1,1, true);
-		ks = new Krill(sq);
-		kr = ks.apply(ki);
-		assertEquals(kr.getTotalResults(), 3879671);
-		
-		sq = new SpanRepetitionQuery(new SpanTermQuery(new Term("tokens","mate/p:ADJA")),2,2, true);
-		ks = new Krill(sq);
-		kr = ks.apply(ki);
-		assertEquals(kr.getTotalResults(), 236745);
-		//0.65s
-	}
-	
-	/** Next and repetition */
-	@Test
-	public void testCase6() throws IOException{
-		SpanQuery sq = new SpanNextQuery(
-        		new SpanTermQuery(new Term("tokens", "tt/p:NN")),
-        		new SpanRepetitionQuery(new SpanTermQuery(new Term("tokens","mate/p:ADJA")),2,2, true)
-    		);
-		ks = new Krill(sq);
-		kr = ks.apply(ki);
-		assertEquals(kr.getTotalResults(), 30223);
-		// 1.1s
-		
-		SpanQuery sq2 = new SpanNextQuery(sq,
-				new SpanTermQuery(new Term("tokens", "tt/p:NN")));
-		ks = new Krill(sq2);
-		kr = ks.apply(ki);
-		assertEquals(kr.getTotalResults(), 26607);
-		// 1.1s
-	}
+
+    /** Token exclusion distance spans */
+    @Test
+    public void testCase2 () throws IOException {
+
+        SpanQuery q = new SpanTermQuery(new Term("tokens", "s:Wir"));
+        ks = new Krill(q);
+        kr = ks.apply(ki);
+        assertEquals(kr.getTotalResults(), 1907);
+
+        SpanDistanceQuery sq;
+        // ordered
+        sq = createDistanceQuery("s:Wir", "s:kommen", 1, 1, true, true);
+        ks = new Krill(sq);
+        kr = ks.apply(ki);
+        assertEquals(kr.getTotalResults(), 1899);
+
+        // unordered
+        sq = createDistanceQuery("s:Wir", "s:kommen", 1, 1, false, true);
+        ks = new Krill(sq);
+        kr = ks.apply(ki);
+        assertEquals(kr.getTotalResults(), 1896);
+    }
+
+
+    /** Element distance spans */
+    @Test
+    public void testCase3 () throws IOException {
+        // ordered
+        SpanDistanceQuery sq = createElementDistanceQuery("s", "s:weg",
+                "s:fahren", 0, 1, true, false);
+        ks = new Krill(sq);
+        kr = ks.apply(ki);
+        assertEquals(kr.getTotalResults(), 3);
+
+        // unordered
+        sq = createElementDistanceQuery("s", "s:weg", "s:fahren", 0, 1, false,
+                false);
+        ks = new Krill(sq);
+        kr = ks.apply(ki);
+        assertEquals(kr.getTotalResults(), 5);
+
+        // only 0
+        sq = createElementDistanceQuery("s", "s:weg", "s:fahren", 0, 0, false,
+                false);
+        kr = ki.search(sq, (short) 100);
+        assertEquals(kr.getTotalResults(), 2);
+        assertEquals("WPD_BBB.04463", kr.getMatch(0).getDocID());
+        assertEquals(1094, kr.getMatch(0).getStartPos());
+        assertEquals(1115, kr.getMatch(0).getEndPos());
+        assertEquals("WPD_III.00758", kr.getMatch(1).getDocID());
+        assertEquals(444, kr.getMatch(1).getStartPos());
+        assertEquals(451, kr.getMatch(1).getEndPos());
+
+        // only 1
+        sq = createElementDistanceQuery("s", "s:weg", "s:fahren", 1, 1, false,
+                false);
+        ks = new Krill(sq);
+        kr = ks.apply(ki);
+        assertEquals(kr.getTotalResults(), 3);
+    }
+
+
+    /** Element distance exclusion */
+    @Test
+    public void testCase4 () throws IOException {
+        SpanDistanceQuery sq = createElementDistanceQuery("s", "s:weg",
+                "s:fahren", 1, 1, false, true);
+        ks = new Krill(sq);
+        kr = ks.apply(ki);
+        assertEquals(kr.getTotalResults(), 979);
+        //0.8s
+
+        // Check if it includes some results
+        BooleanFilter bf = new BooleanFilter();
+        bf.or("ID", "WPD_BBB.04463", "WPD_III.00758");
+        KrillCollection kc = new KrillCollection();
+        kc.filter(bf);
+        ks.setCollection(kc);
+        kr = ks.apply(ki);
+        assertEquals(1094, kr.getMatch(0).getStartPos());
+        assertEquals(451, kr.getMatch(1).getEndPos());
+    }
+
+
+    /** Repetition */
+    @Test
+    public void testCase5 () throws IOException {
+        SpanQuery sq;
+        sq = new SpanRepetitionQuery(new SpanTermQuery(new Term("tokens",
+                "mate/p:ADJA")), 1, 2, true);
+        ks = new Krill(sq);
+        kr = ks.apply(ki);
+        assertEquals(kr.getTotalResults(), 4116416);
+        //0.9s
+
+        sq = new SpanRepetitionQuery(new SpanTermQuery(new Term("tokens",
+                "mate/p:ADJA")), 1, 1, true);
+        ks = new Krill(sq);
+        kr = ks.apply(ki);
+        assertEquals(kr.getTotalResults(), 3879671);
+
+        sq = new SpanRepetitionQuery(new SpanTermQuery(new Term("tokens",
+                "mate/p:ADJA")), 2, 2, true);
+        ks = new Krill(sq);
+        kr = ks.apply(ki);
+        assertEquals(kr.getTotalResults(), 236745);
+        //0.65s
+    }
+
+
+    /** Next and repetition */
+    @Test
+    public void testCase6 () throws IOException {
+        SpanQuery sq = new SpanNextQuery(new SpanTermQuery(new Term("tokens",
+                "tt/p:NN")), new SpanRepetitionQuery(new SpanTermQuery(
+                new Term("tokens", "mate/p:ADJA")), 2, 2, true));
+        ks = new Krill(sq);
+        kr = ks.apply(ki);
+        assertEquals(kr.getTotalResults(), 30223);
+        // 1.1s
+
+        SpanQuery sq2 = new SpanNextQuery(sq, new SpanTermQuery(new Term(
+                "tokens", "tt/p:NN")));
+        ks = new Krill(sq2);
+        kr = ks.apply(ki);
+        assertEquals(kr.getTotalResults(), 26607);
+        // 1.1s
+    }
 }
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestWithinIndex.java b/src/test/java/de/ids_mannheim/korap/index/TestWithinIndex.java
index e91be18..9acd416 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestWithinIndex.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestWithinIndex.java
@@ -50,20 +50,19 @@
 
         // <a>x<a>y<a>zhij</a>hij</a>hij</a>
         FieldDocument fd = new FieldDocument();
-        fd.addTV("base",
-                 "x   y   z   h   i   j   h   i   j   h   i   j   ",
-                 "[(0-3)s:x|<>:a#0-36$<i>12]" + // 1
-                 "[(3-6)s:y|<>:a#3-27$<i>9]" +  // 2
-                 "[(6-9)s:z|<>:a#6-18$<i>6]" +  // 3
-                 "[(9-12)s:h]" +   // 4
-                 "[(12-15)s:i]" +  // 5
-                 "[(15-18)s:j]" +  // 6
-                 "[(18-21)s:h]" +  // 7
-                 "[(21-24)s:i]" +  // 8
-                 "[(24-27)s:j]" +  // 9
-                 "[(27-30)s:h]" +  // 10
-                 "[(30-33)s:i]" +  // 11
-                 "[(33-36)s:j]");  // 12
+        fd.addTV("base", "x   y   z   h   i   j   h   i   j   h   i   j   ",
+                "[(0-3)s:x|<>:a#0-36$<i>12]" + // 1
+                        "[(3-6)s:y|<>:a#3-27$<i>9]" +  // 2
+                        "[(6-9)s:z|<>:a#6-18$<i>6]" +  // 3
+                        "[(9-12)s:h]" +   // 4
+                        "[(12-15)s:i]" +  // 5
+                        "[(15-18)s:j]" +  // 6
+                        "[(18-21)s:h]" +  // 7
+                        "[(21-24)s:i]" +  // 8
+                        "[(24-27)s:j]" +  // 9
+                        "[(27-30)s:h]" +  // 10
+                        "[(30-33)s:i]" +  // 11
+                        "[(33-36)s:j]");  // 12
         ki.addDoc(fd);
 
         ki.commit();
@@ -71,13 +70,11 @@
         SpanQuery sq;
         Result kr;
 
-        sq = new SpanWithinQuery(
-            new SpanElementQuery("base", "a"),
-            new SpanTermQuery(new Term("base", "s:h"))
-        );
+        sq = new SpanWithinQuery(new SpanElementQuery("base", "a"),
+                new SpanTermQuery(new Term("base", "s:h")));
 
         kr = ki.search(sq, (short) 10);
-	
+
         assertEquals("totalResults", kr.getTotalResults(), 6);
 
         assertEquals("StartPos (0)", 0, kr.getMatch(0).startPos);
@@ -92,10 +89,11 @@
         assertEquals("EndPos (4)", 9, kr.getMatch(4).endPos);
         assertEquals("StartPos (5)", 2, kr.getMatch(5).startPos);
         assertEquals("EndPos (5)", 6, kr.getMatch(5).endPos);
-        
+
         assertEquals(1, ki.numberOf("documents"));
     };
 
+
     @Test
     public void indexExample1b () throws IOException {
         // Cases 9, 12, 13
@@ -103,56 +101,52 @@
 
         // <a>x<a>y<a>zhij</a>hij</a>hij</a>
         FieldDocument fd = new FieldDocument();
-        fd.addTV("base",
-                 "x   y   z   h   i   j   h   i   j   h   i   j   ",
-                 "[(0-3)s:x|<>:a#0-36$<i>12]" + // 1
-                 "[(3-6)s:y|<>:a#3-27$<i>9]" +  // 2
-                 "[(6-9)s:z|<>:a#6-18$<i>6]" +  // 3
-                 "[(9-12)s:h]" +   // 4
-                 "[(12-15)s:i]" +  // 5
-                 "[(15-18)s:j]" +  // 6
-                 "[(18-21)s:h]" +  // 7
-                 "[(21-24)s:i]" +  // 8
-                 "[(24-27)s:j]" +  // 9
-                 "[(27-30)s:h]" +  // 10
-                 "[(30-33)s:i]" +  // 11
-                 "[(33-36)s:j]");  // 12
+        fd.addTV("base", "x   y   z   h   i   j   h   i   j   h   i   j   ",
+                "[(0-3)s:x|<>:a#0-36$<i>12]" + // 1
+                        "[(3-6)s:y|<>:a#3-27$<i>9]" +  // 2
+                        "[(6-9)s:z|<>:a#6-18$<i>6]" +  // 3
+                        "[(9-12)s:h]" +   // 4
+                        "[(12-15)s:i]" +  // 5
+                        "[(15-18)s:j]" +  // 6
+                        "[(18-21)s:h]" +  // 7
+                        "[(21-24)s:i]" +  // 8
+                        "[(24-27)s:j]" +  // 9
+                        "[(27-30)s:h]" +  // 10
+                        "[(30-33)s:i]" +  // 11
+                        "[(33-36)s:j]");  // 12
         ki.addDoc(fd);
 
         // <a>x<a>y<a>zhij</a>hij</a>hij</a>
         fd = new FieldDocument();
-        fd.addTV("base",
-                 "x   y   z   h   i   j   h   i   j   h   i   j   ",
-                 "[(0-3)s:x|<>:a#0-36$<i>12]" + // 1
-                 "[(3-6)s:y|<>:a#3-27$<i>9]" +  // 2
-                 "[(6-9)s:z|<>:a#6-18$<i>6]" +  // 3
-                 "[(9-12)s:h]" +   // 4
-                 "[(12-15)s:i]" +  // 5
-                 "[(15-18)s:j]" +  // 6
-                 "[(18-21)s:h]" +  // 7
-                 "[(21-24)s:i]" +  // 8
-                 "[(24-27)s:j]" +  // 9
-                 "[(27-30)s:h]" +  // 10
-                 "[(30-33)s:i]" +  // 11
-                 "[(33-36)s:j]");  // 12
+        fd.addTV("base", "x   y   z   h   i   j   h   i   j   h   i   j   ",
+                "[(0-3)s:x|<>:a#0-36$<i>12]" + // 1
+                        "[(3-6)s:y|<>:a#3-27$<i>9]" +  // 2
+                        "[(6-9)s:z|<>:a#6-18$<i>6]" +  // 3
+                        "[(9-12)s:h]" +   // 4
+                        "[(12-15)s:i]" +  // 5
+                        "[(15-18)s:j]" +  // 6
+                        "[(18-21)s:h]" +  // 7
+                        "[(21-24)s:i]" +  // 8
+                        "[(24-27)s:j]" +  // 9
+                        "[(27-30)s:h]" +  // 10
+                        "[(30-33)s:i]" +  // 11
+                        "[(33-36)s:j]");  // 12
         ki.addDoc(fd);
 
 
         // Save documents
         ki.commit();
-        
+
         SpanQuery sq;
         Result kr;
 
-        sq = new SpanWithinQuery(
-            new SpanElementQuery("base", "a"),
-            new SpanTermQuery(new Term("base", "s:h"))
-        );
+        sq = new SpanWithinQuery(new SpanElementQuery("base", "a"),
+                new SpanTermQuery(new Term("base", "s:h")));
 
         kr = ki.search(sq, (short) 15);
-	
+
         assertEquals("totalResults", kr.getTotalResults(), 12);
-	
+
         assertEquals("StartPos (0)", 0, kr.getMatch(0).startPos);
         assertEquals("EndPos (0)", 12, kr.getMatch(0).endPos);
         assertEquals("Doc (0)", 0, kr.getMatch(0).internalDocID);
@@ -192,10 +186,10 @@
         assertEquals("Doc (11)", 1, kr.getMatch(11).internalDocID);
 
         /*
-		for (Match km : kr.getMatches()){		
-			System.out.println(km.getStartPos() +","+km.getEndPos()+" "
+        for (Match km : kr.getMatches()){		
+        	System.out.println(km.getStartPos() +","+km.getEndPos()+" "
                                +km.getSnippetBrackets());
-		};	
+        };	
         */
 
         assertEquals(2, ki.numberOf("documents"));
@@ -209,53 +203,49 @@
 
         // <a>x<a>y<a>zhij</a>hij</a>hij</a>
         FieldDocument fd = new FieldDocument();
-        fd.addTV("base",
-                 "x   y   z   h   i   j   h   i   j   h   i   j   ",
-                 "[(0-3)s:x|<>:a#0-36$<i>12]" + // 1
-                 "[(3-6)s:y|<>:a#3-27$<i>9]" +  // 2
-                 "[(6-9)s:z|<>:a#6-18$<i>6]" +  // 3
-                 "[(9-12)s:h]" +   // 4
-                 "[(12-15)s:i]" +  // 5
-                 "[(15-18)s:j]" +  // 6
-                 "[(18-21)s:h]" +  // 7
-                 "[(21-24)s:i]" +  // 8
-                 "[(24-27)s:j]" +  // 9
-                 "[(27-30)s:h]" +  // 10
-                 "[(30-33)s:i]" +  // 11
-                 "[(33-36)s:j]");  // 12
+        fd.addTV("base", "x   y   z   h   i   j   h   i   j   h   i   j   ",
+                "[(0-3)s:x|<>:a#0-36$<i>12]" + // 1
+                        "[(3-6)s:y|<>:a#3-27$<i>9]" +  // 2
+                        "[(6-9)s:z|<>:a#6-18$<i>6]" +  // 3
+                        "[(9-12)s:h]" +   // 4
+                        "[(12-15)s:i]" +  // 5
+                        "[(15-18)s:j]" +  // 6
+                        "[(18-21)s:h]" +  // 7
+                        "[(21-24)s:i]" +  // 8
+                        "[(24-27)s:j]" +  // 9
+                        "[(27-30)s:h]" +  // 10
+                        "[(30-33)s:i]" +  // 11
+                        "[(33-36)s:j]");  // 12
         ki.addDoc(fd);
-        
+
         // <a>x<a>y<a>zabc</a>abc</a>abc</a>
         fd = new FieldDocument();
-        fd.addTV("base",
-                 "x   y   z   a   b   c   a   b   c   a   b   c   ",
-                 "[(0-3)s:x|<>:a#0-36$<i>12]" + // 1
-                 "[(3-6)s:y|<>:a#3-27$<i>9]" +  // 2
-                 "[(6-9)s:z|<>:a#6-18$<i>6]" +  // 3
-                 "[(9-12)s:a]" +   // 4
-                 "[(12-15)s:b]" +  // 5
-                 "[(15-18)s:c]" +  // 6
-                 "[(18-21)s:a]" +  // 7
-                 "[(21-24)s:b]" +  // 8
-                 "[(24-27)s:c]" +  // 9
-                 "[(27-30)s:a]" +  // 10
-                 "[(30-33)s:b]" +  // 11
-                 "[(33-36)s:c]");  // 12
+        fd.addTV("base", "x   y   z   a   b   c   a   b   c   a   b   c   ",
+                "[(0-3)s:x|<>:a#0-36$<i>12]" + // 1
+                        "[(3-6)s:y|<>:a#3-27$<i>9]" +  // 2
+                        "[(6-9)s:z|<>:a#6-18$<i>6]" +  // 3
+                        "[(9-12)s:a]" +   // 4
+                        "[(12-15)s:b]" +  // 5
+                        "[(15-18)s:c]" +  // 6
+                        "[(18-21)s:a]" +  // 7
+                        "[(21-24)s:b]" +  // 8
+                        "[(24-27)s:c]" +  // 9
+                        "[(27-30)s:a]" +  // 10
+                        "[(30-33)s:b]" +  // 11
+                        "[(33-36)s:c]");  // 12
         ki.addDoc(fd);
-        
+
         // Save documents
         ki.commit();
 
         SpanQuery sq;
         Result kr;
 
-        sq = new SpanWithinQuery(
-            new SpanElementQuery("base", "a"),
-            new SpanTermQuery(new Term("base", "s:h"))
-        );
+        sq = new SpanWithinQuery(new SpanElementQuery("base", "a"),
+                new SpanTermQuery(new Term("base", "s:h")));
 
         kr = ki.search(sq, (short) 15);
-	
+
         assertEquals("totalResults", kr.getTotalResults(), 6);
 
         assertEquals("StartPos (0)", 0, kr.getMatch(0).startPos);
@@ -288,47 +278,43 @@
 
         // <a>x<a>y<a>zhij</a>hij</a>hij</a>
         FieldDocument fd = new FieldDocument();
-        fd.addTV("base",
-                 "x   y   z   h   i   j   h   i   j   h   i   j   ",
-                 "[(0-3)s:x|<>:a#0-36$<i>12]" + // 1
-                 "[(3-6)s:y|<>:a#3-27$<i>9]" +  // 2
-                 "[(6-9)s:z|<>:a#6-18$<i>6]" +  // 3
-                 "[(9-12)s:h]" +   // 4
-                 "[(12-15)s:i]" +  // 5
-                 "[(15-18)s:j]" +  // 6
-                 "[(18-21)s:h]" +  // 7
-                 "[(21-24)s:i]" +  // 8
-                 "[(24-27)s:j]" +  // 9
-                 "[(27-30)s:h]" +  // 10
-                 "[(30-33)s:i]" +  // 11
-                 "[(33-36)s:j]");  // 12
+        fd.addTV("base", "x   y   z   h   i   j   h   i   j   h   i   j   ",
+                "[(0-3)s:x|<>:a#0-36$<i>12]" + // 1
+                        "[(3-6)s:y|<>:a#3-27$<i>9]" +  // 2
+                        "[(6-9)s:z|<>:a#6-18$<i>6]" +  // 3
+                        "[(9-12)s:h]" +   // 4
+                        "[(12-15)s:i]" +  // 5
+                        "[(15-18)s:j]" +  // 6
+                        "[(18-21)s:h]" +  // 7
+                        "[(21-24)s:i]" +  // 8
+                        "[(24-27)s:j]" +  // 9
+                        "[(27-30)s:h]" +  // 10
+                        "[(30-33)s:i]" +  // 11
+                        "[(33-36)s:j]");  // 12
         ki.addDoc(fd);
 
         fd = new FieldDocument();
-        fd.addTV("base",
-                 "x   y   z   h   ",
-                 "[(0-3)s:x]" +  // 1
-                 "[(3-6)s:y]" +  // 2
-                 "[(6-9)s:z]" +  // 3
-                 "[(9-12)s:h]"); // 4
+        fd.addTV("base", "x   y   z   h   ", "[(0-3)s:x]" +  // 1
+                "[(3-6)s:y]" +  // 2
+                "[(6-9)s:z]" +  // 3
+                "[(9-12)s:h]"); // 4
         ki.addDoc(fd);
 
         // <a>x<a>y<a>zabc</a>abc</a>abc</a>
         fd = new FieldDocument();
-        fd.addTV("base",
-                 "x   y   z   a   b   c   a   b   c   a   b   c   ",
-                 "[(0-3)s:x|<>:a#0-36$<i>12]" + // 1
-                 "[(3-6)s:y|<>:a#3-27$<i>9]" +  // 2
-                 "[(6-9)s:z|<>:a#6-18$<i>6]" +  // 3
-                 "[(9-12)s:a]" +   // 4
-                 "[(12-15)s:b]" +  // 5
-                 "[(15-18)s:c]" +  // 6
-                 "[(18-21)s:a]" +  // 7
-                 "[(21-24)s:b]" +  // 8
-                 "[(24-27)s:c]" +  // 9
-                 "[(27-30)s:a]" +  // 10
-                 "[(30-33)s:b]" +  // 11
-                 "[(33-36)s:c]");  // 12
+        fd.addTV("base", "x   y   z   a   b   c   a   b   c   a   b   c   ",
+                "[(0-3)s:x|<>:a#0-36$<i>12]" + // 1
+                        "[(3-6)s:y|<>:a#3-27$<i>9]" +  // 2
+                        "[(6-9)s:z|<>:a#6-18$<i>6]" +  // 3
+                        "[(9-12)s:a]" +   // 4
+                        "[(12-15)s:b]" +  // 5
+                        "[(15-18)s:c]" +  // 6
+                        "[(18-21)s:a]" +  // 7
+                        "[(21-24)s:b]" +  // 8
+                        "[(24-27)s:c]" +  // 9
+                        "[(27-30)s:a]" +  // 10
+                        "[(30-33)s:b]" +  // 11
+                        "[(33-36)s:c]");  // 12
         ki.addDoc(fd);
 
         // Save documents
@@ -340,13 +326,11 @@
         sq = new SpanElementQuery("base", "a");
         kr = ki.search(sq, (short) 15);
 
-        sq = new SpanWithinQuery(
-            new SpanElementQuery("base", "a"),
-            new SpanTermQuery(new Term("base", "s:h"))
-        );
+        sq = new SpanWithinQuery(new SpanElementQuery("base", "a"),
+                new SpanTermQuery(new Term("base", "s:h")));
 
         kr = ki.search(sq, (short) 15);
-	
+
         assertEquals("totalResults", kr.getTotalResults(), 6);
 
         assertEquals("StartPos (0)", 0, kr.getMatch(0).startPos);
@@ -367,10 +351,11 @@
         assertEquals("StartPos (5)", 2, kr.getMatch(5).startPos);
         assertEquals("EndPos (5)", 6, kr.getMatch(5).endPos);
         assertEquals("Doc (5)", 0, kr.getMatch(5).internalDocID);
-        
+
         assertEquals(3, ki.numberOf("documents"));
     };
-    
+
+
     @Test
     public void indexExample2a () throws IOException {
         KrillIndex ki = new KrillIndex();
@@ -378,18 +363,18 @@
         // <a><a><a>h</a>hij</a>hij</a>
         FieldDocument fd = new FieldDocument();
         fd.addTV("base",
-                 // <a><a>hhij</a>hijh</a>ij</a>
-                 "h  h  i  j  h  i  j  h  i  j        ",
-                 "[s:h|_0#0-3|<>:a#0-24$<i>7|<>:a#0-12$<i>3|<>:a#0-30$<i>9]" + // 1
-                 "[s:h|_1#3-6]" +    // 2
-                 "[s:i|_2#6-9]" +    // 3
-                 "[s:j|_3#9-12]" +   // 4
-                 "[s:h|_4#12-15]" +  // 5
-                 "[s:i|_5#15-18]" +  // 6
-                 "[s:j|_6#18-21]" +  // 7
-                 "[s:h|_7#21-24]" +  // 8
-                 "[s:i|_8#24-27]" +  // 9
-                 "[s:j|_9#27-30]");  // 10
+                // <a><a>hhij</a>hijh</a>ij</a>
+                "h  h  i  j  h  i  j  h  i  j        ",
+                "[s:h|_0#0-3|<>:a#0-24$<i>7|<>:a#0-12$<i>3|<>:a#0-30$<i>9]" + // 1
+                        "[s:h|_1#3-6]" +    // 2
+                        "[s:i|_2#6-9]" +    // 3
+                        "[s:j|_3#9-12]" +   // 4
+                        "[s:h|_4#12-15]" +  // 5
+                        "[s:i|_5#15-18]" +  // 6
+                        "[s:j|_6#18-21]" +  // 7
+                        "[s:h|_7#21-24]" +  // 8
+                        "[s:i|_8#24-27]" +  // 9
+                        "[s:j|_9#27-30]");  // 10
         ki.addDoc(fd);
 
         // Save documents
@@ -410,11 +395,9 @@
         assertEquals("EndPos (1)", 7, kr.getMatch(1).endPos);
         assertEquals("StartPos (2)", 0, kr.getMatch(2).startPos);
         assertEquals("EndPos (2)", 9, kr.getMatch(2).endPos);
-	    
-        sq = new SpanWithinQuery(
-            new SpanElementQuery("base", "a"),
-            new SpanTermQuery(new Term("base", "s:h"))
-        );
+
+        sq = new SpanWithinQuery(new SpanElementQuery("base", "a"),
+                new SpanTermQuery(new Term("base", "s:h")));
 
         kr = ki.search(sq, (short) 10);
 
@@ -444,6 +427,7 @@
         assertEquals("EndPos (9)", 9, kr.getMatch(9).endPos);
     };
 
+
     @Test
     public void indexExample2b () throws IOException {
         KrillIndex ki = new KrillIndex();
@@ -451,19 +435,18 @@
         // 6,9,12
         // <a><a><a>h</a>hij</a>hij</a>h
         FieldDocument fd = new FieldDocument();
-        fd.addTV("base",
-                 "h  h  i  j  h  i  j  h  i  j  h  ",
-                 "[(0-3)s:h|<>:a#0-21$<i>6|<>:a#0-12$<i>3|<>:a#0-30$<i>9]" + // 1
-                 "[(3-6)s:h]" +    // 2
-                 "[(6-9)s:i]" +    // 3
-                 "[(9-12)s:j]" +   // 4
-                 "[(12-15)s:h]" +  // 5
-                 "[(15-18)s:i]" +  // 6
-                 "[(18-21)s:j]" +  // 7
-                 "[(21-24)s:h]" +  // 8
-                 "[(24-27)s:i]" +  // 9
-                 "[(27-30)s:j]" +  // 10
-                 "[(30-33)s:h]");
+        fd.addTV("base", "h  h  i  j  h  i  j  h  i  j  h  ",
+                "[(0-3)s:h|<>:a#0-21$<i>6|<>:a#0-12$<i>3|<>:a#0-30$<i>9]" + // 1
+                        "[(3-6)s:h]" +    // 2
+                        "[(6-9)s:i]" +    // 3
+                        "[(9-12)s:j]" +   // 4
+                        "[(12-15)s:h]" +  // 5
+                        "[(15-18)s:i]" +  // 6
+                        "[(18-21)s:j]" +  // 7
+                        "[(21-24)s:h]" +  // 8
+                        "[(24-27)s:i]" +  // 9
+                        "[(27-30)s:j]" +  // 10
+                        "[(30-33)s:h]");
         ki.addDoc(fd);
 
         // Save documents
@@ -481,11 +464,9 @@
         assertEquals("EndPos (1)", 6, kr.getMatch(1).endPos);
         assertEquals("StartPos (2)", 0, kr.getMatch(2).startPos);
         assertEquals("EndPos (2)", 9, kr.getMatch(2).endPos);
-        
-        sq = new SpanWithinQuery(
-            new SpanElementQuery("base", "a"),
-            new SpanTermQuery(new Term("base", "s:h"))
-        );
+
+        sq = new SpanWithinQuery(new SpanElementQuery("base", "a"),
+                new SpanTermQuery(new Term("base", "s:h")));
 
         kr = ki.search(sq, (short) 10);
 
@@ -518,22 +499,21 @@
         // 2, 6, 9, 12
         // <a><a><a>h</a>hij</a>hij</a>h<a>i</i>
         FieldDocument fd = new FieldDocument();
-        fd.addTV("base",
-                 "h  h  i  j  h  i  j  h  i  j  h  i  ",
-                 "[(0-3)s:h|<>:a#0-21$<i>7|<>:a#0-15$<i>4|<>:a#0-30$<i>10]" + // 1
-                 "[(3-6)s:h]" +    // 2
-                 "[(6-9)s:i]" +  // 3
-                 "[(9-12)s:j]" +  // 4
-                 "[(12-15)s:h]" +  // 5
-                 "[(15-18)s:i]" +  // 6
-                 "[(18-21)s:j]" +  // 7
-                 "[(21-24)s:h]" +  // 8
-                 "[(24-27)s:i]" +  // 9
-                 "[(27-30)s:j]" +  // 10
-                 "[(30-33)s:h]" +  // 11
-                 "[(33-36)s:i|<>:a#33-36$<i>12]"); // 12
+        fd.addTV("base", "h  h  i  j  h  i  j  h  i  j  h  i  ",
+                "[(0-3)s:h|<>:a#0-21$<i>7|<>:a#0-15$<i>4|<>:a#0-30$<i>10]" + // 1
+                        "[(3-6)s:h]" +    // 2
+                        "[(6-9)s:i]" +  // 3
+                        "[(9-12)s:j]" +  // 4
+                        "[(12-15)s:h]" +  // 5
+                        "[(15-18)s:i]" +  // 6
+                        "[(18-21)s:j]" +  // 7
+                        "[(21-24)s:h]" +  // 8
+                        "[(24-27)s:i]" +  // 9
+                        "[(27-30)s:j]" +  // 10
+                        "[(30-33)s:h]" +  // 11
+                        "[(33-36)s:i|<>:a#33-36$<i>12]"); // 12
         ki.addDoc(fd);
-        
+
         // Save documents
         ki.commit();
 
@@ -542,7 +522,7 @@
         SpanQuery sq = new SpanElementQuery("base", "a");
 
         Result kr = ki.search(sq, (short) 10);
-    
+
         assertEquals("totalResults", kr.getTotalResults(), 4);
         assertEquals("StartPos (0)", 0, kr.getMatch(0).startPos);
         assertEquals("EndPos (0)", 4, kr.getMatch(0).endPos);
@@ -553,10 +533,8 @@
         assertEquals("StartPos (3)", 11, kr.getMatch(3).startPos);
         assertEquals("EndPos (3)", 12, kr.getMatch(3).endPos);
 
-        sq = new SpanWithinQuery(
-	        new SpanElementQuery("base", "a"),
-            new SpanTermQuery(new Term("base", "s:h"))
-        );
+        sq = new SpanWithinQuery(new SpanElementQuery("base", "a"),
+                new SpanTermQuery(new Term("base", "s:h")));
 
         kr = ki.search(sq, (short) 10);
 
@@ -567,7 +545,7 @@
         assertEquals("EndPos (1)", 4, kr.getMatch(1).endPos);
         assertEquals("StartPos (2)", 0, kr.getMatch(2).startPos);
         assertEquals("EndPos (2)", 4, kr.getMatch(2).endPos);
-      
+
         assertEquals("StartPos (3)", 0, kr.getMatch(3).startPos);
         assertEquals("EndPos (3)", 7, kr.getMatch(3).endPos);
         assertEquals("StartPos (4)", 0, kr.getMatch(4).startPos);
@@ -589,24 +567,24 @@
     @Test
     public void indexExample2d () throws IOException {
         KrillIndex ki = new KrillIndex();
-        
+
         // 2, 6, 9, 12, 7
         // <a><a><a>h</a>hij</a>hij</a>h<a>h</h>
         FieldDocument fd = new FieldDocument();
-        fd.addTV("base",
-                 "h  h  i  j  h  i  j  h  i  j  h  h  ",
-                 "[(0-3)s:h|_0#0-3|<>:a#0-18$<i>6|<>:a#0-15$<i>4|<>:a#0-27$<i>8]" + // 1
-                 "[(3-6)s:h|_1#3-6]" +    // 2
-                 "[(6-9)s:i|_2#6-9]" +  // 3
-                 "[(9-12)s:j|_3#9-12]" +  // 4
-                 "[(12-15)s:h|_4#12-15]" +  // 5
-                 "[(15-18)s:i|_5#15-18]" +  // 6
-                 "[(18-21)s:j|_6#18-21]" +  // 7
-                 "[(21-24)s:h|_7#21-24]" +  // 8
-                 "[(24-27)s:i|_8#24-27]" +  // 9
-                 "[(27-30)s:j|_9#27-30]" +  // 10
-                 "[(30-33)s:h|_10#30-33|<>:a#30-36$<i>12]" + // 11
-                 "[(33-36)s:h|_11#33-36|<>:a#33-36$<i>12]"); // 12
+        fd.addTV("base", "h  h  i  j  h  i  j  h  i  j  h  h  ",
+                "[(0-3)s:h|_0#0-3|<>:a#0-18$<i>6|<>:a#0-15$<i>4|<>:a#0-27$<i>8]"
+                        + // 1
+                        "[(3-6)s:h|_1#3-6]" +    // 2
+                        "[(6-9)s:i|_2#6-9]" +  // 3
+                        "[(9-12)s:j|_3#9-12]" +  // 4
+                        "[(12-15)s:h|_4#12-15]" +  // 5
+                        "[(15-18)s:i|_5#15-18]" +  // 6
+                        "[(18-21)s:j|_6#18-21]" +  // 7
+                        "[(21-24)s:h|_7#21-24]" +  // 8
+                        "[(24-27)s:i|_8#24-27]" +  // 9
+                        "[(27-30)s:j|_9#27-30]" +  // 10
+                        "[(30-33)s:h|_10#30-33|<>:a#30-36$<i>12]" + // 11
+                        "[(33-36)s:h|_11#33-36|<>:a#33-36$<i>12]"); // 12
         ki.addDoc(fd);
 
         // Save documents
@@ -617,7 +595,7 @@
         SpanQuery sq = new SpanElementQuery("base", "a");
 
         Result kr = ki.search(sq, (short) 10);
-    
+
         assertEquals("totalResults", kr.getTotalResults(), 5);
 
         assertEquals("StartPos (0)", 0, kr.getMatch(0).startPos);
@@ -631,10 +609,8 @@
         assertEquals("StartPos (4)", 11, kr.getMatch(4).startPos);
         assertEquals("EndPos (4)", 12, kr.getMatch(4).endPos);
 
-        sq = new SpanWithinQuery(
-            new SpanElementQuery("base", "a"),
-            new SpanTermQuery(new Term("base", "s:h"))
-        );
+        sq = new SpanWithinQuery(new SpanElementQuery("base", "a"),
+                new SpanTermQuery(new Term("base", "s:h")));
 
         kr = ki.search(sq, (short) 15);
 
@@ -678,84 +654,56 @@
 
         // <a><a><a>u</a></a></a>
         FieldDocument fd = new FieldDocument();
-        fd.addTV("base",
-                 "xyz",
-                 "[(0-3)s:xyz|<>:a#0-3$<i>0|<>:a#0-3$<i>0|<>:a#0-3$<i>0|<>:b#0-3$<i>0]");
+        fd.addTV("base", "xyz",
+                "[(0-3)s:xyz|<>:a#0-3$<i>0|<>:a#0-3$<i>0|<>:a#0-3$<i>0|<>:b#0-3$<i>0]");
         ki.addDoc(fd);
-        
+
         // <a><b>x<a>y<a>zcde</a>cde</a>cde</b></a>
         fd = new FieldDocument();
-        fd.addTV("base",
-                 "x   y   z   c   d   e   c   d   e   c   d   e   ",
-                 "[(0-3)s:x|<>:a#0-36$<i>12|<>:b#0-36$<i>12]" +
-                 "[(3-6)s:y|<>:a#3-27$<i>9]" +
-                 "[(6-9)s:z|<>:a#6-18$<i>6]" +
-                 "[(9-12)s:c]" +
-                 "[(12-15)s:d]" +
-                 "[(15-18)s:e]" +
-                 "[(18-21)s:c]" +
-                 "[(21-24)s:d]" +
-                 "[(24-27)s:e]" +
-                 "[(27-30)s:c]" +
-                 "[(30-33)s:d]" +
-                 "[(33-36)s:e]");
+        fd.addTV("base", "x   y   z   c   d   e   c   d   e   c   d   e   ",
+                "[(0-3)s:x|<>:a#0-36$<i>12|<>:b#0-36$<i>12]"
+                        + "[(3-6)s:y|<>:a#3-27$<i>9]"
+                        + "[(6-9)s:z|<>:a#6-18$<i>6]" + "[(9-12)s:c]"
+                        + "[(12-15)s:d]" + "[(15-18)s:e]" + "[(18-21)s:c]"
+                        + "[(21-24)s:d]" + "[(24-27)s:e]" + "[(27-30)s:c]"
+                        + "[(30-33)s:d]" + "[(33-36)s:e]");
         ki.addDoc(fd);
 
         // xyz
         fd = new FieldDocument();
-        fd.addTV("base",
-                 "x   y   z   ",
-                 "[(0-3)s:x]" +
-                 "[(3-6)s:y]" +
-                 "[(6-9)s:z]");
+        fd.addTV("base", "x   y   z   ", "[(0-3)s:x]" + "[(3-6)s:y]"
+                + "[(6-9)s:z]");
         ki.addDoc(fd);
-        
+
         // <a>x<a><b>y<a>zcde</a>cde</b></a>cde</a>
         fd = new FieldDocument();
-        fd.addTV("base",
-                 "x   y   z   k   l   m   k   l   m   k   l   m   ",
-                 "[(0-3)s:x|<>:a#0-3$<i>12]" +
-                 "[(3-6)s:y|<>:a#3-6$<i>9|<>:b#3-6$<i>9]" +
-                 "[(6-9)s:z|<>:a#6-9$<i>6]" +
-                 "[(9-12)s:k]" +
-                 "[(12-15)s:l]" +
-                 "[(15-18)s:m]" +
-                 "[(18-21)s:k]" +
-                 "[(21-24)s:l]" +
-                 "[(24-27)s:m]" +
-                 "[(27-30)s:k]" +
-                 "[(30-33)s:l]" +
-                 "[(33-36)s:m]");
+        fd.addTV("base", "x   y   z   k   l   m   k   l   m   k   l   m   ",
+                "[(0-3)s:x|<>:a#0-3$<i>12]"
+                        + "[(3-6)s:y|<>:a#3-6$<i>9|<>:b#3-6$<i>9]"
+                        + "[(6-9)s:z|<>:a#6-9$<i>6]" + "[(9-12)s:k]"
+                        + "[(12-15)s:l]" + "[(15-18)s:m]" + "[(18-21)s:k]"
+                        + "[(21-24)s:l]" + "[(24-27)s:m]" + "[(27-30)s:k]"
+                        + "[(30-33)s:l]" + "[(33-36)s:m]");
         ki.addDoc(fd);
 
         // <a><a><a>h</a>hhij</a>hij</a>hij</a>
         fd = new FieldDocument();
-        fd.addTV("base",
-                 "h   i   j   h   i   j   h   i   j   ",
-                 "[(0-3)s:h|<>:a#0-27$<i>6|<>:a#0-18$<i>3|<>:a#0-36$<i>9]" +
-                 "[(3-6)s:h]" +
-                 "[(12-15)s:i]" +
-                 "[(15-18)s:j]" +
-                 "[(18-21)s:h]" +
-                 "[(21-24)s:i]" +
-                 "[(24-27)s:j]" +
-                 "[(27-30)s:h]" +
-                 "[(30-33)s:i]" +
-                 "[(33-36)s:j]");
+        fd.addTV("base", "h   i   j   h   i   j   h   i   j   ",
+                "[(0-3)s:h|<>:a#0-27$<i>6|<>:a#0-18$<i>3|<>:a#0-36$<i>9]"
+                        + "[(3-6)s:h]" + "[(12-15)s:i]" + "[(15-18)s:j]"
+                        + "[(18-21)s:h]" + "[(21-24)s:i]" + "[(24-27)s:j]"
+                        + "[(27-30)s:h]" + "[(30-33)s:i]" + "[(33-36)s:j]");
         ki.addDoc(fd);
 
         // xyz
         fd = new FieldDocument();
-        fd.addTV("base",
-                 "a  b  c  ",
-                 "[(0-3)s:a]" +
-                 "[(3-6)s:b]" +
-                 "[(6-9)s:c]");
+        fd.addTV("base", "a  b  c  ", "[(0-3)s:a]" + "[(3-6)s:b]"
+                + "[(6-9)s:c]");
         ki.addDoc(fd);
 
         // Save documents
         ki.commit();
-    
+
         assertEquals(6, ki.numberOf("documents"));
 
         SpanQuery sq = new SpanElementQuery("base", "a");
@@ -782,7 +730,7 @@
         assertEquals("EndPos (7)", 9, kr.getMatch(7).endPos);
         assertEquals("StartPos (8)", 2, kr.getMatch(8).startPos);
         assertEquals("EndPos (8)", 6, kr.getMatch(8).endPos);
-        
+
         assertEquals("StartPos (9)", 0, kr.getMatch(9).startPos);
         assertEquals("EndPos (9)", 3, kr.getMatch(9).endPos);
         assertEquals("StartPos (10)", 0, kr.getMatch(10).startPos);
@@ -791,6 +739,7 @@
         assertEquals("EndPos (11)", 9, kr.getMatch(11).endPos);
     };
 
+
     @Test
     public void indexExample3Offsets () throws IOException {
         KrillIndex ki = new KrillIndex();
@@ -798,109 +747,87 @@
         // Er schrie: <s>"Das war ich!"</s>
         FieldDocument fd = new FieldDocument();
         fd = new FieldDocument();
-        fd.addTV("base",
-                 "Er schrie: \"Das war ich!\" und ging.",
-                 "[(0-2)s:Er|_0#0-3]" +
-                 "[(3-9)s:schrie|_1#3-9]" +
-                 "[(12-15)s:Das|_2#12-15|<>:sentence#11-25$<i>5]" +
-                 "[(16-19)s:war|_3#16-19]" +
-                 "[(20-23)s:ich|_4#20-23]" +
-                 "[(26-29)s:und|_5#26-29]" +
-                 "[(30-34)s:ging|_6#30-34]");
+        fd.addTV("base", "Er schrie: \"Das war ich!\" und ging.",
+                "[(0-2)s:Er|_0#0-3]" + "[(3-9)s:schrie|_1#3-9]"
+                        + "[(12-15)s:Das|_2#12-15|<>:sentence#11-25$<i>5]"
+                        + "[(16-19)s:war|_3#16-19]" + "[(20-23)s:ich|_4#20-23]"
+                        + "[(26-29)s:und|_5#26-29]"
+                        + "[(30-34)s:ging|_6#30-34]");
         ki.addDoc(fd);
 
         // Save documents
         ki.commit();
-        
-        SpanQuery sq = new SpanClassQuery(new SpanElementQuery("base", "sentence"), (byte)3);
+
+        SpanQuery sq = new SpanClassQuery(new SpanElementQuery("base",
+                "sentence"), (byte) 3);
         Result kr;
         kr = ki.search(sq, 0, (short) 15, true, (short) 1, true, (short) 1);
         assertEquals("totalResults", kr.getTotalResults(), 1);
-        
-        assertEquals("... schrie: [\"{3:Das war ich}!\"] und ...",kr.getMatch(0).getSnippetBrackets());
-        assertEquals("<span class=\"context-left\"><span class=\"more\"></span>schrie: </span><mark>&quot;<mark class=\"class-3 level-0\">Das war ich</mark>!&quot;</mark><span class=\"context-right\"> und<span class=\"more\"></span></span>",kr.getMatch(0).getSnippetHTML());
+
+        assertEquals("... schrie: [\"{3:Das war ich}!\"] und ...",
+                kr.getMatch(0).getSnippetBrackets());
+        assertEquals(
+                "<span class=\"context-left\"><span class=\"more\"></span>schrie: </span><mark>&quot;<mark class=\"class-3 level-0\">Das war ich</mark>!&quot;</mark><span class=\"context-right\"> und<span class=\"more\"></span></span>",
+                kr.getMatch(0).getSnippetHTML());
 
         kr = ki.search(sq, 0, (short) 15, true, (short) 0, true, (short) 0);
-        assertEquals("... [\"{3:Das war ich}!\"] ...",kr.getMatch(0).getSnippetBrackets());
+        assertEquals("... [\"{3:Das war ich}!\"] ...", kr.getMatch(0)
+                .getSnippetBrackets());
         assertEquals("totalResults", kr.getTotalResults(), 1);
 
         kr = ki.search(sq, 0, (short) 15, true, (short) 6, true, (short) 6);
-        assertEquals("Er schrie: [\"{3:Das war ich}!\"] und ging.",kr.getMatch(0).getSnippetBrackets());
+        assertEquals("Er schrie: [\"{3:Das war ich}!\"] und ging.", kr
+                .getMatch(0).getSnippetBrackets());
         assertEquals("totalResults", kr.getTotalResults(), 1);
 
         kr = ki.search(sq, 0, (short) 15, true, (short) 2, true, (short) 2);
-        assertEquals("Er schrie: [\"{3:Das war ich}!\"] und ging ...",kr.getMatch(0).getSnippetBrackets());
+        assertEquals("Er schrie: [\"{3:Das war ich}!\"] und ging ...", kr
+                .getMatch(0).getSnippetBrackets());
         assertEquals("totalResults", kr.getTotalResults(), 1);
 
-        sq = new SpanClassQuery(
-            new SpanWithinQuery(
-                new SpanElementQuery("base", "sentence"),
-                new SpanClassQuery(
-                    new SpanTermQuery(new Term("base", "s:Das")), (byte) 2
-                )
-            ),
-            (byte) 1
-        );
+        sq = new SpanClassQuery(new SpanWithinQuery(new SpanElementQuery(
+                "base", "sentence"), new SpanClassQuery(new SpanTermQuery(
+                new Term("base", "s:Das")), (byte) 2)), (byte) 1);
 
         kr = ki.search(sq, (short) 15);
-        assertEquals("Er schrie: [\"{1:{2:Das} war ich}!\"] und ging.",kr.getMatch(0).getSnippetBrackets());
+        assertEquals("Er schrie: [\"{1:{2:Das} war ich}!\"] und ging.", kr
+                .getMatch(0).getSnippetBrackets());
         assertEquals("totalResults", kr.getTotalResults(), 1);
 
-        sq = new SpanClassQuery(
-            new SpanWithinQuery(
-                new SpanElementQuery("base", "sentence"),
-                new SpanClassQuery(
-                    new SpanTermQuery(new Term("base", "s:war")), (byte) 2
-                )
-            ),
-            (byte) 1
-        );
+        sq = new SpanClassQuery(new SpanWithinQuery(new SpanElementQuery(
+                "base", "sentence"), new SpanClassQuery(new SpanTermQuery(
+                new Term("base", "s:war")), (byte) 2)), (byte) 1);
 
         kr = ki.search(sq, (short) 15);
-        assertEquals("Er schrie: [\"{1:Das {2:war} ich}!\"] und ging.",kr.getMatch(0).getSnippetBrackets());
+        assertEquals("Er schrie: [\"{1:Das {2:war} ich}!\"] und ging.", kr
+                .getMatch(0).getSnippetBrackets());
         assertEquals("totalResults", kr.getTotalResults(), 1);
 
-        sq = new SpanClassQuery(
-            new SpanWithinQuery(
-                new SpanElementQuery("base", "sentence"),
-                new SpanClassQuery(
-                    new SpanTermQuery(new Term("base", "s:ich")), (byte) 2
-                )
-            ),
-            (byte) 1
-        );
-        
+        sq = new SpanClassQuery(new SpanWithinQuery(new SpanElementQuery(
+                "base", "sentence"), new SpanClassQuery(new SpanTermQuery(
+                new Term("base", "s:ich")), (byte) 2)), (byte) 1);
+
         kr = ki.search(sq, (short) 15);
-        assertEquals("Er schrie: [\"{1:Das war {2:ich}}!\"] und ging.",kr.getMatch(0).getSnippetBrackets());
+        assertEquals("Er schrie: [\"{1:Das war {2:ich}}!\"] und ging.", kr
+                .getMatch(0).getSnippetBrackets());
         assertEquals("totalResults", kr.getTotalResults(), 1);
 
-        sq = new SpanClassQuery(
-            new SpanWithinQuery(
-                new SpanElementQuery("base", "sentence"),
-                new SpanClassQuery(
-                    new SpanTermQuery(new Term("base", "s:und")), (byte) 2
-                )
-            ),
-            (byte) 1
-        );
+        sq = new SpanClassQuery(new SpanWithinQuery(new SpanElementQuery(
+                "base", "sentence"), new SpanClassQuery(new SpanTermQuery(
+                new Term("base", "s:und")), (byte) 2)), (byte) 1);
 
         kr = ki.search(sq, (short) 15);
         assertEquals("totalResults", kr.getTotalResults(), 0);
 
-        sq = new SpanClassQuery(
-            new SpanWithinQuery(
-                new SpanElementQuery("base", "sentence"),
-                new SpanClassQuery(
-                    new SpanTermQuery(new Term("base", "s:schrie")), (byte) 2
-                )
-            ),
-            (byte) 1
-        );
+        sq = new SpanClassQuery(new SpanWithinQuery(new SpanElementQuery(
+                "base", "sentence"), new SpanClassQuery(new SpanTermQuery(
+                new Term("base", "s:schrie")), (byte) 2)), (byte) 1);
 
         kr = ki.search(sq, (short) 15);
         assertEquals("totalResults", kr.getTotalResults(), 0);
     };
 
+
     @Test
     public void indexExample4 () throws IOException {
         KrillIndex ki = new KrillIndex();
@@ -908,14 +835,12 @@
         // Case 1, 6, 7, 13
         // xy<a><a>x</a>b<a>c</a></a>x
         FieldDocument fd = new FieldDocument();
-        fd.addTV("base",
-                 "x  y  x  b  c  x  ",
-                 "[(0-3)s:x|_0#0-3]" +
-                 "[(3-6)s:y|_1#3-6]" +
-                 "[(6-9)s:x|_2#6-9|<>:a#6-15$<i>5|<>:a#6-9$<i>3]" +
-                 "[(9-12)s:b|_3#9-12]" +
-                 "[(12-15)s:c|_4#12-15|<>:a#12-15$<i>5]" +
-                 "[(15-18)s:x|_5#15-18]");
+        fd.addTV("base", "x  y  x  b  c  x  ", "[(0-3)s:x|_0#0-3]"
+                + "[(3-6)s:y|_1#3-6]"
+                + "[(6-9)s:x|_2#6-9|<>:a#6-15$<i>5|<>:a#6-9$<i>3]"
+                + "[(9-12)s:b|_3#9-12]"
+                + "[(12-15)s:c|_4#12-15|<>:a#12-15$<i>5]"
+                + "[(15-18)s:x|_5#15-18]");
         ki.addDoc(fd);
 
         // Save documents
@@ -923,10 +848,8 @@
 
         assertEquals(1, ki.numberOf("documents"));
 
-        SpanQuery sq = new SpanWithinQuery(
-            new SpanElementQuery("base", "a"),
-            new SpanTermQuery(new Term("base", "s:x"))
-        );
+        SpanQuery sq = new SpanWithinQuery(new SpanElementQuery("base", "a"),
+                new SpanTermQuery(new Term("base", "s:x")));
 
         Result kr = ki.search(sq, (short) 10);
 
@@ -937,6 +860,7 @@
         assertEquals("EndPos (1)", 5, kr.getMatch(1).endPos);
     };
 
+
     @Test
     public void indexExample5 () throws IOException {
         // 1,2,3,6,9,10,12
@@ -944,18 +868,15 @@
 
         // hij<a>hi<a>h<a>ij</a></a>hi</a>
         FieldDocument fd = new FieldDocument();
-        fd.addTV("base",
-                 "hijhihijhi",
-                 "[(0-1)s:h|i:h|_0#0-1|-:a$<i>3|-:t$<i>10]" +
-                 "[(1-2)s:i|i:i|_1#1-2]" +
-                 "[(2-3)s:j|i:j|_2#2-3]" +
-                 "[(3-4)s:h|i:h|_3#3-4|<>:a#3-10$<i>10]" +
-                 "[(4-5)s:i|i:i|_4#4-5]" +
-                 "[(5-6)s:h|i:h|_5#5-6|<>:a#5-8$<i>8]" +
-                 "[(6-7)s:i|i:i|_6#6-7|<>:a#6-8$<i>8]" +
-                 "[(7-8)s:j|i:j|_7#7-8]" +
-                 "[(8-9)s:h|i:h|_8#8-9]" +
-                 "[(9-10)s:i|i:i|_9#9-10]");
+        fd.addTV("base", "hijhihijhi",
+                "[(0-1)s:h|i:h|_0#0-1|-:a$<i>3|-:t$<i>10]"
+                        + "[(1-2)s:i|i:i|_1#1-2]" + "[(2-3)s:j|i:j|_2#2-3]"
+                        + "[(3-4)s:h|i:h|_3#3-4|<>:a#3-10$<i>10]"
+                        + "[(4-5)s:i|i:i|_4#4-5]"
+                        + "[(5-6)s:h|i:h|_5#5-6|<>:a#5-8$<i>8]"
+                        + "[(6-7)s:i|i:i|_6#6-7|<>:a#6-8$<i>8]"
+                        + "[(7-8)s:j|i:j|_7#7-8]" + "[(8-9)s:h|i:h|_8#8-9]"
+                        + "[(9-10)s:i|i:i|_9#9-10]");
         ki.addDoc(fd);
 
         // Save documents
@@ -963,13 +884,9 @@
 
         assertEquals(1, ki.numberOf("documents"));
 
-        SpanQuery sq = new SpanWithinQuery(
-            new SpanElementQuery("base", "a"),
-            new SpanNextQuery(
-                new SpanTermQuery(new Term("base", "s:h")),
-                new SpanTermQuery(new Term("base", "s:i"))
-            )
-        );
+        SpanQuery sq = new SpanWithinQuery(new SpanElementQuery("base", "a"),
+                new SpanNextQuery(new SpanTermQuery(new Term("base", "s:h")),
+                        new SpanTermQuery(new Term("base", "s:i"))));
 
         Result kr = ki.search(sq, (short) 10);
 
@@ -985,23 +902,22 @@
         assertEquals("EndPos (3)", 8, kr.getMatch(3).endPos);
     };
 
+
     @Test
     public void indexExample6 () throws IOException {
         KrillIndex ki = new KrillIndex();
         // 2,5,8,12,13
         // h<a><a>i</a>j</a><a>h</a>i j<a>h i</a>j
         FieldDocument fd = new FieldDocument();
-        fd.addTV("base",
-                 "hijhi jh ij",
-                 "[(0-1)s:h|i:h|_0#0-1|-:a$<i>4|-:t$<i>9]" +
-                 "[(1-2)s:i|i:i|_1#1-2|<>:a#1-2$<i>2|<>:a#1-3$<i>3]" +
-                 "[(2-3)s:j|i:j|_2#2-3]" +
-                 "[(3-4)s:h|i:h|_3#3-4|<>:a#3-4$<i>4]" +
-                 "[(4-5)s:i|i:i|_4#4-5]" +
-                 "[(6-7)s:j|i:j|_5#6-7]" +
-                 "[(7-8)s:h|i:h|_6#7-8|<>:a#7-10$<i>8]" +
-                 "[(9-10)s:i|i:i|_7#9-10]" +
-                 "[(10-11)s:j|i:j|_8#10-11]");
+        fd.addTV("base", "hijhi jh ij",
+                "[(0-1)s:h|i:h|_0#0-1|-:a$<i>4|-:t$<i>9]"
+                        + "[(1-2)s:i|i:i|_1#1-2|<>:a#1-2$<i>2|<>:a#1-3$<i>3]"
+                        + "[(2-3)s:j|i:j|_2#2-3]"
+                        + "[(3-4)s:h|i:h|_3#3-4|<>:a#3-4$<i>4]"
+                        + "[(4-5)s:i|i:i|_4#4-5]" + "[(6-7)s:j|i:j|_5#6-7]"
+                        + "[(7-8)s:h|i:h|_6#7-8|<>:a#7-10$<i>8]"
+                        + "[(9-10)s:i|i:i|_7#9-10]"
+                        + "[(10-11)s:j|i:j|_8#10-11]");
         ki.addDoc(fd);
 
         // Save documents
@@ -1009,16 +925,11 @@
 
         assertEquals(1, ki.numberOf("documents"));
 
-        SpanQuery sq = new SpanWithinQuery(
-            new SpanElementQuery("base", "a"),
-            new SpanNextQuery(
-                new SpanTermQuery(new Term("base", "s:h")),
-                new SpanNextQuery(
-                    new SpanTermQuery(new Term("base", "s:i")),
-                    new SpanTermQuery(new Term("base", "s:j"))
-                )
-            )
-        );
+        SpanQuery sq = new SpanWithinQuery(new SpanElementQuery("base", "a"),
+                new SpanNextQuery(new SpanTermQuery(new Term("base", "s:h")),
+                        new SpanNextQuery(new SpanTermQuery(new Term("base",
+                                "s:i")), new SpanTermQuery(new Term("base",
+                                "s:j")))));
 
         Result kr = ki.search(sq, (short) 10);
         assertEquals("totalResults", kr.getTotalResults(), 0);
@@ -1031,16 +942,13 @@
         // 4,5,11,13
         // x<a>x h</a>i j h<a>i j</a>
         FieldDocument fd = new FieldDocument();
-        fd.addTV("base",
-                 "xx hi j hi j",
-                 "[(0-1)s:x|i:x|_0#0-1|-:a$<i>2|-:t$<i>8]" +
-                 "[(1-2)s:x|i:x|_1#1-2|<>:a#1-4$<i>3]" +
-                 "[(3-4)s:h|i:h|_2#3-4]" +
-                 "[(4-5)s:i|i:i|_3#4-5]" +
-                 "[(6-7)s:j|i:j|_4#6-7]" +
-                 "[(8-9)s:h|i:h|_5#8-9]" +
-                 "[(9-10)s:i|i:i|_6#9-10|<>:a#9-12$<i>8]" +
-                 "[(11-12)s:j|i:j|_7#11-12]");
+        fd.addTV("base", "xx hi j hi j",
+                "[(0-1)s:x|i:x|_0#0-1|-:a$<i>2|-:t$<i>8]"
+                        + "[(1-2)s:x|i:x|_1#1-2|<>:a#1-4$<i>3]"
+                        + "[(3-4)s:h|i:h|_2#3-4]" + "[(4-5)s:i|i:i|_3#4-5]"
+                        + "[(6-7)s:j|i:j|_4#6-7]" + "[(8-9)s:h|i:h|_5#8-9]"
+                        + "[(9-10)s:i|i:i|_6#9-10|<>:a#9-12$<i>8]"
+                        + "[(11-12)s:j|i:j|_7#11-12]");
         ki.addDoc(fd);
 
         // Save documents
@@ -1048,62 +956,50 @@
 
         assertEquals(1, ki.numberOf("documents"));
 
-        SpanQuery sq = new SpanWithinQuery(
-            new SpanElementQuery("base", "a"),
-            new SpanNextQuery(
-                new SpanTermQuery(new Term("base", "s:h")),
-                new SpanNextQuery(
-                    new SpanTermQuery(new Term("base", "s:i")),
-                    new SpanTermQuery(new Term("base", "s:j"))
-                )
-            )
-        );
+        SpanQuery sq = new SpanWithinQuery(new SpanElementQuery("base", "a"),
+                new SpanNextQuery(new SpanTermQuery(new Term("base", "s:h")),
+                        new SpanNextQuery(new SpanTermQuery(new Term("base",
+                                "s:i")), new SpanTermQuery(new Term("base",
+                                "s:j")))));
 
         Result kr = ki.search(sq, (short) 10);
-        
+
         assertEquals("totalResults", kr.getTotalResults(), 0);
     };
-    
+
 
     /** SpanElementQueries */
     @Test
-    public void indexExample8() throws IOException{	   
-        KrillIndex ki = new KrillIndex();		
+    public void indexExample8 () throws IOException {
+        KrillIndex ki = new KrillIndex();
         FieldDocument fd = new FieldDocument();
         // <a>xx <e>hi j <e>hi j</e></e></a>
-        fd.addTV("base",
-                 "xx hi j hi j",
-                 "[(0-1)s:x|i:x|_0#0-1|<>:a#1-12$<i>8]" +
-                 "[(1-2)s:x|i:x|_1#1-2]" +
-                 "[(3-4)s:h|i:h|_2#3-4|<>:e#3-12$<i>8]" +
-                 "[(4-5)s:i|i:i|_3#4-5]" +
-                 "[(6-7)s:j|i:j|_4#6-7]" +
-                 "[(8-9)s:h|i:h|_5#8-9|<>:e#8-9$<i>8]" +
-                 "[(9-10)s:i|i:i|_6#9-10]" +
-                 "[(11-12)s:j|i:j|_7#11-12]");
+        fd.addTV("base", "xx hi j hi j", "[(0-1)s:x|i:x|_0#0-1|<>:a#1-12$<i>8]"
+                + "[(1-2)s:x|i:x|_1#1-2]"
+                + "[(3-4)s:h|i:h|_2#3-4|<>:e#3-12$<i>8]"
+                + "[(4-5)s:i|i:i|_3#4-5]" + "[(6-7)s:j|i:j|_4#6-7]"
+                + "[(8-9)s:h|i:h|_5#8-9|<>:e#8-9$<i>8]"
+                + "[(9-10)s:i|i:i|_6#9-10]" + "[(11-12)s:j|i:j|_7#11-12]");
         ki.addDoc(fd);
     };
-    
+
 
     // contains(<s>, (es wird | wird es))
     @Test
-    public void queryJSONpoly2() throws QueryException, IOException {
-        String jsonPath = getClass().getResource("/queries/poly2.json").getFile();
-        String jsonPQuery = readFile(jsonPath);		
+    public void queryJSONpoly2 () throws QueryException, IOException {
+        String jsonPath = getClass().getResource("/queries/poly2.json")
+                .getFile();
+        String jsonPQuery = readFile(jsonPath);
         SpanQueryWrapper sqwi = new KrillQuery("tokens").fromJson(jsonPQuery);
-		
+
         SpanWithinQuery sq = (SpanWithinQuery) sqwi.toQuery();
-		
+
         KrillIndex ki = new KrillIndex();
 
-        ki.addDoc(
-            getClass().getResourceAsStream("/wiki/DDD-08370.json.gz"),
-            true
-        );
-        ki.addDoc(
-            getClass().getResourceAsStream("/wiki/PPP-02924.json.gz"),
-            true
-        );
+        ki.addDoc(getClass().getResourceAsStream("/wiki/DDD-08370.json.gz"),
+                true);
+        ki.addDoc(getClass().getResourceAsStream("/wiki/PPP-02924.json.gz"),
+                true);
 
         ki.commit();
         Result kr = ki.search(sq, (short) 10);
@@ -1116,15 +1012,15 @@
         assertEquals(252, kr.getMatch(1).getEndPos());
 
         /*
-		for (Match km : kr.getMatches()){		
-			System.out.println(km.getStartPos() +","+km.getEndPos()+" "
+        for (Match km : kr.getMatches()){		
+        	System.out.println(km.getStartPos() +","+km.getEndPos()+" "
                                +km.getSnippetBrackets());
-		};	
+        };	
         */
     };
-	
-	
-    private String readFile(String path) {
+
+
+    private String readFile (String path) {
         StringBuilder sb = new StringBuilder();
         try {
             BufferedReader in = new BufferedReader(new FileReader(path));
@@ -1133,7 +1029,8 @@
                 sb.append(str);
             };
             in.close();
-        } catch (IOException e) {
+        }
+        catch (IOException e) {
             fail(e.getMessage());
         }
         return sb.toString();
diff --git a/src/test/java/de/ids_mannheim/korap/query/TestFrameConstraint.java b/src/test/java/de/ids_mannheim/korap/query/TestFrameConstraint.java
index fd4285f..ed5c41d 100644
--- a/src/test/java/de/ids_mannheim/korap/query/TestFrameConstraint.java
+++ b/src/test/java/de/ids_mannheim/korap/query/TestFrameConstraint.java
@@ -7,7 +7,6 @@
 import de.ids_mannheim.korap.util.QueryException;
 import org.apache.lucene.search.spans.Spans;
 
-
 import static org.junit.Assert.*;
 import org.junit.Test;
 import org.junit.Ignore;
@@ -26,6 +25,7 @@
         assertEquals(fc.check(1), false);
     };
 
+
     @Test
     public void testBitVector () throws QueryException {
         int a = 1;
@@ -34,309 +34,293 @@
         assertEquals(3, a ^ b);
     };
 
+
     @Test
     public void testOr () throws QueryException {
         FrameConstraint fc = new FrameConstraint();
 
         // Nothing set
-        assertEquals(fc.check("precedes"),         false);
+        assertEquals(fc.check("precedes"), false);
         assertEquals(fc.check("precedesDirectly"), false);
-        assertEquals(fc.check("overlapsLeft"),     false);
-        assertEquals(fc.check("alignsLeft"),       false);
-        assertEquals(fc.check("startsWith"),       false);
-        assertEquals(fc.check("matches"),          false);
-        assertEquals(fc.check("isWithin"),         false);
-        assertEquals(fc.check("isAround"),         false);
-        assertEquals(fc.check("endsWith"),         false);
-        assertEquals(fc.check("alignsRight"),      false);
-        assertEquals(fc.check("overlapsRight"),    false);
+        assertEquals(fc.check("overlapsLeft"), false);
+        assertEquals(fc.check("alignsLeft"), false);
+        assertEquals(fc.check("startsWith"), false);
+        assertEquals(fc.check("matches"), false);
+        assertEquals(fc.check("isWithin"), false);
+        assertEquals(fc.check("isAround"), false);
+        assertEquals(fc.check("endsWith"), false);
+        assertEquals(fc.check("alignsRight"), false);
+        assertEquals(fc.check("overlapsRight"), false);
         assertEquals(fc.check("succeedsDirectly"), false);
-        assertEquals(fc.check("succeeds"),         false);
+        assertEquals(fc.check("succeeds"), false);
 
         // Some or
         fc.add("succeeds").add("succeedsDirectly");
-        assertEquals(fc.check("precedes"),         false);
+        assertEquals(fc.check("precedes"), false);
         assertEquals(fc.check("precedesDirectly"), false);
-        assertEquals(fc.check("overlapsLeft"),     false);
-        assertEquals(fc.check("alignsLeft"),       false);
-        assertEquals(fc.check("startsWith"),       false);
-        assertEquals(fc.check("matches"),          false);
-        assertEquals(fc.check("isWithin"),         false);
-        assertEquals(fc.check("isAround"),         false);
-        assertEquals(fc.check("endsWith"),         false);
-        assertEquals(fc.check("alignsRight"),      false);
-        assertEquals(fc.check("overlapsRight"),    false);
+        assertEquals(fc.check("overlapsLeft"), false);
+        assertEquals(fc.check("alignsLeft"), false);
+        assertEquals(fc.check("startsWith"), false);
+        assertEquals(fc.check("matches"), false);
+        assertEquals(fc.check("isWithin"), false);
+        assertEquals(fc.check("isAround"), false);
+        assertEquals(fc.check("endsWith"), false);
+        assertEquals(fc.check("alignsRight"), false);
+        assertEquals(fc.check("overlapsRight"), false);
         assertEquals(fc.check("succeedsDirectly"), true);
-        assertEquals(fc.check("succeeds"),         true);
+        assertEquals(fc.check("succeeds"), true);
 
         // Moar or
         fc.add("precedes").add("precedesDirectly");
-        assertEquals(fc.check("precedes"),         true);
+        assertEquals(fc.check("precedes"), true);
         assertEquals(fc.check("precedesDirectly"), true);
-        assertEquals(fc.check("overlapsLeft"),     false);
-        assertEquals(fc.check("alignsLeft"),       false);
-        assertEquals(fc.check("startsWith"),       false);
-        assertEquals(fc.check("matches"),          false);
-        assertEquals(fc.check("isWithin"),         false);
-        assertEquals(fc.check("isAround"),         false);
-        assertEquals(fc.check("endsWith"),         false);
-        assertEquals(fc.check("alignsRight"),      false);
-        assertEquals(fc.check("overlapsRight"),    false);
+        assertEquals(fc.check("overlapsLeft"), false);
+        assertEquals(fc.check("alignsLeft"), false);
+        assertEquals(fc.check("startsWith"), false);
+        assertEquals(fc.check("matches"), false);
+        assertEquals(fc.check("isWithin"), false);
+        assertEquals(fc.check("isAround"), false);
+        assertEquals(fc.check("endsWith"), false);
+        assertEquals(fc.check("alignsRight"), false);
+        assertEquals(fc.check("overlapsRight"), false);
         assertEquals(fc.check("succeedsDirectly"), true);
-        assertEquals(fc.check("succeeds"),         true);
+        assertEquals(fc.check("succeeds"), true);
 
         // Moar or
         fc.add("matches").add("startsWith");
-        assertEquals(fc.check("precedes"),         true);
+        assertEquals(fc.check("precedes"), true);
         assertEquals(fc.check("precedesDirectly"), true);
-        assertEquals(fc.check("overlapsLeft"),     false);
-        assertEquals(fc.check("alignsLeft"),       false);
-        assertEquals(fc.check("startsWith"),       true);
-        assertEquals(fc.check("matches"),          true);
-        assertEquals(fc.check("isWithin"),         false);
-        assertEquals(fc.check("isAround"),         false);
-        assertEquals(fc.check("endsWith"),         false);
-        assertEquals(fc.check("alignsRight"),      false);
-        assertEquals(fc.check("overlapsRight"),    false);
+        assertEquals(fc.check("overlapsLeft"), false);
+        assertEquals(fc.check("alignsLeft"), false);
+        assertEquals(fc.check("startsWith"), true);
+        assertEquals(fc.check("matches"), true);
+        assertEquals(fc.check("isWithin"), false);
+        assertEquals(fc.check("isAround"), false);
+        assertEquals(fc.check("endsWith"), false);
+        assertEquals(fc.check("alignsRight"), false);
+        assertEquals(fc.check("overlapsRight"), false);
         assertEquals(fc.check("succeedsDirectly"), true);
-        assertEquals(fc.check("succeeds"),         true);
+        assertEquals(fc.check("succeeds"), true);
 
         // Invert
         fc.invert();
-        assertEquals(fc.check("precedes"),         false);
+        assertEquals(fc.check("precedes"), false);
         assertEquals(fc.check("precedesDirectly"), false);
-        assertEquals(fc.check("overlapsLeft"),     true);
-        assertEquals(fc.check("alignsLeft"),       true);
-        assertEquals(fc.check("startsWith"),       false);
-        assertEquals(fc.check("matches"),          false);
-        assertEquals(fc.check("isWithin"),         true);
-        assertEquals(fc.check("isAround"),         true);
-        assertEquals(fc.check("endsWith"),         true);
-        assertEquals(fc.check("alignsRight"),      true);
-        assertEquals(fc.check("overlapsRight"),    true);
+        assertEquals(fc.check("overlapsLeft"), true);
+        assertEquals(fc.check("alignsLeft"), true);
+        assertEquals(fc.check("startsWith"), false);
+        assertEquals(fc.check("matches"), false);
+        assertEquals(fc.check("isWithin"), true);
+        assertEquals(fc.check("isAround"), true);
+        assertEquals(fc.check("endsWith"), true);
+        assertEquals(fc.check("alignsRight"), true);
+        assertEquals(fc.check("overlapsRight"), true);
         assertEquals(fc.check("succeedsDirectly"), false);
-        assertEquals(fc.check("succeeds"),         false);
+        assertEquals(fc.check("succeeds"), false);
 
-        fc.add("precedes").
-            add("precedesDirectly").
-            add("startsWith").
-            add("matches");
-        assertEquals(fc.check("precedes"),         true);
+        fc.add("precedes").add("precedesDirectly").add("startsWith")
+                .add("matches");
+        assertEquals(fc.check("precedes"), true);
         assertEquals(fc.check("precedesDirectly"), true);
-        assertEquals(fc.check("overlapsLeft"),     true);
-        assertEquals(fc.check("alignsLeft"),       true);
-        assertEquals(fc.check("startsWith"),       true);
-        assertEquals(fc.check("matches"),          true);
-        assertEquals(fc.check("isWithin"),         true);
-        assertEquals(fc.check("isAround"),         true);
-        assertEquals(fc.check("endsWith"),         true);
-        assertEquals(fc.check("alignsRight"),      true);
-        assertEquals(fc.check("overlapsRight"),    true);
+        assertEquals(fc.check("overlapsLeft"), true);
+        assertEquals(fc.check("alignsLeft"), true);
+        assertEquals(fc.check("startsWith"), true);
+        assertEquals(fc.check("matches"), true);
+        assertEquals(fc.check("isWithin"), true);
+        assertEquals(fc.check("isAround"), true);
+        assertEquals(fc.check("endsWith"), true);
+        assertEquals(fc.check("alignsRight"), true);
+        assertEquals(fc.check("overlapsRight"), true);
         assertEquals(fc.check("succeedsDirectly"), false);
-        assertEquals(fc.check("succeeds"),         false);
+        assertEquals(fc.check("succeeds"), false);
 
-        fc.add("succeeds").
-            add("succeedsDirectly");
-        assertEquals(fc.check("precedes"),         true);
+        fc.add("succeeds").add("succeedsDirectly");
+        assertEquals(fc.check("precedes"), true);
         assertEquals(fc.check("precedesDirectly"), true);
-        assertEquals(fc.check("overlapsLeft"),     true);
-        assertEquals(fc.check("alignsLeft"),       true);
-        assertEquals(fc.check("startsWith"),       true);
-        assertEquals(fc.check("matches"),          true);
-        assertEquals(fc.check("isWithin"),         true);
-        assertEquals(fc.check("isAround"),         true);
-        assertEquals(fc.check("endsWith"),         true);
-        assertEquals(fc.check("alignsRight"),      true);
-        assertEquals(fc.check("overlapsRight"),    true);
+        assertEquals(fc.check("overlapsLeft"), true);
+        assertEquals(fc.check("alignsLeft"), true);
+        assertEquals(fc.check("startsWith"), true);
+        assertEquals(fc.check("matches"), true);
+        assertEquals(fc.check("isWithin"), true);
+        assertEquals(fc.check("isAround"), true);
+        assertEquals(fc.check("endsWith"), true);
+        assertEquals(fc.check("alignsRight"), true);
+        assertEquals(fc.check("overlapsRight"), true);
         assertEquals(fc.check("succeedsDirectly"), true);
-        assertEquals(fc.check("succeeds"),         true);
+        assertEquals(fc.check("succeeds"), true);
     };
 
+
     @Test
     public void testOrVector () throws QueryException {
         FrameConstraint fc1 = new FrameConstraint();
         // Some or
         fc1.add("succeeds").add("succeedsDirectly");
-        assertEquals(fc1.check("precedes"),         false);
+        assertEquals(fc1.check("precedes"), false);
         assertEquals(fc1.check("precedesDirectly"), false);
-        assertEquals(fc1.check("overlapsLeft"),     false);
-        assertEquals(fc1.check("alignsLeft"),       false);
-        assertEquals(fc1.check("startsWith"),       false);
-        assertEquals(fc1.check("matches"),          false);
-        assertEquals(fc1.check("isWithin"),         false);
-        assertEquals(fc1.check("isAround"),         false);
-        assertEquals(fc1.check("endsWith"),         false);
-        assertEquals(fc1.check("alignsRight"),      false);
-        assertEquals(fc1.check("overlapsRight"),    false);
+        assertEquals(fc1.check("overlapsLeft"), false);
+        assertEquals(fc1.check("alignsLeft"), false);
+        assertEquals(fc1.check("startsWith"), false);
+        assertEquals(fc1.check("matches"), false);
+        assertEquals(fc1.check("isWithin"), false);
+        assertEquals(fc1.check("isAround"), false);
+        assertEquals(fc1.check("endsWith"), false);
+        assertEquals(fc1.check("alignsRight"), false);
+        assertEquals(fc1.check("overlapsRight"), false);
         assertEquals(fc1.check("succeedsDirectly"), true);
-        assertEquals(fc1.check("succeeds"),         true);
+        assertEquals(fc1.check("succeeds"), true);
 
         FrameConstraint fc2 = new FrameConstraint();
         fc2.add("precedes").add("precedesDirectly");
-        assertEquals(fc2.check("precedes"),         true);
+        assertEquals(fc2.check("precedes"), true);
         assertEquals(fc2.check("precedesDirectly"), true);
-        assertEquals(fc2.check("overlapsLeft"),     false);
-        assertEquals(fc2.check("alignsLeft"),       false);
-        assertEquals(fc2.check("startsWith"),       false);
-        assertEquals(fc2.check("matches"),          false);
-        assertEquals(fc2.check("isWithin"),         false);
-        assertEquals(fc2.check("isAround"),         false);
-        assertEquals(fc2.check("endsWith"),         false);
-        assertEquals(fc2.check("alignsRight"),      false);
-        assertEquals(fc2.check("overlapsRight"),    false);
+        assertEquals(fc2.check("overlapsLeft"), false);
+        assertEquals(fc2.check("alignsLeft"), false);
+        assertEquals(fc2.check("startsWith"), false);
+        assertEquals(fc2.check("matches"), false);
+        assertEquals(fc2.check("isWithin"), false);
+        assertEquals(fc2.check("isAround"), false);
+        assertEquals(fc2.check("endsWith"), false);
+        assertEquals(fc2.check("alignsRight"), false);
+        assertEquals(fc2.check("overlapsRight"), false);
         assertEquals(fc2.check("succeedsDirectly"), false);
-        assertEquals(fc2.check("succeeds"),         false);
+        assertEquals(fc2.check("succeeds"), false);
 
         fc1.add(fc2);
-        assertEquals(fc1.check("precedes"),         true);
+        assertEquals(fc1.check("precedes"), true);
         assertEquals(fc1.check("precedesDirectly"), true);
-        assertEquals(fc1.check("overlapsLeft"),     false);
-        assertEquals(fc1.check("alignsLeft"),       false);
-        assertEquals(fc1.check("startsWith"),       false);
-        assertEquals(fc1.check("matches"),          false);
-        assertEquals(fc1.check("isWithin"),         false);
-        assertEquals(fc1.check("isAround"),         false);
-        assertEquals(fc1.check("endsWith"),         false);
-        assertEquals(fc1.check("alignsRight"),      false);
-        assertEquals(fc1.check("overlapsRight"),    false);
+        assertEquals(fc1.check("overlapsLeft"), false);
+        assertEquals(fc1.check("alignsLeft"), false);
+        assertEquals(fc1.check("startsWith"), false);
+        assertEquals(fc1.check("matches"), false);
+        assertEquals(fc1.check("isWithin"), false);
+        assertEquals(fc1.check("isAround"), false);
+        assertEquals(fc1.check("endsWith"), false);
+        assertEquals(fc1.check("alignsRight"), false);
+        assertEquals(fc1.check("overlapsRight"), false);
         assertEquals(fc1.check("succeedsDirectly"), true);
-        assertEquals(fc1.check("succeeds"),         true);
+        assertEquals(fc1.check("succeeds"), true);
     };
 
+
     @Test
     public void testConstellation () throws QueryException {
         FrameConstraint fc1 = new FrameConstraint();
         fc1.invert();
 
         // Precedes
-        assertEquals(
-            FrameConstraint.PRECEDES,
-            fc1._constellation(new TestSpans(2,3), new TestSpans(4,5))
-        );
+        assertEquals(FrameConstraint.PRECEDES,
+                fc1._constellation(new TestSpans(2, 3), new TestSpans(4, 5)));
 
         // PrecedesDirectly
-        assertEquals(
-            FrameConstraint.PRECEDES_DIRECTLY,
-            fc1._constellation(new TestSpans(2,3), new TestSpans(3,5))
-        );
+        assertEquals(FrameConstraint.PRECEDES_DIRECTLY,
+                fc1._constellation(new TestSpans(2, 3), new TestSpans(3, 5)));
 
         // OverlapsLeft
-        assertEquals(
-            FrameConstraint.OVERLAPS_LEFT,
-            fc1._constellation(new TestSpans(2,4), new TestSpans(3,5))
-        );
+        assertEquals(FrameConstraint.OVERLAPS_LEFT,
+                fc1._constellation(new TestSpans(2, 4), new TestSpans(3, 5)));
 
         // AlignsLeft
-        assertEquals(
-            FrameConstraint.ALIGNS_LEFT,
-            fc1._constellation(new TestSpans(2,4), new TestSpans(2,5))
-        );
+        assertEquals(FrameConstraint.ALIGNS_LEFT,
+                fc1._constellation(new TestSpans(2, 4), new TestSpans(2, 5)));
 
         // StartsWith
-        assertEquals(
-            FrameConstraint.STARTS_WITH,
-            fc1._constellation(new TestSpans(2,5), new TestSpans(2,4))
-        );
+        assertEquals(FrameConstraint.STARTS_WITH,
+                fc1._constellation(new TestSpans(2, 5), new TestSpans(2, 4)));
 
         // Matches
-        assertEquals(
-            FrameConstraint.MATCHES,
-            fc1._constellation(new TestSpans(2,5), new TestSpans(2,5))
-        );
+        assertEquals(FrameConstraint.MATCHES,
+                fc1._constellation(new TestSpans(2, 5), new TestSpans(2, 5)));
 
         // IsWithin
-        assertEquals(
-            FrameConstraint.IS_WITHIN,
-            fc1._constellation(new TestSpans(3,4), new TestSpans(2,5))
-        );
+        assertEquals(FrameConstraint.IS_WITHIN,
+                fc1._constellation(new TestSpans(3, 4), new TestSpans(2, 5)));
 
         // IsAround
-        assertEquals(
-            FrameConstraint.IS_AROUND,
-            fc1._constellation(new TestSpans(2,5), new TestSpans(3,4))
-        );
+        assertEquals(FrameConstraint.IS_AROUND,
+                fc1._constellation(new TestSpans(2, 5), new TestSpans(3, 4)));
 
         // EndsWith
-        assertEquals(
-            FrameConstraint.ENDS_WITH,
-            fc1._constellation(new TestSpans(3,5), new TestSpans(4,5))
-        );
+        assertEquals(FrameConstraint.ENDS_WITH,
+                fc1._constellation(new TestSpans(3, 5), new TestSpans(4, 5)));
 
         // AlignsRight
-        assertEquals(
-            FrameConstraint.ALIGNS_RIGHT,
-            fc1._constellation(new TestSpans(3,4), new TestSpans(2,4))
-        );
+        assertEquals(FrameConstraint.ALIGNS_RIGHT,
+                fc1._constellation(new TestSpans(3, 4), new TestSpans(2, 4)));
 
         // OverlapsRight
-        assertEquals(
-            FrameConstraint.OVERLAPS_RIGHT,
-            fc1._constellation(new TestSpans(3,5), new TestSpans(2,4))
-        );
+        assertEquals(FrameConstraint.OVERLAPS_RIGHT,
+                fc1._constellation(new TestSpans(3, 5), new TestSpans(2, 4)));
 
         // SucceedsDirectly
-        assertEquals(
-            FrameConstraint.SUCCEEDS_DIRECTLY,
-            fc1._constellation(new TestSpans(4,6), new TestSpans(2,4))
-        );
+        assertEquals(FrameConstraint.SUCCEEDS_DIRECTLY,
+                fc1._constellation(new TestSpans(4, 6), new TestSpans(2, 4)));
 
         // Succeeds
-        assertEquals(
-            FrameConstraint.SUCCEEDS,
-            fc1._constellation(new TestSpans(5,6), new TestSpans(2,4))
-        );
+        assertEquals(FrameConstraint.SUCCEEDS,
+                fc1._constellation(new TestSpans(5, 6), new TestSpans(2, 4)));
     };
 
     private class TestSpans extends Spans {
         private int s, e;
 
+
         // Constructor
         public TestSpans (int start, int end) {
             this.s = start;
             this.e = end;
         };
 
+
         @Override
         public int doc () {
             return 0;
         };
 
+
         @Override
         public int start () {
             return this.s;
         };
 
+
         @Override
         public int end () {
             return this.e;
         };
 
+
         @Override
         public boolean skipTo (int target) {
             return true;
         };
 
+
         @Override
         public boolean next () {
             return true;
         };
 
-        public Collection<byte[]> getPayload() throws IOException {
+
+        public Collection<byte[]> getPayload () throws IOException {
             return null;
         }
 
+
         @Override
-        public boolean isPayloadAvailable() throws IOException {
+        public boolean isPayloadAvailable () throws IOException {
             return false;
         };
 
+
         @Override
-        public String toString () {				
+        public String toString () {
             return "";
         };
 
+
         @Override
-        public long cost () {				
+        public long cost () {
             return 1;
         };
 
diff --git a/src/test/java/de/ids_mannheim/korap/query/TestKrillQuery.java b/src/test/java/de/ids_mannheim/korap/query/TestKrillQuery.java
index 96a473c..e4cd6ac 100644
--- a/src/test/java/de/ids_mannheim/korap/query/TestKrillQuery.java
+++ b/src/test/java/de/ids_mannheim/korap/query/TestKrillQuery.java
@@ -24,45 +24,61 @@
     public void korapQuerySegment () throws QueryException {
         SpanQuery sq = new QueryBuilder("field1").seg("a").with("b").toQuery();
         assertEquals("spanSegment(field1:a, field1:b)", sq.toString());
-        
+
         sq = new QueryBuilder("field2").seg("a", "b").with("c").toQuery();
-        assertEquals("spanSegment(spanSegment(field2:a, field2:b), field2:c)", sq.toString());
+        assertEquals("spanSegment(spanSegment(field2:a, field2:b), field2:c)",
+                sq.toString());
     };
 
+
     @Test
     public void korapQueryRegexSegment () throws QueryException {
         QueryBuilder kq = new QueryBuilder("field1");
         SpanQuery sq = kq.seg("a").with(kq.re("b.*c")).toQuery();
-        assertEquals("spanSegment(field1:a, SpanMultiTermQueryWrapper(field1:/b.*c/))", sq.toString());
+        assertEquals(
+                "spanSegment(field1:a, SpanMultiTermQueryWrapper(field1:/b.*c/))",
+                sq.toString());
 
         kq = new QueryBuilder("field2");
         sq = kq.seg(kq.re("a.*")).with("b").toQuery();
-        assertEquals("spanSegment(SpanMultiTermQueryWrapper(field2:/a.*/), field2:b)", sq.toString());
+        assertEquals(
+                "spanSegment(SpanMultiTermQueryWrapper(field2:/a.*/), field2:b)",
+                sq.toString());
     };
 
+
     @Test
     public void korapQueryRegexSegment2 () throws QueryException {
         QueryBuilder kq = new QueryBuilder("field");
         SpanQuery sq = kq.seg("a").with(kq.or("b").or("c")).toQuery();
-        assertEquals("spanSegment(field:a, spanOr([field:b, field:c]))", sq.toString());
+        assertEquals("spanSegment(field:a, spanOr([field:b, field:c]))",
+                sq.toString());
 
         kq = new QueryBuilder("field");
         sq = kq.seg("a").with(kq.or("b", "c")).toQuery();
-        assertEquals("spanSegment(field:a, spanOr([field:b, field:c]))", sq.toString());
+        assertEquals("spanSegment(field:a, spanOr([field:b, field:c]))",
+                sq.toString());
 
         kq = new QueryBuilder("field");
         // [ a & (b | /c.*d/) ]
         sq = kq.seg("a").with(kq.or("b").or(kq.re("c.*d"))).toQuery();
-        assertEquals("spanSegment(field:a, spanOr([field:b, SpanMultiTermQueryWrapper(field:/c.*d/)]))", sq.toString());
+        assertEquals(
+                "spanSegment(field:a, spanOr([field:b, SpanMultiTermQueryWrapper(field:/c.*d/)]))",
+                sq.toString());
     };
 
+
     @Test
     public void korapQuerySequenceSegment () throws QueryException {
         QueryBuilder kq = new QueryBuilder("field");
-        SpanQuery sq = kq.seq(kq.seg("a").with(kq.or("b", "c"))).append("d").append(kq.re("e.?f")).toQuery();
-        assertEquals("spanNext(spanNext(spanSegment(field:a, spanOr([field:b, field:c])), field:d), SpanMultiTermQueryWrapper(field:/e.?f/))", sq.toString());
+        SpanQuery sq = kq.seq(kq.seg("a").with(kq.or("b", "c"))).append("d")
+                .append(kq.re("e.?f")).toQuery();
+        assertEquals(
+                "spanNext(spanNext(spanSegment(field:a, spanOr([field:b, field:c])), field:d), SpanMultiTermQueryWrapper(field:/e.?f/))",
+                sq.toString());
     };
 
+
     @Test
     public void KorapTagQuery () throws QueryException {
         QueryBuilder kq = new QueryBuilder("field");
@@ -70,6 +86,7 @@
         assertEquals("<field:np />", sq.toString());
     };
 
+
     @Test
     public void KorapTagQuery2 () throws QueryException {
         QueryBuilder kq = new QueryBuilder("field");
@@ -77,6 +94,7 @@
         assertEquals("spanOr([<field:np />, <field:vp />])", sq.toString());
     };
 
+
     @Test
     public void KorapTagQuery3 () throws QueryException {
         QueryBuilder kq = new QueryBuilder("field");
@@ -84,13 +102,18 @@
         assertEquals("spanNext(<field:np />, <field:vp />)", sq.toString());
     };
 
+
     @Test
     public void KorapTagQuery4 () throws QueryException {
         QueryBuilder kq = new QueryBuilder("field");
-        SpanQuery sq = kq.seq(kq.tag("np"), kq.tag("vp")).append("test").toQuery();
-        assertEquals("spanNext(spanNext(<field:np />, <field:vp />), field:test)", sq.toString());
+        SpanQuery sq = kq.seq(kq.tag("np"), kq.tag("vp")).append("test")
+                .toQuery();
+        assertEquals(
+                "spanNext(spanNext(<field:np />, <field:vp />), field:test)",
+                sq.toString());
     };
 
+
     @Test
     public void KorapTagQuery5 () throws QueryException {
         QueryBuilder kq = new QueryBuilder("field");
@@ -98,21 +121,32 @@
         assertEquals("spanContain(<field:s />, <field:np />)", sq.toString());
     };
 
+
     @Test
     public void KorapTagQuery6 () throws QueryException {
         QueryBuilder kq = new QueryBuilder("field");
-        SpanQuery sq = kq.seq(kq.seg("tree"), kq.contains(kq.tag("s"), kq.tag("np")), kq.re("hey.*")).toQuery();
-        assertEquals("spanNext(spanNext(field:tree, spanContain(<field:s />, <field:np />)), SpanMultiTermQueryWrapper(field:/hey.*/))", sq.toString());
+        SpanQuery sq = kq.seq(kq.seg("tree"),
+                kq.contains(kq.tag("s"), kq.tag("np")), kq.re("hey.*"))
+                .toQuery();
+        assertEquals(
+                "spanNext(spanNext(field:tree, spanContain(<field:s />, <field:np />)), SpanMultiTermQueryWrapper(field:/hey.*/))",
+                sq.toString());
     };
-    
+
 
     @Test
     public void KorapClassQuery () throws QueryException {
         QueryBuilder kq = new QueryBuilder("field");
-        SpanQuery sq = kq.seq(kq.seg("tree"), kq._(1, kq.contains(kq.tag("s"), kq.tag("np"))), kq.re("hey.*")).toQuery();
-        assertEquals("spanNext(spanNext(field:tree, {1: spanContain(<field:s />, <field:np />)}), SpanMultiTermQueryWrapper(field:/hey.*/))", sq.toString());
+        SpanQuery sq = kq
+                .seq(kq.seg("tree"),
+                        kq._(1, kq.contains(kq.tag("s"), kq.tag("np"))),
+                        kq.re("hey.*")).toQuery();
+        assertEquals(
+                "spanNext(spanNext(field:tree, {1: spanContain(<field:s />, <field:np />)}), SpanMultiTermQueryWrapper(field:/hey.*/))",
+                sq.toString());
     };
 
+
     @Test
     public void KorapClassQuery2 () throws QueryException {
         QueryBuilder kq = new QueryBuilder("field");
@@ -120,13 +154,19 @@
         assertEquals("{1: field:base:test}", sq.toString());
     };
 
+
     @Test
     public void KorapClassQuery3 () throws QueryException {
         QueryBuilder kq = new QueryBuilder("field");
-        SpanQuery sq = kq.seq(kq.seg("tree"), kq.contains(kq.tag("s"), kq._(kq.tag("np"))), kq.re("hey.*")).toQuery();
-        assertEquals("spanNext(spanNext(field:tree, spanContain(<field:s />, {1: <field:np />})), SpanMultiTermQueryWrapper(field:/hey.*/))", sq.toString());
+        SpanQuery sq = kq.seq(kq.seg("tree"),
+                kq.contains(kq.tag("s"), kq._(kq.tag("np"))), kq.re("hey.*"))
+                .toQuery();
+        assertEquals(
+                "spanNext(spanNext(field:tree, spanContain(<field:s />, {1: <field:np />})), SpanMultiTermQueryWrapper(field:/hey.*/))",
+                sq.toString());
     };
 
+
     @Test
     public void KorapShrinkQuery () throws QueryException {
         QueryBuilder kq = new QueryBuilder("field");
@@ -134,6 +174,7 @@
         assertEquals("focus(1: <field:np />)", sq.toString());
     };
 
+
     @Test
     public void KorapShrinkQuery1 () throws QueryException {
         QueryBuilder kq = new QueryBuilder("field");
@@ -141,6 +182,7 @@
         assertEquals("focus(1: <field:np />)", sq.toString());
     };
 
+
     @Test
     public void KorapShrinkQuery2 () throws QueryException {
         QueryBuilder kq = new QueryBuilder("field");
@@ -148,20 +190,33 @@
         assertEquals("focus(1: {1: <field:np />})", sq.toString());
     };
 
+
     @Test
     public void KorapShrinkQuery3 () throws QueryException {
         QueryBuilder kq = new QueryBuilder("field");
-        SpanQuery sq = kq.focus(1, kq._(1, kq.seq(kq.tag("np"), kq._(kq.seg("test").without("no"))))).toQuery();
-        assertEquals("focus(1: {1: spanNext(<field:np />, {1: spanNot(field:test, field:no, 0, 0)})})", sq.toString());
+        SpanQuery sq = kq
+                .focus(1,
+                        kq._(1,
+                                kq.seq(kq.tag("np"),
+                                        kq._(kq.seg("test").without("no")))))
+                .toQuery();
+        assertEquals(
+                "focus(1: {1: spanNext(<field:np />, {1: spanNot(field:test, field:no, 0, 0)})})",
+                sq.toString());
     };
 
+
     @Test
     public void KorapShrinkQuery4 () throws QueryException {
         QueryBuilder kq = new QueryBuilder("field");
-        SpanQuery sq = kq.seq(kq.seg("try1"), kq.focus(1, kq._(1, kq.seg("try2"))), kq.seg("try3")).toQuery();
-        assertEquals("spanNext(spanNext(field:try1, focus(1: {1: field:try2})), field:try3)", sq.toString());
+        SpanQuery sq = kq.seq(kq.seg("try1"),
+                kq.focus(1, kq._(1, kq.seg("try2"))), kq.seg("try3")).toQuery();
+        assertEquals(
+                "spanNext(spanNext(field:try1, focus(1: {1: field:try2})), field:try3)",
+                sq.toString());
     };
 
+
     @Test
     public void KorapSequenceQuery1 () throws QueryException {
         QueryBuilder kq = new QueryBuilder("field");
@@ -169,55 +224,85 @@
         assertEquals("spanNext(field:try1, field:try2)", sq.toString());
     };
 
+
     @Test
     public void KorapSequenceQuery2 () throws QueryException {
         QueryBuilder kq = new QueryBuilder("field");
-        SpanQuery sq = kq.seq(kq.seg("try1")).append(kq.seg("try2")).withConstraint(2,3).toQuery();
-        assertEquals("spanDistance(field:try1, field:try2, [(w[2:3], ordered, notExcluded)])", sq.toString());
+        SpanQuery sq = kq.seq(kq.seg("try1")).append(kq.seg("try2"))
+                .withConstraint(2, 3).toQuery();
+        assertEquals(
+                "spanDistance(field:try1, field:try2, [(w[2:3], ordered, notExcluded)])",
+                sq.toString());
     };
 
+
     @Test
     public void KorapSequenceQuery3 () throws QueryException {
         QueryBuilder kq = new QueryBuilder("field");
-        SpanQuery sq = kq.seq(kq.seg("try1")).append(kq.seg("try2")).withConstraint(2,3, "s").toQuery();
-        assertEquals("spanElementDistance(field:try1, field:try2, [(s[2:3], ordered, notExcluded)])", sq.toString());
+        SpanQuery sq = kq.seq(kq.seg("try1")).append(kq.seg("try2"))
+                .withConstraint(2, 3, "s").toQuery();
+        assertEquals(
+                "spanElementDistance(field:try1, field:try2, [(s[2:3], ordered, notExcluded)])",
+                sq.toString());
     };
 
+
     @Test
     public void KorapSequenceQuery4 () throws QueryException {
         QueryBuilder kq = new QueryBuilder("field");
-        SpanQuery sq = kq.seq(kq.seg("try1")).append(kq.seg("try2")).withConstraint(2,3,"s").withConstraint(5,6,"w").toQuery();
-        assertEquals("spanMultipleDistance(field:try1, field:try2, [(s[2:3], ordered, notExcluded), (w[5:6], ordered, notExcluded)])", sq.toString());
+        SpanQuery sq = kq.seq(kq.seg("try1")).append(kq.seg("try2"))
+                .withConstraint(2, 3, "s").withConstraint(5, 6, "w").toQuery();
+        assertEquals(
+                "spanMultipleDistance(field:try1, field:try2, [(s[2:3], ordered, notExcluded), (w[5:6], ordered, notExcluded)])",
+                sq.toString());
     };
 
+
     @Test
     public void KorapSequenceQuery5 () throws QueryException {
         QueryBuilder kq = new QueryBuilder("field");
-        SpanQuery sq = kq.seq(kq.seg("try1")).append(kq.seg("try2")).withConstraint(2,3,true).toQuery();
-        assertEquals("spanDistance(field:try1, field:try2, [(w[2:3], ordered, excluded)])", sq.toString());
+        SpanQuery sq = kq.seq(kq.seg("try1")).append(kq.seg("try2"))
+                .withConstraint(2, 3, true).toQuery();
+        assertEquals(
+                "spanDistance(field:try1, field:try2, [(w[2:3], ordered, excluded)])",
+                sq.toString());
     };
 
+
     @Test
     public void KorapSequenceQuery6 () throws QueryException {
         QueryBuilder kq = new QueryBuilder("field");
-        SpanQuery sq = kq.seq(kq.seg("try1")).append(kq.seg("try2")).withConstraint(2,3,"s", true).toQuery();
-        assertEquals("spanElementDistance(field:try1, field:try2, [(s[2:3], ordered, excluded)])", sq.toString());
+        SpanQuery sq = kq.seq(kq.seg("try1")).append(kq.seg("try2"))
+                .withConstraint(2, 3, "s", true).toQuery();
+        assertEquals(
+                "spanElementDistance(field:try1, field:try2, [(s[2:3], ordered, excluded)])",
+                sq.toString());
     };
 
+
     @Test
     public void KorapSequenceQuery7 () throws QueryException {
         QueryBuilder kq = new QueryBuilder("field");
-        SpanQuery sq = kq.seq(kq.seg("try1")).append(kq.seg("try2")).withConstraint(5,6).withConstraint(2,3,"s",true).toQuery();
-        assertEquals("spanMultipleDistance(field:try1, field:try2, [(w[5:6], ordered, notExcluded), (s[2:3], ordered, excluded)])", sq.toString());
+        SpanQuery sq = kq.seq(kq.seg("try1")).append(kq.seg("try2"))
+                .withConstraint(5, 6).withConstraint(2, 3, "s", true).toQuery();
+        assertEquals(
+                "spanMultipleDistance(field:try1, field:try2, [(w[5:6], ordered, notExcluded), (s[2:3], ordered, excluded)])",
+                sq.toString());
     };
 
+
     @Test
     public void KorapSequenceQuery8 () throws QueryException {
         QueryBuilder kq = new QueryBuilder("field");
-        SpanQuery sq = kq.seq(kq.seg("try1")).append(kq.seg("try2")).append("try3").withConstraint(5,6).withConstraint(2,3,"s",true).toQuery();
-        assertEquals("spanMultipleDistance(spanMultipleDistance(field:try1, field:try2, [(w[5:6], ordered, notExcluded), (s[2:3], ordered, excluded)]), field:try3, [(w[5:6], ordered, notExcluded), (s[2:3], ordered, excluded)])", sq.toString());
+        SpanQuery sq = kq.seq(kq.seg("try1")).append(kq.seg("try2"))
+                .append("try3").withConstraint(5, 6)
+                .withConstraint(2, 3, "s", true).toQuery();
+        assertEquals(
+                "spanMultipleDistance(spanMultipleDistance(field:try1, field:try2, [(w[5:6], ordered, notExcluded), (s[2:3], ordered, excluded)]), field:try3, [(w[5:6], ordered, notExcluded), (s[2:3], ordered, excluded)])",
+                sq.toString());
     };
 
+
     @Test
     public void KorapWithinQuery1 () throws QueryException {
         QueryBuilder kq = new QueryBuilder("field");
@@ -225,6 +310,7 @@
         assertEquals("spanContain(field:test, field:test2)", sq.toString());
     };
 
+
     @Test
     public void KorapWithinQuery2 () throws QueryException {
         QueryBuilder kq = new QueryBuilder("field");
@@ -232,13 +318,14 @@
         assertEquals("spanOverlap(field:test, field:test2)", sq.toString());
     };
 
+
     @Test
     public void KorapWithinQuery3 () throws QueryException {
         QueryBuilder kq = new QueryBuilder("field");
         SpanQuery sq = kq.startswith(kq.seg("test"), kq.seg("test2")).toQuery();
         assertEquals("spanStartsWith(field:test, field:test2)", sq.toString());
     };
-   
+
     // kq.seg("a").append(kq.ANY).append("b:c");
     // kq.repeat(kq.seg("a", "b"), 5)
 };
diff --git a/src/test/java/de/ids_mannheim/korap/query/TestKrillQueryJSON.java b/src/test/java/de/ids_mannheim/korap/query/TestKrillQueryJSON.java
index 2613a20..26565fa 100644
--- a/src/test/java/de/ids_mannheim/korap/query/TestKrillQueryJSON.java
+++ b/src/test/java/de/ids_mannheim/korap/query/TestKrillQueryJSON.java
@@ -21,349 +21,465 @@
 
     @Test
     public void queryJSONBsp1 () throws QueryException {
-	SpanQueryWrapper sqwi = jsonQuery(getClass().getResource("/queries/bsp1.jsonld").getFile());
+        SpanQueryWrapper sqwi = jsonQuery(getClass().getResource(
+                "/queries/bsp1.jsonld").getFile());
 
-	// There is a repetition in here
-	// ([base=foo]|[base=bar])[base=foobar]
-	assertEquals(sqwi.toQuery().toString(),
-            "spanOr([tokens:base:foo, spanRepetition(spanNext(tokens:base:foo, tokens:base:bar){1,100})])");
-	assertTrue(sqwi.isOptional());
+        // There is a repetition in here
+        // ([base=foo]|[base=bar])[base=foobar]
+        assertEquals(
+                sqwi.toQuery().toString(),
+                "spanOr([tokens:base:foo, spanRepetition(spanNext(tokens:base:foo, tokens:base:bar){1,100})])");
+        assertTrue(sqwi.isOptional());
     };
 
+
     @Test
     public void queryJSONBsp1b () throws QueryException {
 
-	SpanQueryWrapper sqwi = jsonQuery(getClass().getResource("/queries/bsp1b.jsonld").getFile());
+        SpanQueryWrapper sqwi = jsonQuery(getClass().getResource(
+                "/queries/bsp1b.jsonld").getFile());
 
-	// [base=foo]|([base=foo][base=bar]) meta author=Goethe&year=1815
-	assertEquals(sqwi.toQuery().toString(), "spanOr([tokens:mate/l:foo, spanNext(tokens:mate/l:foo, tokens:mate/l:bar)])");
+        // [base=foo]|([base=foo][base=bar]) meta author=Goethe&year=1815
+        assertEquals(sqwi.toQuery().toString(),
+                "spanOr([tokens:mate/l:foo, spanNext(tokens:mate/l:foo, tokens:mate/l:bar)])");
     };
 
 
     @Test
     public void queryJSONBsp2 () throws QueryException {
-	SpanQueryWrapper sqwi = jsonQuery(getClass().getResource("/queries/bsp2.jsonld").getFile());
+        SpanQueryWrapper sqwi = jsonQuery(getClass().getResource(
+                "/queries/bsp2.jsonld").getFile());
 
-	// ([base=foo]|[base=bar])[base=foobar]
-	assertEquals(sqwi.toQuery().toString(), "spanNext(spanOr([tokens:mate/l:foo, tokens:mate/l:bar]), tokens:mate/l:foobar)");
+        // ([base=foo]|[base=bar])[base=foobar]
+        assertEquals(
+                sqwi.toQuery().toString(),
+                "spanNext(spanOr([tokens:mate/l:foo, tokens:mate/l:bar]), tokens:mate/l:foobar)");
     };
 
+
     @Test
     public void queryJSONBsp3 () throws QueryException {
-	SpanQueryWrapper sqwi = jsonQuery(getClass().getResource("/queries/bsp3.jsonld").getFile());
+        SpanQueryWrapper sqwi = jsonQuery(getClass().getResource(
+                "/queries/bsp3.jsonld").getFile());
 
-	// focus({[base=Mann]})
-	assertEquals(sqwi.toQuery().toString(), "focus(1: {1: tokens:mate/l:Mann})");
+        // focus({[base=Mann]})
+        assertEquals(sqwi.toQuery().toString(),
+                "focus(1: {1: tokens:mate/l:Mann})");
     };
 
+
     @Test
     public void queryJSONBsp4 () throws QueryException {
-	SpanQueryWrapper sqwi = jsonQuery(getClass().getResource("/queries/bsp4.jsonld").getFile());
+        SpanQueryWrapper sqwi = jsonQuery(getClass().getResource(
+                "/queries/bsp4.jsonld").getFile());
 
-	// focus({[base=foo]}[orth=bar])
-	assertEquals(sqwi.toQuery().toString(), "focus(1: spanNext({1: tokens:mate/l:foo}, tokens:s:bar))");
+        // focus({[base=foo]}[orth=bar])
+        assertEquals(sqwi.toQuery().toString(),
+                "focus(1: spanNext({1: tokens:mate/l:foo}, tokens:s:bar))");
     };
 
+
     @Test
     public void queryJSONBsp5 () throws QueryException {
-	SpanQueryWrapper sqwi = jsonQuery(getClass().getResource("/queries/bsp5.jsonld").getFile());
+        SpanQueryWrapper sqwi = jsonQuery(getClass().getResource(
+                "/queries/bsp5.jsonld").getFile());
 
-	// focus(1:[base=Der]{1:[base=Mann]}) 
-	assertEquals(sqwi.toQuery().toString(), "focus(1: spanNext(tokens:mate/l:Der, {1: tokens:mate/l:Mann}))");
+        // focus(1:[base=Der]{1:[base=Mann]}) 
+        assertEquals(sqwi.toQuery().toString(),
+                "focus(1: spanNext(tokens:mate/l:Der, {1: tokens:mate/l:Mann}))");
     };
 
+
     @Test
     public void queryJSONBsp6 () throws QueryException {
-	SpanQueryWrapper sqwi = jsonQuery(getClass().getResource("/queries/bsp6.jsonld").getFile());
+        SpanQueryWrapper sqwi = jsonQuery(getClass().getResource(
+                "/queries/bsp6.jsonld").getFile());
 
-	// [base=katze]
-	assertEquals(sqwi.toQuery().toString(), "tokens:mate/l:Katze");
+        // [base=katze]
+        assertEquals(sqwi.toQuery().toString(), "tokens:mate/l:Katze");
     };
 
+
     @Test
     public void queryJSONBsp7 () throws QueryException {
-	SpanQueryWrapper sqwi = jsonQuery(getClass().getResource("/queries/bsp7.jsonld").getFile());
+        SpanQueryWrapper sqwi = jsonQuery(getClass().getResource(
+                "/queries/bsp7.jsonld").getFile());
 
-	// [!base=Katze]
-	assertEquals("tokens:mate/l:Katze", sqwi.toQuery().toString());
-	assertTrue(sqwi.isNegative());
+        // [!base=Katze]
+        assertEquals("tokens:mate/l:Katze", sqwi.toQuery().toString());
+        assertTrue(sqwi.isNegative());
     };
 
+
     @Test
     public void queryJSONBsp9 () throws QueryException {
-	SpanQueryWrapper sqwi = jsonQuery(getClass().getResource("/queries/bsp9.jsonld").getFile());
+        SpanQueryWrapper sqwi = jsonQuery(getClass().getResource(
+                "/queries/bsp9.jsonld").getFile());
 
-	// [base=Katze&orth=Katzen]
-	assertEquals(sqwi.toQuery().toString(), "spanSegment(tokens:mate/l:Katze, tokens:s:Katzen)");
+        // [base=Katze&orth=Katzen]
+        assertEquals(sqwi.toQuery().toString(),
+                "spanSegment(tokens:mate/l:Katze, tokens:s:Katzen)");
     };
 
+
     @Test
     public void queryJSONBsp9b () throws QueryException {
-	SpanQueryWrapper sqwi = jsonQuery(getClass().getResource("/queries/bsp9b.jsonld").getFile());
+        SpanQueryWrapper sqwi = jsonQuery(getClass().getResource(
+                "/queries/bsp9b.jsonld").getFile());
 
-	// [base=Katze&orth=Katzen]
-	assertEquals(sqwi.toQuery().toString(), "spanSegment(tokens:mate/m:number:pl, tokens:tt/p:NN)");
+        // [base=Katze&orth=Katzen]
+        assertEquals(sqwi.toQuery().toString(),
+                "spanSegment(tokens:mate/m:number:pl, tokens:tt/p:NN)");
     };
 
 
     @Test
     public void queryJSONBsp10 () throws QueryException {
-	SpanQueryWrapper sqwi = jsonQuery(getClass().getResource("/queries/bsp10.jsonld").getFile());
+        SpanQueryWrapper sqwi = jsonQuery(getClass().getResource(
+                "/queries/bsp10.jsonld").getFile());
 
-	// [base=Katze][orth=und][orth=Hunde]
-	assertEquals(sqwi.toQuery().toString(), "spanNext(spanNext(tokens:mate/l:Katze, tokens:s:und), tokens:s:Hunde)");
+        // [base=Katze][orth=und][orth=Hunde]
+        assertEquals(sqwi.toQuery().toString(),
+                "spanNext(spanNext(tokens:mate/l:Katze, tokens:s:und), tokens:s:Hunde)");
     };
 
+
     @Test
     public void queryJSONBsp11 () throws QueryException {
-	SpanQueryWrapper sqwi = jsonQuery(getClass().getResource("/queries/bsp11.jsonld").getFile());
+        SpanQueryWrapper sqwi = jsonQuery(getClass().getResource(
+                "/queries/bsp11.jsonld").getFile());
 
-	// [base!=Katze | orth!=Katzen]
-	/*
-	  Imagine a([^b]|[^c])d
-	  Matches abd and acd
-	  Interpretation would be not(spanAnd(...))
-	*/
-	assertEquals(sqwi.toQuery().toString(), "spanOr([tokens:mate/l:Katze, tokens:s:Katzen])");
-	assertTrue(sqwi.isNegative());
+        // [base!=Katze | orth!=Katzen]
+        /*
+          Imagine a([^b]|[^c])d
+          Matches abd and acd
+          Interpretation would be not(spanAnd(...))
+        */
+        assertEquals(sqwi.toQuery().toString(),
+                "spanOr([tokens:mate/l:Katze, tokens:s:Katzen])");
+        assertTrue(sqwi.isNegative());
     };
 
+
     @Test
     public void queryJSONBsp12 () throws QueryException {
-	SpanQueryWrapper sqwi = jsonQuery(getClass().getResource("/queries/bsp12.jsonld").getFile());
+        SpanQueryWrapper sqwi = jsonQuery(getClass().getResource(
+                "/queries/bsp12.jsonld").getFile());
 
-	// contains(<np>,[base=Mann])
-	assertEquals(sqwi.toQuery().toString(), "spanContain(<tokens:np />, tokens:mate/l:Mann)");
+        // contains(<np>,[base=Mann])
+        assertEquals(sqwi.toQuery().toString(),
+                "spanContain(<tokens:np />, tokens:mate/l:Mann)");
     };
 
+
     @Test
     public void queryJSONBsp13 () throws QueryException {
-	SpanQueryWrapper sqwi = jsonQuery(getClass().getResource("/queries/bsp13.jsonld").getFile());
+        SpanQueryWrapper sqwi = jsonQuery(getClass().getResource(
+                "/queries/bsp13.jsonld").getFile());
 
-	assertEquals(sqwi.toQuery().toString(), "spanStartsWith(<tokens:np />, tokens:p:Det)");
+        assertEquals(sqwi.toQuery().toString(),
+                "spanStartsWith(<tokens:np />, tokens:p:Det)");
     };
 
+
     @Test
     public void queryJSONBsp13b () throws QueryException {
-	SpanQueryWrapper sqwi = jsonQuery(getClass().getResource("/queries/bsp13b.jsonld").getFile());
+        SpanQueryWrapper sqwi = jsonQuery(getClass().getResource(
+                "/queries/bsp13b.jsonld").getFile());
 
-	// startswith(<np>,[pos=Det])
-	assertEquals(sqwi.toQuery().toString(), "spanStartsWith(<tokens:np />, tokens:mate/p:Det)");
+        // startswith(<np>,[pos=Det])
+        assertEquals(sqwi.toQuery().toString(),
+                "spanStartsWith(<tokens:np />, tokens:mate/p:Det)");
     };
 
+
     @Test
     public void queryJSONBsp14 () throws QueryException {
-	SpanQueryWrapper sqwi = jsonQuery(getClass().getResource("/queries/bsp14.jsonld").getFile());
+        SpanQueryWrapper sqwi = jsonQuery(getClass().getResource(
+                "/queries/bsp14.jsonld").getFile());
 
-	// 'vers{2,3}uch'
-	assertEquals(sqwi.toQuery().toString(), "SpanMultiTermQueryWrapper(tokens:/s:vers{2,3}uch/)");
+        // 'vers{2,3}uch'
+        assertEquals(sqwi.toQuery().toString(),
+                "SpanMultiTermQueryWrapper(tokens:/s:vers{2,3}uch/)");
     };
 
+
     @Test
     public void queryJSONBsp15 () throws QueryException {
-	SpanQueryWrapper sqwi = jsonQuery(getClass().getResource("/queries/bsp15.jsonld").getFile());
+        SpanQueryWrapper sqwi = jsonQuery(getClass().getResource(
+                "/queries/bsp15.jsonld").getFile());
 
-	// [orth='vers.*ch']
-	assertEquals(sqwi.toQuery().toString(), "SpanMultiTermQueryWrapper(tokens:/s:vers.*ch/)");
+        // [orth='vers.*ch']
+        assertEquals(sqwi.toQuery().toString(),
+                "SpanMultiTermQueryWrapper(tokens:/s:vers.*ch/)");
     };
 
+
     @Test
     public void queryJSONBsp16 () throws QueryException {
-	SpanQueryWrapper sqwi = jsonQuery(getClass().getResource("/queries/bsp16.jsonld").getFile());
+        SpanQueryWrapper sqwi = jsonQuery(getClass().getResource(
+                "/queries/bsp16.jsonld").getFile());
 
-	// [(base=bar|base=foo)&orth=foobar]
-	assertEquals(sqwi.toQuery().toString(), "spanSegment(spanOr([tokens:mate/l:bar, tokens:mate/l:foo]), tokens:s:foobar)");
+        // [(base=bar|base=foo)&orth=foobar]
+        assertEquals(sqwi.toQuery().toString(),
+                "spanSegment(spanOr([tokens:mate/l:bar, tokens:mate/l:foo]), tokens:s:foobar)");
     };
 
+
     @Test
     public void queryJSONBsp17 () throws QueryException {
-	SpanQueryWrapper sqwi = jsonQuery(getClass().getResource("/queries/bsp17.jsonld").getFile());
+        SpanQueryWrapper sqwi = jsonQuery(getClass().getResource(
+                "/queries/bsp17.jsonld").getFile());
 
-	// within(<np>,[base=Mann])
-	assertEquals(sqwi.toQuery().toString(), "spanContain(<tokens:np />, tokens:mate/l:Mann)");
+        // within(<np>,[base=Mann])
+        assertEquals(sqwi.toQuery().toString(),
+                "spanContain(<tokens:np />, tokens:mate/l:Mann)");
     };
 
+
     @Test
     public void queryJSONDemo () throws QueryException {
-	SpanQueryWrapper sqwi = new KrillQuery("tokens").fromJson("{ \"query\" : { \"@type\" : \"koral:token\", \"wrap\" : { \"@type\" : \"koral:term\", \"foundry\" : \"base\", \"layer\" : \"p\", \"key\" : \"foo\", \"match\" : \"match:eq\" }}}");
+        SpanQueryWrapper sqwi = new KrillQuery("tokens")
+                .fromJson("{ \"query\" : { \"@type\" : \"koral:token\", \"wrap\" : { \"@type\" : \"koral:term\", \"foundry\" : \"base\", \"layer\" : \"p\", \"key\" : \"foo\", \"match\" : \"match:eq\" }}}");
 
-	assertEquals(sqwi.toQuery().toString(), "tokens:base/p:foo");
+        assertEquals(sqwi.toQuery().toString(), "tokens:base/p:foo");
     };
 
+
     @Test
     public void queryJSONBspClass () throws QueryException {
-	SpanQueryWrapper sqwi = jsonQuery(getClass().getResource("/queries/bsp-class.jsonld").getFile());
+        SpanQueryWrapper sqwi = jsonQuery(getClass().getResource(
+                "/queries/bsp-class.jsonld").getFile());
 
-	// within(<np>,[base=Mann])
-	assertEquals(sqwi.toQuery().toString(), "{1: spanNext(tokens:tt/p:ADJA, tokens:mate/p:NN)}");
+        // within(<np>,[base=Mann])
+        assertEquals(sqwi.toQuery().toString(),
+                "{1: spanNext(tokens:tt/p:ADJA, tokens:mate/p:NN)}");
     };
-    
+
+
     @Test
     public void queryJSONcosmas3 () throws QueryException {
-	SpanQueryWrapper sqwi = jsonQuery(getClass().getResource("/queries/cosmas3.json").getFile());
+        SpanQueryWrapper sqwi = jsonQuery(getClass().getResource(
+                "/queries/cosmas3.json").getFile());
 
-	// "das /+w1:3 Buch"
-	assertEquals(sqwi.toQuery().toString(), "spanDistance(tokens:s:das, tokens:s:Buch, [(w[1:3], ordered, notExcluded)])");
+        // "das /+w1:3 Buch"
+        assertEquals(sqwi.toQuery().toString(),
+                "spanDistance(tokens:s:das, tokens:s:Buch, [(w[1:3], ordered, notExcluded)])");
     };
 
+
     @Test
     public void queryJSONcosmas4 () throws QueryException {
-	SpanQueryWrapper sqwi = jsonQuery(getClass().getResource("/queries/cosmas4.json").getFile());
+        SpanQueryWrapper sqwi = jsonQuery(getClass().getResource(
+                "/queries/cosmas4.json").getFile());
 
-	// "das /+w1:3,s1:1 Buch"
-	assertEquals(sqwi.toQuery().toString(), "spanMultipleDistance(tokens:s:das, tokens:s:Buch, [(w[1:3], ordered, notExcluded), (s[1:1], ordered, notExcluded)])");
+        // "das /+w1:3,s1:1 Buch"
+        assertEquals(
+                sqwi.toQuery().toString(),
+                "spanMultipleDistance(tokens:s:das, tokens:s:Buch, [(w[1:3], ordered, notExcluded), (s[1:1], ordered, notExcluded)])");
     };
 
+
     @Test
     public void queryJSONcosmas4b () throws QueryException {
-	SpanQueryWrapper sqwi = jsonQuery(getClass().getResource("/queries/cosmas4b.json").getFile());
+        SpanQueryWrapper sqwi = jsonQuery(getClass().getResource(
+                "/queries/cosmas4b.json").getFile());
 
-	// "das /+w1:3,s1 Buch"
-	assertEquals(sqwi.toQuery().toString(), "spanMultipleDistance(tokens:s:das, tokens:s:Buch, [(w[1:3], ordered, notExcluded), (s[0:1], ordered, notExcluded)])");
+        // "das /+w1:3,s1 Buch"
+        assertEquals(
+                sqwi.toQuery().toString(),
+                "spanMultipleDistance(tokens:s:das, tokens:s:Buch, [(w[1:3], ordered, notExcluded), (s[0:1], ordered, notExcluded)])");
     };
 
+
     @Test
     public void queryJSONcosmas10 () throws QueryException {
-	SpanQueryWrapper sqwi = jsonQuery(getClass().getResource("/queries/cosmas10.json").getFile());
+        SpanQueryWrapper sqwi = jsonQuery(getClass().getResource(
+                "/queries/cosmas10.json").getFile());
 
-	// "Institut für $deutsche Sprache"
-	assertEquals(sqwi.toQuery().toString(), "spanNext(spanNext(spanNext(tokens:s:Institut, tokens:s:für), tokens:i:deutsche), tokens:s:Sprache)");
+        // "Institut für $deutsche Sprache"
+        assertEquals(
+                sqwi.toQuery().toString(),
+                "spanNext(spanNext(spanNext(tokens:s:Institut, tokens:s:für), tokens:i:deutsche), tokens:s:Sprache)");
     };
 
+
     @Test
     public void queryJSONcosmas10b () throws QueryException {
-	SpanQueryWrapper sqwi = jsonQuery(getClass().getResource("/queries/cosmas10b.json").getFile());
+        SpanQueryWrapper sqwi = jsonQuery(getClass().getResource(
+                "/queries/cosmas10b.json").getFile());
 
-	// "Institut $FÜR $deutsche Sprache"
-	assertEquals(sqwi.toQuery().toString(), "spanNext(spanNext(spanNext(tokens:s:Institut, tokens:i:für), tokens:i:deutsche), tokens:s:Sprache)");
+        // "Institut $FÜR $deutsche Sprache"
+        assertEquals(
+                sqwi.toQuery().toString(),
+                "spanNext(spanNext(spanNext(tokens:s:Institut, tokens:i:für), tokens:i:deutsche), tokens:s:Sprache)");
     };
 
+
     @Test
     public void queryJSONcosmas16 () throws QueryException {
-	SpanQueryWrapper sqwi = jsonQuery(getClass().getResource("/queries/cosmas16.json").getFile());
+        SpanQueryWrapper sqwi = jsonQuery(getClass().getResource(
+                "/queries/cosmas16.json").getFile());
 
-	// "$wegen #IN(L) <s>"
-	assertEquals(sqwi.toQuery().toString(), "focus(1: spanStartsWith(<tokens:s />, {1: tokens:i:wegen}))");
+        // "$wegen #IN(L) <s>"
+        assertEquals(sqwi.toQuery().toString(),
+                "focus(1: spanStartsWith(<tokens:s />, {1: tokens:i:wegen}))");
     };
 
+
     @Test
     public void queryJSONcosmas17 () throws QueryException {
-	SpanQueryWrapper sqwi = jsonQuery(getClass().getResource("/queries/cosmas17.json").getFile());
+        SpanQueryWrapper sqwi = jsonQuery(getClass().getResource(
+                "/queries/cosmas17.json").getFile());
 
-	// "#BED($wegen , +sa)"
-	assertEquals(sqwi.toQuery().toString(), "spanStartsWith(<tokens:s />, tokens:i:wegen)");
+        // "#BED($wegen , +sa)"
+        assertEquals(sqwi.toQuery().toString(),
+                "spanStartsWith(<tokens:s />, tokens:i:wegen)");
     };
 
+
     @Test
     public void queryJSONcosmas20 () throws QueryException {
-	SpanQueryWrapper sqwi = jsonQuery(getClass().getResource("/queries/cosmas20.json").getFile());
+        SpanQueryWrapper sqwi = jsonQuery(getClass().getResource(
+                "/queries/cosmas20.json").getFile());
 
-	//     "MORPH(V) #IN(R) #ELEM(S)"
-	assertEquals(sqwi.toQuery().toString(), "focus(1: spanEndsWith(<tokens:s />, {1: tokens:p:V}))");
+        //     "MORPH(V) #IN(R) #ELEM(S)"
+        assertEquals(sqwi.toQuery().toString(),
+                "focus(1: spanEndsWith(<tokens:s />, {1: tokens:p:V}))");
     };
 
+
     @Test
     public void queryJSONrepetition () throws QueryException {
-	SpanQueryWrapper sqwi = jsonQuery(getClass().getResource("/queries/bsp-repetition.jsonld").getFile());
+        SpanQueryWrapper sqwi = jsonQuery(getClass().getResource(
+                "/queries/bsp-repetition.jsonld").getFile());
 
-	// der[cnx/p=A]{0,2}[tt/p=NN]
-	assertEquals(sqwi.toQuery().toString(), "spanNext(tokens:s:der, spanOr([tokens:tt/p:NN, spanNext(spanRepetition(tokens:cnx/p:A{1,2}), tokens:tt/p:NN)]))");
+        // der[cnx/p=A]{0,2}[tt/p=NN]
+        assertEquals(
+                sqwi.toQuery().toString(),
+                "spanNext(tokens:s:der, spanOr([tokens:tt/p:NN, spanNext(spanRepetition(tokens:cnx/p:A{1,2}), tokens:tt/p:NN)]))");
     };
 
+
     @Test
     public void queryJSONboundaryBug () throws QueryException {
-	SpanQueryWrapper sqwi = jsonQuery(getClass().getResource("/queries/bsp-boundary.jsonld").getFile());
+        SpanQueryWrapper sqwi = jsonQuery(getClass().getResource(
+                "/queries/bsp-boundary.jsonld").getFile());
 
-	// Tal []{1,} Wald
-	assertEquals(sqwi.toQuery().toString(), "spanDistance(tokens:s:Tal, tokens:s:Wald, [(w[2:100], ordered, notExcluded)])");
+        // Tal []{1,} Wald
+        assertEquals(sqwi.toQuery().toString(),
+                "spanDistance(tokens:s:Tal, tokens:s:Wald, [(w[2:100], ordered, notExcluded)])");
     };
 
+
     @Test
     public void queryJSONcosmasBoundaryBug () throws QueryException {
-	SpanQueryWrapper sqwi = jsonQuery(getClass().getResource("/queries/bugs/cosmas_boundary.jsonld").getFile());
+        SpanQueryWrapper sqwi = jsonQuery(getClass().getResource(
+                "/queries/bugs/cosmas_boundary.jsonld").getFile());
 
-	// Namen /s1 Leben
-	assertEquals(sqwi.toQuery().toString(), "focus(129: spanElementDistance({129: tokens:s:Namen}, {129: tokens:s:Leben}, [(base/s:s[0:1], notOrdered, notExcluded)]))");
+        // Namen /s1 Leben
+        assertEquals(
+                sqwi.toQuery().toString(),
+                "focus(129: spanElementDistance({129: tokens:s:Namen}, {129: tokens:s:Leben}, [(base/s:s[0:1], notOrdered, notExcluded)]))");
     };
 
+
     @Test
     public void queryJSONfoundryForOrthBug () throws QueryException {
-	SpanQueryWrapper sqwi = jsonQuery(getClass().getResource("/queries/bugs/foundry_for_orth.jsonld").getFile());
+        SpanQueryWrapper sqwi = jsonQuery(getClass().getResource(
+                "/queries/bugs/foundry_for_orth.jsonld").getFile());
 
-	// opennlp/orth:Baum
-	assertEquals(sqwi.toQuery().toString(), "tokens:s:Baum");
+        // opennlp/orth:Baum
+        assertEquals(sqwi.toQuery().toString(), "tokens:s:Baum");
     };
 
+
     @Test
     public void queryJSONfoundryForOrthBug2 () throws QueryException {
-	SpanQueryWrapper sqwi = jsonQuery(getClass().getResource("/queries/bugs/foundry_for_orth_2.jsonld").getFile());
+        SpanQueryWrapper sqwi = jsonQuery(getClass().getResource(
+                "/queries/bugs/foundry_for_orth_2.jsonld").getFile());
 
-	// baum/i
-	assertEquals(sqwi.toQuery().toString(), "tokens:i:baum");
+        // baum/i
+        assertEquals(sqwi.toQuery().toString(), "tokens:i:baum");
     };
 
+
     @Test
     public void queryJSONunderspecifiedTokenBug () {
-	// ((MORPH(APPR) ODER MORPH(APPRART)) /+w1 Urlaub
-	try {
-	    String json = getString(getClass().getResource("/queries/bugs/underspecified_token.jsonld").getFile());
-	    new KrillQuery("tokens").fromJson(json);
-	}
-	catch (QueryException e) {
-	    assertEquals(701, e.getErrorCode());
-	};
+        // ((MORPH(APPR) ODER MORPH(APPRART)) /+w1 Urlaub
+        try {
+            String json = getString(getClass().getResource(
+                    "/queries/bugs/underspecified_token.jsonld").getFile());
+            new KrillQuery("tokens").fromJson(json);
+        }
+        catch (QueryException e) {
+            assertEquals(701, e.getErrorCode());
+        };
     };
 
+
     @Test
     public void queryJSONspecialLayerBug () throws QueryException {
-	SpanQueryWrapper sqwi = jsonQuery(getClass().getResource("/queries/bugs/special_layer.jsonld").getFile());
-	assertEquals(sqwi.toQuery().toString(), "spanNext(spanNext(spanNext(tokens:s:Baum, tokens:cnx/p:CC), tokens:tt/l:Baum), <tokens:xip/c:MC />)");
+        SpanQueryWrapper sqwi = jsonQuery(getClass().getResource(
+                "/queries/bugs/special_layer.jsonld").getFile());
+        assertEquals(
+                sqwi.toQuery().toString(),
+                "spanNext(spanNext(spanNext(tokens:s:Baum, tokens:cnx/p:CC), tokens:tt/l:Baum), <tokens:xip/c:MC />)");
     };
 
 
     @Test
     public void queryJSONrepetitionGroupRewriteBug () throws QueryException {
-	// ([cnx/p="A"][]){2}
-	SpanQueryWrapper sqwi = jsonQuery(getClass().getResource("/queries/bugs/repetition_group_rewrite.jsonld").getFile());
+        // ([cnx/p="A"][]){2}
+        SpanQueryWrapper sqwi = jsonQuery(getClass().getResource(
+                "/queries/bugs/repetition_group_rewrite.jsonld").getFile());
 
-	assertEquals(sqwi.toQuery().toString(), "spanRepetition(spanExpansion(SpanMultiTermQueryWrapper(tokens:/cnx/p:A/), []{1, 1}, right){2,2})");
+        assertEquals(
+                sqwi.toQuery().toString(),
+                "spanRepetition(spanExpansion(SpanMultiTermQueryWrapper(tokens:/cnx/p:A/), []{1, 1}, right){2,2})");
     };
 
+
     @Test
     public void queryJSONoverlapsFrameWorkaround () throws QueryException {
-	// overlaps(<s>,[tt/p=CARD][tt/p="N.*"])
-	SpanQueryWrapper sqwi = jsonQuery(getClass().getResource("/queries/bugs/overlaps_frame_workaround.jsonld").getFile());
+        // overlaps(<s>,[tt/p=CARD][tt/p="N.*"])
+        SpanQueryWrapper sqwi = jsonQuery(getClass().getResource(
+                "/queries/bugs/overlaps_frame_workaround.jsonld").getFile());
 
-	assertEquals(sqwi.toQuery().toString(), "spanOverlap(<tokens:s />, spanNext(tokens:tt/p:CARD, SpanMultiTermQueryWrapper(tokens:/tt/p:N.*/)))");
+        assertEquals(
+                sqwi.toQuery().toString(),
+                "spanOverlap(<tokens:s />, spanNext(tokens:tt/p:CARD, SpanMultiTermQueryWrapper(tokens:/tt/p:N.*/)))");
     };
 
 
     public static String getString (String path) {
-	StringBuilder contentBuilder = new StringBuilder();
-	try {
-	    BufferedReader in = new BufferedReader(new FileReader(path));
-	    String str;
-	    while ((str = in.readLine()) != null) {
-		contentBuilder.append(str);
-	    };
-	    in.close();
-	} catch (IOException e) {
-	    fail(e.getMessage());
-	}
-	return contentBuilder.toString();
+        StringBuilder contentBuilder = new StringBuilder();
+        try {
+            BufferedReader in = new BufferedReader(new FileReader(path));
+            String str;
+            while ((str = in.readLine()) != null) {
+                contentBuilder.append(str);
+            };
+            in.close();
+        }
+        catch (IOException e) {
+            fail(e.getMessage());
+        }
+        return contentBuilder.toString();
     };
 
+
     public static SpanQueryWrapper jsonQuery (String jsonFile) {
-	SpanQueryWrapper sqwi;
-	
-	try {
-	    String json = getString(jsonFile);
-	    sqwi = new KrillQuery("tokens").fromJson(json);
-	}
-	catch (QueryException e) {
-	    fail(e.getMessage());
-	    sqwi = new QueryBuilder("tokens").seg("???");
-	};
-	return sqwi;
+        SpanQueryWrapper sqwi;
+
+        try {
+            String json = getString(jsonFile);
+            sqwi = new KrillQuery("tokens").fromJson(json);
+        }
+        catch (QueryException e) {
+            fail(e.getMessage());
+            sqwi = new QueryBuilder("tokens").seg("???");
+        };
+        return sqwi;
     };
 };
diff --git a/src/test/java/de/ids_mannheim/korap/query/TestSpanAlterQuery.java b/src/test/java/de/ids_mannheim/korap/query/TestSpanAlterQuery.java
index 9be1fcc..70b559e 100644
--- a/src/test/java/de/ids_mannheim/korap/query/TestSpanAlterQuery.java
+++ b/src/test/java/de/ids_mannheim/korap/query/TestSpanAlterQuery.java
@@ -14,45 +14,56 @@
 import org.junit.runners.JUnit4;
 
 @RunWith(JUnit4.class)
-public class TestSpanAlterQuery  {
+public class TestSpanAlterQuery {
     @Test
     public void spanAlterQuery () throws QueryException {
 
-	SpanAlterQueryWrapper ssaquery = new SpanAlterQueryWrapper("field");
-	ssaquery.or("b");
-	assertEquals("field:b", ssaquery.toQuery().toString());
+        SpanAlterQueryWrapper ssaquery = new SpanAlterQueryWrapper("field");
+        ssaquery.or("b");
+        assertEquals("field:b", ssaquery.toQuery().toString());
     };
 
+
     @Test
     public void spanAlterQuery2 () throws QueryException {
 
-	SpanAlterQueryWrapper ssaquery = new SpanAlterQueryWrapper("field");
-	ssaquery.or("b").or("c");
-	assertEquals("spanOr([field:b, field:c])", ssaquery.toQuery().toString());
+        SpanAlterQueryWrapper ssaquery = new SpanAlterQueryWrapper("field");
+        ssaquery.or("b").or("c");
+        assertEquals("spanOr([field:b, field:c])", ssaquery.toQuery()
+                .toString());
     };
 
+
     @Test
     public void spanAlterQuery3 () throws QueryException {
-	SpanAlterQueryWrapper ssaquery = new SpanAlterQueryWrapper("field");
-	ssaquery.or("b").or("c").or("d");
-	assertEquals("spanOr([field:b, field:c, field:d])", ssaquery.toQuery().toString());
+        SpanAlterQueryWrapper ssaquery = new SpanAlterQueryWrapper("field");
+        ssaquery.or("b").or("c").or("d");
+        assertEquals("spanOr([field:b, field:c, field:d])", ssaquery.toQuery()
+                .toString());
     };
 
 
     @Test
     public void spanAlterQuery4 () throws QueryException {
-	SpanSegmentQueryWrapper segquery = new SpanSegmentQueryWrapper("field", "a", "b", "c");
-	SpanAlterQueryWrapper ssaquery = new SpanAlterQueryWrapper("field");
-	ssaquery.or("d").or(segquery).or("e");
-	assertEquals("spanOr([field:d, spanSegment(spanSegment(field:a, field:b), field:c), field:e])", ssaquery.toQuery().toString());
+        SpanSegmentQueryWrapper segquery = new SpanSegmentQueryWrapper("field",
+                "a", "b", "c");
+        SpanAlterQueryWrapper ssaquery = new SpanAlterQueryWrapper("field");
+        ssaquery.or("d").or(segquery).or("e");
+        assertEquals(
+                "spanOr([field:d, spanSegment(spanSegment(field:a, field:b), field:c), field:e])",
+                ssaquery.toQuery().toString());
     };
 
+
     @Test
     public void spanAlterQuery5 () throws QueryException {
-	SpanRegexQueryWrapper srequery = new SpanRegexQueryWrapper("field", "a[bc]d.?e");
-	SpanAlterQueryWrapper ssaquery = new SpanAlterQueryWrapper("field");
-	ssaquery.or("f").or(srequery).or("g");
-	assertEquals("spanOr([field:f, SpanMultiTermQueryWrapper(field:/a[bc]d.?e/), field:g])", ssaquery.toQuery().toString());
+        SpanRegexQueryWrapper srequery = new SpanRegexQueryWrapper("field",
+                "a[bc]d.?e");
+        SpanAlterQueryWrapper ssaquery = new SpanAlterQueryWrapper("field");
+        ssaquery.or("f").or(srequery).or("g");
+        assertEquals(
+                "spanOr([field:f, SpanMultiTermQueryWrapper(field:/a[bc]d.?e/), field:g])",
+                ssaquery.toQuery().toString());
     };
 
 };
diff --git a/src/test/java/de/ids_mannheim/korap/query/TestSpanElementQuery.java b/src/test/java/de/ids_mannheim/korap/query/TestSpanElementQuery.java
index 8fab7b3..de50d78 100644
--- a/src/test/java/de/ids_mannheim/korap/query/TestSpanElementQuery.java
+++ b/src/test/java/de/ids_mannheim/korap/query/TestSpanElementQuery.java
@@ -24,12 +24,14 @@
         assertEquals("<field:b />", sequery.toString());
     };
 
+
     @Test
     public void spanElement2Query () {
         SpanElementQuery sequery = new SpanElementQuery("field", "xyz");
         assertEquals("<field:xyz />", sequery.toString());
     };
 
+
     @Test
     public void spanElement3Query () {
         SpanElementQuery sequery = new SpanElementQuery("field", "");
diff --git a/src/test/java/de/ids_mannheim/korap/query/TestSpanSegmentAlterQuery.java b/src/test/java/de/ids_mannheim/korap/query/TestSpanSegmentAlterQuery.java
index e0ea83a..9791fa4 100644
--- a/src/test/java/de/ids_mannheim/korap/query/TestSpanSegmentAlterQuery.java
+++ b/src/test/java/de/ids_mannheim/korap/query/TestSpanSegmentAlterQuery.java
@@ -18,41 +18,52 @@
     @Test
     public void spanAlterQuery () throws QueryException {
 
-	SpanAlterQueryWrapper ssaquery = new SpanAlterQueryWrapper("field");
-	ssaquery.or("b");
-	assertEquals("field:b", ssaquery.toQuery().toString());
+        SpanAlterQueryWrapper ssaquery = new SpanAlterQueryWrapper("field");
+        ssaquery.or("b");
+        assertEquals("field:b", ssaquery.toQuery().toString());
     };
 
+
     @Test
     public void spanAlterQuery2 () throws QueryException {
 
-	SpanAlterQueryWrapper ssaquery = new SpanAlterQueryWrapper("field");
-	ssaquery.or("b").or("c");
-	assertEquals("spanOr([field:b, field:c])", ssaquery.toQuery().toString());
+        SpanAlterQueryWrapper ssaquery = new SpanAlterQueryWrapper("field");
+        ssaquery.or("b").or("c");
+        assertEquals("spanOr([field:b, field:c])", ssaquery.toQuery()
+                .toString());
     };
 
+
     @Test
     public void spanAlterQuery3 () throws QueryException {
-	SpanAlterQueryWrapper ssaquery = new SpanAlterQueryWrapper("field");
-	ssaquery.or("b").or("c").or("d");
-	assertEquals("spanOr([field:b, field:c, field:d])", ssaquery.toQuery().toString());
+        SpanAlterQueryWrapper ssaquery = new SpanAlterQueryWrapper("field");
+        ssaquery.or("b").or("c").or("d");
+        assertEquals("spanOr([field:b, field:c, field:d])", ssaquery.toQuery()
+                .toString());
     };
 
 
     @Test
     public void spanAlterQuery4 () throws QueryException {
-	SpanSegmentQueryWrapper segquery = new SpanSegmentQueryWrapper("field", "a", "b", "c");
-	SpanAlterQueryWrapper ssaquery = new SpanAlterQueryWrapper("field");
-	ssaquery.or("d").or(segquery).or("e");
-	assertEquals("spanOr([field:d, spanSegment(spanSegment(field:a, field:b), field:c), field:e])", ssaquery.toQuery().toString());
+        SpanSegmentQueryWrapper segquery = new SpanSegmentQueryWrapper("field",
+                "a", "b", "c");
+        SpanAlterQueryWrapper ssaquery = new SpanAlterQueryWrapper("field");
+        ssaquery.or("d").or(segquery).or("e");
+        assertEquals(
+                "spanOr([field:d, spanSegment(spanSegment(field:a, field:b), field:c), field:e])",
+                ssaquery.toQuery().toString());
     };
 
+
     @Test
     public void spanAlterQuery5 () throws QueryException {
-	SpanRegexQueryWrapper srequery = new SpanRegexQueryWrapper("field", "a[bc]d.?e");
-	SpanAlterQueryWrapper ssaquery = new SpanAlterQueryWrapper("field");
-	ssaquery.or("f").or(srequery).or("g");
-	assertEquals("spanOr([field:f, SpanMultiTermQueryWrapper(field:/a[bc]d.?e/), field:g])", ssaquery.toQuery().toString());
+        SpanRegexQueryWrapper srequery = new SpanRegexQueryWrapper("field",
+                "a[bc]d.?e");
+        SpanAlterQueryWrapper ssaquery = new SpanAlterQueryWrapper("field");
+        ssaquery.or("f").or(srequery).or("g");
+        assertEquals(
+                "spanOr([field:f, SpanMultiTermQueryWrapper(field:/a[bc]d.?e/), field:g])",
+                ssaquery.toQuery().toString());
     };
 
 };
diff --git a/src/test/java/de/ids_mannheim/korap/query/TestSpanSegmentQuery.java b/src/test/java/de/ids_mannheim/korap/query/TestSpanSegmentQuery.java
index 444a188..8c857a2 100644
--- a/src/test/java/de/ids_mannheim/korap/query/TestSpanSegmentQuery.java
+++ b/src/test/java/de/ids_mannheim/korap/query/TestSpanSegmentQuery.java
@@ -18,86 +18,114 @@
     @Test
     public void spanSegmentQuery () throws QueryException {
 
-	SpanSegmentQueryWrapper ssquery = new SpanSegmentQueryWrapper("field","a");
-	assertEquals("field:a", ssquery.toQuery().toString());
+        SpanSegmentQueryWrapper ssquery = new SpanSegmentQueryWrapper("field",
+                "a");
+        assertEquals("field:a", ssquery.toQuery().toString());
 
-	ssquery = new SpanSegmentQueryWrapper("field", "a", "b");
-	assertEquals("spanSegment(field:a, field:b)", ssquery.toQuery().toString());
+        ssquery = new SpanSegmentQueryWrapper("field", "a", "b");
+        assertEquals("spanSegment(field:a, field:b)", ssquery.toQuery()
+                .toString());
 
-	ssquery = new SpanSegmentQueryWrapper("field","a", "b", "c");
-	assertEquals("spanSegment(spanSegment(field:a, field:b), field:c)", ssquery.toQuery().toString());
+        ssquery = new SpanSegmentQueryWrapper("field", "a", "b", "c");
+        assertEquals("spanSegment(spanSegment(field:a, field:b), field:c)",
+                ssquery.toQuery().toString());
     };
 
+
     @Test
     public void spanSegmentQueryExclusive () throws QueryException {
 
-	SpanSegmentQueryWrapper ssquery = new SpanSegmentQueryWrapper("field","a");
-	assertEquals("field:a", ssquery.toQuery().toString());
+        SpanSegmentQueryWrapper ssquery = new SpanSegmentQueryWrapper("field",
+                "a");
+        assertEquals("field:a", ssquery.toQuery().toString());
 
-	ssquery = new SpanSegmentQueryWrapper("field", "a", "b");
-	assertEquals("spanSegment(field:a, field:b)", ssquery.toQuery().toString());
+        ssquery = new SpanSegmentQueryWrapper("field", "a", "b");
+        assertEquals("spanSegment(field:a, field:b)", ssquery.toQuery()
+                .toString());
 
-	ssquery.without("c");
-	assertEquals("spanNot(spanSegment(field:a, field:b), field:c, 0, 0)", ssquery.toQuery().toString());
+        ssquery.without("c");
+        assertEquals("spanNot(spanSegment(field:a, field:b), field:c, 0, 0)",
+                ssquery.toQuery().toString());
 
-	ssquery.without("d");
-	assertEquals("spanNot(spanSegment(field:a, field:b), spanOr([field:c, field:d]), 0, 0)", ssquery.toQuery().toString());
+        ssquery.without("d");
+        assertEquals(
+                "spanNot(spanSegment(field:a, field:b), spanOr([field:c, field:d]), 0, 0)",
+                ssquery.toQuery().toString());
     };
 
 
     @Test
     public void spanSegmentRegexQuery () throws QueryException {
-	SpanSegmentQueryWrapper ssquery = new SpanSegmentQueryWrapper("field");
-	assertNull(ssquery.toQuery());
-	ssquery.with("a");
-	assertEquals("field:a", ssquery.toQuery().toString());
+        SpanSegmentQueryWrapper ssquery = new SpanSegmentQueryWrapper("field");
+        assertNull(ssquery.toQuery());
+        ssquery.with("a");
+        assertEquals("field:a", ssquery.toQuery().toString());
 
-	ssquery.with(new SpanRegexQueryWrapper("field", "a.*b"));
+        ssquery.with(new SpanRegexQueryWrapper("field", "a.*b"));
 
-	assertEquals("spanSegment(field:a, SpanMultiTermQueryWrapper(field:/a.*b/))", ssquery.toQuery().toString());
+        assertEquals(
+                "spanSegment(field:a, SpanMultiTermQueryWrapper(field:/a.*b/))",
+                ssquery.toQuery().toString());
 
-	ssquery.with("c");
+        ssquery.with("c");
 
-	assertEquals("spanSegment(spanSegment(field:a, SpanMultiTermQueryWrapper(field:/a.*b/)), field:c)", ssquery.toQuery().toString());
+        assertEquals(
+                "spanSegment(spanSegment(field:a, SpanMultiTermQueryWrapper(field:/a.*b/)), field:c)",
+                ssquery.toQuery().toString());
 
-	ssquery.with("d").with("e");
+        ssquery.with("d").with("e");
 
-	assertEquals("spanSegment(spanSegment(spanSegment(spanSegment(field:a, SpanMultiTermQueryWrapper(field:/a.*b/)), field:c), field:d), field:e)", ssquery.toQuery().toString());
+        assertEquals(
+                "spanSegment(spanSegment(spanSegment(spanSegment(field:a, SpanMultiTermQueryWrapper(field:/a.*b/)), field:c), field:d), field:e)",
+                ssquery.toQuery().toString());
 
-	ssquery.without(new SpanRegexQueryWrapper("field", "x.?y"));
+        ssquery.without(new SpanRegexQueryWrapper("field", "x.?y"));
 
-	assertEquals("spanNot(spanSegment(spanSegment(spanSegment(spanSegment(field:a, SpanMultiTermQueryWrapper(field:/a.*b/)), field:c), field:d), field:e), SpanMultiTermQueryWrapper(field:/x.?y/), 0, 0)", ssquery.toQuery().toString());
+        assertEquals(
+                "spanNot(spanSegment(spanSegment(spanSegment(spanSegment(field:a, SpanMultiTermQueryWrapper(field:/a.*b/)), field:c), field:d), field:e), SpanMultiTermQueryWrapper(field:/x.?y/), 0, 0)",
+                ssquery.toQuery().toString());
 
-	ssquery.without(new SpanRegexQueryWrapper("field", "z{5,9}"));
+        ssquery.without(new SpanRegexQueryWrapper("field", "z{5,9}"));
 
-	assertEquals("spanNot(spanSegment(spanSegment(spanSegment(spanSegment(field:a, SpanMultiTermQueryWrapper(field:/a.*b/)), field:c), field:d), field:e), spanOr([SpanMultiTermQueryWrapper(field:/x.?y/), SpanMultiTermQueryWrapper(field:/z{5,9}/)]), 0, 0)", ssquery.toQuery().toString());
+        assertEquals(
+                "spanNot(spanSegment(spanSegment(spanSegment(spanSegment(field:a, SpanMultiTermQueryWrapper(field:/a.*b/)), field:c), field:d), field:e), spanOr([SpanMultiTermQueryWrapper(field:/x.?y/), SpanMultiTermQueryWrapper(field:/z{5,9}/)]), 0, 0)",
+                ssquery.toQuery().toString());
 
     };
 
+
     @Test
     public void spanSegmentAlterQuery () throws QueryException {
-	SpanSegmentQueryWrapper ssquery = new SpanSegmentQueryWrapper("field");
-	assertNull(ssquery.toQuery());
+        SpanSegmentQueryWrapper ssquery = new SpanSegmentQueryWrapper("field");
+        assertNull(ssquery.toQuery());
 
-	ssquery.with("a");
-	assertEquals("field:a", ssquery.toQuery().toString());
-	ssquery.with(new SpanAlterQueryWrapper("field", "c", "d"));
-	ssquery.with(new SpanRegexQueryWrapper("field", "a.*b"));
+        ssquery.with("a");
+        assertEquals("field:a", ssquery.toQuery().toString());
+        ssquery.with(new SpanAlterQueryWrapper("field", "c", "d"));
+        ssquery.with(new SpanRegexQueryWrapper("field", "a.*b"));
 
-	assertEquals("spanSegment(spanSegment(field:a, spanOr([field:c, field:d])), SpanMultiTermQueryWrapper(field:/a.*b/))", ssquery.toQuery().toString());
+        assertEquals(
+                "spanSegment(spanSegment(field:a, spanOr([field:c, field:d])), SpanMultiTermQueryWrapper(field:/a.*b/))",
+                ssquery.toQuery().toString());
     };
 
 
     @Test
     public void spanSegmentCloneQuery () throws QueryException {
-	SpanSegmentQueryWrapper ssquery = new SpanSegmentQueryWrapper("field", "a", "b");
-	assertEquals("spanSegment(field:a, field:b)", ssquery.toQuery().toString());
+        SpanSegmentQueryWrapper ssquery = new SpanSegmentQueryWrapper("field",
+                "a", "b");
+        assertEquals("spanSegment(field:a, field:b)", ssquery.toQuery()
+                .toString());
 
-	SpanSegmentQueryWrapper ssquery2 = new SpanSegmentQueryWrapper("field", ssquery);
-	assertEquals(ssquery.toQuery().toString(), ssquery2.toQuery().toString());
+        SpanSegmentQueryWrapper ssquery2 = new SpanSegmentQueryWrapper("field",
+                ssquery);
+        assertEquals(ssquery.toQuery().toString(), ssquery2.toQuery()
+                .toString());
 
-	SpanSegmentQueryWrapper ssquery3 = ssquery2.clone();
-	assertEquals(ssquery.toQuery().toString(), ssquery3.toQuery().toString());
-	assertEquals(ssquery2.toQuery().toString(), ssquery3.toQuery().toString());
+        SpanSegmentQueryWrapper ssquery3 = ssquery2.clone();
+        assertEquals(ssquery.toQuery().toString(), ssquery3.toQuery()
+                .toString());
+        assertEquals(ssquery2.toQuery().toString(), ssquery3.toQuery()
+                .toString());
     };
 };
diff --git a/src/test/java/de/ids_mannheim/korap/query/TestSpanSegmentSequenceQuery.java b/src/test/java/de/ids_mannheim/korap/query/TestSpanSegmentSequenceQuery.java
index d93d402..94b3437 100644
--- a/src/test/java/de/ids_mannheim/korap/query/TestSpanSegmentSequenceQuery.java
+++ b/src/test/java/de/ids_mannheim/korap/query/TestSpanSegmentSequenceQuery.java
@@ -19,66 +19,88 @@
 
     @Test
     public void spanSegmentSequenceQuery () throws QueryException {
-	SpanSequenceQueryWrapper sssq = new SpanSequenceQueryWrapper("field");
+        SpanSequenceQueryWrapper sssq = new SpanSequenceQueryWrapper("field");
 
-	assertNull(sssq.toQuery());
- 
-	sssq.append("a").append("b");
+        assertNull(sssq.toQuery());
 
-	assertEquals("spanNext(field:a, field:b)", sssq.toQuery().toString());
+        sssq.append("a").append("b");
 
-	sssq.append("c");
+        assertEquals("spanNext(field:a, field:b)", sssq.toQuery().toString());
 
-	assertEquals("spanNext(spanNext(field:a, field:b), field:c)", sssq.toQuery().toString());
+        sssq.append("c");
+
+        assertEquals("spanNext(spanNext(field:a, field:b), field:c)", sssq
+                .toQuery().toString());
     };
 
+
     @Test
     public void spanSegmentSequenceQuery2 () throws QueryException {
-	SpanSegmentQueryWrapper ssq = new SpanSegmentQueryWrapper("field", "-c", "-d", "-e");
-	SpanSequenceQueryWrapper sssq = new SpanSequenceQueryWrapper("field", "a", "b");
+        SpanSegmentQueryWrapper ssq = new SpanSegmentQueryWrapper("field",
+                "-c", "-d", "-e");
+        SpanSequenceQueryWrapper sssq = new SpanSequenceQueryWrapper("field",
+                "a", "b");
 
-	sssq.append(ssq);
+        sssq.append(ssq);
 
-	assertEquals("spanNext(spanNext(field:a, field:b), spanSegment(spanSegment(field:-c, field:-d), field:-e))", sssq.toQuery().toString());
+        assertEquals(
+                "spanNext(spanNext(field:a, field:b), spanSegment(spanSegment(field:-c, field:-d), field:-e))",
+                sssq.toQuery().toString());
 
     };
 
+
     @Test
     public void spanSegmentSequenceQuery3 () throws QueryException {
-	SpanSequenceQueryWrapper sssq = new SpanSequenceQueryWrapper("field", "a", "b");
-	SpanRegexQueryWrapper ssreq = new SpanRegexQueryWrapper("field", "c.?d");
+        SpanSequenceQueryWrapper sssq = new SpanSequenceQueryWrapper("field",
+                "a", "b");
+        SpanRegexQueryWrapper ssreq = new SpanRegexQueryWrapper("field", "c.?d");
 
-	sssq.append(ssreq);
+        sssq.append(ssreq);
 
-	assertEquals("spanNext(spanNext(field:a, field:b), SpanMultiTermQueryWrapper(field:/c.?d/))", sssq.toQuery().toString());
+        assertEquals(
+                "spanNext(spanNext(field:a, field:b), SpanMultiTermQueryWrapper(field:/c.?d/))",
+                sssq.toQuery().toString());
     };
 
+
     @Test
     public void spanSegmentSequenceQueryPrepend () throws QueryException {
-	SpanSequenceQueryWrapper sssq = new SpanSequenceQueryWrapper("field", "b", "c");
+        SpanSequenceQueryWrapper sssq = new SpanSequenceQueryWrapper("field",
+                "b", "c");
 
-	sssq.prepend("a");
+        sssq.prepend("a");
 
-	assertEquals("spanNext(spanNext(field:a, field:b), field:c)", sssq.toQuery().toString());
+        assertEquals("spanNext(spanNext(field:a, field:b), field:c)", sssq
+                .toQuery().toString());
     };
 
+
     @Test
     public void spanSegmentSequenceQueryPrepend2 () throws QueryException {
-	SpanSequenceQueryWrapper sssq = new SpanSequenceQueryWrapper("field", "d", "e");
-	SpanSegmentQueryWrapper ssq = new SpanSegmentQueryWrapper("field", "-a", "-b", "-c");
+        SpanSequenceQueryWrapper sssq = new SpanSequenceQueryWrapper("field",
+                "d", "e");
+        SpanSegmentQueryWrapper ssq = new SpanSegmentQueryWrapper("field",
+                "-a", "-b", "-c");
 
-	sssq.prepend(ssq);
+        sssq.prepend(ssq);
 
-	assertEquals("spanNext(spanNext(spanSegment(spanSegment(field:-a, field:-b), field:-c), field:d), field:e)", sssq.toQuery().toString());
+        assertEquals(
+                "spanNext(spanNext(spanSegment(spanSegment(field:-a, field:-b), field:-c), field:d), field:e)",
+                sssq.toQuery().toString());
     };
 
+
     @Test
     public void spanSegmentSequenceQueryPrepend3 () throws QueryException {
-	SpanSequenceQueryWrapper sssq = new SpanSequenceQueryWrapper("field", "c", "d");
-	SpanRegexQueryWrapper ssreq = new SpanRegexQueryWrapper("field", "a.?b");
+        SpanSequenceQueryWrapper sssq = new SpanSequenceQueryWrapper("field",
+                "c", "d");
+        SpanRegexQueryWrapper ssreq = new SpanRegexQueryWrapper("field", "a.?b");
 
-	sssq.prepend(ssreq);
+        sssq.prepend(ssreq);
 
-	assertEquals("spanNext(spanNext(SpanMultiTermQueryWrapper(field:/a.?b/), field:c), field:d)", sssq.toQuery().toString());
+        assertEquals(
+                "spanNext(spanNext(SpanMultiTermQueryWrapper(field:/a.?b/), field:c), field:d)",
+                sssq.toQuery().toString());
     };
 };
diff --git a/src/test/java/de/ids_mannheim/korap/query/TestSpanSequenceQuery.java b/src/test/java/de/ids_mannheim/korap/query/TestSpanSequenceQuery.java
index 8772dfb..1c6deaf 100644
--- a/src/test/java/de/ids_mannheim/korap/query/TestSpanSequenceQuery.java
+++ b/src/test/java/de/ids_mannheim/korap/query/TestSpanSequenceQuery.java
@@ -32,7 +32,8 @@
         assertFalse(sssq.hasConstraints());
 
         sssq.append("c");
-        assertEquals("spanNext(spanNext(field:a, field:b), field:c)", sssq.toQuery().toString());
+        assertEquals("spanNext(spanNext(field:a, field:b), field:c)", sssq
+                .toQuery().toString());
         assertFalse(sssq.hasConstraints());
 
         sssq = new SpanSequenceQueryWrapper("field");
@@ -44,19 +45,26 @@
         assertEquals("spanNext(field:a, field:b)", sssq.toQuery().toString());
         assertFalse(sssq.hasConstraints());
 
-        sssq.withConstraint(2,3);
+        sssq.withConstraint(2, 3);
         assertTrue(sssq.hasConstraints());
 
-        assertEquals("spanDistance(field:a, field:b, [(w[2:3], ordered, notExcluded)])", sssq.toQuery().toString());
+        assertEquals(
+                "spanDistance(field:a, field:b, [(w[2:3], ordered, notExcluded)])",
+                sssq.toQuery().toString());
 
         sssq.append("c");
-        assertEquals("spanDistance(spanDistance(field:a, field:b, [(w[2:3], ordered, notExcluded)]), field:c, [(w[2:3], ordered, notExcluded)])", sssq.toQuery().toString());
-        sssq.withConstraint(6,8, "s");
+        assertEquals(
+                "spanDistance(spanDistance(field:a, field:b, [(w[2:3], ordered, notExcluded)]), field:c, [(w[2:3], ordered, notExcluded)])",
+                sssq.toQuery().toString());
+        sssq.withConstraint(6, 8, "s");
         assertTrue(sssq.hasConstraints());
 
-        assertEquals("spanMultipleDistance(spanMultipleDistance(field:a, field:b, [(w[2:3], ordered, notExcluded), (s[6:8], ordered, notExcluded)]), field:c, [(w[2:3], ordered, notExcluded), (s[6:8], ordered, notExcluded)])", sssq.toQuery().toString());
+        assertEquals(
+                "spanMultipleDistance(spanMultipleDistance(field:a, field:b, [(w[2:3], ordered, notExcluded), (s[6:8], ordered, notExcluded)]), field:c, [(w[2:3], ordered, notExcluded), (s[6:8], ordered, notExcluded)])",
+                sssq.toQuery().toString());
     };
 
+
     @Ignore
     public void spanSequenceQueryWrapper () throws QueryException {
 
@@ -65,14 +73,15 @@
         SpanClassQueryWrapper scqw;
 
         // Synopsis 1
-        ssqw =
-            new SpanSequenceQueryWrapper("tokens", "der", "Baum");
-        assertEquals("spanNext(tokens:der, tokens:Baum)", ssqw.toQuery().toString());
+        ssqw = new SpanSequenceQueryWrapper("tokens", "der", "Baum");
+        assertEquals("spanNext(tokens:der, tokens:Baum)", ssqw.toQuery()
+                .toString());
 
         // Synopsis 2
         ssqw = new SpanSequenceQueryWrapper("tokens");
         ssqw.append("der").append("Baum");
-        assertEquals("spanNext(tokens:der, tokens:Baum)", ssqw.toQuery().toString());
+        assertEquals("spanNext(tokens:der, tokens:Baum)", ssqw.toQuery()
+                .toString());
 
         // Append a sequence
         ssqw = new SpanSequenceQueryWrapper("tokens");
@@ -82,14 +91,14 @@
         ssqw.append(ssqw2);
         // This may not be final
         assertEquals(
-            "spanNext(spanNext(spanNext(tokens:der, tokens:Baum), tokens:fiel), tokens:still)",
-            ssqw.toQuery().toString()
-        );
+                "spanNext(spanNext(spanNext(tokens:der, tokens:Baum), tokens:fiel), tokens:still)",
+                ssqw.toQuery().toString());
 
         // Synopsis 3
         ssqw = new SpanSequenceQueryWrapper("tokens", "Baum");
         ssqw.prepend("der");
-        assertEquals("spanNext(tokens:der, tokens:Baum)", ssqw.toQuery().toString());
+        assertEquals("spanNext(tokens:der, tokens:Baum)", ssqw.toQuery()
+                .toString());
 
         // Prepend a sequence
         ssqw = new SpanSequenceQueryWrapper("tokens");
@@ -100,44 +109,41 @@
 
         // This may change
         assertEquals(
-            "spanNext(spanNext(spanNext(tokens:der, tokens:Baum), tokens:fiel), tokens:still)",
-            ssqw.toQuery().toString()
-        );
+                "spanNext(spanNext(spanNext(tokens:der, tokens:Baum), tokens:fiel), tokens:still)",
+                ssqw.toQuery().toString());
 
         // Add constraint
-        ssqw.withConstraint(2,4);
+        ssqw.withConstraint(2, 4);
         // This may change
-        assertEquals(
-            "spanDistance(spanDistance(spanDistance(tokens:der, "+
-            "tokens:Baum, [(w[2:4], ordered, notExcluded)]), "+
-            "tokens:fiel, [(w[2:4], ordered, notExcluded)]), "+
-            "tokens:still, [(w[2:4], ordered, notExcluded)])",
-            ssqw.toQuery().toString()
-        );
-
-        ssqw = new SpanSequenceQueryWrapper("tokens", "der", "Baum").withConstraint(1,1);
-        assertEquals("spanNext(tokens:der, tokens:Baum)", ssqw.toQuery().toString());
-
-        ssqw = new SpanSequenceQueryWrapper("tokens", "der", "Baum").withConstraint(1,2, "s");
-        assertEquals("spanElementDistance(tokens:der, tokens:Baum, [(s[1:2], ordered, notExcluded)])", ssqw.toQuery().toString());
+        assertEquals("spanDistance(spanDistance(spanDistance(tokens:der, "
+                + "tokens:Baum, [(w[2:4], ordered, notExcluded)]), "
+                + "tokens:fiel, [(w[2:4], ordered, notExcluded)]), "
+                + "tokens:still, [(w[2:4], ordered, notExcluded)])", ssqw
+                .toQuery().toString());
 
         ssqw = new SpanSequenceQueryWrapper("tokens", "der", "Baum")
-            .withConstraint(1,2, "s")
-            .withConstraint(2,3, "x");
-        assertEquals("spanMultipleDistance(tokens:der, tokens:Baum, " +
-                     "[(s[1:2], ordered, notExcluded), " +
-                     "(x[2:3], ordered, notExcluded)])",
-                     ssqw.toQuery().toString());
+                .withConstraint(1, 1);
+        assertEquals("spanNext(tokens:der, tokens:Baum)", ssqw.toQuery()
+                .toString());
 
-        ssqw = new SpanSequenceQueryWrapper("tokens")
-            .append("Baum")
-            .prepend("der")
-            .withConstraint(1,2, "s", true)
-            .withConstraint(2,3, "x");
-        assertEquals("spanMultipleDistance(tokens:der, " +
-                     "tokens:Baum, [(s[1:2], ordered, excluded), " +
-                     "(x[2:3], ordered, notExcluded)])",
-                     ssqw.toQuery().toString());
+        ssqw = new SpanSequenceQueryWrapper("tokens", "der", "Baum")
+                .withConstraint(1, 2, "s");
+        assertEquals(
+                "spanElementDistance(tokens:der, tokens:Baum, [(s[1:2], ordered, notExcluded)])",
+                ssqw.toQuery().toString());
+
+        ssqw = new SpanSequenceQueryWrapper("tokens", "der", "Baum")
+                .withConstraint(1, 2, "s").withConstraint(2, 3, "x");
+        assertEquals("spanMultipleDistance(tokens:der, tokens:Baum, "
+                + "[(s[1:2], ordered, notExcluded), "
+                + "(x[2:3], ordered, notExcluded)])", ssqw.toQuery().toString());
+
+        ssqw = new SpanSequenceQueryWrapper("tokens").append("Baum")
+                .prepend("der").withConstraint(1, 2, "s", true)
+                .withConstraint(2, 3, "x");
+        assertEquals("spanMultipleDistance(tokens:der, "
+                + "tokens:Baum, [(s[1:2], ordered, excluded), "
+                + "(x[2:3], ordered, notExcluded)])", ssqw.toQuery().toString());
 
 
         // Support empty class ins sequence 
@@ -145,10 +151,8 @@
         srqw = new SpanRepetitionQueryWrapper();
         scqw = new SpanClassQueryWrapper(srqw, (short) 3);
         ssqw.append(scqw);
-        assertEquals(
-            "spanExpansion(field:Der, []{1, 1}, right, class:3)",
-            ssqw.toQuery().toString()
-        );
+        assertEquals("spanExpansion(field:Der, []{1, 1}, right, class:3)", ssqw
+                .toQuery().toString());
 
         // Support empty class ins sequence 
         ssqw = new SpanSequenceQueryWrapper("field");
diff --git a/src/test/java/de/ids_mannheim/korap/query/TestSpanSequenceQueryJSON.java b/src/test/java/de/ids_mannheim/korap/query/TestSpanSequenceQueryJSON.java
index 8545881..d95ccfc 100644
--- a/src/test/java/de/ids_mannheim/korap/query/TestSpanSequenceQueryJSON.java
+++ b/src/test/java/de/ids_mannheim/korap/query/TestSpanSequenceQueryJSON.java
@@ -22,6 +22,7 @@
 
     static String path = "/queries/sequence/";
 
+
     // Test Extensions
 
     @Test
@@ -32,47 +33,60 @@
         assertTrue(sqwi.isEmpty());
     };
 
+
     @Test
     public void queryJSONseqEmptyEnd () throws QueryException {
         SpanQueryWrapper sqwi = jsonQueryFile("empty-last.jsonld");
-        assertEquals(sqwi.toQuery().toString(), "spanExpansion(tokens:s:der, []{1, 1}, right)");
+        assertEquals(sqwi.toQuery().toString(),
+                "spanExpansion(tokens:s:der, []{1, 1}, right)");
     };
 
+
     @Test
     public void queryJSONseqEmptyEndClass () throws QueryException {
         SpanQueryWrapper sqwi = jsonQueryFile("empty-last-class.jsonld");
         // der{3:[]}
-        assertEquals(sqwi.toQuery().toString(), "spanExpansion(tokens:s:der, []{1, 1}, right, class:3)");
+        assertEquals(sqwi.toQuery().toString(),
+                "spanExpansion(tokens:s:der, []{1, 1}, right, class:3)");
     };
 
+
     @Test
     public void queryJSONseqEmptyEndRepetition () throws QueryException {
         SpanQueryWrapper sqwi = jsonQueryFile("empty-last-repetition.jsonld");
         // der[]{3,5}
-        assertEquals(sqwi.toQuery().toString(), "spanExpansion(tokens:s:der, []{3, 5}, right)");
+        assertEquals(sqwi.toQuery().toString(),
+                "spanExpansion(tokens:s:der, []{3, 5}, right)");
     };
 
+
     @Test
     public void queryJSONseqEmptyStart () throws QueryException {
         SpanQueryWrapper sqwi = jsonQueryFile("empty-first.jsonld");
         // [][tt/p=NN]
-        assertEquals(sqwi.toQuery().toString(), "spanExpansion(tokens:tt/p:NN, []{1, 1}, left)");
+        assertEquals(sqwi.toQuery().toString(),
+                "spanExpansion(tokens:tt/p:NN, []{1, 1}, left)");
     };
 
+
     @Test
     public void queryJSONseqEmptyStartClass () throws QueryException {
         SpanQueryWrapper sqwi = jsonQueryFile("empty-first-class.jsonld");
         // {2:[]}[tt/p=NN]
-        assertEquals(sqwi.toQuery().toString(), "spanExpansion(tokens:tt/p:NN, []{1, 1}, left, class:2)");
+        assertEquals(sqwi.toQuery().toString(),
+                "spanExpansion(tokens:tt/p:NN, []{1, 1}, left, class:2)");
     };
 
+
     @Test
     public void queryJSONseqEmptyStartRepetition () throws QueryException {
         SpanQueryWrapper sqwi = jsonQueryFile("empty-first-repetition.jsonld");
         // []{2,7}[tt/p=NN]
-        assertEquals(sqwi.toQuery().toString(), "spanExpansion(tokens:tt/p:NN, []{2, 7}, left)");
+        assertEquals(sqwi.toQuery().toString(),
+                "spanExpansion(tokens:tt/p:NN, []{2, 7}, left)");
     };
 
+
     @Test
     public void queryJSONseqEmptyStartRepetition2 () throws QueryException {
         SpanQueryWrapper sqwi = jsonQueryFile("empty-first-repetition-2.jsonld");
@@ -80,71 +94,95 @@
         assertEquals(sqwi.toQuery().toString(), "tokens:tt/p:NN");
     };
 
+
     @Test
     public void queryJSONseqEmptyMiddle () throws QueryException {
         SpanQueryWrapper sqwi = jsonQueryFile("empty-middle.jsonld");
         // der[][tt/p=NN]
-        assertEquals(sqwi.toQuery().toString(), "spanNext(tokens:s:der, spanExpansion(tokens:tt/p:NN, []{1, 1}, left))");
+        assertEquals(sqwi.toQuery().toString(),
+                "spanNext(tokens:s:der, spanExpansion(tokens:tt/p:NN, []{1, 1}, left))");
     };
 
+
     @Test
     public void queryJSONseqEmptyMiddleClass () throws QueryException {
         SpanQueryWrapper sqwi = jsonQueryFile("empty-middle-class.jsonld");
         // der{1:[]}[tt/p=NN]
-        assertEquals(sqwi.toQuery().toString(), "spanNext(tokens:s:der, spanExpansion(tokens:tt/p:NN, []{1, 1}, left, class:1))");
+        assertEquals(
+                sqwi.toQuery().toString(),
+                "spanNext(tokens:s:der, spanExpansion(tokens:tt/p:NN, []{1, 1}, left, class:1))");
     };
 
+
     @Test
     public void queryJSONseqEmptyMiddleRepetition () throws QueryException {
         SpanQueryWrapper sqwi = jsonQueryFile("empty-middle-repetition.jsonld");
         // der[]{4,8}[tt/p=NN]
-        assertEquals(sqwi.toQuery().toString(), "spanNext(tokens:s:der, spanExpansion(tokens:tt/p:NN, []{4, 8}, left))");
+        assertEquals(sqwi.toQuery().toString(),
+                "spanNext(tokens:s:der, spanExpansion(tokens:tt/p:NN, []{4, 8}, left))");
     };
 
+
     @Test
     public void queryJSONseqEmptySurround () throws QueryException {
         SpanQueryWrapper sqwi = jsonQueryFile("empty-surround.jsonld");
         // [][tt/p=NN][]
-        assertEquals(sqwi.toQuery().toString(), "spanExpansion(spanExpansion(tokens:tt/p:NN, []{1, 1}, left), []{1, 1}, right)");
+        assertEquals(sqwi.toQuery().toString(),
+                "spanExpansion(spanExpansion(tokens:tt/p:NN, []{1, 1}, left), []{1, 1}, right)");
     };
 
+
     @Test
     public void queryJSONseqEmptySurroundClass () throws QueryException {
         SpanQueryWrapper sqwi = jsonQueryFile("empty-surround-class.jsonld");
         // [][tt/p=NN]{2:[]}
-        assertEquals(sqwi.toQuery().toString(), "spanExpansion(spanExpansion(tokens:tt/p:NN, []{1, 1}, left), []{1, 1}, right, class:2)");
+        assertEquals(
+                sqwi.toQuery().toString(),
+                "spanExpansion(spanExpansion(tokens:tt/p:NN, []{1, 1}, left), []{1, 1}, right, class:2)");
     };
 
+
     @Test
     public void queryJSONseqEmptySurroundClass2 () throws QueryException {
         SpanQueryWrapper sqwi = jsonQueryFile("empty-surround-class-2.jsonld");
         // {3:[]}[tt/p=NN]{2:[]}
-        assertEquals(sqwi.toQuery().toString(), "spanExpansion(spanExpansion(tokens:tt/p:NN, []{1, 1}, left, class:3), []{1, 1}, right, class:2)");
+        assertEquals(
+                sqwi.toQuery().toString(),
+                "spanExpansion(spanExpansion(tokens:tt/p:NN, []{1, 1}, left, class:3), []{1, 1}, right, class:2)");
     };
 
+
     @Test
     public void queryJSONseqEmptySurroundRepetition () throws QueryException {
         SpanQueryWrapper sqwi = jsonQueryFile("empty-surround-repetition.jsonld");
         // [][tt/p=NN][]{2,7}
-        assertEquals(sqwi.toQuery().toString(), "spanExpansion(spanExpansion(tokens:tt/p:NN, []{1, 1}, left), []{2, 7}, right)");
+        assertEquals(sqwi.toQuery().toString(),
+                "spanExpansion(spanExpansion(tokens:tt/p:NN, []{1, 1}, left), []{2, 7}, right)");
     };
 
+
     @Test
     public void queryJSONseqEmptySurroundRepetition2 () throws QueryException {
         SpanQueryWrapper sqwi = jsonQueryFile("empty-surround-repetition-2.jsonld");
         // []{3,5}[tt/p=NN][]{2,7}
-        assertEquals(sqwi.toQuery().toString(), "spanExpansion(spanExpansion(tokens:tt/p:NN, []{3, 5}, left), []{2, 7}, right)");
+        assertEquals(sqwi.toQuery().toString(),
+                "spanExpansion(spanExpansion(tokens:tt/p:NN, []{3, 5}, left), []{2, 7}, right)");
     };
 
+
     @Test
-    public void queryJSONseqEmptySurroundRepetitionClass () throws QueryException {
+    public void queryJSONseqEmptySurroundRepetitionClass ()
+            throws QueryException {
         SpanQueryWrapper sqwi = jsonQueryFile("empty-surround-repetition-class.jsonld");
         // {1:[]}{3,8}[tt/p=NN]{2:[]{2,7}}
         // Ist gleichbedeutend mit
         // {1:[]{3,8}}[tt/p=NN]{2:[]}{2,7}
-        assertEquals(sqwi.toQuery().toString(), "spanExpansion(spanExpansion(tokens:tt/p:NN, []{3, 8}, left, class:1), []{2, 7}, right, class:2)");
+        assertEquals(
+                sqwi.toQuery().toString(),
+                "spanExpansion(spanExpansion(tokens:tt/p:NN, []{3, 8}, left, class:1), []{2, 7}, right, class:2)");
     };
 
+
     @Test
     public void queryJSONseqNegative () throws QueryException {
         SpanQueryWrapper sqwi = jsonQueryFile("negative.jsonld");
@@ -152,34 +190,43 @@
         assertTrue(sqwi.isNegative());
     };
 
+
     @Test
     public void queryJSONseqNegativeStart () throws QueryException {
         SpanQueryWrapper sqwi = jsonQueryFile("negative-first.jsonld");
         // [tt/p!=NN][tt/p=NN]
-        assertEquals(sqwi.toQuery().toString(), "spanExpansion(tokens:tt/p:NN, !tokens:tt/p:NN{1, 1}, left)");
+        assertEquals(sqwi.toQuery().toString(),
+                "spanExpansion(tokens:tt/p:NN, !tokens:tt/p:NN{1, 1}, left)");
     };
 
+
     @Test
     public void queryJSONseqNegativeEnd () throws QueryException {
         SpanQueryWrapper sqwi = jsonQueryFile("negative-last.jsonld");
         // [tt/p=NN][tt/p!=NN]
-        assertEquals(sqwi.toQuery().toString(), "spanExpansion(tokens:tt/p:NN, !tokens:tt/p:NN{1, 1}, right)");
+        assertEquals(sqwi.toQuery().toString(),
+                "spanExpansion(tokens:tt/p:NN, !tokens:tt/p:NN{1, 1}, right)");
     };
 
+
     @Test
     public void queryJSONseqNegativeStartRepetition () throws QueryException {
         SpanQueryWrapper sqwi = jsonQueryFile("negative-first-repetition.jsonld");
         // [tt/p!=NN]{4,5}[tt/p=NN]
-        assertEquals(sqwi.toQuery().toString(), "spanExpansion(tokens:tt/p:NN, !tokens:tt/p:NN{4, 5}, left)");
+        assertEquals(sqwi.toQuery().toString(),
+                "spanExpansion(tokens:tt/p:NN, !tokens:tt/p:NN{4, 5}, left)");
     };
 
+
     @Test
     public void queryJSONseqNegativeStartRepetition2 () throws QueryException {
         SpanQueryWrapper sqwi = jsonQueryFile("negative-first-repetition-2.jsonld");
         // [tt/p!=NN]{0,5}[tt/p=NN]
-        assertEquals(sqwi.toQuery().toString(), "spanExpansion(tokens:tt/p:NN, !tokens:tt/p:NN{0, 5}, left)");
+        assertEquals(sqwi.toQuery().toString(),
+                "spanExpansion(tokens:tt/p:NN, !tokens:tt/p:NN{0, 5}, left)");
     };
 
+
     @Test
     public void queryJSONseqNegativeStartRepetition3 () throws QueryException {
         SpanQueryWrapper sqwi = jsonQueryFile("negative-first-repetition-3.jsonld");
@@ -187,28 +234,36 @@
         assertEquals(sqwi.toQuery().toString(), "tokens:tt/p:NN");
     };
 
+
     @Test
     public void queryJSONseqNegativeEndClass () throws QueryException {
         SpanQueryWrapper sqwi = jsonQueryFile("negative-last-class.jsonld");
         // [tt/p=NN]{2:[tt/p!=NN]}
         SpanQuery sq = sqwi.toQuery();
-        assertEquals(sq.toString(), "spanExpansion(tokens:tt/p:NN, !tokens:tt/p:NN{1, 1}, right, class:2)");
+        assertEquals(sq.toString(),
+                "spanExpansion(tokens:tt/p:NN, !tokens:tt/p:NN{1, 1}, right, class:2)");
     };
 
+
     @Test
     public void queryJSONseqNegativeEndRepetitionClass () throws QueryException {
         SpanQueryWrapper sqwi = jsonQueryFile("negative-last-class-repetition.jsonld");
         // [tt/p=NN]{2:[tt/p!=NN]{4,5}}
-        assertEquals(sqwi.toQuery().toString(), "spanExpansion(tokens:tt/p:NN, !tokens:tt/p:NN{4, 5}, right, class:2)");
+        assertEquals(sqwi.toQuery().toString(),
+                "spanExpansion(tokens:tt/p:NN, !tokens:tt/p:NN{4, 5}, right, class:2)");
     };
 
+
     @Test
-    public void queryJSONseqNegativeEndRepetitionClass2 () throws QueryException {
+    public void queryJSONseqNegativeEndRepetitionClass2 ()
+            throws QueryException {
         SpanQueryWrapper sqwi = jsonQueryFile("negative-last-class-repetition-2.jsonld");
         // [tt/p=NN]{2:[tt/p!=NN]}{4,5}
-        assertEquals(sqwi.toQuery().toString(), "spanExpansion(tokens:tt/p:NN, !tokens:tt/p:NN{4, 5}, right, class:2)");
+        assertEquals(sqwi.toQuery().toString(),
+                "spanExpansion(tokens:tt/p:NN, !tokens:tt/p:NN{4, 5}, right, class:2)");
     };
 
+
     @Test
     public void queryJSONseqNegativelastConstraint () {
         SpanQueryWrapper sqwi = jsonQueryFile("negative-last-constraint.jsonld");
@@ -217,15 +272,20 @@
             fail("Should throw an exception");
         }
         catch (QueryException qe) {
-            assertEquals("Distance constraints not supported with empty or negative operands", qe.getMessage());
+            assertEquals(
+                    "Distance constraints not supported with empty or negative operands",
+                    qe.getMessage());
         };
     };
 
+
     @Test
     public void queryJSONseqNegativeEndSequence () throws QueryException {
         SpanQueryWrapper sqwi = jsonQueryFile("negative-last-sequence.jsonld");
         // [tt/p=NN]([tt/p!=DET][tt/p!=NN])
-        assertEquals("spanExpansion(spanExpansion(tokens:tt/p:NN, !tokens:tt/p:DET{1, 1}, right), !tokens:tt/p:ADJ{1, 1}, right)", sqwi.toQuery().toString());
+        assertEquals(
+                "spanExpansion(spanExpansion(tokens:tt/p:NN, !tokens:tt/p:DET{1, 1}, right), !tokens:tt/p:ADJ{1, 1}, right)",
+                sqwi.toQuery().toString());
     };
 
 
@@ -235,15 +295,20 @@
         // [tt/p!=NN]([tt/p!=DET][tt/p=NN])
 
         // spanNext(tokens:tt/p:NN, 
-        assertEquals("spanExpansion(spanExpansion(tokens:tt/p:ADJ, !tokens:tt/p:DET{1, 1}, left), !tokens:tt/p:NN{1, 1}, left)", sqwi.toQuery().toString());
+        assertEquals(
+                "spanExpansion(spanExpansion(tokens:tt/p:ADJ, !tokens:tt/p:DET{1, 1}, left), !tokens:tt/p:NN{1, 1}, left)",
+                sqwi.toQuery().toString());
     };
 
+
     @Test
     public void queryJSONseqMultipleDistances () throws QueryException {
         SpanQueryWrapper sqwi = jsonQueryFile("multiple-distances.jsonld");
         // er []{,10} kann []{1,10} sagte 
 
-        assertEquals("spanDistance(tokens:s:er, spanDistance(tokens:s:kann, tokens:s:sagte, [(w[2:11], ordered, notExcluded)]), [(w[1:11], ordered, notExcluded)])", sqwi.toQuery().toString());
+        assertEquals(
+                "spanDistance(tokens:s:er, spanDistance(tokens:s:kann, tokens:s:sagte, [(w[2:11], ordered, notExcluded)]), [(w[1:11], ordered, notExcluded)])",
+                sqwi.toQuery().toString());
     };
 
 
diff --git a/src/test/java/de/ids_mannheim/korap/query/TestSpanSubspanQueryJSON.java b/src/test/java/de/ids_mannheim/korap/query/TestSpanSubspanQueryJSON.java
index 5c5ea26..df85409 100644
--- a/src/test/java/de/ids_mannheim/korap/query/TestSpanSubspanQueryJSON.java
+++ b/src/test/java/de/ids_mannheim/korap/query/TestSpanSubspanQueryJSON.java
@@ -13,223 +13,239 @@
  * @author margaretha, diewald
  */
 public class TestSpanSubspanQueryJSON {
-	
-	@Test
-	public void testTermQuery() throws QueryException {
-		// subspan(tokens:tt/l:Haus, 0, 1)
-		String filepath = getClass().getResource(
-				"/queries/submatch/termquery.jsonld").getFile();
-		SpanQueryWrapper sqwi = getJSONQuery(filepath);
-		SpanQuery sq = sqwi.toQuery();
-		assertEquals("tokens:tt/l:Haus", sq.toString());
-	}
 
-	@Test
-	public void testTermStartOffset() throws QueryException {
-		// subspan(tokens:tt/l:Haus, -1, 0)
-		String filepath = getClass().getResource(
-				"/queries/submatch/term-start-offset.jsonld").getFile();
-		SpanQueryWrapper sqwi = getJSONQuery(filepath);
-		SpanQuery sq = sqwi.toQuery();
-		assertEquals("tokens:tt/l:Haus", sq.toString());
-	}
-
-	@Test
-	public void testTermNull() throws QueryException {
-		// subspan(tokens:tt/l:Haus, 1, 1)
-		String filepath = getClass().getResource(
-				"/queries/submatch/term-null.jsonld").getFile();
-		SpanQueryWrapper sqwi = getJSONQuery(filepath);
-		SpanQuery sq = sqwi.toQuery();
-		assertEquals(null, sq);
-	}
-
-	@Test
-	public void testElementQuery() throws QueryException {
-		// submatch(1,4:<s>)
-		String filepath = getClass().getResource(
-				"/queries/submatch/simpleElement.jsonld").getFile();
-		SpanQueryWrapper sqwi = getJSONQuery(filepath);
-		SpanQuery sq = sqwi.toQuery();
-		assertEquals(
-				"subspan(spanContain(<tokens:s />, tokens:tt/l:Haus), 1, 4)",
-				sq.toString());
-	}
-
-	@Test
-	public void testNoLength() throws QueryException {
-		// submatch(1,:<s>)
-		String filepath = getClass().getResource(
-				"/queries/submatch/noLength.jsonld").getFile();
-		SpanQueryWrapper sqwi = getJSONQuery(filepath);
-		SpanQuery sq = sqwi.toQuery();
-		assertEquals("subspan(<tokens:s />, 1, 0)", sq.toString());
-	}
-	
-	@Test
-	public void testMinusStartOffset() throws QueryException {
-		// submatch(-1,4:<s>)
-		String filepath = getClass().getResource("/queries/submatch/minusStart.jsonld")
-				.getFile();
-		SpanQueryWrapper sqwi = getJSONQuery(filepath);
-		SpanQuery sq = sqwi.toQuery();
-		assertEquals("subspan(<tokens:s />, -1, 4)", sq.toString());
-	}
-
-	@Test
-	public void testEmptyMinusStartOffset() throws QueryException {
-		// no optimization
-		// submatch(-1,4:der []{1,8})
-		String filepath = getClass().getResource(
-				"/queries/submatch/empty-minusStart.jsonld").getFile();
-		SpanQueryWrapper sqwi = getJSONQuery(filepath);
-		SpanQuery sq = sqwi.toQuery();
-		assertEquals(
-				"subspan(spanExpansion(tokens:s:der, []{1, 8}, right), -1, 4)",
-				sq.toString());
-	}
-
-	@Test
-	public void testEmptyMax() throws QueryException {
-		// no optimization
-		// submatch(1,2:der []{1,8})
-		String filepath = getClass().getResource(
-				"/queries/submatch/empty-max.jsonld").getFile();
-		SpanQueryWrapper sqwi = getJSONQuery(filepath);
-		SpanQuery sq = sqwi.toQuery();
-		assertEquals(
-				"subspan(spanExpansion(tokens:s:der, []{1, 8}, right), 1, 2)",
-				sq.toString());
-	}
-
-	@Test
-	public void testCaseEmptyWrapped() throws QueryException {
-		String filepath = getClass().getResource(
-				"/queries/submatch/wrapped.jsonld").getFile();
-		SpanQueryWrapper sqwi = getJSONQuery(filepath);
-		SpanQuery sq = sqwi.toQuery();
-		assertEquals(
-				"focus(129: spanElementDistance({129: tokens:s:der}, {129: subspan"
-						+ "(<tokens:s />, 0, 1)}, [(s[0:0], ordered, notExcluded)]))",
-				sq.toString());
-	}
-
-	@Test
-	public void testCaseEmptyEmbedded() throws QueryException {
-		// die subspan(der []{1,}, 2,3)
-		String filepath = getClass().getResource(
-				"/queries/submatch/embedded.jsonld").getFile();
-		SpanQueryWrapper sqwi = getJSONQuery(filepath);
-		SpanQuery sq = sqwi.toQuery();
-		assertEquals("spanNext({1: tokens:s:die}, {1: subspan(spanExpansion("
-				+ "tokens:s:der, []{1, 100}, right), 2, 3)})", sq.toString());
-	}
-
-	@Test
-	public void testCaseEmptyEmbeddedNull() throws QueryException {
-		// die subspan([],5,6)
-		// start offset is bigger than the original span
-		String filepath = getClass().getResource(
-				"/queries/submatch/embedded-null.jsonld").getFile();
-		SpanQueryWrapper sqwi = getJSONQuery(filepath);
-		SpanQuery sq = sqwi.toQuery();
-		assertEquals("tokens:s:die", sq.toString());
-	}
-
-	@Test
-	public void testCaseEmptyEmbeddedValid() throws QueryException {
-		// die subspan([]{0,5},2)
-		String filepath = getClass().getResource(
-				"/queries/submatch/embedded-valid-empty.jsonld").getFile();
-		SpanQueryWrapper sqwi = getJSONQuery(filepath);
-		SpanQuery sq = sqwi.toQuery();
-		assertEquals("spanExpansion(tokens:s:die, []{2, 5}, right)",
-				sq.toString());
-	}
-
-	@Test
-	public void testNegativeToken() throws QueryException {
-		// submatch(0,1:[base != Baum])
-		String filepath = getClass().getResource(
-				"/queries/submatch/negative-token.jsonld").getFile();
-		SpanQueryWrapper sqwi = getJSONQuery(filepath);
-		SpanQuery sq = sqwi.toQuery();
-		assertEquals("tokens:l:Baum", sq.toString());
-	}
-
-	@Test
-	public void testNegativeSequence() throws QueryException {
-		// das submatch(0,1:[base != Baum])
-		String filepath = getClass().getResource(
-				"/queries/submatch/negative-seq.jsonld").getFile();
-		SpanQueryWrapper sqwi = getJSONQuery(filepath);
-		SpanQuery sq = sqwi.toQuery();
-		assertEquals(
-				"spanExpansion(tokens:s:das, !tokens:l:Baum{1, 1}, right)",
-				sq.toString());
-	}
-
-	@Test
-	public void testNegativeSequenceWithClass() throws QueryException {
-		// das {1:submatch(0,1:[base != Baum])}
-		String filepath = getClass().getResource(
-				"/queries/submatch/negative-sequence-class.jsonld").getFile();
-		SpanQueryWrapper sqwi = getJSONQuery(filepath);
-		SpanQuery sq = sqwi.toQuery();
-		assertEquals(
-				"spanExpansion(tokens:s:das, !tokens:l:Baum{1, 1}, right, class:1)",
-				sq.toString());
-	}
-
-	@Test
-	public void testNegativeEmbeddedSequence() throws QueryException {
-		// submatch(1,1:das [base != Baum])
-		String filepath = getClass().getResource(
-				"/queries/submatch/embedded-negative-seq.jsonld").getFile();
-		SpanQueryWrapper sqwi = getJSONQuery(filepath);
-		SpanQuery sq = sqwi.toQuery();
-		assertEquals(
-				"subspan(spanExpansion(tokens:s:das, !tokens:l:Baum{1, 1}, right), 1, 1)",
-				sq.toString());
-	}
-
-	@Test
-	public void testNegativeEmbeddedSequenceWithClass() throws QueryException {
-		// submatch(0,1:{1:[base != Baum] dass})
-		String filepath = getClass().getResource(
-				"/queries/submatch/embedded-negative-class-seq.jsonld")
-				.getFile();
-		SpanQueryWrapper sqwi = getJSONQuery(filepath);
-		SpanQuery sq = sqwi.toQuery();
-		assertEquals(
-				"subspan({1: spanExpansion(tokens:s:dass, !tokens:l:Baum{1, 1}, left)}, 0, 1)",
-				sq.toString());
-	}
+    @Test
+    public void testTermQuery () throws QueryException {
+        // subspan(tokens:tt/l:Haus, 0, 1)
+        String filepath = getClass().getResource(
+                "/queries/submatch/termquery.jsonld").getFile();
+        SpanQueryWrapper sqwi = getJSONQuery(filepath);
+        SpanQuery sq = sqwi.toQuery();
+        assertEquals("tokens:tt/l:Haus", sq.toString());
+    }
 
 
-	@Test
-	public void testEmbeddedNegativeRepetition() throws QueryException {
-		// submatch(1,1:das [base != Baum]{1,3})
-		String filepath = getClass().getResource(
-				"/queries/submatch/embedded-negative-repetition.jsonld")
-				.getFile();
-		SpanQueryWrapper sqwi = getJSONQuery(filepath);
-		SpanQuery sq = sqwi.toQuery();
-		assertEquals(
-				"subspan(spanExpansion(tokens:s:das, !tokens:l:Baum{1, 3}, right), 1, 1)",
-				sq.toString());
-	}
+    @Test
+    public void testTermStartOffset () throws QueryException {
+        // subspan(tokens:tt/l:Haus, -1, 0)
+        String filepath = getClass().getResource(
+                "/queries/submatch/term-start-offset.jsonld").getFile();
+        SpanQueryWrapper sqwi = getJSONQuery(filepath);
+        SpanQuery sq = sqwi.toQuery();
+        assertEquals("tokens:tt/l:Haus", sq.toString());
+    }
 
-	@Test
-	public void testNegativeRepetition() throws QueryException {
-		// das submatch(1,4:[base != Baum]{1,3})
-		String filepath = getClass().getResource(
-				"/queries/submatch/negative-repetition.jsonld")
-				.getFile();
-		SpanQueryWrapper sqwi = getJSONQuery(filepath);
-		SpanQuery sq = sqwi.toQuery();
-		assertEquals(
-				"spanExpansion(tokens:s:das, !tokens:l:Baum{2, 2}, right)",
-				sq.toString());
-	}
+
+    @Test
+    public void testTermNull () throws QueryException {
+        // subspan(tokens:tt/l:Haus, 1, 1)
+        String filepath = getClass().getResource(
+                "/queries/submatch/term-null.jsonld").getFile();
+        SpanQueryWrapper sqwi = getJSONQuery(filepath);
+        SpanQuery sq = sqwi.toQuery();
+        assertEquals(null, sq);
+    }
+
+
+    @Test
+    public void testElementQuery () throws QueryException {
+        // submatch(1,4:<s>)
+        String filepath = getClass().getResource(
+                "/queries/submatch/simpleElement.jsonld").getFile();
+        SpanQueryWrapper sqwi = getJSONQuery(filepath);
+        SpanQuery sq = sqwi.toQuery();
+        assertEquals(
+                "subspan(spanContain(<tokens:s />, tokens:tt/l:Haus), 1, 4)",
+                sq.toString());
+    }
+
+
+    @Test
+    public void testNoLength () throws QueryException {
+        // submatch(1,:<s>)
+        String filepath = getClass().getResource(
+                "/queries/submatch/noLength.jsonld").getFile();
+        SpanQueryWrapper sqwi = getJSONQuery(filepath);
+        SpanQuery sq = sqwi.toQuery();
+        assertEquals("subspan(<tokens:s />, 1, 0)", sq.toString());
+    }
+
+
+    @Test
+    public void testMinusStartOffset () throws QueryException {
+        // submatch(-1,4:<s>)
+        String filepath = getClass().getResource(
+                "/queries/submatch/minusStart.jsonld").getFile();
+        SpanQueryWrapper sqwi = getJSONQuery(filepath);
+        SpanQuery sq = sqwi.toQuery();
+        assertEquals("subspan(<tokens:s />, -1, 4)", sq.toString());
+    }
+
+
+    @Test
+    public void testEmptyMinusStartOffset () throws QueryException {
+        // no optimization
+        // submatch(-1,4:der []{1,8})
+        String filepath = getClass().getResource(
+                "/queries/submatch/empty-minusStart.jsonld").getFile();
+        SpanQueryWrapper sqwi = getJSONQuery(filepath);
+        SpanQuery sq = sqwi.toQuery();
+        assertEquals(
+                "subspan(spanExpansion(tokens:s:der, []{1, 8}, right), -1, 4)",
+                sq.toString());
+    }
+
+
+    @Test
+    public void testEmptyMax () throws QueryException {
+        // no optimization
+        // submatch(1,2:der []{1,8})
+        String filepath = getClass().getResource(
+                "/queries/submatch/empty-max.jsonld").getFile();
+        SpanQueryWrapper sqwi = getJSONQuery(filepath);
+        SpanQuery sq = sqwi.toQuery();
+        assertEquals(
+                "subspan(spanExpansion(tokens:s:der, []{1, 8}, right), 1, 2)",
+                sq.toString());
+    }
+
+
+    @Test
+    public void testCaseEmptyWrapped () throws QueryException {
+        String filepath = getClass().getResource(
+                "/queries/submatch/wrapped.jsonld").getFile();
+        SpanQueryWrapper sqwi = getJSONQuery(filepath);
+        SpanQuery sq = sqwi.toQuery();
+        assertEquals(
+                "focus(129: spanElementDistance({129: tokens:s:der}, {129: subspan"
+                        + "(<tokens:s />, 0, 1)}, [(s[0:0], ordered, notExcluded)]))",
+                sq.toString());
+    }
+
+
+    @Test
+    public void testCaseEmptyEmbedded () throws QueryException {
+        // die subspan(der []{1,}, 2,3)
+        String filepath = getClass().getResource(
+                "/queries/submatch/embedded.jsonld").getFile();
+        SpanQueryWrapper sqwi = getJSONQuery(filepath);
+        SpanQuery sq = sqwi.toQuery();
+        assertEquals("spanNext({1: tokens:s:die}, {1: subspan(spanExpansion("
+                + "tokens:s:der, []{1, 100}, right), 2, 3)})", sq.toString());
+    }
+
+
+    @Test
+    public void testCaseEmptyEmbeddedNull () throws QueryException {
+        // die subspan([],5,6)
+        // start offset is bigger than the original span
+        String filepath = getClass().getResource(
+                "/queries/submatch/embedded-null.jsonld").getFile();
+        SpanQueryWrapper sqwi = getJSONQuery(filepath);
+        SpanQuery sq = sqwi.toQuery();
+        assertEquals("tokens:s:die", sq.toString());
+    }
+
+
+    @Test
+    public void testCaseEmptyEmbeddedValid () throws QueryException {
+        // die subspan([]{0,5},2)
+        String filepath = getClass().getResource(
+                "/queries/submatch/embedded-valid-empty.jsonld").getFile();
+        SpanQueryWrapper sqwi = getJSONQuery(filepath);
+        SpanQuery sq = sqwi.toQuery();
+        assertEquals("spanExpansion(tokens:s:die, []{2, 5}, right)",
+                sq.toString());
+    }
+
+
+    @Test
+    public void testNegativeToken () throws QueryException {
+        // submatch(0,1:[base != Baum])
+        String filepath = getClass().getResource(
+                "/queries/submatch/negative-token.jsonld").getFile();
+        SpanQueryWrapper sqwi = getJSONQuery(filepath);
+        SpanQuery sq = sqwi.toQuery();
+        assertEquals("tokens:l:Baum", sq.toString());
+    }
+
+
+    @Test
+    public void testNegativeSequence () throws QueryException {
+        // das submatch(0,1:[base != Baum])
+        String filepath = getClass().getResource(
+                "/queries/submatch/negative-seq.jsonld").getFile();
+        SpanQueryWrapper sqwi = getJSONQuery(filepath);
+        SpanQuery sq = sqwi.toQuery();
+        assertEquals(
+                "spanExpansion(tokens:s:das, !tokens:l:Baum{1, 1}, right)",
+                sq.toString());
+    }
+
+
+    @Test
+    public void testNegativeSequenceWithClass () throws QueryException {
+        // das {1:submatch(0,1:[base != Baum])}
+        String filepath = getClass().getResource(
+                "/queries/submatch/negative-sequence-class.jsonld").getFile();
+        SpanQueryWrapper sqwi = getJSONQuery(filepath);
+        SpanQuery sq = sqwi.toQuery();
+        assertEquals(
+                "spanExpansion(tokens:s:das, !tokens:l:Baum{1, 1}, right, class:1)",
+                sq.toString());
+    }
+
+
+    @Test
+    public void testNegativeEmbeddedSequence () throws QueryException {
+        // submatch(1,1:das [base != Baum])
+        String filepath = getClass().getResource(
+                "/queries/submatch/embedded-negative-seq.jsonld").getFile();
+        SpanQueryWrapper sqwi = getJSONQuery(filepath);
+        SpanQuery sq = sqwi.toQuery();
+        assertEquals(
+                "subspan(spanExpansion(tokens:s:das, !tokens:l:Baum{1, 1}, right), 1, 1)",
+                sq.toString());
+    }
+
+
+    @Test
+    public void testNegativeEmbeddedSequenceWithClass () throws QueryException {
+        // submatch(0,1:{1:[base != Baum] dass})
+        String filepath = getClass().getResource(
+                "/queries/submatch/embedded-negative-class-seq.jsonld")
+                .getFile();
+        SpanQueryWrapper sqwi = getJSONQuery(filepath);
+        SpanQuery sq = sqwi.toQuery();
+        assertEquals(
+                "subspan({1: spanExpansion(tokens:s:dass, !tokens:l:Baum{1, 1}, left)}, 0, 1)",
+                sq.toString());
+    }
+
+
+    @Test
+    public void testEmbeddedNegativeRepetition () throws QueryException {
+        // submatch(1,1:das [base != Baum]{1,3})
+        String filepath = getClass().getResource(
+                "/queries/submatch/embedded-negative-repetition.jsonld")
+                .getFile();
+        SpanQueryWrapper sqwi = getJSONQuery(filepath);
+        SpanQuery sq = sqwi.toQuery();
+        assertEquals(
+                "subspan(spanExpansion(tokens:s:das, !tokens:l:Baum{1, 3}, right), 1, 1)",
+                sq.toString());
+    }
+
+
+    @Test
+    public void testNegativeRepetition () throws QueryException {
+        // das submatch(1,4:[base != Baum]{1,3})
+        String filepath = getClass().getResource(
+                "/queries/submatch/negative-repetition.jsonld").getFile();
+        SpanQueryWrapper sqwi = getJSONQuery(filepath);
+        SpanQuery sq = sqwi.toQuery();
+        assertEquals(
+                "spanExpansion(tokens:s:das, !tokens:l:Baum{2, 2}, right)",
+                sq.toString());
+    }
 }
diff --git a/src/test/java/de/ids_mannheim/korap/query/TestSpanWithAttributeJSON.java b/src/test/java/de/ids_mannheim/korap/query/TestSpanWithAttributeJSON.java
index be9c46f..7e146ad 100644
--- a/src/test/java/de/ids_mannheim/korap/query/TestSpanWithAttributeJSON.java
+++ b/src/test/java/de/ids_mannheim/korap/query/TestSpanWithAttributeJSON.java
@@ -11,102 +11,111 @@
 
 public class TestSpanWithAttributeJSON {
 
-	@Test
-	public void testElementSingleAttribute() throws QueryException {
-		String filepath = getClass().getResource(
-				"/queries/attribute/element-single-attribute.jsonld").getFile();
-		SpanQueryWrapper sqwi = getJSONQuery(filepath);
-		SpanQuery sq = sqwi.toQuery();
-		assertEquals(
-				"spanElementWithAttribute(<tokens:head />, spanAttribute(tokens:type:top))",
-				sq.toString());
-	}
+    @Test
+    public void testElementSingleAttribute () throws QueryException {
+        String filepath = getClass().getResource(
+                "/queries/attribute/element-single-attribute.jsonld").getFile();
+        SpanQueryWrapper sqwi = getJSONQuery(filepath);
+        SpanQuery sq = sqwi.toQuery();
+        assertEquals(
+                "spanElementWithAttribute(<tokens:head />, spanAttribute(tokens:type:top))",
+                sq.toString());
+    }
 
-	@Test
-	public void testElementSingleNotAttribute() throws QueryException {
-		String filepath = getClass().getResource(
-				"/queries/attribute/element-single-not-attribute.jsonld")
-				.getFile();
-		SpanQueryWrapper sqwi = getJSONQuery(filepath);
-		SpanQuery sq = sqwi.toQuery();
-		assertEquals(
-				"spanElementWithAttribute(<tokens:head />, spanAttribute(!tokens:type:top))",
-				sq.toString());
-	}
 
-	@Test
-	public void testElementMultipleAndNotAttributes() throws QueryException {
-		String filepath = getClass().getResource(
-						"/queries/attribute/element-multiple-and-not-attributes.jsonld")
-				.getFile();
-		SpanQueryWrapper sqwi = getJSONQuery(filepath);
-		SpanQuery sq = sqwi.toQuery();
-		assertEquals(
-				"spanElementWithAttribute(<tokens:div />, [spanAttribute(tokens:type:Zeitschrift), "
-						+ "spanAttribute(!tokens:complete:Y), spanAttribute(tokens:n:0)])",
-				sq.toString());
-	}
+    @Test
+    public void testElementSingleNotAttribute () throws QueryException {
+        String filepath = getClass().getResource(
+                "/queries/attribute/element-single-not-attribute.jsonld")
+                .getFile();
+        SpanQueryWrapper sqwi = getJSONQuery(filepath);
+        SpanQuery sq = sqwi.toQuery();
+        assertEquals(
+                "spanElementWithAttribute(<tokens:head />, spanAttribute(!tokens:type:top))",
+                sq.toString());
+    }
 
-	@Test
-	public void testElementMultipleOrAttributes() throws QueryException {
-		String filepath = getClass().getResource(
-				"/queries/attribute/element-multiple-or-attributes.jsonld")
-				.getFile();
-		SpanQueryWrapper sqwi = getJSONQuery(filepath);
-		SpanQuery sq = sqwi.toQuery();
-		assertEquals(
-				"spanOr([spanElementWithAttribute(<tokens:div />, spanAttribute(tokens:type:Zeitschrift)), "
-						+ "spanElementWithAttribute(<tokens:div />, spanAttribute(tokens:complete:Y)), "
-						+ "spanElementWithAttribute(<tokens:div />, spanAttribute(tokens:n:0))])",
-				sq.toString());
-	}
 
-	@Test
-	public void testAnyElementWithAttribute() throws QueryException {
-		String filepath = getClass().getResource(
-				"/queries/attribute/any-element-with-attribute.jsonld")
-				.getFile();
-		SpanQueryWrapper sqwi = getJSONQuery(filepath);
-		SpanQuery sq = sqwi.toQuery();
-		assertEquals(
-				"spanWithAttribute(spanAttribute(tokens:type:top))",
-				sq.toString());
-	}
+    @Test
+    public void testElementMultipleAndNotAttributes () throws QueryException {
+        String filepath = getClass()
+                .getResource(
+                        "/queries/attribute/element-multiple-and-not-attributes.jsonld")
+                .getFile();
+        SpanQueryWrapper sqwi = getJSONQuery(filepath);
+        SpanQuery sq = sqwi.toQuery();
+        assertEquals(
+                "spanElementWithAttribute(<tokens:div />, [spanAttribute(tokens:type:Zeitschrift), "
+                        + "spanAttribute(!tokens:complete:Y), spanAttribute(tokens:n:0)])",
+                sq.toString());
+    }
 
-	@Test
-	public void testAnyElementWithMultipleOrAttributes() throws QueryException {
-		String filepath = getClass().getResource(
-						"/queries/attribute/any-element-with-multiple-or-attributes.jsonld")
-				.getFile();
-		SpanQueryWrapper sqwi = getJSONQuery(filepath);
-		SpanQuery sq = sqwi.toQuery();
-		assertEquals(
-				"spanOr([spanWithAttribute(spanAttribute(tokens:type:Zeitschrift)), "
-						+ "spanWithAttribute(spanAttribute(tokens:complete:Y)), "
-						+ "spanWithAttribute(spanAttribute(tokens:n:0))])",
-				sq.toString());
-	}
 
-	@Test
-	public void testAnyElementMultipleAndNotAttributes() throws QueryException {
-		String filepath = getClass()
-				.getResource(
-						"/queries/attribute/any-element-with-multiple-and-not-attributes.jsonld")
-				.getFile();
-		SpanQueryWrapper sqwi = getJSONQuery(filepath);
-		SpanQuery sq = sqwi.toQuery();
-		assertEquals(
-				"spanWithAttribute([spanAttribute(tokens:type:Zeitschrift), "
-						+ "spanAttribute(!tokens:complete:Y), spanAttribute(tokens:n:0)])",
-				sq.toString());
-	}
+    @Test
+    public void testElementMultipleOrAttributes () throws QueryException {
+        String filepath = getClass().getResource(
+                "/queries/attribute/element-multiple-or-attributes.jsonld")
+                .getFile();
+        SpanQueryWrapper sqwi = getJSONQuery(filepath);
+        SpanQuery sq = sqwi.toQuery();
+        assertEquals(
+                "spanOr([spanElementWithAttribute(<tokens:div />, spanAttribute(tokens:type:Zeitschrift)), "
+                        + "spanElementWithAttribute(<tokens:div />, spanAttribute(tokens:complete:Y)), "
+                        + "spanElementWithAttribute(<tokens:div />, spanAttribute(tokens:n:0))])",
+                sq.toString());
+    }
 
-	@Test(expected = AssertionError.class)
-	public void testAnyElementSingleNotAttribute() throws QueryException {
-		String filepath = getClass().getResource(
-						"/queries/attribute/any-element-with-single-not-attribute.jsonld")
-				.getFile();
-		SpanQueryWrapper sqwi = getJSONQuery(filepath);
-	}
+
+    @Test
+    public void testAnyElementWithAttribute () throws QueryException {
+        String filepath = getClass().getResource(
+                "/queries/attribute/any-element-with-attribute.jsonld")
+                .getFile();
+        SpanQueryWrapper sqwi = getJSONQuery(filepath);
+        SpanQuery sq = sqwi.toQuery();
+        assertEquals("spanWithAttribute(spanAttribute(tokens:type:top))",
+                sq.toString());
+    }
+
+
+    @Test
+    public void testAnyElementWithMultipleOrAttributes () throws QueryException {
+        String filepath = getClass()
+                .getResource(
+                        "/queries/attribute/any-element-with-multiple-or-attributes.jsonld")
+                .getFile();
+        SpanQueryWrapper sqwi = getJSONQuery(filepath);
+        SpanQuery sq = sqwi.toQuery();
+        assertEquals(
+                "spanOr([spanWithAttribute(spanAttribute(tokens:type:Zeitschrift)), "
+                        + "spanWithAttribute(spanAttribute(tokens:complete:Y)), "
+                        + "spanWithAttribute(spanAttribute(tokens:n:0))])",
+                sq.toString());
+    }
+
+
+    @Test
+    public void testAnyElementMultipleAndNotAttributes () throws QueryException {
+        String filepath = getClass()
+                .getResource(
+                        "/queries/attribute/any-element-with-multiple-and-not-attributes.jsonld")
+                .getFile();
+        SpanQueryWrapper sqwi = getJSONQuery(filepath);
+        SpanQuery sq = sqwi.toQuery();
+        assertEquals(
+                "spanWithAttribute([spanAttribute(tokens:type:Zeitschrift), "
+                        + "spanAttribute(!tokens:complete:Y), spanAttribute(tokens:n:0)])",
+                sq.toString());
+    }
+
+
+    @Test(expected = AssertionError.class)
+    public void testAnyElementSingleNotAttribute () throws QueryException {
+        String filepath = getClass()
+                .getResource(
+                        "/queries/attribute/any-element-with-single-not-attribute.jsonld")
+                .getFile();
+        SpanQueryWrapper sqwi = getJSONQuery(filepath);
+    }
 
 }
diff --git a/src/test/java/de/ids_mannheim/korap/query/TestSpanWithinQuery.java b/src/test/java/de/ids_mannheim/korap/query/TestSpanWithinQuery.java
index c81fc79..858dbf1 100644
--- a/src/test/java/de/ids_mannheim/korap/query/TestSpanWithinQuery.java
+++ b/src/test/java/de/ids_mannheim/korap/query/TestSpanWithinQuery.java
@@ -17,15 +17,19 @@
     @Test
     public void spanSegmentWithinQuery () throws QueryException {
 
-	SpanSequenceQueryWrapper ssquery = new SpanSequenceQueryWrapper("field", "a", "b", "c");
-	SpanWithinQuery ssequery = new SpanWithinQuery("s", ssquery.toQuery());
+        SpanSequenceQueryWrapper ssquery = new SpanSequenceQueryWrapper(
+                "field", "a", "b", "c");
+        SpanWithinQuery ssequery = new SpanWithinQuery("s", ssquery.toQuery());
 
-	assertEquals("spanContain(<field:s />, spanNext(spanNext(field:a, field:b), field:c))", ssequery.toString());
+        assertEquals(
+                "spanContain(<field:s />, spanNext(spanNext(field:a, field:b), field:c))",
+                ssequery.toString());
 
-	ssquery = new SpanSequenceQueryWrapper("field", "a", "b");
-	ssequery = new SpanWithinQuery("p", ssquery.toQuery());
-	assertEquals("spanContain(<field:p />, spanNext(field:a, field:b))", ssequery.toString());
+        ssquery = new SpanSequenceQueryWrapper("field", "a", "b");
+        ssequery = new SpanWithinQuery("p", ssquery.toQuery());
+        assertEquals("spanContain(<field:p />, spanNext(field:a, field:b))",
+                ssequery.toString());
 
     };
-    
+
 };
diff --git a/src/test/java/de/ids_mannheim/korap/query/TestTemporaryQueryLimitations.java b/src/test/java/de/ids_mannheim/korap/query/TestTemporaryQueryLimitations.java
index 153ff5f..180fecb 100644
--- a/src/test/java/de/ids_mannheim/korap/query/TestTemporaryQueryLimitations.java
+++ b/src/test/java/de/ids_mannheim/korap/query/TestTemporaryQueryLimitations.java
@@ -26,42 +26,35 @@
 public class TestTemporaryQueryLimitations {
 
     @Test
-    public void classRefCheckNotSupported () throws IOException, QueryException  {
+    public void classRefCheckNotSupported () throws IOException, QueryException {
 
-	// Construct index
-	KrillIndex ki = new KrillIndex();
-	String json = new String(
-"{" +
-"  \"fields\" : [" +
-"    { "+
-"      \"primaryData\" : \"abc\"" +
-"    }," +
-"    {" +
-"      \"name\" : \"tokens\"," +
-"      \"data\" : [" +
-"         [ \"s:a\", \"i:a\", \"_0#0-1\", \"-:t$<i>3\"]," +
-"         [ \"s:b\", \"i:b\", \"_1#1-2\" ]," +
-"         [ \"s:c\", \"i:c\", \"_2#2-3\" ]" +
-"      ]" +
-"    }" +
-"  ]" +
-"}");
+        // Construct index
+        KrillIndex ki = new KrillIndex();
+        String json = new String("{" + "  \"fields\" : [" + "    { "
+                + "      \"primaryData\" : \"abc\"" + "    }," + "    {"
+                + "      \"name\" : \"tokens\"," + "      \"data\" : ["
+                + "         [ \"s:a\", \"i:a\", \"_0#0-1\", \"-:t$<i>3\"],"
+                + "         [ \"s:b\", \"i:b\", \"_1#1-2\" ],"
+                + "         [ \"s:c\", \"i:c\", \"_2#2-3\" ]" + "      ]"
+                + "    }" + "  ]" + "}");
 
-	FieldDocument fd = ki.addDoc(json);
-	ki.commit();
+        FieldDocument fd = ki.addDoc(json);
+        ki.commit();
 
-	json = getString(getClass().getResource("/queries/bugs/cosmas_classrefcheck.jsonld").getFile());
-	
-	Krill ks = new Krill(json);
-	Result kr = ks.apply(ki);
-	assertEquals(kr.getSerialQuery(),"focus(130: {131: spanContain({129: <tokens:s />}, {130: tokens:s:wegen})})");
-	assertEquals(kr.getTotalResults(),0);
-	assertEquals(kr.getStartIndex(),0);
+        json = getString(getClass().getResource(
+                "/queries/bugs/cosmas_classrefcheck.jsonld").getFile());
 
-	assertEquals("This is a warning coming from the serialization",
-		     kr.getWarning(1).getMessage());
-	assertEquals("Class reference checks are currently not supported" +
-		     " - results may not be correct",
-		     kr.getWarning(0).getMessage());
+        Krill ks = new Krill(json);
+        Result kr = ks.apply(ki);
+        assertEquals(kr.getSerialQuery(),
+                "focus(130: {131: spanContain({129: <tokens:s />}, {130: tokens:s:wegen})})");
+        assertEquals(kr.getTotalResults(), 0);
+        assertEquals(kr.getStartIndex(), 0);
+
+        assertEquals("This is a warning coming from the serialization", kr
+                .getWarning(1).getMessage());
+        assertEquals("Class reference checks are currently not supported"
+                + " - results may not be correct", kr.getWarning(0)
+                .getMessage());
     };
 };
diff --git a/src/test/java/de/ids_mannheim/korap/response/TestMessage.java b/src/test/java/de/ids_mannheim/korap/response/TestMessage.java
index 094a38b..8da908a 100644
--- a/src/test/java/de/ids_mannheim/korap/response/TestMessage.java
+++ b/src/test/java/de/ids_mannheim/korap/response/TestMessage.java
@@ -14,40 +14,46 @@
 
     @Test
     public void StringMessage () {
-	Messages km = new Messages();
-	assertEquals("[]", km.toJsonString());
+        Messages km = new Messages();
+        assertEquals("[]", km.toJsonString());
     };
 
+
     @Test
     public void StringMessageSet () {
-	Messages km = new Messages();
-	km.add(612,"Foo");
-	assertEquals("[[612,\"Foo\"]]", km.toJsonString());
-	km.add(613,"Bar");
-	assertEquals("[[612,\"Foo\"],[613,\"Bar\"]]", km.toJsonString());
+        Messages km = new Messages();
+        km.add(612, "Foo");
+        assertEquals("[[612,\"Foo\"]]", km.toJsonString());
+        km.add(613, "Bar");
+        assertEquals("[[612,\"Foo\"],[613,\"Bar\"]]", km.toJsonString());
     };
 
+
     @Test
     public void StringMessageParameters () {
-	Messages km = new Messages();
-	km.add(612,"Foo");
-	assertEquals("[[612,\"Foo\"]]", km.toJsonString());
-	km.add(613,"Bar", "Instanz");
-	assertEquals("[[612,\"Foo\"],[613,\"Bar\",\"Instanz\"]]", km.toJsonString());
-	km.add(614,"Test");
-	assertEquals("[[612,\"Foo\"],[613,\"Bar\",\"Instanz\"],[614,\"Test\"]]", km.toJsonString());
+        Messages km = new Messages();
+        km.add(612, "Foo");
+        assertEquals("[[612,\"Foo\"]]", km.toJsonString());
+        km.add(613, "Bar", "Instanz");
+        assertEquals("[[612,\"Foo\"],[613,\"Bar\",\"Instanz\"]]",
+                km.toJsonString());
+        km.add(614, "Test");
+        assertEquals(
+                "[[612,\"Foo\"],[613,\"Bar\",\"Instanz\"],[614,\"Test\"]]",
+                km.toJsonString());
     };
 
+
     @Test
     public void CheckIterability () {
-	Messages km = new Messages();
-	km.add(612,"Foo");
-	km.add(613,"Bar", "Instanz");
-	km.add(614,"Test");
-	String test = "";
-	for (Message msg : km)
-	    test += msg.getCode();
+        Messages km = new Messages();
+        km.add(612, "Foo");
+        km.add(613, "Bar", "Instanz");
+        km.add(614, "Test");
+        String test = "";
+        for (Message msg : km)
+            test += msg.getCode();
 
-	assertEquals(test, "612613614");
+        assertEquals(test, "612613614");
     };
 };
diff --git a/src/test/java/de/ids_mannheim/korap/response/TestNotifications.java b/src/test/java/de/ids_mannheim/korap/response/TestNotifications.java
index 9bbf396..ed305de 100644
--- a/src/test/java/de/ids_mannheim/korap/response/TestNotifications.java
+++ b/src/test/java/de/ids_mannheim/korap/response/TestNotifications.java
@@ -19,187 +19,188 @@
 
     ObjectMapper mapper = new ObjectMapper();
 
+
     @Test
     public void testNotification () {
-	Notifications notes = new Notifications();
-	assertEquals("{}", notes.toJsonString());
+        Notifications notes = new Notifications();
+        assertEquals("{}", notes.toJsonString());
     };
 
+
     @Test
     public void testNotificationWarnings () throws IOException {
-	Notifications notes = new Notifications();
-	assertFalse(notes.hasWarnings());
-	assertFalse(notes.hasMessages());
-	assertFalse(notes.hasErrors());
+        Notifications notes = new Notifications();
+        assertFalse(notes.hasWarnings());
+        assertFalse(notes.hasMessages());
+        assertFalse(notes.hasErrors());
 
-	notes.addWarning(613, "Foo");
-	notes.addWarning(614, "Bar", "Spiel");
+        notes.addWarning(613, "Foo");
+        notes.addWarning(614, "Bar", "Spiel");
 
-	assertEquals("{\"warnings\":[[613,\"Foo\"],[614,\"Bar\"," +
-		     "\"Spiel\"]]}", notes.toJsonString());
+        assertEquals("{\"warnings\":[[613,\"Foo\"],[614,\"Bar\","
+                + "\"Spiel\"]]}", notes.toJsonString());
 
-	assertTrue(notes.hasWarnings());
-	assertFalse(notes.hasMessages());
-	assertFalse(notes.hasErrors());
+        assertTrue(notes.hasWarnings());
+        assertFalse(notes.hasMessages());
+        assertFalse(notes.hasErrors());
 
-	notes.addError(412, "Test");
+        notes.addError(412, "Test");
 
-	assertTrue(notes.hasWarnings());
-	assertFalse(notes.hasMessages());
-	assertTrue(notes.hasErrors());
+        assertTrue(notes.hasWarnings());
+        assertFalse(notes.hasMessages());
+        assertTrue(notes.hasErrors());
 
-	JsonNode noteJson = mapper.readTree(notes.toJsonString());
+        JsonNode noteJson = mapper.readTree(notes.toJsonString());
 
-	// {"warnings":[[613,"Foo"],[614,"Bar","Spiel"]],"errors":[[412,"Test"]]}
-	assertEquals(613, noteJson.at("/warnings/0/0").asInt());
-	assertEquals("Foo", noteJson.at("/warnings/0/1").asText());
-	assertEquals(614, noteJson.at("/warnings/1/0").asInt());
-	assertEquals("Bar", noteJson.at("/warnings/1/1").asText());
-	assertEquals("Spiel", noteJson.at("/warnings/1/2").asText());
-	assertEquals(412, noteJson.at("/errors/0/0").asInt());
-	assertEquals("Test", noteJson.at("/errors/0/1").asText());
+        // {"warnings":[[613,"Foo"],[614,"Bar","Spiel"]],"errors":[[412,"Test"]]}
+        assertEquals(613, noteJson.at("/warnings/0/0").asInt());
+        assertEquals("Foo", noteJson.at("/warnings/0/1").asText());
+        assertEquals(614, noteJson.at("/warnings/1/0").asInt());
+        assertEquals("Bar", noteJson.at("/warnings/1/1").asText());
+        assertEquals("Spiel", noteJson.at("/warnings/1/2").asText());
+        assertEquals(412, noteJson.at("/errors/0/0").asInt());
+        assertEquals("Test", noteJson.at("/errors/0/1").asText());
 
-	notes.addMessage(567, "Probe", "huhu", "hihi");
+        notes.addMessage(567, "Probe", "huhu", "hihi");
 
-	assertTrue(notes.hasWarnings());
-	assertTrue(notes.hasMessages());
-	assertTrue(notes.hasErrors());
+        assertTrue(notes.hasWarnings());
+        assertTrue(notes.hasMessages());
+        assertTrue(notes.hasErrors());
 
-	noteJson = mapper.readTree(notes.toJsonString());
+        noteJson = mapper.readTree(notes.toJsonString());
 
-	// {"warnings":[[613,"Foo"],[614,"Bar","Spiel"]],
-	// "errors":[[412,"Test"]]}
-	assertEquals(613, noteJson.at("/warnings/0/0").asInt());
-	assertEquals("Foo", noteJson.at("/warnings/0/1").asText());
-	assertEquals(614, noteJson.at("/warnings/1/0").asInt());
-	assertEquals("Bar", noteJson.at("/warnings/1/1").asText());
-	assertEquals("Spiel", noteJson.at("/warnings/1/2").asText());
-	assertEquals(412, noteJson.at("/errors/0/0").asInt());
-	assertEquals("Test", noteJson.at("/errors/0/1").asText());
-	assertEquals(567, noteJson.at("/messages/0/0").asInt());
-	assertEquals("Probe", noteJson.at("/messages/0/1").asText());
-	assertEquals("huhu", noteJson.at("/messages/0/2").asText());
-	assertEquals("hihi", noteJson.at("/messages/0/3").asText());
+        // {"warnings":[[613,"Foo"],[614,"Bar","Spiel"]],
+        // "errors":[[412,"Test"]]}
+        assertEquals(613, noteJson.at("/warnings/0/0").asInt());
+        assertEquals("Foo", noteJson.at("/warnings/0/1").asText());
+        assertEquals(614, noteJson.at("/warnings/1/0").asInt());
+        assertEquals("Bar", noteJson.at("/warnings/1/1").asText());
+        assertEquals("Spiel", noteJson.at("/warnings/1/2").asText());
+        assertEquals(412, noteJson.at("/errors/0/0").asInt());
+        assertEquals("Test", noteJson.at("/errors/0/1").asText());
+        assertEquals(567, noteJson.at("/messages/0/0").asInt());
+        assertEquals("Probe", noteJson.at("/messages/0/1").asText());
+        assertEquals("huhu", noteJson.at("/messages/0/2").asText());
+        assertEquals("hihi", noteJson.at("/messages/0/3").asText());
 
-	// Todo: Check how to check for missing node
+        // Todo: Check how to check for missing node
 
-	Messages msgs = notes.getWarnings();
-	assertEquals("[[613,\"Foo\"],[614,\"Bar\",\"Spiel\"]]",
-		     msgs.toJsonString());
+        Messages msgs = notes.getWarnings();
+        assertEquals("[[613,\"Foo\"],[614,\"Bar\",\"Spiel\"]]",
+                msgs.toJsonString());
     };
 
 
     @Test
     public void testNotificationCopy () throws IOException {
 
-	Notifications notes1 = new Notifications();
-	notes1.addWarning(1, "Foo");
-	notes1.addWarning(2, "Bar", "Test");
-	notes1.addError(3, "Probe");
+        Notifications notes1 = new Notifications();
+        notes1.addWarning(1, "Foo");
+        notes1.addWarning(2, "Bar", "Test");
+        notes1.addError(3, "Probe");
 
-	Notifications notes2 = new Notifications();
-	notes2.addMessage(4, "Krah");
-	notes2.addWarning(5, "Wu", "Niegel");
+        Notifications notes2 = new Notifications();
+        notes2.addMessage(4, "Krah");
+        notes2.addWarning(5, "Wu", "Niegel");
 
-	assertTrue(notes1.hasWarnings());
-	assertFalse(notes1.hasMessages());
-	assertTrue(notes1.hasErrors());
+        assertTrue(notes1.hasWarnings());
+        assertFalse(notes1.hasMessages());
+        assertTrue(notes1.hasErrors());
 
-	assertTrue(notes2.hasWarnings());
-	assertTrue(notes2.hasMessages());
-	assertFalse(notes2.hasErrors());
+        assertTrue(notes2.hasWarnings());
+        assertTrue(notes2.hasMessages());
+        assertFalse(notes2.hasErrors());
 
-	// Copy notations
-	notes1.copyNotificationsFrom(notes2);
-	assertTrue(notes1.hasWarnings());
-	assertTrue(notes1.hasMessages());
-	assertTrue(notes1.hasErrors());
+        // Copy notations
+        notes1.copyNotificationsFrom(notes2);
+        assertTrue(notes1.hasWarnings());
+        assertTrue(notes1.hasMessages());
+        assertTrue(notes1.hasErrors());
 
-	JsonNode noteJson = mapper.readTree(notes1.toJsonString());
-	assertEquals(1, noteJson.at("/warnings/0/0").asInt());
-	assertEquals("Foo", noteJson.at("/warnings/0/1").asText());
-	assertEquals(2, noteJson.at("/warnings/1/0").asInt());
-	assertEquals("Bar", noteJson.at("/warnings/1/1").asText());
-	assertEquals("Test", noteJson.at("/warnings/1/2").asText());
-	assertEquals(5, noteJson.at("/warnings/2/0").asInt());
-	assertEquals("Wu", noteJson.at("/warnings/2/1").asText());
-	assertEquals("Niegel", noteJson.at("/warnings/2/2").asText());
-	assertEquals(4, noteJson.at("/messages/0/0").asInt());
-	assertEquals("Krah", noteJson.at("/messages/0/1").asText());
-	assertEquals(3, noteJson.at("/errors/0/0").asInt());
-	assertEquals("Probe", noteJson.at("/errors/0/1").asText());
+        JsonNode noteJson = mapper.readTree(notes1.toJsonString());
+        assertEquals(1, noteJson.at("/warnings/0/0").asInt());
+        assertEquals("Foo", noteJson.at("/warnings/0/1").asText());
+        assertEquals(2, noteJson.at("/warnings/1/0").asInt());
+        assertEquals("Bar", noteJson.at("/warnings/1/1").asText());
+        assertEquals("Test", noteJson.at("/warnings/1/2").asText());
+        assertEquals(5, noteJson.at("/warnings/2/0").asInt());
+        assertEquals("Wu", noteJson.at("/warnings/2/1").asText());
+        assertEquals("Niegel", noteJson.at("/warnings/2/2").asText());
+        assertEquals(4, noteJson.at("/messages/0/0").asInt());
+        assertEquals("Krah", noteJson.at("/messages/0/1").asText());
+        assertEquals(3, noteJson.at("/errors/0/0").asInt());
+        assertEquals("Probe", noteJson.at("/errors/0/1").asText());
     };
 
+
     @Test
     public void testNotificationJSONCopy () throws IOException {
 
-	Notifications notes1 = new Notifications();
-	notes1.addWarning(1, "Foo");
-	notes1.addWarning(2, "Bar", "Test");
-	notes1.addError(3, "Probe");
+        Notifications notes1 = new Notifications();
+        notes1.addWarning(1, "Foo");
+        notes1.addWarning(2, "Bar", "Test");
+        notes1.addError(3, "Probe");
 
-	assertTrue(notes1.hasWarnings());
-	assertFalse(notes1.hasMessages());
-	assertTrue(notes1.hasErrors());
+        assertTrue(notes1.hasWarnings());
+        assertFalse(notes1.hasMessages());
+        assertTrue(notes1.hasErrors());
 
-	JsonNode noteJson = mapper.readTree(
-	    "{\"warnings\":[[5,\"Wu\",\"Niegel\"]]," +
-	    "\"messages\":[[4,\"Krah\"]]}"
-        );
-	notes1.copyNotificationsFrom(noteJson);
+        JsonNode noteJson = mapper
+                .readTree("{\"warnings\":[[5,\"Wu\",\"Niegel\"]],"
+                        + "\"messages\":[[4,\"Krah\"]]}");
+        notes1.copyNotificationsFrom(noteJson);
 
-	assertTrue(notes1.hasWarnings());
-	assertTrue(notes1.hasMessages());
-	assertTrue(notes1.hasErrors());
+        assertTrue(notes1.hasWarnings());
+        assertTrue(notes1.hasMessages());
+        assertTrue(notes1.hasErrors());
 
-	noteJson = mapper.readTree(notes1.toJsonString());
+        noteJson = mapper.readTree(notes1.toJsonString());
 
-	assertEquals(1, noteJson.at("/warnings/0/0").asInt());
-	assertEquals("Foo", noteJson.at("/warnings/0/1").asText());
-	assertEquals(2, noteJson.at("/warnings/1/0").asInt());
-	assertEquals("Bar", noteJson.at("/warnings/1/1").asText());
-	assertEquals("Test", noteJson.at("/warnings/1/2").asText());
-	assertEquals(5, noteJson.at("/warnings/2/0").asInt());
-	assertEquals("Wu", noteJson.at("/warnings/2/1").asText());
-	assertEquals("Niegel", noteJson.at("/warnings/2/2").asText());
+        assertEquals(1, noteJson.at("/warnings/0/0").asInt());
+        assertEquals("Foo", noteJson.at("/warnings/0/1").asText());
+        assertEquals(2, noteJson.at("/warnings/1/0").asInt());
+        assertEquals("Bar", noteJson.at("/warnings/1/1").asText());
+        assertEquals("Test", noteJson.at("/warnings/1/2").asText());
+        assertEquals(5, noteJson.at("/warnings/2/0").asInt());
+        assertEquals("Wu", noteJson.at("/warnings/2/1").asText());
+        assertEquals("Niegel", noteJson.at("/warnings/2/2").asText());
 
-	assertEquals(4, noteJson.at("/messages/0/0").asInt());
-	assertEquals("Krah", noteJson.at("/messages/0/1").asText());
+        assertEquals(4, noteJson.at("/messages/0/0").asInt());
+        assertEquals("Krah", noteJson.at("/messages/0/1").asText());
 
-	assertEquals(3, noteJson.at("/errors/0/0").asInt());
-	assertEquals("Probe", noteJson.at("/errors/0/1").asText());
+        assertEquals(3, noteJson.at("/errors/0/0").asInt());
+        assertEquals("Probe", noteJson.at("/errors/0/1").asText());
 
-	noteJson = mapper.readTree(
-	    "{\"warnings\":[[8, \"Tanja\", \"Gaby\"]],\"errors\":" +
-	    "[[\"Klößchen\"],[9,\"Karl\"]]}"
-        );
-	notes1.copyNotificationsFrom(noteJson);
+        noteJson = mapper
+                .readTree("{\"warnings\":[[8, \"Tanja\", \"Gaby\"]],\"errors\":"
+                        + "[[\"Klößchen\"],[9,\"Karl\"]]}");
+        notes1.copyNotificationsFrom(noteJson);
 
-	assertTrue(notes1.hasWarnings());
-	assertTrue(notes1.hasMessages());
-	assertTrue(notes1.hasErrors());
+        assertTrue(notes1.hasWarnings());
+        assertTrue(notes1.hasMessages());
+        assertTrue(notes1.hasErrors());
 
-	noteJson = mapper.readTree(notes1.toJsonString());
+        noteJson = mapper.readTree(notes1.toJsonString());
 
-	assertEquals(1, noteJson.at("/warnings/0/0").asInt());
-	assertEquals("Foo", noteJson.at("/warnings/0/1").asText());
-	assertEquals(2, noteJson.at("/warnings/1/0").asInt());
-	assertEquals("Bar", noteJson.at("/warnings/1/1").asText());
-	assertEquals("Test", noteJson.at("/warnings/1/2").asText());
-	assertEquals(5, noteJson.at("/warnings/2/0").asInt());
-	assertEquals("Wu", noteJson.at("/warnings/2/1").asText());
-	assertEquals("Niegel", noteJson.at("/warnings/2/2").asText());
-	assertEquals(8, noteJson.at("/warnings/3/0").asInt());
-	assertEquals("Tanja", noteJson.at("/warnings/3/1").asText());
-	assertEquals("Gaby", noteJson.at("/warnings/3/2").asText());
+        assertEquals(1, noteJson.at("/warnings/0/0").asInt());
+        assertEquals("Foo", noteJson.at("/warnings/0/1").asText());
+        assertEquals(2, noteJson.at("/warnings/1/0").asInt());
+        assertEquals("Bar", noteJson.at("/warnings/1/1").asText());
+        assertEquals("Test", noteJson.at("/warnings/1/2").asText());
+        assertEquals(5, noteJson.at("/warnings/2/0").asInt());
+        assertEquals("Wu", noteJson.at("/warnings/2/1").asText());
+        assertEquals("Niegel", noteJson.at("/warnings/2/2").asText());
+        assertEquals(8, noteJson.at("/warnings/3/0").asInt());
+        assertEquals("Tanja", noteJson.at("/warnings/3/1").asText());
+        assertEquals("Gaby", noteJson.at("/warnings/3/2").asText());
 
-	assertEquals(4, noteJson.at("/messages/0/0").asInt());
-	assertEquals("Krah", noteJson.at("/messages/0/1").asText());
+        assertEquals(4, noteJson.at("/messages/0/0").asInt());
+        assertEquals("Krah", noteJson.at("/messages/0/1").asText());
 
-	assertEquals(3, noteJson.at("/errors/0/0").asInt());
-	assertEquals("Probe", noteJson.at("/errors/0/1").asText());
-	assertEquals("Klößchen", noteJson.at("/errors/1/0").asText());
-	assertEquals(9, noteJson.at("/errors/2/0").asInt());
-	assertEquals("Karl", noteJson.at("/errors/2/1").asText());
+        assertEquals(3, noteJson.at("/errors/0/0").asInt());
+        assertEquals("Probe", noteJson.at("/errors/0/1").asText());
+        assertEquals("Klößchen", noteJson.at("/errors/1/0").asText());
+        assertEquals(9, noteJson.at("/errors/2/0").asInt());
+        assertEquals("Karl", noteJson.at("/errors/2/1").asText());
     };
 };
diff --git a/src/test/java/de/ids_mannheim/korap/response/TestResponse.java b/src/test/java/de/ids_mannheim/korap/response/TestResponse.java
index 220ce19..c6d40ee 100644
--- a/src/test/java/de/ids_mannheim/korap/response/TestResponse.java
+++ b/src/test/java/de/ids_mannheim/korap/response/TestResponse.java
@@ -20,13 +20,14 @@
 
     ObjectMapper mapper = new ObjectMapper();
 
+
     @Test
     public void testResponse () throws IOException {
-		Response resp = new Response();
-		assertEquals("{}", resp.toJsonString());
-		resp.setVersion("0.24");
+        Response resp = new Response();
+        assertEquals("{}", resp.toJsonString());
+        resp.setVersion("0.24");
         resp.setNode("Tanja");
-        assertEquals("0.24",resp.getVersion());
+        assertEquals("0.24", resp.getVersion());
         assertEquals("Tanja", resp.getNode());
 
         assertFalse(resp.hasWarnings());
@@ -49,13 +50,14 @@
         assertEquals("took a while", respJson.at("/benchmark").asText());
     };
 
+
     @Test
     public void testResponseNotifications () throws IOException {
         Response resp = new Response();
         assertEquals("{}", resp.toJsonString());
         resp.setVersion("0.24");
         resp.setNode("Tanja");
-        assertEquals("0.24",resp.getVersion());
+        assertEquals("0.24", resp.getVersion());
         assertEquals("Tanja", resp.getNode());
 
         assertFalse(resp.hasWarnings());
@@ -75,13 +77,14 @@
         respJson = mapper.readTree(resp.toJsonString());
         assertEquals("0.24", respJson.at("/version").asText());
         assertEquals("Tanja", respJson.at("/node").asText());
-        
+
         assertEquals("Fehler 1", respJson.at("/warnings/0/1").asText());
         assertEquals("Fehler 2", respJson.at("/warnings/1/1").asText());
         assertEquals("Fehler 3", respJson.at("/warnings/2/1").asText());
         assertEquals("Fehler 4", respJson.at("/errors/0/1").asText());
     };
 
+
     @Test
     public void testResponseDeserialzation () throws IOException {
         String jsonResponse = "{\"version\":\"0.38\"}";
@@ -120,9 +123,9 @@
         kresp = mapper.readValue(jsonResponse, Response.class);
         assertEquals("tanja", kresp.getNode());
 
-        jsonResponse = "{\"node\":\"tanja\", \"version\":\"seaweed-0.49\", " +
-            " \"benchmark\":\"40.5s\",  \"listener\":\"10.0.10.14:678\"," +
-            "\"timeExceeded\":true }";
+        jsonResponse = "{\"node\":\"tanja\", \"version\":\"seaweed-0.49\", "
+                + " \"benchmark\":\"40.5s\",  \"listener\":\"10.0.10.14:678\","
+                + "\"timeExceeded\":true }";
         kresp = mapper.readValue(jsonResponse, Response.class);
         assertEquals("0.49", kresp.getVersion());
         assertEquals("seaweed", kresp.getName());
@@ -132,12 +135,12 @@
         assertTrue(kresp.hasTimeExceeded());
         assertTrue(kresp.hasWarnings());
 
-        jsonResponse = "{\"warnings\":[[123,\"This is a warning\"]," +
-            "[124,\"This is a second warning\"]],"+
-            "\"errors\":[[125,\"This is a single error\"]], "+
-            " \"node\":\"tanja\", \"version\":\"seaweed-0.49\", " +
-            " \"benchmark\":\"40.5s\",  \"listener\":\"10.0.10.14:678\"," +
-            "\"timeExceeded\":true }";
+        jsonResponse = "{\"warnings\":[[123,\"This is a warning\"],"
+                + "[124,\"This is a second warning\"]],"
+                + "\"errors\":[[125,\"This is a single error\"]], "
+                + " \"node\":\"tanja\", \"version\":\"seaweed-0.49\", "
+                + " \"benchmark\":\"40.5s\",  \"listener\":\"10.0.10.14:678\","
+                + "\"timeExceeded\":true }";
         kresp = mapper.readValue(jsonResponse, Response.class);
         assertTrue(kresp.hasWarnings());
         assertTrue(kresp.hasErrors());
@@ -146,7 +149,8 @@
 
         // THIS MAY BREAK!
         assertEquals(kresp.getWarning(0).getMessage(), "This is a warning");
-        assertEquals(kresp.getWarning(1).getMessage(), "This is a second warning");
+        assertEquals(kresp.getWarning(1).getMessage(),
+                "This is a second warning");
         assertEquals(kresp.getWarning(2).getMessage(), "Response time exceeded");
         assertEquals("0.49", kresp.getVersion());
         assertEquals("seaweed", kresp.getName());
diff --git a/src/test/java/de/ids_mannheim/korap/search/TestKrill.java b/src/test/java/de/ids_mannheim/korap/search/TestKrill.java
index 33175d2..622a80b 100644
--- a/src/test/java/de/ids_mannheim/korap/search/TestKrill.java
+++ b/src/test/java/de/ids_mannheim/korap/search/TestKrill.java
@@ -34,9 +34,7 @@
 public class TestKrill {
     @Test
     public void searchCount () {
-        Krill k = new Krill(
-          new QueryBuilder("field1").seg("a").with("b")
-        );
+        Krill k = new Krill(new QueryBuilder("field1").seg("a").with("b"));
 
         KrillMeta meta = k.getMeta();
 
@@ -51,11 +49,10 @@
         assertEquals(meta.getCount(), meta.getCountMax());
     };
 
+
     @Test
     public void searchStartIndex () {
-        Krill k = new Krill(
-            new QueryBuilder("field1").seg("a").with("b")
-        );
+        Krill k = new Krill(new QueryBuilder("field1").seg("a").with("b"));
 
         KrillMeta meta = k.getMeta();
 
@@ -72,13 +69,13 @@
         assertEquals(meta.getStartIndex(), 0);
     };
 
+
     @Test
     public void searchQuery () {
-        Krill ks = new Krill(
-            new QueryBuilder("field1").seg("a").with("b")
-        );
+        Krill ks = new Krill(new QueryBuilder("field1").seg("a").with("b"));
         // query
-        assertEquals(ks.getSpanQuery().toString(), "spanSegment(field1:a, field1:b)");
+        assertEquals(ks.getSpanQuery().toString(),
+                "spanSegment(field1:a, field1:b)");
     };
 
 
@@ -87,41 +84,30 @@
         // Construct index
         KrillIndex ki = new KrillIndex();
         // Indexing test files
-        for (String i : new String[] {"00001",
-                                      "00002",
-                                      "00003",
-                                      "00004",
-                                      "00005",
-                                      "00006",
-                                      "02439"}) {
+        for (String i : new String[] { "00001", "00002", "00003", "00004",
+                "00005", "00006", "02439" }) {
             ki.addDoc(
-                getClass().getResourceAsStream("/wiki/" + i + ".json.gz"),
-                true
-            );
+                    getClass().getResourceAsStream("/wiki/" + i + ".json.gz"),
+                    true);
         };
         ki.commit();
 
-        Krill ks = new Krill(
-	        new QueryBuilder("tokens").seg("s:Buchstaben")
-        );
+        Krill ks = new Krill(new QueryBuilder("tokens").seg("s:Buchstaben"));
 
         // Todo: This is not an acceptable collection, but sigh
         ks.getCollection().filter(
-            new CollectionBuilder().and("textClass", "reisen")
-        );
+                new CollectionBuilder().and("textClass", "reisen"));
 
         KrillMeta meta = ks.getMeta();
         meta.setCount(3);
         meta.setStartIndex(5);
         meta.getContext().left.setLength(1);
         meta.getContext().right.setLength(1);
-        
+
         Result kr = ks.apply(ki);
         assertEquals(kr.getTotalResults(), 6);
-        assertEquals(
-            kr.getMatch(0).getSnippetBrackets(),
-            "... dem [Buchstaben] A ..."
-        );
+        assertEquals(kr.getMatch(0).getSnippetBrackets(),
+                "... dem [Buchstaben] A ...");
 
         JsonNode res = ks.toJsonNode();
         assertEquals(3, res.at("/meta/count").asInt());
@@ -138,65 +124,48 @@
         // Construct index
         KrillIndex ki = new KrillIndex();
         // Indexing test files
-        for (String i : new String[] {"00001",
-                                      "00002",
-                                      "00003",
-                                      "00004",
-                                      "00005",
-                                      "00006",
-                                      "02439"}) {
+        for (String i : new String[] { "00001", "00002", "00003", "00004",
+                "00005", "00006", "02439" }) {
             ki.addDoc(
-                getClass().getResourceAsStream("/wiki/" + i + ".json.gz"),
-                true
-            );
+                    getClass().getResourceAsStream("/wiki/" + i + ".json.gz"),
+                    true);
         };
         ki.commit();
 
-        String json = getString(
-            getClass().getResource("/queries/metaquery3.jsonld").getFile()
-        );
+        String json = getString(getClass().getResource(
+                "/queries/metaquery3.jsonld").getFile());
 
         Krill ks = new Krill(json);
-		Result kr = ks.apply(ki);
+        Result kr = ks.apply(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()
-        );
+        assertEquals("... a: A ist [der klangreichste] der V ...",
+                kr.getMatch(0).getSnippetBrackets());
     };
 
+
     @Test
     public void searchJSON2 () throws IOException {
         // Construct index
         KrillIndex ki = new KrillIndex();
         // 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"
-                                      */
-            }) {
+        for (String i : new String[] { "00001", "00002", "00003", "00004",
+                "00005", "00006", "02439", "00012-fakemeta", "00030-fakemeta",
+        /*
+          "02035-substring",
+          "05663-unbalanced",
+          "07452-deep"
+        */
+        }) {
             ki.addDoc(
-                getClass().getResourceAsStream("/wiki/" + i + ".json.gz"),
-                true
-            );
+                    getClass().getResourceAsStream("/wiki/" + i + ".json.gz"),
+                    true);
         };
         ki.commit();
 
-        String json = getString(
-            getClass().getResource("/queries/metaquery4.jsonld").getFile()
-        );
+        String json = getString(getClass().getResource(
+                "/queries/metaquery4.jsonld").getFile());
 
         Krill ks = new Krill(json);
         Result kr = ks.apply(ki);
@@ -210,17 +179,15 @@
 
         assertEquals(kr.getTotalResults(), 5);
 
-        json = getString(
-            getClass().getResource("/queries/metaquery5.jsonld").getFile()
-        );
+        json = getString(getClass().getResource("/queries/metaquery5.jsonld")
+                .getFile());
 
         ks = new Krill(json);
         kr = ks.apply(ki);
         assertEquals(kr.getTotalResults(), 1);
 
-        json = getString(
-            getClass().getResource("/queries/metaquery6.jsonld").getFile()
-        );
+        json = getString(getClass().getResource("/queries/metaquery6.jsonld")
+                .getFile());
         ks = new Krill(json);
         kr = ks.apply(ki);
         assertEquals(kr.getTotalResults(), 1);
@@ -232,18 +199,11 @@
         // Construct index
         KrillIndex ki = new KrillIndex();
         // Indexing test files
-        for (String i : new String[] {"00001",
-                                      "00002",
-                                      "00003",
-                                      "00004",
-                                      "00005",
-                                      "00006",
-                                      "02439"
-            }) {
+        for (String i : new String[] { "00001", "00002", "00003", "00004",
+                "00005", "00006", "02439" }) {
             ki.addDoc(
-                      getClass().getResourceAsStream("/wiki/" + i + ".json.gz"),
-                true
-            );
+                    getClass().getResourceAsStream("/wiki/" + i + ".json.gz"),
+                    true);
         };
         ki.commit();
         Result kr = new Krill("{ query").apply(ki);
@@ -257,23 +217,16 @@
         // Construct index
         KrillIndex ki = new KrillIndex();
         // Indexing test files
-        for (String i : new String[] {"00001",
-                                      "00002",
-                                      "00003",
-                                      "00004",
-                                      "00005",
-                                      "00006",
-                                      "02439"}) {
+        for (String i : new String[] { "00001", "00002", "00003", "00004",
+                "00005", "00006", "02439" }) {
             ki.addDoc(
-                getClass().getResourceAsStream("/wiki/" + i + ".json.gz"),
-                true
-            );
+                    getClass().getResourceAsStream("/wiki/" + i + ".json.gz"),
+                    true);
         };
         ki.commit();
 
-        String json = getString(
-            getClass().getResource("/queries/bsp-fail1.jsonld").getFile()
-        );
+        String json = getString(getClass().getResource(
+                "/queries/bsp-fail1.jsonld").getFile());
 
         Result kr = new Krill(json).apply(ki);
         assertEquals(0, kr.getStartIndex());
@@ -287,23 +240,16 @@
         // Construct index
         KrillIndex ki = new KrillIndex();
         // Indexing test files
-        for (String i : new String[] {"00001",
-                                      "00002",
-                                      "00003",
-                                      "00004",
-                                      "00005",
-                                      "00006",
-                                      "02439"}) {
+        for (String i : new String[] { "00001", "00002", "00003", "00004",
+                "00005", "00006", "02439" }) {
             ki.addDoc(
-                getClass().getResourceAsStream("/wiki/" + i + ".json.gz"),
-                true
-            );
+                    getClass().getResourceAsStream("/wiki/" + i + ".json.gz"),
+                    true);
         };
         ki.commit();
 
-        String json = getString(
-            getClass().getResource("/queries/bsp-fail2.jsonld").getFile()
-        );
+        String json = getString(getClass().getResource(
+                "/queries/bsp-fail2.jsonld").getFile());
 
         Result kr = new Krill(json).apply(ki);
         assertEquals(50, kr.getItemsPerPage());
@@ -317,32 +263,25 @@
         // Construct index
         KrillIndex ki = new KrillIndex();
         // Indexing test files
-        for (String i : new String[] {"00001",
-                                      "00002",
-                                      "00003",
-                                      "00004",
-                                      "00005",
-                                      "00006",
-                                      "02439"}) {
+        for (String i : new String[] { "00001", "00002", "00003", "00004",
+                "00005", "00006", "02439" }) {
             ki.addDoc(
-                getClass().getResourceAsStream("/wiki/" + i + ".json.gz"),
-                true
-            );
+                    getClass().getResourceAsStream("/wiki/" + i + ".json.gz"),
+                    true);
         };
         ki.commit();
 
-        String json = getString(
-            getClass().getResource("/queries/bsp-context.jsonld").getFile()
-        );
+        String json = getString(getClass().getResource(
+                "/queries/bsp-context.jsonld").getFile());
 
         Krill ks = new Krill(json);
         Result kr = ks.apply(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());
+        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.getMeta().setCount(5);
         ks.getMeta().setStartPage(2);
@@ -351,49 +290,41 @@
         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 Krill(json).apply(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());
+        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
         KrillIndex ki = new KrillIndex();
         // Indexing test files
-        for (String i : new String[] {"00001",
-                                      "00002",
-                                      "00003",
-                                      "00004",
-                                      "00005",
-                                      "00006",
-                                      "02439"}) {
+        for (String i : new String[] { "00001", "00002", "00003", "00004",
+                "00005", "00006", "02439" }) {
             ki.addDoc(
-                getClass().getResourceAsStream("/wiki/" + i + ".json.gz"),
-                true
-            );
+                    getClass().getResourceAsStream("/wiki/" + i + ".json.gz"),
+                    true);
         };
         ki.commit();
 
-        String json = getString(
-            getClass().getResource("/queries/bsp-paging.jsonld").getFile()
-        );
+        String json = getString(getClass().getResource(
+                "/queries/bsp-paging.jsonld").getFile());
 
         Krill ks = new Krill(json);
         Result kr = ks.apply(ki);
@@ -401,18 +332,16 @@
         assertEquals(5, kr.getStartIndex());
         assertEquals(5, kr.getItemsPerPage());
 
-        json = getString(
-            getClass().getResource("/queries/bsp-cutoff.jsonld").getFile()
-        );
+        json = getString(getClass().getResource("/queries/bsp-cutoff.jsonld")
+                .getFile());
         ks = ks = new Krill(json);
         kr = ks.apply(ki);
         assertEquals(kr.getTotalResults(), -1);
         assertEquals(2, kr.getStartIndex());
         assertEquals(2, kr.getItemsPerPage());
 
-        json = getString(
-            getClass().getResource("/queries/metaquery9.jsonld").getFile()
-        );
+        json = getString(getClass().getResource("/queries/metaquery9.jsonld")
+                .getFile());
         KrillCollection kc = new KrillCollection(json);
         kc.setIndex(ki);
         assertEquals(7, kc.numberOf("documents"));
@@ -424,24 +353,15 @@
         // Construct index
         KrillIndex ki = new KrillIndex();
         // Indexing test files
-        for (String i : new String[] {"00001",
-                                      "00002",
-                                      "00003",
-                                      "00004",
-                                      "00005",
-                                      "00006",
-                                      "02439"}) {
+        for (String i : new String[] { "00001", "00002", "00003", "00004",
+                "00005", "00006", "02439" }) {
             ki.addDoc(
-                getClass().getResourceAsStream("/wiki/" + i + ".json.gz"),
-                true
-            );
+                    getClass().getResourceAsStream("/wiki/" + i + ".json.gz"),
+                    true);
         };
         ki.commit();
-        String json = getString(
-            getClass().
-            getResource("/queries/bsp-itemsPerResource.jsonld").
-            getFile()
-        );
+        String json = getString(getClass().getResource(
+                "/queries/bsp-itemsPerResource.jsonld").getFile());
 
         Krill ks = new Krill(json);
         Result kr = ks.apply(ki);
@@ -464,11 +384,11 @@
         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 Krill(json);
         ks.getMeta().setItemsPerResource(2);
 
@@ -479,7 +399,7 @@
         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());
@@ -491,7 +411,7 @@
         meta.setCount(1);
 
         kr = ks.apply(ki);
-	
+
         assertEquals("WPD_AAA.00002", kr.getMatch(0).getDocID());
 
         assertEquals(kr.getTotalResults(), 3);
@@ -512,32 +432,22 @@
         KrillIndex ki = new KrillIndex();
         // Indexing test files
         int uid = 1;
-        for (String i : new String[] {"00001",
-                                      "00002",
-                                      "00003",
-                                      "00004",
-                                      "00005",
-                                      "00006",
-                                      "02439"}) {
-            ki.addDoc(
-                uid++,
-                getClass().getResourceAsStream("/wiki/" + i + ".json.gz"),
-                true
-            );
+        for (String i : new String[] { "00001", "00002", "00003", "00004",
+                "00005", "00006", "02439" }) {
+            ki.addDoc(uid++,
+                    getClass().getResourceAsStream("/wiki/" + i + ".json.gz"),
+                    true);
         };
         ki.commit();
 
-        String json = getString(
-            getClass().
-            getResource("/queries/bsp-uid-example.jsonld").
-            getFile()
-        );
+        String json = getString(getClass().getResource(
+                "/queries/bsp-uid-example.jsonld").getFile());
 
         Krill ks = new Krill(json);
         ks.getMeta().setItemsPerResource(1);
 
         KrillCollection kc = new KrillCollection();
-        kc.filterUIDs(new String[]{"1", "4"});
+        kc.filterUIDs(new String[] { "1", "4" });
         kc.setIndex(ki);
         ks.setCollection(kc);
 
@@ -554,42 +464,37 @@
         // Construct index
         KrillIndex ki = new KrillIndex();
         // Indexing test files
-        FieldDocument fd = ki.addDoc(
-            1,
-            getClass().
-            getResourceAsStream("/goe/AGA-03828.json.gz"),
-            true
-        );
+        FieldDocument fd = ki.addDoc(1,
+                getClass().getResourceAsStream("/goe/AGA-03828.json.gz"), true);
         ki.commit();
 
         assertEquals(fd.getUID(), 1);
-        assertEquals(fd.getTextSigle(),   "GOE_AGA.03828");
-        assertEquals(fd.getDocSigle(),    "GOE_AGA");
+        assertEquals(fd.getTextSigle(), "GOE_AGA.03828");
+        assertEquals(fd.getDocSigle(), "GOE_AGA");
         assertEquals(fd.getCorpusSigle(), "GOE");
-        assertEquals(fd.getTitle()  ,     "Autobiographische Einzelheiten");
+        assertEquals(fd.getTitle(), "Autobiographische Einzelheiten");
         assertNull(fd.getSubTitle());
-        assertEquals(fd.getTextType(),    "Autobiographie");
+        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.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");
+        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");
+        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());
@@ -597,36 +502,32 @@
 
         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");
+                "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");
+                "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.getCorpusAuthor(), "Goethe, Johann Wolfgang von");
+        assertEquals(fd.getCorpusEditor(), "Trunz, Erich");
         assertEquals(fd.getDocTitle(),
-            "Goethe: Autobiographische Schriften II, (1817-1825, 1832)"
-        );
+                "Goethe: Autobiographische Schriften II, (1817-1825, 1832)");
         assertNull(fd.getDocSubTitle());
         assertNull(fd.getDocEditor());
         assertNull(fd.getDocAuthor());
 
-        Krill ks = new Krill(
-            new QueryBuilder("tokens").
-            seg("mate/m:case:nom").
-            with("mate/m:number:pl")
-        );
+        Krill ks = new Krill(new QueryBuilder("tokens").seg("mate/m:case:nom")
+                .with("mate/m:number:pl"));
         Result kr = ks.apply(ki);
 
         assertEquals(kr.getTotalResults(), 148);
@@ -640,64 +541,58 @@
         // Construct index
         KrillIndex ki = new KrillIndex();
         // Indexing test files
-        FieldDocument fd = ki.addDoc(
-            1,
-            getClass().
-            getResourceAsStream("/bzk/D59-00089.json.gz"),
-            true
-        );
+        FieldDocument fd = ki.addDoc(1,
+                getClass().getResourceAsStream("/bzk/D59-00089.json.gz"), true);
         ki.commit();
 
         assertEquals(fd.getUID(), 1);
-        assertEquals(fd.getTextSigle(),   "BZK_D59.00089");
-        assertEquals(fd.getDocSigle(),    "BZK_D59");
+        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");
+        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");
+        assertEquals(fd.getPubPlace(), "Berlin");
         assertNull(fd.getPublisher());
-        assertEquals(fd.getTextType(),    "Zeitung: Tageszeitung");
+        assertEquals(fd.getTextType(), "Zeitung: Tageszeitung");
         assertNull(fd.getTextTypeArt());
         assertEquals(fd.getTextTypeRef(), "Tageszeitung");
-        assertEquals(fd.getTextDomain(),  "Politik");
+        assertEquals(fd.getTextDomain(), "Politik");
         assertEquals(fd.getCreationDate().toString(), "19590219");
-        assertEquals(fd.getLicense(),     "ACA-NC-LC");
-        assertEquals(fd.getTextColumn(),  "POLITIK");
+        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");
+
+        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");
+                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.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());
@@ -705,18 +600,14 @@
         assertNull(fd.getCorpusEditor());
 
         assertEquals(fd.getDocTitle(), "Neues Deutschland");
-        assertEquals(
-            fd.getDocSubTitle(),
-            "Organ des Zentralkomitees der Sozialistischen "+
-            "Einheitspartei Deutschlands");
+        assertEquals(fd.getDocSubTitle(),
+                "Organ des Zentralkomitees der Sozialistischen "
+                        + "Einheitspartei Deutschlands");
         assertNull(fd.getDocEditor());
         assertNull(fd.getDocAuthor());
-        
-        Krill ks = new Krill(
-            new QueryBuilder("tokens").
-            seg("mate/m:case:nom").
-            with("mate/m:number:sg")
-        );
+
+        Krill ks = new Krill(new QueryBuilder("tokens").seg("mate/m:case:nom")
+                .with("mate/m:number:sg"));
         Result kr = ks.apply(ki);
 
         assertEquals(kr.getTotalResults(), 6);
@@ -730,144 +621,98 @@
         // Construct index
         KrillIndex ki = new KrillIndex();
         // Indexing test files
-        FieldDocument fd = ki.addDoc(
-            1,
-            getClass().
-            getResourceAsStream("/bzk/D59-00089.json.gz"),
-            true
-	    );
+        FieldDocument fd = ki.addDoc(1,
+                getClass().getResourceAsStream("/bzk/D59-00089.json.gz"), 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());
 
         QueryBuilder kq = new QueryBuilder("tokens");
-        Krill ks = new Krill(
-            kq.focus(
-                1,
-                kq.contains(kq.tag("base/s:s"), kq._(1, kq.seg("s:Leben")))
-            )
-        );
+        Krill ks = new Krill(kq.focus(1,
+                kq.contains(kq.tag("base/s:s"), kq._(1, kq.seg("s:Leben")))));
 
         Result kr = ks.apply(ki);
+        assertEquals(kr.getSerialQuery(),
+                "focus(1: spanContain(<tokens:base/s:s />, {1: tokens:s:Leben}))");
         assertEquals(
-            kr.getSerialQuery(),
-            "focus(1: spanContain(<tokens:base/s:s />, {1: tokens:s:Leben}))"
-        );
-        assertEquals(
-            kr.getMatch(0).getSnippetBrackets(),
-            "... Initiative\" eine neue politische Gruppierung ins " +
-            "[{1:Leben}] gerufen hatten. Pressemeldungen zufolge haben sich ..."
-        );
+                kr.getMatch(0).getSnippetBrackets(),
+                "... Initiative\" eine neue politische Gruppierung ins "
+                        + "[{1:Leben}] gerufen hatten. Pressemeldungen zufolge haben sich ...");
 
         // Try with high class - don't highlight
-        ks = new Krill(
-            kq.focus(
-                129,
-                kq.contains(kq.tag("base/s:s"), kq._(129, kq.seg("s:Leben")))
-            )
-        );
+        ks = new Krill(kq.focus(129,
+                kq.contains(kq.tag("base/s:s"), kq._(129, kq.seg("s:Leben")))));
 
         kr = ks.apply(ki);
+        assertEquals(kr.getSerialQuery(),
+                "focus(129: spanContain(<tokens:base/s:s />, {129: tokens:s:Leben}))");
         assertEquals(
-            kr.getSerialQuery(),
-            "focus(129: spanContain(<tokens:base/s:s />, {129: tokens:s:Leben}))"
-        );
-        assertEquals(
-            kr.getMatch(0).getSnippetBrackets(),
-            "... Initiative\" eine neue politische Gruppierung ins " +
-            "[Leben] gerufen hatten. Pressemeldungen zufolge haben sich ..."
-        );
+                kr.getMatch(0).getSnippetBrackets(),
+                "... Initiative\" eine neue politische Gruppierung ins "
+                        + "[Leben] gerufen hatten. Pressemeldungen zufolge haben sich ...");
 
         ks = new Krill(json);
         kr = ks.apply(ki);
         assertEquals(
-            kr.getSerialQuery(),
-            "focus(129: spanElementDistance({129: tokens:s:Namen}, " +
-            "{129: tokens:s:Leben}, [(base/s:s[0:1], notOrdered, notExcluded)]))"
-        );
+                kr.getSerialQuery(),
+                "focus(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 ..."
-        );
+                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());
     };
 
+
     @Test
     public void searchJSONmultipleClassesBug () throws IOException {
         // Construct index
         KrillIndex ki = new KrillIndex();
         // Indexing test files
-        ki.addDoc(
-            1,
-            getClass().
-            getResourceAsStream("/bzk/D59-00089.json.gz"),
-            true
-        );
-        ki.addDoc(
-            2,
-            getClass().
-            getResourceAsStream("/bzk/D59-00089.json.gz"),
-            true
-        );
+        ki.addDoc(1, getClass().getResourceAsStream("/bzk/D59-00089.json.gz"),
+                true);
+        ki.addDoc(2, getClass().getResourceAsStream("/bzk/D59-00089.json.gz"),
+                true);
 
         ki.commit();
 
-        String json = getString(
-            getClass().
-            getResource("/queries/bugs/multiple_classes.jsonld").
-            getFile()
-        );
-	
+        String json = getString(getClass().getResource(
+                "/queries/bugs/multiple_classes.jsonld").getFile());
+
         Krill ks = new Krill(json);
         Result kr = ks.apply(ki);
+        assertEquals(kr.getSerialQuery(),
+                "{4: spanNext({1: spanNext({2: tokens:s:ins}, "
+                        + "{3: tokens:s:Leben})}, tokens:s:gerufen)}");
         assertEquals(
-            kr.getSerialQuery(),
-            "{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 ..."
-        );
+                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());
     };
 
+
     @Test
     public void searchJSONmultipleClassesBugTokenList () throws IOException {
         // Construct index
         KrillIndex ki = new KrillIndex();
         // Indexing test files
-        ki.addDoc(
-            1,
-            getClass().
-            getResourceAsStream("/goe/AGA-03828.json.gz"),
-            true
-        );
-        ki.addDoc(
-            2,
-            getClass().
-            getResourceAsStream("/bzk/D59-00089.json.gz"),
-            true
-        );
+        ki.addDoc(1, getClass().getResourceAsStream("/goe/AGA-03828.json.gz"),
+                true);
+        ki.addDoc(2, getClass().getResourceAsStream("/bzk/D59-00089.json.gz"),
+                true);
 
         ki.commit();
 
-        String json = getString(
-            getClass().
-            getResource("/queries/bugs/multiple_classes.jsonld").
-            getFile()
-        );
-	
+        String json = getString(getClass().getResource(
+                "/queries/bugs/multiple_classes.jsonld").getFile());
+
         Krill ks = new Krill(json);
         Result kr = ks.apply(ki);
 
@@ -875,10 +720,9 @@
         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("/serialQuery").asText());
+        assertEquals("{4: spanNext({1: spanNext({2: tokens:s:ins}, "
+                + "{3: tokens:s:Leben})}, tokens:s:gerufen)}",
+                res.at("/serialQuery").asText());
         assertEquals(0, res.at("/startIndex").asInt());
         assertEquals(25, res.at("/itemsPerPage").asInt());
 
@@ -900,24 +744,17 @@
         assertEquals(ki.numberOf("documents"), 0);
 
         // Indexing test files
-        FieldDocument fd = ki.addDoc(
-            1,
-            getClass().
-            getResourceAsStream("/bzk/D59-00089.json.gz"),
-            true
-        );
+        FieldDocument fd = ki.addDoc(1,
+                getClass().getResourceAsStream("/bzk/D59-00089.json.gz"), 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()
-        );
-	
+        String json = getString(getClass().getResource(
+                "/queries/bugs/multiterm_rewrite.jsonld").getFile());
+
         Krill ks = new Krill(json);
         KrillCollection kc = ks.getCollection();
 
@@ -928,50 +765,36 @@
         // Index was set but vc restricted to WPD
         assertEquals(0, kc.numberOf("documents"));
 
-        kc.extend(
-            new CollectionBuilder().or("corpusSigle", "BZK")
-        );
+        kc.extend(new CollectionBuilder().or("corpusSigle", "BZK"));
         ks.setCollection(kc);
         assertEquals(1, kc.numberOf("documents"));
 
         Result kr = ks.apply(ki);
-        
-        assertEquals(
-            kr.getSerialQuery(),
-            "spanOr([SpanMultiTermQueryWrapper(tokens:/tt/p:N.*/), " +
-            "spanNext(spanRepetition(SpanMultiTermQueryWrapper"+
-            "(tokens:/tt/p:A.*/){1,3}), " +
-            "SpanMultiTermQueryWrapper(tokens:/tt/p:N.*/))])"
-        );
+
+        assertEquals(kr.getSerialQuery(),
+                "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.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(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(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(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(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");
     };
 
 
@@ -980,38 +803,25 @@
         // Construct index
         KrillIndex ki = new KrillIndex();
         // Indexing test files
-        for (String i : new String[] {"00001",
-                                      "00002",
-                                      "00003",
-                                      "00004",
-                                      "00005",
-                                      "00006",
-                                      "02439"}) {
+        for (String i : new String[] { "00001", "00002", "00003", "00004",
+                "00005", "00006", "02439" }) {
             ki.addDoc(
-                getClass().
-                getResourceAsStream("/wiki/" + i + ".json.gz"),
-                true
-            );
+                    getClass().getResourceAsStream("/wiki/" + i + ".json.gz"),
+                    true);
         };
         ki.commit();
-        String json = getString(
-            getClass().
-            getResource("/queries/metaquery8-nocollection.jsonld").
-            getFile()
-        );
-	
+        String json = getString(getClass().getResource(
+                "/queries/metaquery8-nocollection.jsonld").getFile());
+
         Krill ks = new Krill(json);
         Result kr = ks.apply(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 Krill(json);
         kr = ks.apply(ki);
 
@@ -1020,12 +830,9 @@
         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 Krill(json);
         kr = ks.apply(ki);
 
@@ -1034,32 +841,26 @@
         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 Krill(json);
         kr = ks.apply(ki);
 
         assertEquals(kr.getTotalResults(), 0);
         assertEquals(0, kr.getStartIndex());
         assertEquals(10, kr.getItemsPerPage());
-        
-        json = getString(
-            getClass().
-            getResource("/queries/metaquery8-filtered-nested.jsonld").
-            getFile()
-        );
-	
+
+        json = getString(getClass().getResource(
+                "/queries/metaquery8-filtered-nested.jsonld").getFile());
+
         ks = new Krill(json);
         kr = ks.apply(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());
@@ -1072,66 +873,45 @@
         // Construct index
         KrillIndex ki = new KrillIndex();
         // Indexing test files
-        for (String i : new String[] {"00001",
-                                      "00002",
-                                      "00003",
-                                      "00004",
-                                      "00005",
-                                      "00006",
-                                      "02439"}) {
+        for (String i : new String[] { "00001", "00002", "00003", "00004",
+                "00005", "00006", "02439" }) {
             ki.addDoc(
-                getClass().
-                getResourceAsStream("/wiki/" + i + ".json.gz"),
-                true
-            );
+                    getClass().getResourceAsStream("/wiki/" + i + ".json.gz"),
+                    true);
         };
         ki.commit();
 
-        String json = getString(
-            getClass().
-            getResource("/queries/bsp-context-2.jsonld").
-            getFile()
-        );
-	
+        String json = getString(getClass().getResource(
+                "/queries/bsp-context-2.jsonld").getFile());
+
         Krill ks = new Krill(json);
         ks.getMeta().setCutOff(false);
         SearchContext sc = ks.getMeta().getContext();
         sc.left.setLength((short) 10);
         sc.right.setLength((short) 10);
-        
+
         Result kr = ks.apply(ki);
-        assertEquals(
-            kr.getMatch(1).getSnippetBrackets(),
-            "... dezimalen [Wert] 65 sowohl ..."
-        );
+        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 Krill(json).apply(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.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\"");
     };
@@ -1142,33 +922,21 @@
         // Construct index
         KrillIndex ki = new KrillIndex();
         // Indexing test files
-        for (String i : new String[] {"00001",
-                                      "00002",
-                                      "00003",
-                                      "00004",
-                                      "00005",
-                                      "00006",
-                                      "02439"}) {
+        for (String i : new String[] { "00001", "00002", "00003", "00004",
+                "00005", "00006", "02439" }) {
             ki.addDoc(
-                getClass().
-                getResourceAsStream("/wiki/" + i + ".json.gz"),
-                true
-            );
+                    getClass().getResourceAsStream("/wiki/" + i + ".json.gz"),
+                    true);
         };
         ki.commit();
 
-        String json = getString(
-            getClass().
-            getResource("/queries/bsp-bug.jsonld").
-            getFile()
-        );
+        String json = getString(getClass().getResource(
+                "/queries/bsp-bug.jsonld").getFile());
 
         Result kr = new Krill(json).apply(ki);
 
-        assertEquals(
-            kr.getError(0).getMessage(),
-            "Operation needs operand list"
-        );
+        assertEquals(kr.getError(0).getMessage(),
+                "Operation needs operand list");
     };
 
 
@@ -1177,92 +945,73 @@
      */
     @Test
     public void searchJSONexpansionBug () throws IOException {
-		// Construct index
-		KrillIndex ki = new KrillIndex();
-		// Indexing test files
-		ki.addDoc(
-            getClass().
-            getResourceAsStream("/wiki/00002.json.gz"),
-            true
-        );
-		ki.commit();
-	
-		// Expansion bug
-		// der alte Digraph Aa durch Å
-		String json = getString(
-            getClass().
-            getResource("/queries/bugs/expansion_bug_2.jsonld").
-            getFile()
-        );
-	
-		Result kr = new Krill(json).apply(ki);				
-		assertEquals("... Buchstabe des Alphabetes. In Dänemark ist " +
-                     "[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()
-        );
-	
-		kr = new Krill(json).apply(ki);
-		
-		assertEquals("... Buchstabe des Alphabetes. In Dänemark ist " +
-                     "[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 KrillIndex();
-		for (String i : new String[] {"00001",
-                                      "00002"}) {
-		    ki.addDoc(
-                getClass().
-                getResourceAsStream("/wiki/" + i + ".json.gz"),
-                true
-            );
-		};
-		ki.commit();
-	
-		// Expansion bug
-		// der alte Digraph Aa durch Å
-		json = getString(
-            getClass().
-            getResource("/queries/bugs/expansion_bug_2.jsonld").
-            getFile()
-        );
-	
-		kr = new Krill(json).apply(ki);
-		
-		assertEquals("... Buchstabe des Alphabetes. In Dänemark ist " +
-                     "[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()
-        );
-	
-		kr = new Krill(json).apply(ki);	
-		assertEquals("... Buchstabe des Alphabetes. In Dänemark ist " +
-                     "[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);
+        // Construct index
+        KrillIndex ki = new KrillIndex();
+        // Indexing test files
+        ki.addDoc(getClass().getResourceAsStream("/wiki/00002.json.gz"), true);
+        ki.commit();
+
+        // Expansion bug
+        // der alte Digraph Aa durch Å
+        String json = getString(getClass().getResource(
+                "/queries/bugs/expansion_bug_2.jsonld").getFile());
+
+        Result kr = new Krill(json).apply(ki);
+        assertEquals("... Buchstabe des Alphabetes. In Dänemark ist "
+                + "[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());
+
+        kr = new Krill(json).apply(ki);
+
+        assertEquals("... Buchstabe des Alphabetes. In Dänemark ist "
+                + "[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 KrillIndex();
+        for (String i : new String[] { "00001", "00002" }) {
+            ki.addDoc(
+                    getClass().getResourceAsStream("/wiki/" + i + ".json.gz"),
+                    true);
+        };
+        ki.commit();
+
+        // Expansion bug
+        // der alte Digraph Aa durch Å
+        json = getString(getClass().getResource(
+                "/queries/bugs/expansion_bug_2.jsonld").getFile());
+
+        kr = new Krill(json).apply(ki);
+
+        assertEquals("... Buchstabe des Alphabetes. In Dänemark ist "
+                + "[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());
+
+        kr = new Krill(json).apply(ki);
+        assertEquals("... Buchstabe des Alphabetes. In Dänemark ist "
+                + "[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);
     };
 
 
@@ -1274,18 +1023,11 @@
         // Construct index
         KrillIndex ki = new KrillIndex();
         // Indexing test files
-        for (String i : new String[] {"00001",
-                                      "00002",
-                                      "00003",
-                                      "00004",
-                                      "00005",
-                                      "00006",
-                                      "02439"}) {
+        for (String i : new String[] { "00001", "00002", "00003", "00004",
+                "00005", "00006", "02439" }) {
             ki.addDoc(
-                getClass().
-                getResourceAsStream("/wiki/" + i + ".json.gz"),
-                true
-            );
+                    getClass().getResourceAsStream("/wiki/" + i + ".json.gz"),
+                    true);
         };
         ki.commit();
 
@@ -1293,7 +1035,7 @@
 
         assertEquals(7, kc.numberOf("documents"));
 
-    	HashMap map = kc.getTermRelation("foundries");
+        HashMap map = kc.getTermRelation("foundries");
         assertEquals((long) 7, map.get("-docs"));
         assertEquals((long) 7, map.get("treetagger"));
         assertEquals((long) 6, map.get("opennlp/morpho"));
@@ -1305,50 +1047,35 @@
     @Test
     public void getTextClassDistribution () throws Exception {
         KrillIndex ki = new KrillIndex();
-        ki.addDoc(
-"{" +
-"  \"fields\" : [" +
-"    { \"primaryData\" : \"abc\" },{" +
-"      \"name\" : \"tokens\"," +
-"      \"data\" : [" +
-"         [ \"s:a\", \"i:a\", \"_0#0-1\", \"-:t$<i>3\"]," +
-"         [ \"s:b\", \"i:b\", \"_1#1-2\" ]," +
-"         [ \"s:c\", \"i:c\", \"_2#2-3\" ]]}]," +
-"  \"textClass\" : \"music entertainment\"" +
-"}"
-        );
+        ki.addDoc("{" + "  \"fields\" : ["
+                + "    { \"primaryData\" : \"abc\" },{"
+                + "      \"name\" : \"tokens\"," + "      \"data\" : ["
+                + "         [ \"s:a\", \"i:a\", \"_0#0-1\", \"-:t$<i>3\"],"
+                + "         [ \"s:b\", \"i:b\", \"_1#1-2\" ],"
+                + "         [ \"s:c\", \"i:c\", \"_2#2-3\" ]]}],"
+                + "  \"textClass\" : \"music entertainment\"" + "}");
 
-        ki.addDoc(
-"{" +
-"  \"fields\" : [" +
-"    { \"primaryData\" : \"abc\" },{" +
-"      \"name\" : \"tokens\"," +
-"      \"data\" : [" +
-"         [ \"s:a\", \"i:a\", \"_0#0-1\", \"-:t$<i>3\"]," +
-"         [ \"s:b\", \"i:b\", \"_1#1-2\" ]," +
-"         [ \"s:c\", \"i:c\", \"_2#2-3\" ]]}]," +
-"  \"textClass\" : \"music singing\"" +
-"}"
-        );
+        ki.addDoc("{" + "  \"fields\" : ["
+                + "    { \"primaryData\" : \"abc\" },{"
+                + "      \"name\" : \"tokens\"," + "      \"data\" : ["
+                + "         [ \"s:a\", \"i:a\", \"_0#0-1\", \"-:t$<i>3\"],"
+                + "         [ \"s:b\", \"i:b\", \"_1#1-2\" ],"
+                + "         [ \"s:c\", \"i:c\", \"_2#2-3\" ]]}],"
+                + "  \"textClass\" : \"music singing\"" + "}");
 
-        ki.addDoc(
-"{" +
-"  \"fields\" : [" +
-"    { \"primaryData\" : \"abc\" },{" +
-"      \"name\" : \"tokens\"," +
-"      \"data\" : [" +
-"         [ \"s:a\", \"i:a\", \"_0#0-1\", \"-:t$<i>3\"]," +
-"         [ \"s:b\", \"i:b\", \"_1#1-2\" ]," +
-"         [ \"s:c\", \"i:c\", \"_2#2-3\" ]]}]," +
-"  \"textClass\" : \"music entertainment jumping\"" +
-"}"
-        );
+        ki.addDoc("{" + "  \"fields\" : ["
+                + "    { \"primaryData\" : \"abc\" },{"
+                + "      \"name\" : \"tokens\"," + "      \"data\" : ["
+                + "         [ \"s:a\", \"i:a\", \"_0#0-1\", \"-:t$<i>3\"],"
+                + "         [ \"s:b\", \"i:b\", \"_1#1-2\" ],"
+                + "         [ \"s:c\", \"i:c\", \"_2#2-3\" ]]}],"
+                + "  \"textClass\" : \"music entertainment jumping\"" + "}");
         ki.commit();
 
         KrillCollection kc = new KrillCollection(ki);
         assertEquals(3, kc.numberOf("documents"));
 
-    	HashMap map = kc.getTermRelation("textClass");
+        HashMap map = kc.getTermRelation("textClass");
         assertEquals((long) 1, map.get("singing"));
         assertEquals((long) 1, map.get("jumping"));
         assertEquals((long) 3, map.get("music"));
@@ -1361,7 +1088,7 @@
         assertEquals((long) 1, map.get("#__jumping:###:music"));
         assertEquals((long) 1, map.get("#__music:###:singing"));
         assertEquals(11, map.size());
-        
+
         // System.err.println(kc.getTermRelationJSON("textClass"));
     };
 
@@ -1369,64 +1096,44 @@
     @Test
     public void getTextClassDistribution2 () throws Exception {
         KrillIndex ki = new KrillIndex();
-        ki.addDoc(
-"{" +
-"  \"fields\" : [" +
-"    { \"primaryData\" : \"abc\" },{" +
-"      \"name\" : \"tokens\"," +
-"      \"data\" : [" +
-"         [ \"s:a\", \"i:a\", \"_0#0-1\", \"-:t$<i>3\"]," +
-"         [ \"s:b\", \"i:b\", \"_1#1-2\" ]," +
-"         [ \"s:c\", \"i:c\", \"_2#2-3\" ]]}]," +
-"  \"textClass\" : \"\"" +
-"}"
-        );
+        ki.addDoc("{" + "  \"fields\" : ["
+                + "    { \"primaryData\" : \"abc\" },{"
+                + "      \"name\" : \"tokens\"," + "      \"data\" : ["
+                + "         [ \"s:a\", \"i:a\", \"_0#0-1\", \"-:t$<i>3\"],"
+                + "         [ \"s:b\", \"i:b\", \"_1#1-2\" ],"
+                + "         [ \"s:c\", \"i:c\", \"_2#2-3\" ]]}],"
+                + "  \"textClass\" : \"\"" + "}");
         ki.commit();
-        ki.addDoc(
-"{" +
-"  \"fields\" : [" +
-"    { \"primaryData\" : \"abc\" },{" +
-"      \"name\" : \"tokens\"," +
-"      \"data\" : [" +
-"         [ \"s:a\", \"i:a\", \"_0#0-1\", \"-:t$<i>3\"]," +
-"         [ \"s:b\", \"i:b\", \"_1#1-2\" ]," +
-"         [ \"s:c\", \"i:c\", \"_2#2-3\" ]]}]," +
-"  \"textClass\" : \"music entertainment\"" +
-"}"
-        );
+        ki.addDoc("{" + "  \"fields\" : ["
+                + "    { \"primaryData\" : \"abc\" },{"
+                + "      \"name\" : \"tokens\"," + "      \"data\" : ["
+                + "         [ \"s:a\", \"i:a\", \"_0#0-1\", \"-:t$<i>3\"],"
+                + "         [ \"s:b\", \"i:b\", \"_1#1-2\" ],"
+                + "         [ \"s:c\", \"i:c\", \"_2#2-3\" ]]}],"
+                + "  \"textClass\" : \"music entertainment\"" + "}");
 
         ki.commit();
-        ki.addDoc(
-"{" +
-"  \"fields\" : [" +
-"    { \"primaryData\" : \"abc\" },{" +
-"      \"name\" : \"tokens\"," +
-"      \"data\" : [" +
-"         [ \"s:a\", \"i:a\", \"_0#0-1\", \"-:t$<i>3\"]," +
-"         [ \"s:b\", \"i:b\", \"_1#1-2\" ]," +
-"         [ \"s:c\", \"i:c\", \"_2#2-3\" ]]}]," +
-"  \"textClass\" : \"music singing\"" +
-"}"
-        );
+        ki.addDoc("{" + "  \"fields\" : ["
+                + "    { \"primaryData\" : \"abc\" },{"
+                + "      \"name\" : \"tokens\"," + "      \"data\" : ["
+                + "         [ \"s:a\", \"i:a\", \"_0#0-1\", \"-:t$<i>3\"],"
+                + "         [ \"s:b\", \"i:b\", \"_1#1-2\" ],"
+                + "         [ \"s:c\", \"i:c\", \"_2#2-3\" ]]}],"
+                + "  \"textClass\" : \"music singing\"" + "}");
 
-        ki.addDoc(
-"{" +
-"  \"fields\" : [" +
-"    { \"primaryData\" : \"abc\" },{" +
-"      \"name\" : \"tokens\"," +
-"      \"data\" : [" +
-"         [ \"s:a\", \"i:a\", \"_0#0-1\", \"-:t$<i>3\"]," +
-"         [ \"s:b\", \"i:b\", \"_1#1-2\" ]," +
-"         [ \"s:c\", \"i:c\", \"_2#2-3\" ]]}]," +
-"  \"textClass\" : \"music entertainment jumping\"" +
-"}"
-        );
+        ki.addDoc("{" + "  \"fields\" : ["
+                + "    { \"primaryData\" : \"abc\" },{"
+                + "      \"name\" : \"tokens\"," + "      \"data\" : ["
+                + "         [ \"s:a\", \"i:a\", \"_0#0-1\", \"-:t$<i>3\"],"
+                + "         [ \"s:b\", \"i:b\", \"_1#1-2\" ],"
+                + "         [ \"s:c\", \"i:c\", \"_2#2-3\" ]]}],"
+                + "  \"textClass\" : \"music entertainment jumping\"" + "}");
         ki.commit();
 
         KrillCollection kc = new KrillCollection(ki);
         assertEquals(4, kc.numberOf("documents"));
 
-    	HashMap map = kc.getTermRelation("textClass");
+        HashMap map = kc.getTermRelation("textClass");
         assertEquals((long) 1, map.get("singing"));
         assertEquals((long) 1, map.get("jumping"));
         assertEquals((long) 3, map.get("music"));
diff --git a/src/test/java/de/ids_mannheim/korap/search/TestMetaFields.java b/src/test/java/de/ids_mannheim/korap/search/TestMetaFields.java
index 70480b7..490148b 100644
--- a/src/test/java/de/ids_mannheim/korap/search/TestMetaFields.java
+++ b/src/test/java/de/ids_mannheim/korap/search/TestMetaFields.java
@@ -35,25 +35,23 @@
         // Construct index
         KrillIndex ki = new KrillIndex();
         // Indexing test files
-        for (String i : new String[] {"00001",
-                                      "00002"}) {
+        for (String i : new String[] { "00001", "00002" }) {
             ki.addDoc(
-                getClass().getResourceAsStream("/wiki/" + i + ".json.gz"), true
-            );
+                    getClass().getResourceAsStream("/wiki/" + i + ".json.gz"),
+                    true);
         };
         ki.commit();
 
-        String jsonString = getString(
-            getClass().getResource("/queries/metas/fields.jsonld").getFile()
-        );
-	
+        String jsonString = getString(getClass().getResource(
+                "/queries/metas/fields.jsonld").getFile());
+
         Krill ks = new Krill(jsonString);
 
         Result kr = ks.apply(ki);
         assertEquals((long) 17, kr.getTotalResults());
         assertEquals(0, kr.getStartIndex());
         assertEquals(9, kr.getItemsPerPage());
-        
+
         ObjectMapper mapper = new ObjectMapper();
         JsonNode res = mapper.readTree(kr.toJsonString());
         assertEquals(0, res.at("/matches/0/UID").asInt());
@@ -71,24 +69,25 @@
         assertEquals("", res.at("/matches/0/layerInfo").asText());
         assertEquals("", res.at("/matches/0/tokenization").asText());
 
-        jsonString = getString(
-            getClass().getResource("/queries/metas/fields_2.jsonld").getFile()
-        );
+        jsonString = getString(getClass().getResource(
+                "/queries/metas/fields_2.jsonld").getFile());
         ks = new Krill(jsonString);
         kr = ks.apply(ki);
         assertEquals((long) 17, kr.getTotalResults());
         assertEquals(0, kr.getStartIndex());
         assertEquals(2, kr.getItemsPerPage());
-        
+
         mapper = new ObjectMapper();
         res = mapper.readTree(kr.toJsonString());
         assertEquals(0, res.at("/matches/0/UID").asInt());
         assertEquals("", res.at("/matches/0/corpusID").asText());
-        assertEquals("Ruru,Jens.Ol,Aglarech", res.at("/matches/0/author").asText());
+        assertEquals("Ruru,Jens.Ol,Aglarech", res.at("/matches/0/author")
+                .asText());
         assertEquals("A", res.at("/matches/0/title").asText());
         assertEquals("WPD_AAA.00001", res.at("/matches/0/docID").asText());
         assertEquals("", res.at("/matches/0/textSigle").asText());
-        assertEquals("match-WPD_AAA.00001-p6-7", res.at("/matches/0/ID").asText());
+        assertEquals("match-WPD_AAA.00001-p6-7", res.at("/matches/0/ID")
+                .asText());
         assertEquals("", res.at("/matches/0/subTitle").asText());
         assertEquals("", res.at("/matches/0/textClass").asText());
         assertEquals("", res.at("/matches/0/pubPlace").asText());
diff --git a/src/test/java/de/ids_mannheim/korap/search/TestResult.java b/src/test/java/de/ids_mannheim/korap/search/TestResult.java
index cce192d..dd391e3 100644
--- a/src/test/java/de/ids_mannheim/korap/search/TestResult.java
+++ b/src/test/java/de/ids_mannheim/korap/search/TestResult.java
@@ -1,4 +1,3 @@
-
 package de.ids_mannheim.korap.search;
 
 import java.util.*;
@@ -31,35 +30,28 @@
 public class TestResult {
 
     @Test
-    public void checkJSONResult () throws Exception  {
+    public void checkJSONResult () throws Exception {
         KrillIndex ki = new KrillIndex();
         FieldDocument fd = new FieldDocument();
         fd.addString("ID", "doc-1");
         fd.addString("UID", "1");
-        fd.addTV("base",
-                 "abab",
-                 "[(0-1)s:a|i:a|_0#0-1|-:t$<i>4]" +
-                 "[(1-2)s:b|i:b|_1#1-2]" +
-                 "[(2-3)s:a|i:c|_2#2-3]" +
-                 "[(3-4)s:b|i:a|_3#3-4]");
+        fd.addTV("base", "abab", "[(0-1)s:a|i:a|_0#0-1|-:t$<i>4]"
+                + "[(1-2)s:b|i:b|_1#1-2]" + "[(2-3)s:a|i:c|_2#2-3]"
+                + "[(3-4)s:b|i:a|_3#3-4]");
         ki.addDoc(fd);
         fd = new FieldDocument();
         fd.addString("ID", "doc-2");
         fd.addString("UID", "2");
-        fd.addTV("base",
-                 "aba",
-                 "[(0-1)s:a|i:a|_0#0-1|-:t$<i>3]" +
-                 "[(1-2)s:b|i:b|_1#1-2]" +
-                 "[(2-3)s:a|i:c|_2#2-3]");
+        fd.addTV("base", "aba", "[(0-1)s:a|i:a|_0#0-1|-:t$<i>3]"
+                + "[(1-2)s:b|i:b|_1#1-2]" + "[(2-3)s:a|i:c|_2#2-3]");
         ki.addDoc(fd);
 
         // Commit!
         ki.commit();
 
         QueryBuilder kq = new QueryBuilder("base");
-        SpanQuery q = (SpanQuery) kq.or(
-            kq._(1, kq.seg("s:a"))).or(kq._(2, kq.seg("s:b"))
-        ).toQuery();
+        SpanQuery q = (SpanQuery) kq.or(kq._(1, kq.seg("s:a")))
+                .or(kq._(2, kq.seg("s:b"))).toQuery();
         Result kr = ki.search(q);
         assertEquals((long) 7, kr.getTotalResults());
 
@@ -67,7 +59,7 @@
         JsonNode res = mapper.readTree(kr.toJsonString());
         assertEquals(7, res.at("/totalResults").asInt());
         assertEquals("spanOr([{1: base:s:a}, {2: base:s:b}])",
-                     res.at("/serialQuery").asText());
+                res.at("/serialQuery").asText());
         assertEquals(0, res.at("/startIndex").asInt());
         assertEquals(25, res.at("/itemsPerPage").asInt());
         assertEquals("token", res.at("/context/left/0").asText());
@@ -84,7 +76,9 @@
         assertEquals(1, res.at("/matches/0/UID").asInt());
         assertEquals("doc-1", res.at("/matches/0/docID").asText());
         assertEquals("match-doc-1-p0-1(1)0-0", res.at("/matches/0/ID").asText());
-        assertEquals("<span class=\"context-left\"></span><mark><mark class=\"class-1 level-0\">a</mark></mark><span class=\"context-right\">bab</span>", res.at("/matches/0/snippet").asText());
+        assertEquals(
+                "<span class=\"context-left\"></span><mark><mark class=\"class-1 level-0\">a</mark></mark><span class=\"context-right\">bab</span>",
+                res.at("/matches/0/snippet").asText());
 
         assertEquals("base", res.at("/matches/6/field").asText());
         /*
@@ -95,25 +89,26 @@
         assertEquals(2, res.at("/matches/6/UID").asInt());
         assertEquals("doc-2", res.at("/matches/6/docID").asText());
         assertEquals("match-doc-2-p2-3(1)2-2", res.at("/matches/6/ID").asText());
-        assertEquals("<span class=\"context-left\">ab</span><mark><mark class=\"class-1 level-0\">a</mark></mark><span class=\"context-right\"></span>", res.at("/matches/6/snippet").asText());
+        assertEquals(
+                "<span class=\"context-left\">ab</span><mark><mark class=\"class-1 level-0\">a</mark></mark><span class=\"context-right\"></span>",
+                res.at("/matches/6/snippet").asText());
     };
 
+
     @Test
-    public void checkJSONResultWarningBug () throws Exception  {
+    public void checkJSONResultWarningBug () throws Exception {
         KrillIndex ki = new KrillIndex();
         FieldDocument fd = new FieldDocument();
         fd.addString("ID", "doc-1");
         fd.addString("UID", "1");
-        fd.addTV("tokens",
-                 "abab",
-                 "[(0-1)s:a|i:a|_0#0-1|-:t$<i>4]" +
-                 "[(1-2)s:b|i:b|_1#1-2]" +
-                 "[(2-3)s:a|i:c|_2#2-3]" +
-                 "[(3-4)s:b|i:a|_3#3-4]");
+        fd.addTV("tokens", "abab", "[(0-1)s:a|i:a|_0#0-1|-:t$<i>4]"
+                + "[(1-2)s:b|i:b|_1#1-2]" + "[(2-3)s:a|i:c|_2#2-3]"
+                + "[(3-4)s:b|i:a|_3#3-4]");
         ki.addDoc(fd);
         ki.commit();
 
-        String json = getString(getClass().getResource("/queries/bugs/optionality_warning.jsonld").getFile());
+        String json = getString(getClass().getResource(
+                "/queries/bugs/optionality_warning.jsonld").getFile());
         Krill ks = new Krill(json);
 
         Result kr = ks.apply(ki);
@@ -124,40 +119,33 @@
 
         // Old:
         // assertEquals("Optionality of query is ignored", res.at("/warning").asText());
-        assertEquals("Optionality of query is ignored",
-                     res.at("/warnings/0/1").asText());
+        assertEquals("Optionality of query is ignored", res.at("/warnings/0/1")
+                .asText());
     };
 
 
     @Test
-    public void checkJSONResultForJSONInput () throws Exception  {
+    public void checkJSONResultForJSONInput () throws Exception {
         KrillIndex ki = new KrillIndex();
         FieldDocument fd = new FieldDocument();
         fd.addString("ID", "doc-1");
         fd.addString("UID", "1");
-        fd.addTV("tokens",
-                 "abab",
-                 "[(0-1)s:a|i:a|_0#0-1|-:t$<i>4]" +
-                 "[(1-2)s:b|i:b|_1#1-2]" +
-                 "[(2-3)s:a|i:c|_2#2-3]" +
-                 "[(3-4)s:b|i:a|_3#3-4]");
+        fd.addTV("tokens", "abab", "[(0-1)s:a|i:a|_0#0-1|-:t$<i>4]"
+                + "[(1-2)s:b|i:b|_1#1-2]" + "[(2-3)s:a|i:c|_2#2-3]"
+                + "[(3-4)s:b|i:a|_3#3-4]");
         ki.addDoc(fd);
         fd = new FieldDocument();
         fd.addString("ID", "doc-2");
         fd.addString("UID", "2");
-        fd.addTV("tokens",
-                 "aba",
-                 "[(0-1)s:a|i:a|_0#0-1|-:t$<i>3]" +
-                 "[(1-2)s:b|i:b|_1#1-2]" +
-                 "[(2-3)s:a|i:c|_2#2-3]");
+        fd.addTV("tokens", "aba", "[(0-1)s:a|i:a|_0#0-1|-:t$<i>3]"
+                + "[(1-2)s:b|i:b|_1#1-2]" + "[(2-3)s:a|i:c|_2#2-3]");
         ki.addDoc(fd);
-    
+
         // Commit!
         ki.commit();
 
-        String json = getString(
-            getClass().getResource("/queries/bsp-result-check.jsonld").getFile()
-        );
+        String json = getString(getClass().getResource(
+                "/queries/bsp-result-check.jsonld").getFile());
         Krill ks = new Krill(json);
         Result kr = ks.apply(ki);
         assertEquals((long) 7, kr.getTotalResults());
@@ -166,7 +154,8 @@
         JsonNode res = mapper.readTree(kr.toJsonString());
 
         assertEquals(7, res.at("/totalResults").asInt());
-        assertEquals("spanOr([tokens:s:a, tokens:s:b])", res.at("/serialQuery").asText());
+        assertEquals("spanOr([tokens:s:a, tokens:s:b])", res.at("/serialQuery")
+                .asText());
         assertEquals(5, res.at("/itemsPerPage").asInt());
         assertEquals(0, res.at("/startIndex").asInt());
         assertEquals(1, res.at("/request/meta/startPage").asInt());
@@ -177,61 +166,69 @@
         assertEquals(6, res.at("/request/meta/context/right/1").asInt());
 
         assertEquals("koral:group", res.at("/request/query/@type").asText());
-        assertEquals("operation:or", res.at("/request/query/operation").asText());
+        assertEquals("operation:or", res.at("/request/query/operation")
+                .asText());
 
-        assertEquals("koral:token", res.at("/request/query/operands/0/@type").asText());
-        assertEquals("koral:term", res.at("/request/query/operands/0/wrap/@type").asText());
-        assertEquals("orth", res.at("/request/query/operands/0/wrap/layer").asText());
+        assertEquals("koral:token", res.at("/request/query/operands/0/@type")
+                .asText());
+        assertEquals("koral:term",
+                res.at("/request/query/operands/0/wrap/@type").asText());
+        assertEquals("orth", res.at("/request/query/operands/0/wrap/layer")
+                .asText());
         assertEquals("a", res.at("/request/query/operands/0/wrap/key").asText());
-        assertEquals("match:eq", res.at("/request/query/operands/0/wrap/match").asText());
+        assertEquals("match:eq", res.at("/request/query/operands/0/wrap/match")
+                .asText());
 
-        assertEquals("koral:token", res.at("/request/query/operands/1/@type").asText());
-        assertEquals("koral:term", res.at("/request/query/operands/1/wrap/@type").asText());
-        assertEquals("orth", res.at("/request/query/operands/1/wrap/layer").asText());
+        assertEquals("koral:token", res.at("/request/query/operands/1/@type")
+                .asText());
+        assertEquals("koral:term",
+                res.at("/request/query/operands/1/wrap/@type").asText());
+        assertEquals("orth", res.at("/request/query/operands/1/wrap/layer")
+                .asText());
         assertEquals("b", res.at("/request/query/operands/1/wrap/key").asText());
-        assertEquals("match:eq", res.at("/request/query/operands/1/wrap/match").asText());
+        assertEquals("match:eq", res.at("/request/query/operands/1/wrap/match")
+                .asText());
 
         assertEquals(1, res.at("/matches/0/UID").asInt());
         assertEquals("doc-1", res.at("/matches/0/docID").asText());
         assertEquals("match-doc-1-p0-1", res.at("/matches/0/ID").asText());
-        assertEquals("<span class=\"context-left\"></span><mark>a</mark><span class=\"context-right\">bab</span>", res.at("/matches/0/snippet").asText());
+        assertEquals(
+                "<span class=\"context-left\"></span><mark>a</mark><span class=\"context-right\">bab</span>",
+                res.at("/matches/0/snippet").asText());
     };
 
+
     @Test
-    public void checkJSONTokenResult () throws Exception  {
+    public void checkJSONTokenResult () throws Exception {
         KrillIndex ki = new KrillIndex();
         FieldDocument fd = new FieldDocument();
         fd.addString("ID", "doc-1");
         fd.addString("UID", "1");
-        fd.addTV("base",
-                 "abab",
-                 "[(0-1)s:a|i:a|_0#0-1|-:t$<i>4]" +
-                 "[(1-2)s:b|i:b|_1#1-2]" +
-                 "[(2-3)s:a|i:c|_2#2-3]" +
-                 "[(3-4)s:b|i:a|_3#3-4]");
+        fd.addTV("base", "abab", "[(0-1)s:a|i:a|_0#0-1|-:t$<i>4]"
+                + "[(1-2)s:b|i:b|_1#1-2]" + "[(2-3)s:a|i:c|_2#2-3]"
+                + "[(3-4)s:b|i:a|_3#3-4]");
         ki.addDoc(fd);
         fd = new FieldDocument();
         fd.addString("ID", "doc-2");
         fd.addString("UID", "2");
-        fd.addTV("base",
-                 "aba",
-                 "[(0-1)s:a|i:a|_0#0-1|-:t$<i>3]" +
-                 "[(1-2)s:b|i:b|_1#1-2]" +
-                 "[(2-3)s:a|i:c|_2#2-3]");
+        fd.addTV("base", "aba", "[(0-1)s:a|i:a|_0#0-1|-:t$<i>3]"
+                + "[(1-2)s:b|i:b|_1#1-2]" + "[(2-3)s:a|i:c|_2#2-3]");
         ki.addDoc(fd);
-        
+
         // Commit!
         ki.commit();
 
         QueryBuilder kq = new QueryBuilder("base");
-        SpanQuery q = (SpanQuery) kq.seq(kq.seg("s:a")).append(kq.seg("s:b")).toQuery();
+        SpanQuery q = (SpanQuery) kq.seq(kq.seg("s:a")).append(kq.seg("s:b"))
+                .toQuery();
         Result kr = ki.search(q);
 
         assertEquals((long) 3, kr.getTotalResults());
         ObjectMapper mapper = new ObjectMapper();
         JsonNode res = mapper.readTree(kr.toTokenListJsonString());
         assertEquals(3, res.at("/totalResults").asInt());
-        assertEquals("spanNext(base:s:a, base:s:b)", res.at("/serialQuery").asText());
+        assertEquals("spanNext(base:s:a, base:s:b)", res.at("/serialQuery")
+                .asText());
         assertEquals(0, res.at("/startIndex").asInt());
         assertEquals(25, res.at("/itemsPerPage").asInt());
 
@@ -253,7 +250,8 @@
         assertEquals(1, res.at("/matches/2/tokens/1/0").asInt());
         assertEquals(2, res.at("/matches/2/tokens/1/1").asInt());
     };
-    
+
+
     public static String getString (String path) {
         StringBuilder contentBuilder = new StringBuilder();
         try {
@@ -263,7 +261,8 @@
                 contentBuilder.append(str);
             };
             in.close();
-        } catch (IOException e) {
+        }
+        catch (IOException e) {
             fail(e.getMessage());
         }
         return contentBuilder.toString();
diff --git a/src/test/java/de/ids_mannheim/korap/server/TestDatabase.java b/src/test/java/de/ids_mannheim/korap/server/TestDatabase.java
index e86e2c1..36dfac2 100644
--- a/src/test/java/de/ids_mannheim/korap/server/TestDatabase.java
+++ b/src/test/java/de/ids_mannheim/korap/server/TestDatabase.java
@@ -23,8 +23,9 @@
     private Connection conn;
     private Statement stat;
 
+
     @Before
-    public void setUp() throws Exception {
+    public void setUp () throws Exception {
         Class.forName("org.sqlite.JDBC");
         conn = DriverManager.getConnection("jdbc:sqlite::memory:");
         this.stat = conn.createStatement();
@@ -32,38 +33,39 @@
         conn.setAutoCommit(false);
     };
 
+
     @Test
     public void TestDatabase () throws Exception {
-	PreparedStatement prep = this.conn.prepareStatement(
-	  "INSERT INTO people VALUES (?, ?);"
-        );
+        PreparedStatement prep = this.conn
+                .prepareStatement("INSERT INTO people VALUES (?, ?);");
 
-	prep.setString(1, "Peter");
-	prep.setString(2, "24");
-	prep.addBatch();
+        prep.setString(1, "Peter");
+        prep.setString(2, "24");
+        prep.addBatch();
 
-	prep.setString(1, "Klaus");
-	prep.setString(2, "31");
-	prep.addBatch();
+        prep.setString(1, "Klaus");
+        prep.setString(2, "31");
+        prep.addBatch();
 
-	prep.executeBatch();
-	conn.setAutoCommit(true);
+        prep.executeBatch();
+        conn.setAutoCommit(true);
 
-	ResultSet rs = stat.executeQuery("SELECT * FROM people;");
+        ResultSet rs = stat.executeQuery("SELECT * FROM people;");
 
-	rs.next();
-	
-	assertEquals(rs.getString("name"), "Peter");
-	assertEquals(rs.getInt("age"), 24);
+        rs.next();
 
-	rs.next();
+        assertEquals(rs.getString("name"), "Peter");
+        assertEquals(rs.getInt("age"), 24);
 
-	assertEquals(rs.getString("name"), "Klaus");
-	assertEquals(rs.getInt("age"), 31);
+        rs.next();
 
-	rs.close();
+        assertEquals(rs.getString("name"), "Klaus");
+        assertEquals(rs.getInt("age"), 31);
+
+        rs.close();
     };
 
+
     /*
      * The following tests don't work well with in-memory dbs and
      * temporary dbs - should be improved
@@ -71,143 +73,142 @@
 
     @Test
     public void TestDatabasePool () throws Exception {
-	ComboPooledDataSource cpds = new ComboPooledDataSource();
-	// Connect to a temporary file instead of a in-memory file
-	cpds.setDriverClass("org.sqlite.JDBC");
-	cpds.setJdbcUrl("jdbc:sqlite:");
-	cpds.setMaxStatements(100);
+        ComboPooledDataSource cpds = new ComboPooledDataSource();
+        // Connect to a temporary file instead of a in-memory file
+        cpds.setDriverClass("org.sqlite.JDBC");
+        cpds.setJdbcUrl("jdbc:sqlite:");
+        cpds.setMaxStatements(100);
 
-	// This is part of the match collector
-	this.conn = cpds.getConnection();
-	conn.setAutoCommit(false);
-	this.stat = conn.createStatement();
-	stat.executeUpdate(
-            "CREATE TABLE IF NOT EXISTS result_a (text_id INTEGER, match_count INTEGER);"
-	);
-	// conn.setAutoCommit(false);
-	PreparedStatement prep = this.conn.prepareStatement(
-	  "INSERT INTO result_a VALUES (?, ?);"
-        );
-	prep.setInt(1, 5);
-	prep.setInt(2, 8000);
-	prep.addBatch();
-	prep.executeBatch();
+        // This is part of the match collector
+        this.conn = cpds.getConnection();
+        conn.setAutoCommit(false);
+        this.stat = conn.createStatement();
+        stat.executeUpdate("CREATE TABLE IF NOT EXISTS result_a (text_id INTEGER, match_count INTEGER);");
+        // conn.setAutoCommit(false);
+        PreparedStatement prep = this.conn
+                .prepareStatement("INSERT INTO result_a VALUES (?, ?);");
+        prep.setInt(1, 5);
+        prep.setInt(2, 8000);
+        prep.addBatch();
+        prep.executeBatch();
 
-	ResultSet rs = stat.executeQuery("SELECT * FROM result_a;");
-	rs.next();
-	assertEquals(rs.getInt("text_id"), 5);
-	assertEquals(rs.getInt("match_count"), 8000);
-	rs.close();
+        ResultSet rs = stat.executeQuery("SELECT * FROM result_a;");
+        rs.next();
+        assertEquals(rs.getInt("text_id"), 5);
+        assertEquals(rs.getInt("match_count"), 8000);
+        rs.close();
 
-	MatchCollectorDB mc = new MatchCollectorDB(2000, "result_a");
-	mc.setDBPool("sqlite", cpds, this.conn);
+        MatchCollectorDB mc = new MatchCollectorDB(2000, "result_a");
+        mc.setDBPool("sqlite", cpds, this.conn);
 
-	mc.add(9, 5000);
-	mc.add(12, 6785);
-	mc.add(39, 56576);
+        mc.add(9, 5000);
+        mc.add(12, 6785);
+        mc.add(39, 56576);
 
-	mc.close(false);
+        mc.close(false);
 
-	rs = stat.executeQuery("SELECT * FROM result_a;");
-	assertTrue(rs.next());
-	assertEquals(rs.getInt("text_id"), 5);
-	assertEquals(rs.getInt("match_count"), 8000);
-	rs.next();
-	assertEquals(rs.getInt("text_id"), 9);
-	assertEquals(rs.getInt("match_count"), 5000);
-	rs.next();
-	assertEquals(rs.getInt("text_id"), 12);
-	assertEquals(rs.getInt("match_count"), 6785);
-	rs.next();
-	assertEquals(rs.getInt("text_id"), 39);
-	assertEquals(rs.getInt("match_count"), 56576);
-	
-	rs.close();
+        rs = stat.executeQuery("SELECT * FROM result_a;");
+        assertTrue(rs.next());
+        assertEquals(rs.getInt("text_id"), 5);
+        assertEquals(rs.getInt("match_count"), 8000);
+        rs.next();
+        assertEquals(rs.getInt("text_id"), 9);
+        assertEquals(rs.getInt("match_count"), 5000);
+        rs.next();
+        assertEquals(rs.getInt("text_id"), 12);
+        assertEquals(rs.getInt("match_count"), 6785);
+        rs.next();
+        assertEquals(rs.getInt("text_id"), 39);
+        assertEquals(rs.getInt("match_count"), 56576);
+
+        rs.close();
     };
 
+
     @Test
     public void TestDatabasePoolCollector () throws Exception {
-	ComboPooledDataSource cpds = new ComboPooledDataSource();
-	// Connect to a temporary file instead of a in-memory file
-	cpds.setDriverClass("org.sqlite.JDBC");
-	cpds.setJdbcUrl("jdbc:sqlite:");
-	cpds.setMaxStatements(100);
+        ComboPooledDataSource cpds = new ComboPooledDataSource();
+        // Connect to a temporary file instead of a in-memory file
+        cpds.setDriverClass("org.sqlite.JDBC");
+        cpds.setJdbcUrl("jdbc:sqlite:");
+        cpds.setMaxStatements(100);
 
-	// This is part of the match collector
-	conn = cpds.getConnection();
-	conn.setAutoCommit(false);
-	Statement stat = conn.createStatement();
-	stat.executeUpdate(
-            "CREATE TABLE IF NOT EXISTS matchXYZ (text_id INTEGER, match_count INTEGER);"
-	);
-	conn.commit();
-	stat.close();
+        // This is part of the match collector
+        conn = cpds.getConnection();
+        conn.setAutoCommit(false);
+        Statement stat = conn.createStatement();
+        stat.executeUpdate("CREATE TABLE IF NOT EXISTS matchXYZ (text_id INTEGER, match_count INTEGER);");
+        conn.commit();
+        stat.close();
 
-	MatchCollectorDB mc = new MatchCollectorDB(3, "matchXYZ");
-	mc.setDBPool("sqlite", cpds, conn);
+        MatchCollectorDB mc = new MatchCollectorDB(3, "matchXYZ");
+        mc.setDBPool("sqlite", cpds, conn);
 
-	mc.add(9, 5000);
-	mc.add(12, 6785);
-	mc.add(39, 56576);
-	// First commit
+        mc.add(9, 5000);
+        mc.add(12, 6785);
+        mc.add(39, 56576);
+        // First commit
 
-	mc.add(45, 5000);
-	mc.add(67, 6785);
-	mc.add(81, 56576);
-	// Second commit
+        mc.add(45, 5000);
+        mc.add(67, 6785);
+        mc.add(81, 56576);
+        // Second commit
 
-	mc.add(94, 456);
-	mc.close(false);
-	// Final commit
+        mc.add(94, 456);
+        mc.close(false);
+        // Final commit
 
-	// conn = cpds.getConnection();
-	stat = conn.createStatement();
-	ResultSet rs = stat.executeQuery("SELECT count('*') AS num FROM matchXYZ;");
+        // conn = cpds.getConnection();
+        stat = conn.createStatement();
+        ResultSet rs = stat
+                .executeQuery("SELECT count('*') AS num FROM matchXYZ;");
 
-	assertEquals(7, rs.getInt("num"));
+        assertEquals(7, rs.getInt("num"));
 
-	rs = stat.executeQuery("SELECT text_id, match_count FROM matchXYZ;");
-	assertTrue(rs.next());
+        rs = stat.executeQuery("SELECT text_id, match_count FROM matchXYZ;");
+        assertTrue(rs.next());
 
-	assertEquals(rs.getInt("text_id"), 9);
-	assertEquals(rs.getInt("match_count"), 5000);
-	assertTrue(rs.next());
-	assertEquals(rs.getInt("text_id"), 12);
-	assertEquals(rs.getInt("match_count"), 6785);
-	assertTrue(rs.next());
-	assertEquals(rs.getInt("text_id"), 39);
-	assertEquals(rs.getInt("match_count"), 56576);
-	assertTrue(rs.next());
-	assertEquals(rs.getInt("text_id"), 45);
-	assertEquals(rs.getInt("match_count"), 5000);
-	assertTrue(rs.next());
-	assertEquals(rs.getInt("text_id"), 67);
-	assertEquals(rs.getInt("match_count"), 6785);
-	assertTrue(rs.next());
-	assertEquals(rs.getInt("text_id"), 81);
-	assertEquals(rs.getInt("match_count"), 56576);
-	assertTrue(rs.next());
-	assertEquals(rs.getInt("text_id"), 94);
-	assertEquals(rs.getInt("match_count"), 456);
-	assertFalse(rs.next());
+        assertEquals(rs.getInt("text_id"), 9);
+        assertEquals(rs.getInt("match_count"), 5000);
+        assertTrue(rs.next());
+        assertEquals(rs.getInt("text_id"), 12);
+        assertEquals(rs.getInt("match_count"), 6785);
+        assertTrue(rs.next());
+        assertEquals(rs.getInt("text_id"), 39);
+        assertEquals(rs.getInt("match_count"), 56576);
+        assertTrue(rs.next());
+        assertEquals(rs.getInt("text_id"), 45);
+        assertEquals(rs.getInt("match_count"), 5000);
+        assertTrue(rs.next());
+        assertEquals(rs.getInt("text_id"), 67);
+        assertEquals(rs.getInt("match_count"), 6785);
+        assertTrue(rs.next());
+        assertEquals(rs.getInt("text_id"), 81);
+        assertEquals(rs.getInt("match_count"), 56576);
+        assertTrue(rs.next());
+        assertEquals(rs.getInt("text_id"), 94);
+        assertEquals(rs.getInt("match_count"), 456);
+        assertFalse(rs.next());
 
-	stat.close();
+        stat.close();
     };
 
+
     @Test
     public void TestMatchCollectorDB () throws Exception {
-	MatchCollector mc = new MatchCollectorDB(2000, "matchXYZ");
-	mc.add(5,7);
-	mc.add(8,2);
-	mc.add(9,10);
-	mc.add(16,90);
-	mc.commit();
-	assertEquals(mc.getTotalResults(), 109);
-	assertEquals(mc.getTotalResultDocs(), 4);
+        MatchCollector mc = new MatchCollectorDB(2000, "matchXYZ");
+        mc.add(5, 7);
+        mc.add(8, 2);
+        mc.add(9, 10);
+        mc.add(16, 90);
+        mc.commit();
+        assertEquals(mc.getTotalResults(), 109);
+        assertEquals(mc.getTotalResultDocs(), 4);
     };
 
+
     @After
     public void shutDown () throws Exception {
-	this.conn.close();
+        this.conn.close();
     };
 };
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 0593b02..b69fb31 100644
--- a/src/test/java/de/ids_mannheim/korap/server/TestResource.java
+++ b/src/test/java/de/ids_mannheim/korap/server/TestResource.java
@@ -34,6 +34,7 @@
     private HttpServer server;
     private WebTarget target;
 
+
     @Before
     public void setUp () throws Exception {
         // start the server
@@ -55,17 +56,20 @@
         ClientConfig clientConfig = new DefaultClientConfig();
         clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
         Client c = Client.create(clientConfig);
-*/
+        */
         target = c.target(Node.BASE_URI);
     };
 
+
     @After
-    public void tearDown() throws Exception {
+    public void tearDown () throws Exception {
         server.stop();
     };
 
+
     /**
-     * Test to see that the message "Gimme 5 minutes, please!" is sent in the response.
+     * Test to see that the message "Gimme 5 minutes, please!" is sent
+     * in the response.
      */
     @Test
     public void testPing () {
@@ -73,29 +77,22 @@
         assertEquals("Gimme 5 minutes, please!", responseMsg);
     };
 
+
     @Ignore
-    public void testResource() throws IOException {
+    public void testResource () throws IOException {
         Response kresp;
 
-        for (String i : new String[] {"00001",
-                                      "00002",
-                                      "00003",
-                                      "00004",
-                                      "00005",
-                                      "00006",
-                                      "02439"
-            }) {
+        for (String i : new String[] { "00001", "00002", "00003", "00004",
+                "00005", "00006", "02439" }) {
 
-            String json = StringfromFile(
-                getClass().getResource("/wiki/" + i + ".json").getFile()
-            );
+            String json = StringfromFile(getClass().getResource(
+                    "/wiki/" + i + ".json").getFile());
 
             Entity jsonE = Entity.json(json);
 
             try {
-                kresp = target.path("/index/" + i).
-                    request("application/json").
-                    put(jsonE, Response.class);
+                kresp = target.path("/index/" + i).request("application/json")
+                        .put(jsonE, Response.class);
 
                 assertEquals(kresp.getNode(), "milena");
                 assertFalse(kresp.hasErrors());
@@ -103,13 +100,13 @@
                 assertFalse(kresp.hasMessages());
             }
             catch (Exception e) {
-                fail("Server response failed " + e.getMessage() + " (Known issue)");
+                fail("Server response failed " + e.getMessage()
+                        + " (Known issue)");
             }
         };
 
-        kresp = target.path("/index").
-            request("application/json").
-            post(Entity.text(""), Response.class);
+        kresp = target.path("/index").request("application/json")
+                .post(Entity.text(""), Response.class);
         assertEquals(kresp.getNode(), "milena");
         assertFalse(kresp.hasErrors());
         assertFalse(kresp.hasWarnings());
@@ -118,19 +115,15 @@
 
 
     @Ignore
-    public void testCollection() throws IOException {
+    public void testCollection () throws IOException {
 
-        String json = getString(
-            getClass().getResource("/queries/bsp-uid-example.jsonld").getFile()
-        );
+        String json = getString(getClass().getResource(
+                "/queries/bsp-uid-example.jsonld").getFile());
 
         try {
-            Response kresp
-                = target.path("/").
-                queryParam("uid", "1").
-                queryParam("uid", "4").
-                request("application/json").
-                post(Entity.json(json), Response.class);
+            Response kresp = target.path("/").queryParam("uid", "1")
+                    .queryParam("uid", "4").request("application/json")
+                    .post(Entity.json(json), Response.class);
 
             assertEquals(2, kresp.getTotalResults());
             assertFalse(kresp.hasErrors());
@@ -143,6 +136,7 @@
 
     };
 
+
     public static String getString (String path) {
         StringBuilder contentBuilder = new StringBuilder();
         try {
diff --git a/src/test/java/de/ids_mannheim/korap/util/TestKrillArray.java b/src/test/java/de/ids_mannheim/korap/util/TestKrillArray.java
index b42774b..f145e07 100644
--- a/src/test/java/de/ids_mannheim/korap/util/TestKrillArray.java
+++ b/src/test/java/de/ids_mannheim/korap/util/TestKrillArray.java
@@ -17,20 +17,23 @@
 
     @Test
     public void StringJoin1 () {
-        String[] test = new String[]{"a", "bc", "def"};
+        String[] test = new String[] { "a", "bc", "def" };
         assertEquals(join(",", test), "a,bc,def");
     };
 
+
     @Test
     public void StringJoin2 () {
         assertEquals(join(",", "a", "bc", "def"), "a,bc,def");
     };
 
+
     @Test
     public void StringJoin3 () {
         assertEquals(join(',', "a", "bc", "def"), "a,bc,def");
     };
 
+
     @Test
     public void StringJoin4 () {
         assertEquals(join("--", "a", "bc", "def"), "a--bc--def");
diff --git a/src/test/java/de/ids_mannheim/korap/util/TestKrillByte.java b/src/test/java/de/ids_mannheim/korap/util/TestKrillByte.java
index 5cff981..2237964 100644
--- a/src/test/java/de/ids_mannheim/korap/util/TestKrillByte.java
+++ b/src/test/java/de/ids_mannheim/korap/util/TestKrillByte.java
@@ -13,27 +13,24 @@
 public class TestKrillByte {
 
     @Test
-    public void testConversion() {
+    public void testConversion () {
         assertEquals(4, byte2int(int2byte(4)));
-        assertEquals(
-            byte2int(ByteBuffer.allocate(4).putInt(4).array()),
-            byte2int(int2byte(4))
-        );
+        assertEquals(byte2int(ByteBuffer.allocate(4).putInt(4).array()),
+                byte2int(int2byte(4)));
 
-        assertEquals(
-            byte2int(ByteBuffer.allocate(4).putInt(99999).array()),
-            byte2int(int2byte(99999))
-        );
+        assertEquals(byte2int(ByteBuffer.allocate(4).putInt(99999).array()),
+                byte2int(int2byte(99999)));
 
         assertEquals(128, byte2int(int2byte(128)));
         assertEquals(1024, byte2int(int2byte(1024)));
         assertEquals(66_666, byte2int(int2byte(66_666)));
         assertEquals(66_666, byte2int(int2byte(66_666)), 0);
 
-        byte[] bb = ByteBuffer.allocate(12).putInt(99999).putInt(666).putInt(1234).array();
+        byte[] bb = ByteBuffer.allocate(12).putInt(99999).putInt(666)
+                .putInt(1234).array();
 
-        assertEquals(99999, byte2int(bb,0));
-        assertEquals(666,   byte2int(bb,4));
-        assertEquals(1234,  byte2int(bb,8));
+        assertEquals(99999, byte2int(bb, 0));
+        assertEquals(666, byte2int(bb, 4));
+        assertEquals(1234, byte2int(bb, 8));
     };
 };
diff --git a/src/test/java/de/ids_mannheim/korap/util/TestKrillDate.java b/src/test/java/de/ids_mannheim/korap/util/TestKrillDate.java
index b62e231..f6f4fc3 100644
--- a/src/test/java/de/ids_mannheim/korap/util/TestKrillDate.java
+++ b/src/test/java/de/ids_mannheim/korap/util/TestKrillDate.java
@@ -12,7 +12,7 @@
 public class TestKrillDate {
 
     @Test
-    public void testByString() {
+    public void testByString () {
         KrillDate kd = new KrillDate("2005-06-03");
         assertEquals(2005, kd.year);
         assertEquals(6, kd.month);
@@ -46,7 +46,7 @@
 
 
     @Test
-    public void testWithCeil() {
+    public void testWithCeil () {
         KrillDate kd = new KrillDate("2005-06-03");
         assertEquals(2005, kd.year);
         assertEquals(6, kd.month);
@@ -72,8 +72,9 @@
         assertEquals(99999999, kd.ceil());
     };
 
+
     @Test
-    public void testWithFloor() {
+    public void testWithFloor () {
         KrillDate kd = new KrillDate("2005-06-03");
         assertEquals(2005, kd.year);
         assertEquals(6, kd.month);
@@ -99,8 +100,9 @@
         assertEquals(0, kd.floor());
     };
 
+
     @Test
-    public void testToString() {
+    public void testToString () {
         KrillDate kd = new KrillDate("2005-06-03");
         assertEquals(2005, kd.year);
         assertEquals(6, kd.month);
@@ -126,8 +128,9 @@
         assertEquals(null, kd.toString());
     };
 
+
     @Test
-    public void testToCeilString() {
+    public void testToCeilString () {
         KrillDate kd = new KrillDate("2005-06-03");
         assertEquals(2005, kd.year);
         assertEquals(6, kd.month);
@@ -155,7 +158,7 @@
 
 
     @Test
-    public void testToFloorString() {
+    public void testToFloorString () {
         KrillDate kd = new KrillDate("2005-06-03");
         assertEquals(2005, kd.year);
         assertEquals(6, kd.month);
@@ -181,6 +184,7 @@
         assertEquals("0", kd.toFloorString());
     };
 
+
     @Test
     public void testDisplay () {
         KrillDate kd = new KrillDate("2005-06-03");
diff --git a/src/test/java/de/ids_mannheim/korap/util/TestKrillString.java b/src/test/java/de/ids_mannheim/korap/util/TestKrillString.java
index 14b4b14..3a437c5 100644
--- a/src/test/java/de/ids_mannheim/korap/util/TestKrillString.java
+++ b/src/test/java/de/ids_mannheim/korap/util/TestKrillString.java
@@ -12,11 +12,11 @@
 public class TestKrillString {
 
     @Test
-    public void testHTMLescape() {
+    public void testHTMLescape () {
         assertEquals("Der &amp; Die", escapeHTML("Der & Die"));
         assertEquals("Der &amp; Die &amp;", escapeHTML("Der & Die &"));
         assertEquals("&lt;x&gt;Hui&lt;/x&gt;", escapeHTML("<x>Hui</x>"));
         assertEquals("Er sagte: &quot;Das ist ja toll!&quot;",
-                     escapeHTML("Er sagte: \"Das ist ja toll!\""));
+                escapeHTML("Er sagte: \"Das ist ja toll!\""));
     };
 };
