diff --git a/jgibblda/.settings/org.eclipse.jdt.ui.prefs b/jgibblda/.settings/org.eclipse.jdt.ui.prefs
index 5713c654549b40f76104760ab2f6cd031d71f011..67b3835098d95ab9541c4dbdc4cb4c5dd04ea5b5 100644
--- a/jgibblda/.settings/org.eclipse.jdt.ui.prefs
+++ b/jgibblda/.settings/org.eclipse.jdt.ui.prefs
@@ -1,3 +1,62 @@
+cleanup.add_default_serial_version_id=true
+cleanup.add_generated_serial_version_id=false
+cleanup.add_missing_annotations=true
+cleanup.add_missing_deprecated_annotations=true
+cleanup.add_missing_methods=false
+cleanup.add_missing_nls_tags=false
+cleanup.add_missing_override_annotations=true
+cleanup.add_missing_override_annotations_interface_methods=true
+cleanup.add_serial_version_id=false
+cleanup.always_use_blocks=true
+cleanup.always_use_parentheses_in_expressions=false
+cleanup.always_use_this_for_non_static_field_access=false
+cleanup.always_use_this_for_non_static_method_access=false
+cleanup.convert_functional_interfaces=false
+cleanup.convert_to_enhanced_for_loop=true
+cleanup.correct_indentation=true
+cleanup.format_source_code=true
+cleanup.format_source_code_changes_only=false
+cleanup.insert_inferred_type_arguments=false
+cleanup.make_local_variable_final=true
+cleanup.make_parameters_final=true
+cleanup.make_private_fields_final=true
+cleanup.make_type_abstract_if_missing_method=false
+cleanup.make_variable_declarations_final=true
+cleanup.never_use_blocks=false
+cleanup.never_use_parentheses_in_expressions=true
+cleanup.organize_imports=true
+cleanup.qualify_static_field_accesses_with_declaring_class=false
+cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+cleanup.qualify_static_member_accesses_with_declaring_class=true
+cleanup.qualify_static_method_accesses_with_declaring_class=false
+cleanup.remove_private_constructors=true
+cleanup.remove_redundant_type_arguments=true
+cleanup.remove_trailing_whitespaces=true
+cleanup.remove_trailing_whitespaces_all=true
+cleanup.remove_trailing_whitespaces_ignore_empty=false
+cleanup.remove_unnecessary_casts=true
+cleanup.remove_unnecessary_nls_tags=true
+cleanup.remove_unused_imports=true
+cleanup.remove_unused_local_variables=false
+cleanup.remove_unused_private_fields=true
+cleanup.remove_unused_private_members=false
+cleanup.remove_unused_private_methods=true
+cleanup.remove_unused_private_types=true
+cleanup.sort_members=false
+cleanup.sort_members_all=false
+cleanup.use_anonymous_class_creation=false
+cleanup.use_blocks=false
+cleanup.use_blocks_only_for_return_and_throw=false
+cleanup.use_lambda=true
+cleanup.use_parentheses_in_expressions=false
+cleanup.use_this_for_non_static_field_access=false
+cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+cleanup.use_this_for_non_static_method_access=false
+cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+cleanup.use_type_arguments=false
+cleanup_profile=_vipra
+cleanup_settings_version=2
 eclipse.preferences.version=1
 formatter_profile=_vipra
 formatter_settings_version=12
diff --git a/jgibblda/src/main/java/jgibblda/Constants.java b/jgibblda/src/main/java/jgibblda/Constants.java
index 6d1b558ac9fd8a86ade375aa48e27063934a3a31..65fff358f800501ba6760de427e491b0c24f97cc 100644
--- a/jgibblda/src/main/java/jgibblda/Constants.java
+++ b/jgibblda/src/main/java/jgibblda/Constants.java
@@ -1,9 +1,9 @@
 /*
  * Copyright (C) 2007 by
- * 
+ *
  * Xuan-Hieu Phan hieuxuan@ecei.tohoku.ac.jp or pxhieu@gmail.com Graduate School
  * of Information Sciences Tohoku University
- * 
+ *
  * Cam-Tu Nguyen ncamtu@gmail.com College of Technology Vietnam National
  * University, Hanoi
  *
diff --git a/jgibblda/src/main/java/jgibblda/Conversion.java b/jgibblda/src/main/java/jgibblda/Conversion.java
index c2bd1d7c39969459e0810d42d2b6f00380c69f3a..ed310f99ed9592acbe8ce8c948d7b2f8a1ace974 100644
--- a/jgibblda/src/main/java/jgibblda/Conversion.java
+++ b/jgibblda/src/main/java/jgibblda/Conversion.java
@@ -1,9 +1,9 @@
 /*
  * Copyright (C) 2007 by
- * 
+ *
  * Xuan-Hieu Phan hieuxuan@ecei.tohoku.ac.jp or pxhieu@gmail.com Graduate School
  * of Information Sciences Tohoku University
- * 
+ *
  * Cam-Tu Nguyen ncamtu@gmail.com College of Technology Vietnam National
  * University, Hanoi
  *
@@ -24,8 +24,8 @@
 package jgibblda;
 
 public class Conversion {
-	public static String ZeroPad(int number, int width) {
-		StringBuffer result = new StringBuffer("");
+	public static String ZeroPad(final int number, final int width) {
+		final StringBuffer result = new StringBuffer("");
 		for (int i = 0; i < width - Integer.toString(number).length(); i++)
 			result.append("0");
 		result.append(Integer.toString(number));
diff --git a/jgibblda/src/main/java/jgibblda/Dictionary.java b/jgibblda/src/main/java/jgibblda/Dictionary.java
index 90972c93b834008a6f5817d0baf39b8bec7949fe..335565dd190be4e05eefa2fac10a2df77ab03c54 100644
--- a/jgibblda/src/main/java/jgibblda/Dictionary.java
+++ b/jgibblda/src/main/java/jgibblda/Dictionary.java
@@ -1,9 +1,9 @@
 /*
  * Copyright (C) 2007 by
- * 
+ *
  * Xuan-Hieu Phan hieuxuan@ecei.tohoku.ac.jp or pxhieu@gmail.com Graduate School
  * of Information Sciences Tohoku University
- * 
+ *
  * Cam-Tu Nguyen ncamtu@gmail.com College of Technology Vietnam National
  * University, Hanoi
  *
@@ -56,11 +56,11 @@ public class Dictionary {
 	// get/set methods
 	// ---------------------------------------------------
 
-	public String getWord(int id) {
+	public String getWord(final int id) {
 		return id2word.get(id);
 	}
 
-	public Integer getID(String word) {
+	public Integer getID(final String word) {
 		return word2id.get(word);
 	}
 
@@ -70,11 +70,11 @@ public class Dictionary {
 	/**
 	 * check if this dictionary contains a specified word
 	 */
-	public boolean contains(String word) {
+	public boolean contains(final String word) {
 		return word2id.containsKey(word);
 	}
 
-	public boolean contains(int id) {
+	public boolean contains(final int id) {
 		return id2word.containsKey(id);
 	}
 
@@ -84,9 +84,9 @@ public class Dictionary {
 	/**
 	 * add a word into this dictionary return the corresponding id
 	 */
-	public int addWord(String word) {
+	public int addWord(final String word) {
 		if (!contains(word)) {
-			int id = word2id.size();
+			final int id = word2id.size();
 
 			word2id.put(word, id);
 			id2word.put(id, word);
@@ -102,27 +102,27 @@ public class Dictionary {
 	/**
 	 * read dictionary from file
 	 */
-	public boolean readWordMap(String wordMapFile) {
+	public boolean readWordMap(final String wordMapFile) {
 		try {
-			BufferedReader reader = new BufferedReader(
+			final BufferedReader reader = new BufferedReader(
 					new InputStreamReader(new FileInputStream(wordMapFile), "UTF-8"));
 			String line;
 
 			// read the number of words
 			line = reader.readLine();
-			int nwords = Integer.parseInt(line);
+			final int nwords = Integer.parseInt(line);
 
 			// read map
 			for (int i = 0; i < nwords; ++i) {
 				line = reader.readLine();
-				StringTokenizer tknr = new StringTokenizer(line, " \t\n\r");
+				final StringTokenizer tknr = new StringTokenizer(line, " \t\n\r");
 
 				if (tknr.countTokens() != 2)
 					continue;
 
-				String word = tknr.nextToken();
-				String id = tknr.nextToken();
-				int intID = Integer.parseInt(id);
+				final String word = tknr.nextToken();
+				final String id = tknr.nextToken();
+				final int intID = Integer.parseInt(id);
 
 				id2word.put(intID, word);
 				word2id.put(word, intID);
@@ -130,33 +130,33 @@ public class Dictionary {
 
 			reader.close();
 			return true;
-		} catch (Exception e) {
+		} catch (final Exception e) {
 			log.error("Error while reading dictionary:" + e.getMessage());
 			e.printStackTrace();
 			return false;
 		}
 	}
 
-	public boolean writeWordMap(String wordMapFile) {
+	public boolean writeWordMap(final String wordMapFile) {
 		try {
-			BufferedWriter writer = new BufferedWriter(
+			final BufferedWriter writer = new BufferedWriter(
 					new OutputStreamWriter(new FileOutputStream(wordMapFile), "UTF-8"));
 
 			// write number of words
 			writer.write(word2id.size() + "\n");
 
 			// write word to id
-			Iterator<String> it = word2id.keySet().iterator();
+			final Iterator<String> it = word2id.keySet().iterator();
 			while (it.hasNext()) {
-				String key = it.next();
-				Integer value = word2id.get(key);
+				final String key = it.next();
+				final Integer value = word2id.get(key);
 
 				writer.write(key + " " + value + "\n");
 			}
 
 			writer.close();
 			return true;
-		} catch (Exception e) {
+		} catch (final Exception e) {
 			log.error("Error while writing word map " + e.getMessage());
 			e.printStackTrace();
 			return false;
diff --git a/jgibblda/src/main/java/jgibblda/Document.java b/jgibblda/src/main/java/jgibblda/Document.java
index bc5ce78c4473cc6309c996bea9e8467b2f23780e..cb87aed08e12bddd5ea1223c378b55bd44bc96da 100644
--- a/jgibblda/src/main/java/jgibblda/Document.java
+++ b/jgibblda/src/main/java/jgibblda/Document.java
@@ -1,9 +1,9 @@
 /*
  * Copyright (C) 2007 by
- * 
+ *
  * Xuan-Hieu Phan hieuxuan@ecei.tohoku.ac.jp or pxhieu@gmail.com Graduate School
  * of Information Sciences Tohoku University
- * 
+ *
  * Cam-Tu Nguyen ncamtu@gmail.com College of Technology Vietnam National
  * University, Hanoi
  *
@@ -43,13 +43,13 @@ public class Document {
 		length = 0;
 	}
 
-	public Document(int length) {
+	public Document(final int length) {
 		this.length = length;
 		rawStr = "";
 		words = new int[length];
 	}
 
-	public Document(int length, int[] words) {
+	public Document(final int length, final int[] words) {
 		this.length = length;
 		rawStr = "";
 
@@ -59,7 +59,7 @@ public class Document {
 		}
 	}
 
-	public Document(int length, int[] words, String rawStr) {
+	public Document(final int length, final int[] words, final String rawStr) {
 		this.length = length;
 		this.rawStr = rawStr;
 
@@ -69,7 +69,7 @@ public class Document {
 		}
 	}
 
-	public Document(Vector<Integer> doc) {
+	public Document(final Vector<Integer> doc) {
 		this.length = doc.size();
 		rawStr = "";
 		this.words = new int[length];
@@ -78,7 +78,7 @@ public class Document {
 		}
 	}
 
-	public Document(Vector<Integer> doc, String rawStr) {
+	public Document(final Vector<Integer> doc, final String rawStr) {
 		this.length = doc.size();
 		this.rawStr = rawStr;
 		this.words = new int[length];
diff --git a/jgibblda/src/main/java/jgibblda/Estimator.java b/jgibblda/src/main/java/jgibblda/Estimator.java
index be89f40aa2975b3dc77f8a53d544cc7bad527fb7..8968c09784eae25d47f73b7f34973c7e4274fda1 100644
--- a/jgibblda/src/main/java/jgibblda/Estimator.java
+++ b/jgibblda/src/main/java/jgibblda/Estimator.java
@@ -1,9 +1,9 @@
 /*
  * Copyright (C) 2007 by
- * 
+ *
  * Xuan-Hieu Phan hieuxuan@ecei.tohoku.ac.jp or pxhieu@gmail.com Graduate School
  * of Information Sciences Tohoku University
- * 
+ *
  * Cam-Tu Nguyen ncamtu@gmail.com College of Technology Vietnam National
  * University, Hanoi
  *
@@ -36,7 +36,7 @@ public class Estimator {
 	protected Model trnModel;
 	LDACmdOption option;
 
-	public boolean init(LDACmdOption option) {
+	public boolean init(final LDACmdOption option) {
 		this.option = option;
 		trnModel = new Model();
 
@@ -55,7 +55,7 @@ public class Estimator {
 	public void estimate() {
 		log.info("sampling " + trnModel.niters + " iterations");
 
-		int lastIter = trnModel.liter;
+		final int lastIter = trnModel.liter;
 		for (trnModel.liter = lastIter + 1; trnModel.liter < trnModel.niters + lastIter; trnModel.liter++) {
 			log.info("iteration " + trnModel.liter);
 
@@ -64,7 +64,7 @@ public class Estimator {
 				for (int n = 0; n < trnModel.data.docs[m].length; n++) {
 					// z_i = z[m][n]
 					// sample from p(z_i|z_-i, w)
-					int topic = sampling(m, n);
+					final int topic = sampling(m, n);
 					trnModel.z[m].set(n, topic);
 				} // end for each word
 			} // end for each document
@@ -88,25 +88,25 @@ public class Estimator {
 
 	/**
 	 * Do sampling
-	 * 
+	 *
 	 * @param m
 	 *            document number
 	 * @param n
 	 *            word number
 	 * @return topic id
 	 */
-	public int sampling(int m, int n) {
+	public int sampling(final int m, final int n) {
 		// remove z_i from the count variable
 		int topic = trnModel.z[m].get(n);
-		int w = trnModel.data.docs[m].words[n];
+		final int w = trnModel.data.docs[m].words[n];
 
 		trnModel.nw[w][topic] -= 1;
 		trnModel.nd[m][topic] -= 1;
 		trnModel.nwsum[topic] -= 1;
 		trnModel.ndsum[m] -= 1;
 
-		double Vbeta = trnModel.V * trnModel.beta;
-		double Kalpha = trnModel.K * trnModel.alpha;
+		final double Vbeta = trnModel.V * trnModel.beta;
+		final double Kalpha = trnModel.K * trnModel.alpha;
 
 		// do multinominal sampling via cumulative method
 		for (int k = 0; k < trnModel.K; k++) {
@@ -120,7 +120,7 @@ public class Estimator {
 		}
 
 		// scaled sample because of unnormalized p[]
-		double u = Math.random() * trnModel.p[trnModel.K - 1];
+		final double u = Math.random() * trnModel.p[trnModel.K - 1];
 
 		for (topic = 0; topic < trnModel.K; topic++) {
 			if (trnModel.p[topic] > u) // sample topic w.r.t distribution p
diff --git a/jgibblda/src/main/java/jgibblda/Inferencer.java b/jgibblda/src/main/java/jgibblda/Inferencer.java
index 2d3fb1be8fa348392cbed7a8d82b2cb2b40562be..5108749dbb20812e8b3137285033ac0de1e16468 100644
--- a/jgibblda/src/main/java/jgibblda/Inferencer.java
+++ b/jgibblda/src/main/java/jgibblda/Inferencer.java
@@ -1,9 +1,9 @@
 /*
  * Copyright (C) 2007 by
- * 
+ *
  * Xuan-Hieu Phan hieuxuan@ecei.tohoku.ac.jp or pxhieu@gmail.com Graduate School
  * of Information Sciences Tohoku University
- * 
+ *
  * Cam-Tu Nguyen ncamtu@gmail.com College of Technology Vietnam National
  * University, Hanoi
  *
@@ -41,7 +41,7 @@ public class Inferencer {
 	// -----------------------------------------------------
 	// Init method
 	// -----------------------------------------------------
-	public boolean init(LDACmdOption option) {
+	public boolean init(final LDACmdOption option) {
 		this.option = option;
 		trnModel = new Model();
 
@@ -56,8 +56,8 @@ public class Inferencer {
 	}
 
 	// inference new model ~ getting data from a specified dataset
-	public Model inference(LDADataset newData) {
-		Model newModel = new Model();
+	public Model inference(final LDADataset newData) {
+		final Model newModel = new Model();
 
 		newModel.initNewModel(option, newData, trnModel);
 		this.newModel = newModel;
@@ -70,7 +70,7 @@ public class Inferencer {
 				for (int n = 0; n < newModel.data.docs[m].length; n++) {
 					// (newz_i = newz[m][n]
 					// sample from p(z_i|z_-1,w)
-					int topic = infSampling(m, n);
+					final int topic = infSampling(m, n);
 					newModel.z[m].set(n, topic);
 				}
 			} // end foreach new doc
@@ -85,8 +85,8 @@ public class Inferencer {
 		return this.newModel;
 	}
 
-	public Model inference(String[] strs) {
-		LDADataset dataset = LDADataset.readDataSet(strs, globalDict);
+	public Model inference(final String[] strs) {
+		final LDADataset dataset = LDADataset.readDataSet(strs, globalDict);
 		return inference(dataset);
 	}
 
@@ -106,7 +106,7 @@ public class Inferencer {
 				for (int n = 0; n < newModel.data.docs[m].length; n++) {
 					// (newz_i = newz[m][n]
 					// sample from p(z_i|z_-1,w)
-					int topic = infSampling(m, n);
+					final int topic = infSampling(m, n);
 					newModel.z[m].set(n, topic);
 				}
 			} // end foreach new doc
@@ -126,18 +126,18 @@ public class Inferencer {
 	/**
 	 * do sampling for inference m: document number n: word number?
 	 */
-	protected int infSampling(int m, int n) {
+	protected int infSampling(final int m, final int n) {
 		// remove z_i from the count variables
 		int topic = newModel.z[m].get(n);
-		int _w = newModel.data.docs[m].words[n];
-		int w = newModel.data.lid2gid.get(_w);
+		final int _w = newModel.data.docs[m].words[n];
+		final int w = newModel.data.lid2gid.get(_w);
 		newModel.nw[_w][topic] -= 1;
 		newModel.nd[m][topic] -= 1;
 		newModel.nwsum[topic] -= 1;
 		newModel.ndsum[m] -= 1;
 
-		double Vbeta = trnModel.V * newModel.beta;
-		double Kalpha = trnModel.K * newModel.alpha;
+		final double Vbeta = trnModel.V * newModel.beta;
+		final double Kalpha = trnModel.K * newModel.alpha;
 
 		// do multinomial sampling via cummulative method
 		for (int k = 0; k < newModel.K; k++) {
@@ -152,7 +152,7 @@ public class Inferencer {
 		}
 
 		// scaled sample because of unnormalized p[]
-		double u = Math.random() * newModel.p[newModel.K - 1];
+		final double u = Math.random() * newModel.p[newModel.K - 1];
 
 		for (topic = 0; topic < newModel.K; topic++) {
 			if (newModel.p[topic] > u)
@@ -180,7 +180,7 @@ public class Inferencer {
 	protected void computeNewPhi() {
 		for (int k = 0; k < newModel.K; k++) {
 			for (int _w = 0; _w < newModel.V; _w++) {
-				Integer id = newModel.data.lid2gid.get(_w);
+				final Integer id = newModel.data.lid2gid.get(_w);
 
 				if (id != null) {
 					newModel.phi[k][_w] = (trnModel.nw[id][k] + newModel.nw[_w][k] + newModel.beta)
diff --git a/jgibblda/src/main/java/jgibblda/LDA.java b/jgibblda/src/main/java/jgibblda/LDA.java
index 808b7e27d168f42b429f76ebf3f41636062c3da3..111ab000a34e447b0fbf981259125fb532024d2e 100644
--- a/jgibblda/src/main/java/jgibblda/LDA.java
+++ b/jgibblda/src/main/java/jgibblda/LDA.java
@@ -1,9 +1,9 @@
 /*
  * Copyright (C) 2007 by
- * 
+ *
  * Xuan-Hieu Phan hieuxuan@ecei.tohoku.ac.jp or pxhieu@gmail.com Graduate School
  * of Information Sciences Tohoku University
- * 
+ *
  * Cam-Tu Nguyen ncamtu@gmail.com College of Technology Vietnam National
  * University, Hanoi
  *
@@ -32,9 +32,9 @@ public class LDA {
 
 	public static final Logger log = LoggerFactory.getLogger(LDA.class);
 
-	public static void main(String args[]) {
-		LDACmdOption option = new LDACmdOption();
-		CmdLineParser parser = new CmdLineParser(option);
+	public static void main(final String args[]) {
+		final LDACmdOption option = new LDACmdOption();
+		final CmdLineParser parser = new CmdLineParser(option);
 
 		try {
 			if (args.length == 0) {
@@ -45,14 +45,14 @@ public class LDA {
 			parser.parseArgument(args);
 
 			if (option.est || option.estc) {
-				Estimator estimator = new Estimator();
+				final Estimator estimator = new Estimator();
 				estimator.init(option);
 				estimator.estimate();
 			} else if (option.inf) {
-				Inferencer inferencer = new Inferencer();
+				final Inferencer inferencer = new Inferencer();
 				inferencer.init(option);
 
-				Model newModel = inferencer.inference();
+				final Model newModel = inferencer.inference();
 
 				for (int i = 0; i < newModel.phi.length; ++i) {
 					// phi: K * V
@@ -62,18 +62,18 @@ public class LDA {
 					}
 				}
 			}
-		} catch (CmdLineException cle) {
+		} catch (final CmdLineException cle) {
 			log.info("Command line error: " + cle.getMessage());
 			showHelp(parser);
 			return;
-		} catch (Exception e) {
+		} catch (final Exception e) {
 			log.info("Error in main: " + e.getMessage());
 			e.printStackTrace();
 			return;
 		}
 	}
 
-	public static void showHelp(CmdLineParser parser) {
+	public static void showHelp(final CmdLineParser parser) {
 		log.info("LDA [options ...] [arguments...]");
 		parser.printUsage(System.out);
 	}
diff --git a/jgibblda/src/main/java/jgibblda/LDADataset.java b/jgibblda/src/main/java/jgibblda/LDADataset.java
index 7b11caa8595207884c2033ceee3b995b1a579436..f03d417a101e56ac0c14f8adf2419b62eb59b9f3 100644
--- a/jgibblda/src/main/java/jgibblda/LDADataset.java
+++ b/jgibblda/src/main/java/jgibblda/LDADataset.java
@@ -1,9 +1,9 @@
 /*
  * Copyright (C) 2007 by
- * 
+ *
  * Xuan-Hieu Phan hieuxuan@ecei.tohoku.ac.jp or pxhieu@gmail.com Graduate School
  * of Information Sciences Tohoku University
- * 
+ *
  * Cam-Tu Nguyen ncamtu@gmail.com College of Technology Vietnam National
  * University, Hanoi
  *
@@ -68,7 +68,7 @@ public class LDADataset {
 		lid2gid = null;
 	}
 
-	public LDADataset(int M) {
+	public LDADataset(final int M) {
 		localDict = new Dictionary();
 		this.M = M;
 		this.V = 0;
@@ -78,7 +78,7 @@ public class LDADataset {
 		lid2gid = null;
 	}
 
-	public LDADataset(int M, Dictionary globalDict) {
+	public LDADataset(final int M, final Dictionary globalDict) {
 		localDict = new Dictionary();
 		this.M = M;
 		this.V = 0;
@@ -94,13 +94,13 @@ public class LDADataset {
 	/**
 	 * set the document at the index idx if idx is greater than 0 and less than
 	 * M
-	 * 
+	 *
 	 * @param doc
 	 *            document to be set
 	 * @param idx
 	 *            index in the document array
 	 */
-	public void setDoc(Document doc, int idx) {
+	public void setDoc(final Document doc, final int idx) {
 		if (0 <= idx && idx < M) {
 			docs[idx] = doc;
 		}
@@ -109,19 +109,19 @@ public class LDADataset {
 	/**
 	 * set the document at the index idx if idx is greater than 0 and less than
 	 * M
-	 * 
+	 *
 	 * @param str
 	 *            string contains doc
 	 * @param idx
 	 *            index in the document array
 	 */
-	public void setDoc(String str, int idx) {
+	public void setDoc(final String str, final int idx) {
 		if (0 <= idx && idx < M) {
-			String[] words = str.split("[ \\t\\n]");
+			final String[] words = str.split("[ \\t\\n]");
 
-			Vector<Integer> ids = new Vector<Integer>();
+			final Vector<Integer> ids = new Vector<Integer>();
 
-			for (String word : words) {
+			for (final String word : words) {
 				int _id = localDict.word2id.size();
 
 				if (localDict.contains(word))
@@ -129,7 +129,7 @@ public class LDADataset {
 
 				if (globalDict != null) {
 					// get the global id
-					Integer id = globalDict.getID(word);
+					final Integer id = globalDict.getID(word);
 
 					if (id != null) {
 						localDict.addWord(word);
@@ -145,7 +145,7 @@ public class LDADataset {
 				}
 			}
 
-			Document doc = new Document(ids, str);
+			final Document doc = new Document(ids, str);
 			docs[idx] = doc;
 			V = localDict.word2id.size();
 		}
@@ -156,18 +156,19 @@ public class LDADataset {
 
 	/**
 	 * read a dataset from a stream, create new dictionary
-	 * 
+	 *
 	 * @return dataset if success and null otherwise
 	 */
-	public static LDADataset readDataSet(String filename) {
+	public static LDADataset readDataSet(final String filename) {
 		try {
-			BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(filename), "UTF-8"));
+			final BufferedReader reader = new BufferedReader(
+					new InputStreamReader(new FileInputStream(filename), "UTF-8"));
 
-			LDADataset data = readDataSet(reader);
+			final LDADataset data = readDataSet(reader);
 
 			reader.close();
 			return data;
-		} catch (Exception e) {
+		} catch (final Exception e) {
 			log.error("Read Dataset Error: " + e.getMessage());
 			e.printStackTrace();
 			return null;
@@ -176,21 +177,22 @@ public class LDADataset {
 
 	/**
 	 * read a dataset from a file with a preknown vocabulary
-	 * 
+	 *
 	 * @param filename
 	 *            file from which we read dataset
 	 * @param dict
 	 *            the dictionary
 	 * @return dataset if success and null otherwise
 	 */
-	public static LDADataset readDataSet(String filename, Dictionary dict) {
+	public static LDADataset readDataSet(final String filename, final Dictionary dict) {
 		try {
-			BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(filename), "UTF-8"));
-			LDADataset data = readDataSet(reader, dict);
+			final BufferedReader reader = new BufferedReader(
+					new InputStreamReader(new FileInputStream(filename), "UTF-8"));
+			final LDADataset data = readDataSet(reader, dict);
 
 			reader.close();
 			return data;
-		} catch (Exception e) {
+		} catch (final Exception e) {
 			log.error("Read Dataset Error: " + e.getMessage());
 			e.printStackTrace();
 			return null;
@@ -199,39 +201,39 @@ public class LDADataset {
 
 	/**
 	 * read a dataset from a stream, create new dictionary
-	 * 
+	 *
 	 * @return dataset if success and null otherwise
 	 */
-	public static LDADataset readDataSet(BufferedReader reader) {
+	public static LDADataset readDataSet(final BufferedReader reader) {
 		return readDataSet(reader, null);
 	}
 
 	/**
 	 * read a dataset from a stream with respect to a specified dictionary
-	 * 
+	 *
 	 * @param reader
 	 *            stream from which we read dataset
 	 * @param dict
 	 *            the dictionary
 	 * @return dataset if success and null otherwise
 	 */
-	public static LDADataset readDataSet(BufferedReader reader, Dictionary dict) {
+	public static LDADataset readDataSet(final BufferedReader reader, final Dictionary dict) {
 		try {
-			List<String> lines = new ArrayList<>();
+			final List<String> lines = new ArrayList<>();
 
 			String line;
 			while ((line = reader.readLine()) != null) {
 				lines.add(line);
 			}
 
-			LDADataset data = new LDADataset(lines.size(), dict);
+			final LDADataset data = new LDADataset(lines.size(), dict);
 
 			for (int i = 0; i < lines.size(); i++) {
 				data.setDoc(lines.get(i), i);
 			}
 
 			return data;
-		} catch (Exception e) {
+		} catch (final Exception e) {
 			log.error("Read Dataset Error: " + e.getMessage());
 			e.printStackTrace();
 			return null;
@@ -240,14 +242,14 @@ public class LDADataset {
 
 	/**
 	 * read a dataset from a string, create new dictionary
-	 * 
+	 *
 	 * @param str
 	 *            String from which we get the dataset, documents are seperated
 	 *            by newline character
 	 * @return dataset if success and null otherwise
 	 */
-	public static LDADataset readDataSet(String[] strs) {
-		LDADataset data = new LDADataset(strs.length);
+	public static LDADataset readDataSet(final String[] strs) {
+		final LDADataset data = new LDADataset(strs.length);
 
 		for (int i = 0; i < strs.length; ++i) {
 			data.setDoc(strs[i], i);
@@ -257,7 +259,7 @@ public class LDADataset {
 
 	/**
 	 * read a dataset from a string with respect to a specified dictionary
-	 * 
+	 *
 	 * @param str
 	 *            String from which we get the dataset, documents are seperated
 	 *            by newline character
@@ -265,8 +267,8 @@ public class LDADataset {
 	 *            the dictionary
 	 * @return dataset if success and null otherwise
 	 */
-	public static LDADataset readDataSet(String[] strs, Dictionary dict) {
-		LDADataset data = new LDADataset(strs.length, dict);
+	public static LDADataset readDataSet(final String[] strs, final Dictionary dict) {
+		final LDADataset data = new LDADataset(strs.length, dict);
 
 		for (int i = 0; i < strs.length; ++i) {
 			data.setDoc(strs[i], i);
diff --git a/jgibblda/src/main/java/jgibblda/Model.java b/jgibblda/src/main/java/jgibblda/Model.java
index 4303d74a33855a18a67352801b6804397f51b752..fbdb5b9bfde95d94b0903b8b9e0b99bd7fe6e3a3 100644
--- a/jgibblda/src/main/java/jgibblda/Model.java
+++ b/jgibblda/src/main/java/jgibblda/Model.java
@@ -1,9 +1,9 @@
 /*
  * Copyright (C) 2007 by
- * 
+ *
  * Xuan-Hieu Phan hieuxuan@ecei.tohoku.ac.jp or pxhieu@gmail.com Graduate School
  * of Information Sciences Tohoku University
- * 
+ *
  * Cam-Tu Nguyen ncamtu@gmail.com College of Technology Vietnam National
  * University, Hanoi
  *
@@ -149,21 +149,21 @@ public class Model {
 	/**
 	 * read other file to get parameters
 	 */
-	protected boolean readOthersFile(String otherFile) {
+	protected boolean readOthersFile(final String otherFile) {
 		// open file <model>.others to read:
 
 		try {
-			BufferedReader reader = new BufferedReader(new FileReader(otherFile));
+			final BufferedReader reader = new BufferedReader(new FileReader(otherFile));
 			String line;
 			while ((line = reader.readLine()) != null) {
-				StringTokenizer tknr = new StringTokenizer(line, "= \t\r\n");
+				final StringTokenizer tknr = new StringTokenizer(line, "= \t\r\n");
 
-				int count = tknr.countTokens();
+				final int count = tknr.countTokens();
 				if (count != 2)
 					continue;
 
-				String optstr = tknr.nextToken();
-				String optval = tknr.nextToken();
+				final String optstr = tknr.nextToken();
+				final String optval = tknr.nextToken();
 
 				if (optstr.equalsIgnoreCase("alpha")) {
 					alpha = Double.parseDouble(optval);
@@ -183,7 +183,7 @@ public class Model {
 			}
 
 			reader.close();
-		} catch (Exception e) {
+		} catch (final Exception e) {
 			log.error("Error while reading other file:" + e.getMessage());
 			e.printStackTrace();
 			return false;
@@ -192,7 +192,7 @@ public class Model {
 	}
 
 	@SuppressWarnings("unchecked")
-	protected boolean readTAssignFile(String tassignFile) {
+	protected boolean readTAssignFile(final String tassignFile) {
 		BufferedReader reader = null;
 		try {
 			int i, j;
@@ -204,17 +204,17 @@ public class Model {
 			data.V = V;
 			for (i = 0; i < M; i++) {
 				line = reader.readLine();
-				StringTokenizer tknr = new StringTokenizer(line, " \t\r\n");
+				final StringTokenizer tknr = new StringTokenizer(line, " \t\r\n");
 
-				int length = tknr.countTokens();
+				final int length = tknr.countTokens();
 
-				Vector<Integer> words = new Vector<Integer>();
-				Vector<Integer> topics = new Vector<Integer>();
+				final Vector<Integer> words = new Vector<Integer>();
+				final Vector<Integer> topics = new Vector<Integer>();
 
 				for (j = 0; j < length; j++) {
-					String token = tknr.nextToken();
+					final String token = tknr.nextToken();
 
-					StringTokenizer tknr2 = new StringTokenizer(token, ":");
+					final StringTokenizer tknr2 = new StringTokenizer(token, ":");
 					if (tknr2.countTokens() != 2) {
 						log.warn("Invalid word-topic assignment line\n");
 						return false;
@@ -225,7 +225,7 @@ public class Model {
 				} // end for each topic assignment
 
 				// allocate and add new document to the corpus
-				Document doc = new Document(words);
+				final Document doc = new Document(words);
 				data.setDoc(doc, i);
 
 				// assign values for z
@@ -235,7 +235,7 @@ public class Model {
 				}
 
 			} // end for each doc
-		} catch (Exception e) {
+		} catch (final Exception e) {
 			log.error("Error while loading model: " + e.getMessage());
 			e.printStackTrace();
 			return false;
@@ -243,7 +243,7 @@ public class Model {
 			if (reader != null)
 				try {
 					reader.close();
-				} catch (IOException e) {}
+				} catch (final IOException e) {}
 		}
 		return true;
 	}
@@ -259,7 +259,7 @@ public class Model {
 			return false;
 
 		// read dictionary
-		Dictionary dict = new Dictionary();
+		final Dictionary dict = new Dictionary();
 		if (!dict.readWordMap(dir + File.separator + wordMapFile))
 			return false;
 
@@ -271,11 +271,11 @@ public class Model {
 	/**
 	 * Save word-topic assignments for this model
 	 */
-	public boolean saveModelTAssign(String filename) {
+	public boolean saveModelTAssign(final String filename) {
 		int i, j;
 
 		try {
-			BufferedWriter writer = new BufferedWriter(new FileWriter(filename));
+			final BufferedWriter writer = new BufferedWriter(new FileWriter(filename));
 
 			// write docs with topic assignments for words
 			for (i = 0; i < data.M; i++) {
@@ -286,7 +286,7 @@ public class Model {
 			}
 
 			writer.close();
-		} catch (Exception e) {
+		} catch (final Exception e) {
 			log.error("Error while saving model tassign: " + e.getMessage());
 			e.printStackTrace();
 			return false;
@@ -297,9 +297,9 @@ public class Model {
 	/**
 	 * Save theta (topic distribution) for this model
 	 */
-	public boolean saveModelTheta(String filename) {
+	public boolean saveModelTheta(final String filename) {
 		try {
-			BufferedWriter writer = new BufferedWriter(new FileWriter(filename));
+			final BufferedWriter writer = new BufferedWriter(new FileWriter(filename));
 			for (int i = 0; i < M; i++) {
 				for (int j = 0; j < K; j++) {
 					writer.write(theta[i][j] + " ");
@@ -307,7 +307,7 @@ public class Model {
 				writer.write("\n");
 			}
 			writer.close();
-		} catch (Exception e) {
+		} catch (final Exception e) {
 			log.error("Error while saving topic distribution file for this model: " + e.getMessage());
 			e.printStackTrace();
 			return false;
@@ -319,9 +319,9 @@ public class Model {
 	 * Save word-topic distribution
 	 */
 
-	public boolean saveModelPhi(String filename) {
+	public boolean saveModelPhi(final String filename) {
 		try {
-			BufferedWriter writer = new BufferedWriter(new FileWriter(filename));
+			final BufferedWriter writer = new BufferedWriter(new FileWriter(filename));
 
 			for (int i = 0; i < K; i++) {
 				for (int j = 0; j < V; j++) {
@@ -330,7 +330,7 @@ public class Model {
 				writer.write("\n");
 			}
 			writer.close();
-		} catch (Exception e) {
+		} catch (final Exception e) {
 			log.error("Error while saving word-topic distribution:" + e.getMessage());
 			e.printStackTrace();
 			return false;
@@ -341,9 +341,9 @@ public class Model {
 	/**
 	 * Save other information of this model
 	 */
-	public boolean saveModelOthers(String filename) {
+	public boolean saveModelOthers(final String filename) {
 		try {
-			BufferedWriter writer = new BufferedWriter(new FileWriter(filename));
+			final BufferedWriter writer = new BufferedWriter(new FileWriter(filename));
 
 			writer.write("alpha=" + alpha + "\n");
 			writer.write("beta=" + beta + "\n");
@@ -353,7 +353,7 @@ public class Model {
 			writer.write("liters=" + liter + "\n");
 
 			writer.close();
-		} catch (Exception e) {
+		} catch (final Exception e) {
 			log.error("Error while saving model others:" + e.getMessage());
 			e.printStackTrace();
 			return false;
@@ -364,18 +364,19 @@ public class Model {
 	/**
 	 * Save model the most likely words for each topic
 	 */
-	public boolean saveModelTwords(String filename) {
+	public boolean saveModelTwords(final String filename) {
 		try {
-			BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filename), "UTF-8"));
+			final BufferedWriter writer = new BufferedWriter(
+					new OutputStreamWriter(new FileOutputStream(filename), "UTF-8"));
 
 			if (twords > V) {
 				twords = V;
 			}
 
 			for (int k = 0; k < K; k++) {
-				List<Pair> wordsProbsList = new ArrayList<Pair>();
+				final List<Pair> wordsProbsList = new ArrayList<Pair>();
 				for (int w = 0; w < V; w++) {
-					Pair p = new Pair(w, phi[k][w], false);
+					final Pair p = new Pair(w, phi[k][w], false);
 
 					wordsProbsList.add(p);
 				} // end foreach word
@@ -386,7 +387,7 @@ public class Model {
 
 				for (int i = 0; i < twords; i++) {
 					if (data.localDict.contains((Integer) wordsProbsList.get(i).first)) {
-						String word = data.localDict.getWord((Integer) wordsProbsList.get(i).first);
+						final String word = data.localDict.getWord((Integer) wordsProbsList.get(i).first);
 
 						writer.write("\t" + word + " " + wordsProbsList.get(i).second + "\n");
 					}
@@ -394,7 +395,7 @@ public class Model {
 			} // end foreach topic
 
 			writer.close();
-		} catch (Exception e) {
+		} catch (final Exception e) {
 			log.error("Error while saving model twords: " + e.getMessage());
 			e.printStackTrace();
 			return false;
@@ -405,7 +406,7 @@ public class Model {
 	/**
 	 * Save model
 	 */
-	public boolean saveModel(String modelName) {
+	public boolean saveModel(final String modelName) {
 		if (!saveModelTAssign(dir + File.separator + modelName + tassignSuffix)) {
 			return false;
 		}
@@ -435,7 +436,7 @@ public class Model {
 	/**
 	 * initialize the model
 	 */
-	protected boolean init(LDACmdOption option) {
+	protected boolean init(final LDACmdOption option) {
 		if (option == null)
 			return false;
 
@@ -466,7 +467,7 @@ public class Model {
 	 * Init parameters for estimation
 	 */
 	@SuppressWarnings("unchecked")
-	public boolean initNewModel(LDACmdOption option) {
+	public boolean initNewModel(final LDACmdOption option) {
 		if (!init(option))
 			return false;
 
@@ -515,12 +516,12 @@ public class Model {
 
 		z = new Vector[M];
 		for (m = 0; m < data.M; m++) {
-			int N = data.docs[m].length;
+			final int N = data.docs[m].length;
 			z[m] = new Vector<Integer>();
 
 			// initilize for z
 			for (n = 0; n < N; n++) {
-				int topic = (int) Math.floor(Math.random() * K);
+				final int topic = (int) Math.floor(Math.random() * K);
 				z[m].add(topic);
 
 				// number of instances of word assigned to topic j
@@ -542,12 +543,12 @@ public class Model {
 
 	/**
 	 * Init parameters for inference
-	 * 
+	 *
 	 * @param newData
 	 *            DataSet for which we do inference
 	 */
 	@SuppressWarnings("unchecked")
-	public boolean initNewModel(LDACmdOption option, LDADataset newData, Model trnModel) {
+	public boolean initNewModel(final LDACmdOption option, final LDADataset newData, final Model trnModel) {
 		if (!init(option))
 			return false;
 
@@ -600,12 +601,12 @@ public class Model {
 
 		z = new Vector[M];
 		for (m = 0; m < data.M; m++) {
-			int N = data.docs[m].length;
+			final int N = data.docs[m].length;
 			z[m] = new Vector<Integer>();
 
 			// initilize for z
 			for (n = 0; n < N; n++) {
-				int topic = (int) Math.floor(Math.random() * K);
+				final int topic = (int) Math.floor(Math.random() * K);
 				z[m].add(topic);
 
 				// number of instances of word assigned to topic j
@@ -628,11 +629,11 @@ public class Model {
 	/**
 	 * Init parameters for inference reading new dataset from file
 	 */
-	public boolean initNewModel(LDACmdOption option, Model trnModel) {
+	public boolean initNewModel(final LDACmdOption option, final Model trnModel) {
 		if (!init(option))
 			return false;
 
-		LDADataset dataset = LDADataset.readDataSet(dir + File.separator + dfile, trnModel.data.localDict);
+		final LDADataset dataset = LDADataset.readDataSet(dir + File.separator + dfile, trnModel.data.localDict);
 		if (dataset == null) {
 			log.error("Fail to read dataset!\n");
 			return false;
@@ -644,7 +645,7 @@ public class Model {
 	/**
 	 * init parameter for continue estimating or for later inference
 	 */
-	public boolean initEstimatedModel(LDACmdOption option) {
+	public boolean initEstimatedModel(final LDACmdOption option) {
 		if (!init(option))
 			return false;
 
@@ -689,12 +690,12 @@ public class Model {
 		}
 
 		for (m = 0; m < data.M; m++) {
-			int N = data.docs[m].length;
+			final int N = data.docs[m].length;
 
 			// assign values for nw, nd, nwsum, and ndsum
 			for (n = 0; n < N; n++) {
 				w = data.docs[m].words[n];
-				int topic = (Integer) z[m].get(n);
+				final int topic = z[m].get(n);
 
 				// number of instances of word i assigned to topic j
 				nw[w][topic] += 1;
diff --git a/jgibblda/src/main/java/jgibblda/Pair.java b/jgibblda/src/main/java/jgibblda/Pair.java
index 7753f6597a558e474ba44defc33ebb0705154a9e..887b90694bf140315407c44e1416beb5798d6b2c 100644
--- a/jgibblda/src/main/java/jgibblda/Pair.java
+++ b/jgibblda/src/main/java/jgibblda/Pair.java
@@ -1,9 +1,9 @@
 /*
  * Copyright (C) 2007 by
- * 
+ *
  * Xuan-Hieu Phan hieuxuan@ecei.tohoku.ac.jp or pxhieu@gmail.com Graduate School
  * of Information Sciences Tohoku University
- * 
+ *
  * Cam-Tu Nguyen ncamtu@gmail.com College of Technology Vietnam National
  * University, Hanoi
  *
@@ -29,19 +29,20 @@ public class Pair implements Comparable<Pair> {
 	public Comparable second;
 	public static boolean naturalOrder = false;
 
-	public Pair(Object k, Comparable v) {
+	public Pair(final Object k, final Comparable v) {
 		first = k;
 		second = v;
 	}
 
-	public Pair(Object k, Comparable v, boolean naturalOrder) {
+	public Pair(final Object k, final Comparable v, final boolean naturalOrder) {
 		first = k;
 		second = v;
 		Pair.naturalOrder = naturalOrder;
 	}
 
+	@Override
 	@SuppressWarnings("unchecked")
-	public int compareTo(Pair p) {
+	public int compareTo(final Pair p) {
 		if (naturalOrder)
 			return this.second.compareTo(p.second);
 		else
diff --git a/vipra-backend/.settings/org.eclipse.jdt.ui.prefs b/vipra-backend/.settings/org.eclipse.jdt.ui.prefs
index 5713c654549b40f76104760ab2f6cd031d71f011..67b3835098d95ab9541c4dbdc4cb4c5dd04ea5b5 100644
--- a/vipra-backend/.settings/org.eclipse.jdt.ui.prefs
+++ b/vipra-backend/.settings/org.eclipse.jdt.ui.prefs
@@ -1,3 +1,62 @@
+cleanup.add_default_serial_version_id=true
+cleanup.add_generated_serial_version_id=false
+cleanup.add_missing_annotations=true
+cleanup.add_missing_deprecated_annotations=true
+cleanup.add_missing_methods=false
+cleanup.add_missing_nls_tags=false
+cleanup.add_missing_override_annotations=true
+cleanup.add_missing_override_annotations_interface_methods=true
+cleanup.add_serial_version_id=false
+cleanup.always_use_blocks=true
+cleanup.always_use_parentheses_in_expressions=false
+cleanup.always_use_this_for_non_static_field_access=false
+cleanup.always_use_this_for_non_static_method_access=false
+cleanup.convert_functional_interfaces=false
+cleanup.convert_to_enhanced_for_loop=true
+cleanup.correct_indentation=true
+cleanup.format_source_code=true
+cleanup.format_source_code_changes_only=false
+cleanup.insert_inferred_type_arguments=false
+cleanup.make_local_variable_final=true
+cleanup.make_parameters_final=true
+cleanup.make_private_fields_final=true
+cleanup.make_type_abstract_if_missing_method=false
+cleanup.make_variable_declarations_final=true
+cleanup.never_use_blocks=false
+cleanup.never_use_parentheses_in_expressions=true
+cleanup.organize_imports=true
+cleanup.qualify_static_field_accesses_with_declaring_class=false
+cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+cleanup.qualify_static_member_accesses_with_declaring_class=true
+cleanup.qualify_static_method_accesses_with_declaring_class=false
+cleanup.remove_private_constructors=true
+cleanup.remove_redundant_type_arguments=true
+cleanup.remove_trailing_whitespaces=true
+cleanup.remove_trailing_whitespaces_all=true
+cleanup.remove_trailing_whitespaces_ignore_empty=false
+cleanup.remove_unnecessary_casts=true
+cleanup.remove_unnecessary_nls_tags=true
+cleanup.remove_unused_imports=true
+cleanup.remove_unused_local_variables=false
+cleanup.remove_unused_private_fields=true
+cleanup.remove_unused_private_members=false
+cleanup.remove_unused_private_methods=true
+cleanup.remove_unused_private_types=true
+cleanup.sort_members=false
+cleanup.sort_members_all=false
+cleanup.use_anonymous_class_creation=false
+cleanup.use_blocks=false
+cleanup.use_blocks_only_for_return_and_throw=false
+cleanup.use_lambda=true
+cleanup.use_parentheses_in_expressions=false
+cleanup.use_this_for_non_static_field_access=false
+cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+cleanup.use_this_for_non_static_method_access=false
+cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+cleanup.use_type_arguments=false
+cleanup_profile=_vipra
+cleanup_settings_version=2
 eclipse.preferences.version=1
 formatter_profile=_vipra
 formatter_settings_version=12
diff --git a/vipra-backend/src/main/java/de/vipra/rest/model/APIError.java b/vipra-backend/src/main/java/de/vipra/rest/model/APIError.java
index 2a3714b4dd05085370f4648d2edb324fc3bb05c9..b4a94eeb1a7f0d446ac7dd35a85592f10f37c006 100644
--- a/vipra-backend/src/main/java/de/vipra/rest/model/APIError.java
+++ b/vipra-backend/src/main/java/de/vipra/rest/model/APIError.java
@@ -11,14 +11,14 @@ public class APIError {
 
 	public APIError() {}
 
-	public APIError(String status, String code, String title, String detail) {
+	public APIError(final String status, final String code, final String title, final String detail) {
 		this.status = status;
 		this.code = code;
 		this.title = title;
 		this.detail = detail;
 	}
 
-	public APIError(Status status, String title, String detail) {
+	public APIError(final Status status, final String title, final String detail) {
 		this(Integer.toString(status.getStatusCode()), status.getReasonPhrase(), title, detail);
 	}
 
@@ -26,7 +26,7 @@ public class APIError {
 		return status;
 	}
 
-	public void setStatus(String status) {
+	public void setStatus(final String status) {
 		this.status = status;
 	}
 
@@ -34,7 +34,7 @@ public class APIError {
 		return code;
 	}
 
-	public void setCode(String code) {
+	public void setCode(final String code) {
 		this.code = code;
 	}
 
@@ -42,7 +42,7 @@ public class APIError {
 		return title;
 	}
 
-	public void setTitle(String title) {
+	public void setTitle(final String title) {
 		this.title = title;
 	}
 
@@ -50,7 +50,7 @@ public class APIError {
 		return detail;
 	}
 
-	public void setDetail(String detail) {
+	public void setDetail(final String detail) {
 		this.detail = detail;
 	}
 
diff --git a/vipra-backend/src/main/java/de/vipra/rest/model/ResponseWrapper.java b/vipra-backend/src/main/java/de/vipra/rest/model/ResponseWrapper.java
index c7642be81068e8569301c1e8ba979bf92d765598..d797207bd16913681fe7e0ed2c0c8420f3062b30 100644
--- a/vipra-backend/src/main/java/de/vipra/rest/model/ResponseWrapper.java
+++ b/vipra-backend/src/main/java/de/vipra/rest/model/ResponseWrapper.java
@@ -22,13 +22,13 @@ public class ResponseWrapper<T> {
 		return errors;
 	}
 
-	public void addError(APIError error) {
+	public void addError(final APIError error) {
 		if (errors == null)
 			errors = new ArrayList<>();
 		errors.add(error);
 	}
 
-	public void addHeader(String name, Object value) {
+	public void addHeader(final String name, final Object value) {
 		if (headers == null)
 			headers = new HashMap<>();
 		headers.put("V-" + StringUtils.capitalize(name), value);
@@ -38,18 +38,18 @@ public class ResponseWrapper<T> {
 		return errors != null && errors.size() > 0;
 	}
 
-	private void addHeaders(ResponseBuilder builder) {
+	private void addHeaders(final ResponseBuilder builder) {
 		if (headers == null || headers.size() == 0)
 			return;
-		for (Entry<String, Object> entry : headers.entrySet())
+		for (final Entry<String, Object> entry : headers.entrySet())
 			builder.header(entry.getKey(), entry.getValue());
 	}
 
 	/**
 	 * Status 200
 	 */
-	public Response ok(T data) {
-		ResponseBuilder builder = Response.ok().entity(data);
+	public Response ok(final T data) {
+		final ResponseBuilder builder = Response.ok().entity(data);
 		addHeaders(builder);
 		return builder.build();
 	}
@@ -57,8 +57,8 @@ public class ResponseWrapper<T> {
 	/**
 	 * Status 201
 	 */
-	public Response created(T data, URI loc) {
-		ResponseBuilder builder = Response.created(loc).entity(data);
+	public Response created(final T data, final URI loc) {
+		final ResponseBuilder builder = Response.created(loc).entity(data);
 		addHeaders(builder);
 		return builder.build();
 	}
@@ -67,7 +67,7 @@ public class ResponseWrapper<T> {
 	 * Status 204
 	 */
 	public Response noContent() {
-		ResponseBuilder builder = Response.noContent();
+		final ResponseBuilder builder = Response.noContent();
 		addHeaders(builder);
 		return builder.build();
 	}
@@ -76,7 +76,7 @@ public class ResponseWrapper<T> {
 	 * Status 400
 	 */
 	public Response badRequest() {
-		ResponseBuilder builder = Response.status(Status.BAD_REQUEST).entity(errors);
+		final ResponseBuilder builder = Response.status(Status.BAD_REQUEST).entity(errors);
 		addHeaders(builder);
 		return builder.build();
 	}
@@ -85,7 +85,7 @@ public class ResponseWrapper<T> {
 	 * Status 404
 	 */
 	public Response notFound() {
-		ResponseBuilder builder = Response.status(Status.NOT_FOUND).entity(errors);
+		final ResponseBuilder builder = Response.status(Status.NOT_FOUND).entity(errors);
 		addHeaders(builder);
 		return builder.build();
 	}
@@ -94,7 +94,7 @@ public class ResponseWrapper<T> {
 	 * Status 500
 	 */
 	public Response serverError() {
-		ResponseBuilder builder = Response.serverError().entity(errors);
+		final ResponseBuilder builder = Response.serverError().entity(errors);
 		addHeaders(builder);
 		return builder.build();
 	}
diff --git a/vipra-backend/src/main/java/de/vipra/rest/provider/CORSResponseFilter.java b/vipra-backend/src/main/java/de/vipra/rest/provider/CORSResponseFilter.java
index ac8cc2e9a107af41095a25abf33755b3c04cb7f3..c93f8553f999e1cce639de3c8df1bbbb9e54ea05 100644
--- a/vipra-backend/src/main/java/de/vipra/rest/provider/CORSResponseFilter.java
+++ b/vipra-backend/src/main/java/de/vipra/rest/provider/CORSResponseFilter.java
@@ -20,7 +20,8 @@ public class CORSResponseFilter implements ContainerResponseFilter {
 	}
 
 	@Override
-	public void filter(ContainerRequestContext request, ContainerResponseContext response) throws IOException {
+	public void filter(final ContainerRequestContext request, final ContainerResponseContext response)
+			throws IOException {
 		response.getHeaders().add("Access-Control-Allow-Origin", "*");
 		response.getHeaders().add("Access-Control-Allow-Headers", "Origin, Content-Type, Accept, Authorization");
 		response.getHeaders().add("Access-Control-Allow-Credentials", "true");
diff --git a/vipra-backend/src/main/java/de/vipra/rest/provider/ObjectMapperProvider.java b/vipra-backend/src/main/java/de/vipra/rest/provider/ObjectMapperProvider.java
index e78b661e6c1c1a1faa024e7d7f865cfa45f31d28..865069cda1dcb99d5f7c08d830efc6b7c09294f4 100644
--- a/vipra-backend/src/main/java/de/vipra/rest/provider/ObjectMapperProvider.java
+++ b/vipra-backend/src/main/java/de/vipra/rest/provider/ObjectMapperProvider.java
@@ -30,12 +30,12 @@ public class ObjectMapperProvider implements ContextResolver<ObjectMapper> {
 	}
 
 	@Override
-	public ObjectMapper getContext(Class<?> type) {
+	public ObjectMapper getContext(final Class<?> type) {
 		return defaultObjectMapper;
 	}
 
 	public static ObjectMapper createDefaultMapper() {
-		SimpleModule module = new SimpleModule();
+		final SimpleModule module = new SimpleModule();
 
 		module.addSerializer(ObjectId.class, new ObjectIdSerializer());
 		module.addDeserializer(ObjectId.class, new ObjectIdDeserializer());
diff --git a/vipra-backend/src/main/java/de/vipra/rest/resource/ArticleResource.java b/vipra-backend/src/main/java/de/vipra/rest/resource/ArticleResource.java
index 2d93b45e5c945d4ca11ffeb3c9e9bcfc37aa36b4..d25cb8d0b7ede3ea6874b37be48a8ab487c21073 100644
--- a/vipra-backend/src/main/java/de/vipra/rest/resource/ArticleResource.java
+++ b/vipra-backend/src/main/java/de/vipra/rest/resource/ArticleResource.java
@@ -44,23 +44,24 @@ public class ArticleResource {
 
 	final MongoService<ArticleFull, ObjectId> dbArticles;
 
-	public ArticleResource(@Context ServletContext servletContext) throws ConfigException, IOException {
-		Config config = Config.getConfig();
+	public ArticleResource(@Context final ServletContext servletContext) throws ConfigException, IOException {
+		final Config config = Config.getConfig();
 		dbArticles = MongoService.getDatabaseService(config, ArticleFull.class);
 	}
 
 	@GET
 	@Produces(MediaType.APPLICATION_JSON)
-	public Response getArticles(@QueryParam("skip") Integer skip, @QueryParam("limit") Integer limit,
-			@QueryParam("sort") @DefaultValue("date") String sortBy, @QueryParam("fields") String fields,
-			@QueryParam("query") String query) {
-		ResponseWrapper<List<ArticleFull>> res = new ResponseWrapper<>();
+	public Response getArticles(@QueryParam("skip") final Integer skip, @QueryParam("limit") final Integer limit,
+			@QueryParam("sort") @DefaultValue("date") final String sortBy, @QueryParam("fields") final String fields,
+			@QueryParam("query") final String query) {
+		final ResponseWrapper<List<ArticleFull>> res = new ResponseWrapper<>();
 
 		if (res.hasErrors())
 			return res.badRequest();
 
 		try {
-			List<ArticleFull> articles = dbArticles.getMultiple(skip, limit, sortBy, StringUtils.getFields(fields));
+			final List<ArticleFull> articles = dbArticles.getMultiple(skip, limit, sortBy,
+					StringUtils.getFields(fields));
 
 			if ((skip != null && skip > 0) || (limit != null && limit > 0))
 				res.addHeader("total", dbArticles.count(null));
@@ -68,7 +69,7 @@ public class ArticleResource {
 				res.addHeader("total", articles.size());
 
 			return res.ok(articles);
-		} catch (Exception e) {
+		} catch (final Exception e) {
 			e.printStackTrace();
 			res.addError(new APIError(Response.Status.BAD_REQUEST, "Error", e.getMessage()));
 			return res.badRequest();
@@ -79,8 +80,8 @@ public class ArticleResource {
 	@Produces(MediaType.APPLICATION_JSON)
 	@Consumes(MediaType.APPLICATION_JSON)
 	@Path("{id}")
-	public Response getArticle(@PathParam("id") String id, @QueryParam("fields") String fields) {
-		ResponseWrapper<ArticleFull> res = new ResponseWrapper<>();
+	public Response getArticle(@PathParam("id") final String id, @QueryParam("fields") final String fields) {
+		final ResponseWrapper<ArticleFull> res = new ResponseWrapper<>();
 		if (id == null || id.trim().length() == 0) {
 			res.addError(new APIError(Response.Status.BAD_REQUEST, "ID is empty",
 					String.format(Messages.BAD_REQUEST, "id cannot be empty")));
@@ -90,7 +91,7 @@ public class ArticleResource {
 		ArticleFull article;
 		try {
 			article = dbArticles.getSingle(MongoUtils.objectId(id), false, StringUtils.getFields(fields));
-		} catch (Exception e) {
+		} catch (final Exception e) {
 			e.printStackTrace();
 			res.addError(new APIError(Response.Status.BAD_REQUEST, "Error", e.getMessage()));
 			return res.badRequest();
@@ -109,10 +110,10 @@ public class ArticleResource {
 	@Consumes(MediaType.APPLICATION_JSON)
 	@Produces(MediaType.APPLICATION_JSON)
 	public Response createArticle(ArticleFull article) {
-		ResponseWrapper<ArticleFull> res = new ResponseWrapper<>();
+		final ResponseWrapper<ArticleFull> res = new ResponseWrapper<>();
 		try {
 			article = dbArticles.createSingle(article);
-			URI newUri = new URL(uri.getAbsolutePath().toURL(), article.getId().toString()).toURI();
+			final URI newUri = new URL(uri.getAbsolutePath().toURL(), article.getId().toString()).toURI();
 			return res.created(article, newUri);
 		} catch (DatabaseException | MalformedURLException | URISyntaxException e) {
 			e.printStackTrace();
@@ -124,18 +125,18 @@ public class ArticleResource {
 
 	@DELETE
 	@Path("{id}")
-	public Response deleteArticle(@PathParam("id") String id) {
-		ResponseWrapper<ArticleFull> res = new ResponseWrapper<>();
+	public Response deleteArticle(@PathParam("id") final String id) {
+		final ResponseWrapper<ArticleFull> res = new ResponseWrapper<>();
 		long deleted;
 		try {
 			deleted = dbArticles.deleteSingle(MongoUtils.objectId(id));
-		} catch (DatabaseException e) {
+		} catch (final DatabaseException e) {
 			e.printStackTrace();
 			res.addError(new APIError(Response.Status.INTERNAL_SERVER_ERROR, "item could not be deleted",
 					"item could not be created due to an internal server error"));
 			return res.serverError();
 		}
-		int del = deleted > Integer.MAX_VALUE ? Integer.MAX_VALUE : (int) deleted;
+		final int del = deleted > Integer.MAX_VALUE ? Integer.MAX_VALUE : (int) deleted;
 		switch (del) {
 			case 0:
 				res.addError(new APIError(Response.Status.NOT_FOUND, "Article not found",
@@ -152,13 +153,13 @@ public class ArticleResource {
 	@Consumes(MediaType.APPLICATION_JSON)
 	@Produces(MediaType.APPLICATION_JSON)
 	@Path("{id}")
-	public Response replaceArticle(@PathParam("id") String id, ArticleFull article) {
-		ResponseWrapper<ArticleFull> res = new ResponseWrapper<>();
+	public Response replaceArticle(@PathParam("id") final String id, final ArticleFull article) {
+		final ResponseWrapper<ArticleFull> res = new ResponseWrapper<>();
 
 		try {
 			dbArticles.replaceSingle(article);
 			return res.ok(article);
-		} catch (DatabaseException e) {
+		} catch (final DatabaseException e) {
 			e.printStackTrace();
 			res.addError(new APIError(Response.Status.INTERNAL_SERVER_ERROR, "item could not be updated",
 					"item could not be updated due to an internal server error"));
diff --git a/vipra-backend/src/main/java/de/vipra/rest/resource/InfoResource.java b/vipra-backend/src/main/java/de/vipra/rest/resource/InfoResource.java
index a34bcd54dca65c54622cff90da89cebf83826aac..4aba609f08fd06a70ac5402ba655e0254f950c20 100644
--- a/vipra-backend/src/main/java/de/vipra/rest/resource/InfoResource.java
+++ b/vipra-backend/src/main/java/de/vipra/rest/resource/InfoResource.java
@@ -33,17 +33,17 @@ public class InfoResource {
 	@GET
 	@Produces(MediaType.APPLICATION_JSON)
 	public Response getInfo() {
-		ResponseWrapper<NestedMap> res = new ResponseWrapper<>();
-		NestedMap info = new NestedMap();
+		final ResponseWrapper<NestedMap> res = new ResponseWrapper<>();
+		final NestedMap info = new NestedMap();
 
 		try {
-			RuntimeMXBean rb = ManagementFactory.getRuntimeMXBean();
-			Runtime rt = Runtime.getRuntime();
-			BuildInfo buildInfo = new BuildInfo();
-			Config config = Config.getConfig();
-			MongoService<Article, ObjectId> dbArticles = MongoService.getDatabaseService(config, Article.class);
-			MongoService<Topic, ObjectId> dbTopics = MongoService.getDatabaseService(config, Topic.class);
-			MongoService<Word, String> dbWords = MongoService.getDatabaseService(config, Word.class);
+			final RuntimeMXBean rb = ManagementFactory.getRuntimeMXBean();
+			final Runtime rt = Runtime.getRuntime();
+			final BuildInfo buildInfo = new BuildInfo();
+			final Config config = Config.getConfig();
+			final MongoService<Article, ObjectId> dbArticles = MongoService.getDatabaseService(config, Article.class);
+			final MongoService<Topic, ObjectId> dbTopics = MongoService.getDatabaseService(config, Topic.class);
+			final MongoService<Word, String> dbWords = MongoService.getDatabaseService(config, Word.class);
 
 			// vm info
 			info.put("vm.starttime", rb.getStartTime());
@@ -95,7 +95,7 @@ public class InfoResource {
 			info.put("const.regexchar", Constants.REGEX_SINGLECHAR);
 			info.put("const.excerptlength", Constants.EXCERPT_LENGTH);
 			info.put("const.dateformat", Constants.DATETIME_FORMAT);
-		} catch (Exception e) {
+		} catch (final Exception e) {
 			info.put("error", e.getMessage());
 		}
 
diff --git a/vipra-backend/src/main/java/de/vipra/rest/resource/SearchResource.java b/vipra-backend/src/main/java/de/vipra/rest/resource/SearchResource.java
index 314ae1535d608daa4c925d1c3af0165c7e23d222..ab3f0f2ecd7fb39603e6b21d6cfa2a35e373f795 100644
--- a/vipra-backend/src/main/java/de/vipra/rest/resource/SearchResource.java
+++ b/vipra-backend/src/main/java/de/vipra/rest/resource/SearchResource.java
@@ -41,8 +41,8 @@ public class SearchResource {
 
 	final TransportClient client;
 
-	public SearchResource(@Context ServletContext servletContext) throws ConfigException, IOException {
-		Config config = Config.getConfig();
+	public SearchResource(@Context final ServletContext servletContext) throws ConfigException, IOException {
+		final Config config = Config.getConfig();
 
 		client = ESClient.getClient(config);
 	}
@@ -50,8 +50,8 @@ public class SearchResource {
 	@GET
 	@Produces(MediaType.APPLICATION_JSON)
 	public Response doSearch(@QueryParam("skip") Integer skip, @QueryParam("limit") Integer limit,
-			@QueryParam("fields") String fields, @QueryParam("query") String query) {
-		ResponseWrapper<List<ArticleFull>> res = new ResponseWrapper<>();
+			@QueryParam("fields") final String fields, @QueryParam("query") final String query) {
+		final ResponseWrapper<List<ArticleFull>> res = new ResponseWrapper<>();
 
 		if (skip == null || skip < 0)
 			skip = 0;
@@ -68,7 +68,7 @@ public class SearchResource {
 					.setQuery(QueryBuilders.multiMatchQuery(query, "topics^" + Constants.ES_BOOST_TOPICS,
 							"title^" + Constants.ES_BOOST_TITLES, "_all"))
 					.setFrom(skip).setSize(limit).execute().actionGet();
-		} catch (Exception e) {
+		} catch (final Exception e) {
 			e.printStackTrace();
 			res.addError(new APIError(Response.Status.BAD_REQUEST, "Error", e.getMessage()));
 			return res.badRequest();
@@ -79,11 +79,11 @@ public class SearchResource {
 			allowedFields = new HashSet<>(Arrays.asList(fields.split(",")));
 		}
 
-		SearchHits hits = response.getHits();
-		List<ArticleFull> articles = new ArrayList<>(10);
-		for (SearchHit hit : hits) {
-			Map<String, Object> source = hit.getSource();
-			ArticleFull article = new ArticleFull();
+		final SearchHits hits = response.getHits();
+		final List<ArticleFull> articles = new ArrayList<>(10);
+		for (final SearchHit hit : hits) {
+			final Map<String, Object> source = hit.getSource();
+			final ArticleFull article = new ArticleFull();
 			article.setId(MongoUtils.objectId(hit.getId()));
 			if (allowedFields == null || allowedFields.contains("title"))
 				article.setTitle(source.get("title").toString());
diff --git a/vipra-backend/src/main/java/de/vipra/rest/resource/TopicResource.java b/vipra-backend/src/main/java/de/vipra/rest/resource/TopicResource.java
index de832f21cf8d821a796ea498249ae96d1bc91a7e..4016c92809268778cfe01b5256ea26fb14fea22d 100644
--- a/vipra-backend/src/main/java/de/vipra/rest/resource/TopicResource.java
+++ b/vipra-backend/src/main/java/de/vipra/rest/resource/TopicResource.java
@@ -46,23 +46,23 @@ public class TopicResource {
 
 	public static final Logger log = LogManager.getLogger(TopicResource.class);
 
-	public TopicResource(@Context ServletContext servletContext) throws ConfigException, IOException {
-		Config config = Config.getConfig();
+	public TopicResource(@Context final ServletContext servletContext) throws ConfigException, IOException {
+		final Config config = Config.getConfig();
 		dbTopics = MongoService.getDatabaseService(config, TopicFull.class);
 		dbArticles = MongoService.getDatabaseService(config, ArticleFull.class);
 	}
 
 	@GET
 	@Produces(MediaType.APPLICATION_JSON)
-	public Response getTopics(@QueryParam("skip") Integer skip, @QueryParam("limit") Integer limit,
-			@QueryParam("sort") @DefaultValue("name") String sortBy, @QueryParam("fields") String fields) {
-		ResponseWrapper<List<TopicFull>> res = new ResponseWrapper<>();
+	public Response getTopics(@QueryParam("skip") final Integer skip, @QueryParam("limit") final Integer limit,
+			@QueryParam("sort") @DefaultValue("name") final String sortBy, @QueryParam("fields") final String fields) {
+		final ResponseWrapper<List<TopicFull>> res = new ResponseWrapper<>();
 
 		if (res.hasErrors())
 			return Response.status(Response.Status.BAD_REQUEST).entity(res).build();
 
 		try {
-			List<TopicFull> topics = dbTopics.getMultiple(skip, limit, sortBy, StringUtils.getFields(fields));
+			final List<TopicFull> topics = dbTopics.getMultiple(skip, limit, sortBy, StringUtils.getFields(fields));
 
 			if ((skip != null && skip > 0) || (limit != null && limit > 0))
 				res.addHeader("total", dbTopics.count(null));
@@ -70,7 +70,7 @@ public class TopicResource {
 				res.addHeader("total", topics.size());
 
 			return res.ok(topics);
-		} catch (Exception e) {
+		} catch (final Exception e) {
 			e.printStackTrace();
 			res.addError(new APIError(Response.Status.BAD_REQUEST, "Error", e.getMessage()));
 			return Response.status(Response.Status.BAD_REQUEST).entity(res).build();
@@ -80,9 +80,9 @@ public class TopicResource {
 	@GET
 	@Produces(MediaType.APPLICATION_JSON)
 	@Path("{id}")
-	public Response getTopic(@PathParam("id") String id, @QueryParam("fields") String fields)
+	public Response getTopic(@PathParam("id") final String id, @QueryParam("fields") final String fields)
 			throws ConfigException, IOException {
-		ResponseWrapper<TopicFull> res = new ResponseWrapper<>();
+		final ResponseWrapper<TopicFull> res = new ResponseWrapper<>();
 		if (id == null || id.trim().length() == 0) {
 			res.addError(new APIError(Response.Status.BAD_REQUEST, "ID is empty",
 					String.format(Messages.BAD_REQUEST, "id cannot be empty")));
@@ -92,7 +92,7 @@ public class TopicResource {
 		TopicFull topic;
 		try {
 			topic = dbTopics.getSingle(MongoUtils.objectId(id), false, StringUtils.getFields(fields));
-		} catch (Exception e) {
+		} catch (final Exception e) {
 			e.printStackTrace();
 			res.addError(new APIError(Response.Status.BAD_REQUEST, "Error", e.getMessage()));
 			return res.badRequest();
@@ -110,18 +110,18 @@ public class TopicResource {
 	@GET
 	@Produces(MediaType.APPLICATION_JSON)
 	@Path("{id}/articles")
-	public Response getArticles(@PathParam("id") String id, @QueryParam("skip") Integer skip,
-			@QueryParam("limit") Integer limit, @QueryParam("sort") @DefaultValue("title") String sortBy,
-			@QueryParam("fields") String fields) {
-		ResponseWrapper<List<ArticleFull>> res = new ResponseWrapper<>();
+	public Response getArticles(@PathParam("id") final String id, @QueryParam("skip") final Integer skip,
+			@QueryParam("limit") final Integer limit, @QueryParam("sort") @DefaultValue("title") final String sortBy,
+			@QueryParam("fields") final String fields) {
+		final ResponseWrapper<List<ArticleFull>> res = new ResponseWrapper<>();
 		try {
-			Topic topic = new Topic(MongoUtils.objectId(id));
-			QueryBuilder query = QueryBuilder.builder().criteria("topics.topic", topic).skip(skip).limit(limit)
+			final Topic topic = new Topic(MongoUtils.objectId(id));
+			final QueryBuilder query = QueryBuilder.builder().criteria("topics.topic", topic).skip(skip).limit(limit)
 					.sortBy(sortBy);
 			if (fields != null && !fields.isEmpty())
 				query.fields(true, StringUtils.getFields(fields));
 
-			List<ArticleFull> articles = dbArticles.getMultiple(query);
+			final List<ArticleFull> articles = dbArticles.getMultiple(query);
 
 			if ((skip != null && skip > 0) || (limit != null && limit > 0))
 				res.addHeader("total", dbArticles.count(QueryBuilder.builder().criteria("topics.topic", topic)));
@@ -129,7 +129,7 @@ public class TopicResource {
 				res.addHeader("total", articles.size());
 
 			return res.ok(articles);
-		} catch (Exception e) {
+		} catch (final Exception e) {
 			e.printStackTrace();
 			res.addError(new APIError(Response.Status.BAD_REQUEST, "Error", e.getMessage()));
 			return res.badRequest();
@@ -139,9 +139,9 @@ public class TopicResource {
 	@GET
 	@Produces(MediaType.APPLICATION_JSON)
 	@Path("{id}/similar/by-words")
-	public Response similarTopicsByWords(@PathParam("id") String id, @QueryParam("skip") Integer skip,
-			@QueryParam("limit") Integer limit, @QueryParam("sort") @DefaultValue("title") String sortBy,
-			@QueryParam("fields") String fields) {
+	public Response similarTopicsByWords(@PathParam("id") final String id, @QueryParam("skip") final Integer skip,
+			@QueryParam("limit") final Integer limit, @QueryParam("sort") @DefaultValue("title") final String sortBy,
+			@QueryParam("fields") final String fields) {
 		// TODO implement
 		return null;
 	}
@@ -149,9 +149,9 @@ public class TopicResource {
 	@GET
 	@Produces(MediaType.APPLICATION_JSON)
 	@Path("{id}/similar/by-articles")
-	public Response similarTopicsByArticles(@PathParam("id") String id, @QueryParam("skip") Integer skip,
-			@QueryParam("limit") Integer limit, @QueryParam("sort") @DefaultValue("title") String sortBy,
-			@QueryParam("fields") String fields) {
+	public Response similarTopicsByArticles(@PathParam("id") final String id, @QueryParam("skip") final Integer skip,
+			@QueryParam("limit") final Integer limit, @QueryParam("sort") @DefaultValue("title") final String sortBy,
+			@QueryParam("fields") final String fields) {
 		// TODO implement
 		return null;
 	}
@@ -160,13 +160,13 @@ public class TopicResource {
 	@Consumes(MediaType.APPLICATION_JSON)
 	@Produces(MediaType.APPLICATION_JSON)
 	@Path("{id}")
-	public Response replaceTopic(@PathParam("id") String id, TopicFull topic) {
-		ResponseWrapper<TopicFull> res = new ResponseWrapper<>();
+	public Response replaceTopic(@PathParam("id") final String id, final TopicFull topic) {
+		final ResponseWrapper<TopicFull> res = new ResponseWrapper<>();
 
 		try {
 			dbTopics.replaceSingle(topic);
 			return res.ok(topic);
-		} catch (DatabaseException e) {
+		} catch (final DatabaseException e) {
 			e.printStackTrace();
 			res.addError(new APIError(Response.Status.INTERNAL_SERVER_ERROR, "item could not be updated",
 					"item could not be updated due to an internal server error"));
diff --git a/vipra-backend/src/main/java/de/vipra/rest/resource/WordResource.java b/vipra-backend/src/main/java/de/vipra/rest/resource/WordResource.java
index 9cdb550afac6fad44033921b1f9c5e59c0fef569..d45e45f8600b2a7f451eabbf96d636bb2dd904e5 100644
--- a/vipra-backend/src/main/java/de/vipra/rest/resource/WordResource.java
+++ b/vipra-backend/src/main/java/de/vipra/rest/resource/WordResource.java
@@ -38,23 +38,23 @@ public class WordResource {
 	final MongoService<Word, String> dbWords;
 	final MongoService<TopicFull, ObjectId> dbTopics;
 
-	public WordResource(@Context ServletContext servletContext) throws ConfigException, IOException {
-		Config config = Config.getConfig();
+	public WordResource(@Context final ServletContext servletContext) throws ConfigException, IOException {
+		final Config config = Config.getConfig();
 		dbWords = MongoService.getDatabaseService(config, Word.class);
 		dbTopics = MongoService.getDatabaseService(config, TopicFull.class);
 	}
 
 	@GET
 	@Produces(MediaType.APPLICATION_JSON)
-	public Response getWords(@QueryParam("skip") Integer skip, @QueryParam("limit") Integer limit,
-			@QueryParam("sort") @DefaultValue("id") String sortBy, @QueryParam("fields") String fields) {
-		ResponseWrapper<List<Word>> res = new ResponseWrapper<>();
+	public Response getWords(@QueryParam("skip") final Integer skip, @QueryParam("limit") final Integer limit,
+			@QueryParam("sort") @DefaultValue("id") final String sortBy, @QueryParam("fields") final String fields) {
+		final ResponseWrapper<List<Word>> res = new ResponseWrapper<>();
 
 		if (res.hasErrors())
 			return res.badRequest();
 
 		try {
-			List<Word> words = dbWords.getMultiple(skip, limit, sortBy, StringUtils.getFields(fields));
+			final List<Word> words = dbWords.getMultiple(skip, limit, sortBy, StringUtils.getFields(fields));
 
 			if ((skip != null && skip > 0) || (limit != null && limit > 0))
 				res.addHeader("total", dbWords.count(null));
@@ -62,7 +62,7 @@ public class WordResource {
 				res.addHeader("total", words.size());
 
 			return res.ok(words);
-		} catch (Exception e) {
+		} catch (final Exception e) {
 			e.printStackTrace();
 			res.addError(new APIError(Response.Status.BAD_REQUEST, "Error", e.getMessage()));
 			return res.badRequest();
@@ -73,8 +73,8 @@ public class WordResource {
 	@Produces(MediaType.APPLICATION_JSON)
 	@Consumes(MediaType.APPLICATION_JSON)
 	@Path("{id}")
-	public Response getWord(@PathParam("id") String id, @QueryParam("fields") String fields) {
-		ResponseWrapper<Word> res = new ResponseWrapper<>();
+	public Response getWord(@PathParam("id") final String id, @QueryParam("fields") final String fields) {
+		final ResponseWrapper<Word> res = new ResponseWrapper<>();
 		if (id == null || id.trim().length() == 0) {
 			res.addError(new APIError(Response.Status.BAD_REQUEST, "ID is empty",
 					String.format(Messages.BAD_REQUEST, "id cannot be empty")));
@@ -84,7 +84,7 @@ public class WordResource {
 		Word word;
 		try {
 			word = dbWords.getSingle(id, false, StringUtils.getFields(fields));
-		} catch (Exception e) {
+		} catch (final Exception e) {
 			e.printStackTrace();
 			res.addError(new APIError(Response.Status.BAD_REQUEST, "Error", e.getMessage()));
 			return res.badRequest();
@@ -93,7 +93,7 @@ public class WordResource {
 		if (word != null) {
 			return res.ok(word);
 		} else {
-			String msg = String.format(Messages.NOT_FOUND, "id", id);
+			final String msg = String.format(Messages.NOT_FOUND, "id", id);
 			res.addError(new APIError(Response.Status.NOT_FOUND, "Resource not found", msg));
 			return res.notFound();
 		}
@@ -103,16 +103,16 @@ public class WordResource {
 	@Produces(MediaType.APPLICATION_JSON)
 	@Consumes(MediaType.APPLICATION_JSON)
 	@Path("{id}/topics")
-	public Response getWordTopics(@PathParam("id") String id, @QueryParam("fields") String fields) {
-		ResponseWrapper<List<TopicFull>> res = new ResponseWrapper<>();
+	public Response getWordTopics(@PathParam("id") final String id, @QueryParam("fields") final String fields) {
+		final ResponseWrapper<List<TopicFull>> res = new ResponseWrapper<>();
 		try {
-			Word word = new Word(id);
-			QueryBuilder query = QueryBuilder.builder().fields(true, "id", "name").criteria("words.word", word);
+			final Word word = new Word(id);
+			final QueryBuilder query = QueryBuilder.builder().fields(true, "id", "name").criteria("words.word", word);
 			if (fields != null && !fields.isEmpty())
 				query.fields(true, StringUtils.getFields(fields));
-			List<TopicFull> topics = dbTopics.getMultiple(query);
+			final List<TopicFull> topics = dbTopics.getMultiple(query);
 			return res.ok(topics);
-		} catch (Exception e) {
+		} catch (final Exception e) {
 			e.printStackTrace();
 			res.addError(new APIError(Response.Status.BAD_REQUEST, "Error", e.getMessage()));
 			return res.badRequest();
diff --git a/vipra-backend/src/main/java/de/vipra/rest/serializer/ObjectIdDeserializer.java b/vipra-backend/src/main/java/de/vipra/rest/serializer/ObjectIdDeserializer.java
index 4a6f5994ef36e243e63d642c73a76a12781ede36..d3d6c3d3a05536ed1c26c65261539d1b86bc5053 100644
--- a/vipra-backend/src/main/java/de/vipra/rest/serializer/ObjectIdDeserializer.java
+++ b/vipra-backend/src/main/java/de/vipra/rest/serializer/ObjectIdDeserializer.java
@@ -14,7 +14,8 @@ import de.vipra.util.MongoUtils;
 public class ObjectIdDeserializer extends JsonDeserializer<ObjectId> {
 
 	@Override
-	public ObjectId deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
+	public ObjectId deserialize(final JsonParser p, final DeserializationContext ctxt)
+			throws IOException, JsonProcessingException {
 		return MongoUtils.objectId(p.getValueAsString());
 	}
 
diff --git a/vipra-backend/src/main/java/de/vipra/rest/serializer/ObjectIdSerializer.java b/vipra-backend/src/main/java/de/vipra/rest/serializer/ObjectIdSerializer.java
index b6653911281c5436f63fbbc4cb5af93e633905cd..ee8256e9cbba2b8e9a99f92b2774bd9db130fade 100644
--- a/vipra-backend/src/main/java/de/vipra/rest/serializer/ObjectIdSerializer.java
+++ b/vipra-backend/src/main/java/de/vipra/rest/serializer/ObjectIdSerializer.java
@@ -12,7 +12,7 @@ import com.fasterxml.jackson.databind.SerializerProvider;
 public class ObjectIdSerializer extends JsonSerializer<ObjectId> {
 
 	@Override
-	public void serialize(ObjectId value, JsonGenerator gen, SerializerProvider serializers)
+	public void serialize(final ObjectId value, final JsonGenerator gen, final SerializerProvider serializers)
 			throws IOException, JsonProcessingException {
 		gen.writeString(value.toString());
 	}
diff --git a/vipra-backend/src/main/java/de/vipra/ws/State.java b/vipra-backend/src/main/java/de/vipra/ws/State.java
index ec76e527854c2102693717b5b661f4f8990e7588..cf5731a2a7687dd6ee09809f58bc12f0d559a46f 100644
--- a/vipra-backend/src/main/java/de/vipra/ws/State.java
+++ b/vipra-backend/src/main/java/de/vipra/ws/State.java
@@ -11,7 +11,7 @@ public enum State {
 
 	private final String state;
 
-	State(String state) {
+	State(final String state) {
 		this.state = state;
 	}
 
@@ -19,8 +19,8 @@ public enum State {
 		return state;
 	}
 
-	public static State find(String str) {
-		for (State state : State.values())
+	public static State find(final String str) {
+		for (final State state : State.values())
 			if (state.state.equalsIgnoreCase(str))
 				return state;
 		return ID;
diff --git a/vipra-backend/src/main/java/de/vipra/ws/StateSession.java b/vipra-backend/src/main/java/de/vipra/ws/StateSession.java
index 2552bdf6cf753bbb2acb150016658310053f5d19..be6ba8e4d9d22b9873b7b8e0a5ed86ac0e792694 100644
--- a/vipra-backend/src/main/java/de/vipra/ws/StateSession.java
+++ b/vipra-backend/src/main/java/de/vipra/ws/StateSession.java
@@ -7,7 +7,7 @@ public class StateSession {
 	private final Session session;
 	private State state;
 
-	public StateSession(Session session) {
+	public StateSession(final Session session) {
 		if (session == null)
 			throw new NullPointerException("session cannot be null");
 		this.session = session;
@@ -17,11 +17,11 @@ public class StateSession {
 		return state;
 	}
 
-	public void setState(State state) {
+	public void setState(final State state) {
 		this.state = state;
 	}
 
-	public void setState(String state) {
+	public void setState(final String state) {
 		this.state = State.find(state);
 	}
 
diff --git a/vipra-backend/src/main/java/de/vipra/ws/StateSessionMap.java b/vipra-backend/src/main/java/de/vipra/ws/StateSessionMap.java
index 1d8d5ac8c19d1c8bb74617646e6b293b7b790865..6dc65296e9e7247554e7d4d82bcc28a05170d6e4 100644
--- a/vipra-backend/src/main/java/de/vipra/ws/StateSessionMap.java
+++ b/vipra-backend/src/main/java/de/vipra/ws/StateSessionMap.java
@@ -9,11 +9,11 @@ public class StateSessionMap extends HashMap<StateSession, StateSession> {
 
 	private static final long serialVersionUID = 1L;
 
-	public Stream<Session> stream(State state) {
+	public Stream<Session> stream(final State state) {
 		return this.entrySet().stream().filter(s -> s.getKey().getState() == state).map(s -> s.getKey().getSession());
 	}
 
-	public void add(StateSession session) {
+	public void add(final StateSession session) {
 		this.put(session, session);
 	}
 
diff --git a/vipra-backend/src/main/java/de/vipra/ws/WebSocket.java b/vipra-backend/src/main/java/de/vipra/ws/WebSocket.java
index 46a2b58bf01cbd422ce1cf5d4e296f8cafbe4829..ee8e5f00e02942b578a0e8b1d455522ae68318ba 100644
--- a/vipra-backend/src/main/java/de/vipra/ws/WebSocket.java
+++ b/vipra-backend/src/main/java/de/vipra/ws/WebSocket.java
@@ -29,48 +29,48 @@ public class WebSocket {
 	public static final StateSessionMap sessions = new StateSessionMap();
 
 	@OnOpen
-	public void open(Session session) {
+	public void open(final Session session) {
 		log.debug("connect");
 		sessions.add(new StateSession(session));
 	}
 
 	@OnClose
-	public void close(Session session) {
+	public void close(final Session session) {
 		log.debug("disconnect");
 		sessions.remove(session);
 	}
 
 	@OnError
-	public void onError(Throwable error) {
+	public void onError(final Throwable error) {
 		log.error(error);
 	}
 
 	@OnMessage
-	public void handleMessage(String input, Session session)
+	public void handleMessage(final String input, final Session session)
 			throws JsonParseException, JsonMappingException, IOException {
 		log.trace("message received");
 		try {
-			WebSocketMessage msg = mapper.readValue(input, WebSocketMessage.class);
+			final WebSocketMessage msg = mapper.readValue(input, WebSocketMessage.class);
 			switch (msg.getType()) {
 				case 1:
 					handleInitMessage(mapper.readValue(msg.getData(), InitMessage.class), session);
 					break;
 			}
-		} catch (IOException e) {
+		} catch (final IOException e) {
 			log.error(e);
 		}
 	}
 
-	public void handleInitMessage(InitMessage message, Session session) {
+	public void handleInitMessage(final InitMessage message, final Session session) {
 		log.debug("init message received. state = " + message.getState());
 		sessions.get(session).setState(message.getState());
 	}
 
-	public static void sendToState(State state, Object message) {
+	public static void sendToState(final State state, final Object message) {
 		String json;
 		try {
 			json = mapper.writeValueAsString(message);
-		} catch (JsonProcessingException e) {
+		} catch (final JsonProcessingException e) {
 			log.error(e);
 			return;
 		}
diff --git a/vipra-backend/src/main/java/de/vipra/ws/msg/InitMessage.java b/vipra-backend/src/main/java/de/vipra/ws/msg/InitMessage.java
index ab5054001839622fb68e2d57b16dc1f5153944b7..93769d7da4637c69e1990c8375c91b379c540e8d 100644
--- a/vipra-backend/src/main/java/de/vipra/ws/msg/InitMessage.java
+++ b/vipra-backend/src/main/java/de/vipra/ws/msg/InitMessage.java
@@ -8,7 +8,7 @@ public class InitMessage extends WebSocketMessage {
 		return state;
 	}
 
-	public void setState(String state) {
+	public void setState(final String state) {
 		this.state = state;
 	}
 
diff --git a/vipra-backend/src/main/java/de/vipra/ws/msg/WebSocketMessage.java b/vipra-backend/src/main/java/de/vipra/ws/msg/WebSocketMessage.java
index 1c2b586ae3270551a4b0c66489e6ee2e75cde61b..ac769465dddb9a759f91388575b36a25caf6d737 100644
--- a/vipra-backend/src/main/java/de/vipra/ws/msg/WebSocketMessage.java
+++ b/vipra-backend/src/main/java/de/vipra/ws/msg/WebSocketMessage.java
@@ -10,7 +10,7 @@ public class WebSocketMessage {
 		return type;
 	}
 
-	public void setType(int type) {
+	public void setType(final int type) {
 		this.type = type;
 	}
 
@@ -18,7 +18,7 @@ public class WebSocketMessage {
 		return data;
 	}
 
-	public void setData(String data) {
+	public void setData(final String data) {
 		this.data = data;
 	}
 
diff --git a/vipra-cmd/.settings/org.eclipse.jdt.ui.prefs b/vipra-cmd/.settings/org.eclipse.jdt.ui.prefs
index 5713c654549b40f76104760ab2f6cd031d71f011..67b3835098d95ab9541c4dbdc4cb4c5dd04ea5b5 100644
--- a/vipra-cmd/.settings/org.eclipse.jdt.ui.prefs
+++ b/vipra-cmd/.settings/org.eclipse.jdt.ui.prefs
@@ -1,3 +1,62 @@
+cleanup.add_default_serial_version_id=true
+cleanup.add_generated_serial_version_id=false
+cleanup.add_missing_annotations=true
+cleanup.add_missing_deprecated_annotations=true
+cleanup.add_missing_methods=false
+cleanup.add_missing_nls_tags=false
+cleanup.add_missing_override_annotations=true
+cleanup.add_missing_override_annotations_interface_methods=true
+cleanup.add_serial_version_id=false
+cleanup.always_use_blocks=true
+cleanup.always_use_parentheses_in_expressions=false
+cleanup.always_use_this_for_non_static_field_access=false
+cleanup.always_use_this_for_non_static_method_access=false
+cleanup.convert_functional_interfaces=false
+cleanup.convert_to_enhanced_for_loop=true
+cleanup.correct_indentation=true
+cleanup.format_source_code=true
+cleanup.format_source_code_changes_only=false
+cleanup.insert_inferred_type_arguments=false
+cleanup.make_local_variable_final=true
+cleanup.make_parameters_final=true
+cleanup.make_private_fields_final=true
+cleanup.make_type_abstract_if_missing_method=false
+cleanup.make_variable_declarations_final=true
+cleanup.never_use_blocks=false
+cleanup.never_use_parentheses_in_expressions=true
+cleanup.organize_imports=true
+cleanup.qualify_static_field_accesses_with_declaring_class=false
+cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+cleanup.qualify_static_member_accesses_with_declaring_class=true
+cleanup.qualify_static_method_accesses_with_declaring_class=false
+cleanup.remove_private_constructors=true
+cleanup.remove_redundant_type_arguments=true
+cleanup.remove_trailing_whitespaces=true
+cleanup.remove_trailing_whitespaces_all=true
+cleanup.remove_trailing_whitespaces_ignore_empty=false
+cleanup.remove_unnecessary_casts=true
+cleanup.remove_unnecessary_nls_tags=true
+cleanup.remove_unused_imports=true
+cleanup.remove_unused_local_variables=false
+cleanup.remove_unused_private_fields=true
+cleanup.remove_unused_private_members=false
+cleanup.remove_unused_private_methods=true
+cleanup.remove_unused_private_types=true
+cleanup.sort_members=false
+cleanup.sort_members_all=false
+cleanup.use_anonymous_class_creation=false
+cleanup.use_blocks=false
+cleanup.use_blocks_only_for_return_and_throw=false
+cleanup.use_lambda=true
+cleanup.use_parentheses_in_expressions=false
+cleanup.use_this_for_non_static_field_access=false
+cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+cleanup.use_this_for_non_static_method_access=false
+cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+cleanup.use_type_arguments=false
+cleanup_profile=_vipra
+cleanup_settings_version=2
 eclipse.preferences.version=1
 formatter_profile=_vipra
 formatter_settings_version=12
diff --git a/vipra-cmd/src/main/java/de/vipra/cmd/CmdOptions.java b/vipra-cmd/src/main/java/de/vipra/cmd/CmdOptions.java
index 8158313b39dfe0da7a857ddfa62dd7870f83cbcb..a7c34652663974ccf87fb0a66d3dea7b46bb0758 100644
--- a/vipra-cmd/src/main/java/de/vipra/cmd/CmdOptions.java
+++ b/vipra-cmd/src/main/java/de/vipra/cmd/CmdOptions.java
@@ -62,8 +62,8 @@ public class CmdOptions extends Options {
 		addOption(Option.builder(OPT_INDEXING).longOpt(OPT_INDEXING_LONG).desc("regenerate search index").build());
 	}
 
-	public void printHelp(String cmd) {
-		HelpFormatter formatter = new HelpFormatter();
+	public void printHelp(final String cmd) {
+		final HelpFormatter formatter = new HelpFormatter();
 		formatter.printHelp(cmd, this, true);
 	}
 
diff --git a/vipra-cmd/src/main/java/de/vipra/cmd/Main.java b/vipra-cmd/src/main/java/de/vipra/cmd/Main.java
index c57aa58d6180c9a08c57acb1678658a17ae1a122..c441664c9a651a61f77568d19578f772560484bc 100644
--- a/vipra-cmd/src/main/java/de/vipra/cmd/Main.java
+++ b/vipra-cmd/src/main/java/de/vipra/cmd/Main.java
@@ -54,14 +54,14 @@ public class Main {
 		System.err.close();
 	}
 
-	public static void main(String[] args) {
-		CommandLineParser parser = new DefaultParser();
-		CmdOptions options = new CmdOptions();
+	public static void main(final String[] args) {
+		final CommandLineParser parser = new DefaultParser();
+		final CmdOptions options = new CmdOptions();
 		String cmd = "vipra-cmd.jar";
 		CommandLine cline;
 		try {
 			cline = parser.parse(options, args);
-		} catch (ParseException e) {
+		} catch (final ParseException e) {
 			log.error(e.getMessage());
 			options.printHelp(cmd);
 			return;
@@ -80,24 +80,24 @@ public class Main {
 		}
 
 		// logger configuration
-		LoggerContext loggerContext = (LoggerContext) LogManager.getContext(false);
-		Configuration loggerConfigs = loggerContext.getConfiguration();
+		final LoggerContext loggerContext = (LoggerContext) LogManager.getContext(false);
+		final Configuration loggerConfigs = loggerContext.getConfiguration();
 
 		if (cline.hasOption(OPT_DEBUG))
 			loggerConfigs.getLoggerConfig(LogManager.ROOT_LOGGER_NAME).setLevel(Level.DEBUG);
 
 		if (cline.hasOption(OPT_SILENT)) {
-			for (Entry<String, LoggerConfig> loggerConfig : loggerConfigs.getLoggers().entrySet())
+			for (final Entry<String, LoggerConfig> loggerConfig : loggerConfigs.getLoggers().entrySet())
 				loggerConfig.getValue().setLevel(Level.OFF);
 		}
 
 		loggerContext.updateLoggers();
 
 		// check if default decisions should be auto chosen
-		boolean defaults = cline.hasOption(OPT_DEFAULTS);
+		final boolean defaults = cline.hasOption(OPT_DEFAULTS);
 
 		// get commands
-		List<Command> commands = new ArrayList<>();
+		final List<Command> commands = new ArrayList<>();
 
 		if (cline.hasOption(OPT_CONFIG))
 			commands.add(new ConfigCommand());
@@ -122,18 +122,18 @@ public class Main {
 
 		// run commands
 		if (commands.size() > 0) {
-			for (ListIterator<Command> it = commands.listIterator(); it.hasNext();) {
-				Command c = it.next();
+			for (final ListIterator<Command> it = commands.listIterator(); it.hasNext();) {
+				final Command c = it.next();
 				try {
 					c.run();
-				} catch (MongoTimeoutException e) {
+				} catch (final MongoTimeoutException e) {
 					log.error("timeout while trying to connect to the database");
 					log.debug(e.getMessage(), e);
-				} catch (NoNodeAvailableException e) {
+				} catch (final NoNodeAvailableException e) {
 					log.error("could not connect to elasticsearch instance");
 					log.debug(e.getMessage(), e);
-				} catch (Exception e) {
-					Throwable cause = e.getCause();
+				} catch (final Exception e) {
+					final Throwable cause = e.getCause();
 					if (cause != null)
 						log.error(cause.getMessage());
 					else
diff --git a/vipra-cmd/src/main/java/de/vipra/cmd/ex/AnalyzerException.java b/vipra-cmd/src/main/java/de/vipra/cmd/ex/AnalyzerException.java
index 70b6207b65a7e148c98cb7344b7535bc4bb529df..99566f56ef4d5e20a7c4a5a4637d2ce5b00c830f 100644
--- a/vipra-cmd/src/main/java/de/vipra/cmd/ex/AnalyzerException.java
+++ b/vipra-cmd/src/main/java/de/vipra/cmd/ex/AnalyzerException.java
@@ -4,11 +4,11 @@ public class AnalyzerException extends Exception {
 
 	private static final long serialVersionUID = 1L;
 
-	public AnalyzerException(String msg) {
+	public AnalyzerException(final String msg) {
 		super(msg);
 	}
 
-	public AnalyzerException(Exception e) {
+	public AnalyzerException(final Exception e) {
 		super(e);
 	}
 
diff --git a/vipra-cmd/src/main/java/de/vipra/cmd/ex/FilebaseException.java b/vipra-cmd/src/main/java/de/vipra/cmd/ex/FilebaseException.java
index 22df17d513133864ef13de2b90d9fd5c5dd9d9b4..c74dc60ada0c74718f1c014f52d74d4c63949baa 100644
--- a/vipra-cmd/src/main/java/de/vipra/cmd/ex/FilebaseException.java
+++ b/vipra-cmd/src/main/java/de/vipra/cmd/ex/FilebaseException.java
@@ -4,15 +4,15 @@ public class FilebaseException extends Exception {
 
 	private static final long serialVersionUID = 1L;
 
-	public FilebaseException(String msg) {
+	public FilebaseException(final String msg) {
 		super(msg);
 	}
 
-	public FilebaseException(Exception e) {
+	public FilebaseException(final Exception e) {
 		super(e);
 	}
 
-	public FilebaseException(String msg, Exception e) {
+	public FilebaseException(final String msg, final Exception e) {
 		super(msg, e);
 	}
 
diff --git a/vipra-cmd/src/main/java/de/vipra/cmd/ex/ProcessorException.java b/vipra-cmd/src/main/java/de/vipra/cmd/ex/ProcessorException.java
index 4889e6fcac0f66993e4126b836a4991034c5d6d1..13f1be81d6e3301038bf26669ef1ee93c1fe50ff 100644
--- a/vipra-cmd/src/main/java/de/vipra/cmd/ex/ProcessorException.java
+++ b/vipra-cmd/src/main/java/de/vipra/cmd/ex/ProcessorException.java
@@ -4,11 +4,11 @@ public class ProcessorException extends Exception {
 
 	private static final long serialVersionUID = 1L;
 
-	public ProcessorException(String msg) {
+	public ProcessorException(final String msg) {
 		super(msg);
 	}
 
-	public ProcessorException(Exception e) {
+	public ProcessorException(final Exception e) {
 		super(e);
 	}
 
diff --git a/vipra-cmd/src/main/java/de/vipra/cmd/file/DTMFilebase.java b/vipra-cmd/src/main/java/de/vipra/cmd/file/DTMFilebase.java
index facea8ce635771f88a2e6a5c00291c5af8397c7e..ff1c200c6a38005827047c6561d4d0687590dc3a 100644
--- a/vipra-cmd/src/main/java/de/vipra/cmd/file/DTMFilebase.java
+++ b/vipra-cmd/src/main/java/de/vipra/cmd/file/DTMFilebase.java
@@ -24,10 +24,10 @@ public class DTMFilebase extends Filebase {
 	private final DTMVocabulary vocab;
 	private final File modelFile;
 
-	public DTMFilebase(File dataDir) throws FilebaseException {
+	public DTMFilebase(final File dataDir) throws FilebaseException {
 		super(dataDir, "dtm");
 
-		File modelDir = getModelDir();
+		final File modelDir = getModelDir();
 		try {
 			this.seqindex = new DTMSequenceIndex(modelDir);
 		} catch (IOException | ConfigException | ParseException e) {
@@ -36,28 +36,29 @@ public class DTMFilebase extends Filebase {
 
 		try {
 			this.vocab = new DTMVocabulary(modelDir, false);
-		} catch (IOException e) {
+		} catch (final IOException e) {
 			throw new FilebaseException("could not read vocabulary file", e);
 		}
 		this.modelFile = getModelFile(FILE_NAME);
 	}
 
 	@Override
-	public synchronized void write(List<ArticleFull> articles) throws IOException {
+	public synchronized void write(final List<ArticleFull> articles) throws IOException {
 		if (!articles.isEmpty()) {
-			for (ArticleFull article : articles)
+			for (final ArticleFull article : articles)
 				seqindex.add(article.getDate(), vocab.transform(article.getProcessedText()));
 
 			// use temp file
-			File modelFileTmp = getModelFile(FILE_NAME + ".tmp");
+			final File modelFileTmp = getModelFile(FILE_NAME + ".tmp");
 			Iterator<String> lines = null;
 			if (modelFile.exists())
 				lines = FileUtils.iterateFileLines(modelFile);
 
 			// concatenates the existing model file with new article entries in
 			// the temp file
-			BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(modelFileTmp)));
-			for (DTMDateIndexEntry e : seqindex) {
+			final BufferedWriter writer = new BufferedWriter(
+					new OutputStreamWriter(new FileOutputStream(modelFileTmp)));
+			for (final DTMDateIndexEntry e : seqindex) {
 				if (e.exists) {
 					if (lines == null) {
 						writer.close();
diff --git a/vipra-cmd/src/main/java/de/vipra/cmd/file/DTMSequenceIndex.java b/vipra-cmd/src/main/java/de/vipra/cmd/file/DTMSequenceIndex.java
index 90cf68eb9278d9fb2696a92285d757112027580f..b378881a430b50668d22bc95213e17b50b04e76f 100644
--- a/vipra-cmd/src/main/java/de/vipra/cmd/file/DTMSequenceIndex.java
+++ b/vipra-cmd/src/main/java/de/vipra/cmd/file/DTMSequenceIndex.java
@@ -31,14 +31,14 @@ public class DTMSequenceIndex implements Closeable, Iterable<DTMSequenceIndex.DT
 		public boolean exists;
 		public String line;
 
-		public DTMDateIndexEntry(Date date, boolean exists, String line) {
+		public DTMDateIndexEntry(final Date date, final boolean exists, final String line) {
 			this.date = date;
 			this.exists = exists;
 			this.line = line;
 		}
 
 		@Override
-		public int compareTo(DTMDateIndexEntry o) {
+		public int compareTo(final DTMDateIndexEntry o) {
 			if (o == null)
 				return 1;
 			if (date == null)
@@ -54,19 +54,20 @@ public class DTMSequenceIndex implements Closeable, Iterable<DTMSequenceIndex.DT
 	private static SimpleDateFormat df = new SimpleDateFormat(Constants.DATETIME_FORMAT);
 	private static CountMap<String> windowSizes = new CountMap<>();
 
-	public DTMSequenceIndex(File modelDir) throws IOException, ParseException, ConfigException {
+	public DTMSequenceIndex(final File modelDir) throws IOException, ParseException, ConfigException {
 		this(modelDir, false);
 	}
 
-	public DTMSequenceIndex(File modelDir, boolean reread) throws IOException, ParseException, ConfigException {
+	public DTMSequenceIndex(final File modelDir, final boolean reread)
+			throws IOException, ParseException, ConfigException {
 		this.file = new File(modelDir, "dates");
-		Config config = Config.getConfig();
+		final Config config = Config.getConfig();
 		this.windowResolution = config.windowResolution;
 		if (file.exists()) {
 			if (entries == null || reread) {
-				List<String> dates = FileUtils.readFile(file);
+				final List<String> dates = FileUtils.readFile(file);
 				entries = new ArrayList<>(dates.size());
-				for (String date : dates)
+				for (final String date : dates)
 					add(df.parse(date));
 			}
 		} else if (entries == null || reread) {
@@ -74,11 +75,11 @@ public class DTMSequenceIndex implements Closeable, Iterable<DTMSequenceIndex.DT
 		}
 	}
 
-	private void add(Date date) {
+	private void add(final Date date) {
 		add(date, null);
 	}
 
-	public void add(Date date, String line) {
+	public void add(final Date date, final String line) {
 		entries.add(new DTMDateIndexEntry(date, line == null, line));
 		windowSizes.count(windowResolution.fromDate(date));
 	}
@@ -96,22 +97,22 @@ public class DTMSequenceIndex implements Closeable, Iterable<DTMSequenceIndex.DT
 
 		// write date index
 		BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file, false)));
-		for (DTMDateIndexEntry entry : entries) {
+		for (final DTMDateIndexEntry entry : entries) {
 			writer.write(df.format(entry.date));
 			writer.write(Constants.LINE_SEP);
 		}
 		writer.close();
 
 		// write window index
-		File seqFile = new File(file.getParentFile(), FILE_NAME);
+		final File seqFile = new File(file.getParentFile(), FILE_NAME);
 		writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(seqFile, false)));
 		writer.write(Integer.toString(windowSizes.size()));
 		writer.write(Constants.LINE_SEP);
 
 		// write window sizes
-		String[] windows = windowSizes.keySet().toArray(new String[windowSizes.size()]);
+		final String[] windows = windowSizes.keySet().toArray(new String[windowSizes.size()]);
 		Arrays.sort(windows);
-		for (String window : windows) {
+		for (final String window : windows) {
 			writer.write(Integer.toString(windowSizes.get(window)));
 			writer.write(Constants.LINE_SEP);
 		}
diff --git a/vipra-cmd/src/main/java/de/vipra/cmd/file/DTMVocabulary.java b/vipra-cmd/src/main/java/de/vipra/cmd/file/DTMVocabulary.java
index 3a5c8975b11617068588ea9096a6cf8c45e28407..10cb615726a6228f7da001497a820540b5281241 100644
--- a/vipra-cmd/src/main/java/de/vipra/cmd/file/DTMVocabulary.java
+++ b/vipra-cmd/src/main/java/de/vipra/cmd/file/DTMVocabulary.java
@@ -17,23 +17,23 @@ public class DTMVocabulary implements Closeable, Iterable<String> {
 
 	public static final String FILE_NAME = "vocab";
 
-	private File file;
+	private final File file;
 	private static List<String> vocables;
 	private static Map<String, Integer> vocablesMap;
 	private static int nextIndex = 0;
 
-	public DTMVocabulary(File modelDir) throws IOException {
+	public DTMVocabulary(final File modelDir) throws IOException {
 		this(modelDir, false);
 	}
 
-	public DTMVocabulary(File modelDir, boolean reread) throws IOException {
+	public DTMVocabulary(final File modelDir, final boolean reread) throws IOException {
 		this.file = new File(modelDir, FILE_NAME);
 		if (file.exists()) {
 			if (vocables == null || reread)
 				vocables = new ArrayList<>(FileUtils.readFile(file));
 			if (vocablesMap == null || reread)
 				vocablesMap = new HashMap<>(vocables.size() + 200);
-			for (String vocable : vocables)
+			for (final String vocable : vocables)
 				vocablesMap.put(vocable, nextIndex++);
 		} else {
 			if (vocables == null || reread)
@@ -44,10 +44,10 @@ public class DTMVocabulary implements Closeable, Iterable<String> {
 	}
 
 	public void write() throws IOException {
-		FileUtils.writeLines(file, Constants.FILEBASE_ENCODING.name(), vocables, null, false);
+		org.apache.commons.io.FileUtils.writeLines(file, Constants.FILEBASE_ENCODING.name(), vocables, null, false);
 	}
 
-	private int index(String word) {
+	private int index(final String word) {
 		Integer index = vocablesMap.get(word);
 		if (index == null) {
 			index = nextIndex++;
@@ -61,11 +61,11 @@ public class DTMVocabulary implements Closeable, Iterable<String> {
 		return vocablesMap.size();
 	}
 
-	public String transform(String[] words) {
+	public String transform(final String[] words) {
 		// count unique words
-		Map<String, Integer> wordMap = new HashMap<>(words.length);
-		for (String word : words) {
-			Integer count = wordMap.get(word);
+		final Map<String, Integer> wordMap = new HashMap<>(words.length);
+		for (final String word : words) {
+			final Integer count = wordMap.get(word);
 			if (count == null)
 				wordMap.put(word, 1);
 			else
@@ -74,17 +74,17 @@ public class DTMVocabulary implements Closeable, Iterable<String> {
 
 		// assemble string
 		// <unique word count> <index1>:<count1> <index2>:<count2> ...
-		StringBuilder sb = new StringBuilder();
+		final StringBuilder sb = new StringBuilder();
 		sb.append(wordMap.size());
-		for (Entry<String, Integer> e : wordMap.entrySet()) {
-			int index = index(e.getKey());
+		for (final Entry<String, Integer> e : wordMap.entrySet()) {
+			final int index = index(e.getKey());
 			sb.append(" ").append(index).append(":").append(e.getValue());
 		}
 
 		return sb.toString();
 	}
 
-	public String get(int index) {
+	public String get(final int index) {
 		return vocables.get(index);
 	}
 
diff --git a/vipra-cmd/src/main/java/de/vipra/cmd/file/Filebase.java b/vipra-cmd/src/main/java/de/vipra/cmd/file/Filebase.java
index dfe0148ce6368d489d989526b7755c7d1cafd31d..97507171d5039b162072c05f22c4ffb28148c5d8 100644
--- a/vipra-cmd/src/main/java/de/vipra/cmd/file/Filebase.java
+++ b/vipra-cmd/src/main/java/de/vipra/cmd/file/Filebase.java
@@ -24,7 +24,7 @@ public abstract class Filebase implements Closeable {
 	private final FilebaseIndex index;
 	private final List<ArticleFull> articles;
 
-	public Filebase(File dataDir, String modelName) throws FilebaseException {
+	public Filebase(final File dataDir, final String modelName) throws FilebaseException {
 		this.modelName = modelName;
 		this.modelDir = new File(dataDir, modelName);
 		if (!modelDir.exists()) {
@@ -34,7 +34,7 @@ public abstract class Filebase implements Closeable {
 		}
 		try {
 			this.index = new FilebaseIndex(modelDir);
-		} catch (IOException e) {
+		} catch (final IOException e) {
 			throw new FilebaseException("could not read index: " + e.getMessage());
 		}
 		this.articles = new ArrayList<>(Constants.IMPORT_BUFFER_MAX);
@@ -44,7 +44,7 @@ public abstract class Filebase implements Closeable {
 		return modelDir;
 	}
 
-	public File getModelFile(String fileName) {
+	public File getModelFile(final String fileName) {
 		if (fileName != null)
 			return new File(modelDir, fileName);
 		return new File(modelDir, modelName);
@@ -64,7 +64,7 @@ public abstract class Filebase implements Closeable {
 		index.close();
 	}
 
-	public void add(ArticleFull article) throws FilebaseException {
+	public void add(final ArticleFull article) throws FilebaseException {
 		index.add(article.getId().toString());
 		articles.add(article);
 
@@ -73,7 +73,7 @@ public abstract class Filebase implements Closeable {
 				log.info("buffer filled, writing filebase");
 				write(articles);
 				articles.clear();
-			} catch (IOException e) {
+			} catch (final IOException e) {
 				throw new FilebaseException(e);
 			}
 		}
@@ -81,8 +81,8 @@ public abstract class Filebase implements Closeable {
 
 	public abstract void write(List<ArticleFull> articles) throws IOException;
 
-	public static Filebase getFilebase(Config config) throws FilebaseException, ConfigException {
-		File dataDir = config.getDataDirectory();
+	public static Filebase getFilebase(final Config config) throws FilebaseException, ConfigException {
+		final File dataDir = config.getDataDirectory();
 		switch (config.analyzer) {
 			case DTM:
 				return new DTMFilebase(dataDir);
diff --git a/vipra-cmd/src/main/java/de/vipra/cmd/file/FilebaseIndex.java b/vipra-cmd/src/main/java/de/vipra/cmd/file/FilebaseIndex.java
index 5fe238eeff45571c6b6933975e6761899880dd6a..d3ed722056133d5cbdd4448c3bdc85c9f8cc6c4b 100644
--- a/vipra-cmd/src/main/java/de/vipra/cmd/file/FilebaseIndex.java
+++ b/vipra-cmd/src/main/java/de/vipra/cmd/file/FilebaseIndex.java
@@ -17,7 +17,7 @@ public class FilebaseIndex implements Closeable, Iterable<String> {
 	private final File file;
 	private final List<String> index;
 
-	public FilebaseIndex(File modelDir) throws IOException {
+	public FilebaseIndex(final File modelDir) throws IOException {
 		this.file = new File(modelDir, FILE_NAME);
 		if (file.exists()) {
 			index = new ArrayList<>(FileUtils.readFile(file));
@@ -27,10 +27,10 @@ public class FilebaseIndex implements Closeable, Iterable<String> {
 	}
 
 	public void write() throws IOException {
-		FileUtils.writeLines(file, Constants.FILEBASE_ENCODING.name(), index, null, false);
+		org.apache.commons.io.FileUtils.writeLines(file, Constants.FILEBASE_ENCODING.name(), index, null, false);
 	}
 
-	public int add(String id) {
+	public int add(final String id) {
 		int i = indexOf(id);
 		if (i == -1) {
 			index.add(id);
@@ -39,15 +39,15 @@ public class FilebaseIndex implements Closeable, Iterable<String> {
 		return i;
 	}
 
-	public int indexOf(String id) {
+	public int indexOf(final String id) {
 		return index.indexOf(id);
 	}
 
-	public String get(int i) {
+	public String get(final int i) {
 		return index.get(i);
 	}
 
-	public boolean remove(String id) {
+	public boolean remove(final String id) {
 		return index.remove(id);
 	}
 
diff --git a/vipra-cmd/src/main/java/de/vipra/cmd/file/JGibbFilebase.java b/vipra-cmd/src/main/java/de/vipra/cmd/file/JGibbFilebase.java
index f15c290819abcfd719ca640331d49d50bea563a7..7b1957f2be53787b68eeb01b298297f1316401ac 100644
--- a/vipra-cmd/src/main/java/de/vipra/cmd/file/JGibbFilebase.java
+++ b/vipra-cmd/src/main/java/de/vipra/cmd/file/JGibbFilebase.java
@@ -15,16 +15,16 @@ public class JGibbFilebase extends Filebase {
 
 	private final File modelFile;
 
-	public JGibbFilebase(File dataDir) throws FilebaseException {
+	public JGibbFilebase(final File dataDir) throws FilebaseException {
 		super(dataDir, "jgibb");
 		this.modelFile = getModelFile(null);
 	}
 
 	@Override
-	public synchronized void write(List<ArticleFull> articles) throws IOException {
+	public synchronized void write(final List<ArticleFull> articles) throws IOException {
 		if (!articles.isEmpty()) {
-			BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(modelFile)));
-			for (ArticleFull article : articles)
+			final BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(modelFile)));
+			for (final ArticleFull article : articles)
 				writer.write(StringUtils.join(article.getProcessedText()) + "\n");
 			writer.close();
 		}
diff --git a/vipra-cmd/src/main/java/de/vipra/cmd/lda/Analyzer.java b/vipra-cmd/src/main/java/de/vipra/cmd/lda/Analyzer.java
index 77b7f29f8b7577a08a7941ba968b40ce273f11f2..15a3765acf0afc580a0e8d362b8e1cddf98dc068 100644
--- a/vipra-cmd/src/main/java/de/vipra/cmd/lda/Analyzer.java
+++ b/vipra-cmd/src/main/java/de/vipra/cmd/lda/Analyzer.java
@@ -7,7 +7,7 @@ public abstract class Analyzer {
 
 	private final String name;
 
-	protected Analyzer(String name) {
+	protected Analyzer(final String name) {
 		this.name = name;
 	}
 
@@ -19,7 +19,7 @@ public abstract class Analyzer {
 
 	public abstract void analyze() throws AnalyzerException;
 
-	public static Analyzer getAnalyzer(Config config) throws AnalyzerException {
+	public static Analyzer getAnalyzer(final Config config) throws AnalyzerException {
 		Analyzer analyzer = null;
 		switch (config.analyzer) {
 			case DTM:
diff --git a/vipra-cmd/src/main/java/de/vipra/cmd/lda/DTMAnalyzer.java b/vipra-cmd/src/main/java/de/vipra/cmd/lda/DTMAnalyzer.java
index 71928d84ed167c363c6a937277c337a81c80d135..0bfd303c175020c06c03d5fb00bfea0b4facfebf 100644
--- a/vipra-cmd/src/main/java/de/vipra/cmd/lda/DTMAnalyzer.java
+++ b/vipra-cmd/src/main/java/de/vipra/cmd/lda/DTMAnalyzer.java
@@ -61,9 +61,9 @@ public class DTMAnalyzer extends Analyzer {
 	}
 
 	@Override
-	public void init(Config config) throws AnalyzerException {
+	public void init(final Config config) throws AnalyzerException {
 		try {
-			File dataDir = config.getDataDirectory();
+			final File dataDir = config.getDataDirectory();
 			this.modelDir = new File(dataDir, NAME);
 			this.outDir = new File(modelDir, "out");
 			this.outDirSeq = new File(outDir, "lda-seq");
@@ -85,10 +85,10 @@ public class DTMAnalyzer extends Analyzer {
 			throw new AnalyzerException(
 					"dtm binary not found at path: " + config.dtmPath + ", check config key 'tm.dtmpath'");
 
-		String corpusPrefix = this.modelDir.getAbsolutePath() + File.separator + NAME;
-		String outname = this.outDir.getAbsolutePath();
+		final String corpusPrefix = this.modelDir.getAbsolutePath() + File.separator + NAME;
+		final String outname = this.outDir.getAbsolutePath();
 
-		String[] parameters = {
+		final String[] parameters = {
 				// number of topics
 				"--ntopics=" + Constants.K_TOPICS,
 				// topc modeling mode
@@ -118,7 +118,7 @@ public class DTMAnalyzer extends Analyzer {
 	@Override
 	public void analyze() throws AnalyzerException {
 		try {
-			Process p = Runtime.getRuntime().exec(command, null);
+			final Process p = Runtime.getRuntime().exec(command, null);
 			if (!p.isAlive())
 				throw new AnalyzerException("dtm process is dead");
 
@@ -140,16 +140,16 @@ public class DTMAnalyzer extends Analyzer {
 			// TODO find out what proportions are good for and where to store
 			// them
 
-			File gamFile = new File(outDirSeq, "gam.dat");
+			final File gamFile = new File(outDirSeq, "gam.dat");
 			in = new BufferedReader(new InputStreamReader(new FileInputStream(gamFile)));
 
 			for (int idxArticle = 0; idxArticle < index.size(); idxArticle++) {
 				double topicTotalProportions = 0;
-				double[] topicProportions = new double[Constants.K_TOPICS];
+				final double[] topicProportions = new double[Constants.K_TOPICS];
 
 				// gather individual topic proportions and sum of proportions
 				for (int idxTopic = 0; idxTopic < Constants.K_TOPICS; idxTopic++) {
-					double topicProportion = Double.parseDouble(in.readLine());
+					final double topicProportion = Double.parseDouble(in.readLine());
 					topicTotalProportions += topicProportion;
 					topicProportions[idxTopic] = topicProportion;
 				}
@@ -165,24 +165,25 @@ public class DTMAnalyzer extends Analyzer {
 
 			// read topic definition files and create topics
 
-			int sequencesCount = sequences.size();
-			int wordCount = vocab.size();
+			final int sequencesCount = sequences.size();
+			final int wordCount = vocab.size();
 			// collects created topics
-			List<TopicFull> newTopics = new ArrayList<>(Constants.K_TOPICS);
+			final List<TopicFull> newTopics = new ArrayList<>(Constants.K_TOPICS);
 			// collects created words
-			List<Word> newWords = new ArrayList<>(wordCount);
+			final List<Word> newWords = new ArrayList<>(wordCount);
 			// collect mapping between words and topics
 			@SuppressWarnings("unchecked")
-			Tuple<Double, Integer>[] wordTopicMapping = (Tuple<Double, Integer>[]) new Tuple[wordCount];
+			final Tuple<Double, Integer>[] wordTopicMapping = new Tuple[wordCount];
 
 			// for each topic file
 			for (int i = 0; i < Constants.K_TOPICS; i++) {
-				File seqFile = new File(outDirSeq, "topic-" + StringUtils.padNumber(i, 3) + "-var-e-log-prob.dat");
+				final File seqFile = new File(outDirSeq,
+						"topic-" + StringUtils.padNumber(i, 3) + "-var-e-log-prob.dat");
 
 				// create new topic
-				TopicFull newTopic = new TopicFull();
-				List<Sequence> newSequences = new ArrayList<>(sequencesCount);
-				List<TopicWord> newTopicWords = new ArrayList<>(wordCount);
+				final TopicFull newTopic = new TopicFull();
+				final List<Sequence> newSequences = new ArrayList<>(sequencesCount);
+				final List<TopicWord> newTopicWords = new ArrayList<>(wordCount);
 				newTopic.setSequences(newSequences);
 				newTopic.setWords(newTopicWords);
 				newTopics.add(newTopic);
@@ -191,14 +192,14 @@ public class DTMAnalyzer extends Analyzer {
 
 				// read file lines into word x sequence matrix
 				// gather maximum likeliness per sequence and per word
-				double[] maxSeqLikelinesses = new double[sequencesCount];
+				final double[] maxSeqLikelinesses = new double[sequencesCount];
 				Arrays.fill(maxSeqLikelinesses, Integer.MIN_VALUE);
-				double[] maxWordLikelinesses = new double[wordCount];
+				final double[] maxWordLikelinesses = new double[wordCount];
 				Arrays.fill(maxWordLikelinesses, Integer.MIN_VALUE);
-				double[][] likelinesses = new double[wordCount][sequencesCount];
+				final double[][] likelinesses = new double[wordCount][sequencesCount];
 				for (int idxWord = 0; idxWord < wordCount; idxWord++) {
 					for (int idxSeq = 0; idxSeq < sequencesCount; idxSeq++) {
-						double likeliness = Double.parseDouble(in.readLine());
+						final double likeliness = Double.parseDouble(in.readLine());
 						likelinesses[idxWord][idxSeq] = likeliness;
 						if (likeliness > maxSeqLikelinesses[idxSeq])
 							maxSeqLikelinesses[idxSeq] = likeliness;
@@ -212,7 +213,7 @@ public class DTMAnalyzer extends Analyzer {
 				// compare to current word <-> topic mapping, accept higher
 				// likeliness as better
 				for (int idxWord = 0; idxWord < maxWordLikelinesses.length; idxWord++) {
-					Tuple<Double, Integer> tuple = wordTopicMapping[idxWord];
+					final Tuple<Double, Integer> tuple = wordTopicMapping[idxWord];
 					if (tuple == null)
 						wordTopicMapping[idxWord] = new Tuple<>(maxWordLikelinesses[idxWord], i);
 					else if (maxWordLikelinesses[idxWord] > tuple.first())
@@ -221,7 +222,7 @@ public class DTMAnalyzer extends Analyzer {
 
 				// find maximum overall likeliness
 				double maxOverallLikeliness = Integer.MIN_VALUE;
-				for (double likeliness : maxSeqLikelinesses) {
+				for (final double likeliness : maxSeqLikelinesses) {
 					if (likeliness > maxOverallLikeliness)
 						maxOverallLikeliness = likeliness;
 				}
@@ -230,9 +231,9 @@ public class DTMAnalyzer extends Analyzer {
 				// most likely words form the static topic over all sequences
 				for (int idxWord = 0; idxWord < wordCount; idxWord++) {
 					if (maxWordLikelinesses[idxWord] >= Constants.MINIMUM_RELATIVE_PROB * maxOverallLikeliness) {
-						Word newWord = new Word(vocab.get(idxWord));
+						final Word newWord = new Word(vocab.get(idxWord));
 						newWords.add(newWord);
-						TopicWord newTopicWord = new TopicWord(newWord, maxWordLikelinesses[idxWord]);
+						final TopicWord newTopicWord = new TopicWord(newWord, maxWordLikelinesses[idxWord]);
 						newTopicWords.add(newTopicWord);
 					}
 				}
@@ -241,20 +242,20 @@ public class DTMAnalyzer extends Analyzer {
 				// go through each sequence and gather all words that are above
 				// the minimum relative word likeliness
 				for (int idxSeq = 0; idxSeq < sequencesCount; idxSeq++) {
-					double maxLikeliness = maxSeqLikelinesses[idxSeq];
-					List<TopicWord> newSeqTopicWords = new ArrayList<>(wordCount);
+					final double maxLikeliness = maxSeqLikelinesses[idxSeq];
+					final List<TopicWord> newSeqTopicWords = new ArrayList<>(wordCount);
 					for (int idxWord = 0; idxWord < wordCount; idxWord++) {
-						double likeliness = likelinesses[idxWord][idxSeq];
+						final double likeliness = likelinesses[idxWord][idxSeq];
 						if (likeliness >= Constants.MINIMUM_RELATIVE_PROB * maxLikeliness) {
-							Word newWord = new Word(vocab.get(idxWord));
+							final Word newWord = new Word(vocab.get(idxWord));
 							newWords.add(newWord);
-							TopicWord newTopicWord = new TopicWord(newWord, likeliness);
+							final TopicWord newTopicWord = new TopicWord(newWord, likeliness);
 							newSeqTopicWords.add(newTopicWord);
 						}
 					}
 					Collections.sort(newSeqTopicWords, Comparator.reverseOrder());
 
-					Sequence newSequence = new Sequence();
+					final Sequence newSequence = new Sequence();
 					newSequence.setNumber(idxSeq);
 					newSequence.setWords(newSeqTopicWords);
 					newSequences.add(newSequence);
@@ -267,28 +268,28 @@ public class DTMAnalyzer extends Analyzer {
 			try {
 				dbTopics.createMultiple(newTopics);
 				dbWords.createMultiple(newWords);
-			} catch (DatabaseException e) {
+			} catch (final DatabaseException e) {
 				throw new AnalyzerException(e);
 			}
 
 			// create topic references
 
-			File multFile = new File(modelDir, "dtm-mult.dat");
+			final File multFile = new File(modelDir, "dtm-mult.dat");
 			in = new BufferedReader(new InputStreamReader(new FileInputStream(multFile)));
-			Pattern wordCountPattern = Pattern.compile("(\\d+):(\\d+)");
+			final Pattern wordCountPattern = Pattern.compile("(\\d+):(\\d+)");
 			int articleIndex = 0;
 
 			// for each article in the model file
 			while ((line = in.readLine()) != null) {
 				// get topic id from word id, count topics
-				CountMap<Integer> countMap = new CountMap<>();
-				Matcher matcher = wordCountPattern.matcher(line);
+				final CountMap<Integer> countMap = new CountMap<>();
+				final Matcher matcher = wordCountPattern.matcher(line);
 				double totalCount = 0;
 				while (matcher.find()) {
-					Integer wordId = Integer.parseInt(matcher.group(1));
-					Tuple<Double, Integer> wordTopicTuple = wordTopicMapping[wordId];
+					final Integer wordId = Integer.parseInt(matcher.group(1));
+					final Tuple<Double, Integer> wordTopicTuple = wordTopicMapping[wordId];
 					if (wordTopicTuple != null) {
-						int count = Integer.parseInt(matcher.group(2));
+						final int count = Integer.parseInt(matcher.group(2));
 						countMap.count(wordTopicTuple.second(), count);
 						totalCount += count;
 					}
@@ -297,17 +298,17 @@ public class DTMAnalyzer extends Analyzer {
 				// create list of topics refs referencing topics with counted
 				// occurrences, sum accepted topic word count
 				long reducedCount = 0;
-				List<TopicRef> newTopicRefs = new ArrayList<>(countMap.size());
-				for (Entry<Integer, Integer> entry : countMap.entrySet()) {
+				final List<TopicRef> newTopicRefs = new ArrayList<>(countMap.size());
+				for (final Entry<Integer, Integer> entry : countMap.entrySet()) {
 					// check if topic above threshold
 					if ((entry.getValue() / totalCount) >= Constants.TOPIC_THRESHOLD) {
 						reducedCount += entry.getValue();
-						TopicFull topic = newTopics.get(entry.getKey());
+						final TopicFull topic = newTopics.get(entry.getKey());
 						// TODO words with low relative likeliness are ignored.
 						// topic references from this file are possibly wrong.
 						// fix this by checking if the word is actually accepted
 						// by the referenced topic.
-						TopicRef ref = new TopicRef();
+						final TopicRef ref = new TopicRef();
 						ref.setCount(entry.getValue());
 						ref.setTopic(new Topic(topic.getId()));
 						newTopicRefs.add(ref);
@@ -315,21 +316,21 @@ public class DTMAnalyzer extends Analyzer {
 				}
 
 				// calculate each accepted topic share
-				for (TopicRef ref : newTopicRefs)
+				for (final TopicRef ref : newTopicRefs)
 					ref.setShare((double) ref.getCount() / reducedCount);
 
 				if (!newTopicRefs.isEmpty()) {
 					Collections.sort(newTopicRefs, Comparator.reverseOrder());
 
 					// update article with topic references (partial update)
-					ArticleFull article = new ArticleFull();
+					final ArticleFull article = new ArticleFull();
 					article.setId(index.get(articleIndex++));
 					article.setTopics(newTopicRefs);
 
 					try {
 						// TODO: using field name here. Hard to refactor
 						dbArticles.updateSingle(article, "topics");
-					} catch (DatabaseException e) {
+					} catch (final DatabaseException e) {
 						log.error(e);
 					}
 				}
diff --git a/vipra-cmd/src/main/java/de/vipra/cmd/lda/JGibbAnalyzer.java b/vipra-cmd/src/main/java/de/vipra/cmd/lda/JGibbAnalyzer.java
index ce3b4adb9dac71f4e4ee2aecccfed4403791fa8b..23064625d1fa20889dd17f9e4a9a54408f93c3e8 100644
--- a/vipra-cmd/src/main/java/de/vipra/cmd/lda/JGibbAnalyzer.java
+++ b/vipra-cmd/src/main/java/de/vipra/cmd/lda/JGibbAnalyzer.java
@@ -61,7 +61,7 @@ public class JGibbAnalyzer extends Analyzer {
 
 		try {
 			dataDir = config.getDataDirectory();
-		} catch (ConfigException e) {
+		} catch (final ConfigException e) {
 			throw new AnalyzerException(e);
 		}
 
@@ -84,7 +84,7 @@ public class JGibbAnalyzer extends Analyzer {
 			dbTopics = MongoService.getDatabaseService(config, TopicFull.class);
 			dbWords = MongoService.getDatabaseService(config, Word.class);
 			index = new FilebaseIndex(modelDir);
-		} catch (Exception e) {
+		} catch (final Exception e) {
 			throw new AnalyzerException(e);
 		}
 	}
@@ -94,42 +94,42 @@ public class JGibbAnalyzer extends Analyzer {
 		if (!modelFile.exists()) {
 			throw new AnalyzerException("model file does not exist: " + modelFile.getAbsolutePath());
 		}
-		Estimator estimator = new Estimator();
+		final Estimator estimator = new Estimator();
 		estimator.init(options);
 		estimator.estimate();
 
 		// read topic definitions and save
 
-		File twords = new File(modelDir, NAME + ".twords");
+		final File twords = new File(modelDir, NAME + ".twords");
 		List<String> lines;
 		try {
 			lines = FileUtils.readFile(twords);
-		} catch (IOException e) {
+		} catch (final IOException e) {
 			throw new AnalyzerException(e);
 		}
 
 		// the list of new topics
-		List<TopicFull> newTopics = new ArrayList<>(options.K);
+		final List<TopicFull> newTopics = new ArrayList<>(options.K);
 		// set of new words
-		Set<Word> newWords = new HashSet<>();
+		final Set<Word> newWords = new HashSet<>();
 
 		List<TopicWord> topicWords = null;
 		int topicIndex = -1;
-		double[] maxLikelinesses = new double[Constants.K_TOPICS];
+		final double[] maxLikelinesses = new double[Constants.K_TOPICS];
 
 		// create topics and determine maximum likeliness for each topic
-		for (String line : lines) {
+		for (final String line : lines) {
 			if (!line.startsWith("\t")) {
 				topicIndex++;
 				topicWords = new ArrayList<>(Constants.K_TOPIC_WORDS);
-				TopicFull newTopic = new TopicFull();
+				final TopicFull newTopic = new TopicFull();
 				newTopic.setWords(topicWords);
 				newTopics.add(newTopic);
 				continue;
 			}
 
-			String[] parts = line.trim().split("\\s+");
-			double likeliness = Double.parseDouble(parts[1]);
+			final String[] parts = line.trim().split("\\s+");
+			final double likeliness = Double.parseDouble(parts[1]);
 
 			// determine maximum likeliness of this topic
 			if (likeliness > maxLikelinesses[topicIndex])
@@ -142,10 +142,10 @@ public class JGibbAnalyzer extends Analyzer {
 		// filter out words below minimum relative likeliness, add accepted
 		// words to list of new words
 		for (topicIndex = 0; topicIndex < newTopics.size(); topicIndex++) {
-			TopicFull topic = newTopics.get(topicIndex);
-			double maxLikeliness = maxLikelinesses[topicIndex];
-			ArrayList<TopicWord> filteredTopicWords = new ArrayList<>(topic.getWords().size());
-			for (TopicWord word : topic.getWords()) {
+			final TopicFull topic = newTopics.get(topicIndex);
+			final double maxLikeliness = maxLikelinesses[topicIndex];
+			final ArrayList<TopicWord> filteredTopicWords = new ArrayList<>(topic.getWords().size());
+			for (final TopicWord word : topic.getWords()) {
 				if (word.getLikeliness() >= Constants.MINIMUM_RELATIVE_PROB * maxLikeliness) {
 					filteredTopicWords.add(word);
 					newWords.add(word.getWord());
@@ -155,7 +155,7 @@ public class JGibbAnalyzer extends Analyzer {
 		}
 
 		// sort topic words and generate topic name
-		for (TopicFull topic : newTopics) {
+		for (final TopicFull topic : newTopics) {
 			Collections.sort(topic.getWords(), Collections.reverseOrder());
 			topic.setName(TopicFull.getNameFromWords(topic.getWords()));
 		}
@@ -166,14 +166,14 @@ public class JGibbAnalyzer extends Analyzer {
 		try {
 			dbTopics.createMultiple(newTopics);
 			dbWords.createMultiple(newWords);
-		} catch (DatabaseException e) {
+		} catch (final DatabaseException e) {
 			throw new AnalyzerException(e);
 		}
 
 		// read documents and reference topics
 
-		File tassign = new File(modelDir, NAME + ".tassign");
-		Pattern topicIndexPattern = Pattern.compile(":(\\d+)");
+		final File tassign = new File(modelDir, NAME + ".tassign");
+		final Pattern topicIndexPattern = Pattern.compile(":(\\d+)");
 		BufferedReader in = null;
 
 		try {
@@ -185,8 +185,8 @@ public class JGibbAnalyzer extends Analyzer {
 			// <word-id>:<topic-id>
 			while ((line = in.readLine()) != null) {
 				// extract topic ids and count them
-				CountMap<String> countMap = new CountMap<>();
-				Matcher matcher = topicIndexPattern.matcher(line);
+				final CountMap<String> countMap = new CountMap<>();
+				final Matcher matcher = topicIndexPattern.matcher(line);
 				double totalCount = 0;
 				while (matcher.find()) {
 					countMap.count(matcher.group(1));
@@ -196,17 +196,17 @@ public class JGibbAnalyzer extends Analyzer {
 				// create list of topics refs referencing topics with counted
 				// occurrences, sum accepted topic word count
 				long reducedCount = 0;
-				List<TopicRef> newTopicRefs = new ArrayList<>(countMap.size());
-				for (Entry<String, Integer> entry : countMap.entrySet()) {
+				final List<TopicRef> newTopicRefs = new ArrayList<>(countMap.size());
+				for (final Entry<String, Integer> entry : countMap.entrySet()) {
 					// check if topic above threshold
 					if ((entry.getValue() / totalCount) >= Constants.TOPIC_THRESHOLD) {
 						reducedCount += entry.getValue();
-						TopicFull topic = newTopics.get(Integer.parseInt(entry.getKey()));
+						final TopicFull topic = newTopics.get(Integer.parseInt(entry.getKey()));
 						// TODO words with low relative likeliness are ignored.
 						// topic references from this file are possibly wrong.
 						// fix this by checking if the word is actually accepted
 						// by the referenced topic.
-						TopicRef ref = new TopicRef();
+						final TopicRef ref = new TopicRef();
 						ref.setCount(entry.getValue());
 						ref.setTopic(new Topic(topic.getId()));
 						newTopicRefs.add(ref);
@@ -214,21 +214,21 @@ public class JGibbAnalyzer extends Analyzer {
 				}
 
 				// calculate each accepted topic share
-				for (TopicRef ref : newTopicRefs)
+				for (final TopicRef ref : newTopicRefs)
 					ref.setShare((double) ref.getCount() / reducedCount);
 
 				if (!newTopicRefs.isEmpty()) {
 					Collections.sort(newTopicRefs, Comparator.reverseOrder());
 
 					// update article with topic references (partial update)
-					ArticleFull article = new ArticleFull();
+					final ArticleFull article = new ArticleFull();
 					article.setId(index.get(articleIndex++));
 					article.setTopics(newTopicRefs);
 
 					try {
 						// TODO: using field name here. Hard to refactor
 						dbArticles.updateSingle(article, "topics");
-					} catch (DatabaseException e) {
+					} catch (final DatabaseException e) {
 						log.error(e);
 					}
 				}
@@ -236,7 +236,7 @@ public class JGibbAnalyzer extends Analyzer {
 
 			in.close();
 
-		} catch (IOException e) {
+		} catch (final IOException e) {
 			throw new AnalyzerException(e);
 		}
 	}
diff --git a/vipra-cmd/src/main/java/de/vipra/cmd/option/ClearCommand.java b/vipra-cmd/src/main/java/de/vipra/cmd/option/ClearCommand.java
index 24333e55f2a7704f7c81f32b35f9ba02c0d2ad03..67f0bcaed40b4de669733e297feac96ac288a0a7 100644
--- a/vipra-cmd/src/main/java/de/vipra/cmd/option/ClearCommand.java
+++ b/vipra-cmd/src/main/java/de/vipra/cmd/option/ClearCommand.java
@@ -21,14 +21,14 @@ public class ClearCommand implements Command {
 
 	public static final Logger log = LogManager.getLogger(ClearCommand.class);
 
-	private boolean defaults;
+	private final boolean defaults;
 	private Config config;
 	private MongoService<Article, ObjectId> dbArticles;
 	private MongoService<TopicFull, ObjectId> dbTopics;
 	private MongoService<Word, String> dbWords;
 	private Client elasticClient;
 
-	public ClearCommand(boolean defaults) {
+	public ClearCommand(final boolean defaults) {
 		this.defaults = defaults;
 	}
 
@@ -49,11 +49,11 @@ public class ClearCommand implements Command {
 
 		try {
 			log.info("clearing filebase");
-			File dataDir = config.getDataDirectory();
+			final File dataDir = config.getDataDirectory();
 			if (dataDir.exists() && dataDir.isDirectory()) {
 				FileUtils.deleteDirectory(dataDir);
 			}
-		} catch (IOException e) {
+		} catch (final IOException e) {
 			log.warn("could not delete data directory: " + config.getDataDirectory().getAbsolutePath());
 		}
 	}
diff --git a/vipra-cmd/src/main/java/de/vipra/cmd/option/ConfigCommand.java b/vipra-cmd/src/main/java/de/vipra/cmd/option/ConfigCommand.java
index b5d9f4b597608966a451672439a6b0235ca6c33c..b93b3a3434999f30ecdb37ba03890a78fbe01bb7 100644
--- a/vipra-cmd/src/main/java/de/vipra/cmd/option/ConfigCommand.java
+++ b/vipra-cmd/src/main/java/de/vipra/cmd/option/ConfigCommand.java
@@ -11,7 +11,7 @@ public class ConfigCommand implements Command {
 
 	@Override
 	public void run() throws Exception {
-		Config config = Config.getConfig();
+		final Config config = Config.getConfig();
 		log.info("Current configuration:");
 		config.print(System.out, "", " : ", true, true, ' ');
 	}
diff --git a/vipra-cmd/src/main/java/de/vipra/cmd/option/ImportCommand.java b/vipra-cmd/src/main/java/de/vipra/cmd/option/ImportCommand.java
index 062bd93a5ea0388bb800a9b7cf6246a8f94a1c31..8a75ca2357b0871ce9e3c32e994b03c5a92738c5 100644
--- a/vipra-cmd/src/main/java/de/vipra/cmd/option/ImportCommand.java
+++ b/vipra-cmd/src/main/java/de/vipra/cmd/option/ImportCommand.java
@@ -38,14 +38,14 @@ public class ImportCommand implements Command {
 
 	public static class ArticleBuffer {
 
-		private MongoService<ArticleFull, ObjectId> dbArticles;
-		private List<ArticleFull> articles = new ArrayList<>(Constants.IMPORT_BUFFER_MAX);
+		private final MongoService<ArticleFull, ObjectId> dbArticles;
+		private final List<ArticleFull> articles = new ArrayList<>(Constants.IMPORT_BUFFER_MAX);
 
-		public ArticleBuffer(MongoService<ArticleFull, ObjectId> dbArticles) {
+		public ArticleBuffer(final MongoService<ArticleFull, ObjectId> dbArticles) {
 			this.dbArticles = dbArticles;
 		}
 
-		public void add(ArticleFull article) throws DatabaseException {
+		public void add(final ArticleFull article) throws DatabaseException {
 			articles.add(article);
 			if (articles.size() >= Constants.IMPORT_BUFFER_MAX) {
 				save();
@@ -67,7 +67,8 @@ public class ImportCommand implements Command {
 		private final ArticleBuffer buffer;
 		private final Filebase filebase;
 
-		public ImportTask(JSONObject object, Processor processor, ArticleBuffer buffer, Filebase filebase) {
+		public ImportTask(final JSONObject object, final Processor processor, final ArticleBuffer buffer,
+				final Filebase filebase) {
 			this.object = object;
 			this.processor = processor;
 			this.buffer = buffer;
@@ -76,15 +77,15 @@ public class ImportCommand implements Command {
 
 		@Override
 		public void run() {
-			ArticleFull article = articleFromJSON(object);
+			final ArticleFull article = articleFromJSON(object);
 
 			try {
 				// preprocess text
-				ProcessedText processedText = processor.process(article.getText());
+				final ProcessedText processedText = processor.process(article.getText());
 				article.setProcessedText(processedText.getWords());
 
 				// generate article stats
-				ArticleStats stats = new ArticleStats();
+				final ArticleStats stats = new ArticleStats();
 				stats.setWordCount(processedText.getWordCount());
 				stats.setProcessedWordCount(processedText.getReducedWordCount());
 				stats.setReductionRatio(processedText.getReductionRatio());
@@ -101,17 +102,17 @@ public class ImportCommand implements Command {
 				log.info("imported \"" + object.get("title") + "\"\r\n â”” text reduction: "
 						+ (processedText.getReductionRatio() * 100) + "%, text length: [" + processedText.getWordCount()
 						+ " -> " + processedText.getReducedWordCount() + "]" + (imported ? "" : " SKIPPED"));
-			} catch (ProcessorException e) {
+			} catch (final ProcessorException e) {
 				log.error("could not preprocess text of article '" + article.getTitle() + "'");
-			} catch (DatabaseException e) {
+			} catch (final DatabaseException e) {
 				log.error("could not save processed article in the database '" + article.getTitle() + "'");
-			} catch (FilebaseException e) {
+			} catch (final FilebaseException e) {
 				log.error("could not save processed article in the filebase '" + article.getTitle() + "'");
 			}
 		}
 
-		private ArticleFull articleFromJSON(JSONObject obj) {
-			ArticleFull article = new ArticleFull();
+		private ArticleFull articleFromJSON(final JSONObject obj) {
+			final ArticleFull article = new ArticleFull();
 			article.setId(new ObjectId());
 			if (obj.containsKey("title"))
 				article.setTitle(obj.get("title").toString());
@@ -128,8 +129,8 @@ public class ImportCommand implements Command {
 
 	public static final Logger log = LogManager.getLogger(ImportCommand.class);
 
-	private ArrayList<File> files = new ArrayList<>();
-	private JSONParser parser = new JSONParser();
+	private final ArrayList<File> files = new ArrayList<>();
+	private final JSONParser parser = new JSONParser();
 	private Config config;
 	private MongoService<ArticleFull, ObjectId> dbArticles;
 	private Filebase filebase;
@@ -141,34 +142,34 @@ public class ImportCommand implements Command {
 	 * Import command to import articles into the database, do topic modeling
 	 * and save everything. Use {@link ImportCommand#run()} to execute this
 	 * command.
-	 * 
+	 *
 	 * @param paths
 	 *            Paths to all *.json files containing artiles or folders
 	 *            containing *.json files. Not recursive.
 	 */
-	public ImportCommand(String[] paths) {
+	public ImportCommand(final String[] paths) {
 		addPaths(paths);
 	}
 
-	private void addPaths(String[] paths) {
-		for (int i = 0; i < paths.length; i++) {
-			addPath(new File(paths[i]));
+	private void addPaths(final String[] paths) {
+		for (final String path : paths) {
+			addPath(new File(path));
 		}
 	}
 
-	public void addPaths(File[] paths) {
-		for (int i = 0; i < paths.length; i++) {
-			addPath(paths[i]);
+	public void addPaths(final File[] paths) {
+		for (final File path : paths) {
+			addPath(path);
 		}
 	}
 
-	public void addPath(File file) {
+	public void addPath(final File file) {
 		if (file.isFile()) {
 			files.add(file);
 		} else if (file.isDirectory()) {
-			File[] files = file.listFiles(new FilenameFilter() {
+			final File[] files = file.listFiles(new FilenameFilter() {
 				@Override
-				public boolean accept(File dir, String name) {
+				public boolean accept(final File dir, final String name) {
 					return dir.isFile() && dir.exists();
 				}
 			});
@@ -179,33 +180,33 @@ public class ImportCommand implements Command {
 
 	/**
 	 * import a single article into the database and filebase
-	 * 
+	 *
 	 * @param object
 	 * @return
 	 * @throws Exception
 	 */
-	private void importArticle(JSONObject object) {
-		ImportTask task = new ImportTask(object, processor, buffer, filebase);
+	private void importArticle(final JSONObject object) {
+		final ImportTask task = new ImportTask(object, processor, buffer, filebase);
 		executor.execute(task);
 	}
 
 	/**
 	 * Imports a file into the database and the filebase
-	 * 
+	 *
 	 * @param file
 	 * @throws ParseException
 	 * @throws IOException
 	 * @throws FileNotFoundException
 	 * @throws Exception
 	 */
-	private int importFile(File file) throws FileNotFoundException, IOException, ParseException {
-		Object data = parser.parse(new FileReader(file));
+	private int importFile(final File file) throws FileNotFoundException, IOException, ParseException {
+		final Object data = parser.parse(new FileReader(file));
 		int imported = 0;
 
 		if (data instanceof JSONArray) {
-			JSONArray objects = (JSONArray) data;
+			final JSONArray objects = (JSONArray) data;
 			imported += objects.size();
-			for (Object object : objects)
+			for (final Object object : objects)
 				importArticle((JSONObject) object);
 		} else if (data instanceof JSONObject) {
 			importArticle((JSONObject) data);
@@ -217,9 +218,9 @@ public class ImportCommand implements Command {
 		return imported;
 	}
 
-	private int importFiles(List<File> files) throws FileNotFoundException, IOException, ParseException {
+	private int importFiles(final List<File> files) throws FileNotFoundException, IOException, ParseException {
 		int imported = 0;
-		for (File file : files) {
+		for (final File file : files) {
 			imported += importFile(file);
 		}
 		return imported;
@@ -228,7 +229,7 @@ public class ImportCommand implements Command {
 	@Override
 	public void run() throws IOException, ConfigException, FilebaseException, ParseException, DatabaseException,
 			InterruptedException {
-		int threadCount = Runtime.getRuntime().availableProcessors() * 10;
+		final int threadCount = Runtime.getRuntime().availableProcessors() * 10;
 		config = Config.getConfig();
 		dbArticles = MongoService.getDatabaseService(config, ArticleFull.class);
 		filebase = Filebase.getFilebase(config);
@@ -240,14 +241,14 @@ public class ImportCommand implements Command {
 		log.info("using preprocessor: " + processor.getName());
 		log.info("using " + threadCount + " " + StringUtils.quantity(threadCount, "thread"));
 
-		Timer timer = new Timer();
+		final Timer timer = new Timer();
 		timer.restart();
 
 		/*
 		 * import files into database and filebase
 		 */
 		log.info("file import");
-		int imported = importFiles(files);
+		final int imported = importFiles(files);
 		executor.shutdown();
 		executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
 		buffer.save();
diff --git a/vipra-cmd/src/main/java/de/vipra/cmd/option/IndexingCommand.java b/vipra-cmd/src/main/java/de/vipra/cmd/option/IndexingCommand.java
index 29977e57cc16f76126474999bbf89194d79fd2e5..6efae559bce826c8c89548955889a11054b9d4a7 100644
--- a/vipra-cmd/src/main/java/de/vipra/cmd/option/IndexingCommand.java
+++ b/vipra-cmd/src/main/java/de/vipra/cmd/option/IndexingCommand.java
@@ -23,28 +23,29 @@ public class IndexingCommand implements Command {
 
 	@Override
 	public void run() throws Exception {
-		Config config = Config.getConfig();
-		MongoService<ArticleFull, ObjectId> dbArticles = MongoService.getDatabaseService(config, ArticleFull.class);
-		Filebase filebase = Filebase.getFilebase(config);
-		FilebaseIndex index = filebase.getIndex();
-		Client elasticClient = ESClient.getClient(config);
-		ESSerializer<ArticleFull> elasticSerializer = new ESSerializer<>(ArticleFull.class);
+		final Config config = Config.getConfig();
+		final MongoService<ArticleFull, ObjectId> dbArticles = MongoService.getDatabaseService(config,
+				ArticleFull.class);
+		final Filebase filebase = Filebase.getFilebase(config);
+		final FilebaseIndex index = filebase.getIndex();
+		final Client elasticClient = ESClient.getClient(config);
+		final ESSerializer<ArticleFull> elasticSerializer = new ESSerializer<>(ArticleFull.class);
 
 		// clear index
 		elasticClient.admin().indices().prepareDelete("_all").get();
 
-		Iterator<String> indexIter = index.iterator();
+		final Iterator<String> indexIter = index.iterator();
 		while (indexIter.hasNext()) {
 			// get article from database
-			String id = indexIter.next();
-			ArticleFull article = dbArticles.getSingle(MongoUtils.objectId(id), true);
+			final String id = indexIter.next();
+			final ArticleFull article = dbArticles.getSingle(MongoUtils.objectId(id), true);
 			if (article == null) {
 				log.error("no article found in db for id " + id);
 				continue;
 			}
 
 			// index article
-			Map<String, Object> source = elasticSerializer.serialize(article);
+			final Map<String, Object> source = elasticSerializer.serialize(article);
 			elasticClient.prepareIndex("articles", "article", article.getId().toString()).setSource(source).get();
 		}
 
diff --git a/vipra-cmd/src/main/java/de/vipra/cmd/option/ModelingCommand.java b/vipra-cmd/src/main/java/de/vipra/cmd/option/ModelingCommand.java
index 0955733317d86fbdc15de6c8b58823e7f7b88805..796fad9cbe29f7e46f93e5aa810ce9b354541c65 100644
--- a/vipra-cmd/src/main/java/de/vipra/cmd/option/ModelingCommand.java
+++ b/vipra-cmd/src/main/java/de/vipra/cmd/option/ModelingCommand.java
@@ -22,7 +22,7 @@ public class ModelingCommand implements Command {
 
 		log.info("using analyzer: " + analyzer.getName());
 
-		Timer timer = new Timer();
+		final Timer timer = new Timer();
 		timer.restart();
 
 		/*
diff --git a/vipra-cmd/src/main/java/de/vipra/cmd/option/TestCommand.java b/vipra-cmd/src/main/java/de/vipra/cmd/option/TestCommand.java
index c57fe1eaec3afc8d1005c572d14d3fd3f7aa43f9..b9b1418c02a854aff45fca4f9119debd8cf4d651 100644
--- a/vipra-cmd/src/main/java/de/vipra/cmd/option/TestCommand.java
+++ b/vipra-cmd/src/main/java/de/vipra/cmd/option/TestCommand.java
@@ -19,16 +19,16 @@ public class TestCommand implements Command {
 	public void run() throws Exception {
 		// test if configuration readable
 		log.info("reading configuration...");
-		Config config = Config.getConfig();
+		final Config config = Config.getConfig();
 
 		// test if database is accessible
 		log.info("testing mongodb connection...");
-		MongoService<Article, ObjectId> dbArticles = MongoService.getDatabaseService(config, Article.class);
+		final MongoService<Article, ObjectId> dbArticles = MongoService.getDatabaseService(config, Article.class);
 		dbArticles.count(null);
 
 		// test if elasticsearch is accessible
 		log.info("testing elasticsearch connection...");
-		TransportClient esclient = ESClient.getClient(config);
+		final TransportClient esclient = ESClient.getClient(config);
 		if (esclient.connectedNodes().isEmpty()) {
 			throw new NoNodeAvailableException("no elasticsearch nodes available");
 		}
diff --git a/vipra-cmd/src/main/java/de/vipra/cmd/plugin/ClassNameRegexFilter.java b/vipra-cmd/src/main/java/de/vipra/cmd/plugin/ClassNameRegexFilter.java
index 35ab0ec537a492b9eaf0239c867edd0da800d21d..b1c618c6787b738fb8892171b499d2f1bd6e0544 100644
--- a/vipra-cmd/src/main/java/de/vipra/cmd/plugin/ClassNameRegexFilter.java
+++ b/vipra-cmd/src/main/java/de/vipra/cmd/plugin/ClassNameRegexFilter.java
@@ -46,7 +46,7 @@ public final class ClassNameRegexFilter extends AbstractFilter {
 
 	/**
 	 * Create a Filter that matches a regular expression.
-	 * 
+	 *
 	 * @param regex
 	 *            The regular expression to match.
 	 * @param match
diff --git a/vipra-cmd/src/main/java/de/vipra/cmd/text/CoreNLPProcessor.java b/vipra-cmd/src/main/java/de/vipra/cmd/text/CoreNLPProcessor.java
index 3e4ab99172e662117285aa2a95418a8bff6aa39c..1975adc881bc26d0b787d16b6e1ef8fbfd23bd20 100644
--- a/vipra-cmd/src/main/java/de/vipra/cmd/text/CoreNLPProcessor.java
+++ b/vipra-cmd/src/main/java/de/vipra/cmd/text/CoreNLPProcessor.java
@@ -21,12 +21,12 @@ public class CoreNLPProcessor extends Processor {
 
 	public static final Logger log = LogManager.getLogger(CoreNLPProcessor.class);
 
-	private StanfordCoreNLP nlp;
+	private final StanfordCoreNLP nlp;
 
-	public CoreNLPProcessor(List<String> stopWordsList) {
+	public CoreNLPProcessor(final List<String> stopWordsList) {
 		super("Stanford CoreNLP Processor");
 
-		Properties props = new Properties();
+		final Properties props = new Properties();
 		props.setProperty("customAnnotatorClass.stopwords", StopwordsAnnotator.class.getCanonicalName());
 		props.setProperty("customAnnotatorClass.frequency", FrequencyAnnotator.class.getCanonicalName());
 		// tokenize: transform words to tokens
@@ -42,25 +42,25 @@ public class CoreNLPProcessor extends Processor {
 	}
 
 	@Override
-	public ProcessedText process(String input) throws ProcessorException {
-		Annotation doc = new Annotation(input.toLowerCase());
+	public ProcessedText process(final String input) throws ProcessorException {
+		final Annotation doc = new Annotation(input.toLowerCase());
 		nlp.annotate(doc);
-		StringBuilder sb = new StringBuilder();
+		final StringBuilder sb = new StringBuilder();
 		long wordCount = 0;
 		// loop sentences
-		for (CoreMap sentence : doc.get(SentencesAnnotation.class)) {
-			List<CoreLabel> words = sentence.get(TokensAnnotation.class);
+		for (final CoreMap sentence : doc.get(SentencesAnnotation.class)) {
+			final List<CoreLabel> words = sentence.get(TokensAnnotation.class);
 			// count words
 			wordCount += words.size();
 			// loop words
-			for (CoreLabel word : words) {
+			for (final CoreLabel word : words) {
 				// filter out stopwords
-				Boolean b = word.get(StopwordsAnnotator.class);
+				final Boolean b = word.get(StopwordsAnnotator.class);
 				if (b == null || !b) {
 					// filter out infrequent words
-					Long count = word.get(FrequencyAnnotator.class);
+					final Long count = word.get(FrequencyAnnotator.class);
 					if (count != null && count >= Constants.DOCUMENT_MIN_WORD_FREQ) {
-						String lemma = word.get(LemmaAnnotation.class);
+						final String lemma = word.get(LemmaAnnotation.class);
 						// collect unique words
 						sb.append(lemma).append(" ");
 					}
@@ -68,7 +68,7 @@ public class CoreNLPProcessor extends Processor {
 			}
 		}
 
-		String text = clean(sb.toString());
+		final String text = clean(sb.toString());
 		return new ProcessedText(text, wordCount);
 	}
 
diff --git a/vipra-cmd/src/main/java/de/vipra/cmd/text/FrequencyAnnotator.java b/vipra-cmd/src/main/java/de/vipra/cmd/text/FrequencyAnnotator.java
index ae39104e90f29e498ce4816b7ff5395f8d5b24fb..78a41473997b01732c3535d855b9e675108cd394 100644
--- a/vipra-cmd/src/main/java/de/vipra/cmd/text/FrequencyAnnotator.java
+++ b/vipra-cmd/src/main/java/de/vipra/cmd/text/FrequencyAnnotator.java
@@ -18,11 +18,11 @@ public class FrequencyAnnotator implements Annotator, CoreAnnotation<Long> {
 	public static final String NAME = "frequency";
 
 	@Override
-	public void annotate(Annotation annotation) {
-		List<CoreLabel> tokens = annotation.get(TokensAnnotation.class);
-		Map<String, Long> words = tokens.stream()
+	public void annotate(final Annotation annotation) {
+		final List<CoreLabel> tokens = annotation.get(TokensAnnotation.class);
+		final Map<String, Long> words = tokens.stream()
 				.collect(Collectors.groupingBy(p -> p.get(LemmaAnnotation.class), Collectors.counting()));
-		for (CoreLabel token : tokens) {
+		for (final CoreLabel token : tokens) {
 			token.set(FrequencyAnnotator.class, words.get(token.get(LemmaAnnotation.class)));
 		}
 	}
diff --git a/vipra-cmd/src/main/java/de/vipra/cmd/text/ProcessedText.java b/vipra-cmd/src/main/java/de/vipra/cmd/text/ProcessedText.java
index dcc842518205229beb8fca4f9bf5e3d94a437e3b..9c495434a2327b48c473471ff3546dbf7a7b400f 100644
--- a/vipra-cmd/src/main/java/de/vipra/cmd/text/ProcessedText.java
+++ b/vipra-cmd/src/main/java/de/vipra/cmd/text/ProcessedText.java
@@ -7,7 +7,7 @@ public class ProcessedText {
 	private final long reducedWordCount;
 	private final double reductionRatio;
 
-	public ProcessedText(String text, long wordCount) {
+	public ProcessedText(final String text, final long wordCount) {
 		this.words = text.split("\\s+");
 		this.originalWordCount = wordCount;
 		this.reducedWordCount = this.words.length;
diff --git a/vipra-cmd/src/main/java/de/vipra/cmd/text/Processor.java b/vipra-cmd/src/main/java/de/vipra/cmd/text/Processor.java
index 6ea52b604972b155160ccdbfd00bbb64d6225d3a..db4b9ca4dbde696c7be763ad45d2a1b0801a7056 100644
--- a/vipra-cmd/src/main/java/de/vipra/cmd/text/Processor.java
+++ b/vipra-cmd/src/main/java/de/vipra/cmd/text/Processor.java
@@ -10,7 +10,7 @@ public abstract class Processor {
 
 	private final String name;
 
-	public Processor(String name) {
+	public Processor(final String name) {
 		this.name = name;
 	}
 
@@ -20,8 +20,8 @@ public abstract class Processor {
 
 	public abstract ProcessedText process(String input) throws ProcessorException;
 
-	public static Processor getProcessor(Config config) {
-		List<String> stopWords = Constants.STOPWORDS;
+	public static Processor getProcessor(final Config config) {
+		final List<String> stopWords = Constants.STOPWORDS;
 
 		switch (config.processor) {
 			case CORENLP:
@@ -31,7 +31,7 @@ public abstract class Processor {
 		}
 	}
 
-	public static String clean(String in) {
+	public static String clean(final String in) {
 		return in.replaceAll(Constants.REGEX_EMAIL, "").replaceAll(Constants.REGEX_URL, "")
 				.replaceAll(Constants.REGEX_NUMBER, "").replaceAll(Constants.CHARS_DISALLOWED, "")
 				.replaceAll(Constants.REGEX_SINGLECHAR, "").replaceAll("\\s+", " ").trim();
diff --git a/vipra-cmd/src/main/java/de/vipra/cmd/text/StopwordsAnnotator.java b/vipra-cmd/src/main/java/de/vipra/cmd/text/StopwordsAnnotator.java
index 42185b9acbce33159c4d67c7e97c33ec10705463..0157f41fd941c92e7b6d3285b3197a26d32731c3 100644
--- a/vipra-cmd/src/main/java/de/vipra/cmd/text/StopwordsAnnotator.java
+++ b/vipra-cmd/src/main/java/de/vipra/cmd/text/StopwordsAnnotator.java
@@ -17,16 +17,16 @@ public class StopwordsAnnotator implements Annotator, CoreAnnotation<Boolean> {
 
 	public static final String NAME = "stopwords";
 
-	private Set<String> stopWords;
+	private final Set<String> stopWords;
 
-	public StopwordsAnnotator(String input, Properties props) {
+	public StopwordsAnnotator(final String input, final Properties props) {
 		stopWords = new HashSet<String>(Arrays.asList(props.getProperty(NAME).split(" ")));
 		stopWords.addAll(Arrays.asList("-LRB-", "-RRB-", "-LSB-", "-RSB-", "-LCB-", "-RCB-"));
 	}
 
 	@Override
-	public void annotate(Annotation annotation) {
-		List<CoreLabel> tokens = annotation.get(TokensAnnotation.class);
+	public void annotate(final Annotation annotation) {
+		final List<CoreLabel> tokens = annotation.get(TokensAnnotation.class);
 		tokens.stream().filter(t -> stopWords.contains(t.word())).forEach(t -> t.set(StopwordsAnnotator.class, true));
 	}
 
diff --git a/vipra-util/.settings/org.eclipse.jdt.ui.prefs b/vipra-util/.settings/org.eclipse.jdt.ui.prefs
index 5713c654549b40f76104760ab2f6cd031d71f011..67b3835098d95ab9541c4dbdc4cb4c5dd04ea5b5 100644
--- a/vipra-util/.settings/org.eclipse.jdt.ui.prefs
+++ b/vipra-util/.settings/org.eclipse.jdt.ui.prefs
@@ -1,3 +1,62 @@
+cleanup.add_default_serial_version_id=true
+cleanup.add_generated_serial_version_id=false
+cleanup.add_missing_annotations=true
+cleanup.add_missing_deprecated_annotations=true
+cleanup.add_missing_methods=false
+cleanup.add_missing_nls_tags=false
+cleanup.add_missing_override_annotations=true
+cleanup.add_missing_override_annotations_interface_methods=true
+cleanup.add_serial_version_id=false
+cleanup.always_use_blocks=true
+cleanup.always_use_parentheses_in_expressions=false
+cleanup.always_use_this_for_non_static_field_access=false
+cleanup.always_use_this_for_non_static_method_access=false
+cleanup.convert_functional_interfaces=false
+cleanup.convert_to_enhanced_for_loop=true
+cleanup.correct_indentation=true
+cleanup.format_source_code=true
+cleanup.format_source_code_changes_only=false
+cleanup.insert_inferred_type_arguments=false
+cleanup.make_local_variable_final=true
+cleanup.make_parameters_final=true
+cleanup.make_private_fields_final=true
+cleanup.make_type_abstract_if_missing_method=false
+cleanup.make_variable_declarations_final=true
+cleanup.never_use_blocks=false
+cleanup.never_use_parentheses_in_expressions=true
+cleanup.organize_imports=true
+cleanup.qualify_static_field_accesses_with_declaring_class=false
+cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+cleanup.qualify_static_member_accesses_with_declaring_class=true
+cleanup.qualify_static_method_accesses_with_declaring_class=false
+cleanup.remove_private_constructors=true
+cleanup.remove_redundant_type_arguments=true
+cleanup.remove_trailing_whitespaces=true
+cleanup.remove_trailing_whitespaces_all=true
+cleanup.remove_trailing_whitespaces_ignore_empty=false
+cleanup.remove_unnecessary_casts=true
+cleanup.remove_unnecessary_nls_tags=true
+cleanup.remove_unused_imports=true
+cleanup.remove_unused_local_variables=false
+cleanup.remove_unused_private_fields=true
+cleanup.remove_unused_private_members=false
+cleanup.remove_unused_private_methods=true
+cleanup.remove_unused_private_types=true
+cleanup.sort_members=false
+cleanup.sort_members_all=false
+cleanup.use_anonymous_class_creation=false
+cleanup.use_blocks=false
+cleanup.use_blocks_only_for_return_and_throw=false
+cleanup.use_lambda=true
+cleanup.use_parentheses_in_expressions=false
+cleanup.use_this_for_non_static_field_access=false
+cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+cleanup.use_this_for_non_static_method_access=false
+cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+cleanup.use_type_arguments=false
+cleanup_profile=_vipra
+cleanup_settings_version=2
 eclipse.preferences.version=1
 formatter_profile=_vipra
 formatter_settings_version=12
diff --git a/vipra-util/src/main/java/de/vipra/util/BuildInfo.java b/vipra-util/src/main/java/de/vipra/util/BuildInfo.java
index befee3124c23557728bdff9007d16c1ac111c13b..7489aa05dc2d27db3c03fc2ef87ef4ef106c162f 100644
--- a/vipra-util/src/main/java/de/vipra/util/BuildInfo.java
+++ b/vipra-util/src/main/java/de/vipra/util/BuildInfo.java
@@ -10,17 +10,17 @@ public class BuildInfo {
 
 	private static Properties getProperties() {
 		if (properties == null) {
-			InputStream inputStream = FileUtils.getResource("buildNumber.properties");
+			final InputStream inputStream = FileUtils.getResource("buildNumber.properties");
 			properties = new Properties();
 			try {
 				properties.load(inputStream);
-			} catch (IOException e) {
+			} catch (final IOException e) {
 				throw new RuntimeException("Failed to read properties file", e);
 			} finally {
 				if (inputStream != null) {
 					try {
 						inputStream.close();
-					} catch (IOException e) {
+					} catch (final IOException e) {
 						// Ignore
 					}
 				}
@@ -35,7 +35,7 @@ public class BuildInfo {
 	private final String buildDate;
 
 	public BuildInfo() {
-		Properties props = getProperties();
+		final Properties props = getProperties();
 		this.gitSHA1 = props.getProperty("git-sha-1");
 		this.version = props.getProperty("version");
 		this.buildDate = props.getProperty("builddate");
diff --git a/vipra-util/src/main/java/de/vipra/util/CalendarUtils.java b/vipra-util/src/main/java/de/vipra/util/CalendarUtils.java
index f504b9e25de07dbe43dfb0a012c7d09b4c0fe366..bab86af0e9777f7dabf6c3b87fb1135e3d263e66 100644
--- a/vipra-util/src/main/java/de/vipra/util/CalendarUtils.java
+++ b/vipra-util/src/main/java/de/vipra/util/CalendarUtils.java
@@ -10,12 +10,12 @@ public class CalendarUtils {
 	/**
 	 * Returns the quarter of the passed calendar. Months are turned into
 	 * quarters of 4: Jan-Mar: 1, Apr-Jun: 2, Jul-Sep: 3, Oct:Dec: 4.
-	 * 
+	 *
 	 * @param c
 	 *            the calendar to be used
 	 * @return the quarter of the calendar month
 	 */
-	public static final int getQuarter(Calendar c) {
+	public static final int getQuarter(final Calendar c) {
 		return (int) Math.ceil(c.get(Calendar.MONTH) / 3.0);
 	}
 
diff --git a/vipra-util/src/main/java/de/vipra/util/Config.java b/vipra-util/src/main/java/de/vipra/util/Config.java
index 0b1244d23fb8326d2feaa7114b3c595af356d3b3..849819b8a6d0adc7b787e38d2bf73c1f0e77a14b 100644
--- a/vipra-util/src/main/java/de/vipra/util/Config.java
+++ b/vipra-util/src/main/java/de/vipra/util/Config.java
@@ -103,17 +103,17 @@ public class Config {
 	private static int printMaxFieldNameLength = 0;
 
 	static {
-		Map<String, Field> foundFields = new HashMap<>();
+		final Map<String, Field> foundFields = new HashMap<>();
 
-		for (Field field : Config.class.getDeclaredFields()) {
-			int modifiers = field.getModifiers();
+		for (final Field field : Config.class.getDeclaredFields()) {
+			final int modifiers = field.getModifiers();
 			if (Modifier.isFinal(modifiers))
 				continue;
 
 			if (!field.isAccessible())
 				field.setAccessible(true);
 
-			ConfigKey ck = field.getDeclaredAnnotation(ConfigKey.class);
+			final ConfigKey ck = field.getDeclaredAnnotation(ConfigKey.class);
 			if (ck == null)
 				continue;
 
@@ -138,20 +138,20 @@ public class Config {
 		InputStream in = null;
 
 		// config from environment
-		String configPath = System.getenv("VIPRA_CONFIG");
+		final String configPath = System.getenv("VIPRA_CONFIG");
 		if (configPath != null && configPath.length() > 0) {
-			File file = new File(configPath);
+			final File file = new File(configPath);
 			if (file.exists() && file.isFile()) {
-				in = FileUtils.openInputStream(file);
+				in = org.apache.commons.io.FileUtils.openInputStream(file);
 			}
 		}
 
 		// config from generic config dir
-		File configDir = getGenericConfigDir();
+		final File configDir = getGenericConfigDir();
 		if (configDir != null && configDir.exists() && configDir.isDirectory()) {
-			File file = new File(configDir, Constants.CONFIG_FILE);
+			final File file = new File(configDir, Constants.CONFIG_FILE);
 			if (file.exists() && file.isFile()) {
-				in = FileUtils.openInputStream(file);
+				in = org.apache.commons.io.FileUtils.openInputStream(file);
 			}
 		}
 
@@ -169,12 +169,12 @@ public class Config {
 		}
 
 		// read values
-		for (Entry<String, Field> entry : fields) {
-			String value = props.getProperty(entry.getKey());
+		for (final Entry<String, Field> entry : fields) {
+			final String value = props.getProperty(entry.getKey());
 			if (value != null) {
 				Object parsedValue = null;
 				try {
-					Class<?> clazz = entry.getValue().getType();
+					final Class<?> clazz = entry.getValue().getType();
 					if (clazz == String.class) {
 						parsedValue = value;
 					} else if (clazz == Boolean.class || clazz == Boolean.TYPE) {
@@ -212,7 +212,7 @@ public class Config {
 					}
 
 					entry.getValue().set(this, parsedValue);
-				} catch (Exception e) {
+				} catch (final Exception e) {
 					log.error("could not read config value " + entry.getKey(), e);
 				}
 			}
@@ -222,12 +222,12 @@ public class Config {
 	/**
 	 * Returns the data directory used for topic modeling and configuration
 	 * storage
-	 * 
+	 *
 	 * @return the data directory to be used
 	 * @throws ConfigException
 	 */
 	public File getDataDirectory() throws ConfigException {
-		File dataDir = getGenericDataDir();
+		final File dataDir = getGenericDataDir();
 
 		if (!dataDir.exists()) {
 			if (!dataDir.mkdirs()) {
@@ -240,7 +240,7 @@ public class Config {
 
 	/**
 	 * Returns a representation of the used mongodb connection
-	 * 
+	 *
 	 * @return mongo connection
 	 * @throws ConfigException
 	 */
@@ -250,20 +250,20 @@ public class Config {
 
 	/**
 	 * Create a database service abstraction to interact with the database.
-	 * 
+	 *
 	 * @param clazz
 	 *            the DAO class, extending Model
 	 * @return the database service
 	 * @throws ConfigException
 	 */
-	public <Type extends Model<IdType>, IdType> MongoService<Type, IdType> getDatabaseService(Class<Type> clazz)
+	public <Type extends Model<IdType>, IdType> MongoService<Type, IdType> getDatabaseService(final Class<Type> clazz)
 			throws ConfigException {
 		return MongoService.getDatabaseService(this, clazz);
 	}
 
 	/**
 	 * Prints out the current configuration values
-	 * 
+	 *
 	 * @param out
 	 *            OutputStream to be used for printing. Usually System.out
 	 * @param prefix
@@ -279,14 +279,15 @@ public class Config {
 	 * @param padChar
 	 *            the pad character to be used for padding, if enabled
 	 */
-	public void print(OutputStream out, String prefix, String separator, boolean pad, boolean padRight, char padChar) {
-		PrintWriter pw = new PrintWriter(out);
-		String padding = padChar + "";
-		for (Entry<String, Field> e : fields) {
+	public void print(final OutputStream out, final String prefix, final String separator, final boolean pad,
+			final boolean padRight, final char padChar) {
+		final PrintWriter pw = new PrintWriter(out);
+		final String padding = padChar + "";
+		for (final Entry<String, Field> e : fields) {
 			try {
 				String key = e.getKey() + separator;
 				if (pad) {
-					int diff = printMaxFieldNameLength - e.getKey().length();
+					final int diff = printMaxFieldNameLength - e.getKey().length();
 					if (diff > 0) {
 						if (padRight)
 							key = e.getKey() + StringUtils.repeat(padding, diff) + separator;
@@ -302,27 +303,27 @@ public class Config {
 
 	/**
 	 * Returns a generic data directory, if none is configured.
-	 * 
+	 *
 	 * @return generic data directory
 	 */
 	public static File getGenericDataDir() {
-		File base = PathUtils.appDataDir();
+		final File base = PathUtils.appDataDir();
 		return new File(base, Constants.FILEBASE_DIR);
 	}
 
 	/**
 	 * Returns a generic config directory, if none is configured.
-	 * 
+	 *
 	 * @return generic config directory
 	 */
 	public static File getGenericConfigDir() {
-		File base = PathUtils.appConfigDir();
+		final File base = PathUtils.appConfigDir();
 		return new File(base, Constants.FILEBASE_DIR);
 	}
 
 	/**
 	 * Config class is a singleton. This method returns its instantiation.
-	 * 
+	 *
 	 * @return config object instantiation
 	 * @throws IOException
 	 *             if reading the config file fails
diff --git a/vipra-util/src/main/java/de/vipra/util/ConsoleUtils.java b/vipra-util/src/main/java/de/vipra/util/ConsoleUtils.java
index 05741bc111962e83ba7cd07d408997394f57e40d..f24878cde607405dbc7a6ebf2f67ec318a374961 100644
--- a/vipra-util/src/main/java/de/vipra/util/ConsoleUtils.java
+++ b/vipra-util/src/main/java/de/vipra/util/ConsoleUtils.java
@@ -25,14 +25,14 @@ public class ConsoleUtils {
 		public final String choice;
 		public final String shortChoice;
 
-		Choice(String choice, String shortChoice) {
+		Choice(final String choice, final String shortChoice) {
 			this.choice = choice;
 			this.shortChoice = shortChoice;
 		}
 
-		public static Choice fromString(String text) {
+		public static Choice fromString(final String text) {
 			if (text != null) {
-				for (Choice b : Choice.values()) {
+				for (final Choice b : Choice.values()) {
 					if (text.equalsIgnoreCase(b.choice) || text.equalsIgnoreCase(b.shortChoice)) {
 						return b;
 					}
@@ -49,14 +49,14 @@ public class ConsoleUtils {
 
 	/**
 	 * Read a line from the console
-	 * 
+	 *
 	 * @return read line, without newline character
 	 */
 	public static String readLine() {
-		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
+		final BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
 		try {
 			return in.readLine();
-		} catch (IOException e) {
+		} catch (final IOException e) {
 			log.error("io error while reading line from console: " + e.getMessage());
 			return "";
 		}
@@ -64,20 +64,20 @@ public class ConsoleUtils {
 
 	/**
 	 * Request user confirmation
-	 * 
+	 *
 	 * @param confirm
 	 *            the confirm string, has to be typed in by the user
 	 * @return wether user input matches confirm string
 	 */
-	public static boolean confirm(String confirm) {
+	public static boolean confirm(final String confirm) {
 		System.out.print("> ");
-		String in = readLine().toLowerCase().trim();
+		final String in = readLine().toLowerCase().trim();
 		return in.equals(confirm);
 	}
 
 	/**
 	 * Promt a user choice from multiple options
-	 * 
+	 *
 	 * @param choice
 	 *            default choice
 	 * @param acceptDefault
@@ -86,10 +86,10 @@ public class ConsoleUtils {
 	 *            all choices that can be selected
 	 * @return the selected choice
 	 */
-	public static String prompt(String choice, boolean acceptDefault, String... choices) {
+	public static String prompt(final String choice, final boolean acceptDefault, final String... choices) {
 		if (acceptDefault && choice != null)
 			return choice;
-		Set<String> set = new LinkedHashSet<>(Arrays.asList(choices));
+		final Set<String> set = new LinkedHashSet<>(Arrays.asList(choices));
 		if (choice != null)
 			set.add(choice);
 		String msg = "(" + StringUtils.join(set, ",") + "): ";
@@ -97,7 +97,7 @@ public class ConsoleUtils {
 			msg = "[" + choice + "] " + msg;
 		}
 		System.out.print(msg);
-		String in = readLine().toLowerCase().trim();
+		final String in = readLine().toLowerCase().trim();
 		if (set.contains(in)) {
 			return in;
 		}
@@ -108,7 +108,7 @@ public class ConsoleUtils {
 
 	/**
 	 * Promt a user choice from multiple options
-	 * 
+	 *
 	 * @param choice
 	 *            default choice
 	 * @param acceptDefault
@@ -117,7 +117,7 @@ public class ConsoleUtils {
 	 *            all choices that can be selected
 	 * @return the selected choice
 	 */
-	public static Choice prompt(Choice choice, boolean acceptDefault, Choice... choices) {
+	public static Choice prompt(final Choice choice, final boolean acceptDefault, final Choice... choices) {
 		return Choice.fromString(
 				prompt(choice != null ? choice.choice : null, acceptDefault, ListUtils.toStringArray(choices)));
 	}
diff --git a/vipra-util/src/main/java/de/vipra/util/Constants.java b/vipra-util/src/main/java/de/vipra/util/Constants.java
index c719c6785a2f4827d9f027e1ccc70a811231a650..2d3d58d09d9122f9e855a12b0a8d4131eff1fcb1 100644
--- a/vipra-util/src/main/java/de/vipra/util/Constants.java
+++ b/vipra-util/src/main/java/de/vipra/util/Constants.java
@@ -247,11 +247,11 @@ public class Constants {
 
 		public final String name;
 
-		private Processor(String name) {
+		private Processor(final String name) {
 			this.name = name;
 		}
 
-		private Processor(Processor def) {
+		private Processor(final Processor def) {
 			this.name = def.name;
 		}
 
@@ -259,9 +259,9 @@ public class Constants {
 			return CORENLP;
 		}
 
-		public static Processor fromString(String text) {
+		public static Processor fromString(final String text) {
 			if (text != null) {
-				for (Processor b : Processor.values()) {
+				for (final Processor b : Processor.values()) {
 					if (text.equalsIgnoreCase(b.name)) {
 						return b;
 					}
@@ -280,11 +280,11 @@ public class Constants {
 
 		public final String name;
 
-		private Analyzer(String name) {
+		private Analyzer(final String name) {
 			this.name = name;
 		}
 
-		private Analyzer(Analyzer def) {
+		private Analyzer(final Analyzer def) {
 			this.name = def.name;
 		}
 
@@ -292,9 +292,9 @@ public class Constants {
 			return DTM;
 		}
 
-		public static Analyzer fromString(String text) {
+		public static Analyzer fromString(final String text) {
 			if (text != null) {
-				for (Analyzer b : Analyzer.values()) {
+				for (final Analyzer b : Analyzer.values()) {
 					if (text.equalsIgnoreCase(b.name)) {
 						return b;
 					}
@@ -314,16 +314,16 @@ public class Constants {
 
 		public final String name;
 
-		private WindowResolution(String name) {
+		private WindowResolution(final String name) {
 			this.name = name;
 		}
 
-		private WindowResolution(WindowResolution def) {
+		private WindowResolution(final WindowResolution def) {
 			this.name = def.name;
 		}
 
-		public String fromDate(Date date) {
-			Calendar c = new GregorianCalendar();
+		public String fromDate(final Date date) {
+			final Calendar c = new GregorianCalendar();
 			c.setTime(date);
 			String str = c.get(Calendar.YEAR) + "";
 			switch (this) {
@@ -331,7 +331,7 @@ public class Constants {
 					str += "-" + CalendarUtils.getQuarter(c);
 					break;
 				case MONTHLY:
-					int month = c.get(Calendar.MONTH);
+					final int month = c.get(Calendar.MONTH);
 					str += "-" + (month < 10 ? "0" : "") + month;
 					break;
 				default:
@@ -344,9 +344,9 @@ public class Constants {
 			return YEARLY;
 		}
 
-		public static WindowResolution fromString(String text) {
+		public static WindowResolution fromString(final String text) {
 			if (text != null) {
-				for (WindowResolution b : WindowResolution.values()) {
+				for (final WindowResolution b : WindowResolution.values()) {
 					if (text.equalsIgnoreCase(b.name)) {
 						return b;
 					}
diff --git a/vipra-util/src/main/java/de/vipra/util/CountMap.java b/vipra-util/src/main/java/de/vipra/util/CountMap.java
index 7de5817e701f397457324c783322c653ccbc59af..bd66f6ec38e358bfa3710ce22916058591528807 100644
--- a/vipra-util/src/main/java/de/vipra/util/CountMap.java
+++ b/vipra-util/src/main/java/de/vipra/util/CountMap.java
@@ -13,16 +13,16 @@ public class CountMap<T> {
 		this.map = new HashMap<>();
 	}
 
-	public CountMap(Map<T, Integer> map) {
+	public CountMap(final Map<T, Integer> map) {
 		this.map = map;
 	}
 
-	public void count(T t) {
+	public void count(final T t) {
 		count(t, 1);
 	}
 
-	public void count(T t, int add) {
-		Integer count = map.get(t);
+	public void count(final T t, final int add) {
+		final Integer count = map.get(t);
 		if (count == null)
 			map.put(t, add);
 		else
@@ -37,7 +37,7 @@ public class CountMap<T> {
 		return map.size();
 	}
 
-	public Integer get(T key) {
+	public Integer get(final T key) {
 		return map.get(key);
 	}
 
diff --git a/vipra-util/src/main/java/de/vipra/util/ESClient.java b/vipra-util/src/main/java/de/vipra/util/ESClient.java
index e58d0dcd13f05ceb6b2ed3d7b119092d39fa5a62..e901af4c570f223f7346be6644373887f6cb8ab2 100644
--- a/vipra-util/src/main/java/de/vipra/util/ESClient.java
+++ b/vipra-util/src/main/java/de/vipra/util/ESClient.java
@@ -15,13 +15,13 @@ public abstract class ESClient {
 
 	/**
 	 * get a elasticsearch transport client
-	 * 
+	 *
 	 * @param config
 	 *            application configuration singleton
 	 * @return elasticsearch transport client
 	 * @throws UnknownHostException
 	 */
-	public static TransportClient getClient(Config config) throws UnknownHostException {
+	public static TransportClient getClient(final Config config) throws UnknownHostException {
 		if (client == null) {
 			client = TransportClient.builder().build().addTransportAddress(new InetSocketTransportAddress(
 					InetAddress.getByName(config.elasticsearchHost), config.elasticsearchPort));
diff --git a/vipra-util/src/main/java/de/vipra/util/ESSerializer.java b/vipra-util/src/main/java/de/vipra/util/ESSerializer.java
index 333eb1e95a4a0d4b45797118e65f35e8b21aed70..032751e66d6950fd17073289dcdf5eaf4ae17a9a 100644
--- a/vipra-util/src/main/java/de/vipra/util/ESSerializer.java
+++ b/vipra-util/src/main/java/de/vipra/util/ESSerializer.java
@@ -13,19 +13,19 @@ import de.vipra.util.an.ElasticIndex;
 
 public class ESSerializer<T> {
 
-	private Set<Entry<String, Field>> fields;
-	private Set<Entry<String, Method>> methods;
+	private final Set<Entry<String, Field>> fields;
+	private final Set<Entry<String, Method>> methods;
 
-	public ESSerializer(Class<T> clazz) {
-		Map<String, Field> foundFields = new HashMap<>();
-		Map<String, Method> foundMethods = new HashMap<>();
+	public ESSerializer(final Class<T> clazz) {
+		final Map<String, Field> foundFields = new HashMap<>();
+		final Map<String, Method> foundMethods = new HashMap<>();
 
-		for (Field field : clazz.getDeclaredFields()) {
+		for (final Field field : clazz.getDeclaredFields()) {
 			if (!Modifier.isStatic(field.getModifiers())) {
 				if (!field.isAccessible())
 					field.setAccessible(true);
 
-				ElasticIndex ei = field.getDeclaredAnnotation(ElasticIndex.class);
+				final ElasticIndex ei = field.getDeclaredAnnotation(ElasticIndex.class);
 				if (ei == null)
 					continue;
 
@@ -33,12 +33,12 @@ public class ESSerializer<T> {
 			}
 		}
 
-		for (Method method : clazz.getDeclaredMethods()) {
+		for (final Method method : clazz.getDeclaredMethods()) {
 			if (!Modifier.isStatic(method.getModifiers()) && method.getParameterCount() == 0) {
 				if (!method.isAccessible())
 					method.setAccessible(true);
 
-				ElasticIndex ei = method.getDeclaredAnnotation(ElasticIndex.class);
+				final ElasticIndex ei = method.getDeclaredAnnotation(ElasticIndex.class);
 				if (ei == null)
 					continue;
 
@@ -50,16 +50,16 @@ public class ESSerializer<T> {
 		this.methods = foundMethods.entrySet();
 	}
 
-	public Map<String, Object> serialize(T t) {
-		Map<String, Object> values = new HashMap<>();
-		for (Entry<String, Field> e : fields) {
+	public Map<String, Object> serialize(final T t) {
+		final Map<String, Object> values = new HashMap<>();
+		for (final Entry<String, Field> e : fields) {
 			try {
 				values.put(e.getKey(), e.getValue().get(t));
 			} catch (IllegalArgumentException | IllegalAccessException e1) {
 				throw new RuntimeException("could not serialize field value " + e.getKey(), e1);
 			}
 		}
-		for (Entry<String, Method> m : methods) {
+		for (final Entry<String, Method> m : methods) {
 			try {
 				values.put(m.getKey(), m.getValue().invoke(t));
 			} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e1) {
diff --git a/vipra-util/src/main/java/de/vipra/util/EnumTools.java b/vipra-util/src/main/java/de/vipra/util/EnumTools.java
index 9afa4e8a16b3b663e01b40284ddf79c642023c90..0bc760f5b99d9fdb39c7b8d6e411a42f83c453a9 100644
--- a/vipra-util/src/main/java/de/vipra/util/EnumTools.java
+++ b/vipra-util/src/main/java/de/vipra/util/EnumTools.java
@@ -7,15 +7,15 @@ public class EnumTools {
 
 	/**
 	 * Finds an enum value by its name, ignoring case.
-	 * 
+	 *
 	 * @param enumeration
 	 *            Enum to be searched
 	 * @param search
 	 *            Enum value to be searched
 	 * @return the found enum value, or null
 	 */
-	public static <T extends Enum<?>> T searchEnum(Class<T> enumeration, String search) {
-		for (T each : enumeration.getEnumConstants()) {
+	public static <T extends Enum<?>> T searchEnum(final Class<T> enumeration, final String search) {
+		for (final T each : enumeration.getEnumConstants()) {
 			if (each.name().compareToIgnoreCase(search) == 0) {
 				return each;
 			}
diff --git a/vipra-util/src/main/java/de/vipra/util/FileUtils.java b/vipra-util/src/main/java/de/vipra/util/FileUtils.java
index 03b22281138b4646bb2c5bf840a531dcb2b0fc8b..78534524ae444d16977a5735547b4c4054f759d5 100644
--- a/vipra-util/src/main/java/de/vipra/util/FileUtils.java
+++ b/vipra-util/src/main/java/de/vipra/util/FileUtils.java
@@ -18,21 +18,21 @@ public class FileUtils extends org.apache.commons.io.FileUtils {
 	public static final boolean isJAR;
 
 	static {
-		String classResource = FileUtils.class.getResource("FileUtils.class").toString();
+		final String classResource = FileUtils.class.getResource("FileUtils.class").toString();
 		isJAR = classResource.startsWith("jar:");
 	}
 
 	/**
 	 * If this method is run from within a runnable jar, returns the runnable
 	 * jar file, else null
-	 * 
+	 *
 	 * @return jar file or null
 	 */
 	public static File getJAR() {
 		if (isJAR)
 			try {
 				return new File(FileUtils.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());
-			} catch (URISyntaxException e) {
+			} catch (final URISyntaxException e) {
 				e.printStackTrace();
 			}
 		return null;
@@ -42,17 +42,17 @@ public class FileUtils extends org.apache.commons.io.FileUtils {
 	 * returns a File object, relative to this class. This is execution
 	 * sensitive. If this method is called from within a runnable jar file, the
 	 * file path is relative to the jar file.
-	 * 
+	 *
 	 * @param relPath
 	 *            the relative path to the file
 	 * @return found file or null
 	 */
-	public static File getFile(String relPath) {
+	public static File getFile(final String relPath) {
 		try {
-			File thisFile = new File(
+			final File thisFile = new File(
 					FileUtils.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());
 			return new File(thisFile.getParent(), relPath);
-		} catch (URISyntaxException e) {
+		} catch (final URISyntaxException e) {
 			e.printStackTrace();
 		}
 		return null;
@@ -60,26 +60,26 @@ public class FileUtils extends org.apache.commons.io.FileUtils {
 
 	/**
 	 * Reads a file and returns a list of lines
-	 * 
+	 *
 	 * @param file
 	 *            the file to be read
 	 * @return list of lines
 	 * @throws IOException
 	 */
-	public static List<String> readFile(File file) throws IOException {
+	public static List<String> readFile(final File file) throws IOException {
 		return Files.readAllLines(Paths.get(file.getAbsolutePath()), Constants.FILEBASE_ENCODING);
 	}
 
 	/**
 	 * Returns a resource file. Resource files are stored in various locations,
 	 * depending on execution schema (direct execution, runnable jar etc.)
-	 * 
+	 *
 	 * @param name
 	 *            name of resource
 	 * @Param clazz class to use to retrieve resource
 	 * @return resource or null
 	 */
-	public static InputStream getResource(String name, Class<?> clazz) {
+	public static InputStream getResource(String name, final Class<?> clazz) {
 		while (name.startsWith("/"))
 			name = name.substring(1);
 		InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(name);
@@ -98,20 +98,20 @@ public class FileUtils extends org.apache.commons.io.FileUtils {
 	/**
 	 * @see {@link FileUtils#getResource(String, Class)}
 	 */
-	public static InputStream getResource(String name) {
+	public static InputStream getResource(final String name) {
 		return getResource(name, null);
 	}
 
 	/**
 	 * Counts the lines in a file
-	 * 
+	 *
 	 * @param file
 	 *            the file to be opened
 	 * @return line count of file
 	 * @throws IOException
 	 */
-	public static int countLines(File file) throws IOException {
-		BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
+	public static int countLines(final File file) throws IOException {
+		final BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
 		int lines = 0;
 		while (reader.readLine() != null)
 			lines++;
@@ -122,13 +122,13 @@ public class FileUtils extends org.apache.commons.io.FileUtils {
 	/**
 	 * Iterates the lines of a file. Closes the reader automatically when it
 	 * hits the end of the file
-	 * 
+	 *
 	 * @param file
 	 *            the file to be read
 	 * @return iterator over file lines
 	 * @throws FileNotFoundException
 	 */
-	public static Iterator<String> iterateFileLines(File file) throws FileNotFoundException {
+	public static Iterator<String> iterateFileLines(final File file) throws FileNotFoundException {
 		return (new Iterator<String>() {
 
 			private BufferedReader reader;
@@ -143,14 +143,14 @@ public class FileUtils extends org.apache.commons.io.FileUtils {
 					nextLine = null;
 					try {
 						nextLine = reader.readLine();
-					} catch (IOException e1) {
+					} catch (final IOException e1) {
 						e1.printStackTrace();
 					}
 					next = nextLine != null;
 					if (!next)
 						try {
 							reader.close();
-						} catch (IOException e) {
+						} catch (final IOException e) {
 							e.printStackTrace();
 						}
 				}
@@ -162,7 +162,7 @@ public class FileUtils extends org.apache.commons.io.FileUtils {
 				return nextLine;
 			}
 
-			public Iterator<String> init(File file) throws FileNotFoundException {
+			public Iterator<String> init(final File file) throws FileNotFoundException {
 				reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
 				return this;
 			}
diff --git a/vipra-util/src/main/java/de/vipra/util/ListUtils.java b/vipra-util/src/main/java/de/vipra/util/ListUtils.java
index 8daf6a8a59d8b8f9ecee92a336ef7696a2a30970..a8363c5b06275e91b1056d3482f001e60d296161 100644
--- a/vipra-util/src/main/java/de/vipra/util/ListUtils.java
+++ b/vipra-util/src/main/java/de/vipra/util/ListUtils.java
@@ -7,24 +7,24 @@ import java.util.Set;
 
 public class ListUtils {
 
-	public static <T> List<T> removeDuplicates(List<T> list) {
-		Set<T> set = new LinkedHashSet<>(list);
+	public static <T> List<T> removeDuplicates(final List<T> list) {
+		final Set<T> set = new LinkedHashSet<>(list);
 		list.clear();
 		list.addAll(set);
 		return list;
 	}
 
-	public static String[] toStringArray(Object[] array) {
-		String[] strings = new String[array.length];
+	public static String[] toStringArray(final Object[] array) {
+		final String[] strings = new String[array.length];
 		for (int i = 0; i < array.length; i++) {
 			strings[i] = array[i].toString();
 		}
 		return strings;
 	}
 
-	public static <T> List<T> toList(Iterable<T> it) {
-		List<T> list = new ArrayList<>();
-		for (T t : it)
+	public static <T> List<T> toList(final Iterable<T> it) {
+		final List<T> list = new ArrayList<>();
+		for (final T t : it)
 			list.add(t);
 		return list;
 	}
diff --git a/vipra-util/src/main/java/de/vipra/util/Mongo.java b/vipra-util/src/main/java/de/vipra/util/Mongo.java
index 8f82187b1dac054de34184d0cf6ef98daf079831..cb1b5000d97db61df1749ba5e7d117ccc6abb2a5 100644
--- a/vipra-util/src/main/java/de/vipra/util/Mongo.java
+++ b/vipra-util/src/main/java/de/vipra/util/Mongo.java
@@ -26,17 +26,17 @@ public class Mongo {
 	private final Morphia morphia;
 	private final Datastore datastore;
 
-	private Mongo(Config config) throws ConfigException {
-		String host = config.databaseHost;
-		Integer port = config.databasePort;
-		String databaseName = config.databaseName;
+	private Mongo(final Config config) throws ConfigException {
+		final String host = config.databaseHost;
+		final Integer port = config.databasePort;
+		final String databaseName = config.databaseName;
 
 		if (host == null || port == null || databaseName == null) {
 			log.error("host/port/dbname missing in configuration");
 			throw new ConfigException("host/port/dbname missing in configuration");
 		}
 
-		MongoClientOptions options = MongoClientOptions.builder().connectTimeout(10000).build();
+		final MongoClientOptions options = MongoClientOptions.builder().connectTimeout(10000).build();
 
 		client = new MongoClient(host + ":" + port, options);
 
@@ -57,7 +57,7 @@ public class Mongo {
 		return datastore;
 	}
 
-	public static Mongo getInstance(Config config) throws ConfigException {
+	public static Mongo getInstance(final Config config) throws ConfigException {
 		if (instance == null) {
 			instance = new Mongo(config);
 		}
diff --git a/vipra-util/src/main/java/de/vipra/util/MongoUtils.java b/vipra-util/src/main/java/de/vipra/util/MongoUtils.java
index 4e6f60acf850d51c0ad8d467c4f67f0fd09dec1e..ad076611f5de8385c88541cba323f103d8a72e19 100644
--- a/vipra-util/src/main/java/de/vipra/util/MongoUtils.java
+++ b/vipra-util/src/main/java/de/vipra/util/MongoUtils.java
@@ -11,11 +11,11 @@ import org.bson.types.ObjectId;
 
 public class MongoUtils {
 
-	public static Bson getSorts(String sortBy) {
+	public static Bson getSorts(final String sortBy) {
 		if (sortBy == null)
 			return null;
-		String[] sortKeys = sortBy.split(",");
-		ArrayList<Bson> sorts = new ArrayList<Bson>(sortKeys.length);
+		final String[] sortKeys = sortBy.split(",");
+		final ArrayList<Bson> sorts = new ArrayList<Bson>(sortKeys.length);
 		for (String sort : sortKeys) {
 			if (sort.startsWith("-")) {
 				sorts.add(descending(sort.substring(1)));
@@ -27,10 +27,10 @@ public class MongoUtils {
 		return orderBy(sorts);
 	}
 
-	public static ObjectId objectId(String id) {
+	public static ObjectId objectId(final String id) {
 		try {
 			return new ObjectId(id);
-		} catch (IllegalArgumentException e) {
+		} catch (final IllegalArgumentException e) {
 			return null;
 		}
 	}
diff --git a/vipra-util/src/main/java/de/vipra/util/MultiMap.java b/vipra-util/src/main/java/de/vipra/util/MultiMap.java
index bcd8411dcdde956cbe4620726251cb7d7b09092c..8d677f4471a587df88e4b1b45640aa3c5341f62a 100644
--- a/vipra-util/src/main/java/de/vipra/util/MultiMap.java
+++ b/vipra-util/src/main/java/de/vipra/util/MultiMap.java
@@ -15,7 +15,7 @@ public class MultiMap<K, V> {
 		this.map = new HashMap<K, Set<V>>();
 	}
 
-	public void put(K key, V value) {
+	public void put(final K key, final V value) {
 		Set<V> set = map.get(key);
 		if (set == null)
 			set = new HashSet<>();
@@ -23,7 +23,7 @@ public class MultiMap<K, V> {
 		map.put(key, set);
 	}
 
-	public void put(K key, Collection<V> values) {
+	public void put(final K key, final Collection<V> values) {
 		Set<V> set = map.get(key);
 		if (set == null)
 			set = new HashSet<>();
@@ -31,7 +31,7 @@ public class MultiMap<K, V> {
 		map.put(key, set);
 	}
 
-	public Set<V> get(K key) {
+	public Set<V> get(final K key) {
 		return map.get(key);
 	}
 
diff --git a/vipra-util/src/main/java/de/vipra/util/NestedMap.java b/vipra-util/src/main/java/de/vipra/util/NestedMap.java
index 4c7856e853d23f01b7cbbe1435efaa50dc7182ff..e42a4b95ecfe2750a02fb59c4cf73bd313771a98 100644
--- a/vipra-util/src/main/java/de/vipra/util/NestedMap.java
+++ b/vipra-util/src/main/java/de/vipra/util/NestedMap.java
@@ -11,7 +11,7 @@ import com.fasterxml.jackson.annotation.JsonValue;
  * Nested map. This map is a rough implementation of JSON objects, featuring map
  * nesting. Currently not supporting array notation. Can work with arbitrary
  * field delimiters.
- * 
+ *
  * Default field delimiter is . (dot). Accessing fields is the same as in JSON:
  * some.nested.object. Array notation is not implemented: some.nested[3].array
  */
@@ -22,12 +22,12 @@ public class NestedMap {
 
 	public NestedMap() {}
 
-	public NestedMap(String delimiter) {
+	public NestedMap(final String delimiter) {
 		this.delimiter = Pattern.quote(delimiter);
 	}
 
 	@JsonCreator
-	public NestedMap(Map<String, Object> map) {
+	public NestedMap(final Map<String, Object> map) {
 		this.map = map;
 	}
 
@@ -37,15 +37,15 @@ public class NestedMap {
 	}
 
 	@SuppressWarnings("unchecked")
-	public void put(String key, Object value) {
+	public void put(final String key, final Object value) {
 		Map<String, Object> current = map;
-		String[] parts = key.split(delimiter);
-		String name = parts.length > 0 ? parts[parts.length - 1] : key;
+		final String[] parts = key.split(delimiter);
+		final String name = parts.length > 0 ? parts[parts.length - 1] : key;
 
 		for (int i = 0; i < parts.length - 1; i++) {
-			Object o = current.get(parts[i]);
+			final Object o = current.get(parts[i]);
 			if (o == null || !(o instanceof Map)) {
-				HashMap<String, Object> newMap = new HashMap<>();
+				final HashMap<String, Object> newMap = new HashMap<>();
 				current.put(parts[i], newMap);
 				current = newMap;
 			} else {
diff --git a/vipra-util/src/main/java/de/vipra/util/NumberUtils.java b/vipra-util/src/main/java/de/vipra/util/NumberUtils.java
index 4206e9fd528552d2af5c5458d8dc34318e7d8210..c3d0879b2a0650e400a030c6aa8f4d47c48d14cf 100644
--- a/vipra-util/src/main/java/de/vipra/util/NumberUtils.java
+++ b/vipra-util/src/main/java/de/vipra/util/NumberUtils.java
@@ -2,8 +2,8 @@ package de.vipra.util;
 
 public class NumberUtils {
 
-	public static double roundToPrecision(double d, int precision) {
-		double p = Math.pow(10, precision);
+	public static double roundToPrecision(final double d, final int precision) {
+		final double p = Math.pow(10, precision);
 		return Math.round(d * p) / p;
 	}
 
diff --git a/vipra-util/src/main/java/de/vipra/util/PathUtils.java b/vipra-util/src/main/java/de/vipra/util/PathUtils.java
index 7e5524fcfbdf300be8d1f74e4f67dd4908e3bdfa..47bd542aec2279330d6d8a6b8d3c484cbb60d8f7 100644
--- a/vipra-util/src/main/java/de/vipra/util/PathUtils.java
+++ b/vipra-util/src/main/java/de/vipra/util/PathUtils.java
@@ -5,7 +5,7 @@ import java.io.File;
 public class PathUtils {
 
 	public static File appDataDir() {
-		String os = System.getProperty("os.name").toUpperCase();
+		final String os = System.getProperty("os.name").toUpperCase();
 		File base = null;
 		if (os.contains("WIN")) {
 			base = new File(System.getProperty("APPDATA"));
@@ -19,7 +19,7 @@ public class PathUtils {
 	}
 
 	public static File appConfigDir() {
-		String os = System.getProperty("os.name").toUpperCase();
+		final String os = System.getProperty("os.name").toUpperCase();
 		File base = null;
 		if (os.contains("WIN")) {
 			base = new File(System.getProperty("APPDATA"));
diff --git a/vipra-util/src/main/java/de/vipra/util/StringUtils.java b/vipra-util/src/main/java/de/vipra/util/StringUtils.java
index 3f823beff07ff6b626763cd4b12d51b01928242e..442678da6266a5e9368da75d07add8cf50ed08b8 100644
--- a/vipra-util/src/main/java/de/vipra/util/StringUtils.java
+++ b/vipra-util/src/main/java/de/vipra/util/StringUtils.java
@@ -10,18 +10,18 @@ import java.util.regex.Pattern;
 
 public class StringUtils {
 
-	public static String ellipsize(String input, int maxLength) {
-		String ellip = "...";
+	public static String ellipsize(final String input, final int maxLength) {
+		final String ellip = "...";
 		if (input == null || input.length() <= maxLength || input.length() < ellip.length()) {
 			return input;
 		}
 		return input.substring(0, maxLength - ellip.length()).concat(ellip);
 	}
 
-	public static String join(Iterable<String> it, String separator) {
-		Iterator<String> iter = it.iterator();
+	public static String join(final Iterable<String> it, final String separator) {
+		final Iterator<String> iter = it.iterator();
 		if (iter.hasNext()) {
-			StringBuilder sb = new StringBuilder(iter.next());
+			final StringBuilder sb = new StringBuilder(iter.next());
 			while (iter.hasNext()) {
 				sb.append(separator).append(iter.next());
 			}
@@ -30,46 +30,46 @@ public class StringUtils {
 		return "";
 	}
 
-	public static String join(Iterable<String> it) {
+	public static String join(final Iterable<String> it) {
 		return join(it, " ");
 	}
 
-	public static String join(String[] arr, String separator) {
+	public static String join(final String[] arr, final String separator) {
 		return join(Arrays.asList(arr), separator);
 	}
 
-	public static String join(String[] arr) {
+	public static String join(final String[] arr) {
 		return join(arr, " ");
 	}
 
 	public static String timeString(long nanos) {
-		List<String> parts = new ArrayList<String>(6);
+		final List<String> parts = new ArrayList<String>(6);
 
-		long days = TimeUnit.NANOSECONDS.toDays(nanos);
+		final long days = TimeUnit.NANOSECONDS.toDays(nanos);
 		if (days > 0) {
 			parts.add(days + "d");
 			nanos -= TimeUnit.DAYS.toNanos(days);
 		}
 
-		long hours = TimeUnit.NANOSECONDS.toHours(nanos);
+		final long hours = TimeUnit.NANOSECONDS.toHours(nanos);
 		if (hours > 0) {
 			parts.add(hours + "h");
 			nanos -= TimeUnit.HOURS.toNanos(hours);
 		}
 
-		long minutes = TimeUnit.NANOSECONDS.toMinutes(nanos);
+		final long minutes = TimeUnit.NANOSECONDS.toMinutes(nanos);
 		if (minutes > 0) {
 			parts.add(minutes + "m");
 			nanos -= TimeUnit.MINUTES.toNanos(minutes);
 		}
 
-		long seconds = TimeUnit.NANOSECONDS.toSeconds(nanos);
+		final long seconds = TimeUnit.NANOSECONDS.toSeconds(nanos);
 		if (seconds > 0) {
 			parts.add(seconds + "s");
 			nanos -= TimeUnit.SECONDS.toNanos(seconds);
 		}
 
-		long millis = TimeUnit.NANOSECONDS.toMillis(nanos);
+		final long millis = TimeUnit.NANOSECONDS.toMillis(nanos);
 		if (millis > 0) {
 			parts.add(millis + "ms");
 		}
@@ -81,7 +81,7 @@ public class StringUtils {
 		return StringUtils.join(parts);
 	}
 
-	public static String padNumber(int number, int length) {
+	public static String padNumber(final int number, final int length) {
 		String lc = Integer.toString(number);
 		while (lc.length() < length) {
 			lc = "0" + lc;
@@ -92,45 +92,45 @@ public class StringUtils {
 	/**
 	 * Turns byte counts into human readable strings. Taken from
 	 * https://stackoverflow.com/questions/3758606
-	 * 
+	 *
 	 * @param bytes
 	 *            number of bytes
 	 * @param si
 	 *            true to use SI units
 	 * @return formatted string
 	 */
-	public static String humanReadableByteCount(long bytes, boolean si) {
-		int unit = si ? 1000 : 1024;
+	public static String humanReadableByteCount(final long bytes, final boolean si) {
+		final int unit = si ? 1000 : 1024;
 		if (bytes < unit)
 			return bytes + " B";
-		int exp = (int) (Math.log(bytes) / Math.log(unit));
-		String pre = (si ? "kMGTPE" : "KMGTPE").charAt(exp - 1) + (si ? "" : "i");
+		final int exp = (int) (Math.log(bytes) / Math.log(unit));
+		final String pre = (si ? "kMGTPE" : "KMGTPE").charAt(exp - 1) + (si ? "" : "i");
 		return String.format("%.1f %sB", bytes / Math.pow(unit, exp), pre);
 	}
 
-	public static String humanReadableByteCount(long bytes) {
+	public static String humanReadableByteCount(final long bytes) {
 		return humanReadableByteCount(bytes, true);
 	}
 
 	private static Pattern firstNumberPattern = Pattern.compile("[0-9]+");
 
-	public static Integer getFirstNumber(String in) {
-		Matcher m = firstNumberPattern.matcher(in);
+	public static Integer getFirstNumber(final String in) {
+		final Matcher m = firstNumberPattern.matcher(in);
 		if (m.find()) {
 			try {
 				return Integer.parseInt(m.group());
-			} catch (NumberFormatException e) {}
+			} catch (final NumberFormatException e) {}
 		}
 		return null;
 	}
 
-	public static String quantity(Number qty, String singular, String plural) {
+	public static String quantity(final Number qty, final String singular, final String plural) {
 		if (qty.intValue() == 1)
 			return singular;
 		return plural;
 	}
 
-	public static String quantity(Number qty, String singular) {
+	public static String quantity(final Number qty, final String singular) {
 		return quantity(qty, singular, singular + "s");
 	}
 
@@ -143,37 +143,37 @@ public class StringUtils {
 		return fields.split(",");
 	}
 
-	public static String capitalize(String in) {
+	public static String capitalize(final String in) {
 		if (in == null || in.length() == 0)
 			return in;
 		return in.substring(0, 1).toUpperCase() + in.substring(1);
 	}
 
-	public static String decapitalize(String in) {
+	public static String decapitalize(final String in) {
 		if (in == null || in.length() == 0)
 			return in;
 		return in.substring(0, 1).toLowerCase() + in.substring(1);
 	}
 
-	public static String camelToDashCase(String in) {
+	public static String camelToDashCase(final String in) {
 		if (in == null || in.length() == 0)
 			return in;
 		return in.replaceAll("([A-Z])", "-$1").toLowerCase();
 	}
 
-	public static String dashToCamelCase(String in) {
+	public static String dashToCamelCase(final String in) {
 		if (in == null || in.length() == 0)
 			return in;
-		StringBuilder sb = new StringBuilder();
-		String[] parts = in.split("-");
+		final StringBuilder sb = new StringBuilder();
+		final String[] parts = in.split("-");
 		sb.append(parts[0]);
 		for (int i = 1; i < parts.length; i++)
 			sb.append(StringUtils.capitalize(parts[i]));
 		return sb.toString();
 	}
 
-	public static String repeat(String pattern, int count) {
-		StringBuilder sb = new StringBuilder();
+	public static String repeat(final String pattern, int count) {
+		final StringBuilder sb = new StringBuilder();
 		while (count-- > 0)
 			sb.append(pattern);
 		return sb.toString();
diff --git a/vipra-util/src/main/java/de/vipra/util/Timer.java b/vipra-util/src/main/java/de/vipra/util/Timer.java
index fecf6572d6660783364f168595a089cfec572a8f..39849b4afacc01f6271f945669ce33ed65cc628f 100644
--- a/vipra-util/src/main/java/de/vipra/util/Timer.java
+++ b/vipra-util/src/main/java/de/vipra/util/Timer.java
@@ -21,7 +21,7 @@ public class Timer {
 
 	/**
 	 * restart the timer (reset everything) and return the start time
-	 * 
+	 *
 	 * @return start time
 	 */
 	public long restart() {
@@ -32,7 +32,7 @@ public class Timer {
 
 	/**
 	 * Return the current time since start or last lap, whichever is closer.
-	 * 
+	 *
 	 * @return time since start or last lap
 	 */
 	public long current() {
@@ -41,13 +41,13 @@ public class Timer {
 
 	/**
 	 * Create a named lap and reset the lap start time.
-	 * 
+	 *
 	 * @param name
 	 *            Name of lap
 	 * @return lap time
 	 */
-	public long lap(String name) {
-		long lap = System.nanoTime() - start;
+	public long lap(final String name) {
+		final long lap = System.nanoTime() - start;
 		start = System.nanoTime();
 		laps.put(name, lap);
 		return lap;
@@ -55,7 +55,7 @@ public class Timer {
 
 	/**
 	 * Get total time since start or last reset, ignoring laps
-	 * 
+	 *
 	 * @return total time
 	 */
 	public long total() {
@@ -66,8 +66,8 @@ public class Timer {
 	public String toString() {
 		String out = null;
 		if (laps != null && laps.size() > 0) {
-			StringBuilder sb = new StringBuilder();
-			for (Entry<String, Long> e : laps.entrySet()) {
+			final StringBuilder sb = new StringBuilder();
+			for (final Entry<String, Long> e : laps.entrySet()) {
 				sb.append(", ").append(e.getKey()).append(": ").append(StringUtils.timeString(e.getValue()));
 			}
 			out = sb.toString().substring(2);
diff --git a/vipra-util/src/main/java/de/vipra/util/TopicSimilarity.java b/vipra-util/src/main/java/de/vipra/util/TopicSimilarity.java
index f68e5e8e527838e4434a3803ba98c1d0a98240f1..f3d0bfadbcba15c3fae7e102097178627a2eb7f3 100644
--- a/vipra-util/src/main/java/de/vipra/util/TopicSimilarity.java
+++ b/vipra-util/src/main/java/de/vipra/util/TopicSimilarity.java
@@ -12,7 +12,7 @@ public class TopicSimilarity {
 		return topic;
 	}
 
-	public void setTopic(Topic topic) {
+	public void setTopic(final Topic topic) {
 		this.topic = topic;
 	}
 
@@ -20,7 +20,7 @@ public class TopicSimilarity {
 		return shareCount;
 	}
 
-	public void setShareCount(int shareCount) {
+	public void setShareCount(final int shareCount) {
 		this.shareCount = shareCount;
 	}
 
diff --git a/vipra-util/src/main/java/de/vipra/util/Tuple.java b/vipra-util/src/main/java/de/vipra/util/Tuple.java
index fb7995d3b592f1d0e7715d5dd50d1a29dfddcfc5..47613e2f0fd86a184c983b9d35e231d255ee4b1f 100644
--- a/vipra-util/src/main/java/de/vipra/util/Tuple.java
+++ b/vipra-util/src/main/java/de/vipra/util/Tuple.java
@@ -7,7 +7,7 @@ public class Tuple<X, Y> {
 
 	public Tuple() {}
 
-	public Tuple(X first, Y second) {
+	public Tuple(final X first, final Y second) {
 		this.first = first;
 		this.second = second;
 	}
@@ -16,7 +16,7 @@ public class Tuple<X, Y> {
 		return first;
 	}
 
-	public void setFirst(X first) {
+	public void setFirst(final X first) {
 		this.first = first;
 	}
 
@@ -24,11 +24,11 @@ public class Tuple<X, Y> {
 		return second;
 	}
 
-	public void setSecond(Y second) {
+	public void setSecond(final Y second) {
 		this.second = second;
 	}
 
-	public static <X, Y> Tuple<X, Y> pair(X first, Y second) {
+	public static <X, Y> Tuple<X, Y> pair(final X first, final Y second) {
 		return new Tuple<>(first, second);
 	}
 
diff --git a/vipra-util/src/main/java/de/vipra/util/ex/ConfigException.java b/vipra-util/src/main/java/de/vipra/util/ex/ConfigException.java
index 02afde9221b2c4cf5f18f73410d9d12f589df169..c9aad0005be219e42a13bc81600f6e5c59e65e85 100644
--- a/vipra-util/src/main/java/de/vipra/util/ex/ConfigException.java
+++ b/vipra-util/src/main/java/de/vipra/util/ex/ConfigException.java
@@ -4,7 +4,7 @@ public class ConfigException extends Exception {
 
 	private static final long serialVersionUID = 1L;
 
-	public ConfigException(String string) {
+	public ConfigException(final String string) {
 		super(string);
 	}
 
diff --git a/vipra-util/src/main/java/de/vipra/util/ex/DatabaseException.java b/vipra-util/src/main/java/de/vipra/util/ex/DatabaseException.java
index 6782255bffd24675ad65aa7f29641ccdf864e0a4..2f62371b0952a95357e4a593fc07ecfe03e61127 100644
--- a/vipra-util/src/main/java/de/vipra/util/ex/DatabaseException.java
+++ b/vipra-util/src/main/java/de/vipra/util/ex/DatabaseException.java
@@ -4,11 +4,11 @@ public class DatabaseException extends Exception {
 
 	private static final long serialVersionUID = 1L;
 
-	public DatabaseException(String msg) {
+	public DatabaseException(final String msg) {
 		super(msg);
 	}
 
-	public DatabaseException(Exception e) {
+	public DatabaseException(final Exception e) {
 		super(e);
 	}
 
diff --git a/vipra-util/src/main/java/de/vipra/util/model/Article.java b/vipra-util/src/main/java/de/vipra/util/model/Article.java
index 36a13c525e6ffa5fee8fda9036920d2db05e89d0..4bfd8d55096952a75bf4f78b2d834feb4465f97a 100644
--- a/vipra-util/src/main/java/de/vipra/util/model/Article.java
+++ b/vipra-util/src/main/java/de/vipra/util/model/Article.java
@@ -19,7 +19,7 @@ public class Article implements Model<ObjectId>, Serializable {
 
 	public Article() {}
 
-	public Article(ObjectId id) {
+	public Article(final ObjectId id) {
 		this.id = id;
 	}
 
@@ -29,7 +29,7 @@ public class Article implements Model<ObjectId>, Serializable {
 	}
 
 	@Override
-	public void setId(ObjectId id) {
+	public void setId(final ObjectId id) {
 		this.id = id;
 	}
 
@@ -37,17 +37,17 @@ public class Article implements Model<ObjectId>, Serializable {
 		return title;
 	}
 
-	public void setTitle(String title) {
+	public void setTitle(final String title) {
 		this.title = title;
 	}
 
 	@Override
-	public boolean equals(Object o) {
+	public boolean equals(final Object o) {
 		if (o == null)
 			return false;
 		if (!(o instanceof Article))
 			return false;
-		Article a = (Article) o;
+		final Article a = (Article) o;
 		if (id == null)
 			return a.getId() == null;
 		return id.equals(a.getId());
diff --git a/vipra-util/src/main/java/de/vipra/util/model/ArticleFull.java b/vipra-util/src/main/java/de/vipra/util/model/ArticleFull.java
index ec0e92cf76332c85b4d344942645a2aaef0e05d5..2f123629ebc746941ec5a204b4818793f1eaec47 100644
--- a/vipra-util/src/main/java/de/vipra/util/model/ArticleFull.java
+++ b/vipra-util/src/main/java/de/vipra/util/model/ArticleFull.java
@@ -73,11 +73,11 @@ public class ArticleFull extends FileModel<ObjectId> implements Serializable {
 	}
 
 	@Override
-	public void setId(ObjectId id) {
+	public void setId(final ObjectId id) {
 		this.id = id;
 	}
 
-	public void setId(String id) {
+	public void setId(final String id) {
 		this.id = MongoUtils.objectId(id);
 	}
 
@@ -85,7 +85,7 @@ public class ArticleFull extends FileModel<ObjectId> implements Serializable {
 		return title;
 	}
 
-	public void setTitle(String title) {
+	public void setTitle(final String title) {
 		this.title = title;
 	}
 
@@ -93,7 +93,7 @@ public class ArticleFull extends FileModel<ObjectId> implements Serializable {
 		return text;
 	}
 
-	public void setText(String text) {
+	public void setText(final String text) {
 		this.text = text;
 	}
 
@@ -111,7 +111,7 @@ public class ArticleFull extends FileModel<ObjectId> implements Serializable {
 		return processedText;
 	}
 
-	public void setProcessedText(String[] processedText) {
+	public void setProcessedText(final String[] processedText) {
 		this.processedText = processedText;
 	}
 
@@ -119,7 +119,7 @@ public class ArticleFull extends FileModel<ObjectId> implements Serializable {
 		return url;
 	}
 
-	public void setUrl(String url) {
+	public void setUrl(final String url) {
 		this.url = url;
 	}
 
@@ -127,15 +127,15 @@ public class ArticleFull extends FileModel<ObjectId> implements Serializable {
 		return date;
 	}
 
-	public void setDate(Date date) {
+	public void setDate(final Date date) {
 		this.date = date;
 	}
 
-	public void setDate(String date) {
-		SimpleDateFormat df = new SimpleDateFormat(Constants.DATETIME_FORMAT);
+	public void setDate(final String date) {
+		final SimpleDateFormat df = new SimpleDateFormat(Constants.DATETIME_FORMAT);
 		try {
 			setDate(df.parse(date));
-		} catch (ParseException e) {
+		} catch (final ParseException e) {
 			log.error("could not parse date " + date);
 		}
 	}
@@ -144,17 +144,17 @@ public class ArticleFull extends FileModel<ObjectId> implements Serializable {
 		return topics;
 	}
 
-	public void setTopics(List<TopicRef> topics) {
+	public void setTopics(final List<TopicRef> topics) {
 		this.topics = topics;
 	}
 
 	@ElasticIndex("topics")
 	public String[] serializeTopics() {
-		List<TopicRef> refs = getTopics();
+		final List<TopicRef> refs = getTopics();
 		if (refs == null)
 			return new String[0];
-		List<String> topics = new ArrayList<>(refs.size());
-		for (TopicRef ref : refs) {
+		final List<String> topics = new ArrayList<>(refs.size());
+		for (final TopicRef ref : refs) {
 			topics.add(ref.getTopic().getName());
 		}
 		return topics.toArray(new String[topics.size()]);
@@ -164,7 +164,7 @@ public class ArticleFull extends FileModel<ObjectId> implements Serializable {
 		return stats;
 	}
 
-	public void setStats(ArticleStats stats) {
+	public void setStats(final ArticleStats stats) {
 		this.stats = stats;
 	}
 
@@ -172,7 +172,7 @@ public class ArticleFull extends FileModel<ObjectId> implements Serializable {
 		return created;
 	}
 
-	public void setCreated(Date created) {
+	public void setCreated(final Date created) {
 		this.created = created;
 	}
 
@@ -180,7 +180,7 @@ public class ArticleFull extends FileModel<ObjectId> implements Serializable {
 		return modified;
 	}
 
-	public void setModified(Date modified) {
+	public void setModified(final Date modified) {
 		this.modified = modified;
 	}
 
@@ -188,19 +188,19 @@ public class ArticleFull extends FileModel<ObjectId> implements Serializable {
 		return meta;
 	}
 
-	public void setMeta(NestedMap meta) {
+	public void setMeta(final NestedMap meta) {
 		this.meta = meta;
 	}
 
-	public void addMeta(String key, Object value) {
+	public void addMeta(final String key, final Object value) {
 		if (meta == null)
 			meta = new NestedMap();
 		meta.put(key, value);
 	}
 
 	@Override
-	public void fromFile(File file) throws IOException {
-		List<String> lines = FileUtils.readFile(file);
+	public void fromFile(final File file) throws IOException {
+		final List<String> lines = FileUtils.readFile(file);
 		setTitle(lines.get(0));
 		setText(StringUtils.join(lines.subList(1, lines.size())));
 	}
@@ -224,12 +224,12 @@ public class ArticleFull extends FileModel<ObjectId> implements Serializable {
 	}
 
 	@Override
-	public boolean equals(Object o) {
+	public boolean equals(final Object o) {
 		if (o == null)
 			return false;
 		if (!(o instanceof ArticleFull))
 			return false;
-		ArticleFull a = (ArticleFull) o;
+		final ArticleFull a = (ArticleFull) o;
 		if (id == null)
 			return a.getId() == null;
 		return id.equals(a.getId());
diff --git a/vipra-util/src/main/java/de/vipra/util/model/ArticleStats.java b/vipra-util/src/main/java/de/vipra/util/model/ArticleStats.java
index 5e1dfedc955a7492be6a13e770a44ac72c179cbe..3861683d9c54a7b93ca9a4fdb58796c634ad98f0 100644
--- a/vipra-util/src/main/java/de/vipra/util/model/ArticleStats.java
+++ b/vipra-util/src/main/java/de/vipra/util/model/ArticleStats.java
@@ -18,7 +18,7 @@ public class ArticleStats implements Serializable {
 		return wordCount;
 	}
 
-	public void setWordCount(Long wordCount) {
+	public void setWordCount(final Long wordCount) {
 		this.wordCount = wordCount;
 	}
 
@@ -26,7 +26,7 @@ public class ArticleStats implements Serializable {
 		return uniqueWordCount;
 	}
 
-	public void setUniqueWordCount(Long uniqueWordCount) {
+	public void setUniqueWordCount(final Long uniqueWordCount) {
 		this.uniqueWordCount = uniqueWordCount;
 	}
 
@@ -34,7 +34,7 @@ public class ArticleStats implements Serializable {
 		return processedWordCount;
 	}
 
-	public void setProcessedWordCount(Long processedWordCount) {
+	public void setProcessedWordCount(final Long processedWordCount) {
 		this.processedWordCount = processedWordCount;
 	}
 
@@ -42,7 +42,7 @@ public class ArticleStats implements Serializable {
 		return reductionRatio;
 	}
 
-	public void setReductionRatio(Double reductionRatio) {
+	public void setReductionRatio(final Double reductionRatio) {
 		this.reductionRatio = reductionRatio;
 	}
 
diff --git a/vipra-util/src/main/java/de/vipra/util/model/FileModel.java b/vipra-util/src/main/java/de/vipra/util/model/FileModel.java
index a2e6c82f477efd90ffebac8686de7c89c4dd0a3e..aa681bd69818e8f48062ba429ca3a5560b8db2a8 100644
--- a/vipra-util/src/main/java/de/vipra/util/model/FileModel.java
+++ b/vipra-util/src/main/java/de/vipra/util/model/FileModel.java
@@ -10,7 +10,7 @@ import de.vipra.util.Constants;
 @SuppressWarnings("serial")
 public abstract class FileModel<IdType> implements Model<IdType> {
 
-	public void writeToFile(File file) throws IOException {
+	public void writeToFile(final File file) throws IOException {
 		FileUtils.writeStringToFile(file, toFileString(), Constants.FILEBASE_ENCODING, false);
 	}
 
diff --git a/vipra-util/src/main/java/de/vipra/util/model/Sequence.java b/vipra-util/src/main/java/de/vipra/util/model/Sequence.java
index 23e8fbf06ee52e551602db4a89f0def29a87b6b1..4753ff9c51ccc608677d64727feb1fda2c79bbe6 100644
--- a/vipra-util/src/main/java/de/vipra/util/model/Sequence.java
+++ b/vipra-util/src/main/java/de/vipra/util/model/Sequence.java
@@ -18,7 +18,7 @@ public class Sequence implements Comparable<Sequence>, Serializable {
 		return number;
 	}
 
-	public void setNumber(Integer number) {
+	public void setNumber(final Integer number) {
 		this.number = number;
 	}
 
@@ -26,12 +26,12 @@ public class Sequence implements Comparable<Sequence>, Serializable {
 		return words;
 	}
 
-	public void setWords(List<TopicWord> words) {
+	public void setWords(final List<TopicWord> words) {
 		this.words = words;
 	}
 
 	@Override
-	public int compareTo(Sequence o) {
+	public int compareTo(final Sequence o) {
 		return this.number - o.getNumber();
 	}
 
diff --git a/vipra-util/src/main/java/de/vipra/util/model/Topic.java b/vipra-util/src/main/java/de/vipra/util/model/Topic.java
index 133be4d4b0ba5d5d4ec3e70f328474a9049772fd..c05d4be112d602e98fc7700b467d819e6dd2fec1 100644
--- a/vipra-util/src/main/java/de/vipra/util/model/Topic.java
+++ b/vipra-util/src/main/java/de/vipra/util/model/Topic.java
@@ -21,11 +21,11 @@ public class Topic implements Model<ObjectId>, Serializable {
 
 	public Topic() {}
 
-	public Topic(ObjectId id) {
+	public Topic(final ObjectId id) {
 		this.id = id;
 	}
 
-	public Topic(ObjectId id, String name) {
+	public Topic(final ObjectId id, final String name) {
 		this.id = id;
 		this.name = name;
 	}
@@ -36,11 +36,11 @@ public class Topic implements Model<ObjectId>, Serializable {
 	}
 
 	@Override
-	public void setId(ObjectId id) {
+	public void setId(final ObjectId id) {
 		this.id = id;
 	}
 
-	public void setId(String id) {
+	public void setId(final String id) {
 		this.id = MongoUtils.objectId(id);
 	}
 
@@ -48,17 +48,17 @@ public class Topic implements Model<ObjectId>, Serializable {
 		return name;
 	}
 
-	public void setName(String name) {
+	public void setName(final String name) {
 		this.name = name;
 	}
 
 	@Override
-	public boolean equals(Object o) {
+	public boolean equals(final Object o) {
 		if (o == null)
 			return false;
 		if (!(o instanceof Topic))
 			return false;
-		Topic a = (Topic) o;
+		final Topic a = (Topic) o;
 		if (id == null)
 			return a.getId() == null;
 		return id.equals(a.getId());
diff --git a/vipra-util/src/main/java/de/vipra/util/model/TopicFull.java b/vipra-util/src/main/java/de/vipra/util/model/TopicFull.java
index 3d89fe1815ec6fff6063d22c894ce0c30c2f4a6f..edbd7e08a3fc9b961959d22b19a7df8ebd737498 100644
--- a/vipra-util/src/main/java/de/vipra/util/model/TopicFull.java
+++ b/vipra-util/src/main/java/de/vipra/util/model/TopicFull.java
@@ -45,11 +45,11 @@ public class TopicFull implements Model<ObjectId>, Serializable {
 	}
 
 	@Override
-	public void setId(ObjectId id) {
+	public void setId(final ObjectId id) {
 		this.id = id;
 	}
 
-	public void setId(String id) {
+	public void setId(final String id) {
 		this.id = MongoUtils.objectId(id);
 	}
 
@@ -57,7 +57,7 @@ public class TopicFull implements Model<ObjectId>, Serializable {
 		return name;
 	}
 
-	public void setName(String name) {
+	public void setName(final String name) {
 		this.name = name;
 	}
 
@@ -65,7 +65,7 @@ public class TopicFull implements Model<ObjectId>, Serializable {
 		return index;
 	}
 
-	public void setIndex(Integer index) {
+	public void setIndex(final Integer index) {
 		this.index = index;
 	}
 
@@ -73,7 +73,7 @@ public class TopicFull implements Model<ObjectId>, Serializable {
 		return words;
 	}
 
-	public void setWords(List<TopicWord> topicWords) {
+	public void setWords(final List<TopicWord> topicWords) {
 		this.words = topicWords;
 	}
 
@@ -81,7 +81,7 @@ public class TopicFull implements Model<ObjectId>, Serializable {
 		return sequences;
 	}
 
-	public void setSequences(List<Sequence> sequences) {
+	public void setSequences(final List<Sequence> sequences) {
 		this.sequences = sequences;
 	}
 
@@ -89,7 +89,7 @@ public class TopicFull implements Model<ObjectId>, Serializable {
 		return created;
 	}
 
-	public void setCreated(Date created) {
+	public void setCreated(final Date created) {
 		this.created = created;
 	}
 
@@ -97,7 +97,7 @@ public class TopicFull implements Model<ObjectId>, Serializable {
 		return modified;
 	}
 
-	public void setModified(Date modified) {
+	public void setModified(final Date modified) {
 		this.modified = modified;
 	}
 
@@ -114,11 +114,11 @@ public class TopicFull implements Model<ObjectId>, Serializable {
 			this.created = modified;
 	}
 
-	public static String getNameFromWords(List<TopicWord> words) {
+	public static String getNameFromWords(final List<TopicWord> words) {
 		String name = null;
 		if (words != null && words.size() > 0) {
-			int size = Math.min(Constants.TOPIC_AUTO_NAMING_WORDS, words.size());
-			List<String> topWords = new ArrayList<>(size);
+			final int size = Math.min(Constants.TOPIC_AUTO_NAMING_WORDS, words.size());
+			final List<String> topWords = new ArrayList<>(size);
 			for (int i = 0; i < size; i++) {
 				topWords.add(words.get(i).getWord().getId());
 			}
@@ -128,12 +128,12 @@ public class TopicFull implements Model<ObjectId>, Serializable {
 	}
 
 	@Override
-	public boolean equals(Object o) {
+	public boolean equals(final Object o) {
 		if (o == null)
 			return false;
 		if (!(o instanceof TopicFull))
 			return false;
-		TopicFull a = (TopicFull) o;
+		final TopicFull a = (TopicFull) o;
 		if (id == null)
 			return a.getId() == null;
 		return id.equals(a.getId());
diff --git a/vipra-util/src/main/java/de/vipra/util/model/TopicRef.java b/vipra-util/src/main/java/de/vipra/util/model/TopicRef.java
index 4cf31122d1776ee45e4e45a90eabc9bfb7d76000..dd5401126f378274fb4a4655a72456f04e5fb254 100644
--- a/vipra-util/src/main/java/de/vipra/util/model/TopicRef.java
+++ b/vipra-util/src/main/java/de/vipra/util/model/TopicRef.java
@@ -20,7 +20,7 @@ public class TopicRef implements Comparable<TopicRef>, Serializable {
 		return count;
 	}
 
-	public void setCount(Integer count) {
+	public void setCount(final Integer count) {
 		this.count = count;
 	}
 
@@ -28,7 +28,7 @@ public class TopicRef implements Comparable<TopicRef>, Serializable {
 		return topic;
 	}
 
-	public void setTopic(Topic topic) {
+	public void setTopic(final Topic topic) {
 		this.topic = topic;
 	}
 
@@ -36,12 +36,12 @@ public class TopicRef implements Comparable<TopicRef>, Serializable {
 		return share;
 	}
 
-	public void setShare(Double share) {
+	public void setShare(final Double share) {
 		this.share = share;
 	}
 
 	@Override
-	public int compareTo(TopicRef arg0) {
+	public int compareTo(final TopicRef arg0) {
 		return count - arg0.getCount();
 	}
 
diff --git a/vipra-util/src/main/java/de/vipra/util/model/TopicWord.java b/vipra-util/src/main/java/de/vipra/util/model/TopicWord.java
index dcff079775e7f2448772a2fb5919c90b35d7c74e..15d01a0f7603c602b6e3df9bf9a3782363169585 100644
--- a/vipra-util/src/main/java/de/vipra/util/model/TopicWord.java
+++ b/vipra-util/src/main/java/de/vipra/util/model/TopicWord.java
@@ -21,7 +21,7 @@ public class TopicWord implements Comparable<TopicWord>, Serializable {
 
 	public TopicWord() {}
 
-	public TopicWord(Word word, Double likeliness) {
+	public TopicWord(final Word word, final Double likeliness) {
 		this.word = word;
 		this.likeliness = likeliness;
 	}
@@ -30,7 +30,7 @@ public class TopicWord implements Comparable<TopicWord>, Serializable {
 		return word;
 	}
 
-	public void setWord(Word word) {
+	public void setWord(final Word word) {
 		this.word = word;
 	}
 
@@ -40,7 +40,7 @@ public class TopicWord implements Comparable<TopicWord>, Serializable {
 	}
 
 	@JsonSetter("id")
-	public void setWordString(String word) {
+	public void setWordString(final String word) {
 		this.word = new Word(word);
 	}
 
@@ -48,13 +48,13 @@ public class TopicWord implements Comparable<TopicWord>, Serializable {
 		return likeliness;
 	}
 
-	public void setLikeliness(Double likeliness) {
+	public void setLikeliness(final Double likeliness) {
 		this.likeliness = likeliness;
 	}
 
 	@Override
-	public int compareTo(TopicWord o) {
-		double l = likeliness - o.getLikeliness();
+	public int compareTo(final TopicWord o) {
+		final double l = likeliness - o.getLikeliness();
 		if (l > 0)
 			return 1;
 		if (l < 0)
diff --git a/vipra-util/src/main/java/de/vipra/util/model/Word.java b/vipra-util/src/main/java/de/vipra/util/model/Word.java
index 0bcd53950ee4a27b421802692acdc84ec007587d..f7f79962da7315712a4e02f3b2ed303f0c156154 100644
--- a/vipra-util/src/main/java/de/vipra/util/model/Word.java
+++ b/vipra-util/src/main/java/de/vipra/util/model/Word.java
@@ -38,7 +38,7 @@ public class Word implements Model<String>, Serializable {
 
 	public Word() {}
 
-	public Word(String id) {
+	public Word(final String id) {
 		this.id = id;
 	}
 
@@ -48,7 +48,7 @@ public class Word implements Model<String>, Serializable {
 	}
 
 	@Override
-	public void setId(String id) {
+	public void setId(final String id) {
 		this.id = id;
 	}
 
@@ -56,7 +56,7 @@ public class Word implements Model<String>, Serializable {
 		return isCreated;
 	}
 
-	public void setIsCreated(boolean created) {
+	public void setIsCreated(final boolean created) {
 		this.isCreated = created;
 	}
 
@@ -64,7 +64,7 @@ public class Word implements Model<String>, Serializable {
 		return created;
 	}
 
-	public void setCreated(Date created) {
+	public void setCreated(final Date created) {
 		this.created = created;
 	}
 
@@ -81,12 +81,12 @@ public class Word implements Model<String>, Serializable {
 	}
 
 	@Override
-	public boolean equals(Object o) {
+	public boolean equals(final Object o) {
 		if (o == null)
 			return false;
 		if (!(o instanceof Word))
 			return false;
-		Word w = (Word) o;
+		final Word w = (Word) o;
 		if (id == null)
 			return w.getId() == null;
 		return this.id.equals(w.getId());
diff --git a/vipra-util/src/main/java/de/vipra/util/service/MongoService.java b/vipra-util/src/main/java/de/vipra/util/service/MongoService.java
index e0e2a7107cf9d1c80a698f1b294ef7dc5a648aa3..664382a65b546beb603f79fb6fd58bdee1d9b479 100644
--- a/vipra-util/src/main/java/de/vipra/util/service/MongoService.java
+++ b/vipra-util/src/main/java/de/vipra/util/service/MongoService.java
@@ -28,23 +28,23 @@ public class MongoService<Type extends Model<IdType>, IdType> implements Service
 	private final String[] ignoredFieldsMultiQuery;
 	private final Map<String, Field> updateFields;
 
-	public MongoService(Mongo mongo, Class<Type> clazz) {
+	public MongoService(final Mongo mongo, final Class<Type> clazz) {
 		this.datastore = mongo.getDatastore();
 		this.clazz = clazz;
 
-		List<String> ignoreSingle = new ArrayList<>();
-		List<String> ignoreMulti = new ArrayList<>();
-		Field[] fields = clazz.getDeclaredFields();
+		final List<String> ignoreSingle = new ArrayList<>();
+		final List<String> ignoreMulti = new ArrayList<>();
+		final Field[] fields = clazz.getDeclaredFields();
 		this.updateFields = new HashMap<>(fields.length);
-		for (Field field : fields) {
+		for (final Field field : fields) {
 			if (!field.isAccessible())
 				field.setAccessible(true);
 
-			UpdateIgnore ui = field.getDeclaredAnnotation(UpdateIgnore.class);
+			final UpdateIgnore ui = field.getDeclaredAnnotation(UpdateIgnore.class);
 			if (ui == null)
 				this.updateFields.put(field.getName(), field);
 
-			QueryIgnore qi = field.getDeclaredAnnotation(QueryIgnore.class);
+			final QueryIgnore qi = field.getDeclaredAnnotation(QueryIgnore.class);
 			if (qi != null) {
 				if (qi.single() || qi.all())
 					ignoreSingle.add(field.getName());
@@ -57,34 +57,35 @@ public class MongoService<Type extends Model<IdType>, IdType> implements Service
 	}
 
 	@Override
-	public Type getSingle(IdType id, boolean allFields, String... fields) throws DatabaseException {
+	public Type getSingle(final IdType id, final boolean allFields, final String... fields) throws DatabaseException {
 		if (id == null)
 			throw new DatabaseException(new NullPointerException("id is null"));
 
-		Query<Type> query = datastore.createQuery(clazz).field("_id").equal(id);
+		final Query<Type> query = datastore.createQuery(clazz).field("_id").equal(id);
 		if (fields != null && fields.length > 0)
 			query.retrievedFields(true, fields);
 		else if (!allFields && ignoredFieldsSingleQuery.length > 0)
 			query.retrievedFields(false, ignoredFieldsSingleQuery);
-		Type t = query.get();
+		final Type t = query.get();
 		return t;
 	}
 
 	@Override
-	public List<Type> getMultiple(Integer skip, Integer limit, String sortBy, String... fields) {
+	public List<Type> getMultiple(final Integer skip, final Integer limit, final String sortBy,
+			final String... fields) {
 		return getMultiple(QueryBuilder.builder().skip(skip).limit(limit).sortBy(sortBy).fields(true, fields));
 	}
 
 	@Override
-	public List<Type> getMultiple(Integer skip, Integer limit, String sortBy, Tuple<String, Object> criteria,
-			String... fields) {
+	public List<Type> getMultiple(final Integer skip, final Integer limit, final String sortBy,
+			final Tuple<String, Object> criteria, final String... fields) {
 		return getMultiple(
 				QueryBuilder.builder().skip(skip).limit(limit).sortBy(sortBy).fields(true, fields).criteria(criteria));
 	}
 
 	@Override
-	public List<Type> getMultiple(QueryBuilder builder) {
-		Query<Type> query = datastore.createQuery(clazz);
+	public List<Type> getMultiple(final QueryBuilder builder) {
+		final Query<Type> query = datastore.createQuery(clazz);
 
 		if (builder != null) {
 			if (builder.getSkip() != null && builder.getSkip() > 0)
@@ -94,10 +95,10 @@ public class MongoService<Type extends Model<IdType>, IdType> implements Service
 			if (builder.getSortBy() != null)
 				query.order(builder.getSortBy());
 			if (builder.getCriteria() != null)
-				for (Tuple<String, Object> criteria : builder.getCriteria())
+				for (final Tuple<String, Object> criteria : builder.getCriteria())
 					query.field(criteria.first()).equal(criteria.second());
 			if (builder.getFields() != null) {
-				String[] fields = builder.getFields();
+				final String[] fields = builder.getFields();
 				if (builder.isInclude()) {
 					query.retrievedFields(true, fields);
 				} else {
@@ -109,17 +110,17 @@ public class MongoService<Type extends Model<IdType>, IdType> implements Service
 		} else if (ignoredFieldsMultiQuery.length > 0) {
 			query.retrievedFields(false, ignoredFieldsMultiQuery);
 		}
-		List<Type> list = query.asList();
+		final List<Type> list = query.asList();
 		return list;
 	}
 
 	@Override
-	public List<Type> getAll(String... fields) {
+	public List<Type> getAll(final String... fields) {
 		return getMultiple(QueryBuilder.builder().fields(true, fields));
 	}
 
 	@Override
-	public Type createSingle(Type t) throws DatabaseException {
+	public Type createSingle(final Type t) throws DatabaseException {
 		if (t == null)
 			throw new DatabaseException(new NullPointerException("entity is null"));
 
@@ -128,34 +129,34 @@ public class MongoService<Type extends Model<IdType>, IdType> implements Service
 	}
 
 	@Override
-	public List<Type> createMultiple(Iterable<Type> t) throws DatabaseException {
+	public List<Type> createMultiple(final Iterable<Type> t) throws DatabaseException {
 		if (t == null)
 			throw new DatabaseException(new NullPointerException("entities are null"));
-		List<Type> list = ListUtils.toList(t);
+		final List<Type> list = ListUtils.toList(t);
 		datastore.save(list);
 		return list;
 	}
 
 	@Override
-	public long deleteSingle(IdType id) throws DatabaseException {
+	public long deleteSingle(final IdType id) throws DatabaseException {
 		if (id == null)
 			throw new DatabaseException(new NullPointerException("id is null"));
 
-		int deleted = datastore.delete(clazz, id).getN();
+		final int deleted = datastore.delete(clazz, id).getN();
 		return deleted;
 	}
 
 	@Override
-	public long deleteMultiple(Iterable<IdType> ids) throws DatabaseException {
+	public long deleteMultiple(final Iterable<IdType> ids) throws DatabaseException {
 		if (ids == null)
 			throw new DatabaseException(new NullPointerException("ids are null"));
 
-		int deleted = datastore.delete(clazz, ids).getN();
+		final int deleted = datastore.delete(clazz, ids).getN();
 		return deleted;
 	}
 
 	@Override
-	public void replaceSingle(Type t) throws DatabaseException {
+	public void replaceSingle(final Type t) throws DatabaseException {
 		if (t == null)
 			throw new DatabaseException(new NullPointerException("entity is null"));
 		if (t.getId() == null)
@@ -165,7 +166,7 @@ public class MongoService<Type extends Model<IdType>, IdType> implements Service
 	}
 
 	@Override
-	public void replaceMultiple(Iterable<Type> ts) throws DatabaseException {
+	public void replaceMultiple(final Iterable<Type> ts) throws DatabaseException {
 		if (ts == null)
 			throw new DatabaseException(new NullPointerException("entities are null"));
 
@@ -173,7 +174,7 @@ public class MongoService<Type extends Model<IdType>, IdType> implements Service
 	}
 
 	@Override
-	public void updateSingle(Type t, String... fields) throws DatabaseException {
+	public void updateSingle(final Type t, final String... fields) throws DatabaseException {
 		if (t == null)
 			throw new DatabaseException(new NullPointerException("entity is null"));
 		if (t.getId() == null)
@@ -182,17 +183,17 @@ public class MongoService<Type extends Model<IdType>, IdType> implements Service
 		if (fields == null || fields.length == 0) {
 			replaceSingle(t);
 		} else {
-			Query<Type> query = datastore.createQuery(clazz).field("_id").equal(t.getId());
-			UpdateOperations<Type> ops = datastore.createUpdateOperations(clazz);
+			final Query<Type> query = datastore.createQuery(clazz).field("_id").equal(t.getId());
+			final UpdateOperations<Type> ops = datastore.createUpdateOperations(clazz);
 			boolean noChanges = true;
-			for (String fieldName : fields) {
+			for (final String fieldName : fields) {
 				if (!this.updateFields.containsKey(fieldName))
 					throw new DatabaseException("field unknown: " + fieldName);
-				Field field = this.updateFields.get(fieldName);
+				final Field field = this.updateFields.get(fieldName);
 				if (field == null)
 					continue;
 				try {
-					Object value = field.get(t);
+					final Object value = field.get(t);
 					if (value == null)
 						ops.unset(fieldName);
 					else
@@ -213,25 +214,25 @@ public class MongoService<Type extends Model<IdType>, IdType> implements Service
 	}
 
 	@Override
-	public long count(QueryBuilder builder) {
+	public long count(final QueryBuilder builder) {
 		if (builder == null)
 			return datastore.getCount(clazz);
 
-		Query<Type> query = datastore.createQuery(clazz);
+		final Query<Type> query = datastore.createQuery(clazz);
 		if (builder.getSkip() != null && builder.getSkip() > 0)
 			query.offset(builder.getSkip());
 		if (builder.getLimit() != null && builder.getLimit() > 0)
 			query.limit(builder.getLimit());
 		if (builder.getCriteria() != null)
-			for (Tuple<String, Object> criteria : builder.getCriteria())
+			for (final Tuple<String, Object> criteria : builder.getCriteria())
 				query.field(criteria.first()).equal(criteria.second());
 
 		return datastore.getCount(query);
 	}
 
-	public static <Type extends Model<IdType>, IdType> MongoService<Type, IdType> getDatabaseService(Config config,
-			Class<Type> clazz) throws ConfigException {
-		Mongo mongo = config.getMongo();
+	public static <Type extends Model<IdType>, IdType> MongoService<Type, IdType> getDatabaseService(
+			final Config config, final Class<Type> clazz) throws ConfigException {
+		final Mongo mongo = config.getMongo();
 		return new MongoService<Type, IdType>(mongo, clazz);
 	}
 
diff --git a/vipra-util/src/main/java/de/vipra/util/service/Service.java b/vipra-util/src/main/java/de/vipra/util/service/Service.java
index 136e57580ddad941af8fb1632c29c4818192ad69..416903495ef3297f5fc00146164b3ac6b71b5e52 100644
--- a/vipra-util/src/main/java/de/vipra/util/service/Service.java
+++ b/vipra-util/src/main/java/de/vipra/util/service/Service.java
@@ -21,7 +21,7 @@ public interface Service<Type extends Model<IdType>, IdType, E extends Exception
 
 	/**
 	 * Returns a single entity from the database or null
-	 * 
+	 *
 	 * @param id
 	 *            id of the entity
 	 * @param fields
@@ -44,7 +44,7 @@ public interface Service<Type extends Model<IdType>, IdType, E extends Exception
 
 	/**
 	 * Returns multiple entities from the database.
-	 * 
+	 *
 	 * @param builder
 	 *            query builder
 	 * @return found entities
@@ -55,7 +55,7 @@ public interface Service<Type extends Model<IdType>, IdType, E extends Exception
 
 	/**
 	 * Return all entities.
-	 * 
+	 *
 	 * @param fields
 	 *            fields to be returned
 	 * @return all entities
@@ -65,7 +65,7 @@ public interface Service<Type extends Model<IdType>, IdType, E extends Exception
 
 	/**
 	 * Create a single entity in the database
-	 * 
+	 *
 	 * @param t
 	 *            Entity to be created
 	 * @return Created entity, with inserted id if supported
@@ -75,7 +75,7 @@ public interface Service<Type extends Model<IdType>, IdType, E extends Exception
 
 	/**
 	 * Create multiple entities in the database
-	 * 
+	 *
 	 * @param t
 	 *            Entities to be created
 	 * @return Created entities, with inserted ids if supported
@@ -85,7 +85,7 @@ public interface Service<Type extends Model<IdType>, IdType, E extends Exception
 
 	/**
 	 * Deletes a single entity from the database
-	 * 
+	 *
 	 * @param id
 	 *            id of entity to be deleted
 	 * @return number of deleted entities
@@ -95,7 +95,7 @@ public interface Service<Type extends Model<IdType>, IdType, E extends Exception
 
 	/**
 	 * Deletes multiple entries from the database
-	 * 
+	 *
 	 * @param ids
 	 *            Entities to be deleted
 	 * @return number of deleted entries
@@ -105,7 +105,7 @@ public interface Service<Type extends Model<IdType>, IdType, E extends Exception
 
 	/**
 	 * Replaces a single entity in the database
-	 * 
+	 *
 	 * @param t
 	 *            Entity to be updated
 	 * @throws E
@@ -114,7 +114,7 @@ public interface Service<Type extends Model<IdType>, IdType, E extends Exception
 
 	/**
 	 * Replaces multiple entities in the database
-	 * 
+	 *
 	 * @param ts
 	 *            Entities to be updated
 	 * @throws E
@@ -123,7 +123,7 @@ public interface Service<Type extends Model<IdType>, IdType, E extends Exception
 
 	/**
 	 * Updates a single entity in the database
-	 * 
+	 *
 	 * @param t
 	 *            Entity to be updated
 	 * @param fields
@@ -134,14 +134,14 @@ public interface Service<Type extends Model<IdType>, IdType, E extends Exception
 
 	/**
 	 * Drop all entities from the database
-	 * 
+	 *
 	 * @throws E
 	 */
 	void drop() throws E;
 
 	/**
 	 * Count entities in the database
-	 * 
+	 *
 	 * @return number of entities in the database
 	 * @throws E
 	 */
@@ -150,7 +150,7 @@ public interface Service<Type extends Model<IdType>, IdType, E extends Exception
 	/**
 	 * QueryBuilder instances are used to create complex queries for use with
 	 * the getMultiple method
-	 * 
+	 *
 	 * @see {@link Service#getMultiple(QueryBuilder)}
 	 */
 	public static class QueryBuilder {
@@ -170,12 +170,12 @@ public interface Service<Type extends Model<IdType>, IdType, E extends Exception
 
 		/**
 		 * Skip n entries
-		 * 
+		 *
 		 * @param skip
 		 *            entries to skip
 		 * @return QueryBuilder instance
 		 */
-		public QueryBuilder skip(Integer skip) {
+		public QueryBuilder skip(final Integer skip) {
 			if (skip == null || skip >= 0)
 				this.skip = skip;
 			return this;
@@ -183,12 +183,12 @@ public interface Service<Type extends Model<IdType>, IdType, E extends Exception
 
 		/**
 		 * Limit return size.
-		 * 
+		 *
 		 * @param limit
 		 *            maximum return size
 		 * @return QueryBuilder instance
 		 */
-		public QueryBuilder limit(Integer limit) {
+		public QueryBuilder limit(final Integer limit) {
 			if (limit == null || limit >= 0)
 				this.limit = limit;
 			return this;
@@ -196,12 +196,12 @@ public interface Service<Type extends Model<IdType>, IdType, E extends Exception
 
 		/**
 		 * Sort result by field
-		 * 
+		 *
 		 * @param sortBy
 		 *            field to sort by.
 		 * @return QueryBuilder instance
 		 */
-		public QueryBuilder sortBy(String sortBy) {
+		public QueryBuilder sortBy(final String sortBy) {
 			if (sortBy == null || !sortBy.isEmpty())
 				this.sortBy = sortBy;
 			return this;
@@ -209,14 +209,14 @@ public interface Service<Type extends Model<IdType>, IdType, E extends Exception
 
 		/**
 		 * Criteria used for filtering by field
-		 * 
+		 *
 		 * @param field
 		 *            field to compare
 		 * @param value
 		 *            value to compare to
 		 * @return QueryBuilder instance
 		 */
-		public QueryBuilder criteria(String field, Object value) {
+		public QueryBuilder criteria(final String field, final Object value) {
 			if (field != null && value != null && !field.isEmpty())
 				criteria(Tuple.pair(field, value));
 			return this;
@@ -224,12 +224,12 @@ public interface Service<Type extends Model<IdType>, IdType, E extends Exception
 
 		/**
 		 * Criteria used for filtering by field
-		 * 
+		 *
 		 * @param pair
 		 *            field value pair to compare
 		 * @return QueryBuilder instance
 		 */
-		public QueryBuilder criteria(Tuple<String, Object> pair) {
+		public QueryBuilder criteria(final Tuple<String, Object> pair) {
 			if (pair != null) {
 				if (criteria == null) {
 					criteria = new ArrayList<>();
@@ -242,14 +242,14 @@ public interface Service<Type extends Model<IdType>, IdType, E extends Exception
 		/**
 		 * Fields to return. Set include to false to exclude. Cannot be applied
 		 * multiple times, previous calls will be overwritten by later calls.
-		 * 
+		 *
 		 * @param include
 		 *            true to include, false to exclude
 		 * @param strings
 		 *            fields to in/exclude
 		 * @return QueryBuilder instance
 		 */
-		public QueryBuilder fields(boolean include, String... strings) {
+		public QueryBuilder fields(final boolean include, final String... strings) {
 			this.include = include;
 			this.fields = strings;
 			return this;