diff --git a/src/main/java/de/ids_mannheim/korap/Krill.java b/src/main/java/de/ids_mannheim/korap/Krill.java
index 112112d..8a5789a 100644
--- a/src/main/java/de/ids_mannheim/korap/Krill.java
+++ b/src/main/java/de/ids_mannheim/korap/Krill.java
@@ -166,7 +166,6 @@
         if (json.has("query")) {
             try {
                 KrillQuery kq = new KrillQuery("tokens");
-
                 SpanQueryWrapper qw = kq.fromJson(json.get("query"));
 
                 this.setQuery(kq);
@@ -209,11 +208,13 @@
         try {
             if (json.has("collection")) {
                 JsonNode collNode = json.get("collection");
+
                 // TODO: Temporary
-                if (collNode.fieldNames().hasNext())
-                    this.setCollection(
-                        new KrillCollection().fromJson(collNode)
-                    );
+                if (collNode.fieldNames().hasNext()) {
+                    KrillCollection kc = new KrillCollection()
+                            .fromJson(collNode);
+                    this.setCollection(kc);
+                };
             }
 
             // <legacycode>
@@ -303,14 +304,16 @@
 
         // Apply search
         else {
+
+            // This contains meta and matches
             kr = this.index.search(this);
-            this.getCollection().setIndex(this.index);
+            // this.getCollection().setIndex(this.index);
             kr.copyNotificationsFrom(this);
         };
 
-        // TODO: Only for development mode
-        kr.setRequest(this.request);
+        // kr.setRequest(this.request);
         kr.setQuery(this.getQuery());
+        kr.setCollection(this.getCollection());
 
         return kr;
     };
diff --git a/src/main/java/de/ids_mannheim/korap/KrillCollection.java b/src/main/java/de/ids_mannheim/korap/KrillCollection.java
index 539427b..5d7d736 100644
--- a/src/main/java/de/ids_mannheim/korap/KrillCollection.java
+++ b/src/main/java/de/ids_mannheim/korap/KrillCollection.java
@@ -59,6 +59,7 @@
     private String id;
     private ArrayList<FilterOperation> filter;
     private int filterCount = 0;
+    private JsonNode json;
 
     // Logger
     private final static Logger log = LoggerFactory
@@ -158,6 +159,7 @@
      * @throws QueryException
      */
     public KrillCollection fromJson (JsonNode json) throws QueryException {
+        this.json = json;
         this.filter(this._fromJson(json));
         return this;
     };
@@ -617,6 +619,22 @@
 
 
     /**
+     * Return the associated KoralQuery collection object
+     * as a {@link JsonNode}. This won't work,
+     * if the object was build using a CollectionBuilder,
+     * therefore it is limited to mirror a deserialized KoralQuery
+     * object.
+     * 
+     * @return The {@link JsonNode} representing the collection object
+     *         of a deserialized KoralQuery object.
+     */
+    public JsonNode toJsonNode () {
+        return this.json;
+    };
+
+
+
+    /**
      * Search in the virtual collection.
      * This is mostly used for testing purposes
      * and <strong>is not recommended</strong>
diff --git a/src/main/java/de/ids_mannheim/korap/KrillQuery.java b/src/main/java/de/ids_mannheim/korap/KrillQuery.java
index 3fe6f28..3bf8bcd 100644
--- a/src/main/java/de/ids_mannheim/korap/KrillQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/KrillQuery.java
@@ -121,6 +121,7 @@
         };
     };
 
+
     /**
      * Constructs a new object for query deserialization
      * and building. Expects the name of an index field
@@ -281,12 +282,14 @@
                     SpanSubspanQueryWrapper ssqw = new SpanSubspanQueryWrapper(
                             sqw, startOffset, length);
                     return ssqw;
-                };
+                }
+                ;
 
                 if (DEBUG)
                     log.trace("Wrap class reference {}", number);
 
-                return new SpanFocusQueryWrapper(this._fromJson(operands.get(0)), number);
+                return new SpanFocusQueryWrapper(
+                        this._fromJson(operands.get(0)), number);
 
             case "koral:token":
 
@@ -384,7 +387,8 @@
         if (DEBUG)
             log.trace("Operands are {}", operands);
 
-        SpanQueryWrapper spanReferenceQueryWrapper = _operationReferenceFromJSON(json, operands);
+        SpanQueryWrapper spanReferenceQueryWrapper = _operationReferenceFromJSON(
+                json, operands);
         if (spanReferenceQueryWrapper != null) {
             return spanReferenceQueryWrapper;
         }
@@ -428,8 +432,9 @@
         throw new QueryException(711, "Unknown group operation");
     };
 
-    private SpanQueryWrapper _operationReferenceFromJSON(JsonNode node, JsonNode operands)
-            throws QueryException {
+
+    private SpanQueryWrapper _operationReferenceFromJSON (JsonNode node,
+            JsonNode operands) throws QueryException {
         boolean isReference = false;
         int classNum = -1;
         int refOperandNum = -1;
@@ -464,7 +469,8 @@
         return null;
     }
 
-    private JsonNode _resolveReference(JsonNode node, JsonNode operands,
+
+    private JsonNode _resolveReference (JsonNode node, JsonNode operands,
             int refOperandNum, int classNum) throws QueryException {
         JsonNode referent = null;
         ObjectMapper m = new ObjectMapper();
@@ -474,7 +480,8 @@
             if (i != refOperandNum) {
                 if (!isReferentFound) {
                     referent = _extractReferentClass(operands.get(i), classNum);
-                    if (referent != null) isReferentFound = true;
+                    if (referent != null)
+                        isReferentFound = true;
                 }
                 newOperands.insert(i, operands.get(i));
             }
@@ -490,7 +497,8 @@
 
     }
 
-    private JsonNode _extractReferentClass(JsonNode node, int classNum) {
+
+    private JsonNode _extractReferentClass (JsonNode node, int classNum) {
         JsonNode referent;
         if (node.has("classOut") && node.get("classOut").asInt() == classNum) {
             // System.out.println("found: " + node.toString());
@@ -520,7 +528,7 @@
 
         SpanQueryWrapper operand1 = this._fromJson(operands.get(0));
         SpanQueryWrapper operand2 = this._fromJson(operands.get(1));
-        
+
         String direction = ">:";
         if (operand1.isEmpty() && !operand2.isEmpty()) {
             direction = "<:";
@@ -529,14 +537,13 @@
         if (!relation.has("@type"))
             throw new QueryException(701,
                     "JSON-LD group has no @type attribute");
-        
+
         if (relation.get("@type").asText().equals("koral:relation")) {
             if (!relation.has("wrap")) {
                 throw new QueryException(718, "Missing relation term");
             }
             SpanQueryWrapper relationWrapper = _termFromJson(
-                    relation.get("wrap"),
-                    direction);
+                    relation.get("wrap"), direction);
             return new SpanRelationWrapper(relationWrapper, operand1, operand2);
         }
         else {
@@ -730,7 +737,8 @@
                     "Span references are currently not supported");
         };
 
-        return new SpanFocusQueryWrapper(this._fromJson(operands.get(0)), number);
+        return new SpanFocusQueryWrapper(this._fromJson(operands.get(0)),
+                number);
     };
 
 
@@ -1039,7 +1047,7 @@
 
         // <legacy>
         if (json.has("caseInsensitive")
-            && json.get("caseInsensitive").asBoolean()) {
+                && json.get("caseInsensitive").asBoolean()) {
             isCaseInsensitive = true;
         }
         // </legacy>
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 ec5079b..b009e7b 100644
--- a/src/main/java/de/ids_mannheim/korap/index/MultiTerm.java
+++ b/src/main/java/de/ids_mannheim/korap/index/MultiTerm.java
@@ -304,7 +304,7 @@
      * Offsets are attached following a hash sign,
      * payloads are attached following a dollar sign.
      * All payloads are written as UTF-8 character sequences.
-     *
+     * 
      * <b>For the moment this is only for testing purposes!</b>
      * 
      * @see #toStringShort().
@@ -457,26 +457,29 @@
                 }
                 catch (NumberFormatException e) {
                     throw new CorpusDataException(952,
-                            "Given offset information is not numeric in " + termSurface[0]);
+                            "Given offset information is not numeric in "
+                                    + termSurface[0]);
                 };
             }
             else {
                 throw new CorpusDataException(953,
-                        "Given offset information is incomplete in " + termSurface[0]);
+                        "Given offset information is incomplete in "
+                                + termSurface[0]);
             };
         };
         this.term = _unescape(stringOffset[0]);
     };
 
+
     // Escape the term
     private String _escape (String term) {
         return term.replaceAll("([#\\$\\\\])", "\\\\$1");
     };
-    
+
+
     // Unescape the term
     private String _unescape (String term) {
-        return term.replace("\\\\","\\")
-            .replace("\\#", "#")
-            .replace("\\$", "$");
+        return term.replace("\\\\", "\\").replace("\\#", "#")
+                .replace("\\$", "$");
     };
 };
diff --git a/src/main/java/de/ids_mannheim/korap/query/SimpleSpanQuery.java b/src/main/java/de/ids_mannheim/korap/query/SimpleSpanQuery.java
index de1e4c8..1f28383 100644
--- a/src/main/java/de/ids_mannheim/korap/query/SimpleSpanQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/query/SimpleSpanQuery.java
@@ -75,8 +75,10 @@
     protected String field;
     protected boolean collectPayloads;
 
+
     public SimpleSpanQuery () {}
 
+
     /**
      * Constructs a new SimpleSpanQuery using the specified
      * {@link SpanQuery} and set whether payloads are to be collected
diff --git a/src/main/java/de/ids_mannheim/korap/query/SpanClassFilterQuery.java b/src/main/java/de/ids_mannheim/korap/query/SpanClassFilterQuery.java
index 48790bc..799c87e 100644
--- a/src/main/java/de/ids_mannheim/korap/query/SpanClassFilterQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/query/SpanClassFilterQuery.java
@@ -21,31 +21,33 @@
     private ClassOperation operation;
     private byte classNum1, classNum2;
 
+
     public SpanClassFilterQuery (SpanQuery sq, ClassOperation type,
-            int classNum1, int classNum2,
-            boolean collectPayloads) {
+                                 int classNum1, int classNum2,
+                                 boolean collectPayloads) {
         super(sq, collectPayloads);
         this.operation = type;
         this.classNum1 = (byte) classNum1;
         this.classNum2 = (byte) classNum2;
     }
 
+
     @Override
-    public SimpleSpanQuery clone() {
+    public SimpleSpanQuery clone () {
         return new SpanClassFilterQuery((SpanQuery) firstClause.clone(),
-                operation,
-                classNum1, classNum2, collectPayloads);
+                operation, classNum1, classNum2, collectPayloads);
     }
 
+
     @Override
-    public Spans getSpans(AtomicReaderContext context, Bits acceptDocs,
+    public Spans getSpans (AtomicReaderContext context, Bits acceptDocs,
             Map<Term, TermContext> termContexts) throws IOException {
-        return new ClassFilteredSpans(this, context, acceptDocs,
-                termContexts);
+        return new ClassFilteredSpans(this, context, acceptDocs, termContexts);
     }
 
+
     @Override
-    public String toString(String field) {
+    public String toString (String field) {
         StringBuilder sb = new StringBuilder();
         sb.append("spanClassFilter(");
         sb.append(firstClause.toString());
@@ -59,27 +61,33 @@
         return sb.toString();
     }
 
-    public ClassOperation getOperation() {
+
+    public ClassOperation getOperation () {
         return operation;
     }
 
-    public void setOperation(ClassOperation operation) {
+
+    public void setOperation (ClassOperation operation) {
         this.operation = operation;
     }
 
-    public byte getClassNum1() {
+
+    public byte getClassNum1 () {
         return classNum1;
     }
 
-    public void setClassNum1(byte classNum1) {
+
+    public void setClassNum1 (byte classNum1) {
         this.classNum1 = classNum1;
     }
 
-    public byte getClassNum2() {
+
+    public byte getClassNum2 () {
         return classNum2;
     }
 
-    public void setClassNum2(byte classNum2) {
+
+    public void setClassNum2 (byte classNum2) {
         this.classNum2 = classNum2;
     }
 
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 c144a58..ab29d0f 100644
--- a/src/main/java/de/ids_mannheim/korap/query/SpanFocusQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/query/SpanFocusQuery.java
@@ -38,6 +38,7 @@
     private boolean matchTemporaryClass = false;
     private boolean removeTemporaryClasses = false;
 
+
     /**
      * Construct a new SpanFocusQuery.
      * 
@@ -80,7 +81,7 @@
     public String toString (String field) {
         StringBuffer buffer = new StringBuffer();
         buffer.append("focus(");
-        if (matchTemporaryClass){
+        if (matchTemporaryClass) {
             buffer.append("#");
         }
         if (classNumbers.size() > 1) {
@@ -188,19 +189,23 @@
         this.isSorted = isSorted;
     }
 
-    public boolean matchTemporaryClass() {
+
+    public boolean matchTemporaryClass () {
         return matchTemporaryClass;
     }
 
-    public void setMatchTemporaryClass(boolean matchTemporaryClass) {
+
+    public void setMatchTemporaryClass (boolean matchTemporaryClass) {
         this.matchTemporaryClass = matchTemporaryClass;
     }
 
-    public boolean removeTemporaryClasses() {
+
+    public boolean removeTemporaryClasses () {
         return removeTemporaryClasses;
     }
 
-    public void setRemoveTemporaryClasses(boolean rem) {
+
+    public void setRemoveTemporaryClasses (boolean rem) {
         this.removeTemporaryClasses = rem;
     }
 
diff --git a/src/main/java/de/ids_mannheim/korap/query/SpanReferenceQuery.java b/src/main/java/de/ids_mannheim/korap/query/SpanReferenceQuery.java
index 9c2484d..3b23a18 100644
--- a/src/main/java/de/ids_mannheim/korap/query/SpanReferenceQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/query/SpanReferenceQuery.java
@@ -16,8 +16,9 @@
 
     private byte classNum;
 
+
     public SpanReferenceQuery (SpanQuery firstClause, byte classNum,
-            boolean collectPayloads) {
+                               boolean collectPayloads) {
         super(firstClause, collectPayloads);
         this.classNum = classNum;
     }
@@ -50,11 +51,12 @@
     }
 
 
-    public byte getClassNum() {
+    public byte getClassNum () {
         return classNum;
     }
 
-    public void setClassNum(byte classNum) {
+
+    public void setClassNum (byte classNum) {
         this.classNum = classNum;
     }
 
diff --git a/src/main/java/de/ids_mannheim/korap/query/SpanRelationMatchQuery.java b/src/main/java/de/ids_mannheim/korap/query/SpanRelationMatchQuery.java
index 5bc962a..0fac2a3 100644
--- a/src/main/java/de/ids_mannheim/korap/query/SpanRelationMatchQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/query/SpanRelationMatchQuery.java
@@ -12,14 +12,15 @@
 
 import de.ids_mannheim.korap.query.spans.FocusSpans;
 
-public class SpanRelationMatchQuery extends SimpleSpanQuery{
+public class SpanRelationMatchQuery extends SimpleSpanQuery {
 
     private SpanQuery operandQuery;
     private SpanQuery operand2Query;
     private SpanRelationQuery relationQuery;
 
-    public SpanRelationMatchQuery (SpanRelationQuery relation, SpanQuery operand,
-            boolean collectPayloads) {
+
+    public SpanRelationMatchQuery (SpanRelationQuery relation,
+                                   SpanQuery operand, boolean collectPayloads) {
 
         checkVariables(relation, operand);
         SpanFocusQuery sq = new SpanFocusQuery(new SpanSegmentQuery(
@@ -34,8 +35,10 @@
         this.collectPayloads = collectPayloads;
     }
 
-    public SpanRelationMatchQuery (SpanRelationQuery relation, SpanQuery source,
-            SpanQuery target, boolean collectPayloads) {
+
+    public SpanRelationMatchQuery (SpanRelationQuery relation,
+                                   SpanQuery source, SpanQuery target,
+                                   boolean collectPayloads) {
 
         checkVariables(relation, source, target);
         SpanFocusQuery sq = null;
@@ -63,7 +66,8 @@
 
     }
 
-    public void checkVariables(SpanRelationQuery relation, SpanQuery operand) {
+
+    public void checkVariables (SpanRelationQuery relation, SpanQuery operand) {
         if (relation == null) {
             throw new IllegalArgumentException(
                     "The relation query cannot be null.");
@@ -80,8 +84,10 @@
         this.relationQuery = relation;
         this.operandQuery = operand;
     }
-    
-    public void checkVariables(SpanRelationQuery relation, SpanQuery operand, SpanQuery target) {
+
+
+    public void checkVariables (SpanRelationQuery relation, SpanQuery operand,
+            SpanQuery target) {
         checkVariables(relation, operand);
         if (target == null) {
             if (operand == null) {
@@ -96,8 +102,9 @@
         this.operand2Query = target;
     }
 
+
     @Override
-    public SimpleSpanQuery clone() {
+    public SimpleSpanQuery clone () {
         if (operand2Query != null) {
             return new SpanRelationMatchQuery(
                     (SpanRelationQuery) relationQuery.clone(),
@@ -110,16 +117,18 @@
                 (SpanQuery) operandQuery.clone(), collectPayloads);
     }
 
+
     @Override
-    public Spans getSpans(AtomicReaderContext context, Bits acceptDocs,
+    public Spans getSpans (AtomicReaderContext context, Bits acceptDocs,
             Map<Term, TermContext> termContexts) throws IOException {
 
         return new FocusSpans((SpanFocusQuery) firstClause, context,
                 acceptDocs, termContexts);
     }
 
+
     @Override
-    public String toString(String field) {
+    public String toString (String field) {
         return getFirstClause().toString();
     }
 }
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 8d06a7e..65b8786 100644
--- a/src/main/java/de/ids_mannheim/korap/query/SpanRelationQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/query/SpanRelationQuery.java
@@ -62,7 +62,10 @@
     private byte sourceClass;
     private byte targetClass;
 
-    private List<Byte> tempClassNumbers = Arrays.asList(tempSourceNum, tempTargetNum);
+    private List<Byte> tempClassNumbers = Arrays.asList(tempSourceNum,
+            tempTargetNum);
+
+
     /**
      * Constructs a SpanRelationQuery based on the given span query.
      * 
@@ -83,14 +86,16 @@
         }
     }
 
+
     public SpanRelationQuery (SpanQuery firstClause, List<Byte> classNumbers,
-            boolean collectPayloads) {
+                              boolean collectPayloads) {
         this(firstClause, collectPayloads);
         this.tempClassNumbers = classNumbers;
         this.tempSourceNum = classNumbers.get(0);
         this.tempTargetNum = classNumbers.get(1);
     }
 
+
     @Override
     public SimpleSpanQuery clone () {
         SimpleSpanQuery sq = new SpanRelationQuery(
@@ -132,43 +137,53 @@
         return sb.toString();
     }
 
-    public int getDirection() {
+
+    public int getDirection () {
         return direction;
     }
 
-    public void setDirection(int direction) {
+
+    public void setDirection (int direction) {
         this.direction = direction;
     }
 
-    public List<Byte> getTempClassNumbers() {
+
+    public List<Byte> getTempClassNumbers () {
         return tempClassNumbers;
     }
 
-    public void setTempClassNumbers(List<Byte> classNumbers) {
+
+    public void setTempClassNumbers (List<Byte> classNumbers) {
         this.tempClassNumbers = classNumbers;
     }
 
-    public byte getTempSourceNum() {
+
+    public byte getTempSourceNum () {
         return tempSourceNum;
     }
 
-    public void setTempSourceNum(byte sourceNum) {
+
+    public void setTempSourceNum (byte sourceNum) {
         this.tempSourceNum = sourceNum;
     }
 
-    public byte getTempTargetNum() {
+
+    public byte getTempTargetNum () {
         return tempTargetNum;
     }
 
-    public void setTempTargetNum(byte targetNum) {
+
+    public void setTempTargetNum (byte targetNum) {
         this.tempTargetNum = targetNum;
     }
 
-    public byte getSourceClass() {
+
+    public byte getSourceClass () {
         return sourceClass;
     }
 
-    public void setSourceClass(byte sourceClass)
+
+    public void setSourceClass (byte sourceClass)
             throws IllegalArgumentException {
         if (sourceClass < 1) {
             throw new IllegalArgumentException(
@@ -178,11 +193,13 @@
         this.sourceClass = sourceClass;
     }
 
-    public byte getTargetClass() {
+
+    public byte getTargetClass () {
         return targetClass;
     }
 
-    public void setTargetClass(byte targetClass)
+
+    public void setTargetClass (byte targetClass)
             throws IllegalArgumentException {
         if (targetClass < 1) {
             throw new IllegalArgumentException(
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 7e75543..29189e2 100644
--- a/src/main/java/de/ids_mannheim/korap/query/SpanSegmentQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/query/SpanSegmentQuery.java
@@ -46,6 +46,7 @@
         this(firstClause, secondClause, true);
     }
 
+
     /**
      * Constructs a SpanSegmentQuery from the two given SpanQueries.
      * 
@@ -60,7 +61,7 @@
      *            <code>false</code>.
      */
     public SpanSegmentQuery (SpanQuery firstClause, SpanQuery secondClause,
-            boolean collectPayloads) {
+                             boolean collectPayloads) {
         super(firstClause, secondClause, collectPayloads);
         if (firstClause instanceof SpanRelationQuery) {
             isRelation = true;
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/ClassFilteredSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/ClassFilteredSpans.java
index bfd5f11..28459cf 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/ClassFilteredSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/ClassFilteredSpans.java
@@ -20,9 +20,11 @@
     private ClassOperation operation;
     private byte classNum1, classNum2;
 
+
     public ClassFilteredSpans (SpanClassFilterQuery query,
-            AtomicReaderContext context, Bits acceptDocs,
-            Map<Term, TermContext> termContexts) throws IOException {
+                               AtomicReaderContext context, Bits acceptDocs,
+                               Map<Term, TermContext> termContexts)
+            throws IOException {
         super(query, context, acceptDocs, termContexts);
         this.operation = query.getOperation();
         this.classNum1 = query.getClassNum1();
@@ -30,8 +32,9 @@
         hasMoreSpans = firstSpans.next();
     }
 
+
     @Override
-    public boolean next() throws IOException {
+    public boolean next () throws IOException {
         while (hasMoreSpans) {
             matchPayload.clear();
             bitset1 = null;
@@ -49,17 +52,21 @@
         return false;
     }
 
-    private boolean isClassOperationValid() throws IOException {
+
+    private boolean isClassOperationValid () throws IOException {
         setBitsets();
-        int cardinality = Math.max(bitset1.cardinality(), bitset2.cardinality());
+        int cardinality = Math
+                .max(bitset1.cardinality(), bitset2.cardinality());
         bitset1.and(bitset2);
         // System.out.println("cardinality:" + cardinality);
         switch (operation) {
             case DISJOINT:
-                if (bitset1.cardinality() == 0) return true;
+                if (bitset1.cardinality() == 0)
+                    return true;
                 break;
             case EQUAL:
-                if (cardinality == bitset1.cardinality()) return true;
+                if (cardinality == bitset1.cardinality())
+                    return true;
                 break;
             case DIFFER:
                 if (cardinality == 0 || cardinality != bitset1.cardinality())
@@ -71,19 +78,21 @@
                 }
                 break;
             case INTERSECT:
-                if (bitset1.cardinality() > 0) return true;
+                if (bitset1.cardinality() > 0)
+                    return true;
                 break;
         }
 
         return false;
     }
 
-    private void setBitsets() throws IOException {
+
+    private void setBitsets () throws IOException {
         BitSet bs = new BitSet();
         int start, end;
         // System.out.println("------------------------");
         for (byte[] payload : firstSpans.getPayload()) {
-            if (payload.length == 9){
+            if (payload.length == 9) {
                 start = byte2int(payload, 0) + 1;
                 end = byte2int(payload, 4) + 1;
                 if (payload[8] == classNum1) {
@@ -118,14 +127,16 @@
 
     }
 
+
     @Override
-    public boolean skipTo(int target) throws IOException {
+    public boolean skipTo (int target) throws IOException {
         // TODO Auto-generated method stub
         return false;
     }
 
+
     @Override
-    public long cost() {
+    public long cost () {
         // TODO Auto-generated method stub
         return 0;
     }
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 ac83c4d..09cc05b 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
@@ -128,7 +128,7 @@
     };
 
 
-    protected boolean addClassPayload() throws IOException {
+    protected boolean addClassPayload () throws IOException {
         hasmorespans = true;
 
         classedPayload.clear();
@@ -151,7 +151,7 @@
 
         // Add highlight information as byte array
         classedPayload.add(bb.array());
-        
+
         if (spans instanceof SimpleSpans) {
             SimpleSpans ss = (SimpleSpans) spans;
             this.hasSpanId = ss.hasSpanId;
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/ReferenceSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/ReferenceSpans.java
index a860afd..cae4c5a 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/ReferenceSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/ReferenceSpans.java
@@ -16,6 +16,7 @@
 
     private byte classNum;
 
+
     public ReferenceSpans (SpanReferenceQuery query,
                            AtomicReaderContext context, Bits acceptDocs,
                            Map<Term, TermContext> termContexts)
@@ -43,7 +44,7 @@
 
 
     private boolean hasSameClassPosition () throws IOException {
-        int start=0, end=0;
+        int start = 0, end = 0;
         boolean isFound = false;
         boolean match = false;
 
@@ -52,7 +53,8 @@
         for (byte[] payload : firstSpans.getPayload()) {
             if (payload.length == 9 && payload[8] == classNum) {
                 if (isFound) {
-                    if (start == byte2int(payload, 0) && end == byte2int(payload, 4)){
+                    if (start == byte2int(payload, 0)
+                            && end == byte2int(payload, 4)) {
                         match = true;
                         continue;
                     }
@@ -86,7 +88,7 @@
 
 
     @Override
-    public long cost() {
+    public long cost () {
         return firstSpans.cost();
     }
 
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 66afdbe..979b359 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
@@ -61,6 +61,7 @@
     private byte tempSourceNum, tempTargetNum;
     private byte sourceClass, targetClass;
 
+
     /**
      * Constructs RelationSpans from the given
      * {@link SpanRelationQuery}.
@@ -251,7 +252,8 @@
         cs.setPayloads(payload);
     }
 
-    private byte[] createClassPayload(int start, int end, byte classNumber,
+
+    private byte[] createClassPayload (int start, int end, byte classNumber,
             boolean keep) {
         ByteBuffer buffer = null;
         if (keep) {
diff --git a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanReferenceQueryWrapper.java b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanReferenceQueryWrapper.java
index 02a734f..8b4c54d 100644
--- a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanReferenceQueryWrapper.java
+++ b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanReferenceQueryWrapper.java
@@ -10,8 +10,9 @@
     private SpanQueryWrapper subQuery;
     private byte classNum;
 
+
     public SpanReferenceQueryWrapper (SpanQueryWrapper subQueryWrapper,
-            byte classNum) {
+                                      byte classNum) {
         this.subQuery = subQueryWrapper;
         if (subQuery != null) {
             this.isNull = false;
@@ -30,17 +31,19 @@
         }
         this.classNum = classNum;
     }
-    
+
+
     @Override
-    public SpanQuery toQuery() throws QueryException {
+    public SpanQuery toQuery () throws QueryException {
 
         if (this.isNull() || this.isEmpty()) {
             return null;
         }
 
         SpanQuery sq = subQuery.retrieveNode(this.retrieveNode).toQuery();
-        if (sq == null) return null;
-        
+        if (sq == null)
+            return null;
+
         return new SpanReferenceQuery(sq, classNum, true);
     }
 
diff --git a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanRelationWrapper.java b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanRelationWrapper.java
index 2535ce9..992787c 100644
--- a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanRelationWrapper.java
+++ b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanRelationWrapper.java
@@ -14,8 +14,10 @@
     private SpanQueryWrapper subQuery1;
     private SpanQueryWrapper subQuery2;
 
+
     public SpanRelationWrapper (SpanQueryWrapper relationWrapper,
-            SpanQueryWrapper operand1, SpanQueryWrapper operand2) {
+                                SpanQueryWrapper operand1,
+                                SpanQueryWrapper operand2) {
 
         this.relationQuery = relationWrapper;
         if (relationQuery != null) {
@@ -35,17 +37,17 @@
 
 
     @Override
-    public SpanQuery toQuery() throws QueryException {
+    public SpanQuery toQuery () throws QueryException {
 
         if (this.isNull() || this.isEmpty()) {
             return null;
         }
 
-        SpanTermQuery relationTermQuery = (SpanTermQuery) relationQuery.retrieveNode(
-                this.retrieveNode).toQuery();
+        SpanTermQuery relationTermQuery = (SpanTermQuery) relationQuery
+                .retrieveNode(this.retrieveNode).toQuery();
         if (relationTermQuery == null)
             return null;
-        
+
         SpanRelationQuery rq = new SpanRelationQuery(relationTermQuery, true);
         SpanQuery subq1, subq2;
 
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 08c33b1..211c113 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
@@ -477,8 +477,8 @@
             String unit, boolean exclusion) {
 
         if (DEBUG)
-            log.trace("With contraint {}-{} (unit {}, excl {})",
-                      min, max, unit, exclusion);
+            log.trace("With contraint {}-{} (unit {}, excl {})", min, max,
+                    unit, exclusion);
 
         // Word unit
         if (unit.equals("w")) {
@@ -537,8 +537,8 @@
             SpanElementQueryWrapper unit, boolean exclusion) {
 
         if (DEBUG)
-            log.trace("With contraint {}-{} (unit {}, excl {})",
-                      min, max, unit.toString(), exclusion);
+            log.trace("With contraint {}-{} (unit {}, excl {})", min, max,
+                    unit.toString(), exclusion);
 
         if (this.constraints == null)
             this.constraints = new ArrayList<DistanceConstraint>(1);
@@ -601,10 +601,8 @@
         // 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 &&
-                this.isInOrder) {
+            if (dc.getUnit().equals("w") && dc.getMinDistance() == 1
+                    && dc.getMaxDistance() == 1 && this.isInOrder) {
                 return false;
             };
         };
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 2af28ab..674cd0b 100644
--- a/src/main/java/de/ids_mannheim/korap/response/Response.java
+++ b/src/main/java/de/ids_mannheim/korap/response/Response.java
@@ -40,9 +40,9 @@
 
     private KrillMeta meta;
     private KrillCollection collection;
+    private KrillQuery query;
 
     private String version, name, node, listener;
-    private KrillQuery query;
 
     private long totalResources = -2, // Not set
             totalResults = -2; // Not set
@@ -403,7 +403,9 @@
         this.collection = collection;
 
         // Move messages from the collection
-        return (Response) this.moveNotificationsFrom(collection);
+        Response resp = (Response) this.moveNotificationsFrom(collection);
+
+        return resp;
     };
 
 
@@ -468,9 +470,8 @@
                 json.put("meta", metaNode);
         };
 
-        ObjectNode meta = json.has("meta") ?
-            (ObjectNode) json.get("meta") :
-            (ObjectNode) json.putObject("meta");
+        ObjectNode meta = json.has("meta") ? (ObjectNode) json.get("meta")
+                : (ObjectNode) json.putObject("meta");
 
         if (sb.length() > 0)
             meta.put("version", sb.toString());
@@ -503,8 +504,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);
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 c120d43..bc57674 100644
--- a/src/main/java/de/ids_mannheim/korap/response/Result.java
+++ b/src/main/java/de/ids_mannheim/korap/response/Result.java
@@ -327,9 +327,8 @@
 
 
     private void _addMeta (ObjectNode json) {
-        ObjectNode meta = json.has("meta") ?
-            (ObjectNode) json.get("meta") :
-            (ObjectNode) json.putObject("meta");
+        ObjectNode meta = json.has("meta") ? (ObjectNode) json.get("meta")
+                : (ObjectNode) json.putObject("meta");
 
 
         // Relevant context setting
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 bb35479..41ce2dd 100644
--- a/src/test/java/de/ids_mannheim/korap/collection/TestKrillCollectionJSON.java
+++ b/src/test/java/de/ids_mannheim/korap/collection/TestKrillCollectionJSON.java
@@ -4,6 +4,12 @@
 import java.io.*;
 
 import de.ids_mannheim.korap.KrillCollection;
+import de.ids_mannheim.korap.Krill;
+import de.ids_mannheim.korap.KrillIndex;
+import de.ids_mannheim.korap.response.Result;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.JsonNode;
 
 import static de.ids_mannheim.korap.TestSimple.*;
 
@@ -72,6 +78,41 @@
     };
 
 
+    @Test
+    public void collectionMirror () 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();
+
+        Krill krill = new Krill(_getJSONString("collection_6.jsonld"));
+        Result kr = krill.apply(ki);
+        assertEquals(kr.getTotalResults(), 86);
+
+        ObjectMapper mapper = new ObjectMapper();
+        JsonNode res = mapper.readTree(kr.toJsonString());
+        assertTrue(res.at("/collection").isMissingNode());
+
+        krill = new Krill(_getJSONString("collection_6_withCollection.jsonld"));
+
+        kr = krill.apply(ki);
+        assertEquals(kr.getTotalResults(), 57);
+
+        res = mapper.readTree(kr.toJsonString());
+        assertFalse(res.at("/collection").isMissingNode());
+        assertEquals("koral:doc", res.at("/collection/@type").asText());
+        assertEquals("textClass", res.at("/collection/key").asText());
+        assertEquals("reisen", res.at("/collection/value").asText());
+        assertEquals("match:eq", res.at("/collection/match").asText());
+    };
+
+
     private String _getJSONString (String file) {
         return getString(getClass().getResource(path + file).getFile());
     };
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestClassFilterIndex.java b/src/test/java/de/ids_mannheim/korap/index/TestClassFilterIndex.java
index 77ef45d..5a2565e 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestClassFilterIndex.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestClassFilterIndex.java
@@ -20,8 +20,9 @@
     private KrillIndex ki;
     private Result kr;
 
+
     @Test
-    public void testInclude() throws IOException {
+    public void testInclude () throws IOException {
         ki = new KrillIndex();
         ki.addDoc(TestReferenceIndex.createFieldDoc0());
         ki.commit();
@@ -36,8 +37,7 @@
         SpanClassFilterQuery sq = new SpanClassFilterQuery(sdq,
                 ClassOperation.INCLUDE, 2, 1, true);
 
-        assertEquals(
-                sq.toString(),
+        assertEquals(sq.toString(),
                 "spanClassFilter(spanDistance({1: <tokens:np />}, {2: <tokens:vp />}, "
                         + "[(w[0:1], notOrdered, notExcluded)]),INCLUDE,2,1)");
 
@@ -63,7 +63,8 @@
                 "Frankenstein, treat my daughter well. She [{2:is {1:the one that "
                         + "saved your master who you hold so dear}}].", kr
                         .getMatch(2).getSnippetBrackets());
-        assertEquals("Frankenstein, treat my daughter well. She [{2:is the one that "
+        assertEquals(
+                "Frankenstein, treat my daughter well. She [{2:is the one that "
                         + "saved {1:your master} who you hold so dear}].", kr
                         .getMatch(3).getSnippetBrackets());
         assertEquals(
@@ -72,8 +73,9 @@
 
     }
 
+
     @Test
-    public void testDisjoint() throws IOException {
+    public void testDisjoint () throws IOException {
         ki = new KrillIndex();
         ki.addDoc(TestReferenceIndex.createFieldDoc0());
         ki.commit();
@@ -94,7 +96,7 @@
 
         SpanClassFilterQuery sq = new SpanClassFilterQuery(sdq,
                 ClassOperation.DISJOINT, 2, 1, true);
-        
+
         kr = ki.search(sq, (short) 10);
         // for (Match km : kr.getMatches()) {
         // System.out.println(km.getStartPos() + "," + km.getEndPos()
@@ -119,10 +121,11 @@
                 kr.getMatch(2).getSnippetBrackets());
     }
 
+
     // Problem with SpanDistanceQuery - unordered distance spans,
     // -> unsorted
     @Test
-    public void testEqual() throws IOException {
+    public void testEqual () throws IOException {
         ki = new KrillIndex();
         ki.addDoc(TestReferenceIndex.createFieldDoc0());
         ki.commit();
@@ -155,8 +158,9 @@
 
     }
 
+
     @Test
-    public void testDiffer() throws IOException {
+    public void testDiffer () throws IOException {
         ki = new KrillIndex();
         ki.addDoc(TestReferenceIndex.createFieldDoc0());
         ki.commit();
@@ -194,7 +198,7 @@
 
 
     @Test
-    public void testIntersect() throws IOException {
+    public void testIntersect () throws IOException {
         ki = new KrillIndex();
         ki.addDoc(TestReferenceIndex.createFieldDoc0());
         ki.commit();
@@ -217,13 +221,14 @@
         SpanClassFilterQuery sq = new SpanClassFilterQuery(sdq3,
                 ClassOperation.INTERSECT, 1, 2, true);
 
-        assertEquals("spanClassFilter(spanDistance({1: spanDistance(<tokens:np />, " +
-        		"{3: <tokens:vb />}, [(w[0:1], notOrdered, notExcluded)])}, " +
-        		"{2: spanDistance(<tokens:prp />, <tokens:vb />, [(w[0:1], " +
-        		"notOrdered, notExcluded)])}, [(w[0:1], notOrdered, notExcluded)]),INTERSECT,1,2)",
+        assertEquals(
+                "spanClassFilter(spanDistance({1: spanDistance(<tokens:np />, "
+                        + "{3: <tokens:vb />}, [(w[0:1], notOrdered, notExcluded)])}, "
+                        + "{2: spanDistance(<tokens:prp />, <tokens:vb />, [(w[0:1], "
+                        + "notOrdered, notExcluded)])}, [(w[0:1], notOrdered, notExcluded)]),INTERSECT,1,2)",
                 sq.toString());
-        
-        
+
+
         kr = ki.search(sq, (short) 20);
 
         // for (Match km : kr.getMatches()) {
@@ -247,7 +252,7 @@
 
 
     @Test
-    public void testMultipleSameClasses() throws IOException {
+    public void testMultipleSameClasses () throws IOException {
 
         ki = new KrillIndex();
         ki.addDoc(TestReferenceIndex.createFieldDoc0());
@@ -269,10 +274,10 @@
 
         SpanClassFilterQuery sq = new SpanClassFilterQuery(sdq2,
                 ClassOperation.INCLUDE, 2, 1, true);
-        
+
         kr = ki.search(sdq2, (short) 20);
         assertEquals(6, kr.getTotalResults());
-        
+
         // for (Match km : kr.getMatches()) {
         // System.out.println(km.getStartPos() + "," + km.getEndPos()
         // + " "
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 be5fd8c..aac981e 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestIndex.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestIndex.java
@@ -75,6 +75,7 @@
 
     private Directory index = new RAMDirectory();
 
+
     @Test
     public void multiTerm () throws CorpusDataException {
         MultiTerm test = new MultiTerm("test");
@@ -110,6 +111,7 @@
         assertTrue(test.toString().startsWith("xip/l:\\#normal#0-5$"));
     };
 
+
     @Test
     public void multiTermToken () throws CorpusDataException {
         MultiTermToken test = new MultiTermToken("hunde", "pos:n", "m:gen:pl");
@@ -123,6 +125,7 @@
         assertEquals(test.terms.get(2).term, "m:gen:pl");
     };
 
+
     private List initIndexer () throws IOException {
         List<Map<String, String>> list = new ArrayList<>();
 
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestReferenceIndex.java b/src/test/java/de/ids_mannheim/korap/index/TestReferenceIndex.java
index 4a56a04..f718ce3 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestReferenceIndex.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestReferenceIndex.java
@@ -28,6 +28,7 @@
     private KrillIndex ki;
     private Result kr;
 
+
     @Test
     public void testCase1 () throws IOException {
         ki = new KrillIndex();
@@ -55,7 +56,8 @@
         // SpanSegmentQuery ssq2 = new SpanSegmentQuery(sfq2, scq3,
         // true);
 
-        SpanRelationMatchQuery rq = new SpanRelationMatchQuery(srq, sfq1, scq3, true);
+        SpanRelationMatchQuery rq = new SpanRelationMatchQuery(srq, sfq1, scq3,
+                true);
 
         // System.out.println(rq.toString());
         SpanFocusQuery sfq3 = new SpanFocusQuery(rq, (byte) 1);
@@ -85,8 +87,9 @@
         assertEquals(7, kr.getMatch(0).getEndPos());
     }
 
+
     @Test
-    public void testCase2() throws IOException, QueryException {
+    public void testCase2 () throws IOException, QueryException {
 
         String filepath = getClass().getResource(
                 "/queries/reference/distance-reference.jsonld").getFile();
@@ -97,13 +100,12 @@
         // .{0,2} #3 & #3 -> #2
 
         assertEquals(
-            "spanReference(focus(#[1,2]spanSegment(focus(#2: "
-                    + "spanSegment(spanRelation(tokens:>:stanford/d:tag), "
-                    + "focus(3: spanDistance(focus(1: spanDistance({1: <tokens:vb />}, "
-                    + "{2: <tokens:prp />}, [(w[0:1], notOrdered, notExcluded)])), "
-                    + "{3: <tokens:nn />}, [(w[0:2], notOrdered, notExcluded)])))), "
-                    + "{2: <tokens:prp />})), 2)",
-            sq.toString());
+                "spanReference(focus(#[1,2]spanSegment(focus(#2: "
+                        + "spanSegment(spanRelation(tokens:>:stanford/d:tag), "
+                        + "focus(3: spanDistance(focus(1: spanDistance({1: <tokens:vb />}, "
+                        + "{2: <tokens:prp />}, [(w[0:1], notOrdered, notExcluded)])), "
+                        + "{3: <tokens:nn />}, [(w[0:2], notOrdered, notExcluded)])))), "
+                        + "{2: <tokens:prp />})), 2)", sq.toString());
 
         SpanElementQuery seq1 = new SpanElementQuery("tokens", "vb");
         // new SpanTermQuery(new Term("tokens", "c:vb"));
@@ -174,9 +176,10 @@
         // }
     }
 
+
     // multiple references
     @Test
-    public void testCase3() throws IOException, QueryException {
+    public void testCase3 () throws IOException, QueryException {
         ki = new KrillIndex();
         ki.addDoc(createFieldDoc0());
         ki.commit();
@@ -209,17 +212,17 @@
         assertEquals(13, kr.getMatch(1).getEndPos());
     }
 
+
     // multiple document
     @Test
-    public void testCase4() throws Exception {
+    public void testCase4 () throws Exception {
         ki = new KrillIndex();
         ki.addDoc(createFieldDoc0());
         ki.addDoc(createFieldDoc1());
         ki.commit();
 
         String filepath = getClass().getResource(
-                "/queries/reference/distance-reference.jsonld")
-                .getFile();
+                "/queries/reference/distance-reference.jsonld").getFile();
         SpanQueryWrapper sqwi = getJSONQuery(filepath);
         SpanQuery sq = sqwi.toQuery();
 
@@ -231,7 +234,8 @@
         assertEquals(4, kr.getMatch(3).getEndPos());
     }
 
-    public static FieldDocument createFieldDoc1() {
+
+    public static FieldDocument createFieldDoc1 () {
         FieldDocument fd = new FieldDocument();
         fd.addString("ID", "doc-1");
         fd.addTV(
@@ -256,69 +260,69 @@
         return fd;
     }
 
+
     public static FieldDocument createFieldDoc0 () {
         FieldDocument fd = new FieldDocument();
         fd.addString("ID", "doc-0");
         fd.addTV(
                 "tokens",
                 "Frankenstein, treat my daughter well. She is the one that saved your master who you hold so dear.",
-                
+
                 "[(0-12)s:Frankenstein|_0#0-12|<>:nn#0-12$<i>1<s>18|<>:s#0-37$<i>5<s>1|"
                         + "<>:np#0-13$<i>1<s>2|"
                         + "<:stanford/d:tag$<i>1<s>1<s>18<s>19]"
 
-                + "[(14-19)s:treat|_1#14-19|<>:vb#14-19$<i>2<s>19|<>:vp#14-36$<i>5<s>3|"
+                        + "[(14-19)s:treat|_1#14-19|<>:vb#14-19$<i>2<s>19|<>:vp#14-36$<i>5<s>3|"
                         + ">:stanford/d:tag$<i>0<s>2<s>19<s>18|"
                         + ">:stanford/d:tag$<i>3<s>3<s>19<s>21|"
                         + ">:stanford/d:tag$<i>4<s>4<s>19<s>22]"
 
-                + "[(20-22)s:my|_2#20-22|<>:prp#20-22$<i>3<s>20|<>:np#20-31$<i>4<s>4]"
+                        + "[(20-22)s:my|_2#20-22|<>:prp#20-22$<i>3<s>20|<>:np#20-31$<i>4<s>4]"
 
-                + "[(23-31)s:daughter|_3#23-31|<>:nn#23-31$<i>4<s>21|"
+                        + "[(23-31)s:daughter|_3#23-31|<>:nn#23-31$<i>4<s>21|"
                         + ">:stanford/d:tag$<i>2<s>5<s>21<s>20]"
 
-                + "[(32-36)s:well|_4#32-36|<>:rb#32-36$<i>5<s>22|<>:advp#32-36$<i>5<s>5]"
+                        + "[(32-36)s:well|_4#32-36|<>:rb#32-36$<i>5<s>22|<>:advp#32-36$<i>5<s>5]"
 
-                + "[(38-41)s:She|_5#38-41|<>:prp#38-41$<i>6<s>23|<>:np#38-41$<i>6<s>36|<>:s#38-97$<i>18<s>6]"
+                        + "[(38-41)s:She|_5#38-41|<>:prp#38-41$<i>6<s>23|<>:np#38-41$<i>6<s>36|<>:s#38-97$<i>18<s>6]"
 
-                + "[(42-44)s:is|_6#42-44|<>:vb#42-44$<i>7<s>24|<>:vp#42-96$<i>18<s>7]"
+                        + "[(42-44)s:is|_6#42-44|<>:vb#42-44$<i>7<s>24|<>:vp#42-96$<i>18<s>7]"
 
-                + "[(45-48)s:the|_7#45-48|<>:dt#45-48$<i>8<s>25|<>:np#45-52$<i>9<s>8|<>:np#45-96$<i>18<s>9]"
+                        + "[(45-48)s:the|_7#45-48|<>:dt#45-48$<i>8<s>25|<>:np#45-52$<i>9<s>8|<>:np#45-96$<i>18<s>9]"
 
-                + "[(49-52)s:one|_8#49-52|<>:nn#49-52$<i>9<s>26|"
+                        + "[(49-52)s:one|_8#49-52|<>:nn#49-52$<i>9<s>26|"
                         + ">:stanford/d:tag$<i>5<s>6<s>26<s>23|"
                         + ">:stanford/d:tag$<i>6<s>7<s>26<s>24|"
                         + ">:stanford/d:tag$<i>7<s>8<s>26<s>25|"
                         + ">:stanford/d:tag$<i>10<s>9<s>26<s>28]"
-                
-                + "[(53-57)s:that|_9#53-57|<>:rp#53-57$<i>10<s>27|<>:sb#53-96$<i>18<s>10]"
-                                              
-                + "[(58-63)s:saved|_10#58-63|<>:vb#58-63$<i>11<s>28|<>:s#58-96$<i>18<s>11|"
+
+                        + "[(53-57)s:that|_9#53-57|<>:rp#53-57$<i>10<s>27|<>:sb#53-96$<i>18<s>10]"
+
+                        + "[(58-63)s:saved|_10#58-63|<>:vb#58-63$<i>11<s>28|<>:s#58-96$<i>18<s>11|"
                         + "<>:vp#58-96$<i>18<s>12|"
                         + ">:stanford/d:tag$<i>9<s>10<s>28<s>27|"
                         + ">:stanford/d:tag$<i>12<s>11<s>28<s>30|"
                         + ">:stanford/d:tag$<i>15<s>12<s>28<s>33]"
 
-                + "[(64-68)s:your|_11#64-68|<>:prp#64-68$<i>12<s>29|<>:np#64-75$<i>13<s>13]"
+                        + "[(64-68)s:your|_11#64-68|<>:prp#64-68$<i>12<s>29|<>:np#64-75$<i>13<s>13]"
 
-                + "[(69-75)s:master|_12#69-75|<>:nn#69-75$<i>13<s>30|"
+                        + "[(69-75)s:master|_12#69-75|<>:nn#69-75$<i>13<s>30|"
                         + ">:stanford/d:tag$<i>11<s>13<s>30<s>29]"
 
-                + "[(76-79)s:who|_13#76-79|<>:rp#76-79$<i>14<s>31|<>:sb#76-96$<i>18<s>14]"
+                        + "[(76-79)s:who|_13#76-79|<>:rp#76-79$<i>14<s>31|<>:sb#76-96$<i>18<s>14]"
 
-                + "[(80-83)s:you|_14#80-83|<>:prp#80-83$<i>15<s>32|<>:np#80-83$<i>15<s>37|<>:s#80-96$<i>18<s>15]"
+                        + "[(80-83)s:you|_14#80-83|<>:prp#80-83$<i>15<s>32|<>:np#80-83$<i>15<s>37|<>:s#80-96$<i>18<s>15]"
 
-                + "[(84-88)s:hold|_15#84-88|<>:vb#84-88$<i>16<s>33|<>:vp#84-96$<i>18<s>16|"
+                        + "[(84-88)s:hold|_15#84-88|<>:vb#84-88$<i>16<s>33|<>:vp#84-96$<i>18<s>16|"
                         + ">:stanford/d:tag$<i>13<s>14<s>33<s>31|"
                         + ">:stanford/d:tag$<i>14<s>15<s>33<s>32|"
                         + ">:stanford/d:tag$<i>17<s>16<s>33<s>35]"
 
-                + "[(89-91)s:so|_16#89-91|<>:rb#89-91$<i>17<s>341|<>:adjp#89-96$<i>18<s>17]"
+                        + "[(89-91)s:so|_16#89-91|<>:rb#89-91$<i>17<s>341|<>:adjp#89-96$<i>18<s>17]"
 
-                + "[(92-96)s:dear|_17#92-96|<>:jj#92-96$<i>18<s>35|"
-                        + ">:stanford/d:tag$<i>16<s>17<s>35<s>34]"
-                 );
-                        
+                        + "[(92-96)s:dear|_17#92-96|<>:jj#92-96$<i>18<s>35|"
+                        + ">:stanford/d:tag$<i>16<s>17<s>35<s>34]");
+
         return fd;
     }
 }
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 63d2a64..8618592 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestRelationIndex.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestRelationIndex.java
@@ -289,6 +289,7 @@
         assertEquals(4, kr.getMatch(5).getEndPos());
     }
 
+
     /**
      * Relations only with/out attribute
      * */
@@ -307,9 +308,8 @@
 
         // child-of with attr func=sbj
         SpanWithAttributeQuery wq = new SpanWithAttributeQuery(fq,
-                new SpanAttributeQuery(
-                        new SpanTermQuery(new Term("base", "r@:func=sbj")),
-                        true), true);
+                new SpanAttributeQuery(new SpanTermQuery(new Term("base",
+                        "r@:func=sbj")), true), true);
 
         kr = ki.search(wq, (short) 20);
         assertEquals((long) 1, kr.getTotalResults());
@@ -385,11 +385,12 @@
         assertEquals(7, kr.getMatch(6).getEndPos());
     }
 
+
     /**
      * Dependency relations with attribute
      * */
     @Test
-    public void testCase5() throws IOException {
+    public void testCase5 () throws IOException {
         ki.addDoc(createFieldDoc2());
         ki.commit();
 
@@ -430,6 +431,7 @@
 
     }
 
+
     /**
      * Relation with specific sources, return any targets
      * */
@@ -485,11 +487,11 @@
         ki.commit();
 
         //return source of dep relations to pos:NN
-        
+
         SpanTermWithIdQuery tq = new SpanTermWithIdQuery(new Term("base",
                 "pos:NN"), true);
-        SpanRelationQuery srq = new SpanRelationQuery(new SpanTermQuery(new Term("base",
-                "<:dep")), true);
+        SpanRelationQuery srq = new SpanRelationQuery(new SpanTermQuery(
+                new Term("base", "<:dep")), true);
         srq.setSourceClass((byte) 1);
         SpanRelationMatchQuery rm = new SpanRelationMatchQuery(srq, tq, true);
         SpanQuery rv = new SpanFocusQuery(rm, (byte) 1);
@@ -505,8 +507,7 @@
 
         // return target of dep relations from pos:NN
         srq = new SpanRelationQuery(
-                new SpanTermQuery(
-                new Term("base", ">:dep")), true);
+                new SpanTermQuery(new Term("base", ">:dep")), true);
         srq.setTargetClass((byte) 1);
         rm = new SpanRelationMatchQuery(srq, tq, true);
         rv = new SpanFocusQuery(rm, (byte) 1);
@@ -525,7 +526,8 @@
 
     /**
      * Relation with specific sources and return any targets <br/>
-     * Relation with specific sources and targets, return the targets <br/>
+     * Relation with specific sources and targets, return the targets
+     * <br/>
      * Relation with specific sources and targets, return the sources
      * 
      * @throws IOException
@@ -606,8 +608,9 @@
 
     }
 
+
     @Test
-    public void testCase10() throws IOException {
+    public void testCase10 () throws IOException {
         ki.addDoc(createFieldDoc2());
         ki.commit();
         SpanElementQuery seq1 = new SpanElementQuery("base", "np");
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 c0e1cf5..df00673 100644
--- a/src/test/java/de/ids_mannheim/korap/query/TestKrillQueryJSON.java
+++ b/src/test/java/de/ids_mannheim/korap/query/TestKrillQueryJSON.java
@@ -245,6 +245,7 @@
         assertEquals(sqwi.toQuery().toString(), "tokens:base/p:foo");
     };
 
+
     @Test
     public void queryJSONBspClass () throws QueryException {
         SpanQueryWrapper sqwi = jsonQuery(getClass().getResource(
@@ -450,46 +451,40 @@
                 "spanOverlap(<tokens:s />, spanNext(tokens:tt/p:CARD, SpanMultiTermQueryWrapper(tokens:/tt/p:N.*/)))");
     };
 
+
     @Test
     public void queryJSONflags1 () throws QueryException {
         // buchstabe/i
         SpanQueryWrapper sqwi = jsonQuery(getClass().getResource(
                 "/queries/flags/caseInsensitive.jsonld").getFile());
 
-        assertEquals(
-                sqwi.toQuery().toString(),
-                "tokens:i:buchstabe");
+        assertEquals(sqwi.toQuery().toString(), "tokens:i:buchstabe");
     };
 
+
     @Test
     public void queryJSONflags2 () throws QueryException {
         // buchstabe/i
         try {
-            String json = getString(
-                getClass().getResource(
-                    "/queries/flags/unknown1.jsonld"
-                ).getFile()
-            );
+            String json = getString(getClass().getResource(
+                    "/queries/flags/unknown1.jsonld").getFile());
             KrillQuery kq = new KrillQuery("tokens");
-            assertEquals(kq.fromJson(json).toQuery().toString(),"tokens:s:buchstabe");
-            assertEquals(kq.getWarning(0).getCode(), 748);
-            
-            json = getString(
-                getClass().getResource(
-                    "/queries/flags/unknown2.jsonld"
-                ).getFile()
-            );
-            kq = new KrillQuery("tokens");
-            assertEquals(kq.fromJson(json).toQuery().toString(),"tokens:i:buchstabe");
+            assertEquals(kq.fromJson(json).toQuery().toString(),
+                    "tokens:s:buchstabe");
             assertEquals(kq.getWarning(0).getCode(), 748);
 
-            json = getString(
-                getClass().getResource(
-                    "/queries/flags/unknown3.jsonld"
-                ).getFile()
-            );
+            json = getString(getClass().getResource(
+                    "/queries/flags/unknown2.jsonld").getFile());
             kq = new KrillQuery("tokens");
-            assertEquals(kq.fromJson(json).toQuery().toString(),"tokens:i:buchstabe");
+            assertEquals(kq.fromJson(json).toQuery().toString(),
+                    "tokens:i:buchstabe");
+            assertEquals(kq.getWarning(0).getCode(), 748);
+
+            json = getString(getClass().getResource(
+                    "/queries/flags/unknown3.jsonld").getFile());
+            kq = new KrillQuery("tokens");
+            assertEquals(kq.fromJson(json).toQuery().toString(),
+                    "tokens:i:buchstabe");
             assertEquals(kq.getWarning(0).getCode(), 748);
 
         }
@@ -498,6 +493,7 @@
         };
     };
 
+
     public static String getString (String path) {
         StringBuilder contentBuilder = new StringBuilder();
         try {
diff --git a/src/test/java/de/ids_mannheim/korap/query/TestSpanReferenceQueryJSON.java b/src/test/java/de/ids_mannheim/korap/query/TestSpanReferenceQueryJSON.java
index 57c29bc..a401916 100644
--- a/src/test/java/de/ids_mannheim/korap/query/TestSpanReferenceQueryJSON.java
+++ b/src/test/java/de/ids_mannheim/korap/query/TestSpanReferenceQueryJSON.java
@@ -14,7 +14,7 @@
 public class TestSpanReferenceQueryJSON {
 
     @Test
-    public void testFirstOperandRef() throws IOException, QueryException {
+    public void testFirstOperandRef () throws IOException, QueryException {
 
         String filepath = getClass().getResource(
                 "/queries/reference/first-operand-reference.jsonld").getFile();
@@ -30,8 +30,9 @@
                 sq.toString());
     }
 
+
     @Test
-    public void testSecondOperandRef() throws QueryException {
+    public void testSecondOperandRef () throws QueryException {
 
         String filepath = getClass().getResource(
                 "/queries/reference/second-operand-reference.jsonld").getFile();
@@ -47,8 +48,9 @@
                         + "{3: tokens:p:P}), 3)", sq.toString());
     }
 
+
     @Test
-    public void testMultipleReferences() throws QueryException {
+    public void testMultipleReferences () throws QueryException {
         String filepath = getClass().getResource(
                 "/queries/reference/multiple-references.jsonld").getFile();
         SpanQueryWrapper sqwi = getJSONQuery(filepath);
@@ -60,55 +62,38 @@
                 "spanReference(focus(#[1,2]spanSegment(focus(#2: spanSegment(spanRelation(tokens:>:mate/d:HEAD), "
                         + "focus(2: spanReference(spanNext(focus(1: spanNext(focus(2: spanNext({1: <tokens:c:VP />}, "
                         + "{2: <tokens:c:NP />})), {3: <tokens:c:PP />})), {3: <tokens:c:PP />}), 3)))), "
-                        + "{1: <tokens:c:VP />})), 1)",
-                sq.toString());
+                        + "{1: <tokens:c:VP />})), 1)", sq.toString());
     }
 
+
     @Test
-    public void testDistanceReferences() throws QueryException {
+    public void testDistanceReferences () throws QueryException {
         String filepath = getClass().getResource(
-            "/queries/reference/bug-multiple-distance-simple.jsonld"
-        ).getFile();
+                "/queries/reference/bug-multiple-distance-simple.jsonld")
+                .getFile();
         SpanQueryWrapper sqwi = getJSONQuery(filepath);
         SpanQuery sq = sqwi.toQuery();
 
-        assertEquals("spanDistance(<tokens:c:vb />, <tokens:c:prp />, [(w[1:1], notOrdered, notExcluded)])", sq.toString());
+        assertEquals(
+                "spanDistance(<tokens:c:vb />, <tokens:c:prp />, [(w[1:1], notOrdered, notExcluded)])",
+                sq.toString());
 
         // "/queries/reference/distance-reference.jsonld").getFile();
         filepath = getClass().getResource(
-            "/queries/reference/bug-multiple-distance.jsonld"
-        ).getFile();
+                "/queries/reference/bug-multiple-distance.jsonld").getFile();
         sqwi = getJSONQuery(filepath);
         sq = sqwi.toQuery();
 
         // 'cat="VP" & cat="NP" & cat="PP" & #1 . #2 & #2 . #3 & #1 .
         // #3 & #2 ->dep #1'
-        assertEquals(
-        "spanReference("+
-          "focus("+
-            "#[1,2]spanSegment("+
-              "focus("+
-                "#2: spanSegment("+
-                  "spanRelation(tokens:>:stanford/d:tag), " +
-                    "focus("+
-                      "2: spanDistance("+
-                        "focus("+
-                          "1: spanDistance("+
-                            "<tokens:c:vb />, "+
-                            "{1: <tokens:c:prp />}, " +
-                            "[(w[1:1], notOrdered, notExcluded)]"+
-                          ")"+
-                        "), "+
-                        "{2: <tokens:c:nn />}, "+
-                        "[(w[0:2], ordered, notExcluded)]"+
-                      ")"+
-                    ")"+
-                  ")"+
-                "), " +
-                "{1: <tokens:c:prp />}"+
-              ")"+
-            "), 1"+
-          ")",
-        sq.toString());
+        assertEquals("spanReference(" + "focus(" + "#[1,2]spanSegment("
+                + "focus(" + "#2: spanSegment("
+                + "spanRelation(tokens:>:stanford/d:tag), " + "focus("
+                + "2: spanDistance(" + "focus(" + "1: spanDistance("
+                + "<tokens:c:vb />, " + "{1: <tokens:c:prp />}, "
+                + "[(w[1:1], notOrdered, notExcluded)]" + ")" + "), "
+                + "{2: <tokens:c:nn />}, " + "[(w[0:2], ordered, notExcluded)]"
+                + ")" + ")" + ")" + "), " + "{1: <tokens:c:prp />}" + ")"
+                + "), 1" + ")", sq.toString());
     }
 }
diff --git a/src/test/java/de/ids_mannheim/korap/query/TestSpanRelationQueryJSON.java b/src/test/java/de/ids_mannheim/korap/query/TestSpanRelationQueryJSON.java
index fccd34a..b051509 100644
--- a/src/test/java/de/ids_mannheim/korap/query/TestSpanRelationQueryJSON.java
+++ b/src/test/java/de/ids_mannheim/korap/query/TestSpanRelationQueryJSON.java
@@ -89,6 +89,7 @@
                 sq.toString());
     }
 
+
     @Test
     public void testFocusSource () throws QueryException {
         //
@@ -101,8 +102,9 @@
                 sq.toString());
     }
 
+
     @Test
-    public void testFocusTarget() throws QueryException {
+    public void testFocusTarget () throws QueryException {
         String filepath = getClass().getResource(
                 "/queries/relation/focus-target.json").getFile();
         SpanQueryWrapper sqwi = getJSONQuery(filepath);
@@ -113,8 +115,9 @@
                 sq.toString());
     }
 
+
     @Test
-    public void testFocusEmptyTarget() throws QueryException {
+    public void testFocusEmptyTarget () throws QueryException {
         String filepath = getClass().getResource(
                 "/queries/relation/focus-empty-target.json").getFile();
         SpanQueryWrapper sqwi = getJSONQuery(filepath);
@@ -124,8 +127,9 @@
                 sq.toString());
     }
 
+
     @Test
-    public void testFocusEmptyBoth() throws QueryException {
+    public void testFocusEmptyBoth () throws QueryException {
         String filepath = getClass().getResource(
                 "/queries/relation/focus-empty-both.json").getFile();
         SpanQueryWrapper sqwi = getJSONQuery(filepath);
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 423af96..b93ddfb 100644
--- a/src/test/java/de/ids_mannheim/korap/response/TestResponse.java
+++ b/src/test/java/de/ids_mannheim/korap/response/TestResponse.java
@@ -84,6 +84,7 @@
         assertEquals("Fehler 4", respJson.at("/errors/0/1").asText());
     };
 
+
     // TODO: Skip this for the moment and refactor later
     @Ignore
     public void testResponseDeserialzation () throws IOException {
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 8c4cd40..fd2e7c3 100644
--- a/src/test/java/de/ids_mannheim/korap/search/TestKrill.java
+++ b/src/test/java/de/ids_mannheim/korap/search/TestKrill.java
@@ -188,10 +188,12 @@
         assertEquals(kr.getTotalResults(), 1);
     };
 
+
     // Todo: There SHOULD be a failure here, but Koral currently creates empty collections
     @Test
     public void queryJSONapiTest1 () {
-        Krill test = new Krill("{\"@context\":\"http://korap.ids-mannheim.de/ns/koral/0.3/context.jsonld\",\"errors\":[],\"warnings\":[],\"messages\":[],\"collection\":{},\"query\":{\"@type\":\"koral:token\",\"wrap\":{\"@type\":\"koral:term\",\"layer\":\"orth\",\"key\":\"Baum\",\"match\":\"match:eq\"}},\"meta\":{}}");
+        Krill test = new Krill(
+                "{\"@context\":\"http://korap.ids-mannheim.de/ns/koral/0.3/context.jsonld\",\"errors\":[],\"warnings\":[],\"messages\":[],\"collection\":{},\"query\":{\"@type\":\"koral:token\",\"wrap\":{\"@type\":\"koral:term\",\"layer\":\"orth\",\"key\":\"Baum\",\"match\":\"match:eq\"}},\"meta\":{}}");
         assertFalse(test.hasErrors());
     };
 
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 7425cfd..6d9a4d5 100644
--- a/src/test/java/de/ids_mannheim/korap/search/TestResult.java
+++ b/src/test/java/de/ids_mannheim/korap/search/TestResult.java
@@ -149,13 +149,13 @@
         Krill ks = new Krill(json);
         Result kr = ks.apply(ki);
         assertEquals((long) 7, kr.getTotalResults());
-        
+
         ObjectMapper mapper = new ObjectMapper();
         JsonNode res = mapper.readTree(kr.toJsonString());
 
         assertEquals(7, res.at("/meta/totalResults").asInt());
-        assertEquals("spanOr([tokens:s:a, tokens:s:b])", res.at("/meta/serialQuery")
-                .asText());
+        assertEquals("spanOr([tokens:s:a, tokens:s:b])",
+                res.at("/meta/serialQuery").asText());
         assertEquals(5, res.at("/meta/itemsPerPage").asInt());
         assertEquals(0, res.at("/meta/startIndex").asInt());
 
@@ -175,24 +175,19 @@
 
         // Query
         assertEquals("koral:group", res.at("/query/@type").asText());
-        assertEquals("operation:or", res.at("/query/operation")
-                .asText());
+        assertEquals("operation:or", res.at("/query/operation").asText());
 
-        assertEquals("koral:token", res.at("/query/operands/0/@type")
+        assertEquals("koral:token", res.at("/query/operands/0/@type").asText());
+        assertEquals("koral:term", res.at("/query/operands/0/wrap/@type")
                 .asText());
-        assertEquals("koral:term",
-                res.at("/query/operands/0/wrap/@type").asText());
-        assertEquals("orth", res.at("/query/operands/0/wrap/layer")
-                .asText());
+        assertEquals("orth", res.at("/query/operands/0/wrap/layer").asText());
         assertEquals("a", res.at("/query/operands/0/wrap/key").asText());
         assertEquals("match:eq", res.at("/query/operands/0/wrap/match")
                 .asText());
-        assertEquals("koral:token", res.at("/query/operands/1/@type")
+        assertEquals("koral:token", res.at("/query/operands/1/@type").asText());
+        assertEquals("koral:term", res.at("/query/operands/1/wrap/@type")
                 .asText());
-        assertEquals("koral:term",
-                res.at("/query/operands/1/wrap/@type").asText());
-        assertEquals("orth", res.at("/query/operands/1/wrap/layer")
-                .asText());
+        assertEquals("orth", res.at("/query/operands/1/wrap/layer").asText());
         assertEquals("b", res.at("/query/operands/1/wrap/key").asText());
         assertEquals("match:eq", res.at("/query/operands/1/wrap/match")
                 .asText());
@@ -240,8 +235,8 @@
         JsonNode res = mapper.readTree(kr.toTokenListJsonString());
 
         assertEquals(3, res.at("/meta/totalResults").asInt());
-        assertEquals("spanNext(base:s:a, base:s:b)", res.at("/meta/serialQuery")
-                .asText());
+        assertEquals("spanNext(base:s:a, base:s:b)", res
+                .at("/meta/serialQuery").asText());
         assertEquals(0, res.at("/meta/startIndex").asInt());
         assertEquals(25, res.at("/meta/itemsPerPage").asInt());
 
diff --git a/src/test/resources/queries/collections/collection_6.jsonld b/src/test/resources/queries/collections/collection_6.jsonld
new file mode 100644
index 0000000..5e60008
--- /dev/null
+++ b/src/test/resources/queries/collections/collection_6.jsonld
@@ -0,0 +1,19 @@
+{
+  "@context":"http://korap.ids-mannheim.de/ns/koral/0.3/context.jsonld",
+  "errors":[],
+  "warnings":[],
+  "messages":[],
+  "query":{
+    "@type":"koral:token",
+    "wrap":{
+      "@type":"koral:term",
+      "layer":"orth",
+      "key":"der",
+      "match":"match:eq",
+      "foundry":"opennlp"
+    }
+  },
+  "meta":{
+    "cutOff":null
+  }
+}
diff --git a/src/test/resources/queries/collections/collection_6_withCollection.jsonld b/src/test/resources/queries/collections/collection_6_withCollection.jsonld
new file mode 100644
index 0000000..91d960a
--- /dev/null
+++ b/src/test/resources/queries/collections/collection_6_withCollection.jsonld
@@ -0,0 +1,25 @@
+{
+  "@context":"http://korap.ids-mannheim.de/ns/koral/0.3/context.jsonld",
+  "errors":[],
+  "warnings":[],
+  "messages":[],
+  "collection":{
+    "@type":"koral:doc",
+    "key":"textClass",
+    "value":"reisen",
+    "match":"match:eq"
+  },
+  "query":{
+    "@type":"koral:token",
+    "wrap":{
+      "@type":"koral:term",
+      "layer":"orth",
+      "key":"der",
+      "match":"match:eq",
+      "foundry":"opennlp"
+    }
+  },
+  "meta":{
+    "cutOff":null
+  }
+}
