diff --git a/src/main/java/de/ids_mannheim/korap/KrillCollection.java b/src/main/java/de/ids_mannheim/korap/KrillCollection.java
index 032b817..ae09adc 100644
--- a/src/main/java/de/ids_mannheim/korap/KrillCollection.java
+++ b/src/main/java/de/ids_mannheim/korap/KrillCollection.java
@@ -492,8 +492,8 @@
         };
 
         // Remove deleted docs
-        return (DocIdSet) BitsFilteredDocIdSet.wrap((DocIdSet) new BitDocIdSet(bitset),
-                acceptDocs);
+        return (DocIdSet) BitsFilteredDocIdSet.wrap((DocIdSet) new BitDocIdSet(
+                bitset), acceptDocs);
     };
 
 
diff --git a/src/main/java/de/ids_mannheim/korap/KrillIndex.java b/src/main/java/de/ids_mannheim/korap/KrillIndex.java
index e1dc6c3..26b5dad 100644
--- a/src/main/java/de/ids_mannheim/korap/KrillIndex.java
+++ b/src/main/java/de/ids_mannheim/korap/KrillIndex.java
@@ -687,31 +687,31 @@
      * @return The number of the occurrences.
      * @throws IOException
      */
-        /*
+    /*
     @Deprecated
     public long numberOf (Bits docvec, String field, String type)
-            throws IOException {
-        // Shortcut for documents
-        if (type.equals("documents")) {
-            FixedBitSet os = (FixedBitSet) docvec;
-            return os.cardinality();
-        };
-
-        Term term = new Term(field, "-:" + type);
-
-        int occurrences = 0;
-        try {
-            for (LeafReaderContext atomic : this.reader().leaves()) {
-                occurrences += this._numberOfAtomic(docvec, atomic, term);
-            };
-        }
-        catch (IOException e) {
-            log.warn(e.getLocalizedMessage());
-        };
-
-        return occurrences;
+        throws IOException {
+    // Shortcut for documents
+    if (type.equals("documents")) {
+        FixedBitSet os = (FixedBitSet) docvec;
+        return os.cardinality();
     };
-*/
+
+    Term term = new Term(field, "-:" + type);
+
+    int occurrences = 0;
+    try {
+        for (LeafReaderContext atomic : this.reader().leaves()) {
+            occurrences += this._numberOfAtomic(docvec, atomic, term);
+        };
+    }
+    catch (IOException e) {
+        log.warn(e.getLocalizedMessage());
+    };
+
+    return occurrences;
+    };
+    */
 
 
     // Search for meta information in term vectors
diff --git a/src/main/java/de/ids_mannheim/korap/collection/BooleanGroupFilter.java b/src/main/java/de/ids_mannheim/korap/collection/BooleanGroupFilter.java
index 1e5c878..2143664 100644
--- a/src/main/java/de/ids_mannheim/korap/collection/BooleanGroupFilter.java
+++ b/src/main/java/de/ids_mannheim/korap/collection/BooleanGroupFilter.java
@@ -121,6 +121,7 @@
         return buffer.append(')').toString();
     };
 
+
     /*
     @Override
     public String toString (String str) {
@@ -167,7 +168,8 @@
                             log.debug("- Filter to allow all documents");
 
                         bitset.set(0, maxDoc);
-                        return BitsFilteredDocIdSet.wrap(new BitDocIdSet(bitset), acceptDocs);
+                        return BitsFilteredDocIdSet.wrap(
+                                new BitDocIdSet(bitset), acceptDocs);
                     };
 
                     // There is no possible match
diff --git a/src/main/java/de/ids_mannheim/korap/index/Indexer.java b/src/main/java/de/ids_mannheim/korap/index/Indexer.java
index 33e5eb2..9c528a7 100644
--- a/src/main/java/de/ids_mannheim/korap/index/Indexer.java
+++ b/src/main/java/de/ids_mannheim/korap/index/Indexer.java
@@ -128,9 +128,9 @@
                 case "-d":
                     path = argv[i + 1];
                     break;
-            default:
-                last = true;
-                break;
+                default:
+                    last = true;
+                    break;
             };
 
             if (last)
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 02f0d5e..32e3242 100644
--- a/src/main/java/de/ids_mannheim/korap/index/MultiTermTokenStream.java
+++ b/src/main/java/de/ids_mannheim/korap/index/MultiTermTokenStream.java
@@ -416,7 +416,7 @@
 
         // There is payload in the MultiTerm
         if (mt.payload != null) {
-            
+
             payload.put(mt.payload.bytes);
 
             if (DEBUG)
@@ -428,14 +428,9 @@
         if (payload.position() > 0) {
 
             if (payload.hasArray()) {
-                payloadAttr.setPayload(
-                                       new BytesRef(
-                                                    Arrays.copyOfRange(payload.array(),
-                                                                       payload.arrayOffset(),
-                                                                       payload.arrayOffset() + payload.position()
-                                                                       )
-                                                    )
-                                       );
+                payloadAttr.setPayload(new BytesRef(Arrays.copyOfRange(
+                        payload.array(), payload.arrayOffset(),
+                        payload.arrayOffset() + payload.position())));
             }
             else {
                 log.error("This should never happen!");
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 684b020..47224dd 100644
--- a/src/main/java/de/ids_mannheim/korap/index/TermInfo.java
+++ b/src/main/java/de/ids_mannheim/korap/index/TermInfo.java
@@ -31,7 +31,7 @@
     private byte depth = (byte) 0;
 
     private Pattern prefixRegex = Pattern
-        .compile("(?:([^/]+)/)?([^:/]+)(?::(.+?))?");
+            .compile("(?:([^/]+)/)?([^:/]+)(?::(.+?))?");
     private Matcher matcher;
 
 
@@ -54,40 +54,40 @@
 
         // TODO: Use PTI!
         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
@@ -227,7 +227,7 @@
 
 
     @Override
-        public int compareTo (TermInfo obj) {
+    public int compareTo (TermInfo obj) {
         this.analyze();
         obj.analyze();
 
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 9dcdbd5..4958bea 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
@@ -50,15 +50,16 @@
     private int currentDoc, currentPosition;
     private boolean isFinish;
 
-	public static enum PayloadTypeIdentifier {
-		TERM_ATTRIBUTE(16), ELEMENT_ATTRIBUTE(17), RELATION_ATTRIBUTE(18);
+    public static enum PayloadTypeIdentifier {
+        TERM_ATTRIBUTE(16), ELEMENT_ATTRIBUTE(17), RELATION_ATTRIBUTE(18);
 
-		private int value;
+        private int value;
 
-		private PayloadTypeIdentifier(int value) {
-			this.value = value;
-		}
-	}
+
+        private PayloadTypeIdentifier (int value) {
+            this.value = value;
+        }
+    }
 
     protected Logger logger = LoggerFactory.getLogger(AttributeSpans.class);
 
@@ -164,25 +165,25 @@
      */
     private CandidateAttributeSpan createCandidateSpan () throws IOException {
         List<byte[]> payload = (List<byte[]>) firstSpans.getPayload();
-		ByteBuffer payloadBuffer = ByteBuffer.wrap(payload.get(0));
+        ByteBuffer payloadBuffer = ByteBuffer.wrap(payload.get(0));
 
-		byte payloadTypeIdentifier = payloadBuffer.get(0);
-		short spanId = payloadBuffer.getShort(5);
-		// if (payload.get(0).length == 6) {
-		int end = payloadBuffer.getInt(1);
+        byte payloadTypeIdentifier = payloadBuffer.get(0);
+        short spanId = payloadBuffer.getShort(5);
+        // if (payload.get(0).length == 6) {
+        int end = payloadBuffer.getInt(1);
 
-		return new CandidateAttributeSpan(firstSpans, payloadTypeIdentifier,
-				spanId, end);
+        return new CandidateAttributeSpan(firstSpans, payloadTypeIdentifier,
+                spanId, end);
 
-		// }
-		// else if (payload.get(0).length == 10) {
-		// start = wrapper.getInt(0);
-		// end = wrapper.getInt(4);
-		// spanId = wrapper.getShort(8);
-		// return new CandidateAttributeSpan(firstSpans, spanId, start, end);
-		// }
+        // }
+        // else if (payload.get(0).length == 10) {
+        // start = wrapper.getInt(0);
+        // end = wrapper.getInt(4);
+        // spanId = wrapper.getShort(8);
+        // return new CandidateAttributeSpan(firstSpans, spanId, start, end);
+        // }
 
-		// throw new NullPointerException("Missing element end in payloads.");
+        // throw new NullPointerException("Missing element end in payloads.");
     }
 
 
@@ -266,23 +267,23 @@
          *            belongs to.
          * @throws IOException
          */
-		public CandidateAttributeSpan(Spans span, byte payloadTypeIdenfitier,
-				short spanId, int elementEnd)
+        public CandidateAttributeSpan (Spans span, byte payloadTypeIdenfitier,
+                                       short spanId, int elementEnd)
                 throws IOException {
             super(span);
-			this.spanId = spanId;
+            this.spanId = spanId;
             this.end = elementEnd;
-			this.payloadTypeIdentifier = payloadTypeIdenfitier;
+            this.payloadTypeIdentifier = payloadTypeIdenfitier;
         }
 
 
-		// public CandidateAttributeSpan (Spans span, short spanId, int start,
-		// int end) throws IOException {
-		// super(span);
-		// setSpanId(spanId);
-		// this.start = start;
-		// this.end = end;
-		// }
+        // public CandidateAttributeSpan (Spans span, short spanId, int start,
+        // int end) throws IOException {
+        // super(span);
+        // setSpanId(spanId);
+        // this.start = start;
+        // this.end = end;
+        // }
 
         @Override
         public int compareTo (CandidateSpan o) {
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 7490dec..b132dc7 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
@@ -23,14 +23,15 @@
     private int position;
     private CandidateSpan childSpan; // used for example for multiple distance
                                      // with unordered constraint
-	protected short spanId;
-	protected boolean hasSpanId;
+    protected short spanId;
+    protected boolean hasSpanId;
 
     private short leftId, rightId;
     private int leftStart, leftEnd;
     private int rightStart, rightEnd;
 
-	protected byte payloadTypeIdentifier;
+    protected byte payloadTypeIdentifier;
+
 
     /**
      * Constructs a CandidateSpan for the given Span.
@@ -52,11 +53,11 @@
         if (span instanceof SimpleSpans) {
             SimpleSpans temp = (SimpleSpans) span;
             this.spanId = temp.getSpanId();
-			this.hasSpanId = temp.hasSpanId;
+            this.hasSpanId = temp.hasSpanId;
         }
         else if (span instanceof ClassSpans) {
             this.spanId = ((ClassSpans) span).getNumber();
-			this.hasSpanId = true;
+            this.hasSpanId = true;
         }
     }
 
@@ -301,8 +302,8 @@
      */
     public void setSpanId (short spanId) {
         this.spanId = spanId;
-		if (spanId > 0)
-			this.hasSpanId = true;
+        if (spanId > 0)
+            this.hasSpanId = true;
     }
 
 
@@ -366,15 +367,17 @@
     }
 
 
-	public byte getPayloadTypeIdentifier() {
-		return payloadTypeIdentifier;
-	}
+    public byte getPayloadTypeIdentifier () {
+        return payloadTypeIdentifier;
+    }
 
-	public void setPayloadTypeIdentifier(byte payloadTypeIdentifier) {
-		this.payloadTypeIdentifier = payloadTypeIdentifier;
-	}
 
-	@Override
+    public void setPayloadTypeIdentifier (byte payloadTypeIdentifier) {
+        this.payloadTypeIdentifier = payloadTypeIdentifier;
+    }
+
+
+    @Override
     public int compareTo (CandidateSpan o) {
         if (this.doc == o.doc) {
             if (this.getStart() == o.getStart()) {
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 b785d2e..71e8e42 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/ClassFilteredSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/ClassFilteredSpans.java
@@ -56,7 +56,8 @@
     private boolean isClassOperationValid () throws IOException {
         setBitsets();
 
-        int cardinality = Math.max(bitset1.cardinality(), bitset2.cardinality());
+        int cardinality = Math
+                .max(bitset1.cardinality(), bitset2.cardinality());
 
         bitset1.and(bitset2);
         // System.out.println("cardinality:" + cardinality);
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/ClassSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/ClassSpans.java
index 679b430..47a6998 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
@@ -143,11 +143,11 @@
         };
 
         // Todo: Better allocate using a Factory!
-		ByteBuffer bb = ByteBuffer.allocate(10);
-		bb.put((byte) 0);
-		bb.putInt(spans.start());
-		bb.putInt(spans.end());
-		bb.put(number);
+        ByteBuffer bb = ByteBuffer.allocate(10);
+        bb.put((byte) 0);
+        bb.putInt(spans.start());
+        bb.putInt(spans.end());
+        bb.put(number);
         /*
         System.err.println(
                            "####################### " + 
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 d3b9f6f..f6cd732 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
@@ -42,8 +42,7 @@
      * @throws IOException
      */
     public DistanceExclusionSpans (SpanDistanceQuery query,
-                                   LeafReaderContext context,
-                                   Bits acceptDocs,
+                                   LeafReaderContext context, Bits acceptDocs,
                                    Map<Term, TermContext> termContexts)
             throws IOException {
         super(query, context, acceptDocs, termContexts);
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 4a697f4..8227bda 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
@@ -20,38 +20,41 @@
 import de.ids_mannheim.korap.query.SpanElementQuery;
 
 /**
- * Enumeration of spans representing elements such as phrases, sentences and
+ * Enumeration of spans representing elements such as phrases,
+ * sentences and
  * paragraphs. Span length is stored as a payload.
  * 
- * Depth and certainty value payloads have not been loaded and handled yet.
+ * Depth and certainty value payloads have not been loaded and handled
+ * yet.
  * 
  * @author margaretha
  * @author diewald
  */
 public final class ElementSpans extends SimpleSpans {
     private final TermSpans termSpans;
-	private boolean isPayloadLoaded;
+    private boolean isPayloadLoaded;
 
     private final Logger log = LoggerFactory.getLogger(ElementSpans.class);
     // This advices the java compiler to ignore all loggings
     public static final boolean DEBUG = false;
 
     private byte[] b = new byte[10];
-    
-	public static enum PayloadTypeIdentifier {
-		ELEMENT(64), 
+
+    public static enum PayloadTypeIdentifier {
+        ELEMENT(64),
         // ELEMENT_WITH_TUI(65),
         // ELEMENT_WITH_CERTAINTY_VALUE (66),
         // ELEMENT_WITH_TUI_AND_CERTAINTY_VALUE (67),
         MILESTONE(65);
-		
+
         private byte value;
 
+
         private PayloadTypeIdentifier (int value) {
             this.value = (byte) value;
-		}
+        }
     }
-    
+
 
     /**
      * Constructs ElementSpans for the given {@link SpanElementQuery}.
@@ -73,8 +76,8 @@
             throws IOException {
         super(spanElementQuery, context, acceptDocs, termContexts);
         termSpans = (TermSpans) this.firstSpans;
-		hasMoreSpans = true;
-		// termSpans.next();
+        hasMoreSpans = true;
+        // termSpans.next();
     };
 
 
@@ -82,21 +85,22 @@
     public boolean next () throws IOException {
         if (!hasMoreSpans || !(hasMoreSpans = termSpans.next()))
             return false;
-        
-		isStartEnumeration = false;
-		this.matchPayload = null;
-		matchEndPosition = -1;
-		return advance();
-	};
 
-	private boolean advance() throws IOException {
-		
+        isStartEnumeration = false;
+        this.matchPayload = null;
+        matchEndPosition = -1;
+        return advance();
+    };
 
-		this.matchStartPosition = termSpans.start();
-		this.matchDocNumber = termSpans.doc();		
-		isPayloadLoaded = false;
-		return true;
-	};
+
+    private boolean advance () throws IOException {
+
+
+        this.matchStartPosition = termSpans.start();
+        this.matchDocNumber = termSpans.doc();
+        isPayloadLoaded = false;
+        return true;
+    };
 
 
     /*
@@ -106,48 +110,48 @@
      * solely based on their starting and doc position.
      */
     private void loadPayload () {
-		if (this.isPayloadLoaded) {
+        if (this.isPayloadLoaded) {
             return;
-		} 
-		else{
-			this.isPayloadLoaded = true;
-		}
+        }
+        else {
+            this.isPayloadLoaded = true;
+        }
 
-		List<byte[]> payload;
+        List<byte[]> payload;
 
         try {
-			payload = (List<byte[]>) termSpans.getPayload();
+            payload = (List<byte[]>) termSpans.getPayload();
         }
         catch (IOException e) {
-			// silently setting empty element and payload
+            // silently setting empty element and payload
             this.matchEndPosition = this.matchStartPosition;
             this.setSpanId((short) -1);
-			this.hasSpanId = false;
+            this.hasSpanId = false;
             this.matchPayload = null;
             return;
-		}
+        }
 
-		if (!payload.isEmpty()) {
+        if (!payload.isEmpty()) {
             // Get payload one by one
             final int length = payload.get(0).length;
             final ByteBuffer bb = ByteBuffer.allocate(length);
             bb.put(payload.get(0));
-			
-			this.payloadTypeIdentifier = bb.get(0);
-			this.matchEndPosition = bb.getInt(9);
+
+            this.payloadTypeIdentifier = bb.get(0);
+            this.matchEndPosition = bb.getInt(9);
 
             if (payloadTypeIdentifier == PayloadTypeIdentifier.ELEMENT.value
                     && length > 15) {
-				this.setSpanId(bb.getShort(14));
-				this.hasSpanId = true;
-			}
+                this.setSpanId(bb.getShort(14));
+                this.hasSpanId = true;
+            }
             else {
                 this.setSpanId((short) -1);
-				this.hasSpanId = false;
+                this.hasSpanId = false;
             }
 
-			// FIX ME
-			// Copy the start and end character offsets
+            // FIX ME
+            // Copy the start and end character offsets
             // b = Arrays.copyOfRange(bb.array(), 1, 9);
             // this.matchPayload = Collections.singletonList(b);
             this.matchPayload = Collections.singletonList(bb.array());
@@ -156,7 +160,7 @@
 
         this.matchEndPosition = this.matchStartPosition;
         this.setSpanId((short) -1);
-		this.hasSpanId = false;
+        this.hasSpanId = false;
         this.matchPayload = null;
     };
 
@@ -197,7 +201,7 @@
 
         if (hasMoreSpans && firstSpans.doc() < target
                 && firstSpans.skipTo(target)) {
-			return this.advance();
+            return this.advance();
         };
 
         hasMoreSpans = false;
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 b510282..4d64921 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
@@ -62,8 +62,7 @@
      * @throws IOException
      */
     public ExpandedExclusionSpans (SpanExpansionQuery spanExpansionQuery,
-                                   LeafReaderContext context,
-                                   Bits acceptDocs,
+                                   LeafReaderContext context, Bits acceptDocs,
                                    Map<Term, TermContext> termContexts)
             throws IOException {
         super(spanExpansionQuery, context, acceptDocs, termContexts);
@@ -332,9 +331,9 @@
      * @return a byte array of extension offsets and class number
      */
     private byte[] createExtensionPayloads (int start, int end) {
-		ByteBuffer buffer = ByteBuffer.allocate(10);
-		Byte classPTI = 0;
-		buffer.put(classPTI);
+        ByteBuffer buffer = ByteBuffer.allocate(10);
+        Byte classPTI = 0;
+        buffer.put(classPTI);
         buffer.putInt(start);
         buffer.putInt(end);
         buffer.put(classNumber);
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 14d9746..b31abb6 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
@@ -176,9 +176,9 @@
      * @return a byte array of extension offsets and the class number
      */
     private byte[] createExtensionPayloads (int start, int end) {
-		ByteBuffer buffer = ByteBuffer.allocate(10);
-		Byte classPTI = 0;
-		buffer.put(classPTI);
+        ByteBuffer buffer = ByteBuffer.allocate(10);
+        Byte classPTI = 0;
+        buffer.put(classPTI);
         buffer.putInt(start);
         buffer.putInt(end);
         buffer.put(classNumber);
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 f5caa29..9049ddb 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
@@ -167,7 +167,7 @@
             // this may be problematic for other calculated payloads!
 
             if ((!matchTemporaryClass && payload.length == 10)
-                || (matchTemporaryClass && payload.length == 11)) {
+                    || (matchTemporaryClass && payload.length == 11)) {
 
                 if (payload[0] == 0) {
                     if (classNumbers.contains(payload[9])) {
@@ -188,7 +188,7 @@
                         continue;
                     };
                 }
-			}
+            }
 
             // Remove span elements
             else if (payload[0] == (byte) 64) {
@@ -196,7 +196,7 @@
             };
 
             if (//payload.length == 8 || 
-                    (removeTemporaryClasses && payload.length == 11)) {
+            (removeTemporaryClasses && payload.length == 11)) {
                 continue;
             }
 
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 e17bdcf..9ab35e1 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
@@ -17,9 +17,8 @@
     private byte classNum;
 
 
-    public ReferenceSpans (SpanReferenceQuery query,
-                           LeafReaderContext context, Bits acceptDocs,
-                           Map<Term, TermContext> termContexts)
+    public ReferenceSpans (SpanReferenceQuery query, LeafReaderContext context,
+                           Bits acceptDocs, Map<Term, TermContext> termContexts)
             throws IOException {
         super(query, context, acceptDocs, termContexts);
         this.classNum = query.getClassNum();
@@ -51,10 +50,10 @@
         matchPayload.clear();
 
         for (byte[] payload : firstSpans.getPayload()) {
-			if (payload.length == 10 && payload[9] == classNum) {
+            if (payload.length == 10 && payload[9] == classNum) {
                 if (isFound) {
-					if (start == byte2int(payload, 1)
-							&& end == byte2int(payload, 5)) {
+                    if (start == byte2int(payload, 1)
+                            && end == byte2int(payload, 5)) {
                         match = true;
                         continue;
                     }
@@ -62,8 +61,8 @@
                     break;
                 }
 
-				start = byte2int(payload, 1);
-				end = byte2int(payload, 5);
+                start = byte2int(payload, 1);
+                end = byte2int(payload, 5);
                 isFound = true;
                 matchPayload.add(payload);
             }
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 c8306ea..572528e 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
@@ -66,11 +66,13 @@
 
         private byte value;
 
+
         private PayloadTypeIdentifier (int value) {
             this.value = (byte) value;
         }
     }
 
+
     /**
      * Constructs RelationSpans from the given
      * {@link SpanRelationQuery}.
@@ -127,8 +129,8 @@
                 this.matchEndPosition = cs.getEnd();
                 this.matchPayload = cs.getPayloads();
                 this.setRightStart(cs.getRightStart());
-				this.setRightEnd(cs.getRightEnd());
-				this.spanId = cs.getSpanId(); // relation id
+                this.setRightEnd(cs.getRightEnd());
+                this.spanId = cs.getSpanId(); // relation id
                 this.leftId = cs.getLeftId();
                 this.rightId = cs.getRightId();
                 candidateList.remove(0);
@@ -156,8 +158,7 @@
         while (hasMoreSpans && relationTermSpan.doc() == currentDoc
                 && relationTermSpan.start() == currentPosition) {
 
-            CandidateSpan cs = new CandidateSpan(
-                    relationTermSpan);
+            CandidateSpan cs = new CandidateSpan(relationTermSpan);
             readPayload(cs);
             setPayload(cs);
             candidateList.add(cs);
@@ -177,7 +178,7 @@
      * @param cs
      *            a CandidateRelationSpan
      */
-    private void readPayload(CandidateSpan cs) {
+    private void readPayload (CandidateSpan cs) {
         List<byte[]> payload = (List<byte[]>) cs.getPayloads();
         int length = payload.get(0).length;
         ByteBuffer bb = ByteBuffer.allocate(length);
@@ -187,28 +188,28 @@
 
         int i;
         this.payloadTypeIdentifier = bb.get(0);
-        
-        if (payloadTypeIdentifier == PayloadTypeIdentifier.TERM_TO_TERM.value){ // length 11            
+
+        if (payloadTypeIdentifier == PayloadTypeIdentifier.TERM_TO_TERM.value) { // length 11            
             i = bb.getInt(1);
             cs.setLeftEnd(cs.start + 1);
             cs.setRightStart(i);
             cs.setRightEnd(i + 1);
-			cs.setLeftId(bb.getShort(5)); // left id
-			cs.setRightId(bb.getShort(7)); // right id
-			if (length > 9) {
-				cs.setSpanId(bb.getShort(9)); // relation id
-			}
+            cs.setLeftId(bb.getShort(5)); // left id
+            cs.setRightId(bb.getShort(7)); // right id
+            if (length > 9) {
+                cs.setSpanId(bb.getShort(9)); // relation id
+            }
         }
         else if (payloadTypeIdentifier == PayloadTypeIdentifier.TERM_TO_ELEMENT.value) { // length
             // 15
             cs.setLeftEnd(cs.start + 1);
             cs.setRightStart(bb.getInt(1));
             cs.setRightEnd(bb.getInt(5));
-			cs.setLeftId(bb.getShort(9)); // left id
-			cs.setRightId(bb.getShort(11)); // right id
-			if (length > 13) {
-				cs.setSpanId(bb.getShort(13)); // relation id
-			}
+            cs.setLeftId(bb.getShort(9)); // left id
+            cs.setRightId(bb.getShort(11)); // right id
+            if (length > 13) {
+                cs.setSpanId(bb.getShort(13)); // relation id
+            }
         }
         else if (payloadTypeIdentifier == PayloadTypeIdentifier.ELEMENT_TO_TERM.value) { // length
             // 15
@@ -217,31 +218,31 @@
             i = bb.getInt(5);
             cs.setRightStart(i);
             cs.setRightEnd(i + 1);
-			cs.setLeftId(bb.getShort(9)); // left id
-			cs.setRightId(bb.getShort(11)); // right id
-			if (length > 13) {
-				cs.setSpanId(bb.getShort(13)); // relation id
-			}
+            cs.setLeftId(bb.getShort(9)); // left id
+            cs.setRightId(bb.getShort(11)); // right id
+            if (length > 13) {
+                cs.setSpanId(bb.getShort(13)); // relation id
+            }
         }
         else if (payloadTypeIdentifier == PayloadTypeIdentifier.ELEMENT_TO_ELEMENT.value) {
-			// length 19
+            // length 19
             cs.setEnd(bb.getInt(1));
             cs.setLeftEnd(cs.end);
             cs.setRightStart(bb.getInt(5));
             cs.setRightEnd(bb.getInt(9));
-			cs.setLeftId(bb.getShort(13)); // left id
-			cs.setRightId(bb.getShort(15)); // right id
-			if (length > 17) {
-				cs.setSpanId(bb.getShort(17)); // relation id
-			}
-		}
+            cs.setLeftId(bb.getShort(13)); // left id
+            cs.setRightId(bb.getShort(15)); // right id
+            if (length > 17) {
+                cs.setSpanId(bb.getShort(17)); // relation id
+            }
+        }
 
 
         // Payload is cleared.
     }
 
 
-    private void setPayload(CandidateSpan cs) throws IOException {
+    private void setPayload (CandidateSpan cs) throws IOException {
         ArrayList<byte[]> payload = new ArrayList<byte[]>();
         if (relationTermSpan.isPayloadAvailable()) {
             payload.addAll(relationTermSpan.getPayload());
@@ -285,13 +286,13 @@
             boolean keep) {
         ByteBuffer buffer = null;
         if (keep) {
-			buffer = ByteBuffer.allocate(10);
+            buffer = ByteBuffer.allocate(10);
         }
         else {
-			buffer = ByteBuffer.allocate(11);
+            buffer = ByteBuffer.allocate(11);
         }
-		Byte classPTI = 0;
-		buffer.put(classPTI);
+        Byte classPTI = 0;
+        buffer.put(classPTI);
         buffer.putInt(start);
         buffer.putInt(end);
         buffer.put(classNumber);
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 4a383ee..6918e38 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
@@ -36,7 +36,8 @@
     protected short spanId;
     protected boolean hasSpanId = false;
 
-	protected byte payloadTypeIdentifier;
+    protected byte payloadTypeIdentifier;
+
 
     public SimpleSpans () {
         collectPayloads = true;
@@ -127,10 +128,10 @@
     }
 
 
-	@Override
+    @Override
     public int end () {
         return matchEndPosition;
-	}
+    }
 
 
     @Override
@@ -177,22 +178,24 @@
         this.spanId = spanId;
     }
 
-	/**
-	 * Gets the payload type identifier (PTI) of the current span
-	 * 
-	 * @return a payload type identifier
-	 */
-	public byte getPayloadTypeIdentifier() {
-		return payloadTypeIdentifier;
-	}
 
-	/**
-	 * Sets the payload type identifier (PTI) of the current span
-	 * 
-	 * @param payloadTypeIdentifier
-	 */
-	public void setPayloadTypeIdentifier(byte payloadTypeIdentifier) {
-		this.payloadTypeIdentifier = payloadTypeIdentifier;
-	}
+    /**
+     * Gets the payload type identifier (PTI) of the current span
+     * 
+     * @return a payload type identifier
+     */
+    public byte getPayloadTypeIdentifier () {
+        return payloadTypeIdentifier;
+    }
+
+
+    /**
+     * Sets the payload type identifier (PTI) of the current span
+     * 
+     * @param payloadTypeIdentifier
+     */
+    public void setPayloadTypeIdentifier (byte payloadTypeIdentifier) {
+        this.payloadTypeIdentifier = payloadTypeIdentifier;
+    }
 
 }
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 e58f59d..147f9ed 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
@@ -238,12 +238,12 @@
      */
     private boolean searchSpanPosition () throws IOException {
         while (hasMoreSpans) {
-			// the element does not have an attribute
-			if (referentSpans.getSpanId() < 1) {
-				if (attributeList.size() == 0 || notAttributeList.size() > 0) {
-					return true;
-				}
-				hasMoreSpans = referentSpans.next();
+            // the element does not have an attribute
+            if (referentSpans.getSpanId() < 1) {
+                if (attributeList.size() == 0 || notAttributeList.size() > 0) {
+                    return true;
+                }
+                hasMoreSpans = referentSpans.next();
                 continue;
             }
             if (checkAttributeListPosition()) {
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 1bcfc40..64c2355 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
@@ -35,9 +35,9 @@
      * @param termContexts
      * @throws IOException
      */
-    public SubSpans (SpanSubspanQuery subspanQuery,
-                     LeafReaderContext context, Bits acceptDocs,
-                     Map<Term, TermContext> termContexts) throws IOException {
+    public SubSpans (SpanSubspanQuery subspanQuery, LeafReaderContext context,
+                     Bits acceptDocs, Map<Term, TermContext> termContexts)
+            throws IOException {
         super(subspanQuery, context, acceptDocs, termContexts);
         this.startOffset = subspanQuery.getStartOffset();
         this.length = subspanQuery.getLength();
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 e4b5d1b..a33e219 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
@@ -125,15 +125,16 @@
 
     @Override
     public long cost () {
-		if (candidateList.size() > 0) {
-			long cost = 0;
-			for (CandidateSpan candidateSpan : candidateList) {
-				cost += candidateSpan.getCost();
-			}
-			return cost + secondSpans.cost();
-		} else {
-			return firstSpans.cost() + secondSpans.cost();
-		}
+        if (candidateList.size() > 0) {
+            long cost = 0;
+            for (CandidateSpan candidateSpan : candidateList) {
+                cost += candidateSpan.getCost();
+            }
+            return cost + secondSpans.cost();
+        }
+        else {
+            return firstSpans.cost() + secondSpans.cost();
+        }
     }
 
 
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 705450d..3088b9f 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
@@ -47,8 +47,7 @@
      * @throws IOException
      */
     public UnorderedDistanceSpans (SpanDistanceQuery query,
-                                   LeafReaderContext context,
-                                   Bits acceptDocs,
+                                   LeafReaderContext context, Bits acceptDocs,
                                    Map<Term, TermContext> termContexts)
             throws IOException {
         super(query, context, acceptDocs, termContexts);
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 2027ab5..0ed45b2 100644
--- a/src/main/java/de/ids_mannheim/korap/response/Match.java
+++ b/src/main/java/de/ids_mannheim/korap/response/Match.java
@@ -244,14 +244,13 @@
                     if (DEBUG)
                         log.trace(
                                 "Have a highlight of class {} in {}-{} inside of {}-{}",
-                                number, start, end,
-                                this.getStartPos(),
+                                number, start, end, this.getStartPos(),
                                 this.getEndPos());
 
                     // Ignore classes out of match range and set by the system
                     // TODO: This may be decidable by PTI!
                     if ((number & 0xFF) <= 128 && start >= this.getStartPos()
-                        && end <= this.getEndPos()) {
+                            && end <= this.getEndPos()) {
                         log.trace("Add highlight of class {}!", number);
                         this.addHighlight(start, end - 1, number);
                     }
@@ -797,7 +796,8 @@
             int newStartChar = -1, newEndChar = -1;
 
             if (DEBUG)
-                log.trace("Extend match to context boundary with {} in docID {}",
+                log.trace(
+                        "Extend match to context boundary with {} in docID {}",
                         cquery.toString(), this.localDocID);
 
             while (true) {
@@ -843,7 +843,8 @@
                             };
                         }
                         catch (Exception e) {
-                            log.warn("Some problems with ByteBuffer: " + e.getMessage());
+                            log.warn("Some problems with ByteBuffer: "
+                                    + e.getMessage());
                         };
                     };
                 }
@@ -917,7 +918,7 @@
         // Relevant details are missing
         if (this.positionsToOffset == null || this.localDocID == -1) {
             log.warn("You have to define "
-                     + "positionsToOffset and localDocID first before");
+                    + "positionsToOffset and localDocID first before");
             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 2dc6516..4ac95f9 100644
--- a/src/main/java/de/ids_mannheim/korap/response/Response.java
+++ b/src/main/java/de/ids_mannheim/korap/response/Response.java
@@ -51,8 +51,7 @@
 
     private HashMap<String, ObjectNode> jsonFields;
 
-    private static final String KORAL_VERSION =
-        "http://korap.ids-mannheim.de/ns/KoralQuery/v0.3/context.jsonld";
+    private static final String KORAL_VERSION = "http://korap.ids-mannheim.de/ns/KoralQuery/v0.3/context.jsonld";
 
 
     /**
@@ -444,6 +443,7 @@
         return (Response) this.moveNotificationsFrom(meta);
     };
 
+
     public void addJsonNode (String key, ObjectNode value) {
         if (this.jsonFields == null)
             this.jsonFields = new HashMap<String, ObjectNode>(4);
