diff --git a/files/opendsa/.ssh/id_rsa b/files/opendsa/.ssh/id_rsa
deleted file mode 100755
index 7d3860f75730124c09d6a77e6c24133ede256ec5..0000000000000000000000000000000000000000
--- a/files/opendsa/.ssh/id_rsa
+++ /dev/null
@@ -1,27 +0,0 @@
------BEGIN RSA PRIVATE KEY-----
-MIIEpAIBAAKCAQEA1GjnhseuHiZdIpo5vpn8nhX94ZG8PS5LFgyy03VZQigC6NSJ
-G0HeVV5PoiJNsisDh251d/50kALNpNCuiAZqBGw8SuKxIbev8M4hLyy3IMLK9frY
-Ap6cefolxq5d/ZEz46kkrEFCg7oJiqvADtrhPYwz1jcKiTzdL6936POnrKv6Pcq5
-yhCu+cJ9avWUhCuk41tIX0SI7hl0Lm2KtP8jfyBepWc6Lq8E0xVOmwqQtf0flddu
-g8RfuHFTscl8wnyMSGLWa4Ps+Ihu1zsis7bSfGZjdHbxQT382VxemfkzE6FNGTZM
-4CtafhvF3ZuxjIrx658pCA34JSiKe/4Zlm/c3wIDAQABAoIBAES3k3+FBg1299aD
-8n55LsKt9q6NCUr5uQzvGsNSSYgfjaFpcNnCm30ev8CCPISRadjcoWAqj+cvIPxb
-Druu54l6wp6vbAKufFr5NL8gRjZxDlw5xLxEN/c2OBZovruTyCe0xsp7altXSlL0
-cXPc19Wjj/mTYPM5H42XxME2Yl53xUPi8OKrnZzyEJjrcdLeq8a4yusjdJOidW6O
-wXkk/cDvtMeZZWEEu4nBL3vnU7hXvdF90crwNYqScd1lWIriqjfKhEpAvyrlASSW
-tqURkbw0WIYas+jSexLV/bqmgPydsOHJ15TXKtIYUejpPKB5WEdiMECc286fMLCx
-ogVGoZECgYEA/z/bl2/+El3smoEgNv2xpQIyXgKKp19figxm9xJIqbAcN66JAn1R
-EiOFiEy5o33q6Yz1sZ5/n4e3zoj8HiVZHNqkpBtuleZJJ7XBM/NcUH+OUrke+tlV
-q7arNlx9uN6liGp9SfJwKYtUSH13Z3O7sEAt7OX+mzWj527zDROZQHMCgYEA1QjM
-bFkZx83Nj4Qklo+GvgJhq0+Vr4hQd/hLZmgGo3dKZ3McXUmM70A0ETOxyp4zzMep
-Hi5wYa/qdtdVi25S38NExqxFO+JbuXrHoM1XyxzQ3DooV1goaKPybJjoB64zmycx
-D+Ni9MEwMsP1X8kxGQr4A1Nh37sm2hAhWoZCcuUCgYEA7oGG+SyGpjbpfT2nEntf
-4SX6VmndkaPGrEIGfFuzVgvfchA+qfrbJC3Y+pFm7WQde3phokTOUA0LLYxGuQyB
-BjsvmMChRqRWOyrUi2ydGAL4xEeCsTcfnEImHbezKmmxF5UZ2V0WfVtZuBq01hAI
-kxqFT1Vh4TnwG7NKnS9xBg0CgYBouXeMt8xlnXU03PgDj7DkTVVoGqpx7Ofp4gRm
-5jKFP0ozSrIh5dtDbeNqpWf8PAMo4unvLVMPoqP3IeoqreRNnbd8lwk95AvFRWdH
-VEqZTaQa7vgP4AWVUysEWbKOvAMgfYav0c8+lI22FwDTwprBPdQoBmBx1JXH0vAi
-iSe3RQKBgQCPutMegWA+vLupD12XWdde3M5hi4Cd/PxcvJwJrUSjjwlbkHr8EAkZ
-3MXK9o+1Ssj4Ipf1T7VUfdE5uaFJjGLLiPmMAoHbqqPo/0nnsk5JCqJuagmMup0O
-rOQmrvbbDLRXndhb3YeoCtehTiONTMzW+dsdbCrrdnx5AzV4Akwlqw==
------END RSA PRIVATE KEY-----
diff --git a/files/opendsa/.ssh/id_rsa.pub b/files/opendsa/.ssh/id_rsa.pub
deleted file mode 100755
index 10096d594d4b37a8e9633dc021c89ce8b957869a..0000000000000000000000000000000000000000
--- a/files/opendsa/.ssh/id_rsa.pub
+++ /dev/null
@@ -1 +0,0 @@
-ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDUaOeGx64eJl0imjm+mfyeFf3hkbw9LksWDLLTdVlCKALo1IkbQd5VXk+iIk2yKwOHbnV3/nSQAs2k0K6IBmoEbDxK4rEht6/wziEvLLcgwsr1+tgCnpx5+iXGrl39kTPjqSSsQUKDugmKq8AO2uE9jDPWNwqJPN0vr3fo86esq/o9yrnKEK75wn1q9ZSEK6TjW0hfRIjuGXQubYq0/yN/IF6lZzourwTTFU6bCpC1/R+V126DxF+4cVOxyXzCfIxIYtZrg+z4iG7XOyKzttJ8ZmN0dvFBPfzZXF6Z+TMToU0ZNkzgK1p+G8Xdm7GMivHrnykIDfglKIp7/hmWb9zf opendsa@aes-devel.edu.liu.se
diff --git a/files/opendsa/.ssh/known_hosts b/files/opendsa/.ssh/known_hosts
deleted file mode 100755
index 8eb1a50ebef29e00ee9ba2f141ec6c849132d61a..0000000000000000000000000000000000000000
--- a/files/opendsa/.ssh/known_hosts
+++ /dev/null
@@ -1 +0,0 @@
-gitlab.ida.liu.se,130.236.180.82 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDAYihlTjGKAun+fT/4v1c7zW0+HmsniwuuxWMmHM+/Y1RK/31DyxV+oLpiACP+2cR/FJ5Ab2wGai4sgnrZqY+yDHHZFbTAThqXylJmIvm57U1J8yL1ayOJe7wQNwan13rmEfzBjrNCxn/aFcvwLutZx+sRsYYfFnGhLeULbaoIeysXm+qufL2TQib+GJzanL6uksiccJ9RiWVg7YewzsdP23DzBSZBJobggaX5bIGzVp2omwe0F4X0YgMZvUHBNWJRjbit56c92jirmLaHJNvl3J+xSIty1XaCp/0kg5Ws8jRV9iGDXRafPPcWn2T8p1S4vIYsAD6QH9Ec6hAKT9qn
diff --git a/files/opendsa/on_update.sh b/files/opendsa/on_update.sh
new file mode 100644
index 0000000000000000000000000000000000000000..d335cdcabe5bbfdfbb92530e32175ae168e73005
--- /dev/null
+++ b/files/opendsa/on_update.sh
@@ -0,0 +1,19 @@
+#!/bin/bash
+
+# This file is called whenever the OpenDSA repo was updated. This means we should re-check
+# the requirements.txt file and restart the service.
+
+# Note: This file is executed as root, so we drop back to the opendsa user before starting pip.
+
+function update_pip() {
+    cd
+    python3 -m pip install --user -r OpenDSA/server/requirements.txt
+}
+
+export -f update_pip
+
+# Run PIP as OpenDSA.
+sudo --user opendsa --group opendsa --set-home --preserve-env=update_pip -- bash -c update_pip
+
+# Then, we can restart the service.
+systemctl service restart opendsa.service
diff --git a/manifests/aes_broker.pp b/manifests/aes_broker.pp
index 0c5ce641a5ff61579a5b96a585098d18e333c7a6..89adf822716dfb41c0f99919456c7968f6256106 100644
--- a/manifests/aes_broker.pp
+++ b/manifests/aes_broker.pp
@@ -1,7 +1,7 @@
-class aes::broker {
+class aes::aes_broker {
 
   $broker_user = broker
-  $broker_group "${broker_user}"
+  $broker_group = "${broker_user}"
   $broker_home = "/srv/${broker_user}"
   $broker_service = "${broker_user}"
 
diff --git a/manifests/init.pp b/manifests/init.pp
index 737a228243f9edab45e4c99db23e8a3c4c98cbba..f33e6883af58426894faf031aba62782aefbac5b 100644
--- a/manifests/init.pp
+++ b/manifests/init.pp
@@ -4,7 +4,7 @@ class aes {
   include aes::opendsa
   include aes::squid_filter
   include aes::latex
-  include aes::broker
+  include aes::aes_broker
   include ::liurepo::centos_sclo_rh
 
   package {
diff --git a/manifests/opendsa.pp b/manifests/opendsa.pp
index 632f7f09911f04ccfa5526a0e713e97a07aaf400..448eb548359dead713c0a92571603707038821df 100644
--- a/manifests/opendsa.pp
+++ b/manifests/opendsa.pp
@@ -22,40 +22,22 @@ class aes::opendsa {
     mode => '0755',
   }
 
-  file { "${opendsa_home}/.ssh":
-    ensure => directory,
-    recurse => true,
-  # Is modes copied correctly by "recurse" option above? NO, but works
-  # chmod 0700 .ssh/id_rsa
-  # chmod 0744 .ssh/id_rsa.pub .ssh/known_hosts
-    purge => true,
-    force => true,
-    owner  => "${opendsa_user}",
-    group  => "${opendsa_group}",
-    mode => '0700',
-    source => "puppet:///modules/${module_name}/opendsa/.ssh",
-  }
-
-  exec { '/usr/bin/git clone --single-branch --branch exam git@gitlab.ida.liu.se:filst04/OpenDSA.git' : 
-    cwd => "${opendsa_home}",
-    creates => "${opendsa_home}/OpenDSA",
-    user => "${opendsa_user}",
-    group => "${opendsa_group}",
+  # This file will be executed as root, which is why we don't let anyone but root examine it.
+  file { "${opendsa_home}/on_update.sh":
+    ensure => present,
+    owner => root,
+    group => root,
+    mode  => '0600',
+    source => "puppet:///modules/${module_name}/opendsa/on_update.sh",
   }
 
- # Will this work? DANGEROUS, need service restart! Not needed.
-  # exec { '/usr/bin/git pull' : 
-  #   cwd => "${opendsa_home}/OpenDSA",
-  #   onlyif => "/bin/test -d ${opendsa_home}/OpenDSA/.git",
-  #   user => "${opendsa_user}",
-  #   group => "${opendsa_group}",
-  # }
-
- # Install python packets. Can this be run several times safely? (Idempotent?) YES
-  exec { '/usr/bin/python3 -m pip install --user -r OpenDSA/server/requirements.txt' : 
+  exec { 'update-repo':
+    command => "/opt/utils/update_repo.sh ${opendsa_home}/OpenDSA https://oauth2:taNPRZid9Hv6jJtdW_T8@gitlab.liu.se:opendsa/OpenDSA.git exam",
+    environment => [ "REPO_USER=${opendsa_user}", "REPO_GROUP=${opendsa_group}", "REPO_ON_UPDATE=${opendsa_home}/on_update.sh" ],
+    # This command will need to run "on_update" as root in order to restart the service.
+    user => root,
+    group => root,
     cwd => "${opendsa_home}",
-    user => "${opendsa_user}",
-    group => "${opendsa_group}",
   }
 
   file { "${opendsa_home}/manage.sh":