diff --git a/src/index.js b/src/index.js
index 736201fb247ea49ae7dd6d989b920de1ba812e14..6eebb1b6471cdcd4bed562154999c84545d306b6 100644
--- a/src/index.js
+++ b/src/index.js
@@ -2,7 +2,7 @@ import m from 'mithril';
 import { OauthRedirect } from './auth';
 import GroupList from './groups/list';
 import GroupItem from './groups/item';
-import { UserModal, UserTable, NewUser } from './users/userTool';
+import { UserItem, UserTable } from './users/userTool';
 import { MembershipView } from './membershipTool';
 import EventTable from './events/table';
 import EventItem from './events/item';
@@ -27,8 +27,8 @@ function layoutWith(view) {
 m.route.prefix('');
 m.route(root, '/users', {
   '/users': layoutWith(UserTable),
-  '/users/:id': layoutWith(UserModal),
-  '/newuser': layoutWith(NewUser),
+  '/users/:id': layoutWith(UserItem),
+  '/newuser': layoutWith(UserItem),
   '/groupmemberships/:id': layoutWith(MembershipView),
   '/events': layoutWith(EventTable),
   '/events/:id': layoutWith(EventItem),
diff --git a/src/users/editUser.js b/src/users/editUser.js
index 46e1bc1588709b741f613b10feaef56b4de03308..7f2587cd3ea8302954ca2737f4e60163c139652f 100644
--- a/src/users/editUser.js
+++ b/src/users/editUser.js
@@ -1,24 +1,11 @@
 import m from 'mithril';
-import { RaisedButton, RadioGroup } from 'polythene-mithril';
-import { EditView } from '../views/editView';
+import { RadioGroup } from 'polythene-mithril';
+import EditView from '../views/editView';
 
 
 export default class UserEdit extends EditView {
-  constructor(vnode) {
-    super(vnode, 'users', {});
-  }
-
   view() {
-    // do not render anything if there is no data yet
-    if (!this.data) return m.trust('');
-
-    const submitButton = m(RaisedButton, {
-      disabled: !this.valid,
-      label: 'Submit',
-      events: { onclick: () => { this.submit(); } },
-    });
-
-    return m('form', [
+    return this.layout([
       ...this.renderPage({
         lastname: { type: 'text', label: 'Last Name' },
         firstname: { type: 'text', label: 'First Name' },
@@ -63,7 +50,6 @@ export default class UserEdit extends EditView {
         ],
         onChange: ({ value }) => { this.data.department = value; },
       }),
-      submitButton,
     ]);
   }
 }
diff --git a/src/users/userTool.js b/src/users/userTool.js
index da312a375f04a5dc9795fa6b069dfbc190d976a4..c4c92128789c92c899af1210b2a8813b829190cb 100644
--- a/src/users/userTool.js
+++ b/src/users/userTool.js
@@ -1,38 +1,20 @@
 import m from 'mithril';
-import UserEdit from './editUser';
-import UserView from './viewUser';
+import EditUser from './editUser';
+import ViewUser from './viewUser';
 import TableView from '../views/tableView';
 import { users as config } from '../resourceConfig.json';
 import DatalistController from '../listcontroller';
+import ItemController from '../itemcontroller'
 
-export class NewUser extends UserEdit {
-  constructor(vnode) {
-    super(vnode);
-    this.data = {
-      membership: 'regular',
-    };
-    this.valid = false;
-
-    // if the creation is finished, UI should switch to new User
-    this.callback = (response) => { m.route.set(`/users/${response.data._id}`); };
-  }
-}
-
-export class UserModal {
+export class UserItem {
   constructor() {
-    this.edit = false;
+    this.controller = new ItemController('users');
   }
 
   view() {
-    if (this.edit) {
-      return m(UserEdit, { onfinish: () => { this.edit = false; m.redraw(); } });
-    }
-    // else
-    return m('div', [
-      m('div.btn.btn-default', { onclick: () => { this.edit = true; } }, 'Edit'),
-      m('br'),
-      m(UserView),
-    ]);
+    if (!this.controller || !this.controller.data) return '';
+    if (this.controller.modus !== 'view') return m(EditUser, { controller: this.controller });
+    return m(ViewUser, { controller: this.controller });
   }
 }
 
diff --git a/src/users/viewUser.js b/src/users/viewUser.js
index f8ca87e325798c057c976f020a0da29467ec4620..dbb99a6f32815e5910e13dde8071af2279edea6e 100644
--- a/src/users/viewUser.js
+++ b/src/users/viewUser.js
@@ -6,8 +6,8 @@ import { users as config } from '../resourceConfig.json';
 import DatalistController from '../listcontroller';
 
 export default class UserView extends ItemView {
-  constructor() {
-    super('users');
+  constructor(vnode) {
+    super(vnode);
     // a controller to handle the groupmemberships of this user
     this.groupmemberships = new DatalistController('groupmemberships', {
       where: { user: this.id },
@@ -34,17 +34,10 @@ export default class UserView extends ItemView {
   }
 
   oninit() {
-    this.handler.getItem(this.id, this.embedded).then((item) => {
-      this.data = item;
-      m.redraw();
-    });
     this.groupmemberships.refresh();
   }
 
   view() {
-    // do not render anything if there is no data yet
-    if (!this.data) return m.trust('');
-
     let membershipBadge = m('span.label.label-important', 'No Member');
     if (this.data.membership === 'regular') {
       membershipBadge = m('span.label.label-success', 'Member');
@@ -73,7 +66,7 @@ export default class UserView extends ItemView {
       },
     });
 
-    return m('div', [
+    return this.layout([
       m('h1', `${this.data.firstname} ${this.data.lastname}`),
       membershipBadge,
       m('table', detailKeys.map(key => m('tr', [