diff --git a/ma-impl.sublime-workspace b/ma-impl.sublime-workspace
index 9eaf778e376afa9fa59b814bf1a390fe31201884..42dc46ba506d730fa0c0131de47e421dc541d865 100644
--- a/ma-impl.sublime-workspace
+++ b/ma-impl.sublime-workspace
@@ -271,6 +271,14 @@
 	},
 	"buffers":
 	[
+		{
+			"file": "Vagrantfile",
+			"settings":
+			{
+				"buffer_size": 955,
+				"line_ending": "Unix"
+			}
+		}
 	],
 	"build_system": "",
 	"build_system_choices":
@@ -454,6 +462,9 @@
 	],
 	"file_history":
 	[
+		"/home/eike/.cache/.fr-rPaUI0/LICENSE.txt",
+		"/home/eike/Repositories/fu/ss15/ma/impl/vipra-rest/src/main/resources/log4j2.xml",
+		"/home/eike/Repositories/fu/ss15/ma/impl/vipra-config/log4j2.xml",
 		"/home/eike/Repositories/fu/ss15/ma/impl/vm/data/test-1.json",
 		"/home/eike/Repositories/fu/ss15/ma/impl/vm/data/test-2.json",
 		"/home/eike/Repositories/fu/ss15/ma/impl/vm/data/data.json",
@@ -888,8 +899,101 @@
 	"groups":
 	[
 		{
+			"selected": 0,
 			"sheets":
 			[
+				{
+					"buffer": 0,
+					"file": "Vagrantfile",
+					"semi_transient": true,
+					"settings":
+					{
+						"buffer_size": 955,
+						"regions":
+						{
+						},
+						"selection":
+						[
+							[
+								955,
+								955
+							]
+						],
+						"settings":
+						{
+							"BracketHighlighterBusy": false,
+							"bh_regions":
+							[
+								"bh_default",
+								"bh_default_center",
+								"bh_default_open",
+								"bh_default_close",
+								"bh_default_content",
+								"bh_c_define",
+								"bh_c_define_center",
+								"bh_c_define_open",
+								"bh_c_define_close",
+								"bh_c_define_content",
+								"bh_square",
+								"bh_square_center",
+								"bh_square_open",
+								"bh_square_close",
+								"bh_square_content",
+								"bh_round",
+								"bh_round_center",
+								"bh_round_open",
+								"bh_round_close",
+								"bh_round_content",
+								"bh_unmatched",
+								"bh_unmatched_center",
+								"bh_unmatched_open",
+								"bh_unmatched_close",
+								"bh_unmatched_content",
+								"bh_regex",
+								"bh_regex_center",
+								"bh_regex_open",
+								"bh_regex_close",
+								"bh_regex_content",
+								"bh_double_quote",
+								"bh_double_quote_center",
+								"bh_double_quote_open",
+								"bh_double_quote_close",
+								"bh_double_quote_content",
+								"bh_tag",
+								"bh_tag_center",
+								"bh_tag_open",
+								"bh_tag_close",
+								"bh_tag_content",
+								"bh_angle",
+								"bh_angle_center",
+								"bh_angle_open",
+								"bh_angle_close",
+								"bh_angle_content",
+								"bh_curly",
+								"bh_curly_center",
+								"bh_curly_open",
+								"bh_curly_close",
+								"bh_curly_content",
+								"bh_single_quote",
+								"bh_single_quote_center",
+								"bh_single_quote_open",
+								"bh_single_quote_close",
+								"bh_single_quote_content"
+							],
+							"incomplete_sync": null,
+							"remote_loading": false,
+							"synced": false,
+							"syntax": "Packages/Ruby/Ruby.sublime-syntax",
+							"tab_size": 2,
+							"translate_tabs_to_spaces": true
+						},
+						"translation.x": 0.0,
+						"translation.y": 0.0,
+						"zoom_level": 1.0
+					},
+					"stack_index": 0,
+					"type": "text"
+				}
 			]
 		}
 	],
diff --git a/vipra-cmd/.classpath b/vipra-cmd/.classpath
index c1b25c8a751fc3ec42efe035c20381dd4fc58d28..f83898bb2bbe1b2b46a8e71244628070dd23373f 100644
--- a/vipra-cmd/.classpath
+++ b/vipra-cmd/.classpath
@@ -31,7 +31,7 @@
 	<classpathentry combineaccessrules="false" kind="src" path="/vipra-util"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7">
 		<attributes>
-			<attribute name="owner.project.facets" value="java"/>
+			<attribute name="maven.pomderived" value="true"/>
 		</attributes>
 	</classpathentry>
 	<classpathentry kind="output" path="target/classes"/>
diff --git a/vipra-cmd/.project b/vipra-cmd/.project
index e6b85466c1e3c9aa9198c926ed97d5b7c87344ed..3ac9cb904e07c158393db9e1b69cfe3cb80a2da6 100644
--- a/vipra-cmd/.project
+++ b/vipra-cmd/.project
@@ -33,4 +33,11 @@
 		<nature>org.eclipse.m2e.core.maven2Nature</nature>
 		<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
 	</natures>
+	<linkedResources>
+		<link>
+			<name>src/main/resources/config.properties</name>
+			<type>1</type>
+			<locationURI>PARENT-1-PROJECT_LOC/vipra-config/config.properties</locationURI>
+		</link>
+	</linkedResources>
 </projectDescription>
diff --git a/vipra-cmd/.settings/org.eclipse.jdt.core.prefs b/vipra-cmd/.settings/org.eclipse.jdt.core.prefs
index 7677f45f763923b768652ded0a1422b2b83c6d77..cf43e3192a4851c9a5dd6821730ed9cf12c24559 100644
--- a/vipra-cmd/.settings/org.eclipse.jdt.core.prefs
+++ b/vipra-cmd/.settings/org.eclipse.jdt.core.prefs
@@ -62,7 +62,7 @@ org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
 org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
 org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
 org.eclipse.jdt.core.formatter.comment.format_block_comments=true
-org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_header=true
 org.eclipse.jdt.core.formatter.comment.format_html=true
 org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
 org.eclipse.jdt.core.formatter.comment.format_line_comments=true
@@ -91,7 +91,7 @@ org.eclipse.jdt.core.formatter.indent_empty_lines=false
 org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
 org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
 org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
 org.eclipse.jdt.core.formatter.indentation.size=4
 org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
 org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
@@ -278,10 +278,10 @@ org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_decla
 org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
 org.eclipse.jdt.core.formatter.join_lines_in_comments=true
 org.eclipse.jdt.core.formatter.join_wrapped_lines=true
-org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=true
 org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=true
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=true
 org.eclipse.jdt.core.formatter.lineSplit=120
 org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
 org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
@@ -290,7 +290,7 @@ org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
 org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
 org.eclipse.jdt.core.formatter.tabulation.char=tab
 org.eclipse.jdt.core.formatter.tabulation.size=4
-org.eclipse.jdt.core.formatter.use_on_off_tags=false
+org.eclipse.jdt.core.formatter.use_on_off_tags=true
 org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
 org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
 org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
diff --git a/vipra-cmd/.settings/org.eclipse.wst.common.component b/vipra-cmd/.settings/org.eclipse.wst.common.component
index e412462abbe92e089eeb6dac6733233d21e734d0..ec7635d9ec5720876c9b0971d2e37846e10ffad3 100644
--- a/vipra-cmd/.settings/org.eclipse.wst.common.component
+++ b/vipra-cmd/.settings/org.eclipse.wst.common.component
@@ -2,7 +2,5 @@
     <wb-module deploy-name="vipra-cmd">
         <wb-resource deploy-path="/" source-path="/src/main/java"/>
         <wb-resource deploy-path="/" source-path="/src/main/resources"/>
-        <wb-resource deploy-path="/" source-path="/src/test/java"/>
-        <wb-resource deploy-path="/" source-path="/src/test/resources"/>
     </wb-module>
 </project-modules>
diff --git a/vipra-cmd/build.xml b/vipra-cmd/build.xml
index e2083f7fb6ab6854f5bd1530ede71474479c954c..9b61c8d796cb4213c1c93de6e25bfdc04e865000 100644
--- a/vipra-cmd/build.xml
+++ b/vipra-cmd/build.xml
@@ -21,7 +21,37 @@
             <zipfileset excludes="META-INF/*.SF" src="/home/eike/.m2/repository/org/mongodb/mongodb-driver/3.0.4/mongodb-driver-3.0.4.jar"/>
             <zipfileset excludes="META-INF/*.SF" src="/home/eike/.m2/repository/org/mongodb/bson/3.0.4/bson-3.0.4.jar"/>
             <zipfileset excludes="META-INF/*.SF" src="/home/eike/.m2/repository/org/mongodb/mongodb-driver-core/3.0.4/mongodb-driver-core-3.0.4.jar"/>
+            <zipfileset excludes="META-INF/*.SF" src="/home/eike/.m2/repository/org/elasticsearch/elasticsearch/2.1.0/elasticsearch-2.1.0.jar"/>
+            <zipfileset excludes="META-INF/*.SF" src="/home/eike/.m2/repository/org/apache/lucene/lucene-core/5.3.1/lucene-core-5.3.1.jar"/>
+            <zipfileset excludes="META-INF/*.SF" src="/home/eike/.m2/repository/org/apache/lucene/lucene-backward-codecs/5.3.1/lucene-backward-codecs-5.3.1.jar"/>
+            <zipfileset excludes="META-INF/*.SF" src="/home/eike/.m2/repository/org/apache/lucene/lucene-analyzers-common/5.3.1/lucene-analyzers-common-5.3.1.jar"/>
+            <zipfileset excludes="META-INF/*.SF" src="/home/eike/.m2/repository/org/apache/lucene/lucene-queries/5.3.1/lucene-queries-5.3.1.jar"/>
+            <zipfileset excludes="META-INF/*.SF" src="/home/eike/.m2/repository/org/apache/lucene/lucene-memory/5.3.1/lucene-memory-5.3.1.jar"/>
+            <zipfileset excludes="META-INF/*.SF" src="/home/eike/.m2/repository/org/apache/lucene/lucene-highlighter/5.3.1/lucene-highlighter-5.3.1.jar"/>
+            <zipfileset excludes="META-INF/*.SF" src="/home/eike/.m2/repository/org/apache/lucene/lucene-queryparser/5.3.1/lucene-queryparser-5.3.1.jar"/>
+            <zipfileset excludes="META-INF/*.SF" src="/home/eike/.m2/repository/org/apache/lucene/lucene-sandbox/5.3.1/lucene-sandbox-5.3.1.jar"/>
+            <zipfileset excludes="META-INF/*.SF" src="/home/eike/.m2/repository/org/apache/lucene/lucene-suggest/5.3.1/lucene-suggest-5.3.1.jar"/>
+            <zipfileset excludes="META-INF/*.SF" src="/home/eike/.m2/repository/org/apache/lucene/lucene-misc/5.3.1/lucene-misc-5.3.1.jar"/>
+            <zipfileset excludes="META-INF/*.SF" src="/home/eike/.m2/repository/org/apache/lucene/lucene-join/5.3.1/lucene-join-5.3.1.jar"/>
+            <zipfileset excludes="META-INF/*.SF" src="/home/eike/.m2/repository/org/apache/lucene/lucene-grouping/5.3.1/lucene-grouping-5.3.1.jar"/>
+            <zipfileset excludes="META-INF/*.SF" src="/home/eike/.m2/repository/org/apache/lucene/lucene-spatial/5.3.1/lucene-spatial-5.3.1.jar"/>
+            <zipfileset excludes="META-INF/*.SF" src="/home/eike/.m2/repository/org/apache/lucene/lucene-spatial3d/5.3.1/lucene-spatial3d-5.3.1.jar"/>
+            <zipfileset excludes="META-INF/*.SF" src="/home/eike/.m2/repository/com/spatial4j/spatial4j/0.4.1/spatial4j-0.4.1.jar"/>
+            <zipfileset excludes="META-INF/*.SF" src="/home/eike/.m2/repository/com/google/guava/guava/18.0/guava-18.0.jar"/>
+            <zipfileset excludes="META-INF/*.SF" src="/home/eike/.m2/repository/com/carrotsearch/hppc/0.7.1/hppc-0.7.1.jar"/>
+            <zipfileset excludes="META-INF/*.SF" src="/home/eike/.m2/repository/joda-time/joda-time/2.8.2/joda-time-2.8.2.jar"/>
+            <zipfileset excludes="META-INF/*.SF" src="/home/eike/.m2/repository/org/joda/joda-convert/1.2/joda-convert-1.2.jar"/>
+            <zipfileset excludes="META-INF/*.SF" src="/home/eike/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.6.2/jackson-core-2.6.2.jar"/>
+            <zipfileset excludes="META-INF/*.SF" src="/home/eike/.m2/repository/com/fasterxml/jackson/dataformat/jackson-dataformat-smile/2.6.2/jackson-dataformat-smile-2.6.2.jar"/>
+            <zipfileset excludes="META-INF/*.SF" src="/home/eike/.m2/repository/com/fasterxml/jackson/dataformat/jackson-dataformat-yaml/2.6.2/jackson-dataformat-yaml-2.6.2.jar"/>
+            <zipfileset excludes="META-INF/*.SF" src="/home/eike/.m2/repository/org/yaml/snakeyaml/1.15/snakeyaml-1.15.jar"/>
+            <zipfileset excludes="META-INF/*.SF" src="/home/eike/.m2/repository/com/fasterxml/jackson/dataformat/jackson-dataformat-cbor/2.6.2/jackson-dataformat-cbor-2.6.2.jar"/>
+            <zipfileset excludes="META-INF/*.SF" src="/home/eike/.m2/repository/io/netty/netty/3.10.5.Final/netty-3.10.5.Final.jar"/>
+            <zipfileset excludes="META-INF/*.SF" src="/home/eike/.m2/repository/com/ning/compress-lzf/1.0.2/compress-lzf-1.0.2.jar"/>
+            <zipfileset excludes="META-INF/*.SF" src="/home/eike/.m2/repository/com/tdunning/t-digest/3.0/t-digest-3.0.jar"/>
+            <zipfileset excludes="META-INF/*.SF" src="/home/eike/.m2/repository/org/hdrhistogram/HdrHistogram/2.1.6/HdrHistogram-2.1.6.jar"/>
             <zipfileset excludes="META-INF/*.SF" src="/home/eike/.m2/repository/commons-cli/commons-cli/1.3.1/commons-cli-1.3.1.jar"/>
+            <zipfileset excludes="META-INF/*.SF" src="/home/eike/.m2/repository/com/twitter/jsr166e/1.1.0/jsr166e-1.1.0.jar"/>
             <zipfileset excludes="META-INF/*.SF" src="/home/eike/.m2/repository/commons-io/commons-io/2.4/commons-io-2.4.jar"/>
             <zipfileset excludes="META-INF/*.SF" src="/home/eike/.m2/repository/com/googlecode/json-simple/json-simple/1.1.1/json-simple-1.1.1.jar"/>
             <zipfileset excludes="META-INF/*.SF" src="/home/eike/.m2/repository/junit/junit/4.12/junit-4.12.jar"/>
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 8065ebc5a9804ed40e6d21ce013707ebe649ccc4..152984f968376419d3a6bbcf7d16ced9e464768b 100644
--- a/vipra-cmd/src/main/java/de/vipra/cmd/Main.java
+++ b/vipra-cmd/src/main/java/de/vipra/cmd/Main.java
@@ -1,5 +1,9 @@
 package de.vipra.cmd;
 
+import static de.vipra.cmd.CmdOptions.OPT_HELP;
+import static de.vipra.cmd.CmdOptions.OPT_IMPORT;
+import static de.vipra.cmd.CmdOptions.OPT_SHELL;
+
 import java.io.IOException;
 
 import org.apache.commons.cli.CommandLine;
@@ -12,8 +16,6 @@ import org.slf4j.LoggerFactory;
 import de.vipra.cmd.option.ImportOption;
 import de.vipra.util.ConfigException;
 
-import static de.vipra.cmd.CmdOptions.*;
-
 public class Main {
 
 	public static final Logger log = LoggerFactory.getLogger(Main.class);
diff --git a/vipra-cmd/src/main/java/de/vipra/cmd/model/Article.java b/vipra-cmd/src/main/java/de/vipra/cmd/model/Article.java
new file mode 100644
index 0000000000000000000000000000000000000000..14fe2ea32125b1990127222d5b678f5e41a9d34a
--- /dev/null
+++ b/vipra-cmd/src/main/java/de/vipra/cmd/model/Article.java
@@ -0,0 +1,14 @@
+package de.vipra.cmd.model;
+
+import org.json.simple.JSONObject;
+
+public class Article extends de.vipra.util.model.Article {
+
+	public void fromJSON(JSONObject obj) {
+		if (obj.containsKey("title")) setTitle(obj.get("title").toString());
+		if (obj.containsKey("text")) setText(obj.get("text").toString());
+		if (obj.containsKey("url")) setUrl(obj.get("url").toString());
+		if (obj.containsKey("date")) setDate(obj.get("date").toString());
+	}
+
+}
diff --git a/vipra-cmd/src/main/java/de/vipra/cmd/option/ImportOption.java b/vipra-cmd/src/main/java/de/vipra/cmd/option/ImportOption.java
index 7f3fcddbd7693b0ae5075efb2715964fe145eaad..c7eb054608859c2f854c7febd03cf14c7bc8f5cc 100644
--- a/vipra-cmd/src/main/java/de/vipra/cmd/option/ImportOption.java
+++ b/vipra-cmd/src/main/java/de/vipra/cmd/option/ImportOption.java
@@ -7,6 +7,7 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.bson.Document;
 import org.json.simple.JSONArray;
 import org.json.simple.JSONObject;
 import org.json.simple.parser.JSONParser;
@@ -14,9 +15,14 @@ import org.json.simple.parser.ParseException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.mongodb.client.MongoCollection;
+import com.mongodb.client.MongoDatabase;
+
 import de.vipra.cmd.ExecutionException;
+import de.vipra.cmd.model.Article;
 import de.vipra.util.Config;
 import de.vipra.util.ConfigException;
+import de.vipra.util.Constants;
 import de.vipra.util.Mongo;
 import de.vipra.util.StringUtils;
 
@@ -28,7 +34,7 @@ public class ImportOption {
 	private ArrayList<File> files = new ArrayList<>();
 	private JSONParser parser = new JSONParser();
 	private Config config;
-	private Mongo mongo;
+	private MongoCollection<Document> collection;
 
 	public ImportOption(String[] paths) throws ExecutionException {
 		addPaths(paths);
@@ -80,7 +86,15 @@ public class ImportOption {
 		try {
 			JSONArray array = (JSONArray) data;
 			for (Object object : array) {
-				importArticle((JSONObject) object);
+				List<Exception> errors = new ArrayList<>();
+				try {
+					importArticle((JSONObject) object);
+				} catch (ExecutionException e) {
+					errors.add(e);
+				}
+				if (errors.size() > 0) {
+					throw new ExecutionException(errors);
+				}
 			}
 			return;
 		} catch (ClassCastException e) {
@@ -92,18 +106,30 @@ public class ImportOption {
 		}
 	}
 
-	private void importArticle(JSONObject obj) {
-		// 1. add article to mongodb
+	private void importArticle(JSONObject obj) throws ExecutionException {
 		// 2. add article to file database
 		// 4. topic modeling
 		// 3. index article via elasticsearch, include topics
 		out.info("importing \"" + StringUtils.ellipsize(obj.get("title").toString(), 80) + "\"");
+		Article article = new Article();
+		article.fromJSON(obj);
+
+		// add article to mongodb
+		Document document = article.toDocument();
+		try {
+			collection.insertOne(document);
+		} catch (Exception e) {
+			throw new ExecutionException("could not create database entry: " + e.getMessage());
+		}
+
 	}
 
 	public void doImport() throws ExecutionException {
 		try {
 			config = new Config();
-			mongo = Mongo.getInstance(config);
+			Mongo mongo = Mongo.getInstance(config);
+			MongoDatabase db = mongo.getDatabase();
+			collection = db.getCollection(Constants.Collection.ARTICLES.name);
 		} catch (IOException | ConfigException e) {
 			throw new ExecutionException(e);
 		}
diff --git a/vipra-cmd/src/main/resources/config.properties b/vipra-cmd/src/main/resources/config.properties
deleted file mode 100644
index 07030840d45dd8fed8c2c2d5bff5fe0a54939a4f..0000000000000000000000000000000000000000
--- a/vipra-cmd/src/main/resources/config.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-db.host=localhost
-db.port=27017
-db.name=test
\ No newline at end of file
diff --git a/vipra-config/config.properties b/vipra-config/config.properties
new file mode 100644
index 0000000000000000000000000000000000000000..06623e215e66a3dfaefbdf3baabce5e5aeb14412
--- /dev/null
+++ b/vipra-config/config.properties
@@ -0,0 +1,5 @@
+db.host=localhost
+db.port=27017
+db.name=test
+
+fb.path=${datadir}/vipra
\ No newline at end of file
diff --git a/vipra-rest/.classpath b/vipra-rest/.classpath
index d8728319c5ba6bfc3e74f4b13ce346e356fab451..c1e791eb0bd8209acbe226577fab51d5c4bfc7e0 100644
--- a/vipra-rest/.classpath
+++ b/vipra-rest/.classpath
@@ -30,7 +30,7 @@
 	</classpathentry>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7">
 		<attributes>
-			<attribute name="owner.project.facets" value="java"/>
+			<attribute name="maven.pomderived" value="true"/>
 		</attributes>
 	</classpathentry>
 	<classpathentry combineaccessrules="false" kind="src" path="/vipra-util"/>
diff --git a/vipra-rest/.project b/vipra-rest/.project
index e24244ea68a972f817781145661bc0723916096b..7641716f5406382c8b896bb6aa2c95959d062e07 100644
--- a/vipra-rest/.project
+++ b/vipra-rest/.project
@@ -41,4 +41,11 @@
 		<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
 		<nature>org.eclipse.wst.jsdt.core.jsNature</nature>
 	</natures>
+	<linkedResources>
+		<link>
+			<name>src/main/resources/config.properties</name>
+			<type>1</type>
+			<locationURI>PARENT-1-PROJECT_LOC/vipra-config/config.properties</locationURI>
+		</link>
+	</linkedResources>
 </projectDescription>
diff --git a/vipra-rest/.settings/org.eclipse.wst.common.component b/vipra-rest/.settings/org.eclipse.wst.common.component
index df9f1cfb7b6d2d1e0bfd7425e36690f2b9f64b0c..07bb526364819fa2125c5a4a6f2b1a060f873764 100644
--- a/vipra-rest/.settings/org.eclipse.wst.common.component
+++ b/vipra-rest/.settings/org.eclipse.wst.common.component
@@ -4,10 +4,7 @@
         <wb-resource deploy-path="/" source-path="/src/main/webapp" tag="defaultRootSource"/>
         <wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/java"/>
         <wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/resources"/>
-        <dependent-module archiveName="vipra-util.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/vipra-util/vipra-util">
-            <dependency-type>uses</dependency-type>
-        </dependent-module>
         <property name="java-output-path" value="/vipra-rest/target/classes"/>
-        <property name="context-root" value="vipra-rest"/>
+        <property name="context-root" value="rest"/>
     </wb-module>
 </project-modules>
diff --git a/vipra-rest/src/main/java/de/vipra/rest/provider/ObjectMapperProvider.java b/vipra-rest/src/main/java/de/vipra/rest/provider/ObjectMapperProvider.java
index aea09a8050ac65fdb3cf10be46d4004d33210450..4c8231addf429dd7898ddd8f561fff862c127e5b 100644
--- a/vipra-rest/src/main/java/de/vipra/rest/provider/ObjectMapperProvider.java
+++ b/vipra-rest/src/main/java/de/vipra/rest/provider/ObjectMapperProvider.java
@@ -13,9 +13,9 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.SerializationFeature;
 import com.fasterxml.jackson.databind.module.SimpleModule;
 
+import de.vipra.rest.model.Article;
 import de.vipra.rest.serializer.ArticleDeserializer;
 import de.vipra.rest.serializer.ArticleSerializer;
-import de.vipra.rest.model.Article;
 
 @Provider
 public class ObjectMapperProvider implements ContextResolver<ObjectMapper> {
diff --git a/vipra-rest/src/main/java/de/vipra/rest/provider/PatchReaderInterceptor.java b/vipra-rest/src/main/java/de/vipra/rest/provider/PatchReaderInterceptor.java
index ea7f724260cff7dda1443bdb440733c32705a1ba..ac4c7179e7ccf844824b72a4c713495cb2849010 100644
--- a/vipra-rest/src/main/java/de/vipra/rest/provider/PatchReaderInterceptor.java
+++ b/vipra-rest/src/main/java/de/vipra/rest/provider/PatchReaderInterceptor.java
@@ -1,17 +1,8 @@
 package de.vipra.rest.provider;
 
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-import com.github.fge.jsonpatch.JsonPatch;
-import com.github.fge.jsonpatch.JsonPatchException;
-
-import de.vipra.rest.PATCH;
-
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
-
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Method;
 
@@ -29,6 +20,13 @@ import javax.ws.rs.ext.ReaderInterceptorContext;
 
 import org.glassfish.jersey.message.MessageBodyWorkers;
 
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.github.fge.jsonpatch.JsonPatch;
+import com.github.fge.jsonpatch.JsonPatchException;
+
+import de.vipra.rest.PATCH;
+
 @Provider
 @PATCH
 public class PatchReaderInterceptor implements ReaderInterceptor {
diff --git a/vipra-rest/src/main/java/de/vipra/rest/serializer/ArticleDeserializer.java b/vipra-rest/src/main/java/de/vipra/rest/serializer/ArticleDeserializer.java
index 14c531038b1b9334e97e699ef9ecc4504439a6cd..b87ce0b3fd114e68c645e34ec18cfffb5efe6fef 100644
--- a/vipra-rest/src/main/java/de/vipra/rest/serializer/ArticleDeserializer.java
+++ b/vipra-rest/src/main/java/de/vipra/rest/serializer/ArticleDeserializer.java
@@ -1,5 +1,8 @@
 package de.vipra.rest.serializer;
 
+import static de.vipra.rest.serializer.JsonHelper.getString;
+import static de.vipra.rest.serializer.JsonHelper.stringToDate;
+
 import java.io.IOException;
 
 import com.fasterxml.jackson.core.JsonParser;
@@ -10,8 +13,6 @@ import com.fasterxml.jackson.databind.JsonNode;
 
 import de.vipra.rest.model.Article;
 
-import static de.vipra.rest.serializer.JsonHelper.*;
-
 public class ArticleDeserializer extends JsonDeserializer<Article> {
 
 	@Override
diff --git a/vipra-rest/src/main/java/de/vipra/rest/serializer/ArticleSerializer.java b/vipra-rest/src/main/java/de/vipra/rest/serializer/ArticleSerializer.java
index c241ce97af969b4acb6954d8e0cf4e9b27ed77b3..071fcdef42e6c7df408fc534003df89a59767e61 100644
--- a/vipra-rest/src/main/java/de/vipra/rest/serializer/ArticleSerializer.java
+++ b/vipra-rest/src/main/java/de/vipra/rest/serializer/ArticleSerializer.java
@@ -1,6 +1,6 @@
 package de.vipra.rest.serializer;
 
-import de.vipra.rest.model.Article;
+import static de.vipra.rest.serializer.JsonHelper.dateToString;
 
 import java.io.IOException;
 
@@ -9,7 +9,7 @@ import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.JsonSerializer;
 import com.fasterxml.jackson.databind.SerializerProvider;
 
-import static de.vipra.rest.serializer.JsonHelper.*;
+import de.vipra.rest.model.Article;
 
 public class ArticleSerializer extends JsonSerializer<Article> {
 
diff --git a/vipra-rest/src/main/java/de/vipra/rest/service/ArticleService.java b/vipra-rest/src/main/java/de/vipra/rest/service/ArticleService.java
index 09444254534b927ad9ca529124afeaaca741f2a6..4f7c1e9310e775f3bc2cdddbd30e59e62435ce7c 100644
--- a/vipra-rest/src/main/java/de/vipra/rest/service/ArticleService.java
+++ b/vipra-rest/src/main/java/de/vipra/rest/service/ArticleService.java
@@ -4,13 +4,14 @@ import java.net.URI;
 import java.util.ArrayList;
 
 import de.vipra.rest.model.Article;
+import de.vipra.util.Constants;
 import de.vipra.util.Mongo;
-import de.vipra.util.service.ModelService;
+import de.vipra.util.service.DatabaseService;
 
-public class ArticleService extends ModelService<Article> {
+public class ArticleService extends DatabaseService<Article> {
 
 	public ArticleService(Mongo mongo) {
-		super(mongo, "articles", Article.class);
+		super(mongo, Constants.Collection.ARTICLES, Article.class);
 	}
 
 	public Article getArticle(URI base, String id) {
diff --git a/vipra-rest/src/main/resources/config.properties b/vipra-rest/src/main/resources/config.properties
deleted file mode 100644
index 07030840d45dd8fed8c2c2d5bff5fe0a54939a4f..0000000000000000000000000000000000000000
--- a/vipra-rest/src/main/resources/config.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-db.host=localhost
-db.port=27017
-db.name=test
\ No newline at end of file
diff --git a/vipra-rest/src/test/java/de/vipra/rest/resource/ArticleResourceTest.java b/vipra-rest/src/test/java/de/vipra/rest/resource/ArticleResourceTest.java
index 7ef0949f4b49cbaa15e53a9b0c6cb74711b9f2a5..9d4e60c34c66cdecc44f6f4bbb0fc824ebd42cc0 100644
--- a/vipra-rest/src/test/java/de/vipra/rest/resource/ArticleResourceTest.java
+++ b/vipra-rest/src/test/java/de/vipra/rest/resource/ArticleResourceTest.java
@@ -1,6 +1,6 @@
 package de.vipra.rest.resource;
 
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
 
 import javax.ws.rs.core.Application;
 import javax.ws.rs.core.Response;
@@ -9,8 +9,6 @@ import org.glassfish.jersey.server.ResourceConfig;
 import org.glassfish.jersey.test.JerseyTest;
 import org.junit.Test;
 
-import de.vipra.rest.resource.ArticleResource;
-
 public class ArticleResourceTest extends JerseyTest {
 
 	@Override
diff --git a/vipra-util/.classpath b/vipra-util/.classpath
index 7673637b2561b9ca3c4c27f60fb951f09e52b948..13c35ff075287036386ea459ee87b13c4e6be365 100644
--- a/vipra-util/.classpath
+++ b/vipra-util/.classpath
@@ -17,15 +17,15 @@
 			<attribute name="org.eclipse.jst.component.nondependency" value=""/>
 		</attributes>
 	</classpathentry>
-	<classpathentry kind="src" output="target/test-classes" path="src/test/java">
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7">
 		<attributes>
-			<attribute name="optional" value="true"/>
 			<attribute name="maven.pomderived" value="true"/>
 		</attributes>
 	</classpathentry>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7">
+	<classpathentry kind="src" output="target/test-classes" path="src/test/java">
 		<attributes>
-			<attribute name="owner.project.facets" value="java"/>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
 		</attributes>
 	</classpathentry>
 	<classpathentry kind="output" path="target/classes"/>
diff --git a/vipra-util/.project b/vipra-util/.project
index 3eb2ee19593ed7f5d6c146794b6965a00956e603..97df63f9e9fce517725586539ba319c7ccfedbbd 100644
--- a/vipra-util/.project
+++ b/vipra-util/.project
@@ -33,4 +33,11 @@
 		<nature>org.eclipse.jdt.core.javanature</nature>
 		<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
 	</natures>
+	<linkedResources>
+		<link>
+			<name>src/main/resources/config.properties</name>
+			<type>1</type>
+			<locationURI>PARENT-1-PROJECT_LOC/vipra-config/config.properties</locationURI>
+		</link>
+	</linkedResources>
 </projectDescription>
diff --git a/vipra-util/.settings/org.eclipse.jdt.core.prefs b/vipra-util/.settings/org.eclipse.jdt.core.prefs
index ffc246f72fb78c1ae361528ae342d1b453c60b82..57fd9ccb7a5acf365ce1fead974419e24de10b66 100644
--- a/vipra-util/.settings/org.eclipse.jdt.core.prefs
+++ b/vipra-util/.settings/org.eclipse.jdt.core.prefs
@@ -61,7 +61,7 @@ org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
 org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
 org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
 org.eclipse.jdt.core.formatter.comment.format_block_comments=true
-org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_header=true
 org.eclipse.jdt.core.formatter.comment.format_html=true
 org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
 org.eclipse.jdt.core.formatter.comment.format_line_comments=true
@@ -90,7 +90,7 @@ org.eclipse.jdt.core.formatter.indent_empty_lines=false
 org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
 org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
 org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
 org.eclipse.jdt.core.formatter.indentation.size=4
 org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
 org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
@@ -277,10 +277,10 @@ org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_decla
 org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
 org.eclipse.jdt.core.formatter.join_lines_in_comments=true
 org.eclipse.jdt.core.formatter.join_wrapped_lines=true
-org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=true
 org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=true
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=true
 org.eclipse.jdt.core.formatter.lineSplit=120
 org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
 org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
@@ -289,7 +289,7 @@ org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
 org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
 org.eclipse.jdt.core.formatter.tabulation.char=tab
 org.eclipse.jdt.core.formatter.tabulation.size=4
-org.eclipse.jdt.core.formatter.use_on_off_tags=false
+org.eclipse.jdt.core.formatter.use_on_off_tags=true
 org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
 org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
 org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
diff --git a/vipra-util/pom.xml b/vipra-util/pom.xml
index c48b7dc1a70a22a9fae7b8d62c347fa1ae2a090f..03b50d666602ba831e271cbb6881b3356e9b4b27 100644
--- a/vipra-util/pom.xml
+++ b/vipra-util/pom.xml
@@ -13,6 +13,12 @@
 	</properties>
 
 	<dependencies>
+		<dependency>
+			<groupId>commons-io</groupId>
+			<artifactId>commons-io</artifactId>
+			<version>2.4</version>
+		</dependency>
+		
 		<!-- Logging -->
 		<dependency>
 			<groupId>org.apache.logging.log4j</groupId>
diff --git a/vipra-util/src/main/java/META-INF/MANIFEST.MF b/vipra-util/src/main/java/META-INF/MANIFEST.MF
deleted file mode 100644
index 5e9495128c0376427420c4189993b3851770b702..0000000000000000000000000000000000000000
--- a/vipra-util/src/main/java/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,3 +0,0 @@
-Manifest-Version: 1.0
-Class-Path: 
-
diff --git a/vipra-util/src/main/java/de/vipra/util/Constants.java b/vipra-util/src/main/java/de/vipra/util/Constants.java
new file mode 100644
index 0000000000000000000000000000000000000000..fe0679afe7d3a83013928e66324a931f6da31173
--- /dev/null
+++ b/vipra-util/src/main/java/de/vipra/util/Constants.java
@@ -0,0 +1,25 @@
+package de.vipra.util;
+
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+
+public class Constants {
+
+	public static final String FB_DIR = "vipra";
+	public static final Charset FB_ENCODING = StandardCharsets.UTF_8;
+
+	public static final String DEFAULT_HOST = "localhost";
+	public static final int DEFAULT_PORT = 27017;
+	public static final String DEFAULT_DB = "test";
+
+	public static enum Collection {
+		ARTICLES("articles");
+
+		public final String name;
+
+		private Collection(String name) {
+			this.name = name;
+		}
+	}
+
+}
diff --git a/vipra-util/src/main/java/de/vipra/util/FileUtils.java b/vipra-util/src/main/java/de/vipra/util/FileUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..397610a4c8a7310de539fab2c234e8415a170a42
--- /dev/null
+++ b/vipra-util/src/main/java/de/vipra/util/FileUtils.java
@@ -0,0 +1,15 @@
+package de.vipra.util;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.List;
+
+public class FileUtils extends org.apache.commons.io.FileUtils {
+
+	public static List<String> readFile(File file) throws IOException {
+		return Files.readAllLines(Paths.get(file.getAbsolutePath()), Constants.FB_ENCODING);
+	}
+
+}
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 73628bd0be1064b622c2860f14b766ba7a671e03..2973d5f5d2ccfc84ba21c0bfef0b80cf7a020be5 100644
--- a/vipra-util/src/main/java/de/vipra/util/Mongo.java
+++ b/vipra-util/src/main/java/de/vipra/util/Mongo.java
@@ -5,7 +5,6 @@ import org.slf4j.LoggerFactory;
 
 import com.mongodb.MongoClient;
 import com.mongodb.client.MongoDatabase;
-import de.vipra.util.Config;
 
 public class Mongo {
 
@@ -17,9 +16,9 @@ public class Mongo {
 	private final MongoDatabase database;
 
 	private Mongo(Config config) throws ConfigException {
-		String host = config.getString("db.host");
-		Integer port = config.getInt("db.port");
-		String databaseName = config.getString("db.name");
+		String host = config.getString("db.host", Constants.DEFAULT_HOST);
+		Integer port = config.getInt("db.port", Constants.DEFAULT_PORT);
+		String databaseName = config.getString("db.name", Constants.DEFAULT_DB);
 
 		if (host == null || port == null || databaseName == null) {
 			log.error("host/port/dbname missing in configuration");
diff --git a/vipra-util/src/main/java/de/vipra/util/helper/MongoHelper.java b/vipra-util/src/main/java/de/vipra/util/MongoUtils.java
similarity index 74%
rename from vipra-util/src/main/java/de/vipra/util/helper/MongoHelper.java
rename to vipra-util/src/main/java/de/vipra/util/MongoUtils.java
index 5b39e776c590ae5c2f96f51749f1e860deebec66..790a6116082d448d04db1841dc11bb4b131eb70f 100644
--- a/vipra-util/src/main/java/de/vipra/util/helper/MongoHelper.java
+++ b/vipra-util/src/main/java/de/vipra/util/MongoUtils.java
@@ -1,13 +1,15 @@
-package de.vipra.util.helper;
+package de.vipra.util;
+
+import static com.mongodb.client.model.Sorts.ascending;
+import static com.mongodb.client.model.Sorts.descending;
+import static com.mongodb.client.model.Sorts.orderBy;
 
 import java.util.ArrayList;
 
 import org.bson.conversions.Bson;
 import org.bson.types.ObjectId;
 
-import static com.mongodb.client.model.Sorts.*;
-
-public class MongoHelper {
+public class MongoUtils {
 
 	public static Bson getSorts(String sortBy) {
 		String[] sortKeys = sortBy.split(",");
diff --git a/vipra-util/src/main/java/de/vipra/util/PathUtils.java b/vipra-util/src/main/java/de/vipra/util/PathUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..b5979fe2fa0c4329938f39808978af2aa7705f84
--- /dev/null
+++ b/vipra-util/src/main/java/de/vipra/util/PathUtils.java
@@ -0,0 +1,22 @@
+package de.vipra.util;
+
+import java.io.File;
+
+public class PathUtils {
+
+	public static File userConfigDir() {
+		String os = System.getProperty("os.name").toUpperCase();
+		File base = null;
+		if (os.contains("WIN")) {
+			base = new File(System.getProperty("APPDATA"));
+		} else if (os.contains("MAC")) {
+			base = new File(System.getProperty("user.home") + File.pathSeparator + "Library" + File.pathSeparator
+					+ "ApplicationSupport");
+		} else if (os.contains("NIX")) {
+			base = new File(
+					System.getProperty("user.home") + File.pathSeparator + ".local" + File.pathSeparator + "share");
+		}
+		return base;
+	}
+
+}
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 097975210381fbc6170732885360132134b88ea3..3070548497f20a558d0ba0c039d6b1626075b92d 100644
--- a/vipra-util/src/main/java/de/vipra/util/StringUtils.java
+++ b/vipra-util/src/main/java/de/vipra/util/StringUtils.java
@@ -10,4 +10,14 @@ public class StringUtils {
 		return input.substring(0, maxLength - ellip.length()).concat(ellip);
 	}
 
+	public static String join(Iterable<String> it) {
+		StringBuilder sb = new StringBuilder();
+		String sep = "";
+		for (String s : it) {
+			sb.append(sep).append(s);
+			sep = " ";
+		}
+		return sb.toString();
+	}
+
 }
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 77d2d07dd25b6db5ae1f1cee275c5d82c6646b79..60f2e6edc756e814d6a97adf76fcbee6ba8cb1a8 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
@@ -1,10 +1,18 @@
 package de.vipra.util.model;
 
+import java.io.File;
+import java.io.IOException;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
 import java.util.Date;
+import java.util.List;
 
 import org.bson.Document;
 import org.bson.types.ObjectId;
 
+import de.vipra.util.FileUtils;
+import de.vipra.util.StringUtils;
+
 public class Article extends Model {
 
 	private String title;
@@ -44,6 +52,14 @@ public class Article extends Model {
 		this.date = date;
 	}
 
+	public void setDate(String date) {
+		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
+		try {
+			setDate(df.parse(date));
+		} catch (ParseException e) {}
+	}
+
+	@Override
 	public String getType() {
 		return Article.class.getSimpleName().toLowerCase();
 	}
@@ -66,4 +82,16 @@ public class Article extends Model {
 		setDate(document.getDate("date"));
 	}
 
+	@Override
+	public void fromFile(File file) throws IOException {
+		List<String> lines = FileUtils.readFile(file);
+		setTitle(lines.get(0));
+		setText(StringUtils.join(lines.subList(1, lines.size())));
+	}
+
+	@Override
+	public String toFileString() {
+		return getTitle() + "\n" + getText();
+	}
+
 }
\ No newline at end of file
diff --git a/vipra-util/src/main/java/de/vipra/util/model/Model.java b/vipra-util/src/main/java/de/vipra/util/model/Model.java
index 77073b12997982363ddd51b1aa96578854bc5fe2..0009ca6f50910d94f63903f86070b17861215656 100644
--- a/vipra-util/src/main/java/de/vipra/util/model/Model.java
+++ b/vipra-util/src/main/java/de/vipra/util/model/Model.java
@@ -1,10 +1,15 @@
 package de.vipra.util.model;
 
+import java.io.File;
+import java.io.IOException;
 import java.net.URI;
 import java.net.URISyntaxException;
 
+import org.apache.commons.io.FileUtils;
 import org.bson.Document;
 
+import de.vipra.util.Constants;
+
 public abstract class Model {
 
 	private String id;
@@ -31,10 +36,23 @@ public abstract class Model {
 		}
 	}
 
+	public boolean writeToFile(File file) throws IOException {
+		if (file.exists()) {
+			String data = toFileString();
+			FileUtils.writeStringToFile(file, data, Constants.FB_ENCODING, false);
+			return true;
+		}
+		return false;
+	}
+
 	public abstract String getType();
 
 	public abstract void fromDocument(Document document);
 
 	public abstract Document toDocument();
 
+	public abstract void fromFile(File file) throws IOException;
+
+	public abstract String toFileString();
+
 }
diff --git a/vipra-util/src/main/java/de/vipra/util/service/ModelService.java b/vipra-util/src/main/java/de/vipra/util/service/DatabaseService.java
similarity index 85%
rename from vipra-util/src/main/java/de/vipra/util/service/ModelService.java
rename to vipra-util/src/main/java/de/vipra/util/service/DatabaseService.java
index d24a0b71046490876a13adfd230001c1ebe6b480..4729cf847d755d76077d28cb96a511339b67429c 100644
--- a/vipra-util/src/main/java/de/vipra/util/service/ModelService.java
+++ b/vipra-util/src/main/java/de/vipra/util/service/DatabaseService.java
@@ -1,7 +1,7 @@
 package de.vipra.util.service;
 
-import static de.vipra.util.helper.MongoHelper.getSorts;
-import static de.vipra.util.helper.MongoHelper.objectId;
+import static de.vipra.util.MongoUtils.getSorts;
+import static de.vipra.util.MongoUtils.objectId;
 
 import java.util.ArrayList;
 
@@ -14,18 +14,19 @@ import com.mongodb.client.model.Filters;
 import com.mongodb.client.result.DeleteResult;
 import com.mongodb.client.result.UpdateResult;
 
+import de.vipra.util.Constants;
 import de.vipra.util.Mongo;
 import de.vipra.util.model.Model;
 
-public class ModelService<T extends Model> {
+public class DatabaseService<T extends Model> {
 
-	private static final Logger log = LoggerFactory.getLogger(ModelService.class);
+	private static final Logger log = LoggerFactory.getLogger(DatabaseService.class);
 
 	private final MongoCollection<Document> collection;
 	private final Class<T> clazz;
 
-	public ModelService(Mongo mongo, String collectionName, Class<T> clazz) {
-		this.collection = mongo.getDatabase().getCollection(collectionName);
+	public DatabaseService(Mongo mongo, Constants.Collection collection, Class<T> clazz) {
+		this.collection = mongo.getDatabase().getCollection(collection.name);
 		this.clazz = clazz;
 	}
 
diff --git a/vipra-util/src/main/java/de/vipra/util/service/FilebaseService.java b/vipra-util/src/main/java/de/vipra/util/service/FilebaseService.java
new file mode 100644
index 0000000000000000000000000000000000000000..3dfa8c741767ca24f00bf6f477984514f248a9d3
--- /dev/null
+++ b/vipra-util/src/main/java/de/vipra/util/service/FilebaseService.java
@@ -0,0 +1,60 @@
+package de.vipra.util.service;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import de.vipra.util.model.Model;
+
+public class FilebaseService<T extends Model> {
+
+	public static final Logger log = LoggerFactory.getLogger(FilebaseService.class);
+
+	private final File directory;
+	private final Class<T> clazz;
+
+	public FilebaseService(File directory, Class<T> clazz) {
+		this.directory = directory;
+		this.clazz = clazz;
+	}
+
+	private T newT(File file) {
+		try {
+			T t = clazz.newInstance();
+			t.fromFile(file);
+			return t;
+		} catch (InstantiationException | IllegalAccessException | IllegalArgumentException | SecurityException
+				| IOException e) {
+			log.error(e.getMessage());
+			return null;
+		}
+	}
+
+	protected File getFile(String id) {
+		return new File(directory, id);
+	}
+
+	protected T getSingle(String id) {
+		File file = getFile(id);
+		return newT(file);
+	}
+
+	protected long deleteSingle(String id) {
+		File file = getFile(id);
+		if (file.exists() && file.delete()) {
+			return 1;
+		}
+		return 0;
+	}
+
+	protected long updateSingle(T t) throws IOException {
+		File file = getFile(t.getId());
+		if (file.exists()) {
+			t.writeToFile(file);
+		}
+		return 0;
+	}
+
+}
diff --git a/vipra-util/src/main/resources/config.properties b/vipra-util/src/main/resources/config.properties
deleted file mode 100644
index 07030840d45dd8fed8c2c2d5bff5fe0a54939a4f..0000000000000000000000000000000000000000
--- a/vipra-util/src/main/resources/config.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-db.host=localhost
-db.port=27017
-db.name=test
\ No newline at end of file