diff --git a/src/views/elements.js b/src/views/elements.js
new file mode 100644
index 0000000000000000000000000000000000000000..09bf019df721de2d80a717f43a33d6745ffa10f7
--- /dev/null
+++ b/src/views/elements.js
@@ -0,0 +1,51 @@
+export class inputGroup {
+  constructor(vnode) {
+    // Link the error-getting function from the binding
+    this.getErrors = () => [];
+    if (vnode.attrs.getErrors) {
+      this.getErrors = vnode.attrs.getErrors;
+    }
+  }
+
+  view(vnode) {
+    // set display-settings accoridng to error-state
+    let errorField = null;
+    let groupClasses = vnode.attrs.classes ? vnode.attrs.classes : '';
+    const errors = this.getErrors();
+    if (errors.length > 0) {
+      errorField = m('span.help-block', `Error: ${errors.join(', ')}`);
+      groupClasses += ' has-error';
+    }
+
+    return m('div.form-group', { class: groupClasses }, [
+      m(`label[for=${vnode.attrs.name}]`, vnode.attrs.title),
+      m(`input[name=${vnode.attrs.name}][id=${vnode.attrs.name}].form-control`, {
+        value: vnode.attrs.value, onchange: vnode.attrs.onchange,
+      }),
+      errorField,
+    ]);
+  }
+}
+
+export class selectGroup {
+  view(vnode) {
+    return m('div.form-group', { class: vnode.attrs.classes }, [
+      m(`label[for=${vnode.attrs.name}]`, vnode.attrs.title),
+      m(
+        `select[name=${vnode.attrs.name}][id=${vnode.attrs.name}].form-control`,
+        { value: vnode.attrs.value, onchange: vnode.attrs.onchange },
+        vnode.attrs.options.map(option => m('option', option)),
+      ),
+    ]);
+  }
+}
+
+export class submitButton {
+  view(vnode) {
+    const args = vnode.attrs.args;
+    if (!vnode.attrs.active) {
+      args.disabled = 'disabled';
+    }
+    return m('div.btn', args, vnode.attrs.text);
+  }
+}
diff --git a/src/views/selectList.js b/src/views/selectList.js
index 07c42dd1a03fefcdea66588ff283dff148b64a68..bbb56c1245ef43fa4a7ec38090584e0a2cf40f18 100644
--- a/src/views/selectList.js
+++ b/src/views/selectList.js
@@ -1,4 +1,5 @@
 import TableView from './tableView';
+import { submitButton } from './elements';
 
 const m = require('mithril');
 
@@ -24,11 +25,19 @@ function debounce(func, wait, immediate) {
 };
 
 export default class SelectList extends TableView {
-  constructor(resource, searchKeys, itemView) {
+  constructor({
+    attrs: {
+      resource,
+      searchKeys,
+      itemView,
+      onSubmit = () => {},
+    },
+  }) {
     super({ attrs: { resource, keys: searchKeys } });
     this.itemView = itemView;
     this.selected = null;
     this.showList = false;
+    this.onSubmit = onSubmit;
   }
 
   view() {
@@ -66,7 +75,19 @@ export default class SelectList extends TableView {
 
     return m('div', {
     }, [
-      m('div.row', m('div.col-xs-6', input)),
+      m('div.row', [
+        m('div.col-xs-6', [
+          input,
+          m(submitButton, {
+            text: 'Submit',
+            active: this.selected !== null,
+            args: {
+              class: 'btn-primary',
+              onclick: () => { this.onSubmit(this.selected); },
+            },
+          }),
+        ]),
+      ]),
       this.showList ? list : '',
     ]);
   }