diff --git a/docker/.dockerignore b/docker/.dockerignore
new file mode 100644
index 0000000000000000000000000000000000000000..b99e7de969338ea4dab5eedd05299349aa8c7049
--- /dev/null
+++ b/docker/.dockerignore
@@ -0,0 +1,3 @@
+node_modules
+.git
+.gitignore
diff --git a/docker/Dockerfile b/docker/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..688db2fd8e59ad46913249a5aa1426665a1e236c
--- /dev/null
+++ b/docker/Dockerfile
@@ -0,0 +1,23 @@
+FROM node:13.14.0
+
+# install chrome for protractor tests
+RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
+RUN sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'
+RUN apt-get update && apt-get install -yq google-chrome-stable
+
+WORKDIR /app
+
+ENV PATH /app/node_modules/.bin:$PATH
+
+COPY package.json /app/package.json
+RUN npm install
+
+# install webdriver for browser testing
+RUN npm i --prefix=./node_modules/protractor --save webdriver-manager@latest
+RUN npx webdriver-manager update
+
+COPY . /app
+
+EXPOSE 4200
+
+CMD ng serve --disableHostCheck --host 0.0.0.0
diff --git a/docker/Dockerfile-prod b/docker/Dockerfile-prod
new file mode 100644
index 0000000000000000000000000000000000000000..80634c225600942412c85d0d7ff2e732d24024b9
--- /dev/null
+++ b/docker/Dockerfile-prod
@@ -0,0 +1,34 @@
+FROM node:13.14.0 as build
+
+# install chrome for protractor tests
+RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
+RUN sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'
+RUN apt-get update && apt-get install -yq google-chrome-stable
+
+WORKDIR /app
+
+ENV PATH /app/node_modules/.bin:$PATH
+
+COPY package.json /app/package.json
+RUN npm install
+
+# install webdriver for browser testing
+RUN npm i --prefix=./node_modules/protractor --save webdriver-manager@latest
+RUN npx webdriver-manager update
+
+COPY . /app
+
+RUN ng test --watch=false
+RUN ng e2e --webdriver-update=false --port 4202
+
+RUN ng build --output-path=dist
+
+# ===========================================
+
+FROM nginx:1.19.1-alpine
+
+COPY --from=build /app/dist /usr/share/nginx/html
+
+EXPOSE 80
+
+CMD ["nginx", "-g", "daemon off;"]
diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml
new file mode 100644
index 0000000000000000000000000000000000000000..f4518e2354d435d9ed2af825c9e5acc1857b082e
--- /dev/null
+++ b/docker/docker-compose.yml
@@ -0,0 +1,23 @@
+version: '3.7'
+
+services:
+
+  testcenter-frontend:
+    build:
+      context: ../
+      dockerfile: docker/Dockerfile
+    container_name: testcenter-frontend
+    volumes:
+      - ../:/app
+      - /app/node_modules
+    ports:
+      - '4201:4200'
+
+  backend-mock:
+    image: stoplight/prism:3
+    volumes:
+      - ./scripts:/api
+    ports:
+      - '8000:4010'
+    command:
+      mock -h 0.0.0.0 "/api/specs.yml"
diff --git a/docker/scripts/specs.yml b/docker/scripts/specs.yml
new file mode 100644
index 0000000000000000000000000000000000000000..40baeb7af80b4e622ede5164864c932877816265
--- /dev/null
+++ b/docker/scripts/specs.yml
@@ -0,0 +1,2774 @@
+openapi: 3.0.0
+info:
+    title: ""
+    description: 'This a spec for the (REST-) API of the IQB-Testcenter Application. It will be used to make backend''s e2e-test and a mock-server for frontend''s e2e-tests. It''s the basis for our vision of continuous integration.'
+    version: 4.0.2
+paths:
+    '/booklet/{booklet_name}':
+        get:
+            summary: 'get a booklet'
+            description: 'Retrieves a Booklet-XML'
+            parameters:
+                -
+                    in: header
+                    name: AuthToken
+                    description: 'auth-token for test-user containing a personToken'
+                    example: 'p:user000000000.test0000000'
+                -
+                    in: path
+                    name: booklet_name
+                    description: 'id of a executed test'
+                    example: BOOKLET.SAMPLE
+                    required: true
+                    schema:
+                        type: string
+            responses:
+                '200':
+                    description: 'A Booklet-XML (see: https://github.com/iqb-berlin/testcenter-backend/blob/master/definitions/vo_Booklet.xsd)'
+                    content:
+                        application/xml:
+                            example: '<?xml version="1.0" encoding="utf-8"?><Booklet...'
+                '401':
+                    description: 'Not authenticated'
+                '403':
+                    description: Forbidden
+                '410':
+                    description: 'Session Expired'
+                '500':
+                    description: 'Server Error'
+    '/booklet/{booklet_name}/data':
+        get:
+            summary: 'get status of a booklet'
+            description: 'Retrieves a booklet - in this context that does not mean the booklet-file''s contents but status information about this booklet in regard of a given login: Is there a running test for this booklet etc.'
+            parameters:
+                -
+                    in: header
+                    name: AuthToken
+                    description: 'auth-token for test-user containing a personToken'
+                    example: 'p:user000000000.test0000000'
+                -
+                    in: path
+                    name: booklet_name
+                    description: 'id of a executed test'
+                    example: BOOKLET.SAMPLE
+                    required: true
+                    schema:
+                        type: string
+            responses:
+                '200':
+                    description: 'an object containing information about booklet'
+                    content:
+                        application/json:
+                            example:
+                                running: true
+                                locked: false
+                                label: 'Booklet''s little label'
+                '401':
+                    description: 'Not authenticated'
+                '403':
+                    description: Forbidden
+                '410':
+                    description: 'Session Expired'
+                '500':
+                    description: 'Server Error'
+    '/monitor/group/{group_name}':
+        get:
+            summary: 'get a group'
+            description: 'Retrieves Information about a (testtakers-)group. It has to be *in the same workspace as the requesting user, who has to be have the role `monitor-group`.'
+            parameters:
+                -
+                    in: header
+                    name: AuthToken
+                    description: 'auth-token for group-monitor'
+                    example: 'g:user000000000.0000000000'
+                -
+                    in: path
+                    name: group_name
+                    description: 'name (id) of a group'
+                    example: sample_group
+                    required: true
+                    schema:
+                        type: string
+            responses:
+                '200':
+                    description: 'return group data'
+                    content:
+                        application/json:
+                            example:
+                                label: 'Primary Sample Group'
+                                name: sample_group
+                '401':
+                    description: 'Not authenticated'
+                '403':
+                    description: Forbidden
+                '404':
+                    description: 'Group not found'
+                '410':
+                    description: 'Session Expired'
+                '500':
+                    description: 'Server Error'
+    /monitor/test-sessions:
+        get:
+            summary: 'get TestSessions of a group'
+            description: 'Retrieves all running test sessions from group of a group-monitor. Returns also an URL to a websocket to subscribe this information if available. Sessions for Persons of this group which are not created right now get created.'
+            parameters:
+                -
+                    in: header
+                    name: AuthToken
+                    description: 'auth-token for group-monitor'
+                    example: 'g:user000000000.0000000000'
+            responses:
+                '200':
+                    description: 'return group data'
+                    content:
+                        application/json:
+                            example:
+                                -
+                                    personId: 1
+                                    groupName: sample_group
+                                    personLabel: sample_user/xxx
+                                    groupLabel: 'Sample group'
+                                    mode: run-hot-return
+                                    testId: 1
+                                    testState: {LASTUNIT: '1', 'sample log entry': 1}
+                                    bookletName: BOOKLET.SAMPLE
+                                    unitName: UNIT.SAMPLE
+                                    unitState: {PRESENTATIONCOMPLETE: yes}
+                                    timestamp: 1596455898
+                                -
+                                    personId: 3
+                                    groupName: sample_group
+                                    personLabel: test-study-monitor
+                                    groupLabel: 'Sample group'
+                                    mode: monitor-study
+                                    testId: -1
+                                    testState: []
+                                    unitState: []
+                                    timestamp: 1596455898
+                                -
+                                    personId: 4
+                                    groupName: sample_group
+                                    personLabel: test-group-monitor
+                                    groupLabel: 'Sample group'
+                                    mode: monitor-group
+                                    testId: -1
+                                    testState: []
+                                    unitState: []
+                                    timestamp: 1596455898
+                '401':
+                    description: 'Not authenticated'
+                '403':
+                    description: Forbidden
+                '410':
+                    description: 'Session Expired'
+                '500':
+                    description: 'Server Error'
+    /session:
+        get:
+            summary: 'get a session'
+            description: 'returns session data according to an authToken.'
+            parameters:
+                -
+                    in: header
+                    name: AuthToken
+                    examples:
+                        personToken:
+                            description: 'auth-token for person'
+                            value: 'p:0000000000000.00000000000'
+                        loginToken:
+                            description: 'auth-token for login (part I of 2-factor authorization only)'
+                            value: 'l:user000000000.test0000000'
+                        adminToken:
+                            description: 'auth-token for admin'
+                            value: 'a:user000000000.rw00000000'
+                        monitorToken:
+                            description: 'auth-token for workspace-monitor'
+                            value: 'm:user000000000.rw00000000'
+            responses:
+                '200':
+                    description: 'OK, get session data'
+                    content:
+                        application/json:
+                            schema:
+                                $ref: '#/components/schemas/session'
+                            examples:
+                                personToken:
+                                    value: {token: 'static:person:sample_group_sample_user_xxx', displayName: sample_group/sample_user/xxx, access: {test: [BOOKLET.SAMPLE]}, customTexts: {}, flags: []}
+                                loginToken:
+                                    value: {token: 'static:login:test', displayName: sample_group/sample_user, access: {}, customTexts: {}, flags: [codeRequired]}
+                                adminToken:
+                                    value: {token: 'static:admin:super', displayName: super, access: {superAdmin: [], workspaceAdmin: ['1']}, customTexts: {}, flags: []}
+                                monitorToken:
+                                    value: {token: 'static:person:sample_group_test-study-monitor_', displayName: super, access: {workspaceMonitor: ['1']}, customTexts: {}, flags: []}
+                '401':
+                    description: 'No token qualifies for authentication'
+                '410':
+                    description: 'Session Expired'
+                '500':
+                    description: 'Server Error'
+    /session/admin:
+        put:
+            summary: 'Start Admin Session'
+            description: 'Starts a Session as Admin by Username and password'
+            requestBody:
+                content:
+                    application/json:
+                        schema:
+                            $ref: '#/components/schemas/login_request'
+            responses:
+                '200':
+                    description: OK
+                    content:
+                        application/json:
+                            schema:
+                                $ref: '#/components/schemas/session'
+                            example:
+                                token: user000000000.0000000000
+                                displayName: super
+                                access:
+                                    workspaceAdmin: [1]
+                                    superAdmin: []
+                '202':
+                    description: 'User has account but neither workspace nor super-admin privilige'
+                '400':
+                    description: 'Insufficent Crendetials'
+                '500':
+                    description: 'Server Error'
+    /session/login:
+        put:
+            summary: 'Start Login Session'
+            description: 'Starts a Session as Login by Username and password If the login requires a subsequent code insertion, you get a session with no access and the request for a password. Otherwise a set of accessable booklets will be retrieved.'
+            requestBody:
+                content:
+                    application/json:
+                        schema:
+                            $ref: '#/components/schemas/login_request'
+                        example:
+                            name: test
+                            password: user123
+            responses:
+                '200':
+                    description: OK
+                    content:
+                        application/json:
+                            schema:
+                                $ref: '#/components/schemas/session'
+                            example:
+                                token: static_login_sample_login
+                                displayName: sample_group/sample_user
+                                access: {}
+                                customTexts: {}
+                                flags:
+                                    - codeRequired
+                '400':
+                    description: 'Insufficent Crendetials'
+                '500':
+                    description: 'Server Error'
+    /session/person:
+        put:
+            summary: 'Start Person Session'
+            description: 'Starts a Session for a Person, on the basis of LoginToken (!) which is Part II of the Two-Factor Authentication for code-demanding logins. Get a token for a person belonging to a login, as defined in a `Testtakers.xml`-file, together with some information about this person'
+            parameters:
+                -
+                    in: header
+                    name: AuthToken
+                    description: 'auth-token for a login-session'
+                    example: 'l:user000000000.test0000000'
+            requestBody:
+                content:
+                    application/json:
+                        schema:
+                            type: object
+                            properties:
+                                code:
+                                    type: string
+                        example:
+                            code: xxx
+            responses:
+                '200':
+                    description: OK
+                    content:
+                        application/json:
+                            schema:
+                                $ref: '#/components/schemas/session'
+                            example:
+                                token: static_person_xxx
+                                displayName: sample_group/sample_user/xxx
+                                access:
+                                    test: ['- BOOKLET.SAMPLE']
+                                customTexts: {}
+                                flags: []
+                '400':
+                    description: 'Insufficent Crendetials'
+                '410':
+                    description: 'Session Expired'
+                '500':
+                    description: 'Server Error'
+    '/speed-test/random-package/{size}':
+        get:
+            summary: 'download speedtest package'
+            description: 'returns a random byte package - for speedtests'
+            parameters:
+                -
+                    in: path
+                    name: size
+                    description: 'number of bytes to bedelivered - between 16 and 67108864'
+                    example: 16
+                    required: true
+                    schema:
+                        type: string
+            responses:
+                '200':
+                    description: 'a object containg information about booklet'
+                    content:
+                        text/plain:
+                            schema:
+                                type: string
+                            example: lrOI/JLFOAPBOHt=
+                '406':
+                    description: 'bad package size'
+                '500':
+                    description: 'server error'
+    /speed-test/random-package:
+        post:
+            summary: 'upload speedtest package'
+            description: 'receives any package and returns information about size and time - for speedtests'
+            requestBody:
+                content:
+                    text/plain:
+                        schema:
+                            type: string
+                        example: '1324567890123456'
+            responses:
+                '200':
+                    description: 'a object containg information about booklet'
+                    content:
+                        application/json:
+                            schema:
+                                type: object
+                                properties:
+                                    requestTime: {type: number}
+                                    packageReceivedSize: {type: number, example: 16}
+                '500':
+                    description: 'server error'
+    /list/routes:
+        get:
+            summary: 'Lists all available endpoints'
+            responses:
+                '200':
+                    description: OK
+                    content:
+                        application/json:
+                            example:
+                                - '[GET] /list/routes'
+                '500':
+                    description: 'Server Error'
+    /system/config:
+        get:
+            summary: 'get system config'
+            description: 'returns publicy avaialable parts of system config - version number - customTexts for UI'
+            responses:
+                '200':
+                    description: OK
+                    content:
+                        application/json:
+                            schema:
+                                type: object
+                                properties:
+                                    version: {type: string, example: 4.0.0}
+                                    customTexts: {type: object}
+                                required:
+                                    - version
+                                    - customTexts
+                            example:
+                                version: 4.0.0
+                                customTexts: {}
+                '500':
+                    description: 'Server Error'
+    /version:
+        get:
+            summary: 'get API version'
+            responses:
+                '200':
+                    description: OK
+                    content:
+                        application/json:
+                            schema:
+                                properties:
+                                    version: {type: string}
+                            example:
+                                version: 2.0.0-beta
+    /workspaces:
+        get:
+            summary: 'get a list of workspaces'
+            description: 'get a list of all workspaces'
+            parameters:
+                -
+                    in: header
+                    name: AuthToken
+                    description: 'auth-token for admin-user with super-admin privilege'
+                    example: 'a:user000000000.superadmin0'
+            responses:
+                '200':
+                    description: 'List of Workspaces'
+                    content:
+                        application/json:
+                            schema:
+                                $ref: '#/components/schemas/workspace_list'
+                            example:
+                                -
+                                    id: '1'
+                                    name: example_workspace
+                '401':
+                    description: 'Not authenticated'
+                '403':
+                    description: Forbidden
+                '410':
+                    description: 'Session Expired'
+                '500':
+                    description: 'Server Error'
+        delete:
+            summary: 'delete some workspaces'
+            description: 'deletes a list of workspaces given by their ids'
+            parameters:
+                -
+                    in: header
+                    name: AuthToken
+                    description: 'auth-token for admin-user with super-admin privilege'
+                    example: 'a:user000000000.superadmin0'
+            requestBody:
+                content:
+                    application/json:
+                        schema:
+                            properties:
+                                ws:
+                                    type: array
+                                    description: 'list of Workspace-Id'
+                                    items: {type: integer}
+                            required:
+                                - ws
+                        example:
+                            ws:
+                                - 2
+            responses:
+                '401':
+                    description: 'Not authenticated'
+                '403':
+                    description: Forbidden
+                '410':
+                    description: 'Session Expired'
+                '500':
+                    description: 'Server Error'
+    /users:
+        get:
+            summary: 'get a list of users'
+            description: 'returns info about all registered users.'
+            parameters:
+                -
+                    in: header
+                    name: AuthToken
+                    description: 'auth-token for admin-user with super-admin privilege'
+                    example: 'a:user000000000.superadmin0'
+            responses:
+                '200':
+                    description: 'List of users'
+                    content:
+                        application/json:
+                            schema:
+                                $ref: '#/components/schemas/user_list'
+                            example:
+                                -
+                                    name: super
+                                    id: '1'
+                                    email: null
+                                    isSuperadmin: true
+                '401':
+                    description: 'Not authenticated'
+                '403':
+                    description: Forbidden
+                '410':
+                    description: 'Session Expired'
+                '500':
+                    description: 'Server Error'
+        delete:
+            summary: 'delete some users'
+            description: 'deletes a list of given user-ids. ids wich did not exist get skipped; in other words there is no check if the user existed beforeheand.'
+            parameters:
+                -
+                    in: header
+                    name: AuthToken
+                    description: 'auth-token for admin-user with super-admin privilege'
+                    example: 'a:user000000000.superadmin0'
+            requestBody:
+                content:
+                    application/json:
+                        schema:
+                            type: object
+                            properties:
+                                u:
+                                    type: array
+                                    items: {type: string, description: user-id}
+                        example:
+                            u:
+                                - 2
+            responses:
+                '200':
+                    description: ok
+                '401':
+                    description: 'Not authenticated'
+                '403':
+                    description: Forbidden
+                '410':
+                    description: 'Session Expired'
+                '500':
+                    description: 'Server Error'
+    /sys-checks:
+        get:
+            summary: 'get a list of SysChecks'
+            description: 'get a list of available SysChecks (from all workspaces)'
+            responses:
+                '200':
+                    description: 'list of SysChecks'
+                    content:
+                        application/json:
+                            schema:
+                                type: array
+                                items:
+                                    type: object
+                                    properties: {workspaceId: {type: integer}, name: {type: string}, label: {type: string}, description: {type: string}}
+                            example:
+                                -
+                                    workspaceId: 1
+                                    name: SYSCHECK.SAMPLE
+                                    label: 'An example SysCheck definition'
+                                    description: 'An example SysCheck definition with long description'
+                '204':
+                    description: 'No SysChecks found.'
+                '500':
+                    description: 'Server Error'
+    '/test/{test_id}':
+        get:
+            summary: 'get a test'
+            description: "Retrieves a certain test: It's contents, state and the mode of current login-session.\n`laststate` is an array of key-value-pairs stored for this test.\nCurrently known test-modes are:  * `run-hot-return` - hot run of testLet, can save answers etc.,\n  session gets stored and can be revoked\n  * `run-hot-restart` - hot run of testLet, can save answers etc.,\n  every session starts all tests again and have unique Tokens\n  * `run-review` - run a review round of testLet, reviewes can be saved, but no answers\n  At the moment we distinguish between hot, trial and review in the GUI and there are no real\n  checks for the mode in this backend, except for the difference between `run-hot-return` and\n  `run-hot-restart`.\n  * `run-trial` - run a trial round\n  * `monitor-study` - TBA\n  * `monitor-login` - TBA"
+            parameters:
+                -
+                    in: header
+                    name: AuthToken
+                    description: 'auth-token for test-user'
+                    example: 'p:0000000000000.00000000000'
+                -
+                    in: path
+                    name: test_id
+                    description: 'id of a executed test'
+                    example: 1
+                    required: true
+                    schema:
+                        type: integer
+            responses:
+                '200':
+                    description: 'Test and it''s contents'
+                    content:
+                        application/json:
+                            example:
+                                mode: run-hot-return
+                                laststate:
+                                    LASTUNIT: '1'
+                                locked: false
+                                xml: '(contents of a booklet.xml)'
+                '401':
+                    description: 'Not authenticated'
+                '403':
+                    description: Forbidden
+                '500':
+                    description: 'Server Error'
+    '/test/{test_id}/unit/{unit_name}':
+        get:
+            summary: 'get a unit of a test'
+            description: 'retrieves a certain unit from a certain executed test - the booklet-file XML, last state and lock status'
+            parameters:
+                -
+                    in: header
+                    name: AuthToken
+                    description: 'auth-token for test-user'
+                    example: 'p:0000000000000.00000000000'
+                -
+                    in: path
+                    name: test_id
+                    description: 'id of a executed test'
+                    example: 1
+                    required: true
+                    schema:
+                        type: integer
+                -
+                    in: path
+                    name: unit_name
+                    description: 'unit-name (not alias!) as defined in booklet'
+                    example: UNIT.SAMPLE
+                    required: true
+                    schema:
+                        type: string
+            responses:
+                '200':
+                    description: 'List of Workspaces'
+                    content:
+                        application/json:
+                            example:
+                                laststate:
+                                    PRESENTATIONCOMPLETE: yes
+                                restorepoint: 'whatever this player needs'
+                                xml: '(contents of a unit.xml)'
+                '401':
+                    description: 'Not authenticated'
+                '403':
+                    description: Forbidden
+                '500':
+                    description: 'Server Error'
+    '/test/{test_id}/resource/{resource_name}':
+        get:
+            summary: 'get resource by name'
+            description: 'retrieves a resource-file by its name (filename without extension)'
+            parameters:
+                -
+                    in: header
+                    name: AuthToken
+                    description: 'auth-token for test-user'
+                    example: 'p:0000000000000.00000000000'
+                -
+                    in: path
+                    name: test_id
+                    description: 'id of a executed test'
+                    example: 1
+                    required: true
+                    schema:
+                        type: integer
+                -
+                    in: path
+                    name: resource_name
+                    description: 'resource_name (filename without XML-extension)'
+                    example: SAMPLE_PLAYER.HTML
+                    required: true
+                    schema:
+                        type: string
+            responses:
+                '200':
+                    description: 'List of Workspaces'
+                    content:
+                        text/plain:
+                            example: '(HTML code containing player)'
+                '401':
+                    description: 'Not authenticated'
+                '403':
+                    description: Forbidden
+                '500':
+                    description: 'Server Error'
+    '/test/{test_id}/unit/{unit_name}/review':
+        put:
+            summary: 'add review to unit'
+            description: 'add a review item to unit in a test'
+            parameters:
+                -
+                    in: header
+                    name: AuthToken
+                    description: 'auth-token for test-user'
+                    example: 'p:0000000000000.00000000000'
+                -
+                    in: path
+                    name: test_id
+                    description: 'test-id - id of a test execution.'
+                    example: 1
+                    required: true
+                    schema:
+                        type: string
+                -
+                    in: path
+                    name: unit_name
+                    description: 'unit-name (or alias) as defined in booklet'
+                    example: 1
+                    required: true
+                    schema:
+                        type: string
+            requestBody:
+                content:
+                    application/json:
+                        schema:
+                            properties:
+                                priority:
+                                    description: 'priority, 1=critical, 2=medium, 3=optional'
+                                    type: integer
+                                entry:
+                                    description: 'text of the review entry'
+                                    type: string
+                                categories:
+                                    description: 'whitespace separated list of categories'
+                                    type: string
+                            required:
+                                - entry
+                        example:
+                            entry: 'I am a critical review item for unit 1'
+                            priority: 1
+                            categories: 'content whatever'
+            responses:
+                '201':
+                    x-dredd-test-order: 1
+                    description: 'OK, created'
+                '401':
+                    description: 'Not authenticated'
+                '403':
+                    description: Forbidden
+                '500':
+                    description: 'Server Error'
+    '/test/{test_id}/review':
+        put:
+            summary: 'add review to booklet'
+            description: 'add a review item to a certain booklet'
+            parameters:
+                -
+                    in: header
+                    name: AuthToken
+                    description: 'auth-token for test-user'
+                    example: 'p:0000000000000.00000000000'
+                -
+                    in: path
+                    name: test_id
+                    description: 'test-id - id of a test execution.'
+                    example: 1
+                    required: true
+                    schema:
+                        type: string
+            requestBody:
+                content:
+                    application/json:
+                        schema:
+                            properties:
+                                priority:
+                                    description: 'priority, 1=critical, 2=medium, 3=optional'
+                                    type: integer
+                                entry:
+                                    description: 'text of the review entry'
+                                    type: string
+                                categories:
+                                    description: 'whitespace separated list of categories'
+                                    type: string
+                            required:
+                                - entry
+                        example:
+                            entry: 'I am a critical review item for booklet 1'
+                            priority: 1
+                            categories: 'content whatever'
+            responses:
+                '201':
+                    description: 'OK, created'
+                '401':
+                    description: 'Not authenticated'
+                '403':
+                    description: Forbidden
+                '500':
+                    description: 'Server Error'
+    '/test/{test_id}/unit/{unit_name}/response':
+        put:
+            summary: 'add response to a unit'
+            description: 'when running a test this endpoint is used to store given responses. format and content of responses are business of the corresponding player, the endpoints takes everything as raw, may it be JSON or XML or whatever.'
+            parameters:
+                -
+                    in: header
+                    name: AuthToken
+                    description: 'auth-token for test-user'
+                    example: 'p:0000000000000.00000000000'
+                -
+                    in: path
+                    name: test_id
+                    description: 'test-id - id of a test execution.'
+                    example: 1
+                    required: true
+                    schema:
+                        type: string
+                -
+                    in: path
+                    name: unit_name
+                    description: 'unit-name (or alias) as defined in booklet'
+                    example: 1
+                    required: true
+                    schema:
+                        type: string
+            requestBody:
+                content:
+                    application/json:
+                        schema:
+                            properties:
+                                response:
+                                    description: 'response data'
+                                    type: string
+                                timestamp:
+                                    description: 'timestamp of the response'
+                                    type: integer
+                                responseType:
+                                    description: 'TODO what is this?'
+                                    type: string
+                            required:
+                                - response
+                                - timestamp
+                        example:
+                            response: 'I am the answers to your questions.'
+                            timestamp: 1582550888563
+            responses:
+                '201':
+                    description: 'OK, created'
+                '401':
+                    description: 'Not authenticated'
+                '403':
+                    description: Forbidden
+                '500':
+                    description: 'Server Error'
+    '/test/{test_id}/unit/{unit_name}/restorepoint':
+        patch:
+            summary: 'save a restorepoint'
+            description: 'saves a restorepoint - a data blob indicating the sate of unit player. what is in this blob is business of the player.'
+            parameters:
+                -
+                    in: header
+                    name: AuthToken
+                    description: 'auth-token for test-user'
+                    example: 'p:0000000000000.00000000000'
+                -
+                    in: path
+                    name: test_id
+                    description: 'test-id - id of a test execution.'
+                    example: 1
+                    required: true
+                    schema:
+                        type: string
+                -
+                    in: path
+                    name: unit_name
+                    description: 'unit-name (or alias) as defined in booklet'
+                    example: 1
+                    required: true
+                    schema:
+                        type: string
+            requestBody:
+                content:
+                    application/json:
+                        schema:
+                            properties:
+                                restorePoint:
+                                    description: 'restore point data'
+                                    type: string
+                                timestamp:
+                                    description: 'timestamp of the snapshot'
+                                    type: integer
+                            required:
+                                - response
+                                - timestamp
+                        example:
+                            restorePoint: '{"string_example":"something","color_example":"#ffa200","number_example":"36"}'
+                            timestamp: 1582550888563
+            responses:
+                '200':
+                    description: 'OK, updated'
+                '401':
+                    description: 'Not authenticated'
+                '403':
+                    description: Forbidden
+                '500':
+                    description: 'Server Error'
+    '/test/{test_id}/unit/{unit_name}/state':
+        patch:
+            summary: 'save a state for a unit'
+            description: 'saved a state (a key-value pair) for a unit in a running test -'
+            parameters:
+                -
+                    in: header
+                    name: AuthToken
+                    description: 'auth-token for test-user'
+                    example: 'p:0000000000000.00000000000'
+                -
+                    in: path
+                    name: test_id
+                    description: 'test-id - id of a test execution.'
+                    example: 1
+                    required: true
+                    schema:
+                        type: string
+                -
+                    in: path
+                    name: unit_name
+                    description: 'unit-name (or alias) as defined in booklet'
+                    example: 1
+                    required: true
+                    schema:
+                        type: string
+            requestBody:
+                content:
+                    application/json:
+                        schema:
+                            properties:
+                                key:
+                                    description: 'key of the state information'
+                                    type: string
+                                value:
+                                    description: 'value of the state'
+                                    type: string
+                            required:
+                                - key
+                                - value
+                        example:
+                            key: PRESENTATIONCOMPLETE
+                            value: '1'
+            responses:
+                '200':
+                    description: 'OK, updated'
+                '401':
+                    description: 'Not authenticated'
+                '403':
+                    description: Forbidden
+                '500':
+                    description: 'Server Error'
+    '/test/{test_id}/state':
+        patch:
+            summary: 'save a state for a runnign test'
+            description: 'saved a state (a key-value pair) for a running test'
+            parameters:
+                -
+                    in: header
+                    name: AuthToken
+                    description: 'auth-token for test-user'
+                    example: 'p:0000000000000.00000000000'
+                -
+                    in: path
+                    name: test_id
+                    description: 'test-id - id of a test execution.'
+                    example: 1
+                    required: true
+                    schema:
+                        type: string
+            requestBody:
+                content:
+                    application/json:
+                        schema:
+                            properties:
+                                key:
+                                    description: 'key of the state information'
+                                    type: string
+                                value:
+                                    description: 'value of the state'
+                                    type: string
+                            required:
+                                - key
+                                - value
+                        example:
+                            key: LASTUNIT
+                            value: '1'
+            responses:
+                '200':
+                    description: 'OK, updated'
+                '401':
+                    description: 'Not authenticated'
+                '403':
+                    description: Forbidden
+                '500':
+                    description: 'Server Error'
+    '/test/{test_id}/unit/{unit_name}/log':
+        put:
+            summary: 'save a log-entry for a unit'
+            description: 'saves a log-entry for a unit in a running test - a log entry consists of a keyword and optionally, separated by a colon, a JSON-encoded value currently used lognetry key words for units are- UNITENTER, UNITTRYLEAVE, PRESENTATIONCOMPLETE, RESPONSESCOMPLETE, PAGENAVIGATIONSTART, PAGENAVIGATIONCOMPLETE'
+            parameters:
+                -
+                    in: header
+                    name: AuthToken
+                    description: 'auth-token for test-user'
+                    example: 'p:0000000000000.00000000000'
+                -
+                    in: path
+                    name: test_id
+                    description: 'test-id - id of a test execution.'
+                    example: 1
+                    required: true
+                    schema:
+                        type: string
+                -
+                    in: path
+                    name: unit_name
+                    description: 'unit-name (or alias) as defined in booklet'
+                    example: 1
+                    required: true
+                    schema:
+                        type: string
+            requestBody:
+                content:
+                    application/json:
+                        schema:
+                            properties:
+                                entry:
+                                    description: log-entry
+                                    type: string
+                                timestamp:
+                                    description: 'unix timestamp'
+                                    type: number
+                            required:
+                                - entry
+                                - timestamp
+                        example:
+                            entry: 'PAGENAVIGATIONSTART: "#first"'
+                            timestamp: 1582230020
+            responses:
+                '201':
+                    description: 'OK, log saved'
+                '401':
+                    description: 'Not authenticated'
+                '403':
+                    description: Forbidden
+                '500':
+                    description: 'Server Error'
+    '/test/{test_id}/log':
+        put:
+            summary: 'save a log-entry  for a runnign test'
+            description: 'saves a log-entry for a running test a log entry consists of a keyword and optionally, separated by a colon, a JSON-encoded value currently used lognetry key words for booklets are- BOOKLETLOADSTART, BOOKLETLOADCOMPLETE, BOOKLETLOCKEDbyTESTEE'
+            parameters:
+                -
+                    in: header
+                    name: AuthToken
+                    description: 'auth-token for test-user'
+                    example: 'p:0000000000000.00000000000'
+                -
+                    in: path
+                    name: test_id
+                    description: 'test-id - id of a test execution.'
+                    example: 1
+                    required: true
+                    schema:
+                        type: string
+            requestBody:
+                content:
+                    application/json:
+                        schema:
+                            properties:
+                                entry:
+                                    description: log-entry
+                                    type: string
+                                timestamp:
+                                    description: 'unix timestamp'
+                                    type: number
+                            required:
+                                - entry
+                                - timestamp
+                        example:
+                            entry: 'BOOKLETLOADSTART: {Browser:"Dredd"}'
+                            timestamp: 1582230020
+            responses:
+                '201':
+                    description: 'OK, log saved'
+                '401':
+                    description: 'Not authenticated'
+                '403':
+                    description: Forbidden
+                '500':
+                    description: 'Server Error'
+    '/test/{test_id}/lock':
+        patch:
+            summary: 'finish a test'
+            description: 'locks (finishes) a runnin test'
+            parameters:
+                -
+                    in: header
+                    name: AuthToken
+                    description: 'auth-token for test-user'
+                    example: 'p:0000000000000.00000000000'
+                -
+                    in: path
+                    name: test_id
+                    description: 'test-id - id of a test execution.'
+                    example: 1
+                    required: true
+                    schema:
+                        type: string
+            responses:
+                '200':
+                    description: 'OK, locked'
+                '401':
+                    description: 'Not authenticated'
+                '403':
+                    description: Forbidden
+                '500':
+                    description: 'Server Error'
+    /test:
+        put:
+            summary: 'start a test'
+            description: 'Creates a new test for a given person and booklet-name'
+            parameters:
+                -
+                    in: header
+                    name: AuthToken
+                    description: 'auth-token for test-user'
+                    example: 'p:0000000000000.00000000000'
+            requestBody:
+                content:
+                    application/json:
+                        schema:
+                            properties:
+                                bookletName:
+                                    description: 'name of the booklet to start'
+                                    type: string
+                            required:
+                                - bookletName
+                        example:
+                            bookletName: BOOKLET.SAMPLE
+            responses:
+                '201':
+                    description: 'OK, started'
+                    content:
+                        text/plain:
+                            example: '1'
+                '401':
+                    description: 'Not authenticated - auth token header is missing or not containing a login token'
+                '403':
+                    description: Forbidden
+                '423':
+                    description: 'Test is locked!'
+                '500':
+                    description: 'Server Error'
+    '/user/{user_id}/workspaces':
+        get:
+            summary: 'get a list of workspaces'
+            description: 'get a list of all workspaces belonging to a given user'
+            parameters:
+                -
+                    in: header
+                    name: AuthToken
+                    description: 'auth-token for admin-user with super-admin privilege'
+                    example: 'a:user000000000.superadmin0'
+                -
+                    in: path
+                    name: user_id
+                    description: user-id
+                    example: 1
+                    required: true
+                    schema:
+                        type: integer
+            responses:
+                '200':
+                    description: 'List of Workspaces'
+                    content:
+                        application/json:
+                            schema:
+                                $ref: '#/components/schemas/workspace_list'
+                            example:
+                                -
+                                    id: '1'
+                                    name: example_workspace
+                                    selected: false
+                                    role: ""
+                '401':
+                    description: 'Not authenticated'
+                '403':
+                    description: Forbidden
+                '410':
+                    description: 'Session Expired'
+                '500':
+                    description: 'Server Error'
+        patch:
+            summary: 'change user roles'
+            description: 'change user roles for a given user in several workspaces. *Provide user-name, not user-id!*'
+            parameters:
+                -
+                    in: header
+                    name: AuthToken
+                    description: 'auth-token for admin-user with super-admin privilege'
+                    example: 'a:user000000000.superadmin0'
+                -
+                    in: path
+                    name: user_id
+                    description: user-id
+                    example: 1
+                    required: true
+                    schema:
+                        type: integer
+            requestBody:
+                content:
+                    application/json:
+                        schema:
+                            properties:
+                                ws:
+                                    type: array
+                                    description: 'array of pairs role-id'
+                                    items: {type: object, properties: {id: {type: integer, description: workspace-id}, role: {type: string, description: 'role: ''RW'', ''MO'' or ''RO'''}}}
+                            required:
+                                - ws
+                        example:
+                            ws:
+                                -
+                                    role: RW
+                                    id: 1
+            responses:
+                '200':
+                    description: 'OK, roles have been updated'
+                '401':
+                    description: 'Not authenticated'
+                '403':
+                    description: Forbidden
+                '410':
+                    description: 'Session Expired'
+                '500':
+                    description: 'Server Error'
+    /user:
+        put:
+            summary: 'add a user'
+            description: 'add a user'
+            parameters:
+                -
+                    in: header
+                    name: AuthToken
+                    description: 'auth-token for admin-user with super-admin privilege'
+                    example: 'a:user000000000.superadmin0'
+            requestBody:
+                content:
+                    application/json:
+                        schema:
+                            $ref: '#/components/schemas/user'
+                        example:
+                            n: thirdUser
+                            p: thirdUsersPassword
+            responses:
+                '201':
+                    description: 'OK, user has been added'
+                '401':
+                    description: 'Not authenticated'
+                '403':
+                    description: Forbidden
+                '410':
+                    description: 'Session Expired'
+                '500':
+                    description: 'Server Error'
+    '/user/{user_id}/password':
+        patch:
+            summary: 'change user-password'
+            description: 'changes the password of a given user.'
+            parameters:
+                -
+                    in: header
+                    name: AuthToken
+                    description: 'auth-token for admin-user with super-admin privilege'
+                    example: 'a:user000000000.superadmin0'
+                -
+                    in: path
+                    name: user_id
+                    description: user-id
+                    example: 2
+                    required: true
+                    schema:
+                        type: integer
+            requestBody:
+                content:
+                    application/json:
+                        schema:
+                            $ref: '#/components/schemas/user'
+                        example:
+                            p: secondUsersNewPassword
+            responses:
+                '200':
+                    description: 'password has changed / user did not exist'
+                '401':
+                    description: 'Not authenticated'
+                '403':
+                    description: Forbidden
+                '410':
+                    description: 'Session Expired'
+                '500':
+                    description: 'Server Error'
+    '/user/{user_id}/super-admin/{new_status}':
+        patch:
+            summary: 'change super-admin status'
+            description: 'changes the super-admin status of a given user. * **requires a super-admin** * **requires the password of the performing user for security reasons** * `new_status` is `on` or `off`'
+            parameters:
+                -
+                    in: header
+                    name: AuthToken
+                    description: 'auth-token for admin-user with super-admin privilege'
+                    example: 'a:user000000000.superadmin0'
+                -
+                    in: path
+                    name: user_id
+                    description: user-id
+                    example: 2
+                    required: true
+                    schema:
+                        type: integer
+                -
+                    in: path
+                    name: new_status
+                    description: 'super-user status of the given user `on` or `off`'
+                    example: on
+                    required: true
+                    schema:
+                        type: string
+            requestBody:
+                content:
+                    application/json:
+                        schema:
+                            type: object
+                            properties:
+                                p:
+                                    type: string
+                                    description: 'performing user''s password'
+                                    example: user123
+            responses:
+                '200':
+                    description: 'password has changed / user did not exist'
+                '401':
+                    description: 'Not authenticated'
+                '403':
+                    description: Forbidden
+                '410':
+                    description: 'Session Expired'
+                '500':
+                    description: 'Server Error'
+    '/workspace/{ws_id}/booklets/started':
+        get:
+            summary: 'get started booklets'
+            description: 'retrieves an overview about started booklets'
+            parameters:
+                -
+                    in: header
+                    name: AuthToken
+                    description: 'auth-token for person with mode `monitor-study`'
+                    example: 'm:user000000000.mo00000000'
+                -
+                    in: path
+                    name: ws_id
+                    required: true
+                    description: workspace-Id
+                    schema:
+                        type: integer
+                    example: 1
+                -
+                    in: query
+                    name: groups
+                    schema:
+                        type: array
+                        description: 'a list'
+                        items:
+                            type: string
+                    example: sample_group
+            responses:
+                '200':
+                    description: 'OK, list of started booklets'
+                    content:
+                        application/json:
+                            schema:
+                                type: array
+                                items:
+                                    type: object
+                                    properties: {groupname: {type: string}, loginname: {type: string}, code: {type: string, description: 'person code'}, bookletname: {type: string}, locked: {type: boolean}, lastlogin: {type: string, description: 'date of last login and time in US format: YYYY-mm-dd HH:mm:SS'}, laststart: {type: string, description: 'date of last start and time in US format: YYYY-mm-dd HH:mm:SS'}}
+                            example:
+                                -
+                                    groupname: sample_group
+                                    loginname: test
+                                    code: dlu
+                                    bookletname: BOOKLET.SAMPLE
+                                    locked: false
+                                    lastlogin: '2019-09-10 13:29:36'
+                                    laststart: '2019-09-10 13:29:37'
+                '401':
+                    description: 'Not authenticated'
+                '403':
+                    description: Forbidden
+                '404':
+                    description: 'Workspace not found'
+                '410':
+                    description: 'Session Expired'
+                '500':
+                    description: 'Server Error'
+    '/workspace/{ws_id}/file/{type}/{filename}':
+        get:
+            summary: 'get file'
+            description: 'retrieves a file form a goven workspace by filename'
+            parameters:
+                -
+                    in: header
+                    name: AuthToken
+                    description: 'auth-token for admin-user with role at least "RO" (read only) for this workspace'
+                    schema:
+                        $ref: '#/components/schemas/auth'
+                    example: 'a:user000000000.ro00000000'
+                -
+                    in: path
+                    name: ws_id
+                    description: workspace-id
+                    example: 1
+                    schema:
+                        type: integer
+                    required: true
+                -
+                    in: path
+                    name: type
+                    description: 'file type - Testtakers | Booklet | Resource | Unit | SysCheck - CASE SENSITIVE!'
+                    example: Unit
+                    required: true
+                    schema:
+                        type: string
+                -
+                    in: path
+                    name: filename
+                    description: 'filename. - CASE SENSITIVE!'
+                    example: SAMPLE_UNIT.XML
+                    required: true
+                    schema:
+                        type: string
+            responses:
+                '200':
+                    description: 'File contents'
+                '401':
+                    description: 'Not authenticated'
+                '403':
+                    description: Forbidden
+                '404':
+                    description: 'workspace or file not found'
+                '410':
+                    description: 'Session Expired'
+                '500':
+                    description: 'Server Error'
+    '/workspace/{ws_id}/logs':
+        get:
+            summary: 'get logs'
+            description: 'retrieves unit and booklet logs from this workspace'
+            parameters:
+                -
+                    in: header
+                    name: AuthToken
+                    description: 'auth-token for admin-user with role at least "RO" (read only) for this workspace'
+                    schema:
+                        $ref: '#/components/schemas/auth'
+                    example: 'a:user000000000.ro00000000'
+                -
+                    in: path
+                    name: ws_id
+                    description: workspace-id
+                    example: 1
+                    required: true
+                    schema:
+                        type: integer
+                -
+                    in: query
+                    name: groups
+                    schema:
+                        type: array
+                        description: 'a list'
+                        items:
+                            type: string
+                    example:
+                        - sample_group
+            responses:
+                '200':
+                    description: 'OK, list of logs'
+                    content:
+                        application/json:
+                            schema:
+                                type: array
+                                items:
+                                    type: object
+                                    properties: {unitname: {type: string}, bookletname: {type: string}, groupname: {type: string}, loginname: {type: string}, code: {type: string, description: 'person code'}, timestamp: {type: string}, logentry: {type: string}}
+                            example:
+                                -
+                                    unitname: UNIT.SAMPLE
+                                    bookletname: BOOKLET.SAMPLE
+                                    groupname: sample_group
+                                    loginname: test
+                                    code: sxx
+                                    timestamp: '1568026665043'
+                                    logentry: 'sample unit log'
+                                -
+                                    bookletname: BOOKLET.SAMPLE
+                                    groupname: sample_group
+                                    loginname: test
+                                    code: sxx
+                                    timestamp: '1568026665043'
+                                    logentry: 'sample log entry'
+                                    unitname: ""
+                '401':
+                    description: 'Not authenticated'
+                '403':
+                    description: Forbidden
+                '404':
+                    description: 'Workspace not found'
+                '410':
+                    description: 'Session Expired'
+                '500':
+                    description: 'Server Error'
+    '/workspace/{ws_id}/responses':
+        get:
+            summary: 'get responses'
+            description: 'retrieves a list of responses by a given list of groups'
+            parameters:
+                -
+                    in: header
+                    name: AuthToken
+                    description: 'auth-token for admin-user with role at least "RO" (read only) for this workspace'
+                    schema:
+                        $ref: '#/components/schemas/auth'
+                    example: 'a:user000000000.ro00000000'
+                -
+                    in: path
+                    name: ws_id
+                    description: workspace-id
+                    example: 1
+                    required: true
+                    schema:
+                        type: integer
+                -
+                    in: query
+                    name: groups
+                    schema:
+                        type: array
+                        description: 'a list'
+                        items:
+                            type: string
+                    example:
+                        - sample_group
+            responses:
+                '200':
+                    description: 'OK, list of responses'
+                    content:
+                        application/json:
+                            schema:
+                                type: array
+                                items:
+                                    type: object
+                                    properties: {unitname: {type: string}, responses: {type: string, description: 'may contain encoded JSON'}, responsetype: {type: string}, laststate: {type: string, description: 'may contain encoded JSON'}, bookletname: {type: string}, restorepoint_ts: {type: string}, responses_ts: {type: string, description: 'contains a unix timestamp'}, restorepoint: {type: string}, groupname: {type: string}, loginname: {type: string}, code: {type: string, description: 'login code'}}
+                                example:
+                                    - {unitname: UNIT.SAMPLE, responses: '{"name":"Sam Sample","age":34}', responsetype: "", laststate: '{"PRESENTATIONCOMPLETE":"yes"}', bookletname: BOOKLET.SAMPLE, restorepoint_ts: '0', responses_ts: '1567778660869', restorepoint: null, groupname: sample_group, loginname: test, code: jsx}
+                '401':
+                    description: 'Not authenticated'
+                '403':
+                    description: Forbidden
+                '404':
+                    description: 'Workspace not found'
+                '410':
+                    description: 'Session Expired'
+                '500':
+                    description: 'Server Error'
+        delete:
+            summary: 'delete data'
+            description: 'deletes all results and monitor data of a group of groups'
+            parameters:
+                -
+                    in: header
+                    name: AuthToken
+                    description: 'auth-token for admin-user with role "RW" (read/write) for this workspace'
+                    example: 'a:user000000000.rw00000000'
+                -
+                    in: path
+                    name: ws_id
+                    description: workspace-id
+                    example: 1
+                    required: true
+                    schema:
+                        type: integer
+            requestBody:
+                content:
+                    application/json:
+                        schema:
+                            properties:
+                                groups:
+                                    type: array
+                                    description: 'array of group names'
+                                    items: {type: string}
+                        example:
+                            groups:
+                                - sample_group
+            responses:
+                '200':
+                    description: OK
+                '401':
+                    description: 'Not authenticated'
+                '403':
+                    description: Forbidden
+                '404':
+                    description: 'workspace or file not found'
+                '410':
+                    description: 'Session Expired'
+                '500':
+                    description: 'Server Error'
+    '/workspace/{ws_id}/results':
+        get:
+            summary: 'get results'
+            description: 'retrieves a list of unit- and booklet results for a given workspace and groups'
+            parameters:
+                -
+                    in: header
+                    name: AuthToken
+                    description: 'auth-token for admin-user with role at least "RO" (read only) for this workspace'
+                    example: 'a:user000000000.superadmin0'
+                -
+                    in: path
+                    name: ws_id
+                    description: workspace-id
+                    example: 1
+                    required: true
+                    schema:
+                        type: integer
+            responses:
+                '200':
+                    description: 'OK, list of results'
+                    content:
+                        application/json:
+                            schema:
+                                type: array
+                                items:
+                                    type: object
+                                    properties: {groupname: {type: string}, bookletsStarted: {type: integer}, num_units_min: {type: string}, num_units_max: {type: string}, num_units_total: {type: string}, lastchange: {type: string, description: timestamp}, num_units_mean: {type: integer}}
+                            example:
+                                -
+                                    groupname: sample_group
+                                    bookletsStarted: 1
+                                    num_units_min: '1'
+                                    num_units_max: '1'
+                                    num_units_total: '1'
+                                    lastchange: '1567776853037'
+                                    num_units_mean: 1
+                '401':
+                    description: 'Not authenticated'
+                '403':
+                    description: Forbidden
+                '404':
+                    description: 'Workspace not found'
+                '410':
+                    description: 'Session Expired'
+                '500':
+                    description: 'Server Error'
+    '/workspace/{ws_id}/reviews':
+        get:
+            summary: 'get reviews'
+            description: 'retrieves a list of unit- and booklet-reviews for a given workspace and groups'
+            parameters:
+                -
+                    in: header
+                    name: AuthToken
+                    description: 'auth-token for admin-user with role at least "RO" (read only) for this workspace'
+                    example: 'a:user000000000.superadmin0'
+                -
+                    in: path
+                    name: ws_id
+                    description: workspace-id
+                    example: 1
+                    required: true
+                    schema:
+                        type: integer
+                -
+                    in: query
+                    name: groups
+                    schema:
+                        type: array
+                        description: 'a list'
+                        items:
+                            type: string
+                    example:
+                        - sample_group
+            responses:
+                '200':
+                    description: 'OK, list of reviews'
+                    content:
+                        application/json:
+                            schema:
+                                type: array
+                                items:
+                                    type: object
+                                    properties: {unitname: {type: string, description: 'stays empty if booklet review'}, bookletname: {type: string}, groupname: {type: string}, code: {type: string, description: 'login code'}, entry: {type: string}, priority: {type: string}, categories: {type: string}}
+                            example:
+                                -
+                                    unitname: UNIT.SAMPLE
+                                    bookletname: BOOKLET.SAMPLE
+                                    groupname: sample_group
+                                    loginname: test
+                                    code: euf
+                                    reviewtime: '2019-09-06 11:19:56'
+                                    entry: 'this is a sample unit review'
+                                    priority: '1'
+                                    categories: ""
+                                -
+                                    bookletname: BOOKLET.SAMPLE
+                                    groupname: sample_group
+                                    loginname: test
+                                    code: euf
+                                    reviewtime: '2019-09-06 11:19:56'
+                                    entry: 'sample booklet review'
+                                    priority: '1'
+                                    categories: ""
+                                    unitname: ""
+                '401':
+                    description: 'Not authenticated'
+                '403':
+                    description: Forbidden
+                '404':
+                    description: 'Workspace not found'
+                '410':
+                    description: 'Session Expired'
+                '500':
+                    description: 'Server Error'
+    '/workspace/{ws_id}/status':
+        get:
+            summary: 'get status'
+            description: 'Retrieves an overview about running tests'
+            parameters:
+                -
+                    in: header
+                    name: AuthToken
+                    description: 'auth-token for person with mode `monitor-study`'
+                    example: 'm:user000000000.mo00000000'
+                -
+                    in: path
+                    name: ws_id
+                    description: workspace-id
+                    example: 1
+                    required: true
+                    schema:
+                        type: integer
+            responses:
+                '200':
+                    description: 'OK, list of monitor data'
+                    content:
+                        application/json:
+                            schema:
+                                type: array
+                                items:
+                                    type: object
+                                    properties: {groupname: {type: string}, loginsPrepared: {type: integer}, personsPrepared: {type: integer}, bookletsPrepared: {type: integer}, bookletsStarted: {type: integer}, bookletsLocked: {type: integer}, laststart: {type: integer, description: 'timestamp of last start'}, laststartStr: {type: string, description: 'date of last start in human readable format (german date format: dd.MM.yyyy)'}}
+                            example:
+                                -
+                                    groupname: sample_group
+                                    loginsPrepared: 1
+                                    personsPrepared: 10
+                                    bookletsPrepared: 10
+                                    bookletsStarted: 1
+                                    bookletsLocked: 0
+                                    laststart: 1567783156
+                                    laststartStr: 06.09.2019
+                '401':
+                    description: 'Not authenticated'
+                '403':
+                    description: Forbidden
+                '404':
+                    description: 'Workspace not found'
+                '410':
+                    description: 'Session Expired'
+                '500':
+                    description: 'Server Error'
+    '/workspace/{ws_id}/validation':
+        get:
+            summary: 'check workspace'
+            description: 'triggers a check of all xmls in the workspace and retrieves the results'
+            parameters:
+                -
+                    in: header
+                    name: AuthToken
+                    description: 'auth-token for admin-user with role at least "RO" (read only) for this workspace'
+                    example: 'a:user000000000.superadmin0'
+                -
+                    in: path
+                    name: ws_id
+                    description: workspace-id
+                    example: 1
+                    required: true
+                    schema:
+                        type: integer
+            responses:
+                '200':
+                    description: 'OK, list of reviews'
+                    content:
+                        application/json:
+                            schema:
+                                type: object
+                                properties:
+                                    errors: {type: array, items: {type: string}}
+                                    warnings: {type: array, items: {type: string}}
+                                    infos: {type: array, items: {type: string}}
+                            example:
+                                errors: []
+                                warnings: []
+                                infos:
+                                    - '1 resource files found'
+                                    - '1 valid units found'
+                                    - '1 valid booklets found'
+                                    - '0 valid syschecks found'
+                                    - '10 testtakers in 1 logins found'
+                                    - 'booklet loads (bytes, sorted):'
+                                    - '    BOOKLET.SAMPLE: 5.365'
+                '401':
+                    description: 'Not authenticated'
+                '403':
+                    description: Forbidden
+                '404':
+                    description: 'Workspace not found'
+                '410':
+                    description: 'Session Expired'
+                '500':
+                    description: 'Server Error'
+    '/workspace/{ws_id}/file':
+        post:
+            summary: 'upload file'
+            description: 'uploads a Resource, Unit, Booklet, SysCheck or Testtakers file'
+            parameters:
+                -
+                    in: header
+                    name: AuthToken
+                    description: 'auth-token for admin-user with role "RW" (read/write) for this workspace'
+                    example: 'a:user000000000.rw00000000'
+                -
+                    in: path
+                    name: ws_id
+                    description: workspace-id
+                    example: 1
+                    required: true
+                    schema:
+                        type: integer
+            requestBody:
+                content:
+                    multipart/form-data:
+                        schema:
+                            type: object
+                            properties:
+                                fileforvo:
+                                    type: string
+                                    description: 'upload file'
+                                    example: '(content of Unit.xml)'
+                                anything:
+                                    type: string
+                                    example: goes
+                            required:
+                                - fileforvo
+            responses:
+                '201':
+                    description: 'upload successful'
+                    content:
+                        application/json:
+                            example:
+                                Unit.xml: true
+                '400':
+                    description: 'file could not be uploaded or is invalid.'
+                '401':
+                    description: 'Not authenticated'
+                '403':
+                    description: Forbidden
+                '404':
+                    description: 'workspace not found'
+                '410':
+                    description: 'Session Expired'
+                '422':
+                    description: 'Provided XML file is invalid'
+                '500':
+                    description: 'Server Error'
+    '/workspace/{ws_id}/files':
+        get:
+            summary: 'get files of workspace'
+            description: 'get a list of all files in workspace'
+            parameters:
+                -
+                    in: header
+                    name: AuthToken
+                    description: 'auth-token for admin-user with role at least "RO" (read only) for this workspace'
+                    example: 'a:user000000000.superadmin0'
+                -
+                    in: path
+                    name: ws_id
+                    description: workspace-id
+                    example: 1
+                    required: true
+                    schema:
+                        type: integer
+            responses:
+                '200':
+                    description: 'OK, a list of files'
+                    content:
+                        application/json:
+                            schema:
+                                $ref: '#/components/schemas/file_list'
+                            example:
+                                -
+                                    filename: SAMPLE_TESTTAKERS.XML
+                                    filesize: 823
+                                    filesizestr: '823 Bytes'
+                                    filedatetime: 1567610586
+                                    filedatetimestr: 04.09.2019
+                                    type: Testtakers
+                                    typelabel: Testtakers
+                                -
+                                    filename: SAMPLE_BOOKLET.XML
+                                    filesize: 1284
+                                    filesizestr: '1.25 KB'
+                                    filedatetime: 1567610586
+                                    filedatetimestr: 04.09.2019
+                                    type: Booklet
+                                    typelabel: Booklet
+                                -
+                                    filename: SAMPLE_PLAYER.HTML
+                                    filesize: 3386
+                                    filesizestr: '3.31 KB'
+                                    filedatetime: 1567610586
+                                    filedatetimestr: 04.09.2019
+                                    type: Resource
+                                    typelabel: Resource
+                                -
+                                    filename: SAMPLE_UNIT.XML
+                                    filesize: 696
+                                    filesizestr: '696 Bytes'
+                                    filedatetime: 1567610586
+                                    filedatetimestr: 04.09.2019
+                                    type: Unit
+                                    typelabel: Unit
+                                -
+                                    filename: SAMPLE_SYSCHECK.XML
+                                    filesize: 960
+                                    filesizestr: '960 Bytes'
+                                    filedatetime: 1567610586
+                                    filedatetimestr: 04.09.2019
+                                    type: SysCheck
+                                    typelabel: SysCheck
+                '401':
+                    description: 'Not authenticated'
+                '403':
+                    description: Forbidden
+                '404':
+                    description: 'Workspace not found'
+                '410':
+                    description: 'Session Expired'
+                '500':
+                    description: 'Server Error'
+        delete:
+            summary: 'delete files'
+            description: 'deletes files from a workspace'
+            parameters:
+                -
+                    in: header
+                    name: AuthToken
+                    description: 'auth-token for admin-user with role "RW" (read/write) for this workspace'
+                    example: 'a:user000000000.rw00000000'
+                -
+                    in: path
+                    name: ws_id
+                    description: workspace-id
+                    example: 1
+                    required: true
+                    schema:
+                        type: integer
+            requestBody:
+                content:
+                    application/json:
+                        schema:
+                            properties:
+                                f:
+                                    type: array
+                                    description: 'array of file names'
+                                    items: {type: string}
+                        example:
+                            f:
+                                - SysCheck/SAMPLE_SYSCHECK.XML
+                                - 'some rubbish'
+                                - a/b
+                                - ../../README.md
+            responses:
+                '207':
+                    description: 'OK, a list of files'
+                    content:
+                        application/json:
+                            example:
+                                deleted:
+                                    - SysCheck/SAMPLE_SYSCHECK.XML
+                                did_not_exist:
+                                    - 'some rubbish'
+                                    - a/b
+                                not_allowed:
+                                    - ../../README.md
+                '401':
+                    description: 'Not authenticated'
+                '403':
+                    description: Forbidden
+                '404':
+                    description: 'Workspace not found'
+                '410':
+                    description: 'Session Expired'
+                '500':
+                    description: 'Server Error'
+    '/workspace/{ws_id}/tests/lock':
+        patch:
+            summary: 'lock tests'
+            description: 'locks a group of booklets in a workspace'
+            parameters:
+                -
+                    in: header
+                    name: AuthToken
+                    description: 'auth-token for person with mode `monitor-study`'
+                    example: 'm:user000000000.mo00000000'
+                -
+                    in: path
+                    name: ws_id
+                    description: workspace-id
+                    example: 1
+                    required: true
+                    schema:
+                        type: integer
+            requestBody:
+                content:
+                    application/json:
+                        schema:
+                            properties:
+                                groups:
+                                    type: array
+                                    description: 'array of group names'
+                                    items: {type: string}
+                        example:
+                            groups:
+                                - group1
+            responses:
+                '200':
+                    description: OK
+                '401':
+                    description: 'Not authenticated'
+                '403':
+                    description: Forbidden
+                '404':
+                    description: 'Workspace not found'
+                '410':
+                    description: 'Session Expired'
+                '500':
+                    description: 'Server Error'
+    '/workspace/{ws_id}/tests/unlock':
+        patch:
+            summary: 'unlock tests'
+            description: 'unlocks a group of booklets in a workspace'
+            parameters:
+                -
+                    in: header
+                    name: AuthToken
+                    description: 'auth-token for person with mode `monitor-study`'
+                    example: 'm:user000000000.mo00000000'
+                -
+                    in: path
+                    name: ws_id
+                    description: workspace-id
+                    example: 1
+                    required: true
+                    schema:
+                        type: integer
+            requestBody:
+                content:
+                    application/json:
+                        schema:
+                            properties:
+                                groups:
+                                    type: array
+                                    description: 'array of group names'
+                                    items: {type: string}
+                        example:
+                            groups:
+                                - group1
+            responses:
+                '200':
+                    description: OK
+                '401':
+                    description: 'Not authenticated'
+                '403':
+                    description: Forbidden
+                '404':
+                    description: 'Workspace not found'
+                '410':
+                    description: 'Session Expired'
+                '500':
+                    description: 'Server Error'
+    /workspace:
+        put:
+            summary: 'add a workspace'
+            description: 'adds a workspace with given name'
+            parameters:
+                -
+                    in: header
+                    name: AuthToken
+                    description: 'auth-token for admin-user with super-admin privilege'
+                    example: 'a:user000000000.superadmin0'
+            requestBody:
+                content:
+                    application/json:
+                        schema:
+                            properties:
+                                name:
+                                    type: string
+                                    description: 'workspace name'
+                            required:
+                                - name
+                        example:
+                            name: 'new work space'
+            responses:
+                '201':
+                    description: 'OK, workspace has been added'
+                '401':
+                    description: 'Not authenticated'
+                '410':
+                    description: 'Session Expired'
+                '500':
+                    description: 'Server Error'
+    '/workspace/{ws_id}':
+        get:
+            summary: 'get workspace'
+            description: 'returns basic information about a workspace'
+            parameters:
+                -
+                    in: header
+                    name: AuthToken
+                    description: 'auth-token for admin-user with super-admin privilege'
+                    example: 'a:user000000000.superadmin0'
+                -
+                    in: path
+                    name: ws_id
+                    description: workspace-id
+                    example: 1
+                    required: true
+                    schema:
+                        type: integer
+            responses:
+                '200':
+                    description: 'OK, workspace info'
+                    content:
+                        application/json:
+                            example:
+                                id: 1
+                                name: example_workspace
+                                role: RW
+                '401':
+                    description: 'Not authenticated'
+                '403':
+                    description: Forbidden
+                '410':
+                    description: 'Session Expired'
+                '500':
+                    description: 'Server Error'
+        patch:
+            summary: 'rename a workspace'
+            description: 'renames a workspace with given id'
+            parameters:
+                -
+                    in: header
+                    name: AuthToken
+                    description: 'auth-token for admin-user with super-admin privilege'
+                    example: 'a:user000000000.superadmin0'
+                -
+                    in: path
+                    name: ws_id
+                    description: workspace-id
+                    example: 1
+                    required: true
+                    schema:
+                        type: integer
+            requestBody:
+                content:
+                    application/json:
+                        schema:
+                            properties:
+                                name:
+                                    type: string
+                                    description: Password
+                            required:
+                                - n
+                        example:
+                            name: 'a new york space'
+            responses:
+                '200':
+                    description: 'OK, workspace has been renamed'
+                '401':
+                    description: 'Not authenticated'
+                '403':
+                    description: Forbidden
+                '410':
+                    description: 'Session Expired'
+                '500':
+                    description: 'Server Error'
+    '/workspace/{ws_id}/users':
+        patch:
+            summary: 'change user roles'
+            description: 'change user roles in a given workspaces'
+            parameters:
+                -
+                    in: header
+                    name: AuthToken
+                    description: 'auth-token for admin-user with super-admin privilege'
+                    example: 'a:user000000000.superadmin0'
+                -
+                    in: path
+                    name: ws_id
+                    description: workspace-id
+                    example: 1
+                    required: true
+                    schema:
+                        type: integer
+            requestBody:
+                content:
+                    application/json:
+                        schema:
+                            properties:
+                                u:
+                                    type: array
+                                    description: 'array of pairs role-id'
+                                    items: {type: object, properties: {id: {type: integer, description: user-id}, role: {type: string, description: 'role: ''RW'', ''MO'' or ''RO'''}}}
+                            required:
+                                - u
+                        example:
+                            u:
+                                -
+                                    role: RW
+                                    id: 1
+            responses:
+                '200':
+                    description: 'OK, roles has been updated'
+                '401':
+                    description: 'Not authenticated'
+                '403':
+                    description: Forbidden
+                '410':
+                    description: 'Session Expired'
+                '500':
+                    description: 'Server Error'
+        get:
+            summary: 'get a list of users in a workspace'
+            description: 'returns info about all registered users in a workspace.'
+            parameters:
+                -
+                    in: header
+                    name: AuthToken
+                    description: 'auth-token for admin-user with super-admin privilege'
+                    example: 'a:user000000000.superadmin0'
+                -
+                    in: path
+                    name: ws_id
+                    description: workspace-id
+                    example: 1
+                    required: true
+                    schema:
+                        type: integer
+            responses:
+                '200':
+                    description: 'List of users'
+                    content:
+                        application/json:
+                            schema:
+                                $ref: '#/components/schemas/user_list'
+                            example:
+                                -
+                                    name: super
+                                    id: '1'
+                                    selected: true
+                                    role: RW
+                '401':
+                    description: 'Not authenticated'
+                '403':
+                    description: Forbidden
+                '410':
+                    description: 'Session Expired'
+                '500':
+                    description: 'Server Error'
+    '/workspace/{ws_id}/sys-check/reports':
+        get:
+            summary: 'get reports'
+            description: 'return a compilation of reports from given syschecks in JSON or CSV format.'
+            parameters:
+                -
+                    in: header
+                    name: AuthToken
+                    description: 'auth-token for admin-user with role at least "RO" (read only) for this workspace'
+                    example: 'a:user000000000.superadmin0'
+                -
+                    in: query
+                    name: format
+                    description: 'Response format: json or csv. This is implemented because of a Bug in Dredd and will be removed'
+                    example: csv
+                -
+                    in: path
+                    name: ws_id
+                    description: workspace-id
+                    example: 1
+                    required: true
+                    schema:
+                        type: integer
+                -
+                    in: query
+                    name: checkIds
+                    description: 'a comma separated list of sys-check-ids'
+                    example: SYSCHECK.SAMPLE
+                -
+                    in: query
+                    name: delimiter
+                    description: '(optional) for CSV output only - delimiter character for cells. Allowed Values: '','', '';'', ''|'', ''\t'', ''\s''. Defaults to '',''.'
+                    example: ','
+                -
+                    in: query
+                    name: lineEnding
+                    description: "(optional) for CSV output only - character for line endings. Allowed Values: '\\r\\n' (Windows), '\\r' (Mac), '\\n' (Unix) Defaults to '\n'."
+                    example: ""
+                -
+                    in: query
+                    name: enclosure
+                    description: '(optional) for CSV output only - quotation character for cell enclosure. Allowed Values: " and ''. Defaults to ".'
+                    example: '"'
+            responses:
+                '200':
+                    description: 'Not authenticated'
+                '403':
+                    description: Forbidden
+                '410':
+                    description: 'Session Expired'
+                '500':
+                    description: 'Server Error'
+        delete:
+            summary: 'delete reports'
+            description: 'delete some SysCheck-reports'
+            parameters:
+                -
+                    in: header
+                    name: AuthToken
+                    description: 'auth-token for admin-user with role "RW" (read/write) for this workspace'
+                    example: 'a:user000000000.rw00000000'
+                -
+                    in: path
+                    name: ws_id
+                    description: workspace-id
+                    example: 1
+                    required: true
+                    schema:
+                        type: integer
+            requestBody:
+                content:
+                    application/json:
+                        schema:
+                            properties:
+                                checkIds:
+                                    type: array
+                                    description: 'array of sys-check-Ids'
+                                    items: {type: string}
+                            required:
+                                - checkIds
+                        example:
+                            checkIds:
+                                - SYSCHECK.SAMPLE
+            responses:
+                '207':
+                    description: 'OK, a list of deleted files'
+                    content:
+                        application/json:
+                            example:
+                                deleted:
+                                    - SysCheck/SAMPLE_SYSCHECK.XML
+                '401':
+                    description: 'Not authenticated'
+                '403':
+                    description: Forbidden
+                '410':
+                    description: 'Session Expired'
+                '500':
+                    description: 'Server Error'
+    '/workspace/{ws_id}/sys-check/reports/overview':
+        get:
+            summary: 'get a list of all sys-check-reports'
+            description: 'returns a list of all sys-check-reports with most important features grouped by the sys-checks.'
+            parameters:
+                -
+                    in: header
+                    name: AuthToken
+                    description: 'auth-token for admin-user with role at least "RO" (read only) for this workspace'
+                    example: 'a:user000000000.superadmin0'
+                -
+                    in: path
+                    name: ws_id
+                    description: workspace-id
+                    example: 1
+                    required: true
+                    schema:
+                        type: integer
+            responses:
+                '200':
+                    description: 'List of digests of Sys-Check-Reports'
+                    content:
+                        application/json:
+                            schema:
+                                type: array
+                                items:
+                                    type: object
+                                    description: 'aggregations of sys-check-reports to a specific report'
+                                    properties: {id: {type: string, description: 'id of the *SysCheck* to which theese reports belongs'}, count: {type: number, description: 'number of aggregated sys-check-reports'}, label: {type: string, description: 'label of the SysCheck'}, details: {type: object, description: 'assoc containing statistics over most important report-fields in the form feature - nummer of occurances'}}
+                            example:
+                                -
+                                    id: SYSCHECK.SAMPLE
+                                    count: 1
+                                    label: 'An example SysCheck definition'
+                                    details: {os: {'Linux x86_64': 1}, browser: {'Chrome 79': 1}}
+                '401':
+                    description: 'Not authenticated'
+                '403':
+                    description: Forbidden
+                '410':
+                    description: 'Session Expired'
+                '500':
+                    description: 'Server Error'
+    '/workspace/{ws_id}/sys-check/{sys_check_name}':
+        get:
+            summary: 'get sysCheck'
+            description: 'returns a specific SysCheck configuation **this endpoint does not need any authetication!**'
+            parameters:
+                -
+                    in: path
+                    name: ws_id
+                    description: workspace-id
+                    example: 1
+                    required: true
+                    schema:
+                        type: integer
+                -
+                    in: path
+                    name: sys_check_name
+                    description: 'name of the SysCheck (as stored in the XML)'
+                    example: SYSCHECK.SAMPLE
+                    required: true
+                    schema:
+                        type: string
+            responses:
+                '200':
+                    description: 'Configuation of a SysCheck (as JSON, not as plain XML)'
+                    content:
+                        application/json:
+                            schema:
+                                $ref: '#/components/schemas/sys_check'
+                '404':
+                    description: 'No SysCheck with that name found on Workspace'
+                '500':
+                    description: 'Server Error'
+    '/workspace/{ws_id}/sys-check/{sys_check_name}/unit-and-player':
+        get:
+            summary: 'get SysCheck Unit and Player'
+            description: 'returns a container with the unit and it''s player according to a SysCheck'
+            parameters:
+                -
+                    in: path
+                    name: ws_id
+                    description: workspace-id
+                    example: 1
+                    required: true
+                    schema:
+                        type: integer
+                -
+                    in: path
+                    name: sys_check_name
+                    description: 'name of the SysCheck (as stored in the XML)'
+                    example: SYSCHECK.SAMPLE
+                    required: true
+                    schema:
+                        type: string
+            responses:
+                '200':
+                    description: 'A container with the unit and it''s player'
+                '404':
+                    description: 'No SysCheck with that name found on Workspace'
+                '500':
+                    description: 'Server Error'
+    '/workspace/{ws_id}/sys-check/{sys_check_name}/report':
+        put:
+            summary: 'new SysCheck-report'
+            description: 'save the results of a performed SysCheck'
+            parameters:
+                -
+                    in: path
+                    name: ws_id
+                    description: workspace-id
+                    example: 1
+                    required: true
+                    schema:
+                        type: integer
+                -
+                    in: path
+                    name: sys_check_name
+                    description: 'name of the SysCheck (as stored in the XML)'
+                    example: SYSCHECK.SAMPLE
+                    required: true
+                    schema:
+                        type: string
+            requestBody:
+                content:
+                    application/json:
+                        example:
+                            keyPhrase: saveme
+                            title: dsk
+                            environment:
+                                -
+                                    id: '0'
+                                    type: environment
+                                    label: Betriebsystem
+                                    value: Linux
+                                    warning: false
+                                -
+                                    id: '0'
+                                    type: network
+                                    label: Downloadgeschwindigkeit
+                                    value: '68.01 Mbit/s'
+                                    warning: false
+                            questionnaire: []
+                            unit:
+                                -
+                                    id: '0'
+                                    type: unit/player
+                                    label: 'loading time'
+                                    value: '27'
+                                    warning: false
+            responses:
+                '201':
+                    description: 'Ok, Report saved'
+                '404':
+                    description: 'No SysCheck with that name found on Workspace'
+                '500':
+                    description: 'Server Error'
+components:
+    schemas:
+        auth:
+            type: object
+            properties:
+                at:
+                    type: string
+                    description: 'authtoken für admin and maybe super admin modules'
+                    example: user000000000.superadmin0
+            required:
+                - at
+        auth_test:
+            type: object
+            properties:
+                p:
+                    type: string
+                    description: 'authtoken für test module - person'
+                    example: person00000000.test0000000
+                l:
+                    type: string
+                    description: 'authtoken für test module - login'
+                    example: person00000000.test0000000
+            required:
+                - l
+        login_request:
+            type: object
+            properties:
+                name:
+                    type: string
+                    description: Username
+                    example: super
+                password:
+                    type: string
+                    description: Password
+                    example: user123
+        session:
+            description: 'content of a session'
+            type: object
+            properties:
+                token:
+                    type: string
+                    description: 'Token for session authentication'
+                    example: person00000000.test0000000
+                displayName:
+                    type: string
+                    description: 'name to be displayed'
+                    example: super
+                customTexts:
+                    type: object
+                    description: 'An Object containing customtext-strings for the UI as key-value-pairs'
+                    example:
+                        somestr: string
+                flags:
+                    type: array
+                    description: "flags with additional information.\n  * `codeRequired` that indicates that a second part of authentication is required"
+                access:
+                    description: 'A collection of available obejcts. The keys are type of object.'
+                    type: object
+                    properties:
+                        workspaceAdmin:
+                            type: string
+                            description: 'Elements are (numeric) Workspace-Ids. Use `[GET] /workspace/{worksapce_id}` to obtain label, user-rights and such.'
+                        superAdmin:
+                            type: string
+                            description: 'No Elements. Presence of this key indicates access to Superadmin-functions for this user.'
+                        test:
+                            type: string
+                            description: 'Elements are booklet-names (not test-ids because unstarted tests don''t have one. Through the endpoint `[GET] /booklet/{test_name}` the corresponding ids, and if startet, status etc. can be obtained.'
+                        workspaceMonitor:
+                            type: string
+                            description: workspace(s)
+                        testGroupMonitor:
+                            type: string
+                            description: workspace(s)
+        workspace:
+            type: object
+            properties:
+                id:
+                    type: string
+                    example: '1'
+                name:
+                    type: string
+                    example: example_workspace
+                role:
+                    type: string
+                    example: RW
+                selected:
+                    type: boolean
+                    example: false
+                    description: 'TODO what does this do?'
+            required:
+                - id
+        workspace_list:
+            type: array
+            description: 'List of Workspaces'
+            items:
+                $ref: '#/components/schemas/workspace'
+        user_list:
+            type: array
+            description: 'List of Users'
+            items:
+                $ref: '#/components/schemas/user'
+        user:
+            type: object
+            description: 'a user'
+            properties:
+                name:
+                    type: string
+                    example: super
+                id:
+                    type: string
+                    example: '1'
+                email:
+                    type: string
+                    nullable: true
+                    example: null
+                isSuperadmin:
+                    type: boolean
+                    example: true
+                selected:
+                    type: boolean
+                    example: true
+                    description: 'TODO what does this do?'
+                role:
+                    type: string
+                    example: RW
+            required:
+                - id
+                - name
+        file:
+            type: object
+            description: 'information about a file'
+            properties:
+                filename:
+                    type: string
+                filesize:
+                    type: integer
+                    description: 'file size in byte'
+                filesizestr:
+                    type: string
+                    description: 'human readable filesize'
+                filedatetime:
+                    type: integer
+                    description: 'modification date as unix time stamp'
+                filedatetimestr:
+                    type: string
+                    description: 'modification date as human readable string'
+                type:
+                    type: string
+                    description: 'Testtakers | Booklet | Resource | Unit | SysCheck'
+                typelabel:
+                    type: string
+                    description: 'Testtakers | Booklet | Resource | Unit | SysCheck'
+        file_list:
+            type: array
+            description: 'List of Files'
+            items:
+                $ref: '#/components/schemas/file'
+        sys_check:
+            type: object
+            description: 'Configuration of a SysCheck'
+            properties:
+                name:
+                    description: 'name of the SysCheck as defiend in the XML-file'
+                    type: string
+                label:
+                    description: 'label to display'
+                    type: string
+                questions:
+                    description: 'set of questions for the questionaire'
+                    type: array
+                    items:
+                        $ref: '#/components/schemas/question_def'
+                hasUnit:
+                    description: 'is there a unit for this SysCheck?'
+                    type: boolean
+                canSave:
+                    description: 'is saving SysCheck-Report allowed?'
+                    type: boolean
+                customTexts:
+                    description: CustomTexts
+                    type: object
+                skipNetwork:
+                    description: 'skip the network test?'
+                    type: boolean
+                downloadSpeed:
+                    $ref: '#/components/schemas/speed_params'
+                uploadSpeed:
+                    $ref: '#/components/schemas/speed_params'
+                workspaceId:
+                    description: 'on which workspace is this SysCheck?'
+                    type: number
+        speed_params:
+            type: object
+            description: 'paramaters of a speed-check'
+            properties:
+                min:
+                    description: 'minimal speed to get a `sufficient` rating in **Bytes per second**'
+                    type: number
+                    example: 1875000
+                good:
+                    description: 'minimal speed to get a `good` rating in **Bytes per second**'
+                    type: number
+                    example: 3750000
+                maxDevianceBytesPerSecond:
+                    description: 'maximal deviance allowed to pass one round of regeression test in **Bytes per second**'
+                    type: number
+                    example: 100000
+                maxErrorsPerSequence:
+                    description: 'allow this number of errors in one sequence and still pass, normally 0'
+                    type: integer
+                    example: 0
+                maxSequenceRepetitions:
+                    description: 'how many test sequences should be run (if they exceedmax deviance), minimum is 3'
+                    type: integer
+                    example: 15
+                sequenceSizes:
+                    description: 'array of numbers describing the packagae sized for each sequence'
+                    type: array
+                    items:
+                        type: integer
+                    example:
+                        - 400000
+                        - 800000
+                        - 1600000
+                        - 3200000
+        question_def:
+            type: object
+            description: 'definition of a SysCheck-questionaire'
+            properties:
+                id:
+                    type: number
+                    description: 'identifier of the question'
+                    example: 1
+                type:
+                    description: 'type of the questions, like ''header'', ''string'', ''select'', ''text'', ''check'', ''radio'''
+                    type: string
+                    example: select
+                prompt:
+                    description: 'Question text'
+                    type: string
+                    example: 'What is the capital of Switzerland?'
+                options:
+                    description: 'list of options for type `check` or `select`'
+                    type: array
+                    items:
+                        type: string
+                    example:
+                        - Bern
+                        - Zurich
+                required:
+                    description: 'is this question required'
+                    type: boolean
+                    example: false