diff --git a/jgibblda/.classpath b/jgibblda/.classpath
index c87e70ade5a179d3496942a09afcc1ec4fbeebf4..cf6dc8577b7a1ef815c8060b30722361a43c9e05 100644
--- a/jgibblda/.classpath
+++ b/jgibblda/.classpath
@@ -1,14 +1,24 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
-	<classpathentry kind="src" path="src/main/java"/>
+	<classpathentry kind="src" output="target/classes" path="src/main/java">
+		<attributes>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
 	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
 		<attributes>
 			<attribute name="maven.pomderived" value="true"/>
 			<attribute name="org.eclipse.jst.component.nondependency" value=""/>
 		</attributes>
 	</classpathentry>
-	<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7">
+	<classpathentry kind="src" output="target/test-classes" path="src/test/java">
+		<attributes>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
 		<attributes>
 			<attribute name="owner.project.facets" value="java"/>
 		</attributes>
diff --git a/jgibblda/.project b/jgibblda/.project
index aa3283580b1268ad7fd2c20e08e89bc706934a4a..9686b2ae5623076a3cc9959c3a28754015fba333 100644
--- a/jgibblda/.project
+++ b/jgibblda/.project
@@ -16,12 +16,12 @@
 			</arguments>
 		</buildCommand>
 		<buildCommand>
-			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<name>org.eclipse.wst.validation.validationbuilder</name>
 			<arguments>
 			</arguments>
 		</buildCommand>
 		<buildCommand>
-			<name>org.eclipse.wst.validation.validationbuilder</name>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
 			<arguments>
 			</arguments>
 		</buildCommand>
diff --git a/jgibblda/.settings/org.eclipse.core.resources.prefs b/jgibblda/.settings/org.eclipse.core.resources.prefs
index 99f26c0203a7844de00dbfc56e6a35d8ed3c022c..e9441bb123ec3e1ab029c7eac896bc45681d9a71 100644
--- a/jgibblda/.settings/org.eclipse.core.resources.prefs
+++ b/jgibblda/.settings/org.eclipse.core.resources.prefs
@@ -1,2 +1,3 @@
 eclipse.preferences.version=1
+encoding//src/main/java=UTF-8
 encoding/<project>=UTF-8
diff --git a/jgibblda/.settings/org.eclipse.jdt.core.prefs b/jgibblda/.settings/org.eclipse.jdt.core.prefs
index 92f8042339f69fb00c768e5ed3c83ebd89f2efb9..1913b2950e234e853ad0dcb12bb5014f858e9f40 100644
--- a/jgibblda/.settings/org.eclipse.jdt.core.prefs
+++ b/jgibblda/.settings/org.eclipse.jdt.core.prefs
@@ -1,15 +1,16 @@
 eclipse.preferences.version=1
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
 org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.7
+org.eclipse.jdt.core.compiler.compliance=1.8
 org.eclipse.jdt.core.compiler.debug.lineNumber=generate
 org.eclipse.jdt.core.compiler.debug.localVariable=generate
 org.eclipse.jdt.core.compiler.debug.sourceFile=generate
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.7
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.source=1.8
 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
diff --git a/jgibblda/.settings/org.eclipse.wst.common.project.facet.core.xml b/jgibblda/.settings/org.eclipse.wst.common.project.facet.core.xml
index 70e9d8a35a5f422ae00c692c08349c1a5469a84b..fd0227a68279180b3dd187cfc58335b8a0914833 100644
--- a/jgibblda/.settings/org.eclipse.wst.common.project.facet.core.xml
+++ b/jgibblda/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -3,5 +3,5 @@
   <fixed facet="java"/>
   <fixed facet="jst.utility"/>
   <installed facet="jst.utility" version="1.0"/>
-  <installed facet="java" version="1.7"/>
+  <installed facet="java" version="1.8"/>
 </faceted-project>
diff --git a/jgibblda/.settings/org.eclipse.wst.validation.prefs b/jgibblda/.settings/org.eclipse.wst.validation.prefs
new file mode 100644
index 0000000000000000000000000000000000000000..04cad8cb752a9761c4e5167d0301d3a27674430f
--- /dev/null
+++ b/jgibblda/.settings/org.eclipse.wst.validation.prefs
@@ -0,0 +1,2 @@
+disabled=06target
+eclipse.preferences.version=1
diff --git a/jgibblda/pom.xml b/jgibblda/pom.xml
index 52b1475e13f9c4d5b7e7c6275a50cfd998a7d775..ba0e1587bd1a4c2a70c8b7b2d91ba5427142604f 100644
--- a/jgibblda/pom.xml
+++ b/jgibblda/pom.xml
@@ -7,8 +7,8 @@
 
 	<properties>
 		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-		<maven.compiler.target>1.7</maven.compiler.target>
-		<maven.compiler.source>1.7</maven.compiler.source>
+		<maven.compiler.target>1.8</maven.compiler.target>
+		<maven.compiler.source>1.8</maven.compiler.source>
 		<log4jVersion>2.4.1</log4jVersion>
 	</properties>
 
diff --git a/ma-impl.sublime-workspace b/ma-impl.sublime-workspace
index 5297a4a50b886f76788c2b79ea89629489267106..2ad0d78bc5aa08b99c6a5d9f82752218ab47eb08 100644
--- a/ma-impl.sublime-workspace
+++ b/ma-impl.sublime-workspace
@@ -275,38 +275,6 @@
 	},
 	"buffers":
 	[
-		{
-			"file": "vipra-ui/app/templates/topics/show.hbs",
-			"settings":
-			{
-				"buffer_size": 196,
-				"line_ending": "Unix"
-			}
-		},
-		{
-			"file": "vipra-ui/app/routes/articles/show.js",
-			"settings":
-			{
-				"buffer_size": 646,
-				"line_ending": "Unix"
-			}
-		},
-		{
-			"file": "vipra-ui/app/styles/app.css",
-			"settings":
-			{
-				"buffer_size": 81,
-				"line_ending": "Unix"
-			}
-		},
-		{
-			"file": "vipra-ui/app/models/topic.js",
-			"settings":
-			{
-				"buffer_size": 244,
-				"line_ending": "Unix"
-			}
-		}
 	],
 	"build_system": "",
 	"build_system_choices":
@@ -315,10 +283,14 @@
 	"build_varint": "",
 	"command_palette":
 	{
-		"height": 148.0,
-		"last_filter": "insta",
+		"height": 102.0,
+		"last_filter": "remove",
 		"selected_items":
 		[
+			[
+				"remove",
+				"Package Control: Remove Package"
+			],
 			[
 				"insta",
 				"Package Control: Install Package"
@@ -347,10 +319,6 @@
 				"install",
 				"Package Control: Install Package"
 			],
-			[
-				"remove",
-				"Package Control: Remove Package"
-			],
 			[
 				"pyth",
 				"Set Syntax: Python"
@@ -488,44 +456,59 @@
 		"/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",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/helpers",
 		"/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/topics/show",
 		"/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/topics"
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/topics",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/topics/show"
 	],
 	"file_history":
 	[
-		"/home/eike/repos/master/ma-impl/vipra-ui/app/routes/topics/show.js",
-		"/home/eike/repos/master/ma-impl/vipra-ui/app/routes/topics/list.js",
-		"/home/eike/repos/master/ma-impl/vipra-ui/app/components/topic-link.js",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/adapters/application.js",
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/articles.hbs",
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/topics.hbs",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/index.hbs",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/models/topic.js",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/routes/topics/show/edit.js",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/components/topics-list.hbs",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/topics/index.hbs",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/router.js",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/topics/show/index.hbs",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/routes/topics/index.js",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/routes/topics/show.js",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/topics/show/edit.hbs",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/topics/show.hbs",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/helpers/topic-share.js",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/styles/app.css",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/components/topic-link.js",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/components/topic-link.hbs",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/topics/edit.hbs",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/articles/show.hbs",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/routes/articles/show.js",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/articles/edit.hbs",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/routes/topics/edit.js",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/routes/articles/edit.js",
+		"/home/eike/repos/master/ma-impl/vipra-ui/app/routes/topics/list.js",
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/components/topics-list.js",
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/components/articles-list.js",
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/articles/list.hbs",
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/components/articles-list.hbs",
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/topics/list.hbs",
-		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/components/topics-list.hbs",
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/models/article.js",
-		"/home/eike/repos/master/ma-impl/vipra-ui/app/models/topic.js",
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/components/filter-list.js",
-		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/articles/show.hbs",
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/helpers/topic-numi.js",
-		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/components/topic-link.hbs",
-		"/home/eike/repos/master/ma-impl/vipra-ui/app/routes/articles/show.js",
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/helpers/topicname.js",
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/helpers/topic-name.js",
-		"/home/eike/repos/master/ma-impl/vipra-ui/app/styles/app.css",
 		"/home/eike/repos/master/ma-impl/vm/bootstrap.sh",
-		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/topics/show.hbs",
-		"/home/eike/repos/master/ma-impl/vipra-ui/app/router.js",
-		"/home/eike/repos/master/ma-impl/vipra-ui/app/templates/index.hbs",
 		"/home/eike/.config/sublime-text-3/Packages/User/Preferences.sublime-settings",
 		"/home/eike/.config/sublime-text-3/Packages/Default/Preferences.sublime-settings",
 		"/home/eike/repos/master/ma-impl/vipra-ui/app/components/dynamic-high-charts.js",
@@ -617,18 +600,7 @@
 		"/home/eike/Repositories/fu/ss15/ma/impl/vm/rc.sh",
 		"/home/eike/Repositories/fu/ss15/ma/impl/vm/config/rc.local",
 		"/home/eike/Repositories/fu/ss15/ma/impl/vm/env.sh",
-		"/home/eike/Repositories/fu/ss15/ma/impl/ui/backend/pom.xml",
-		"/home/eike/Repositories/fu/ss15/ma/impl/vm/config/mongo-express.config.js",
-		"/home/eike/Repositories/fu/ss15/ma/impl/data/data.json",
-		"/home/eike/Repositories/fu/ss15/ma/impl/vm/Vagrantfile",
-		"/home/eike/Repositories/fu/ss15/ma/impl/data/data.sql",
-		"/home/eike/Repositories/fu/ws1415/ntdb/Vagrantfile",
-		"/home/eike/Repositories/fu/ws1415/ntdb/puppet/manifests/default.pp",
-		"/home/eike/Repositories/fu/ss15/ma/impl/vm/manifests/default.pp",
-		"/home/eike/Repositories/niels_website/web/src/index.html",
-		"/home/eike/Repositories/niels_website/web/src/intergeo-2015.html",
-		"/home/eike/Repositories/niels_website/web/src/less/main.less",
-		"/home/eike/Downloads/intellij/idea-IU-141.2735.5/Install-Linux-tar.txt"
+		"/home/eike/Repositories/fu/ss15/ma/impl/ui/backend/pom.xml"
 	],
 	"find":
 	{
@@ -950,123 +922,8 @@
 	"groups":
 	[
 		{
-			"selected": 1,
 			"sheets":
 			[
-				{
-					"buffer": 0,
-					"file": "vipra-ui/app/templates/topics/show.hbs",
-					"semi_transient": false,
-					"settings":
-					{
-						"buffer_size": 196,
-						"regions":
-						{
-						},
-						"selection":
-						[
-							[
-								196,
-								196
-							]
-						],
-						"settings":
-						{
-							"syntax": "Packages/Handlebars/grammars/Handlebars.tmLanguage"
-						},
-						"translation.x": 0.0,
-						"translation.y": 0.0,
-						"zoom_level": 1.0
-					},
-					"stack_index": 1,
-					"type": "text"
-				},
-				{
-					"buffer": 1,
-					"file": "vipra-ui/app/routes/articles/show.js",
-					"semi_transient": false,
-					"settings":
-					{
-						"buffer_size": 646,
-						"regions":
-						{
-						},
-						"selection":
-						[
-							[
-								395,
-								395
-							]
-						],
-						"settings":
-						{
-							"syntax": "Packages/JavaScript/JavaScript.tmLanguage",
-							"tab_size": 2,
-							"translate_tabs_to_spaces": true
-						},
-						"translation.x": 0.0,
-						"translation.y": 0.0,
-						"zoom_level": 1.0
-					},
-					"stack_index": 0,
-					"type": "text"
-				},
-				{
-					"buffer": 2,
-					"file": "vipra-ui/app/styles/app.css",
-					"semi_transient": false,
-					"settings":
-					{
-						"buffer_size": 81,
-						"regions":
-						{
-						},
-						"selection":
-						[
-							[
-								79,
-								79
-							]
-						],
-						"settings":
-						{
-							"syntax": "Packages/CSS/CSS.tmLanguage"
-						},
-						"translation.x": 0.0,
-						"translation.y": 0.0,
-						"zoom_level": 1.0
-					},
-					"stack_index": 2,
-					"type": "text"
-				},
-				{
-					"buffer": 3,
-					"file": "vipra-ui/app/models/topic.js",
-					"semi_transient": false,
-					"settings":
-					{
-						"buffer_size": 244,
-						"regions":
-						{
-						},
-						"selection":
-						[
-							[
-								121,
-								121
-							]
-						],
-						"settings":
-						{
-							"syntax": "Packages/JavaScript/JavaScript.tmLanguage"
-						},
-						"translation.x": 0.0,
-						"translation.y": 0.0,
-						"zoom_level": 1.0
-					},
-					"stack_index": 3,
-					"type": "text"
-				}
 			]
 		}
 	],
@@ -1233,7 +1090,7 @@
 	"show_open_files": true,
 	"show_tabs": true,
 	"side_bar_visible": true,
-	"side_bar_width": 254.0,
+	"side_bar_width": 295.0,
 	"status_bar_visible": true,
 	"template_settings":
 	{
diff --git a/vipra-cmd/.classpath b/vipra-cmd/.classpath
index 959f104cedd0691fb01d669d14c7bcf48fa63b63..32530decee8107dc6d40648091978c83c2f89629 100644
--- a/vipra-cmd/.classpath
+++ b/vipra-cmd/.classpath
@@ -22,14 +22,20 @@
 			<attribute name="org.eclipse.jst.component.nondependency" value=""/>
 		</attributes>
 	</classpathentry>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7">
+	<classpathentry combineaccessrules="false" kind="src" path="/JGibbLDA">
+		<attributes>
+			<attribute name="org.eclipse.jst.component.nondependency" value=""/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="src" output="target/test-classes" path="src/test/java">
 		<attributes>
+			<attribute name="optional" value="true"/>
 			<attribute name="maven.pomderived" value="true"/>
 		</attributes>
 	</classpathentry>
-	<classpathentry combineaccessrules="false" kind="src" path="/JGibbLDA">
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
 		<attributes>
-			<attribute name="org.eclipse.jst.component.nondependency" value=""/>
+			<attribute name="owner.project.facets" value="java"/>
 		</attributes>
 	</classpathentry>
 	<classpathentry kind="output" path="target/classes"/>
diff --git a/vipra-cmd/.settings/org.eclipse.jdt.core.prefs b/vipra-cmd/.settings/org.eclipse.jdt.core.prefs
index 8995f4d00e9a6841edfa63849de383ea0fefa088..1913b2950e234e853ad0dcb12bb5014f858e9f40 100644
--- a/vipra-cmd/.settings/org.eclipse.jdt.core.prefs
+++ b/vipra-cmd/.settings/org.eclipse.jdt.core.prefs
@@ -1,16 +1,16 @@
 eclipse.preferences.version=1
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
 org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.7
+org.eclipse.jdt.core.compiler.compliance=1.8
 org.eclipse.jdt.core.compiler.debug.lineNumber=generate
 org.eclipse.jdt.core.compiler.debug.localVariable=generate
 org.eclipse.jdt.core.compiler.debug.sourceFile=generate
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
 org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
-org.eclipse.jdt.core.compiler.source=1.7
+org.eclipse.jdt.core.compiler.source=1.8
 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
diff --git a/vipra-cmd/.settings/org.eclipse.wst.common.project.facet.core.xml b/vipra-cmd/.settings/org.eclipse.wst.common.project.facet.core.xml
index 70e9d8a35a5f422ae00c692c08349c1a5469a84b..fd0227a68279180b3dd187cfc58335b8a0914833 100644
--- a/vipra-cmd/.settings/org.eclipse.wst.common.project.facet.core.xml
+++ b/vipra-cmd/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -3,5 +3,5 @@
   <fixed facet="java"/>
   <fixed facet="jst.utility"/>
   <installed facet="jst.utility" version="1.0"/>
-  <installed facet="java" version="1.7"/>
+  <installed facet="java" version="1.8"/>
 </faceted-project>
diff --git a/vipra-cmd/pom.xml b/vipra-cmd/pom.xml
index 9d81925e96b2c8886fc20f3690f20a305ccf6ce8..591333397e2de67d754d220ad6bf14da9457ca98 100644
--- a/vipra-cmd/pom.xml
+++ b/vipra-cmd/pom.xml
@@ -12,8 +12,8 @@
 
 	<properties>
 		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-		<maven.compiler.target>1.7</maven.compiler.target>
-		<maven.compiler.source>1.7</maven.compiler.source>
+		<maven.compiler.target>1.8</maven.compiler.target>
+		<maven.compiler.source>1.8</maven.compiler.source>
 		<log4jVersion>2.4.1</log4jVersion>
 		<luceneVersion>5.4.0</luceneVersion>
 	</properties>
diff --git a/vipra-rest/.classpath b/vipra-rest/.classpath
index 3d2bb26617600d59704c87bd3ac5f184450c98b0..b72ccd2037671de82b5e71abdfd97fa650b68150 100644
--- a/vipra-rest/.classpath
+++ b/vipra-rest/.classpath
@@ -17,15 +17,15 @@
 			<attribute name="org.eclipse.jst.component.dependency" value="/WEB-INF/lib"/>
 		</attributes>
 	</classpathentry>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7">
+	<classpathentry kind="src" output="target/test-classes" path="src/test/java">
 		<attributes>
+			<attribute name="optional" value="true"/>
 			<attribute name="maven.pomderived" value="true"/>
 		</attributes>
 	</classpathentry>
-	<classpathentry kind="src" output="target/test-classes" path="src/test/java">
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
 		<attributes>
-			<attribute name="optional" value="true"/>
-			<attribute name="maven.pomderived" value="true"/>
+			<attribute name="owner.project.facets" value="java"/>
 		</attributes>
 	</classpathentry>
 	<classpathentry kind="output" path="target/classes"/>
diff --git a/vipra-rest/.settings/org.eclipse.jdt.core.prefs b/vipra-rest/.settings/org.eclipse.jdt.core.prefs
index 7677f45f763923b768652ded0a1422b2b83c6d77..c07c252bc5d05edd0375e06b1d52f0a921ae65a0 100644
--- a/vipra-rest/.settings/org.eclipse.jdt.core.prefs
+++ b/vipra-rest/.settings/org.eclipse.jdt.core.prefs
@@ -1,16 +1,16 @@
 eclipse.preferences.version=1
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
 org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.7
+org.eclipse.jdt.core.compiler.compliance=1.8
 org.eclipse.jdt.core.compiler.debug.lineNumber=generate
 org.eclipse.jdt.core.compiler.debug.localVariable=generate
 org.eclipse.jdt.core.compiler.debug.sourceFile=generate
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
 org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
-org.eclipse.jdt.core.compiler.source=1.7
+org.eclipse.jdt.core.compiler.source=1.8
 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
diff --git a/vipra-rest/.settings/org.eclipse.wst.common.project.facet.core.xml b/vipra-rest/.settings/org.eclipse.wst.common.project.facet.core.xml
index 984341746468874acc75524c80a2579ccee81217..d59fb58d14dd57692727e9b2e695dd99cd5929ce 100644
--- a/vipra-rest/.settings/org.eclipse.wst.common.project.facet.core.xml
+++ b/vipra-rest/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -4,5 +4,5 @@
   <installed facet="wst.jsdt.web" version="1.0"/>
   <installed facet="jst.jaxrs" version="2.0"/>
   <installed facet="jst.web" version="3.1"/>
-  <installed facet="java" version="1.7"/>
+  <installed facet="java" version="1.8"/>
 </faceted-project>
diff --git a/vipra-rest/pom.xml b/vipra-rest/pom.xml
index 97251852e16040e9e9c1abfbc37f59ee7ad5f0ca..415ff18fa35cb35bb8c3476dfef36167207fc665 100644
--- a/vipra-rest/pom.xml
+++ b/vipra-rest/pom.xml
@@ -12,8 +12,8 @@
 
 	<properties>
 		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-		<maven.compiler.target>1.7</maven.compiler.target>
-		<maven.compiler.source>1.7</maven.compiler.source>
+		<maven.compiler.target>1.8</maven.compiler.target>
+		<maven.compiler.source>1.8</maven.compiler.source>
 		<jerseyVersion>2.22.1</jerseyVersion>
 		<jettyVersion>9.3.6.v20151106</jettyVersion>
 		<servletVersion>3.1.0</servletVersion>
diff --git a/vipra-rest/src/main/java/de/vipra/rest/PATCH.java b/vipra-rest/src/main/java/de/vipra/rest/PATCH.java
new file mode 100644
index 0000000000000000000000000000000000000000..3003f70fd8a6a604a5ef123adfa1e555854d1702
--- /dev/null
+++ b/vipra-rest/src/main/java/de/vipra/rest/PATCH.java
@@ -0,0 +1,17 @@
+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/ResponseWrapper.java b/vipra-rest/src/main/java/de/vipra/rest/model/Wrapper.java
similarity index 84%
rename from vipra-rest/src/main/java/de/vipra/rest/model/ResponseWrapper.java
rename to vipra-rest/src/main/java/de/vipra/rest/model/Wrapper.java
index 8b0e5a3280006cc41b2762379a56bad76c4f8604..5c43b033c42c976546cf8bce3b43b56836f78021 100644
--- a/vipra-rest/src/main/java/de/vipra/rest/model/ResponseWrapper.java
+++ b/vipra-rest/src/main/java/de/vipra/rest/model/Wrapper.java
@@ -3,19 +3,19 @@ package de.vipra.rest.model;
 import java.util.ArrayList;
 import java.util.List;
 
-public class ResponseWrapper<T> {
+public class Wrapper<T> {
 
 	private T data;
 	private List<APIError> errors;
 	private final APIVersion jsonapi = new APIVersion();
 
-	public ResponseWrapper() {}
+	public Wrapper() {}
 
-	public ResponseWrapper(T data) {
+	public Wrapper(T data) {
 		setData(data);
 	}
 
-	public ResponseWrapper(APIError error) {
+	public Wrapper(APIError error) {
 		addError(error);
 	}
 
diff --git a/vipra-rest/src/main/java/de/vipra/rest/provider/CORSResponseFilter.java b/vipra-rest/src/main/java/de/vipra/rest/provider/CORSResponseFilter.java
index f1a79f215b70121112176002edb25eb24c9274b3..93c6084b63760a9fee2e64462d1948b8ba9ee6d0 100644
--- a/vipra-rest/src/main/java/de/vipra/rest/provider/CORSResponseFilter.java
+++ b/vipra-rest/src/main/java/de/vipra/rest/provider/CORSResponseFilter.java
@@ -24,6 +24,6 @@ public class CORSResponseFilter implements ContainerResponseFilter {
 		response.getHeaders().add("Access-Control-Allow-Origin", "*");
 		response.getHeaders().add("Access-Control-Allow-Headers", "origin, content-type, accept, authorization");
 		response.getHeaders().add("Access-Control-Allow-Credentials", "true");
-		response.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");
+		response.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, PATCH, DELETE, OPTIONS, HEAD");
 	}
 }
\ No newline at end of file
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 be869472cbee97ae09b610466ac1c18e69e68a41..a993eef4839af59d6460fb496b2ecbc2695bd8db 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
@@ -20,8 +20,9 @@ import javax.ws.rs.core.UriInfo;
 
 import de.vipra.rest.APIMediaType;
 import de.vipra.rest.Messages;
+import de.vipra.rest.PATCH;
 import de.vipra.rest.model.APIError;
-import de.vipra.rest.model.ResponseWrapper;
+import de.vipra.rest.model.Wrapper;
 import de.vipra.rest.service.ArticleService;
 import de.vipra.util.Config;
 import de.vipra.util.Mongo;
@@ -49,7 +50,7 @@ public class ArticleResource {
 			@QueryParam("limit") @DefaultValue("0") int limit,
 			@QueryParam("sort") @DefaultValue("date") String sortBy) {
 		List<Article> articles = service.getMultiple(uri.getAbsolutePath(), skip, limit, sortBy);
-		ResponseWrapper<List<Article>> res = new ResponseWrapper<>(articles);
+		Wrapper<List<Article>> res = new Wrapper<>(articles);
 		return Response.ok().entity(res).tag(res.tag()).build();
 	}
 
@@ -58,7 +59,7 @@ public class ArticleResource {
 	@Consumes(APIMediaType.APPLICATION_JSONAPI)
 	@Path("{id}")
 	public Response getArticle(@PathParam("id") String id) {
-		ResponseWrapper<Article> res = new ResponseWrapper<>();
+		Wrapper<Article> res = new Wrapper<>();
 		if (id == null || id.trim().length() == 0) {
 			res.addError(new APIError(Response.Status.BAD_REQUEST, "ID is empty",
 					String.format(Messages.BAD_REQUEST, "id cannot be empty")));
@@ -79,13 +80,13 @@ public class ArticleResource {
 	@Consumes(APIMediaType.APPLICATION_JSONAPI)
 	@Produces(APIMediaType.APPLICATION_JSONAPI)
 	public Response createArticle(Article article) {
-		ResponseWrapper<Article> res;
+		Wrapper<Article> res;
 		try {
 			article = service.createSingle(article);
-			res = new ResponseWrapper<>(article);
+			res = new Wrapper<>(article);
 			return Response.created(article.uri(uri.getAbsolutePath())).entity(res).tag(res.tag()).build();
 		} catch (DatabaseException e) {
-			res = new ResponseWrapper<>(new APIError(Response.Status.INTERNAL_SERVER_ERROR, "item could not be created",
+			res = new Wrapper<>(new APIError(Response.Status.INTERNAL_SERVER_ERROR, "item could not be created",
 					"item could not be created due to an internal server error"));
 			return Response.serverError().entity(res).build();
 		}
@@ -94,12 +95,12 @@ public class ArticleResource {
 	@DELETE
 	@Path("{id}")
 	public Response deleteArticle(@PathParam("id") String id) {
-		ResponseWrapper<Article> res = new ResponseWrapper<>();
+		Wrapper<Article> res = new Wrapper<>();
 		long deleted;
 		try {
 			deleted = service.deleteSingle(id);
 		} catch (DatabaseException e) {
-			res = new ResponseWrapper<>(new APIError(Response.Status.INTERNAL_SERVER_ERROR, "item could not be deleted",
+			res = new Wrapper<>(new APIError(Response.Status.INTERNAL_SERVER_ERROR, "item could not be deleted",
 					"item could not be created due to an internal server error"));
 			return Response.serverError().entity(res).build();
 		}
@@ -120,8 +121,9 @@ public class ArticleResource {
 	@Consumes(APIMediaType.APPLICATION_JSONAPI)
 	@Produces(APIMediaType.APPLICATION_JSONAPI)
 	@Path("{id}")
-	public Response updateArticle(@PathParam("id") String id, Article article) {
-		ResponseWrapper<Article> res = new ResponseWrapper<>();
+	public Response replaceArticle(@PathParam("id") String id, Wrapper<Article> wrapper) {
+		Article article = wrapper.getData();
+		Wrapper<Article> res = new Wrapper<>();
 		try {
 			long updated = service.updateSingle(article);
 			int updatedInt = updated > Integer.MAX_VALUE ? Integer.MAX_VALUE : (int) updated;
@@ -137,10 +139,20 @@ public class ArticleResource {
 				return Response.serverError().build();
 			}
 		} catch (DatabaseException e) {
-			res = new ResponseWrapper<>(new APIError(Response.Status.INTERNAL_SERVER_ERROR, "item could not be updated",
+			res = new Wrapper<>(new APIError(Response.Status.INTERNAL_SERVER_ERROR, "item could not be updated",
 					"item could not be updated due to an internal server error"));
 			return Response.serverError().entity(res).build();
 		}
 	}
 
+	@PATCH
+	@Consumes(APIMediaType.APPLICATION_JSONAPI)
+	@Produces(APIMediaType.APPLICATION_JSONAPI)
+	@Path("{id}")
+	public Response updateArticle(@PathParam("id") String id, Wrapper<Article> wrapper) {
+		Article article = wrapper.getData();
+		// TODO implement
+		return null;
+	}
+
 }
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 028116570f891b4cf103987fb30699eaa770da44..ada3548380e8d43197d8aa57cb6b930bf5f45643 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
@@ -18,8 +18,9 @@ import javax.ws.rs.core.UriInfo;
 
 import de.vipra.rest.APIMediaType;
 import de.vipra.rest.Messages;
+import de.vipra.rest.PATCH;
 import de.vipra.rest.model.APIError;
-import de.vipra.rest.model.ResponseWrapper;
+import de.vipra.rest.model.Wrapper;
 import de.vipra.rest.service.TopicService;
 import de.vipra.util.Config;
 import de.vipra.util.Mongo;
@@ -46,7 +47,7 @@ public class TopicResource {
 	public Response getTopics(@QueryParam("skip") @DefaultValue("0") int skip,
 			@QueryParam("limit") @DefaultValue("0") int limit) {
 		List<Topic> topics = service.getMultiple(uri.getAbsolutePath(), skip, limit, null);
-		ResponseWrapper<List<Topic>> res = new ResponseWrapper<>(topics);
+		Wrapper<List<Topic>> res = new Wrapper<>(topics);
 		return Response.ok().entity(res).tag(res.tag()).build();
 	}
 
@@ -55,7 +56,7 @@ public class TopicResource {
 	@Consumes(APIMediaType.APPLICATION_JSONAPI)
 	@Path("{id}")
 	public Response getTopic(@PathParam("id") String id) {
-		ResponseWrapper<Topic> res = new ResponseWrapper<>();
+		Wrapper<Topic> res = new Wrapper<>();
 		if (id == null || id.trim().length() == 0) {
 			res.addError(new APIError(Response.Status.BAD_REQUEST, "ID is empty",
 					String.format(Messages.BAD_REQUEST, "id cannot be empty")));
@@ -76,8 +77,9 @@ public class TopicResource {
 	@Consumes(APIMediaType.APPLICATION_JSONAPI)
 	@Produces(APIMediaType.APPLICATION_JSONAPI)
 	@Path("{id}")
-	public Response updateTopic(@PathParam("id") String id, Topic topic) {
-		ResponseWrapper<Topic> res = new ResponseWrapper<>();
+	public Response replaceTopic(@PathParam("id") String id, Wrapper<Topic> wrapper) {
+		Topic topic = wrapper.getData();
+		Wrapper<Topic> res = new Wrapper<>();
 		try {
 			long updated = service.updateSingle(topic);
 			int updatedInt = updated > Integer.MAX_VALUE ? Integer.MAX_VALUE : (int) updated;
@@ -93,10 +95,20 @@ public class TopicResource {
 				return Response.serverError().build();
 			}
 		} catch (DatabaseException e) {
-			res = new ResponseWrapper<>(new APIError(Response.Status.INTERNAL_SERVER_ERROR, "item could not be updated",
+			res = new Wrapper<>(new APIError(Response.Status.INTERNAL_SERVER_ERROR, "item could not be updated",
 					"item could not be updated due to an internal server error"));
 			return Response.serverError().entity(res).build();
 		}
 	}
+	
+	@PATCH
+	@Consumes(APIMediaType.APPLICATION_JSONAPI)
+	@Produces(APIMediaType.APPLICATION_JSONAPI)
+	@Path("{id}")
+	public Response updateTopic(@PathParam("id") String id, Wrapper<Topic> wrapper) {
+		Topic topic = wrapper.getData();
+		// TODO implement
+		return null;
+	}
 
 }
diff --git a/vipra-rest/src/main/java/de/vipra/rest/serializer/ArticleSerializer.java b/vipra-rest/src/main/java/de/vipra/rest/serializer/ArticleSerializer.java
index f754208511a0118fffa255b64ab4b7c95d4c0f9e..2c266b9354837bcd5285c41e6127a0d1a16e2a22 100644
--- a/vipra-rest/src/main/java/de/vipra/rest/serializer/ArticleSerializer.java
+++ b/vipra-rest/src/main/java/de/vipra/rest/serializer/ArticleSerializer.java
@@ -15,7 +15,7 @@ public class ArticleSerializer extends JsonSerializer<Article> {
 
 	@Override
 	public void serialize(Article value, JsonGenerator gen, SerializerProvider serializers)
-			throws IOException, JsonProcessingException {
+			throws IOException, JsonProcessingException {		
 		gen.writeStartObject();
 		gen.writeStringField("id", value.getId());
 		gen.writeStringField("type", "article");
diff --git a/vipra-rest/src/main/java/de/vipra/rest/serializer/TopicDeserializer.java b/vipra-rest/src/main/java/de/vipra/rest/serializer/TopicDeserializer.java
index 3e01e6ac61bca23f9a2e5956b24642db67a925d3..cb908e17e9723feaf895ee8c2da7f22df66a5a93 100644
--- a/vipra-rest/src/main/java/de/vipra/rest/serializer/TopicDeserializer.java
+++ b/vipra-rest/src/main/java/de/vipra/rest/serializer/TopicDeserializer.java
@@ -32,7 +32,6 @@ public class TopicDeserializer extends JsonDeserializer<Topic> {
 				if (attrs.has("index"))
 					topic.setIndex(getInt(attrs, "index"));
 				if (attrs.has("words")) {
-					JsonNode wordsNode = attrs.get("words");
 					// TODO implement
 				}
 			}
diff --git a/vipra-ui/app/adapters/application.js b/vipra-ui/app/adapters/application.js
index 701dadac29a043297224620597aa145d32c1a728..0d442b61c170d4fa40db3aae849cc2e0cc783dc3 100644
--- a/vipra-ui/app/adapters/application.js
+++ b/vipra-ui/app/adapters/application.js
@@ -1,6 +1,17 @@
 import DS from 'ember-data';
 
 export default DS.JSONAPIAdapter.extend({
-  host: `http://${window.location.hostname}:8000`,
-  namespace: 'vipra-rest'
+  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/components/topic-link.js b/vipra-ui/app/components/topic-link.js
index 9d31203266a630ba785074786edb3a22371e9f36..b165541920b5bba5ad9cb64e0dc96d2c21093809 100644
--- a/vipra-ui/app/components/topic-link.js
+++ b/vipra-ui/app/components/topic-link.js
@@ -6,11 +6,7 @@ export default Ember.Component.extend({
 
   text: Ember.computed('topic', function() {
     var topic = this.get('topic');
-    var text = topic.name ? topic.name : topic.id;
-    if(topic.hasOwnProperty('count')) {
-      text += ` (${topic.count})`;
-    }
-    return text;
+    return topic.name ? topic.name : topic.id;
   })
 
 });
diff --git a/vipra-ui/app/helpers/topic-share.js b/vipra-ui/app/helpers/topic-share.js
new file mode 100644
index 0000000000000000000000000000000000000000..65c0e9dd5747bc6cda664d6f9dfbe5f87033bb9f
--- /dev/null
+++ b/vipra-ui/app/helpers/topic-share.js
@@ -0,0 +1,7 @@
+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/router.js b/vipra-ui/app/router.js
index 8ba6e2d47afaff7a3a03dcfcfed41fcabbdc8b5d..e856b1103fc1d241fcc738fdd3fbd9c30ecb939b 100644
--- a/vipra-ui/app/router.js
+++ b/vipra-ui/app/router.js
@@ -7,12 +7,12 @@ const Router = Ember.Router.extend({
 
 Router.map(function() {
   this.route('articles', function() {
-    this.route('list', { path: '/' });
     this.route('show', { path: '/:article_id' });
   });
   this.route('topics', function() {
-  	this.route('list', { path: '/' });
-  	this.route('show', { path: '/:topic_id' });
+  	this.route('show', { path: '/:topic_id' }, function() {
+      this.route('edit');
+    });
   });
   this.route('not-found', { path: '/*:' });
 });
diff --git a/vipra-ui/app/routes/articles/list.js b/vipra-ui/app/routes/articles/index.js
similarity index 100%
rename from vipra-ui/app/routes/articles/list.js
rename to vipra-ui/app/routes/articles/index.js
diff --git a/vipra-ui/app/routes/topics/list.js b/vipra-ui/app/routes/topics/index.js
similarity index 84%
rename from vipra-ui/app/routes/topics/list.js
rename to vipra-ui/app/routes/topics/index.js
index 0e1edf569710acb5c60bc7305f443dca29f22353..3d419f443ad90df4c82b79ce87abc09bbe481a77 100644
--- a/vipra-ui/app/routes/topics/list.js
+++ b/vipra-ui/app/routes/topics/index.js
@@ -1,9 +1,9 @@
 import Ember from 'ember';
 
 export default Ember.Route.extend({
-  model() {
+  model(params) {
     return Ember.RSVP.hash({
       topics: this.store.findAll('topic')
-    })
+    });
   }
 });
\ 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
new file mode 100644
index 0000000000000000000000000000000000000000..75fd778b30658a41dbd02a7f32ba958178a4dddb
--- /dev/null
+++ b/vipra-ui/app/routes/topics/show/edit.js
@@ -0,0 +1,10 @@
+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/templates/articles.hbs b/vipra-ui/app/templates/articles.hbs
index c4ddd8803c909fc67c701ac09d62f5819cf07a6c..0eb9f06bf25571584dd42a1eb2509b6e6985ca73 100644
--- a/vipra-ui/app/templates/articles.hbs
+++ b/vipra-ui/app/templates/articles.hbs
@@ -1,6 +1,6 @@
 <h1>Articles</h1>
 {{#link-to 'index'}}Top{{/link-to}}
-{{#link-to 'articles.list'}}All{{/link-to}}
+{{#link-to 'articles'}}All{{/link-to}}
 <hr>
 
 {{outlet}}
\ No newline at end of file
diff --git a/vipra-ui/app/templates/articles/list.hbs b/vipra-ui/app/templates/articles/index.hbs
similarity index 100%
rename from vipra-ui/app/templates/articles/list.hbs
rename to vipra-ui/app/templates/articles/index.hbs
diff --git a/vipra-ui/app/templates/articles/show.hbs b/vipra-ui/app/templates/articles/show.hbs
index 564d86f7b331578e1082e57e89a821f686233e44..9ee5c2bc361cde649cfa35427a519bb54788a600 100644
--- a/vipra-ui/app/templates/articles/show.hbs
+++ b/vipra-ui/app/templates/articles/show.hbs
@@ -12,7 +12,7 @@
 <h3>Topics</h3>
 
 {{#each model.article.topics as |topic|}}
-  {{topic-link topic=topic}}
+  {{#topic-link topic=topic}} ({{topic-share topic.count model.article.stats.wordCount}}%){{/topic-link}}
 {{/each}}
 
 <h3>Statistics</h3>
diff --git a/vipra-ui/app/templates/components/topic-link.hbs b/vipra-ui/app/templates/components/topic-link.hbs
index 69c3ccb06acf50d57cf09f92b47e23354236b400..1ba3c2c7cb12c1ce0c3a9c502f2e7f6077d7536e 100644
--- a/vipra-ui/app/templates/components/topic-link.hbs
+++ b/vipra-ui/app/templates/components/topic-link.hbs
@@ -1 +1 @@
-{{#link-to 'topics.show' topic.id}}{{text}}{{/link-to}}
\ No newline at end of file
+{{#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
index 3d941a81a2bfea16957c6bd216087f15965630ed..e0aaedcbe2d94fc3a581d4c30c193f4d3c7ca7ff 100644
--- a/vipra-ui/app/templates/index.hbs
+++ b/vipra-ui/app/templates/index.hbs
@@ -1,5 +1,5 @@
 <h1>Vipra</h1>
 
-{{#link-to 'articles.list'}}Articles{{/link-to}}
+{{#link-to 'articles'}}Articles{{/link-to}}
 
-{{#link-to 'topics.list'}}Topics{{/link-to}}
\ No newline at end of file
+{{#link-to 'topics'}}Topics{{/link-to}}
\ No newline at end of file
diff --git a/vipra-ui/app/templates/topics.hbs b/vipra-ui/app/templates/topics.hbs
index 3da2b0f7f70e3b9551d248f2839177405469ab0f..9ae6d0517b2055c8d3babf6e5b0391fc132f4858 100644
--- a/vipra-ui/app/templates/topics.hbs
+++ b/vipra-ui/app/templates/topics.hbs
@@ -1,6 +1,6 @@
 <h1>Topics</h1>
 {{#link-to 'index'}}Top{{/link-to}}
-{{#link-to 'topics.list'}}All{{/link-to}}
+{{#link-to 'topics'}}All{{/link-to}}
 <hr>
 
 {{outlet}}
\ No newline at end of file
diff --git a/vipra-ui/app/templates/topics/list.hbs b/vipra-ui/app/templates/topics/index.hbs
similarity index 100%
rename from vipra-ui/app/templates/topics/list.hbs
rename to vipra-ui/app/templates/topics/index.hbs
diff --git a/vipra-ui/app/templates/topics/show/edit.hbs b/vipra-ui/app/templates/topics/show/edit.hbs
new file mode 100644
index 0000000000000000000000000000000000000000..86d634803a9ea9b7a7e0f6c036ff23130c176c91
--- /dev/null
+++ b/vipra-ui/app/templates/topics/show/edit.hbs
@@ -0,0 +1,9 @@
+{{#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.hbs b/vipra-ui/app/templates/topics/show/index.hbs
similarity index 80%
rename from vipra-ui/app/templates/topics/show.hbs
rename to vipra-ui/app/templates/topics/show/index.hbs
index d36b7e1b2ef6a4d2b4679188e761124afe016754..0a8dcf51f60d093085587ee44c815954a09f5d6f 100644
--- a/vipra-ui/app/templates/topics/show.hbs
+++ b/vipra-ui/app/templates/topics/show/index.hbs
@@ -1,3 +1,5 @@
+{{#link-to 'topics.show.edit'}}Edit{{/link-to}}
+
 <h2>{{model.topic._name}}</h2>
 
 <h3>Words</h3>
diff --git a/vipra-ui/tests/unit/helpers/topic-share-test.js b/vipra-ui/tests/unit/helpers/topic-share-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..a7e8b95a4987d5e44c71e51d86f56513210c3479
--- /dev/null
+++ b/vipra-ui/tests/unit/helpers/topic-share-test.js
@@ -0,0 +1,10 @@
+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-util/.classpath b/vipra-util/.classpath
index f0cbe96b457b57ffa31e74d3c0f87d16bb366423..cf6dc8577b7a1ef815c8060b30722361a43c9e05 100644
--- a/vipra-util/.classpath
+++ b/vipra-util/.classpath
@@ -12,10 +12,16 @@
 			<attribute name="org.eclipse.jst.component.nondependency" value=""/>
 		</attributes>
 	</classpathentry>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7">
+	<classpathentry kind="src" output="target/test-classes" path="src/test/java">
 		<attributes>
+			<attribute name="optional" value="true"/>
 			<attribute name="maven.pomderived" value="true"/>
 		</attributes>
 	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
+		<attributes>
+			<attribute name="owner.project.facets" value="java"/>
+		</attributes>
+	</classpathentry>
 	<classpathentry kind="output" path="target/classes"/>
 </classpath>
diff --git a/vipra-util/.settings/org.eclipse.jdt.core.prefs b/vipra-util/.settings/org.eclipse.jdt.core.prefs
index dad9ba744c62155e74fd7c03364f031f47fe4d70..52003d93b882e0735573b1ca1241484bf74cfb2f 100644
--- a/vipra-util/.settings/org.eclipse.jdt.core.prefs
+++ b/vipra-util/.settings/org.eclipse.jdt.core.prefs
@@ -1,15 +1,15 @@
 eclipse.preferences.version=1
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.7
+org.eclipse.jdt.core.compiler.compliance=1.8
 org.eclipse.jdt.core.compiler.debug.lineNumber=generate
 org.eclipse.jdt.core.compiler.debug.localVariable=generate
 org.eclipse.jdt.core.compiler.debug.sourceFile=generate
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
 org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
-org.eclipse.jdt.core.compiler.source=1.7
+org.eclipse.jdt.core.compiler.source=1.8
 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
diff --git a/vipra-util/.settings/org.eclipse.wst.common.project.facet.core.xml b/vipra-util/.settings/org.eclipse.wst.common.project.facet.core.xml
index e4a5a385a27fe00926c9c4f46d697547f5e5f783..78e8ebb782bd149152a876e5c227156f0192bd2a 100644
--- a/vipra-util/.settings/org.eclipse.wst.common.project.facet.core.xml
+++ b/vipra-util/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -3,5 +3,5 @@
   <fixed facet="jst.utility"/>
   <fixed facet="java"/>
   <installed facet="jst.utility" version="1.0"/>
-  <installed facet="java" version="1.7"/>
+  <installed facet="java" version="1.8"/>
 </faceted-project>
diff --git a/vipra-util/pom.xml b/vipra-util/pom.xml
index 47b1f9f9e1f4962219eef5f6adab2e663e2ec43b..515e97df12b1b03388212b06d14bb94a8b53ad4b 100644
--- a/vipra-util/pom.xml
+++ b/vipra-util/pom.xml
@@ -8,8 +8,8 @@
 
 	<properties>
 		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-		<maven.compiler.target>1.7</maven.compiler.target>
-		<maven.compiler.source>1.7</maven.compiler.source>
+		<maven.compiler.target>1.8</maven.compiler.target>
+		<maven.compiler.source>1.8</maven.compiler.source>
 		<log4jVersion>2.4.1</log4jVersion>
 	</properties>