diff --git a/BaseLib/DebugTools.h b/BaseLib/DebugTools.h
index 13a06a9307fd59eabf7757f379c178ddb41f5151..be80c7ebaae92b29a66b74c5002a29f5815b17bd 100644
--- a/BaseLib/DebugTools.h
+++ b/BaseLib/DebugTools.h
@@ -13,8 +13,9 @@
 
 #pragma once
 
-#include <ostream>
 #include <algorithm>
+#include <iterator>
+#include <ostream>
 #include <vector>
 
 template<typename T>
diff --git a/BaseLib/reorderVector.h b/BaseLib/reorderVector.h
index b5add30f5ea11deb59495d52fb7d75b7737224ed..23d42727ebc4cea09a8a990edf9e65cb56c4a1ad 100644
--- a/BaseLib/reorderVector.h
+++ b/BaseLib/reorderVector.h
@@ -13,6 +13,8 @@
 
 #pragma once
 
+#include <vector>
+
 namespace BaseLib
 {
 /**
diff --git a/CMakeLists.txt b/CMakeLists.txt
index b3e61d4f6c181492860857613e081e5b2270cbd2..2b2543286e4c0b3cc10b69317b6e88723b71c21f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -181,6 +181,8 @@ option(OGS_ENABLE_ELEMENT_CUBOID  "Build FEM elements for cuboids (quads, hexahe
 option(OGS_ENABLE_ELEMENT_PRISM   "Build FEM elements for prisms." ON)
 option(OGS_ENABLE_ELEMENT_PYRAMID "Build FEM elements for pyramids." ON)
 
+option(OGS_CHECK_HEADER_COMPILATION "Check header for standalone compilation." OFF)
+
 ###################
 ### Definitions ###
 ###################
@@ -263,6 +265,8 @@ include_directories( SYSTEM ${CMAKE_CURRENT_SOURCE_DIR}/ThirdParty/autocheck/inc
 include_directories( SYSTEM ${CMAKE_CURRENT_SOURCE_DIR}/ThirdParty/tclap/include )
 include_directories(SYSTEM ${CMAKE_CURRENT_SOURCE_DIR}/ThirdParty/vtkGUISupportQt)
 
+include(scripts/cmake/CheckHeaderCompilation.cmake)
+
 add_subdirectory( Applications )
 add_subdirectory( BaseLib )
 # TODO This is a hack but we have to make sure that Boost is built first
@@ -292,5 +296,7 @@ endif() # OGS_BUILD_TESTS
 configure_file("${CMAKE_CURRENT_SOURCE_DIR}/BaseLib/BuildInfo.cpp.in"
     "${CMAKE_CURRENT_BINARY_DIR}/BaseLib/BuildInfo.cpp" @ONLY)
 
+check_header_compilation()
+
 include(scripts/cmake/MarkVariablesAdvanced.cmake)
 unset(PRE_INSTALL_RUN CACHE)
diff --git a/GeoLib/QuadTree.h b/GeoLib/QuadTree.h
index c6572dfcb09efcee5b713dcc51157c5e0549a1cb..4d78eee59d10f01a9203a426d7d4b37fa67217d7 100644
--- a/GeoLib/QuadTree.h
+++ b/GeoLib/QuadTree.h
@@ -14,10 +14,11 @@
 
 #pragma once
 
+#include <cassert>
 #include <limits>
+#include <utility>
 
 #include <logog/include/logog.hpp>
-#include <utility>
 
 namespace GeoLib
 {
diff --git a/Jenkinsfile b/Jenkinsfile
index acbbdc2c7fbdb1034f19463de61968e613ee4163..327348f7bd39c0a34ca30f9b8e10869864c9fcbd 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -307,6 +307,33 @@ pipeline {
     stage('Master') {
       when { environment name: 'JOB_NAME', value: 'ufz/ogs/master' }
       parallel {
+        // ************************ Check-Header *******************************
+        stage('Check-Header') {
+          agent {
+            dockerfile {
+              filename 'Dockerfile.gcc.minimal'
+              dir 'scripts/docker'
+              label 'docker'
+              args '-v ccache:/home/jenkins/cache/ccache -v conan-cache:/home/jenkins/cache/conan'
+              additionalBuildArgs '--pull'
+            }
+          }
+          steps {
+            script {
+              lock(resource: "conanCache-${env.NODE_NAME}") {
+                sh 'find $CONAN_USER_HOME -name "system_reqs.txt" -exec rm {} \\;'
+                configure {
+                  cmakeOptions =
+                    '-DOGS_USE_CONAN=ON ' +
+                    '-DOGS_CONAN_BUILD=never '
+                  config = 'Debug'
+                }
+              }
+              build { target = 'check-header' }
+            }
+          }
+          post { always { dir('build') { deleteDir() } } }
+        }
         // ************************* Deploy Web ********************************
         stage('Deploy Web') {
           agent any
diff --git a/MaterialLib/Adsorption/ReactionSinusoidal.h b/MaterialLib/Adsorption/ReactionSinusoidal.h
index f0b3b0fda80a6e5a801c4edff3462127bb7007fe..47bfab022dcb62b635aee1835070da7d9a885938 100644
--- a/MaterialLib/Adsorption/ReactionSinusoidal.h
+++ b/MaterialLib/Adsorption/ReactionSinusoidal.h
@@ -13,6 +13,7 @@
 
 #include "Reaction.h"
 #include "BaseLib/ConfigTree.h"
+#include "BaseLib/Error.h"
 #include "BaseLib/StringTools.h"
 
 namespace Adsorption
diff --git a/MaterialLib/PorousMedium/UnsaturatedProperty/CapillaryPressure/CapillaryPressureSaturation.h b/MaterialLib/PorousMedium/UnsaturatedProperty/CapillaryPressure/CapillaryPressureSaturation.h
index e4eb317ecd1c64051f1f64bd2a7358d872cec99b..a8fe13a4b8faf4a6d9f5897c42c7add5171966b2 100644
--- a/MaterialLib/PorousMedium/UnsaturatedProperty/CapillaryPressure/CapillaryPressureSaturation.h
+++ b/MaterialLib/PorousMedium/UnsaturatedProperty/CapillaryPressure/CapillaryPressureSaturation.h
@@ -11,6 +11,7 @@
 
 #pragma once
 
+#include <limits>
 #include <string>
 
 namespace MaterialLib
diff --git a/NumLib/Assembler/SerialExecutor.h b/NumLib/Assembler/SerialExecutor.h
index 6ba4c6fe15b8595cdca8d856420ea0e62fe291c2..6ddfb3a47ba24ef1e517ce53a46473a3d7fa3cbe 100644
--- a/NumLib/Assembler/SerialExecutor.h
+++ b/NumLib/Assembler/SerialExecutor.h
@@ -12,6 +12,9 @@
 
 #pragma once
 
+#include <cstddef>
+#include <utility>
+
 namespace NumLib
 {
 
diff --git a/NumLib/Fem/Integration/IntegrationGaussPrism.h b/NumLib/Fem/Integration/IntegrationGaussPrism.h
index 19463f316ad47ded60c17fea6019826c57bb469c..6e97ee22ac1e28093fe798e7bc116055b806518d 100644
--- a/NumLib/Fem/Integration/IntegrationGaussPrism.h
+++ b/NumLib/Fem/Integration/IntegrationGaussPrism.h
@@ -9,6 +9,7 @@
 
 #pragma once
 
+#include "MathLib/TemplateWeightedPoint.h"
 #include "MathLib/Integration/GaussLegendre.h"
 #include "MathLib/Integration/GaussLegendreTri.h"
 
diff --git a/NumLib/Fem/Integration/IntegrationGaussPyramid.h b/NumLib/Fem/Integration/IntegrationGaussPyramid.h
index 91e1244aab394bdb91f1b7e806d7de6d168fce83..ad737e50b38f5b06d9f742bea5e8f0680c509073 100644
--- a/NumLib/Fem/Integration/IntegrationGaussPyramid.h
+++ b/NumLib/Fem/Integration/IntegrationGaussPyramid.h
@@ -9,6 +9,7 @@
 
 #pragma once
 
+#include "MathLib/TemplateWeightedPoint.h"
 #include "MathLib/Integration/GaussLegendrePyramid.h"
 
 namespace NumLib
diff --git a/NumLib/Fem/Integration/IntegrationGaussTet.h b/NumLib/Fem/Integration/IntegrationGaussTet.h
index e698dc357fe2b5ad81980d03a6a6bce6d09bc0b4..537f6d9940ba9d1c320172cd69a9add0d0da813c 100644
--- a/NumLib/Fem/Integration/IntegrationGaussTet.h
+++ b/NumLib/Fem/Integration/IntegrationGaussTet.h
@@ -9,6 +9,7 @@
 
 #pragma once
 
+#include "MathLib/TemplateWeightedPoint.h"
 #include "MathLib/Integration/GaussLegendreTet.h"
 
 namespace NumLib
diff --git a/NumLib/Fem/Integration/IntegrationGaussTri.h b/NumLib/Fem/Integration/IntegrationGaussTri.h
index 3af4e898d4b2ec6ebda96c57144ca8056cd3bcda..687663440b535b1da0185bbd7232215a924d4f93 100644
--- a/NumLib/Fem/Integration/IntegrationGaussTri.h
+++ b/NumLib/Fem/Integration/IntegrationGaussTri.h
@@ -14,6 +14,7 @@
 
 #pragma once
 
+#include "MathLib/TemplateWeightedPoint.h"
 #include "MathLib/Integration/GaussLegendreTri.h"
 
 namespace NumLib
diff --git a/NumLib/Fem/Integration/IntegrationPoint.h b/NumLib/Fem/Integration/IntegrationPoint.h
index 12c95a68c15885593fa8f3b807e14ff9be2e98ae..d8a5f859a126229aebac141efd745cb9c0ea46ff 100644
--- a/NumLib/Fem/Integration/IntegrationPoint.h
+++ b/NumLib/Fem/Integration/IntegrationPoint.h
@@ -9,6 +9,8 @@
 
 #pragma once
 
+#include "MathLib/TemplateWeightedPoint.h"
+
 namespace NumLib
 {
 /// Integration rule for point elements.
diff --git a/ProcessLib/BoundaryCondition/GenericNaturalBoundaryConditionLocalAssembler.h b/ProcessLib/BoundaryCondition/GenericNaturalBoundaryConditionLocalAssembler.h
index 4d37ae2394f299132cd049340b9e5062611bf611..219085cfc062f1d2a36ed66822919d96fc5f4128 100644
--- a/ProcessLib/BoundaryCondition/GenericNaturalBoundaryConditionLocalAssembler.h
+++ b/ProcessLib/BoundaryCondition/GenericNaturalBoundaryConditionLocalAssembler.h
@@ -9,6 +9,7 @@
 
 #pragma once
 
+#include "NumLib/DOF/LocalToGlobalIndexMap.h"
 #include "NumLib/Fem/ShapeMatrixPolicy.h"
 #include "ProcessLib/Utils/InitShapeMatrices.h"
 
diff --git a/ProcessLib/BoundaryCondition/GenericNonuniformNaturalBoundaryConditionLocalAssembler.h b/ProcessLib/BoundaryCondition/GenericNonuniformNaturalBoundaryConditionLocalAssembler.h
index 1c353a4601dd3a5004aea8f04fd6ae24661cd23c..72929d11a5e3fb97a71905bb7c08464627d09230 100644
--- a/ProcessLib/BoundaryCondition/GenericNonuniformNaturalBoundaryConditionLocalAssembler.h
+++ b/ProcessLib/BoundaryCondition/GenericNonuniformNaturalBoundaryConditionLocalAssembler.h
@@ -9,6 +9,7 @@
 
 #pragma once
 
+#include "NumLib/DOF/LocalToGlobalIndexMap.h"
 #include "NumLib/Fem/ShapeMatrixPolicy.h"
 #include "ProcessLib/Utils/InitShapeMatrices.h"
 
diff --git a/ProcessLib/BoundaryCondition/NormalTractionBoundaryConditionLocalAssembler.h b/ProcessLib/BoundaryCondition/NormalTractionBoundaryConditionLocalAssembler.h
index e5b23b82033c45e14bb1b6ae32c837d55181c9aa..e296fa1071d80b2852adfbbc4f6a750fd32ea4a4 100644
--- a/ProcessLib/BoundaryCondition/NormalTractionBoundaryConditionLocalAssembler.h
+++ b/ProcessLib/BoundaryCondition/NormalTractionBoundaryConditionLocalAssembler.h
@@ -10,6 +10,7 @@
 
 #pragma once
 
+#include "MeshLib/Elements/FaceRule.h"
 #include "MathLib/LinAlg/Eigen/EigenMapTools.h"
 #include "NumLib/DOF/DOFTableUtil.h"
 #include "ProcessLib/Parameter/Parameter.h"
diff --git a/ProcessLib/CalculateSurfaceFlux/CalculateSurfaceFluxLocalAssembler.h b/ProcessLib/CalculateSurfaceFlux/CalculateSurfaceFluxLocalAssembler.h
index 871804f0a93225c9467601e8b352daa13a4b2f56..b463710650f693c1bcfca5a2fd97d28434f62bc4 100644
--- a/ProcessLib/CalculateSurfaceFlux/CalculateSurfaceFluxLocalAssembler.h
+++ b/ProcessLib/CalculateSurfaceFlux/CalculateSurfaceFluxLocalAssembler.h
@@ -12,8 +12,9 @@
 #include "NumLib/Fem/ShapeMatrixPolicy.h"
 
 #include "NumLib/DOF/DOFTableUtil.h"
-#include "ProcessLib/Parameter/Parameter.h"
 
+#include "ProcessLib/Process.h"
+#include "ProcessLib/Parameter/Parameter.h"
 #include "ProcessLib/Utils/InitShapeMatrices.h"
 
 #include "MapBulkElementPoint.h"
diff --git a/ProcessLib/Deformation/LinearBMatrix.h b/ProcessLib/Deformation/LinearBMatrix.h
index cbf3a087fd64b565df76653e6b500f7474542612..07fa2032cb760c9e250a96a3ac5afa560da2e188 100644
--- a/ProcessLib/Deformation/LinearBMatrix.h
+++ b/ProcessLib/Deformation/LinearBMatrix.h
@@ -9,6 +9,8 @@
 
 #pragma once
 
+#include "ProcessLib/Deformation/BMatrixPolicy.h"
+
 #include <cmath>
 
 namespace ProcessLib
diff --git a/ProcessLib/HT/HTLocalAssemblerInterface.h b/ProcessLib/HT/HTLocalAssemblerInterface.h
index cd600c317362e75d51b26df2da94b66df7cbe28f..c0d8761f5b319d3e351c957462b895b7a0f9ca3d 100644
--- a/ProcessLib/HT/HTLocalAssemblerInterface.h
+++ b/ProcessLib/HT/HTLocalAssemblerInterface.h
@@ -11,6 +11,7 @@
 
 #pragma once
 
+#include "NumLib/Extrapolation/ExtrapolatableElement.h"
 #include "NumLib/Function/Interpolation.h"
 #include "ProcessLib/LocalAssemblerInterface.h"
 #include "MathLib/LinAlg/Eigen/EigenMapTools.h"
@@ -71,4 +72,4 @@ protected:
 };
 
 }  // namespace HT
-}  // namespace ProcessLib
\ No newline at end of file
+}  // namespace ProcessLib
diff --git a/ProcessLib/HydroMechanics/HydroMechanicsProcessData.h b/ProcessLib/HydroMechanics/HydroMechanicsProcessData.h
index a5b69d82bf62ca857db16aa697ea77e3dd299e66..b8c7b006d3250a4c93d6370a256898af1f86623d 100644
--- a/ProcessLib/HydroMechanics/HydroMechanicsProcessData.h
+++ b/ProcessLib/HydroMechanics/HydroMechanicsProcessData.h
@@ -9,6 +9,11 @@
 
 #pragma once
 
+#include "ProcessLib/Parameter/Parameter.h"
+
+#include <memory>
+#include <utility>
+
 #include <Eigen/Dense>
 
 namespace MaterialLib
diff --git a/ProcessLib/HydroMechanics/LocalAssemblerInterface.h b/ProcessLib/HydroMechanics/LocalAssemblerInterface.h
index a71b74122e2d1df108af8e519db9ee43dd57b814..fb41eea21637ca0d1b81c4983fe010309e5c525a 100644
--- a/ProcessLib/HydroMechanics/LocalAssemblerInterface.h
+++ b/ProcessLib/HydroMechanics/LocalAssemblerInterface.h
@@ -9,6 +9,7 @@
 
 #pragma once
 
+#include "NumLib/Extrapolation/ExtrapolatableElement.h"
 #include "ProcessLib/LocalAssemblerInterface.h"
 
 namespace ProcessLib
diff --git a/ProcessLib/LIE/SmallDeformation/LocalAssembler/SecondaryData.h b/ProcessLib/LIE/SmallDeformation/LocalAssembler/SecondaryData.h
index 4920d2dbbbfd831bd6ab6e784f35311e3f406529..804efe03754a388ec0fa3b858a062442b20f383d 100644
--- a/ProcessLib/LIE/SmallDeformation/LocalAssembler/SecondaryData.h
+++ b/ProcessLib/LIE/SmallDeformation/LocalAssembler/SecondaryData.h
@@ -9,6 +9,12 @@
 
 #pragma once
 
+#include <vector>
+
+#include <Eigen/Eigen>
+
+#include "NumLib/Fem/CoordinatesMapping/ShapeMatrices.h"
+
 namespace ProcessLib
 {
 namespace LIE
diff --git a/ProcessLib/LiquidFlow/LiquidFlowLocalAssembler.h b/ProcessLib/LiquidFlow/LiquidFlowLocalAssembler.h
index f0b1de80875bbbcb8cfecd1784a1a9019f8bdd65..c31f992becb5ea6a1f1b23e04ae8b087f34df7e2 100644
--- a/ProcessLib/LiquidFlow/LiquidFlowLocalAssembler.h
+++ b/ProcessLib/LiquidFlow/LiquidFlowLocalAssembler.h
@@ -17,6 +17,8 @@
 #include <vector>
 #include <typeindex>
 
+#include "MaterialLib/PorousMedium/Permeability/Permeability.h"
+#include "MaterialLib/PorousMedium/Storage/Storage.h"
 #include "MathLib/LinAlg/Eigen/EigenMapTools.h"
 #include "NumLib/Extrapolation/ExtrapolatableElement.h"
 #include "NumLib/DOF/DOFTableUtil.h"
diff --git a/ProcessLib/LiquidFlow/LiquidFlowMaterialProperties.h b/ProcessLib/LiquidFlow/LiquidFlowMaterialProperties.h
index c15e63b5a50564ade46165798234dee4757804c4..bafb35327de3896175649b9e922939c41b9a4b50 100644
--- a/ProcessLib/LiquidFlow/LiquidFlowMaterialProperties.h
+++ b/ProcessLib/LiquidFlow/LiquidFlowMaterialProperties.h
@@ -18,21 +18,9 @@
 
 #include "MaterialLib/Fluid/FluidProperty.h"
 #include "MaterialLib/Fluid/FluidProperties/FluidProperties.h"
-
-namespace MaterialLib
-{
-namespace Fluid
-{
-class FluidProperties;
-}
-
-namespace PorousMedium
-{
-class Permeability;
-class Porosity;
-class Storage;
-}
-}
+#include "MaterialLib/PorousMedium/Permeability/Permeability.h"
+#include "MaterialLib/PorousMedium/Porosity/Porosity.h"
+#include "MaterialLib/PorousMedium/Storage/Storage.h"
 
 namespace BaseLib
 {
diff --git a/ProcessLib/LocalAssemblerTraits.h b/ProcessLib/LocalAssemblerTraits.h
index c628a15b0b4865db51da8a1955620ae848e6662b..44f0e6cea68f25b856ce5ebc452a0fc8e3cc7bb3 100644
--- a/ProcessLib/LocalAssemblerTraits.h
+++ b/ProcessLib/LocalAssemblerTraits.h
@@ -9,6 +9,11 @@
 
 #pragma once
 
+#include "NumLib/Fem/ShapeMatrixPolicy.h"
+
+#include <cassert>
+#include <type_traits>
+
 namespace ProcessLib
 {
 
diff --git a/ProcessLib/PhaseField/PhaseFieldFEM.h b/ProcessLib/PhaseField/PhaseFieldFEM.h
index 336306dd8f4d45bb0caa9865da57c1d627362371..f4fcd3e3aae3a666b2dff1f216bf852c3f8d6ad1 100644
--- a/ProcessLib/PhaseField/PhaseFieldFEM.h
+++ b/ProcessLib/PhaseField/PhaseFieldFEM.h
@@ -18,6 +18,7 @@
 #include "NumLib/Fem/ShapeMatrixPolicy.h"
 #include "ProcessLib/Deformation/BMatrixPolicy.h"
 #include "ProcessLib/Deformation/LinearBMatrix.h"
+#include "ProcessLib/Parameter/SpatialPosition.h"
 #include "ProcessLib/Utils/InitShapeMatrices.h"
 
 #include "LocalAssemblerInterface.h"
diff --git a/ProcessLib/PhaseField/PhaseFieldProcessData.h b/ProcessLib/PhaseField/PhaseFieldProcessData.h
index e044afb037a5f28483eadd01652304ea721461cd..7184f64298b4c091e92e005d3fc42b423484360e 100644
--- a/ProcessLib/PhaseField/PhaseFieldProcessData.h
+++ b/ProcessLib/PhaseField/PhaseFieldProcessData.h
@@ -9,6 +9,11 @@
 
 #pragma once
 
+#include <Eigen/Eigen>
+
+#include <memory>
+#include <utility>
+
 namespace MaterialLib
 {
 namespace Solids
diff --git a/ProcessLib/SecondaryVariableContext.h b/ProcessLib/SecondaryVariableContext.h
index 6f1a517751fcac536444bbd54862b09ca31a8680..c568106df8bbae64108aad4d5323016710a3e4c2 100644
--- a/ProcessLib/SecondaryVariableContext.h
+++ b/ProcessLib/SecondaryVariableContext.h
@@ -9,6 +9,8 @@
 
 #pragma once
 
+#include "MathLib/LinAlg/GlobalMatrixVectorTypes.h"
+
 namespace ProcessLib
 {
 /*! Provides a "global" context, e.g., for NamedFunction's.
diff --git a/ProcessLib/SmallDeformation/SmallDeformationProcessData.h b/ProcessLib/SmallDeformation/SmallDeformationProcessData.h
index 9704c081edd54d314f88d4bad3055330f5d0ebc1..6d3545a7949f883b8baff08ebf7bbb5dd273b461 100644
--- a/ProcessLib/SmallDeformation/SmallDeformationProcessData.h
+++ b/ProcessLib/SmallDeformation/SmallDeformationProcessData.h
@@ -9,6 +9,13 @@
 
 #pragma once
 
+#include <memory>
+#include <utility>
+
+#include <Eigen/Eigen>
+
+#include "ProcessLib/Parameter/Parameter.h"
+
 namespace MaterialLib
 {
 namespace Solids
diff --git a/ProcessLib/TES/TESLocalAssembler.h b/ProcessLib/TES/TESLocalAssembler.h
index 74e7973c0ec3562f5d021ef1b29b90ced638560e..f96b6635ad8424cd51669b249f7b8ee9dcb55453 100644
--- a/ProcessLib/TES/TESLocalAssembler.h
+++ b/ProcessLib/TES/TESLocalAssembler.h
@@ -14,6 +14,7 @@
 
 #include "ProcessLib/LocalAssemblerInterface.h"
 #include "NumLib/Extrapolation/ExtrapolatableElement.h"
+#include "MeshLib/Elements/Element.h"
 #include "TESAssemblyParams.h"
 #include "TESLocalAssemblerInner-fwd.h"
 
diff --git a/ProcessLib/ThermoMechanics/ThermoMechanicsProcessData.h b/ProcessLib/ThermoMechanics/ThermoMechanicsProcessData.h
index 600fcd4449d71799adbc787c0eff5c668cf40594..00c47f122f1479267fe4071471ff007c5ea50382 100644
--- a/ProcessLib/ThermoMechanics/ThermoMechanicsProcessData.h
+++ b/ProcessLib/ThermoMechanics/ThermoMechanicsProcessData.h
@@ -9,6 +9,13 @@
 
 #pragma once
 
+#include <memory>
+#include <utility>
+
+#include <Eigen/Eigen>
+
+#include "ProcessLib/Parameter/Parameter.h"
+
 namespace MaterialLib
 {
 namespace Solids
diff --git a/ProcessLib/VariableTransformation.h b/ProcessLib/VariableTransformation.h
index b96d20806e2020ad1dcc825dd7416b9b2ec12965..9202b58e6e573edac1ecfcf97f04cf8587c19bbd 100644
--- a/ProcessLib/VariableTransformation.h
+++ b/ProcessLib/VariableTransformation.h
@@ -12,6 +12,8 @@
 
 #pragma once
 
+#include <cmath>
+
 namespace ProcessLib
 {
 
diff --git a/scripts/cmake/CheckHeaderCompilation.cmake b/scripts/cmake/CheckHeaderCompilation.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..3db37b4938b8deba5828e5355ffd561f8270fb16
--- /dev/null
+++ b/scripts/cmake/CheckHeaderCompilation.cmake
@@ -0,0 +1,95 @@
+# Supply include directories and compiler flags
+get_directory_property(INCLUDE_DIRS INCLUDE_DIRECTORIES)
+set(CMAKE_REQUIRED_FLAGS "-c -std=gnu++14")
+set(CMAKE_REQUIRED_QUIET TRUE)
+
+add_custom_target(check-header
+    COMMAND ${CMAKE_COMMAND} -E remove CMakeFiles/CMakeError.log
+    COMMAND ${CMAKE_COMMAND} . -DOGS_CHECK_HEADER_COMPILATION=ON
+    COMMAND ${CMAKE_COMMAND} . -DOGS_CHECK_HEADER_COMPILATION=OFF || true
+    COMMAND if [ -f CMakeFiles/CMakeError.log ]\; then cat CMakeFiles/CMakeError.log\; return 1\; else return 0\; fi\;
+    WORKING_DIRECTOY ${PROJECT_BINARY_DIR}
+    COMMENT "Checking header files"
+    USES_TERMINAL
+)
+
+# Checks header for standalone compilation
+function(_check_header_compilation TARGET)
+
+    get_target_property(SOURCE_FILES ${TARGET} SOURCES)
+    get_target_property(SOURCE_DIR ${TARGET} SOURCE_DIR)
+
+    get_directory_property(DEFS DIRECTORY ${SOURCE_DIR} COMPILE_DEFINITIONS)
+    foreach(DEF ${DEFS})
+        if(${DEF} MATCHES ".*[0-9]\\(.*")
+            continue()
+        endif()
+        list(APPEND DEFS_CLEANED "-D${DEF}")
+    endforeach()
+
+    get_target_property(INCLUDE_DIRS ${TARGET} INCLUDE_DIRECTORIES)
+    get_target_property(LINK_LIBS ${TARGET} LINK_LIBRARIES)
+    foreach(LIB ${LINK_LIBS})
+        if(NOT TARGET ${LIB}) # Ignore non-existing targets
+            continue()
+        endif()
+        get_target_property(TARGET_INCLUDE_DIRS ${LIB} INCLUDE_DIRECTORIES)
+        if(TARGET_INCLUDE_DIRS)
+            list(APPEND INCLUDE_DIRS ${TARGET_INCLUDE_DIRS})
+        endif()
+    endforeach()
+    list(REMOVE_DUPLICATES INCLUDE_DIRS)
+
+    string(REPLACE "${PROJECT_SOURCE_DIR}/" "" DIRECTORY ${SOURCE_DIR})
+    message(STATUS "Checking header compilation for ${DIRECTORY} ...")
+    include(CheckCXXSourceCompiles)
+
+    set(CMAKE_REQUIRED_INCLUDES ${INCLUDE_DIRS} ${SOURCE_DIR})
+    set(CMAKE_REQUIRED_DEFINITIONS ${DEFS_CLEANED})
+
+    foreach(FILE ${SOURCE_FILES})
+
+        if(NOT "${FILE}" MATCHES ".*\\.h") # Check only header files
+            continue()
+        endif()
+        if("${FILE}" MATCHES ".*-impl\\.h") # Ignore *-impl.h files
+            continue()
+        endif()
+
+        check_cxx_source_compiles(
+            "
+            #include \"${FILE}\"
+            int main() { return 0; }
+            "
+            COMPILES
+        )
+
+        if(NOT COMPILES)
+            set(HEADER_COMPILE_ERROR TRUE CACHE INTERNAL "")
+            string(REPLACE "${PROJECT_SOURCE_DIR}/" "" FILE_SHORT ${FILE})
+            message(STATUS "  Compilation failed for ${FILE_SHORT}")
+        endif()
+        unset(COMPILES CACHE)
+
+    endforeach()
+endfunction()
+
+function(check_header_compilation)
+    if(NOT OGS_CHECK_HEADER_COMPILATION)
+        return()
+    endif()
+    set(HEADER_COMPILE_ERROR FALSE CACHE INTERNAL "")
+
+    _check_header_compilation(BaseLib)
+    _check_header_compilation(GeoLib)
+    _check_header_compilation(MaterialLib)
+    _check_header_compilation(MathLib)
+    _check_header_compilation(MeshGeoToolsLib)
+    _check_header_compilation(MeshLib)
+    _check_header_compilation(NumLib)
+    _check_header_compilation(ProcessLib)
+
+    if(HEADER_COMPILE_ERROR)
+        message(FATAL_ERROR "... header compilation check failed, see CMakeFiles/CMakeError.log for details!")
+    endif()
+endfunction()