diff --git a/ProcessLib/ComponentTransport/ComponentTransportProcess.cpp b/ProcessLib/ComponentTransport/ComponentTransportProcess.cpp
index 9e886b74c0edff80a73482d1e913308b993fcb09..b371823600452d1bf7e7fd2420b3a3a79e11f119 100644
--- a/ProcessLib/ComponentTransport/ComponentTransportProcess.cpp
+++ b/ProcessLib/ComponentTransport/ComponentTransportProcess.cpp
@@ -86,6 +86,12 @@ void ComponentTransportProcess::initializeConcreteProcess(
             &ComponentTransportLocalAssemblerInterface::getIntPtDarcyVelocity));
 }
 
+void ComponentTransportProcess::setInitialConditionsConcreteProcess(
+    std::vector<GlobalVector*>& /*x*/, double const /*t*/,
+    int const /*process_id*/)
+{
+}
+
 void ComponentTransportProcess::assembleConcreteProcess(
     const double t, double const dt, std::vector<GlobalVector*> const& x,
     std::vector<GlobalVector*> const& xdot, int const process_id,
diff --git a/ProcessLib/ComponentTransport/ComponentTransportProcess.h b/ProcessLib/ComponentTransport/ComponentTransportProcess.h
index c5a86b770179a252f8806f063d6e9bc211d2c842..c13c5e8ab648c0aef8fee90378dc00a4dd7cd793 100644
--- a/ProcessLib/ComponentTransport/ComponentTransportProcess.h
+++ b/ProcessLib/ComponentTransport/ComponentTransportProcess.h
@@ -142,6 +142,10 @@ private:
         MeshLib::Mesh const& mesh,
         unsigned const integration_order) override;
 
+    void setInitialConditionsConcreteProcess(std::vector<GlobalVector*>& x,
+                                             double const t,
+                                             int const process_id) override;
+
     void assembleConcreteProcess(const double t, double const dt,
                                  std::vector<GlobalVector*> const& x,
                                  std::vector<GlobalVector*> const& xdot,
diff --git a/ProcessLib/HydroMechanics/HydroMechanicsProcess.cpp b/ProcessLib/HydroMechanics/HydroMechanicsProcess.cpp
index 1de73f250041b5514280d9724eecc94f1942f710..7d6ba4327b70d9156d117d902816ed0c2720a8ca 100644
--- a/ProcessLib/HydroMechanics/HydroMechanicsProcess.cpp
+++ b/ProcessLib/HydroMechanics/HydroMechanicsProcess.cpp
@@ -532,17 +532,22 @@ void HydroMechanicsProcess<DisplacementDim>::postNonLinearSolverConcreteProcess(
 }
 
 template <int DisplacementDim>
-void HydroMechanicsProcess<
-    DisplacementDim>::setInitialConditionsConcreteProcess(GlobalVector const& x,
-                                                          double const t,
-                                                          int const process_id)
+void HydroMechanicsProcess<DisplacementDim>::
+    setInitialConditionsConcreteProcess(std::vector<GlobalVector*>& x,
+                                        double const t,
+                                        int const process_id)
 {
+    if (process_id != _process_data.hydraulic_process_id)
+    {
+        return;
+    }
+
     DBUG("Set initial conditions of HydroMechanicsProcess.");
 
     ProcessLib::ProcessVariable const& pv = getProcessVariables(process_id)[0];
     GlobalExecutor::executeSelectedMemberOnDereferenced(
         &LocalAssemblerIF::setInitialConditions, _local_assemblers,
-        pv.getActiveElementIDs(), getDOFTable(process_id), x, t,
+        pv.getActiveElementIDs(), getDOFTable(process_id), *x[process_id], t,
         _use_monolithic_scheme, process_id);
 }
 
diff --git a/ProcessLib/HydroMechanics/HydroMechanicsProcess.h b/ProcessLib/HydroMechanics/HydroMechanicsProcess.h
index 987e4e6cf8dd1d928a95c34f0593d04787b02c8d..313b77a7acfc72484ff3487723e765a37b90cc2b 100644
--- a/ProcessLib/HydroMechanics/HydroMechanicsProcess.h
+++ b/ProcessLib/HydroMechanics/HydroMechanicsProcess.h
@@ -99,7 +99,7 @@ private:
                                             const double t, double const dt,
                                             int const process_id) override;
 
-    void setInitialConditionsConcreteProcess(GlobalVector const& x,
+    void setInitialConditionsConcreteProcess(std::vector<GlobalVector*>& x,
                                              double const t,
                                              int const process_id) override;
 
diff --git a/ProcessLib/Process.cpp b/ProcessLib/Process.cpp
index 7ccc78408ed9035e91994565483a60f19c8a9f1f..4c14b21b6785f7cb684ccc8cc77263f26f2d183e 100644
--- a/ProcessLib/Process.cpp
+++ b/ProcessLib/Process.cpp
@@ -108,9 +108,15 @@ void Process::initialize()
     initializeBoundaryConditions();
 }
 
-void Process::setInitialConditions(const int process_id, double const t,
-                                   GlobalVector& x)
+void Process::setInitialConditions(
+    std::vector<GlobalVector*>& process_solutions,
+    std::vector<GlobalVector*>& process_solutions_prev,
+    double const t,
+    int const process_id)
 {
+    auto& x = *process_solutions[process_id];
+    auto& x_prev = *process_solutions_prev[process_id];
+
     // getDOFTableOfProcess can be overloaded by the specific process.
     auto const& dof_table_of_process = getDOFTable(process_id);
 
@@ -163,7 +169,11 @@ void Process::setInitialConditions(const int process_id, double const t,
             }
         }
     }
-    setInitialConditionsConcreteProcess(x, t, process_id);
+
+    MathLib::LinAlg::finalizeAssembly(x);
+    MathLib::LinAlg::copy(x, x_prev);  // pushState
+
+    setInitialConditionsConcreteProcess(process_solutions, t, process_id);
 }
 
 MathLib::MatrixSpecifications Process::getMatrixSpecifications(
diff --git a/ProcessLib/Process.h b/ProcessLib/Process.h
index 1b69f8c6f9ceeed0ef44ac40929f28cc67acb7ef..c01cf00daa59d94710ee74d8eb45e9dae55f4202 100644
--- a/ProcessLib/Process.h
+++ b/ProcessLib/Process.h
@@ -82,8 +82,11 @@ public:
 
     void initialize();
 
-    void setInitialConditions(const int process_id, const double t,
-                              GlobalVector& x);
+    void setInitialConditions(
+        std::vector<GlobalVector*>& process_solutions,
+        std::vector<GlobalVector*>& process_solutions_prev,
+        double const t,
+        int const process_id);
 
     MathLib::MatrixSpecifications getMatrixSpecifications(
         const int process_id) const override;
@@ -206,9 +209,10 @@ private:
     /// processes. It is called by initialize().
     virtual void initializeBoundaryConditions();
 
-    virtual void setInitialConditionsConcreteProcess(GlobalVector const& /*x*/,
-                                                     double const /*t*/,
-                                                     int const /*process_id*/)
+    virtual void setInitialConditionsConcreteProcess(
+        std::vector<GlobalVector*>& /*x*/,
+        double const /*t*/,
+        int const /*process_id*/)
     {
     }
 
diff --git a/ProcessLib/RichardsMechanics/RichardsMechanicsProcess.cpp b/ProcessLib/RichardsMechanics/RichardsMechanicsProcess.cpp
index 48900041ef3158d77f39cbd9f446f28c2cca862d..6a6e9debe41aac9dbba0ac6ce9322719523116a4 100644
--- a/ProcessLib/RichardsMechanics/RichardsMechanicsProcess.cpp
+++ b/ProcessLib/RichardsMechanics/RichardsMechanicsProcess.cpp
@@ -432,18 +432,23 @@ void RichardsMechanicsProcess<DisplacementDim>::initializeBoundaryConditions()
 }
 
 template <int DisplacementDim>
-void RichardsMechanicsProcess<
-    DisplacementDim>::setInitialConditionsConcreteProcess(GlobalVector const& x,
-                                                          double const t,
-                                                          int const process_id)
+void RichardsMechanicsProcess<DisplacementDim>::
+    setInitialConditionsConcreteProcess(std::vector<GlobalVector*>& x,
+                                        double const t,
+                                        int const process_id)
 {
+    if (process_id != 0)
+    {
+        return;
+    }
+
     DBUG("SetInitialConditions RichardsMechanicsProcess.");
 
     ProcessLib::ProcessVariable const& pv = getProcessVariables(process_id)[0];
 
     GlobalExecutor::executeSelectedMemberOnDereferenced(
         &LocalAssemblerIF::setInitialConditions, _local_assemblers,
-        pv.getActiveElementIDs(), getDOFTable(process_id), x, t,
+        pv.getActiveElementIDs(), getDOFTable(process_id), *x[process_id], t,
         _use_monolithic_scheme, process_id);
 }
 
diff --git a/ProcessLib/RichardsMechanics/RichardsMechanicsProcess.h b/ProcessLib/RichardsMechanics/RichardsMechanicsProcess.h
index c5f598ecb9470629e3e4bde300ec03cec12071c4..5c4bf653ca79650211937c3715e7cd30faafd63d 100644
--- a/ProcessLib/RichardsMechanics/RichardsMechanicsProcess.h
+++ b/ProcessLib/RichardsMechanics/RichardsMechanicsProcess.h
@@ -73,7 +73,7 @@ private:
 
     void initializeBoundaryConditions() override;
 
-    void setInitialConditionsConcreteProcess(GlobalVector const& x,
+    void setInitialConditionsConcreteProcess(std::vector<GlobalVector*>& x,
                                              double const t,
                                              int const process_id) override;
 
diff --git a/ProcessLib/TimeLoop.cpp b/ProcessLib/TimeLoop.cpp
index 37603ef24985dda5a787e0d3b49a660215960d19..b4e981105b8ee646164f80556f6ab198ebf7aa61 100644
--- a/ProcessLib/TimeLoop.cpp
+++ b/ProcessLib/TimeLoop.cpp
@@ -218,10 +218,7 @@ setInitialConditions(
 
     for (auto& process_data : per_process_data)
     {
-        auto& pcs = process_data->process;
         auto const process_id = process_data->process_id;
-        auto& time_disc = *process_data->time_disc;
-
         auto& ode_sys = *process_data->tdisc_ode_sys;
 
         // append a solution vector of suitable size
@@ -231,14 +228,17 @@ setInitialConditions(
         process_solutions_prev.emplace_back(
             &NumLib::GlobalVectorProvider::provider.getVector(
                 ode_sys.getMatrixSpecifications(process_id)));
+    }
 
-        auto& x = *process_solutions[process_id];
-        auto& x_prev = *process_solutions_prev[process_id];
-        pcs.setInitialConditions(process_id, t0, x);
-        MathLib::LinAlg::finalizeAssembly(x);
+    for (auto& process_data : per_process_data)
+    {
+        auto& pcs = process_data->process;
+        auto const process_id = process_data->process_id;
+        pcs.setInitialConditions(process_solutions, process_solutions_prev, t0,
+                                 process_id);
 
+        auto& time_disc = *process_data->time_disc;
         time_disc.setInitialState(t0);     // push IC
-        MathLib::LinAlg::copy(x, x_prev);  // pushState
     }
 
     return {process_solutions, process_solutions_prev};