diff --git a/src/main/java/de/ids_mannheim/korap/KorapCollection.java b/src/main/java/de/ids_mannheim/korap/KorapCollection.java
index eca212f..e7b8d02 100644
--- a/src/main/java/de/ids_mannheim/korap/KorapCollection.java
+++ b/src/main/java/de/ids_mannheim/korap/KorapCollection.java
@@ -58,8 +58,8 @@
     public static final boolean DEBUG = false;
 
     public KorapCollection (KorapIndex ki) {
-	this.index = ki;
-	this.filter = new ArrayList<FilterOperation>(5);
+        this.index = ki;
+        this.filter = new ArrayList<FilterOperation>(5);
     };
 
     /**
@@ -68,60 +68,60 @@
      * legacy collections with the key "collections".
      */
     public KorapCollection (String jsonString) {
-	ObjectMapper mapper = new ObjectMapper();
-	this.filter = new ArrayList<FilterOperation>(5);
+        ObjectMapper mapper = new ObjectMapper();
+        this.filter = new ArrayList<FilterOperation>(5);
 
-	try {
-	    JsonNode json = mapper.readTree(jsonString);
+        try {
+            JsonNode json = mapper.readTree(jsonString);
 
-	    if (json.has("collection")) {
-		this.fromJSON(json.get("collection"));
-	    }
+            if (json.has("collection")) {
+                this.fromJSON(json.get("collection"));
+            }
 	    
-	    // Legacy collection serialization
-	    // This will be removed!
-	    else if (json.has("collections")) {
-		this.addMessage(
-		    850,
-		    "Collections are deprecated in favour of a single collection"
+            // Legacy collection serialization
+            // This will be removed!
+            else if (json.has("collections")) {
+                this.addMessage(
+                    850,
+                    "Collections are deprecated in favour of a single collection"
                 );
-		for (JsonNode collection : json.get("collections")) {
-		    this.fromJSONLegacy(collection);
-		};
-	    };
-	}
-	catch (QueryException qe) {
-	    this.addError(qe.getErrorCode(),qe.getMessage());
-	}
-	catch (IOException e) {
-	    this.addError(
-	        621,
-		"Unable to parse JSON",
-		"KorapCollection",
-		e.getLocalizedMessage()
-	    );
-	};
+                for (JsonNode collection : json.get("collections")) {
+                    this.fromJSONLegacy(collection);
+                };
+            };
+        }
+        catch (QueryException qe) {
+            this.addError(qe.getErrorCode(),qe.getMessage());
+        }
+        catch (IOException e) {
+            this.addError(
+                621,
+                "Unable to parse JSON",
+                "KorapCollection",
+                e.getLocalizedMessage()
+            );
+        };
     };
 
 
     public KorapCollection () {
-	this.filter = new ArrayList<FilterOperation>(5);
+        this.filter = new ArrayList<FilterOperation>(5);
     };
 
 
     public void fromJSON (String jsonString) throws QueryException {
-	ObjectMapper mapper = new ObjectMapper();
-	try {
-	    this.fromJSON((JsonNode) mapper.readTree(jsonString));
-	}
-	catch (Exception e) {
-	    this.addError(621, "Unable to parse JSON", "KorapCollection");
-	};
+        ObjectMapper mapper = new ObjectMapper();
+        try {
+            this.fromJSON((JsonNode) mapper.readTree(jsonString));
+        }
+        catch (Exception e) {
+            this.addError(621, "Unable to parse JSON", "KorapCollection");
+        };
     };
 
 
     public void fromJSON (JsonNode json) throws QueryException {
-	this.filter(new KorapFilter(json));
+        this.filter(new KorapFilter(json));
     };
 
 
@@ -129,13 +129,13 @@
      * Legacy API for collection filters.
      */
     public void fromJSONLegacy (String jsonString) throws QueryException {
-	ObjectMapper mapper = new ObjectMapper();
-	try {
-	    this.fromJSONLegacy((JsonNode) mapper.readValue(jsonString, JsonNode.class));
-	}
-	catch (Exception e) {
-	    this.addError(621, "Unable to parse JSON", "KorapCollection");
-	};
+        ObjectMapper mapper = new ObjectMapper();
+        try {
+            this.fromJSONLegacy((JsonNode) mapper.readValue(jsonString, JsonNode.class));
+        }
+        catch (Exception e) {
+            this.addError(621, "Unable to parse JSON", "KorapCollection");
+        };
     };
 
 
@@ -143,112 +143,110 @@
      * Legacy API for collection filters.
      */
     public void fromJSONLegacy (JsonNode json) throws QueryException {
-	if (!json.has("@type"))
-	    throw new QueryException(701, "JSON-LD group has no @type attribute");
+        if (!json.has("@type"))
+            throw new QueryException(701, "JSON-LD group has no @type attribute");
 
-	if (!json.has("@value"))
-	    throw new QueryException(851, "Legacy filter need @value fields");
+        if (!json.has("@value"))
+            throw new QueryException(851, "Legacy filter need @value fields");
 
-	String type = json.get("@type").asText();
+        String type = json.get("@type").asText();
 
-	KorapFilter kf = new KorapFilter();
-	kf.setBooleanFilter(
-            kf.fromJSONLegacy(json.get("@value"), "tokens")
-	);
-	if (type.equals("korap:meta-filter")) {
-	    if (DEBUG)
-		log.trace("Add Filter LEGACY");
-	    this.filter(kf);
-	}
+        KorapFilter kf = new KorapFilter();
+        kf.setBooleanFilter(kf.fromJSONLegacy(json.get("@value"), "tokens"));
+        if (type.equals("korap:meta-filter")) {
+            if (DEBUG)
+                log.trace("Add Filter LEGACY");
+            this.filter(kf);
+        }
 
-	else if (type.equals("korap:meta-extend")) {
-	    if (DEBUG)
-		log.trace("Add Extend LEGACY");
-	    this.extend(kf);
-	};
+        else if (type.equals("korap:meta-extend")) {
+            if (DEBUG)
+                log.trace("Add Extend LEGACY");
+            this.extend(kf);
+        };
     };
 
     public int getCount() {
-	return this.filterCount;
+        return this.filterCount;
     };
 
     public void setIndex (KorapIndex ki) {
-	this.index = ki;
+        this.index = ki;
     };
 
     // The checks asre not necessary
     public KorapCollection filter (BooleanFilter filter) {
-	if (DEBUG)
-	    log.trace("Added filter: {}", filter.toString());
+        if (DEBUG)
+            log.trace("Added filter: {}", filter.toString());
+        
+        if (filter == null) {
+            this.addWarning(830, "Filter was empty");
+            return this;
+        };
 
-	if (filter == null) {
-	    this.addWarning(830, "Filter was empty");
-	    return this;
-	};
-
-	Filter f = (Filter) new QueryWrapperFilter(filter.toQuery());
-	if (f == null) {
-	    this.addWarning(831, "Filter is not wrappable");
-	    return this;
-	};
-	FilterOperation fo = new FilterOperation(f, false);
-	if (fo == null) {
-	    this.addWarning(832, "Filter operation is invalid");
-	    return this;
-	};
-	this.filter.add(fo);
-	this.filterCount++;
-	return this;
+        Filter f = (Filter) new QueryWrapperFilter(filter.toQuery());
+        if (f == null) {
+            this.addWarning(831, "Filter is not wrappable");
+            return this;
+        };
+        FilterOperation fo = new FilterOperation(f, false);
+        if (fo == null) {
+            this.addWarning(832, "Filter operation is invalid");
+            return this;
+        };
+        this.filter.add(fo);
+        this.filterCount++;
+        return this;
     };
 
     // Filter based on UIDs
     public KorapCollection filterUIDs (String ... uids) {
-	BooleanFilter filter = new BooleanFilter();
-	filter.or("UID", uids);
-	if (DEBUG)
-	    log.debug("UID based filter: {}", filter.toString());
-	return this.filter(filter);
+        BooleanFilter filter = new BooleanFilter();
+        filter.or("UID", uids);
+        if (DEBUG)
+            log.debug("UID based filter: {}", filter.toString());
+        return this.filter(filter);
     };
 
 
     public KorapCollection filter (KorapFilter filter) {
-	return this.filter(filter.getBooleanFilter());
+        return this.filter(filter.getBooleanFilter());
     };
 
 
     public KorapCollection extend (BooleanFilter filter) {
-	if (DEBUG)
-	    log.trace("Added extension: {}", filter.toString());
-	this.filter.add(
-	    new FilterOperation(
-		(Filter) new QueryWrapperFilter(filter.toQuery()),
+        if (DEBUG)
+            log.trace("Added extension: {}", filter.toString());
+        this.filter.add(
+            new FilterOperation(
+                (Filter) new QueryWrapperFilter(filter.toQuery()),
                 true
             )
         );
-	this.filterCount++;
-	return this;
+        this.filterCount++;
+        return this;
     };
 
     public KorapCollection extend (KorapFilter filter) {
-	return this.extend(filter.getBooleanFilter());
+        return this.extend(filter.getBooleanFilter());
     };
 
     
     public ArrayList<FilterOperation> getFilters () {
-	return this.filter;
+        return this.filter;
     };
 
     public FilterOperation getFilter (int i) {
-	return this.filter.get(i);
+        return this.filter.get(i);
     };
 
 
     public String toString () {
-	StringBuilder sb = new StringBuilder();
-	for (FilterOperation fo : this.filter) {
-	    sb.append(fo.toString()).append("; ");
-	};
-	return sb.toString();
+        StringBuilder sb = new StringBuilder();
+        for (FilterOperation fo : this.filter) {
+            sb.append(fo.toString()).append("; ");
+        };
+        return sb.toString();
     };
 
     /**
@@ -256,178 +254,174 @@
      * testing purposes and not recommended for serious usage. 
      */
     public KorapResult search (SpanQuery query) {
-	return this.index.search(
+        return this.index.search(
             this,
-	    query,
-	    0,
-	    (short) 20,
-	    true, (short) 5,
-	    true, (short) 5
-	);
+            query,
+            0,
+            (short) 20,
+            true, (short) 5,
+            true, (short) 5
+        );
     };
 
     public FixedBitSet bits (AtomicReaderContext atomic) throws IOException  {
+        /*
+          Use Bits.MatchAllBits(int len)
+        */
+        boolean noDoc = true;
+        FixedBitSet bitset;
 
-	/*
-	  Use Bits.MatchAllBits(int len)
-	*/
+        if (this.filterCount > 0) {
+            bitset = new FixedBitSet(atomic.reader().maxDoc());
 
-	boolean noDoc = true;
-	FixedBitSet bitset;
+            ArrayList<FilterOperation> filters = (ArrayList<FilterOperation>) this.filter.clone();
 
-	if (this.filterCount > 0) {
-	    bitset = new FixedBitSet(atomic.reader().maxDoc());
+            FilterOperation kcInit = filters.remove(0);
+            if (DEBUG)
+                log.trace("FILTER: {}", kcInit);
 
-	    ArrayList<FilterOperation> filters = (ArrayList<FilterOperation>) this.filter.clone();
+            // Init vector
+            DocIdSet docids = kcInit.filter.getDocIdSet(atomic, null);
 
-	    FilterOperation kcInit = filters.remove(0);
-	    if (DEBUG)
-		log.trace("FILTER: {}", kcInit);
+            DocIdSetIterator filterIter = docids.iterator();
 
-	    // Init vector
-	    DocIdSet docids = kcInit.filter.getDocIdSet(atomic, null);
+            if (filterIter != null) {
+                if (DEBUG)
+                    log.trace("InitFilter has effect");
+                bitset.or(filterIter);
+                noDoc = false;
+            };
 
-	    DocIdSetIterator filterIter = docids.iterator();
+            if (!noDoc) {
+                for (FilterOperation kc : filters) {
+                    if (DEBUG)
+                        log.trace("FILTER: {}", kc);
 
-	    if (filterIter != null) {
-		if (DEBUG)
-		    log.trace("InitFilter has effect");
-		bitset.or(filterIter);
-		noDoc = false;
-	    };
+                    // TODO: BUG!!!!!!!!!!
+                    docids = kc.filter.getDocIdSet(atomic, kc.isExtension() ? null : bitset);
+                    filterIter = docids.iterator();
 
-	    if (!noDoc) {
-		for (FilterOperation kc : filters) {
-		    if (DEBUG)
-			log.trace("FILTER: {}", kc);
+                    if (filterIter == null) {
+                        // There must be a better way ...
+                        if (kc.isFilter()) {
+                            // TODO: Check if this is really correct!
+                            // Maybe here is the bug
+                            bitset.clear(0, bitset.length());
+                            noDoc = true;
+                        }
+                        else {
+                            // System.err.println("No term found");
+                        };
+                        continue;
+                    };
+                    if (kc.isExtension()) {
+                        // System.err.println("Term found!");
+                        // System.err.println("Old Card:" + bitset.cardinality());
+                        bitset.or(filterIter);
+                        // System.err.println("New Card:" + bitset.cardinality());
+                    }
+                    else {
+                        bitset.and(filterIter);
+                    };
+                };
 
-		    // TODO: BUG!!!!!!!!!!
-		    docids = kc.filter.getDocIdSet(atomic, kc.isExtension() ? null : bitset);
-		    filterIter = docids.iterator();
+                if (!noDoc) {
+                    FixedBitSet livedocs = (FixedBitSet) atomic.reader().getLiveDocs();
+                    if (livedocs != null) {
+                        bitset.and(livedocs);
+                    };
+                };
+            }
+            else {
+                return bitset;
+            };
+        }
+        else {
+            bitset = (FixedBitSet) atomic.reader().getLiveDocs();
+        };
 
-		    if (filterIter == null) {
-			// There must be a better way ...
-			if (kc.isFilter()) {
-			    // TODO: Check if this is really correct!
-			    // Maybe here is the bug
-			    bitset.clear(0, bitset.length());
-			    noDoc = true;
-			}
-			else {
-			    // System.err.println("No term found");
-			};
-			continue;
-		    };
-		    if (kc.isExtension()) {
-			// System.err.println("Term found!");
-			// System.err.println("Old Card:" + bitset.cardinality());
-			bitset.or(filterIter);
-			// System.err.println("New Card:" + bitset.cardinality());
-		    }
-		    else {
-			bitset.and(filterIter);
-		    };
-		};
-
-		if (!noDoc) {
-		    FixedBitSet livedocs = (FixedBitSet) atomic.reader().getLiveDocs();
-		    if (livedocs != null) {
-			bitset.and(livedocs);
-		    };
-		};
-	    }
-	    else {
-		return bitset;
-	    };
-	}
-	else {
-	    bitset = (FixedBitSet) atomic.reader().getLiveDocs();
-	};
-
-	return bitset;
+        return bitset;
     };
 
     public long numberOf (String foundry, String type) throws IOException {
-	if (this.index == null)
-	    return (long) -1;
+        if (this.index == null)
+            return (long) -1;
 
-	return this.index.numberOf(this, foundry, type);
+        return this.index.numberOf(this, foundry, type);
     };
 
     public long numberOf (String type) throws IOException {
-	if (this.index == null)
-	    return (long) -1;
-
-	return this.index.numberOf(this, "tokens", type);
+        if (this.index == null)
+            return (long) -1;
+        
+        return this.index.numberOf(this, "tokens", type);
     };
 
     // This is only for testing purposes!
     @Deprecated
     public HashMap getTermRelation(String field) throws Exception {
-	if (this.index == null) {
-	    HashMap<String,Long> map = new HashMap<>(1);
-	    map.put("-docs", (long) 0);
-	    return map;
-	};
+        if (this.index == null) {
+            HashMap<String,Long> map = new HashMap<>(1);
+            map.put("-docs", (long) 0);
+            return map;
+        };
 
-	return this.index.getTermRelation(this, field);
+        return this.index.getTermRelation(this, field);
     };
 
     @Deprecated
     public String getTermRelationJSON(String field) throws IOException {
-	ObjectMapper mapper = new ObjectMapper();
-	StringWriter sw = new StringWriter();
-	sw.append("{\"field\":");
-	mapper.writeValue(sw,field);
-	sw.append(",");
+        ObjectMapper mapper = new ObjectMapper();
+        StringWriter sw = new StringWriter();
+        sw.append("{\"field\":");
+        mapper.writeValue(sw,field);
+        sw.append(",");
 
-	try {
-	    HashMap<String, Long> map = this.getTermRelation(field);
+        try {
+            HashMap<String, Long> map = this.getTermRelation(field);
 
-	    sw.append("\"documents\":");
-	    mapper.writeValue(sw,map.remove("-docs"));
-	    sw.append(",");
+            sw.append("\"documents\":");
+            mapper.writeValue(sw,map.remove("-docs"));
+            sw.append(",");
 
-	    String[] keys = map.keySet().toArray(new String[map.size()]);
+            String[] keys = map.keySet().toArray(new String[map.size()]);
 
-	    HashMap<String,Integer> setHash = new HashMap<>(20);
-	    ArrayList<HashMap<String,Long>> set = new ArrayList<>(20);
-	    ArrayList<Long[]> overlap = new ArrayList<>(100);
+            HashMap<String,Integer> setHash = new HashMap<>(20);
+            ArrayList<HashMap<String,Long>> set = new ArrayList<>(20);
+            ArrayList<Long[]> overlap = new ArrayList<>(100);
 	    
-	    int count = 0;
-	    for (String key : keys) {
-		if (!key.startsWith("#__")) {
-		    HashMap<String,Long> simpleMap = new HashMap<>();
-		    simpleMap.put(key, map.remove(key));
-		    set.add(simpleMap);
-		    setHash.put(key, count++);
-		};
-	    };
+            int count = 0;
+            for (String key : keys) {
+                if (!key.startsWith("#__")) {
+                    HashMap<String,Long> simpleMap = new HashMap<>();
+                    simpleMap.put(key, map.remove(key));
+                    set.add(simpleMap);
+                    setHash.put(key, count++);
+                };
+            };
 
-	    keys = map.keySet().toArray(new String[map.size()]);
-	    for (String key : keys) {
-		String[] comb = key.substring(3).split(":###:");
-		Long[] l = new Long[3];
-		l[0] = (long) setHash.get(comb[0]);
-		l[1] = (long) setHash.get(comb[1]);
-		l[2] = map.remove(key);
-		overlap.add(l);
-	    };
+            keys = map.keySet().toArray(new String[map.size()]);
+            for (String key : keys) {
+                String[] comb = key.substring(3).split(":###:");
+                Long[] l = new Long[3];
+                l[0] = (long) setHash.get(comb[0]);
+                l[1] = (long) setHash.get(comb[1]);
+                l[2] = map.remove(key);
+                overlap.add(l);
+            };
 
-	    
-	    sw.append("\"sets\":");
-	    mapper.writeValue(sw, (Object) set);
-	    sw.append(",\"overlaps\":");
-	    mapper.writeValue(sw, (Object) overlap);
-	    sw.append(",\"error\":null");
+            sw.append("\"sets\":");
+            mapper.writeValue(sw, (Object) set);
+            sw.append(",\"overlaps\":");
+            mapper.writeValue(sw, (Object) overlap);
+            sw.append(",\"error\":null");
+        }
+        catch (Exception e) {
+            sw.append("\"error\":");
+            mapper.writeValue(sw,e.getMessage());
+        };
 
-	}
-	catch (Exception e) {
-	    sw.append("\"error\":");
-	    mapper.writeValue(sw,e.getMessage());
-	};
-
-	sw.append("}");
-	return sw.getBuffer().toString();
+        sw.append("}");
+        return sw.getBuffer().toString();
     };
 };
diff --git a/src/main/java/de/ids_mannheim/korap/KorapDocument.java b/src/main/java/de/ids_mannheim/korap/KorapDocument.java
index 2602b46..33e3f3b 100644
--- a/src/main/java/de/ids_mannheim/korap/KorapDocument.java
+++ b/src/main/java/de/ids_mannheim/korap/KorapDocument.java
@@ -10,12 +10,20 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.annotation.*;
 
-/* Todo:: Author and textClass may be arrays! */
+/*
+ * Todo:: Author and textClass may be arrays!
+ */
 
 /**
- * Abstract class representing a document in the KorAP index.
+ * Abstract class representing a document in the
+ * KorAP index.
  *
- * @author Nils Diewald
+ * This model is rather specific to DeReKo data and
+ * should be considered experimental. It may be replaced
+ * by a more agnostic model.
+ * string fields, e.g. may be combined with a prefix.
+ *
+ * @author diewald
  */
 @JsonIgnoreProperties(ignoreUnknown = true)
 public abstract class KorapDocument extends KorapResponse {
@@ -23,504 +31,993 @@
 
     @JsonIgnore
     public int
-	internalDocID,
-	localDocID,
-	UID;
+        internalDocID,
+        localDocID,
+        UID;
 
     private KorapDate
-	pubDate,
-    // newly added
-	creationDate
-	;
+        pubDate,
+        // newly added
+        creationDate;
 
 
     private String
-    // No longer supported
-	ID,
-	corpusID,
-	field,
-	layerInfo,
-	tokenization,
 
-    // Still supported
-	foundries,
-	title,
-	subTitle,
-	author,
-	textClass,
-	pubPlace,
+        // No longer supported
+        ID,
+        corpusID,
+        field,
+        layerInfo,
+        tokenization,
 
-    // newly added
-	textSigle,
-	docSigle,
-	corpusSigle,
-	publisher,
-	editor,
-	textType,
-	textTypeArt,
-	textTypeRef,
-	textColumn,
-	textDomain,
-	license,
-	pages,
-	fileEditionStatement,
-	biblEditionStatement,
-	reference,
-	language,
-	corpusTitle,
-	corpusSubTitle,
-	corpusAuthor,
-	corpusEditor,
-	docTitle,
-	docSubTitle,
-	docAuthor,
-	docEditor,
-	keywords,
-	tokenSource,
-	layerInfos
-	;
+        // Still supported
+        foundries,
+        textClass,
+        pubPlace,
+
+        // Newly added for the corpus/doc/text distinction of DeReKo
+        textSigle, docSigle, corpusSigle,
+        title,       subTitle,       author,       editor,
+        docTitle,    docSubTitle,    docAuthor,    docEditor,
+        corpusTitle, corpusSubTitle, corpusAuthor, corpusEditor,
+        textType, textTypeArt, textTypeRef, textColumn, textDomain,
+        fileEditionStatement, biblEditionStatement,
+        publisher,
+        reference,
+        language,
+        license,
+        pages,
+        keywords,
+
+        // Meta information regarding annotations
+        tokenSource,
+        layerInfos;
 
 
     /**
-     * Set the publication date of the document the match occurs in.
+     * Get the publication date of the document
+     * as a KorapDate object.
+     *
+     * @return A KorapDate object for chaining.
+     * @see KorapDate
+     */
+    @JsonIgnore
+    public KorapDate getPubDate () {
+        return this.pubDate;
+    };
+
+
+    /**
+     * Get the publication date of the document
+     * as a string.
+     *
+     * @return A string containing the KorapDate.
+     * @see KorapDate
+     */    
+    @JsonProperty("pubDate")
+    public String getPubDateString () {
+        if (this.pubDate != null)
+            return this.pubDate.toDisplay();
+        return null;
+    };
+
+
+    /**
+     * Set the publication date of the document.
      *
      * @param date The date as a KorapDate compatible string representation.
      * @return A KorapDate object for chaining.
      * @see KorapDate#Constructor(String)
      */
     public KorapDate setPubDate (String date) {
-	this.pubDate = new KorapDate(date);
-	return this.pubDate;
-    };
-
-    /**
-     * Set the creation date of the document the match occurs in.
-     *
-     * @param date The date as a KorapDate compatible string representation.
-     * @return A KorapDate object for chaining.
-     * @see KorapDate#Constructor(String)
-     */
-    public KorapDate setCreationDate (String date) {
-	this.creationDate = new KorapDate(date);
-	return this.creationDate;
+        this.pubDate = new KorapDate(date);
+        return this.pubDate;
     };
 
 
     /**
-     * Set the publication date of the document the match occurs in.
+     * Set the publication date of the document.
      *
      * @param date The date as a KorapDate object.
      * @return A KorapDate object for chaining.
      * @see KorapDate
      */
     public KorapDate setPubDate (KorapDate date) {
-	return (this.pubDate = date);
+        return (this.pubDate = date);
     };
 
 
     /**
-     * Set the creation date of the document the match occurs in.
+     * Get the creation date of the document
+     * as a KorapDate object.
+     *
+     * @return A KorapDate object for chaining.
+     * @see KorapDate
+     */
+    @JsonIgnore
+    public KorapDate getCreationDate () {
+        return this.creationDate;
+    };
+
+
+    /**
+     * Get the creation date of the document
+     * as a string.
+     *
+     * @return A string containing the KorapDate.
+     * @see KorapDate
+     */
+    @JsonProperty("creationDate")
+    public String getCreationDateString () {
+        if (this.creationDate != null)
+            return this.creationDate.toDisplay();
+        return null;
+    };
+
+
+    /**
+     * Set the creation date of the document.
+     *
+     * @param date The date as a KorapDate compatible string representation.
+     * @return A KorapDate object for chaining.
+     * @see KorapDate#Constructor(String)
+     */
+    public KorapDate setCreationDate (String date) {
+        this.creationDate = new KorapDate(date);
+        return this.creationDate;
+    };
+
+
+    /**
+     * Set the creation date of the document.
      *
      * @param date The date as a KorapDate object.
      * @return A KorapDate object for chaining.
      * @see KorapDate
      */
     public KorapDate setCreationDate (KorapDate date) {
-	return (this.creationDate = date);
-    };
+        return (this.creationDate = date);
+    };    
 
 
     /**
-     * Get the publication date of the document the match occurs in as a KorapDate object.
+     * Get the name of the author of the document.
+     *
+     * @return The name of the author as a string.
      */
-    @JsonIgnore
-    public KorapDate getPubDate () {
-	return this.pubDate;
-    };
-
-
-    /**
-     * Get the creation date of the document the match occurs in as a KorapDate object.
-     */
-    @JsonIgnore
-    public KorapDate getCreationDate () {
-	return this.creationDate;
-    };
-
-    @JsonProperty("pubDate")
-    public String getPubDateString () {
-	if (this.pubDate != null)
-	    return this.pubDate.toDisplay();
-	return null;
-    };
-
-    @JsonProperty("creationDate")
-    public String getCreationDateString () {
-	if (this.creationDate != null)
-	    return this.creationDate.toDisplay();
-	return null;
-    };
-
-    public void setAuthor (String author) {
-	this.author = author;
-    };
-
     public String getAuthor () {
-	return this.author;
+        return this.author;
     };
+        
 
-    public void setTextClass (String textClass) {
-	this.textClass = textClass;
+    /**
+     * Set the name of the author of the document.
+     *
+     * @param author The name of the author as a string.
+     */
+    public void setAuthor (String author) {
+        this.author = author;
     };
+    
 
+    /**
+     * Get the text class of the document.
+     *
+     * @return The text class of the document as a string.
+     */
     public String getTextClass () {
-	return this.textClass;
+        return this.textClass;
     };
 
-    public void setPubPlace (String pubPlace) {
-	this.pubPlace = pubPlace;
+
+    /**
+     * Set the text class of the document.
+     *
+     * @param textClass The text class of the document as a string.
+     */
+    public void setTextClass (String textClass) {
+        this.textClass = textClass;
     };
 
+
+    /**
+     * Get the publication place of the document.
+     *
+     * @return The publication place of the document as a string.
+     */
     public String getPubPlace () {
-	return this.pubPlace;
+        return this.pubPlace;
     };
-
-    // No longer supported
-    public void setCorpusID (String corpusID) {
-	this.corpusID = corpusID;
-    };
-
-    // No longer supported
-    @JsonProperty("corpusID")
-    public String getCorpusID () {
-	return this.corpusID;
-    };
-
-    // No longer supported
-    public void setID (String ID) {
-	this.ID = ID;
-    };
-
-    // No longer supported
-    @JsonProperty("ID")
-    public String getID () {
-	return this.ID;
-    };
-
-    public void setUID (int UID) {
-	this.UID = UID;
-    };
-
-    public void setUID (String UID) {
-	if (UID != null)
-	    this.UID = Integer.parseInt(UID);
-    };
+    
+    
+    /**
+     * Set the publication place of the document.
+     *
+     * @param pubPlace The publication place of the document as a string.
+     */
+    public void setPubPlace (String pubPlace) {
+        this.pubPlace = pubPlace;
+    };    
 
 
+    /**
+     * Get the unique identifier of the document.
+     *
+     * @return The unique identifier of the document as an integer.
+     */
     @JsonProperty("UID")
     public int getUID () {
-	return this.UID;
+        return this.UID;
+    };
+    
+
+    /**
+     * Set the unique identifier of the document.
+     *
+     * @param UID The unique identifier of the document as an integer.
+     */
+    public void setUID (int UID) {
+        this.UID = UID;
     };
 
-    public void setTitle (String title) {
-	this.title = title;
+
+    /**
+     * Set the unique identifier of the document.
+     *
+     * @param UID The unique identifier of the document as a
+     *        string representing an integer.
+     * @throws NumberFormatException
+     */
+    public void setUID (String UID) throws NumberFormatException {
+        if (UID != null)
+            this.UID = Integer.parseInt(UID);
     };
 
+
+    /**
+     * Get the title of the document.
+     *
+     * @return The title of the document as a string.
+     */
     public String getTitle () {
-	return this.title;
+        return this.title;
     };
 
-    public void setSubTitle (String subTitle) {
-	this.subTitle = subTitle;
-    };
 
+    /**
+     * Set the title of the document.
+     *
+     * @param title The title of the document as a string.
+     */
+    public void setTitle (String title) {
+        this.title = title;
+    };
+    
+        
+    /**
+     * Get the subtitle of the document.
+     *
+     * @return The subtitle of the document as a string.
+     */
     public String getSubTitle () {
-	return this.subTitle;
+        return this.subTitle;
     };
 
+
+    /**
+     * Set the subtitle of the document.
+     *
+     * @param subTitle The subtitle of the document as a string.
+     */
+    public void setSubTitle (String subTitle) {
+        this.subTitle = subTitle;
+    };
+
+
+    /**
+     * Get the primary data of the document.
+     *
+     * @return The primary data of the document as a string.
+     */
+    public String getPrimaryData () {
+        if (this.primaryData == null)
+            return "";
+        return this.primaryData.toString();
+    };
+
+
+    /**
+     * Get the primary data of the document,
+     * starting with a given character offset.
+     *
+     * @param startOffset The starting character offset.
+     * @return The substring of primary data of the document as a string.
+     */
+    public String getPrimaryData (int startOffset) {
+        return this.primaryData.substring(startOffset);
+    };
+
+
+    /**
+     * Get the primary data of the document,
+     * starting with a given character offset and ending
+     * with a given character offset.
+     *
+     * @param startOffset The starting character offset.
+     * @param endOffset The ending character offset.
+     * @return The substring of the primary data of the document as a string.
+     */
+    public String getPrimaryData (int startOffset, int endOffset) {
+        return this.primaryData.substring(startOffset, endOffset);
+    };
+
+
+    /**
+     * Set the primary data of the document.
+     *
+     * @param primary The primary data of the document as a string.
+     */
     @JsonIgnore
     public void setPrimaryData (String primary) {
-	this.primaryData = new KorapPrimaryData(primary);
+        this.primaryData = new KorapPrimaryData(primary);
     };
+    
 
+    /**
+     * Set the primary data of the document.
+     *
+     * @param primary The primary data of the document
+     *        as a KorapPrimaryData object.
+     * @see KorapPrimaryData
+     */
     public void setPrimaryData (KorapPrimaryData primary) {
-	this.primaryData = primary;
+        this.primaryData = primary;
     };
 
-    public String getPrimaryData () {
-	if (this.primaryData == null)
-	    return "";
-	return this.primaryData.toString();
-    };
 
-    public String getPrimaryData (int startOffset) {
-	return this.primaryData.substring(startOffset);
-    };
-
-    public String getPrimaryData (int startOffset, int endOffset) {
-	return this.primaryData.substring(startOffset, endOffset);
-    };
-
+    /**
+     * Get the length of the primary data of the document
+     * (i.e. the number of characters).
+     *
+     * @return The length of the primary data of the document as an integer.
+     */
     @JsonIgnore
     public int getPrimaryDataLength () {
-	return this.primaryData.length();
+        return this.primaryData.length();
     };
 
-    public void setFoundries (String foundries) {
-	this.foundries = foundries;
-    };
 
+    /**
+     * Get information on the foundries the document
+     * is annotated with as a string. 
+     *
+     * @return The foundry information string.
+     */
     public String getFoundries () {
-	return this.foundries;
+        return this.foundries;
     };
 
-    // No longer supported
-    public void setTokenization (String tokenization) {
-	this.tokenization = tokenization;
+
+    /**
+     * Set information on the foundries the document
+     * is annotated with. 
+     *
+     * @param foundries The foundry information string.
+     */
+    public void setFoundries (String foundries) {
+        this.foundries = foundries;
     };
 
-    // No longer supported
-    public String getTokenization () {
-	return this.tokenization;
-    };
 
-    // No longer supported
-    public void setLayerInfo (String layerInfo) {
-	this.layerInfo = layerInfo;
-    };
-
-    // No longer supported
-    public String getLayerInfo () {
-	return this.layerInfo;
-    };
-
-    public void setLayerInfos (String layerInfos) {
-	this.layerInfos = layerInfos;
-    };
-
+    /**
+     * Get information on the layers the document
+     * is annotated with as a string. 
+     *
+     * @return The layer information string.
+     */
     public String getLayerInfos () {
-	return this.layerInfos;
+        return this.layerInfos;
     };
 
-    // No longer necessary
-    public void setField (String field) {
-	this.field = field;
+
+    /**
+     * Set information on the layers the document
+     * is annotated with as a string. 
+     *
+     * @param layerInfos The layer information string.
+     */
+    public void setLayerInfos (String layerInfos) {
+        this.layerInfos = layerInfos;
     };
 
-    // No longer necessary
-    public String getField () {
-	return this.field;
-    };
 
     // This is the new text id
+    /**
+     * Get the text sigle as a string. 
+     *
+     * @return The text sigle as a string.
+     */
     public String getTextSigle () {
-	return this.textSigle;
+        return this.textSigle;
     };
 
+
     // This is the new text id
+    /**
+     * Set the text sigle as a string. 
+     *
+     * @param textSigle The text sigle as a string.
+     */
     public void setTextSigle (String textSigle) {
-	this.textSigle = textSigle;
+        this.textSigle = textSigle;
     };
 
+
     // This is the new corpus id
+    /**
+     * Get the corpus sigle as a string. 
+     *
+     * @return The corpus sigle as a string.
+     */
     public String getCorpusSigle () {
-	return this.corpusSigle;
+        return this.corpusSigle;
     };
 
+
     // This is the new corpus id
+    /**
+     * Set the corpus sigle as a string. 
+     *
+     * @param corpusSigle The corpus sigle as a string.
+     */
     public void setCorpusSigle (String corpusSigle) {
-	this.corpusSigle = corpusSigle;
+        this.corpusSigle = corpusSigle;
     };
 
+
+    /**
+     * Get the document sigle as a string. 
+     *
+     * @return The document sigle as a string.
+     */
     public String getDocSigle () {
-	return this.docSigle;
+        return this.docSigle;
     };
 
+
+    /**
+     * Set the document sigle as a string. 
+     *
+     * @param docSigle The document sigle as a string.
+     */
     public void setDocSigle (String docSigle) {
-	this.docSigle = docSigle;
+        this.docSigle = docSigle;
     };
 
+
+    /**
+     * Get the name of the publisher as a string. 
+     *
+     * @return The name of the publisher as a string.
+     */
     public String getPublisher () {
-	return this.publisher;
+        return this.publisher;
     };
 
+
+    /**
+     * Set the name of the publisher as a string. 
+     *
+     * @param publisher The name of the publisher as a string.
+     */
     public void setPublisher (String publisher) {
-	this.publisher = publisher;
+        this.publisher = publisher;
     };
 
+
+    /**
+     * Get the name of the editor as a string. 
+     *
+     * @return The name of the editor as a string.
+     */
     public String getEditor () {
-	return this.editor;
+        return this.editor;
     };
 
+
+    /**
+     * Set the name of the editor as a string. 
+     *
+     * @param editor The name of the editor as a string.
+     */
     public void setEditor (String editor) {
-	this.editor = editor;
+        this.editor = editor;
     };
 
+
+    /**
+     * Get the type of the text as a string. 
+     *
+     * @return The type of the text as a string.
+     */
     public String getTextType () {
-	return this.textType;
+        return this.textType;
     };
 
+
+    /**
+     * Set the type of the text as a string. 
+     *
+     * @param textType The type of the text as a string.
+     */
     public void setTextType (String textType) {
-	this.textType = textType;
+        this.textType = textType;
     };
 
+
+    /**
+     * Get the type art of the text as a string. 
+     *
+     * @return The type art of the text as a string.
+     */
     public String getTextTypeArt () {
-	return this.textTypeArt;
+        return this.textTypeArt;
     };
 
+
+    /**
+     * Set the type art of the text as a string. 
+     *
+     * @param textTypeArt The type art of the text as a string.
+     */
     public void setTextTypeArt (String textTypeArt) {
-	this.textTypeArt = textTypeArt;
+        this.textTypeArt = textTypeArt;
     };
 
-    public String getTextTypeRef () {
-	return this.textTypeRef;
-    };
 
+    /**
+     * Set the type reference of the text as a string. 
+     *
+     * @param textTypeRef The type reference of the text as a string.
+     */
     public void setTextTypeRef (String textTypeRef) {
-	this.textTypeRef = textTypeRef;
+        this.textTypeRef = textTypeRef;
     };
 
+
+    /**
+     * Get the type reference of the text as a string. 
+     *
+     * @return The type reference of the text as a string.
+     */
+    public String getTextTypeRef () {
+        return this.textTypeRef;
+    };
+
+
+    /**
+     * Get the column of the text as a string. 
+     *
+     * @return The column of the text as a string.
+     */
     public String getTextColumn () {
-	return this.textColumn;
+        return this.textColumn;
     };
 
+
+    /**
+     * Set the column of the text as a string. 
+     *
+     * @param textColumn The column of the text as a string.
+     */
     public void setTextColumn (String textColumn) {
-	this.textColumn = textColumn;
+        this.textColumn = textColumn;
     };
 
+
+    /**
+     * Get the domain of the text as a string. 
+     *
+     * @return The domain of the text as a string.
+     */
     public String getTextDomain () {
-	return this.textDomain;
+        return this.textDomain;
     };
 
+
+    /**
+     * Set the domain of the text as a string. 
+     *
+     * @param textDomain The domain of the text as a string.
+     */
     public void setTextDomain (String textDomain) {
-	this.textDomain = textDomain;
+        this.textDomain = textDomain;
     };
 
+
+    /**
+     * Get the license of the text as a string. 
+     *
+     * @return The license of the text as a string.
+     */
     public String getLicense () {
-	return this.license;
+        return this.license;
     };
 
+
+    /**
+     * Set the license of the text as a string. 
+     *
+     * @param license The license of the text as a string.
+     */
     public void setLicense (String license) {
-	this.license = license;
+        this.license = license;
     };
 
+
+    /**
+     * Get the page numbers of the text as a string. 
+     *
+     * @return The page numbers of the text as a string.
+     */
     public String getPages () {
-	return this.pages;
+        return this.pages;
     };
 
+
+    /**
+     * Set the page numbers of the text as a string. 
+     *
+     * @param pages The page numbers of the text as a string.
+     */
     public void setPages (String pages) {
-	this.pages = pages;
+        this.pages = pages;
     };
 
+
+    /**
+     * Get the file edition statement of the text as a string. 
+     *
+     * @return The file edition statement of the text as a string.
+     */
     public String getFileEditionStatement () {
-	return this.fileEditionStatement;
+        return this.fileEditionStatement;
     };
 
+
+    /**
+     * Set the file edition statement of the text as a string. 
+     *
+     * @param fileEditionStatement The file edition statement
+     *        of the text as a string.
+     */
     public void setFileEditionStatement (String fileEditionStatement) {
-	this.fileEditionStatement = fileEditionStatement;
+        this.fileEditionStatement = fileEditionStatement;
     };
 
+
+    /**
+     * Get the bibliograhic edition statement of the text as a string. 
+     *
+     * @return The bibliograhic edition statement of the text as a string.
+     */
     public String getBiblEditionStatement () {
-	return this.biblEditionStatement;
+        return this.biblEditionStatement;
     };
 
+
+    /**
+     * Set the bibliograhic edition statement of the text as a string. 
+     *
+     * @param biblEditionStatement The bibliograhic edition statement
+     *        of the text as a string.
+     */
     public void setBiblEditionStatement (String biblEditionStatement) {
-	this.biblEditionStatement = biblEditionStatement;
+        this.biblEditionStatement = biblEditionStatement;
     };
 
+
+    /**
+     * Get the reference of the text as a string. 
+     *
+     * @return The reference of the text as a string.
+     */
     public String getReference () {
-	return this.reference;
+        return this.reference;
     };
 
+
+    /**
+     * Set the reference of the text as a string. 
+     *
+     * @param reference The reference of the text as a string.
+     */
     public void setReference (String reference) {
-	this.reference = reference;
+        this.reference = reference;
     };
 
+
+    /**
+     * Get the language of the text as a string. 
+     *
+     * @return The language of the text as a string.
+     */
     public String getLanguage () {
-	return this.language;
+        return this.language;
     };
 
+
+    /**
+     * Set the language of the text as a string. 
+     *
+     * @param language The language of the text as a string.
+     */
     public void setLanguage (String language) {
-	this.language = language;
+        this.language = language;
     };
 
+
+    /**
+     * Get the corpus title of the text as a string. 
+     *
+     * @return The corpus title of the text as a string.
+     */
     public String getCorpusTitle () {
-	return this.corpusTitle;
+        return this.corpusTitle;
     };
 
+
+    /**
+     * Set the corpus title of the text as a string. 
+     *
+     * @param corpusTitle The corpus title of the text as a string.
+     */
     public void setCorpusTitle (String corpusTitle) {
-	this.corpusTitle = corpusTitle;
+        this.corpusTitle = corpusTitle;
     };
 
+
+    /**
+     * Get the corpus subtitle of the text as a string. 
+     *
+     * @return The corpus subtitle of the text as a string.
+     */
     public String getCorpusSubTitle () {
-	return this.corpusSubTitle;
+        return this.corpusSubTitle;
     };
 
+
+    /**
+     * Set the corpus subtitle of the text as a string. 
+     *
+     * @param corpusSubTitle The corpus subtitle of the
+     *        text as a string.
+     */
     public void setCorpusSubTitle (String corpusSubTitle) {
-	this.corpusSubTitle = corpusSubTitle;
+        this.corpusSubTitle = corpusSubTitle;
     };
 
+
+    /**
+     * Get the corpus author of the text as a string. 
+     *
+     * @return The corpus author of the text as a string.
+     */
     public String getCorpusAuthor () {
-	return this.corpusAuthor;
+        return this.corpusAuthor;
     };
 
+
+    /**
+     * Set the corpus author of the text as a string. 
+     *
+     * @return The corpus author of the text as a string.
+     */
     public void setCorpusAuthor (String corpusAuthor) {
-	this.corpusAuthor = corpusAuthor;
+        this.corpusAuthor = corpusAuthor;
     };
 
+
+    /**
+     * Get the corpus editor of the text as a string. 
+     *
+     * @return The corpus editor of the text as a string.
+     */
     public String getCorpusEditor () {
-	return this.corpusEditor;
+        return this.corpusEditor;
     };
 
+
+    /**
+     * Set the corpus editor of the text as a string. 
+     *
+     * @param corpusEditor The corpus editor of the text as a string.
+     */
     public void setCorpusEditor (String corpusEditor) {
-	this.corpusEditor = corpusEditor;
+        this.corpusEditor = corpusEditor;
     };
 
+
+    /**
+     * Get the document title of the text as a string. 
+     *
+     * @return The document title of the text as a string.
+     */
     public String getDocTitle () {
-	return this.docTitle;
+        return this.docTitle;
     };
 
+    /**
+     * Set the document title of the text as a string. 
+     *
+     * @param docTitle The document title of the text as a string.
+     */
     public void setDocTitle (String docTitle) {
-	this.docTitle = docTitle;
+        this.docTitle = docTitle;
     };
 
+
+    /**
+     * Get the subtitle of the document of the text as a string. 
+     *
+     * @return The subtitle of the document of the text as a string.
+     */
     public String getDocSubTitle () {
-	return this.docSubTitle;
+        return this.docSubTitle;
     };
 
+
+    /**
+     * Set the subtitle of the document of the text as a string. 
+     *
+     * @param docSubTitle The subtitle of the document of the
+     *        text as a string.
+     */
     public void setDocSubTitle (String docSubTitle) {
-	this.docSubTitle = docSubTitle;
+        this.docSubTitle = docSubTitle;
     };
 
+
+    /**
+     * Get the author of the document of the text as a string. 
+     *
+     * @return The author of the document of the text as a string.
+     */
     public String getDocAuthor () {
-	return this.docAuthor;
+        return this.docAuthor;
     };
 
+
+    /**
+     * Set the author of the document of the text as a string. 
+     *
+     * @param docAuthor The author of the document of the text as a string.
+     */
     public void setDocAuthor (String docAuthor) {
-	this.docAuthor = docAuthor;
+        this.docAuthor = docAuthor;
     };
 
+
+    /**
+     * Get the editor of the document of the text as a string. 
+     *
+     * @return The editor of the document of the text as a string.
+     */
     public String getDocEditor () {
-	return this.docEditor;
+        return this.docEditor;
     };
 
+
+    /**
+     * Set the editor of the document of the text as a string. 
+     *
+     * @param docEditor The editor of the document of the text as a string.
+     */
     public void setDocEditor (String docEditor) {
-	this.docEditor = docEditor;
+        this.docEditor = docEditor;
     };
 
+
+    /**
+     * Get the keywords of the text as a string. 
+     *
+     * @return The keywords of the text as a string.
+     */
     public String getKeywords () {
-	return this.keywords;
+        return this.keywords;
     };
 
+
+    /**
+     * Set the keywords of the text as a string. 
+     *
+     * @param keywords The keywords of the text as a string.
+     */
     public void setKeywords (String keywords) {
-	this.keywords = keywords;
+        this.keywords = keywords;
     };
 
+
+    /**
+     * Get information about the source of tokenization
+     * as a string. 
+     *
+     * @return The tokenization information as a string.
+     */
     public String getTokenSource () {
-	return this.tokenSource;
+        return this.tokenSource;
     };
 
+
+    /**
+     * Set information about the source of tokenization
+     * as a string. 
+     *
+     * @param tokenSource The tokenization information as a string.
+     */
     public void setTokenSource (String tokenSource) {
-	this.tokenSource = tokenSource;
+        this.tokenSource = tokenSource;
+    };
+
+
+    @Deprecated
+    public void setTokenization (String tokenization) {
+        this.tokenization = tokenization;
+    };
+
+
+    @Deprecated
+    public String getTokenization () {
+        return this.tokenization;
+    };
+
+
+    @Deprecated
+    public void setLayerInfo (String layerInfo) {
+        this.layerInfo = layerInfo;
+    };
+
+
+    @Deprecated
+    public String getLayerInfo () {
+        return this.layerInfo;
+    };
+
+
+    @Deprecated
+    public void setField (String field) {
+        this.field = field;
+    };
+
+
+    @Deprecated
+    public String getField () {
+        return this.field;
+    };
+
+
+    @Deprecated
+    @JsonProperty("corpusID")
+    public String getCorpusID () {
+        return this.corpusID;
+    };
+
+
+    @Deprecated
+    public void setCorpusID (String corpusID) {
+        this.corpusID = corpusID;
+    };
+
+
+    @Deprecated
+    @JsonProperty("ID")
+    public String getID () {
+        return this.ID;
+    };
+
+
+    @Deprecated
+    public void setID (String ID) {
+        this.ID = ID;
     };
 };
diff --git a/src/main/java/de/ids_mannheim/korap/KorapFilter.java b/src/main/java/de/ids_mannheim/korap/KorapFilter.java
index 32573f9..539c061 100644
--- a/src/main/java/de/ids_mannheim/korap/KorapFilter.java
+++ b/src/main/java/de/ids_mannheim/korap/KorapFilter.java
@@ -36,115 +36,117 @@
     public static final boolean DEBUG = false;
     
     public KorapFilter () {
-	filter = new BooleanFilter();
+        filter = new BooleanFilter();
     };
 
     public KorapFilter (JsonNode json) throws QueryException {
-	filter = this.fromJSON(json, "tokens");
+        filter = this.fromJSON(json, "tokens");
     };
 
     protected BooleanFilter fromJSON (JsonNode json, String field) throws QueryException {
-	BooleanFilter bfilter = new BooleanFilter();
+        BooleanFilter bfilter = new BooleanFilter();
 
-	// TODO: THIS UNFORTUNATELY BREAKS TESTS
-	if (!json.has("@type"))
-	    throw new QueryException(701, "JSON-LD group has no @type attribute");
+        // TODO: THIS UNFORTUNATELY BREAKS TESTS
+        if (!json.has("@type"))
+            throw new QueryException(701, "JSON-LD group has no @type attribute");
 
-	String type = json.get("@type").asText();
+        String type = json.get("@type").asText();
+        
+        // Single filter
+        if (type.equals("korap:doc")) {
 
-	// Single filter
-	if (type.equals("korap:doc")) {
+            String key     = "tokens";
+            String valtype = "type:string";
+            String match   = "match:eq";
 
-	    String key     = "tokens";
-	    String valtype = "type:string";
-	    String match   = "match:eq";
+            if (json.has("key"))
+                key = json.get("key").asText();
+            
+            if (json.has("type"))
+                valtype = json.get("type").asText();
 
-	    if (json.has("key"))
-		key = json.get("key").asText();
+            // Filter based on date
+            if (valtype.equals("type:date")) {
 
-	    if (json.has("type"))
-		valtype = json.get("type").asText();
+                if (!json.has("value"))
+                    throw new QueryException(612, "Dates require value fields");
+//-
+                String dateStr = json.get("value").asText();
+                if (json.has("match"))
+                    match = json.get("match").asText();
 
-	    // Filter based on date
-	    if (valtype.equals("type:date")) {
+                // TODO: This isn't stable yet
+                switch (match) {
+                case "match:eq":
+                    bfilter.date(dateStr);
+                    break;
+                case "match:geq":
+                    bfilter.since(dateStr);
+                    break;
+                case "match:leq":
+                    bfilter.till(dateStr);
+                    break;
+                };
+                /*
+                  No good reason for gt or lt
+                */
+                return bfilter;
+            }
+            else if (valtype.equals("type:string")) {
+                if (json.has("match"))
+                    match = json.get("match").asText();
 
-		if (!json.has("value"))
-		    throw new QueryException(612, "Dates require value fields");
+                if (match.equals("match:eq")) {
+                    bfilter.and(key, json.get("value").asText());
+                };
+                return bfilter;
+            };
+        }
 
-		String dateStr = json.get("value").asText();
-		if (json.has("match"))
-		    match = json.get("match").asText();
+        // nested group
+        else if (type.equals("korap:docGroup")) {
+            if (!json.has("operands") || !json.get("operands").isArray())
+//-
+                throw new QueryException(612, "Groups need operands");
 
-		// TODO: This isn't stable yet
-		switch (match) {
-		case "match:eq":
-		    bfilter.date(dateStr);
-		    break;
-		case "match:geq":
-		    bfilter.since(dateStr);
-		    break;
-		case "match:leq":
-		    bfilter.till(dateStr);
-		    break;
-		};
-		/*
-		  No good reason for gt or lt
-		*/
-		return bfilter;
-	    }
-	    else if (valtype.equals("type:string")) {
-		if (json.has("match"))
-		    match = json.get("match").asText();
+            String operation = "operation:and";
+            if (json.has("operation"))
+                operation = json.get("operation").asText();
 
-		if (match.equals("match:eq")) {
-		    bfilter.and(key, json.get("value").asText());
-		};
-		return bfilter;
-	    };
-	}
+            BooleanFilter group = new BooleanFilter();
 
-	// nested group
-	else if (type.equals("korap:docGroup")) {
-	    if (!json.has("operands") || !json.get("operands").isArray())
-		throw new QueryException(612, "Groups need operands");
+            for (JsonNode operand : json.get("operands")) {
+                if (operation.equals("operation:and")) {
+                    group.and(this.fromJSON(operand, field));
+                }
+                else if (operation.equals("operation:or")) {
+                    group.or(this.fromJSON(operand, field));
+                }
+                else {
+                    throw new QueryException(613, "Unknown document group operation");
+                };
+            };
+            bfilter.and(group);
+            return bfilter;
+        }
 
-	    String operation = "operation:and";
-	    if (json.has("operation"))
-		operation = json.get("operation").asText();
+        // Unknown type
+        else {
+// -
+            throw new QueryException(613, "Collection query type has to be doc or docGroup");
+        };
 
-	    BooleanFilter group = new BooleanFilter();
-
-	    for (JsonNode operand : json.get("operands")) {
-		if (operation.equals("operation:and")) {
-		    group.and(this.fromJSON(operand, field));
-		}
-		else if (operation.equals("operation:or")) {
-		    group.or(this.fromJSON(operand, field));
-		}
-		else {
-		    throw new QueryException(613, "Unknown document group operation");
-		};
-	    };
-	    bfilter.and(group);
-	    return bfilter;
-	}
-
-	// UNknown type
-	else {
-	    throw new QueryException(613, "Collection query type has to be doc or docGroup");
-	};
-
-	return new BooleanFilter();
+        return new BooleanFilter();
     };
 
 	/*
-	String type = json.get("@type").asText();
-	String field = _getField(json);
+      String type = json.get("@type").asText();
+      String field = _getField(json);
 
-	if (type.equals("korap:term")) {
-	    this.fromJSON(json, field);
-	}
-	else if (type.equals("korap:group")) {
+      if (type.equals("korap:term")) {
+      this.fromJSON(json, field);
+      }
+      else if (type.equals("korap:group")) {
 	    // TODO: relation
 	    for (JsonNode operand : json.get("operands")) {
 		this.fromJSON(operand, field);
@@ -153,198 +155,206 @@
 	*/
     //    };
     
-    protected BooleanFilter fromJSONLegacy (JsonNode json, String field) throws QueryException {
-	BooleanFilter bfilter = new BooleanFilter();
+    protected BooleanFilter fromJSONLegacy (JsonNode json, String field)
+        throws QueryException {
+        BooleanFilter bfilter = new BooleanFilter();
 
-	if (!json.has("@type"))
-	    throw new QueryException(612, "JSON-LD group has no @type attribute");
+//-
+        if (!json.has("@type"))
+            throw new QueryException(612, "JSON-LD group has no @type attribute");
 	
-	String type = json.get("@type").asText();
+        String type = json.get("@type").asText();
 
-	if (DEBUG)
-	    log.trace("@type: " + type);
+        if (DEBUG)
+            log.trace("@type: " + type);
 
-	if (json.has("@field"))
-	    field = _getFieldLegacy(json);
+        if (json.has("@field"))
+            field = _getFieldLegacy(json);
 
-	if (type.equals("korap:term")) {
-	    if (field != null && json.has("@value"))
-		bfilter.and(field, json.get("@value").asText());
-	    return bfilter;
-	}
-	else if (type.equals("korap:group")) {
-	    if (!json.has("relation"))
-		throw new QueryException(612, "Group needs relation");
+        if (type.equals("korap:term")) {
+            if (field != null && json.has("@value"))
+                bfilter.and(field, json.get("@value").asText());
+            return bfilter;
+        }
+        else if (type.equals("korap:group")) {
+//-
+            if (!json.has("relation"))
+                throw new QueryException(612, "Group needs relation");
 
-	    if (!json.has("operands"))
-		throw new QueryException(612, "Group needs operand list");
+            if (!json.has("operands"))
+//-
+                throw new QueryException(612, "Group needs operand list");
 
 		//return bfilter;
 
-	    String dateStr, till;
-	    JsonNode operands = json.get("operands");
+            String dateStr, till;
+            JsonNode operands = json.get("operands");
 
-	    if (!operands.isArray())
-		throw new QueryException(612, "Group needs operand list");
+            if (!operands.isArray())
+//-
+                throw new QueryException(612, "Group needs operand list");
 
-	    if (DEBUG)
-		log.trace("relation found {}",  json.get("relation").asText());
+            if (DEBUG)
+                log.trace("relation found {}",  json.get("relation").asText());
 
-	    BooleanFilter group = new BooleanFilter();
+            BooleanFilter group = new BooleanFilter();
 	    
-	    switch (json.get("relation").asText())  {
-	    case "between":
-		dateStr = _getDateLegacy(json, 0);
-		till = _getDateLegacy(json, 1);
-		if (dateStr != null && till != null)
-		    bfilter.between(dateStr, till);
-		break;
+            switch (json.get("relation").asText())  {
+            case "between":
+                dateStr = _getDateLegacy(json, 0);
+                till = _getDateLegacy(json, 1);
+                if (dateStr != null && till != null)
+                    bfilter.between(dateStr, till);
+                break;
 
-	    case "until":
-		dateStr = _getDateLegacy(json, 0);
-		if (dateStr != null)
-		    bfilter.till(dateStr);
-		break;
+            case "until":
+                dateStr = _getDateLegacy(json, 0);
+                if (dateStr != null)
+                    bfilter.till(dateStr);
+                break;
 
-	    case "since":
-		dateStr = _getDateLegacy(json, 0);
-		if (dateStr != null)
-		    bfilter.since(dateStr);
-		break;
+            case "since":
+                dateStr = _getDateLegacy(json, 0);
+                if (dateStr != null)
+                    bfilter.since(dateStr);
+                break;
 
-	    case "equals":
-		dateStr = _getDateLegacy(json, 0);
-		if (dateStr != null)
-		    bfilter.date(dateStr);
-		break;
+            case "equals":
+                dateStr = _getDateLegacy(json, 0);
+                if (dateStr != null)
+                    bfilter.date(dateStr);
+                break;
 
-	    case "and":
-		if (operands.size() < 1)
-		    throw new QueryException(612, "Operation needs at least two operands");
+            case "and":
+//-
+                if (operands.size() < 1)
+                    throw new QueryException(612, "Operation needs at least two operands");
 
-		for (JsonNode operand : operands) {
-		    group.and(this.fromJSONLegacy(operand, field));
-		};
-		bfilter.and(group);
-		break;
+                for (JsonNode operand : operands) {
+                    group.and(this.fromJSONLegacy(operand, field));
+                };
+                bfilter.and(group);
+                break;
 
-	    case "or":
-		if (operands.size() < 1)
-		    throw new QueryException(612, "Operation needs at least two operands");
+            case "or":
+//-
+                if (operands.size() < 1)
+                    throw new QueryException(612, "Operation needs at least two operands");
 
-		for (JsonNode operand : operands) {
-		    group.or(this.fromJSONLegacy(operand, field));
-		};
-		bfilter.and(group);
-		break;
+                for (JsonNode operand : operands) {
+                    group.or(this.fromJSONLegacy(operand, field));
+                };
+                bfilter.and(group);
+                break;
 
-	    default:
-		throw new QueryException(613, "Relation is not supported");
-	    };
-	}
-	else {
-	    throw new QueryException(613, "Filter type is not a supported group");
-	};
-	return bfilter;
+//-
+            default:
+                throw new QueryException(613, "Relation is not supported");
+            };
+        }
+        else {
+            throw new QueryException(613, "Filter type is not a supported group");
+        };
+        return bfilter;
     };
 
     private static String  _getFieldLegacy (JsonNode json)  {
-	if (!json.has("@field"))
-	    return (String) null;
+        if (!json.has("@field"))
+            return (String) null;
 
-	String field = json.get("@field").asText();
-	return field.replaceFirst("korap:field#", "");
+        String field = json.get("@field").asText();
+        return field.replaceFirst("korap:field#", "");
     };
 
     private static String _getDateLegacy (JsonNode json, int index) {
-	if (!json.has("operands"))
-	    return (String) null;
+        if (!json.has("operands"))
+            return (String) null;
 
-	if (!json.get("operands").has(index))
-	    return (String) null;
+        if (!json.get("operands").has(index))
+            return (String) null;
 
-	JsonNode date = json.get("operands").get(index);
+        JsonNode date = json.get("operands").get(index);
 
-	if (!date.has("@type"))
-	    return (String) null;
+        if (!date.has("@type"))
+            return (String) null;
 
-	if (!date.get("@type").asText().equals("korap:date"))
-	    return (String) null;
+        if (!date.get("@type").asText().equals("korap:date"))
+            return (String) null;
+        
+        if (!date.has("@value"))
+            return (String) null;
 
-	if (!date.has("@value"))
-	    return (String) null;
-
-	return date.get("@value").asText();
+        return date.get("@value").asText();
     };
 
     
     public BooleanFilter and (String type, String ... terms) {
-	BooleanFilter bf = new BooleanFilter();
-	bf.and(type, terms);
-	return bf;
+        BooleanFilter bf = new BooleanFilter();
+        bf.and(type, terms);
+        return bf;
     };
 
     public BooleanFilter or (String type, String ... terms) {
-	if (DEBUG)
-	    log.debug("Got some terms here");
-	BooleanFilter bf = new BooleanFilter();
-	bf.or(type, terms);
-	return bf;
+        if (DEBUG)
+            log.debug("Got some terms here");
+        BooleanFilter bf = new BooleanFilter();
+        bf.or(type, terms);
+        return bf;
     };
 
     public BooleanFilter and (String type, RegexFilter re) {
-	BooleanFilter bf = new BooleanFilter();
-	bf.and(type, re);
-	return bf;
+        BooleanFilter bf = new BooleanFilter();
+        bf.and(type, re);
+        return bf;
     };
 
     public BooleanFilter or (String type, RegexFilter re) {
-	BooleanFilter bf = new BooleanFilter();
-	bf.or(type, re);
-	return bf;
+        BooleanFilter bf = new BooleanFilter();
+        bf.or(type, re);
+        return bf;
     };
 
     public BooleanFilter since (String date) {
-	BooleanFilter bf = new BooleanFilter();
-	bf.since(date);
-	return bf;
+        BooleanFilter bf = new BooleanFilter();
+        bf.since(date);
+        return bf;
     };
 
     public BooleanFilter till (String date) {
-	BooleanFilter bf = new BooleanFilter();
-	bf.till(date);
-	return bf;
+        BooleanFilter bf = new BooleanFilter();
+        bf.till(date);
+        return bf;
     };
 
     public BooleanFilter date (String date) {
-	BooleanFilter bf = new BooleanFilter();
-	bf.date(date);
-	return bf;
+        BooleanFilter bf = new BooleanFilter();
+        bf.date(date);
+        return bf;
     };
 
     public BooleanFilter between (String date1, String date2) {
-	BooleanFilter bf = new BooleanFilter();
-	bf.between(date1, date2);
-	return bf;
+        BooleanFilter bf = new BooleanFilter();
+        bf.between(date1, date2);
+        return bf;
     };
 
     public RegexFilter re (String regex) {
-	return new RegexFilter(regex);
+        return new RegexFilter(regex);
     };
 
     public BooleanFilter getBooleanFilter()  {
-	return this.filter;
+        return this.filter;
     };
 
     public void setBooleanFilter (BooleanFilter bf) {
-	this.filter = bf;
+        this.filter = bf;
     };
 
     public Query toQuery () {
-	return this.filter.toQuery();
+        return this.filter.toQuery();
     };
 
     public String toString () {
-	return this.filter.toQuery().toString();
+        return this.filter.toQuery().toString();
     };
 };
diff --git a/src/main/java/de/ids_mannheim/korap/query/SpanElementQuery.java b/src/main/java/de/ids_mannheim/korap/query/SpanElementQuery.java
index 28df548..78309e2 100644
--- a/src/main/java/de/ids_mannheim/korap/query/SpanElementQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/query/SpanElementQuery.java
@@ -41,7 +41,7 @@
  * 
  * </ul>
  * 
- * @author Nils Diewald
+ * @author diewald
  * @author margaretha
  */
 public class SpanElementQuery extends SpanWithIdQuery {
diff --git a/src/main/java/de/ids_mannheim/korap/query/SpanNextQuery.java b/src/main/java/de/ids_mannheim/korap/query/SpanNextQuery.java
index d77a4bb..dbef6db 100644
--- a/src/main/java/de/ids_mannheim/korap/query/SpanNextQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/query/SpanNextQuery.java
@@ -1,11 +1,5 @@
 package de.ids_mannheim.korap.query;
 
-// Based on SpanNearQuery
-
-/*
- * Todo: Make one Spanarray and switch between the results of A and B.
- */
-
 import java.io.IOException;
 import java.util.Map;
 
@@ -22,6 +16,11 @@
 
 import de.ids_mannheim.korap.query.spans.NextSpans;
 
+/*
+ * Based on SpanNearQuery
+ * Todo: Make one Spanarray and switch between the results of A and B.
+ */
+
 /**
  * SpanNextQuery matches two spans which are directly next to each other. It is
  * identical to a phrase query with exactly two clauses.
@@ -37,7 +36,8 @@
  *      new SpanTermQuery(new Term(&quot;tokens&quot;, &quot;s:off&quot;)));
  * </pre>
  * 
- * @author diewald, margaretha
+ * @author diewald
+ * @author margaretha
  * 
  */
 public class SpanNextQuery extends SimpleSpanQuery implements Cloneable {
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 f01bd1f..a4d7159 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
@@ -22,7 +22,7 @@
  * paragraphs.
  * 
  * @author margaretha
- * @author Nils Diewald
+ * @author diewald
  */
 public class ElementSpans extends SpansWithId {
 
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/NextSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/NextSpans.java
index 2d79132..44045ef 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/NextSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/NextSpans.java
@@ -22,7 +22,7 @@
  * The implementation allows multiple matches at the same firstspan position.
  * 
  * @author margaretha, diewald
- * */
+ */
 public class NextSpans extends SimpleSpans {
 
     private List<CandidateSpan> matchList;
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/WithinSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/WithinSpans.java
index 609dcdc..3d88522 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/WithinSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/WithinSpans.java
@@ -25,7 +25,7 @@
 /**
  * Compare two spans and check how they relate positionally.
  *
- * @author Nils Diewald
+ * @author diewald
  */
 public class WithinSpans extends Spans {
 
diff --git a/src/main/java/de/ids_mannheim/korap/response/KorapResponse.java b/src/main/java/de/ids_mannheim/korap/response/KorapResponse.java
index c826f71..d8bfe38 100644
--- a/src/main/java/de/ids_mannheim/korap/response/KorapResponse.java
+++ b/src/main/java/de/ids_mannheim/korap/response/KorapResponse.java
@@ -25,6 +25,7 @@
  *
  * @author Nils Diewald
  * @see de.ids_mannheim.korap.response.Notifications
+ * @see de.ids_mannheim.korap.response.serialize.KorapResponseDeserializer
  */
 @JsonDeserialize(using = KorapResponseDeserializer.class)
 public class KorapResponse extends Notifications {
@@ -34,6 +35,7 @@
     private String benchmark;
     private boolean timeExceeded = false;
 
+
     /**
      * Construct a new KorapResponse object.
      *
@@ -43,6 +45,17 @@
 
 
     /**
+     * Get string representation of the backend's version.
+     *
+     * @return String representation of the backend's version
+     */
+    @JsonIgnore
+    public String getVersion () {
+        return this.version;
+    };
+
+
+    /**
      * Set the string representation of the backend's version.
      *
      * @param version The string representation of the backend's version
@@ -56,13 +69,14 @@
 
 
     /**
-     * Get string representation of the backend's version.
+     * Get string representation of the backend's name.
+     * All nodes in a cluster should have the same backend name.
      *
-     * @return String representation of the backend's version
+     * @return String representation of the backend's name
      */
     @JsonIgnore
-    public String getVersion () {
-        return this.version;
+    public String getName () {
+        return this.name;
     };
 
 
@@ -81,14 +95,14 @@
 
 
     /**
-     * Get string representation of the backend's name.
-     * All nodes in a cluster should have the same backend name.
+     * Get string representation of the node's name.
+     * Each node in a cluster has a unique name.
      *
-     * @return String representation of the backend's name
+     * @return String representation of the node's name
      */
     @JsonIgnore
-    public String getName () {
-        return this.name;
+    public String getNode () {
+        return this.node;
     };
 
 
@@ -107,14 +121,14 @@
 
 
     /**
-     * Get string representation of the node's name.
-     * Each node in a cluster has a unique name.
+     * Check if the response time was exceeded.
      *
-     * @return String representation of the node's name
+     * @return <tt>true</tt> in case the response had a timeout,
+     *         otherwise <tt>false</tt>
      */
     @JsonIgnore
-    public String getNode () {
-        return this.node;
+    public boolean hasTimeExceeded () {
+        return this.timeExceeded;
     };
     
 
@@ -139,16 +153,16 @@
 
 
     /**
-     * Check if the response time was exceeded.
+     * Get the benchmark time as a string.
      *
-     * @return <tt>true</tt> in case the response had a timeout,
-     *         otherwise <tt>false</tt>
+     * @return String representation of the benchmark
+     *         (including trailing time unit)
      */
     @JsonIgnore
-    public boolean hasTimeExceeded () {
-        return this.timeExceeded;
+    public String getBenchmark () {
+        return this.benchmark;
     };
-
+    
 
     /**
      * Set the benchmark as timestamp differences.
@@ -181,19 +195,18 @@
         this.benchmark = bm;
         return this;
     };
-
+    
 
     /**
-     * Get the benchmark time as a string.
+     * Get the listener URI as a string.
      *
-     * @return String representation of the benchmark
-     *         (including trailing time unit)
+     * @return The listener URI as a string representation
      */
     @JsonIgnore
-    public String getBenchmark () {
-        return this.benchmark;
+    public String getListener () {
+        return this.listener;
     };
-    
+
 
     /**
      * Set the listener URI as a String. This is probably the localhost
@@ -212,17 +225,6 @@
         this.listener = listener;
         return this;
     };
-    
-
-    /**
-     * Get the listener URI as a string.
-     *
-     * @return The listener URI as a string representation
-     */
-    @JsonIgnore
-    public String getListener () {
-        return this.listener;
-    };
 
 
     /**
@@ -266,6 +268,7 @@
         return (JsonNode) json;
     };
 
+
     /**
      * Serialize response as a JSON string.
      * <p>
diff --git a/src/main/java/de/ids_mannheim/korap/response/Message.java b/src/main/java/de/ids_mannheim/korap/response/Message.java
index 9a0c91b..c121c9d 100644
--- a/src/main/java/de/ids_mannheim/korap/response/Message.java
+++ b/src/main/java/de/ids_mannheim/korap/response/Message.java
@@ -29,6 +29,7 @@
     private int code = 0;
     private LinkedList<String> parameters;
 
+
     /**
      * Construct a new message object.
      *
@@ -37,8 +38,8 @@
      * @return The new message object
      */
     public Message (int code, String msg) {
-	this.code = code;
-	this.msg  = msg;
+        this.code = code;
+        this.msg  = msg;
     };
 
     /**
@@ -48,17 +49,6 @@
      */
     public Message () {};
 
-    /**
-     * Set the string representation of the message.
-     *
-     * @param msg String representation of the message
-     * @return Message object for chaining
-     */
-    @JsonIgnore
-    public Message setMessage (String msg) {
-	this.msg = msg;
-	return this;
-    };
 
     /**
      * Return the string representation of the message.
@@ -67,9 +57,35 @@
      */
     @JsonIgnore
     public String getMessage () {
-	return this.msg;
+        return this.msg;
     };
 
+
+    /**
+     * Set the string representation of the message.
+     *
+     * @param msg String representation of the message
+     * @return Message object for chaining
+     */
+    @JsonIgnore
+    public Message setMessage (String msg) {
+        this.msg = msg;
+        return this;
+    };
+
+
+    /**
+     * Return the integer code representation of the message.
+     *
+     * @return Integer code representation of the message
+     */
+    @JsonIgnore
+    public int getCode () {
+        return this.code;
+    };
+
+
+
     /**
      * Set the integer representation of the message.
      *
@@ -78,18 +94,8 @@
      */
     @JsonIgnore
     public Message setCode (int code) {
-	this.code = code;
-	return this;
-    };
-
-    /**
-     * Return the integer code representation of the message.
-     *
-     * @return Integer code representation of the message
-     */
-    @JsonIgnore
-    public int getCode () {
-	return this.code;
+        this.code = code;
+        return this;
     };
 
 
@@ -99,12 +105,13 @@
      * @return Message object for chaining
      */
     public Message addParameter (String param) {
-	if (this.parameters == null)
-	    this.parameters = new LinkedList<String>();
-	this.parameters.add(param);
-	return this;
+        if (this.parameters == null)
+            this.parameters = new LinkedList<String>();
+        this.parameters.add(param);
+        return this;
     };
 
+
     /**
      * Create a clone of the Message.
      *
@@ -112,23 +119,23 @@
      * @throws CloneNotSupportedException if message can't be cloned
      */
     public Object clone () throws CloneNotSupportedException {
-	Message clone = new Message();
+        Message clone = new Message();
 
-	// Copy message string
-	if (this.msg != null)
-	    clone.msg = this.msg;
+        // Copy message string
+        if (this.msg != null)
+            clone.msg = this.msg;
 
-	// Copy message code
-	clone.code = this.code;
+        // Copy message code
+        clone.code = this.code;
+        
+        // Copy parameters
+        if (this.parameters != null) {
+            for (String p : this.parameters) {
+                clone.addParameter(p);
+            };
+        };
 
-	// Copy parameters
-	if (this.parameters != null) {
-	    for (String p : this.parameters) {
-		clone.addParameter(p);
-	    };
-	};
-
-	return clone;
+        return clone;
     };
 
     /**
@@ -137,16 +144,16 @@
      * @return JsonNode representation of the message
      */
     public JsonNode toJsonNode () {
-	ArrayNode message = mapper.createArrayNode();
+        ArrayNode message = mapper.createArrayNode();
 
-	if (this.code != 0)
-	    message.add(this.getCode());
-
-	message.add(this.getMessage());
-	if (parameters != null)
-	    for (String p : parameters)
-		message.add(p);
-	return (JsonNode) message;
+        if (this.code != 0)
+            message.add(this.getCode());
+        
+        message.add(this.getMessage());
+        if (parameters != null)
+            for (String p : parameters)
+                message.add(p);
+        return (JsonNode) message;
     };
 
 
@@ -160,16 +167,16 @@
      * @return String representation of the message
      */
     public String toJsonString () {
-	String msg = "";
-	try {
-	    return mapper.writeValueAsString(this.toJsonNode());
-	}
-	catch (Exception e) {
-	    // Bad in case the message contains quotes!
-	    msg = ", \"" + e.getLocalizedMessage() + "\"";
-	};
-	return
-	    "[620, " +
-	    "\"Unable to generate JSON\"" + msg + "]";
+        String msg = "";
+        try {
+            return mapper.writeValueAsString(this.toJsonNode());
+        }
+        catch (Exception e) {
+            // Bad in case the message contains quotes!
+            msg = ", \"" + e.getLocalizedMessage() + "\"";
+        };
+        return
+            "[620, " +
+            "\"Unable to generate JSON\"" + msg + "]";
     };
 };
diff --git a/src/main/java/de/ids_mannheim/korap/response/Messages.java b/src/main/java/de/ids_mannheim/korap/response/Messages.java
index c78e6aa..cc7b723 100644
--- a/src/main/java/de/ids_mannheim/korap/response/Messages.java
+++ b/src/main/java/de/ids_mannheim/korap/response/Messages.java
@@ -34,36 +34,38 @@
 
     // Private class for iterator implementation
     private class MessageIterator implements Iterator<Message> {
-	int index;
+        int index;
 
-	// Constructor
+        // Constructor
         public MessageIterator () {
             this.index = 0;
         };
 
         @Override
-	public boolean hasNext () {
+        public boolean hasNext () {
             return this.index < messages.size();
         };
 
         @Override
-	public Message next () {
+        public Message next () {
             return messages.get(this.index++);
         };
 
         @Override
         public void remove () {
-	    messages.remove(this.index);
+            messages.remove(this.index);
         };
     };
 
+
     /**
      * Construct a new Messages object.
      */
     public Messages () {
-	this.messages = new ArrayList<Message>(3);
+        this.messages = new ArrayList<Message>(3);
     };
 
+
     /**
      * Get the iterator object.
      *
@@ -73,6 +75,7 @@
         return new MessageIterator();
     };
 
+
     /**
      * Append a new message.
      *
@@ -82,16 +85,17 @@
      * @return New Message object
      */
     public Message add (int code,
-			String message,
-			String ... terms) {
-	Message newMsg = new Message(code, message);
-	messages.add(newMsg);
-	if (terms != null)
-	    for (String t : terms)
-		newMsg.addParameter(t);
-	return newMsg;
+                        String message,
+                        String ... terms) {
+        Message newMsg = new Message(code, message);
+        messages.add(newMsg);
+        if (terms != null)
+            for (String t : terms)
+                newMsg.addParameter(t);
+        return newMsg;
     };
 
+
     /**
      * Append an existing message.
      *
@@ -99,14 +103,14 @@
      * @return Cloned Message object
      */
     public Message add (Message msg) {
-	try {
-	    Message msgClone = (Message) msg.clone();
-	    messages.add(msgClone);
-	    return msgClone;
-	}
-	catch (CloneNotSupportedException e) {
-	};
-	return (Message) null;
+        try {
+            Message msgClone = (Message) msg.clone();
+            messages.add(msgClone);
+            return msgClone;
+        }
+        catch (CloneNotSupportedException e) {
+        };
+        return (Message) null;
     };
 
     /**
@@ -117,34 +121,34 @@
      * @throws QueryException if notification is not well formed (Error 750)
      */
     public Message add (JsonNode msg) throws QueryException {
-	if (!msg.isArray() || !msg.has(0))
-	    throw new QueryException(
-	        750, "Passed notifications are not well formed"
-	    );
+        if (!msg.isArray() || !msg.has(0))
+            throw new QueryException(
+                750, "Passed notifications are not well formed"
+            );
 
-	// Valid message
-	Message newMsg = new Message();
-	short i = 1;
-	if (msg.get(0).isNumber()) {
-	    newMsg.setCode(msg.get(0).asInt());
-	    if (!msg.has(1))
-		throw new QueryException(
-	            750, "Passed notifications are not well formed"
-	        );
-	    newMsg.setMessage(msg.get(1).asText());
-	    i++;
-	}
-	else {
-	    newMsg.setMessage(msg.get(0).asText());
-	};
+        // Valid message
+        Message newMsg = new Message();
+        short i = 1;
+        if (msg.get(0).isNumber()) {
+            newMsg.setCode(msg.get(0).asInt());
+            if (!msg.has(1))
+                throw new QueryException(
+                    750, "Passed notifications are not well formed"
+	            );
+            newMsg.setMessage(msg.get(1).asText());
+            i++;
+        }
+        else {
+            newMsg.setMessage(msg.get(0).asText());
+        };
 
-	// Add parameters
-	while (msg.has(i))
-	    newMsg.addParameter(msg.get(i++).asText());
-
-	// Add messages to list
-	this.add(newMsg);
-	return newMsg;
+        // Add parameters
+        while (msg.has(i))
+            newMsg.addParameter(msg.get(i++).asText());
+        
+        // Add messages to list
+        this.add(newMsg);
+        return newMsg;
     };
 
 
@@ -155,32 +159,34 @@
      * @return Messages object for chaining.
      */
     public Messages add (Messages msgs) {
-	try {
-	    for (Message msg : msgs.getMessages())
-		this.add((Message) msg.clone());
-	}
-	catch (CloneNotSupportedException e) {
-	};
-	return this;
+        try {
+            for (Message msg : msgs.getMessages())
+                this.add((Message) msg.clone());
+        }
+        catch (CloneNotSupportedException e) {
+        };
+        return this;
     };
 
+
     /**
      * Clear all messages.
      *
      * @return Messages object for chaining
      */
     public Messages clear () {
-	this.messages.clear();
-	return this;
+        this.messages.clear();
+        return this;
     };
 
+
     /**
      * Get the number of the messages.
      *
      * @param Integer representing the number of messages in the list.
      */
     public int size () {
-	return this.messages.size();
+        return this.messages.size();
     };
 
 
@@ -192,11 +198,12 @@
      */
     @JsonIgnore
     public Message get (int index) {
-	if (index >= this.size())
-	    return (Message) null;
-	return this.messages.get(index);
+        if (index >= this.size())
+            return (Message) null;
+        return this.messages.get(index);
     };
 
+
     /**
      * Return all messages.
      *
@@ -204,7 +211,7 @@
      */
     @JsonIgnore
     public List<Message> getMessages () {
-	return this.messages;
+        return this.messages;
     };
 
 
@@ -215,24 +222,25 @@
      * @throws CloneNotSupportedException if messages can't be cloned
      */
     public Object clone () throws CloneNotSupportedException {
-	Messages clone = new Messages();
-	for (Message m : this.messages) {
-	    clone.add((Message) m.clone());
-	};
+        Messages clone = new Messages();
+        for (Message m : this.messages) {
+            clone.add((Message) m.clone());
+        };
 
-	return clone;
+        return clone;
     };
 
+
     /**
      * Serialize Messages as a JsonNode.
      *
      * @return JsonNode representation of all messages
      */
     public JsonNode toJsonNode () {
-	ArrayNode messageArray = mapper.createArrayNode();
-	for (Message msg : this.messages)
-	    messageArray.add(msg.toJsonNode());
-	return (JsonNode) messageArray;
+        ArrayNode messageArray = mapper.createArrayNode();
+        for (Message msg : this.messages)
+            messageArray.add(msg.toJsonNode());
+        return (JsonNode) messageArray;
     };
 
 
@@ -249,17 +257,17 @@
      * @return String representation of all messages
      */
     public String toJsonString () {
-	String msg = "";
-	try {
-	    return mapper.writeValueAsString(this.toJsonNode());
-	}
-	catch (Exception e) {
-	    // Bad in case the message contains quotes!
-	    msg = ", \"" + e.getLocalizedMessage() + "\"";
-	};
+        String msg = "";
+        try {
+            return mapper.writeValueAsString(this.toJsonNode());
+        }
+        catch (Exception e) {
+            // Bad in case the message contains quotes!
+            msg = ", \"" + e.getLocalizedMessage() + "\"";
+        };
 
-	return
-	    "[620, " +
-	    "\"Unable to generate JSON\"" + msg + "]";
+        return
+            "[620, " +
+            "\"Unable to generate JSON\"" + msg + "]";
     };
 };
diff --git a/src/main/java/de/ids_mannheim/korap/response/Notifications.java b/src/main/java/de/ids_mannheim/korap/response/Notifications.java
index 9074828..ad65024 100644
--- a/src/main/java/de/ids_mannheim/korap/response/Notifications.java
+++ b/src/main/java/de/ids_mannheim/korap/response/Notifications.java
@@ -45,9 +45,43 @@
     // Create object mapper for JSON generation
     ObjectMapper mapper = new ObjectMapper();
 
-    private Messages warnings,
-	             errors,
-	             messages;
+    private Messages warnings, errors, messages;
+
+
+    /**
+     * Check for warnings.
+     *
+     * @return <tt>true</tt> in case there are warnings, otherwise <tt>false</tt>
+     */
+    public boolean hasWarnings () {
+        if (this.warnings == null || this.warnings.size() == 0)
+            return false;
+        return true;
+    };
+
+
+    /**
+     * Return all warnings.
+     *
+     * @return The <code>Messages</code> object representing all warnings
+     */
+    public Messages getWarnings () {
+        return this.warnings;
+    };
+
+
+    /**
+     * Return a specific warning based on an index.
+     *
+     * @param index The index of the warning in the list of warnings.
+     * @return The message in case it exists, otherwise <code>null</code>
+     */
+    public Message getWarning (int index) {
+        if (this.warnings != null)
+            return this.warnings.get(index);
+        return (Message) null;
+    };
+
 
     /**
      * Appends a new warning.
@@ -58,12 +92,13 @@
      * @return Notification object for chaining
      */
     public Notifications addWarning (int code, String msg, String ... terms) {
-	if (this.warnings == null)
-	    this.warnings = new Messages();
-	this.warnings.add(code, msg, terms);
-	return this;
+        if (this.warnings == null)
+            this.warnings = new Messages();
+        this.warnings.add(code, msg, terms);
+        return this;
     };
 
+    
     /**
      * Appends a new warning.
      *
@@ -71,19 +106,20 @@
      * @return Notification object for chaining
      */
     public Notifications addWarning (JsonNode node) {
-	if (this.warnings == null)
-	    this.warnings = new Messages();
-
-	try {
-	    this.warnings.add(node);
-	}
-	catch (QueryException qe) {
-	    this.warnings.add(qe.getErrorCode(), qe.getMessage());
-	};
-
-	return this;
+        if (this.warnings == null)
+            this.warnings = new Messages();
+    
+        try {
+            this.warnings.add(node);
+        }
+        catch (QueryException qe) {
+            this.warnings.add(qe.getErrorCode(), qe.getMessage());
+        };
+        
+        return this;
     };
 
+
     /**
      * Appends new warnings.
      *
@@ -91,105 +127,21 @@
      * @return Notification object for chaining
      */
     public Notifications addWarnings (Messages msgs) {
-	if (this.warnings == null)
-	    this.warnings = msgs;
-	else
-	    this.warnings.add(msgs);
-	return this;
+        if (this.warnings == null)
+            this.warnings = msgs;
+        else
+            this.warnings.add(msgs);
+        return this;
     };
 
 
     /**
-     * Return all warnings.
-     *
-     * @return The <code>Messages</code> object representing all warnings
-     */
-    public Messages getWarnings () {
-	return this.warnings;
-    };
-
-    /**
-     * Return a specific warning based on an index.
-     *
-     * @param index The index of the warning in the list of warnings.
-     * @return The message in case it exists, otherwise <code>null</code>
-     */
-    public Message getWarning (int index) {
-	if (this.warnings != null)
-	    return this.warnings.get(index);
-	return (Message) null;
-    };
-
-
-    /**
-     * Check for warnings.
-     *
-     * @return <tt>true</tt> in case there are warnings, otherwise <tt>false</tt>
-     */
-    public boolean hasWarnings () {
-	if (this.warnings == null || this.warnings.size() == 0)
-	    return false;
-	return true;
-    };
-
-    /**
-     * Appends a new error.
-     *
-     * @param code  Integer code representation of the error
-     * @param msg   String representation of the error
-     * @param terms Optional strings of additional information
-     * @return Notification object for chaining
-     */
-    public Notifications addError (int code, String msg, String ... terms) {
-	if (this.errors == null)
-	    this.errors = new Messages();
-	this.errors.add(code, msg, terms);
-	return this;
-    };
-
-    /**
-     * Appends a new error.
-     *
-     * @param node  <code>JsonNode</code> representing an error message
-     * @return Notification object for chaining
-     */
-    public Notifications addError (JsonNode msg) {
-	if (this.errors == null)
-	    this.errors = new Messages();
-	try {
-	    this.errors.add(msg);
-	}
-	catch (QueryException qe) {
-	    this.errors.add(qe.getErrorCode(), qe.getMessage());
-	};
-
-	return this;
-    };
-
-
-    /**
-     * Appends new errors.
-     *
-     * @param msgs  <code>Messages</code> representing multiple errors
-     * @return Notification object for chaining
-     */
-    public Notifications addErrors (Messages msgs) {
-	if (this.errors == null)
-	    this.errors = msgs;
-	else
-	    this.errors.add(msgs);
-	return this;
-    };
-
-
-
-    /**
      * Return all errors.
      *
      * @return The <code>Messages</code> object representing all errors
      */
     public Messages getErrors () {
-	return this.errors;
+        return this.errors;
     };
 
 
@@ -200,9 +152,9 @@
      * @return The message in case it exists, otherwise <code>null</code>
      */
     public Message getError (int index) {
-	if (this.errors != null)
-	    return this.errors.get(index);
-	return (Message) null;
+        if (this.errors != null)
+            return this.errors.get(index);
+        return (Message) null;
     };
 
 
@@ -212,9 +164,94 @@
      * @return <tt>true</tt> in case there are errors, otherwise <tt>false</tt>
      */
     public boolean hasErrors () {
-	if (this.errors == null || this.errors.size() == 0)
-	    return false;
-	return true;
+        if (this.errors == null || this.errors.size() == 0)
+            return false;
+        return true;
+    };
+
+
+    /**
+     * Appends a new error.
+     *
+     * @param code  Integer code representation of the error
+     * @param msg   String representation of the error
+     * @param terms Optional strings of additional information
+     * @return Notification object for chaining
+     */
+    public Notifications addError (int code, String msg, String ... terms) {
+        if (this.errors == null)
+            this.errors = new Messages();
+        this.errors.add(code, msg, terms);
+        return this;
+    };
+
+
+    /**
+     * Appends a new error.
+     *
+     * @param node  <code>JsonNode</code> representing an error message
+     * @return Notification object for chaining
+     */
+    public Notifications addError (JsonNode msg) {
+        if (this.errors == null)
+            this.errors = new Messages();
+        try {
+            this.errors.add(msg);
+        }
+        catch (QueryException qe) {
+            this.errors.add(qe.getErrorCode(), qe.getMessage());
+        };
+        
+        return this;
+    };
+
+
+    /**
+     * Appends new errors.
+     *
+     * @param msgs  <code>Messages</code> representing multiple errors
+     * @return Notification object for chaining
+     */
+    public Notifications addErrors (Messages msgs) {
+        if (this.errors == null)
+            this.errors = msgs;
+        else
+            this.errors.add(msgs);
+        return this;
+    };
+
+
+    /**
+     * Return all messages.
+     *
+     * @return The <code>Messages</code> object representing all messages
+     */
+    public Messages getMessages () {
+        return this.messages;
+    };
+
+    /**
+     * Return a specific message based on an index.
+     *
+     * @param index The index of the message in the list of messages.
+     * @return The message in case it exists, otherwise <code>null</code>
+     */
+    public Message getMessage (int index) {
+        if (this.messages != null)
+            return this.messages.get(index);
+        return (Message) null;
+    };
+
+
+    /**
+     * Check for messages.
+     *
+     * @return <tt>true</tt> in case there are messages, otherwise <tt>false</tt>
+     */
+    public boolean hasMessages () {
+        if (this.messages == null || this.messages.size() == 0)
+            return false;
+        return true;
     };
 
 
@@ -227,12 +264,13 @@
      * @return Notification object for chaining
      */
     public Notifications addMessage (int code, String msg, String ... terms) {
-	if (this.messages == null)
-	    this.messages = new Messages();
-	this.messages.add(code, msg, terms);
-	return this;
+        if (this.messages == null)
+            this.messages = new Messages();
+        this.messages.add(code, msg, terms);
+        return this;
     };
 
+
     /**
      * Appends a new message.
      *
@@ -240,15 +278,15 @@
      * @return Notification object for chaining
      */
     public Notifications addMessage (JsonNode msg) {
-	if (this.messages == null)
-	    this.messages = new Messages();
-	try {
-	    this.messages.add(msg);
-	}
-	catch (QueryException qe) {
-	    this.messages.add(qe.getErrorCode(), qe.getMessage());
-	};
-	return this;
+        if (this.messages == null)
+            this.messages = new Messages();
+        try {
+            this.messages.add(msg);
+        }
+        catch (QueryException qe) {
+            this.messages.add(qe.getErrorCode(), qe.getMessage());
+        };
+        return this;
     };
 
 
@@ -259,45 +297,11 @@
      * @return Notification object for chaining
      */
     public Notifications addMessages (Messages msgs) {
-	if (this.messages == null)
-	    this.messages = msgs;
-	else
-	    this.messages.add(msgs);
-	return this;
-    };
-
-
-    /**
-     * Return all messages.
-     *
-     * @return The <code>Messages</code> object representing all messages
-     */
-    public Messages getMessages () {
-	return this.messages;
-    };
-
-    /**
-     * Return a specific message based on an index.
-     *
-     * @param index The index of the message in the list of messages.
-     * @return The message in case it exists, otherwise <code>null</code>
-     */
-    public Message getMessage (int index) {
-	if (this.messages != null)
-	    return this.messages.get(index);
-	return (Message) null;
-    };
-
-
-    /**
-     * Check for messages.
-     *
-     * @return <tt>true</tt> in case there are messages, otherwise <tt>false</tt>
-     */
-    public boolean hasMessages () {
-	if (this.messages == null || this.messages.size() == 0)
-	    return false;
-	return true;
+        if (this.messages == null)
+            this.messages = msgs;
+        else
+            this.messages.add(msgs);
+        return this;
     };
 
 
@@ -308,17 +312,17 @@
      * @return Notification object for chaining
      */
     public Notifications copyNotificationsFrom (Notifications notes) {
-	try {
-	    if (notes.hasErrors())
-		this.addErrors((Messages) notes.getErrors().clone());
-	    if (notes.hasWarnings())
-		this.addWarnings((Messages) notes.getWarnings().clone());
-	    if (notes.hasMessages())
-		this.addMessages((Messages) notes.getMessages().clone());
-	}
-	catch (CloneNotSupportedException cnse) {
-	};
-	return this;
+        try {
+            if (notes.hasErrors())
+                this.addErrors((Messages) notes.getErrors().clone());
+            if (notes.hasWarnings())
+                this.addWarnings((Messages) notes.getWarnings().clone());
+            if (notes.hasMessages())
+                this.addMessages((Messages) notes.getMessages().clone());
+        }
+        catch (CloneNotSupportedException cnse) {
+        };
+        return this;
     };
 
 
@@ -330,33 +334,33 @@
      */
     public Notifications copyNotificationsFrom (JsonNode request) {
 
-	// Add warnings from JSON
-	if (request.has("warnings") &&
-	    request.get("warnings").isArray()) {
-	    JsonNode msgs = request.get("warnings");
-	    for (JsonNode msg : msgs)
-		this.addWarning(msg);
-	};
+        // Add warnings from JSON
+        if (request.has("warnings") &&
+            request.get("warnings").isArray()) {
+            JsonNode msgs = request.get("warnings");
+            for (JsonNode msg : msgs)
+                this.addWarning(msg);
+        };
 
-	// Add messages from JSON
-	if (request.has("messages") &&
-	    request.get("messages").isArray()) {
-	    JsonNode msgs = request.get("messages");
-	    if (msgs.isArray())
-		for (JsonNode msg : msgs)
-		    this.addMessage(msg);
-	};
+        // Add messages from JSON
+        if (request.has("messages") &&
+            request.get("messages").isArray()) {
+            JsonNode msgs = request.get("messages");
+            if (msgs.isArray())
+                for (JsonNode msg : msgs)
+                    this.addMessage(msg);
+        };
 
-	// Add errors from JSON
-	if (request.has("errors") &&
-	    request.get("errors").isArray()) {
-	    JsonNode msgs = request.get("errors");
-	    if (msgs.isArray())
-		for (JsonNode msg : msgs)
-		    this.addError(msg);
-	};
-
-	return this;
+        // Add errors from JSON
+        if (request.has("errors") &&
+            request.get("errors").isArray()) {
+            JsonNode msgs = request.get("errors");
+            if (msgs.isArray())
+                for (JsonNode msg : msgs)
+                    this.addError(msg);
+        };
+        
+        return this;
     };
 
 
@@ -366,13 +370,13 @@
      * @return Notification object for chaining
      */
     public Notifications clearNotifications () {
-	if (this.warnings != null)
-	    this.warnings.clear();
-	if (this.messages != null)
-	    this.messages.clear();
-	if (this.errors != null)
-	    this.errors.clear();
-	return this;
+        if (this.warnings != null)
+            this.warnings.clear();
+        if (this.messages != null)
+            this.messages.clear();
+        if (this.errors != null)
+            this.errors.clear();
+        return this;
     };
 
 
@@ -382,19 +386,20 @@
      * @return JsonNode representation of all warnings, errors, and messages
      */
     public JsonNode toJsonNode () {
-	ObjectNode json =  mapper.createObjectNode();
+        ObjectNode json =  mapper.createObjectNode();
 
-	// Add messages
-	if (this.hasWarnings())
-	    json.put("warnings", this.getWarnings().toJsonNode());
-	if (this.hasErrors())
-	    json.put("errors", this.getErrors().toJsonNode());
-	if (this.hasMessages())
-	    json.put("messages", this.getMessages().toJsonNode());
-
-	return (JsonNode) json;
+        // Add messages
+        if (this.hasWarnings())
+            json.put("warnings", this.getWarnings().toJsonNode());
+        if (this.hasErrors())
+            json.put("errors", this.getErrors().toJsonNode());
+        if (this.hasMessages())
+            json.put("messages", this.getMessages().toJsonNode());
+        
+        return (JsonNode) json;
     };
 
+
     /**
      * Serialize Notifications as a JSON string.
      * <p>
@@ -413,22 +418,22 @@
      * @return String representation of all warnings, errors, and messages
      */
     public String toJsonString () {
-	String msg = "";
-	try {
-	    JsonNode node = this.toJsonNode();
-	    if (node == null)
-		return "{}";
-	    return mapper.writeValueAsString(node);
-	}
-	catch (Exception e) {
-	    // Bad in case the message contains quotes!
-	    msg = ", \"" + e.getLocalizedMessage() + "\"";
-	};
+        String msg = "";
+        try {
+            JsonNode node = this.toJsonNode();
+            if (node == null)
+                return "{}";
+            return mapper.writeValueAsString(node);
+        }
+        catch (Exception e) {
+            // Bad in case the message contains quotes!
+            msg = ", \"" + e.getLocalizedMessage() + "\"";
+        };
 
-	return
-	    "{\"errors\" : [" +
-	    "[620, " +
-	    "\"Unable to generate JSON\"" + msg + "]" +
-	    "]}";
+        return
+            "{\"errors\" : [" +
+            "[620, " +
+            "\"Unable to generate JSON\"" + msg + "]" +
+            "]}";
     };
 };
diff --git a/src/main/java/de/ids_mannheim/korap/response/serialize/KorapResponseDeserializer.java b/src/main/java/de/ids_mannheim/korap/response/serialize/KorapResponseDeserializer.java
index 3e009bd..23525ff 100644
--- a/src/main/java/de/ids_mannheim/korap/response/serialize/KorapResponseDeserializer.java
+++ b/src/main/java/de/ids_mannheim/korap/response/serialize/KorapResponseDeserializer.java
@@ -4,15 +4,30 @@
 import java.io.*;
 
 import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.databind.JsonDeserializer;
-import com.fasterxml.jackson.databind.DeserializationContext;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.JsonDeserializer;
+import com.fasterxml.jackson.databind.DeserializationContext;
 
 import de.ids_mannheim.korap.response.KorapResponse;
 
+/**
+ * JSON Deserialization class for Jackson, used by KorapResponse.
+ * No direct usage intended.
+ *
+ * @author Nils Diewald
+ * @see de.ids_mannheim.korap.KorapResponse
+ */
 public class KorapResponseDeserializer extends JsonDeserializer<KorapResponse> {
- 
+
+    /**
+     * Deserialization of JSON format.
+     *
+     * @param parser A parser instance for consuming JSON.
+     * @param ctxt A deserialization context.
+     * @return The deserialized KorapResponse object.
+     */ 
+
     @Override
     public KorapResponse deserialize (JsonParser parser, DeserializationContext ctxt)
         throws IOException, JsonProcessingException {
@@ -27,7 +42,7 @@
             // Is combined name and version
             if (found > 0 && (found + 1 < fullVersion.length())) {
                 kresp.setName(fullVersion.substring(0, found))
-                     .setVersion(fullVersion.substring(found + 1));
+                    .setVersion(fullVersion.substring(found + 1));
             }
             // Is only version number
             else {
@@ -36,9 +51,8 @@
         };
 
         // Deserialize timeout information
-        if (node.has("timeExceeded") && node.get("timeExceeded").asBoolean()) {
+        if (node.has("timeExceeded") && node.get("timeExceeded").asBoolean())
             kresp.setTimeExceeded(true);
-        };
 
         // Deserialize benchmark information
         if (node.has("benchmark"))
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestKorapDocument.java b/src/test/java/de/ids_mannheim/korap/index/TestKorapDocument.java
new file mode 100644
index 0000000..ed38e70
--- /dev/null
+++ b/src/test/java/de/ids_mannheim/korap/index/TestKorapDocument.java
@@ -0,0 +1,141 @@
+package de.ids_mannheim.korap.index;
+
+import java.util.*;
+import java.io.*;
+
+// This may be better in a model subdirectory
+
+import org.apache.lucene.util.Version;
+import org.apache.lucene.util.BytesRef;
+import org.apache.lucene.util.Bits;
+
+import static org.junit.Assert.*;
+import org.junit.Test;
+import org.junit.Ignore;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+import de.ids_mannheim.korap.KorapDocument;
+
+@RunWith(JUnit4.class)
+public class TestKorapDocument {
+
+    private class KorapRealDocument extends KorapDocument {};
+
+    @Test
+    public void createDocument () throws IOException {
+        KorapRealDocument krd = new KorapRealDocument();
+        krd.setPubDate("2014-10-12");
+        assertEquals("20141012", krd.getPubDate().toString());
+        assertEquals("2014-10-12", krd.getPubDateString());
+
+        krd.setCreationDate("2012-09-05");
+        assertEquals("20120905", krd.getCreationDate().toString());
+        assertEquals("2012-09-05", krd.getCreationDateString());
+
+        krd.setAuthor("Stephen King");
+        assertEquals("Stephen King", krd.getAuthor());
+
+        krd.setPubPlace("Düsseldorf");
+        assertEquals("Düsseldorf", krd.getPubPlace());
+
+        krd.setUID(415);
+        assertEquals(415, krd.getUID());
+
+        krd.setUID("561");
+        assertEquals(561, krd.getUID());
+
+        try {
+            krd.setUID("zzz");
+        }
+        catch (NumberFormatException e) {
+        };
+        assertEquals(561, krd.getUID());
+
+        krd.setTitle("An Example");
+        assertEquals("An Example", krd.getTitle());
+
+        krd.setSubTitle("An Example");
+        assertEquals("An Example", krd.getSubTitle());
+
+        krd.setPrimaryData("We don't need no education");
+        assertEquals("We don't need no education", krd.getPrimaryData());
+        assertEquals("don't need no education", krd.getPrimaryData(3));
+        assertEquals("do", krd.getPrimaryData(3,5));
+        assertEquals(26, krd.getPrimaryDataLength());
+
+        krd.setPrimaryData("abc");
+        assertEquals(3, krd.getPrimaryDataLength());
+        krd.setPrimaryData("öäüß");
+        assertEquals(4, krd.getPrimaryDataLength());
+
+        krd.setTextSigle("U-abc-001");
+        assertEquals("U-abc-001", krd.getTextSigle());
+
+        krd.setDocSigle("U-abc");
+        assertEquals("U-abc", krd.getDocSigle());
+
+        krd.setCorpusSigle("U");
+        assertEquals("U", krd.getCorpusSigle());
+
+        krd.setPublisher("Pope Francis");
+        assertEquals("Pope Francis", krd.getPublisher());
+
+        krd.setEditor("Michael Knight");
+        assertEquals("Michael Knight", krd.getEditor());
+
+        krd.setTextType("shortstory");
+        assertEquals("shortstory", krd.getTextType());
+
+        krd.setTextTypeArt("Reportage");
+        assertEquals("Reportage", krd.getTextTypeArt());
+
+        krd.setTextTypeRef("Hm");
+        assertEquals("Hm", krd.getTextTypeRef());
+
+        krd.setTextColumn("Feuilleton");
+        assertEquals("Feuilleton", krd.getTextColumn());
+
+        krd.setTextDomain("Comment");
+        assertEquals("Comment", krd.getTextDomain());
+
+        krd.setLicense("cc");
+        assertEquals("cc", krd.getLicense());
+
+        krd.setPages("56-78");
+        assertEquals("56-78", krd.getPages());
+
+        krd.setFileEditionStatement("no problemo 1");
+        assertEquals("no problemo 1", krd.getFileEditionStatement());
+
+        krd.setBiblEditionStatement("no problemo 2");
+        assertEquals("no problemo 2", krd.getBiblEditionStatement());
+
+        krd.setLanguage("de");
+        assertEquals("de", krd.getLanguage());
+
+        krd.setCorpusTitle("Mannheimer Morgen");
+        assertEquals("Mannheimer Morgen", krd.getCorpusTitle());
+
+        krd.setCorpusSubTitle("Zeitung für Mannheim");
+        assertEquals("Zeitung für Mannheim", krd.getCorpusSubTitle());
+
+        krd.setCorpusAuthor("Peter Gabriel");
+        assertEquals("Peter Gabriel", krd.getCorpusAuthor());
+
+        krd.setCorpusEditor("Phil Collins");
+        assertEquals("Phil Collins", krd.getCorpusEditor());
+
+        krd.setDocTitle("New York Times");
+        assertEquals("New York Times", krd.getDocTitle());
+
+        krd.setDocSubTitle("Newspaper for New York");
+        assertEquals("Newspaper for New York", krd.getDocSubTitle());
+
+        krd.setDocAuthor("Dean Baquet");
+        assertEquals("Dean Baquet", krd.getDocAuthor());
+
+        krd.setDocEditor("Arthur Ochs Sulzberger Jr.");
+        assertEquals("Arthur Ochs Sulzberger Jr.", krd.getDocEditor());
+    };
+};
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 43686f0..2ec3345 100644
--- a/src/test/java/de/ids_mannheim/korap/response/TestResponse.java
+++ b/src/test/java/de/ids_mannheim/korap/response/TestResponse.java
@@ -131,18 +131,25 @@
         assertTrue(kresp.hasTimeExceeded());
         assertTrue(kresp.hasWarnings());
 
-
         jsonResponse = "{\"warnings\":[[123,\"This is a warning\"]," +
             "[124,\"This is a second warning\"]],"+
-            "\"error\":[[125,\"This is a single error\"]], "+
+            "\"errors\":[[125,\"This is a single error\"]], "+
             " \"node\":\"tanja\", \"version\":\"seaweed-0.49\", " +
             " \"benchmark\":\"40.5s\",  \"listener\":\"10.0.10.14:678\"," +
             "\"timeExceeded\":true }";
         kresp = mapper.readValue(jsonResponse, KorapResponse.class);
-
-        /*
-{,"version":"seaweed-0.49","timeExceeded":true,"node":"tanja","listener":"10.0.10.14:678","benchmark":"40.5s"}
-        */
-        // System.err.println(kresp.toJsonString());
+        assertTrue(kresp.hasWarnings());
+        assertTrue(kresp.hasErrors());
+        assertFalse(kresp.hasMessages());
+        assertEquals(kresp.getError(0).getMessage(), "This is a single error");
+        assertEquals(kresp.getWarning(0).getMessage(), "Response time exceeded");
+        assertEquals(kresp.getWarning(1).getMessage(), "This is a warning");
+        assertEquals(kresp.getWarning(2).getMessage(), "This is a second warning");
+        assertEquals("0.49", kresp.getVersion());
+        assertEquals("seaweed", kresp.getName());
+        assertEquals("40.5s", kresp.getBenchmark());
+        assertEquals("10.0.10.14:678", kresp.getListener());
+        assertEquals("tanja", kresp.getNode());
+        assertTrue(kresp.hasTimeExceeded());
     };
 };
