diff --git a/src/index.js b/src/index.js
index 6eebb1b6471cdcd4bed562154999c84545d306b6..741874cb573ded58cb6b090790b4b964d56a9c67 100644
--- a/src/index.js
+++ b/src/index.js
@@ -8,9 +8,8 @@ import EventTable from './events/table';
 import EventItem from './events/item';
 import eventDraft from './events/eventDraft';
 import eventWithExport from './events/eventWithExport';
-import newJob from './jobs/newJob';
-import jobTable from './jobs/jobTable';
-import jobModal from './jobs/jobModal';
+import JobTable from './jobs/table';
+import JobItem from './jobs/item';
 import Layout from './layout';
 import './style';
 
@@ -39,10 +38,9 @@ m.route(root, '/users', {
   '/groups/:id': layoutWith(GroupItem),
   '/newgroup': layoutWith(GroupItem),
   '/oauthcallback': OauthRedirect,
-  '/joboffers': layoutWith(jobTable),
-  '/newjoboffer': layoutWith(newJob),
-  '/joboffers/:id': layoutWith(jobModal),
-  // '/announce': layoutWith(AnnounceTool),
+  '/joboffers': layoutWith(JobTable),
+  '/newjoboffer': layoutWith(JobItem),
+  '/joboffers/:id': layoutWith(JobItem),
 });
 
 m.route.prefix('');
diff --git a/src/jobs/editJob.js b/src/jobs/editJob.js
new file mode 100644
index 0000000000000000000000000000000000000000..5319f263a6fb4c2751580f128ac644c61aea16cc
--- /dev/null
+++ b/src/jobs/editJob.js
@@ -0,0 +1,14 @@
+import m from 'mithril';
+import EditView from '../views/editView';
+
+
+export default class newJob extends EditView {
+  view() {
+    return this.layout([
+      m('h3', 'Add a New Job Offer'),
+      ...this.renderPage({
+        title_de: { type: 'text', label: 'German Title' },
+      }),
+    ]);
+  }
+}
diff --git a/src/jobs/item.js b/src/jobs/item.js
new file mode 100644
index 0000000000000000000000000000000000000000..7c78df7e9911486bf813a3445c811e3ef16a66b3
--- /dev/null
+++ b/src/jobs/item.js
@@ -0,0 +1,16 @@
+import m from 'mithril';
+import viewJob from './viewJob';
+import editJob from './editJob';
+import ItemController from '../itemcontroller';
+
+export default class jobModal {
+  constructor() {
+    this.controller = new ItemController('joboffers');
+  }
+
+  view() {
+    if (!this.controller || !this.controller.data) return '';
+    if (this.controller.modus !== 'view') return m(editJob, { controller: this.controller });
+    return m(viewJob, { controller: this.controller });
+  }
+}
diff --git a/src/jobs/jobModal.js b/src/jobs/jobModal.js
deleted file mode 100644
index cae1e55146afeb80aeb29677b867ea33fec64593..0000000000000000000000000000000000000000
--- a/src/jobs/jobModal.js
+++ /dev/null
@@ -1,16 +0,0 @@
-import m from 'mithril';
-import viewJob from './viewJob';
-import newJob from './newJob';
-
-export default class jobModal {
-  constructor() {
-    this.edit = false;
-  }
-
-  view() {
-    if (this.edit) {
-      return m(newJob);
-    }
-    return m(viewJob, { onEdit: () => { this.edit = true; } });
-  }
-}
diff --git a/src/jobs/newJob.js b/src/jobs/newJob.js
deleted file mode 100644
index fad8748ac9e9809c3ca5b7e74427d74e35a26a5b..0000000000000000000000000000000000000000
--- a/src/jobs/newJob.js
+++ /dev/null
@@ -1,29 +0,0 @@
-import m from 'mithril';
-import { RaisedButton } from 'polythene-mithril';
-import { EditView } from '../views/editView';
-
-
-export default class newJob extends EditView {
-  constructor(vnode) {
-    super(vnode, 'joboffers', {});
-  }
-
-  view() {
-    const submitButton = m(RaisedButton, {
-      disabled: !this.valid,
-      label: 'Submit',
-      events: {
-        onclick: () => { this.submit(); },
-      },
-    });
-
-    return m('div.maincontainer', [
-      m('h3', 'Add a New Job Offer'),
-      ...this.renderPage({
-        title_de: { type: 'text', label: 'German Title' },
-      }),
-      m('br'),
-      submitButton,
-    ]);
-  }
-}
diff --git a/src/jobs/jobTable.js b/src/jobs/table.js
similarity index 95%
rename from src/jobs/jobTable.js
rename to src/jobs/table.js
index 1e53dbf026304d6faa5ec2b38006d0654c8f3eba..2e83095838a965f696cc4ccd66820c069f38d9b4 100644
--- a/src/jobs/jobTable.js
+++ b/src/jobs/table.js
@@ -34,7 +34,7 @@ export default class JobTable {
         { text: 'Company', width: '21em' },
         { text: 'End', width: '9em' },
       ],
-      onAdd: () => { m.route.set('/newjob'); },
+      onAdd: () => { m.route.set('/newjoboffer'); },
     });
   }
 }
diff --git a/src/jobs/viewJob.js b/src/jobs/viewJob.js
index 5c26979d51af4bc722e8773cd8617cb0d61aa032..e3ca5b0fd6c11cc842df3a0d9920a3505ff2be66 100644
--- a/src/jobs/viewJob.js
+++ b/src/jobs/viewJob.js
@@ -1,39 +1,9 @@
 import m from 'mithril';
-import { RaisedButton } from 'polythene-mithril';
-import { styler } from 'polythene-core-css';
 import { apiUrl } from 'networkConfig';
 import ItemView from '../views/itemView';
 import { dateFormatter } from '../utils';
 import { Property } from '../views/elements';
 
-const viewLayout = [
-  {
-    '.propertyLangIndicator': {
-      width: '30px',
-      height: '20px',
-      float: 'left',
-      'background-color': 'rgb(031,045,084)',
-      'border-radius': '10px',
-      'text-align': 'center',
-      'line-height': '20px',
-      color: 'rgb(255,255,255)',
-      'margin-right': '10px',
-      'font-size': '11px',
-    },
-    '.jobViewLeft': {
-      'grid-column': 1,
-    },
-    '.jobViewRight': {
-      'grid-column': 2,
-    },
-    '.jobViewRight h4': {
-      'margin-top': '0px',
-    },
-  },
-];
-styler.add('jobView', viewLayout);
-
-
 // small helper class to display both German and English content together, dependent
 // on which content is available.
 class DuoLangProperty {
@@ -56,18 +26,8 @@ class DuoLangProperty {
 }
 
 export default class viewJob extends ItemView {
-  constructor() {
-    super('joboffers');
-  }
-
-  view({ attrs: { onEdit } }) {
-    if (!this.data) return '';
-
-    return m('div', {
-      style: { height: '100%', 'overflow-y': 'scroll', padding: '10px' },
-    }, [
-      m(RaisedButton, { label: 'Edit Joboffer', events: { onclick: onEdit } }),
-      // this div is the title line
+  view() {
+    return this.layout([
       m('div', [
         // company logo if existing
         this.data.img_thumbnail ? m('img', {