diff --git a/ma-impl.sublime-workspace b/ma-impl.sublime-workspace
index 400b2e04842c26c7404cd13cef0c20702e9d4b3d..a8cbaab1212047178a35328674ba735badf78cdc 100644
--- a/ma-impl.sublime-workspace
+++ b/ma-impl.sublime-workspace
@@ -275,6 +275,30 @@
 	},
 	"buffers":
 	[
+		{
+			"file": "vipra-ui/app/routes/articles/show.js",
+			"settings":
+			{
+				"buffer_size": 643,
+				"line_ending": "Unix"
+			}
+		},
+		{
+			"file": "vipra-ui/app/templates/articles/show.hbs",
+			"settings":
+			{
+				"buffer_size": 540,
+				"line_ending": "Unix"
+			}
+		},
+		{
+			"file": "vipra-ui/app/models/article.js",
+			"settings":
+			{
+				"buffer_size": 168,
+				"line_ending": "Unix"
+			}
+		}
 	],
 	"build_system": "",
 	"build_system_choices":
@@ -283,8 +307,8 @@
 	"build_varint": "",
 	"command_palette":
 	{
-		"height": 363.0,
-		"last_filter": "",
+		"height": 148.0,
+		"last_filter": "insta",
 		"selected_items":
 		[
 			[
@@ -432,7 +456,7 @@
 				"Package Control: Install Package"
 			]
 		],
-		"width": 507.0
+		"width": 435.0
 	},
 	"console":
 	{
@@ -454,21 +478,37 @@
 	"expanded_folders":
 	[
 		"/home/eike/repos/master/ma-impl",
-		"/home/eike/repos/master/ma-impl/vipra-cmd"
+		"/home/eike/repos/master/ma-impl/vipra-ui",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/models",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/routes",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/routes/articles",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/routes/topics",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/articles"
 	],
 	"file_history":
 	[
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/articles/show.hbs",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/routes/topics/list.js",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/articles/list.hbs",
+		"/home/eike/repos/master/ma-impl/vm/bootstrap.sh",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/topics/show.hbs",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/router.js",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/topics/list.hbs",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/index.hbs",
+		"/home/eike/.config/sublime-text-3/Packages/User/Preferences.sublime-settings",
+		"/home/eike/.config/sublime-text-3/Packages/Default/Preferences.sublime-settings",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/components/dynamic-high-charts.js",
 		"/home/eike/repos/master/ma-impl/vipra-cmd.sh",
 		"/home/eike/repos/master/ma-impl/vipra-cmd/build2.xml",
 		"/home/eike/repos/master/ma-impl/vipra-ui/README.md",
 		"/home/eike/repos/master/ma-impl/vipra-ui/bower.json",
 		"/home/eike/repos/testasd/bower.json",
 		"/home/eike/repos/master/ma-impl/vipra-ui2/package.json",
-		"/home/eike/repos/master/ma-impl/vipra-ui/app/components/dynamic-high-charts.js",
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/routes/articles/list.js",
 		"/home/eike/repos/master/ma-impl/vipra-ui/package.json",
 		"/home/eike/repos/master/ma-impl/vipra-ui/node_modules/ember-highcharts/package.json",
-		"/home/eike/repos/master/ma-impl/vm/bootstrap.sh",
 		"/home/eike/repos/master/ma-impl/vm/config/initd-mongod",
 		"/home/eike/repos/master/ma-impl/vm/webapps/vipra-rest/WEB-INF/web.xml",
 		"/core",
@@ -576,20 +616,11 @@
 		"/home/eike/Repositories/fu/ss15/ebi/exercise-03/exercise-03.r",
 		"/home/eike/Repositories/fu/ss15/ebi/exercise-02/exercise-02.r",
 		"/home/eike/Downloads/Formularantworten150621.csv",
-		"/home/eike/Downloads/analyze.r.Rout",
-		"/home/eike/Repositories/niels_website/misc/daten.txt",
-		"/home/eike/Downloads/wordpress/wp-config-sample.php",
-		"/home/eike/unison.log",
-		"/home/eike/Repositories/scripts/bin/backup",
-		"/home/eike/Repositories/scripts/bin/backup-duplicity",
-		"/home/eike/.duplicity-exclude",
-		"/home/eike/Repositories/fu/ss15/ki/exercise-08/task2a.pl",
-		"/home/eike/Repositories/fu/ss15/ki/exercise-08/games.nkb",
-		"/home/eike/Repositories/fu/ss15/ki/exercise-08/exercise-08.tex"
+		"/home/eike/Downloads/analyze.r.Rout"
 	],
 	"find":
 	{
-		"height": 25.0
+		"height": 37.0
 	},
 	"find_in_files":
 	{
@@ -634,6 +665,7 @@
 		"case_sensitive": false,
 		"find_history":
 		[
+			"indent",
 			"00:00Z\" },",
 			"{ \"$date\": ",
 			".000+0000",
@@ -760,8 +792,7 @@
 			"intended",
 			"redirect_intended",
 			"amount-in",
-			"'",
-			"!important"
+			"'"
 		],
 		"highlight": true,
 		"in_selection": false,
@@ -907,8 +938,96 @@
 	"groups":
 	[
 		{
+			"selected": 2,
 			"sheets":
 			[
+				{
+					"buffer": 0,
+					"file": "vipra-ui/app/routes/articles/show.js",
+					"semi_transient": false,
+					"settings":
+					{
+						"buffer_size": 643,
+						"regions":
+						{
+						},
+						"selection":
+						[
+							[
+								342,
+								342
+							]
+						],
+						"settings":
+						{
+							"open_with_edit": true,
+							"syntax": "Packages/JavaScript/JavaScript.tmLanguage",
+							"tab_size": 2,
+							"translate_tabs_to_spaces": true
+						},
+						"translation.x": 0.0,
+						"translation.y": 0.0,
+						"zoom_level": 1.0
+					},
+					"stack_index": 2,
+					"type": "text"
+				},
+				{
+					"buffer": 1,
+					"file": "vipra-ui/app/templates/articles/show.hbs",
+					"semi_transient": false,
+					"settings":
+					{
+						"buffer_size": 540,
+						"regions":
+						{
+						},
+						"selection":
+						[
+							[
+								299,
+								299
+							]
+						],
+						"settings":
+						{
+							"syntax": "Packages/Handlebars/grammars/Handlebars.tmLanguage"
+						},
+						"translation.x": 0.0,
+						"translation.y": 0.0,
+						"zoom_level": 1.0
+					},
+					"stack_index": 1,
+					"type": "text"
+				},
+				{
+					"buffer": 2,
+					"file": "vipra-ui/app/models/article.js",
+					"semi_transient": false,
+					"settings":
+					{
+						"buffer_size": 168,
+						"regions":
+						{
+						},
+						"selection":
+						[
+							[
+								168,
+								168
+							]
+						],
+						"settings":
+						{
+							"syntax": "Packages/JavaScript/JavaScript.tmLanguage"
+						},
+						"translation.x": 0.0,
+						"translation.y": 0.0,
+						"zoom_level": 1.0
+					},
+					"stack_index": 0,
+					"type": "text"
+				}
 			]
 		}
 	],
diff --git a/vipra-rest/src/main/java/de/vipra/rest/Messages.java b/vipra-rest/src/main/java/de/vipra/rest/Messages.java
index 6e30fd15e141319e8bf66c49d59d65bc2f732f35..0a5f6c4cd4516098cfbfaa854e3437e70419f8b7 100644
--- a/vipra-rest/src/main/java/de/vipra/rest/Messages.java
+++ b/vipra-rest/src/main/java/de/vipra/rest/Messages.java
@@ -2,7 +2,7 @@ package de.vipra.rest;
 
 public class Messages {
 
-	public static final String NOT_FOUND = "%1 with id %2 was not found";
-	public static final String BAD_REQUEST = "bad request: %1";
+	public static final String NOT_FOUND = "%s with id %s was not found";
+	public static final String BAD_REQUEST = "bad request: %s";
 
 }
diff --git a/vipra-rest/src/main/java/de/vipra/rest/model/ResponseWrapper.java b/vipra-rest/src/main/java/de/vipra/rest/model/ResponseWrapper.java
index ac96167ba1e4c00adb3d2be13adac62711e379c7..82ab23749b15f219866af7961b5849002f2fff7a 100644
--- a/vipra-rest/src/main/java/de/vipra/rest/model/ResponseWrapper.java
+++ b/vipra-rest/src/main/java/de/vipra/rest/model/ResponseWrapper.java
@@ -56,7 +56,7 @@ public class ResponseWrapper<T> {
 	}
 
 	public void addError(APIError error) {
-		if (error == null) {
+		if (errors == null) {
 			errors = new ArrayList<>();
 		}
 		errors.add(error);
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 edd78cc9bcecb77d0f6f1dbcd34df8702383454c..62aca81e98c4a915b1bb4d559bd94aa6f179f435 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
@@ -70,8 +70,8 @@ public class ArticleResource {
 			res.setData(article);
 			return Response.ok().entity(res).build();
 		} else {
-			res.addError(new APIError(Response.Status.NOT_FOUND, "Resource not found",
-					String.format(Messages.NOT_FOUND, "article", id)));
+			String msg = String.format(Messages.NOT_FOUND, "article", id);
+			res.addError(new APIError(Response.Status.NOT_FOUND, "Resource not found", msg));
 			return Response.status(Response.Status.NOT_FOUND).entity(res).build();
 		}
 	}
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 b87ce0b3fd114e68c645e34ec18cfffb5efe6fef..8324f7c23c670bc876496a8da0380e902f151b59 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
@@ -35,6 +35,8 @@ public class ArticleDeserializer extends JsonDeserializer<Article> {
 					article.setUrl(getString(attrs, "url"));
 				if (attrs.has("date"))
 					article.setDate(stringToDate(getString(attrs, "date")));
+				// TODO implement stats deserializer
+				// TODO implement topics deserializer
 			}
 		}
 
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 b1c1e49b98ad28b92fc013d0ca3fd6b0aab0eb8d..daac45fc1af228e49c31a75aa9b41affc2c756a0 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
@@ -32,6 +32,10 @@ public class ArticleSerializer extends JsonSerializer<Article> {
 			gen.writeStringField("url", value.getUrl());
 		if (value.getDate() != null)
 			gen.writeStringField("date", dateToString(value.getDate()));
+		if (value.getStats() != null)
+			gen.writeObjectField("stats", value.getStats());
+		if (value.getTopics() != null)
+			gen.writeObjectField("topics", value.getTopics());
 		gen.writeEndObject();
 
 		gen.writeEndObject();
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 099194ea9e1057ca7b0bec3e851907b6336804b1..8af13aabb7fdd400b05495273177e44e0a07f8a0 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
@@ -7,7 +7,7 @@ import de.vipra.rest.model.Article;
 import de.vipra.util.Constants;
 import de.vipra.util.Mongo;
 
-public class ArticleService extends Service<Article> {
+public class ArticleService extends DatabaseService<Article> {
 
 	public ArticleService(Mongo mongo) {
 		super(mongo, Constants.Collection.ARTICLES, Article.class);
@@ -19,6 +19,7 @@ public class ArticleService extends Service<Article> {
 			// delete data for listing
 			article.setText(null);
 			article.setStats(null);
+			article.setTopics(null);
 		}
 		return articles;
 	}
diff --git a/vipra-rest/src/main/java/de/vipra/rest/service/Service.java b/vipra-rest/src/main/java/de/vipra/rest/service/DatabaseService.java
similarity index 84%
rename from vipra-rest/src/main/java/de/vipra/rest/service/Service.java
rename to vipra-rest/src/main/java/de/vipra/rest/service/DatabaseService.java
index 01107f8d963b00ef46ef9de57bc633cccabfaf9b..b23e06e26903ca684e1b84425a25dd763488de96 100644
--- a/vipra-rest/src/main/java/de/vipra/rest/service/Service.java
+++ b/vipra-rest/src/main/java/de/vipra/rest/service/DatabaseService.java
@@ -8,11 +8,10 @@ import de.vipra.util.Constants.Collection;
 import de.vipra.util.ex.DatabaseException;
 import de.vipra.util.Mongo;
 import de.vipra.util.model.Model;
-import de.vipra.util.service.DatabaseService;
 
-public class Service<T extends Model & Linked> extends DatabaseService<T> {
+public class DatabaseService<T extends Model & Linked> extends de.vipra.util.service.DatabaseService<T> {
 
-	public Service(Mongo mongo, Collection collection, Class<T> clazz) {
+	public DatabaseService(Mongo mongo, Collection collection, Class<T> clazz) {
 		super(mongo, collection, clazz);
 	}
 
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 56a4897a2509f782acb4939b1e6584770351331b..577c6575e3c9aec2c5059d2dbf39fb60f65dd9f3 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
@@ -7,7 +7,7 @@ import de.vipra.rest.model.TopicDefinition;
 import de.vipra.util.Constants;
 import de.vipra.util.Mongo;
 
-public class TopicService extends Service<TopicDefinition> {
+public class TopicService extends DatabaseService<TopicDefinition> {
 
 	public TopicService(Mongo mongo) {
 		super(mongo, Constants.Collection.TOPICS, TopicDefinition.class);
diff --git a/vipra-ui/app/models/article.js b/vipra-ui/app/models/article.js
index 0d054ad31aafcc2f4856e01680fc6f74e5887866..94797c67807646591f2f23a88cb5b83d90ded21a 100644
--- a/vipra-ui/app/models/article.js
+++ b/vipra-ui/app/models/article.js
@@ -4,5 +4,6 @@ export default DS.Model.extend({
   title: DS.attr(),
   text: DS.attr(),
   url: DS.attr(),
-  date: DS.attr('date')
+  date: DS.attr('date'),
+  stats: DS.attr()
 });
diff --git a/vipra-ui/app/routes/articles/show.js b/vipra-ui/app/routes/articles/show.js
new file mode 100644
index 0000000000000000000000000000000000000000..a402bcfd6b67e942757a42957522b995de88ca03
--- /dev/null
+++ b/vipra-ui/app/routes/articles/show.js
@@ -0,0 +1,41 @@
+import Ember from 'ember';
+
+var statsData = [];
+var statsOptions = {
+  title: {
+    text: 'Word frequencies'
+  },
+  legend: {
+    enabled: false
+  },
+  xAxis: {
+    title: {
+      text: 'Words'
+    }
+  },
+  yAxis: {
+    title: {
+      text: 'Count'
+    }
+  },
+  tooltip: {
+    headerFormat: '',
+    pointFormat: '{point.x}: {point.y} time(s)'
+  }
+};
+
+export default Ember.Route.extend({
+  model(params) {
+    return Ember.RSVP.hash({
+      article: this.store.find('article', params.article_id),
+      statsData: statsData,
+      statsOptions: statsOptions
+    });
+  },
+
+  afterModel(model) {
+    if(model.article.stats) {
+      
+    }
+  }
+});
\ No newline at end of file
diff --git a/vipra-ui/app/templates/articles/list.hbs b/vipra-ui/app/templates/articles/list.hbs
index 08f7ccb638bf957b5ca67cc5c53231837aeab3c5..dcb0456ae2ebb26a8c3660bfd62ea7c2bb6bd32a 100644
--- a/vipra-ui/app/templates/articles/list.hbs
+++ b/vipra-ui/app/templates/articles/list.hbs
@@ -2,6 +2,6 @@
 
 <h2>Found articles</h2>
 
-{{debounced-input placeholder='Filter' size='50' valueBinding='filter' debounce='150'}}
+{{debounced-input placeholder='Filter' size='50' value='filter' debounce='150'}}
 
 {{article-list articles=model.articles filter=filter}}
\ No newline at end of file
diff --git a/vipra-ui/app/templates/articles/show.hbs b/vipra-ui/app/templates/articles/show.hbs
index a93a42bd788761f32cad7384ca38bef4c132a1e0..07bb2d380a2e041382c9842854e73bceb8e77246 100644
--- a/vipra-ui/app/templates/articles/show.hbs
+++ b/vipra-ui/app/templates/articles/show.hbs
@@ -1,10 +1,29 @@
-<h2>{{model.title}}</h2>
+<h2>{{model.article.title}}</h2>
+
+<h3>Info</h3>
 
 <dl>
   <dt>Date</dt>
-  <dd>{{model.date}}</dd>
+  <dd>{{model.article.date}}</dd>
   <dt>URL</dt>
-  <dd><a href="{{model.url}}">{{model.url}}</a></dd>
+  <dd><a href="{{model.article.url}}">{{model.article.url}}</a></dd>
 </dl>
 
-{{model.text}}
\ No newline at end of file
+<h3>Statistics</h3>
+
+<table>
+  <tr>
+    <td>Word count</td>
+    <td>{{model.article.stats.wordCount}}</td>
+  </tr>
+  <tr>
+    <td>Unique word count</td>
+    <td>{{model.article.stats.uniqueWordCount}}</td>
+  </tr>
+</table>
+
+{{dynamic-high-charts content=model.statsData chartOptions=model.statsOptions}}
+
+<h3>Content</h3>
+
+{{model.article.text}}
\ No newline at end of file
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 f9cd70dba8ecad0306354d1b0af85b3aad082658..01382adbb45dcf8c903b41425b0f3ddf1a83472f 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
@@ -6,7 +6,6 @@ public class TermFrequency implements BsonDocument {
 
 	private long termFrequency = 0;
 	private double normalizedTermFrequency = 0;
-	private double inverseDocumentFrequency = 0;
 
 	public TermFrequency() {}
 
@@ -31,27 +30,18 @@ public class TermFrequency implements BsonDocument {
 	}
 
 	public void normalizeTermFrequency(double max) {
-		setNormalizedTermFrequency(getNormalizedTermFrequency() / max);
+		setNormalizedTermFrequency(getTermFrequency() / max);
 	}
 
 	public void incrementTermFrequency() {
 		setTermFrequency(getTermFrequency() + 1);
 	}
 
-	public double getInverseDocumentFrequency() {
-		return inverseDocumentFrequency;
-	}
-
-	public void setInverseDocumentFrequency(double inverseDocumentFrequency) {
-		this.inverseDocumentFrequency = inverseDocumentFrequency;
-	}
-
 	@Override
 	public Document toDocument() {
 		Document document = new Document();
 		document.put("termFrequency", getTermFrequency());
 		document.put("normalizedTermFrequency", getNormalizedTermFrequency());
-		document.put("inverseDocumentFrequency", getInverseDocumentFrequency());
 		return document;
 	}
 
@@ -59,7 +49,6 @@ public class TermFrequency implements BsonDocument {
 	public void fromDocument(Document document) {
 		setTermFrequency(document.getLong("termFrequency"));
 		setNormalizedTermFrequency(document.getDouble("normalizedTermFrequency"));
-		setInverseDocumentFrequency(document.getDouble("inverseDocumentFrequency"));
 	}
 
 }
diff --git a/vipra-util/src/main/java/de/vipra/util/model/TopicMap.java b/vipra-util/src/main/java/de/vipra/util/model/TopicMap.java
index 68cdc54d56d6babc3e57b82550180942daf6456e..c91fd6f76d00cbb186f357d26a647ec350360645 100644
--- a/vipra-util/src/main/java/de/vipra/util/model/TopicMap.java
+++ b/vipra-util/src/main/java/de/vipra/util/model/TopicMap.java
@@ -1,19 +1,12 @@
 package de.vipra.util.model;
 
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.HashMap;
 
 import org.bson.Document;
 
-public class TopicMap extends Model {
+public class TopicMap extends HashMap<String, Integer> implements BsonDocument {
 
-	private Map<String, Integer> map = new LinkedHashMap<>();
+	private static final long serialVersionUID = 1L;
 
 	public TopicMap() {}
 
@@ -22,54 +15,25 @@ public class TopicMap extends Model {
 	}
 
 	public void put(String topic) {
-		Integer i = map.get(topic);
-		map.put(topic, i == null ? 1 : i + 1);
+		Integer i = this.get(topic);
+		this.put(topic, i == null ? 1 : i + 1);
 	}
 
-	public Integer get(String topic) {
-		return map.get(topic);
-	}
-
-	public Set<String> keySet() {
-		return map.keySet();
-	}
-
-	@SuppressWarnings("unchecked")
 	@Override
 	public void fromDocument(Document document) {
-		List<Document> list = (List<Document>) document.get("topics");
-		for (Document doc : list) {
-			TopicOccurrence to = new TopicOccurrence(doc);
-			map.put(to.getTopic(), to.getCount());
+		clear();
+		for (String key : document.keySet()) {
+			put(key, document.getInteger(key));
 		}
 	}
 
 	@Override
 	public Document toDocument() {
 		Document document = new Document();
-		List<TopicOccurrence> tos = new ArrayList<>(map.size());
-		List<Document> list = new ArrayList<>(map.size());
-		for (String key : map.keySet()) {
-			tos.add(new TopicOccurrence(key, map.get(key)));
-		}
-		Collections.sort(tos, Collections.reverseOrder());
-		for (TopicOccurrence to : tos) {
-			list.add(to.toDocument());
+		for (String key : keySet()) {
+			document.append(key, get(key));
 		}
-		document.append("topics", list);
 		return document;
 	}
 
-	@Override
-	public void fromFile(File file) throws IOException {
-		// TODO Auto-generated method stub
-
-	}
-
-	@Override
-	public String toFileString() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
 }
diff --git a/vipra-util/src/main/java/de/vipra/util/model/TopicOccurrence.java b/vipra-util/src/main/java/de/vipra/util/model/TopicOccurrence.java
deleted file mode 100644
index bba159e88a9ed21ee929b802dc3b45e7ccb20ef1..0000000000000000000000000000000000000000
--- a/vipra-util/src/main/java/de/vipra/util/model/TopicOccurrence.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package de.vipra.util.model;
-
-import java.io.File;
-import java.io.IOException;
-
-import org.bson.Document;
-
-import de.vipra.util.ex.NotImplementedException;
-
-public class TopicOccurrence extends Model implements Comparable<TopicOccurrence> {
-
-	private String topic;
-	private int count;
-
-	public TopicOccurrence() {}
-
-	public TopicOccurrence(String topic, int count) {
-		this.topic = topic;
-		this.count = count;
-	}
-
-	public TopicOccurrence(Document document) {
-		fromDocument(document);
-	}
-
-	public String getTopic() {
-		return topic;
-	}
-
-	public void setTopic(String topic) {
-		this.topic = topic;
-	}
-
-	public int getCount() {
-		return count;
-	}
-
-	public void setCount(int count) {
-		this.count = count;
-	}
-
-	@Override
-	public void fromDocument(Document document) {
-		setTopic(document.getString("topic"));
-		setCount(document.getInteger("count", 0));
-	}
-
-	@Override
-	public Document toDocument() {
-		Document document = new Document();
-		document.append("topic", getTopic());
-		document.append("count", getCount());
-		return document;
-	}
-
-	@Override
-	public void fromFile(File file) throws IOException {
-		throw new NotImplementedException();
-	}
-
-	@Override
-	public String toFileString() {
-		throw new NotImplementedException();
-	}
-
-	@Override
-	public int compareTo(TopicOccurrence o) {
-		return Integer.compare(getCount(), o.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 1405da85eca93cd6bf3539197fa1d0e5a8d73aca..91e1bbf310458cda248eaaf8724fd10ec0ea30b9 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,13 +1,8 @@
 package de.vipra.util.model;
 
-import java.io.File;
-import java.io.IOException;
-
 import org.bson.Document;
 
-import de.vipra.util.ex.NotImplementedException;
-
-public class TopicWord extends Model {
+public class TopicWord implements BsonDocument {
 
 	private String word;
 	private double likeliness;
@@ -53,14 +48,4 @@ public class TopicWord extends Model {
 		return document;
 	}
 
-	@Override
-	public void fromFile(File file) throws IOException {
-		throw new NotImplementedException();
-	}
-
-	@Override
-	public String toFileString() {
-		throw new NotImplementedException();
-	}
-
 }