diff --git a/ProcessLib/HydroMechanics/HydroMechanicsFEM-impl.h b/ProcessLib/HydroMechanics/HydroMechanicsFEM-impl.h
index cbe46a99d5899fefc75d54fea4ba2727563ea64f..599adeb2ea1677a33c0469ff18ce8d3e0d5d3507 100644
--- a/ProcessLib/HydroMechanics/HydroMechanicsFEM-impl.h
+++ b/ProcessLib/HydroMechanics/HydroMechanicsFEM-impl.h
@@ -707,7 +707,8 @@ void HydroMechanicsLocalAssembler<ShapeFunctionDisplacement,
     postNonLinearSolverConcrete(std::vector<double> const& local_x,
                                 std::vector<double> const& /*local_xdot*/,
                                 double const t, double const dt,
-                                bool const use_monolithic_scheme)
+                                bool const use_monolithic_scheme,
+                                int const /*process_id*/)
 {
     const int displacement_offset =
         use_monolithic_scheme ? displacement_index : 0;
diff --git a/ProcessLib/HydroMechanics/HydroMechanicsFEM.h b/ProcessLib/HydroMechanics/HydroMechanicsFEM.h
index 97b6be8a462348d688d82fe2def794c3eacd1d71..8c96155dcc3d09133592670d78ed80c943ae4599 100644
--- a/ProcessLib/HydroMechanics/HydroMechanicsFEM.h
+++ b/ProcessLib/HydroMechanics/HydroMechanicsFEM.h
@@ -198,7 +198,8 @@ public:
     void postNonLinearSolverConcrete(std::vector<double> const& local_x,
                                      std::vector<double> const& local_xdot,
                                      double const t, double const dt,
-                                     bool const use_monolithic_scheme) override;
+                                     bool const use_monolithic_scheme,
+                                     int const process_id) override;
 
     Eigen::Map<const Eigen::RowVectorXd> getShapeMatrix(
         const unsigned integration_point) const override
diff --git a/ProcessLib/HydroMechanics/HydroMechanicsProcess.cpp b/ProcessLib/HydroMechanics/HydroMechanicsProcess.cpp
index c839a59e38020ca31e05d6518b3beebe75a17d12..30cd5821f6bafbc9a3cdc42d2d1c5e8fcbb3f545 100644
--- a/ProcessLib/HydroMechanics/HydroMechanicsProcess.cpp
+++ b/ProcessLib/HydroMechanics/HydroMechanicsProcess.cpp
@@ -516,7 +516,7 @@ void HydroMechanicsProcess<DisplacementDim>::postNonLinearSolverConcreteProcess(
     GlobalExecutor::executeSelectedMemberOnDereferenced(
         &LocalAssemblerIF::postNonLinearSolver, _local_assemblers,
         pv.getActiveElementIDs(), getDOFTable(process_id), x, xdot, t, dt,
-        _use_monolithic_scheme);
+        _use_monolithic_scheme, process_id);
 }
 
 template <int DisplacementDim>
diff --git a/ProcessLib/LocalAssemblerInterface.cpp b/ProcessLib/LocalAssemblerInterface.cpp
index 8823795742e39fcb6d0009538afa41186557211a..902c26fac05e3e0765e0c7731f18048c721a2b35 100644
--- a/ProcessLib/LocalAssemblerInterface.cpp
+++ b/ProcessLib/LocalAssemblerInterface.cpp
@@ -83,12 +83,12 @@ void LocalAssemblerInterface::computeSecondaryVariable(
 void LocalAssemblerInterface::setInitialConditions(
     std::size_t const mesh_item_id,
     NumLib::LocalToGlobalIndexMap const& dof_table, GlobalVector const& x,
-    double const t)
+    double const t, bool const use_monolithic_scheme, int const process_id)
 {
     auto const indices = NumLib::getIndices(mesh_item_id, dof_table);
     auto const local_x = x.get(indices);
 
-    setInitialConditionsConcrete(local_x, t);
+    setInitialConditionsConcrete(local_x, t, use_monolithic_scheme, process_id);
 }
 
 void LocalAssemblerInterface::initialize(
@@ -124,14 +124,14 @@ void LocalAssemblerInterface::postNonLinearSolver(
     std::size_t const mesh_item_id,
     NumLib::LocalToGlobalIndexMap const& dof_table, GlobalVector const& x,
     GlobalVector const& xdot, double const t, double const dt,
-    bool const use_monolithic_scheme)
+    bool const use_monolithic_scheme, int const process_id)
 {
     auto const indices = NumLib::getIndices(mesh_item_id, dof_table);
     auto const local_x = x.get(indices);
     auto const local_xdot = xdot.get(indices);
 
     postNonLinearSolverConcrete(local_x, local_xdot, t, dt,
-                                use_monolithic_scheme);
+                                use_monolithic_scheme, process_id);
 }
 
 }  // namespace ProcessLib
diff --git a/ProcessLib/LocalAssemblerInterface.h b/ProcessLib/LocalAssemblerInterface.h
index b8506c385523c4740b60faaceaa3ec022fd33ebe..8148654e1c6c0a3538c09080b3dd61fbb560ff89 100644
--- a/ProcessLib/LocalAssemblerInterface.h
+++ b/ProcessLib/LocalAssemblerInterface.h
@@ -35,10 +35,11 @@ class LocalAssemblerInterface
 public:
     virtual ~LocalAssemblerInterface() = default;
 
-    virtual void setInitialConditions(
-        std::size_t const mesh_item_id,
-        NumLib::LocalToGlobalIndexMap const& dof_table, GlobalVector const& x,
-        double const t);
+    void setInitialConditions(std::size_t const mesh_item_id,
+                              NumLib::LocalToGlobalIndexMap const& dof_table,
+                              GlobalVector const& x, double const t,
+                              bool const use_monolithic_scheme,
+                              int const process_id);
 
     virtual void initialize(std::size_t const mesh_item_id,
                             NumLib::LocalToGlobalIndexMap const& dof_table);
@@ -97,7 +98,8 @@ public:
                              NumLib::LocalToGlobalIndexMap const& dof_table,
                              GlobalVector const& x, GlobalVector const& xdot,
                              double const t, double const dt,
-                             bool const use_monolithic_scheme);
+                             bool const use_monolithic_scheme,
+                             int const process_id);
 
     virtual std::vector<double> interpolateNodalValuesToIntegrationPoints(
         std::vector<double> const& /*local_x*/)
@@ -127,7 +129,8 @@ public:
 
 private:
     virtual void setInitialConditionsConcrete(
-        std::vector<double> const& /*local_x*/, double const /*t*/)
+        std::vector<double> const& /*local_x*/, double const /*t*/,
+        bool const /*use_monolithic_scheme*/, int const /*process_id*/)
     {
     }
 
@@ -146,7 +149,8 @@ private:
     virtual void postNonLinearSolverConcrete(
         std::vector<double> const& /*local_x*/,
         std::vector<double> const& /*local_xdot*/, double const /*t*/,
-        double const /*dt*/, bool const /*use_monolithic_scheme*/)
+        double const /*dt*/, bool const /*use_monolithic_scheme*/,
+        int const /*process_id*/)
     {
     }
 
diff --git a/ProcessLib/Process.cpp b/ProcessLib/Process.cpp
index 37d98ac031452ab1a4af9ecca156ee470e25321f..f1fa776dfe3811667ee859faae78efe937796a81 100644
--- a/ProcessLib/Process.cpp
+++ b/ProcessLib/Process.cpp
@@ -163,7 +163,7 @@ void Process::setInitialConditions(const int process_id, double const t,
             }
         }
     }
-    setInitialConditionsConcreteProcess(x, t);
+    setInitialConditionsConcreteProcess(x, t, process_id);
 }
 
 MathLib::MatrixSpecifications Process::getMatrixSpecifications(
diff --git a/ProcessLib/Process.h b/ProcessLib/Process.h
index b0aa626715399f3d74a577d240ab39b21171321b..6e8e299bbf89baa51721206545418cfdae37f0d3 100644
--- a/ProcessLib/Process.h
+++ b/ProcessLib/Process.h
@@ -207,7 +207,8 @@ private:
     virtual void initializeBoundaryConditions();
 
     virtual void setInitialConditionsConcreteProcess(GlobalVector const& /*x*/,
-                                                     double const /*t*/)
+                                                     double const /*t*/,
+                                                     int const /*process_id*/)
     {
     }
 
diff --git a/ProcessLib/RichardsMechanics/RichardsMechanicsFEM-impl.h b/ProcessLib/RichardsMechanics/RichardsMechanicsFEM-impl.h
index 2fbd9078e814ce7776bb80d51356d0f8c32bf40b..3bbc0390e82abc24adddb6b36cc39436d345ca3e 100644
--- a/ProcessLib/RichardsMechanics/RichardsMechanicsFEM-impl.h
+++ b/ProcessLib/RichardsMechanics/RichardsMechanicsFEM-impl.h
@@ -181,11 +181,13 @@ std::size_t RichardsMechanicsLocalAssembler<
 
 template <typename ShapeFunctionDisplacement, typename ShapeFunctionPressure,
           typename IntegrationMethod, int DisplacementDim>
-void RichardsMechanicsLocalAssembler<
-    ShapeFunctionDisplacement, ShapeFunctionPressure, IntegrationMethod,
-    DisplacementDim>::setInitialConditionsConcrete(std::vector<double> const&
-                                                       local_x,
-                                                   double const t)
+void RichardsMechanicsLocalAssembler<ShapeFunctionDisplacement,
+                                     ShapeFunctionPressure, IntegrationMethod,
+                                     DisplacementDim>::
+    setInitialConditionsConcrete(std::vector<double> const& local_x,
+                                 double const t,
+                                 bool const /*use_monolithic_scheme*/,
+                                 int const /*process_id*/)
 {
     assert(local_x.size() == pressure_size + displacement_size);
 
@@ -1286,7 +1288,8 @@ void RichardsMechanicsLocalAssembler<ShapeFunctionDisplacement,
     postNonLinearSolverConcrete(std::vector<double> const& local_x,
                                 std::vector<double> const& /*local_xdot*/,
                                 double const t, double const dt,
-                                bool const use_monolithic_scheme)
+                                bool const use_monolithic_scheme,
+                                int const /*process_id*/)
 {
     const int displacement_offset =
         use_monolithic_scheme ? displacement_index : 0;
diff --git a/ProcessLib/RichardsMechanics/RichardsMechanicsFEM.h b/ProcessLib/RichardsMechanics/RichardsMechanicsFEM.h
index 51372b341458471e1be326ca1111f2b537abefcc..9aba32ed18c0c8d52e263b5172c8555f2afbed3a 100644
--- a/ProcessLib/RichardsMechanics/RichardsMechanicsFEM.h
+++ b/ProcessLib/RichardsMechanics/RichardsMechanicsFEM.h
@@ -88,7 +88,9 @@ public:
         int const integration_order) override;
 
     void setInitialConditionsConcrete(std::vector<double> const& local_x,
-                                      double const t) override;
+                                      double const t,
+                                      bool const use_monolithic_scheme,
+                                      int const process_id) override;
 
     void assemble(double const t, double const dt,
                   std::vector<double> const& local_x,
@@ -165,7 +167,8 @@ public:
     void postNonLinearSolverConcrete(std::vector<double> const& local_x,
                                      std::vector<double> const& local_xdot,
                                      double const t, double const dt,
-                                     bool const use_monolithic_scheme) override;
+                                     bool const use_monolithic_scheme,
+                                     int const process_id) override;
 
     Eigen::Map<const Eigen::RowVectorXd> getShapeMatrix(
         const unsigned integration_point) const override
diff --git a/ProcessLib/RichardsMechanics/RichardsMechanicsProcess.cpp b/ProcessLib/RichardsMechanics/RichardsMechanicsProcess.cpp
index 6a0003476dda25ef48d1dff1f1347264e8452e28..cdf6041c021af55081d3e0574a6f0493518e86d0 100644
--- a/ProcessLib/RichardsMechanics/RichardsMechanicsProcess.cpp
+++ b/ProcessLib/RichardsMechanics/RichardsMechanicsProcess.cpp
@@ -434,13 +434,17 @@ void RichardsMechanicsProcess<DisplacementDim>::initializeBoundaryConditions()
 template <int DisplacementDim>
 void RichardsMechanicsProcess<
     DisplacementDim>::setInitialConditionsConcreteProcess(GlobalVector const& x,
-                                                          double const t)
+                                                          double const t,
+                                                          int const process_id)
 {
     DBUG("SetInitialConditions RichardsMechanicsProcess.");
 
-    GlobalExecutor::executeMemberOnDereferenced(
+    ProcessLib::ProcessVariable const& pv = getProcessVariables(process_id)[0];
+
+    GlobalExecutor::executeSelectedMemberOnDereferenced(
         &LocalAssemblerIF::setInitialConditions, _local_assemblers,
-        *_local_to_global_index_map, x, t);
+        pv.getActiveElementIDs(), getDOFTable(process_id), x, t,
+        _use_monolithic_scheme, process_id);
 }
 
 template <int DisplacementDim>
@@ -570,7 +574,7 @@ void RichardsMechanicsProcess<DisplacementDim>::
     GlobalExecutor::executeSelectedMemberOnDereferenced(
         &LocalAssemblerIF::postNonLinearSolver, _local_assemblers,
         pv.getActiveElementIDs(), getDOFTable(process_id), x, xdot, t, dt,
-        _use_monolithic_scheme);
+        _use_monolithic_scheme, process_id);
 }
 
 template <int DisplacementDim>
diff --git a/ProcessLib/RichardsMechanics/RichardsMechanicsProcess.h b/ProcessLib/RichardsMechanics/RichardsMechanicsProcess.h
index f69e2b4b10ec619401db732b5cd964c519b9d929..cd00a20502bb1ec036700604bcc87835506005fa 100644
--- a/ProcessLib/RichardsMechanics/RichardsMechanicsProcess.h
+++ b/ProcessLib/RichardsMechanics/RichardsMechanicsProcess.h
@@ -73,8 +73,9 @@ private:
 
     void initializeBoundaryConditions() override;
 
-    void setInitialConditionsConcreteProcess(
-        GlobalVector const& x, double const t) override;
+    void setInitialConditionsConcreteProcess(GlobalVector const& x,
+                                             double const t,
+                                             int const process_id) override;
 
     void assembleConcreteProcess(const double t, double const dt,
                                  std::vector<GlobalVector*> const& x,
diff --git a/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsFEM-impl.h b/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsFEM-impl.h
index 2afd830502f9f59c95970b224b4ebba6c65df03c..63d37731d73005668bd96e60f94f9a20e2b3af60 100644
--- a/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsFEM-impl.h
+++ b/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsFEM-impl.h
@@ -564,7 +564,8 @@ void ThermoHydroMechanicsLocalAssembler<ShapeFunctionDisplacement,
     postNonLinearSolverConcrete(std::vector<double> const& local_x,
                                 std::vector<double> const& /*local_xdot*/,
                                 double const t, double const dt,
-                                bool const use_monolithic_scheme)
+                                bool const use_monolithic_scheme,
+                                int const /*process_id*/)
 {
     const int displacement_offset =
         use_monolithic_scheme ? displacement_index : 0;
diff --git a/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsFEM.h b/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsFEM.h
index 06aeb75f36ff416117e90b89ba31805e9398bf2d..ffc7be2d0137d21724736fdebfd82b66b32de90b 100644
--- a/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsFEM.h
+++ b/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsFEM.h
@@ -129,7 +129,8 @@ public:
     void postNonLinearSolverConcrete(std::vector<double> const& local_x,
                                      std::vector<double> const& local_xdot,
                                      double const t, double const dt,
-                                     bool const use_monolithic_scheme) override;
+                                     bool const use_monolithic_scheme,
+                                     int const process_id) override;
 
     Eigen::Map<const Eigen::RowVectorXd> getShapeMatrix(
         const unsigned integration_point) const override
diff --git a/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsProcess.cpp b/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsProcess.cpp
index 78264e80a535cc7b9d1f970a05ab199e22e091e8..36b187f69db6481b98c2dc6181108d70569b36e8 100644
--- a/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsProcess.cpp
+++ b/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsProcess.cpp
@@ -371,7 +371,8 @@ void ThermoHydroMechanicsProcess<DisplacementDim>::
     // Calculate strain, stress or other internal variables of mechanics.
     GlobalExecutor::executeMemberOnDereferenced(
         &LocalAssemblerInterface::postNonLinearSolver, _local_assemblers,
-        getDOFTable(process_id), x, xdot, t, dt, _use_monolithic_scheme);
+        getDOFTable(process_id), x, xdot, t, dt, _use_monolithic_scheme,
+        process_id);
 }
 
 template <int DisplacementDim>
diff --git a/ProcessLib/ThermoMechanicalPhaseField/ThermoMechanicalPhaseFieldProcess.cpp b/ProcessLib/ThermoMechanicalPhaseField/ThermoMechanicalPhaseFieldProcess.cpp
index 4a047507ff95b3dcd89d88c5554ce0b1d37a152e..be8b63c9ecb4869a7a066b5ab88bd59a594d9d53 100644
--- a/ProcessLib/ThermoMechanicalPhaseField/ThermoMechanicalPhaseFieldProcess.cpp
+++ b/ProcessLib/ThermoMechanicalPhaseField/ThermoMechanicalPhaseFieldProcess.cpp
@@ -315,7 +315,7 @@ void ThermoMechanicalPhaseFieldProcess<DisplacementDim>::
     GlobalExecutor::executeSelectedMemberOnDereferenced(
         &LocalAssemblerInterface::postNonLinearSolver, _local_assemblers,
         pv.getActiveElementIDs(), getDOFTable(process_id), x, xdot, t, dt,
-        use_monolithic_scheme);
+        use_monolithic_scheme, process_id);
 }
 
 template class ThermoMechanicalPhaseFieldProcess<2>;