diff --git a/admin/index.html b/admin/index.html
index c98b5a9528af06d04e1bbf7b2b9433ec7935f380..f19fe0c12871efc80e5e687086b5b9fc5bf26719 100644
--- a/admin/index.html
+++ b/admin/index.html
@@ -106,21 +106,11 @@
 					<img height="40" style="margin: 5px;" src="res/logo/wheel.svg" id="wheel-logo" class="smooth" alt="Loading Wheel">
 				</div>
 
-				<ul class="nav navbar-nav navbar-left cust-menu">
+				<ul class="nav navbar-nav navbar-left cust-menu pull-left">
 				</ul>
 
-				<ul class="nav navbar-nav navbar-right">
-					<li class="dropdown">
-						<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
-							<span class="glyphicon glyphicon-user" aria-hidden="true"></span>
-							<span class="caret"></span>
-						</a>
-						<ul class="dropdown-menu">
-							<li><a href="#settings"><span class="glyphicon glyphicon-wrench" aria-hidden="true"></span> Settings</a></li>
-							<li role="separator" class="divider"></li>
-							<li><a href="#" class="logoutAction"><span class="glyphicon glyphicon-off" aria-hidden="true"></span> Logout</a></li>
-						</ul>
-					</li>
+				<ul class="nav navbar-nav navbar-right pull-right">
+					<li><a href="#" class="logoutAction"><span class="glyphicon glyphicon-off" aria-hidden="true"></span></a></li>
 				</ul>
 			</div>
 		</nav>
diff --git a/admin/lib/amiv/amivcore.js b/admin/lib/amiv/amivcore.js
index 7d1a209abb531051b8ef4593607266401993f2b7..6509256212a1823056dec1f2dab5a19b731b08e3 100644
--- a/admin/lib/amiv/amivcore.js
+++ b/admin/lib/amiv/amivcore.js
@@ -1,303 +1,311 @@
 (function(window) {
-  'use strict';
-  // Library NameSpace
-  var lns = 'amivcore'
+    'use strict';
+    // Library NameSpace
+    var lns = 'amivcore'
 
-  function libgen() {
-    // Lib to returned
-    var lib = {};
-		
-		// Core
-    var core = {
-	    // Important vars n' stuff
-	    lib: {
-	      api_url: 'https://amiv-apidev.vsos.ethz.ch',
-	      spec_url: 'lib/amiv/spec.json',
-	      authenticated: false,
-	      ready: false,
-	      req_time_out: 5000,
-	      on_interval: 100,
-	      show_errors: false,
-	    },
-	    // Header Setup
-	    header: {
-				req:{
-					'get': ['Content-Type','Authorization'],
-					'post': ['Content-Type','Authorization'],
-					'put': ['Content-Type','Authorization','If-Match'],
-					'patch': ['Content-Type','Authorization','If-Match'],
-					'delete': ['Content-Type','Authorization','If-Match'],
-				},
-				make: {
-					'Content-Type': function(){
-						return 'application/json'
-					},
-					'Authorization': function(){
-						if(get('cur_token') != null)
-							return 'Basic ' + btoa(get('cur_token') + ':');
-						return '';
-					},
-					'If-Match': function(){
-						return null;
-					}
-				}		    
-	    }
-	  }
-    
-    // Utility empty function for no callback
-    function dummy(){};
-		
-		//Save and get into localStorage
-    function set(cname, cvalue, exdays) {
-      window.localStorage.setItem('glob-'+cname, cvalue);
-    }
-    function get(cname) {
-      return window.localStorage.getItem('glob-'+cname);
-    }
+    function libgen() {
+        // Lib to returned
+        var lib = {};
 
-		// Make Request
-    function req(attr, callback) {
-      callback = callback || function(msg) {
-        console.log(msg);
-      };
-      $.ajax({
-        url: core.lib.api_url + attr.path,
-        data: attr.data,
-        method: attr.method,
-        dataType: 'json',
-        timeout: core.lib.req_time_out,
-        headers: attr.headers,
-        error: function(res) {
-          if (core.lib.show_errors) console.log(res);
-          callback(res);
-        },
-      }).done(function(res){
-	      callback(res);
-      });
-    }
-    
-    function makeFunc(domain, m) {
-      return function(attr, callback) {
-        attr = attr || {};
-        var curLib = {}
-        for (var curAttr in attr['data'])
-          curLib[curAttr] = attr['data'][curAttr];
+        // Core
+        var core = {
+            // Important vars n' stuff
+            lib: {
+                api_url: 'https://amiv-apidev.vsos.ethz.ch',
+                //api_url: 'https://nicco.io/amiv',
+                spec_url: 'lib/amiv/spec.json',
+                //spec_url: 'https://nicco.io/amiv/docs/spec.json',
+                authenticated: false,
+                ready: false,
+                req_time_out: 5000,
+                on_interval: 100,
+                auth_interval: 5000,
+                auth_allowed_fails: 5,
+                auth_fails: 0,
+                show_errors: false,
+            },
+            // Header Setup
+            header: {
+                req: {
+                    'get': ['Content-Type', 'Authorization'],
+                    'post': ['Content-Type', 'Authorization'],
+                    'put': ['Content-Type', 'Authorization', 'If-Match'],
+                    'patch': ['Content-Type', 'Authorization', 'If-Match'],
+                    'delete': ['Content-Type', 'Authorization', 'If-Match'],
+                },
+                make: {
+                    'Content-Type': function() {
+                        return 'application/json'
+                    },
+                    'Authorization': function() {
+                        if (get('cur_token') != null)
+                            return 'Basic ' + btoa(get('cur_token') + ':');
+                        return '';
+                    },
+                    'If-Match': function() {
+                        return null;
+                    }
+                }
+            }
+        }
 
-        var hdr = {};
-        for (var curHdr in attr['header'])
-          hdr[curHdr] = attr['header'][curHdr];
+        // Utility empty function for no callback
+        function dummy() {};
 
-        var curPath = '/' + domain;
-        var curLink = curPath;
-        if (attr['id'] != undefined) {
-          curPath += '/' + attr['id'];
-          curLink += '/{_id}';
+        //Save and get into localStorage
+        function set(cname, cvalue, exdays) {
+            window.localStorage.setItem('glob-' + cname, cvalue);
         }
 
-        if (get('cur_token') != null)
-          hdr['Authorization'] = 'Basic ' + btoa(get('cur_token') + ':');
+        function get(cname) {
+            return window.localStorage.getItem('glob-' + cname);
+        }
 
-        if (m != 'GET') {
-          if (m == 'POST' || m == 'PUT')
-            for (var param in lib[domain]['methods'][m][curLink]['params'])
-              if (lib[domain]['methods'][m][curLink]['params'][param]['required'] == true)
-                if (curLib[lib[domain]['methods'][m][curLink]['params'][param]['name']] == undefined)
-                  return 'Error: Missing ' + lib[domain]['methods'][m][curLink]['params'][param]['name'];
-          hdr['Content-Type'] = 'application/json';
-          curLib = JSON.stringify(curLib);
+        // Make Request
+        function req(attr, callback) {
+            callback = callback || function(msg) {
+                console.log(msg);
+            };
+            $.ajax({
+                url: core.lib.api_url + attr.path,
+                data: attr.data,
+                method: attr.method,
+                dataType: 'json',
+                timeout: core.lib.req_time_out,
+                headers: attr.headers,
+                error: function(res) {
+                    if (core.lib.show_errors) console.log(res);
+                    callback(res);
+                },
+            }).done(function(res) {
+                callback(res);
+            });
         }
-        req({
-          path: curPath,
-          method: m,
-          data: curLib,
-          headers: hdr,
-        }, callback);
-        return true;
-      };
-    }
 
-    $.ajax({
-      url: core.lib.spec_url,
-      dataType: 'json',
-      timeout: 5000,
-      success: function(d) {
-        var data = d['domains'];
-        for (var domain in data) {
-          lib[domain] = {};
-          lib[domain].methods = [];
-          for (var p in data[domain]['paths']) {
-            for (var m in data[domain]['paths'][p]) {
-              if (lib[domain].methods[m] == undefined) lib[domain].methods[m] = {};
-              lib[domain].methods[m][p] = data[domain]['paths'][p][m];
-            }
-          }
-          for (var m in lib[domain]['methods']) {
-            lib[domain][m] = makeFunc(domain, m);
-          }
+        function makeFunc(domain, m) {
+            return function(attr, callback) {
+                attr = attr || {};
+                var curLib = {}
+                for (var curAttr in attr['data'])
+                    curLib[curAttr] = attr['data'][curAttr];
+
+                var hdr = {};
+                for (var curHdr in attr['header'])
+                    hdr[curHdr] = attr['header'][curHdr];
+
+                var curPath = '/' + domain;
+                var curLink = curPath;
+                if (attr['id'] != undefined) {
+                    curPath += '/' + attr['id'];
+                    curLink += '/{_id}';
+                }
+
+                if (get('cur_token') != null)
+                    hdr['Authorization'] = 'Basic ' + btoa(get('cur_token') + ':');
+
+                if (m != 'GET') {
+                    if (m == 'POST' || m == 'PUT')
+                        for (var param in lib[domain]['methods'][m][curLink]['params'])
+                            if (lib[domain]['methods'][m][curLink]['params'][param]['required'] == true)
+                                if (curLib[lib[domain]['methods'][m][curLink]['params'][param]['name']] == undefined)
+                                    return 'Error: Missing ' + lib[domain]['methods'][m][curLink]['params'][param]['name'];
+                    hdr['Content-Type'] = 'application/json';
+                    curLib = JSON.stringify(curLib);
+                }
+                req({
+                    path: curPath,
+                    method: m,
+                    data: curLib,
+                    headers: hdr,
+                }, callback);
+                return true;
+            };
         }
-        checkAuth();
-      },
-      error: function(d) {
-        console.log('Cannot reach initialization spec: '+core.lib.spec_url);
-        console.log(d);
-      }
-    });
 
-    function checkAuth() {
-	    if (get('cur_token') != null) {
-        lib.sessions.GET({
-          data: {
-            where: 'token==["' + get('cur_token') + '"]'
-          }
-        }, function(res) {
-	        if (res !== undefined && res.hasOwnProperty('_items') && res['_items'].length > 0)
-            core.lib.authenticated = true;
-          else
-            core.lib.authenticated = false;
-          core.lib.ready = true;
-          checkAuth();
+        $.ajax({
+            url: core.lib.spec_url,
+            dataType: 'json',
+            timeout: 5000,
+            success: function(d) {
+                var data = d['domains'];
+                for (var domain in data) {
+                    lib[domain] = {};
+                    lib[domain].methods = [];
+                    for (var p in data[domain]['paths']) {
+                        for (var m in data[domain]['paths'][p]) {
+                            if (lib[domain].methods[m] == undefined) lib[domain].methods[m] = {};
+                            lib[domain].methods[m][p] = data[domain]['paths'][p][m];
+                        }
+                    }
+                    for (var m in lib[domain]['methods']) {
+                        lib[domain][m] = makeFunc(domain, m);
+                    }
+                }
+                checkAuth();
+            },
+            error: function(d) {
+                console.log('Cannot reach initialization spec: ' + core.lib.spec_url);
+                console.log(d);
+            }
         });
-      } else {
-	      core.lib.authenticated = false;
-        core.lib.ready = true;
-	      checkAuth();
-      }
-    }
-		
-		// Get the etag
-    lib.getEtag = function(curDomain, curId, callback) {
-      return lib[curDomain].GET({
-        id: curId
-      }, function(res) {
-        callback(res['_etag']);
-      });
-    }
-		
-		// Returns whether user is logged in
-    lib.authenticated = function() {
-      return core.lib.authenticated;
-    }
-		
-		// Login function
-    lib.login = function(curUser, curPass, callback) {
-      callback = callback || dummy;
-      req({
-        path: '/sessions/',
-        method: 'POST',
-        data: JSON.stringify({
-          user: curUser.toLowerCase(),
-          password: curPass
-        }),
-        headers: {
-          'Content-Type': 'application/json',
-        },
-      }, function(msg) {
-        var reqVar = ['token', 'user_id', 'id'];
-        for (var i in reqVar) {
-          lib['cur_' + reqVar[i]] = msg[reqVar[i]];
+
+        function checkAuth() {
+            if (get('cur_token') != null) {
+                lib.sessions.GET({
+                    data: {
+                        where: 'token==["' + get('cur_token') + '"]'
+                    }
+                }, function(res) {
+                    if (res !== undefined && res.hasOwnProperty('_items') && res['_items'].length > 0)
+                        core.lib.authenticated = true;
+                    else
+                        core.lib.authenticated = false;
+                    core.lib.ready = true;
+                    setTimeout(checkAuth, core.lib.auth_interval);
+                });
+            } else {
+                core.lib.authenticated = false;
+                core.lib.ready = true;
+                setTimeout(checkAuth, core.lib.auth_interval);
+            }
         }
-        if (msg['_status'] == 'OK') {
-          set('cur_token_id', msg['id'], 1);
-          set('cur_token', msg['token'], 1);
-          set('cur_user_id', parseInt(msg['user_id']), 1);
-          callback(true);
-        } else {
-          set('cur_token_id', null);
-          set('cur_token', null);
-          set('cur_user_id', null);
-          callback(false);
+
+        // Get the etag
+        lib.getEtag = function(curDomain, curId, callback) {
+            return lib[curDomain].GET({
+                id: curId
+            }, function(res) {
+                callback(res['_etag']);
+            });
         }
-      });
-    }
 
-		// Logout
-    lib.logout = function() {
-      // Deleting token from api and unsetting the vars
-      lib.sessions.DELETE({id: get('cur_token_id')}, function(res){
-        set('cur_token', null);
-        set('cur_token_id', null);
-	      set('cur_user_id', null);
-      });
-    }
-		
-		// Get info about the current user
-    lib.user = function(attr, callback) {
-	    callback = callback || dummy;
-      lib.users.GET({
-        id: get('cur_user_id')
-      }, function(res) {
-        if (typeof attr === 'object') {
-          var ret = {};
-          for (var key in attr)
-            ret[attr[key]] = res[attr[key]];
-          callback(ret);
-        } else {
-          callback(res[attr]);
+        // Returns whether user is logged in
+        lib.authenticated = function() {
+            return core.lib.authenticated;
         }
-      });
-    }
-		
-		// Get the necessary field for specific requests
-    lib.getRequiredFields = function(domain, type, wId) {
-      var curTree;
-      var resAttr = {};
-      if (wId)
-        curTree = lib[domain]['methods'][type]['/' + domain + '/{_id}']['params'];
-      else
-        curTree = lib[domain]['methods'][type]['/' + domain]['params'];
-      if (curTree.length == 0) return false;
-      else {
-        for (var i = 0; i < curTree.length; i++)
-          if (curTree[i].required == true)
-            resAttr[curTree[i].name] = curTree[i];
-      }
-      return resAttr;
-    }
 
-    //On function
-    lib.on = function(trigger, callback){
-	    if(callback){
-		    lib.on_mem[trigger].callback = callback;
-		    lib.on_mem[trigger].func();
-	    }
-    }
-    lib.on_mem = {
-	    ready: {
-		    func: function() {
-			    if (core.lib.ready)
-		        lib.on_mem.ready.callback();
-		      else setTimeout(function() {
-		        lib.on_mem.ready.func();
-		      }, core.lib.on_interval);
-			  }
-	    },
-	    login: {
-		    func: function(){
-			    if(core.lib.authenticated && !lib.on_mem.login.prev)
-			  		lib.on_mem.login.callback();
-			  	lib.on_mem.login.prev = core.lib.authenticated;
-			  	setTimeout(lib.on_mem.login.func, core.lib.on_interval);
-			  },
-			  prev: false,
-		  },
-	    logout: {
-		    func: function(){
-			    if(!core.lib.authenticated && lib.on_mem.logout.prev)
-			  		lib.on_mem.logout.callback();
-			  	lib.on_mem.logout.prev = core.lib.authenticated;
-			  	setTimeout(lib.on_mem.logout.func, core.lib.on_interval);
-			  },
-			  prev: false,
-		  },
-    }
+        // Login function
+        lib.login = function(curUser, curPass, callback) {
+            callback = callback || dummy;
+            req({
+                path: '/sessions/',
+                method: 'POST',
+                data: JSON.stringify({
+                    user: curUser.toLowerCase(),
+                    password: curPass
+                }),
+                headers: {
+                    'Content-Type': 'application/json',
+                },
+            }, function(msg) {
+                var reqVar = ['token', 'user_id', 'id'];
+                for (var i in reqVar) {
+                    lib['cur_' + reqVar[i]] = msg[reqVar[i]];
+                }
+                if (msg['_status'] == 'OK') {
+                    set('cur_token_id', msg['id'], 1);
+                    set('cur_token', msg['token'], 1);
+                    set('cur_user_id', parseInt(msg['user_id']), 1);
+                    callback(true);
+                } else {
+                    set('cur_token_id', null);
+                    set('cur_token', null);
+                    set('cur_user_id', null);
+                    callback(false);
+                }
+            });
+        }
 
-    return lib;
-  }
+        // Logout
+        lib.logout = function() {
+            // Deleting token from api and unsetting the vars
+            lib.sessions.DELETE({
+                id: get('cur_token_id')
+            }, function(res) {
+                set('cur_token', null);
+                set('cur_token_id', null);
+                set('cur_user_id', null);
+            });
+        }
 
-  if (typeof(window[lns]) === 'undefined') {
-    window[lns] = libgen();
-  } else {
-    console.log(lns+' already defined, please solve conflict');
-  }
+        // Get info about the current user
+        lib.user = function(attr, callback) {
+            callback = callback || dummy;
+            lib.users.GET({
+                id: get('cur_user_id')
+            }, function(res) {
+                if (typeof attr === 'object') {
+                    var ret = {};
+                    for (var key in attr)
+                        ret[attr[key]] = res[attr[key]];
+                    callback(ret);
+                } else {
+                    callback(res[attr]);
+                }
+            });
+        }
+
+        // Get the necessary field for specific requests
+        lib.getRequiredFields = function(domain, type, wId) {
+            var curTree;
+            var resAttr = {};
+            if (wId)
+                curTree = lib[domain]['methods'][type]['/' + domain + '/{_id}']['params'];
+            else
+                curTree = lib[domain]['methods'][type]['/' + domain]['params'];
+            if (curTree.length == 0) return false;
+            else {
+                for (var i = 0; i < curTree.length; i++)
+                    if (curTree[i].required == true)
+                        resAttr[curTree[i].name] = curTree[i];
+            }
+            return resAttr;
+        }
+
+        //On function
+        lib.on = function(trigger, callback) {
+            if (callback) {
+                lib.on_mem[trigger].callback = callback;
+                lib.on_mem[trigger].func();
+            }
+        }
+        lib.on_mem = {
+            ready: {
+                func: function() {
+                    if (core.lib.ready)
+                        lib.on_mem.ready.callback();
+                    else setTimeout(function() {
+                        lib.on_mem.ready.func();
+                    }, core.lib.on_interval);
+                }
+            },
+            login: {
+                func: function() {
+                    if (core.lib.authenticated && !lib.on_mem.login.prev)
+                        lib.on_mem.login.callback();
+                    lib.on_mem.login.prev = core.lib.authenticated;
+                    setTimeout(lib.on_mem.login.func, core.lib.on_interval);
+                },
+                prev: false,
+            },
+            logout: {
+                func: function() {
+                    if (!core.lib.authenticated && lib.on_mem.logout.prev)
+                        lib.on_mem.logout.callback();
+                    lib.on_mem.logout.prev = core.lib.authenticated;
+                    setTimeout(lib.on_mem.logout.func, core.lib.on_interval);
+                },
+                prev: false,
+            },
+        }
+
+        return lib;
+    }
+
+    if (typeof(window[lns]) === 'undefined') {
+        window[lns] = libgen();
+    } else {
+        console.log(lns + ' already defined, please solve conflict');
+    }
 
 })(window);
diff --git a/admin/lib/amiv/spec.json b/admin/lib/amiv/spec.json
index 671f633f5c9304b1236210a307f66386ca16960d..6dd3ffaf8f993ea8026d011db6153132f79eade1 100644
--- a/admin/lib/amiv/spec.json
+++ b/admin/lib/amiv/spec.json
@@ -1,2405 +1 @@
-{
-  "domains": {
-    "files": {
-      "paths": {
-        "/files/{_id}": {
-          "PUT": {
-            "params": [
-              {
-                "required": true,
-                "type": "string",
-                "name": "_id"
-              }
-            ],
-            "label": "Replace a File"
-          },
-          "DELETE": {
-            "params": [
-              {
-                "required": true,
-                "type": "string",
-                "name": "_id"
-              }
-            ],
-            "label": "Delete a File"
-          },
-          "GET": {
-            "params": [
-              {
-                "required": true,
-                "type": "string",
-                "name": "_id"
-              }
-            ],
-            "label": "Retrieve a File"
-          }
-        },
-        "/files": {
-          "POST": {
-            "params": [
-              {
-                "required": false,
-                "type": "objectid",
-                "name": "study_doc",
-                "data_relation": {
-                  "field": "id",
-                  "resource": "studydocuments",
-                  "embeddable": true
-                }
-              },
-              {
-                "name": "name",
-                "nullable": true,
-                "required": false,
-                "maxlength": 100,
-                "unique": false,
-                "type": "string"
-              },
-              {
-                "required": true,
-                "type": "media",
-                "name": "data"
-              },
-              {
-                "name": "_author",
-                "nullable": true,
-                "required": false,
-                "readonly": true,
-                "data_relation": {
-                  "field": "id",
-                  "resource": "users",
-                  "embeddable": false
-                },
-                "unique": false,
-                "type": "objectid"
-              },
-              {
-                "unique": false,
-                "name": "study_doc_id",
-                "data_relation": {
-                  "field": "id",
-                  "resource": "studydocuments",
-                  "embeddable": false
-                },
-                "required": true,
-                "type": "objectid"
-              },
-              {
-                "unique": true,
-                "name": "id",
-                "required": false,
-                "type": "integer"
-              }
-            ],
-            "label": "Create a File"
-          },
-          "GET": {
-            "params": [],
-            "label": "Retrieve all files"
-          }
-        }
-      },
-      "description": {}
-    },
-    "studydocuments": {
-      "paths": {
-        "/studydocuments/{_id}": {
-          "PUT": {
-            "params": [
-              {
-                "required": true,
-                "type": "string",
-                "name": "_id"
-              }
-            ],
-            "label": "Replace a Studydocument"
-          },
-          "PATCH": {
-            "params": [
-              {
-                "required": true,
-                "type": "string",
-                "name": "_id"
-              },
-              {
-                "required": false,
-                "type": "objectid",
-                "name": "files",
-                "data_relation": {
-                  "field": "id",
-                  "resource": "files",
-                  "embeddable": true
-                }
-              },
-              {
-                "name": "name",
-                "nullable": true,
-                "required": false,
-                "maxlength": 100,
-                "unique": false,
-                "type": "string"
-              },
-              {
-                "name": "professor",
-                "nullable": true,
-                "required": false,
-                "maxlength": 100,
-                "unique": false,
-                "type": "string"
-              },
-              {
-                "name": "exam_session",
-                "nullable": true,
-                "required": false,
-                "maxlength": 10,
-                "unique": false,
-                "type": "string"
-              },
-              {
-                "name": "_author",
-                "nullable": true,
-                "required": false,
-                "readonly": true,
-                "data_relation": {
-                  "field": "id",
-                  "resource": "users",
-                  "embeddable": false
-                },
-                "unique": false,
-                "type": "objectid"
-              },
-              {
-                "name": "author_name",
-                "nullable": true,
-                "required": false,
-                "maxlength": 100,
-                "unique": false,
-                "type": "string"
-              },
-              {
-                "unique": false,
-                "name": "semester",
-                "nullable": true,
-                "required": false,
-                "type": "integer"
-              },
-              {
-                "name": "department",
-                "nullable": true,
-                "required": false,
-                "maxlength": 4,
-                "unique": false,
-                "type": "string"
-              },
-              {
-                "name": "lecture",
-                "nullable": true,
-                "required": false,
-                "maxlength": 100,
-                "unique": false,
-                "type": "string"
-              },
-              {
-                "name": "type",
-                "nullable": true,
-                "required": false,
-                "maxlength": 30,
-                "unique": false,
-                "type": "string"
-              },
-              {
-                "unique": true,
-                "name": "id",
-                "required": false,
-                "type": "integer"
-              }
-            ],
-            "label": "Update a Studydocument"
-          },
-          "DELETE": {
-            "params": [
-              {
-                "required": true,
-                "type": "string",
-                "name": "_id"
-              }
-            ],
-            "label": "Delete a Studydocument"
-          },
-          "GET": {
-            "params": [
-              {
-                "required": true,
-                "type": "string",
-                "name": "_id"
-              }
-            ],
-            "label": "Retrieve a Studydocument"
-          }
-        },
-        "/studydocuments": {
-          "POST": {
-            "params": [
-              {
-                "required": false,
-                "type": "objectid",
-                "name": "files",
-                "data_relation": {
-                  "field": "id",
-                  "resource": "files",
-                  "embeddable": true
-                }
-              },
-              {
-                "name": "name",
-                "nullable": true,
-                "required": false,
-                "maxlength": 100,
-                "unique": false,
-                "type": "string"
-              },
-              {
-                "name": "professor",
-                "nullable": true,
-                "required": false,
-                "maxlength": 100,
-                "unique": false,
-                "type": "string"
-              },
-              {
-                "name": "exam_session",
-                "nullable": true,
-                "required": false,
-                "maxlength": 10,
-                "unique": false,
-                "type": "string"
-              },
-              {
-                "name": "_author",
-                "nullable": true,
-                "required": false,
-                "readonly": true,
-                "data_relation": {
-                  "field": "id",
-                  "resource": "users",
-                  "embeddable": false
-                },
-                "unique": false,
-                "type": "objectid"
-              },
-              {
-                "name": "author_name",
-                "nullable": true,
-                "required": false,
-                "maxlength": 100,
-                "unique": false,
-                "type": "string"
-              },
-              {
-                "unique": false,
-                "name": "semester",
-                "nullable": true,
-                "required": false,
-                "type": "integer"
-              },
-              {
-                "name": "department",
-                "nullable": true,
-                "required": false,
-                "maxlength": 4,
-                "unique": false,
-                "type": "string"
-              },
-              {
-                "name": "lecture",
-                "nullable": true,
-                "required": false,
-                "maxlength": 100,
-                "unique": false,
-                "type": "string"
-              },
-              {
-                "name": "type",
-                "nullable": true,
-                "required": false,
-                "maxlength": 30,
-                "unique": false,
-                "type": "string"
-              },
-              {
-                "unique": true,
-                "name": "id",
-                "required": false,
-                "type": "integer"
-              }
-            ],
-            "label": "Create a Studydocument"
-          },
-          "GET": {
-            "params": [],
-            "label": "Retrieve all studydocuments"
-          }
-        }
-      },
-      "description": {
-        "fields": {
-          "semester": "Study-Semester as an Integer starting with first semester Bachelor."
-        },
-        "general": "Study-documents are basically all documents that are connected to a course. This resource provides meta-data for the assigned files."
-      }
-    },
-    "users": {
-      "paths": {
-        "/users/{_id}": {
-          "PUT": {
-            "params": [
-              {
-                "required": true,
-                "type": "string",
-                "name": "_id"
-              }
-            ],
-            "label": "Replace a User"
-          },
-          "PATCH": {
-            "params": [
-              {
-                "required": true,
-                "type": "string",
-                "name": "_id"
-              },
-              {
-                "name": "legi",
-                "nullable": true,
-                "required": false,
-                "maxlength": 8,
-                "unique": true,
-                "type": "string"
-              },
-              {
-                "unique": false,
-                "name": "firstname",
-                "maxlength": 50,
-                "required": true,
-                "type": "string"
-              },
-              {
-                "required": false,
-                "type": "objectid",
-                "name": "sessions",
-                "data_relation": {
-                  "field": "id",
-                  "resource": "sessions",
-                  "embeddable": true
-                }
-              },
-              {
-                "required": false,
-                "type": "objectid",
-                "name": "groupmemberships",
-                "data_relation": {
-                  "field": "id",
-                  "resource": "groupusermembers",
-                  "embeddable": true
-                }
-              },
-              {
-                "unique": false,
-                "name": "lastname",
-                "maxlength": 50,
-                "required": true,
-                "type": "string"
-              },
-              {
-                "name": "rfid",
-                "nullable": true,
-                "required": false,
-                "maxlength": 6,
-                "unique": true,
-                "type": "string"
-              },
-              {
-                "name": "_author",
-                "nullable": true,
-                "required": false,
-                "readonly": true,
-                "data_relation": {
-                  "field": "id",
-                  "resource": "users",
-                  "embeddable": false
-                },
-                "unique": false,
-                "type": "objectid"
-              },
-              {
-                "regex": "^.+@.+$",
-                "name": "email",
-                "required": true,
-                "maxlength": 100,
-                "unique": true,
-                "type": "string"
-              },
-              {
-                "name": "phone",
-                "nullable": true,
-                "required": false,
-                "maxlength": 20,
-                "unique": false,
-                "type": "string"
-              },
-              {
-                "name": "membership",
-                "default": "none",
-                "required": true,
-                "maxlength": 13,
-                "unique": false,
-                "type": "string"
-              },
-              {
-                "required": false,
-                "type": "objectid",
-                "name": "eventsignups",
-                "data_relation": {
-                  "field": "id",
-                  "resource": "eventsignups",
-                  "embeddable": true
-                }
-              },
-              {
-                "name": "nethz",
-                "nullable": true,
-                "required": false,
-                "maxlength": 30,
-                "unique": true,
-                "type": "string",
-                "empty": false
-              },
-              {
-                "name": "gender",
-                "required": true,
-                "allowed": [
-                  "male",
-                  "female"
-                ],
-                "unique": false,
-                "type": "string",
-                "maxlength": 6
-              },
-              {
-                "name": "department",
-                "nullable": true,
-                "required": false,
-                "allowed": [
-                  "itet",
-                  "mavt"
-                ],
-                "unique": false,
-                "type": "string",
-                "maxlength": 5
-              },
-              {
-                "name": "password",
-                "nullable": true,
-                "required": false,
-                "maxlength": 100,
-                "unique": false,
-                "type": "string"
-              },
-              {
-                "unique": true,
-                "name": "id",
-                "required": false,
-                "type": "integer"
-              },
-              {
-                "name": "send_newsletter",
-                "nullable": true,
-                "default": true,
-                "required": false,
-                "unique": false,
-                "type": "boolean"
-              }
-            ],
-            "label": "Update a User"
-          },
-          "DELETE": {
-            "params": [
-              {
-                "required": true,
-                "type": "string",
-                "name": "_id"
-              }
-            ],
-            "label": "Delete a User"
-          },
-          "GET": {
-            "params": [
-              {
-                "required": true,
-                "type": "string",
-                "name": "_id"
-              }
-            ],
-            "label": "Retrieve a User"
-          }
-        },
-        "/users/{nethz}": {
-          "GET": {
-            "params": [
-              {
-                "name": "nethz",
-                "nullable": true,
-                "required": false,
-                "maxlength": 30,
-                "unique": true,
-                "type": "string",
-                "empty": false
-              }
-            ],
-            "label": "Retrieve a User"
-          }
-        },
-        "/users": {
-          "POST": {
-            "params": [
-              {
-                "name": "legi",
-                "nullable": true,
-                "required": false,
-                "maxlength": 8,
-                "unique": true,
-                "type": "string"
-              },
-              {
-                "unique": false,
-                "name": "firstname",
-                "maxlength": 50,
-                "required": true,
-                "type": "string"
-              },
-              {
-                "required": false,
-                "type": "objectid",
-                "name": "sessions",
-                "data_relation": {
-                  "field": "id",
-                  "resource": "sessions",
-                  "embeddable": true
-                }
-              },
-              {
-                "required": false,
-                "type": "objectid",
-                "name": "groupmemberships",
-                "data_relation": {
-                  "field": "id",
-                  "resource": "groupusermembers",
-                  "embeddable": true
-                }
-              },
-              {
-                "unique": false,
-                "name": "lastname",
-                "maxlength": 50,
-                "required": true,
-                "type": "string"
-              },
-              {
-                "name": "rfid",
-                "nullable": true,
-                "required": false,
-                "maxlength": 6,
-                "unique": true,
-                "type": "string"
-              },
-              {
-                "name": "_author",
-                "nullable": true,
-                "required": false,
-                "readonly": true,
-                "data_relation": {
-                  "field": "id",
-                  "resource": "users",
-                  "embeddable": false
-                },
-                "unique": false,
-                "type": "objectid"
-              },
-              {
-                "regex": "^.+@.+$",
-                "name": "email",
-                "required": true,
-                "maxlength": 100,
-                "unique": true,
-                "type": "string"
-              },
-              {
-                "name": "phone",
-                "nullable": true,
-                "required": false,
-                "maxlength": 20,
-                "unique": false,
-                "type": "string"
-              },
-              {
-                "name": "membership",
-                "default": "none",
-                "required": true,
-                "maxlength": 13,
-                "unique": false,
-                "type": "string"
-              },
-              {
-                "required": false,
-                "type": "objectid",
-                "name": "eventsignups",
-                "data_relation": {
-                  "field": "id",
-                  "resource": "eventsignups",
-                  "embeddable": true
-                }
-              },
-              {
-                "name": "nethz",
-                "nullable": true,
-                "required": false,
-                "maxlength": 30,
-                "unique": true,
-                "type": "string",
-                "empty": false
-              },
-              {
-                "name": "gender",
-                "required": true,
-                "allowed": [
-                  "male",
-                  "female"
-                ],
-                "unique": false,
-                "type": "string",
-                "maxlength": 6
-              },
-              {
-                "name": "department",
-                "nullable": true,
-                "required": false,
-                "allowed": [
-                  "itet",
-                  "mavt"
-                ],
-                "unique": false,
-                "type": "string",
-                "maxlength": 5
-              },
-              {
-                "name": "password",
-                "nullable": true,
-                "required": false,
-                "maxlength": 100,
-                "unique": false,
-                "type": "string"
-              },
-              {
-                "unique": true,
-                "name": "id",
-                "required": false,
-                "type": "integer"
-              },
-              {
-                "name": "send_newsletter",
-                "nullable": true,
-                "default": true,
-                "required": false,
-                "unique": false,
-                "type": "boolean"
-              }
-            ],
-            "label": "Create a User"
-          },
-          "GET": {
-            "params": [],
-            "label": "Retrieve all users"
-          }
-        }
-      },
-      "description": {
-        "methods": {
-          "GET": "Authorization is required for most of the fields"
-        },
-        "general": "In general, the user data will be generated from LDAP-Data. However, one might change the RFID-Number or the membership-status. Extraordinary members may not have a LDAP-Account and can therefore access all given fields."
-      }
-    },
-    "": {
-      "paths": {
-        "/": {
-          "GET": {}
-        }
-      },
-      "description": {}
-    },
-    "purchases": {
-      "paths": {
-        "/purchases": {
-          "POST": {
-            "params": [
-              {
-                "unique": false,
-                "name": "slot",
-                "nullable": true,
-                "required": false,
-                "type": "integer"
-              },
-              {
-                "name": "user_id",
-                "nullable": true,
-                "required": false,
-                "data_relation": {
-                  "field": "id",
-                  "resource": "users",
-                  "embeddable": false
-                },
-                "unique": false,
-                "type": "objectid"
-              },
-              {
-                "unique": false,
-                "name": "timestamp",
-                "nullable": true,
-                "required": false,
-                "type": "datetime"
-              },
-              {
-                "name": "_author",
-                "nullable": true,
-                "required": false,
-                "readonly": true,
-                "data_relation": {
-                  "field": "id",
-                  "resource": "users",
-                  "embeddable": false
-                },
-                "unique": false,
-                "type": "objectid"
-              },
-              {
-                "name": "type",
-                "nullable": true,
-                "required": false,
-                "maxlength": 5,
-                "unique": false,
-                "type": "string"
-              },
-              {
-                "unique": true,
-                "name": "id",
-                "required": false,
-                "type": "integer"
-              }
-            ],
-            "label": "Create a Purchase"
-          },
-          "GET": {
-            "params": [],
-            "label": "Retrieve all purchases"
-          }
-        },
-        "/purchases/{_id}": {
-          "PUT": {
-            "params": [
-              {
-                "required": true,
-                "type": "string",
-                "name": "_id"
-              }
-            ],
-            "label": "Replace a Purchase"
-          },
-          "PATCH": {
-            "params": [
-              {
-                "required": true,
-                "type": "string",
-                "name": "_id"
-              },
-              {
-                "unique": false,
-                "name": "slot",
-                "nullable": true,
-                "required": false,
-                "type": "integer"
-              },
-              {
-                "name": "user_id",
-                "nullable": true,
-                "required": false,
-                "data_relation": {
-                  "field": "id",
-                  "resource": "users",
-                  "embeddable": false
-                },
-                "unique": false,
-                "type": "objectid"
-              },
-              {
-                "unique": false,
-                "name": "timestamp",
-                "nullable": true,
-                "required": false,
-                "type": "datetime"
-              },
-              {
-                "name": "_author",
-                "nullable": true,
-                "required": false,
-                "readonly": true,
-                "data_relation": {
-                  "field": "id",
-                  "resource": "users",
-                  "embeddable": false
-                },
-                "unique": false,
-                "type": "objectid"
-              },
-              {
-                "name": "type",
-                "nullable": true,
-                "required": false,
-                "maxlength": 5,
-                "unique": false,
-                "type": "string"
-              },
-              {
-                "unique": true,
-                "name": "id",
-                "required": false,
-                "type": "integer"
-              }
-            ],
-            "label": "Update a Purchase"
-          },
-          "DELETE": {
-            "params": [
-              {
-                "required": true,
-                "type": "string",
-                "name": "_id"
-              }
-            ],
-            "label": "Delete a Purchase"
-          },
-          "GET": {
-            "params": [
-              {
-                "required": true,
-                "type": "string",
-                "name": "_id"
-              }
-            ],
-            "label": "Retrieve a Purchase"
-          }
-        }
-      },
-      "description": {
-        "fields": {
-          "slot": "Slot in the machine which was purchased(different items, which may have different prices)."
-        },
-        "general": "A beer machine or kaffi machine transaction. Users should be able to get beer or kaffi, if their last timestamp is older than one day and they are AMIV members. This resource is used to log their purchases."
-      }
-    },
-    "docs": {
-      "paths": {
-        "/docs/": {
-          "GET": {}
-        },
-        "/docs/spec.json": {
-          "GET": {}
-        }
-      },
-      "description": {}
-    },
-    "groupusermembers": {
-      "paths": {
-        "/groupusermembers/{_id}": {
-          "DELETE": {
-            "params": [
-              {
-                "required": true,
-                "type": "string",
-                "name": "_id"
-              }
-            ],
-            "label": "Delete a Groupusermember"
-          },
-          "GET": {
-            "params": [
-              {
-                "required": true,
-                "type": "string",
-                "name": "_id"
-              }
-            ],
-            "label": "Retrieve a Groupusermember"
-          }
-        },
-        "/groupusermembers": {
-          "POST": {
-            "params": [
-              {
-                "name": "group_id",
-                "self_enrollment_must_be_allowed": true,
-                "required": true,
-                "unique_combination": [
-                  "groupusermembers",
-                  "user_id"
-                ],
-                "data_relation": {
-                  "field": "id",
-                  "resource": "groups",
-                  "embeddable": false
-                },
-                "unique": false,
-                "type": "objectid"
-              },
-              {
-                "name": "user_id",
-                "unique_combination": [
-                  "groupusermembers",
-                  "group_id"
-                ],
-                "required": true,
-                "only_self_enrollment_for_group": true,
-                "data_relation": {
-                  "field": "id",
-                  "resource": "users",
-                  "embeddable": false
-                },
-                "unique": false,
-                "type": "objectid"
-              },
-              {
-                "name": "_author",
-                "nullable": true,
-                "required": false,
-                "readonly": true,
-                "data_relation": {
-                  "field": "id",
-                  "resource": "users",
-                  "embeddable": false
-                },
-                "unique": false,
-                "type": "objectid"
-              },
-              {
-                "unique": true,
-                "name": "id",
-                "required": false,
-                "type": "integer"
-              }
-            ],
-            "label": "Create a Groupusermember"
-          },
-          "GET": {
-            "params": [],
-            "label": "Retrieve all groupusermembers"
-          }
-        }
-      },
-      "description": {
-        "general": "Assignment of registered users to groups."
-      }
-    },
-    "eventsignups": {
-      "paths": {
-        "/eventsignups/{_id}": {
-          "PUT": {
-            "params": [
-              {
-                "required": true,
-                "type": "string",
-                "name": "_id"
-              }
-            ],
-            "label": "Replace a Eventsignup"
-          },
-          "PATCH": {
-            "params": [
-              {
-                "required": true,
-                "type": "string",
-                "name": "_id"
-              },
-              {
-                "unique": false,
-                "name": "additional_fields",
-                "nullable": true,
-                "required": false,
-                "type": "json_event_field"
-              },
-              {
-                "name": "user_id",
-                "unique_combination": [
-                  "eventsignups",
-                  "event_id"
-                ],
-                "required": true,
-                "not_patchable": true,
-                "data_relation": {
-                  "field": "id",
-                  "resource": "users",
-                  "embeddable": false
-                },
-                "only_self_enrollment_for_event": true,
-                "unique": false,
-                "type": "objectid"
-              },
-              {
-                "signup_requirements": true,
-                "name": "event_id",
-                "unique_combination": [
-                  "eventsignups",
-                  "user_id",
-                  "email"
-                ],
-                "required": true,
-                "not_patchable": true,
-                "data_relation": {
-                  "field": "id",
-                  "resource": "events",
-                  "embeddable": false
-                },
-                "unique": false,
-                "type": "objectid"
-              },
-              {
-                "name": "_author",
-                "nullable": true,
-                "required": false,
-                "readonly": true,
-                "data_relation": {
-                  "field": "id",
-                  "resource": "users",
-                  "embeddable": false
-                },
-                "unique": false,
-                "type": "objectid"
-              },
-              {
-                "regex": "^.+@.+$",
-                "name": "email",
-                "email_signup_must_be_allowed": true,
-                "nullable": true,
-                "required": false,
-                "unique_combination": [
-                  "eventsignups",
-                  "event_id"
-                ],
-                "not_patchable": true,
-                "maxlength": 100,
-                "unique": false,
-                "type": "objectid",
-                "only_anonymous": true
-              },
-              {
-                "name": "_confirmed",
-                "nullable": true,
-                "default": false,
-                "required": false,
-                "unique": false,
-                "type": "boolean"
-              },
-              {
-                "unique": true,
-                "name": "id",
-                "required": false,
-                "type": "integer"
-              }
-            ],
-            "label": "Update a Eventsignup"
-          },
-          "DELETE": {
-            "params": [
-              {
-                "required": true,
-                "type": "string",
-                "name": "_id"
-              }
-            ],
-            "label": "Delete a Eventsignup"
-          },
-          "GET": {
-            "params": [
-              {
-                "required": true,
-                "type": "string",
-                "name": "_id"
-              }
-            ],
-            "label": "Retrieve a Eventsignup"
-          }
-        },
-        "/eventsignups": {
-          "GET": {
-            "params": [],
-            "label": "Retrieve all eventsignups"
-          }
-        }
-      },
-      "description": {
-        "fields": {
-          "additional_fields": "Data-schema depends on 'additional_fields' from the mapped event. Please provide in json-format.",
-          "user_id": "To sign up as external user, set 'user_id' to '-1'",
-          "email": "For registered users, this is just a projection of your general email-address. External users need to provide their email here."
-        },
-        "general": "You can signup here for an existing event inside of the registration-window. External Users can only sign up to public events."
-      }
-    },
-    "static": {
-      "paths": {
-        "/static/bootstrap/{filename}": {
-          "GET": {}
-        },
-        "/static/{filename}": {
-          "GET": {}
-        }
-      },
-      "description": {}
-    },
-    "groups": {
-      "paths": {
-        "/groups": {
-          "POST": {
-            "params": [
-              {
-                "required": false,
-                "type": "objectid",
-                "name": "user_subscribers",
-                "data_relation": {
-                  "field": "id",
-                  "resource": "groupusermembers",
-                  "embeddable": true
-                }
-              },
-              {
-                "required": false,
-                "type": "objectid",
-                "name": "addresses",
-                "data_relation": {
-                  "field": "id",
-                  "resource": "forwardaddresses",
-                  "embeddable": true
-                }
-              },
-              {
-                "unique": true,
-                "name": "name",
-                "maxlength": 100,
-                "required": true,
-                "type": "string"
-              },
-              {
-                "unique": false,
-                "name": "has_zoidberg_share",
-                "default": false,
-                "required": true,
-                "type": "boolean"
-              },
-              {
-                "unique": false,
-                "name": "allow_self_enrollment",
-                "default": false,
-                "required": true,
-                "type": "boolean"
-              },
-              {
-                "name": "_author",
-                "nullable": true,
-                "required": false,
-                "readonly": true,
-                "data_relation": {
-                  "field": "id",
-                  "resource": "users",
-                  "embeddable": false
-                },
-                "unique": false,
-                "type": "objectid"
-              },
-              {
-                "unique": false,
-                "name": "moderator_id",
-                "data_relation": {
-                  "field": "id",
-                  "resource": "users",
-                  "embeddable": false
-                },
-                "required": true,
-                "type": "objectid"
-              },
-              {
-                "required": false,
-                "type": "objectid",
-                "name": "owner",
-                "data_relation": {
-                  "field": "id",
-                  "resource": "users",
-                  "embeddable": true
-                }
-              },
-              {
-                "unique": true,
-                "name": "id",
-                "required": false,
-                "type": "integer"
-              },
-              {
-                "unique": false,
-                "name": "permissions",
-                "nullable": true,
-                "required": false,
-                "type": "permissions_jsonschema"
-              }
-            ],
-            "label": "Create a Group"
-          },
-          "GET": {
-            "params": [],
-            "label": "Retrieve all groups"
-          }
-        },
-        "/groups/{_id}": {
-          "PUT": {
-            "params": [
-              {
-                "required": true,
-                "type": "string",
-                "name": "_id"
-              }
-            ],
-            "label": "Replace a Group"
-          },
-          "PATCH": {
-            "params": [
-              {
-                "required": true,
-                "type": "string",
-                "name": "_id"
-              },
-              {
-                "required": false,
-                "type": "objectid",
-                "name": "user_subscribers",
-                "data_relation": {
-                  "field": "id",
-                  "resource": "groupusermembers",
-                  "embeddable": true
-                }
-              },
-              {
-                "required": false,
-                "type": "objectid",
-                "name": "addresses",
-                "data_relation": {
-                  "field": "id",
-                  "resource": "forwardaddresses",
-                  "embeddable": true
-                }
-              },
-              {
-                "unique": true,
-                "name": "name",
-                "maxlength": 100,
-                "required": true,
-                "type": "string"
-              },
-              {
-                "unique": false,
-                "name": "has_zoidberg_share",
-                "default": false,
-                "required": true,
-                "type": "boolean"
-              },
-              {
-                "unique": false,
-                "name": "allow_self_enrollment",
-                "default": false,
-                "required": true,
-                "type": "boolean"
-              },
-              {
-                "name": "_author",
-                "nullable": true,
-                "required": false,
-                "readonly": true,
-                "data_relation": {
-                  "field": "id",
-                  "resource": "users",
-                  "embeddable": false
-                },
-                "unique": false,
-                "type": "objectid"
-              },
-              {
-                "unique": false,
-                "name": "moderator_id",
-                "data_relation": {
-                  "field": "id",
-                  "resource": "users",
-                  "embeddable": false
-                },
-                "required": true,
-                "type": "objectid"
-              },
-              {
-                "required": false,
-                "type": "objectid",
-                "name": "owner",
-                "data_relation": {
-                  "field": "id",
-                  "resource": "users",
-                  "embeddable": true
-                }
-              },
-              {
-                "unique": true,
-                "name": "id",
-                "required": false,
-                "type": "integer"
-              },
-              {
-                "unique": false,
-                "name": "permissions",
-                "nullable": true,
-                "required": false,
-                "type": "permissions_jsonschema"
-              }
-            ],
-            "label": "Update a Group"
-          },
-          "DELETE": {
-            "params": [
-              {
-                "required": true,
-                "type": "string",
-                "name": "_id"
-              }
-            ],
-            "label": "Delete a Group"
-          },
-          "GET": {
-            "params": [
-              {
-                "required": true,
-                "type": "string",
-                "name": "_id"
-              }
-            ],
-            "label": "Retrieve a Group"
-          }
-        }
-      },
-      "description": {
-        "fields": {
-          "has_zoidberg_share": "Wether the group has a share in the amiv storage",
-          "allow_self_enrollment": "If true, the group can be seen by all users and they can subscribe themselves",
-          "permissions": "permissions the group grants. has to be according to the jsonschema available at /notyetavailable"
-        },
-        "general": "This resource describes the different teams in AMIV.A group can grant API permissions and can be reached with several addresses. To see the subscriptions, have a look at '/groupusermembers'. To see the mail addresses, see '/forwardaddresses'."
-      }
-    },
-    "forwardaddresses": {
-      "paths": {
-        "/forwardaddresses/{_id}": {
-          "PUT": {
-            "params": [
-              {
-                "required": true,
-                "type": "string",
-                "name": "_id"
-              }
-            ],
-            "label": "Replace a Forwardaddresse"
-          },
-          "PATCH": {
-            "params": [
-              {
-                "required": true,
-                "type": "string",
-                "name": "_id"
-              },
-              {
-                "name": "group_id",
-                "required": true,
-                "data_relation": {
-                  "field": "id",
-                  "resource": "groups",
-                  "embeddable": false
-                },
-                "only_groups_you_moderate": true,
-                "unique": false,
-                "type": "objectid"
-              },
-              {
-                "required": false,
-                "type": "objectid",
-                "name": "group",
-                "data_relation": {
-                  "field": "id",
-                  "resource": "groups",
-                  "embeddable": true
-                }
-              },
-              {
-                "unique": true,
-                "name": "id",
-                "required": false,
-                "type": "integer"
-              },
-              {
-                "unique": true,
-                "name": "address",
-                "maxlength": 100,
-                "required": true,
-                "type": "string"
-              },
-              {
-                "name": "_author",
-                "nullable": true,
-                "required": false,
-                "readonly": true,
-                "data_relation": {
-                  "field": "id",
-                  "resource": "users",
-                  "embeddable": false
-                },
-                "unique": false,
-                "type": "objectid"
-              }
-            ],
-            "label": "Update a Forwardaddresse"
-          },
-          "DELETE": {
-            "params": [
-              {
-                "required": true,
-                "type": "string",
-                "name": "_id"
-              }
-            ],
-            "label": "Delete a Forwardaddresse"
-          },
-          "GET": {
-            "params": [
-              {
-                "required": true,
-                "type": "string",
-                "name": "_id"
-              }
-            ],
-            "label": "Retrieve a Forwardaddresse"
-          }
-        },
-        "/forwardaddresses": {
-          "POST": {
-            "params": [
-              {
-                "name": "group_id",
-                "required": true,
-                "data_relation": {
-                  "field": "id",
-                  "resource": "groups",
-                  "embeddable": false
-                },
-                "only_groups_you_moderate": true,
-                "unique": false,
-                "type": "objectid"
-              },
-              {
-                "required": false,
-                "type": "objectid",
-                "name": "group",
-                "data_relation": {
-                  "field": "id",
-                  "resource": "groups",
-                  "embeddable": true
-                }
-              },
-              {
-                "unique": true,
-                "name": "id",
-                "required": false,
-                "type": "integer"
-              },
-              {
-                "unique": true,
-                "name": "address",
-                "maxlength": 100,
-                "required": true,
-                "type": "string"
-              },
-              {
-                "name": "_author",
-                "nullable": true,
-                "required": false,
-                "readonly": true,
-                "data_relation": {
-                  "field": "id",
-                  "resource": "users",
-                  "embeddable": false
-                },
-                "unique": false,
-                "type": "objectid"
-              }
-            ],
-            "label": "Create a Forwardaddresse"
-          },
-          "GET": {
-            "params": [],
-            "label": "Retrieve all forwardaddresses"
-          }
-        }
-      },
-      "description": {
-        "fields": {
-          "address": "E-Mail address to forward"
-        },
-        "general": "An email address associated with a group. By adding an address here, all mails sent to that address will be forwarded to all members of the associated group."
-      }
-    },
-    "media": {
-      "paths": {
-        "/media/{_id}": {
-          "GET": {}
-        }
-      },
-      "description": {}
-    },
-    "sessions": {
-      "paths": {
-        "/sessions/{_id}": {
-          "PUT": {
-            "params": [
-              {
-                "required": true,
-                "type": "string",
-                "name": "_id"
-              }
-            ],
-            "label": "Replace a Session"
-          },
-          "PATCH": {
-            "params": [
-              {
-                "required": true,
-                "type": "string",
-                "name": "_id"
-              },
-              {
-                "unique": false,
-                "name": "token",
-                "nullable": true,
-                "required": false,
-                "type": "string"
-              },
-              {
-                "unique": false,
-                "name": "user_id",
-                "data_relation": {
-                  "field": "id",
-                  "resource": "users",
-                  "embeddable": false
-                },
-                "required": true,
-                "type": "objectid"
-              },
-              {
-                "name": "_author",
-                "nullable": true,
-                "required": false,
-                "readonly": true,
-                "data_relation": {
-                  "field": "id",
-                  "resource": "users",
-                  "embeddable": false
-                },
-                "unique": false,
-                "type": "objectid"
-              },
-              {
-                "unique": true,
-                "name": "id",
-                "required": false,
-                "type": "integer"
-              }
-            ],
-            "label": "Update a Session"
-          },
-          "DELETE": {
-            "params": [
-              {
-                "required": true,
-                "type": "string",
-                "name": "_id"
-              }
-            ],
-            "label": "Delete a Session"
-          },
-          "GET": {
-            "params": [
-              {
-                "required": true,
-                "type": "string",
-                "name": "_id"
-              }
-            ],
-            "label": "Retrieve a Session"
-          }
-        },
-        "/sessions": {
-          "GET": {
-            "params": [],
-            "label": "Retrieve all sessions"
-          }
-        }
-      },
-      "description": {
-        "methods": {
-          "POST": "Login and aquire a login token. Post the fields 'user' and 'password', the response will contain the token."
-        },
-        "general": "A session is used to authenticate a user after he  provided login data. To acquire a session use POST, which will  give you a token to use as the user field of HTTP basic auth  header with an empty password. POST requires user and password  fields."
-      }
-    },
-    "storage": {
-      "paths": {
-        "/storage/{filename}": {
-          "GET": {}
-        }
-      },
-      "description": {}
-    },
-    "joboffers": {
-      "paths": {
-        "/joboffers": {
-          "POST": {
-            "params": [
-              {
-                "unique": false,
-                "name": "title_de",
-                "nullable": true,
-                "required": false,
-                "type": "string"
-              },
-              {
-                "name": "company",
-                "nullable": true,
-                "required": false,
-                "maxlength": 30,
-                "unique": false,
-                "type": "string"
-              },
-              {
-                "unique": false,
-                "name": "title_en",
-                "nullable": true,
-                "required": false,
-                "type": "string"
-              },
-              {
-                "name": "_author",
-                "nullable": true,
-                "required": false,
-                "readonly": true,
-                "data_relation": {
-                  "field": "id",
-                  "resource": "users",
-                  "embeddable": false
-                },
-                "unique": false,
-                "type": "objectid"
-              },
-              {
-                "unique": false,
-                "name": "description_en",
-                "nullable": true,
-                "required": false,
-                "type": "string"
-              },
-              {
-                "unique": false,
-                "name": "time_end",
-                "nullable": true,
-                "required": false,
-                "type": "datetime"
-              },
-              {
-                "filetype": [
-                  "png",
-                  "jpeg"
-                ],
-                "required": false,
-                "type": "media",
-                "name": "logo"
-              },
-              {
-                "filetype": [
-                  "pdf"
-                ],
-                "required": false,
-                "type": "media",
-                "name": "pdf"
-              },
-              {
-                "unique": false,
-                "name": "description_de",
-                "nullable": true,
-                "required": false,
-                "type": "string"
-              },
-              {
-                "unique": true,
-                "name": "id",
-                "required": false,
-                "type": "integer"
-              }
-            ],
-            "label": "Create a Joboffer"
-          },
-          "GET": {
-            "params": [],
-            "label": "Retrieve all joboffers"
-          }
-        },
-        "/joboffers/{_id}": {
-          "PUT": {
-            "params": [
-              {
-                "required": true,
-                "type": "string",
-                "name": "_id"
-              }
-            ],
-            "label": "Replace a Joboffer"
-          },
-          "PATCH": {
-            "params": [
-              {
-                "required": true,
-                "type": "string",
-                "name": "_id"
-              },
-              {
-                "unique": false,
-                "name": "title_de",
-                "nullable": true,
-                "required": false,
-                "type": "string"
-              },
-              {
-                "name": "company",
-                "nullable": true,
-                "required": false,
-                "maxlength": 30,
-                "unique": false,
-                "type": "string"
-              },
-              {
-                "unique": false,
-                "name": "title_en",
-                "nullable": true,
-                "required": false,
-                "type": "string"
-              },
-              {
-                "name": "_author",
-                "nullable": true,
-                "required": false,
-                "readonly": true,
-                "data_relation": {
-                  "field": "id",
-                  "resource": "users",
-                  "embeddable": false
-                },
-                "unique": false,
-                "type": "objectid"
-              },
-              {
-                "unique": false,
-                "name": "description_en",
-                "nullable": true,
-                "required": false,
-                "type": "string"
-              },
-              {
-                "unique": false,
-                "name": "time_end",
-                "nullable": true,
-                "required": false,
-                "type": "datetime"
-              },
-              {
-                "filetype": [
-                  "png",
-                  "jpeg"
-                ],
-                "required": false,
-                "type": "media",
-                "name": "logo"
-              },
-              {
-                "filetype": [
-                  "pdf"
-                ],
-                "required": false,
-                "type": "media",
-                "name": "pdf"
-              },
-              {
-                "unique": false,
-                "name": "description_de",
-                "nullable": true,
-                "required": false,
-                "type": "string"
-              },
-              {
-                "unique": true,
-                "name": "id",
-                "required": false,
-                "type": "integer"
-              }
-            ],
-            "label": "Update a Joboffer"
-          },
-          "DELETE": {
-            "params": [
-              {
-                "required": true,
-                "type": "string",
-                "name": "_id"
-              }
-            ],
-            "label": "Delete a Joboffer"
-          },
-          "GET": {
-            "params": [
-              {
-                "required": true,
-                "type": "string",
-                "name": "_id"
-              }
-            ],
-            "label": "Retrieve a Joboffer"
-          }
-        }
-      },
-      "description": {}
-    },
-    "confirmations": {
-      "paths": {
-        "/confirmations": {
-          "POST": {}
-        }
-      },
-      "description": {}
-    },
-    "events": {
-      "paths": {
-        "/events": {
-          "POST": {
-            "params": [
-              {
-                "unique": false,
-                "name": "title_de",
-                "nullable": true,
-                "required": false,
-                "type": "string"
-              },
-              {
-                "unique": false,
-                "name": "allow_email_signup",
-                "default": false,
-                "required": true,
-                "type": "boolean"
-              },
-              {
-                "readonly": true,
-                "unique": false,
-                "name": "signup_count",
-                "required": false,
-                "type": "string"
-              },
-              {
-                "filetype": [
-                  "png",
-                  "jpeg"
-                ],
-                "required": false,
-                "type": "media",
-                "name": "img_thumbnail"
-              },
-              {
-                "name": "time_end",
-                "nullable": true,
-                "later_than": "time_start",
-                "required": false,
-                "dependencies": [
-                  "time_start"
-                ],
-                "unique": false,
-                "type": "datetime"
-              },
-              {
-                "required": false,
-                "type": "objectid",
-                "name": "signups",
-                "data_relation": {
-                  "field": "id",
-                  "resource": "eventsignups",
-                  "embeddable": true
-                }
-              },
-              {
-                "unique": false,
-                "name": "time_register_start",
-                "nullable": true,
-                "required": false,
-                "type": "datetime"
-              },
-              {
-                "unique": false,
-                "name": "catchphrase_en",
-                "nullable": true,
-                "required": false,
-                "type": "string"
-              },
-              {
-                "unique": false,
-                "name": "description_de",
-                "nullable": true,
-                "required": false,
-                "type": "string"
-              },
-              {
-                "name": "time_register_end",
-                "nullable": true,
-                "later_than": "time_register_start",
-                "required": false,
-                "dependencies": [
-                  "time_register_start"
-                ],
-                "unique": false,
-                "type": "datetime"
-              },
-              {
-                "filetype": [
-                  "png",
-                  "jpeg"
-                ],
-                "required": false,
-                "type": "media",
-                "name": "img_banner"
-              },
-              {
-                "unique": false,
-                "name": "time_start",
-                "nullable": true,
-                "required": false,
-                "type": "datetime"
-              },
-              {
-                "name": "_author",
-                "nullable": true,
-                "required": false,
-                "readonly": true,
-                "data_relation": {
-                  "field": "id",
-                  "resource": "users",
-                  "embeddable": false
-                },
-                "unique": false,
-                "type": "objectid"
-              },
-              {
-                "name": "spots",
-                "min": -1,
-                "if_this_then": [
-                  "time_register_start",
-                  "time_register_end"
-                ],
-                "required": true,
-                "unique": false,
-                "type": "integer"
-              },
-              {
-                "unique": true,
-                "name": "id",
-                "required": false,
-                "type": "integer"
-              },
-              {
-                "name": "location",
-                "nullable": true,
-                "required": false,
-                "maxlength": 50,
-                "unique": false,
-                "type": "string"
-              },
-              {
-                "name": "show_infoscreen",
-                "nullable": true,
-                "default": false,
-                "required": false,
-                "unique": false,
-                "type": "boolean"
-              },
-              {
-                "unique": false,
-                "name": "additional_fields",
-                "nullable": true,
-                "required": false,
-                "type": "json_schema"
-              },
-              {
-                "filetype": [
-                  "png",
-                  "jpeg"
-                ],
-                "required": false,
-                "type": "media",
-                "name": "img_infoscreen"
-              },
-              {
-                "name": "price",
-                "nullable": true,
-                "required": false,
-                "min": 0,
-                "unique": false,
-                "type": "integer"
-              },
-              {
-                "unique": false,
-                "name": "title_en",
-                "nullable": true,
-                "required": false,
-                "type": "string"
-              },
-              {
-                "unique": false,
-                "name": "description_en",
-                "nullable": true,
-                "required": false,
-                "type": "string"
-              },
-              {
-                "filetype": [
-                  "png",
-                  "jpeg"
-                ],
-                "required": false,
-                "type": "media",
-                "name": "img_poster"
-              },
-              {
-                "name": "show_announce",
-                "nullable": true,
-                "default": false,
-                "required": false,
-                "unique": false,
-                "type": "boolean"
-              },
-              {
-                "name": "show_website",
-                "nullable": true,
-                "default": false,
-                "required": false,
-                "unique": false,
-                "type": "boolean"
-              },
-              {
-                "unique": false,
-                "name": "catchphrase_de",
-                "nullable": true,
-                "required": false,
-                "type": "string"
-              }
-            ],
-            "label": "Create a Event"
-          },
-          "GET": {
-            "params": [],
-            "label": "Retrieve all events"
-          }
-        },
-        "/events/{_id}": {
-          "PUT": {
-            "params": [
-              {
-                "required": true,
-                "type": "string",
-                "name": "_id"
-              }
-            ],
-            "label": "Replace a Event"
-          },
-          "PATCH": {
-            "params": [
-              {
-                "required": true,
-                "type": "string",
-                "name": "_id"
-              },
-              {
-                "unique": false,
-                "name": "title_de",
-                "nullable": true,
-                "required": false,
-                "type": "string"
-              },
-              {
-                "unique": false,
-                "name": "allow_email_signup",
-                "default": false,
-                "required": true,
-                "type": "boolean"
-              },
-              {
-                "readonly": true,
-                "unique": false,
-                "name": "signup_count",
-                "required": false,
-                "type": "string"
-              },
-              {
-                "filetype": [
-                  "png",
-                  "jpeg"
-                ],
-                "required": false,
-                "type": "media",
-                "name": "img_thumbnail"
-              },
-              {
-                "name": "time_end",
-                "nullable": true,
-                "later_than": "time_start",
-                "required": false,
-                "dependencies": [
-                  "time_start"
-                ],
-                "unique": false,
-                "type": "datetime"
-              },
-              {
-                "required": false,
-                "type": "objectid",
-                "name": "signups",
-                "data_relation": {
-                  "field": "id",
-                  "resource": "eventsignups",
-                  "embeddable": true
-                }
-              },
-              {
-                "unique": false,
-                "name": "time_register_start",
-                "nullable": true,
-                "required": false,
-                "type": "datetime"
-              },
-              {
-                "unique": false,
-                "name": "catchphrase_en",
-                "nullable": true,
-                "required": false,
-                "type": "string"
-              },
-              {
-                "unique": false,
-                "name": "description_de",
-                "nullable": true,
-                "required": false,
-                "type": "string"
-              },
-              {
-                "name": "time_register_end",
-                "nullable": true,
-                "later_than": "time_register_start",
-                "required": false,
-                "dependencies": [
-                  "time_register_start"
-                ],
-                "unique": false,
-                "type": "datetime"
-              },
-              {
-                "filetype": [
-                  "png",
-                  "jpeg"
-                ],
-                "required": false,
-                "type": "media",
-                "name": "img_banner"
-              },
-              {
-                "unique": false,
-                "name": "time_start",
-                "nullable": true,
-                "required": false,
-                "type": "datetime"
-              },
-              {
-                "name": "_author",
-                "nullable": true,
-                "required": false,
-                "readonly": true,
-                "data_relation": {
-                  "field": "id",
-                  "resource": "users",
-                  "embeddable": false
-                },
-                "unique": false,
-                "type": "objectid"
-              },
-              {
-                "name": "spots",
-                "min": -1,
-                "if_this_then": [
-                  "time_register_start",
-                  "time_register_end"
-                ],
-                "required": true,
-                "unique": false,
-                "type": "integer"
-              },
-              {
-                "unique": true,
-                "name": "id",
-                "required": false,
-                "type": "integer"
-              },
-              {
-                "name": "location",
-                "nullable": true,
-                "required": false,
-                "maxlength": 50,
-                "unique": false,
-                "type": "string"
-              },
-              {
-                "name": "show_infoscreen",
-                "nullable": true,
-                "default": false,
-                "required": false,
-                "unique": false,
-                "type": "boolean"
-              },
-              {
-                "unique": false,
-                "name": "additional_fields",
-                "nullable": true,
-                "required": false,
-                "type": "json_schema"
-              },
-              {
-                "filetype": [
-                  "png",
-                  "jpeg"
-                ],
-                "required": false,
-                "type": "media",
-                "name": "img_infoscreen"
-              },
-              {
-                "name": "price",
-                "nullable": true,
-                "required": false,
-                "min": 0,
-                "unique": false,
-                "type": "integer"
-              },
-              {
-                "unique": false,
-                "name": "title_en",
-                "nullable": true,
-                "required": false,
-                "type": "string"
-              },
-              {
-                "unique": false,
-                "name": "description_en",
-                "nullable": true,
-                "required": false,
-                "type": "string"
-              },
-              {
-                "filetype": [
-                  "png",
-                  "jpeg"
-                ],
-                "required": false,
-                "type": "media",
-                "name": "img_poster"
-              },
-              {
-                "name": "show_announce",
-                "nullable": true,
-                "default": false,
-                "required": false,
-                "unique": false,
-                "type": "boolean"
-              },
-              {
-                "name": "show_website",
-                "nullable": true,
-                "default": false,
-                "required": false,
-                "unique": false,
-                "type": "boolean"
-              },
-              {
-                "unique": false,
-                "name": "catchphrase_de",
-                "nullable": true,
-                "required": false,
-                "type": "string"
-              }
-            ],
-            "label": "Update a Event"
-          },
-          "DELETE": {
-            "params": [
-              {
-                "required": true,
-                "type": "string",
-                "name": "_id"
-              }
-            ],
-            "label": "Delete a Event"
-          },
-          "GET": {
-            "params": [
-              {
-                "required": true,
-                "type": "string",
-                "name": "_id"
-              }
-            ],
-            "label": "Retrieve a Event"
-          }
-        }
-      },
-      "description": {
-        "fields": {
-          "additional_fields": "must be provided in form of a JSON-Schema. You can add here fields you want to know from people signing up going further than their email-address",
-          "price": "Price of the event as Integer in Rappen.",
-          "allow_email_signup": "If False, only AMIV-Members can sign up for this event",
-          "spots": "For no limit, set to '0'. If no signup required, set to '-1'. Otherwise just provide an integer."
-        },
-        "methods": {
-          "GET": "You are always allowed, even without session, to view AMIV-Events"
-        },
-        "general": "An Event is basically everything happening in the AMIV. All time fields have the format YYYY-MM-DDThh:mmZ, e.g. 2014-12-20T11:50:06Z"
-      }
-    }
-  },
-  "api_name": "API",
-  "base": "http:///",
-  "server_name": null
-}
\ No newline at end of file
+{"domains":{"files":{"paths":{"/files/{_id}":{"PUT":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Replace a File"},"DELETE":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Delete a File"},"GET":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Retrieve a File"}},"/files":{"POST":{"params":[{"required":false,"type":"objectid","name":"study_doc","data_relation":{"field":"id","resource":"studydocuments","embeddable":true}},{"name":"name","nullable":true,"required":false,"maxlength":100,"unique":false,"type":"string"},{"required":true,"type":"media","name":"data"},{"name":"_author","nullable":true,"required":false,"readonly":true,"data_relation":{"field":"id","resource":"users","embeddable":false},"unique":false,"type":"objectid"},{"unique":false,"name":"study_doc_id","data_relation":{"field":"id","resource":"studydocuments","embeddable":false},"required":true,"type":"objectid"},{"unique":true,"name":"id","required":false,"type":"integer"}],"label":"Create a File"},"GET":{"params":[],"label":"Retrieve all files"}}},"description":{}},"studydocuments":{"paths":{"/studydocuments/{_id}":{"PUT":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Replace a Studydocument"},"PATCH":{"params":[{"required":true,"type":"string","name":"_id"},{"required":false,"type":"objectid","name":"files","data_relation":{"field":"id","resource":"files","embeddable":true}},{"name":"name","nullable":true,"required":false,"maxlength":100,"unique":false,"type":"string"},{"name":"professor","nullable":true,"required":false,"maxlength":100,"unique":false,"type":"string"},{"name":"exam_session","nullable":true,"required":false,"maxlength":10,"unique":false,"type":"string"},{"name":"_author","nullable":true,"required":false,"readonly":true,"data_relation":{"field":"id","resource":"users","embeddable":false},"unique":false,"type":"objectid"},{"name":"author_name","nullable":true,"required":false,"maxlength":100,"unique":false,"type":"string"},{"unique":false,"name":"semester","nullable":true,"required":false,"type":"integer"},{"name":"department","nullable":true,"required":false,"maxlength":4,"unique":false,"type":"string"},{"name":"lecture","nullable":true,"required":false,"maxlength":100,"unique":false,"type":"string"},{"name":"type","nullable":true,"required":false,"maxlength":30,"unique":false,"type":"string"},{"unique":true,"name":"id","required":false,"type":"integer"}],"label":"Update a Studydocument"},"DELETE":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Delete a Studydocument"},"GET":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Retrieve a Studydocument"}},"/studydocuments":{"POST":{"params":[{"required":false,"type":"objectid","name":"files","data_relation":{"field":"id","resource":"files","embeddable":true}},{"name":"name","nullable":true,"required":false,"maxlength":100,"unique":false,"type":"string"},{"name":"professor","nullable":true,"required":false,"maxlength":100,"unique":false,"type":"string"},{"name":"exam_session","nullable":true,"required":false,"maxlength":10,"unique":false,"type":"string"},{"name":"_author","nullable":true,"required":false,"readonly":true,"data_relation":{"field":"id","resource":"users","embeddable":false},"unique":false,"type":"objectid"},{"name":"author_name","nullable":true,"required":false,"maxlength":100,"unique":false,"type":"string"},{"unique":false,"name":"semester","nullable":true,"required":false,"type":"integer"},{"name":"department","nullable":true,"required":false,"maxlength":4,"unique":false,"type":"string"},{"name":"lecture","nullable":true,"required":false,"maxlength":100,"unique":false,"type":"string"},{"name":"type","nullable":true,"required":false,"maxlength":30,"unique":false,"type":"string"},{"unique":true,"name":"id","required":false,"type":"integer"}],"label":"Create a Studydocument"},"GET":{"params":[],"label":"Retrieve all studydocuments"}}},"description":{"fields":{"semester":"Study-Semester as an Integer starting with first semester Bachelor."},"general":"Study-documents are basically all documents that are connected to a course. This resource provides meta-data for the assigned files."}},"users":{"paths":{"/users/{_id}":{"PUT":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Replace a User"},"PATCH":{"params":[{"required":true,"type":"string","name":"_id"},{"name":"legi","nullable":true,"required":false,"maxlength":8,"unique":true,"type":"string"},{"unique":false,"name":"firstname","maxlength":50,"required":true,"type":"string"},{"required":false,"type":"objectid","name":"sessions","data_relation":{"field":"id","resource":"sessions","embeddable":true}},{"required":false,"type":"objectid","name":"groupmemberships","data_relation":{"field":"id","resource":"groupusermembers","embeddable":true}},{"unique":false,"name":"lastname","maxlength":50,"required":true,"type":"string"},{"name":"rfid","nullable":true,"required":false,"maxlength":6,"unique":true,"type":"string"},{"name":"_author","nullable":true,"required":false,"readonly":true,"data_relation":{"field":"id","resource":"users","embeddable":false},"unique":false,"type":"objectid"},{"regex":"^.+@.+$","name":"email","required":true,"maxlength":100,"unique":true,"type":"string"},{"name":"phone","nullable":true,"required":false,"maxlength":20,"unique":false,"type":"string"},{"name":"membership","default":"none","required":true,"maxlength":13,"unique":false,"type":"string"},{"required":false,"type":"objectid","name":"eventsignups","data_relation":{"field":"id","resource":"eventsignups","embeddable":true}},{"name":"nethz","nullable":true,"required":false,"maxlength":30,"unique":true,"type":"string","empty":false},{"name":"gender","required":true,"allowed":["male","female"],"unique":false,"type":"string","maxlength":6},{"name":"department","nullable":true,"required":false,"allowed":["itet","mavt"],"unique":false,"type":"string","maxlength":5},{"name":"password","nullable":true,"required":false,"maxlength":100,"unique":false,"type":"string"},{"unique":true,"name":"id","required":false,"type":"integer"},{"name":"send_newsletter","nullable":true,"default":true,"required":false,"unique":false,"type":"boolean"}],"label":"Update a User"},"DELETE":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Delete a User"},"GET":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Retrieve a User"}},"/users/{nethz}":{"GET":{"params":[{"name":"nethz","nullable":true,"required":false,"maxlength":30,"unique":true,"type":"string","empty":false}],"label":"Retrieve a User"}},"/users":{"POST":{"params":[{"name":"legi","nullable":true,"required":false,"maxlength":8,"unique":true,"type":"string"},{"unique":false,"name":"firstname","maxlength":50,"required":true,"type":"string"},{"required":false,"type":"objectid","name":"sessions","data_relation":{"field":"id","resource":"sessions","embeddable":true}},{"required":false,"type":"objectid","name":"groupmemberships","data_relation":{"field":"id","resource":"groupusermembers","embeddable":true}},{"unique":false,"name":"lastname","maxlength":50,"required":true,"type":"string"},{"name":"rfid","nullable":true,"required":false,"maxlength":6,"unique":true,"type":"string"},{"name":"_author","nullable":true,"required":false,"readonly":true,"data_relation":{"field":"id","resource":"users","embeddable":false},"unique":false,"type":"objectid"},{"regex":"^.+@.+$","name":"email","required":true,"maxlength":100,"unique":true,"type":"string"},{"name":"phone","nullable":true,"required":false,"maxlength":20,"unique":false,"type":"string"},{"name":"membership","default":"none","required":true,"maxlength":13,"unique":false,"type":"string"},{"required":false,"type":"objectid","name":"eventsignups","data_relation":{"field":"id","resource":"eventsignups","embeddable":true}},{"name":"nethz","nullable":true,"required":false,"maxlength":30,"unique":true,"type":"string","empty":false},{"name":"gender","required":true,"allowed":["male","female"],"unique":false,"type":"string","maxlength":6},{"name":"department","nullable":true,"required":false,"allowed":["itet","mavt"],"unique":false,"type":"string","maxlength":5},{"name":"password","nullable":true,"required":false,"maxlength":100,"unique":false,"type":"string"},{"unique":true,"name":"id","required":false,"type":"integer"},{"name":"send_newsletter","nullable":true,"default":true,"required":false,"unique":false,"type":"boolean"}],"label":"Create a User"},"GET":{"params":[],"label":"Retrieve all users"}}},"description":{"methods":{"GET":"Authorization is required for most of the fields"},"general":"In general, the user data will be generated from LDAP-Data. However, one might change the RFID-Number or the membership-status. Extraordinary members may not have a LDAP-Account and can therefore access all given fields."}},"":{"paths":{"/":{"GET":{}}},"description":{}},"purchases":{"paths":{"/purchases":{"POST":{"params":[{"unique":false,"name":"slot","nullable":true,"required":false,"type":"integer"},{"name":"user_id","nullable":true,"required":false,"data_relation":{"field":"id","resource":"users","embeddable":false},"unique":false,"type":"objectid"},{"unique":false,"name":"timestamp","nullable":true,"required":false,"type":"datetime"},{"name":"_author","nullable":true,"required":false,"readonly":true,"data_relation":{"field":"id","resource":"users","embeddable":false},"unique":false,"type":"objectid"},{"name":"type","nullable":true,"required":false,"maxlength":5,"unique":false,"type":"string"},{"unique":true,"name":"id","required":false,"type":"integer"}],"label":"Create a Purchase"},"GET":{"params":[],"label":"Retrieve all purchases"}},"/purchases/{_id}":{"PUT":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Replace a Purchase"},"PATCH":{"params":[{"required":true,"type":"string","name":"_id"},{"unique":false,"name":"slot","nullable":true,"required":false,"type":"integer"},{"name":"user_id","nullable":true,"required":false,"data_relation":{"field":"id","resource":"users","embeddable":false},"unique":false,"type":"objectid"},{"unique":false,"name":"timestamp","nullable":true,"required":false,"type":"datetime"},{"name":"_author","nullable":true,"required":false,"readonly":true,"data_relation":{"field":"id","resource":"users","embeddable":false},"unique":false,"type":"objectid"},{"name":"type","nullable":true,"required":false,"maxlength":5,"unique":false,"type":"string"},{"unique":true,"name":"id","required":false,"type":"integer"}],"label":"Update a Purchase"},"DELETE":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Delete a Purchase"},"GET":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Retrieve a Purchase"}}},"description":{"fields":{"slot":"Slot in the machine which was purchased(different items, which may have different prices)."},"general":"A beer machine or kaffi machine transaction. Users should be able to get beer or kaffi, if their last timestamp is older than one day and they are AMIV members. This resource is used to log their purchases."}},"docs":{"paths":{"/docs/":{"GET":{}},"/docs/spec.json":{"GET":{}}},"description":{}},"groupusermembers":{"paths":{"/groupusermembers/{_id}":{"DELETE":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Delete a Groupusermember"},"GET":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Retrieve a Groupusermember"}},"/groupusermembers":{"POST":{"params":[{"name":"group_id","self_enrollment_must_be_allowed":true,"required":true,"unique_combination":["groupusermembers","user_id"],"data_relation":{"field":"id","resource":"groups","embeddable":false},"unique":false,"type":"objectid"},{"name":"user_id","unique_combination":["groupusermembers","group_id"],"required":true,"only_self_enrollment_for_group":true,"data_relation":{"field":"id","resource":"users","embeddable":false},"unique":false,"type":"objectid"},{"name":"_author","nullable":true,"required":false,"readonly":true,"data_relation":{"field":"id","resource":"users","embeddable":false},"unique":false,"type":"objectid"},{"unique":true,"name":"id","required":false,"type":"integer"}],"label":"Create a Groupusermember"},"GET":{"params":[],"label":"Retrieve all groupusermembers"}}},"description":{"general":"Assignment of registered users to groups."}},"eventsignups":{"paths":{"/eventsignups/{_id}":{"PUT":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Replace a Eventsignup"},"PATCH":{"params":[{"required":true,"type":"string","name":"_id"},{"unique":false,"name":"additional_fields","nullable":true,"required":false,"type":"json_event_field"},{"name":"user_id","unique_combination":["eventsignups","event_id"],"required":true,"not_patchable":true,"data_relation":{"field":"id","resource":"users","embeddable":false},"only_self_enrollment_for_event":true,"unique":false,"type":"objectid"},{"signup_requirements":true,"name":"event_id","unique_combination":["eventsignups","user_id","email"],"required":true,"not_patchable":true,"data_relation":{"field":"id","resource":"events","embeddable":false},"unique":false,"type":"objectid"},{"name":"_author","nullable":true,"required":false,"readonly":true,"data_relation":{"field":"id","resource":"users","embeddable":false},"unique":false,"type":"objectid"},{"regex":"^.+@.+$","name":"email","email_signup_must_be_allowed":true,"nullable":true,"required":false,"unique_combination":["eventsignups","event_id"],"not_patchable":true,"maxlength":100,"unique":false,"type":"objectid","only_anonymous":true},{"name":"_confirmed","nullable":true,"default":false,"required":false,"unique":false,"type":"boolean"},{"unique":true,"name":"id","required":false,"type":"integer"}],"label":"Update a Eventsignup"},"DELETE":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Delete a Eventsignup"},"GET":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Retrieve a Eventsignup"}},"/eventsignups":{"GET":{"params":[],"label":"Retrieve all eventsignups"}}},"description":{"fields":{"additional_fields":"Data-schema depends on 'additional_fields' from the mapped event. Please provide in json-format.","user_id":"To sign up as external user, set 'user_id' to '-1'","email":"For registered users, this is just a projection of your general email-address. External users need to provide their email here."},"general":"You can signup here for an existing event inside of the registration-window. External Users can only sign up to public events."}},"static":{"paths":{"/static/bootstrap/{filename}":{"GET":{}},"/static/{filename}":{"GET":{}}},"description":{}},"groups":{"paths":{"/groups":{"POST":{"params":[{"required":false,"type":"objectid","name":"user_subscribers","data_relation":{"field":"id","resource":"groupusermembers","embeddable":true}},{"required":false,"type":"objectid","name":"addresses","data_relation":{"field":"id","resource":"forwardaddresses","embeddable":true}},{"unique":true,"name":"name","maxlength":100,"required":true,"type":"string"},{"unique":false,"name":"has_zoidberg_share","default":false,"required":true,"type":"boolean"},{"unique":false,"name":"allow_self_enrollment","default":false,"required":true,"type":"boolean"},{"name":"_author","nullable":true,"required":false,"readonly":true,"data_relation":{"field":"id","resource":"users","embeddable":false},"unique":false,"type":"objectid"},{"unique":false,"name":"moderator_id","data_relation":{"field":"id","resource":"users","embeddable":false},"required":true,"type":"objectid"},{"required":false,"type":"objectid","name":"owner","data_relation":{"field":"id","resource":"users","embeddable":true}},{"unique":true,"name":"id","required":false,"type":"integer"},{"unique":false,"name":"permissions","nullable":true,"required":false,"type":"permissions_jsonschema"}],"label":"Create a Group"},"GET":{"params":[],"label":"Retrieve all groups"}},"/groups/{_id}":{"PUT":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Replace a Group"},"PATCH":{"params":[{"required":true,"type":"string","name":"_id"},{"required":false,"type":"objectid","name":"user_subscribers","data_relation":{"field":"id","resource":"groupusermembers","embeddable":true}},{"required":false,"type":"objectid","name":"addresses","data_relation":{"field":"id","resource":"forwardaddresses","embeddable":true}},{"unique":true,"name":"name","maxlength":100,"required":true,"type":"string"},{"unique":false,"name":"has_zoidberg_share","default":false,"required":true,"type":"boolean"},{"unique":false,"name":"allow_self_enrollment","default":false,"required":true,"type":"boolean"},{"name":"_author","nullable":true,"required":false,"readonly":true,"data_relation":{"field":"id","resource":"users","embeddable":false},"unique":false,"type":"objectid"},{"unique":false,"name":"moderator_id","data_relation":{"field":"id","resource":"users","embeddable":false},"required":true,"type":"objectid"},{"required":false,"type":"objectid","name":"owner","data_relation":{"field":"id","resource":"users","embeddable":true}},{"unique":true,"name":"id","required":false,"type":"integer"},{"unique":false,"name":"permissions","nullable":true,"required":false,"type":"permissions_jsonschema"}],"label":"Update a Group"},"DELETE":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Delete a Group"},"GET":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Retrieve a Group"}}},"description":{"fields":{"has_zoidberg_share":"Wether the group has a share in the amiv storage","allow_self_enrollment":"If true, the group can be seen by all users and they can subscribe themselves","permissions":"permissions the group grants. has to be according to the jsonschema available at /notyetavailable"},"general":"This resource describes the different teams in AMIV.A group can grant API permissions and can be reached with several addresses. To see the subscriptions, have a look at '/groupusermembers'. To see the mail addresses, see '/forwardaddresses'."}},"forwardaddresses":{"paths":{"/forwardaddresses/{_id}":{"PUT":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Replace a Forwardaddresse"},"PATCH":{"params":[{"required":true,"type":"string","name":"_id"},{"name":"group_id","required":true,"data_relation":{"field":"id","resource":"groups","embeddable":false},"only_groups_you_moderate":true,"unique":false,"type":"objectid"},{"required":false,"type":"objectid","name":"group","data_relation":{"field":"id","resource":"groups","embeddable":true}},{"unique":true,"name":"id","required":false,"type":"integer"},{"unique":true,"name":"address","maxlength":100,"required":true,"type":"string"},{"name":"_author","nullable":true,"required":false,"readonly":true,"data_relation":{"field":"id","resource":"users","embeddable":false},"unique":false,"type":"objectid"}],"label":"Update a Forwardaddresse"},"DELETE":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Delete a Forwardaddresse"},"GET":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Retrieve a Forwardaddresse"}},"/forwardaddresses":{"POST":{"params":[{"name":"group_id","required":true,"data_relation":{"field":"id","resource":"groups","embeddable":false},"only_groups_you_moderate":true,"unique":false,"type":"objectid"},{"required":false,"type":"objectid","name":"group","data_relation":{"field":"id","resource":"groups","embeddable":true}},{"unique":true,"name":"id","required":false,"type":"integer"},{"unique":true,"name":"address","maxlength":100,"required":true,"type":"string"},{"name":"_author","nullable":true,"required":false,"readonly":true,"data_relation":{"field":"id","resource":"users","embeddable":false},"unique":false,"type":"objectid"}],"label":"Create a Forwardaddresse"},"GET":{"params":[],"label":"Retrieve all forwardaddresses"}}},"description":{"fields":{"address":"E-Mail address to forward"},"general":"An email address associated with a group. By adding an address here, all mails sent to that address will be forwarded to all members of the associated group."}},"media":{"paths":{"/media/{_id}":{"GET":{}}},"description":{}},"sessions":{"paths":{"/sessions/{_id}":{"PUT":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Replace a Session"},"PATCH":{"params":[{"required":true,"type":"string","name":"_id"},{"unique":false,"name":"token","nullable":true,"required":false,"type":"string"},{"unique":false,"name":"user_id","data_relation":{"field":"id","resource":"users","embeddable":false},"required":true,"type":"objectid"},{"name":"_author","nullable":true,"required":false,"readonly":true,"data_relation":{"field":"id","resource":"users","embeddable":false},"unique":false,"type":"objectid"},{"unique":true,"name":"id","required":false,"type":"integer"}],"label":"Update a Session"},"DELETE":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Delete a Session"},"GET":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Retrieve a Session"}},"/sessions":{"GET":{"params":[],"label":"Retrieve all sessions"}}},"description":{"methods":{"POST":"Login and aquire a login token. Post the fields 'user' and 'password', the response will contain the token."},"general":"A session is used to authenticate a user after he  provided login data. To acquire a session use POST, which will  give you a token to use as the user field of HTTP basic auth  header with an empty password. POST requires user and password  fields."}},"storage":{"paths":{"/storage/{filename}":{"GET":{}}},"description":{}},"joboffers":{"paths":{"/joboffers":{"POST":{"params":[{"unique":false,"name":"title_de","nullable":true,"required":false,"type":"string"},{"name":"company","nullable":true,"required":false,"maxlength":30,"unique":false,"type":"string"},{"unique":false,"name":"title_en","nullable":true,"required":false,"type":"string"},{"name":"_author","nullable":true,"required":false,"readonly":true,"data_relation":{"field":"id","resource":"users","embeddable":false},"unique":false,"type":"objectid"},{"unique":false,"name":"description_en","nullable":true,"required":false,"type":"string"},{"unique":false,"name":"time_end","nullable":true,"required":false,"type":"datetime"},{"filetype":["png","jpeg"],"required":false,"type":"media","name":"logo"},{"filetype":["pdf"],"required":false,"type":"media","name":"pdf"},{"unique":false,"name":"description_de","nullable":true,"required":false,"type":"string"},{"unique":true,"name":"id","required":false,"type":"integer"}],"label":"Create a Joboffer"},"GET":{"params":[],"label":"Retrieve all joboffers"}},"/joboffers/{_id}":{"PUT":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Replace a Joboffer"},"PATCH":{"params":[{"required":true,"type":"string","name":"_id"},{"unique":false,"name":"title_de","nullable":true,"required":false,"type":"string"},{"name":"company","nullable":true,"required":false,"maxlength":30,"unique":false,"type":"string"},{"unique":false,"name":"title_en","nullable":true,"required":false,"type":"string"},{"name":"_author","nullable":true,"required":false,"readonly":true,"data_relation":{"field":"id","resource":"users","embeddable":false},"unique":false,"type":"objectid"},{"unique":false,"name":"description_en","nullable":true,"required":false,"type":"string"},{"unique":false,"name":"time_end","nullable":true,"required":false,"type":"datetime"},{"filetype":["png","jpeg"],"required":false,"type":"media","name":"logo"},{"filetype":["pdf"],"required":false,"type":"media","name":"pdf"},{"unique":false,"name":"description_de","nullable":true,"required":false,"type":"string"},{"unique":true,"name":"id","required":false,"type":"integer"}],"label":"Update a Joboffer"},"DELETE":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Delete a Joboffer"},"GET":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Retrieve a Joboffer"}}},"description":{}},"confirmations":{"paths":{"/confirmations":{"POST":{}}},"description":{}},"events":{"paths":{"/events":{"POST":{"params":[{"unique":false,"name":"title_de","nullable":true,"required":false,"type":"string"},{"unique":false,"name":"allow_email_signup","default":false,"required":true,"type":"boolean"},{"readonly":true,"unique":false,"name":"signup_count","required":false,"type":"string"},{"filetype":["png","jpeg"],"required":false,"type":"media","name":"img_thumbnail"},{"name":"time_end","nullable":true,"later_than":"time_start","required":false,"dependencies":["time_start"],"unique":false,"type":"datetime"},{"required":false,"type":"objectid","name":"signups","data_relation":{"field":"id","resource":"eventsignups","embeddable":true}},{"unique":false,"name":"time_register_start","nullable":true,"required":false,"type":"datetime"},{"unique":false,"name":"catchphrase_en","nullable":true,"required":false,"type":"string"},{"unique":false,"name":"description_de","nullable":true,"required":false,"type":"string"},{"name":"time_register_end","nullable":true,"later_than":"time_register_start","required":false,"dependencies":["time_register_start"],"unique":false,"type":"datetime"},{"filetype":["png","jpeg"],"required":false,"type":"media","name":"img_banner"},{"unique":false,"name":"time_start","nullable":true,"required":false,"type":"datetime"},{"name":"_author","nullable":true,"required":false,"readonly":true,"data_relation":{"field":"id","resource":"users","embeddable":false},"unique":false,"type":"objectid"},{"name":"spots","min":-1,"if_this_then":["time_register_start","time_register_end"],"required":true,"unique":false,"type":"integer"},{"unique":true,"name":"id","required":false,"type":"integer"},{"name":"location","nullable":true,"required":false,"maxlength":50,"unique":false,"type":"string"},{"name":"show_infoscreen","nullable":true,"default":false,"required":false,"unique":false,"type":"boolean"},{"unique":false,"name":"additional_fields","nullable":true,"required":false,"type":"json_schema"},{"filetype":["png","jpeg"],"required":false,"type":"media","name":"img_infoscreen"},{"name":"price","nullable":true,"required":false,"min":0,"unique":false,"type":"integer"},{"unique":false,"name":"title_en","nullable":true,"required":false,"type":"string"},{"unique":false,"name":"description_en","nullable":true,"required":false,"type":"string"},{"filetype":["png","jpeg"],"required":false,"type":"media","name":"img_poster"},{"name":"show_announce","nullable":true,"default":false,"required":false,"unique":false,"type":"boolean"},{"name":"show_website","nullable":true,"default":false,"required":false,"unique":false,"type":"boolean"},{"unique":false,"name":"catchphrase_de","nullable":true,"required":false,"type":"string"}],"label":"Create a Event"},"GET":{"params":[],"label":"Retrieve all events"}},"/events/{_id}":{"PUT":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Replace a Event"},"PATCH":{"params":[{"required":true,"type":"string","name":"_id"},{"unique":false,"name":"title_de","nullable":true,"required":false,"type":"string"},{"unique":false,"name":"allow_email_signup","default":false,"required":true,"type":"boolean"},{"readonly":true,"unique":false,"name":"signup_count","required":false,"type":"string"},{"filetype":["png","jpeg"],"required":false,"type":"media","name":"img_thumbnail"},{"name":"time_end","nullable":true,"later_than":"time_start","required":false,"dependencies":["time_start"],"unique":false,"type":"datetime"},{"required":false,"type":"objectid","name":"signups","data_relation":{"field":"id","resource":"eventsignups","embeddable":true}},{"unique":false,"name":"time_register_start","nullable":true,"required":false,"type":"datetime"},{"unique":false,"name":"catchphrase_en","nullable":true,"required":false,"type":"string"},{"unique":false,"name":"description_de","nullable":true,"required":false,"type":"string"},{"name":"time_register_end","nullable":true,"later_than":"time_register_start","required":false,"dependencies":["time_register_start"],"unique":false,"type":"datetime"},{"filetype":["png","jpeg"],"required":false,"type":"media","name":"img_banner"},{"unique":false,"name":"time_start","nullable":true,"required":false,"type":"datetime"},{"name":"_author","nullable":true,"required":false,"readonly":true,"data_relation":{"field":"id","resource":"users","embeddable":false},"unique":false,"type":"objectid"},{"name":"spots","min":-1,"if_this_then":["time_register_start","time_register_end"],"required":true,"unique":false,"type":"integer"},{"unique":true,"name":"id","required":false,"type":"integer"},{"name":"location","nullable":true,"required":false,"maxlength":50,"unique":false,"type":"string"},{"name":"show_infoscreen","nullable":true,"default":false,"required":false,"unique":false,"type":"boolean"},{"unique":false,"name":"additional_fields","nullable":true,"required":false,"type":"json_schema"},{"filetype":["png","jpeg"],"required":false,"type":"media","name":"img_infoscreen"},{"name":"price","nullable":true,"required":false,"min":0,"unique":false,"type":"integer"},{"unique":false,"name":"title_en","nullable":true,"required":false,"type":"string"},{"unique":false,"name":"description_en","nullable":true,"required":false,"type":"string"},{"filetype":["png","jpeg"],"required":false,"type":"media","name":"img_poster"},{"name":"show_announce","nullable":true,"default":false,"required":false,"unique":false,"type":"boolean"},{"name":"show_website","nullable":true,"default":false,"required":false,"unique":false,"type":"boolean"},{"unique":false,"name":"catchphrase_de","nullable":true,"required":false,"type":"string"}],"label":"Update a Event"},"DELETE":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Delete a Event"},"GET":{"params":[{"required":true,"type":"string","name":"_id"}],"label":"Retrieve a Event"}}},"description":{"fields":{"additional_fields":"must be provided in form of a JSON-Schema. You can add here fields you want to know from people signing up going further than their email-address","price":"Price of the event as Integer in Rappen.","allow_email_signup":"If False, only AMIV-Members can sign up for this event","spots":"For no limit, set to '0'. If no signup required, set to '-1'. Otherwise just provide an integer."},"methods":{"GET":"You are always allowed, even without session, to view AMIV-Events"},"general":"An Event is basically everything happening in the AMIV. All time fields have the format YYYY-MM-DDThh:mmZ, e.g. 2014-12-20T11:50:06Z"}}},"api_name":"API","base":"http:///","server_name":null}
diff --git a/admin/lib/cust/main.css b/admin/lib/cust/main.css
index 46eed464137f7895d0e7768bcb736f91e4d41462..1de6c3428b1f1670afec431a18ab3e208623f019 100644
--- a/admin/lib/cust/main.css
+++ b/admin/lib/cust/main.css
@@ -139,7 +139,7 @@ body {
 	MAIN NAVBAR
 */
 
-.navbar-main .cust-menu>li {
+.navbar-main .container-fluid>ul>li {
     float: left;
 }
 
diff --git a/admin/lib/cust/main.js b/admin/lib/cust/main.js
index ab4af9ad890d40e936f93794d54dc6d358a76efa..27febd792e77777f47b393aa43e894ab4b652ab7 100644
--- a/admin/lib/cust/main.js
+++ b/admin/lib/cust/main.js
@@ -22,18 +22,27 @@ var tools = {
     },
 
     // Modal function
-    modalStatus: 0,
+    modalFunc: {
+        init: 0,
+    },
     modal: function(attr) {
         attr = attr || {};
+        if (attr.success !== undefined && typeof(attr.success) == 'function')
+            tools.modalFunc.success = attr.success;
+        if (attr.cancel !== undefined && typeof(attr.cancel) == 'function')
+            tools.modalFunc.cancel = attr.cancel;
+        if (!tools.modalFunc.init) {
+            $('.modalCont .modal-footer .btn-primary').click(function() {
+                $('.modalCont').off('hide.bs.modal').modal('hide');
+                tools.modalFunc.success();
+            });
+            $('.modalCont').on('hide.bs.modal', tools.modalFunc.cancel);
+            tools.modalFunc.init = 1;
+        }
         $('.modalCont .modal-title').html(attr.head);
         $('.modalCont .modal-body').html(attr.body);
-        $('.modalCont .modal-footer .btn-primary').html(attr.button).click(function() {
-            $('.modalCont').off('hide.bs.modal').modal('hide');
-            if (typeof(attr.success) == 'function')
-                attr.success();
-        });
-        if (typeof(attr.cancel) == 'function')
-            $('.modalCont').modal('show').on('hide.bs.modal', attr.cancel);
+        $('.modalCont .modal-footer .btn-primary').html(attr.button);
+        $('.modalCont').modal('show');
     },
 
     // Ajax loading gunction and getting the tools
diff --git a/admin/tools/users.tool b/admin/tools/users.tool
index 43ad79511ba68e22db04f5d27e0ea74addefd30c..809a9939188615e8505df6a1e273875b88ab812c 100644
--- a/admin/tools/users.tool
+++ b/admin/tools/users.tool
@@ -17,40 +17,98 @@
 	}
 </style>
 <script type="text/javascript">
+	var users = {
+		showInTable: ['firstname', 'lastname', 'email', 'membership'],
+		curUserData: null,
+	};
+
 	tools.ui.menu({
-		'Add User': {
-			callback: function() {
-				console.log('noice');
-			}
+		'<span class="glyphicon glyphicon-user" aria-hidden="true"></span>': {
+			callback: function() {}
+		},
+		'<span class="glyphicon glyphicon-arrow-left" aria-hidden="true"></span>': {
+			callback: function() {}
+		},
+		'<span class="users-cur-page" aria-hidden="true">0</span>': {
+			callback: function() {}
+		},
+		'<span class="glyphicon glyphicon-arrow-right" aria-hidden="true"></span>': {
+			callback: function() {}
+		},
+		'<span class="glyphicon glyphicon-search" aria-hidden="true"></span>': {
+			callback: function() {}
 		}
 	});
 
+	function inspectUser() {
+		var newUserData = {};
+		$('.users-user-edit-table tr').each(function() {
+			newUserData[$(this).children('td:nth-child(1)').html()] = $(this).children('td:nth-child(2)').html();
+		});
+		var changed = false,
+			curUserDataChanged = {};
+		for (var i in newUserData) {
+			if (newUserData[i] != String(curUserData[i])) {
+				changed = true;
+				curUserDataChanged[i] = newUserData[i];
+			}
+		}
+		if (changed) {
+			amivcore.users.PATCH({
+				id: curUserData.id,
+				header: {
+					'If-Match': $('.users-user-edit-table').attr('data-etag')
+				},
+				data: curUserDataChanged
+			}, function(){
+				tools.log('User Updated', 's');
+				tools.getTool('users');
+			});
+		}
+	}
+
 	function showDetails() {
-		console.log($(this).attr('data-id'));
+		amivcore.users.GET({
+			id: $(this).attr('data-id')
+		}, function(ret) {
+			curUserData = ret;
+			var tmp = '<table class="table table-hover users-user-edit-table" data-etag="' + ret['_etag'] + '"><tbody>';
+			for (var cur in ret)
+				if (cur.charAt(0) != '_')
+					tmp += '<tr><td>' + cur + '</td><td contenteditable>' + ret[cur] + '</td></tr>'
+			tmp += '</tbody></table>';
+
+			tools.modal({
+				head: ret.firstname + ' ' + ret.lastname,
+				body: tmp,
+				button: 'OK',
+				success: inspectUser,
+				cancel: function() {
+					console.log('Canceled');
+				}
+			});
+
+		});;
 	}
 
-	var showInTable = ['firstname', 'lastname', 'email', 'membership'],
-		curData = null;
 	amivcore.users.GET({
 		data: {
-			'max_results': '50'
+			//'max_results': '50'
 		}
 	}, function(ret) {
 
-		if (!ret || ret['_items'].length == 0) {
+		if (ret === undefined || ret['_items'].length == 0) {
 			tools.log('No Data', 'w');
 			return;
 		}
 
-		curData = ret['_items'];
-
-		showInTable.forEach(function(i) {
+		users.showInTable.forEach(function(i) {
 			$('.users-table thead tr').append('<th>' + i + '</th>');
 		});
 
 		for (var n in ret['_items']) {
 			var tmp = '';
-			showInTable.forEach(function(i) {
+			users.showInTable.forEach(function(i) {
 				tmp += '<td>' + ret['_items'][n][i] + '</td>';
 			});
 			$('.users-table tbody').append('<tr data-id="' + ret['_items'][n]['id'] + '">' + tmp + '</tr>');
diff --git a/public/css/cards.css b/public/css/cards.css
index b09fe4253ab2e3808a8050937168bbfaf98f3bd1..f107a1611485a3fe96ff55e0a04667d6d868b5dd 100644
--- a/public/css/cards.css
+++ b/public/css/cards.css
@@ -12,8 +12,9 @@
 #cardtitle.card span.card-title {
     color: #E8452B;
     font-size: 24px;
-    font-weight: 300;
+    font-weight: bold;
     text-transform: uppercase;
+    
 }
 
 .card .card-image {
@@ -26,6 +27,7 @@
   position: relative;
   z-index: -1;
   width: 100%;
+  min-height: 180px;
 }
 .card .card-image span.card-title {
   position: absolute;
@@ -37,7 +39,7 @@
   width: 100%;
   background: rgba(100%, 100%, 100%, 0.5);
   text-transform: uppercase;
-  font-weight: 300;
+  font-weight: bold;
 }
 .card .card-content {
   padding: 16px;
diff --git a/public/css/logo-nav.css b/public/css/logo-nav.css
index 99c822cc24be429e100b79acf4c1dbcddb126b43..fb83c60c3ff3d17f80837d56c726ff421d0247a2 100644
--- a/public/css/logo-nav.css
+++ b/public/css/logo-nav.css
@@ -24,4 +24,4 @@ body {
     .navbar-fixed-top .navbar-brand {
         padding: 20px 0;
     }
-}
\ No newline at end of file
+}
diff --git a/public/index.html b/public/index.html
index ee48ca8d7df9c7922ce68a4b26fe8e3f59aac33f..441fd699ad5b689048eb8560531f54845acc88ec 100644
--- a/public/index.html
+++ b/public/index.html
@@ -48,7 +48,7 @@
                 </a>
             </div>
             <!-- Collect the nav links, forms, and other content for toggling -->
-            <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
+            <div class="collapse navbar-collapse nav-collapse collapse" id="bs-example-navbar-collapse-1">
                 <ul class="nav navbar-nav">
                     <li>
                         <a href="#">Home</a>
@@ -62,12 +62,6 @@
                     <li>
                         <a href="#">Jobbörse</a>
                     </li>
-                    <form class="navbar-form navbar-left" role="search">
-                        <div class="form-group">
-                            <input type="text" class="form-control" placeholder="Search">
-                        </div>
-                        <button type="submit" class="btn btn-default">Search</button>
-                    </form>
                 </ul>
             </div>
             <!-- /.navbar-collapse -->
@@ -78,6 +72,18 @@
     <div class="container-fluid">
         <div class="grid">
             <div class="grid-sizer"></div>
+            <div class="grid-item col-xs-12 col-sm-6 col-md-4 col-lg-3 col-xl-2">
+	           	<div class="card">
+				 		<p>
+				 			<a data-chrome="noheader" class="twitter-timeline" href="https://twitter.com/AMIV_ETHZ/amiv" data-widget-id="389682176024784896">
+					 			Tweets from @AMIV_ETHZ
+					 		</a>
+						</p>
+						<script type="text/javascript">
+				 			!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+"://platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");
+						</script> 
+        		</div>
+            </div>
         </div>
     </div>
 
@@ -91,8 +97,7 @@
 
         function addElement(item) {
             $('.grid')
-                .append('<div class="grid-item col-xs-12 col-sm-6 col-md-4 col-lg-3 col-xl-2">' + item + '</div>')
-                .masonry('reloadItems').masonry();
+                .append('<div class="grid-item col-xs-12 col-sm-6 col-md-4 col-lg-3 col-xl-2">' + item + '</div>');
         }
         
         $(document).ready(function() {
@@ -101,76 +106,48 @@
                 itemSelector: '.grid-item',
                 columnWidth: '.grid-sizer',
                 percentPosition: true
-            });
+            }).on('DOMSubtreeModified', function(){
+	            $(this).masonry('reloadItems').masonry();
+            })
             getEvents(function(ret) {
                 ret['_items'].forEach(function(item) {
+	                /*Is it Websitecontent?*/
+	                if (item.show_website == false){
+		                return;
+	                }
                     console.log(item.title_de);
-                    if ( item.img_banner == null){
-						item.img_banner = item.img_infoscreen;
+                    
+                    /*Picture Checker*/
+                    if (item.img_banner == null){
+						item.img_banner = "https://s-media-cache-ak0.pinimg.com/736x/9c/24/fd/9c24fdb71c67e31efef540efb141f96d.jpg";
                     }
+                    /* Datum anpassen*/
 					var datenum = new Date(item.time_start);
-					
+					var
+					var regend = new Date(item.time_start);
+
 					/*Minuten immer Zweistellig*/
 					var minutes = datenum.getMinutes();
 					if (minutes < 10){
 						minutes = "0" + minutes;
 					}
-					var month = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
+					var month = ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"];
 					
-                    addElement('<div class="card"><div class="card-image"><img class="img-responsive" src="'+item.img_banner+'"><date><div class="month">'+month[datenum.getMonth()]+'</div><div class="day">'+datenum.getDate()+'</div><div class="starttime">'+datenum.getHours()+':'+minutes+'</div><date-overlay></date-overlay></date><span class="card-title">'+item.title_de+' @ '+item.location+'</span></div><div class="card-content">'+item.description_de+'</div><div class="card-action"><a href="#" target="new_blank">Zum Event</a><a href="#" target="new_blank">Anmeldung</a><a href="#" target="new_blank">Im Kalender speichern</a></div></div>');
+					/*Anmeldung*/
+					var register = "";
+					if (item.spot < 0){
+						register = "";
+					}
+					if (amivcore.authenticated() && item.spot >= 0){
+						if(item.time_start < Tod)
+					}
+                    addElement('<div class="card"><div class="card-image"><img class="img-responsive" src="'+item.img_banner+'"><date><div class="month">'+month[datenum.getMonth()]+'</div><div class="day">'+datenum.getDate()+'</div><div class="starttime">'+datenum.getHours()+':'+minutes+'</div><date-overlay></date-overlay></date><span class="card-title">'+item.title_de+' @ '+item.location+'</span></div><div class="card-content">'+item.description_de+'</div><div class="card-action"><a href="#" target="new_blank">Zum Event</a><a href="#" target="new_blank">'+register+'</a><a href="#" target="new_blank">Im Kalender speichern</a></div></div>');
                 });
             });
         });
     </script>
-    
-<!--
-    <script>
-	    $(function() {
-			var container = document.createElement('div');
-			container.id = "card";
 
-			$('grid').append(container);
-			
-			/*Date*/
-			$(".month").append("October");
-			$(".day").append("42");
-			$(".starttime").append("18:00 - 20:00");
-			
-			/*Visible Content*/
-			$(".card-title").html("Jarcakebakery @ FoodLab"); //Title and Location
-			$(".card-content").append("<p>This is the best event like ever! You can bake some jarcakes and eat the afterwards all by yourself.</p>"); //content
-			$(".card-action").append(); //Links
-			$(".img-responsive").attr("src", "http://cdn0.wideopencountry.com/wp-content/uploads/2015/07/JamCheesecakesInAJarTall-793x526.png"); //image
-			
-			$('#card').append(html);
-		});
-	</script>
--->
-    
-<!--
-    <div class="col-xs-12 col-md-4 col-lg-3">
-		<div class="card card-1">
-			<div class="card-image">
-				<img class="img-responsive">
-				<date>
-				 	<div class="month"></div>
-				 	<div class="day"></div>
-				 	<div class="starttime"></div>
-				 	<date-overlay></date-overlay>
-				</date>
-				<span class="card-title"></span>
-			</div>
-            
-			<div class="card-content"></div>
-                
-			<div class="card-action">
-				<a href="#" target="new_blank">Zum Event</a>
-		 		<a href="#" target="new_blank">Anmeldung</a>
-				<a href="#" target="new_blank">Im Kalender speichern</a>
-            </div>
-        </div>
-    </div>
--->
+<script src="js/main.js"></script>
 </body>
 
 </html>
diff --git a/public/js/main.js b/public/js/main.js
index d8af2b5d0e7020b29ed4088395a5c2165af38771..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644
--- a/public/js/main.js
+++ b/public/js/main.js
@@ -1,536 +0,0 @@
-(function(root, factory) {
-    if(typeof exports === 'object') {
-        module.exports = factory();
-    }
-    else if(typeof define === 'function' && define.amd) {
-        define('salvattore', [], factory);
-    }
-    else {
-        root.salvattore = factory();
-    }
-}(this, function() {
-/*! matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas, David Knight. Dual MIT/BSD license */
-
-window.matchMedia || (window.matchMedia = function() {
-    "use strict";
-
-    // For browsers that support matchMedium api such as IE 9 and webkit
-    var styleMedia = (window.styleMedia || window.media);
-
-    // For those that don't support matchMedium
-    if (!styleMedia) {
-        var style       = document.createElement('style'),
-            script      = document.getElementsByTagName('script')[0],
-            info        = null;
-
-        style.type  = 'text/css';
-        style.id    = 'matchmediajs-test';
-
-        script.parentNode.insertBefore(style, script);
-
-        // 'style.currentStyle' is used by IE <= 8 and 'window.getComputedStyle' for all other browsers
-        info = ('getComputedStyle' in window) && window.getComputedStyle(style, null) || style.currentStyle;
-
-        styleMedia = {
-            matchMedium: function(media) {
-                var text = '@media ' + media + '{ #matchmediajs-test { width: 1px; } }';
-
-                // 'style.styleSheet' is used by IE <= 8 and 'style.textContent' for all other browsers
-                if (style.styleSheet) {
-                    style.styleSheet.cssText = text;
-                } else {
-                    style.textContent = text;
-                }
-
-                // Test if media query is true or false
-                return info.width === '1px';
-            }
-        };
-    }
-
-    return function(media) {
-        return {
-            matches: styleMedia.matchMedium(media || 'all'),
-            media: media || 'all'
-        };
-    };
-}());
-;/*! matchMedia() polyfill addListener/removeListener extension. Author & copyright (c) 2012: Scott Jehl. Dual MIT/BSD license */
-(function(){
-    // Bail out for browsers that have addListener support
-    if (window.matchMedia && window.matchMedia('all').addListener) {
-        return false;
-    }
-
-    var localMatchMedia = window.matchMedia,
-        hasMediaQueries = localMatchMedia('only all').matches,
-        isListening     = false,
-        timeoutID       = 0,    // setTimeout for debouncing 'handleChange'
-        queries         = [],   // Contains each 'mql' and associated 'listeners' if 'addListener' is used
-        handleChange    = function(evt) {
-            // Debounce
-            clearTimeout(timeoutID);
-
-            timeoutID = setTimeout(function() {
-                for (var i = 0, il = queries.length; i < il; i++) {
-                    var mql         = queries[i].mql,
-                        listeners   = queries[i].listeners || [],
-                        matches     = localMatchMedia(mql.media).matches;
-                    // Update mql.matches value and call listeners
-                    // Fire listeners only if transitioning to or from matched state
-                    if (matches !== mql.matches) {
-                        mql.matches = matches;
-
-                        for (var j = 0, jl = listeners.length; j < jl; j++) {
-                            listeners[j].call(window, mql);
-                        }
-                    }
-                }
-            }, 30);
-        };
-
-    window.matchMedia = function(media) {
-        var mql         = localMatchMedia(media),
-            listeners   = [],
-            index       = 0;
-
-        mql.addListener = function(listener) {
-            // Changes would not occur to css media type so return now (Affects IE <= 8)
-            if (!hasMediaQueries) {
-                return;
-            }
-
-            // Set up 'resize' listener for browsers that support CSS3 media queries (Not for IE <= 8)
-            // There should only ever be 1 resize listener running for performance
-            if (!isListening) {
-                isListening = true;
-                window.addEventListener('resize', handleChange, true);
-            }
-
-            // Push object only if it has not been pushed already
-            if (index === 0) {
-                index = queries.push({
-                    mql         : mql,
-                    listeners   : listeners
-                });
-            }
-
-            listeners.push(listener);
-        };
-
-        mql.removeListener = function(listener) {
-            for (var i = 0, il = listeners.length; i < il; i++){
-                if (listeners[i] === listener){
-                    listeners.splice(i, 1);
-                }
-            }
-        };
-
-        return mql;
-    };
-}());
-;// http://paulirish.com/2011/requestanimationframe-for-smart-animating/
-// http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating
-
-// requestAnimationFrame polyfill by Erik Möller. fixes from Paul Irish and Tino Zijdel
-
-// MIT license
-
-(function() {
-    var lastTime = 0;
-    var vendors = ['ms', 'moz', 'webkit', 'o'];
-    for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
-        window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame'];
-        window.cancelAnimationFrame = window[vendors[x]+'CancelAnimationFrame']
-                                   || window[vendors[x]+'CancelRequestAnimationFrame'];
-    }
-
-    if (!window.requestAnimationFrame)
-        window.requestAnimationFrame = function(callback, element) {
-            var currTime = new Date().getTime();
-            var timeToCall = Math.max(0, 16 - (currTime - lastTime));
-            var id = window.setTimeout(function() { callback(currTime + timeToCall); },
-              timeToCall);
-            lastTime = currTime + timeToCall;
-            return id;
-        };
-
-    if (!window.cancelAnimationFrame)
-        window.cancelAnimationFrame = function(id) {
-            clearTimeout(id);
-        };
-}());
-;var salvattore = (function (global, document, undefined) {
-"use strict";
-
-var self = {},
-    grids = [],
-    add_to_dataset = function(element, key, value) {
-      // uses dataset function or a fallback for <ie10
-      if (element.dataset) {
-        element.dataset[key] = value;
-      } else {
-        element.setAttribute("data-" + key, value);
-      }
-      return;
-    };
-
-self.obtain_grid_settings = function obtain_grid_settings(element) {
-  // returns the number of columns and the classes a column should have,
-  // from computing the style of the ::before pseudo-element of the grid.
-
-  var computedStyle = global.getComputedStyle(element, ":before")
-    , content = computedStyle.getPropertyValue("content").slice(1, -1)
-    , matchResult = content.match(/^\s*(\d+)(?:\s?\.(.+))?\s*$/)
-    , numberOfColumns
-    , columnClasses
-  ;
-
-  if (matchResult) {
-    numberOfColumns = matchResult[1];
-    columnClasses = matchResult[2];
-    columnClasses = columnClasses? columnClasses.split(".") : ["column"];
-  } else {
-    matchResult = content.match(/^\s*\.(.+)\s+(\d+)\s*$/);
-    columnClasses = matchResult[1];
-    numberOfColumns = matchResult[2];
-    if (numberOfColumns) {
-      numberOfColumns = numberOfColumns.split(".");
-    }
-  }
-
-  return {
-    numberOfColumns: numberOfColumns,
-    columnClasses: columnClasses
-  };
-};
-
-
-self.add_columns = function add_columns(grid, items) {
-  // from the settings obtained, it creates columns with
-  // the configured classes and adds to them a list of items.
-
-  var settings = self.obtain_grid_settings(grid)
-    , numberOfColumns = settings.numberOfColumns
-    , columnClasses = settings.columnClasses
-    , columnsItems = new Array(+numberOfColumns)
-    , columnsFragment = document.createDocumentFragment()
-    , i = numberOfColumns
-    , selector
-  ;
-
-  while (i-- !== 0) {
-    selector = "[data-columns] > *:nth-child(" + numberOfColumns + "n-" + i + ")";
-    columnsItems.push(items.querySelectorAll(selector));
-  }
-
-  columnsItems.forEach(function append_to_grid_fragment(rows) {
-    var column = document.createElement("div")
-      , rowsFragment = document.createDocumentFragment()
-    ;
-
-    column.className = columnClasses.join(" ");
-
-    Array.prototype.forEach.call(rows, function append_to_column(row) {
-      rowsFragment.appendChild(row);
-    });
-    column.appendChild(rowsFragment);
-    columnsFragment.appendChild(column);
-  });
-
-  grid.appendChild(columnsFragment);
-  add_to_dataset(grid, 'columns', numberOfColumns);
-};
-
-
-self.remove_columns = function remove_columns(grid) {
-  // removes all the columns from a grid, and returns a list
-  // of items sorted by the ordering of columns.
-
-  var range = document.createRange();
-  range.selectNodeContents(grid);
-
-  var columns = Array.prototype.filter.call(range.extractContents().childNodes, function filter_elements(node) {
-    return node instanceof global.HTMLElement;
-  });
-
-  var numberOfColumns = columns.length
-    , numberOfRowsInFirstColumn = columns[0].childNodes.length
-    , sortedRows = new Array(numberOfRowsInFirstColumn * numberOfColumns)
-  ;
-
-  Array.prototype.forEach.call(columns, function iterate_columns(column, columnIndex) {
-    Array.prototype.forEach.call(column.children, function iterate_rows(row, rowIndex) {
-      sortedRows[rowIndex * numberOfColumns + columnIndex] = row;
-    });
-  });
-
-  var container = document.createElement("div");
-  add_to_dataset(container, 'columns', 0);
-
-  sortedRows.filter(function filter_non_null(child) {
-    return !!child;
-  }).forEach(function append_row(child) {
-    container.appendChild(child);
-  });
-
-  return container;
-};
-
-
-self.recreate_columns = function recreate_columns(grid) {
-  // removes all the columns from the grid, and adds them again,
-  // it is used when the number of columns change.
-
-  global.requestAnimationFrame(function render_after_css_media_query_change() {
-    self.add_columns(grid, self.remove_columns(grid));
-  });
-};
-
-
-self.media_query_change = function media_query_change(mql) {
-  // recreates the columns when a media query matches the current state
-  // of the browser.
-
-  if (mql.matches) {
-    Array.prototype.forEach.call(grids, self.recreate_columns);
-  }
-};
-
-
-self.get_css_rules = function get_css_rules(stylesheet) {
-  // returns a list of css rules from a stylesheet
-
-  var cssRules;
-  try {
-    cssRules = stylesheet.sheet.cssRules || stylesheet.sheet.rules;
-  } catch (e) {
-    return [];
-  }
-
-  return cssRules || [];
-};
-
-
-self.get_stylesheets = function get_stylesheets() {
-  // returns a list of all the styles in the document (that are accessible).
-
-  return Array.prototype.concat.call(
-    Array.prototype.slice.call(document.querySelectorAll("style[type='text/css']")),
-    Array.prototype.slice.call(document.querySelectorAll("link[rel='stylesheet']"))
-  );
-};
-
-
-self.media_rule_has_columns_selector = function media_rule_has_columns_selector(rules) {
-  // checks if a media query css rule has in its contents a selector that
-  // styles the grid.
-
-  var i = rules.length
-    , rule
-  ;
-
-  while (i--) {
-    rule = rules[i];
-    if (rule.selectorText && rule.selectorText.match(/\[data-columns\](.*)::?before$/)) {
-      return true;
-    }
-  }
-
-  return false;
-};
-
-
-self.scan_media_queries = function scan_media_queries() {
-  // scans all the stylesheets for selectors that style grids,
-  // if the matchMedia API is supported.
-
-
-  var mediaQueries = [];
-
-  if (!global.matchMedia) {
-    return;
-  }
-
-  self.get_stylesheets().forEach(function extract_rules(stylesheet) {
-    Array.prototype.forEach.call(self.get_css_rules(stylesheet), function filter_by_column_selector(rule) {
-      if (rule.media && self.media_rule_has_columns_selector(rule.cssRules)) {
-        mediaQueries.push(global.matchMedia(rule.media.mediaText));
-      }
-    });
-  });
-
-  mediaQueries.forEach(function listen_to_changes(mql) {
-    mql.addListener(self.media_query_change);
-  });
-};
-
-
-self.next_element_column_index = function next_element_column_index(grid, fragments) {
-  // returns the index of the column where the given element must be added.
-
-  var children = grid.children
-    , m = children.length
-    , lowestRowCount = 0
-    , child
-    , currentRowCount
-    , i
-    , index = 0
-  ;
-  for (i = 0; i < m; i++) {
-    child = children[i];
-    currentRowCount = child.children.length + fragments[i].children.length;
-  if(lowestRowCount === 0) {
-    lowestRowCount = currentRowCount;
-  }
-    if(currentRowCount < lowestRowCount) {
-      index = i;
-      lowestRowCount = currentRowCount;
-    }
-  }
-
-  return index;
-};
-
-
-self.create_list_of_fragments = function create_list_of_fragments(quantity) {
-  // returns a list of fragments
-
-
-  var fragments = new Array(quantity)
-    , i = 0
-  ;
-
-  while (i !== quantity) {
-    fragments[i] = document.createDocumentFragment();
-    i++;
-  }
-
-  return fragments;
-};
-
-
-self.append_elements = function append_elements(grid, elements) {
-  // adds a list of elements to the end of a grid
-  var columns = grid.children
-    , numberOfColumns = columns.length
-    , fragments = self.create_list_of_fragments(numberOfColumns)
-  ;
-
-  elements.forEach(function append_to_next_fragment(element) {
-    var columnIndex = self.next_element_column_index(grid, fragments);
-    fragments[columnIndex].appendChild(element);
-  });
-
-  Array.prototype.forEach.call(columns, function insert_column(column, index) {
-    column.appendChild(fragments[index]);
-  });
-};
-
-
-self.prepend_elements = function prepend_elements(grid, elements) {
-  // adds a list of elements to the start of a grid
-
-  var columns = grid.children
-    , numberOfColumns = columns.length
-    , fragments = self.create_list_of_fragments(numberOfColumns)
-    , columnIndex = numberOfColumns - 1
-  ;
-
-  elements.forEach(function append_to_next_fragment(element) {
-    var fragment = fragments[columnIndex];
-    fragment.insertBefore(element, fragment.firstChild);
-    if (columnIndex === 0) {
-      columnIndex = numberOfColumns - 1;
-    } else {
-      columnIndex--;
-    }
-  });
-
-  Array.prototype.forEach.call(columns, function insert_column(column, index) {
-    column.insertBefore(fragments[index], column.firstChild);
-  });
-
-  // populates a fragment with n columns till the right
-  var fragment = document.createDocumentFragment()
-    , numberOfColumnsToExtract = elements.length % numberOfColumns
-  ;
-
-  while (numberOfColumnsToExtract-- !== 0) {
-    fragment.appendChild(grid.lastChild);
-  }
-
-  // adds the fragment to the left
-  grid.insertBefore(fragment, grid.firstChild);
-};
-
-
-self.register_grid = function register_grid (grid) {
-  if (global.getComputedStyle(grid).display === "none") {
-    return;
-  }
-
-  // retrieve the list of items from the grid itself
-  var range = document.createRange();
-  range.selectNodeContents(grid);
-
-  var items = document.createElement("div");
-  items.appendChild(range.extractContents());
-
-
-  add_to_dataset(items, 'columns', 0);
-  self.add_columns(grid, items);
-  grids.push(grid);
-};
-
-
-self.init = function init() {
-  // adds required CSS rule to hide 'content' based
-  // configuration.
-
-  var css = document.createElement("style");
-  css.innerHTML = "[data-columns]::before{visibility:hidden;position:absolute;font-size:1px;}";
-  document.head.appendChild(css);
-
-  // scans all the grids in the document and generates
-  // columns from their configuration.
-
-  var gridElements = document.querySelectorAll("[data-columns]");
-  Array.prototype.forEach.call(gridElements, self.register_grid);
-  self.scan_media_queries();
-};
-
-
-self.init();
-
-return {
-  append_elements: self.append_elements,
-  prepend_elements: self.prepend_elements,
-  register_grid: self.register_grid
-};
-
-})(window, window.document);
-
-    return salvattore;
-}));
-
-		function append(title, content){
-		  var grid = document.querySelector('#columns');
-		  var item = document.createElement('div');
-		  var h = '<div class="panel panel-primary">';
-		      h += '<div class="panel-heading">';
-		      h += title;
-		      h += '</div>';
-		      h += '<div class="panel-body">';
-		      h += content;
-		      h += '</div>';
-		      h += '</div>';
-		  salvattore['append_elements'](grid, [item])
-		  item.outerHTML = h;
-		}
-
-		$.getJSON("https://www.googleapis.com/books/v1/volumes?q=inauthor:Ernest+Hemingway&callback=?", function(data){
-		  $(data.items).each(function(i,book){
-		      append(i +'. '+ book.volumeInfo.title, book.volumeInfo.description);
-		  });
-		});
\ No newline at end of file