diff --git a/ProcessLib/HydroMechanics/HydroMechanicsFEM.h b/ProcessLib/HydroMechanics/HydroMechanicsFEM.h
index 0c60ac50520bf997681217d80d47cac36b5de8b3..628493238d2bd822cab9f16ac05d62b33b7561fd 100644
--- a/ProcessLib/HydroMechanics/HydroMechanicsFEM.h
+++ b/ProcessLib/HydroMechanics/HydroMechanicsFEM.h
@@ -178,7 +178,7 @@ public:
         }
     }
 
-    void postTimestepConcrete(std::vector<double> const& /*local_x*/,
+    void postTimestepConcrete(Eigen::VectorXd const& /*local_x*/,
                               double const /*t*/,
                               double const /*dt*/) override
     {
diff --git a/ProcessLib/HydroMechanics/HydroMechanicsProcess.cpp b/ProcessLib/HydroMechanics/HydroMechanicsProcess.cpp
index 9a49750ad6840d5dd8bd3cc6d0a9d15169de4efa..1de73f250041b5514280d9724eecc94f1942f710 100644
--- a/ProcessLib/HydroMechanics/HydroMechanicsProcess.cpp
+++ b/ProcessLib/HydroMechanics/HydroMechanicsProcess.cpp
@@ -492,12 +492,24 @@ void HydroMechanicsProcess<DisplacementDim>::postTimestepConcreteProcess(
     std::vector<GlobalVector*> const& x, double const t, double const dt,
     const int process_id)
 {
+    if (process_id != 0)
+    {
+        return;
+    }
+
     DBUG("PostTimestep HydroMechanicsProcess.");
+    std::vector<NumLib::LocalToGlobalIndexMap const*> dof_tables;
+    auto const n_processes = x.size();
+    dof_tables.reserve(n_processes);
+    for (std::size_t process_id = 0; process_id < n_processes; ++process_id)
+    {
+        dof_tables.push_back(&getDOFTable(process_id));
+    }
+
     ProcessLib::ProcessVariable const& pv = getProcessVariables(process_id)[0];
     GlobalExecutor::executeSelectedMemberOnDereferenced(
         &LocalAssemblerIF::postTimestep, _local_assemblers,
-        pv.getActiveElementIDs(), getDOFTable(process_id), *x[process_id], t,
-        dt);
+        pv.getActiveElementIDs(), dof_tables, x, t, dt);
 }
 
 template <int DisplacementDim>
diff --git a/ProcessLib/LIE/HydroMechanics/HydroMechanicsProcess.cpp b/ProcessLib/LIE/HydroMechanics/HydroMechanicsProcess.cpp
index b28d2aeff669450cb386b5698c2b214927eb4c0e..3d36d63cfe9b9838297b6fbd0ac9eb6c1339b28e 100644
--- a/ProcessLib/LIE/HydroMechanics/HydroMechanicsProcess.cpp
+++ b/ProcessLib/LIE/HydroMechanics/HydroMechanicsProcess.cpp
@@ -459,19 +459,28 @@ void HydroMechanicsProcess<GlobalDim>::postTimestepConcreteProcess(
     std::vector<GlobalVector*> const& x, const double t, double const dt,
     int const process_id)
 {
-    DBUG("Compute the secondary variables for HydroMechanicsProcess.");
-    const auto& dof_table = getDOFTable(process_id);
-
+    if (process_id == 0)
     {
+        DBUG("PostTimestep HydroMechanicsProcess.");
+        std::vector<NumLib::LocalToGlobalIndexMap const*> dof_tables;
+        auto const n_processes = x.size();
+        dof_tables.reserve(n_processes);
+        for (std::size_t process_id = 0; process_id < n_processes; ++process_id)
+        {
+            dof_tables.push_back(&getDOFTable(process_id));
+        }
+
         ProcessLib::ProcessVariable const& pv =
             getProcessVariables(process_id)[0];
-
         GlobalExecutor::executeSelectedMemberOnDereferenced(
             &HydroMechanicsLocalAssemblerInterface::postTimestep,
-            _local_assemblers, pv.getActiveElementIDs(), dof_table,
-            *x[process_id], t, dt);
+            _local_assemblers, pv.getActiveElementIDs(), dof_tables, x, t, dt);
     }
 
+    DBUG("Compute the secondary variables for HydroMechanicsProcess.");
+
+    const auto& dof_table = getDOFTable(process_id);
+
     // Copy displacement jumps in a solution vector to mesh property
     // Remark: the copy is required because mesh properties for primary
     // variables are set during output and are not ready yet when this function
diff --git a/ProcessLib/LIE/HydroMechanics/LocalAssembler/HydroMechanicsLocalAssemblerInterface.h b/ProcessLib/LIE/HydroMechanics/LocalAssembler/HydroMechanicsLocalAssemblerInterface.h
index ae1a9a5f6494eec677e1bee9d83ff6320a18fef8..28b2b3057c900de0d6336f891f0dcb2af1059b29 100644
--- a/ProcessLib/LIE/HydroMechanics/LocalAssembler/HydroMechanicsLocalAssemblerInterface.h
+++ b/ProcessLib/LIE/HydroMechanics/LocalAssembler/HydroMechanicsLocalAssemblerInterface.h
@@ -100,13 +100,11 @@ public:
         }
     }
 
-    void postTimestepConcrete(std::vector<double> const& local_x_,
-                              const double t, double const dt) override
+    void postTimestepConcrete(Eigen::VectorXd const& local_x_, const double t,
+                              double const dt) override
     {
-        auto const local_dof_size = local_x_.size();
-
         _local_u.setZero();
-        for (unsigned i = 0; i < local_dof_size; i++)
+        for (Eigen::Index i = 0; i < local_x_.rows(); i++)
         {
             _local_u[_dofIndex_to_localIndex[i]] = local_x_[i];
         }
diff --git a/ProcessLib/PhaseField/PhaseFieldFEM.h b/ProcessLib/PhaseField/PhaseFieldFEM.h
index 99eb32c2e26fb6950aeb548f82167e6e98196cab..4cf82b832f9ba6f7e61b364aa762b638b283ff9c 100644
--- a/ProcessLib/PhaseField/PhaseFieldFEM.h
+++ b/ProcessLib/PhaseField/PhaseFieldFEM.h
@@ -240,7 +240,7 @@ public:
         }
     }
 
-    void postTimestepConcrete(std::vector<double> const& /*local_x*/,
+    void postTimestepConcrete(Eigen::VectorXd const& /*local_x*/,
                               double const /*t*/, double const /*dt*/) override
     {
         unsigned const n_integration_points =
diff --git a/ProcessLib/RichardsMechanics/RichardsMechanicsFEM.h b/ProcessLib/RichardsMechanics/RichardsMechanicsFEM.h
index 1144d6202c37c5146bf159223ecbda90875155a9..21ee566a251de7abc052890cb0de1f61b43467b8 100644
--- a/ProcessLib/RichardsMechanics/RichardsMechanicsFEM.h
+++ b/ProcessLib/RichardsMechanics/RichardsMechanicsFEM.h
@@ -147,7 +147,7 @@ public:
         }
     }
 
-    void postTimestepConcrete(std::vector<double> const& /*local_x*/,
+    void postTimestepConcrete(Eigen::VectorXd const& /*local_x*/,
                               double const /*t*/,
                               double const /*dt*/) override
     {
diff --git a/ProcessLib/RichardsMechanics/RichardsMechanicsProcess.cpp b/ProcessLib/RichardsMechanics/RichardsMechanicsProcess.cpp
index eef023aebb2cd2f19e575344fd56d47e0fd89b7f..9c25eb185a482c75f1e4c859ac543c9f095b4001 100644
--- a/ProcessLib/RichardsMechanics/RichardsMechanicsProcess.cpp
+++ b/ProcessLib/RichardsMechanics/RichardsMechanicsProcess.cpp
@@ -543,16 +543,22 @@ void RichardsMechanicsProcess<DisplacementDim>::postTimestepConcreteProcess(
     std::vector<GlobalVector*> const& x, double const t, double const dt,
     const int process_id)
 {
-    DBUG("PostTimestep RichardsMechanicsProcess.");
-
     if (hasMechanicalProcess(process_id))
     {
+        DBUG("PostTimestep RichardsMechanicsProcess.");
+        std::vector<NumLib::LocalToGlobalIndexMap const*> dof_tables;
+        auto const n_processes = x.size();
+        dof_tables.reserve(n_processes);
+        for (std::size_t process_id = 0; process_id < n_processes; ++process_id)
+        {
+            dof_tables.push_back(&getDOFTable(process_id));
+        }
+
         ProcessLib::ProcessVariable const& pv =
             getProcessVariables(process_id)[0];
         GlobalExecutor::executeSelectedMemberOnDereferenced(
             &LocalAssemblerIF::postTimestep, _local_assemblers,
-            pv.getActiveElementIDs(), *_local_to_global_index_map,
-            *x[process_id], t, dt);
+            pv.getActiveElementIDs(), dof_tables, x, t, dt);
     }
 }
 
diff --git a/ProcessLib/SmallDeformation/SmallDeformationFEM.h b/ProcessLib/SmallDeformation/SmallDeformationFEM.h
index 514af43e48c11c1b1be6971a23db0de8ec7a0e11..364fbacea231b2efbd0a29de5db57d8dfc214f9e 100644
--- a/ProcessLib/SmallDeformation/SmallDeformationFEM.h
+++ b/ProcessLib/SmallDeformation/SmallDeformationFEM.h
@@ -319,7 +319,7 @@ public:
         }
     }
 
-    void postTimestepConcrete(std::vector<double> const& /*local_x*/,
+    void postTimestepConcrete(Eigen::VectorXd const& /*local_x*/,
                               double const t, double const dt) override
     {
         unsigned const n_integration_points =
diff --git a/ProcessLib/SmallDeformation/SmallDeformationProcess.cpp b/ProcessLib/SmallDeformation/SmallDeformationProcess.cpp
index 18ae3ae47e86f42be2466022e419922e0006f96e..0dce94e2b844eb3bdf3be0ed451a5ae5bde16c0a 100644
--- a/ProcessLib/SmallDeformation/SmallDeformationProcess.cpp
+++ b/ProcessLib/SmallDeformation/SmallDeformationProcess.cpp
@@ -245,13 +245,15 @@ void SmallDeformationProcess<DisplacementDim>::postTimestepConcreteProcess(
     int const process_id)
 {
     DBUG("PostTimestep SmallDeformationProcess.");
+    std::vector<NumLib::LocalToGlobalIndexMap const*> dof_tables;
+    dof_tables.reserve(x.size());
+    std::generate_n(std::back_inserter(dof_tables), x.size(),
+                    [&]() { return _local_to_global_index_map.get(); });
 
     ProcessLib::ProcessVariable const& pv = getProcessVariables(process_id)[0];
-
     GlobalExecutor::executeSelectedMemberOnDereferenced(
         &LocalAssemblerInterface::postTimestep, _local_assemblers,
-        pv.getActiveElementIDs(), *_local_to_global_index_map, *x[process_id],
-        t, dt);
+        pv.getActiveElementIDs(), dof_tables, x, t, dt);
 
     std::unique_ptr<GlobalVector> material_forces;
     ProcessLib::SmallDeformation::writeMaterialForces(
diff --git a/ProcessLib/SmallDeformationNonlocal/SmallDeformationNonlocalFEM.h b/ProcessLib/SmallDeformationNonlocal/SmallDeformationNonlocalFEM.h
index a228f3314fa1d213837f9fedeb5c44443762ddb3..1e3f34bde55e9cc8c36465a83afffa183ae652e5 100644
--- a/ProcessLib/SmallDeformationNonlocal/SmallDeformationNonlocalFEM.h
+++ b/ProcessLib/SmallDeformationNonlocal/SmallDeformationNonlocalFEM.h
@@ -529,7 +529,7 @@ public:
         }
     }
 
-    void postTimestepConcrete(std::vector<double> const& /*local_x*/,
+    void postTimestepConcrete(Eigen::VectorXd const& /*local_x*/,
                               double const /*t*/, double const /*dt*/) override
     {
         unsigned const n_integration_points =
diff --git a/ProcessLib/SmallDeformationNonlocal/SmallDeformationNonlocalProcess.cpp b/ProcessLib/SmallDeformationNonlocal/SmallDeformationNonlocalProcess.cpp
index 5b3db21887d70511abb53b9eb6a7ddfb4542d40a..32e9cb34673974af51c30389cf037ee4a23285a6 100644
--- a/ProcessLib/SmallDeformationNonlocal/SmallDeformationNonlocalProcess.cpp
+++ b/ProcessLib/SmallDeformationNonlocal/SmallDeformationNonlocalProcess.cpp
@@ -302,13 +302,15 @@ void SmallDeformationNonlocalProcess<DisplacementDim>::
                                 int const process_id)
 {
     DBUG("PostTimestep SmallDeformationNonlocalProcess.");
+    std::vector<NumLib::LocalToGlobalIndexMap const*> dof_tables;
+    dof_tables.reserve(x.size());
+    std::generate_n(std::back_inserter(dof_tables), x.size(),
+                    [&]() { return _local_to_global_index_map.get(); });
 
     ProcessLib::ProcessVariable const& pv = getProcessVariables(process_id)[0];
-
     GlobalExecutor::executeSelectedMemberOnDereferenced(
         &LocalAssemblerInterface::postTimestep, _local_assemblers,
-        pv.getActiveElementIDs(), *_local_to_global_index_map, *x[process_id],
-        t, dt);
+        pv.getActiveElementIDs(), dof_tables, x, t, dt);
 }
 
 template <int DisplacementDim>
diff --git a/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsFEM.h b/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsFEM.h
index e2815f5570b3dda44c1cf4eec6354f6a44cdf7b5..e75c3f3f64fa6c910c614a653594c7854d9ebed5 100644
--- a/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsFEM.h
+++ b/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsFEM.h
@@ -109,7 +109,7 @@ public:
         }
     }
 
-    void postTimestepConcrete(std::vector<double> const& /*local_x*/,
+    void postTimestepConcrete(Eigen::VectorXd const& /*local_x*/,
                               double const /*t*/,
                               double const /*dt*/) override
     {
diff --git a/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsProcess.cpp b/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsProcess.cpp
index 541a9bd71850b93e1cfb204d8117fbcf8815ee52..f2005fef5eb65e052e483425c4d97386862e70b7 100644
--- a/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsProcess.cpp
+++ b/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsProcess.cpp
@@ -350,10 +350,23 @@ void ThermoHydroMechanicsProcess<DisplacementDim>::postTimestepConcreteProcess(
     std::vector<GlobalVector*> const& x, double const t, double const dt,
     const int process_id)
 {
+    if (process_id != 0)
+    {
+        return;
+    }
+
     DBUG("PostTimestep ThermoHydroMechanicsProcess.");
+    std::vector<NumLib::LocalToGlobalIndexMap const*> dof_tables;
+    auto const n_processes = x.size();
+    dof_tables.reserve(n_processes);
+    for (std::size_t process_id = 0; process_id < n_processes; ++process_id)
+    {
+        dof_tables.push_back(&getDOFTable(process_id));
+    }
+
     GlobalExecutor::executeMemberOnDereferenced(
-        &LocalAssemblerInterface::postTimestep, _local_assemblers,
-        getDOFTable(process_id), *x[process_id], t, dt);
+        &LocalAssemblerInterface::postTimestep, _local_assemblers, dof_tables,
+        x, t, dt);
 }
 
 template <int DisplacementDim>
diff --git a/ProcessLib/ThermoMechanicalPhaseField/ThermoMechanicalPhaseFieldFEM.h b/ProcessLib/ThermoMechanicalPhaseField/ThermoMechanicalPhaseFieldFEM.h
index e30adfb8d2a70957b9582bf952a62a717da3fd05..0b96b2c5b2d5bac157b8a647fd1ff9319b7aabdd 100644
--- a/ProcessLib/ThermoMechanicalPhaseField/ThermoMechanicalPhaseFieldFEM.h
+++ b/ProcessLib/ThermoMechanicalPhaseField/ThermoMechanicalPhaseFieldFEM.h
@@ -254,7 +254,7 @@ public:
         }
     }
 
-    void postTimestepConcrete(std::vector<double> const& /*local_x*/,
+    void postTimestepConcrete(Eigen::VectorXd const& /*local_x*/,
                               double const /*t*/, double const /*dt*/) override
     {
         unsigned const n_integration_points =
diff --git a/ProcessLib/ThermoMechanicalPhaseField/ThermoMechanicalPhaseFieldProcess.cpp b/ProcessLib/ThermoMechanicalPhaseField/ThermoMechanicalPhaseFieldProcess.cpp
index be8b63c9ecb4869a7a066b5ab88bd59a594d9d53..c35d0d6e4a363d85320099d1b6f4419dcbfb30d4 100644
--- a/ProcessLib/ThermoMechanicalPhaseField/ThermoMechanicalPhaseFieldProcess.cpp
+++ b/ProcessLib/ThermoMechanicalPhaseField/ThermoMechanicalPhaseFieldProcess.cpp
@@ -286,14 +286,24 @@ void ThermoMechanicalPhaseFieldProcess<DisplacementDim>::
                                 double const dt,
                                 int const process_id)
 {
+    if (process_id != 0)
+    {
+        return;
+    }
+
     DBUG("PostTimestep ThermoMechanicalPhaseFieldProcess.");
+    std::vector<NumLib::LocalToGlobalIndexMap const*> dof_tables;
+    auto const n_processes = x.size();
+    dof_tables.reserve(n_processes);
+    for (std::size_t process_id = 0; process_id < n_processes; ++process_id)
+    {
+        dof_tables.push_back(&getDOFTable(process_id));
+    }
 
     ProcessLib::ProcessVariable const& pv = getProcessVariables(process_id)[0];
-
     GlobalExecutor::executeSelectedMemberOnDereferenced(
         &ThermoMechanicalPhaseFieldLocalAssemblerInterface::postTimestep,
-        _local_assemblers, pv.getActiveElementIDs(), getDOFTable(process_id),
-        *x[process_id], t, dt);
+        _local_assemblers, pv.getActiveElementIDs(), dof_tables, x, t, dt);
 }
 
 template <int DisplacementDim>
diff --git a/ProcessLib/ThermoMechanics/ThermoMechanicsFEM.h b/ProcessLib/ThermoMechanics/ThermoMechanicsFEM.h
index 2e0a384c3e729fdf25d00ae0bab236263aac6cbb..844c751258678d4d8f39cd6da9b9da567bfd0993 100644
--- a/ProcessLib/ThermoMechanics/ThermoMechanicsFEM.h
+++ b/ProcessLib/ThermoMechanics/ThermoMechanicsFEM.h
@@ -182,7 +182,7 @@ public:
         }
     }
 
-    void postTimestepConcrete(std::vector<double> const& /*local_x*/,
+    void postTimestepConcrete(Eigen::VectorXd const& /*local_x*/,
                               double const /*t*/, double const /*dt*/) override
     {
         unsigned const n_integration_points =
diff --git a/ProcessLib/ThermoMechanics/ThermoMechanicsProcess.cpp b/ProcessLib/ThermoMechanics/ThermoMechanicsProcess.cpp
index 6b73b7bf16dbbfde35fad0db54f1cdd0cfe4ce0e..3be338663c5ea9edd4bf37335adba480a2ca6ade 100644
--- a/ProcessLib/ThermoMechanics/ThermoMechanicsProcess.cpp
+++ b/ProcessLib/ThermoMechanics/ThermoMechanicsProcess.cpp
@@ -415,19 +415,24 @@ void ThermoMechanicsProcess<DisplacementDim>::postTimestepConcreteProcess(
     std::vector<GlobalVector*> const& x, double const t, double const dt,
     int const process_id)
 {
-    if (process_id != _process_data.mechanics_process_id)
+    if (process_id != 0)
     {
         return;
     }
 
     DBUG("PostTimestep ThermoMechanicsProcess.");
+    std::vector<NumLib::LocalToGlobalIndexMap const*> dof_tables;
+    auto const n_processes = x.size();
+    dof_tables.reserve(n_processes);
+    for (std::size_t process_id = 0; process_id < n_processes; ++process_id)
+    {
+        dof_tables.push_back(&getDOFTable(process_id));
+    }
 
     ProcessLib::ProcessVariable const& pv = getProcessVariables(process_id)[0];
-
     GlobalExecutor::executeSelectedMemberOnDereferenced(
         &LocalAssemblerInterface::postTimestep, _local_assemblers,
-        pv.getActiveElementIDs(), *_local_to_global_index_map, *x[process_id],
-        t, dt);
+        pv.getActiveElementIDs(), dof_tables, x, t, dt);
 }
 
 template <int DisplacementDim>