diff --git a/vipra-cmd/pom.xml b/vipra-cmd/pom.xml
index 591333397e2de67d754d220ad6bf14da9457ca98..e6d8ba395abdb86d4d2fa41371e6a7415326e90c 100644
--- a/vipra-cmd/pom.xml
+++ b/vipra-cmd/pom.xml
@@ -87,6 +87,16 @@
 			<artifactId>mongodb-driver</artifactId>
 			<version>3.2.0</version>
 		</dependency>
+		<dependency>
+			<groupId>org.mongodb.morphia</groupId>
+			<artifactId>morphia</artifactId>
+			<version>1.0.1</version>
+		</dependency>
+		<dependency>
+			<groupId>org.mongodb.morphia</groupId>
+			<artifactId>morphia-logging-slf4j</artifactId>
+			<version>1.0.1</version>
+		</dependency>
 
 		<!-- Testing -->
 		<dependency>
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 21ff41afd34c739464a2235d3ea1993d09a82e29..946eb6b9d5d57dacbdfde5c51a1186fbe3766805 100644
--- a/vipra-cmd/src/main/java/de/vipra/cmd/Main.java
+++ b/vipra-cmd/src/main/java/de/vipra/cmd/Main.java
@@ -16,6 +16,8 @@ import org.apache.commons.cli.CommandLine;
 import org.apache.commons.cli.CommandLineParser;
 import org.apache.commons.cli.DefaultParser;
 import org.apache.commons.cli.ParseException;
+import org.mongodb.morphia.logging.MorphiaLoggerFactory;
+import org.mongodb.morphia.logging.slf4j.SLF4JLoggerImplFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -34,6 +36,10 @@ public class Main {
 	public static final Logger log = LoggerFactory.getLogger(Main.class);
 	public static final Logger out = LoggerFactory.getLogger("shellout");
 
+	static {
+		MorphiaLoggerFactory.registerLogger(SLF4JLoggerImplFactory.class);
+	}
+
 	public static void main(String[] args) {
 		CommandLineParser parser = new DefaultParser();
 		CmdOptions options = new CmdOptions();
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 5f05e98a856994ebd3015753e67beb5af51f4d33..f23a3d2b1e3d8ba401c8a600c5ae179d47bc4714 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
@@ -47,7 +47,7 @@ public abstract class Filebase implements Closeable {
 	}
 
 	public void remove(Article article) throws FilebaseException {
-		remove(article.getId());
+		remove(article.getId().toString());
 	}
 
 	@Override
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 1195e0990a3d417c34af4841f02b17d2ad955335..1676bbdb979653c6085b8ced6fe6a03c2b10f833 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
@@ -31,7 +31,7 @@ public class JGibbFilebase extends Filebase {
 	public void add(Article article) throws FilebaseException {
 		String[] words = article.getProcessedText().getText().split("\\s+");
 		vocab.addVocabulary(words);
-		index.add(article.getId());
+		index.add(article.getId().toString());
 		articles.add(article);
 
 		if (articles.size() >= bufferMaxSize) {
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
index 7edcca04e1c916a2c207c52b84957cf38546af64..4c0bc3ca1e25af40c38e0b5b84defbaa3a48d067 100644
--- a/vipra-cmd/src/main/java/de/vipra/cmd/model/Article.java
+++ b/vipra-cmd/src/main/java/de/vipra/cmd/model/Article.java
@@ -1,11 +1,13 @@
 package de.vipra.cmd.model;
 
 import org.json.simple.JSONObject;
+import org.mongodb.morphia.annotations.Transient;
 
 import de.vipra.cmd.text.ProcessedText;
 
 public class Article extends de.vipra.util.model.Article {
 
+	@Transient
 	private ProcessedText processedText;
 
 	public ProcessedText getProcessedText() {
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 9f8ac68ac6cf5249e19b01c2ca6393237daa91b5..2cfbafd675dc7af7bbf097f59d7e38aeff23cd2e 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
@@ -57,7 +57,8 @@ public class ClearCommand implements Command {
 
 	@Override
 	public void run() throws ExecutionException {
-		out.info("to confirm clearing, type 'clear' and press enter");
+		if (!defaults)
+			out.info("to confirm clearing, type 'clear' and press enter");
 		try {
 			if (defaults || ConsoleUtils.confirm("clear")) {
 				clear();
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 07d1dea32963cc1e64dea6910b503a3fc984716a..677f5782f1f8a5a2351d56095bb55b75e99aeae6 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
@@ -108,7 +108,7 @@ public class ImportCommand implements Command {
 			// add article to filebase
 			filebase.add(article);
 		} catch (Exception e) {
-			throw new ImportException(e, article.getId());
+			throw new ImportException(e, article.getId().toString());
 		}
 	}
 
@@ -165,7 +165,7 @@ public class ImportCommand implements Command {
 		dbTopics.drop();
 		for (Topic topic : topics) {
 			Topic newTopic = dbTopics.createSingle(topic);
-			topicIndexMap.put(Integer.toString(newTopic.getIndex()), newTopic.getId());
+			topicIndexMap.put(Integer.toString(newTopic.getIndex()), newTopic.getId().toString());
 		}
 
 		return topicIndexMap;
diff --git a/vipra-rest/src/main/java/de/vipra/rest/resource/ArticleResource.java b/vipra-rest/src/main/java/de/vipra/rest/resource/ArticleResource.java
index a993eef4839af59d6460fb496b2ecbc2695bd8db..379d5f253b2609021ab5ab1dddda526311eed1e0 100644
--- a/vipra-rest/src/main/java/de/vipra/rest/resource/ArticleResource.java
+++ b/vipra-rest/src/main/java/de/vipra/rest/resource/ArticleResource.java
@@ -125,19 +125,9 @@ public class ArticleResource {
 		Article article = wrapper.getData();
 		Wrapper<Article> res = new Wrapper<>();
 		try {
-			long updated = service.updateSingle(article);
-			int updatedInt = updated > Integer.MAX_VALUE ? Integer.MAX_VALUE : (int) updated;
-			switch (updatedInt) {
-			case 0:
-				res.addError(new APIError(Response.Status.NOT_FOUND, "Article not found",
-						String.format(Messages.NOT_FOUND, "article", id)));
-				return Response.status(Response.Status.NOT_FOUND).entity(res).build();
-			case 1:
-				res.setData(article);
-				return Response.ok().entity(res).tag(res.tag()).build();
-			default:
-				return Response.serverError().build();
-			}
+			service.updateSingle(article);
+			res.setData(article);
+			return Response.ok().entity(res).tag(res.tag()).build();
 		} catch (DatabaseException e) {
 			res = new Wrapper<>(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-rest/src/main/java/de/vipra/rest/resource/TopicResource.java b/vipra-rest/src/main/java/de/vipra/rest/resource/TopicResource.java
index ada3548380e8d43197d8aa57cb6b930bf5f45643..52b04d76f5483fbb042ad0c5ae09d5a9c3db50da 100644
--- a/vipra-rest/src/main/java/de/vipra/rest/resource/TopicResource.java
+++ b/vipra-rest/src/main/java/de/vipra/rest/resource/TopicResource.java
@@ -81,19 +81,9 @@ public class TopicResource {
 		Topic topic = wrapper.getData();
 		Wrapper<Topic> res = new Wrapper<>();
 		try {
-			long updated = service.updateSingle(topic);
-			int updatedInt = updated > Integer.MAX_VALUE ? Integer.MAX_VALUE : (int) updated;
-			switch (updatedInt) {
-			case 0:
-				res.addError(new APIError(Response.Status.NOT_FOUND, "Topic not found",
-						String.format(Messages.NOT_FOUND, "topic", id)));
-				return Response.status(Response.Status.NOT_FOUND).entity(res).build();
-			case 1:
-				res.setData(topic);
-				return Response.ok().entity(res).tag(res.tag()).build();
-			default:
-				return Response.serverError().build();
-			}
+			service.updateSingle(topic);
+			res.setData(topic);
+			return Response.ok().entity(res).tag(res.tag()).build();
 		} catch (DatabaseException e) {
 			res = new Wrapper<>(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-rest/src/main/java/de/vipra/rest/serializer/ArticleSerializer.java b/vipra-rest/src/main/java/de/vipra/rest/serializer/ArticleSerializer.java
index 2c266b9354837bcd5285c41e6127a0d1a16e2a22..c09049ec12c3952c03abcbf102d92a48de13bc80 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
@@ -17,7 +17,7 @@ public class ArticleSerializer extends JsonSerializer<Article> {
 	public void serialize(Article value, JsonGenerator gen, SerializerProvider serializers)
 			throws IOException, JsonProcessingException {		
 		gen.writeStartObject();
-		gen.writeStringField("id", value.getId());
+		gen.writeStringField("id", value.getId().toString());
 		gen.writeStringField("type", "article");
 
 		gen.writeObjectFieldStart("attributes");
diff --git a/vipra-rest/src/main/java/de/vipra/rest/serializer/TopicSerializer.java b/vipra-rest/src/main/java/de/vipra/rest/serializer/TopicSerializer.java
index 6d25b1ab1acd2183d9d7f380c6f91927c9efb05c..4b9c58cc4649aa2a4d0ca558e8dcb4ecc5335c75 100644
--- a/vipra-rest/src/main/java/de/vipra/rest/serializer/TopicSerializer.java
+++ b/vipra-rest/src/main/java/de/vipra/rest/serializer/TopicSerializer.java
@@ -15,7 +15,7 @@ public class TopicSerializer extends JsonSerializer<Topic> {
 	public void serialize(Topic value, JsonGenerator gen, SerializerProvider serializer)
 			throws IOException, JsonProcessingException {
 		gen.writeStartObject();
-		gen.writeStringField("id", value.getId());
+		gen.writeStringField("id", value.getId().toString());
 		gen.writeStringField("type", "topic");
 
 		gen.writeObjectFieldStart("attributes");
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 e071fa0b69a7965faf796a06433b86ef72217ad0..fcbf65746d181c2f76e730ba17eb98f29b057625 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
@@ -3,7 +3,6 @@ package de.vipra.rest.service;
 import java.net.URI;
 import java.util.List;
 
-import de.vipra.util.Constants;
 import de.vipra.util.Mongo;
 import de.vipra.util.model.Article;
 import de.vipra.util.service.DatabaseService;
@@ -11,7 +10,7 @@ import de.vipra.util.service.DatabaseService;
 public class ArticleService extends DatabaseService<Article> {
 
 	public ArticleService(Mongo mongo) {
-		super(mongo, Constants.Collection.ARTICLES, Article.class);
+		super(mongo, Article.class);
 	}
 
 	public List<Article> getMultiple(URI base, int skip, int limit, String sortBy) {
diff --git a/vipra-rest/src/main/java/de/vipra/rest/service/TopicService.java b/vipra-rest/src/main/java/de/vipra/rest/service/TopicService.java
index f50677279cb79362f0bd6c2ccf20f1c4a8d16143..497bc6903e4afba0f3e93e27ee3878f609276b7e 100644
--- a/vipra-rest/src/main/java/de/vipra/rest/service/TopicService.java
+++ b/vipra-rest/src/main/java/de/vipra/rest/service/TopicService.java
@@ -3,7 +3,6 @@ package de.vipra.rest.service;
 import java.net.URI;
 import java.util.List;
 
-import de.vipra.util.Constants;
 import de.vipra.util.Mongo;
 import de.vipra.util.model.Topic;
 import de.vipra.util.service.DatabaseService;
@@ -11,7 +10,7 @@ import de.vipra.util.service.DatabaseService;
 public class TopicService extends DatabaseService<Topic> {
 
 	public TopicService(Mongo mongo) {
-		super(mongo, Constants.Collection.TOPICS, Topic.class);
+		super(mongo, Topic.class);
 	}
 
 	public List<Topic> getMultiple(URI base, int skip, int limit, String sortBy) {
diff --git a/vipra-ui/app/adapters/application.js b/vipra-ui/app/adapters/application.js
index 0d442b61c170d4fa40db3aae849cc2e0cc783dc3..c14dc91b50c796761e9b28c764ce301880937f35 100644
--- a/vipra-ui/app/adapters/application.js
+++ b/vipra-ui/app/adapters/application.js
@@ -1,7 +1,7 @@
 import DS from 'ember-data';
 
 export default DS.JSONAPIAdapter.extend({
-  host: `http://${window.location.hostname}:8080`,
+  host: `http://${window.location.hostname}:8000`,
   namespace: 'vipra-rest',
   updateRecord(store, type, snapshot) {
     var data = {};
diff --git a/vipra-util/pom.xml b/vipra-util/pom.xml
index 515e97df12b1b03388212b06d14bb94a8b53ad4b..daa885aaab75647786c334887bb428eb86a6db3c 100644
--- a/vipra-util/pom.xml
+++ b/vipra-util/pom.xml
@@ -44,6 +44,16 @@
 			<artifactId>mongodb-driver</artifactId>
 			<version>3.2.0</version>
 		</dependency>
+		<dependency>
+			<groupId>org.mongodb.morphia</groupId>
+			<artifactId>morphia</artifactId>
+			<version>1.0.1</version>
+		</dependency>
+		<dependency>
+			<groupId>org.mongodb.morphia</groupId>
+			<artifactId>morphia-logging-slf4j</artifactId>
+			<version>1.0.1</version>
+		</dependency>
 
 		<!-- ElasticSearch Adapter -->
 		<dependency>
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 943f4383634dd01815161f64761f94d877b1e062..c56f6a2998d067460525ea0b6b37bb057cbbc615 100644
--- a/vipra-util/src/main/java/de/vipra/util/Mongo.java
+++ b/vipra-util/src/main/java/de/vipra/util/Mongo.java
@@ -1,5 +1,9 @@
 package de.vipra.util;
 
+import org.mongodb.morphia.Datastore;
+import org.mongodb.morphia.Morphia;
+import org.mongodb.morphia.logging.MorphiaLoggerFactory;
+import org.mongodb.morphia.logging.slf4j.SLF4JLoggerImplFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -13,10 +17,16 @@ public class Mongo {
 
 	public static final Logger log = LoggerFactory.getLogger(Mongo.class);
 
+	static {
+		MorphiaLoggerFactory.registerLogger(SLF4JLoggerImplFactory.class);
+	}
+
 	private static Mongo instance;
 
 	private final MongoClient client;
 	private final MongoDatabase database;
+	private final Morphia morphia;
+	private final Datastore datastore;
 
 	private Mongo(Config config) throws ConfigException {
 		String host = config.getString(Key.DBHOST);
@@ -30,6 +40,10 @@ public class Mongo {
 
 		client = new MongoClient(host, port);
 		database = client.getDatabase(databaseName);
+
+		morphia = new Morphia();
+		morphia.mapPackage("de.vipra.util.model");
+		datastore = morphia.createDatastore(client, databaseName);
 	}
 
 	public MongoClient getClient() {
@@ -40,6 +54,14 @@ public class Mongo {
 		return database;
 	}
 
+	public Morphia getMorphia() {
+		return morphia;
+	}
+
+	public Datastore getDatastore() {
+		return datastore;
+	}
+
 	public static Mongo getInstance(Config config) throws ConfigException {
 		if (instance == null) {
 			instance = new Mongo(config);
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 0c92154dcc743a885777732e46cc0ad419008932..95c3264defc6dc5789b70b42b0d62128e873cf8d 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
@@ -4,19 +4,23 @@ import java.io.File;
 import java.io.IOException;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
-import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 
-import org.bson.Document;
+import org.bson.types.ObjectId;
+import org.mongodb.morphia.annotations.Entity;
+import org.mongodb.morphia.annotations.Id;
 
 import de.vipra.util.Constants;
 import de.vipra.util.FileUtils;
 import de.vipra.util.MongoUtils;
 import de.vipra.util.StringUtils;
 
+@Entity("articles")
 public class Article extends Model {
 
+	@Id
+	private ObjectId id;
 	private String title;
 	private String text;
 	private String url;
@@ -25,6 +29,18 @@ public class Article extends Model {
 	private ArticleStats stats;
 	private List<TopicCount> topics;
 
+	public ObjectId getId() {
+		return id;
+	}
+
+	public void setId(ObjectId id) {
+		this.id = id;
+	}
+	
+	public void setId(String id) {
+		this.id = MongoUtils.objectId(id);
+	}
+
 	public String getTitle() {
 		return title;
 	}
@@ -88,44 +104,6 @@ public class Article extends Model {
 		this.topics = topics;
 	}
 
-	@Override
-	public Document toDocument() {
-		Document document = new Document();
-		if (getId() != null)
-			document.put("_id", MongoUtils.objectId(getId()));
-		document.put("title", getTitle());
-		document.put("text", getText());
-		document.put("url", getUrl());
-		document.put("date", getDate());
-		if (getStats() != null)
-			document.put("stats", getStats().toDocument());
-		if (getTopics() != null) {
-			List<Document> topicDocs = new ArrayList<>(topics.size());
-			for (TopicCount tc : topics)
-				topicDocs.add(tc.toDocument());
-			document.put("topics", topicDocs);
-		}
-		return document;
-	}
-
-	@Override
-	public void fromDocument(Document document) {
-		setId(document.getObjectId("_id").toString());
-		setTitle(document.getString("title"));
-		setText(document.getString("text"));
-		setUrl(document.getString("url"));
-		setDate(document.getDate("date"));
-		if (document.containsKey("stats"))
-			setStats(new ArticleStats((Document) document.get("stats")));
-		if (document.containsKey("topics")) {
-			@SuppressWarnings("unchecked")
-			List<Document> topicDocs = (List<Document>) document.get("topics");
-			topics = new ArrayList<>(topicDocs.size());
-			for (Document doc : topicDocs)
-				topics.add(new TopicCount(doc));
-		}
-	}
-
 	@Override
 	public void fromFile(File file) throws IOException {
 		List<String> lines = FileUtils.readFile(file);
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 fca89724ff36297f31d18c1b7928d224d979d1c3..c120cf8d55b13b000d10b1879ebb3f02e8ca1939 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
@@ -3,20 +3,16 @@ package de.vipra.util.model;
 import java.util.HashMap;
 import java.util.Map;
 
-import org.bson.Document;
+import org.mongodb.morphia.annotations.Embedded;
 
-public class ArticleStats implements BsonDocument {
+@Embedded
+public class ArticleStats {
 
 	private long wordCount;
 	private long uniqueWordCount;
+	@Embedded
 	private Map<String, TermFrequency> uniqueWords;
 
-	public ArticleStats() {}
-
-	public ArticleStats(Document document) {
-		fromDocument(document);
-	}
-
 	public long getWordCount() {
 		return wordCount;
 	}
@@ -72,33 +68,4 @@ public class ArticleStats implements BsonDocument {
 		return stats;
 	}
 
-	@Override
-	public Document toDocument() {
-		Document document = new Document();
-		document.put("wordCount", getWordCount());
-		document.put("uniqueWordCount", getUniqueWordCount());
-		if (getUniqueWords() != null) {
-			Document uniqueWords = new Document();
-			for (Map.Entry<String, TermFrequency> entry : getUniqueWords().entrySet()) {
-				uniqueWords.put(entry.getKey(), entry.getValue().toDocument());
-			}
-			document.put("uniqueWords", uniqueWords);
-		}
-		return document;
-	}
-
-	@Override
-	public void fromDocument(Document document) {
-		setWordCount(document.getLong("wordCount"));
-		setUniqueWordCount(document.getLong("uniqueWordCount"));
-		if (document.containsKey("uniqueWords")) {
-			Map<String, TermFrequency> uniqueWords = new HashMap<>();
-			Document docUniqueWords = (Document) document.get("uniqueWords");
-			for (Map.Entry<String, Object> entry : docUniqueWords.entrySet()) {
-				uniqueWords.put(entry.getKey(), new TermFrequency((Document) entry.getValue()));
-			}
-			setUniqueWords(uniqueWords);
-		}
-	}
-
 }
diff --git a/vipra-util/src/main/java/de/vipra/util/model/BsonDocument.java b/vipra-util/src/main/java/de/vipra/util/model/BsonDocument.java
deleted file mode 100644
index 0a606205b442c1df26e2551c5ce37fc06004a68f..0000000000000000000000000000000000000000
--- a/vipra-util/src/main/java/de/vipra/util/model/BsonDocument.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package de.vipra.util.model;
-
-import org.bson.Document;
-
-public interface BsonDocument {
-
-	Document toDocument();
-
-	void fromDocument(Document document);
-
-}
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 6a628f6253bc8db22157d283580fd80ae5202a9f..666b7dc5e76314a7444bbdd2d890570771cab803 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
@@ -6,31 +6,15 @@ import java.net.URI;
 import java.net.URISyntaxException;
 
 import org.apache.commons.io.FileUtils;
-import org.bson.Document;
+import org.bson.types.ObjectId;
 
 import de.vipra.util.Constants;
 
-public abstract class Model implements BsonDocument {
-
-	private String id;
-
-	public Model() {}
-
-	public Model(Document document) {
-		fromDocument(document);
-	}
-
-	public String getId() {
-		return id;
-	}
-
-	public void setId(String id) {
-		this.id = id;
-	}
+public abstract class Model {
 
 	public URI uri(URI base) {
 		try {
-			return new URI(base.toString() + "/" + getId());
+			return new URI(base.toString() + "/" + getId().toString());
 		} catch (URISyntaxException e) {
 			return null;
 		}
@@ -40,9 +24,11 @@ public abstract class Model implements BsonDocument {
 		FileUtils.writeStringToFile(file, toFileString(), Constants.FB_ENCODING, false);
 	}
 
-	public abstract void fromDocument(Document document);
-
-	public abstract Document toDocument();
+	public abstract ObjectId getId();
+	
+	public abstract void setId(ObjectId id);
+	
+	public abstract void setId(String id);
 
 	public abstract void fromFile(File file) throws IOException;
 
diff --git a/vipra-util/src/main/java/de/vipra/util/model/TermFrequency.java b/vipra-util/src/main/java/de/vipra/util/model/TermFrequency.java
index 01382adbb45dcf8c903b41425b0f3ddf1a83472f..adc0f061703b734a4597734abee4849bd66a8c98 100644
--- a/vipra-util/src/main/java/de/vipra/util/model/TermFrequency.java
+++ b/vipra-util/src/main/java/de/vipra/util/model/TermFrequency.java
@@ -1,18 +1,13 @@
 package de.vipra.util.model;
 
-import org.bson.Document;
+import org.mongodb.morphia.annotations.Embedded;
 
-public class TermFrequency implements BsonDocument {
+@Embedded
+public class TermFrequency {
 
 	private long termFrequency = 0;
 	private double normalizedTermFrequency = 0;
 
-	public TermFrequency() {}
-
-	public TermFrequency(Document document) {
-		fromDocument(document);
-	}
-
 	public long getTermFrequency() {
 		return termFrequency;
 	}
@@ -37,18 +32,4 @@ public class TermFrequency implements BsonDocument {
 		setTermFrequency(getTermFrequency() + 1);
 	}
 
-	@Override
-	public Document toDocument() {
-		Document document = new Document();
-		document.put("termFrequency", getTermFrequency());
-		document.put("normalizedTermFrequency", getNormalizedTermFrequency());
-		return document;
-	}
-
-	@Override
-	public void fromDocument(Document document) {
-		setTermFrequency(document.getLong("termFrequency"));
-		setNormalizedTermFrequency(document.getDouble("normalizedTermFrequency"));
-	}
-
 }
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 a55aa98feca3284f1843d03c627fb430fba5d0ba..3891fc8a45f409604555ee3895175bd2d3961548 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
@@ -2,18 +2,24 @@ package de.vipra.util.model;
 
 import java.io.File;
 import java.io.IOException;
-import java.util.ArrayList;
 import java.util.List;
 
-import org.bson.Document;
+import org.bson.types.ObjectId;
+import org.mongodb.morphia.annotations.Embedded;
+import org.mongodb.morphia.annotations.Entity;
+import org.mongodb.morphia.annotations.Id;
 
 import de.vipra.util.MongoUtils;
 import de.vipra.util.ex.NotImplementedException;
 
+@Entity("topics")
 public class Topic extends Model {
 
+	@Id
+	private ObjectId id;
 	private int index;
 	private String name;
+	@Embedded
 	private List<TopicWord> words;
 
 	public Topic() {}
@@ -22,6 +28,18 @@ public class Topic extends Model {
 		this.words = words;
 	}
 
+	public ObjectId getId() {
+		return id;
+	}
+
+	public void setId(ObjectId id) {
+		this.id = id;
+	}
+
+	public void setId(String id) {
+		this.id = MongoUtils.objectId(id);
+	}
+
 	public int getIndex() {
 		return index;
 	}
@@ -46,38 +64,6 @@ public class Topic extends Model {
 		this.words = words;
 	}
 
-	@SuppressWarnings("unchecked")
-	@Override
-	public void fromDocument(Document document) {
-		setId(document.getObjectId("_id").toString());
-		setName(document.getString("name"));
-		setIndex(document.getInteger("index", 0));
-		if (document.containsKey("words")) {
-			List<Document> topicWords = (List<Document>) document.get("words");
-			words = new ArrayList<>(topicWords.size());
-			for (Document word : topicWords) {
-				words.add(new TopicWord(word));
-			}
-		}
-	}
-
-	@Override
-	public Document toDocument() {
-		Document document = new Document();
-		if (getId() != null)
-			document.put("_id", MongoUtils.objectId(getId()));
-		document.append("name", getName());
-		document.append("index", getIndex());
-		if (getWords() != null) {
-			List<Document> topicWords = new ArrayList<>(words.size());
-			for (TopicWord word : words) {
-				topicWords.add(word.toDocument());
-			}
-			document.put("words", topicWords);
-		}
-		return document;
-	}
-
 	@Override
 	public void fromFile(File file) throws IOException {
 		throw new NotImplementedException();
diff --git a/vipra-util/src/main/java/de/vipra/util/model/TopicCount.java b/vipra-util/src/main/java/de/vipra/util/model/TopicCount.java
index 0debc17548004dc659c1ba11317c2aa02b77e761..18c0fb204db0c7a59b556df6e8b9f1479a086c30 100644
--- a/vipra-util/src/main/java/de/vipra/util/model/TopicCount.java
+++ b/vipra-util/src/main/java/de/vipra/util/model/TopicCount.java
@@ -1,8 +1,9 @@
 package de.vipra.util.model;
 
-import org.bson.Document;
+import org.mongodb.morphia.annotations.Embedded;
 
-public class TopicCount implements BsonDocument, Comparable<TopicCount> {
+@Embedded
+public class TopicCount implements Comparable<TopicCount> {
 
 	private String id;
 	private int count;
@@ -14,10 +15,6 @@ public class TopicCount implements BsonDocument, Comparable<TopicCount> {
 		this.count = count;
 	}
 
-	public TopicCount(Document document) {
-		fromDocument(document);
-	}
-
 	public String getId() {
 		return id;
 	}
@@ -34,20 +31,6 @@ public class TopicCount implements BsonDocument, Comparable<TopicCount> {
 		this.count = count;
 	}
 
-	@Override
-	public Document toDocument() {
-		Document document = new Document();
-		document.put("id", getId());
-		document.append("count", count);
-		return document;
-	}
-
-	@Override
-	public void fromDocument(Document document) {
-		this.id = document.getString("id");
-		this.count = document.getInteger("count", 0);
-	}
-
 	@Override
 	public int compareTo(TopicCount 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 91e1bbf310458cda248eaaf8724fd10ec0ea30b9..b5d61665083eb32a458e3acbc69ec27134f49319 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
@@ -1,8 +1,9 @@
 package de.vipra.util.model;
 
-import org.bson.Document;
+import org.mongodb.morphia.annotations.Embedded;
 
-public class TopicWord implements BsonDocument {
+@Embedded
+public class TopicWord {
 
 	private String word;
 	private double likeliness;
@@ -14,10 +15,6 @@ public class TopicWord implements BsonDocument {
 		this.likeliness = likeliness;
 	}
 
-	public TopicWord(Document document) {
-		fromDocument(document);
-	}
-
 	public String getWord() {
 		return word;
 	}
@@ -34,18 +31,4 @@ public class TopicWord implements BsonDocument {
 		this.likeliness = likeliness;
 	}
 
-	@Override
-	public void fromDocument(Document document) {
-		this.word = document.getString("word");
-		this.likeliness = document.getDouble("likeliness");
-	}
-
-	@Override
-	public Document toDocument() {
-		Document document = new Document();
-		document.put("word", getWord());
-		document.put("likeliness", getLikeliness());
-		return document;
-	}
-
 }
diff --git a/vipra-util/src/main/java/de/vipra/util/service/DatabaseService.java b/vipra-util/src/main/java/de/vipra/util/service/DatabaseService.java
index 54adc442d6c6c3f6d2582473110ffc269ba81331..c5a4af26939f2a8bf857a163137d98b929035e20 100644
--- a/vipra-util/src/main/java/de/vipra/util/service/DatabaseService.java
+++ b/vipra-util/src/main/java/de/vipra/util/service/DatabaseService.java
@@ -1,120 +1,64 @@
 package de.vipra.util.service;
 
-import static de.vipra.util.MongoUtils.getSorts;
-import static de.vipra.util.MongoUtils.objectId;
-
-import java.util.ArrayList;
 import java.util.List;
 
-import org.bson.Document;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.mongodb.client.MongoCollection;
-import com.mongodb.client.model.Filters;
-import com.mongodb.client.result.DeleteResult;
-import com.mongodb.client.result.UpdateResult;
+import org.mongodb.morphia.Datastore;
 
 import de.vipra.util.Config;
 import de.vipra.util.Constants;
 import de.vipra.util.Mongo;
+import de.vipra.util.MongoUtils;
 import de.vipra.util.ex.ConfigException;
 import de.vipra.util.ex.DatabaseException;
 import de.vipra.util.model.Model;
 
 public class DatabaseService<T extends Model> implements Service<T, DatabaseException> {
 
-	private static final Logger log = LoggerFactory.getLogger(DatabaseService.class);
-
-	private final MongoCollection<Document> collection;
+	private final Datastore datastore;
 	private final Class<T> clazz;
 
-	public DatabaseService(Mongo mongo, Constants.Collection collection, Class<T> clazz) {
-		this.collection = mongo.getDatabase().getCollection(collection.name);
+	public DatabaseService(Mongo mongo, Class<T> clazz) {
+		this.datastore = mongo.getDatastore();
 		this.clazz = clazz;
 	}
 
-	private T newT(Document document) {
-		try {
-			T t = clazz.newInstance();
-			t.fromDocument(document);
-			return t;
-		} catch (InstantiationException | IllegalAccessException | IllegalArgumentException | SecurityException e) {
-			log.error(e.getMessage());
-			return null;
-		}
-	}
-
 	@Override
 	public T getSingle(String id) {
-		ArrayList<Document> result = collection.find(Filters.eq("_id", objectId(id))).into(new ArrayList<Document>());
-		if (result.size() == 1) {
-			return newT(result.get(0));
-		} else {
-			return null;
-		}
+		return datastore.get(clazz, MongoUtils.objectId(id));
 	}
 
 	public List<T> getMultiple(int skip, int limit, String sortBy) {
-		List<Document> documents = collection.find().skip(skip).limit(limit).sort(getSorts(sortBy))
-				.into(new ArrayList<Document>());
-		List<T> items = new ArrayList<>(documents.size());
-
-		for (Document document : documents) {
-			items.add(newT(document));
-		}
-
-		return items;
+		return datastore.createQuery(clazz).offset(skip).limit(limit).order(sortBy).asList();
 	}
 
 	@Override
 	public T createSingle(T t) throws DatabaseException {
-		Document document = new Document(t.toDocument());
-		try {
-			collection.insertOne(document);
-		} catch (Exception e) {
-			throw new DatabaseException(e);
-		}
-		t.fromDocument(document);
+		datastore.save(t);
 		return t;
 	}
 
 	@Override
 	public long deleteSingle(String id) throws DatabaseException {
-		try {
-			DeleteResult result = collection.deleteOne(Filters.eq("_id", objectId(id)));
-			return result.getDeletedCount();
-		} catch (Exception e) {
-			throw new DatabaseException("could not delete database entry: " + e.getMessage());
-		}
+		return datastore.delete(MongoUtils.objectId(id)).getN();
 	}
 
 	@Override
-	public long updateSingle(T t) throws DatabaseException {
-		Document docOld = new Document("_id", objectId(t.getId()));
-		Document docNew = t.toDocument();
-		UpdateResult result;
-		try {
-			result = collection.replaceOne(docOld, docNew);
-		} catch (Exception e) {
-			throw new DatabaseException(e);
-		}
-		t.fromDocument(docNew);
-		return result.getModifiedCount();
+	public void updateSingle(T t) throws DatabaseException {
+		datastore.save(t);
 	}
 
 	public void drop() {
-		collection.drop();
+		datastore.getCollection(clazz).drop();
 	}
 
 	public long count() {
-		return collection.count();
+		return datastore.getCount(clazz);
 	}
 
 	public static <T extends Model> DatabaseService<T> getDatabaseService(Config config,
 			Constants.Collection collection, Class<T> clazz) throws ConfigException {
 		Mongo mongo = Mongo.getInstance(config);
-		return new DatabaseService<T>(mongo, collection, clazz);
+		return new DatabaseService<T>(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 a55b1aea721109f0f3dd141a266df08954a6f10e..f3a4129c8edbdf46a58e888b79831efdaa2e0da2 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
@@ -10,7 +10,7 @@ public interface Service<T extends Model, E extends Exception> {
 
 	long deleteSingle(String id) throws E;
 
-	long updateSingle(T t) throws E;
+	void updateSingle(T t) throws E;
 
 	void drop();