diff --git a/ProcessLib/BoundaryCondition/ConstraintDirichletBoundaryCondition.cpp b/ProcessLib/BoundaryCondition/ConstraintDirichletBoundaryCondition.cpp
index acce3726620c45b75644b929f8c681063e7d7717..33567c6e25e44812d3e77c65358d1685b02d91c2 100644
--- a/ProcessLib/BoundaryCondition/ConstraintDirichletBoundaryCondition.cpp
+++ b/ProcessLib/BoundaryCondition/ConstraintDirichletBoundaryCondition.cpp
@@ -139,7 +139,8 @@ void ConstraintDirichletBoundaryCondition::preTimestep(double t,
 }
 
 void ConstraintDirichletBoundaryCondition::getEssentialBCValues(
-    const double t, NumLib::IndexValueVector<GlobalIndexType>& bc_values) const
+    const double t, const GlobalVector& /*x*/,
+    NumLib::IndexValueVector<GlobalIndexType>& bc_values) const
 {
     SpatialPosition pos;
 
diff --git a/ProcessLib/BoundaryCondition/ConstraintDirichletBoundaryCondition.h b/ProcessLib/BoundaryCondition/ConstraintDirichletBoundaryCondition.h
index 253abfceb7fddd23c46f41ad64de4d8e63e7b1f8..04d3b4095d6906f3ecb0b7d30441e6df668ad92a 100644
--- a/ProcessLib/BoundaryCondition/ConstraintDirichletBoundaryCondition.h
+++ b/ProcessLib/BoundaryCondition/ConstraintDirichletBoundaryCondition.h
@@ -63,7 +63,7 @@ public:
     void preTimestep(double t, GlobalVector const& x) override;
 
     void getEssentialBCValues(
-        const double t,
+        const double t, const GlobalVector& x,
         NumLib::IndexValueVector<GlobalIndexType>& bc_values) const override;
 
 private:
diff --git a/ProcessLib/BoundaryCondition/DirichletBoundaryCondition.cpp b/ProcessLib/BoundaryCondition/DirichletBoundaryCondition.cpp
index a81977cdc17c99b7ca976249843cd510cdf8b6f3..38a7e6d08c23e77390792e9855f37e2348c72aac 100644
--- a/ProcessLib/BoundaryCondition/DirichletBoundaryCondition.cpp
+++ b/ProcessLib/BoundaryCondition/DirichletBoundaryCondition.cpp
@@ -10,14 +10,15 @@
 #include "DirichletBoundaryCondition.h"
 
 #include <algorithm>
-#include <vector>
 #include <logog/include/logog.hpp>
+#include <vector>
 #include "ProcessLib/Utils/ProcessUtils.h"
 
 namespace ProcessLib
 {
 void DirichletBoundaryCondition::getEssentialBCValues(
-    const double t, NumLib::IndexValueVector<GlobalIndexType>& bc_values) const
+    const double t, GlobalVector const& /*x*/,
+    NumLib::IndexValueVector<GlobalIndexType>& bc_values) const
 {
     SpatialPosition pos;
 
@@ -48,7 +49,8 @@ void DirichletBoundaryCondition::getEssentialBCValues(
         // and MatZeroRowsColumns, which are called to apply the Dirichlet BC,
         // the negative index is not accepted like other matrix or vector
         // PETSc routines. Therefore, the following if-condition is applied.
-        if (g_idx >= 0) {
+        if (g_idx >= 0)
+        {
             bc_values.ids.emplace_back(g_idx);
             bc_values.values.emplace_back(_parameter(t, pos).front());
         }
diff --git a/ProcessLib/BoundaryCondition/DirichletBoundaryCondition.h b/ProcessLib/BoundaryCondition/DirichletBoundaryCondition.h
index 721ea5d3ad1d3d4daa67782a1386c2e8720de25a..f00681518cfe05cd57d18b8f6ed1f3e1c7c6ec41 100644
--- a/ProcessLib/BoundaryCondition/DirichletBoundaryCondition.h
+++ b/ProcessLib/BoundaryCondition/DirichletBoundaryCondition.h
@@ -58,7 +58,7 @@ public:
     }
 
     void getEssentialBCValues(
-        const double t,
+        const double t, GlobalVector const& x,
         NumLib::IndexValueVector<GlobalIndexType>& bc_values) const override;
 
 private:
diff --git a/ProcessLib/BoundaryCondition/GenericNaturalBoundaryCondition-impl.h b/ProcessLib/BoundaryCondition/GenericNaturalBoundaryCondition-impl.h
index b164ed2b8c0f9bb12760060be1aa709f9322b2b2..4da13051714b8404c9380b8f25c46baf3e280c4c 100644
--- a/ProcessLib/BoundaryCondition/GenericNaturalBoundaryCondition-impl.h
+++ b/ProcessLib/BoundaryCondition/GenericNaturalBoundaryCondition-impl.h
@@ -70,11 +70,12 @@ void GenericNaturalBoundaryCondition<
     LocalAssemblerImplementation>::applyNaturalBC(const double t,
                                                   const GlobalVector& x,
                                                   GlobalMatrix& K,
-                                                  GlobalVector& b)
+                                                  GlobalVector& b,
+                                                  GlobalMatrix* Jac)
 {
     GlobalExecutor::executeMemberOnDereferenced(
         &GenericNaturalBoundaryConditionLocalAssemblerInterface::assemble,
-        _local_assemblers, *_dof_table_boundary, t, x, K, b);
+        _local_assemblers, *_dof_table_boundary, t, x, K, b, Jac);
 }
 
 }  // ProcessLib
diff --git a/ProcessLib/BoundaryCondition/GenericNaturalBoundaryCondition.h b/ProcessLib/BoundaryCondition/GenericNaturalBoundaryCondition.h
index f68304dc2f85a46f3d314637f961cf812d25d9f8..90b0d164f9ade9ccea7a830c2359d6803c5dbf62 100644
--- a/ProcessLib/BoundaryCondition/GenericNaturalBoundaryCondition.h
+++ b/ProcessLib/BoundaryCondition/GenericNaturalBoundaryCondition.h
@@ -9,8 +9,8 @@
 
 #pragma once
 
-#include "MeshLib/MeshSubset.h"
 #include "BoundaryCondition.h"
+#include "MeshLib/MeshSubset.h"
 
 namespace ProcessLib
 {
@@ -38,10 +38,8 @@ public:
 
     /// Calls local assemblers which calculate their contributions to the global
     /// matrix and the right-hand-side.
-    void applyNaturalBC(const double t,
-                        GlobalVector const& x,
-                        GlobalMatrix& K,
-                        GlobalVector& b) override;
+    void applyNaturalBC(const double t, GlobalVector const& x, GlobalMatrix& K,
+                        GlobalVector& b, GlobalMatrix* Jac) override;
 
 private:
     /// Data used in the assembly of the specific boundary condition.
@@ -63,6 +61,6 @@ private:
         _local_assemblers;
 };
 
-}  // ProcessLib
+}  // namespace ProcessLib
 
 #include "GenericNaturalBoundaryCondition-impl.h"
diff --git a/ProcessLib/BoundaryCondition/GenericNaturalBoundaryConditionLocalAssembler.h b/ProcessLib/BoundaryCondition/GenericNaturalBoundaryConditionLocalAssembler.h
index 219085cfc062f1d2a36ed66822919d96fc5f4128..1721ef2589d6f2632c401fce3fda976076932bc0 100644
--- a/ProcessLib/BoundaryCondition/GenericNaturalBoundaryConditionLocalAssembler.h
+++ b/ProcessLib/BoundaryCondition/GenericNaturalBoundaryConditionLocalAssembler.h
@@ -23,7 +23,8 @@ public:
     virtual void assemble(
         std::size_t const id,
         NumLib::LocalToGlobalIndexMap const& dof_table_boundary, double const t,
-        const GlobalVector& x, GlobalMatrix& K, GlobalVector& b) = 0;
+        const GlobalVector& x, GlobalMatrix& K, GlobalVector& b,
+        GlobalMatrix* Jac) = 0;
 };
 
 template <typename ShapeFunction, typename IntegrationMethod,
@@ -55,4 +56,4 @@ protected:
         _shape_matrices;
 };
 
-}  // ProcessLib
+}  // namespace ProcessLib
diff --git a/ProcessLib/BoundaryCondition/GenericNonuniformNaturalBoundaryCondition-impl.h b/ProcessLib/BoundaryCondition/GenericNonuniformNaturalBoundaryCondition-impl.h
index a7b50d8957aa117cd9f5483c814f4947151d8775..bf3e122f78bd1fa56384a69dc6b8e4ddf8d6a45a 100644
--- a/ProcessLib/BoundaryCondition/GenericNonuniformNaturalBoundaryCondition-impl.h
+++ b/ProcessLib/BoundaryCondition/GenericNonuniformNaturalBoundaryCondition-impl.h
@@ -89,12 +89,13 @@ void GenericNonuniformNaturalBoundaryCondition<
     LocalAssemblerImplementation>::applyNaturalBC(const double t,
                                                   const GlobalVector& x,
                                                   GlobalMatrix& K,
-                                                  GlobalVector& b)
+                                                  GlobalVector& b,
+                                                  GlobalMatrix* Jac)
 {
     GlobalExecutor::executeMemberOnDereferenced(
         &GenericNonuniformNaturalBoundaryConditionLocalAssemblerInterface::
             assemble,
-        _local_assemblers, *_dof_table_boundary, t, x, K, b);
+        _local_assemblers, *_dof_table_boundary, t, x, K, b, Jac);
 }
 
-}  // ProcessLib
+}  // namespace ProcessLib
diff --git a/ProcessLib/BoundaryCondition/GenericNonuniformNaturalBoundaryCondition.h b/ProcessLib/BoundaryCondition/GenericNonuniformNaturalBoundaryCondition.h
index d6753d967192bde3de7360f2cb11c9db3b74e56c..37249a52c5a904032091b7f21a64d75602997445 100644
--- a/ProcessLib/BoundaryCondition/GenericNonuniformNaturalBoundaryCondition.h
+++ b/ProcessLib/BoundaryCondition/GenericNonuniformNaturalBoundaryCondition.h
@@ -33,10 +33,8 @@ public:
 
     /// Calls local assemblers which calculate their contributions to the global
     /// matrix and the right-hand-side.
-    void applyNaturalBC(const double t,
-                        GlobalVector const& x,
-                        GlobalMatrix& K,
-                        GlobalVector& b) override;
+    void applyNaturalBC(const double t, GlobalVector const& x, GlobalMatrix& K,
+                        GlobalVector& b, GlobalMatrix* Jac) override;
 
 private:
     void constructDofTable();
diff --git a/ProcessLib/BoundaryCondition/GenericNonuniformNaturalBoundaryConditionLocalAssembler.h b/ProcessLib/BoundaryCondition/GenericNonuniformNaturalBoundaryConditionLocalAssembler.h
index 72929d11a5e3fb97a71905bb7c08464627d09230..3cf49814d088bfa59c0da7b0b6c4665d72293ddf 100644
--- a/ProcessLib/BoundaryCondition/GenericNonuniformNaturalBoundaryConditionLocalAssembler.h
+++ b/ProcessLib/BoundaryCondition/GenericNonuniformNaturalBoundaryConditionLocalAssembler.h
@@ -24,7 +24,8 @@ public:
     virtual void assemble(
         std::size_t const id,
         NumLib::LocalToGlobalIndexMap const& dof_table_boundary, double const t,
-        const GlobalVector& x, GlobalMatrix& K, GlobalVector& b) = 0;
+        const GlobalVector& x, GlobalMatrix& K, GlobalVector& b,
+        GlobalMatrix* Jac) = 0;
 };
 
 template <typename ShapeFunction, typename IntegrationMethod,
@@ -88,4 +89,4 @@ protected:
         _ns_and_weights;
 };
 
-}  // ProcessLib
+}  // namespace ProcessLib
diff --git a/ProcessLib/BoundaryCondition/NeumannBoundaryConditionLocalAssembler.h b/ProcessLib/BoundaryCondition/NeumannBoundaryConditionLocalAssembler.h
index cface4f4cdb2dfa365e8caccaa5e57ea4e10d080..a88661d70cd8166e41f262d197d3fa9d788e203e 100644
--- a/ProcessLib/BoundaryCondition/NeumannBoundaryConditionLocalAssembler.h
+++ b/ProcessLib/BoundaryCondition/NeumannBoundaryConditionLocalAssembler.h
@@ -9,9 +9,9 @@
 
 #pragma once
 
+#include "GenericNaturalBoundaryConditionLocalAssembler.h"
 #include "NumLib/DOF/DOFTableUtil.h"
 #include "ProcessLib/Parameter/Parameter.h"
-#include "GenericNaturalBoundaryConditionLocalAssembler.h"
 
 namespace ProcessLib
 {
@@ -42,7 +42,8 @@ public:
     void assemble(std::size_t const id,
                   NumLib::LocalToGlobalIndexMap const& dof_table_boundary,
                   double const t, const GlobalVector& /*x*/,
-                  GlobalMatrix& /*K*/, GlobalVector& b) override
+                  GlobalMatrix& /*K*/, GlobalVector& b,
+                  GlobalMatrix* /*Jac*/) override
     {
         _local_rhs.setZero();
 
@@ -74,4 +75,4 @@ public:
     EIGEN_MAKE_ALIGNED_OPERATOR_NEW;
 };
 
-}   // namespace ProcessLib
+}  // namespace ProcessLib
diff --git a/ProcessLib/BoundaryCondition/NonuniformDirichletBoundaryCondition.h b/ProcessLib/BoundaryCondition/NonuniformDirichletBoundaryCondition.h
index 693993742036af5cce389794849d4931638f251c..49ae3aacf7ee8206f61547129c18eece09e785ab 100644
--- a/ProcessLib/BoundaryCondition/NonuniformDirichletBoundaryCondition.h
+++ b/ProcessLib/BoundaryCondition/NonuniformDirichletBoundaryCondition.h
@@ -60,11 +60,9 @@ public:
     }
 
     void getEssentialBCValues(
-        const double /*t*/,
+        const double /*t*/, GlobalVector const& /*x*/,
         NumLib::IndexValueVector<GlobalIndexType>& bc_values) const override
     {
-        SpatialPosition pos;
-
         bc_values.ids.clear();
         bc_values.values.clear();
 
diff --git a/ProcessLib/BoundaryCondition/NonuniformNeumannBoundaryConditionLocalAssembler.h b/ProcessLib/BoundaryCondition/NonuniformNeumannBoundaryConditionLocalAssembler.h
index d995082e418215755cbd3a3d3e1e46631eb19339..3666afdcd39006e608152b6ecf6d9d5bcfbfadc7 100644
--- a/ProcessLib/BoundaryCondition/NonuniformNeumannBoundaryConditionLocalAssembler.h
+++ b/ProcessLib/BoundaryCondition/NonuniformNeumannBoundaryConditionLocalAssembler.h
@@ -57,7 +57,8 @@ public:
     void assemble(std::size_t const id,
                   NumLib::LocalToGlobalIndexMap const& dof_table_boundary,
                   double const /*t*/, const GlobalVector& /*x*/,
-                  GlobalMatrix& /*K*/, GlobalVector& b) override
+                  GlobalMatrix& /*K*/, GlobalVector& b,
+                  GlobalMatrix* /*Jac*/) override
     {
         _local_rhs.setZero();
 
diff --git a/ProcessLib/BoundaryCondition/NormalTractionBoundaryCondition-impl.h b/ProcessLib/BoundaryCondition/NormalTractionBoundaryCondition-impl.h
index c0c26e40d9987eaeac43adf617884de960498eed..ab5fad4556ba652be1e860f72df549005efaac1f 100644
--- a/ProcessLib/BoundaryCondition/NormalTractionBoundaryCondition-impl.h
+++ b/ProcessLib/BoundaryCondition/NormalTractionBoundaryCondition-impl.h
@@ -65,11 +65,12 @@ void NormalTractionBoundaryCondition<
     LocalAssemblerImplementation>::applyNaturalBC(const double t,
                                                   const GlobalVector& x,
                                                   GlobalMatrix& K,
-                                                  GlobalVector& b)
+                                                  GlobalVector& b,
+                                                  GlobalMatrix* Jac)
 {
     GlobalExecutor::executeMemberOnDereferenced(
         &NormalTractionBoundaryConditionLocalAssemblerInterface::assemble,
-        _local_assemblers, *_dof_table_boundary, t, x, K, b);
+        _local_assemblers, *_dof_table_boundary, t, x, K, b, Jac);
 }
 
 std::unique_ptr<NormalTractionBoundaryCondition<
@@ -98,4 +99,4 @@ createNormalTractionBoundaryCondition(
 }
 
 }  // namespace NormalTractionBoundaryCondition
-}  // ProcessLib
+}  // namespace ProcessLib
diff --git a/ProcessLib/BoundaryCondition/NormalTractionBoundaryCondition.h b/ProcessLib/BoundaryCondition/NormalTractionBoundaryCondition.h
index 9f849aadc890b10fc0c6a523f5a6008d778eb761..14cb196809e7b29dd583e604364f9b1655f1213d 100644
--- a/ProcessLib/BoundaryCondition/NormalTractionBoundaryCondition.h
+++ b/ProcessLib/BoundaryCondition/NormalTractionBoundaryCondition.h
@@ -44,10 +44,8 @@ public:
 
     /// Calls local assemblers which calculate their contributions to the global
     /// matrix and the right-hand-side.
-    void applyNaturalBC(const double t,
-                        GlobalVector const& x,
-                        GlobalMatrix& K,
-                        GlobalVector& b) override;
+    void applyNaturalBC(const double t, GlobalVector const& x, GlobalMatrix& K,
+                        GlobalVector& b, GlobalMatrix* Jac) override;
 
 private:
     MeshLib::Mesh const& _bc_mesh;
diff --git a/ProcessLib/BoundaryCondition/NormalTractionBoundaryConditionLocalAssembler.h b/ProcessLib/BoundaryCondition/NormalTractionBoundaryConditionLocalAssembler.h
index e296fa1071d80b2852adfbbc4f6a750fd32ea4a4..cfe97bbc449dd8988a1fdf16e79ab8efae58ae1f 100644
--- a/ProcessLib/BoundaryCondition/NormalTractionBoundaryConditionLocalAssembler.h
+++ b/ProcessLib/BoundaryCondition/NormalTractionBoundaryConditionLocalAssembler.h
@@ -10,8 +10,8 @@
 
 #pragma once
 
-#include "MeshLib/Elements/FaceRule.h"
 #include "MathLib/LinAlg/Eigen/EigenMapTools.h"
+#include "MeshLib/Elements/FaceRule.h"
 #include "NumLib/DOF/DOFTableUtil.h"
 #include "ProcessLib/Parameter/Parameter.h"
 
@@ -45,7 +45,8 @@ public:
     virtual void assemble(
         std::size_t const id,
         NumLib::LocalToGlobalIndexMap const& dof_table_boundary, double const t,
-        const GlobalVector& /*x*/, GlobalMatrix& /*K*/, GlobalVector& b) = 0;
+        const GlobalVector& /*x*/, GlobalMatrix& /*K*/, GlobalVector& b,
+        GlobalMatrix* /*Jac*/) = 0;
     virtual ~NormalTractionBoundaryConditionLocalAssemblerInterface() = default;
 };
 
@@ -126,7 +127,8 @@ public:
     void assemble(std::size_t const id,
                   NumLib::LocalToGlobalIndexMap const& dof_table_boundary,
                   double const t, const GlobalVector& /*x*/,
-                  GlobalMatrix& /*K*/, GlobalVector& local_rhs)
+                  GlobalMatrix& /*K*/, GlobalVector& local_rhs,
+                  GlobalMatrix* /*Jac*/) override
     {
         _local_rhs.setZero();
 
diff --git a/ProcessLib/BoundaryCondition/PhaseFieldIrreversibleDamageOracleBoundaryCondition.cpp b/ProcessLib/BoundaryCondition/PhaseFieldIrreversibleDamageOracleBoundaryCondition.cpp
index bc72d5b47334e51860f4ee502c9b6b6797c7312e..c9c70288dba6c3fc4262a6b48e6012eca0e70910 100644
--- a/ProcessLib/BoundaryCondition/PhaseFieldIrreversibleDamageOracleBoundaryCondition.cpp
+++ b/ProcessLib/BoundaryCondition/PhaseFieldIrreversibleDamageOracleBoundaryCondition.cpp
@@ -17,7 +17,7 @@
 namespace ProcessLib
 {
 void PhaseFieldIrreversibleDamageOracleBoundaryCondition::getEssentialBCValues(
-    const double /*t*/,
+    const double /*t*/, GlobalVector const& /*x*/,
     NumLib::IndexValueVector<GlobalIndexType>& bc_values) const
 {
     SpatialPosition pos;
diff --git a/ProcessLib/BoundaryCondition/PhaseFieldIrreversibleDamageOracleBoundaryCondition.h b/ProcessLib/BoundaryCondition/PhaseFieldIrreversibleDamageOracleBoundaryCondition.h
index 9afa9f2426c3ceeb3016736c3ea7f5538cf87788..c14b17452717727fa872ee37070568b68ebbd8b6 100644
--- a/ProcessLib/BoundaryCondition/PhaseFieldIrreversibleDamageOracleBoundaryCondition.h
+++ b/ProcessLib/BoundaryCondition/PhaseFieldIrreversibleDamageOracleBoundaryCondition.h
@@ -43,7 +43,7 @@ public:
     }
 
     void getEssentialBCValues(
-        const double t,
+        const double t, const GlobalVector& x,
         NumLib::IndexValueVector<GlobalIndexType>& bc_values) const override;
 
     void preTimestep(const double t, const GlobalVector& x) override;
diff --git a/ProcessLib/BoundaryCondition/RobinBoundaryConditionLocalAssembler.h b/ProcessLib/BoundaryCondition/RobinBoundaryConditionLocalAssembler.h
index f3bdc6181ee504e003ce2cc2167b42aab914b438..1b780d40b04476d9d28ab1be117f40181e11a6bd 100644
--- a/ProcessLib/BoundaryCondition/RobinBoundaryConditionLocalAssembler.h
+++ b/ProcessLib/BoundaryCondition/RobinBoundaryConditionLocalAssembler.h
@@ -46,7 +46,7 @@ public:
     void assemble(std::size_t const id,
                   NumLib::LocalToGlobalIndexMap const& dof_table_boundary,
                   double const t, const GlobalVector& /*x*/, GlobalMatrix& K,
-                  GlobalVector& b) override
+                  GlobalVector& b, GlobalMatrix* /*Jac*/) override
     {
         _local_K.setZero();
         _local_rhs.setZero();