diff --git a/Jenkinsfile b/Jenkinsfile
index 0a5f73bb61823ed177c3685b8dbd252a54d8f864..6a890ee55f9b4da42250a4f8d52df5f4b5754fbb 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -97,7 +97,7 @@ pipeline {
             steps {
                 script {
                     FAILED_STAGE=env.STAGE_NAME
-                    IMAGE_TAG = "${env.BRANCH_NAME}-${VERSION}"
+                    IMAGE_TAG = generateImageTag()
 
                     container("maven-17"){
                         configFileProvider([configFile(fileId: 'maven-settings', variable: 'MAVEN_SETTINGS')]) {
@@ -162,7 +162,7 @@ pipeline {
                 }
             }
         }
-        stage('Deploy Goofy') {
+        stage('Tag and Push Docker Image') {
             when {
                 anyOf {
                     branch 'master'
@@ -173,49 +173,29 @@ pipeline {
             steps {
                 script {
                     FAILED_STAGE = env.STAGE_NAME
-                }
-                container("docker") {
-                    script {
-                        withCredentials([usernamePassword(credentialsId: 'jenkins-docker-login', usernameVariable: 'USER', passwordVariable: 'PASSWORD')]) {
-                            sh 'docker login docker.ozg-sh.de -u ${USER} -p ${PASSWORD}'
-
-                            if (env.BRANCH_NAME == 'release') {
-                                sh "docker tag docker.ozg-sh.de/goofy:${IMAGE_TAG} docker.ozg-sh.de/goofy:latest"
-                                sh 'docker push docker.ozg-sh.de/goofy:latest'
-                            }
-
-                            if (env.BRANCH_NAME == 'master') {
-                                sh "docker tag docker.ozg-sh.de/goofy:${IMAGE_TAG} docker.ozg-sh.de/goofy:snapshot-latest"
-                                sh 'docker push docker.ozg-sh.de/goofy:snapshot-latest'
-                            }
-                        }
+                
+                    if (env.BRANCH_NAME == 'master') {
+                        tagAndPushDockerImage('snapshot-latest')
+                    }
+                    else if (env.BRANCH_NAME == 'release') {
+                        tagAndPushDockerImage('latest')
                     }
                 }
             }
         }
-        stage('Rollout (kiel-dev & ea-dev) | (kiel-test $ sl-test) Goofy') {
+        stage('Trigger Dev rollout') {
             when {
-                anyOf {
-                    branch 'master'
-                    branch 'release'
-                }
+                branch 'master'
             }
-
             steps {
                 script {
                     FAILED_STAGE = env.STAGE_NAME
-                }
 
-                container("k8s"){
-                    script {
-                        if (env.BRANCH_NAME == 'master') {
-                            sh 'kubectl rollout restart deployment/goofy -n sh-kiel-dev'
-                            sh 'kubectl rollout status deployment/goofy -n sh-kiel-dev'
+                    checkoutProvisioningRepo()
 
-                            sh 'kubectl rollout restart deployment/goofy -n sh-ea-dev'
-                            sh 'kubectl rollout status deployment/goofy -n sh-ea-dev'
-                        }
-                    }
+                    setNewGoofyProvisioningVersion('dev')
+
+                    pushNewProvisioningVersion('dev')
                 }
             }
         }
@@ -287,6 +267,24 @@ pipeline {
             	}
 			}
         }
+        stage('Trigger Test | Stage rollout') {
+            when {
+                branch 'release'
+            }
+
+            steps {
+                script {
+                    FAILED_STAGE = env.STAGE_NAME
+
+                    checkoutProvisioningRepo()
+
+                    setNewGoofyProvisioningVersion('test')
+                    setNewGoofyProvisioningVersion('stage')
+
+                    pushNewProvisioningVersion('test stage')
+                }
+            }
+        }
     }
     post {
         failure {
@@ -299,6 +297,27 @@ pipeline {
     }
 }
 
+Void tagAndPushDockerImage(String newTag){
+    container("docker") {
+        withCredentials([usernamePassword(credentialsId: 'jenkins-docker-login', usernameVariable: 'USER', passwordVariable: 'PASSWORD')]) {
+            sh 'docker login docker.ozg-sh.de -u ${USER} -p ${PASSWORD}'
+
+            sh "docker tag docker.ozg-sh.de/goofy:${IMAGE_TAG} docker.ozg-sh.de/goofy:${newTag}"
+            sh "docker push docker.ozg-sh.de/goofy:${newTag}"
+        }
+    }
+}
+
+String generateImageTag() {
+    def imageTag = "${env.BRANCH_NAME}-${VERSION}"
+
+    if (env.BRANCH_NAME == 'master') {
+        imageTag += "-${env.GIT_COMMIT.take(7)}"
+    }
+
+    return imageTag
+}
+
 Void startEnvironment(String bezeichner, String stage, String imageTag, Boolean isEa) {
     setupAnsible(imageTag, stage, isEa)
 
@@ -338,7 +357,7 @@ Void setAnsibleKubeConfig() {
     }
 }
 
-Void checkoutProvisioningRepo(String stage) {   
+Void checkoutProvisioningRepo(String stage="") {   
     withCredentials([usernamePassword(credentialsId: 'jenkins-gitea-access-token', passwordVariable: 'TOKEN', usernameVariable: 'USER')]) {
         dir(stage) {
             sh 'git clone https://${USER}:${TOKEN}@git.ozg-sh.de/mgm/provisioning.git'
@@ -443,9 +462,15 @@ Void rolloutKopStack(String bezeichner, String stage) {
                     "kop_postfach_api_key":"", \
                     "install_afm_adapter":false, \
                     "install_fs_adapter":false, \
-                    "external_db_enabled":false}"""
+                    "external_db_enabled":false, \
+                    "disable_update":true}"""
 
-            sh "ansible-playbook playbooks/rollout.yml --extra-vars '${ansibleVars}'"
+            if (env.BRANCH_NAME == 'release') {
+                sh "ansible-playbook playbook/rollout.yml --extra-vars '${ansibleVars}'"
+            }
+            else {
+                sh "ansible-playbook playbooks/rollout.yml --extra-vars '${ansibleVars}'"                
+            }
         }
     }
 }
@@ -464,7 +489,12 @@ Void addKeycloakGroups(String bezeichner, String stage) {
             }"""
 
             dir("${stage}/provisioning") {
-                sh "ansible-playbook playbooks/add-keycloak-group.yml --extra-vars '${ansibleVars}'"
+                if (env.BRANCH_NAME == 'release') {
+                    sh "ansible-playbook playbook/add-keycloak-group.yml --extra-vars '${ansibleVars}'"
+                }
+                else {
+                    sh "ansible-playbook playbooks/add-keycloak-group.yml --extra-vars '${ansibleVars}'"
+                }
             }
     	}
     }
@@ -484,7 +514,12 @@ Void addKeycloakUser(String bezeichner, String stage) {
             }"""
 
             dir("${stage}/provisioning") {
-                sh "ansible-playbook playbooks/add-keycloak-user.yml --extra-vars '${ansibleVars}'"
+                if (env.BRANCH_NAME == 'release') {
+                    sh "ansible-playbook playbook/add-keycloak-user.yml --extra-vars '${ansibleVars}'"
+                }
+                else {
+                    sh "ansible-playbook playbooks/add-keycloak-user.yml --extra-vars '${ansibleVars}'"
+                }
             }
         }
     }
@@ -497,7 +532,12 @@ Void deleteKopStack(String bezeichner, String stage) {
                     "kop_env":"dev", \
                     "kop_bezeichner":${bezeichner}}"""
 
-            sh "ansible-playbook playbooks/delete-commune.yml --extra-vars '${ansibleVars}'"
+            if (env.BRANCH_NAME == 'release') {
+                sh "ansible-playbook playbook/delete-commune.yml --extra-vars '${ansibleVars}'"
+            }
+            else {
+                sh "ansible-playbook playbooks/delete-commune.yml --extra-vars '${ansibleVars}'"
+            }
         }
     }
 }
@@ -534,7 +574,6 @@ String runTests(String stageName, String bezeichner, String reportFolder) {
     }
 }
 
-
 String makeUrlConform(String input) {
     return input.replaceAll(/[^a-zA-Z0-9]+/, "").toLowerCase()
 }
@@ -558,7 +597,6 @@ String cutBranchNameForKeycloakRealm(String branchName, String stageName) {
     return branchName
 }
 
-
 String generateCypressConfig(String stage, String bezeichner, String testFolder) {
     def namespace = "sh-${bezeichner}-dev"
     def configName = "cypress-ci-"+testFolder+".json"
@@ -633,4 +671,36 @@ Void initHelmRepo() {
         sh 'helm repo add ozg-base-apps-snapshot https://nexus.ozg-sh.de/repository/ozg-base-apps-snapshot --username ${USER} --password ${PASSWORD}'
         sh 'helm repo add ozg-base-apps https://nexus.ozg-sh.de/repository/ozg-base-apps --username ${USER} --password ${PASSWORD}'
     }
+}
+
+Void setNewGoofyProvisioningVersion(String environment) {
+    dir("provisioning") {
+        def envFile = "inventories/group_vars/${environment}/versions"
+
+        if (env.BRANCH_NAME == 'release') {
+            envFile = "playbook/inventory/versions/${environment}.yml"
+        }
+        def envVersions = readYaml file: envFile
+
+        envVersions.versions.goofy.image.tag = IMAGE_TAG
+
+        writeYaml file: envFile, data: envVersions, overwrite: true
+    }
+}
+
+Void pushNewProvisioningVersion(String environment) {
+    withCredentials([usernamePassword(credentialsId: 'jenkins-gitea-access-token', passwordVariable: 'TOKEN', usernameVariable: 'USER')]) {       
+        dir('provisioning') {
+            if (env.BRANCH_NAME == 'release') {
+                sh 'git add playbook/inventory/versions/.'
+            }
+            else {
+                sh 'git add inventories/group_vars/*/versions'
+            }
+            sh 'git config user.email "jenkins@ozg.de"'
+            sh 'git config user.name "jenkins"'
+            sh "git commit -m 'jenkins rollout ${environment} goofy version ${IMAGE_TAG}'"
+            sh 'git push https://${USER}:${TOKEN}@git.ozg-sh.de/mgm/provisioning.git'
+        }
+    }
 }
\ No newline at end of file