diff --git a/src/main/java/de/ids_mannheim/korap/analysis/MultiTermToken.java b/src/main/java/de/ids_mannheim/korap/analysis/MultiTermToken.java
index b3f0375..f923ef7 100644
--- a/src/main/java/de/ids_mannheim/korap/analysis/MultiTermToken.java
+++ b/src/main/java/de/ids_mannheim/korap/analysis/MultiTermToken.java
@@ -20,7 +20,7 @@
  */
 public class MultiTermToken {
     public List<MultiTerm> terms;
-    private static short i = 0;
+    private short i = 0;
     private boolean sorted = false;
 
     /**
diff --git a/src/main/java/de/ids_mannheim/korap/analysis/MultiTermTokenStream.java b/src/main/java/de/ids_mannheim/korap/analysis/MultiTermTokenStream.java
index 521f7b2..d53aac2 100644
--- a/src/main/java/de/ids_mannheim/korap/analysis/MultiTermTokenStream.java
+++ b/src/main/java/de/ids_mannheim/korap/analysis/MultiTermTokenStream.java
@@ -52,7 +52,7 @@
     private List<MultiTermToken> multiTermTokens;
     private int mttIndex   = 0,
                 mtIndex    = 0;
-    private static short i = 0;
+    private short i = 0;
 
     /**
      * Construct a new MultiTermTokenStream object.
diff --git a/src/main/java/de/ids_mannheim/korap/collection/BooleanFilter.java b/src/main/java/de/ids_mannheim/korap/collection/BooleanFilter.java
index cc9eebe..1d755dd 100644
--- a/src/main/java/de/ids_mannheim/korap/collection/BooleanFilter.java
+++ b/src/main/java/de/ids_mannheim/korap/collection/BooleanFilter.java
@@ -200,10 +200,10 @@
     public BooleanFilter date (String dateStr) {
 	KorapDate dateDF = new KorapDate(dateStr);
 
-	if (dateDF.year() == 0)
+	if (dateDF.year == 0)
 	    return this;
 
-	if (dateDF.day() == 0 || dateDF.month() == 0) {
+	if (dateDF.day == 0 || dateDF.month == 0) {
 	    int begin = dateDF.floor();
 	    int end = dateDF.ceil();
 
diff --git a/src/main/java/de/ids_mannheim/korap/match/HighlightCombinatorElement.java b/src/main/java/de/ids_mannheim/korap/match/HighlightCombinatorElement.java
index cafb8f4..6432c0e 100644
--- a/src/main/java/de/ids_mannheim/korap/match/HighlightCombinatorElement.java
+++ b/src/main/java/de/ids_mannheim/korap/match/HighlightCombinatorElement.java
@@ -3,7 +3,7 @@
 import org.apache.lucene.util.FixedBitSet;
 import de.ids_mannheim.korap.KorapMatch;
 import de.ids_mannheim.korap.match.Relation;
-import static de.ids_mannheim.korap.util.KorapHTML.*;
+import static de.ids_mannheim.korap.util.KorapString.*;
 import java.util.*;
 import java.io.*;
 
@@ -108,7 +108,7 @@
 	};
 
 	// HTML encode primary data
-	return encodeHTML(this.characters);
+	return escapeHTML(this.characters);
     };
 
     // Return bracket fragment for this combinator element
diff --git a/src/main/java/de/ids_mannheim/korap/util/KorapArray.java b/src/main/java/de/ids_mannheim/korap/util/KorapArray.java
index 62d1b8c..bc43d54 100644
--- a/src/main/java/de/ids_mannheim/korap/util/KorapArray.java
+++ b/src/main/java/de/ids_mannheim/korap/util/KorapArray.java
@@ -3,9 +3,10 @@
 import java.util.*;
 
 /**
- * @author Nils Diewald
+ * A collection of string array related
+ * utility functions.
  *
- * A collection of Array specific utilities for the Korap project.
+ * @author diewald
  */
 public class KorapArray {
 
@@ -14,19 +15,20 @@
      *
      * @param separator String to separate joined segments
      * @param strings Segments to join
+     * @return The joined string.
      */
     public static String join (String separator, String ... strings) {
-	if (strings.length == 0)
-	    return "";
+        if (strings.length == 0)
+            return "";
 
-	StringBuffer sb = new StringBuffer(strings[0]);
+        StringBuffer sb = new StringBuffer(strings[0]);
 
-	for (int i = 1; i < strings.length; i++) {
-	    sb.append(separator);
-	    sb.append(strings[i]);
-	};
+        for (int i = 1; i < strings.length; i++) {
+            sb.append(separator);
+            sb.append(strings[i]);
+        };
 
-	return sb.toString();
+        return sb.toString();
     };
 
 
@@ -35,18 +37,19 @@
      *
      * @param separator Character to separate joined segments
      * @param strings Segments to join
+     * @return The joined string.
      */
     public static String join (char separator, String ... strings) {
-	if (strings.length == 0)
-	    return "";
+        if (strings.length == 0)
+            return "";
 
-	StringBuffer sb = new StringBuffer(strings[0]);
-
-	for (int i = 1; i < strings.length; i++) {
-	    sb.append(separator);
-	    sb.append(strings[i]);
-	};
-
-	return sb.toString();
+        StringBuffer sb = new StringBuffer(strings[0]);
+        
+        for (int i = 1; i < strings.length; i++) {
+            sb.append(separator);
+            sb.append(strings[i]);
+        };
+        
+        return sb.toString();
     };
 };
diff --git a/src/main/java/de/ids_mannheim/korap/util/KorapByte.java b/src/main/java/de/ids_mannheim/korap/util/KorapByte.java
index 9115ba7..5d9285e 100644
--- a/src/main/java/de/ids_mannheim/korap/util/KorapByte.java
+++ b/src/main/java/de/ids_mannheim/korap/util/KorapByte.java
@@ -2,12 +2,11 @@
 
 import java.util.*;
 
-// Maybe wrong! TEST!
-
 /**
- * @author Nils Diewald
+ * A collection of byte and byte array related
+ * utility functions.
  *
- * A collection of methods to deal with Bytes and Byte arrays.
+ * @author diewald
  */
 public class KorapByte {
 
@@ -15,47 +14,47 @@
      * Convert an integer to a byte array.
      *
      * @param number The number to convert.
+     * @return The translated byte array.
      */
-    // Based on http://www.tutorials.de/java/228129-konvertierung-von-integer-byte-array.html
+    // Based on
+    // http://www.tutorials.de/java/228129-konvertierung-von-integer-byte-array.html
     public static byte[] int2byte (int number) {
-	byte[] data = new byte[4];
-	for (int i = 0; i < 4; ++i) {
-	    int shift = i << 3; // i * 8
-	    data[3-i] = (byte)((number & (0xff << shift)) >>> shift);
-	};
-	return data;
+        byte[] data = new byte[4];
+        for (int i = 0; i < 4; ++i) {
+            int shift = i << 3; // That's identical to i * 8
+            data[3-i] = (byte)((number & (0xff << shift)) >>> shift);
+        };
+        return data;
     };
 
+
     /**
      * Convert a byte array to an integer.
      *
-     * @param number The number to convert.
+     * @param data The byte array to convert.
+     * @return The translated integer.
      */
-    // Based on http://www.tutorials.de/java/228129-konvertierung-von-integer-byte-array.html
-    public static int byte2int (byte[] data, int offset) {
-	int number = 0;   
-	int i = (offset*4);  
-	for (; i < 4; ++i) {
-	    number |= (data[3-i] & 0xff) << (i << 3);
-	};
-	return number;
-    };
-
+    // Based on
+    // http://www.tutorials.de/java/228129-konvertierung-von-integer-byte-array.html
     public static int byte2int (byte[] data) {
-	return byte2int(data, 0);
+        return byte2int(data, 0);
     };
 
-    /*
-    public static short byte2short (byte[] data, int offset) {
-	short number = 0;
-	number |= (data[3-offset] & 0xff) << (offset << 3);
-	offset--;
-	number |= (data[3-offset] & 0xff) << (offset << 3);
-	return number;
-    };
 
-    public static short byte2short (byte[] data) {
-	return byte2short(datam 0);
+    /**
+     * Convert a byte array to an integer.
+     *
+     * @param data The byte array to convert.
+     * @param offset The byte offset.
+     * @return The translated integer.
+     */
+    // Based on
+    // http://www.tutorials.de/java/228129-konvertierung-von-integer-byte-array.html
+    public static int byte2int (byte[] data, int offset) {
+        int number = 0;   
+        int i = (offset * 4);  
+        for (; i < 4; ++i)
+            number |= (data[3-i] & 0xff) << (i << 3);
+        return number;
     };
-    */
 };
diff --git a/src/main/java/de/ids_mannheim/korap/util/KorapDate.java b/src/main/java/de/ids_mannheim/korap/util/KorapDate.java
index 8eafeb4..f17d4f1 100644
--- a/src/main/java/de/ids_mannheim/korap/util/KorapDate.java
+++ b/src/main/java/de/ids_mannheim/korap/util/KorapDate.java
@@ -4,163 +4,249 @@
 import java.util.regex.*;
 
 /**
- * @author Nils Diewald
+ * KorapDate implements a helper object to stringify
+ * and parse date strings optimized
+ * for integer range queries in Lucene.
+ * No support for b.c. dates.
  *
- * KorapDate implements a helper object to stringify and parse date strings implemented
- * for integer range queries.
+ * Strings are parsed and serialized to
+ * {@link http://tools.ietf.org/html/rfc3339 RFC3339}
+ * compatible strings with a day granularity according to
+ * {@link http://www.w3.org/TR/NOTE-datetime W3-DateTimes}.
+ *
+ * <blockquote><pre>
+ *   KorapDate kd = new KorapDate("2005-06-03");
+ *   System.err.println(kd.day());
+ *   // 3
+
+ *   kd = new KorapDate("2005-06");
+ *   System.err.println(kd.month());
+ *   // 6
+ * </pre></blockquote>
+ *
+ * @author diewald
  */
 public class KorapDate {
-    /*
-    protected char[] year  = new char[4];
-    protected char[] month = new char[2];
-    protected char[] day   = new char[2];
-    */
 
-    private int year = 0, month = 0, day = 0;
+    /**
+     * The year of the date.
+     */
+    public int year = 0;
 
+
+    /**
+     * The month of the date.
+     */
+    public int month = 0;
+
+
+    /**
+     * The day of the date.
+     */
+    public int day = 0;
+
+
+    // Date string regex pattern
     private static final Pattern datePattern = Pattern.compile(
-	"(\\d\\d\\d\\d)" +
-        "(?:[-/]?(\\d\\d)" +
-        "(?:[-/]?(\\d\\d))?)?"
+        "\\s*(\\d\\d\\d\\d)" +
+        "(?:\\s*[-/]?\\s*(\\d\\d)" +
+        "(?:\\s*[-/]?\\s*(\\d\\d))?)?\\s*"
     );
 
-    public static int END = 99_999_999;
-    public static int BEGINNING = 0;
+    /**
+     * Static value representing the minimum date.
+     */
+    public static final int BEGINNING = 0;
 
-    public KorapDate (String dateStr) {
-	if (dateStr == null || dateStr.isEmpty())
-	    return;
 
-	Matcher m = datePattern.matcher(dateStr);
-	if (m.matches()) {
-	    this.year = Integer.parseInt(m.group(1));
-	    if (m.group(2) != null)
-		this.month = Integer.parseInt(m.group(2));
-		if (m.group(3) != null)
-		    this.day   = Integer.parseInt(m.group(3));
-	}
-	else {
-	    return;
-	};
+    /**
+     * Static value representing the maximum date.
+     */
+    public static final int END = 99_999_999;
+
+
+    /**
+     * Construct a new KorapDate object.
+     */
+    public KorapDate () { };
+
+
+    /**
+     * Construct a new KorapDate object.
+     *
+     * @param date The date as a string (see synopsis).
+     */
+    public KorapDate (String date) {
+        if (date == null || date.isEmpty())
+            return;
+
+        // Use pattern to split string
+        Matcher m = datePattern.matcher(date);
+        if (m.matches()) {
+            this.year = Integer.parseInt(m.group(1));
+            if (m.group(2) != null)
+                this.month = Integer.parseInt(m.group(2));
+            if (m.group(3) != null)
+                this.day   = Integer.parseInt(m.group(3));
+        };
     };
 
-    private static int ceil (short padding, int nr) {
-	if (nr == 0) {
-	    if (padding == (short) 4) {
-		return 9999;
-	    }
-	    else if (padding == (short) 2) {
-		return 99;
-	    };
-	};
-	return nr;
-    };
 
-    // make yyyy???? become yyyy9999 and yyyymm?? yyyymm99
+    /**
+     * Get the date as an integer with ceiled values for
+     * undefined date segments.
+     *
+     * <blockquote><pre>
+     *   KorapDate kd = new KorapDate("2005-06");
+     *   System.err.println(kd.ceil());
+     *   // 20050699
+     * </pre></blockquote>
+     *
+     * @return ceiled integer value.
+     */
     public int ceil () {
-	return
-	    (ceil((short) 4, this.year) * 10_000) +
-	    (ceil((short) 2, this.month) * 100) +
-	    (ceil((short) 2, this.day));
+        return
+            (ceil((byte) 4, this.year) * 10_000) +
+            (ceil((byte) 2, this.month) * 100) +
+            (ceil((byte) 2, this.day));
     };
 
-    // make yyyy???? become yyyy0000 and yyyymm?? yyyymm00
+
+    /**
+     * Get the date as an integer with floored values for
+     * undefined date segments.
+     *
+     * <blockquote><pre>
+     *   KorapDate kd = new KorapDate("2005-06");
+     *   System.err.println(kd.floor());
+     *   // 20050600
+     * </pre></blockquote>
+     *
+     * @return floored integer value.
+     */
     public int floor () {
-	int floor = 0;
-	if (this.year == 0) {
-	    return 0;
-	}
-	else {
-	    floor = this.year * 10_000;
-	};
-	if (this.month == 0) {
-	    return floor;
-	}
-	else {
-	    floor += this.month * 100;
-	};
-	if (this.day == 0) {
-	    return floor;
-	};
-	return (floor + this.day);
+        int floor = 0;
+        if (this.year == 0)
+            return 0;
+
+        floor = this.year * 10_000;
+
+        if (this.month == 0)
+            return floor;
+
+        floor += this.month * 100;
+
+        if (this.day == 0)
+            return floor;
+
+        return (floor + this.day);
     };
 
 
-    public int year () {
-	return this.year;
-    };
-
-    public int month () {
-	return this.month;
-    };
-
-    public int day () {
-	return this.day;
-    };
-
-
+    /**
+     * Serialize date to string, appended by zeros,
+     * in the form of &quot;20050300&quot;.
+     *
+     * @return The date as a string.
+     */
     public String toString() {
-	StringBuilder sb = this.toStringBuilder();
-	if (sb.length() < 4)
-	    return null;
+        StringBuilder sb = this.toStringBuilder();
+        if (sb.length() < 4)
+            return null;
 
-	if (sb.length() < 8) {
-	    sb.append("00");
-	    if (sb.length() < 8) {
-		sb.append("00");
-	    };
-	};
+        if (sb.length() < 8) {
+            sb.append("00");
+            if (sb.length() < 8) {
+                sb.append("00");
+            };
+        };
 
-	return sb.toString();
+        return sb.toString();
     };
 
-    public String toDisplay() {
-	StringBuilder sb = this.toStringBuilder();
-	if (sb.length() == 8)
-	    sb.insert(6, '-');
 
-	if (sb.length() > 4)
-	    sb.insert(4, '-');
-
-	return sb.toString();
-    };
-
+    /**
+     * Serialize ceiled date to string.
+     *
+     * @return The date as a string.
+     */
     public String toCeilString() {
-	StringBuilder sb = new StringBuilder();
-	return sb.append(this.ceil()).toString();
+        StringBuilder sb = new StringBuilder();
+        return sb.append(this.ceil()).toString();
     };
 
+
+    /**
+     * Serialize floored date to string.
+     *
+     * @return The date as a string.
+     */
     public String toFloorString() {
-	StringBuilder sb = new StringBuilder();
-	return sb.append(this.floor()).toString();
+        StringBuilder sb = new StringBuilder();
+        return sb.append(this.floor()).toString();
     };
 
+
+    /**
+     * Serialize date to displayable string.
+     * See format description in the class description.
+     *
+     * @return The date as a string.
+     */
+    public String toDisplay() {
+        StringBuilder sb = this.toStringBuilder();
+        if (sb.length() == 8)
+            sb.insert(6, '-');
+
+        if (sb.length() > 4)
+            sb.insert(4, '-');
+
+        return sb.toString();
+    };
+
+
+
     // Format date as yyyymmdd
     private StringBuilder toStringBuilder () {
-	StringBuilder sb = new StringBuilder();
-	if (this.year != 0) {
+        StringBuilder sb = new StringBuilder();
 
-	    // Append year
-	    if (this.year < 100)
-		sb.append("20");
+        if (this.year != 0) {
 
-	    sb.append(this.year);
+            // Append year
+            if (this.year < 100)
+                sb.append("20");
+
+            sb.append(this.year);
 	    
-	    if (this.month != 0) {
+            if (this.month != 0) {
+                
+                // Append month
+                if (this.month < 10)
+                    sb.append('0');
 
-		// Append month
-		if (this.month < 10)
-		    sb.append('0');
-		sb.append(this.month);
+                sb.append(this.month);
 
-		if (this.day != 0) {
-		    // Append month
-		    if (this.day < 10)
-			sb.append('0');
-		    sb.append(this.day);
-		};
-	    };
-	};
-	return sb;
+                if (this.day != 0) {
+                    // Append month
+                    if (this.day < 10)
+                        sb.append('0');
+
+                    sb.append(this.day);
+                };
+            };
+        };
+        return sb;
+    };
+
+
+    // Ceil method
+    private static int ceil (byte padding, int nr) {
+        if (nr == 0) {
+            if (padding == (byte) 4)
+                return 9999;
+            else if (padding == (byte) 2)
+                return 99;
+        };
+        return nr;
     };
 };
diff --git a/src/main/java/de/ids_mannheim/korap/util/KorapHTML.java b/src/main/java/de/ids_mannheim/korap/util/KorapHTML.java
deleted file mode 100644
index cadbb11..0000000
--- a/src/main/java/de/ids_mannheim/korap/util/KorapHTML.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package de.ids_mannheim.korap.util;
-
-/**
- * @author Nils Diewald
- *
- * A collection of methods to deal with Bytes and Byte arrays.
- */
-public class KorapHTML {
-
-    /**
-     * Encode a string HTML secure.
-     *
-     * @param text The string to encode.
-     */
-    public static String encodeHTML (String text) {
-	return
-	    text.replace("&", "&amp;")
-	    .replace("<", "&lt;")
-	    .replace(">", "&gt;")
-	    .replace("\"", "&quot;");
-    };
-};
diff --git a/src/main/java/de/ids_mannheim/korap/util/KorapString.java b/src/main/java/de/ids_mannheim/korap/util/KorapString.java
index 2922425..a775dea 100644
--- a/src/main/java/de/ids_mannheim/korap/util/KorapString.java
+++ b/src/main/java/de/ids_mannheim/korap/util/KorapString.java
@@ -7,26 +7,50 @@
 import java.nio.charset.StandardCharsets;
 
 /**
- * @author Nils Diewald
+ * A collection of string related utility
+ * functions.
  *
- * A collection of methods to deal with Strings.
+ * @author diewald
  */
 public class KorapString {
 
     /**
-     * Get String from file
+     * Get String from file.
+     *
+     * @param path The path of the file represented as a string. 
+     * @param path The expected {@link Charset}. 
+     * @return The content of the file
+     * @throws IOException
      */
     public static String StringfromFile (String path, Charset encoding)
-	throws IOException {
-	byte[] encoded = Files.readAllBytes(Paths.get(path));
-	return new String(encoded, encoding);
+        throws IOException {
+        byte[] encoded = Files.readAllBytes(Paths.get(path));
+        return new String(encoded, encoding);
     };
 
 
     /**
-     * Get String from file
+     * Get String from file (expecting UTF-8).
+     *
+     * @param path The path of the file represented as a string. 
+     * @return The content of the file
+     * @throws IOException
      */
     public static String StringfromFile (String path) throws IOException {
-	return StringfromFile(path, StandardCharsets.UTF_8);
+        return StringfromFile(path, StandardCharsets.UTF_8);
+    };
+
+
+    /**
+     * Escape HTML relevant characters as entities.
+     *
+     * @param text The string to escape.
+     * @return The secured string.
+     */
+    public static String escapeHTML (String text) {
+        return text.replace("&", "&amp;")
+            .replace("<", "&lt;")
+            .replace(">", "&gt;")
+            .replace("\"", "&quot;");
     };
 };
diff --git a/src/main/java/de/ids_mannheim/korap/util/QueryException.java b/src/main/java/de/ids_mannheim/korap/util/QueryException.java
index dc9d002..7dca966 100644
--- a/src/main/java/de/ids_mannheim/korap/util/QueryException.java
+++ b/src/main/java/de/ids_mannheim/korap/util/QueryException.java
@@ -1,36 +1,81 @@
 package de.ids_mannheim.korap.util;
 
+/**
+ * Exception class for query processing problems.
+ *
+ * @author diewald
+ */
 public class QueryException extends Exception {
 	
-  int errorCode;
+    private int errorCode = 0;
   
-  public QueryException() {
-      super();
-  }
+    /**
+     * Construct a new QueryException.
+     */
+    public QueryException() {
+        super();
+    };
 
-  public QueryException(String message) {
-      super(message);
-  }
 
-  public QueryException(String message, Throwable cause) {
-      super(message, cause);
-  };
+    /**
+     * Construct a new QueryException.
+     *
+     * @param message Exception message.
+     */
+    public QueryException (String message) {
+        super(message);
+    };
 
-  public QueryException(Throwable cause) {
-      super(cause);
-  };  
+
+    /**
+     * Construct a new QueryException.
+     *
+     * @param code An integer value as an error code.
+     * @param message Exception message.
+     */
+    public QueryException (int code, String message) {	  
+        super(message);
+        this.setErrorCode(code);      
+    };
+
+
+    /**
+     * Construct a new QueryException.
+     *
+     * @param message Exception message.
+     * @param cause A {@link Throwable} object.
+     */
+    public QueryException (String message, Throwable cause) {
+        super(message, cause);
+    };
+
+
+    /**
+     * Construct a new QueryException.
+     *
+     * @param cause A {@link Throwable} object.
+     */    
+    public QueryException (Throwable cause) {
+        super(cause);
+    };  
   
-  public QueryException(int code, String message) {	  
-	  super(message);
-	  setErrorCode(code);      
-  }
 
-  public int getErrorCode() {
-	return errorCode;
-  }
+    /**
+     * Get the error code of the exception.
+     *
+     * @return The error code of the exception as an integer.
+     */
+    public int getErrorCode() {
+        return this.errorCode;
+    };
 
-  public void setErrorCode(int errorCode) {
-	this.errorCode = errorCode;
-  }
 
+    /**
+     * Set the error code of the exception.
+     *
+     * @param code The error code of the exception as an integer.
+     */
+    public void setErrorCode (int code) {
+        this.errorCode = code;
+    };
 };
