diff --git a/Jenkinsfile b/Jenkinsfile
index 4d920e8872ea067683b8738792345d1cd4234f53..a7841074d821b35966542027e316e54cfadb3779 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -1,6 +1,8 @@
 #!/usr/bin/env groovy
 @Library('jenkins-pipeline@1.0.9') _
 
+def stage_required = [web: false, build: false, data: false, full: false]
+
 pipeline {
   agent none
   options {
@@ -14,12 +16,52 @@ pipeline {
       steps {
         sh "git config core.whitespace -blank-at-eof"
         sh "git diff --check `git merge-base origin/master HEAD` HEAD -- . ':!*.md' ':!*.pandoc'"
+
+        // ********* Check changesets for conditional stage execution **********
+        script {
+          if (currentBuild.number == 1) {
+            stage_required.full = true
+            return true
+          }
+          if (env.JOB_NAME == "ufz/ogs/master") {
+            stage_required.web = true
+          }
+          def changeLogSets = currentBuild.changeSets
+          for (int i = 0; i < changeLogSets.size(); i++) {
+            def entries = changeLogSets[i].items
+            for (int j = 0; j < entries.length; j++) {
+              def paths = new ArrayList(entries[j].affectedPaths)
+              for (int p = 0; p < paths.size(); p++) {
+                def path = paths[p]
+                if (path.matches("Jenkinsfile")) {
+                  stage_required.full = true
+                  echo "Doing full build."
+                  return true
+                }
+                if (path.startsWith("web") && !stage_required.web) {
+                  stage_required.web = true
+                  echo "Doing web build."
+                }
+                if (path.matches("^(CMakeLists.txt|scripts|Applications|BaseLib|FileIO|GeoLib|MaterialLib|MathLib|MeshGeoToolsLib|MeshLib|NumLib|ProcessLib|SimpleTests|Tests).*")
+                  && !stage_required.build) {
+                  stage_required.build = true
+                  echo "Doing regular build."
+                }
+                if (path.startsWith("Tests/Data") && !stage_required.data) {
+                  stage_required.data = true
+                  echo "Updating Tests/Data."
+                }
+              }
+            }
+          }
+        }
       }
     }
     stage('Build') {
       parallel {
         // ************************ Docker-Conan *******************************
         stage('Docker-Conan') {
+          when { expression { return stage_required.build || stage_required.full } }
           agent {
             dockerfile {
               filename 'Dockerfile.gcc.full'
@@ -94,6 +136,7 @@ pipeline {
         }
         // ********************* Docker-Conan-Debug ****************************
         stage('Docker-Conan-Debug') {
+          when { expression { return stage_required.build || stage_required.full } }
           agent {
             dockerfile {
               filename 'Dockerfile.gcc.minimal'
@@ -128,6 +171,7 @@ pipeline {
         }
         // ************************** envinf1 **********************************
         stage('Envinf1 (serial)') {
+          when { expression { return stage_required.build || stage_required.full } }
           agent { label "envinf1"}
           steps {
             script {
@@ -160,6 +204,7 @@ pipeline {
           }
         }
         stage('Envinf1 (parallel)') {
+          when { expression { return stage_required.build || stage_required.full } }
           agent { label "envinf1"}
           steps {
             script {
@@ -194,6 +239,7 @@ pipeline {
         }
         // ************************** Windows **********************************
         stage('Win') {
+          when { expression { return stage_required.build || stage_required.full } }
           agent {label 'win && conan' }
           environment {
             MSVC_NUMBER = '15'
@@ -243,6 +289,7 @@ pipeline {
         }
         // ****************************** Mac **********************************
         stage('Mac') {
+          when { expression { return stage_required.build || stage_required.full } }
           agent { label "mac"}
           steps {
             script {
@@ -286,6 +333,7 @@ pipeline {
         }
         // **************************** Web ************************************
         stage('Web') {
+          when { expression { return stage_required.web || stage_required.full } }
           agent {
             dockerfile {
               filename 'Dockerfile.gcc.full'
@@ -348,6 +396,7 @@ pipeline {
       parallel {
         // ************************* Analyzers *********************************
         stage('Analyzers') {
+          when { expression { return stage_required.build || stage_required.full } }
           agent {
             dockerfile {
               filename 'Dockerfile.clang.full'
@@ -380,16 +429,28 @@ pipeline {
         }
         // ************************* Deploy Web ********************************
         stage('Deploy Web') {
+          when { expression { return stage_required.web || stage_required.full } }
           agent any
           steps {
             dir('web') { unstash 'web' }
-            dir('doxygen') { unstash 'doxygen' }
             unstash 'known_hosts'
             script {
               sshagent(credentials: ['www-data_jenkins']) {
                 sh 'rsync -a --delete --stats -e "ssh -o UserKnownHostsFile=' +
                    'known_hosts" web/. ' +
                    'www-data@jenkins.opengeosys.org:/var/www/dev.opengeosys.org'
+              }
+            }
+          }
+        }
+        stage('Deploy Doxygen') {
+          when { expression { return stage_required.build || stage_required.full } }
+          agent any
+          steps {
+            dir('doxygen') { unstash 'doxygen' }
+            unstash 'known_hosts'
+            script {
+              sshagent(credentials: ['www-data_jenkins']) {
                 sh 'rsync -a --delete --stats -e "ssh -o UserKnownHostsFile=' +
                    'known_hosts" doxygen/. ' +
                    'www-data@jenkins.opengeosys.org:/var/www/doxygen.opengeosys.org'
@@ -399,6 +460,7 @@ pipeline {
         }
         // *********************** Deploy envinf1 ******************************
         stage('Deploy envinf1') {
+          when { expression { return stage_required.build || stage_required.full } }
           agent { label "envinf1"}
           steps {
             script {
@@ -427,6 +489,7 @@ pipeline {
         }
         // ******************** Deploy envinf1 PETSc ***************************
         stage('Deploy envinf1 PETSc') {
+          when { expression { return stage_required.build || stage_required.full } }
           agent { label "envinf1"}
           steps {
             script {
@@ -456,6 +519,7 @@ pipeline {
         }
         // ************************** Sanitizer ********************************
         stage('Sanitizer') {
+          when { expression { return stage_required.build || stage_required.full } }
           agent {
             dockerfile {
               filename 'Dockerfile.clang.minimal'
@@ -496,6 +560,7 @@ pipeline {
         }
         // ********************* Update ufz/ogs-data ***************************
         stage('Update ogs-data') {
+          when { expression { return stage_required.data } }
           agent any
           steps {
             script {