From 7d4f9a6b2f404a14af90b930e207df581080ba79 Mon Sep 17 00:00:00 2001
From: Lars Beckers <lars.beckers@rwth-aachen.de>
Date: Fri, 22 Sep 2017 23:56:24 +0200
Subject: [PATCH] refactor all webservice roles

---
 debian-repository/tasks/main.yml              |  37 ++--
 meckerkasten/defaults/main.yml                |   6 +-
 meckerkasten/handlers/main.yml                |   9 +-
 meckerkasten/meta/main.yml                    |   5 +-
 meckerkasten/tasks/main.yml                   |  92 +++++-----
 meckerkasten/templates/config                 |   4 -
 ...kasten.service => meckerkasten.service.j2} |   6 +-
 .../templates/{settings.py => settings.py.j2} |  39 ++--
 mediawiki/defaults/main.yml                   |   2 +-
 mediawiki/handlers/main.yml                   |   7 +-
 mediawiki/meta/main.yml                       |   3 +-
 mediawiki/tasks/ldap.yml                      |   6 +-
 mediawiki/tasks/main.yml                      |  76 ++++----
 mediawiki/tasks/mysql.yml                     |  21 +++
 mediawiki/tasks/postgres.yml                  |  29 ++-
 mediawiki/templates/crontab.j2                |   1 +
 mediawiki/templates/mediawiki.ini.j2          |  23 ---
 mediawiki/templates/mediawiki.service.j2      |  13 --
 mediawiki/templates/tmpfiles.j2               |   1 +
 php-fpm/defaults/main.yml                     |   2 +-
 php-fpm/handlers/main.yml                     |   2 +-
 php-fpm/tasks/main.yml                        |  24 +--
 php-fpm/templates/pool.conf                   |  14 --
 php-fpm/templates/pool.conf.j2                |  14 ++
 protokollsystem/defaults/main.yml             |  62 ++++++-
 protokollsystem/handlers/main.yml             |  10 +-
 protokollsystem/meta/main.yml                 |   5 +-
 protokollsystem/tasks/main.yml                | 124 +++++++------
 protokollsystem/templates/celery.service      |  14 --
 protokollsystem/templates/celery.service.j2   |  14 ++
 protokollsystem/templates/config              |   4 -
 protokollsystem/templates/config.py           | 135 --------------
 protokollsystem/templates/config.py.j2        | 158 +++++++++++++++++
 .../templates/protokollsystem.service         |  15 --
 .../templates/protokollsystem.service.j2      |  17 ++
 schildergenerator/defaults/main.yml           |   4 +-
 schildergenerator/handlers/main.yml           |   6 +-
 schildergenerator/meta/main.yml               |   3 +-
 schildergenerator/tasks/main.yml              | 127 ++++++-------
 schildergenerator/templates/config            |   4 -
 .../templates/{config.py => config.py.j2}     |  12 +-
 .../{schilder.service => schilder.service.j2} |   4 +-
 sso/defaults/main.yml                         |   6 +-
 sso/handlers/main.yml                         |   6 +-
 sso/meta/main.yml                             |   4 +-
 sso/tasks/main.yml                            |  92 ++++++----
 sso/templates/{config.py => config.py.j2}     |  18 +-
 sso/templates/secret_config.py                |   1 -
 sso/templates/secret_config.py.j2             |   1 +
 sso/templates/{sso.service => sso.service.j2} |   2 +-
 uwsgi-php/meta/main.yml                       |   2 +-
 uwsgi-php/tasks/main.yml                      |   8 +-
 uwsgi-python/defaults/main.yml                |   2 +-
 uwsgi-python/handlers/main.yml                |   2 +-
 uwsgi-python/meta/main.yml                    |   2 +-
 uwsgi-python/tasks/main.yml                   | 167 ++++--------------
 uwsgi-python/tasks/mysql.yml                  |  38 ++++
 uwsgi-python/tasks/postgres.yml               |  36 ++++
 uwsgi-python/tasks/sqlite.yml                 |  11 ++
 uwsgi-python/templates/tmpfiles.conf.j2       |   1 +
 .../templates/{uwsgi.ini => uwsgi.ini.j2}     |   0
 uwsgi/files/tmpfiles.conf                     |   2 +
 uwsgi/handlers/main.yml                       |   2 +-
 uwsgi/tasks/main.yml                          |  24 +--
 wahlhelfer/defaults/main.yml                  |   6 +-
 wahlhelfer/handlers/main.yml                  |   8 +-
 wahlhelfer/meta/main.yml                      |   4 +-
 wahlhelfer/tasks/main.yml                     |  98 +++++-----
 wahlhelfer/templates/config                   |   4 -
 .../templates/{settings.py => settings.py.j2} |  29 ++-
 wahlhelfer/templates/wahlhelfer.service       |  15 --
 wahlhelfer/templates/wahlhelfer.service.j2    |  17 ++
 wahlsystem/defaults/main.yml                  |  24 ++-
 wahlsystem/handlers/main.yml                  |  10 +-
 wahlsystem/meta/main.yml                      |   5 +-
 wahlsystem/tasks/main.yml                     | 122 ++++++-------
 wahlsystem/templates/celery.service           |  14 --
 wahlsystem/templates/celery.service.j2        |  14 ++
 wahlsystem/templates/config                   |   4 -
 wahlsystem/templates/config.py                |  26 ---
 wahlsystem/templates/config.py.j2             |  33 ++++
 ...hlsystem.service => wahlsystem.service.j2} |   6 +-
 webserver/files/tmpfiles.conf                 |   1 +
 webserver/handlers/main.yml                   |  10 +-
 webserver/tasks/main.yml                      | 130 +++++++++-----
 .../{nginx-proxy.conf => nginx-proxy.conf.j2} |   0
 wordpress/defaults/main.yml                   |   2 +-
 wordpress/handlers/main.yml                   |   6 +-
 wordpress/meta/main.yml                       |   3 +-
 wordpress/tasks/main.yml                      |  77 ++++----
 wordpress/tasks/mysql.yml                     |  36 ++--
 wordpress/templates/tmpfiles.conf.j2          |   1 +
 92 files changed, 1226 insertions(+), 1060 deletions(-)
 delete mode 100644 meckerkasten/templates/config
 rename meckerkasten/templates/{meckerkasten.service => meckerkasten.service.j2} (64%)
 rename meckerkasten/templates/{settings.py => settings.py.j2} (82%)
 create mode 100644 mediawiki/tasks/mysql.yml
 create mode 100644 mediawiki/templates/crontab.j2
 delete mode 100644 mediawiki/templates/mediawiki.ini.j2
 delete mode 100644 mediawiki/templates/mediawiki.service.j2
 create mode 100644 mediawiki/templates/tmpfiles.j2
 delete mode 100644 php-fpm/templates/pool.conf
 create mode 100644 php-fpm/templates/pool.conf.j2
 delete mode 100644 protokollsystem/templates/celery.service
 create mode 100644 protokollsystem/templates/celery.service.j2
 delete mode 100644 protokollsystem/templates/config
 delete mode 100644 protokollsystem/templates/config.py
 create mode 100644 protokollsystem/templates/config.py.j2
 delete mode 100644 protokollsystem/templates/protokollsystem.service
 create mode 100644 protokollsystem/templates/protokollsystem.service.j2
 delete mode 100644 schildergenerator/templates/config
 rename schildergenerator/templates/{config.py => config.py.j2} (87%)
 rename schildergenerator/templates/{schilder.service => schilder.service.j2} (55%)
 rename sso/templates/{config.py => config.py.j2} (54%)
 delete mode 100644 sso/templates/secret_config.py
 create mode 100644 sso/templates/secret_config.py.j2
 rename sso/templates/{sso.service => sso.service.j2} (67%)
 create mode 100644 uwsgi-python/tasks/mysql.yml
 create mode 100644 uwsgi-python/tasks/postgres.yml
 create mode 100644 uwsgi-python/tasks/sqlite.yml
 create mode 100644 uwsgi-python/templates/tmpfiles.conf.j2
 rename uwsgi-python/templates/{uwsgi.ini => uwsgi.ini.j2} (100%)
 create mode 100644 uwsgi/files/tmpfiles.conf
 delete mode 100644 wahlhelfer/templates/config
 rename wahlhelfer/templates/{settings.py => settings.py.j2} (84%)
 delete mode 100644 wahlhelfer/templates/wahlhelfer.service
 create mode 100644 wahlhelfer/templates/wahlhelfer.service.j2
 delete mode 100644 wahlsystem/templates/celery.service
 create mode 100644 wahlsystem/templates/celery.service.j2
 delete mode 100644 wahlsystem/templates/config
 delete mode 100644 wahlsystem/templates/config.py
 create mode 100644 wahlsystem/templates/config.py.j2
 rename wahlsystem/templates/{wahlsystem.service => wahlsystem.service.j2} (54%)
 create mode 100644 webserver/files/tmpfiles.conf
 rename webserver/templates/{nginx-proxy.conf => nginx-proxy.conf.j2} (100%)
 create mode 100644 wordpress/templates/tmpfiles.conf.j2

diff --git a/debian-repository/tasks/main.yml b/debian-repository/tasks/main.yml
index 35bd3ff..bd45f5a 100644
--- a/debian-repository/tasks/main.yml
+++ b/debian-repository/tasks/main.yml
@@ -1,25 +1,36 @@
 ---
-# file: roles/repository/tasks/main.yml
+# file: debian-repository/tasks/main.yml
 
-- name: ensure we have a group
-  group: name=repo system=yes state=present
+- name: ensure we have a repo group
+  group:
+    name: repo
+    system: yes
+    state: present
   tags:
-    - group
-    - config
-    - repository
+    - debian-repository
+    - webservices
 
-- name: ensure we have a user
-  user: name=repo group=repo system=yes home=/srv/repo shell=/usr/bin/nologin createhome=no state=present
+- name: ensure we have a repo user
+  user:
+    name: repo
+    group: repo
+    system: yes
+    home: /srv/repo
+    shell: /usr/bin/nologin
+    createhome: no
+    state: present
   tags:
-    - user
-    - config
-    - repository
+    - debian-repository
+    - webservices
 
 - name: ensure we have the packaging software installed
-  apt: name={{item}} state=present
+  apt:
+    name: "{{ item }}"
+    state: present
   with_items:
     - mini-dinstall
   tags:
     - packages
-    - repository
+    - debian-repository
+    - webservices
 
diff --git a/meckerkasten/defaults/main.yml b/meckerkasten/defaults/main.yml
index f9ce0e6..e83bc41 100644
--- a/meckerkasten/defaults/main.yml
+++ b/meckerkasten/defaults/main.yml
@@ -1,7 +1,7 @@
 ---
-# file: roles/meckerkasten/defaults/main.yml
+# file: meckerkasten/defaults/main.yml
 
-meckerkasten_web_root: /var/www/meckerkasten
+meckerkasten_web_root: /var/www/meckerkasten/program
 meckerkasten_name: meckerkasten
 meckerkasten_user: meckerkasten
 meckerkasten_group: meckerkasten
@@ -9,3 +9,5 @@ meckerkasten_admins: [["FSMPI Admins", "admin@fsmpi.rwth-aachen.de"]]
 meckerkasten_sender: meckerkasten@fsmpi.rwth-aachen.de
 meckerkasten_mail_host: mail.fsmpi.rwth-aachen.de
 meckerkasten_allowed_hosts: ["www.fsmpi.rwth-aachen.de"]
+
+meckerkasten_ldap_cert: /etc/ssl/certs/rwth_chain.pem
diff --git a/meckerkasten/handlers/main.yml b/meckerkasten/handlers/main.yml
index 05c4549..056b2bd 100644
--- a/meckerkasten/handlers/main.yml
+++ b/meckerkasten/handlers/main.yml
@@ -1,13 +1,14 @@
 ---
-# file: roles/meckerkasten/handlers/main.yml
+# file: meckerkasten/handlers/main.yml
 
 - name: reload systemd service files
   command: systemctl daemon-reload
 
 - name: restart uwsgi for meckerkasten
-  service: name="{{item}}" state=restarted enabled=yes
-  with_items:
-    - "{{meckerkasten_name}}"
+  service:
+    name: "{{ meckerkasten_name }}"
+    state: restarted
+    enabled: yes
 
 - name: create tmpfiles
   command: systemd-tmpfiles --create
diff --git a/meckerkasten/meta/main.yml b/meckerkasten/meta/main.yml
index 82a6f85..417a6ee 100644
--- a/meckerkasten/meta/main.yml
+++ b/meckerkasten/meta/main.yml
@@ -1,5 +1,4 @@
 ---
-# file:roles/meckerkasten/meta/main.yml
+# file: meckerkasten/meta/main.yml
 dependencies:
-  - { role: webserver }
-  - { role: uwsgi-python, uwsgi_name: "{{meckerkasten_name}}", uwsgi_user: "{{meckerkasten_user}}", uwsgi_group: "{{meckerkasten_group}}", uwsgi_path: "{{meckerkasten_web_root}}/program", uwsgi_home: "{{meckerkasten_web_root}}", uwsgi_program: "meckerkasten/wsgi.py", uwsgi_callable: "application", uwsgi_command: "runserver", uwsgi_db: "sqlite", uwsgi_python: 2 }
+  - { role: uwsgi-python, uwsgi_name: "{{meckerkasten_name}}", uwsgi_user: "{{meckerkasten_user}}", uwsgi_group: "{{meckerkasten_group}}", uwsgi_path: "{{meckerkasten_web_root}}", uwsgi_home: "{{meckerkasten_web_root}}", uwsgi_program: "meckerkasten/wsgi.py", uwsgi_callable: "application", uwsgi_command: "runserver", uwsgi_db: "sqlite", uwsgi_python: 2 }
diff --git a/meckerkasten/tasks/main.yml b/meckerkasten/tasks/main.yml
index 902ea87..0e4e42e 100644
--- a/meckerkasten/tasks/main.yml
+++ b/meckerkasten/tasks/main.yml
@@ -1,75 +1,70 @@
 ---
-# file: roles/meckerkasten/tasks/main.yml
+# file: meckerkasten/tasks/main.yml
 
-- name: ensure we have a folder for the program
-  file: path="{{meckerkasten_web_root}}" state=directory owner="{{meckerkasten_user}}" group="{{meckerkasten_group}}" mode=0755
-  tags:
-    - directory
-    - meckerkasten
-
-- name: ensure we have a .ssh directory
-  file: path="{{meckerkasten_web_root}}/.ssh" state=directory owner="{{meckerkasten_user}}" group="{{meckerkasten_group}}" mode=0755
-  tags:
-    - directory
-    - meckerkasten
-
-- name: ensure we have our deploy key
-  copy: src="{{item}}" dest="{{meckerkasten_web_root}}/.ssh/" owner="{{meckerkasten_user}}" group="{{meckerkasten_group}}" mode=0600
-  with_items:
-    - deploy-key
-    - deploy-key.pub
+- name: ensure the deploy key is available
+  copy:
+    src: "{{ meckerkasten_deploy_key }}"
+    dest: /root/.ssh/meckerkasten
+    owner: root
+    group: root
+    mode: 0600
   tags:
-    - ssh
     - meckerkasten
+    - webservices
 
-- name: ensure we have our .ssh config
-  template: src=config dest="{{meckerkasten_web_root}}/.ssh/config" owner="{{meckerkasten_user}}" group="{{meckerkasten_group}}" mode=0644
+# https://github.com/ansible/ansible/issues/27699
+- name: ensure fucking git module is able to clone
+  command: mount -o remount,exec /tmp
   tags:
-    - ssh
     - meckerkasten
+    - webservices
 
 - name: ensure we have the program
-  git: repo=git@git.fsmpi.rwth-aachen.de:studi-systeme/meckerkasten.git dest="{{meckerkasten_web_root}}/program"
-  become: yes
-  become_user: "{{meckerkasten_user}}"
+  git:
+    repo: git@git.fsmpi.rwth-aachen.de:studi-systeme/meckerkasten.git
+    dest: "{{ meckerkasten_web_root }}"
+    key_file: /root/.ssh/meckerkasten
+    version: HEAD
   notify:
     - restart uwsgi for meckerkasten
   tags:
-    - git
     - meckerkasten
+    - webservices
+
+- name: ensure fucking git module is not able to clone anymore
+  command: mount -o remount,noexec /tmp
+  tags:
+    - meckerkasten
+    - webservices
 
 - name: ensure we have a virtualenv
   pip:
-    requirements: "{{meckerkasten_web_root}}/program/requirements.txt"
-    virtualenv: "{{meckerkasten_web_root}}/program"
+    requirements: "{{ meckerkasten_web_root }}/requirements.txt"
+    virtualenv: "{{ meckerkasten_web_root }}"
     virtualenv_python: python2
-  become: yes
-  become_user: "{{meckerkasten_user}}"
   notify:
     - restart uwsgi for meckerkasten
   tags:
-    - pip
-    - python
     - meckerkasten
+    - webservices
 
 - name: ensure we have our config
   template:
-    src: settings.py
-    dest: "{{meckerkasten_web_root}}/program/meckerkasten/settings.py"
-    owner: "{{meckerkasten_user}}"
-    group: "{{meckerkasten_group}}"
-    mode: 0644
+    src: settings.py.j2
+    dest: "{{ meckerkasten_web_root }}/meckerkasten/settings.py"
+    owner: "{{ meckerkasten_user }}"
+    group: "{{ meckerkasten_group }}"
+    mode: 0640
   notify:
     - restart uwsgi for meckerkasten
   tags:
-    - config
-    - python
     - meckerkasten
+    - webservices
 
 - name: ensure the unit file exists
   template:
-    src: meckerkasten.service
-    dest: "/etc/systemd/system/{{meckerkasten_name}}.service"
+    src: meckerkasten.service.j2
+    dest: "/etc/systemd/system/{{ meckerkasten_name }}.service"
     owner: root
     group: root
     mode: 0644
@@ -77,17 +72,16 @@
     - reload systemd service files
     - restart uwsgi for meckerkasten
   tags:
-    - config
-    - systemd
     - meckerkasten
+    - webservices
 
 - meta: flush_handlers
 
-- name: ensure the services are enabled
-  service: name="{{item}}" enabled=yes
-  with_items:
-    - "{{meckerkasten_name}}"
+- name: ensure the service is enabled
+  service:
+    name: "{{ meckerkasten_name }}"
+    enabled: yes
+    state: started
   tags:
-    - config
-    - systemd
     - meckerkasten
+    - webservices
diff --git a/meckerkasten/templates/config b/meckerkasten/templates/config
deleted file mode 100644
index 950461d..0000000
--- a/meckerkasten/templates/config
+++ /dev/null
@@ -1,4 +0,0 @@
-Host git.fsmpi.rwth-aachen.de
-HostName git.fsmpi.rwth-aachen.de
-User git
-IdentityFile {{meckerkasten_web_root}}/.ssh/deploy-key
diff --git a/meckerkasten/templates/meckerkasten.service b/meckerkasten/templates/meckerkasten.service.j2
similarity index 64%
rename from meckerkasten/templates/meckerkasten.service
rename to meckerkasten/templates/meckerkasten.service.j2
index 5d031f9..ea9b89c 100644
--- a/meckerkasten/templates/meckerkasten.service
+++ b/meckerkasten/templates/meckerkasten.service.j2
@@ -3,8 +3,10 @@ Description=Meckerkasten
 After=network.target
 
 [Service]
-Environment=LDAPTLS_CACERT=/etc/ssl/certs/rwth_chain.pem
-Environment=MECKERKASTEN_WEB_ROOT={{meckerkasten_web_root}}/program/
+{% if meckerkasten_ldap_cert %}
+Environment=LDAPTLS_CACERT={{ meckerkasten_ldap_cert }}
+{% endif %}
+Environment=MECKERKASTEN_WEB_ROOT={{meckerkasten_web_root}}/
 Environment=MECKERKASTEN_WEB_SUBDIR=meckerkasten
 ExecStart=/usr/bin/uwsgi --ini /etc/uwsgi/apps-available/{{meckerkasten_name}}.ini
 Restart=always
diff --git a/meckerkasten/templates/settings.py b/meckerkasten/templates/settings.py.j2
similarity index 82%
rename from meckerkasten/templates/settings.py
rename to meckerkasten/templates/settings.py.j2
index 6b17804..965b63f 100644
--- a/meckerkasten/templates/settings.py
+++ b/meckerkasten/templates/settings.py.j2
@@ -1,28 +1,29 @@
 # Django settings for meckerkasten project.
 
-DEBUG = True
+DEBUG = False
 
 ADMINS = (
     {% for name, address in meckerkasten_admins %}
-    ('{{name}}', '{{address}}'),
+    ('{{ name }}', '{{ address }}'),
     {% endfor %}
 )
-
-SERVER_EMAIL = "{{meckerkasten_sender}}"
-EMAIL_HOST = "{{meckerkasten_mail_host}}"
-EMAIL_HOST_USER = "{{meckerkasten_mail_user|default('')}}"
-EMAIL_HOST_PASSWORD = "{{meckerkasten_mail_password|default('')}}"
-
 MANAGERS = ADMINS
 
+SERVER_EMAIL = "{{ meckerkasten_sender }}"
+EMAIL_HOST = "{{ meckerkasten_mail_host }}"
+EMAIL_HOST_USER = "{{ meckerkasten_mail_user|default('') }}"
+EMAIL_HOST_PASSWORD = "{{ meckerkasten_mail_password|default('') }}"
+EMAIL_PORT = {{ meckerkasten_mail_port|default('25') }}
+DEFAUL_FROM_EMAIL = "{{ meckerkasten_sender }}"
+
 DATABASES = {
     'default': {
-        'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
-        'NAME': 'meckerkasten.sqlite3',                      # Or path to database file if using sqlite3.
-        'USER': '',                      # Not used with sqlite3.
-        'PASSWORD': '',                  # Not used with sqlite3.
-        'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.
-        'PORT': '',                      # Set to empty string for default. Not used with sqlite3.
+        'ENGINE': 'django.db.backends.sqlite3',
+        'NAME': 'meckerkasten.sqlite3',
+        'USER': '',
+        'PASSWORD': '',
+        'HOST': '',
+        'PORT': '',
     }
 }
 
@@ -30,7 +31,7 @@ DATABASES = {
 # See https://docs.djangoproject.com/en/1.4/ref/settings/#allowed-hosts
 ALLOWED_HOSTS = [
 {% for host in meckerkasten_allowed_hosts %}
-    "{{host}}"
+    "{{ host }}"
 {% endfor %}
 ]
 
@@ -92,7 +93,7 @@ STATICFILES_FINDERS = (
 )
 
 # Make this unique, and don't share it with anybody.
-SECRET_KEY = '{{(2**2048)|random}}'
+SECRET_KEY = '{{ (2**2048)|random }}'
 
 TEMPLATES = [
     {
@@ -168,9 +169,3 @@ LOGGING = {
         },
     }
 }
-
-EMAIL_HOST = "{{meckerkasten_mail_host}}"
-EMAIL_HOST_USER = ""
-EMAIL_HOST_PASSWORD = ""
-EMAIL_PORT = 25
-DEFAUL_FROM_EMAIL = "root@fsmpi.rwth-aachen.de"
diff --git a/mediawiki/defaults/main.yml b/mediawiki/defaults/main.yml
index 9c04cac..4c2b7d2 100644
--- a/mediawiki/defaults/main.yml
+++ b/mediawiki/defaults/main.yml
@@ -1,5 +1,5 @@
 ---
-# file: roles/mediawiki/defaults/main.yml
+# file: mediawiki/defaults/main.yml
 
 mediawiki_web_root: /var/www
 
diff --git a/mediawiki/handlers/main.yml b/mediawiki/handlers/main.yml
index 0de5dcd..ae4e928 100644
--- a/mediawiki/handlers/main.yml
+++ b/mediawiki/handlers/main.yml
@@ -1,11 +1,14 @@
 ---
-# file: roles/mediawiki/handlers/main.yml
+# file: mediawiki/handlers/main.yml
 
 - name: reload systemd service files
   command: systemctl daemon-reload
 
 - name: "restart uwsgi for {{ mediawiki_name }}"
-  service: "name=mediawiki-{{ mediawiki_name }} state=restarted enabled=yes"
+  service:
+    name: "mediawiki-{{ mediawiki_name }}"
+    state: restarted
+    enabled: yes
 
 - name: create tmpfiles
   shell: systemd-tmpfiles --create
diff --git a/mediawiki/meta/main.yml b/mediawiki/meta/main.yml
index 8c99dfc..6334914 100644
--- a/mediawiki/meta/main.yml
+++ b/mediawiki/meta/main.yml
@@ -1,5 +1,4 @@
 ---
-# file: roles/mediawiki/meta/main.yml
+# file: mediawiki/meta/main.yml
 dependencies:
   - { role: php-fpm, fpm_pool: "{{mediawiki_name}}", fpm_user: "{{mediawiki_user}}", fpm_group: "{{mediawiki_group}}", fpm_socket_user: "{{mediawiki_user}}", fpm_socket_group: www-data }
-  - { role: postgres }
diff --git a/mediawiki/tasks/ldap.yml b/mediawiki/tasks/ldap.yml
index f1998a4..501c309 100644
--- a/mediawiki/tasks/ldap.yml
+++ b/mediawiki/tasks/ldap.yml
@@ -1,11 +1,11 @@
 ---
-# file: roles/mediawiki/tasks/ldap.yml
+# file: mediawiki/tasks/ldap.yml
 
 - name: ensure we have the auth extension
   git:
     repo: https://git.fsmpi.rwth-aachen.de/robin/mediawiki-remoteuser.git
     dest: "/var/lib/mediawiki/extensions/AuthRemoteuser"
+    version: HEAD
   tags:
-    - git
-    - packages
     - mediawiki
+    - webservices
diff --git a/mediawiki/tasks/main.yml b/mediawiki/tasks/main.yml
index c794a6b..305d348 100644
--- a/mediawiki/tasks/main.yml
+++ b/mediawiki/tasks/main.yml
@@ -1,23 +1,24 @@
 ---
-# file: roles/mediawiki/tasks/main.yml
+# file: mediawiki/tasks/main.yml
 
 - name: ensure packages for mediawiki are installed on jessie
-  apt: name={{ item }} state=latest install_recommends=no
-  with_items:
-    - mediawiki
+  apt:
+    name: mediawiki
+    state: installed
+    install_recommends: no
   when: debian_version == "jessie"
   tags:
-    - packages
     - mediawiki
+    - webservices
 
 - name: ensure packages for mediawiki are installed on stretch
-  apt: name={{ item }} state=present
-  with_items:
-    - mediawiki
+  apt:
+    name: mediawiki
+    state: installed
   when: debian_version == "stretch"
   tags:
-    - packages
     - mediawiki
+    - webservices
 
 - name: "ensure group for {{ mediawiki_name }} exists"
   group:
@@ -25,9 +26,8 @@
     state: present
     system: yes
   tags:
-    - users
-    - config
     - mediawiki
+    - webservices
 
 - name: "ensure user for {{ mediawiki_name }} exists"
   user:
@@ -39,9 +39,8 @@
     home: "{{ mediawiki_web_root }}"
     createhome: no
   tags:
-    - users
-    - config
     - mediawiki
+    - webservices
 
 - name: "ensure the wiki folder for {{ mediawiki_name }} exists"
   file:
@@ -51,8 +50,8 @@
     group: "{{ mediawiki_group }}"
     path: "{{ mediawiki_web_root }}/{{ mediawiki_name }}"
   tags:
-    - config
     - mediawiki
+    - webservices
 
 - name: "ensure the wiki uploads folder for {{ mediawiki_name }} exists"
   file:
@@ -62,15 +61,15 @@
     group: "{{ mediawiki_group }}"
     path: "{{ mediawiki_web_root }}/{{ mediawiki_name }}/images"
   tags:
-    - config
     - mediawiki
+    - webservices
 
 - name: "get other mediawiki files for {{ mediawiki_name }}"
   shell: ls --hide=LocalSettings.php --hide=images /usr/share/mediawiki
   register: mediawiki_other_files
   tags:
-    - config
     - mediawiki
+    - webservices
 
 - name: "ensure other mediawiki files for {{ mediawiki_name }} are linked"
   file:
@@ -78,47 +77,40 @@
     src: "/usr/share/mediawiki/{{ item }}"
     dest: "{{ mediawiki_web_root }}/{{ mediawiki_name }}/{{ item }}"
     force: yes
-  with_items: "{{mediawiki_other_files.stdout_lines}}"
+  with_items: "{{ mediawiki_other_files.stdout_lines }}"
   tags:
-    - config
     - mediawiki
+    - webservices
 
 - name: ensure we have a unique temporary cache directory
-  lineinfile:
-    dest: /etc/tmpfiles.d/10-mediawiki.conf
-    line: "d /tmp/{{mediawiki_name}} 0775 {{mediawiki_user}} {{mediawiki_group}} - -"
-    create: yes
+  template:
+    src: tmpfiles.j2
+    dest: "/etc/tmpfiles.d/10-mediawiki-{{ mediawiki_name }}.conf"
+    owner: root
+    group: root
+    mode: 0644
   notify:
     - create tmpfiles
   tags:
-    - config
     - mediawiki
-
-#- name: "ensure the library mediawiki uses for diffs is enabled"
-#  file:
-#    state: link
-#    src: "../../mods-available/wikidiff2.ini"
-#    dest: "/etc/php5/embed/conf.d/wikidiff2.ini"
-#  tags:
-#    - config
-#    - mediawiki
-#    - php
+    - webservices
 
 - include: postgres.yml
   when: mediawiki_dbtype == "postgres"
 
+- include: mysql.yml
+  when: mediawiki_dbtype == "mysql"
+
 - include: ldap.yml
   when: mediawiki_use_ldap
 
 - name: ensure we are running maintenance regularly
-  cron: 
-    name: "mediawiki maintenance"
-    hour: "0"
-    minute: "0"
-    job: "/usr/bin/php {{mediawiki_web_root}}/{{mediawiki_name}}/maintenance/runJobs.php --conf {{mediawiki_web_root}}/{{mediawiki_name}}/LocalSettings.php"
-  become: yes
-  become_user: "{{mediawiki_user}}"
+  template: 
+    src: crontab.j2
+    dest: "/etc/cron.d/mediawiki-{{ mediawiki_name }}-maint"
+    owner: root
+    group: root
+    mode: 0644
   tags:
-    - cron
-    - config
     - mediawiki
+    - webservices
diff --git a/mediawiki/tasks/mysql.yml b/mediawiki/tasks/mysql.yml
new file mode 100644
index 0000000..1405f24
--- /dev/null
+++ b/mediawiki/tasks/mysql.yml
@@ -0,0 +1,21 @@
+---
+# file: mediawiki/tasks/mysql.yml
+
+- name: ensure php can talk with mysql on jessie
+  apt:
+    name: php5-mysql
+    state: installed
+  when: debian_version == "jessie"
+  tags:
+    - mediawiki
+    - webservices
+
+- name: ensure php can talk with mysql on stretch
+  apt:
+    name: php-mysql
+    state: installed
+  when: debian_version == "stretch"
+  tags:
+    - mediawiki
+    - webservices
+
diff --git a/mediawiki/tasks/postgres.yml b/mediawiki/tasks/postgres.yml
index a3de64e..2eb5909 100644
--- a/mediawiki/tasks/postgres.yml
+++ b/mediawiki/tasks/postgres.yml
@@ -1,21 +1,23 @@
 ---
-# file: roles/mediawiki/tasks/postgres.yml
+# file: mediawiki/tasks/postgres.yml
 
-- name: "ensure php can talk with postgres on jessie"
-  apt: name=php5-pgsql state=latest
+- name: ensure php can talk with postgres on jessie
+  apt:
+    name: php5-pgsql
+    state: installed
   when: debian_version == "jessie"
   tags:
-    - packages
-    - postgresql
     - mediawiki
+    - webservices
 
-- name: "ensure php can talk with postgres on stretch"
-  apt: name=php-pgsql state=present
+- name: ensure php can talk with postgres on stretch
+  apt:
+    name: php-pgsql
+    state: installed
   when: debian_version == "stretch"
   tags:
-    - packages
-    - postgresql
     - mediawiki
+    - webservices
 
 - name: "ensure the database user for {{ mediawiki_name }} exists"
   postgresql_user:
@@ -26,9 +28,8 @@
   become: yes
   become_user: postgres
   tags:
-    - postgresql
-    - config
     - mediawiki
+    - webservices
 
 - name: "ensure the database for {{ mediawiki_name }} exists"
   postgresql_db: 
@@ -38,9 +39,8 @@
   become: yes
   become_user: postgres
   tags:
-    - postgresql
-    - config
     - mediawiki
+    - webservices
   
 - name: "ensure the database user has priviliges for {{ mediawiki_name }}"
   postgresql_privs:
@@ -52,6 +52,5 @@
   become: yes
   become_user: postgres
   tags:
-    - postgresql
-    - config
     - mediawiki
+    - webservices
diff --git a/mediawiki/templates/crontab.j2 b/mediawiki/templates/crontab.j2
new file mode 100644
index 0000000..d3a63cf
--- /dev/null
+++ b/mediawiki/templates/crontab.j2
@@ -0,0 +1 @@
+0 0 * * * {{ mediawiki_user }} /usr/bin/php {{ mediawiki_web_root }}/{{ mediawiki_name }}/maintenance/runJobs.php --conf {{ mediawiki_web_root }}/{{ mediawiki_name }}/LocalSettings.php
diff --git a/mediawiki/templates/mediawiki.ini.j2 b/mediawiki/templates/mediawiki.ini.j2
deleted file mode 100644
index 6684a59..0000000
--- a/mediawiki/templates/mediawiki.ini.j2
+++ /dev/null
@@ -1,23 +0,0 @@
-[uwsgi]
-uwsgi-socket = /run/uwsgi/app/mediawiki-{{ mediawiki_name }}/mediawiki-{{ mediawiki_name }}.sock
-chmod-socket = 660
-chown-socket = {{ mediawiki_user }}:www-data
-autoload = 
-master = 
-processes = 4
-workers = 4
-prio = -5
-harakiri = 5
-chdir = {{ mediawiki_web_root }}/{{ mediawiki_name }}
-uid = {{ mediawiki_user }}
-gid = {{ mediawiki_group }}
-logto = /var/log/uwsgi-mediawiki-{{ mediawiki_name }}.log
-logfile-chown = {{ mediawiki_user }}:{{ mediawiki_group }}
-logfile-chmod = 664
-log-date = 
-log-4xx = 
-log-5xx = 
-log-x-forwarded-for = 
-plugin = php
-php-index = index.php
-env = MW_INSTALL_PATH={{ mediawiki_web_root }}/{{ mediawiki_name }}
diff --git a/mediawiki/templates/mediawiki.service.j2 b/mediawiki/templates/mediawiki.service.j2
deleted file mode 100644
index 1dd7991..0000000
--- a/mediawiki/templates/mediawiki.service.j2
+++ /dev/null
@@ -1,13 +0,0 @@
-[Unit]
-Description=MediaWiki {{ mediawiki_name }} forwarded by uwsgi
-After=network.target
-
-[Service]
-ExecStart=/usr/bin/uwsgi --ini /etc/uwsgi/apps-available/mediawiki-{{ mediawiki_name }}.ini
-Restart=always
-KillSignal=SIGQUIT
-Type=notify
-NotifyAccess=all
-
-[Install]
-WantedBy=multi-user.target
diff --git a/mediawiki/templates/tmpfiles.j2 b/mediawiki/templates/tmpfiles.j2
new file mode 100644
index 0000000..cd6225d
--- /dev/null
+++ b/mediawiki/templates/tmpfiles.j2
@@ -0,0 +1 @@
+d /tmp/{{ mediawiki_name }} 0775 {{ mediawiki_user }} {{ mediawiki_group }} - -
diff --git a/php-fpm/defaults/main.yml b/php-fpm/defaults/main.yml
index ad1acff..4df56c3 100644
--- a/php-fpm/defaults/main.yml
+++ b/php-fpm/defaults/main.yml
@@ -1,5 +1,5 @@
 ---
-# file: roles/php-fpm/defaults/mail.yml
+# file: php-fpm/defaults/mail.yml
 
 fpm_pool: www
 fpm_user: www-data
diff --git a/php-fpm/handlers/main.yml b/php-fpm/handlers/main.yml
index 3fd2471..710c0f6 100644
--- a/php-fpm/handlers/main.yml
+++ b/php-fpm/handlers/main.yml
@@ -1,5 +1,5 @@
 ---
-# file: roles/php-fpm/handlers/main.yml
+# file: php-fpm/handlers/main.yml
 
 - name: restart php-fpm
   service: name=php7.0-fpm.service state=restarted
diff --git a/php-fpm/tasks/main.yml b/php-fpm/tasks/main.yml
index 50f5bf4..fdea863 100644
--- a/php-fpm/tasks/main.yml
+++ b/php-fpm/tasks/main.yml
@@ -1,8 +1,10 @@
 ---
-# file: roles/php-fpm/tasks/main.yml
+# file: php-fpm/tasks/main.yml
 
 - name: ensure php-fpm is installed on stretch
-  apt: name="{{item}}" state=present
+  apt:
+    name: "{{ item }}"
+    state: present
   with_items:
     - php
     - php-fpm
@@ -10,25 +12,25 @@
   notify:
     - restart php-fpm
   tags:
-    - packages
-    - php
     - php-fpm
+    - webservices
 
 - name: ensure php-fpm is installed on jessie
-  apt: name="{{item}}" state=present
+  apt:
+    name: "{{ item }}"
+    state: present
   with_items:
     - php5
     - php5-fpm
   when: debian_version == "jessie"
   tags:
-    - packages
-    - php
     - php-fpm
+    - webservices
   
 - name: ensure we have the pool we want
   template:
-    src: pool.conf
-    dest: "/etc/php/7.0/fpm/pool.d/{{fpm_pool}}.conf"
+    src: pool.conf.j2
+    dest: "/etc/php/7.0/fpm/pool.d/{{ fpm_pool }}.conf"
     owner: root
     group: root
     mode: 0644
@@ -36,7 +38,5 @@
   notify:
     - restart php-fpm
   tags:
-   - config
-   - php
    - php-fpm
-
+   - webservices
diff --git a/php-fpm/templates/pool.conf b/php-fpm/templates/pool.conf
deleted file mode 100644
index f7f846f..0000000
--- a/php-fpm/templates/pool.conf
+++ /dev/null
@@ -1,14 +0,0 @@
-[{{fpm_pool}}]
-user = {{fpm_user}}
-group = {{fpm_group}}
-
-listen = /run/php/{{fpm_pool}}-fpm.sock
-
-listen.owner = {{fpm_socket_user}}
-listen.group = {{fpm_socket_group}}
-
-pm = dynamic
-pm.max_children = 5
-pm.start_servers = 2
-pm.min_spare_servers = 1
-pm.max_spare_servers = 3
diff --git a/php-fpm/templates/pool.conf.j2 b/php-fpm/templates/pool.conf.j2
new file mode 100644
index 0000000..2695e21
--- /dev/null
+++ b/php-fpm/templates/pool.conf.j2
@@ -0,0 +1,14 @@
+[{{ fpm_pool }}]
+user = {{ fpm_user }}
+group = {{ fpm_group }}
+
+listen = /run/php/{{ fpm_pool }}-fpm.sock
+
+listen.owner = {{ fpm_socket_user }}
+listen.group = {{ fpm_socket_group }}
+
+pm = dynamic
+pm.max_children = 5
+pm.start_servers = 2
+pm.min_spare_servers = 1
+pm.max_spare_servers = 3
diff --git a/protokollsystem/defaults/main.yml b/protokollsystem/defaults/main.yml
index 4f5aec1..2ffb469 100644
--- a/protokollsystem/defaults/main.yml
+++ b/protokollsystem/defaults/main.yml
@@ -1,8 +1,66 @@
 ---
-# file: roles/protokollsystem/defaults/main.yml
+# file: protokollsystem/defaults/main.yml
 
-protokolle_web_root: /var/www/protokollsystem
+protokolle_web_root: /var/www/protokollsystem/program
 protokolle_name: protokollsystem
 protokolle_user: protokolle
 protokolle_group: protokolle
 protokolle_celery_concurrency: 4
+protokolle_ldap_cert: /etc/ssl/certs/rwth_chain.pem
+
+protokolle_mail: True
+protokolle_mail_from: 'Gustav Geier <protokolle@fsmpi.rwth-aachen.de>'
+protokolle_mail_host: 'mail.fsmpi.rwth-aachen.de:25'
+protokolle_mail_user: ''
+protokolle_mail_password: ''
+protokolle_mail_tls: False # 'tls' or 'starttls'
+
+protokolle_celery_broker: 'redis://localhost:6379/0'
+
+protokolle_url_root: 'protokolle.fsmpi.rwth-aachen.de'
+protokolle_url_proto: 'https'
+protokolle_url_path: '/'
+
+protokolle_printing: True
+protokolle_printing_server: 'printsrv.fsmpi.rwth-aachen.de:631'
+protokolle_printing_user: 'protokolle'
+protokolle_printing_printers:
+  - printer: kopierer
+    options: ["ColorModel=Gray", "KCStaple=Center", "KCPunch=2HoleEUR", "Duplex=DuplexNoTumble"]
+  - printer: hoern_kopierer
+    options: ["Duplex=DuplexNoTumble"]
+
+protokolle_etherpad: True
+protokolle_etherpad_url: 'https://fachschaften.rwth-aachen.de/etherpad'
+
+protokolle_wiki: True
+protokolle_wiki_api: 'https://www.fsmpi.rwth-aachen.de/wiki/api.php'
+protokolle_wiki_anonymous: False
+protokolle_wiki_user: 'protocolpusher'
+protokolle_wiki_password: '0h3CjGju'
+protokolle_wiki_domain: 'fsmpi'
+
+protokolle_calendar: True
+protokolle_calendar_url: ''
+
+protokolle_admin_mail: 'admin@fsmpi.rwth-aachen.de'
+protokolle_admin_group: 'protokolladmin'
+
+protokolle_latex_local_templates: '' # local-templates
+protokolle_latex_logo_template: '' # asta-logo.tex
+protokolle_latex_geometry: '' # bottom=1.6cm,top=1.6cm,inner=2.5cm,outer=1.0cm,footskip=1.0cm,headsep=0.6cm
+protokolle_latex_pagestyle: '' # fancy
+protokolle_latex_packages: [] # ["[absolute]{textpos}", "{fancyheadings}"]
+protokolle_latex_header_footer: None # True
+
+protokolle_auth_max_duration: 86400
+protokolle_auth_backends:
+  - type: ADManager
+    host: auth.fsmpi.rwth-aachen.de
+    domain: FSMPI
+    user_dn: 'cn=users,dc=fsmpi,dc=rwth-aachen,dc=de'
+    group_dn: 'dc=fsmpi,dc=rwth-aachen,dc=de'
+    ca_cert: '/etc/ssl/certs/rwth_chain.pem'
+    obsolete: False
+protokolle_auth_obsoletion_warning: 'Bitte migriere deinen Fachschaftsaccount im <a href=\"https://migration.fsmpi.rwth-aachen.de\">Migrationstool</a>!'
+
diff --git a/protokollsystem/handlers/main.yml b/protokollsystem/handlers/main.yml
index a2a8db7..6a11f0a 100644
--- a/protokollsystem/handlers/main.yml
+++ b/protokollsystem/handlers/main.yml
@@ -1,14 +1,16 @@
 ---
-# file: roles/protokollsystem/handlers/main.yml
+# file: protokollsystem/handlers/main.yml
 
 - name: reload systemd service files
   command: systemctl daemon-reload
 
 - name: restart uwsgi for protokollsystem
-  service: name="{{item}}" state=restarted enabled=yes
+  service:
+    name: "{{ item }}"
+    state: restarted
   with_items:
-    - "{{protokolle_name}}"
-    - "{{protokolle_name}}-celery"
+    - "{{ protokolle_name }}"
+    - "{{ protokolle_name }}-celery"
 
 - name: create tmpfiles
   command: systemd-tmpfiles --create
diff --git a/protokollsystem/meta/main.yml b/protokollsystem/meta/main.yml
index 561292b..c8705ba 100644
--- a/protokollsystem/meta/main.yml
+++ b/protokollsystem/meta/main.yml
@@ -1,9 +1,6 @@
 ---
-# file:roles/protokollsystem/meta/main.yml
+# file: protokollsystem/meta/main.yml
 dependencies:
-  - { role: webserver }
-  - { role: redis-server }
-  - { role: postgres }
   - { role: texlive }
   - { role: cups-client }
   - { role: uwsgi-python, uwsgi_name: "{{protokolle_name}}", uwsgi_user: "{{protokolle_user}}", uwsgi_group: "{{protokolle_group}}", uwsgi_path: "{{protokolle_web_root}}/program", uwsgi_home: "{{protokolle_web_root}}", uwsgi_program: "server.py", uwsgi_callable: "app", uwsgi_command: "runserver", uwsgi_db: "postgres", uwsgi_python: 3, uwsgi_mules: 1 }
diff --git a/protokollsystem/tasks/main.yml b/protokollsystem/tasks/main.yml
index 3ff8f51..a03f105 100644
--- a/protokollsystem/tasks/main.yml
+++ b/protokollsystem/tasks/main.yml
@@ -1,84 +1,99 @@
 ---
-# file: roles/protokollsystem/tasks/main.yml
+# file: protokollsystem/tasks/main.yml
 
-- name: ensure we have the fonts
-  apt: name="{{item}}" state=present
+- name: ensure we have all required software and fonts
+  apt:
+    name: "{{ item }}"
+    state: present
   with_items:
+    - python3-virtualenv
+    - virtualenv
+    - libxml2-dev
+    - libxslt-dev
     - fontconfig
     - tex-gyre
   tags:
-    - packages
     - protokollsystem
+    - webservices
 
-- name: ensure we have a folder for the program
-  file: path="{{protokolle_web_root}}" state=directory owner="{{protokolle_user}}" group="{{protokolle_group}}" mode=0755
-  tags:
-    - directory
-    - protokollsystem
-
-- name: ensure we have a .ssh directory
-  file: path="{{protokolle_web_root}}/.ssh" state=directory owner="{{protokolle_user}}" group="{{protokolle_group}}" mode=0755
-  tags:
-    - directory
-    - protokollsystem
-
-- name: ensure we have our deploy key
-  copy: src="{{item}}" dest="{{protokolle_web_root}}/.ssh/" owner="{{protokolle_user}}" group="{{protokolle_group}}" mode=0600
-  with_items:
-    - deploy-key
-    - deploy-key.pub
+- name: ensure the deploy key is available
+  copy:
+    src: "{{ protokolle_deploy_key }}"
+    dest: /root/.ssh/protokolle
+    owner: root
+    group: root
+    mode: 0600
   tags:
-    - ssh
     - protokollsystem
+    - webservices
 
-- name: ensure we have our .ssh config
-  template: src=config dest="{{protokolle_web_root}}/.ssh/config" owner="{{protokolle_user}}" group="{{protokolle_group}}" mode=0644
+# https://github.com/ansible/ansible/issues/27699
+- name: ensure fucking git module is able to clone
+  command: mount -o remount,exec /tmp
   tags:
-    - ssh
     - protokollsystem
+    - webservices
 
 - name: ensure we have the program
-  git: repo=git@git.fsmpi.rwth-aachen.de:protokollsystem/proto3.git dest="{{protokolle_web_root}}/program"
-  become: yes
-  become_user: "{{protokolle_user}}"
+  git:
+    repo: git@git.fsmpi.rwth-aachen.de:protokollsystem/proto3.git
+    dest: "{{ protokolle_web_root }}"
+    accept_hostkey: True # TODO remove this
+    key_file: /root/.ssh/protokolle
   notify:
     - restart uwsgi for protokollsystem
   tags:
-    - git
     - protokollsystem
+    - webservices
+
+- name: ensure fucking git module is not able to clone anymore
+  command: mount -o remount,noexec /tmp
+  tags:
+    - protokollsystem
+    - webservices
 
 - name: ensure we have a virtualenv
   pip:
-    requirements: "{{protokolle_web_root}}/program/requirements.txt"
-    virtualenv: "{{protokolle_web_root}}/program"
+    requirements: "{{ protokolle_web_root }}/requirements.txt"
+    virtualenv: "{{ protokolle_web_root }}"
     virtualenv_python: python3
-  become: yes
-  become_user: "{{protokolle_user}}"
   notify:
     - restart uwsgi for protokollsystem
   tags:
-    - pip
-    - python
     - protokollsystem
+    - webservices
 
 - name: ensure we have our config
   template:
-    src: config.py
-    dest: "{{protokolle_web_root}}/program/config.py"
-    owner: "{{protokolle_user}}"
-    group: "{{protokolle_group}}"
+    src: config.py.j2
+    dest: "{{ protokolle_web_root }}/config.py"
+    owner: "{{ protokolle_user }}"
+    group: "{{ protokolle_group }}"
+    mode: 0640
+  notify:
+    - restart uwsgi for protokollsystem
+  tags:
+    - protokollsystem
+    - webservices
+
+- name: ensure we have our local templates
+  copy:
+    src: "{{ protokolle_local_templates }}"
+    dest: "{{ protokolle_web_root }}/"
+    owner: "{{ protokolle_user }}"
+    group: "{{ protokolle_group }}"
     mode: 0644
+  when: protokolle_local_templates
   notify:
     - restart uwsgi for protokollsystem
   tags:
-    - config
-    - python
     - protokollsystem
+    - webservices
 
 - name: ensure the unit file exists
   template:
-    src: protokollsystem.service
-    dest: "/etc/systemd/system/{{protokolle_name}}.service"
+    src: protokollsystem.service.j2
+    dest: "/etc/systemd/system/{{ protokolle_name }}.service"
     owner: root
     group: root
     mode: 0644
@@ -86,14 +101,13 @@
     - reload systemd service files
     - restart uwsgi for protokollsystem
   tags:
-    - config
-    - systemd
     - protokollsystem
+    - webservices
 
 - name: ensure the celery unit file exists
   template:
-    src: celery.service
-    dest: "/etc/systemd/system/{{protokolle_name}}-celery.service"
+    src: celery.service.j2
+    dest: "/etc/systemd/system/{{ protokolle_name }}-celery.service"
     owner: root
     group: root
     mode: 0644
@@ -101,19 +115,19 @@
     - reload systemd service files
     - restart uwsgi for protokollsystem
   tags:
-    - config
-    - systemd
-    - celery
     - protokollsystem
+    - webservices
 
 - meta: flush_handlers
 
 - name: ensure the services are enabled
-  service: name="{{item}}" enabled=yes
+  service:
+    name: "{{ item }}"
+    enabled: yes
+    state: started
   with_items:
-    - "{{protokolle_name}}"
-    - "{{protokolle_name}}-celery"
+    - "{{ protokolle_name }}"
+    - "{{ protokolle_name }}-celery"
   tags:
-    - config
-    - systemd
     - protokollsystem
+    - webservices
diff --git a/protokollsystem/templates/celery.service b/protokollsystem/templates/celery.service
deleted file mode 100644
index 360a975..0000000
--- a/protokollsystem/templates/celery.service
+++ /dev/null
@@ -1,14 +0,0 @@
-[Unit]
-Description=Protokollsystem-Celery
-After=network.target
-
-[Service]
-User={{protokolle_user}}
-Group={{protokolle_group}}
-WorkingDirectory={{protokolle_web_root}}/program
-Environment=VIRTUAL_ENV="{{protokolle_web_root}}/program"
-ExecStart={{protokolle_web_root}}/program/bin/celery -A server.celery worker --loglevel=DEBUG --concurrency={{protokolle_celery_concurrency}}
-Restart=always
-
-[Install]
-WantedBy=multi-user.target
diff --git a/protokollsystem/templates/celery.service.j2 b/protokollsystem/templates/celery.service.j2
new file mode 100644
index 0000000..512f08b
--- /dev/null
+++ b/protokollsystem/templates/celery.service.j2
@@ -0,0 +1,14 @@
+[Unit]
+Description={{ protokolle_name }}-Celery
+After=network.target
+
+[Service]
+User={{ protokolle_user }}
+Group={{ protokolle_group }}
+WorkingDirectory={{ protokolle_web_root }}
+Environment=VIRTUAL_ENV="{{ protokolle_web_root }}"
+ExecStart={{ protokolle_web_root }}/bin/celery -A server.celery worker --loglevel=DEBUG --concurrency={{ protokolle_celery_concurrency }}
+Restart=always
+
+[Install]
+WantedBy=multi-user.target
diff --git a/protokollsystem/templates/config b/protokollsystem/templates/config
deleted file mode 100644
index 0998e43..0000000
--- a/protokollsystem/templates/config
+++ /dev/null
@@ -1,4 +0,0 @@
-Host git.fsmpi.rwth-aachen.de
-HostName git.fsmpi.rwth-aachen.de
-User git
-IdentityFile {{protokolle_web_root}}/.ssh/deploy-key
diff --git a/protokollsystem/templates/config.py b/protokollsystem/templates/config.py
deleted file mode 100644
index 7f6cf84..0000000
--- a/protokollsystem/templates/config.py
+++ /dev/null
@@ -1,135 +0,0 @@
-SQLALCHEMY_DATABASE_URI = "postgresql://{{protokolle_user}}:@/{{protokolle_name}}"
-SQLALCHEMY_TRACK_MODIFICATIONS = False
-
-SECRET_KEY = "{{protokolle_secret}}"
-
-DEBUG = False
-
-MAIL_ACTIVE = True
-MAIL_FROM = "Gustav Geier <protokolle@fsmpi.rwth-aachen.de>"
-MAIL_HOST = "mail.fsmpi.rwth-aachen.de:25"
-MAIL_USER = ""
-MAIL_PASSWORD = ""
-MAIL_USE_TLS = False
-
-CELERY_BROKER_URL = "redis://localhost:6379/0"
-CELERY_TASK_SERIALIZER = "pickle"
-CELERY_ACCEPT_CONTENT = ["pickle"]
-
-URL_ROOT = "protokolle.fsmpi.rwth-aachen.de"
-URL_PROTO = "https"
-URL_PATH = "/"
-URL_PARAMS = ""
-
-PRINTING_ACTIVE = True
-PRINTING_SERVER = "printsrv.fsmpi.rwth-aachen.de:631"
-PRINTING_USER = "protokolle"
-PRINTING_PRINTERS = {
-    "kopierer": ["ColorModel=Gray", "KCStaple=Center", "KCPunch=2HoleEUR", "Duplex=DuplexNoTumble"],
-    "hoern_kopierer": ["Duplex=DuplexNoTumble"]
-}
-
-ETHERPAD_ACTIVE = True
-ETHERPAD_URL = "https://fachschaften.rwth-aachen.de/etherpad"
-EMPTY_ETHERPAD = """Welcome to Etherpad!
-
-This pad text is synchronized as you type, so that everyone viewing this page sees the same text. This allows you to collaborate seamlessly on documents!
-
-Get involved with Etherpad at http://etherpad.org
-
-"""
-
-WIKI_ACTIVE = True
-WIKI_API_URL = "https://www.fsmpi.rwth-aachen.de/wiki/api.php"
-WIKI_ANONYMOUS = False
-WIKI_USER = "protocolpusher"
-WIKI_PASSWORD = "0h3CjGju"
-WIKI_DOMAIN = "fsmpi"
-
-CALENDAR_ACTIVE = True
-CALENDAR_URL = ""
-CALENDAR_DEFAULT_DURATION = 3
-CALENDAR_MAX_REQUESTS = 10
-
-SESSION_PROTECTION = "strong"
-
-SECURITY_KEY = "{{protokolle_security_key}}"
-from auth import LdapManager, ADManager
-AUTH_MAX_DURATION = 86400
-AUTH_BACKENDS = [
-#    LdapManager(
-#        host="rumo.fsmpi.rwth-aachen.de",
-#        user_dn="uid={},ou=users,dc=fsmpi,dc=rwth-aachen,dc=de",
-#        group_dn="dc=fsmpi,dc=rwth-aachen,dc=de",
-#        obsolete=True),
-    ADManager(
-        host="auth.fsmpi.rwth-aachen.de",
-        domain="FSMPI",
-        user_dn="cn=users,dc=fsmpi,dc=rwth-aachen,dc=de",
-        group_dn="dc=fsmpi,dc=rwth-aachen,dc=de",
-        ca_cert="/etc/ssl/certs/rwth_chain.pem"),
-]
-
-OBSOLETION_WARNING = "Bitte migriere deinen Fachschaftsaccount im <a href=\"https://migration.fsmpi.rwth-aachen.de\">Migrationstool</a>!"
-
-ERROR_CONTEXT_LINES = 3
-
-PAGE_LENGTH = 20
-PAGE_DIFF = 3
-
-MAX_INDEX_DAYS = 14
-
-ADMIN_MAIL = "admin@fsmpi.rwth-aachen.de"
-ADMIN_GROUP = "protokolladmin"
-
-PARSER_LAZY = False
-
-FUZZY_MIN_SCORE = 90
-
-FONTS = {
-    "main": {
-        "extension": ".pfb",
-        "path": "/usr/share/fonts/type1/gsfonts/",
-        "regular": "n019003l",
-        "bold": "n019004l",
-        "italic": "n019023l",
-        "bolditalic": "n019024l"
-    },
-    "roman": {
-        "extension": ".pfb",
-        "path": "/usr/share/fonts/type1/gsfonts/",
-        "regular": "n021003l",
-        "bold": "n021004l",
-        "italic": "n021023l",
-        "bolditalic": "n021024l"
-    },
-    "sans": {
-        "extension": ".pfb",
-        "path": "/usr/share/fonts/type1/gsfonts/",
-        "regular": "n019003l",
-        "bold": "n019004l",
-        "italic": "n019023l",
-        "bolditalic": "n019024l"
-    },
-    "mono": {
-        "extension": ".pfb",
-        "path": "/usr/share/fonts/type1/gsfonts/",
-        "regular": "n022003l",
-        "bold": "n022004l",
-        "italic": "n022023l",
-        "bolditalic": "n022024l"
-    }
-}
-
-
-DOCUMENTS_PATH = "documents"
-
-PRIVATE_KEYWORDS = ["private", "internal", "privat", "intern"]
-
-LATEX_BULLETPOINTS = [
-    r"\textbullet",
-    r"\normalfont \bfseries \textendash",
-    r"$\circ$",
-    r"\textperiodcentered"
-]
-
diff --git a/protokollsystem/templates/config.py.j2 b/protokollsystem/templates/config.py.j2
new file mode 100644
index 0000000..abe3278
--- /dev/null
+++ b/protokollsystem/templates/config.py.j2
@@ -0,0 +1,158 @@
+SQLALCHEMY_DATABASE_URI = "postgresql://{{ protokolle_user }}:@/{{ protokolle_name }}"
+SQLALCHEMY_TRACK_MODIFICATIONS = False
+
+SECRET_KEY = "{{ protokolle_secret }}"
+
+DEBUG = False
+
+MAIL_ACTIVE = {{ protokolle_mail }}
+MAIL_FROM = "{{ protokolle_mail_from }}"
+MAIL_HOST = "{{ protokolle_mail_host }}"
+MAIL_USER = "{{ protokolle_mail_user }}"
+MAIL_PASSWORD = "{{ protokolle_mail_password }}"
+{% if protokolle_mail_tls == 'tls' %}
+MAIL_USE_TLS = True
+MAIL_USE_STARTTLS = False
+{% else if protokolle_mail_tls == 'starttls' %}
+MAIL_USE_TLS = False
+MAIL_USE_STARTTLS = True
+{% else %}
+MAIL_USE_TLS = False
+MAIL_USE_STARTTLS = False
+{% endif %}
+
+CELERY_BROKER_URL = "{{ protokolle_celery_broker }}"
+CELERY_TASK_SERIALIZER = "pickle"
+CELERY_ACCEPT_CONTENT = ["pickle"]
+
+URL_ROOT = "{{ protokolle_url_root }}"
+URL_PROTO = "{{ protokolle_url_proto }}"
+URL_PATH = "{{ protokolle_url_path }}"
+URL_PARAMS = ""
+
+PRINTING_ACTIVE = {{ protokolle_printing }}
+PRINTING_SERVER = "{{ protokolle_printing_server }}"
+PRINTING_USER = "{{ protokolle_printing_user }}"
+PRINTING_PRINTERS = {
+{% for p in protokolle_printing_printers %}
+	"{{ p.printer }}": [
+{% for o in p.options %}
+		"{{ o }}",
+{% endfor %}
+	],
+{% endfor %}
+}
+
+ETHERPAD_ACTIVE = {{ protokolle_etherpad }}
+ETHERPAD_URL = "{{ protokolle_etherpad_url }}"
+EMPTY_ETHERPAD = """Welcome to Etherpad!
+
+This pad text is synchronized as you type, so that everyone viewing this page sees the same text. This allows you to collaborate seamlessly on documents!
+
+Get involved with Etherpad at http://etherpad.org
+
+"""
+
+WIKI_ACTIVE = {{ protokolle_wiki }}
+WIKI_API_URL = "{{ protokolle_wiki_api }}"
+WIKI_ANONYMOUS = {{ protokolle_wiki_anonymous }}
+WIKI_USER = "{{ protokolle_wiki_user }}"
+WIKI_PASSWORD = "{{ protokolle_wiki_password }}"
+WIKI_DOMAIN = "{{ protokolle_wiki_domain }}"
+
+CALENDAR_ACTIVE = {{ protokolle_calendar }}
+CALENDAR_URL = "{{ protokolle_calendar_url }}"
+CALENDAR_DEFAULT_DURATION = 3
+CALENDAR_MAX_REQUESTS = 10
+
+SESSION_PROTECTION = "strong"
+
+SECURITY_KEY = "{{ protokolle_security_key }}"
+from auth import LdapManager, ADManager
+AUTH_MAX_DURATION = {{ protokolle_auth_max_duration }}
+AUTH_BACKENDS = [
+{% for auth in protokolle_auth_backends %}
+    {{ auth.type }}(
+        host="{{ auth.host }}",
+        domain="{{ auth.domain }}",
+        user_dn="{{ auth.user_dn }}",
+        group_dn="{{ auth.group_dn }}",
+        ca_cert="{{ auth.ca_cert }}",
+        obsolete={{ auth.obsolete }}),
+{% endfor %}
+]
+
+OBSOLETION_WARNING = "{{ protokolle_auth_obsoletion_warning }}"
+
+ERROR_CONTEXT_LINES = 3
+
+PAGE_LENGTH = 20
+PAGE_DIFF = 3
+
+MAX_INDEX_DAYS = 14
+
+ADMIN_MAIL = "{{ protokolle_admin_mail }}"
+ADMIN_GROUP = "{{ protokolle_admin_group }}"
+
+PARSER_LAZY = False
+
+FUZZY_MIN_SCORE = 90
+
+FONTS = {
+    "main": {
+        "extension": ".pfb",
+        "path": "/usr/share/fonts/type1/gsfonts/",
+        "regular": "n019003l",
+        "bold": "n019004l",
+        "italic": "n019023l",
+        "bolditalic": "n019024l"
+    },
+    "roman": {
+        "extension": ".pfb",
+        "path": "/usr/share/fonts/type1/gsfonts/",
+        "regular": "n021003l",
+        "bold": "n021004l",
+        "italic": "n021023l",
+        "bolditalic": "n021024l"
+    },
+    "sans": {
+        "extension": ".pfb",
+        "path": "/usr/share/fonts/type1/gsfonts/",
+        "regular": "n019003l",
+        "bold": "n019004l",
+        "italic": "n019023l",
+        "bolditalic": "n019024l"
+    },
+    "mono": {
+        "extension": ".pfb",
+        "path": "/usr/share/fonts/type1/gsfonts/",
+        "regular": "n022003l",
+        "bold": "n022004l",
+        "italic": "n022023l",
+        "bolditalic": "n022024l"
+    }
+}
+
+
+DOCUMENTS_PATH = "documents"
+
+PRIVATE_KEYWORDS = ["private", "internal", "privat", "intern"]
+
+LATEX_BULLETPOINTS = [
+    r"\textbullet",
+    r"\normalfont \bfseries \textendash",
+    r"$\circ$",
+    r"\textperiodcentered"
+]
+
+LATEX_LOCAL_TEMPLATES = "{{ protokolle_latex_local_templates }}"
+LATEX_LOGO_TEMPLATE = "{{ protokolle_latex_logo_template }}"
+LATEX_GEOMETRY = "{{ protokolle_latex_geometry }}"
+LATEX_PAGESTYLE = "{{ protokolle_latex_pagestyle }}"
+LATEX_ADDITIONAL_PACKAGES = ["{{ protokolle_latex_packages|join('", "') }}"]
+{% if protokolle_latex_header_footer %}
+LATEX_HEADER_FOOTER = True
+{% else if protokolle_latex_header_footer == False %}
+LATEX_HEADER_FOOTER = False
+{% endif %}
+
diff --git a/protokollsystem/templates/protokollsystem.service b/protokollsystem/templates/protokollsystem.service
deleted file mode 100644
index 12c030a..0000000
--- a/protokollsystem/templates/protokollsystem.service
+++ /dev/null
@@ -1,15 +0,0 @@
-[Unit]
-Description=Protokollsystem
-After=network.target
-Wants=protokollsystem-celery.service
-
-[Service]
-Environment=LDAPTLS_CACERT=/etc/ssl/certs/rwth_chain.pem
-ExecStart=/usr/bin/uwsgi --ini /etc/uwsgi/apps-available/{{protokolle_name}}.ini
-Restart=always
-KillSignal=SIGTERM
-Type=notify
-NotifyAccess=all
-
-[Install]
-WantedBy=multi-user.target
diff --git a/protokollsystem/templates/protokollsystem.service.j2 b/protokollsystem/templates/protokollsystem.service.j2
new file mode 100644
index 0000000..177b92f
--- /dev/null
+++ b/protokollsystem/templates/protokollsystem.service.j2
@@ -0,0 +1,17 @@
+[Unit]
+Description={{ protokolle_name }}
+After=network.target
+Wants=protokollsystem-celery.service
+
+[Service]
+{% if protokolle_ldap_cert %}
+Environment=LDAPTLS_CACERT={{ protokolle_ldap_cert }}
+{% endif %}
+ExecStart=/usr/bin/uwsgi --ini /etc/uwsgi/apps-available/{{ protokolle_name }}.ini
+Restart=always
+KillSignal=SIGTERM
+Type=notify
+NotifyAccess=all
+
+[Install]
+WantedBy=multi-user.target
diff --git a/schildergenerator/defaults/main.yml b/schildergenerator/defaults/main.yml
index 71b5b41..b39cf24 100644
--- a/schildergenerator/defaults/main.yml
+++ b/schildergenerator/defaults/main.yml
@@ -1,7 +1,7 @@
 ---
-# file: roles/schildergenerator/defaults/main.yml
+# file: schildergenerator/defaults/main.yml
 
-schilder_web_root: /var/www/schilder
+schilder_web_root: /var/www/schilder/program
 schilder_name: schilder
 schilder_user: schilder
 schilder_group: schilder
diff --git a/schildergenerator/handlers/main.yml b/schildergenerator/handlers/main.yml
index 2976929..9453d1b 100644
--- a/schildergenerator/handlers/main.yml
+++ b/schildergenerator/handlers/main.yml
@@ -1,11 +1,13 @@
 ---
-# file: roles/schilder/handlers/main.yml
+# file: schildergenerator/handlers/main.yml
 
 - name: reload systemd service files
   command: systemctl daemon-reload
 
 - name: restart uwsgi for schilder
-  service: name="{{schilder_name}}" state=restarted enabled=yes
+  service:
+    name: "{{ schilder_name }}"
+    state: restarted
 
 - name: create tmpfiles
   command: systemd-tmpfiles --create
diff --git a/schildergenerator/meta/main.yml b/schildergenerator/meta/main.yml
index 8913986..a2939c3 100644
--- a/schildergenerator/meta/main.yml
+++ b/schildergenerator/meta/main.yml
@@ -1,8 +1,7 @@
 ---
-# file: roles/schildergenerator/meta/main.yml
+# file: schildergenerator/meta/main.yml
 
 dependencies:
-  - { role: webserver }
   - { role: texlive }
   - { role: cups-client }
   - { role: uwsgi-python, uwsgi_name: "{{schilder_name}}", uwsgi_user: "{{schilder_user}}", uwsgi_group: "{{schilder_group}}", uwsgi_path: "{{schilder_web_root}}/program", uwsgi_home: "{{schilder_web_root}}", uwsgi_program: "schilder.py", uwsgi_callable: "app", uwsgi_command: "", uwsgi_db: "", uwsgi_python: 2, uwsgi_mules: 0 }
diff --git a/schildergenerator/tasks/main.yml b/schildergenerator/tasks/main.yml
index 4926a68..ebaa005 100644
--- a/schildergenerator/tasks/main.yml
+++ b/schildergenerator/tasks/main.yml
@@ -1,66 +1,57 @@
 ---
-# file: roles/schildergenerator/tasks/main.yml
+# file: schildergenerator/tasks/main.yml
 
 - name: ensure we have necessary software installed
-  apt: name="{{item}}" state=present
+  apt:
+    name: "{{ item }}"
+    state: present
   with_items:
     - graphicsmagick
     - python-pythonmagick
   tags:
-    - packages
     - schildergenerator
+    - webservices
 
-- name: ensure we have the folders for the program
-  file:
-    path: "{{item}}"
-    state: directory
-    owner: "{{schilder_user}}"
-    group: "{{schilder_group}}"
-    mode: 0755
-  with_items:
-    - "{{schilder_web_root}}"
-    - "{{schilder_web_root}}/program"
+- name: ensure the deploy key is available
+  copy:
+    src: "{{ schilder_deploy_key }}"
+    dest: /root/.ssh/schildergenerator
+    owner: root
+    group: root
+    mode: 0600
   tags:
-    - directory
     - schildergenerator
+    - webservices
 
-- name: ensure we have a .ssh directory
-  file: path="{{schilder_web_root}}/.ssh" state=directory owner="{{schilder_user}}" group="{{schilder_group}}" mode=0755
+# https://github.com/ansible/ansible/issues/27699
+- name: ensure fucking git module is able to clone
+  command: mount -o remount,exec /tmp
   tags:
-    - directory
     - schildergenerator
+    - webservices
 
-- name: ensure we have our deploy key 
-  copy: src="{{item}}" dest="{{schilder_web_root}}/.ssh/" owner="{{schilder_user}}" group="{{schilder_group}}" mode=0600
-  with_items:
-    - deploy-key
-    - deploy-key.pub
+- name: ensure the git is at the current revision
+  git:
+    repo: git@git.fsmpi.rwth-aachen.de:schilder/schildergenerator.git
+    dest: "{{ schilder_web_root }}"
+    key_file: /root/.ssh/schildergenerator
+    version: HEAD
+  notify:
+    - restart uwsgi for schilder
   tags:
-    - ssh
     - schildergenerator
+    - webservices
 
-- name: ensure we have our .ssh config
-  template: src=config dest="{{schilder_web_root}}/.ssh/config" owner="{{schilder_user}}" group="{{schilder_group}}" mode=0644
+- name: ensure fucking git module is not able to clone anymore
+  command: mount -o remount,noexec /tmp
   tags:
-    - ssh
     - schildergenerator
-
-#- name: ensure we have the program
-#  git:
-#    repo: "git@git.fsmpi.rwth-aachen.de:schilder/schildergenerator.git"
-#    dest: "{{schilder_web_root}}/program"
-#  become: yes
-#  become_user: "{{schilder_user}}"
-#  notify:
-#    - restart uwsgi for schilder
-#  tags:
-#    - git
-#    - schildergenerator
+    - webservices
 
 - name: ensure git ignores local files
   lineinfile:
-    dest: "{{schilder_web_root}}/program/.git/info/exclude"
-    line: "{{item}}"
+    dest: "{{ schilder_web_root }}/.git/info/exclude"
+    line: "{{ item }}"
     state: present
   with_items:
     - data/
@@ -69,66 +60,61 @@
     - local/
     - share/
   tags:
-    - git
     - schildergenerator
+    - webservices
 
 - name: ensure we have our requirements
   copy:
     src: requirements.txt
-    dest: "{{schilder_web_root}}/requirements.txt"
-    owner: "{{schilder_user}}"
-    group: "{{schilder_group}}"
+    dest: "{{ schilder_web_root }}/requirements.txt"
+    owner: "{{ schilder_user }}"
+    group: "{{ schilder_group }}"
     mode: 0644
   tags:
-    - pip
-    - python
     - schildergenerator
+    - webservices
 
 - name: ensure we have a virtualenv
   pip:
-    requirements: "{{schilder_web_root}}/requirements.txt"
-    virtualenv: "{{schilder_web_root}}/program"
+    requirements: "{{ schilder_web_root }}/requirements.txt"
+    virtualenv: "{{ schilder_web_root }}"
     virtualenv_python: python2
     virtualenv_site_packages: yes
-  become: yes
-  become_user: "{{schilder_user}}"
   notify:
     - restart uwsgi for schilder
   tags:
-    - pip
-    - python
     - schildergenerator
+    - webservices
 
 - name: ensure we have our config
   template:
-    src: config.py
-    dest: "{{schilder_web_root}}/program/config.py"
-    owner: "{{schilder_user}}"
-    group: "{{schilder_group}}"
+    src: config.py.j2
+    dest: "{{ schilder_web_root }}/config.py"
+    owner: "{{ schilder_user }}"
+    group: "{{ schilder_group }}"
     mode: 0644
   notify:
     - restart uwsgi for schilder
   tags:
-    - config
-    - python
     - schildergenerator
+    - webservices
 
 - name: ensure we have our templates
   git:
-    repo: "{{schilder_templates_url}}"
-    dest: "{{schilder_web_root}}/tex"
-  become: yes
-  become_user: "{{schilder_user}}"
+    repo: "{{ schilder_templates_url }}"
+    dest: "{{ schilder_web_root }}/tex"
+    key_file: /root/.ssh/schildergenerator
+    version: HEAD
   notify:
     - restart uwsgi for schilder
   tags:
-    - git
     - schildergenerator
+    - webservices
 
 - name: ensure the unit file exists
   template:
-    src: schilder.service
-    dest: "/etc/systemd/system/{{schilder_name}}.service"
+    src: schilder.service.j2
+    dest: "/etc/systemd/system/{{ schilder_name }}.service"
     owner: root
     group: root
     mode: 0644
@@ -136,15 +122,16 @@
     - reload systemd service files
     - restart uwsgi for schilder
   tags:
-    - config
-    - systemd
     - schildergenerator
+    - webservices
 
 - meta: flush_handlers
 
 - name: ensure the service is enabled
-  service: name="{{schilder_name}}.service" enabled=yes
+  service:
+    name: "{{ schilder_name }}"
+    enabled: yes
+    state: started
   tags:
-    - config
-    - systemd
     - schildergenerator
+    - webservices
diff --git a/schildergenerator/templates/config b/schildergenerator/templates/config
deleted file mode 100644
index ad5d5ca..0000000
--- a/schildergenerator/templates/config
+++ /dev/null
@@ -1,4 +0,0 @@
-Host git.fsmpi.rwth-aachen.de
-HostName git.fsmpi.rwth-aachen.de
-User git
-IdentityFile {{schilder_web_root}}/.ssh/deploy-key
diff --git a/schildergenerator/templates/config.py b/schildergenerator/templates/config.py.j2
similarity index 87%
rename from schildergenerator/templates/config.py
rename to schildergenerator/templates/config.py.j2
index a237a96..956b84c 100644
--- a/schildergenerator/templates/config.py
+++ b/schildergenerator/templates/config.py.j2
@@ -3,12 +3,12 @@
 # Secret key (used for session cookie encryption). Needs to be set to some random string.
 # Yes, just smash your keyboard for some random characters. No, don't publish them anywhere.
 # Yes, you will need this. If you get random RuntimeErrors, you did not set this.
-app_secret = '{{range(10**15, 10**16)|random}}'
+app_secret = '{{ range(10**15, 10**16)|random }}'
 
 ## You will need to use absolute paths!
 
 # Base directory. You need to set this again in schilder.wsgi if you use WSGI.
-basedir = '{{schilder_web_root}}/program'
+basedir = '{{ schilder_web_root }}'
 
 # Temp directory for imagemagick/pdflatex work files (needs to be writeable)
 tmpdir = '/tmp'
@@ -22,7 +22,7 @@ datadir = basedir + '/data'
 templatedir = basedir + '/templates'
 
 # TeX template directory
-textemplatedir = '{{schilder_web_root}}/tex'
+textemplatedir = '{{ schilder_web_root }}/tex'
 
 # TeX support file directory (all files that might be needed by a tex template)
 texsupportdir = textemplatedir + '/support'
@@ -48,15 +48,15 @@ allowed_extensions = set(['png', 'jpg', 'jpeg', 'gif', 'svg'])
 # CUPS printer names
 printers = { 
   {% for printer in schilder_printers %}
-    '{{printer.description}}': '{{printer.name}}',
+    '{{ printer.description }}': '{{ printer.name }}',
   {% endfor %}
 }
-printserver = '{{schilder_printsrv}}'
+printserver = '{{ schilder_printsrv }}'
 
 # additional lpr options. Use an empty list if not needed.
 lproptions = [
 {% for option in schilder_lproptions %}
-    '{{option}}',
+    '{{ option }}',
 {% endfor %}
 ]
 
diff --git a/schildergenerator/templates/schilder.service b/schildergenerator/templates/schilder.service.j2
similarity index 55%
rename from schildergenerator/templates/schilder.service
rename to schildergenerator/templates/schilder.service.j2
index 7921cb7..fdd6e0a 100644
--- a/schildergenerator/templates/schilder.service
+++ b/schildergenerator/templates/schilder.service.j2
@@ -1,9 +1,9 @@
 [Unit]
-Description=Protokollsystem
+Description={{ schilder_name }}
 After=network.target
 
 [Service]
-ExecStart=/usr/bin/uwsgi --ini /etc/uwsgi/apps-available/{{schilder_name}}.ini
+ExecStart=/usr/bin/uwsgi --ini /etc/uwsgi/apps-available/{{ schilder_name }}.ini
 Restart=always
 KillSignal=SIGQUIT
 Type=notify
diff --git a/sso/defaults/main.yml b/sso/defaults/main.yml
index 1b4f146..4942386 100644
--- a/sso/defaults/main.yml
+++ b/sso/defaults/main.yml
@@ -1,5 +1,5 @@
 ---
-# file: roles/sso/defaults/main.yml
+# file: sso/defaults/main.yml
 
 program_name: sso
 program_user: sso
@@ -13,4 +13,6 @@ sso_auth_group_dn: "dc=fsmpi,dc=rwth-aachen,dc=de"
 sso_auth_ca_cert: /etc/ssl/certs/rwth_chain.pem
 sso_auth_domain: FSMPI
 
-sso_domain: "{{domain}}"
+sso_domain: "{{ domain }}"
+
+program_dir: "{{web_root}}/{{program_name}}/program"
diff --git a/sso/handlers/main.yml b/sso/handlers/main.yml
index a3d4045..e1ae721 100644
--- a/sso/handlers/main.yml
+++ b/sso/handlers/main.yml
@@ -1,8 +1,10 @@
 ---
-# file: roles/sso/handlers/main.yml
+# file: sso/handlers/main.yml
 
 - name: reload systemd service files
   command: systemctl daemon-reload
 
 - name: restart program
-  service: name="{{program_name}}" state=restarted enabled=yes
+  service:
+    name: "{{ program_name }}"
+    state: restarted
diff --git a/sso/meta/main.yml b/sso/meta/main.yml
index 57ffb92..7c7a582 100644
--- a/sso/meta/main.yml
+++ b/sso/meta/main.yml
@@ -1,7 +1,5 @@
 ---
-# file: roles/sso/meta/main.yml
+# file: sso/meta/main.yml
 
 dependencies:
-  - { role: webserver, tags: ["sso"] }
-  - { role: git-deployed, tags: ["sso"] }
   - { role: uwsgi-python, uwsgi_name: "{{program_name}}", uwsgi_user: "{{program_user}}", uwsgi_group: "{{program_group}}", uwsgi_path: "{{web_root}}/{{program_name}}/program", uwsgi_home: "{{web_root}}/{{program_name}}", uwsgi_program: "sso.py", uwsgi_callable: "app", uwsgi_command: "runserver", tags: ["sso"] }
diff --git a/sso/tasks/main.yml b/sso/tasks/main.yml
index 86c2e14..1498efd 100644
--- a/sso/tasks/main.yml
+++ b/sso/tasks/main.yml
@@ -1,66 +1,93 @@
 ---
-# file: role/sso/tasks/main.yml
+# file: sso/tasks/main.yml
 
-- set_fact:
-    program_dir: "{{web_root}}/{{program_name}}/program"
+- name: ensure the deploy key is available
+  copy:
+    src: "{{ sso_deploy_key }}"
+    dest: /root/.ssh/sso
+    owner: root
+    group: root
+    mode: 0600
+  tags:
+    - sso
+    - webservices
+
+# https://github.com/ansible/ansible/issues/27699
+- name: ensure fucking git module is able to clone
+  command: mount -o remount,exec /tmp
+  tags:
+    - sso
+    - webservices
+
+- name: ensure the git is at the current revision
+  git:
+    repo: git@git.fsmpi.rwth-aachen.de:infra/sso.git
+    dest: "{{ program_dir }}"
+    key_file: /root/.ssh/sso
+    version: HEAD
+  notify:
+    - restart program
+  tags:
+    - sso
+    - webservices
+
+- name: ensure fucking git module is not able to clone anymore
+  command: mount -o remount,noexec /tmp
+  tags:
+    - sso
+    - webservices
 
 - name: ensure we have a virtualenv
   pip:
-    requirements: "{{program_dir}}/requirements.txt"
-    virtualenv: "{{program_dir}}"
+    requirements: "{{ program_dir }}/requirements.txt"
+    virtualenv: "{{ program_dir }}"
     virtualenv_python: python3
-  become: yes
-  become_user: "{{program_user}}"
   notify:
     - restart program
   tags:
-    - pip
-    - python
     - sso
+    - webservices
 
 - name: ensure we have our config
   template:
-    src: config.py
-    dest: "{{program_dir}}/config.py"
-    owner: "{{program_user}}"
-    group: "{{program_group}}"
+    src: config.py.j2
+    dest: "{{ program_dir }}/config.py"
+    owner: "{{ program_user }}"
+    group: "{{ program_group }}"
     mode: 0644
   notify:
     - restart program
   tags:
-   - config
-   - python
-   - sso
+    - sso
+    - webservices
 
 - name: ensure we have our secret config
   template:
     src: secret_config.py
-    dest: "{{program_dir}}/secret_config.py"
-    owner: "{{program_user}}"
-    group: "{{program_group}}"
+    dest: "{{ program_dir }}/secret_config.py"
+    owner: "{{ program_user }}"
+    group: "{{ program_group }}"
     mode: 0600
     force: no
   notify:
     - restart program
   tags:
-   - config
-   - python
-   - sso
+    - sso
+    - webservices
 
 - name: ensure git ignores our secret config
   lineinfile:
-    dest: "{{program_dir}}/.git/info/exclude"
+    dest: "{{ program_dir }}/.git/info/exclude"
     line: "secret_config.py"
     state: present
   tags:
-    - config
-    - git
     - sso
+    - webservices
 
 - name: ensure the unit file exists
   template:
-    src: sso.service
-    dest: "/etc/systemd/system/{{program_name}}.service"
+    src: sso.service.j2
+    dest: "/etc/systemd/system/{{ program_name }}.service"
     owner: root
     group: root
     mode: 0644
@@ -68,15 +95,16 @@
     - reload systemd service files
     - restart program
   tags:
-    - config
-    - systemd
     - sso
+    - webservices
 
 - meta: flush_handlers
 
 - name: ensure the service is enabled
-  service: name="{{program_name}}" enabled=yes
+  service:
+    name: "{{program_name}}"
+    enabled: yes
+    state: started
   tags:
-    - config
-    - systemd
     - sso
+    - webservices
diff --git a/sso/templates/config.py b/sso/templates/config.py.j2
similarity index 54%
rename from sso/templates/config.py
rename to sso/templates/config.py.j2
index 2b62397..c9988a6 100644
--- a/sso/templates/config.py
+++ b/sso/templates/config.py.j2
@@ -4,19 +4,19 @@ from auth import LdapManager, ADManager
 
 {% if sso_auth_use_ad %}
 AUTH_MANAGER = ADManager(
-    host="{{sso_auth_host}}",
-    domain="{{sso_auth_domain}}",
-    user_dn="{{sso_auth_user_dn}}",
-    group_dn="{{sso_auth_group_dn}}",
-    ca_cert="{{sso_auth_ca_cert}}")
+    host="{{ sso_auth_host }}",
+    domain="{{ sso_auth_domain }}",
+    user_dn="{{ sso_auth_user_dn }}",
+    group_dn="{{ sso_auth_group_dn }}",
+    ca_cert="{{ sso_auth_ca_cert }}")
 {% else %}
 AUTH_MANAGER = LdapManager(
-    host="{{sso_auth_host}}",
-    user_dn="{{sso_auth_user_dn}}",
-    group_dn="{{sso_auth_group_dn}}")
+    host="{{ sso_auth_host }}",
+    user_dn="{{ sso_auth_user_dn }}",
+    group_dn="{{ sso_auth_group_dn }}")
 {% endif %}
 
-SESSION_COOKIE_DOMAIN = "{{sso_domain}}"
+SESSION_COOKIE_DOMAIN = "{{ sso_domain }}"
 SESSION_COOKIE_NAME = "SSO-{}-SESSION".format(SESSION_COOKIE_DOMAIN.split(".")[0].upper())
 SESSION_COOKIE_HTTPONLY = True
 SESSION_REFRESH_EACH_REQUEST = True
diff --git a/sso/templates/secret_config.py b/sso/templates/secret_config.py
deleted file mode 100644
index 23fb517..0000000
--- a/sso/templates/secret_config.py
+++ /dev/null
@@ -1 +0,0 @@
-secret_key = '{{(2**2048)|random}}'
diff --git a/sso/templates/secret_config.py.j2 b/sso/templates/secret_config.py.j2
new file mode 100644
index 0000000..4fe5c96
--- /dev/null
+++ b/sso/templates/secret_config.py.j2
@@ -0,0 +1 @@
+secret_key = '{{ (2**2048)|random }}'
diff --git a/sso/templates/sso.service b/sso/templates/sso.service.j2
similarity index 67%
rename from sso/templates/sso.service
rename to sso/templates/sso.service.j2
index 439baef..a727ea3 100644
--- a/sso/templates/sso.service
+++ b/sso/templates/sso.service.j2
@@ -3,7 +3,7 @@ Description=Single sign-on
 After=network.target
 
 [Service]
-ExecStart=/usr/bin/uwsgi --ini /etc/uwsgi/apps-available/{{program_name}}.ini
+ExecStart=/usr/bin/uwsgi --ini /etc/uwsgi/apps-available/{{ program_name }}.ini
 Restart=always
 KillSignal=SIGTERM
 Type=notify
diff --git a/uwsgi-php/meta/main.yml b/uwsgi-php/meta/main.yml
index 8a60ee7..a378589 100644
--- a/uwsgi-php/meta/main.yml
+++ b/uwsgi-php/meta/main.yml
@@ -1,4 +1,4 @@
 ---
-# file: roles/uwsgi-php/meta/main.yml
+# file: uwsgi-php/meta/main.yml
 dependencies:
   - { role: uwsgi }
diff --git a/uwsgi-php/tasks/main.yml b/uwsgi-php/tasks/main.yml
index a6e06db..bfd49cd 100644
--- a/uwsgi-php/tasks/main.yml
+++ b/uwsgi-php/tasks/main.yml
@@ -1,12 +1,14 @@
 ---
-# file: roles/uwsgi-php/tasks/main.yml
+# file: uwsgi-php/tasks/main.yml
 
 - name: ensure packages for uwsgi-php are installed
-  apt: name={{ item }} state=latest
+  apt:
+    name: "{{ item }}"
+    state: installed
   with_items:
     - php5
     - php5-curl
     - uwsgi-plugin-php
   tags:
     - uwsgi
-    - packages
+    - webservices
diff --git a/uwsgi-python/defaults/main.yml b/uwsgi-python/defaults/main.yml
index 4165f08..7df95ee 100644
--- a/uwsgi-python/defaults/main.yml
+++ b/uwsgi-python/defaults/main.yml
@@ -1,5 +1,5 @@
 ---
-# files: roles/uwsgi-python/defaults/main.yml
+# files: uwsgi-python/defaults/main.yml
 
 uwsgi_name: uwsgi
 uwsgi_user: uwsgi
diff --git a/uwsgi-python/handlers/main.yml b/uwsgi-python/handlers/main.yml
index 5011439..c28bb7d 100644
--- a/uwsgi-python/handlers/main.yml
+++ b/uwsgi-python/handlers/main.yml
@@ -1,5 +1,5 @@
 ---
-# file: roles/uwsgi-python/handlers/main.yml
+# file: uwsgi-python/handlers/main.yml
 
 - name: create tmpfiles
   command: systemd-tmpfiles --create
diff --git a/uwsgi-python/meta/main.yml b/uwsgi-python/meta/main.yml
index f6ade0b..97abf43 100644
--- a/uwsgi-python/meta/main.yml
+++ b/uwsgi-python/meta/main.yml
@@ -1,4 +1,4 @@
 ---
-# file: roles/uwsgi-python/meta/main.yml
+# file: uwsgi-python/meta/main.yml
 dependencies:
   - { role: uwsgi }
diff --git a/uwsgi-python/tasks/main.yml b/uwsgi-python/tasks/main.yml
index 82c72a6..a6c9a08 100644
--- a/uwsgi-python/tasks/main.yml
+++ b/uwsgi-python/tasks/main.yml
@@ -1,8 +1,10 @@
 ---
-# file: roles/uwsgi-python/tasks/main.yml
+# file: uwsgi-python/tasks/main.yml
 
 - name: ensure we have python 2
-  apt: name="{{item}}"
+  apt:
+    name: "{{ item }}"
+    state: installed
   with_items:
     - python
     - python-dev
@@ -11,11 +13,13 @@
     - virtualenv
   when: uwsgi_python == 2
   tags:
-    - packages
     - uwsgi-python
+    - webservices
 
 - name: ensure we have python 3
-  apt: name="{{item}}"
+  apt:
+    name: "{{ item }}"
+    state: installed
   with_items:
     - python3
     - python3-dev
@@ -24,165 +28,72 @@
     - virtualenv
   when: uwsgi_python == 3
   tags:
-    - packages
     - uwsgi-python
+    - webservices
 
 - name: ensure we have the necessary libraries for ldap
-  apt: name="{{item}}"
+  apt:
+    name: "{{ item }}"
+    state: installed
   with_items:
     - libsasl2-dev
     - libssl-dev
     - libldap2-dev
   tags:
-    - packages
     - uwsgi-python
-    - ldap
+    - webservices
 
-- name: ensure we have sqlite installed
-  apt: name="{{item}}"
-  with_items:
-    - sqlite3
+- include: sqlite.yml
   when: uwsgi_db == "sqlite"
-  tags:
-    - packages
-    - uwsgi-python
-    - sqlite
 
-- name: ensure we have python mysql packages
-  apt: name="{{item}}"
-  with_items:
-    - python-mysqldb
-    - python3-mysqldb
-    - default-libmysqlclient-dev
+- include: mysql.yml
   when: uwsgi_db == "mysql"
-  tags:
-    - packages
-    - uwsgi-python
-    - mysql
 
-- name: "get database password for mysql"
-  local_action: pass name="db/{{ansible_hostname}}-mysql" state=present generate=20 store=FSMPI_PASSWORD_STORE_DIR limit=yes
-  register: mysql_password
-  when: uwsgi_db == "mysql"
-  no_log: True
-  tags:
-    - config
-    - uwsgi-python
-    - mysql
-    - password
-
-- name: "ensure the mysql database exists"
-  mysql_db:
-    name: "{{uwsgi_name}}"
-    state: present
-    login_user: root
-    login_password: "{{mysql_password.password}}"
-  when: uwsgi_db == "mysql"
-  no_log: True
-  tags:
-    - config
-    - mysql
-    - uwsgi-python
-
-- name: "ensure we have a user password for mysql"
-  local_action: pass name="db/{{ansible_hostname}}-mysql-{{uwsgi_user}}" state=present generate=20 store=FSMPI_PASSWORD_STORE_DIR limit=yes
-  register: mysql_user_password
-  when: uwsgi_db == "mysql"
-  no_log: True
-  tags:
-    - config
-    - uwsgi-python
-    - mysql
-    - password
-
-- name: ensure the database user for mysql exists
-  mysql_user:
-    name: "{{uwsgi_user}}"
-    password: "{{mysql_user_password.password}}"
-    state: present
-    login_user: root
-    login_password: "{{mysql_password.password}}"
-    priv: "{{uwsgi_name}}.*:ALL"
-  when: uwsgi_db == "mysql"
-  no_log: True
-  tags:
-    - config
-    - mysql
-    - uwsgi-python
-
-- name: ensure we have a postgres database user
-  postgresql_user:
-    name: "{{uwsgi_user}}"
-    state: present
-  become: yes
-  become_user: postgres
-  when: uwsgi_db == "postgres"
-  tags:
-    - postgresql
-    - config
-    - uwsgi-python
-
-- name: ensure we have a postgres database
-  postgresql_db:
-    name: "{{uwsgi_name}}"
-    owner: "{{uwsgi_user}}"
-    state: present
-  become: yes
-  become_user: postgres
-  when: uwsgi_db == "postgres"
-  tags:
-    - postgresql
-    - config
-    - uwsgi-python
-
-- name: ensure the database user has privileges
-  postgresql_privs:
-    database: "{{uwsgi_name}}"
-    roles: "{{uwsgi_user}}"
-    privs: ALL
-    state: present
-    type: database
-  become: yes
-  become_user: postgres
+- include: postgres.yml
   when: uwsgi_db == "postgres"
-  tags:
-    - postgresql
-    - config
-    - uwsgi_python
 
 - name: ensure we have a group
-  group: name="{{uwsgi_group}}" system=yes state=present
+  group:
+    name: "{{ uwsgi_group }}"
+    system: yes
+    state: present
   tags:
-    - group
-    - config
     - uwsgi-python
+    - webservices
 
 - name: ensure we have a user
-  user: name="{{uwsgi_user}}" group="{{uwsgi_group}}" system=yes home="{{uwsgi_home}}" shell=/usr/bin/nologin createhome=no state=present
+  user:
+    name: "{{ uwsgi_user }}"
+    group: "{{ uwsgi_group }}"
+    system: yes
+    home: "{{ uwsgi_home }}"
+    shell: /usr/bin/nologin
+    createhome: no
+    state: present
   tags:
-    - user
-    - config
     - uwsgi-python
+    - webservices
 
 - name: ensure a temporary directory exists
-  lineinfile:
+  templates:
+    src: tmpfiles.conf.j2
     dest: "/etc/tmpfiles.d/10-{{uwsgi_name}}.conf"
-    line: "d /run/uwsgi/app/{{uwsgi_name}} 0775 {{uwsgi_user}} {{uwsgi_group}} - -"
-    create: yes
+    owner: root
+    group: root
+    mode: 0644
   notify:
     - create tmpfiles
   tags:
-    - config
     - uwsgi-python
+    - webservices
 
 - name: ensure we have our uwsgi config file
   template:
-    src: uwsgi.ini
-    dest: "/etc/uwsgi/apps-available/{{uwsgi_name}}.ini"
+    src: uwsgi.ini.j2
+    dest: "/etc/uwsgi/apps-available/{{ uwsgi_name }}.ini"
     owner: root
     group: root
     mode: 0644
   tags:
-    - config
-    - uwsgi
     - uwsgi-python
+    - webservices
diff --git a/uwsgi-python/tasks/mysql.yml b/uwsgi-python/tasks/mysql.yml
new file mode 100644
index 0000000..0a676c2
--- /dev/null
+++ b/uwsgi-python/tasks/mysql.yml
@@ -0,0 +1,38 @@
+---
+# file: uwsgi-python/tasks/mysql.yml
+
+- name: ensure we have python mysql packages
+  apt:
+    name: "{{ item }}"
+    state: installed
+  with_items:
+    - python-mysqldb
+    - python3-mysqldb
+    - default-libmysqlclient-dev
+  tags:
+    - uwsgi-python
+    - webservices
+
+- name: ensure the mysql database exists
+  mysql_db:
+    name: "{{ uwsgi_name }}"
+    state: present
+    login_user: root
+    login_password: "{{db/{{ansible_hostname}}-mysql}}"
+  no_log: True
+  tags:
+    - uwsgi-python
+    - webservices
+
+- name: ensure the database user for mysql exists
+  mysql_user:
+    name: "{{uwsgi_user}}"
+    password: "{{db/{{ansible_hostname}}-mysql-{{uwsgi_user}}}}"
+    state: present
+    login_user: root
+    login_password: "{{}}"
+    priv: "{{uwsgi_name}}.*:ALL"
+  no_log: True
+  tags:
+    - uwsgi-python
+    - webservices
diff --git a/uwsgi-python/tasks/postgres.yml b/uwsgi-python/tasks/postgres.yml
new file mode 100644
index 0000000..5b0a5b5
--- /dev/null
+++ b/uwsgi-python/tasks/postgres.yml
@@ -0,0 +1,36 @@
+---
+# file: uwsgi-python/tasks/postgres.yml
+
+- name: ensure we have a postgres database user
+  postgresql_user:
+    name: "{{ uwsgi_user }}"
+    state: present
+  become: yes
+  become_user: postgres
+  tags:
+    - uwsgi-python
+    - webservices
+
+- name: ensure we have a postgres database
+  postgresql_db:
+    name: "{{ uwsgi_name }}"
+    owner: "{{ uwsgi_user }}"
+    state: present
+  become: yes
+  become_user: postgres
+  tags:
+    - uwsgi-python
+    - webservices
+
+- name: ensure the database user has privileges
+  postgresql_privs:
+    database: "{{ uwsgi_name }}"
+    roles: "{{ uwsgi_user }}"
+    privs: ALL
+    state: present
+    type: database
+  become: yes
+  become_user: postgres
+  tags:
+    - uwsgi-python
+    - webservices
diff --git a/uwsgi-python/tasks/sqlite.yml b/uwsgi-python/tasks/sqlite.yml
new file mode 100644
index 0000000..491657d
--- /dev/null
+++ b/uwsgi-python/tasks/sqlite.yml
@@ -0,0 +1,11 @@
+---
+# file: uwsgi-python/tasks/sqlite.yml
+
+- name: ensure we have sqlite installed
+  apt:
+    name: sqlite3
+    state: installed
+  tags:
+    - uwsgi-python
+    - webservices
+
diff --git a/uwsgi-python/templates/tmpfiles.conf.j2 b/uwsgi-python/templates/tmpfiles.conf.j2
new file mode 100644
index 0000000..4dba06e
--- /dev/null
+++ b/uwsgi-python/templates/tmpfiles.conf.j2
@@ -0,0 +1 @@
+d /run/uwsgi/app/{{uwsgi_name}} 0775 {{uwsgi_user}} {{uwsgi_group}} - -
diff --git a/uwsgi-python/templates/uwsgi.ini b/uwsgi-python/templates/uwsgi.ini.j2
similarity index 100%
rename from uwsgi-python/templates/uwsgi.ini
rename to uwsgi-python/templates/uwsgi.ini.j2
diff --git a/uwsgi/files/tmpfiles.conf b/uwsgi/files/tmpfiles.conf
new file mode 100644
index 0000000..50b2862
--- /dev/null
+++ b/uwsgi/files/tmpfiles.conf
@@ -0,0 +1,2 @@
+d /run/uwsgi 0755 root root - -
+d /run/uwsgi/app 0755 root root - -
diff --git a/uwsgi/handlers/main.yml b/uwsgi/handlers/main.yml
index 97bfdde..66f7827 100644
--- a/uwsgi/handlers/main.yml
+++ b/uwsgi/handlers/main.yml
@@ -1,5 +1,5 @@
 ---
-# file: roles/uwsgi/handlers/main.yml
+# file: uwsgi/handlers/main.yml
 
 - name: create tmpfiles
   shell: systemd-tmpfiles --create
diff --git a/uwsgi/tasks/main.yml b/uwsgi/tasks/main.yml
index 2a22fca..d8ffa47 100644
--- a/uwsgi/tasks/main.yml
+++ b/uwsgi/tasks/main.yml
@@ -1,24 +1,24 @@
 ---
-# file: roles/uwsgi/tasks/main.yml
+# file: uwsgi/tasks/main.yml
 
 - name: ensure uwsgi is installed
-  apt: name=uwsgi state=latest
+  apt:
+    name: uwsgi
+    state: installed
   tags:
     - uwsgi
-    - packages
+    - webservices
 
 - name: ensure a temporary directory exists
-  lineinfile: dest=/etc/tmpfiles.d/10-uwsgi.conf line="d /run/uwsgi 0755 root root - -" create=yes
+  copy:
+    src: tmpfiles.conf
+    dest: /etc/tmpfiles.d/10-uwsgi.conf
+    owner: root
+    group: root
+    mode: 0644
   notify:
     - create tmpfiles
   tags:
     - uwsgi
-    - tmpdirs
+    - webservices
 
-- name: ensure a temporary subdirectory exists
-  lineinfile: dest=/etc/tmpfiles.d/10-uwsgi.conf line="d /run/uwsgi/app 0755 root root - -" create=yes
-  notify:
-    - create tmpfiles
-  tags:
-    - uwsgi
-    - tmpdirs
diff --git a/wahlhelfer/defaults/main.yml b/wahlhelfer/defaults/main.yml
index c62e365..8072db0 100644
--- a/wahlhelfer/defaults/main.yml
+++ b/wahlhelfer/defaults/main.yml
@@ -1,7 +1,7 @@
 ---
-# file: roles/wahlhelfer/defaults/main.yml
+# file: wahlhelfer/defaults/main.yml
 
-wahlhelfer_web_root: /var/www/wahlhelfer
+wahlhelfer_web_root: /var/www/wahlhelfer/program
 wahlhelfer_name: wahlhelfer
 wahlhelfer_user: wahlhelfer
 wahlhelfer_group: wahlhelfer
@@ -9,3 +9,5 @@ wahlhelfer_admins: [["Robin Sonnabend", "robin@fsmpi.rwth-aachen.de"]]
 wahlhelfer_sender: wahlhelfer@fsmpi.rwth-aachen.de
 wahlhelfer_mail_host: mail.fsmpi.rwth-aachen.de
 wahlhelfer_allowed_hosts: ["wahlhelfer.stud.rwth-aachen.de"]
+
+wahlhelfer_ldap_cert: /etc/ssl/certs/rwth_chain.pem
diff --git a/wahlhelfer/handlers/main.yml b/wahlhelfer/handlers/main.yml
index 31d4abe..47338d1 100644
--- a/wahlhelfer/handlers/main.yml
+++ b/wahlhelfer/handlers/main.yml
@@ -1,13 +1,13 @@
 ---
-# file: roles/wahlhelfer/handlers/main.yml
+# file: wahlhelfer/handlers/main.yml
 
 - name: reload systemd service files
   command: systemctl daemon-reload
 
 - name: restart uwsgi for wahlhelfer
-  service: name="{{item}}" state=restarted enabled=yes
-  with_items:
-    - "{{wahlhelfer_name}}"
+  service:
+    name: "{{ wahlhelfer_name }}"
+    state: restarted
 
 - name: create tmpfiles
   command: systemd-tmpfiles --create
diff --git a/wahlhelfer/meta/main.yml b/wahlhelfer/meta/main.yml
index a6bc815..93f17bf 100644
--- a/wahlhelfer/meta/main.yml
+++ b/wahlhelfer/meta/main.yml
@@ -1,6 +1,4 @@
 ---
-# file:roles/wahlhelfer/meta/main.yml
+# file: wahlhelfer/meta/main.yml
 dependencies:
-  - { role: webserver }
-  - { role: mysql }
   - { role: uwsgi-python, uwsgi_name: "{{wahlhelfer_name}}", uwsgi_user: "{{wahlhelfer_user}}", uwsgi_group: "{{wahlhelfer_group}}", uwsgi_path: "{{wahlhelfer_web_root}}/program", uwsgi_home: "{{wahlhelfer_web_root}}", uwsgi_program: "main/wsgi.py", uwsgi_callable: "application", uwsgi_command: "runserver", uwsgi_db: "mysql", uwsgi_python: 3 }
diff --git a/wahlhelfer/tasks/main.yml b/wahlhelfer/tasks/main.yml
index 538ffe8..d264492 100644
--- a/wahlhelfer/tasks/main.yml
+++ b/wahlhelfer/tasks/main.yml
@@ -1,89 +1,84 @@
 ---
-# file: roles/wahlhelfer/tasks/main.yml
+# file: wahlhelfer/tasks/main.yml
 
-- name: ensure we have a folder for the program
-  file: path="{{wahlhelfer_web_root}}" state=directory owner="{{wahlhelfer_user}}" group="{{wahlhelfer_group}}" mode=0755
-  tags:
-    - directory
-    - wahlhelfer
-
-- name: ensure we have a .ssh directory
-  file: path="{{wahlhelfer_web_root}}/.ssh" state=directory owner="{{wahlhelfer_user}}" group="{{wahlhelfer_group}}" mode=0755
+- name: ensure the deploy key is available
+  copy:
+    src: "{{ wahlhelfer_deploy_key }}"
+    dest: /root/.ssh/wahlhelfer
+    owner: root
+    group: root
+    mode: 0600
   tags:
-    - directory
     - wahlhelfer
+    - webservices
 
-- name: ensure we have our deploy key
-  copy: src="{{item}}" dest="{{wahlhelfer_web_root}}/.ssh/" owner="{{wahlhelfer_user}}" group="{{wahlhelfer_group}}" mode=0600
-  with_items:
-    - deploy-key
-    - deploy-key.pub
+# https://github.com/ansible/ansible/issues/27699
+- name: ensure fucking git module is able to clone
+  command: mount -o remount,exec /tmp
   tags:
-    - ssh
     - wahlhelfer
+    - webservices
 
-- name: ensure we have our .ssh config
-  template: src=config dest="{{wahlhelfer_web_root}}/.ssh/config" owner="{{wahlhelfer_user}}" group="{{wahlhelfer_group}}" mode=0644
+- name: ensure the git is at the current revision
+  git:
+    repo: git@git.fsmpi.rwth-aachen.de:wahl/wahlhelfer.git
+    dest: "{{ wahlhelfer_web_root }}"
+    key_file: /root/.ssh/wahlhelfer
+    version: HEAD
+  notify:
+    - restart uwsgi for wahlhelfer
   tags:
-    - ssh
     - wahlhelfer
+    - webservices
 
-- name: ensure we have the program
-  git: repo=git@git.fsmpi.rwth-aachen.de:wahl/wahlhelfer.git dest="{{wahlhelfer_web_root}}/program"
-  become: yes
-  become_user: "{{wahlhelfer_user}}"
-  notify:
-    - restart uwsgi for wahlhelfer
+- name: ensure fucking git module is not able to clone anymore
+  command: mount -o remount,noexec /tmp
   tags:
-    - git
     - wahlhelfer
+    - webservices
 
 - name: ensure we have a virtualenv
   pip:
-    requirements: "{{wahlhelfer_web_root}}/program/requirements.txt"
-    virtualenv: "{{wahlhelfer_web_root}}/program"
+    requirements: "{{ wahlhelfer_web_root }}/requirements.txt"
+    virtualenv: "{{ wahlhelfer_web_root }}"
     virtualenv_python: python3
-  become: yes
-  become_user: "{{wahlhelfer_user}}"
   notify:
     - restart uwsgi for wahlhelfer
   tags:
-    - pip
-    - python
     - wahlhelfer
+    - webservices
 
 - name: ensure we have our config
   template:
-    src: settings.py
-    dest: "{{wahlhelfer_web_root}}/program/main/settings.py"
-    owner: "{{wahlhelfer_user}}"
-    group: "{{wahlhelfer_group}}"
+    src: settings.py.j2
+    dest: "{{ wahlhelfer_web_root }}/main/settings.py"
+    owner: "{{ wahlhelfer_user }}"
+    group: "{{ wahlhelfer_group }}"
     mode: 0644
   notify:
     - restart uwsgi for wahlhelfer
   tags:
-    - config
-    - python
     - wahlhelfer
+    - webservices
 
 - name: ensure we have the linear solver
   copy:
-    src: "{{item}}"
-    dest: "{{wahlhelfer_web_root}}/program/zibopt/"
-    owner: "{{wahlhelfer_user}}"
-    group: "{{wahlhelfer_group}}"
+    src: "{{ item }}"
+    dest: "{{ wahlhelfer_web_root }}/zibopt/"
+    owner: "{{ wahlhelfer_user }}"
+    group: "{{ wahlhelfer_group }}"
     mode: 0755
   with_items:
     - scip
     - zimpl
   tags:
-    - packages
     - wahlhelfer
+    - webservices
 
 - name: ensure the unit file exists
   template:
-    src: wahlhelfer.service
-    dest: "/etc/systemd/system/{{wahlhelfer_name}}.service"
+    src: wahlhelfer.service.j2
+    dest: "/etc/systemd/system/{{ wahlhelfer_name }}.service"
     owner: root
     group: root
     mode: 0644
@@ -91,17 +86,16 @@
     - reload systemd service files
     - restart uwsgi for wahlhelfer
   tags:
-    - config
-    - systemd
     - wahlhelfer
+    - webservices
 
 - meta: flush_handlers
 
 - name: ensure the services are enabled
-  service: name="{{item}}" enabled=yes
-  with_items:
-    - "{{wahlhelfer_name}}"
+  service:
+    name: "{{ wahlhelfer_name }}"
+    enabled: yes
+    state: started
   tags:
-    - config
-    - systemd
     - wahlhelfer
+    - webservices
diff --git a/wahlhelfer/templates/config b/wahlhelfer/templates/config
deleted file mode 100644
index a13911a..0000000
--- a/wahlhelfer/templates/config
+++ /dev/null
@@ -1,4 +0,0 @@
-Host git.fsmpi.rwth-aachen.de
-HostName git.fsmpi.rwth-aachen.de
-User git
-IdentityFile {{wahlhelfer_web_root}}/.ssh/deploy-key
diff --git a/wahlhelfer/templates/settings.py b/wahlhelfer/templates/settings.py.j2
similarity index 84%
rename from wahlhelfer/templates/settings.py
rename to wahlhelfer/templates/settings.py.j2
index 4bbd12c..243d062 100644
--- a/wahlhelfer/templates/settings.py
+++ b/wahlhelfer/templates/settings.py.j2
@@ -4,28 +4,27 @@ DEBUG = True
 
 ADMINS = (
     {% for name, address in wahlhelfer_admins %}
-    ('{{name}}', '{{address}}'),
+    ('{{ name }}', '{{ address }}'),
     {% endfor %}
 )
-
-SERVER_EMAIL = "{{wahlhelfer_sender}}"
-EMAIL_HOST = "{{wahlhelfer_mail_host}}"
-EMAIL_HOST_USER = "{{wahlhelfer_mail_user|default('')}}"
-EMAIL_HOST_PASSWORD = "{{wahlhelfer_mail_password|default('')}}"
-
 MANAGERS = ADMINS
 
+SERVER_EMAIL = "{{ wahlhelfer_sender }}"
+EMAIL_HOST = "{{ wahlhelfer_mail_host }}"
+EMAIL_HOST_USER = "{{ wahlhelfer_mail_user|default('') }}"
+EMAIL_HOST_PASSWORD = "{{ wahlhelfer_mail_password|default('') }}"
+
 LOGIN_URL = '/'
 LOGIN_REDIRECT_URL = '/'
 
 DATABASES = {
     'default': {
-        'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
-        'NAME': '{{wahlhelfer_name}}',                      # Or path to database file if using sqlite3.
-        'USER': '{{wahlhelfer_user}}',                      # Not used with sqlite3.
-        'PASSWORD': '{{mysql_user_password.password}}',                  # Not used with sqlite3.
-        'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.
-        'PORT': '',                      # Set to empty string for default. Not used with sqlite3.
+        'ENGINE': 'django.db.backends.mysql',
+        'NAME': '{{ wahlhelfer_name }}',
+        'USER': '{{ wahlhelfer_user }}',
+        'PASSWORD': '{{ mysql_user_password.password }}',
+        'HOST': '',
+        'PORT': '',
     }
 }
 
@@ -33,7 +32,7 @@ DATABASES = {
 # See https://docs.djangoproject.com/en/1.4/ref/settings/#allowed-hosts
 ALLOWED_HOSTS = [
 {% for host in wahlhelfer_allowed_hosts %}
-    "{{host}}"
+    "{{ host }}"
 {% endfor %}
 ]
 
@@ -95,7 +94,7 @@ STATICFILES_FINDERS = (
 )
 
 # Make this unique, and don't share it with anybody.
-SECRET_KEY = '{{(2**2048)|random}}'
+SECRET_KEY = '{{ (2**2048)|random }}'
 
 TEMPLATES = [
     {
diff --git a/wahlhelfer/templates/wahlhelfer.service b/wahlhelfer/templates/wahlhelfer.service
deleted file mode 100644
index a27cd04..0000000
--- a/wahlhelfer/templates/wahlhelfer.service
+++ /dev/null
@@ -1,15 +0,0 @@
-[Unit]
-Description=Wahlhelferorganisation
-After=network.target
-
-[Service]
-Environment=LDAPTLS_CACERT=/etc/ssl/certs/rwth_chain.pem
-Environment=WAHLHELFER_WEB_ROOT={{wahlhelfer_web_root}}/program/
-ExecStart=/usr/bin/uwsgi --ini /etc/uwsgi/apps-available/{{wahlhelfer_name}}.ini
-Restart=always
-KillSignal=SIGQUIT
-Type=notify
-NotifyAccess=all
-
-[Install]
-WantedBy=multi-user.target
diff --git a/wahlhelfer/templates/wahlhelfer.service.j2 b/wahlhelfer/templates/wahlhelfer.service.j2
new file mode 100644
index 0000000..ea742db
--- /dev/null
+++ b/wahlhelfer/templates/wahlhelfer.service.j2
@@ -0,0 +1,17 @@
+[Unit]
+Description=Wahlhelferorganisation
+After=network.target
+
+[Service]
+{% if wahlhelfer_ldap_cert %}
+Environment=LDAPTLS_CACERT={{ wahlhelfer_ldap_cert }}
+{% endif %}
+Environment=WAHLHELFER_WEB_ROOT={{wahlhelfer_web_root}}/
+ExecStart=/usr/bin/uwsgi --ini /etc/uwsgi/apps-available/{{ wahlhelfer_name }}.ini
+Restart=always
+KillSignal=SIGQUIT
+Type=notify
+NotifyAccess=all
+
+[Install]
+WantedBy=multi-user.target
diff --git a/wahlsystem/defaults/main.yml b/wahlsystem/defaults/main.yml
index c3d626f..9f73256 100644
--- a/wahlsystem/defaults/main.yml
+++ b/wahlsystem/defaults/main.yml
@@ -1,8 +1,28 @@
 ---
-# file: roles/protokollsystem/defaults/main.yml
+# file: wahlsystem/defaults/main.yml
 
-wahl_web_root: /var/www/wahlsystem
+wahl_web_root: /var/www/wahlsystem/program
 wahl_name: wahlsystem
 wahl_user: wahl
 wahl_group: wahl
 wahl_celery_concurrency: 1
+wahl_ldap_cert: /etc/ssl/certs/rwth_chain.pem
+
+wahl_secret: '***REMOVED***'
+wahl_mail: True
+wahl_mail_from: 'wahl@fsmpi.rwth-aachen.de'
+wahl_mail_host: 'mail.fsmpi.rwth-aachen.de:25'
+wahl_mail_user: ''
+wahl_mail_password: ''
+wahl_mail_tls: False
+wahl_mail_prefix: 'Wahlsystem'
+wahl_celery_broker: 'redis://localhost:6379/0'
+wahl_server_name: 'wahl.stud.rwth-aachen.de'
+wahl_url_root: 'wahl.stud.rwth-aachen.de'
+wahl_url_proto: 'https'
+wahl_url_path: '/'
+wahl_mailman_api_url: 'https://lists.fsmpi.rwth-aachen.de/mailmanAPI'
+wahl_mailman_api_key: '***REMOVED***'
+wahl_mailman_default_newpw: 'LnbVEiblyk8qhzmvjJhS'
+wahl_mailman_host: 'lists.fsmpi.rwth-aachen.de'
+
diff --git a/wahlsystem/handlers/main.yml b/wahlsystem/handlers/main.yml
index 05605fd..99db741 100644
--- a/wahlsystem/handlers/main.yml
+++ b/wahlsystem/handlers/main.yml
@@ -1,14 +1,16 @@
 ---
-# file: roles/protokollsystem/handlers/main.yml
+# file: wahlsystem/handlers/main.yml
 
 - name: reload systemd service files
   command: systemctl daemon-reload
 
 - name: restart uwsgi for wahlsystem
-  service: name="{{item}}" state=restarted enabled=yes
+  service:
+    name: "{{ item }}"
+    state: restarted
   with_items:
-    - "{{wahl_name}}"
-    - "{{wahl_name}}-celery"
+    - "{{ wahl_name }}"
+    - "{{ wahl_name }}-celery"
 
 - name: create tmpfiles
   command: systemd-tmpfiles --create
diff --git a/wahlsystem/meta/main.yml b/wahlsystem/meta/main.yml
index 775dd3a..2a053bf 100644
--- a/wahlsystem/meta/main.yml
+++ b/wahlsystem/meta/main.yml
@@ -1,9 +1,6 @@
 ---
-# file:roles/protokollsystem/meta/main.yml
+# file: wahlsystem/meta/main.yml
 dependencies:
-  - { role: webserver }
-  - { role: redis-server }
-  - { role: postgres }
   - { role: texlive }
   - { role: cups-client }
   - { role: uwsgi-python, uwsgi_name: "{{wahl_name}}", uwsgi_user: "{{wahl_user}}", uwsgi_group: "{{wahl_group}}", uwsgi_path: "{{wahl_web_root}}/program", uwsgi_home: "{{wahl_web_root}}", uwsgi_program: "server.py", uwsgi_callable: "app", uwsgi_command: "runserver", uwsgi_db: "postgres", uwsgi_python: 3, uwsgi_mules: 0, uwsgi_harakiri: 30 }
diff --git a/wahlsystem/tasks/main.yml b/wahlsystem/tasks/main.yml
index f099e78..fd2f27c 100644
--- a/wahlsystem/tasks/main.yml
+++ b/wahlsystem/tasks/main.yml
@@ -1,98 +1,93 @@
 ---
-# file: roles/wahlsystem/tasks/main.yml
+# file: wahlsystem/tasks/main.yml
 
-- name: ensure we have the fonts
-  apt: name="{{item}}" state=present
+- name: ensure we have the required software and fonts
+  apt:
+    name: "{{ item }}"
+    state: present
   with_items:
     - fontconfig
     - tex-gyre
+    - virtualenv
   tags:
-    - packages
     - wahlsystem
+    - webservices
 
-- name: ensure we have a folder for the program
-  file: path="{{wahl_web_root}}" state=directory owner="{{wahl_user}}" group="{{wahl_group}}" mode=0755
-  tags:
-    - directory
-    - wahlsystem
-
-- name: ensure we have a .ssh directory
-  file: path="{{wahl_web_root}}/.ssh" state=directory owner="{{wahl_user}}" group="{{wahl_group}}" mode=0755
-  tags:
-    - directory
-    - wahlsystem
-
-- name: ensure we have our deploy key
-  copy: src="{{item}}" dest="{{wahl_web_root}}/.ssh/" owner="{{wahl_user}}" group="{{wahl_group}}" mode=0600
-  with_items:
-    - deploy-key
-    - deploy-key.pub
+- name: ensure the deploy key is available
+  copy:
+    src: "{{ wahl_deploy_key }}"
+    dest: /root/.ssh/wahlsystem
+    owner: root
+    group: root
+    mode: 0600
   tags:
-    - ssh
     - wahlsystem
+    - webservices
 
-- name: ensure we have our .ssh config
-  template: src=config dest="{{wahl_web_root}}/.ssh/config" owner="{{wahl_user}}" group="{{wahl_group}}" mode=0644
+# https://github.com/ansible/ansible/issues/27699
+- name: ensure fucking git module is able to clone
+  command: mount -o remount,exec /tmp
   tags:
-    - ssh
     - wahlsystem
+    - webservices
 
-- name: ensure we have the program
-  git: repo=git@git.fsmpi.rwth-aachen.de:wahl/wahlsys.git dest="{{wahl_web_root}}/program"
-  become: yes
-  become_user: "{{wahl_user}}"
+- name: ensure the git is at the current revision
+  git:
+    repo: git@git.fsmpi.rwth-aachen.de:wahl/wahlsys.git
+    dest: "{{ wahl_web_root }}"
+    key_file: /root/.ssh/wahlsystem
+    version: HEAD
   notify:
     - restart uwsgi for wahlsystem
   tags:
-    - git
     - wahlsystem
+    - webservices
 
-- name: ensure we have virtualenv installed
-  apt: name=virtualenv state=present
+- name: ensure fucking git module is not able to clone anymore
+  command: mount -o remount,noexec /tmp
   tags:
-    - packages
     - wahlsystem
+    - webservices
 
 - name: ensure we have a virtualenv
   pip:
-    requirements: "{{wahl_web_root}}/program/requirements.txt"
-    virtualenv: "{{wahl_web_root}}/program"
+    requirements: "{{ wahl_web_root }}/requirements.txt"
+    virtualenv: "{{ wahl_web_root }}"
     virtualenv_python: python3
-  become: yes
-  become_user: "{{wahl_user}}"
   notify:
     - restart uwsgi for wahlsystem
   tags:
-    - pip
-    - python
     - wahlsystem
+    - webservices
 
-- name: ensure we have the necessary folders
-  file: name={{item}} state=directory owner="{{wahl_user}}" group="{{wahl_group}}" mode=0755
-  with_items:
-    - "{{wahl_web_root}}/program/blogfiles"
+- name: ensure we have the necessary folder
+  file:
+    name: "{{ wahl_web_root }}/blogfiles"
+    state: directory
+    owner: "{{ wahl_user }}"
+    group: "{{ wahl_group }}"
+    mode: 0755
   tags:
-    - directories
     - wahlsystem
+    - webservices
 
 - name: ensure we have our config
   template:
-    src: config.py
-    dest: "{{wahl_web_root}}/program/config.py"
-    owner: "{{wahl_user}}"
-    group: "{{wahl_group}}"
+    src: config.py.j2
+    dest: "{{ wahl_web_root }}/config.py"
+    owner: "{{ wahl_user }}"
+    group: "{{ wahl_group }}"
     mode: 0644
   notify:
     - restart uwsgi for wahlsystem
   tags:
-    - config
-    - python
     - wahlsystem
+    - webservices
 
 - name: ensure the unit file exists
   template:
-    src: wahlsystem.service
-    dest: "/etc/systemd/system/{{wahl_name}}.service"
+    src: wahlsystem.service.j2
+    dest: "/etc/systemd/system/{{ wahl_name }}.service"
     owner: root
     group: root
     mode: 0644
@@ -100,14 +95,13 @@
     - reload systemd service files
     - restart uwsgi for wahlsystem
   tags:
-    - config
-    - systemd
     - wahlsystem
+    - webservices
 
 - name: ensure the celery unit file exists
   template:
-    src: celery.service
-    dest: "/etc/systemd/system/{{wahl_name}}-celery.service"
+    src: celery.service.j2
+    dest: "/etc/systemd/system/{{ wahl_name }}-celery.service"
     owner: root
     group: root
     mode: 0644
@@ -115,19 +109,19 @@
     - reload systemd service files
     - restart uwsgi for wahlsystem
   tags:
-    - config
-    - systemd
-    - celery
     - wahlsystem
+    - webservices
 
 - meta: flush_handlers
 
 - name: ensure the services are enabled
-  service: name="{{item}}" enabled=yes
+  service:
+    name: "{{ item }}"
+    enabled: yes
+    state: started
   with_items:
-    - "{{wahl_name}}"
-    - "{{wahl_name}}-celery"
+    - "{{ wahl_name }}"
+    - "{{ wahl_name }}-celery"
   tags:
-    - config
-    - systemd
     - wahlsystem
+    - webservices
diff --git a/wahlsystem/templates/celery.service b/wahlsystem/templates/celery.service
deleted file mode 100644
index 0f46cf2..0000000
--- a/wahlsystem/templates/celery.service
+++ /dev/null
@@ -1,14 +0,0 @@
-[Unit]
-Description=Wahlsystem-Celery
-After=network.target
-
-[Service]
-User={{wahl_user}}
-Group={{wahl_group}}
-WorkingDirectory={{wahl_web_root}}/program
-Environment=VIRTUAL_ENV="{{wahl_web_root}}/program"
-ExecStart={{wahl_web_root}}/program/bin/celery -A server.celery worker --loglevel=DEBUG --concurrency={{wahl_celery_concurrency}}
-Restart=always
-
-[Install]
-WantedBy=multi-user.target
diff --git a/wahlsystem/templates/celery.service.j2 b/wahlsystem/templates/celery.service.j2
new file mode 100644
index 0000000..8f14b5f
--- /dev/null
+++ b/wahlsystem/templates/celery.service.j2
@@ -0,0 +1,14 @@
+[Unit]
+Description=Wahlsystem-Celery
+After=network.target
+
+[Service]
+User={{ wahl_user }}
+Group={{ wahl_group }}
+WorkingDirectory={{ wahl_web_root }}
+Environment=VIRTUAL_ENV="{{ wahl_web_root }}"
+ExecStart={{ wahl_web_root }}/bin/celery -A server.celery worker --loglevel=DEBUG --concurrency={{ wahl_celery_concurrency }}
+Restart=always
+
+[Install]
+WantedBy=multi-user.target
diff --git a/wahlsystem/templates/config b/wahlsystem/templates/config
deleted file mode 100644
index bbcaec7..0000000
--- a/wahlsystem/templates/config
+++ /dev/null
@@ -1,4 +0,0 @@
-Host git.fsmpi.rwth-aachen.de
-HostName git.fsmpi.rwth-aachen.de
-User git
-IdentityFile {{wahl_web_root}}/.ssh/deploy-key
diff --git a/wahlsystem/templates/config.py b/wahlsystem/templates/config.py
deleted file mode 100644
index 7597a1f..0000000
--- a/wahlsystem/templates/config.py
+++ /dev/null
@@ -1,26 +0,0 @@
-SQLALCHEMY_DATABASE_URI = "postgresql://{{wahl_user}}:@/{{wahl_name}}"
-SQLALCHEMY_TRACK_MODIFICATIONS = False
-SECRET_KEY = "***REMOVED***"
-DEBUG = False
-MAIL_ACTIVE = True
-MAIL_FROM = "wahl@fsmpi.rwth-aachen.de"
-MAIL_HOST = "mail.fsmpi.rwth-aachen.de:25"
-MAIL_USER = None
-MAIL_PASSWORD = None
-MAIL_USE_TLS = False
-MAIL_PREFIX = "Wahlsystem"
-#CELERY_BROKER_URL = "sqla+postgresql://user:password@host/message-database"
-#CELERY_BROKER_URL = "redis+socket:///run/redis/redis.sock"
-CELERY_BROKER_URL = "redis://localhost:6379/0"
-CELERY_TASK_SERIALIZER = "pickle"
-CELERY_ACCEPT_CONTENT = ["pickle"]
-SERVER_NAME = "wahl.stud.rwth-aachen.de"
-PREFERRED_URL_SCHEME = "https"
-URL_ROOT = "wahl.stud.rwth-aachen.de"
-URL_PROTO = "https"
-URL_PATH = "/"
-URL_PARAMS = ""
-MAILMAN_API_URL = "https://lists.fsmpi.rwth-aachen.de/mailmanAPI"
-MAILMAN_API_KEY = "***REMOVED***"
-MAILMAN_DEFAULT_NEW_PASSWORD = "LnbVEiblyk8qhzmvjJhS"
-MAILMAN_HOST = "lists.fsmpi.rwth-aachen.de"
diff --git a/wahlsystem/templates/config.py.j2 b/wahlsystem/templates/config.py.j2
new file mode 100644
index 0000000..155f62c
--- /dev/null
+++ b/wahlsystem/templates/config.py.j2
@@ -0,0 +1,33 @@
+SQLALCHEMY_DATABASE_URI = "postgresql://{{ wahl_user }}:@/{{ wahl_name }}"
+SQLALCHEMY_TRACK_MODIFICATIONS = False
+SECRET_KEY = "{{ wahl_secret }}"
+DEBUG = False
+MAIL_ACTIVE = {{ wahl_mail }}
+MAIL_FROM = "{{ wahl_mail_from }}"
+MAIL_HOST = "{{ wahl_mail_host }}"
+MAIL_USER = "{{ wahl_mail_user }}"
+MAIL_PASSWORD = "{{ wahl_mail_password }}"
+{% if wahl_mail_tls == 'tls' %}
+MAIL_USE_TLS = True
+MAIL_USE_STARTTLS = False
+{% else if wahl_mail_tls == 'starttls' %}
+MAIL_USE_TLS = False
+MAIL_USE_STARTTLS = True
+{% else %}
+MAIL_USE_TLS = False
+MAIL_USE_STARTTLS = False
+{% endif %}
+MAIL_PREFIX = "{{ wahl_mail_prefix }}"
+CELERY_BROKER_URL = "{{ wahl_celery_broker }}"
+CELERY_TASK_SERIALIZER = "pickle"
+CELERY_ACCEPT_CONTENT = ["pickle"]
+SERVER_NAME = "{{ wahl_server_name }}"
+PREFERRED_URL_SCHEME = "{{ wahl_url_proto }}"
+URL_ROOT = "{{ wahl_url_root }}"
+URL_PROTO = "{{ wahl_url_proto }}"
+URL_PATH = "{{ wahl_url_path }}"
+URL_PARAMS = ""
+MAILMAN_API_URL = "{{ wahl_mailman_api_url }}"
+MAILMAN_API_KEY = "{{ wahl_mailman_api_key }}"
+MAILMAN_DEFAULT_NEW_PASSWORD = "{{ wahl_mailman_default_newpw }}"
+MAILMAN_HOST = "{{ wahl_mailman_host }}"
diff --git a/wahlsystem/templates/wahlsystem.service b/wahlsystem/templates/wahlsystem.service.j2
similarity index 54%
rename from wahlsystem/templates/wahlsystem.service
rename to wahlsystem/templates/wahlsystem.service.j2
index 29ea167..c035bba 100644
--- a/wahlsystem/templates/wahlsystem.service
+++ b/wahlsystem/templates/wahlsystem.service.j2
@@ -4,8 +4,10 @@ After=network.target
 Wants=wahlsystem-celery.service
 
 [Service]
-Environment=LDAPTLS_CACERT=/etc/ssl/certs/rwth_chain.pem
-ExecStart=/usr/bin/uwsgi --ini /etc/uwsgi/apps-available/{{wahl_name}}.ini
+{% if wahl_ldap_cert %}
+Environment=LDAPTLS_CACERT={{ wahl_ldap_cert }}
+{% endif %}
+ExecStart=/usr/bin/uwsgi --ini /etc/uwsgi/apps-available/{{ wahl_name }}.ini
 Restart=always
 KillSignal=SIGQUIT
 Type=notify
diff --git a/webserver/files/tmpfiles.conf b/webserver/files/tmpfiles.conf
new file mode 100644
index 0000000..b13000c
--- /dev/null
+++ b/webserver/files/tmpfiles.conf
@@ -0,0 +1 @@
+d /run/nginx 0750 www-data nginx-proxy - -
diff --git a/webserver/handlers/main.yml b/webserver/handlers/main.yml
index e58a6ac..73b78fb 100644
--- a/webserver/handlers/main.yml
+++ b/webserver/handlers/main.yml
@@ -1,14 +1,18 @@
 ---
-# file: roles/webserver/handlers/main.yml
+# file: webserver/handlers/main.yml
 
 - name: reload systemd service files
   command: systemctl daemon-reload
 
 - name: restart nginx
-  service: name=nginx state=restarted
+  service:
+    name: nginx
+    state: restarted
 
 - name: restart nginx-proxy
-  service: name=nginx-proxy state=restarted
+  service:
+    name: nginx-proxy
+    state: restarted
 
 - name: create tmpfiles
   command: systemd-tmpfiles --create
diff --git a/webserver/tasks/main.yml b/webserver/tasks/main.yml
index 9738e07..8854d21 100644
--- a/webserver/tasks/main.yml
+++ b/webserver/tasks/main.yml
@@ -1,8 +1,10 @@
 ---
-# file: roles/webserver/tasks/main.yml
+# file: webserver/tasks/main.yml
 
 - name: ensure nginx is installed
-  apt: name={{ item }} state=latest
+  apt:
+    name: "{{ item }}"
+    state: installed
   with_items:
     - nginx
     - nginx-full
@@ -10,116 +12,164 @@
     - restart nginx
     - restart nginx-proxy
   tags:
-    - packages
     - nginx
+    - webservices
 
 - name: ensure we got our nginx config
-  copy: src=nginx.conf dest=/etc/nginx/nginx.conf owner=root group=root mode=0644
+  copy:
+    src: nginx.conf
+    dest: /etc/nginx/nginx.conf
+    owner: root
+    group: root
+    mode: 0644
   notify:
     - restart nginx
   tags:
-    - config
     - nginx
+    - webservices
 
 - name: ensure we got our nginx-proxy config
-  template: src=nginx-proxy.conf dest=/etc/nginx/nginx-proxy.conf owner=root group=root mode=0644
+  template:
+    src: nginx-proxy.conf.j2
+    dest: /etc/nginx/nginx-proxy.conf
+    owner: root
+    group: root
+    mode: 0644
   notify:
     - restart nginx-proxy
   tags:
-    - config
     - nginx
+    - webservices
 
 - name: ensure there is the nginx-proxy group
-  group: name=nginx-proxy state=present system=yes
+  group:
+    name: nginx-proxy
+    state: present
+    system: yes
   tags:
-    - config
     - nginx
+    - webservices
 
 - name: ensure there is the nginx-proxy user
-  user: name=nginx-proxy state=present group=nginx-proxy system=yes shell=/usr/sbin/nologin home=/var/www createhome=no
+  user:
+    name: nginx-proxy
+    state: present
+    group: nginx-proxy
+    system: yes
+    shell: /usr/sbin/nologin
+    home: /var/www
+    createhome: no
   tags:
-    - config
     - nginx
+    - webservices
 
 - name: ensure there is some tls-proxy config
-  template: src=tls-proxy.j2 dest=/etc/nginx/sites-available/tls-proxy owner=root group=root mode=0644 force=no
+  template:
+    src: tls-proxy.j2
+    dest: /etc/nginx/sites-available/tls-proxy
+    owner: root
+    group: root
+    mode: 0644
+    force: no
   notify:
     - restart nginx-proxy
   tags:
-    - config
     - nginx
+    - webservices
 
 - name: ensure there is some main config
-  copy: src=main dest=/etc/nginx/sites-available/main owner=root group=root mode=0644 force=no
+  copy:
+    src: main
+    dest: /etc/nginx/sites-available/main
+    owner: root
+    group: root
+    mode: 0644
+    force: no
   notify:
     - restart nginx
   tags:
-    - config
-    - nginx
-
-- name: ensure the main config is activated
-  file: path=/etc/nginx/sites-enabled/main state=link src=/etc/nginx/sites-available/main
-  notify:
-    - restart nginx
-  tags:
-    - config
     - nginx
+    - webservices
 
 - name: ensure there is the sso example snippet
-  copy: src="{{item}}" dest=/etc/nginx/snippets/ owner=root group=root mode=0644
+  copy:
+    src: "{{ item }}"
+    dest: /etc/nginx/snippets/
+    owner: root
+    group: root
+    mode: 0644
   with_items:
     - sso.conf
     - sso-auth.conf
     - sso-locations.conf
   tags:
-    - config
     - nginx
+    - webservices
 
 - name: ensure we have a directory for sockets
-  lineinfile:
+  copy:
+    src: tmpfiles.conf
     dest: /etc/tmpfiles.d/10-nginx.conf
-    line: "d /run/nginx 0750 www-data nginx-proxy - -"
-    create: yes
+    owner: root
+    group: root
+    mode: 0644
   notify:
     - create tmpfiles
   tags:
-    - config
     - nginx
+    - webservices
 
 - name: ensure the default config is not activated
-  file: path=/etc/nginx/sites-enabled/default state=absent
+  file:
+    path: /etc/nginx/sites-enabled/default
+    state: absent
   notify:
     - restart nginx
   tags:
-    - config
     - nginx
+    - webservices
 
 - name: ensure there is a lib dir for nginx-proxy
-  file: path=/var/lib/nginx-proxy state=directory owner=root group=root mode=0755
+  file:
+    path: /var/lib/nginx-proxy
+    state: directory
+    owner: root
+    group: root
+    mode: 0755
   tags:
-    - config
     - nginx
+    - webservices
 
 - name: ensure there is a nginx-proxy service
-  copy: src=nginx-proxy.service dest=/etc/systemd/system/nginx-proxy.service owner=root group=root mode=0644
+  copy:
+    src: nginx-proxy.service
+    dest: /etc/systemd/system/nginx-proxy.service
+    owner: root
+    group: root
+    mode: 0644
   notify:
     - reload systemd service files
     - restart nginx-proxy
   tags:
-    - service
     - nginx
+    - webservices
 
 - meta: flush_handlers
 
 - name: ensure nginx is enabled and running
-  service: name=nginx state=running enabled=yes
+  service:
+    name: nginx
+    state: started
+    enabled: yes
   tags:
-    - service
     - nginx
+    - webservices
 
 - name: ensure nginx-proxy is enabled and running
-  service: name=nginx-proxy state=running enabled=yes
+  service:
+    name: nginx-proxy
+    state: started
+    enabled: yes
   tags:
-    - service
     - nginx
-
+    - webservices
diff --git a/webserver/templates/nginx-proxy.conf b/webserver/templates/nginx-proxy.conf.j2
similarity index 100%
rename from webserver/templates/nginx-proxy.conf
rename to webserver/templates/nginx-proxy.conf.j2
diff --git a/wordpress/defaults/main.yml b/wordpress/defaults/main.yml
index 4d3d5e4..45f4a4b 100644
--- a/wordpress/defaults/main.yml
+++ b/wordpress/defaults/main.yml
@@ -1,5 +1,5 @@
 ---
-# file: roles/wordpress/defaults/main.yml
+# file: wordpress/defaults/main.yml
 
 wordpress_web_root: /var/www
 
diff --git a/wordpress/handlers/main.yml b/wordpress/handlers/main.yml
index a1d5ccf..54ac6b8 100644
--- a/wordpress/handlers/main.yml
+++ b/wordpress/handlers/main.yml
@@ -1,11 +1,13 @@
 ---
-# file: roles/wordpress/handlers/main.yml
+# file: wordpress/handlers/main.yml
 
 - name: reload systemd service files
   command: systemctl daemon-reload
 
 - name: "restart uwsgi for {{ wordpress_name }}"
-  service: "name=wordpress-{{ wordpress_name }} state=restarted enabled=yes"
+  service:
+    name: "wordpress-{{ wordpress_name }}"
+    state: restarted
 
 - name: create tmpfiles
   shell: systemd-tmpfiles --create
diff --git a/wordpress/meta/main.yml b/wordpress/meta/main.yml
index 2324e43..a473674 100644
--- a/wordpress/meta/main.yml
+++ b/wordpress/meta/main.yml
@@ -1,6 +1,5 @@
 ---
-# file: roles/wordpress/meta/main.yml
+# file: wordpress/meta/main.yml
 
 dependencies:
   - { role: uwsgi-php }
-  - { role: mysql }
diff --git a/wordpress/tasks/main.yml b/wordpress/tasks/main.yml
index afda9ba..2089dca 100644
--- a/wordpress/tasks/main.yml
+++ b/wordpress/tasks/main.yml
@@ -1,17 +1,35 @@
 ---
-# file: roles/wordpress/tasks/main.yml
+# file: wordpress/tasks/main.yml
 
 - name: ensure we have aufs tools
-  apt: name=aufs-tools state=latest install_recommends=no
+  apt:
+    name: aufs-tools
+    state: installed
+    install_recommends: no
   tags:
-    - packages
     - wordpress
-
-- name: ensure the wordpress package from backports is installed
-  apt: name=wordpress state=latest install_recommends=no default-release=jessie-backports
+    - webservices
+
+- name: ensure the wordpress package is installed
+  apt:
+    name: wordpress
+    state: installed
+    install_recommends: no
+    default-release: jessie-backports
+  when: debian_version == 'jessie'
+  tags:
+    - wordpress
+    - webservices
+
+- name: ensure the wordpress package is installed
+  apt:
+    name: wordpress
+    state: installed
+    install_recommends: no
+  when: debian_version == 'stretch'
   tags:
-    - packages
     - wordpress
+    - webservices
 
 - name: "ensure group for {{ wordpress_name }} exists"
   group:
@@ -19,9 +37,8 @@
     state: present
     system: yes
   tags:
-    - users
-    - config
     - wordpress
+    - webservices
 
 - name: "ensure user for {{ wordpress_name }} exists"
   user:
@@ -33,9 +50,8 @@
     home: "{{ wordpress_web_root }}"
     createhome: no
   tags:
-    - users
-    - config
     - wordpress
+    - webservices
 
 - name: "ensure the wordpress folders for {{ wordpress_name }} exists"
   file:
@@ -48,8 +64,8 @@
     - "{{ wordpress_name }}-files"
     - "{{ wordpress_name }}"
   tags:
-    - config
     - wordpress
+    - webservices
 
 - name: "ensure local folders without write permissions for {{ wordpress_name }} exist"
   file:
@@ -61,8 +77,8 @@
   with_items:
     - wp-content
   tags:
-    - config
     - wordpress
+    - webservices
 
 - name: "ensure local folders with write permissions for {{ wordpress_name }} exist"
   file:
@@ -78,39 +94,40 @@
     - wp-content/themes
     - wp-content/upgrade
   tags:
-    - config
     - wordpress
+    - webservices
 
 - name: "ensure the directories for {{ wordpress_name }} are mounted above each other"
   mount:
     state: mounted
     fstype: aufs
     name: "{{ wordpress_web_root }}/{{ wordpress_name }}/"
-    opts: "br={{ wordpress_web_root }}/{{ wordpress_name }}-files/:/usr/share/wordpress"
+    opts: "br={{ wordpress_web_root }}/{{ wordpress_name }}-files/:/usr/share/wordpress,udba=reval"
     src: none
   tags:
-    - mount
-    - config
     - wordpress
+    - webservices
 
 - name: "ensure temporary directories for {{ wordpress_name }} exist"
-  lineinfile:
+  template:
+    src: tmpfiles.conf.j2
     dest: "/etc/tmpfiles.d/10-wordpress-{{ wordpress_name }}.conf"
-    line: "d /run/uwsgi/app/wordpress-{{ wordpress_name }} 0775 {{ wordpress_user }} {{ wordpress_group }} - -"
-    create: yes
+    owner: root
+    group: root
+    mode: 0644
   notify:
-  - create tmpfiles
+    - create tmpfiles
   tags:
-    - config
     - wordpress
+    - webservices
 
 - name: "ensure the config for {{ wordpress_name }} exists"
   template:
     src: wp-config.php.j2
     dest: "{{ wordpress_web_root }}/{{ wordpress_name }}-files/wp-config.php"
   tags:
-    - config
     - wordpress
+    - webservices
 
 - name: "get randomness for secrets for {{ wordpress_name }}"
   set_fact:
@@ -129,8 +146,8 @@
     dest: "{{ wordpress_web_root }}/{{ wordpress_name }}-files/secrets.php"
     force: no
   tags:
-    - config
     - wordpress
+    - webservices
 
 - name: "ensure wordpress can access javascript files that debian places somewhere else"
   file:
@@ -138,8 +155,8 @@
     dest: "{{ wordpress_web_root }}/javascript"
     state: link
   tags:
-    - config
     - wordpress
+    - webservices
 
 - include: mysql.yml
 
@@ -150,8 +167,8 @@
   notify:
     - "restart uwsgi for {{ wordpress_name }}"
   tags:
-    - config
     - wordpress
+    - webservices
 
 - name: "ensure the unit file for {{ wordpress_name }} exists"
   template:
@@ -161,16 +178,14 @@
     - reload systemd service files
     - "restart uwsgi for {{ wordpress_name }}"
   tags:
-    - config
     - wordpress
-    - service
+    - webservices
   
 - name: "ensure the service for {{ wordpress_name }} is running"
   service:
     name: "wordpress-{{ wordpress_name }}"
-    state: running
+    state: started
     enabled: yes
   tags:
-    - config
     - wordpress
-    - service
+    - webservices
diff --git a/wordpress/tasks/mysql.yml b/wordpress/tasks/mysql.yml
index 9e1fc51..903e40a 100644
--- a/wordpress/tasks/mysql.yml
+++ b/wordpress/tasks/mysql.yml
@@ -1,35 +1,34 @@
 ---
-# file: roles/wordpress/tasks/mysql.yml
+# file: wordpress/tasks/mysql.yml
 
-- name: "ensure php can talk with mysql"
-  apt: name=php5-mysql state=latest
+- name: ensure php can talk with mysql
+  apt:
+    name: php5-mysql
+    state: latest
+  when: debian_version == 'jessie'
   tags:
-    - packages
-    - mysql
     - wordpress
+    - webservices
 
-- name: "get database password for {{ wordpress_name }}"
-  local_action: pass name="db/{{ wordpress_dbhost }}-{{ wordpress_dbtype }}" state=present generate=20 store=FSMPI_PASSWORD_STORE_DIR limit=yes
-  #local_action: "pass store=FSMPI_PASSWORD_STORE_DIR name=db/{{ wordpress_dbhost }}-{{ wordpress_dbtype }} limit=True"
-  register: wordpress_db_login_password
-  no_log: True
+- name: ensure php can talk with mysql
+  apt:
+    name: php-mysql
+    state: latest
+  when: debian_version == 'stretch'
   tags:
-    - config
-    - password
     - wordpress
-    - mysql
+    - webservices
 
 - name: "ensure the database for {{ wordpress_name }} exists"
   mysql_db:
     name: "{{ wordpress_dbname }}"
     state: present
     login_user: root
-    login_password: "{{ wordpress_db_login_password.password }}"
+    login_password: "{{ lookup('passwordstore', 'db/{{ wordpress_dbhost }}-{{ wordpress_dbtype }} create=true length=20')}}"
   no_log: True
   tags:
-    - mysql
-    - config
     - wordpress
+    - webservices
 
 - name: "ensure the database user for {{ wordpress_name }} exists"
   mysql_user:
@@ -37,11 +36,10 @@
     password: "{{ wordpress_dbpassword }}"
     state: present
     login_user: root
-    login_password: "{{ wordpress_db_login_password.password }}"
+    login_password: "{{ lookup('passwordstore', 'db/{{ wordpress_dbhost }}-{{ wordpress_dbtype }} create=true length=20')}}"
     priv: "{{ wordpress_dbname }}.*:ALL"
   no_log: True
   tags:
-    - mysql
-    - config
     - wordpress
+    - webservices
 
diff --git a/wordpress/templates/tmpfiles.conf.j2 b/wordpress/templates/tmpfiles.conf.j2
new file mode 100644
index 0000000..20bc5ac
--- /dev/null
+++ b/wordpress/templates/tmpfiles.conf.j2
@@ -0,0 +1 @@
+d /run/uwsgi/app/wordpress-{{ wordpress_name }} 0775 {{ wordpress_user }} {{ wordpress_group }} - -
-- 
GitLab