diff --git a/ma-impl.sublime-workspace b/ma-impl.sublime-workspace
index e7e2fa383ec69f429e95d1be2613a518f6eface1..7c5b9bb10d9edbca297a7daa966258ae733304dd 100644
--- a/ma-impl.sublime-workspace
+++ b/ma-impl.sublime-workspace
@@ -280,26 +280,42 @@
 	"buffers":
 	[
 		{
-			"file": "vipra-ui/app/templates/index.hbs",
+			"file": "vipra-ui/index.html",
 			"settings":
 			{
-				"buffer_size": 1530,
+				"buffer_size": 1013,
 				"line_ending": "Unix"
 			}
 		},
 		{
-			"file": "vipra-ui/app/styles/app.scss",
+			"file": "vipra-ui/js/app.js",
 			"settings":
 			{
-				"buffer_size": 914,
+				"buffer_size": 326,
 				"line_ending": "Unix"
 			}
 		},
 		{
-			"file": "vipra-ui/app/adapters/application.js",
+			"file": "vipra-ui/js/controllers.js",
 			"settings":
 			{
-				"buffer_size": 506,
+				"buffer_size": 102,
+				"line_ending": "Unix"
+			}
+		},
+		{
+			"file": "vipra-ui/js/directives.js",
+			"settings":
+			{
+				"buffer_size": 49,
+				"line_ending": "Unix"
+			}
+		},
+		{
+			"file": "vipra-ui/js/services.js",
+			"settings":
+			{
+				"buffer_size": 47,
 				"line_ending": "Unix"
 			}
 		}
@@ -483,25 +499,25 @@
 	[
 		"/home/eike/repos/master/ma-impl",
 		"/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/adapters",
-		"/home/eike/repos/master/ma-impl/vipra-ui/app/components",
-		"/home/eike/repos/master/ma-impl/vipra-ui/app/controllers/articles",
-		"/home/eike/repos/master/ma-impl/vipra-ui/app/controllers/topics",
-		"/home/eike/repos/master/ma-impl/vipra-ui/app/controllers/words",
-		"/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/routes/words",
-		"/home/eike/repos/master/ma-impl/vipra-ui/app/styles",
-		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates",
-		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/articles",
-		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/components",
-		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/words"
+		"/home/eike/repos/master/ma-impl/vipra-ui/bower_components/angular",
+		"/home/eike/repos/master/ma-impl/vipra-ui/bower_components/angular-resource",
+		"/home/eike/repos/master/ma-impl/vipra-ui/bower_components/angular-ui-router",
+		"/home/eike/repos/master/ma-impl/vipra-ui/bower_components/angular-ui-router/release",
+		"/home/eike/repos/master/ma-impl/vipra-ui/bower_components/bootstrap/dist/js",
+		"/home/eike/repos/master/ma-impl/vipra-ui/bower_components/jquery/dist",
+		"/home/eike/repos/master/ma-impl/vipra-ui/html",
+		"/home/eike/repos/master/ma-impl/vipra-ui/js"
 	],
 	"file_history":
 	[
+		"/home/eike/repos/master/ma-impl/vipra-ui/html/index.html",
+		"/home/eike/repos/master/ma-impl/vipra-ui/css/main.less",
+		"/home/eike/repos/master/ma-impl/vipra-ui/gulpfile.js",
+		"/home/eike/repos/master/ma-impl/vipra-ui/index.html",
+		"/home/eike/.config/sublime-text-3/Packages/User/Preferences.sublime-settings",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/adapters/application.js",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/styles/app.scss",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/index.hbs",
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/models/search.js",
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/controllers/index.js",
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/routes/index.js",
@@ -512,7 +528,6 @@
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/routes/words/index.js",
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/controllers/words/index.js",
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/routes/articles/index.js",
-		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/index.hbs",
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/models/word.js",
 		"/home/eike/Downloads/files.txt",
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/components/pagination-bar.js",
@@ -525,8 +540,6 @@
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/words/index.hbs",
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/components/pagination-bar.hbs",
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/controllers/words.js",
-		"/home/eike/repos/master/ma-impl/vipra-ui/app/adapters/application.js",
-		"/home/eike/repos/master/ma-impl/vipra-ui/app/styles/app.scss",
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/helpers/is-empty.js",
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/models/import.js",
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/router.js",
@@ -543,7 +556,6 @@
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/helpers/uppercase.js",
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/words_loading.hbs",
 		"/home/eike/repos/master/ma-impl/vipra-ui/bower.json",
-		"/home/eike/.config/sublime-text-3/Packages/User/Preferences.sublime-settings",
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/topics.hbs",
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/words.hbs",
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/articles.hbs",
@@ -625,11 +637,7 @@
 		"/home/eike/Repositories/fu/ss15/ma/impl/vipra-ui/app/components/debounced-input.js",
 		"/home/eike/Repositories/fu/ss15/ma/impl/vipra-ui/app/components/dynamic-high-charts.js",
 		"/home/eike/Repositories/fu/ss15/ma/impl/vipra-ui/app/templates/components/text-marker.hbs",
-		"/home/eike/Repositories/fu/ss15/ma/impl/vipra-ui/app/templates/components/article-list.hbs",
-		"/home/eike/Repositories/fu/ss15/ma/impl/vipra-ui/app/templates/articles/list.hbs",
-		"/home/eike/Repositories/fu/ss15/ma/impl/vm/bootstrap.sh",
-		"/home/eike/Repositories/fu/ss15/ma/impl/vipra-ui/app/adapters/application.js",
-		"/home/eike/Repositories/fu/ss15/ma/impl/vipra-ui/app/routes/articles/list.js"
+		"/home/eike/Repositories/fu/ss15/ma/impl/vipra-ui/app/templates/components/article-list.hbs"
 	],
 	"find":
 	{
@@ -953,29 +961,29 @@
 	"groups":
 	[
 		{
-			"selected": 1,
+			"selected": 2,
 			"sheets":
 			[
 				{
 					"buffer": 0,
-					"file": "vipra-ui/app/templates/index.hbs",
+					"file": "vipra-ui/index.html",
 					"semi_transient": false,
 					"settings":
 					{
-						"buffer_size": 1530,
+						"buffer_size": 1013,
 						"regions":
 						{
 						},
 						"selection":
 						[
 							[
-								1352,
-								1352
+								239,
+								239
 							]
 						],
 						"settings":
 						{
-							"syntax": "Packages/Handlebars/grammars/Handlebars.tmLanguage",
+							"syntax": "Packages/HTML/HTML.tmLanguage",
 							"tab_size": 2,
 							"translate_tabs_to_spaces": true
 						},
@@ -983,67 +991,123 @@
 						"translation.y": 0.0,
 						"zoom_level": 1.0
 					},
-					"stack_index": 1,
+					"stack_index": 2,
 					"type": "text"
 				},
 				{
 					"buffer": 1,
-					"file": "vipra-ui/app/styles/app.scss",
+					"file": "vipra-ui/js/app.js",
 					"semi_transient": false,
 					"settings":
 					{
-						"buffer_size": 914,
+						"buffer_size": 326,
 						"regions":
 						{
 						},
 						"selection":
 						[
 							[
-								681,
-								681
+								321,
+								321
 							]
 						],
 						"settings":
 						{
-							"syntax": "Packages/SCSS/SCSS.tmLanguage",
-							"tab_size": 2,
-							"translate_tabs_to_spaces": true
+							"open_with_edit": true,
+							"syntax": "Packages/JavaScriptNext - ES6 Syntax/JavaScriptNext.tmLanguage"
 						},
 						"translation.x": 0.0,
 						"translation.y": 0.0,
 						"zoom_level": 1.0
 					},
-					"stack_index": 0,
+					"stack_index": 1,
 					"type": "text"
 				},
 				{
 					"buffer": 2,
-					"file": "vipra-ui/app/adapters/application.js",
+					"file": "vipra-ui/js/controllers.js",
 					"semi_transient": false,
 					"settings":
 					{
-						"buffer_size": 506,
+						"buffer_size": 102,
 						"regions":
 						{
 						},
 						"selection":
 						[
 							[
-								119,
-								119
+								102,
+								102
 							]
 						],
 						"settings":
 						{
-							"syntax": "Packages/JavaScriptNext - ES6 Syntax/JavaScriptNext.tmLanguage",
-							"tab_size": 2,
-							"translate_tabs_to_spaces": true
+							"open_with_edit": true,
+							"syntax": "Packages/JavaScriptNext - ES6 Syntax/JavaScriptNext.tmLanguage"
 						},
 						"translation.x": 0.0,
 						"translation.y": 0.0,
 						"zoom_level": 1.0
 					},
-					"stack_index": 2,
+					"stack_index": 0,
+					"type": "text"
+				},
+				{
+					"buffer": 3,
+					"file": "vipra-ui/js/directives.js",
+					"semi_transient": false,
+					"settings":
+					{
+						"buffer_size": 49,
+						"regions":
+						{
+						},
+						"selection":
+						[
+							[
+								42,
+								42
+							]
+						],
+						"settings":
+						{
+							"open_with_edit": true,
+							"syntax": "Packages/JavaScriptNext - ES6 Syntax/JavaScriptNext.tmLanguage"
+						},
+						"translation.x": 0.0,
+						"translation.y": 0.0,
+						"zoom_level": 1.0
+					},
+					"stack_index": 3,
+					"type": "text"
+				},
+				{
+					"buffer": 4,
+					"file": "vipra-ui/js/services.js",
+					"semi_transient": false,
+					"settings":
+					{
+						"buffer_size": 47,
+						"regions":
+						{
+						},
+						"selection":
+						[
+							[
+								40,
+								40
+							]
+						],
+						"settings":
+						{
+							"open_with_edit": true,
+							"syntax": "Packages/JavaScriptNext - ES6 Syntax/JavaScriptNext.tmLanguage"
+						},
+						"translation.x": 0.0,
+						"translation.y": 0.0,
+						"zoom_level": 1.0
+					},
+					"stack_index": 4,
 					"type": "text"
 				}
 			]
diff --git a/vipra-rest/src/main/java/de/vipra/rest/APIMediaType.java b/vipra-rest/src/main/java/de/vipra/rest/APIMediaType.java
deleted file mode 100644
index c9e4cdb9f094ccc41fd9ea9dd7bc8006a2cb5d4a..0000000000000000000000000000000000000000
--- a/vipra-rest/src/main/java/de/vipra/rest/APIMediaType.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package de.vipra.rest;
-
-import javax.ws.rs.core.MediaType;
-
-public class APIMediaType extends MediaType {
-
-	public static final String APPLICATION_JSONAPI = "application/vnd.api+json";
-
-}
diff --git a/vipra-rest/src/main/java/de/vipra/rest/Application.java b/vipra-rest/src/main/java/de/vipra/rest/Application.java
index 3a5aa15bb2b98c6013e4ec810a64acddb1018561..eb1e7649e367c8dbe4ae8a98f5fce85c8f7f20ae 100644
--- a/vipra-rest/src/main/java/de/vipra/rest/Application.java
+++ b/vipra-rest/src/main/java/de/vipra/rest/Application.java
@@ -5,7 +5,6 @@ import org.glassfish.jersey.message.GZipEncoder;
 import org.glassfish.jersey.server.ResourceConfig;
 import org.glassfish.jersey.server.filter.EncodingFilter;
 
-import de.vipra.rest.provider.APIRequestFilter;
 import de.vipra.rest.provider.CORSResponseFilter;
 import de.vipra.rest.provider.ObjectMapperProvider;
 
@@ -16,7 +15,6 @@ public class Application extends ResourceConfig {
 		register(JacksonFeature.class);
 		register(CORSResponseFilter.class);
 		register(ObjectMapperProvider.class);
-		register(APIRequestFilter.class);
 		EncodingFilter.enableFor(this, GZipEncoder.class);
 	}
 
diff --git a/vipra-rest/src/main/java/de/vipra/rest/PATCH.java b/vipra-rest/src/main/java/de/vipra/rest/PATCH.java
deleted file mode 100644
index 3003f70fd8a6a604a5ef123adfa1e555854d1702..0000000000000000000000000000000000000000
--- a/vipra-rest/src/main/java/de/vipra/rest/PATCH.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package de.vipra.rest;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-import javax.ws.rs.HttpMethod;
-import javax.ws.rs.NameBinding;
-
-@Target(ElementType.METHOD)
-@Retention(RetentionPolicy.RUNTIME)
-@HttpMethod("PATCH")
-@Documented
-@NameBinding
-public @interface PATCH {}
\ No newline at end of file
diff --git a/vipra-rest/src/main/java/de/vipra/rest/model/APIVersion.java b/vipra-rest/src/main/java/de/vipra/rest/model/APIVersion.java
deleted file mode 100644
index 6e80449fd3cfa916a28751edf259382151fe73e0..0000000000000000000000000000000000000000
--- a/vipra-rest/src/main/java/de/vipra/rest/model/APIVersion.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package de.vipra.rest.model;
-
-public class APIVersion {
-
-	public final String version = "1.0";
-
-}
diff --git a/vipra-rest/src/main/java/de/vipra/rest/model/Wrapper.java b/vipra-rest/src/main/java/de/vipra/rest/model/Wrapper.java
index 0d19036bab66a0fd23b113abf92b8fd78e77cae6..c42bdee944a5f2c713cc27d47b9c92876f523655 100644
--- a/vipra-rest/src/main/java/de/vipra/rest/model/Wrapper.java
+++ b/vipra-rest/src/main/java/de/vipra/rest/model/Wrapper.java
@@ -20,7 +20,6 @@ public class Wrapper<T> {
 	private List<APIError> errors;
 	private Map<String, String> links;
 	private NestedMap meta;
-	private final APIVersion jsonapi = new APIVersion();
 
 	public Wrapper() {}
 
@@ -84,10 +83,6 @@ public class Wrapper<T> {
 		meta.put(key, value);
 	}
 
-	public APIVersion getJsonapi() {
-		return jsonapi;
-	}
-
 	public String tag() {
 		return data != null ? Integer.toString(data.hashCode()) : null;
 	}
diff --git a/vipra-rest/src/main/java/de/vipra/rest/provider/APIRequestFilter.java b/vipra-rest/src/main/java/de/vipra/rest/provider/APIRequestFilter.java
deleted file mode 100644
index 2a64e72df854428f7d64cca7ec6af3531c863748..0000000000000000000000000000000000000000
--- a/vipra-rest/src/main/java/de/vipra/rest/provider/APIRequestFilter.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package de.vipra.rest.provider;
-
-import java.io.IOException;
-
-import javax.ws.rs.container.ContainerRequestContext;
-import javax.ws.rs.container.ContainerRequestFilter;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.ext.Provider;
-
-import de.vipra.rest.APIMediaType;
-
-@Provider
-public class APIRequestFilter implements ContainerRequestFilter {
-
-	@Override
-	public void filter(ContainerRequestContext requestContext) throws IOException {
-		String contentType = requestContext.getHeaderString("Content-Type");
-		if (contentType != null) {
-			if (requestContext.getHeaderString("Content-Type").contains(";")) {
-				requestContext.abortWith(Response.status(Response.Status.UNSUPPORTED_MEDIA_TYPE).build());
-			} else {
-				String[] acceptHeader = requestContext.getHeaderString("Accept").split(",");
-				boolean abort = false;
-				for (int i = 0; i < acceptHeader.length; i++) {
-					String accept = acceptHeader[i].trim();
-					if (accept.startsWith(APIMediaType.APPLICATION_JSONAPI)) {
-						if (accept.contains(";")) {
-							abort = true;
-						} else {
-							abort = false;
-							break;
-						}
-					}
-				}
-				if (abort) {
-					requestContext.abortWith(Response.status(Response.Status.NOT_ACCEPTABLE).build());
-				}
-			}
-		}
-	}
-
-}
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 9fcbcc76d867391c4bda9812ed681d5b8ff850e5..490abad971e2c113513275372512a5e8580eeab5 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
@@ -14,15 +14,9 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.SerializationFeature;
 import com.fasterxml.jackson.databind.module.SimpleModule;
 
-import de.vipra.rest.serializer.GenericDeserializer;
-import de.vipra.rest.serializer.GenericSerializer;
 import de.vipra.rest.serializer.ObjectIdDeserializer;
 import de.vipra.rest.serializer.ObjectIdSerializer;
 import de.vipra.util.Constants;
-import de.vipra.util.model.ArticleFull;
-import de.vipra.util.model.Import;
-import de.vipra.util.model.TopicFull;
-import de.vipra.util.model.Word;
 
 @Provider
 public class ObjectMapperProvider implements ContextResolver<ObjectMapper> {
@@ -42,17 +36,6 @@ public class ObjectMapperProvider implements ContextResolver<ObjectMapper> {
 
 	public static ObjectMapper createDefaultMapper() {
 		SimpleModule module = new SimpleModule();
-		module.addSerializer(ArticleFull.class, new GenericSerializer<ArticleFull>(ArticleFull.class));
-		module.addDeserializer(ArticleFull.class, new GenericDeserializer<ArticleFull>(ArticleFull.class));
-
-		module.addSerializer(TopicFull.class, new GenericSerializer<TopicFull>(TopicFull.class));
-		module.addDeserializer(TopicFull.class, new GenericDeserializer<TopicFull>(TopicFull.class));
-
-		module.addSerializer(Word.class, new GenericSerializer<Word>(Word.class));
-		module.addDeserializer(Word.class, new GenericDeserializer<Word>(Word.class));
-
-		module.addSerializer(Import.class, new GenericSerializer<Import>(Import.class));
-		module.addDeserializer(Import.class, new GenericDeserializer<Import>(Import.class));
 
 		module.addSerializer(ObjectId.class, new ObjectIdSerializer());
 		module.addDeserializer(ObjectId.class, new ObjectIdDeserializer());
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 f760797f6d2c27c8d8ab09bcaab58c608e87afc8..6b7791a5a7e25627d759b1037c390bb28f5cb0bc 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
@@ -6,7 +6,6 @@ import java.net.URI;
 import java.net.URISyntaxException;
 import java.net.URL;
 import java.util.ArrayList;
-import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
@@ -22,6 +21,7 @@ import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriInfo;
 
@@ -35,7 +35,6 @@ import org.elasticsearch.index.query.QueryBuilders;
 import org.elasticsearch.search.SearchHit;
 import org.elasticsearch.search.SearchHits;
 
-import de.vipra.rest.APIMediaType;
 import de.vipra.rest.Messages;
 import de.vipra.rest.model.APIError;
 import de.vipra.rest.model.Wrapper;
@@ -73,7 +72,7 @@ public class ArticleResource {
 	}
 
 	@GET
-	@Produces(APIMediaType.APPLICATION_JSONAPI)
+	@Produces(MediaType.APPLICATION_JSON)
 	public Response getArticles(@QueryParam("skip") Integer skip, @QueryParam("limit") Integer limit,
 			@QueryParam("sort") @DefaultValue("date") String sortBy, @QueryParam("fields") String fields,
 			@QueryParam("query") String query) {
@@ -142,8 +141,8 @@ public class ArticleResource {
 	}
 
 	@GET
-	@Produces(APIMediaType.APPLICATION_JSONAPI)
-	@Consumes(APIMediaType.APPLICATION_JSONAPI)
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
 	@Path("{id}")
 	public Response getArticle(@PathParam("id") String id, @QueryParam("fields") String fields) {
 		Wrapper<ArticleFull> res = new Wrapper<>();
@@ -171,8 +170,8 @@ public class ArticleResource {
 	}
 
 	@POST
-	@Consumes(APIMediaType.APPLICATION_JSONAPI)
-	@Produces(APIMediaType.APPLICATION_JSONAPI)
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Produces(MediaType.APPLICATION_JSON)
 	public Response createArticle(ArticleFull article) {
 		Wrapper<ArticleFull> res;
 		try {
@@ -214,8 +213,8 @@ public class ArticleResource {
 	}
 
 	@PUT
-	@Consumes(APIMediaType.APPLICATION_JSONAPI)
-	@Produces(APIMediaType.APPLICATION_JSONAPI)
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Produces(MediaType.APPLICATION_JSON)
 	@Path("{id}")
 	public Response replaceArticle(@PathParam("id") String id, Wrapper<ArticleFull> wrapper) {
 		ArticleFull article = wrapper.getData();
diff --git a/vipra-rest/src/main/java/de/vipra/rest/resource/ImportResource.java b/vipra-rest/src/main/java/de/vipra/rest/resource/ImportResource.java
index 0f144c86ece30e21d3c481a8589725c1540225dc..f67a0b495ad04cc5da865321ec2c8975ff11f90c 100644
--- a/vipra-rest/src/main/java/de/vipra/rest/resource/ImportResource.java
+++ b/vipra-rest/src/main/java/de/vipra/rest/resource/ImportResource.java
@@ -12,6 +12,7 @@ import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriInfo;
 
@@ -20,7 +21,6 @@ import org.ehcache.Cache;
 import org.ehcache.CacheManager;
 import org.ehcache.config.CacheConfigurationBuilder;
 
-import de.vipra.rest.APIMediaType;
 import de.vipra.rest.Messages;
 import de.vipra.rest.model.APIError;
 import de.vipra.rest.model.Wrapper;
@@ -53,7 +53,7 @@ public class ImportResource {
 	}
 
 	@GET
-	@Produces(APIMediaType.APPLICATION_JSONAPI)
+	@Produces(MediaType.APPLICATION_JSON)
 	public Response getImports(@QueryParam("skip") Integer skip, @QueryParam("limit") Integer limit,
 			@QueryParam("sort") @DefaultValue("date") String sortBy, @QueryParam("fields") String fields) {
 		Wrapper<List<Import>> res = new Wrapper<>();
@@ -80,8 +80,8 @@ public class ImportResource {
 	}
 
 	@GET
-	@Produces(APIMediaType.APPLICATION_JSONAPI)
-	@Consumes(APIMediaType.APPLICATION_JSONAPI)
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
 	@Path("latest")
 	public Response getLatestImport(@QueryParam("fields") String fields) {
 		Wrapper<Import> res = new Wrapper<>();
@@ -95,8 +95,8 @@ public class ImportResource {
 	}
 
 	@GET
-	@Produces(APIMediaType.APPLICATION_JSONAPI)
-	@Consumes(APIMediaType.APPLICATION_JSONAPI)
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
 	@Path("{id}")
 	public Response getImport(@PathParam("id") String id, @QueryParam("fields") String fields) {
 		Wrapper<Import> res = new Wrapper<>();
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 2e65bf3939d8a44496da4afe9fb1c79a92a41e76..7675508c2462bfd6061c38b1aa99fd891c7b266d 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
@@ -13,6 +13,7 @@ import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriInfo;
 
@@ -21,7 +22,6 @@ import org.ehcache.Cache;
 import org.ehcache.CacheManager;
 import org.ehcache.config.CacheConfigurationBuilder;
 
-import de.vipra.rest.APIMediaType;
 import de.vipra.rest.Messages;
 import de.vipra.rest.model.APIError;
 import de.vipra.rest.model.Wrapper;
@@ -55,7 +55,7 @@ public class TopicResource {
 	}
 
 	@GET
-	@Produces(APIMediaType.APPLICATION_JSONAPI)
+	@Produces(MediaType.APPLICATION_JSON)
 	public Response getTopics(@QueryParam("skip") Integer skip, @QueryParam("limit") Integer limit,
 			@QueryParam("sort") @DefaultValue("name") String sortBy, @QueryParam("fields") String fields) {
 		Wrapper<List<TopicFull>> res = new Wrapper<>();
@@ -82,8 +82,8 @@ public class TopicResource {
 	}
 
 	@GET
-	@Produces(APIMediaType.APPLICATION_JSONAPI)
-	@Consumes(APIMediaType.APPLICATION_JSONAPI)
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
 	@Path("{id}")
 	public Response getTopic(@PathParam("id") String id, @QueryParam("fields") String fields) {
 		Wrapper<TopicFull> res = new Wrapper<>();
@@ -111,8 +111,8 @@ public class TopicResource {
 	}
 
 	@PUT
-	@Consumes(APIMediaType.APPLICATION_JSONAPI)
-	@Produces(APIMediaType.APPLICATION_JSONAPI)
+	@Consumes(MediaType.APPLICATION_JSON)
+	@Produces(MediaType.APPLICATION_JSON)
 	@Path("{id}")
 	public Response replaceTopic(@PathParam("id") String id, Wrapper<TopicFull> wrapper) {
 		TopicFull topic = wrapper.getData();
diff --git a/vipra-rest/src/main/java/de/vipra/rest/resource/WordResource.java b/vipra-rest/src/main/java/de/vipra/rest/resource/WordResource.java
index 191cb3dc357c696ffe61355c72b9f27ae3f57598..b05dbef57884ca03b6ffefb71d4e366303f959cb 100644
--- a/vipra-rest/src/main/java/de/vipra/rest/resource/WordResource.java
+++ b/vipra-rest/src/main/java/de/vipra/rest/resource/WordResource.java
@@ -12,6 +12,7 @@ import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriInfo;
 
@@ -19,7 +20,6 @@ import org.ehcache.Cache;
 import org.ehcache.CacheManager;
 import org.ehcache.config.CacheConfigurationBuilder;
 
-import de.vipra.rest.APIMediaType;
 import de.vipra.rest.Messages;
 import de.vipra.rest.model.APIError;
 import de.vipra.rest.model.Wrapper;
@@ -51,7 +51,7 @@ public class WordResource {
 	}
 
 	@GET
-	@Produces(APIMediaType.APPLICATION_JSONAPI)
+	@Produces(MediaType.APPLICATION_JSON)
 	public Response getWords(@QueryParam("skip") Integer skip, @QueryParam("limit") Integer limit,
 			@QueryParam("sort") @DefaultValue("word") String sortBy, @QueryParam("fields") String fields) {
 		Wrapper<List<Word>> res = new Wrapper<>();
@@ -78,8 +78,8 @@ public class WordResource {
 	}
 
 	@GET
-	@Produces(APIMediaType.APPLICATION_JSONAPI)
-	@Consumes(APIMediaType.APPLICATION_JSONAPI)
+	@Produces(MediaType.APPLICATION_JSON)
+	@Consumes(MediaType.APPLICATION_JSON)
 	@Path("{id}")
 	public Response getWord(@PathParam("id") String id, @QueryParam("fields") String fields) {
 		Wrapper<Word> res = new Wrapper<>();
diff --git a/vipra-rest/src/main/java/de/vipra/rest/serializer/GenericDeserializer.java b/vipra-rest/src/main/java/de/vipra/rest/serializer/GenericDeserializer.java
deleted file mode 100644
index d7842dd317bbc5d32d74b670e54e79ef7ddaff8a..0000000000000000000000000000000000000000
--- a/vipra-rest/src/main/java/de/vipra/rest/serializer/GenericDeserializer.java
+++ /dev/null
@@ -1,110 +0,0 @@
-package de.vipra.rest.serializer;
-
-import java.io.IOException;
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.core.JsonParseException;
-import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.core.JsonToken;
-import com.fasterxml.jackson.databind.DeserializationContext;
-import com.fasterxml.jackson.databind.JsonDeserializer;
-
-import de.vipra.util.StringUtils;
-import de.vipra.util.an.JsonWrap;
-import de.vipra.util.model.Model;
-
-public class GenericDeserializer<T extends Model<?>> extends JsonDeserializer<T> {
-
-	private final Class<T> clazz;
-	private final Set<String> nestingPrefixes = new HashSet<>();
-	private final Map<String, Field> allFields = new HashMap<>();
-
-	public GenericDeserializer(Class<T> clazz) {
-		this.clazz = clazz;
-
-		Field[] fields = clazz.getDeclaredFields();
-		for (Field field : fields) {
-			int modifiers = field.getModifiers();
-			if (Modifier.isPrivate(modifiers) && !Modifier.isStatic(modifiers)) {
-				field.setAccessible(true);
-
-				JsonIgnore ji = field.getDeclaredAnnotation(JsonIgnore.class);
-				if (ji != null && ji.value())
-					continue;
-
-				String name = field.getName();
-
-				JsonProperty jp = field.getDeclaredAnnotation(JsonProperty.class);
-				if (jp != null)
-					name = jp.value();
-
-				JsonWrap jw = field.getDeclaredAnnotation(JsonWrap.class);
-				if (jw != null)
-					name = jw.value() + "." + name;
-
-				name = StringUtils.camelToDashCase(name);
-				allFields.put(name, field);
-
-				String[] parts = name.split("\\.");
-				if (parts.length > 1) {
-					String currentPrefix = parts[0];
-					nestingPrefixes.add(currentPrefix);
-					for (int i = 1; i < parts.length - 1; i++) {
-						currentPrefix += "." + parts[i];
-						nestingPrefixes.add(currentPrefix);
-					}
-				}
-			}
-		}
-	}
-
-	@Override
-	public T deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
-		T value = null;
-
-		try {
-			value = clazz.newInstance();
-		} catch (InstantiationException | IllegalAccessException e) {
-			throw new IOException("could not instantiate object. Default ctor is missing.");
-		}
-
-		while (p.nextToken() != JsonToken.END_OBJECT) {
-			String name = p.getCurrentName();
-			Field field = allFields.get(name);
-			p.nextToken();
-			if (field != null) {
-				try {
-					field.set(value, p.readValueAs(field.getType()));
-				} catch (IllegalArgumentException | IllegalAccessException e) {}
-			} else if (nestingPrefixes.contains(name)) {
-				getNested(p, value, name + ".");
-			}
-		}
-
-		return value;
-	}
-
-	public void getNested(JsonParser p, T value, String prefix) throws JsonParseException, IOException {
-		while (p.nextToken() != JsonToken.END_OBJECT) {
-			String name = prefix + p.getCurrentName();
-			Field field = allFields.get(name);
-			p.nextToken();
-			if (field != null) {
-				try {
-					field.set(value, p.readValueAs(field.getType()));
-				} catch (IllegalArgumentException | IllegalAccessException e) {}
-			} else if (nestingPrefixes.contains(name)) {
-				getNested(p, value, name + ".");
-			}
-		}
-	}
-
-}
diff --git a/vipra-rest/src/main/java/de/vipra/rest/serializer/GenericSerializer.java b/vipra-rest/src/main/java/de/vipra/rest/serializer/GenericSerializer.java
deleted file mode 100644
index 801c3d894d5ef78b001679861b295de63df8ce46..0000000000000000000000000000000000000000
--- a/vipra-rest/src/main/java/de/vipra/rest/serializer/GenericSerializer.java
+++ /dev/null
@@ -1,98 +0,0 @@
-package de.vipra.rest.serializer;
-
-import java.io.IOException;
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.core.JsonGenerator;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.JsonSerializer;
-import com.fasterxml.jackson.databind.SerializerProvider;
-
-import de.vipra.util.NestedMap;
-import de.vipra.util.StringUtils;
-import de.vipra.util.an.JsonType;
-import de.vipra.util.an.JsonWrap;
-import de.vipra.util.model.Model;
-
-public class GenericSerializer<T extends Model<?>> extends JsonSerializer<T> {
-
-	private final String typeName;
-	private final List<Entry<String, Field>> allFields;
-
-	public GenericSerializer(Class<T> clazz) {
-		JsonType aField = clazz.getDeclaredAnnotation(JsonType.class);
-		if (aField != null)
-			this.typeName = aField.value().toLowerCase();
-		else
-			this.typeName = clazz.getSimpleName().toLowerCase();
-
-		Map<String, Field> foundFields = new HashMap<>();
-
-		Field[] fields = clazz.getDeclaredFields();
-		for (Field field : fields) {
-			int modifiers = field.getModifiers();
-			if (Modifier.isPrivate(modifiers) && !Modifier.isStatic(modifiers)) {
-				field.setAccessible(true);
-
-				JsonIgnore ji = field.getDeclaredAnnotation(JsonIgnore.class);
-				if (ji != null && ji.value())
-					continue;
-
-				String name = field.getName();
-
-				JsonProperty jp = field.getDeclaredAnnotation(JsonProperty.class);
-				if (jp != null)
-					name = jp.value();
-
-				JsonWrap jw = field.getDeclaredAnnotation(JsonWrap.class);
-				if (jw != null)
-					name = jw.value() + "." + name;
-
-				name = StringUtils.camelToDashCase(name);
-				foundFields.put(name, field);
-			}
-		}
-
-		this.allFields = new ArrayList<>(foundFields.entrySet());
-
-		Collections.sort(this.allFields, new Comparator<Entry<String, Field>>() {
-			@Override
-			public int compare(Entry<String, Field> o1, Entry<String, Field> o2) {
-				return o1.getKey().compareTo(o2.getKey());
-			}
-		});
-	}
-
-	@Override
-	public void serialize(T value, JsonGenerator gen, SerializerProvider serializers)
-			throws IOException, JsonProcessingException {
-
-		NestedMap map = new NestedMap();
-		map.put("type", typeName);
-
-		for (Entry<String, Field> entry : allFields) {
-			Object v = null;
-			try {
-				v = entry.getValue().get(value);
-			} catch (IllegalArgumentException | IllegalAccessException e) {
-				e.printStackTrace();
-			}
-
-			if (v != null)
-				map.put(entry.getKey(), v);
-		}
-
-		serializers.defaultSerializeValue(map, gen);
-	}
-
-}
diff --git a/vipra-ui/.bowerrc b/vipra-ui/.bowerrc
deleted file mode 100644
index 959e1696e7b2c970005c35ec8a0f94aea5df36ac..0000000000000000000000000000000000000000
--- a/vipra-ui/.bowerrc
+++ /dev/null
@@ -1,4 +0,0 @@
-{
-  "directory": "bower_components",
-  "analytics": false
-}
diff --git a/vipra-ui/.classpath b/vipra-ui/.classpath
deleted file mode 100644
index d6da2a8521a35152027ff4ca29cc9fdfeab04d42..0000000000000000000000000000000000000000
--- a/vipra-ui/.classpath
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
-		<attributes>
-			<attribute name="owner.project.facets" value="java"/>
-		</attributes>
-	</classpathentry>
-	<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.web.container"/>
-	<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/>
-	<classpathentry kind="output" path="build/classes"/>
-</classpath>
diff --git a/vipra-ui/.editorconfig b/vipra-ui/.editorconfig
deleted file mode 100644
index 47c5438403ca875f170db2aa07d1bfa3689406e3..0000000000000000000000000000000000000000
--- a/vipra-ui/.editorconfig
+++ /dev/null
@@ -1,34 +0,0 @@
-# EditorConfig helps developers define and maintain consistent
-# coding styles between different editors and IDEs
-# editorconfig.org
-
-root = true
-
-
-[*]
-end_of_line = lf
-charset = utf-8
-trim_trailing_whitespace = true
-insert_final_newline = true
-indent_style = space
-indent_size = 2
-
-[*.js]
-indent_style = space
-indent_size = 2
-
-[*.hbs]
-insert_final_newline = false
-indent_style = space
-indent_size = 2
-
-[*.css]
-indent_style = space
-indent_size = 2
-
-[*.html]
-indent_style = space
-indent_size = 2
-
-[*.{diff,md}]
-trim_trailing_whitespace = false
diff --git a/vipra-ui/.ember-cli b/vipra-ui/.ember-cli
deleted file mode 100644
index ee64cfed2a8905dc23506af1060ec80cf887582d..0000000000000000000000000000000000000000
--- a/vipra-ui/.ember-cli
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-  /**
-    Ember CLI sends analytics information by default. The data is completely
-    anonymous, but there are times when you might want to disable this behavior.
-
-    Setting `disableAnalytics` to true will prevent any data from being sent.
-  */
-  "disableAnalytics": false
-}
diff --git a/vipra-ui/.gitignore b/vipra-ui/.gitignore
index 86fceae7af4fb5a8de2c3c125e7f9a64c3ffbe0c..68b9e27759d7ca5877d5a46b29f674ec48e3c62c 100644
--- a/vipra-ui/.gitignore
+++ b/vipra-ui/.gitignore
@@ -1,17 +1,2 @@
-# See http://help.github.com/ignore-files/ for more about ignoring files.
-
-# compiled output
-/dist
-/tmp
-
-# dependencies
-/node_modules
-/bower_components
-
-# misc
-/.sass-cache
-/connect.lock
-/coverage/*
-/libpeerconnection.log
-npm-debug.log
-testem.log
+node_modules/
+bower_components/
diff --git a/vipra-ui/.jshintrc b/vipra-ui/.jshintrc
deleted file mode 100644
index 08096effaab374994adcb3578e988675a4befa82..0000000000000000000000000000000000000000
--- a/vipra-ui/.jshintrc
+++ /dev/null
@@ -1,32 +0,0 @@
-{
-  "predef": [
-    "document",
-    "window",
-    "-Promise"
-  ],
-  "browser": true,
-  "boss": true,
-  "curly": true,
-  "debug": false,
-  "devel": true,
-  "eqeqeq": true,
-  "evil": true,
-  "forin": false,
-  "immed": false,
-  "laxbreak": false,
-  "newcap": true,
-  "noarg": true,
-  "noempty": false,
-  "nonew": false,
-  "nomen": false,
-  "onevar": false,
-  "plusplus": false,
-  "regexp": false,
-  "undef": true,
-  "sub": true,
-  "strict": false,
-  "white": false,
-  "eqnull": true,
-  "esnext": true,
-  "unused": true
-}
diff --git a/vipra-ui/.project b/vipra-ui/.project
deleted file mode 100644
index eee3426428df05147acccd89868b1434efb4157c..0000000000000000000000000000000000000000
--- a/vipra-ui/.project
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>vipra-ui</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.wst.jsdt.core.javascriptValidator</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.wst.common.project.facet.core.builder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.wst.validation.validationbuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
-		<nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
-		<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
-		<nature>org.eclipse.wst.jsdt.core.jsNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/vipra-ui/.settings/.jsdtscope b/vipra-ui/.settings/.jsdtscope
deleted file mode 100644
index 92e666d77dd95f33f7fc056a45049f2034b90ab8..0000000000000000000000000000000000000000
--- a/vipra-ui/.settings/.jsdtscope
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry excluding="**/bower_components/*|**/node_modules/*|**/*.min.js" kind="src" path="WebContent"/>
-	<classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.WebProject">
-		<attributes>
-			<attribute name="hide" value="true"/>
-		</attributes>
-	</classpathentry>
-	<classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.baseBrowserLibrary"/>
-	<classpathentry kind="output" path=""/>
-</classpath>
diff --git a/vipra-ui/.settings/org.eclipse.jdt.core.prefs b/vipra-ui/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 0c68a61dca867ceb49e79d2402935261ec3e3809..0000000000000000000000000000000000000000
--- a/vipra-ui/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,7 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
-org.eclipse.jdt.core.compiler.compliance=1.8
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.8
diff --git a/vipra-ui/.settings/org.eclipse.wst.common.component b/vipra-ui/.settings/org.eclipse.wst.common.component
deleted file mode 100644
index 1f5413a37ea6089f61ba44e214e248c8514aadf5..0000000000000000000000000000000000000000
--- a/vipra-ui/.settings/org.eclipse.wst.common.component
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><project-modules id="moduleCoreId" project-version="1.5.0">
-    <wb-module deploy-name="vipra-ui">
-        <wb-resource deploy-path="/" source-path="/dist"/>
-        <wb-resource deploy-path="/" source-path="/webapp" tag="defaultRootSource"/>
-        <property name="context-root" value="vipra-ui"/>
-        <property name="java-output-path" value="/vipra-ui/build/classes"/>
-    </wb-module>
-</project-modules>
diff --git a/vipra-ui/.settings/org.eclipse.wst.common.project.facet.core.xml b/vipra-ui/.settings/org.eclipse.wst.common.project.facet.core.xml
deleted file mode 100644
index 5523f3219616f2cb009139882bc5716b68f58365..0000000000000000000000000000000000000000
--- a/vipra-ui/.settings/org.eclipse.wst.common.project.facet.core.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<faceted-project>
-  <fixed facet="jst.web"/>
-  <fixed facet="wst.jsdt.web"/>
-  <fixed facet="java"/>
-  <installed facet="wst.jsdt.web" version="1.0"/>
-  <installed facet="java" version="1.8"/>
-  <installed facet="jst.web" version="3.1"/>
-</faceted-project>
diff --git a/vipra-ui/.settings/org.eclipse.wst.jsdt.ui.superType.container b/vipra-ui/.settings/org.eclipse.wst.jsdt.ui.superType.container
deleted file mode 100644
index 3bd5d0a4803967bc0bf72a7dd66d7e292ed2e586..0000000000000000000000000000000000000000
--- a/vipra-ui/.settings/org.eclipse.wst.jsdt.ui.superType.container
+++ /dev/null
@@ -1 +0,0 @@
-org.eclipse.wst.jsdt.launching.baseBrowserLibrary
\ No newline at end of file
diff --git a/vipra-ui/.settings/org.eclipse.wst.jsdt.ui.superType.name b/vipra-ui/.settings/org.eclipse.wst.jsdt.ui.superType.name
deleted file mode 100644
index 05bd71b6ec2c1982d1e8a5653073281994564ae8..0000000000000000000000000000000000000000
--- a/vipra-ui/.settings/org.eclipse.wst.jsdt.ui.superType.name
+++ /dev/null
@@ -1 +0,0 @@
-Window
\ No newline at end of file
diff --git a/vipra-ui/.settings/org.eclipse.wst.validation.prefs b/vipra-ui/.settings/org.eclipse.wst.validation.prefs
deleted file mode 100644
index 508e5864e22b94faa2fd10dd376630d050fb3c7e..0000000000000000000000000000000000000000
--- a/vipra-ui/.settings/org.eclipse.wst.validation.prefs
+++ /dev/null
@@ -1,12 +0,0 @@
-DELEGATES_PREFERENCE=delegateValidatorList
-USER_BUILD_PREFERENCE=enabledBuildValidatorListorg.eclipse.wst.wsi.ui.internal.WSIMessageValidator;
-USER_MANUAL_PREFERENCE=enabledManualValidatorListorg.eclipse.wst.wsi.ui.internal.WSIMessageValidator;
-USER_PREFERENCE=overrideGlobalPreferencestruedisableAllValidationfalseversion1.2.700.v201508251749
-eclipse.preferences.version=1
-override=true
-suspend=false
-vals/org.eclipse.wst.html.core.HTMLValidator/global=FF01
-vals/org.eclipse.wst.xml.core.xml/global=FF03
-vals/org.eclipse.wst.xsd.core.xsd/global=FF02162org.eclipse.wst.xsd.core.internal.validation.eclipse.Validator
-vals/org.eclipse.wst.xsl.core.xsl/global=FF02
-vf.version=3
diff --git a/vipra-ui/.travis.yml b/vipra-ui/.travis.yml
deleted file mode 100644
index 66dd1076931b767dd6c5680bc289d29ea2dd9013..0000000000000000000000000000000000000000
--- a/vipra-ui/.travis.yml
+++ /dev/null
@@ -1,23 +0,0 @@
----
-language: node_js
-node_js:
-  - "0.12"
-
-sudo: false
-
-cache:
-  directories:
-    - node_modules
-
-before_install:
-  - export PATH=/usr/local/phantomjs-2.0.0/bin:$PATH
-  - "npm config set spin false"
-  - "npm install -g npm@^2"
-
-install:
-  - npm install -g bower
-  - npm install
-  - bower install
-
-script:
-  - npm test
diff --git a/vipra-ui/.watchmanconfig b/vipra-ui/.watchmanconfig
deleted file mode 100644
index e7834e3e4f39c1a745942dfe90891708593e0ea6..0000000000000000000000000000000000000000
--- a/vipra-ui/.watchmanconfig
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-  "ignore_dirs": ["tmp", "dist"]
-}
diff --git a/vipra-ui/README.md b/vipra-ui/README.md
deleted file mode 100644
index 0a2e3896dc3a90df34fd6b222b2700fefff217c8..0000000000000000000000000000000000000000
--- a/vipra-ui/README.md
+++ /dev/null
@@ -1,27 +0,0 @@
-# Vipra-UI
-
-This is the user interface of Vipra. It provides the front end application, served from a static webserver, and connects to the vipra-rest REST backend application.
-
-## Development
-
-To compile/debug, install dependencies. Vipra-UI was built using Ember.js with ember-cli, which requires nodejs >= 4.x, npm >= 2.x, and bower
-
-In the project root, run:
-
-* `npm install`
-* `bower install`
-
-to install dependencies. Notice that bower dependencies are pinned to specific versions to work around a bug in Ember.
-
-Serve a development server with:
-
-* `ember s`
-
-### Common problems
-
-If ember throws errors about highcharts, remove highcharts from package.json and reinstall:
-
-* npm uninstall --save-dev ember-highcharts
-* ember install ember-highcharts
-
-it seems that ember install does more than just installing dependencies.
\ No newline at end of file
diff --git a/vipra-ui/app/adapters/application.js b/vipra-ui/app/adapters/application.js
deleted file mode 100644
index 0d442b61c170d4fa40db3aae849cc2e0cc783dc3..0000000000000000000000000000000000000000
--- a/vipra-ui/app/adapters/application.js
+++ /dev/null
@@ -1,17 +0,0 @@
-import DS from 'ember-data';
-
-export default DS.JSONAPIAdapter.extend({
-  host: `http://${window.location.hostname}:8080`,
-  namespace: 'vipra-rest',
-  updateRecord(store, type, snapshot) {
-    var data = {};
-    var serializer = store.serializerFor(type.modelName);
-
-    serializer.serializeIntoHash(data, type, snapshot, { includeId: true });
-
-    var id = snapshot.id;
-    var url = this.buildURL(type.modelName, id, snapshot, 'updateRecord');
-
-    return this.ajax(url, 'PUT', { data: data });
-  }
-});
diff --git a/vipra-ui/app/app.js b/vipra-ui/app/app.js
deleted file mode 100644
index 8b234d6d57b1cad624f1b71bec589b714afb593a..0000000000000000000000000000000000000000
--- a/vipra-ui/app/app.js
+++ /dev/null
@@ -1,18 +0,0 @@
-import Ember from 'ember';
-import Resolver from 'ember/resolver';
-import loadInitializers from 'ember/load-initializers';
-import config from './config/environment';
-
-let App;
-
-Ember.MODEL_FACTORY_INJECTIONS = true;
-
-App = Ember.Application.extend({
-  modulePrefix: config.modulePrefix,
-  podModulePrefix: config.podModulePrefix,
-  Resolver
-});
-
-loadInitializers(App, config.modulePrefix);
-
-export default App;
diff --git a/vipra-ui/app/components/.gitkeep b/vipra-ui/app/components/.gitkeep
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/vipra-ui/app/components/debounced-input.js b/vipra-ui/app/components/debounced-input.js
deleted file mode 100644
index ba23db7e352f89169776916bb0eb698a7a6fe40d..0000000000000000000000000000000000000000
--- a/vipra-ui/app/components/debounced-input.js
+++ /dev/null
@@ -1,19 +0,0 @@
-import Ember from 'ember';
-
-export default Ember.TextField.extend({
-  debounce: 500,
-  fireAtStart: false,
-
-  _elementValueDidChange() {
-    let val = this.$().val();
-    if(val) {
-      Ember.run.debounce(this, this._setValue, this.debounce, this.fireAtStart);
-    } else {
-      this._setValue();
-    }
-  },
-
-  _setValue() {
-    this.set('value', this.$().val());
-  }
-});
diff --git a/vipra-ui/app/components/dynamic-high-charts.js b/vipra-ui/app/components/dynamic-high-charts.js
deleted file mode 100644
index 746faf9d4f4af4590cc72257e260f895ac9e4470..0000000000000000000000000000000000000000
--- a/vipra-ui/app/components/dynamic-high-charts.js
+++ /dev/null
@@ -1,14 +0,0 @@
-import EmberHighChartsComponent from 'ember-highcharts/components/high-charts';
-
-export default EmberHighChartsComponent.extend({
-
-  redrawChart: function() {
-    // add redraw logic here. ex:
-    var chart = this.get('chart');
-    var seriesName = this.get('content')[0].name;
-    chart.series[0].update({ name: seriesName, data: this.get('content')[0].data }, false);
-    chart.setTitle(null, { text: seriesName }, false);
-    chart.redraw();
-  }.observes('content.@each.isLoaded')
-
-});
diff --git a/vipra-ui/app/components/items-list.js b/vipra-ui/app/components/items-list.js
deleted file mode 100644
index 48125bb8fd29bfc046ecca7f91301dc21061f8f5..0000000000000000000000000000000000000000
--- a/vipra-ui/app/components/items-list.js
+++ /dev/null
@@ -1,17 +0,0 @@
-import Ember from 'ember';
-
-export default Ember.Component.extend({
-
-  route: '',
-
-  filteredItems: Ember.computed('items', 'filter', function() {
-    var keyword = this.get('filter');
-    var filtered = this.get('items');
-    if (keyword) {
-      keyword = keyword.toLowerCase().trim();
-      filtered = this.get('items').filter((item) => item.get('_name').toLowerCase().includes(keyword));
-    }
-    return filtered;
-  })
-
-});
\ No newline at end of file
diff --git a/vipra-ui/app/components/pagination-bar.js b/vipra-ui/app/components/pagination-bar.js
deleted file mode 100644
index 42d7c324b9653e624ad1c0fff8362bd868258c03..0000000000000000000000000000000000000000
--- a/vipra-ui/app/components/pagination-bar.js
+++ /dev/null
@@ -1,65 +0,0 @@
-import Ember from 'ember';
-
-export default Ember.Component.extend({
-
-  elements: 2,
-
-  currentPage: Ember.computed('page', function() {
-    return parseInt(this.get('page') || 1);
-  }),
-
-  prev: Ember.computed('page', function() {
-    return this.get('currentPage') > 1;
-  }),
-
-  prevPrev: Ember.computed('page', function() {
-    return this.get('currentPage') > this.elements + 1;
-  }),
-
-  prevPage: Ember.computed('page', function() {
-    return this.get('currentPage') - 1;
-  }),
-
-  next: Ember.computed('page', function() {
-    return this.get('currentPage') < Math.ceil(this.total/this.limit*1.0);
-  }),
-
-  nextNext: Ember.computed('page', function() {
-    return this.get('currentPage') < Math.ceil(this.total/this.limit*1.0) - this.elements;
-  }),
-
-  nextPage: Ember.computed('page', function() {
-    return this.get('currentPage') + 1;
-  }),
-
-  lastPage: Ember.computed('page', function() {
-    return Math.ceil(this.total/this.limit*1.0);
-  }),
-
-  pages: Ember.computed('total', 'page', 'limit', 'elements', function() {
-    let pages = [],
-        page  = this.get('currentPage'),
-        max   = Math.ceil(this.total/this.limit*1.0),
-        start = Math.max(page - this.elements, 1),
-        end   = Math.min(Math.max(page + this.elements, start + this.elements * 2), max);
-    for(let i = start; i <= end; i++) {
-      pages.push({page:i, active:i===page});
-    }
-    return pages;
-  }),
-
-  enabled: Ember.computed('total', 'limit', function() {
-    return this.total > this.limit;
-  }),
-
-  actions: {
-    prompt() {
-      let lastPage = this.get('lastPage'),
-          page = parseInt(window.prompt(`Enter a page number (between 1 and ${lastPage})`) || 0);
-      if(!isNaN(page) && page > 0 && page < lastPage) {
-        this.set('page', page);
-      }
-    }
-  }
-
-});
diff --git a/vipra-ui/app/components/scroll-top.js b/vipra-ui/app/components/scroll-top.js
deleted file mode 100644
index 5701f5aa07c52dbc7e01c40c6741d83dc4196a07..0000000000000000000000000000000000000000
--- a/vipra-ui/app/components/scroll-top.js
+++ /dev/null
@@ -1,17 +0,0 @@
-import Ember from 'ember';
-
-export default Ember.Component.extend({
-  tagName: 'a',
-  attributeBindings: ['href'],
-  href: '#',
-  classNames: ['scroll-top'],
-
-  click(e) {
-    e.preventDefault();
-    window.scrollTo(0, 0);
-  },
-
-  _text: Ember.computed(function() {
-    return this.get('text') || 'Top';
-  })
-});
diff --git a/vipra-ui/app/components/text-marker.js b/vipra-ui/app/components/text-marker.js
deleted file mode 100644
index 0e0518bb943456c9325837bd59c848b9f5f4d435..0000000000000000000000000000000000000000
--- a/vipra-ui/app/components/text-marker.js
+++ /dev/null
@@ -1,18 +0,0 @@
-import Ember from 'ember';
-
-export default Ember.Component.extend({
-
-  setup: function() {
-    this.updateTextMarker();
-  }.on('init'),
-
-  updateTextMarker: function() {
-    var text = this.get('text');
-    var mark = this.get('mark');
-    if(mark) {
-      text = text.replace(new RegExp(mark, 'ig'), '<b>$&</b>');
-    }
-    this.set('marked', text);
-  }.observes('text', 'mark')
-
-});
diff --git a/vipra-ui/app/components/topic-link.js b/vipra-ui/app/components/topic-link.js
deleted file mode 100644
index b165541920b5bba5ad9cb64e0dc96d2c21093809..0000000000000000000000000000000000000000
--- a/vipra-ui/app/components/topic-link.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import Ember from 'ember';
-
-export default Ember.Component.extend({
-
-  tagName: 'span',
-
-  text: Ember.computed('topic', function() {
-    var topic = this.get('topic');
-    return topic.name ? topic.name : topic.id;
-  })
-
-});
diff --git a/vipra-ui/app/controllers/.gitkeep b/vipra-ui/app/controllers/.gitkeep
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/vipra-ui/app/controllers/articles/index.js b/vipra-ui/app/controllers/articles/index.js
deleted file mode 100644
index f73630c178935d15174a8ed30314d996e113320a..0000000000000000000000000000000000000000
--- a/vipra-ui/app/controllers/articles/index.js
+++ /dev/null
@@ -1,8 +0,0 @@
-import Ember from 'ember';
-
-export default Ember.Controller.extend({
-
-  queryParams: 'page',
-  page: 1
-  
-});
diff --git a/vipra-ui/app/controllers/index.js b/vipra-ui/app/controllers/index.js
deleted file mode 100644
index faf5a820e1f079474c77da2a85a741d33ed1e89a..0000000000000000000000000000000000000000
--- a/vipra-ui/app/controllers/index.js
+++ /dev/null
@@ -1,16 +0,0 @@
-export default Ember.Controller.extend({
-
-  queryParams: 'q',
-  q: '',
-
-  search: Ember.computed('q', function() {
-    let query = this.get('q');
-    if(query) {
-      return this.store.query('article', {
-        query: query,
-        limit: 10
-      });
-    }
-  })
-
-});
\ No newline at end of file
diff --git a/vipra-ui/app/controllers/topics/index.js b/vipra-ui/app/controllers/topics/index.js
deleted file mode 100644
index d215b2d1a223f15ecdca82eb2a3bf67583b80cf7..0000000000000000000000000000000000000000
--- a/vipra-ui/app/controllers/topics/index.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import Ember from 'ember';
-
-export default Ember.Controller.extend({
-  queryParams: 'page',
-  page: 1
-});
diff --git a/vipra-ui/app/controllers/words/index.js b/vipra-ui/app/controllers/words/index.js
deleted file mode 100644
index d215b2d1a223f15ecdca82eb2a3bf67583b80cf7..0000000000000000000000000000000000000000
--- a/vipra-ui/app/controllers/words/index.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import Ember from 'ember';
-
-export default Ember.Controller.extend({
-  queryParams: 'page',
-  page: 1
-});
diff --git a/vipra-ui/app/helpers/.gitkeep b/vipra-ui/app/helpers/.gitkeep
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/vipra-ui/app/helpers/is-empty.js b/vipra-ui/app/helpers/is-empty.js
deleted file mode 100644
index 19ca8d4420d0b7f9c39ff145866f2b4f18222dda..0000000000000000000000000000000000000000
--- a/vipra-ui/app/helpers/is-empty.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import Ember from 'ember';
-
-export function isEmpty(params/*, hash*/) {
-  let ary = params[0],
-      text = params[1];
-  if(!ary || typeof ary.length === "undefined" || !ary.length) {
-    return text;
-  }
-  return null;
-}
-
-export default Ember.Helper.helper(isEmpty);
diff --git a/vipra-ui/app/helpers/pluralize.js b/vipra-ui/app/helpers/pluralize.js
deleted file mode 100644
index 56141b218fd1167469292a067fb4d9828d9b687a..0000000000000000000000000000000000000000
--- a/vipra-ui/app/helpers/pluralize.js
+++ /dev/null
@@ -1,10 +0,0 @@
-import Ember from 'ember';
-
-export function pluralize(params) {
-  let number = params[0],
-      singular = params[1],
-      plural = params[2] || singular + 's';
- return number === 1 ? singular : plural;
-}
-
-export default Ember.Helper.helper(pluralize);
diff --git a/vipra-ui/app/helpers/topic-share.js b/vipra-ui/app/helpers/topic-share.js
deleted file mode 100644
index 65c0e9dd5747bc6cda664d6f9dfbe5f87033bb9f..0000000000000000000000000000000000000000
--- a/vipra-ui/app/helpers/topic-share.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import Ember from 'ember';
-
-export function topicShare(args) {
-  return Math.round(args[0] / args[1] * 100);
-}
-
-export default Ember.Helper.helper(topicShare);
diff --git a/vipra-ui/app/index.html b/vipra-ui/app/index.html
deleted file mode 100644
index bc38d0b0838bb75559b3d7df61ec77d55409f833..0000000000000000000000000000000000000000
--- a/vipra-ui/app/index.html
+++ /dev/null
@@ -1,44 +0,0 @@
-<!DOCTYPE html>
-<html>
-  <head>
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge">
-    <meta name="viewport" content="width=device-width, initial-scale=1">
-    <title>Vipra</title>
-
-    <link rel="apple-touch-icon" sizes="57x57" href="/apple-touch-icon-57x57.png">
-    <link rel="apple-touch-icon" sizes="60x60" href="/apple-touch-icon-60x60.png">
-    <link rel="apple-touch-icon" sizes="72x72" href="/apple-touch-icon-72x72.png">
-    <link rel="apple-touch-icon" sizes="76x76" href="/apple-touch-icon-76x76.png">
-    <link rel="apple-touch-icon" sizes="114x114" href="/apple-touch-icon-114x114.png">
-    <link rel="apple-touch-icon" sizes="120x120" href="/apple-touch-icon-120x120.png">
-    <link rel="apple-touch-icon" sizes="144x144" href="/apple-touch-icon-144x144.png">
-    <link rel="apple-touch-icon" sizes="152x152" href="/apple-touch-icon-152x152.png">
-    <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon-180x180.png">
-    <link rel="icon" type="image/png" href="/favicon-32x32.png" sizes="32x32">
-    <link rel="icon" type="image/png" href="/favicon-194x194.png" sizes="194x194">
-    <link rel="icon" type="image/png" href="/favicon-96x96.png" sizes="96x96">
-    <link rel="icon" type="image/png" href="/android-chrome-192x192.png" sizes="192x192">
-    <link rel="icon" type="image/png" href="/favicon-16x16.png" sizes="16x16">
-    <link rel="manifest" href="/manifest.json">
-    <link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5">
-    <meta name="msapplication-TileColor" content="#da532c">
-    <meta name="msapplication-TileImage" content="/mstile-144x144.png">
-    <meta name="theme-color" content="#ffffff">
-
-    {{content-for 'head'}}
-
-    <link rel="stylesheet" href="assets/vendor.css">
-    <link rel="stylesheet" href="assets/vipra-ui.css">
-
-    {{content-for 'head-footer'}}
-  </head>
-  <body>
-    {{content-for 'body'}}
-
-    <script src="assets/vendor.js"></script>
-    <script src="assets/vipra-ui.js"></script>
-
-    {{content-for 'body-footer'}}
-  </body>
-</html>
diff --git a/vipra-ui/app/models/.gitkeep b/vipra-ui/app/models/.gitkeep
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/vipra-ui/app/models/article.js b/vipra-ui/app/models/article.js
deleted file mode 100644
index fc38e0953d2df40b7c1ca83dec430ed494561ed0..0000000000000000000000000000000000000000
--- a/vipra-ui/app/models/article.js
+++ /dev/null
@@ -1,17 +0,0 @@
-import DS from 'ember-data';
-
-export default DS.Model.extend({
-  title: DS.attr(),
-  text: DS.attr(),
-  url: DS.attr(),
-  date: DS.attr('date'),
-  stats: DS.attr(),
-  topics: DS.attr(),
-  created: DS.attr('date'),
-  modified: DS.attr('date'),
-
-  _name: function() {
-    var title = this.get('title');
-    return title ? title : this.get('id');
-  }.property('title')
-});
diff --git a/vipra-ui/app/models/import.js b/vipra-ui/app/models/import.js
deleted file mode 100644
index f7cbb7b5cb04fe01d4e9a52d89c898921f26308d..0000000000000000000000000000000000000000
--- a/vipra-ui/app/models/import.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import DS from 'ember-data';
-
-export default DS.Model.extend({
-  date: DS.attr('date'),
-  duration: DS.attr(),
-  articles: DS.attr(),
-  articlesCount: DS.attr(),
-  topics: DS.attr(),
-  topicsCount: DS.attr(),
-  words: DS.attr(),
-  wordsCount: DS.attr()
-});
diff --git a/vipra-ui/app/models/search.js b/vipra-ui/app/models/search.js
deleted file mode 100644
index fc38e0953d2df40b7c1ca83dec430ed494561ed0..0000000000000000000000000000000000000000
--- a/vipra-ui/app/models/search.js
+++ /dev/null
@@ -1,17 +0,0 @@
-import DS from 'ember-data';
-
-export default DS.Model.extend({
-  title: DS.attr(),
-  text: DS.attr(),
-  url: DS.attr(),
-  date: DS.attr('date'),
-  stats: DS.attr(),
-  topics: DS.attr(),
-  created: DS.attr('date'),
-  modified: DS.attr('date'),
-
-  _name: function() {
-    var title = this.get('title');
-    return title ? title : this.get('id');
-  }.property('title')
-});
diff --git a/vipra-ui/app/models/topic.js b/vipra-ui/app/models/topic.js
deleted file mode 100644
index f1aa4bc57d08ff198ea7fdd730e15892298f2d4f..0000000000000000000000000000000000000000
--- a/vipra-ui/app/models/topic.js
+++ /dev/null
@@ -1,14 +0,0 @@
-import DS from 'ember-data';
-
-export default DS.Model.extend({
-  name: DS.attr(),
-  index: DS.attr(),
-  words: DS.attr(),
-  created: DS.attr('date'),
-  modified: DS.attr('date'),
-
-  _name: function() {
-    var name = this.get('name');
-    return name ? name : this.get('id');
-  }.property('name')
-});
diff --git a/vipra-ui/app/models/word.js b/vipra-ui/app/models/word.js
deleted file mode 100644
index 4d7296307825dd836622dc1f00a831baccf3da70..0000000000000000000000000000000000000000
--- a/vipra-ui/app/models/word.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import DS from 'ember-data';
-
-export default DS.Model.extend({
-  _name: function() {
-    return this.get('id');
-  }.property('id')
-});
\ No newline at end of file
diff --git a/vipra-ui/app/router.js b/vipra-ui/app/router.js
deleted file mode 100644
index c4a21fcfb6da02587e95569888298d157f857484..0000000000000000000000000000000000000000
--- a/vipra-ui/app/router.js
+++ /dev/null
@@ -1,26 +0,0 @@
-import Ember from 'ember';
-import config from './config/environment';
-
-const Router = Ember.Router.extend({
-  location: config.locationType
-});
-
-Router.map(function() {
-  this.route('articles', function() {
-    this.route('show', { path: '/:article_id' });
-  });
-
-  this.route('topics', function() {
-  	this.route('show', { path: '/:topic_id' }, function() {
-      this.route('edit');
-    });
-  });
-
-  this.route('words', function() {
-    this.route('show', { path: '/:word_id' });
-  });
-  
-  this.route('not-found', { path: '/*:' });
-});
-
-export default Router;
diff --git a/vipra-ui/app/routes/.gitkeep b/vipra-ui/app/routes/.gitkeep
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/vipra-ui/app/routes/articles/index.js b/vipra-ui/app/routes/articles/index.js
deleted file mode 100644
index b5920fb2470e2885b03b1a7467f212074d4ba34e..0000000000000000000000000000000000000000
--- a/vipra-ui/app/routes/articles/index.js
+++ /dev/null
@@ -1,87 +0,0 @@
-import Ember from 'ember';
-
-let limit = 100,
-    chartData = [],
-    chartOptions = {
-      chart: {
-        zoomType: 'x'
-      },
-      title: {
-        text: 'Articles per month'
-      },
-      legend: {
-        enabled: false
-      },
-      xAxis: {
-        type: 'datetime',
-        title: {
-          text: 'Dates'
-        }
-      },
-      yAxis: {
-        title: {
-          text: 'Articles'
-        }
-      },
-      tooltip: {
-        headerFormat: '',
-        pointFormat: '{point.x:%b %Y}: {point.y} article(s)'
-      }
-    };
-
-export default Ember.Route.extend({
-  queryParams: {
-    page: {
-      refreshModel: true
-    }
-  },
-
-  model(params) {
-    window.scrollTo(0, 0);
-    
-    let query = {
-      skip: 0,
-      limit: limit
-    };
-
-    if(Ember.isPresent(params.page)) {
-      query.skip = (params.page - 1) * query.limit;
-    }
-
-    return Ember.RSVP.hash({
-      limit: limit,
-      articles: this.store.query('article', query),
-      chartOptions: chartOptions,
-      chartData: chartData
-    });
-  },
-
-  afterModel(model) {
-    var count = {};
-    model.articles.forEach(article => {
-      var date = article.get('date');
-      var month = date.getMonth()+1;
-      var dstr = date.getFullYear() + '-' + (month < 10 ? '0' + month : month);
-      if(count.hasOwnProperty(dstr)) {
-        count[dstr][1] += 1;
-      } else {
-        count[dstr] = [Date.UTC(date.getFullYear(), month), 1];
-      }
-    });
-    var data = [];
-    for(var key in count) {
-      data.push(count[key]);
-    }
-    model.chartData = [{
-      name: 'Articles',
-      data: data
-    }];
-  },
-
-  resetController(controller, isExiting, transition) {
-    if(isExiting) {
-      controller.set('page', 1);
-    }
-  }
-  
-});
diff --git a/vipra-ui/app/routes/articles/show.js b/vipra-ui/app/routes/articles/show.js
deleted file mode 100644
index ce7f5d05452b96d35ccc8fcf14c713738a63987c..0000000000000000000000000000000000000000
--- a/vipra-ui/app/routes/articles/show.js
+++ /dev/null
@@ -1,29 +0,0 @@
-import Ember from 'ember';
-
-export default Ember.Route.extend({
-  renderTemplate() {
-    this.render();
-  },
-
-  model(params) {
-    return Ember.RSVP.hash({
-      article: this.store.find('article', params.article_id),
-      statsData: []
-    });
-  },
-
-  afterModel(model) {
-    var words = [],
-        stats = model.article.get('stats');
-    if(stats && stats.uniqueWords) {
-      for(var word in stats.uniqueWords) {
-        var o = stats.uniqueWords[word];
-        words.push({word: word, count: o.termFrequency, norm: o.normalizedTermFrequency});
-      }
-      words.sort(function(a,b) {
-        return b.count - a.count;
-      });
-      model.statsData = words.slice(0,20);
-    }
-  }
-});
\ No newline at end of file
diff --git a/vipra-ui/app/routes/index.js b/vipra-ui/app/routes/index.js
deleted file mode 100644
index bfef9997950853bfa1b6c05635c92a736f5f79a6..0000000000000000000000000000000000000000
--- a/vipra-ui/app/routes/index.js
+++ /dev/null
@@ -1,13 +0,0 @@
-import Ember from 'ember';
-
-export default Ember.Route.extend({
-
-  model() {
-    return {
-      latestarticles: this.store.query('article', {limit: 5, sort: '-created'}),
-      latesttopics: this.store.query('topic', {limit: 5, sort: '-created'}),
-      latestwords: this.store.query('word', {limit: 5, sort: '-created'}),
-    };
-  }
-
-});
\ No newline at end of file
diff --git a/vipra-ui/app/routes/not-found.js b/vipra-ui/app/routes/not-found.js
deleted file mode 100644
index 26d9f3124ec6aa902b1a208b6d4cbfb62083a3ea..0000000000000000000000000000000000000000
--- a/vipra-ui/app/routes/not-found.js
+++ /dev/null
@@ -1,4 +0,0 @@
-import Ember from 'ember';
-
-export default Ember.Route.extend({
-});
diff --git a/vipra-ui/app/routes/topics/index.js b/vipra-ui/app/routes/topics/index.js
deleted file mode 100644
index 1540346be4cfb40bb3489809f242ae14778e0d8d..0000000000000000000000000000000000000000
--- a/vipra-ui/app/routes/topics/index.js
+++ /dev/null
@@ -1,37 +0,0 @@
-import Ember from 'ember';
-
-let limit = 100;
-
-export default Ember.Route.extend({
-
-  queryParams: {
-    page: {
-      refreshModel: true
-    }
-  },
-
-  model(params) {
-    window.scrollTo(0, 0);
-    
-    let query = {
-      skip: 0,
-      limit: limit
-    };
-
-    if(Ember.isPresent(params.page)) {
-      query.skip = (params.page - 1) * query.limit;
-    }
-
-    return Ember.RSVP.hash({
-      limit: limit,
-      topics: this.store.query('topic', query)
-    });
-  },
-
-  resetController(controller, isExiting, transition) {
-    if(isExiting) {
-      controller.set('page', 1);
-    }
-  }
-
-});
\ No newline at end of file
diff --git a/vipra-ui/app/routes/topics/show.js b/vipra-ui/app/routes/topics/show.js
deleted file mode 100644
index 2f0623aa8c5458105139dacd5a0434fd0c991aa7..0000000000000000000000000000000000000000
--- a/vipra-ui/app/routes/topics/show.js
+++ /dev/null
@@ -1,9 +0,0 @@
-import Ember from 'ember';
-
-export default Ember.Route.extend({
-  model(params) {
-    return Ember.RSVP.hash({
-      topic: this.store.find('topic', params.topic_id)
-    });
-  }
-});
\ No newline at end of file
diff --git a/vipra-ui/app/routes/topics/show/edit.js b/vipra-ui/app/routes/topics/show/edit.js
deleted file mode 100644
index 75fd778b30658a41dbd02a7f32ba958178a4dddb..0000000000000000000000000000000000000000
--- a/vipra-ui/app/routes/topics/show/edit.js
+++ /dev/null
@@ -1,10 +0,0 @@
-import Ember from 'ember';
-
-export default Ember.Route.extend({
-  actions: {
-    save(model) {
-      model.save();
-      return true;
-    }
-  }
-});
\ No newline at end of file
diff --git a/vipra-ui/app/routes/words/index.js b/vipra-ui/app/routes/words/index.js
deleted file mode 100644
index c714a5d180fa36b400621c5ec3558b96f42aa269..0000000000000000000000000000000000000000
--- a/vipra-ui/app/routes/words/index.js
+++ /dev/null
@@ -1,38 +0,0 @@
-import Ember from 'ember';
-
-let limit = 200;
-
-export default Ember.Route.extend({
-
-  queryParams: {
-    page: {
-      refreshModel: true
-    }
-  },
-
-  model(params) {
-    window.scrollTo(0, 0);
-    
-    let query = {
-      sort: 'word',
-      skip: 0,
-      limit: limit
-    };
-
-    if(Ember.isPresent(params.page)) {
-      query.skip = (params.page - 1) * query.limit;
-    }
-
-    return Ember.RSVP.hash({
-      limit: limit,
-      words: this.store.query('word', query)
-    });
-  },
-
-  resetController(controller, isExiting, transition) {
-    if(isExiting) {
-      controller.set('page', 1);
-    }
-  }
-
-});
\ No newline at end of file
diff --git a/vipra-ui/app/routes/words/show.js b/vipra-ui/app/routes/words/show.js
deleted file mode 100644
index e545d25b72fa7d093ab8a13e2ac7ffd5b9edcf63..0000000000000000000000000000000000000000
--- a/vipra-ui/app/routes/words/show.js
+++ /dev/null
@@ -1,9 +0,0 @@
-import Ember from 'ember';
-
-export default Ember.Route.extend({
-  model(params) {
-    return Ember.RSVP.hash({
-      word: this.store.find('word', params.word_id)
-    });
-  }
-});
\ No newline at end of file
diff --git a/vipra-ui/app/styles/app.scss b/vipra-ui/app/styles/app.scss
deleted file mode 100644
index 418dbba8db7c112b3437da8c7770f0c10fd16777..0000000000000000000000000000000000000000
--- a/vipra-ui/app/styles/app.scss
+++ /dev/null
@@ -1,62 +0,0 @@
-@mixin noselect {
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-  cursor: default;
-}
-
-body {
-  padding-bottom: 20px;
-}
-
-.word {
-  cursor: pointer;
-  padding-right: 5px;
-}
-
-.center {
-  position: absolute;
-  top: 50%;
-  left: 50%;
-  transform: translate(-50%, -50%);
-}
-
-.loading {
-  background: url(/assets/images/squares.gif) no-repeat center center;
-  width: 120px;
-  height: 120px;
-}
-
-.heading {
-  @include noselect;
-  font-size: 82px;
-  margin: 30px 0;
-}
-
-.ellipsize {
-  white-space: nowrap;
-  overflow: hidden;
-  text-overflow: ellipsis;
-}
-
-.search-result {
-  padding: 5px;
-  margin-bottom: 5px;
-}
-
-.navbar-default {
-  .collapse:not(.in) {
-    .navbar-nav > .active {
-      &> a,
-      &> a:hover,
-      &> a:focus {
-        border-bottom: 3px solid;
-        padding-bottom: 12px;
-      }
-    }
-  }
-}
-
-@import 'sticky-footer'
\ No newline at end of file
diff --git a/vipra-ui/app/styles/sticky-footer.scss b/vipra-ui/app/styles/sticky-footer.scss
deleted file mode 100644
index 6d26ce5f61744486e7816616afcac95c1dddec3b..0000000000000000000000000000000000000000
--- a/vipra-ui/app/styles/sticky-footer.scss
+++ /dev/null
@@ -1,19 +0,0 @@
-html {
-  position: relative;
-  min-height: 100%;
-}
-
-body {
-  /* Margin bottom by footer height */
-  margin-bottom: 60px;
-}
-
-.footer {
-  position: absolute;
-  bottom: 0;
-  width: 100%;
-  /* Set the fixed height of the footer here */
-  height: 50px;
-  border-top-width: 1px;
-  border-top-style: solid;
-}
\ No newline at end of file
diff --git a/vipra-ui/app/templates/application.hbs b/vipra-ui/app/templates/application.hbs
deleted file mode 100644
index 6e2bf2f7d4cc0d5814c144da332641dabf30ef4b..0000000000000000000000000000000000000000
--- a/vipra-ui/app/templates/application.hbs
+++ /dev/null
@@ -1,35 +0,0 @@
-<nav class="navbar navbar-default navbar-static-top">
-  <div class="container-fluid">
-    <!-- Brand and toggle get grouped for better mobile display -->
-    <div class="navbar-header">
-      <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#vipra-navbar-collapse-1" aria-expanded="false">
-        <span class="sr-only">Toggle navigation</span>
-        <span class="icon-bar"></span>
-        <span class="icon-bar"></span>
-        <span class="icon-bar"></span>
-      </button>
-      {{link-to 'vipra' 'index' class='navbar-brand'}}
-    </div>
-
-    <!-- Collect the nav links, forms, and other content for toggling -->
-    <div class="collapse navbar-collapse" id="vipra-navbar-collapse-1">
-      <ul class="nav navbar-nav">
-        {{#link-to 'articles' tagName='li'}}{{link-to 'Articles' 'articles' (query-params page=1)}}{{/link-to}}
-        {{#link-to 'topics' tagName='li'}}{{link-to 'Topics' 'topics' (query-params page=1)}}{{/link-to}}
-        {{#link-to 'words' tagName='li'}}{{link-to 'Words' 'words' (query-params page=1)}}{{/link-to}}
-        {{outlet 'menu-left'}}
-        <div id="testi"></div>
-      </ul>
-    </div><!-- /.navbar-collapse -->
-  </div><!-- /.container-fluid -->
-</nav>
-
-<div class="container">
-  {{outlet}}
-</div>
-
-<footer class="footer navbar-default">
-  <div class="container-fluid">
-
-  </div>
-</footer>
\ No newline at end of file
diff --git a/vipra-ui/app/templates/articles.hbs b/vipra-ui/app/templates/articles.hbs
deleted file mode 100644
index e2147cab02d61b24bccf33f448609ff7bf5ad470..0000000000000000000000000000000000000000
--- a/vipra-ui/app/templates/articles.hbs
+++ /dev/null
@@ -1 +0,0 @@
-{{outlet}}
\ No newline at end of file
diff --git a/vipra-ui/app/templates/articles/index.hbs b/vipra-ui/app/templates/articles/index.hbs
deleted file mode 100644
index 8009aa8f82a3c29fe7b516e0665a3a39a6ad7929..0000000000000000000000000000000000000000
--- a/vipra-ui/app/templates/articles/index.hbs
+++ /dev/null
@@ -1,10 +0,0 @@
-<h1>Articles</h1>
-
-{{dynamic-high-charts content=model.chartData chartOptions=model.chartOptions}}
-
-{{model.articles.meta.total}} {{pluralize model.articles.meta.total 'article'}} in total, {{model.articles.length}} shown.
-
-<br><br>
-{{items-list items=model.articles filter=filter route='articles.show'}}
-
-{{pagination-bar total=model.articles.meta.total page=page limit=model.limit}}
\ No newline at end of file
diff --git a/vipra-ui/app/templates/articles/show.hbs b/vipra-ui/app/templates/articles/show.hbs
deleted file mode 100644
index b4d7a82fe3ef6df6aeb5ba517e31fc23545331e7..0000000000000000000000000000000000000000
--- a/vipra-ui/app/templates/articles/show.hbs
+++ /dev/null
@@ -1,39 +0,0 @@
-<h2>&laquo;{{model.article.title}}&raquo;</h2>
-
-<table class="table table-bordered table-condensed">
-  <tbody>
-    <tr>
-      <td>Date</td>
-      <td>{{model.article.date}}</td>
-    </tr>
-    <tr>
-      <td>Created</td>
-      <td>{{model.article.created}}</td>
-    </tr>
-    <tr>
-      <td>Last modified</td>
-      <td>{{model.article.modified}}</td>
-    </tr>
-    <tr>
-      <td>URL</td>
-      <td><a href="{{model.article.url}}">{{model.article.url}}</a></td>
-    </tr>
-    <tr>
-      <td>Topics</td>
-      <td>
-        {{#each model.article.topics as |topicRef|}}
-          [{{#topic-link topic=topicRef.topic}} ({{topic-share topicRef.count model.article.stats.wordCount}}%){{/topic-link}}]
-        {{/each}}
-      </td>
-    </tr>
-    <tr>
-      <td>Word count</td>
-      <td>{{model.article.stats.wordCount}}</td>
-    </tr>
-  </tbody>
-</table>
-
-{{model.article.text}}
-
-<br><br>
-{{scroll-top}}
\ No newline at end of file
diff --git a/vipra-ui/app/templates/components/.gitkeep b/vipra-ui/app/templates/components/.gitkeep
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/vipra-ui/app/templates/components/debounced-input.hbs b/vipra-ui/app/templates/components/debounced-input.hbs
deleted file mode 100644
index 889d9eeadc1012bdf474d7ea123f9bff23e9d8f5..0000000000000000000000000000000000000000
--- a/vipra-ui/app/templates/components/debounced-input.hbs
+++ /dev/null
@@ -1 +0,0 @@
-{{yield}}
diff --git a/vipra-ui/app/templates/components/dynamic-high-charts.hbs b/vipra-ui/app/templates/components/dynamic-high-charts.hbs
deleted file mode 100644
index 889d9eeadc1012bdf474d7ea123f9bff23e9d8f5..0000000000000000000000000000000000000000
--- a/vipra-ui/app/templates/components/dynamic-high-charts.hbs
+++ /dev/null
@@ -1 +0,0 @@
-{{yield}}
diff --git a/vipra-ui/app/templates/components/items-list.hbs b/vipra-ui/app/templates/components/items-list.hbs
deleted file mode 100644
index 259c5fd719842aac37065b8785713ae70ac56fd8..0000000000000000000000000000000000000000
--- a/vipra-ui/app/templates/components/items-list.hbs
+++ /dev/null
@@ -1,5 +0,0 @@
-<ul class="list-unstyled">
-  {{#each filteredItems as |item|}}
-    <li>{{#link-to route item.id}}{{text-marker text=item._name mark=filter}}{{/link-to}}</li>
-  {{/each}}
-</ul>
\ No newline at end of file
diff --git a/vipra-ui/app/templates/components/pagination-bar.hbs b/vipra-ui/app/templates/components/pagination-bar.hbs
deleted file mode 100644
index cf9bcc82eaaba746cb1eddf8ab4a36e255240e38..0000000000000000000000000000000000000000
--- a/vipra-ui/app/templates/components/pagination-bar.hbs
+++ /dev/null
@@ -1,45 +0,0 @@
-{{#if enabled}}
-  <nav>
-    <ul class="pagination">
-      <li class="{{unless prev "disabled"}}">
-        {{#if prev}}
-          {{#link-to (query-params page=prevPage)}}&laquo;{{/link-to}}
-        {{else}}
-          <span>&laquo;</span>
-        {{/if}}
-      </li>
-
-      {{#if prevPrev}}
-        <li>
-          {{link-to 1 (query-params page=1)}}
-        </li>
-        <li {{action 'prompt'}}>
-          <span>..</span>
-        </li>
-      {{/if}}
-
-      {{#each pages as |p|}}
-        <li class="{{if p.active "active"}}">
-          {{link-to p.page (query-params page=p.page)}}
-        </li>
-      {{/each}}
-
-      {{#if nextNext}}
-        <li {{action 'prompt'}}>
-          <span>..</span>
-        </li>
-        <li>
-          {{link-to lastPage (query-params page=lastPage)}}
-        </li>
-      {{/if}}
-
-      <li class="{{unless next "disabled"}}">
-        {{#if next}}
-          {{#link-to (query-params page=nextPage)}}&raquo;{{/link-to}}
-        {{else}}
-          <span>&raquo;</span>
-        {{/if}}
-      </li>
-    </ul>
-  </nav>
-{{/if}}
\ No newline at end of file
diff --git a/vipra-ui/app/templates/components/scroll-top.hbs b/vipra-ui/app/templates/components/scroll-top.hbs
deleted file mode 100644
index 04bed982c84513c9e059320f8d89af981483b68f..0000000000000000000000000000000000000000
--- a/vipra-ui/app/templates/components/scroll-top.hbs
+++ /dev/null
@@ -1,5 +0,0 @@
-{{#if hasBlock}}
-  {{yield}}
-{{else}}
-  {{_text}}
-{{/if}}
\ No newline at end of file
diff --git a/vipra-ui/app/templates/components/text-marker.hbs b/vipra-ui/app/templates/components/text-marker.hbs
deleted file mode 100644
index 5fb15880633ca60fd96531b511b79b62127997ba..0000000000000000000000000000000000000000
--- a/vipra-ui/app/templates/components/text-marker.hbs
+++ /dev/null
@@ -1 +0,0 @@
-{{{marked}}}
\ No newline at end of file
diff --git a/vipra-ui/app/templates/components/topic-link.hbs b/vipra-ui/app/templates/components/topic-link.hbs
deleted file mode 100644
index 1ba3c2c7cb12c1ce0c3a9c502f2e7f6077d7536e..0000000000000000000000000000000000000000
--- a/vipra-ui/app/templates/components/topic-link.hbs
+++ /dev/null
@@ -1 +0,0 @@
-{{#link-to 'topics.show' topic.id}}{{text}}{{yield}}{{/link-to}}
\ No newline at end of file
diff --git a/vipra-ui/app/templates/index.hbs b/vipra-ui/app/templates/index.hbs
deleted file mode 100644
index 5332d1397014f5c682b540f64ca4a870810bdf28..0000000000000000000000000000000000000000
--- a/vipra-ui/app/templates/index.hbs
+++ /dev/null
@@ -1,55 +0,0 @@
-<div class="container">
-  <div class="row">
-    <div class="col-md-12">
-      <div class="text-center">
-        <h1 class="heading">'v&#618;pr&#601;</h1>
-      </div>
-
-      <br>
-      {{debounced-input value=q class="form-control input-lg" placeholder="Search..."}}
-    </div>
-  </div>
-
-  <br><br>
-  <div class="row">
-    <div class="col-md-6 text-center">
-      <h4>Latest articles</h4>
-      <ul class="list-unstyled">
-        {{#each model.latestarticles as |article|}}
-          <li class="ellipsize">{{#link-to 'articles.show' article.id title=article.title}}{{article.title}}{{/link-to}}</li>
-        {{/each}}
-      </ul>
-    </div>
-    <div class="col-md-3 text-center">
-      <h4>Latest topics</h4>
-      <ul class="list-unstyled">
-        {{#each model.latesttopics as |topic|}}
-          <li class="ellipsize">{{#link-to 'topics.show' topic.id}}{{topic.name}}{{/link-to}}</li>
-        {{/each}}
-      </ul>
-    </div>
-    <div class="col-md-3 text-center">
-      <h4>Latest words</h4>
-      <ul class="list-unstyled">
-        {{#each model.latestwords as |word|}}
-          <li class="ellipsize">{{#link-to 'words.show' word.id}}{{word.id}}{{/link-to}}</li>
-        {{/each}}
-      </ul>
-    </div>
-  </div>
-
-  {{#if search}}
-    <hr>
-    <h4>Search results</h4>
-    <ol>
-      {{#each search as |article|}}
-        <li class="search-result">
-          {{link-to article.title 'articles.show' article.id}}<br>
-          &#9492; <small>{{article.text}}</small>
-        </li>
-      {{/each}}
-    </ol>
-
-  {{/if}}
-
-</div>
\ No newline at end of file
diff --git a/vipra-ui/app/templates/loading.hbs b/vipra-ui/app/templates/loading.hbs
deleted file mode 100644
index 119bd4728eb34759978edbdd0e81f04f7cd8fbe1..0000000000000000000000000000000000000000
--- a/vipra-ui/app/templates/loading.hbs
+++ /dev/null
@@ -1,4 +0,0 @@
-<div class="center">
-  <div class="loading">
-  </div>
-</div>
\ No newline at end of file
diff --git a/vipra-ui/app/templates/not-found.hbs b/vipra-ui/app/templates/not-found.hbs
deleted file mode 100644
index 4ca64b93827b10496afabced2f19afef3a6111ed..0000000000000000000000000000000000000000
--- a/vipra-ui/app/templates/not-found.hbs
+++ /dev/null
@@ -1,3 +0,0 @@
-<h1>404 - Not found</h1>
-
-<p>The requested resource was not found on this server</p>
\ No newline at end of file
diff --git a/vipra-ui/app/templates/topics.hbs b/vipra-ui/app/templates/topics.hbs
deleted file mode 100644
index e2147cab02d61b24bccf33f448609ff7bf5ad470..0000000000000000000000000000000000000000
--- a/vipra-ui/app/templates/topics.hbs
+++ /dev/null
@@ -1 +0,0 @@
-{{outlet}}
\ No newline at end of file
diff --git a/vipra-ui/app/templates/topics/index.hbs b/vipra-ui/app/templates/topics/index.hbs
deleted file mode 100644
index 67ca6107d74432768dad94270d47adbe529590a4..0000000000000000000000000000000000000000
--- a/vipra-ui/app/templates/topics/index.hbs
+++ /dev/null
@@ -1,8 +0,0 @@
-<h1>Topics</h1>
-
-{{debounced-input class='form-control' placeholder='Filter' size='50' value=filter debounce='150'}}
-
-<br>
-{{items-list items=model.topics filter=filter route='topics.show'}}
-
-{{pagination-bar total=model.topics.meta.total page=page limit=model.limit}}
\ No newline at end of file
diff --git a/vipra-ui/app/templates/topics/show/edit.hbs b/vipra-ui/app/templates/topics/show/edit.hbs
deleted file mode 100644
index 86d634803a9ea9b7a7e0f6c036ff23130c176c91..0000000000000000000000000000000000000000
--- a/vipra-ui/app/templates/topics/show/edit.hbs
+++ /dev/null
@@ -1,9 +0,0 @@
-{{#link-to 'topics.show' model.topic.id}}Back{{/link-to}}
-
-<h2>{{model.topic._name}}</h2>
-
-{{input value=model.topic.name placeholder='Name'}}
-
-<div>
-  <button {{action 'save' model.topic}}>Save</button>
-</div>
\ No newline at end of file
diff --git a/vipra-ui/app/templates/topics/show/index.hbs b/vipra-ui/app/templates/topics/show/index.hbs
deleted file mode 100644
index 4b793c056a379b00dec38bfe58f3bd805d7ff3dc..0000000000000000000000000000000000000000
--- a/vipra-ui/app/templates/topics/show/index.hbs
+++ /dev/null
@@ -1,18 +0,0 @@
-<h2>{{model.topic._name}}</h2>
-
-<table class="table table-striped table-bordered table-condensed">
-  <thead>
-    <tr>
-      <th>Word</th>
-      <th>Likeliness</th>
-    </tr>
-  </thead>
-  <tbody>
-    {{#each model.topic.words as |word|}}
-      <tr>
-        <td>{{#link-to 'words.show' word.word}}{{word.word}}{{/link-to}}</td>
-        <td>{{word.likeliness}}</td>
-      </tr>
-    {{/each}}
-  </tbody>
-</table>
\ No newline at end of file
diff --git a/vipra-ui/app/templates/words.hbs b/vipra-ui/app/templates/words.hbs
deleted file mode 100644
index e2147cab02d61b24bccf33f448609ff7bf5ad470..0000000000000000000000000000000000000000
--- a/vipra-ui/app/templates/words.hbs
+++ /dev/null
@@ -1 +0,0 @@
-{{outlet}}
\ No newline at end of file
diff --git a/vipra-ui/app/templates/words/index.hbs b/vipra-ui/app/templates/words/index.hbs
deleted file mode 100644
index 75321f4027c69f10c35e09ff2e168af7ec8fb975..0000000000000000000000000000000000000000
--- a/vipra-ui/app/templates/words/index.hbs
+++ /dev/null
@@ -1,12 +0,0 @@
-<h1>Words</h1>
-
-<br>
-<p>
-  {{model.words.meta.total}} {{pluralize model.words.meta.total 'Word'}} in the database
-</p>
-
-{{#each model.words as |word|}}
-  {{#link-to 'words.show' word.id}}{{word.id}}{{/link-to}}
-{{/each}}
-
-{{pagination-bar total=model.words.meta.total page=page limit=model.limit}}
\ No newline at end of file
diff --git a/vipra-ui/app/templates/words/show.hbs b/vipra-ui/app/templates/words/show.hbs
deleted file mode 100644
index 2778b0d59f24207fea2f91cb0fd4b04872266044..0000000000000000000000000000000000000000
--- a/vipra-ui/app/templates/words/show.hbs
+++ /dev/null
@@ -1 +0,0 @@
-<h2>{{model.word.id}}</h2>
\ No newline at end of file
diff --git a/vipra-ui/bower.json b/vipra-ui/bower.json
index 150691531fd4640e623516fc8b7bf6dd6a8cf64d..6104b60a698abadab8bf78da635179af4ee58d4a 100644
--- a/vipra-ui/bower.json
+++ b/vipra-ui/bower.json
@@ -1,18 +1,26 @@
 {
   "name": "vipra-ui",
+  "authors": [
+    "Eike Cochu <eike@cochu.com>"
+  ],
+  "description": "vipra ui",
+  "main": "",
+  "moduleType": [],
+  "license": "MIT",
+  "homepage": "",
+  "private": true,
+  "ignore": [
+    "**/.*",
+    "node_modules",
+    "bower_components",
+    "test",
+    "tests"
+  ],
   "dependencies": {
-    "ember": "2.3.0",
-    "ember-cli-shims": "0.0.6",
-    "ember-cli-test-loader": "0.2.1",
-    "ember-data": "2.2.1",
-    "ember-load-initializers": "0.1.7",
-    "ember-qunit": "0.4.16",
-    "ember-qunit-notifications": "0.1.0",
-    "ember-resolver": "0.1.20",
-    "jquery": "1.11.3",
-    "loader.js": "ember-cli/loader.js#3.5.0",
-    "qunit": "1.20.0",
-    "highcharts": "4.2.1",
-    "bootstrap": "~3.3.6"
+    "bootstrap": "~3.3.6",
+    "jquery": "^2.2.0",
+    "angular": "^1.4.9",
+    "angular-resource": "^1.4.9",
+    "angular-ui-router": "^0.2.17"
   }
 }
diff --git a/vipra-ui/config/environment.js b/vipra-ui/config/environment.js
deleted file mode 100644
index 01ab460bfdfa2e55023a6c59921d7c1c7f866905..0000000000000000000000000000000000000000
--- a/vipra-ui/config/environment.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/* jshint node: true */
-
-module.exports = function(environment) {
-  var ENV = {
-    modulePrefix: 'vipra-ui',
-    environment: environment,
-    baseURL: '/',
-    locationType: 'auto',
-    EmberENV: {
-      FEATURES: {
-        // Here you can enable experimental features on an ember canary build
-        // e.g. 'with-controller': true
-      }
-    },
-
-    APP: {
-      // Here you can pass flags/options to your application instance
-      // when it is created
-    }
-  };
-
-  if (environment === 'development') {
-    // ENV.APP.LOG_RESOLVER = true;
-    // ENV.APP.LOG_ACTIVE_GENERATION = true;
-    // ENV.APP.LOG_TRANSITIONS = true;
-    // ENV.APP.LOG_TRANSITIONS_INTERNAL = true;
-    // ENV.APP.LOG_VIEW_LOOKUPS = true;
-  }
-
-  if (environment === 'test') {
-    // Testem prefers this...
-    ENV.baseURL = '/';
-    ENV.locationType = 'none';
-
-    // keep test console output quieter
-    ENV.APP.LOG_ACTIVE_GENERATION = false;
-    ENV.APP.LOG_VIEW_LOOKUPS = false;
-
-    ENV.APP.rootElement = '#ember-testing';
-  }
-
-  if (environment === 'production') {
-
-  }
-
-  return ENV;
-};
diff --git a/vipra-ui/css/main.less b/vipra-ui/css/main.less
new file mode 100644
index 0000000000000000000000000000000000000000..27e5a0030710240b902e7c51598704f57ba2bdff
--- /dev/null
+++ b/vipra-ui/css/main.less
@@ -0,0 +1,3 @@
+html, body {
+  background: red;
+}
\ No newline at end of file
diff --git a/vipra-ui/ember-cli-build.js b/vipra-ui/ember-cli-build.js
deleted file mode 100644
index dccfb16e1233e222024114fc185b49a375532ce7..0000000000000000000000000000000000000000
--- a/vipra-ui/ember-cli-build.js
+++ /dev/null
@@ -1,26 +0,0 @@
-/*jshint node:true*/
-/* global require, module */
-var EmberApp = require('ember-cli/lib/broccoli/ember-app');
-
-module.exports = function(defaults) {
-  var app = new EmberApp(defaults, {
-    sourcemaps: {
-      enabled: EmberApp.env() !== 'production',
-      extensions: ['js']
-    },
-    sassOptions: {
-      extension: 'scss'
-    }
-  });
-
-  var bootstrapPath = 'bower_components/bootstrap/dist';
-  app.import(bootstrapPath + '/js/bootstrap.js');
-  app.import(bootstrapPath + '/css/bootstrap.css');
-  app.import(bootstrapPath + '/fonts/glyphicons-halflings-regular.eot', { destDir: 'fonts' });
-  app.import(bootstrapPath + '/fonts/glyphicons-halflings-regular.svg', { destDir: 'fonts' });
-  app.import(bootstrapPath + '/fonts/glyphicons-halflings-regular.ttf', { destDir: 'fonts' });
-  app.import(bootstrapPath + '/fonts/glyphicons-halflings-regular.woff', { destDir: 'fonts' });
-  app.import(bootstrapPath + '/fonts/glyphicons-halflings-regular.woff2', { destDir: 'fonts' });
-
-  return app.toTree();
-};
diff --git a/vipra-ui/gulpfile.js b/vipra-ui/gulpfile.js
new file mode 100644
index 0000000000000000000000000000000000000000..79093a23e0e9d315a8ff3fe6867487dfeb70574a
--- /dev/null
+++ b/vipra-ui/gulpfile.js
@@ -0,0 +1,27 @@
+var gulp = require('gulp'),
+    less = require('gulp-less'),
+    cssnano = require('gulp-cssnano'),
+    webserver = require('gulp-webserver'),
+    sourcemaps = require('gulp-sourcemaps');
+
+gulp.task('less', function() {
+  gulp.src('css/**/*.less')
+      .pipe(sourcemaps.init())
+      .pipe(less())
+      .pipe(cssnano())
+      .pipe(gulp.dest('css/main.css'));
+});
+
+gulp.task('watch', function() {
+  gulp.watch('css/**/*.less', ['less']);
+});
+
+gulp.task('server', function() {
+  gulp.src('.')
+      .pipe(webserver({
+        livereload: true,
+        open: true,
+        port: 4200,
+        fallback: 'index.html'
+      }));
+});
\ No newline at end of file
diff --git a/vipra-ui/html/index.html b/vipra-ui/html/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..357dd48952bc1b93508f0b0bebb790f09e0730be
--- /dev/null
+++ b/vipra-ui/html/index.html
@@ -0,0 +1 @@
+Home
\ No newline at end of file
diff --git a/vipra-ui/index.html b/vipra-ui/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..ecf5817a249b9a428015eed532b7958b5eda1612
--- /dev/null
+++ b/vipra-ui/index.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<html lang="en" ng-app="vipra">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <title>Vipra</title>
+
+    <!-- stylesheets -->
+    <link href="bower_components/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet">
+
+    <!-- javascript -->
+    <script src="bower_components/jquery/dist/jquery.min.js"></script>
+    <script src="bower_components/bootstrap/dist/js/bootstrap.min.js"></script>
+    <script src="bower_components/angular/angular.min.js"></script>
+    <script src="bower_components/angular-resource/angular-resource.min.js"></script>
+    <script src="bower_components/angular-ui-router/release/angular-ui-router.min.js"></script>
+    <script src="js/app.js"></script>
+    <script src="js/controllers.js"></script>
+    <script src="js/directives.js"></script>
+    <script src="js/services.js"></script>
+  </head>
+  <body>
+    <div ui-view></div>
+  </body>
+</html>
\ No newline at end of file
diff --git a/vipra-ui/js/app.js b/vipra-ui/js/app.js
new file mode 100644
index 0000000000000000000000000000000000000000..60d74aac2bde976726600ee6fab20284db6942ec
--- /dev/null
+++ b/vipra-ui/js/app.js
@@ -0,0 +1,18 @@
+var app = angular.module('vipra', [
+  'ngResource',
+  'ui.router',
+  'vipra.controllers',
+  'vipra.directives',
+  'vipra.services'
+]);
+
+app.config(function($stateProvider, $urlRouterProvider) {
+
+  $urlRouterProvider.otherwise('/');
+
+  $stateProvider.state('index', {
+    url: '/',
+    templateUrl: 'html/index.html'
+  });
+
+});
\ No newline at end of file
diff --git a/vipra-ui/js/controllers.js b/vipra-ui/js/controllers.js
new file mode 100644
index 0000000000000000000000000000000000000000..63b99a10c99c34ed7b8889295aacd0c68f2a0612
--- /dev/null
+++ b/vipra-ui/js/controllers.js
@@ -0,0 +1,5 @@
+var app = angular.module('vipra.controllers', []);
+
+app.controller('MainCtrl', function($scope) {
+
+});
\ No newline at end of file
diff --git a/vipra-ui/js/directives.js b/vipra-ui/js/directives.js
new file mode 100644
index 0000000000000000000000000000000000000000..07291e39bee63c79e85193bef7729ef3083687b9
--- /dev/null
+++ b/vipra-ui/js/directives.js
@@ -0,0 +1 @@
+var app = angular.module('vipra.directives', []);
\ No newline at end of file
diff --git a/vipra-ui/js/services.js b/vipra-ui/js/services.js
new file mode 100644
index 0000000000000000000000000000000000000000..998e2cefe83939d8e5e3de9f5383fcac6cdf23cc
--- /dev/null
+++ b/vipra-ui/js/services.js
@@ -0,0 +1 @@
+var app = angular.module('vipra.services', []);
\ No newline at end of file
diff --git a/vipra-ui/package.json b/vipra-ui/package.json
index d1b51b9f483805111bbac94a84298123f28ed6c5..1b966c29474c3e17500c4b36b4cf0312585b6153 100644
--- a/vipra-ui/package.json
+++ b/vipra-ui/package.json
@@ -1,42 +1,14 @@
 {
   "name": "vipra-ui",
-  "version": "0.0.0",
-  "description": "Small description for vipra-ui goes here",
+  "version": "1.0.0",
+  "description": "vipra ui",
+  "author": "Eike Cochu",
   "private": true,
-  "directories": {
-    "doc": "doc",
-    "test": "tests"
-  },
-  "scripts": {
-    "build": "ember build",
-    "start": "ember server",
-    "test": "ember test"
-  },
-  "repository": "",
-  "engines": {
-    "node": ">= 0.10.0"
-  },
-  "author": "",
-  "license": "MIT",
   "devDependencies": {
-    "broccoli-asset-rev": "^2.2.0",
-    "ember-cli": "1.13.13",
-    "ember-cli-app-version": "^1.0.0",
-    "ember-cli-babel": "^5.1.5",
-    "ember-cli-dependency-checker": "^1.1.0",
-    "ember-cli-htmlbars": "^1.0.1",
-    "ember-cli-htmlbars-inline-precompile": "^0.3.1",
-    "ember-cli-ic-ajax": "0.2.4",
-    "ember-cli-inject-live-reload": "^1.3.1",
-    "ember-cli-qunit": "^1.0.4",
-    "ember-cli-release": "0.2.8",
-    "ember-cli-sass": "5.2.1",
-    "ember-cli-sri": "^1.2.0",
-    "ember-cli-uglify": "^1.2.0",
-    "ember-data": "1.13.15",
-    "ember-disable-proxy-controllers": "^1.0.1",
-    "ember-export-application-global": "^1.0.4",
-    "ember-highcharts": "0.3.0",
-    "ember-wormhole": "0.3.4"
+    "gulp": "^3.9.0",
+    "gulp-cssnano": "^2.1.0",
+    "gulp-less": "^3.0.5",
+    "gulp-sourcemaps": "^1.6.0",
+    "gulp-webserver": "^0.9.1"
   }
 }
diff --git a/vipra-ui/public/android-chrome-144x144.png b/vipra-ui/public/android-chrome-144x144.png
deleted file mode 100644
index a75a06d5e6943aee4c175213f6cf98b03fa3f85c..0000000000000000000000000000000000000000
Binary files a/vipra-ui/public/android-chrome-144x144.png and /dev/null differ
diff --git a/vipra-ui/public/android-chrome-192x192.png b/vipra-ui/public/android-chrome-192x192.png
deleted file mode 100644
index 38a70604dcb27a9ee3fbf79d71360c5d1bb30def..0000000000000000000000000000000000000000
Binary files a/vipra-ui/public/android-chrome-192x192.png and /dev/null differ
diff --git a/vipra-ui/public/android-chrome-36x36.png b/vipra-ui/public/android-chrome-36x36.png
deleted file mode 100644
index fa55583e69edd38b9b9dc4b344610ce40f076014..0000000000000000000000000000000000000000
Binary files a/vipra-ui/public/android-chrome-36x36.png and /dev/null differ
diff --git a/vipra-ui/public/android-chrome-48x48.png b/vipra-ui/public/android-chrome-48x48.png
deleted file mode 100644
index 053cc4ed735d16d23ca7f7bfc06b8b419c5da221..0000000000000000000000000000000000000000
Binary files a/vipra-ui/public/android-chrome-48x48.png and /dev/null differ
diff --git a/vipra-ui/public/android-chrome-72x72.png b/vipra-ui/public/android-chrome-72x72.png
deleted file mode 100644
index 98c240493437e4f97f0c6e08d10ab1c174d792f2..0000000000000000000000000000000000000000
Binary files a/vipra-ui/public/android-chrome-72x72.png and /dev/null differ
diff --git a/vipra-ui/public/android-chrome-96x96.png b/vipra-ui/public/android-chrome-96x96.png
deleted file mode 100644
index 2d2202ca6ba65fba1402708be385110c13ca4606..0000000000000000000000000000000000000000
Binary files a/vipra-ui/public/android-chrome-96x96.png and /dev/null differ
diff --git a/vipra-ui/public/apple-touch-icon-114x114.png b/vipra-ui/public/apple-touch-icon-114x114.png
deleted file mode 100644
index bc2a612c2e7e6a66e1f82d42722943a90e00e25f..0000000000000000000000000000000000000000
Binary files a/vipra-ui/public/apple-touch-icon-114x114.png and /dev/null differ
diff --git a/vipra-ui/public/apple-touch-icon-120x120.png b/vipra-ui/public/apple-touch-icon-120x120.png
deleted file mode 100644
index fdaabce77f0024103256d92f819694892752aa5a..0000000000000000000000000000000000000000
Binary files a/vipra-ui/public/apple-touch-icon-120x120.png and /dev/null differ
diff --git a/vipra-ui/public/apple-touch-icon-144x144.png b/vipra-ui/public/apple-touch-icon-144x144.png
deleted file mode 100644
index 1d46bf72898e7a1d57e584e33166b4ab93ad1913..0000000000000000000000000000000000000000
Binary files a/vipra-ui/public/apple-touch-icon-144x144.png and /dev/null differ
diff --git a/vipra-ui/public/apple-touch-icon-152x152.png b/vipra-ui/public/apple-touch-icon-152x152.png
deleted file mode 100644
index cf4fe5c4d8e00ade403c398bf6354c66dcb6f419..0000000000000000000000000000000000000000
Binary files a/vipra-ui/public/apple-touch-icon-152x152.png and /dev/null differ
diff --git a/vipra-ui/public/apple-touch-icon-180x180.png b/vipra-ui/public/apple-touch-icon-180x180.png
deleted file mode 100644
index 9349bc3006cbeae993227c4247526a2f5331bca3..0000000000000000000000000000000000000000
Binary files a/vipra-ui/public/apple-touch-icon-180x180.png and /dev/null differ
diff --git a/vipra-ui/public/apple-touch-icon-57x57.png b/vipra-ui/public/apple-touch-icon-57x57.png
deleted file mode 100644
index 404609005a57d079d934aeafb60e9f41c777303d..0000000000000000000000000000000000000000
Binary files a/vipra-ui/public/apple-touch-icon-57x57.png and /dev/null differ
diff --git a/vipra-ui/public/apple-touch-icon-60x60.png b/vipra-ui/public/apple-touch-icon-60x60.png
deleted file mode 100644
index 69090a0b6c4948749effbb3fe956c3caf72b6154..0000000000000000000000000000000000000000
Binary files a/vipra-ui/public/apple-touch-icon-60x60.png and /dev/null differ
diff --git a/vipra-ui/public/apple-touch-icon-72x72.png b/vipra-ui/public/apple-touch-icon-72x72.png
deleted file mode 100644
index 7e41b0928a7ca05b405ed7bce68b8e2099de6e03..0000000000000000000000000000000000000000
Binary files a/vipra-ui/public/apple-touch-icon-72x72.png and /dev/null differ
diff --git a/vipra-ui/public/apple-touch-icon-76x76.png b/vipra-ui/public/apple-touch-icon-76x76.png
deleted file mode 100644
index 29d14b903247e28ff96f6ea34bf3a38d50f5482e..0000000000000000000000000000000000000000
Binary files a/vipra-ui/public/apple-touch-icon-76x76.png and /dev/null differ
diff --git a/vipra-ui/public/apple-touch-icon-precomposed.png b/vipra-ui/public/apple-touch-icon-precomposed.png
deleted file mode 100644
index 4d110e9874af7700780f80bfeec4a287fa6d49b1..0000000000000000000000000000000000000000
Binary files a/vipra-ui/public/apple-touch-icon-precomposed.png and /dev/null differ
diff --git a/vipra-ui/public/apple-touch-icon.png b/vipra-ui/public/apple-touch-icon.png
deleted file mode 100644
index 9349bc3006cbeae993227c4247526a2f5331bca3..0000000000000000000000000000000000000000
Binary files a/vipra-ui/public/apple-touch-icon.png and /dev/null differ
diff --git a/vipra-ui/public/assets/images/squares.gif b/vipra-ui/public/assets/images/squares.gif
deleted file mode 100644
index 15739a5e3e23301ea73683e760f57fcc58b0b275..0000000000000000000000000000000000000000
Binary files a/vipra-ui/public/assets/images/squares.gif and /dev/null differ
diff --git a/vipra-ui/public/browserconfig.xml b/vipra-ui/public/browserconfig.xml
deleted file mode 100644
index 65380f3873df0b1efc837c390c3a91bd2c2c6a14..0000000000000000000000000000000000000000
--- a/vipra-ui/public/browserconfig.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<browserconfig>
-  <msapplication>
-    <tile>
-      <square70x70logo src="/mstile-70x70.png"/>
-      <square150x150logo src="/mstile-150x150.png"/>
-      <square310x310logo src="/mstile-310x310.png"/>
-      <wide310x150logo src="/mstile-310x150.png"/>
-      <TileColor>#da532c</TileColor>
-    </tile>
-  </msapplication>
-</browserconfig>
diff --git a/vipra-ui/public/crossdomain.xml b/vipra-ui/public/crossdomain.xml
deleted file mode 100644
index 0c16a7a07b37e5d5f7e0e56c829f720067458403..0000000000000000000000000000000000000000
--- a/vipra-ui/public/crossdomain.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
-<cross-domain-policy>
-  <!-- Read this: www.adobe.com/devnet/articles/crossdomain_policy_file_spec.html -->
-
-  <!-- Most restrictive policy: -->
-  <site-control permitted-cross-domain-policies="none"/>
-
-  <!-- Least restrictive policy: -->
-  <!--
-  <site-control permitted-cross-domain-policies="all"/>
-  <allow-access-from domain="*" to-ports="*" secure="false"/>
-  <allow-http-request-headers-from domain="*" headers="*" secure="false"/>
-  -->
-</cross-domain-policy>
diff --git a/vipra-ui/public/favicon-16x16.png b/vipra-ui/public/favicon-16x16.png
deleted file mode 100644
index 2142db750ebddec14220299d9b135ef67c086a8a..0000000000000000000000000000000000000000
Binary files a/vipra-ui/public/favicon-16x16.png and /dev/null differ
diff --git a/vipra-ui/public/favicon-194x194.png b/vipra-ui/public/favicon-194x194.png
deleted file mode 100644
index 21aebd21587c3e1e8ead181661abfd5c63b7520f..0000000000000000000000000000000000000000
Binary files a/vipra-ui/public/favicon-194x194.png and /dev/null differ
diff --git a/vipra-ui/public/favicon-32x32.png b/vipra-ui/public/favicon-32x32.png
deleted file mode 100644
index 5f02b4eddf4ea6a56bfcd19c8b61a406f99d9129..0000000000000000000000000000000000000000
Binary files a/vipra-ui/public/favicon-32x32.png and /dev/null differ
diff --git a/vipra-ui/public/favicon-96x96.png b/vipra-ui/public/favicon-96x96.png
deleted file mode 100644
index db921e4ed2dcd5d09ed8c3feda59dbecdb4f6493..0000000000000000000000000000000000000000
Binary files a/vipra-ui/public/favicon-96x96.png and /dev/null differ
diff --git a/vipra-ui/public/favicon.ico b/vipra-ui/public/favicon.ico
deleted file mode 100644
index 5732db6037b1f85a34fb650544f2c844313a2855..0000000000000000000000000000000000000000
Binary files a/vipra-ui/public/favicon.ico and /dev/null differ
diff --git a/vipra-ui/public/manifest.json b/vipra-ui/public/manifest.json
deleted file mode 100644
index fd248ba860774e85815f340dca3d7a91b00fc794..0000000000000000000000000000000000000000
--- a/vipra-ui/public/manifest.json
+++ /dev/null
@@ -1,41 +0,0 @@
-{
-	"name": "Vipra",
-	"icons": [
-		{
-			"src": "\/android-chrome-36x36.png",
-			"sizes": "36x36",
-			"type": "image\/png",
-			"density": 0.75
-		},
-		{
-			"src": "\/android-chrome-48x48.png",
-			"sizes": "48x48",
-			"type": "image\/png",
-			"density": 1
-		},
-		{
-			"src": "\/android-chrome-72x72.png",
-			"sizes": "72x72",
-			"type": "image\/png",
-			"density": 1.5
-		},
-		{
-			"src": "\/android-chrome-96x96.png",
-			"sizes": "96x96",
-			"type": "image\/png",
-			"density": 2
-		},
-		{
-			"src": "\/android-chrome-144x144.png",
-			"sizes": "144x144",
-			"type": "image\/png",
-			"density": 3
-		},
-		{
-			"src": "\/android-chrome-192x192.png",
-			"sizes": "192x192",
-			"type": "image\/png",
-			"density": 4
-		}
-	]
-}
diff --git a/vipra-ui/public/mstile-144x144.png b/vipra-ui/public/mstile-144x144.png
deleted file mode 100644
index f8bbf5181ec917852ccc7d485261c378ccbc7585..0000000000000000000000000000000000000000
Binary files a/vipra-ui/public/mstile-144x144.png and /dev/null differ
diff --git a/vipra-ui/public/mstile-150x150.png b/vipra-ui/public/mstile-150x150.png
deleted file mode 100644
index 695de5e588f6771411672a7ab77d11ff9f7b19c0..0000000000000000000000000000000000000000
Binary files a/vipra-ui/public/mstile-150x150.png and /dev/null differ
diff --git a/vipra-ui/public/mstile-310x150.png b/vipra-ui/public/mstile-310x150.png
deleted file mode 100644
index 31d0d95b73f37cb775eaa1fbe11152400f961d5f..0000000000000000000000000000000000000000
Binary files a/vipra-ui/public/mstile-310x150.png and /dev/null differ
diff --git a/vipra-ui/public/mstile-310x310.png b/vipra-ui/public/mstile-310x310.png
deleted file mode 100644
index 632930e827817f36965e2402748adef9b9311d96..0000000000000000000000000000000000000000
Binary files a/vipra-ui/public/mstile-310x310.png and /dev/null differ
diff --git a/vipra-ui/public/mstile-70x70.png b/vipra-ui/public/mstile-70x70.png
deleted file mode 100644
index e6ece63cb1b9caa78fc2cebb370e07d9f2e5db04..0000000000000000000000000000000000000000
Binary files a/vipra-ui/public/mstile-70x70.png and /dev/null differ
diff --git a/vipra-ui/public/robots.txt b/vipra-ui/public/robots.txt
deleted file mode 100644
index f5916452e5ff6c8b43d6d7c73d00153d34ac35de..0000000000000000000000000000000000000000
--- a/vipra-ui/public/robots.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-# http://www.robotstxt.org
-User-agent: *
-Disallow:
diff --git a/vipra-ui/public/safari-pinned-tab.svg b/vipra-ui/public/safari-pinned-tab.svg
deleted file mode 100644
index 93d972a555c1c94f9e87b83f856d2dfb05b9c5ab..0000000000000000000000000000000000000000
--- a/vipra-ui/public/safari-pinned-tab.svg
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
- "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
-<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
- width="512.000000pt" height="512.000000pt" viewBox="0 0 512.000000 512.000000"
- preserveAspectRatio="xMidYMid meet">
-<metadata>
-Created by potrace 1.11, written by Peter Selinger 2001-2013
-</metadata>
-<g transform="translate(0.000000,512.000000) scale(0.100000,-0.100000)"
-fill="#000000" stroke="none">
-<path d="M3010 5110 c-129 -17 -159 -22 -240 -40 -112 -26 -104 -24 -196 -55
--184 -63 -388 -173 -539 -289 -82 -64 -103 -83 -202 -183 -298 -302 -477 -668
--537 -1098 -14 -100 -15 -399 -1 -495 28 -199 96 -426 177 -586 l31 -61 -691
--692 c-559 -559 -700 -705 -731 -759 -167 -282 -60 -647 233 -791 188 -93 409
--76 576 42 14 10 337 329 718 709 l692 691 98 -46 c170 -80 379 -140 569 -165
-73 -9 367 -9 453 0 266 28 570 135 800 281 169 107 372 290 487 437 213 274
-356 613 399 945 9 72 11 387 3 458 -39 336 -165 653 -374 938 -63 87 -237 269
--320 336 -155 126 -414 270 -586 327 -107 35 -259 72 -359 86 -97 14 -377 20
--460 10z m455 -333 c391 -73 703 -251 961 -552 127 -147 236 -347 298 -544 58
--185 75 -314 71 -526 -4 -161 -6 -176 -36 -305 -43 -185 -95 -316 -188 -472
--233 -392 -621 -661 -1085 -754 -101 -20 -394 -26 -506 -11 -237 33 -509 142
--709 285 -122 86 -288 252 -373 372 -121 171 -223 403 -262 596 -8 43 -18 93
--21 109 -21 104 -8 467 20 554 3 11 8 31 10 43 3 13 15 59 29 103 147 483 534
-879 1016 1039 58 19 116 37 130 40 14 2 50 10 80 16 30 6 80 13 110 17 30 3
-57 7 58 9 10 8 329 -7 397 -19z m-1730 -2814 c70 -85 212 -223 279 -271 20
--14 36 -28 36 -32 0 -10 -1285 -1295 -1325 -1326 -45 -34 -120 -54 -183 -49
--100 7 -191 72 -235 165 -31 65 -29 168 4 235 19 38 177 203 680 707 360 361
-659 657 664 657 6 0 42 -39 80 -86z"/>
-<path d="M2995 4299 c-351 -67 -642 -288 -800 -607 -39 -80 -80 -197 -89 -256
--4 -21 -8 -42 -11 -46 -3 -4 -8 -55 -11 -113 -6 -104 -6 -106 19 -131 45 -45
-119 -27 131 32 3 15 8 59 11 99 17 273 178 553 408 712 78 53 219 119 293 136
-10 2 37 9 59 14 45 10 130 20 188 21 72 0 110 74 67 130 -17 23 -26 25 -97 26
--43 0 -118 -7 -168 -17z"/>
-</g>
-</svg>
diff --git a/vipra-ui/testem.json b/vipra-ui/testem.json
deleted file mode 100644
index 0f35392cf2ef372d55ba695ddf3de54659481c07..0000000000000000000000000000000000000000
--- a/vipra-ui/testem.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "framework": "qunit",
-  "test_page": "tests/index.html?hidepassed",
-  "disable_watching": true,
-  "launch_in_ci": [
-    "PhantomJS"
-  ],
-  "launch_in_dev": [
-    "PhantomJS",
-    "Chrome"
-  ]
-}
diff --git a/vipra-ui/tests/.jshintrc b/vipra-ui/tests/.jshintrc
deleted file mode 100644
index 6ec0b7c154b09337291c5d736e99d5928d560549..0000000000000000000000000000000000000000
--- a/vipra-ui/tests/.jshintrc
+++ /dev/null
@@ -1,52 +0,0 @@
-{
-  "predef": [
-    "document",
-    "window",
-    "location",
-    "setTimeout",
-    "$",
-    "-Promise",
-    "define",
-    "console",
-    "visit",
-    "exists",
-    "fillIn",
-    "click",
-    "keyEvent",
-    "triggerEvent",
-    "find",
-    "findWithAssert",
-    "wait",
-    "DS",
-    "andThen",
-    "currentURL",
-    "currentPath",
-    "currentRouteName"
-  ],
-  "node": false,
-  "browser": false,
-  "boss": true,
-  "curly": true,
-  "debug": false,
-  "devel": false,
-  "eqeqeq": true,
-  "evil": true,
-  "forin": false,
-  "immed": false,
-  "laxbreak": false,
-  "newcap": true,
-  "noarg": true,
-  "noempty": false,
-  "nonew": false,
-  "nomen": false,
-  "onevar": false,
-  "plusplus": false,
-  "regexp": false,
-  "undef": true,
-  "sub": true,
-  "strict": false,
-  "white": false,
-  "eqnull": true,
-  "esnext": true,
-  "unused": true
-}
diff --git a/vipra-ui/tests/helpers/destroy-app.js b/vipra-ui/tests/helpers/destroy-app.js
deleted file mode 100644
index c3d4d1abb5d467ddf5f9a0b8f814c8d99d20db6d..0000000000000000000000000000000000000000
--- a/vipra-ui/tests/helpers/destroy-app.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import Ember from 'ember';
-
-export default function destroyApp(application) {
-  Ember.run(application, 'destroy');
-}
diff --git a/vipra-ui/tests/helpers/module-for-acceptance.js b/vipra-ui/tests/helpers/module-for-acceptance.js
deleted file mode 100644
index ed23003db408fd9b0c69f914e9e552e0657bc7f8..0000000000000000000000000000000000000000
--- a/vipra-ui/tests/helpers/module-for-acceptance.js
+++ /dev/null
@@ -1,23 +0,0 @@
-import { module } from 'qunit';
-import startApp from '../helpers/start-app';
-import destroyApp from '../helpers/destroy-app';
-
-export default function(name, options = {}) {
-  module(name, {
-    beforeEach() {
-      this.application = startApp();
-
-      if (options.beforeEach) {
-        options.beforeEach.apply(this, arguments);
-      }
-    },
-
-    afterEach() {
-      destroyApp(this.application);
-
-      if (options.afterEach) {
-        options.afterEach.apply(this, arguments);
-      }
-    }
-  });
-}
diff --git a/vipra-ui/tests/helpers/resolver.js b/vipra-ui/tests/helpers/resolver.js
deleted file mode 100644
index ebfb4e4d4552ed0c90ac9b925860a38acbaffa8a..0000000000000000000000000000000000000000
--- a/vipra-ui/tests/helpers/resolver.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import Resolver from 'ember/resolver';
-import config from '../../config/environment';
-
-const resolver = Resolver.create();
-
-resolver.namespace = {
-  modulePrefix: config.modulePrefix,
-  podModulePrefix: config.podModulePrefix
-};
-
-export default resolver;
diff --git a/vipra-ui/tests/helpers/start-app.js b/vipra-ui/tests/helpers/start-app.js
deleted file mode 100644
index e098f1d5be605e462c63145c2c50572aac6c4303..0000000000000000000000000000000000000000
--- a/vipra-ui/tests/helpers/start-app.js
+++ /dev/null
@@ -1,18 +0,0 @@
-import Ember from 'ember';
-import Application from '../../app';
-import config from '../../config/environment';
-
-export default function startApp(attrs) {
-  let application;
-
-  let attributes = Ember.merge({}, config.APP);
-  attributes = Ember.merge(attributes, attrs); // use defaults, but you can override;
-
-  Ember.run(() => {
-    application = Application.create(attributes);
-    application.setupForTesting();
-    application.injectTestHelpers();
-  });
-
-  return application;
-}
diff --git a/vipra-ui/tests/index.html b/vipra-ui/tests/index.html
deleted file mode 100644
index ffe2debf1d95d079b613588ff00a963f210e6019..0000000000000000000000000000000000000000
--- a/vipra-ui/tests/index.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<!DOCTYPE html>
-<html>
-  <head>
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge">
-    <title>VipraUi Tests</title>
-    <meta name="description" content="">
-    <meta name="viewport" content="width=device-width, initial-scale=1">
-
-    {{content-for 'head'}}
-    {{content-for 'test-head'}}
-
-    <link rel="stylesheet" href="assets/vendor.css">
-    <link rel="stylesheet" href="assets/vipra-ui.css">
-    <link rel="stylesheet" href="assets/test-support.css">
-
-    {{content-for 'head-footer'}}
-    {{content-for 'test-head-footer'}}
-  </head>
-  <body>
-    {{content-for 'body'}}
-    {{content-for 'test-body'}}
-
-    <script src="assets/vendor.js"></script>
-    <script src="assets/test-support.js"></script>
-    <script src="assets/vipra-ui.js"></script>
-    <script src="testem.js" integrity=""></script>
-    <script src="assets/tests.js"></script>
-    <script src="assets/test-loader.js"></script>
-
-    {{content-for 'body-footer'}}
-    {{content-for 'test-body-footer'}}
-  </body>
-</html>
diff --git a/vipra-ui/tests/integration/.gitkeep b/vipra-ui/tests/integration/.gitkeep
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/vipra-ui/tests/integration/components/debounced-input-test.js b/vipra-ui/tests/integration/components/debounced-input-test.js
deleted file mode 100644
index 323028be87c1069b493b592cbfd34e0f0ee65ea1..0000000000000000000000000000000000000000
--- a/vipra-ui/tests/integration/components/debounced-input-test.js
+++ /dev/null
@@ -1,25 +0,0 @@
-import { moduleForComponent, test } from 'ember-qunit';
-import hbs from 'htmlbars-inline-precompile';
-
-moduleForComponent('debounced-input', 'Integration | Component | debounced input', {
-  integration: true
-});
-
-test('it renders', function(assert) {
-  
-  // Set any properties with this.set('myProperty', 'value');
-  // Handle any actions with this.on('myAction', function(val) { ... });" + EOL + EOL +
-
-  this.render(hbs`{{debounced-input}}`);
-
-  assert.equal(this.$().text().trim(), '');
-
-  // Template block usage:" + EOL +
-  this.render(hbs`
-    {{#debounced-input}}
-      template block text
-    {{/debounced-input}}
-  `);
-
-  assert.equal(this.$().text().trim(), 'template block text');
-});
diff --git a/vipra-ui/tests/integration/components/dynamic-high-charts-test.js b/vipra-ui/tests/integration/components/dynamic-high-charts-test.js
deleted file mode 100644
index 07810b85074cac1214cd04b68efccc4eb6ef1794..0000000000000000000000000000000000000000
--- a/vipra-ui/tests/integration/components/dynamic-high-charts-test.js
+++ /dev/null
@@ -1,25 +0,0 @@
-import { moduleForComponent, test } from 'ember-qunit';
-import hbs from 'htmlbars-inline-precompile';
-
-moduleForComponent('dynamic-high-charts', 'Integration | Component | dynamic high charts', {
-  integration: true
-});
-
-test('it renders', function(assert) {
-  
-  // Set any properties with this.set('myProperty', 'value');
-  // Handle any actions with this.on('myAction', function(val) { ... });" + EOL + EOL +
-
-  this.render(hbs`{{dynamic-high-charts}}`);
-
-  assert.equal(this.$().text().trim(), '');
-
-  // Template block usage:" + EOL +
-  this.render(hbs`
-    {{#dynamic-high-charts}}
-      template block text
-    {{/dynamic-high-charts}}
-  `);
-
-  assert.equal(this.$().text().trim(), 'template block text');
-});
diff --git a/vipra-ui/tests/integration/components/item-list-test.js b/vipra-ui/tests/integration/components/item-list-test.js
deleted file mode 100644
index bcc52965fc674e9690c7834e179c13b38bfe5caf..0000000000000000000000000000000000000000
--- a/vipra-ui/tests/integration/components/item-list-test.js
+++ /dev/null
@@ -1,25 +0,0 @@
-import { moduleForComponent, test } from 'ember-qunit';
-import hbs from 'htmlbars-inline-precompile';
-
-moduleForComponent('article-list', 'Integration | Component | article list', {
-  integration: true
-});
-
-test('it renders', function(assert) {
-  
-  // Set any properties with this.set('myProperty', 'value');
-  // Handle any actions with this.on('myAction', function(val) { ... });" + EOL + EOL +
-
-  this.render(hbs`{{article-list}}`);
-
-  assert.equal(this.$().text().trim(), '');
-
-  // Template block usage:" + EOL +
-  this.render(hbs`
-    {{#article-list}}
-      template block text
-    {{/article-list}}
-  `);
-
-  assert.equal(this.$().text().trim(), 'template block text');
-});
diff --git a/vipra-ui/tests/integration/components/pagination-bar-test.js b/vipra-ui/tests/integration/components/pagination-bar-test.js
deleted file mode 100644
index d61ba100b35dd7a929eb01f1500c5b6a78c54487..0000000000000000000000000000000000000000
--- a/vipra-ui/tests/integration/components/pagination-bar-test.js
+++ /dev/null
@@ -1,25 +0,0 @@
-import { moduleForComponent, test } from 'ember-qunit';
-import hbs from 'htmlbars-inline-precompile';
-
-moduleForComponent('pagination-bar', 'Integration | Component | pagination bar', {
-  integration: true
-});
-
-test('it renders', function(assert) {
-  
-  // Set any properties with this.set('myProperty', 'value');
-  // Handle any actions with this.on('myAction', function(val) { ... });" + EOL + EOL +
-
-  this.render(hbs`{{pagination-bar}}`);
-
-  assert.equal(this.$().text().trim(), '');
-
-  // Template block usage:" + EOL +
-  this.render(hbs`
-    {{#pagination-bar}}
-      template block text
-    {{/pagination-bar}}
-  `);
-
-  assert.equal(this.$().text().trim(), 'template block text');
-});
diff --git a/vipra-ui/tests/integration/components/scroll-top-test.js b/vipra-ui/tests/integration/components/scroll-top-test.js
deleted file mode 100644
index 26cf1dc6c8992cc76b547be300f7cbd38e982839..0000000000000000000000000000000000000000
--- a/vipra-ui/tests/integration/components/scroll-top-test.js
+++ /dev/null
@@ -1,25 +0,0 @@
-import { moduleForComponent, test } from 'ember-qunit';
-import hbs from 'htmlbars-inline-precompile';
-
-moduleForComponent('scroll-top', 'Integration | Component | scroll top', {
-  integration: true
-});
-
-test('it renders', function(assert) {
-  
-  // Set any properties with this.set('myProperty', 'value');
-  // Handle any actions with this.on('myAction', function(val) { ... });" + EOL + EOL +
-
-  this.render(hbs`{{scroll-top}}`);
-
-  assert.equal(this.$().text().trim(), '');
-
-  // Template block usage:" + EOL +
-  this.render(hbs`
-    {{#scroll-top}}
-      template block text
-    {{/scroll-top}}
-  `);
-
-  assert.equal(this.$().text().trim(), 'template block text');
-});
diff --git a/vipra-ui/tests/integration/components/text-marker-test.js b/vipra-ui/tests/integration/components/text-marker-test.js
deleted file mode 100644
index 1af17c61bc9e6b08df64bdaa001f22802d69825a..0000000000000000000000000000000000000000
--- a/vipra-ui/tests/integration/components/text-marker-test.js
+++ /dev/null
@@ -1,25 +0,0 @@
-import { moduleForComponent, test } from 'ember-qunit';
-import hbs from 'htmlbars-inline-precompile';
-
-moduleForComponent('text-marker', 'Integration | Component | text marker', {
-  integration: true
-});
-
-test('it renders', function(assert) {
-  
-  // Set any properties with this.set('myProperty', 'value');
-  // Handle any actions with this.on('myAction', function(val) { ... });" + EOL + EOL +
-
-  this.render(hbs`{{text-marker}}`);
-
-  assert.equal(this.$().text().trim(), '');
-
-  // Template block usage:" + EOL +
-  this.render(hbs`
-    {{#text-marker}}
-      template block text
-    {{/text-marker}}
-  `);
-
-  assert.equal(this.$().text().trim(), 'template block text');
-});
diff --git a/vipra-ui/tests/integration/components/topic-link-test.js b/vipra-ui/tests/integration/components/topic-link-test.js
deleted file mode 100644
index d3ea4cf9e5aac1a12db07f7813d91d626bdf74cd..0000000000000000000000000000000000000000
--- a/vipra-ui/tests/integration/components/topic-link-test.js
+++ /dev/null
@@ -1,25 +0,0 @@
-import { moduleForComponent, test } from 'ember-qunit';
-import hbs from 'htmlbars-inline-precompile';
-
-moduleForComponent('topic-link', 'Integration | Component | topic link', {
-  integration: true
-});
-
-test('it renders', function(assert) {
-  
-  // Set any properties with this.set('myProperty', 'value');
-  // Handle any actions with this.on('myAction', function(val) { ... });" + EOL + EOL +
-
-  this.render(hbs`{{topic-link}}`);
-
-  assert.equal(this.$().text().trim(), '');
-
-  // Template block usage:" + EOL +
-  this.render(hbs`
-    {{#topic-link}}
-      template block text
-    {{/topic-link}}
-  `);
-
-  assert.equal(this.$().text().trim(), 'template block text');
-});
diff --git a/vipra-ui/tests/test-helper.js b/vipra-ui/tests/test-helper.js
deleted file mode 100644
index e6cfb70fe806b564111203f2f0a97b41bc43a608..0000000000000000000000000000000000000000
--- a/vipra-ui/tests/test-helper.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import resolver from './helpers/resolver';
-import {
-  setResolver
-} from 'ember-qunit';
-
-setResolver(resolver);
diff --git a/vipra-ui/tests/unit/.gitkeep b/vipra-ui/tests/unit/.gitkeep
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/vipra-ui/tests/unit/adapters/application-test.js b/vipra-ui/tests/unit/adapters/application-test.js
deleted file mode 100644
index f0a2101e7a8422290f4421be88af10fb6b155bfe..0000000000000000000000000000000000000000
--- a/vipra-ui/tests/unit/adapters/application-test.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import { moduleFor, test } from 'ember-qunit';
-
-moduleFor('adapter:application', 'Unit | Adapter | application', {
-  // Specify the other units that are required for this test.
-  // needs: ['serializer:foo']
-});
-
-// Replace this with your real tests.
-test('it exists', function(assert) {
-  let adapter = this.subject();
-  assert.ok(adapter);
-});
diff --git a/vipra-ui/tests/unit/controllers/articles-test.js b/vipra-ui/tests/unit/controllers/articles-test.js
deleted file mode 100644
index 2f09e3a9cfb428f7762f161885385c8da50f5983..0000000000000000000000000000000000000000
--- a/vipra-ui/tests/unit/controllers/articles-test.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import { moduleFor, test } from 'ember-qunit';
-
-moduleFor('controller:articles', 'Unit | Controller | articles', {
-  // Specify the other units that are required for this test.
-  // needs: ['controller:foo']
-});
-
-// Replace this with your real tests.
-test('it exists', function(assert) {
-  let controller = this.subject();
-  assert.ok(controller);
-});
diff --git a/vipra-ui/tests/unit/controllers/words-test.js b/vipra-ui/tests/unit/controllers/words-test.js
deleted file mode 100644
index f4014164cf8485680e1b6fe2f5d118e816867fa7..0000000000000000000000000000000000000000
--- a/vipra-ui/tests/unit/controllers/words-test.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import { moduleFor, test } from 'ember-qunit';
-
-moduleFor('controller:words', 'Unit | Controller | words', {
-  // Specify the other units that are required for this test.
-  // needs: ['controller:foo']
-});
-
-// Replace this with your real tests.
-test('it exists', function(assert) {
-  let controller = this.subject();
-  assert.ok(controller);
-});
diff --git a/vipra-ui/tests/unit/helpers/is-empty-test.js b/vipra-ui/tests/unit/helpers/is-empty-test.js
deleted file mode 100644
index cc3fb38e1669a4936266a963aeba7ff2b339498a..0000000000000000000000000000000000000000
--- a/vipra-ui/tests/unit/helpers/is-empty-test.js
+++ /dev/null
@@ -1,10 +0,0 @@
-import { isEmpty } from '../../../helpers/is-empty';
-import { module, test } from 'qunit';
-
-module('Unit | Helper | is empty');
-
-// Replace this with your real tests.
-test('it works', function(assert) {
-  let result = isEmpty(42);
-  assert.ok(result);
-});
diff --git a/vipra-ui/tests/unit/helpers/pluralize-test.js b/vipra-ui/tests/unit/helpers/pluralize-test.js
deleted file mode 100644
index 12ce3b9da4b368646e85364459ac3b05a6c19e4c..0000000000000000000000000000000000000000
--- a/vipra-ui/tests/unit/helpers/pluralize-test.js
+++ /dev/null
@@ -1,10 +0,0 @@
-import { pluralize } from '../../../helpers/pluralize';
-import { module, test } from 'qunit';
-
-module('Unit | Helper | pluralize');
-
-// Replace this with your real tests.
-test('it works', function(assert) {
-  let result = pluralize(42);
-  assert.ok(result);
-});
diff --git a/vipra-ui/tests/unit/helpers/topic-share-test.js b/vipra-ui/tests/unit/helpers/topic-share-test.js
deleted file mode 100644
index a7e8b95a4987d5e44c71e51d86f56513210c3479..0000000000000000000000000000000000000000
--- a/vipra-ui/tests/unit/helpers/topic-share-test.js
+++ /dev/null
@@ -1,10 +0,0 @@
-import { topicShare } from '../../../helpers/topic-share';
-import { module, test } from 'qunit';
-
-module('Unit | Helper | topic share');
-
-// Replace this with your real tests.
-test('it works', function(assert) {
-  let result = topicShare(42);
-  assert.ok(result);
-});
diff --git a/vipra-ui/tests/unit/models/article-test.js b/vipra-ui/tests/unit/models/article-test.js
deleted file mode 100644
index 0afadacc92c6654ec5318b7f26638729fb38805d..0000000000000000000000000000000000000000
--- a/vipra-ui/tests/unit/models/article-test.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import { moduleForModel, test } from 'ember-qunit';
-
-moduleForModel('article', 'Unit | Model | article', {
-  // Specify the other units that are required for this test.
-  needs: []
-});
-
-test('it exists', function(assert) {
-  let model = this.subject();
-  // let store = this.store();
-  assert.ok(!!model);
-});
diff --git a/vipra-ui/tests/unit/models/import-test.js b/vipra-ui/tests/unit/models/import-test.js
deleted file mode 100644
index 569cba6097faa1b5604feb662961cb455fad4eb0..0000000000000000000000000000000000000000
--- a/vipra-ui/tests/unit/models/import-test.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import { moduleForModel, test } from 'ember-qunit';
-
-moduleForModel('import', 'Unit | Model | import', {
-  // Specify the other units that are required for this test.
-  needs: []
-});
-
-test('it exists', function(assert) {
-  let model = this.subject();
-  // let store = this.store();
-  assert.ok(!!model);
-});
diff --git a/vipra-ui/tests/unit/models/topic-test.js b/vipra-ui/tests/unit/models/topic-test.js
deleted file mode 100644
index 8d71d76e0ea46c2b4c5ad1e3a3596c63fad6d213..0000000000000000000000000000000000000000
--- a/vipra-ui/tests/unit/models/topic-test.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import { moduleForModel, test } from 'ember-qunit';
-
-moduleForModel('topic', 'Unit | Model | topic', {
-  // Specify the other units that are required for this test.
-  needs: []
-});
-
-test('it exists', function(assert) {
-  let model = this.subject();
-  // let store = this.store();
-  assert.ok(!!model);
-});
diff --git a/vipra-ui/tests/unit/routes/article-test.js b/vipra-ui/tests/unit/routes/article-test.js
deleted file mode 100644
index a9185964f142f77bed47257f75926240c781b292..0000000000000000000000000000000000000000
--- a/vipra-ui/tests/unit/routes/article-test.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import { moduleFor, test } from 'ember-qunit';
-
-moduleFor('route:article', 'Unit | Route | article', {
-  // Specify the other units that are required for this test.
-  // needs: ['controller:foo']
-});
-
-test('it exists', function(assert) {
-  let route = this.subject();
-  assert.ok(route);
-});
diff --git a/vipra-ui/tests/unit/routes/index-test.js b/vipra-ui/tests/unit/routes/index-test.js
deleted file mode 100644
index 5d0f50da6ac857bbfddf507f781d58b895b0deed..0000000000000000000000000000000000000000
--- a/vipra-ui/tests/unit/routes/index-test.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import { moduleFor, test } from 'ember-qunit';
-
-moduleFor('route:index', 'Unit | Route | index', {
-  // Specify the other units that are required for this test.
-  // needs: ['controller:foo']
-});
-
-test('it exists', function(assert) {
-  let route = this.subject();
-  assert.ok(route);
-});
diff --git a/vipra-ui/tests/unit/routes/not-found-test.js b/vipra-ui/tests/unit/routes/not-found-test.js
deleted file mode 100644
index 2375b9bb75fd6d375431e81f000b518cc2ee6e8c..0000000000000000000000000000000000000000
--- a/vipra-ui/tests/unit/routes/not-found-test.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import { moduleFor, test } from 'ember-qunit';
-
-moduleFor('route:not-found', 'Unit | Route | not found', {
-  // Specify the other units that are required for this test.
-  // needs: ['controller:foo']
-});
-
-test('it exists', function(assert) {
-  let route = this.subject();
-  assert.ok(route);
-});
diff --git a/vipra-ui/tests/unit/routes/topics-test.js b/vipra-ui/tests/unit/routes/topics-test.js
deleted file mode 100644
index c0218b7379c24b5a84ab827245558be174cb2b20..0000000000000000000000000000000000000000
--- a/vipra-ui/tests/unit/routes/topics-test.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import { moduleFor, test } from 'ember-qunit';
-
-moduleFor('route:topics', 'Unit | Route | topics', {
-  // Specify the other units that are required for this test.
-  // needs: ['controller:foo']
-});
-
-test('it exists', function(assert) {
-  let route = this.subject();
-  assert.ok(route);
-});
diff --git a/vipra-ui/tests/unit/routes/words-test.js b/vipra-ui/tests/unit/routes/words-test.js
deleted file mode 100644
index ce62d399b4395bcff99bcbe5dc1129fb13c089bc..0000000000000000000000000000000000000000
--- a/vipra-ui/tests/unit/routes/words-test.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import { moduleFor, test } from 'ember-qunit';
-
-moduleFor('route:words', 'Unit | Route | words', {
-  // Specify the other units that are required for this test.
-  // needs: ['controller:foo']
-});
-
-test('it exists', function(assert) {
-  let route = this.subject();
-  assert.ok(route);
-});
diff --git a/vipra-ui/vendor/.gitkeep b/vipra-ui/vendor/.gitkeep
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/vipra-ui/webapp/WEB-INF/web.xml b/vipra-ui/webapp/WEB-INF/web.xml
deleted file mode 100644
index 55266664a2f8afd5345542489f7916d4add11991..0000000000000000000000000000000000000000
--- a/vipra-ui/webapp/WEB-INF/web.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
-	version="3.1">
-	<welcome-file-list>
-		<welcome-file>index.html</welcome-file>
-	</welcome-file-list>
-</web-app>
\ No newline at end of file
diff --git a/vipra-util/src/main/java/de/vipra/util/an/JsonType.java b/vipra-util/src/main/java/de/vipra/util/an/JsonType.java
deleted file mode 100644
index e3a30187c8c6ffa0ec4d83d0a53dd92fe302bcb5..0000000000000000000000000000000000000000
--- a/vipra-util/src/main/java/de/vipra/util/an/JsonType.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package de.vipra.util.an;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.TYPE)
-public @interface JsonType {
-
-	public String value();
-
-}
diff --git a/vipra-util/src/main/java/de/vipra/util/an/JsonWrap.java b/vipra-util/src/main/java/de/vipra/util/an/JsonWrap.java
deleted file mode 100644
index bfeea312be1f171fa8c2918b9411b492698bb196..0000000000000000000000000000000000000000
--- a/vipra-util/src/main/java/de/vipra/util/an/JsonWrap.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package de.vipra.util.an;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.FIELD)
-public @interface JsonWrap {
-
-	public String value() default "";
-
-}
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 892dcbadb6d88b9acc5f94d1bd7c035f1caffa9d..fc65f56b500b6d1229d99a4af88d036a44706a63 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
@@ -8,10 +8,7 @@ import org.mongodb.morphia.annotations.Id;
 import org.mongodb.morphia.annotations.Index;
 import org.mongodb.morphia.annotations.Indexes;
 
-import de.vipra.util.an.JsonType;
-
 @SuppressWarnings("serial")
-@JsonType("article")
 @Entity(value = "articles", noClassnameStored = true)
 @Indexes({ @Index("title"), @Index("date"), @Index("-created") })
 public class Article implements Model<ObjectId>, Serializable {
diff --git a/vipra-util/src/main/java/de/vipra/util/model/ArticleFull.java b/vipra-util/src/main/java/de/vipra/util/model/ArticleFull.java
index 26b42d388b96aa1359172dc3a7eb2683afc5be54..5dc4c422e16db29516df5fee2791659206a42c09 100644
--- a/vipra-util/src/main/java/de/vipra/util/model/ArticleFull.java
+++ b/vipra-util/src/main/java/de/vipra/util/model/ArticleFull.java
@@ -20,12 +20,9 @@ import de.vipra.util.Constants;
 import de.vipra.util.FileUtils;
 import de.vipra.util.MongoUtils;
 import de.vipra.util.StringUtils;
-import de.vipra.util.an.JsonType;
-import de.vipra.util.an.JsonWrap;
 import de.vipra.util.an.QueryIgnore;
 
 @SuppressWarnings("serial")
-@JsonType("article")
 @Entity(value = "articles", noClassnameStored = true)
 @Indexes({ @Index("title"), @Index("date"), @Index("-created") })
 public class ArticleFull extends FileModel<ObjectId> implements Serializable {
@@ -33,33 +30,25 @@ public class ArticleFull extends FileModel<ObjectId> implements Serializable {
 	@Id
 	private ObjectId id;
 
-	@JsonWrap("attributes")
 	private String title;
 
-	@JsonWrap("attributes")
 	@QueryIgnore(multi = true)
 	private String text;
 
-	@JsonWrap("attributes")
 	private String url;
 
-	@JsonWrap("attributes")
 	private Date date;
 
 	@Embedded
-	@JsonWrap("attributes")
 	@QueryIgnore(multi = true)
 	private List<TopicRef> topics;
 
 	@Embedded
-	@JsonWrap("attributes")
 	@QueryIgnore(multi = true)
 	private ArticleStats stats;
 
-	@JsonWrap("attributes")
 	private Date created;
 
-	@JsonWrap("attributes")
 	private Date modified;
 
 	@Override
diff --git a/vipra-util/src/main/java/de/vipra/util/model/Import.java b/vipra-util/src/main/java/de/vipra/util/model/Import.java
index d5da6a81c55b3127d908429afa48586547bf42cc..a89697388f89d02f78b042d0dfa14e795ad6d4ff 100644
--- a/vipra-util/src/main/java/de/vipra/util/model/Import.java
+++ b/vipra-util/src/main/java/de/vipra/util/model/Import.java
@@ -12,12 +12,9 @@ import org.mongodb.morphia.annotations.Indexes;
 import org.mongodb.morphia.annotations.PrePersist;
 import org.mongodb.morphia.annotations.Reference;
 
-import de.vipra.util.an.JsonType;
-import de.vipra.util.an.JsonWrap;
 import de.vipra.util.an.QueryIgnore;
 
 @SuppressWarnings("serial")
-@JsonType("import")
 @Entity(value = "imports", noClassnameStored = true)
 @Indexes({ @Index("date") })
 public class Import implements Model<ObjectId>, Serializable {
@@ -25,34 +22,26 @@ public class Import implements Model<ObjectId>, Serializable {
 	@Id
 	private ObjectId id;
 
-	@JsonWrap("attributes")
 	private Date date;
 
-	@JsonWrap("attributes")
 	private long duration;
 
-	@JsonWrap("attributes")
 	@QueryIgnore(multi = true)
 	@Reference(ignoreMissing = true)
 	private List<Article> articles;
 
-	@JsonWrap("attributes")
 	private int articlesCount;
 
-	@JsonWrap("attributes")
 	@QueryIgnore(multi = true)
 	@Reference(ignoreMissing = true)
 	private List<Topic> topics;
 
-	@JsonWrap("attributes")
 	private int topicsCount;
 
-	@JsonWrap("attributes")
 	@QueryIgnore(multi = true)
 	@Reference(ignoreMissing = true)
 	private List<Word> words;
 
-	@JsonWrap("attributes")
 	private int wordsCount;
 
 	@Override
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 8678b4684f16370756335eb5d46181235ffb3486..5f097b90dbbc40de39a7e85b810dfba25989fab3 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
@@ -9,10 +9,8 @@ import org.mongodb.morphia.annotations.Index;
 import org.mongodb.morphia.annotations.Indexes;
 
 import de.vipra.util.MongoUtils;
-import de.vipra.util.an.JsonType;
 
 @SuppressWarnings("serial")
-@JsonType("topic")
 @Entity(value = "topics", noClassnameStored = true)
 @Indexes({ @Index("name"), @Index("-created") })
 public class Topic implements Model<ObjectId>, Serializable {
diff --git a/vipra-util/src/main/java/de/vipra/util/model/TopicFull.java b/vipra-util/src/main/java/de/vipra/util/model/TopicFull.java
index 8797b6b6fdc0da85fc5c0298b5339c663fdc3089..63750c08c94d55f69d34bd5bdc893da663359fbd 100644
--- a/vipra-util/src/main/java/de/vipra/util/model/TopicFull.java
+++ b/vipra-util/src/main/java/de/vipra/util/model/TopicFull.java
@@ -14,33 +14,25 @@ import org.mongodb.morphia.annotations.PrePersist;
 import de.vipra.util.Constants;
 import de.vipra.util.MongoUtils;
 import de.vipra.util.StringUtils;
-import de.vipra.util.an.JsonType;
-import de.vipra.util.an.JsonWrap;
 import de.vipra.util.an.QueryIgnore;
 
 @SuppressWarnings("serial")
-@JsonType("topic")
 @Entity(value = "topics", noClassnameStored = true)
 public class TopicFull implements Model<ObjectId>, Serializable {
 
 	@Id
 	private ObjectId id;
 
-	@JsonWrap("attributes")
 	private String name;
 
-	@JsonWrap("attributes")
 	private int index;
 
 	@Embedded
-	@JsonWrap("attributes")
 	@QueryIgnore(multi = true)
 	private List<TopicWord> words;
 
-	@JsonWrap("attributes")
 	private Date created;
 
-	@JsonWrap("attributes")
 	private Date modified;
 
 	@Override
diff --git a/vipra-util/src/main/java/de/vipra/util/model/Word.java b/vipra-util/src/main/java/de/vipra/util/model/Word.java
index 954eb4150da821a1fb45125dd624baff84483f8e..06758a80987ac6a13e99019ea9846a74aa57e24c 100644
--- a/vipra-util/src/main/java/de/vipra/util/model/Word.java
+++ b/vipra-util/src/main/java/de/vipra/util/model/Word.java
@@ -14,12 +14,9 @@ import org.mongodb.morphia.annotations.Transient;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 
-import de.vipra.util.an.JsonType;
-import de.vipra.util.an.JsonWrap;
 import de.vipra.util.an.QueryIgnore;
 
 @SuppressWarnings("serial")
-@JsonType("word")
 @Entity(value = "words", noClassnameStored = true)
 @Indexes(@Index("-created"))
 public class Word implements Model<String>, Serializable {
@@ -40,7 +37,6 @@ public class Word implements Model<String>, Serializable {
 	private String word;
 
 	@QueryIgnore(multi = true)
-	@JsonWrap("attributes")
 	private Date created;
 
 	/**