diff --git a/LISENCE b/LICENSE
similarity index 100%
rename from LISENCE
rename to LICENSE
diff --git a/README.md b/README.md
index 5f92bfc69915f72e0489979f5f6c05ba73bb4006..58b8742eba6d37e075cb6fe592b8cb2473e3d01a 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,45 @@
 [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg?style=flat-square)](https://opensource.org/licenses/MIT)
 
-
-# IQB Testcenter
+# Testcenter Frontend
 
 Diese Angular-Programmierung ist die clientseitige Web-Anwendung für das Online-Testen des IQB. Über diesen Weg wird die Programmierung allen Interessierten zur Verfügung gestellt. Eine Anleitung zum Installieren und Konfigurieren wird schrittweise an dieser Stelle folgen.
+
+***
+
+This is the frontend of the Testcenter application. It's written in Typescript using Angular 9.
+
+You can find the backend [here](https://github.com/iqb-berlin/testcenter-backend).
+
+
+## Documentation
+
+*TBA*
+
+## Bug Reports
+
+File bug reports, feature requests etc. [here](https://github.com/iqb-berlin/testcenter-frontend/issues).
+
+## Installation
+
+### With Docker (recommended)
+Find Docker files for a complete setup of the application [here](https://github.com/iqb-berlin/testcenter-setup).
+
+### Manual Compilation
+#### Prerequisites
+* node 12+
+
+#### Compilation Steps
+
+```
+npm install
+ng build --prod
+```
+
+Find compiled App in src folder and open in Browser or serve with `ng serve`. 
+
+## Tests
+*TBA*
+
+## Development
+### Coding Standards
+*TBA*
diff --git a/e2e/src/app.e2e-spec.ts b/e2e/src/app.e2e-spec.ts
index 985b0d8fa9db0e869600f8af8a7c98a78a00e5ca..d98bef60c0a68cc58765b07394d637ec4d249947 100644
--- a/e2e/src/app.e2e-spec.ts
+++ b/e2e/src/app.e2e-spec.ts
@@ -1,14 +1,9 @@
-import { AppPage } from './app.po';
+import LoginPage from './app.po';
 
-describe('workspace-project App', () => {
-  let page: AppPage;
-
-  beforeEach(() => {
-    page = new AppPage();
-  });
-
-  it('should display welcome message', () => {
-    page.navigateTo();
-    expect(page.getParagraphText()).toEqual('Welcome to itc-ng!');
+describe('Testcenter Frontend', () => {
+  it('should display title texts', async () => {
+    await LoginPage.navigateTo();
+    await expect(LoginPage.getFirstCardTitle()).toEqual('Anmelden');
+    await expect(LoginPage.getSecondCardTitle()).toEqual('IQB-Testcenter');
   });
 });
diff --git a/e2e/src/app.po.ts b/e2e/src/app.po.ts
index 82ea75ba504ab2726e4bd08d89e69e99b7a711ba..4adb244fdb6b925aab1d97e70ca17d712515df56 100644
--- a/e2e/src/app.po.ts
+++ b/e2e/src/app.po.ts
@@ -1,11 +1,15 @@
 import { browser, by, element } from 'protractor';
 
-export class AppPage {
-  navigateTo() {
-    return browser.get('/');
+export default class LoginPage {
+  static navigateTo(): Promise<void> {
+    return browser.get(browser.baseUrl) as Promise<any>;
   }
 
-  getParagraphText() {
-    return element(by.css('app-root h1')).getText();
+  static async getFirstCardTitle(): Promise<string> {
+    return element(by.css('.root-body mat-card.mat-card:nth-child(1) mat-card-title')).getText();
+  }
+
+  static async getSecondCardTitle(): Promise<string> {
+    return element(by.css('.root-body mat-card.mat-card:nth-child(2) mat-card-title')).getText();
   }
 }
diff --git a/package-lock.json b/package-lock.json
index bf838f19f6b9c2ec4ccd901ffa6b1f485c73531c..15a5bde563374bc44b144ed10b9488a20e3528f5 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -6761,9 +6761,9 @@
       }
     },
     "lodash": {
-      "version": "4.17.15",
-      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
-      "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
+      "version": "4.17.19",
+      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
+      "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ=="
     },
     "lodash.clonedeep": {
       "version": "4.5.0",
@@ -7765,9 +7765,9 @@
       }
     },
     "npm-registry-fetch": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.3.tgz",
-      "integrity": "sha512-WGvUx0lkKFhu9MbiGFuT9nG2NpfQ+4dCJwRwwtK2HK5izJEvwDxMeUyqbuMS7N/OkpVCqDorV6rO5E4V9F8lJw==",
+      "version": "4.0.5",
+      "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.5.tgz",
+      "integrity": "sha512-yQ0/U4fYpCCqmueB2g8sc+89ckQ3eXpmU4+Yi2j5o/r0WkKvE2+Y0tK3DEILAtn2UaQTkjTHxIXe2/CSdit+/Q==",
       "dev": true,
       "requires": {
         "JSONStream": "^1.3.4",
@@ -7780,9 +7780,9 @@
       },
       "dependencies": {
         "safe-buffer": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
-          "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==",
+          "version": "5.2.1",
+          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+          "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
           "dev": true
         }
       }
@@ -13883,9 +13883,9 @@
       }
     },
     "websocket-extensions": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz",
-      "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==",
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
+      "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
       "dev": true
     },
     "when": {
diff --git a/src/app/sys-check/backend.service.ts b/src/app/sys-check/backend.service.ts
index ced27bc09e2f8668e06697738948d9acbc5121db..12d00969d7db247fee5620ae422a6cfadc08b30b 100644
--- a/src/app/sys-check/backend.service.ts
+++ b/src/app/sys-check/backend.service.ts
@@ -23,7 +23,6 @@ export class BackendService {
 
 
   public getCheckConfigData(workspaceId: number, sysCheckName: string): Observable<CheckConfig> {
-
     return this.http
       .get<CheckConfig>(this.serverUrl + `workspace/${workspaceId}/sys-check/${sysCheckName}`)
       .pipe(
@@ -36,14 +35,12 @@ export class BackendService {
 
 
   public saveReport(workspaceId: number, sysCheckName: string, sysCheckReport: SysCheckReport): Observable<Boolean|ServerError> {
-
     return this.http
-      .put<boolean>(this.serverUrl + `workspace/${workspaceId}/sys-check/${sysCheckName}/report`, {...sysCheckReport})
+      .put<boolean>(this.serverUrl + `workspace/${workspaceId}/sys-check/${sysCheckName}/report`, {...sysCheckReport});
   }
 
 
   public getUnitAndPlayer(workspaceId: number, sysCheckName: string): Observable<UnitAndPlayerContainer|ServerError> {
-
     const startingTime = BackendService.getMostPreciseTimestampBrowserCanProvide();
     return this.http
       .get<UnitAndPlayerContainer>(this.serverUrl + `workspace/${workspaceId}/sys-check/${sysCheckName}/unit-and-player`)
@@ -57,7 +54,6 @@ export class BackendService {
 
 
   public benchmarkDownloadRequest(requestedDownloadSize: number): Promise<NetworkRequestTestResult> {
-
     const serverUrl = this.serverUrl;
     const cacheKiller = '&uid=' + (new Date().getTime());
     const testResult: NetworkRequestTestResult = {
@@ -69,7 +65,6 @@ export class BackendService {
     };
 
     return new Promise(function(resolve) {
-
       const xhr = new XMLHttpRequest();
       xhr.open('GET', serverUrl + `speed-test/random-package/${requestedDownloadSize}${cacheKiller}`, true);
 
@@ -109,7 +104,6 @@ export class BackendService {
 
 
   public benchmarkUploadRequest(requestedUploadSize: number): Promise<NetworkRequestTestResult> {
-
     const serverUrl = this.serverUrl;
     const randomContent = BackendService.generateRandomContent(requestedUploadSize);
     const testResult: NetworkRequestTestResult = {
@@ -176,7 +170,6 @@ export class BackendService {
 
   // tslint:disable-next-line:member-ordering
   private static getMostPreciseTimestampBrowserCanProvide(): number {
-
     if (typeof performance !== 'undefined') {
       const timeOrigin = (typeof performance.timeOrigin !== 'undefined') ? performance.timeOrigin : performance.timing.navigationStart;
       if (typeof timeOrigin !== 'undefined' && timeOrigin) {
@@ -189,7 +182,6 @@ export class BackendService {
 
   // tslint:disable-next-line:member-ordering
   private static generateRandomContent(length: number): string {
-
     const base64Characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcefghijklmnopqrstuvwxyz0123456789+/';
     let randomString = '';
     for (let i = 1; i <= length; i++) {