From d6eca7d10323d5beb8425c5f2c5b2a79e01334c8 Mon Sep 17 00:00:00 2001
From: Eike Cochu <eike@cochu.com>
Date: Tue, 12 Jan 2016 23:14:59 +0100
Subject: [PATCH] updated projects to java 1.8

added patch method + empty method stubs
added example topic editing (not completely working)
changed ui template structure and routes for more nesting
---
 jgibblda/.classpath                           |  16 +-
 jgibblda/.project                             |   4 +-
 .../org.eclipse.core.resources.prefs          |   1 +
 jgibblda/.settings/org.eclipse.jdt.core.prefs |   7 +-
 ....eclipse.wst.common.project.facet.core.xml |   2 +-
 .../org.eclipse.wst.validation.prefs          |   2 +
 jgibblda/pom.xml                              |   4 +-
 ma-impl.sublime-workspace                     | 217 +++---------------
 vipra-cmd/.classpath                          |  12 +-
 .../.settings/org.eclipse.jdt.core.prefs      |   6 +-
 ....eclipse.wst.common.project.facet.core.xml |   2 +-
 vipra-cmd/pom.xml                             |   4 +-
 vipra-rest/.classpath                         |   8 +-
 .../.settings/org.eclipse.jdt.core.prefs      |   6 +-
 ....eclipse.wst.common.project.facet.core.xml |   2 +-
 vipra-rest/pom.xml                            |   4 +-
 .../src/main/java/de/vipra/rest/PATCH.java    |  17 ++
 .../{ResponseWrapper.java => Wrapper.java}    |   8 +-
 .../rest/provider/CORSResponseFilter.java     |   2 +-
 .../vipra/rest/resource/ArticleResource.java  |  34 ++-
 .../de/vipra/rest/resource/TopicResource.java |  24 +-
 .../rest/serializer/ArticleSerializer.java    |   2 +-
 .../rest/serializer/TopicDeserializer.java    |   1 -
 vipra-ui/app/adapters/application.js          |  15 +-
 vipra-ui/app/components/topic-link.js         |   6 +-
 vipra-ui/app/helpers/topic-share.js           |   7 +
 vipra-ui/app/router.js                        |   6 +-
 .../app/routes/articles/{list.js => index.js} |   0
 .../app/routes/topics/{list.js => index.js}   |   4 +-
 vipra-ui/app/routes/topics/show/edit.js       |  10 +
 vipra-ui/app/templates/articles.hbs           |   2 +-
 .../articles/{list.hbs => index.hbs}          |   0
 vipra-ui/app/templates/articles/show.hbs      |   2 +-
 .../app/templates/components/topic-link.hbs   |   2 +-
 vipra-ui/app/templates/index.hbs              |   4 +-
 vipra-ui/app/templates/topics.hbs             |   2 +-
 .../templates/topics/{list.hbs => index.hbs}  |   0
 vipra-ui/app/templates/topics/show/edit.hbs   |   9 +
 .../topics/{show.hbs => show/index.hbs}       |   2 +
 .../tests/unit/helpers/topic-share-test.js    |  10 +
 vipra-util/.classpath                         |   8 +-
 .../.settings/org.eclipse.jdt.core.prefs      |   6 +-
 ....eclipse.wst.common.project.facet.core.xml |   2 +-
 vipra-util/pom.xml                            |   4 +-
 44 files changed, 227 insertions(+), 259 deletions(-)
 create mode 100644 jgibblda/.settings/org.eclipse.wst.validation.prefs
 create mode 100644 vipra-rest/src/main/java/de/vipra/rest/PATCH.java
 rename vipra-rest/src/main/java/de/vipra/rest/model/{ResponseWrapper.java => Wrapper.java} (84%)
 create mode 100644 vipra-ui/app/helpers/topic-share.js
 rename vipra-ui/app/routes/articles/{list.js => index.js} (100%)
 rename vipra-ui/app/routes/topics/{list.js => index.js} (84%)
 create mode 100644 vipra-ui/app/routes/topics/show/edit.js
 rename vipra-ui/app/templates/articles/{list.hbs => index.hbs} (100%)
 rename vipra-ui/app/templates/topics/{list.hbs => index.hbs} (100%)
 create mode 100644 vipra-ui/app/templates/topics/show/edit.hbs
 rename vipra-ui/app/templates/topics/{show.hbs => show/index.hbs} (80%)
 create mode 100644 vipra-ui/tests/unit/helpers/topic-share-test.js

diff --git a/jgibblda/.classpath b/jgibblda/.classpath
index c87e70ad..cf6dc857 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 aa328358..9686b2ae 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 99f26c02..e9441bb1 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 92f80423..1913b295 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 70e9d8a3..fd0227a6 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 00000000..04cad8cb
--- /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 52b1475e..ba0e1587 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 5297a4a5..2ad0d78b 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 959f104c..32530dec 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 8995f4d0..1913b295 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 70e9d8a3..fd0227a6 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 9d81925e..59133339 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 3d2bb266..b72ccd20 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 7677f45f..c07c252b 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 98434174..d59fb58d 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 97251852..415ff18f 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 00000000..3003f70f
--- /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 8b0e5a32..5c43b033 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 f1a79f21..93c6084b 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 be869472..a993eef4 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 02811657..ada35483 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 f7542085..2c266b93 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 3e01e6ac..cb908e17 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 701dadac..0d442b61 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 9d312032..b1655419 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 00000000..65c0e9dd
--- /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 8ba6e2d4..e856b110 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 0e1edf56..3d419f44 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 00000000..75fd778b
--- /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 c4ddd880..0eb9f06b 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 564d86f7..9ee5c2bc 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 69c3ccb0..1ba3c2c7 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 3d941a81..e0aaedcb 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 3da2b0f7..9ae6d051 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 00000000..86d63480
--- /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 d36b7e1b..0a8dcf51 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 00000000..a7e8b95a
--- /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 f0cbe96b..cf6dc857 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 dad9ba74..52003d93 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 e4a5a385..78e8ebb7 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 47b1f9f9..515e97df 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>
 
-- 
GitLab