diff --git a/.gitignore b/.gitignore
index eabf65e51a3807e0c8933dde0bf44e8b5c75fb37..58cad79dcf31fddb9a7db9351d527bbce1fffe66 100644
--- a/.gitignore
+++ b/.gitignore
@@ -42,3 +42,7 @@ testem.log
 # System Files
 .DS_Store
 Thumbs.db
+
+# sonar and gradle stuff
+build
+.gradle
diff --git a/analysis/Dockerfile b/analysis/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..5a3bb32c4e8b5c2b92be5c6eb9e219e4e0075028
--- /dev/null
+++ b/analysis/Dockerfile
@@ -0,0 +1,10 @@
+FROM gradle:5.3.1-jdk8
+
+USER 0
+
+RUN curl -sL https://deb.nodesource.com/setup_12.x | bash -
+RUN apt-get update && apt-get install -y nodejs npm
+
+WORKDIR /frag
+
+ENTRYPOINT ["/frag/analysis/entrypoint.sh"]
diff --git a/analysis/docker-compose.yml b/analysis/docker-compose.yml
new file mode 100644
index 0000000000000000000000000000000000000000..0365a314e5fe76f85f303dafa6b2c2f0b49bfa2b
--- /dev/null
+++ b/analysis/docker-compose.yml
@@ -0,0 +1,32 @@
+version: '3.7'
+
+services:
+
+  analysis:
+    image: local-frag-scanner
+    build:
+      context: ..
+      dockerfile: analysis/Dockerfile
+    depends_on:
+      - sonarqube
+    networks:
+      - sonar
+    volumes:
+      - ..:/frag
+
+  sonarqube:
+    image: sonarqube:7.9.1-community
+    environment:
+      - SONAR_ES_BOOTSTRAP_CHECKS_DISABLE=true
+    ports:
+      - '9000:9000'
+    networks:
+      - sonar
+    volumes:
+      - sonar_data:/opt/sonarqube/data
+
+networks:
+  sonar:
+
+volumes:
+  sonar_data:
diff --git a/analysis/entrypoint.sh b/analysis/entrypoint.sh
new file mode 100755
index 0000000000000000000000000000000000000000..cb4d9b1aa7125897c585ba96ce8cdd58f2dc53c5
--- /dev/null
+++ b/analysis/entrypoint.sh
@@ -0,0 +1,57 @@
+#!/bin/bash
+
+if [[ $(curl -s -o /dev/null -w "%{http_code}" -u admin:admin -X POST http://sonarqube:9000/api/qualitygates/list) != 200 ]]; then
+  echo "Sonarqube has not finished startup yet."
+  echo "check http://localhost:9000 for progress."
+  echo "Please try again later..."
+  exit 0
+fi
+
+if [[ $(curl -s -o /dev/null -w "%{http_code}" -u admin:admin -X POST -F 'id=2' http://sonarqube:9000/api/qualitygates/show) == 404 ]]; then
+
+  # quality gate does not yet exist
+  echo "Quality Gate not yet existing. Going to create..."
+
+  # create the gate
+  curl -s -o /dev/null -w "  - Creating gate: %{http_code}\n" \
+    -u admin:admin -X POST \
+    -F 'name=cards' \
+    http://sonarqube:9000/api/qualitygates/create
+
+  # create the conditions
+  curl -s -o /dev/null -w "  - Add coverage condition: %{http_code}\n" \
+    -u admin:admin -X POST \
+    -F 'error=80' -F 'gateId=2' -F 'metric=coverage' -F 'op=LT' \
+    http://sonarqube:9000/api/qualitygates/create_condition
+
+  curl -s -o /dev/null -w "  - Add duplicated lines condition: %{http_code}\n" \
+    -u admin:admin -X POST \
+    -F 'error=3' -F 'gateId=2' -F 'metric=duplicated_lines_density' -F 'op=GT' \
+    http://sonarqube:9000/api/qualitygates/create_condition
+
+  curl -s -o /dev/null -w "  - Add sqale rating condition: %{http_code}\n" \
+    -u admin:admin -X POST \
+    -F 'error=1' -F 'gateId=2' -F 'metric=sqale_rating' -F 'op=GT' \
+    http://sonarqube:9000/api/qualitygates/create_condition
+
+  curl -s -o /dev/null -w "  - Add reliability rating condition: %{http_code}\n" \
+    -u admin:admin -X POST \
+    -F 'error=1' -F 'gateId=2' -F 'metric=reliability_rating' -F 'op=GT' \
+    http://sonarqube:9000/api/qualitygates/create_condition
+
+  curl -s -o /dev/null -w "  - Add security rating condition: %{http_code}\n" \
+    -u admin:admin -X POST \
+    -F 'error=1' -F 'gateId=2' -F 'metric=security_rating' -F 'op=GT' \
+    http://sonarqube:9000/api/qualitygates/create_condition
+
+  # set newly created gate as default
+  curl -s -o /dev/null -w "  - Setting newly created gate as default: %{http_code}\n" \
+    -u admin:admin -X POST \
+    -F 'id=2' \
+    http://sonarqube:9000/api/qualitygates/set_as_default
+
+  echo "done."
+
+fi
+
+gradle sonarqube -Dsonar.host.url=http://sonarqube:9000
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..cdeef95b2578b005999d7d138558829dc17d1ae3
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,28 @@
+/* This Gradle build script is currently only used for SonarQube Scanner */
+
+plugins {
+	id "org.sonarqube" version "2.5"
+}
+
+group = "de.thm.arsnova"
+
+sonarqube {
+	properties {
+
+    property "sonar.projectKey", "de.thm.arsnova:frag-jetzt-frontend"
+		property "sonar.projectName", "frag.jetzt Frontend"
+    property "sonar.projectVersion", "1.0"
+
+    property "sonar.language", "ts"
+    property "sonar.sourceEncoding", "UTF-8"
+
+		property "sonar.sources", "src"
+    property "sonar.exclusions", "**/node_modules/**, client/thirdParty/**"
+
+    property "sonar.tests", "src"
+    property "sonar.test.inclusions", "**/*.spec.ts"
+    /*		property "sonar.typescript.lcov.reportPaths", "coverage/lcov.info" */
+
+		property "sonar.host.url", "https://scm.thm.de/sonar/"
+	}
+}
diff --git a/gradle.properties b/gradle.properties
new file mode 100644
index 0000000000000000000000000000000000000000..899c9f99f396152540a60d04f0b607bf1b746d9f
--- /dev/null
+++ b/gradle.properties
@@ -0,0 +1 @@
+org.gradle.jvmargs=-Xmx2048m