diff --git a/ProcessLib/HydroMechanics/HydroMechanicsFEM-impl.h b/ProcessLib/HydroMechanics/HydroMechanicsFEM-impl.h
index 25ef4318efd499c18045c85e856700b9ba5b3de6..d06402f925d1aa9178caae5362f98c87be0c0f06 100644
--- a/ProcessLib/HydroMechanics/HydroMechanicsFEM-impl.h
+++ b/ProcessLib/HydroMechanics/HydroMechanicsFEM-impl.h
@@ -815,7 +815,7 @@ template <typename ShapeFunctionDisplacement, typename ShapeFunctionPressure,
           int DisplacementDim>
 void HydroMechanicsLocalAssembler<ShapeFunctionDisplacement,
                                   ShapeFunctionPressure, DisplacementDim>::
-    setInitialConditionsConcrete(std::vector<double> const& local_x,
+    setInitialConditionsConcrete(Eigen::VectorXd const& local_x,
                                  double const t,
                                  bool const use_monolithic_scheme,
                                  int const process_id)
@@ -835,20 +835,10 @@ void HydroMechanicsLocalAssembler<ShapeFunctionDisplacement,
         auto const& medium =
             _process_data.media_map.getMedium(_element.getID());
 
-        int const displacement_offset =
-            use_monolithic_scheme ? displacement_index : 0;
-
+        auto const p = local_x.template segment<pressure_size>(pressure_index);
         auto const u =
-            Eigen::Map<typename ShapeMatricesTypeDisplacement::
-                           template VectorType<displacement_size> const>(
-                local_x.data() + displacement_offset, displacement_size);
-
-        int const pressure_offset = use_monolithic_scheme ? pressure_index : 0;
+            local_x.template segment<displacement_size>(displacement_index);
 
-        auto const p =
-            Eigen::Map<typename ShapeMatricesTypePressure::template VectorType<
-                pressure_size> const>(local_x.data() + pressure_offset,
-                                      pressure_size);
         auto const& identity2 = Invariants::identity2;
         const double dt = 0.0;
 
diff --git a/ProcessLib/HydroMechanics/HydroMechanicsFEM.h b/ProcessLib/HydroMechanics/HydroMechanicsFEM.h
index c4920e366d16da448233f25f8ca3e28007c69031..047d144a3086df76b3fc18651ded82de74300ca0 100644
--- a/ProcessLib/HydroMechanics/HydroMechanicsFEM.h
+++ b/ProcessLib/HydroMechanics/HydroMechanicsFEM.h
@@ -276,7 +276,7 @@ public:
                                      double const t, double const dt,
                                      int const process_id) override;
 
-    void setInitialConditionsConcrete(std::vector<double> const& local_x,
+    void setInitialConditionsConcrete(Eigen::VectorXd const& local_x,
                                       double const t,
                                       bool const use_monolithic_scheme,
                                       int const process_id) override;
diff --git a/ProcessLib/LocalAssemblerInterface.cpp b/ProcessLib/LocalAssemblerInterface.cpp
index 83a8a2935cb7251b5d2250bba4bd43dfbd1ef636..142e2ae62561ed5e956a6e59385090c6b8ea41ae 100644
--- a/ProcessLib/LocalAssemblerInterface.cpp
+++ b/ProcessLib/LocalAssemblerInterface.cpp
@@ -105,8 +105,10 @@ void LocalAssemblerInterface::setInitialConditions(
 {
     auto const indices = NumLib::getIndices(mesh_item_id, dof_table);
     auto const local_x = x.get(indices);
+    auto const local_x_eigen_map = MathLib::toVector(local_x);
 
-    setInitialConditionsConcrete(local_x, t, use_monolithic_scheme, process_id);
+    setInitialConditionsConcrete(local_x_eigen_map, t, use_monolithic_scheme,
+                                 process_id);
 }
 
 void LocalAssemblerInterface::initialize(
diff --git a/ProcessLib/LocalAssemblerInterface.h b/ProcessLib/LocalAssemblerInterface.h
index 0cd1b9131236e1476c989e6d3e6fdb26e9761254..36c7621e96dd6cb0a74750d912f9b367a6e42739 100644
--- a/ProcessLib/LocalAssemblerInterface.h
+++ b/ProcessLib/LocalAssemblerInterface.h
@@ -33,11 +33,10 @@ class LocalAssemblerInterface
 public:
     virtual ~LocalAssemblerInterface() = default;
 
-    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 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);
@@ -121,7 +120,7 @@ public:
 
 private:
     virtual void setInitialConditionsConcrete(
-        std::vector<double> const& /*local_x*/, double const /*t*/,
+        Eigen::VectorXd const& /*local_x*/, double const /*t*/,
         bool const /*use_monolithic_scheme*/, int const /*process_id*/)
     {
     }
diff --git a/ProcessLib/RichardsMechanics/RichardsMechanicsFEM-impl.h b/ProcessLib/RichardsMechanics/RichardsMechanicsFEM-impl.h
index 57f6633df6b2214b214e2b7207ef9d75c90257b0..fd36d170b1d527411f9e7956ba8c57e6ac411066 100644
--- a/ProcessLib/RichardsMechanics/RichardsMechanicsFEM-impl.h
+++ b/ProcessLib/RichardsMechanics/RichardsMechanicsFEM-impl.h
@@ -278,17 +278,14 @@ template <typename ShapeFunctionDisplacement, typename ShapeFunctionPressure,
           int DisplacementDim>
 void RichardsMechanicsLocalAssembler<ShapeFunctionDisplacement,
                                      ShapeFunctionPressure, DisplacementDim>::
-    setInitialConditionsConcrete(std::vector<double> const& local_x,
+    setInitialConditionsConcrete(Eigen::VectorXd const& local_x,
                                  double const t,
                                  bool const /*use_monolithic_scheme*/,
                                  int const /*process_id*/)
 {
     assert(local_x.size() == pressure_size + displacement_size);
 
-    auto p_L =
-        Eigen::Map<typename ShapeMatricesTypePressure::template VectorType<
-            pressure_size> const>(local_x.data() + pressure_index,
-                                  pressure_size);
+    auto const p_L = local_x.template segment<pressure_size>(pressure_index);
 
     constexpr double dt = std::numeric_limits<double>::quiet_NaN();
     auto const& medium = _process_data.media_map.getMedium(_element.getID());
diff --git a/ProcessLib/RichardsMechanics/RichardsMechanicsFEM.h b/ProcessLib/RichardsMechanics/RichardsMechanicsFEM.h
index 4befcbabdf9cd7ad753b6538a6425cd77d448941..91a46c8839214317885158b0b33124280e9e4b5a 100644
--- a/ProcessLib/RichardsMechanics/RichardsMechanicsFEM.h
+++ b/ProcessLib/RichardsMechanics/RichardsMechanicsFEM.h
@@ -94,7 +94,7 @@ public:
         double const* values,
         int const integration_order) override;
 
-    void setInitialConditionsConcrete(std::vector<double> const& local_x,
+    void setInitialConditionsConcrete(Eigen::VectorXd const& local_x,
                                       double const t,
                                       bool const use_monolithic_scheme,
                                       int const process_id) override;
diff --git a/ProcessLib/TH2M/TH2MFEM-impl.h b/ProcessLib/TH2M/TH2MFEM-impl.h
index aaed4f0659b66623ecc128d6710a38fb355841f7..86153b8440746c92f716d85e65bcace73511d2dc 100644
--- a/ProcessLib/TH2M/TH2MFEM-impl.h
+++ b/ProcessLib/TH2M/TH2MFEM-impl.h
@@ -852,7 +852,7 @@ template <typename ShapeFunctionDisplacement, typename ShapeFunctionPressure,
           int DisplacementDim>
 void TH2MLocalAssembler<ShapeFunctionDisplacement, ShapeFunctionPressure,
                         DisplacementDim>::
-    setInitialConditionsConcrete(std::vector<double> const& local_x_data,
+    setInitialConditionsConcrete(Eigen::VectorXd const& local_x,
                                  double const t,
                                  bool const /*use_monolithic_scheme*/,
                                  int const /*process_id*/)
@@ -861,10 +861,8 @@ void TH2MLocalAssembler<ShapeFunctionDisplacement, ShapeFunctionPressure,
         gas_pressure_size + capillary_pressure_size + temperature_size +
         displacement_size;
 
-    assert(local_x_data.size() == matrix_size);
+    assert(local_x.size() == matrix_size);
 
-    auto const local_x = Eigen::Map<Eigen::VectorXd const>(local_x_data.data(),
-                                                           local_x_data.size());
     auto const capillary_pressure =
         local_x.template segment<capillary_pressure_size>(
             capillary_pressure_index);
diff --git a/ProcessLib/TH2M/TH2MFEM.h b/ProcessLib/TH2M/TH2MFEM.h
index 89ce5051405c679b981244d4bf6b3e08176754e0..05f1d58611a98ed88e8d32ff31f4630ce370b6f1 100644
--- a/ProcessLib/TH2M/TH2MFEM.h
+++ b/ProcessLib/TH2M/TH2MFEM.h
@@ -95,7 +95,7 @@ private:
         double const* values,
         int const integration_order) override;
 
-    void setInitialConditionsConcrete(std::vector<double> const& local_x_data,
+    void setInitialConditionsConcrete(Eigen::VectorXd const& local_x,
                                       double const t,
                                       bool const /*use_monolithic_scheme*/,
                                       int const /*process_id*/) override;
diff --git a/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsFEM-impl.h b/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsFEM-impl.h
index af2bb66c917f134640309e1be85603ff314b3e84..a48c330da71ad07c5da1b119c6f14fc446f49888 100644
--- a/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsFEM-impl.h
+++ b/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsFEM-impl.h
@@ -176,7 +176,7 @@ template <typename ShapeFunctionDisplacement, typename ShapeFunctionPressure,
           int DisplacementDim>
 void ThermoHydroMechanicsLocalAssembler<
     ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim>::
-    setInitialConditionsConcrete(std::vector<double> const& local_x,
+    setInitialConditionsConcrete(Eigen::VectorXd const& local_x,
                                  double const t,
                                  bool const /*use_monolithic_scheme*/,
                                  int const /*process_id*/)
@@ -189,10 +189,8 @@ void ThermoHydroMechanicsLocalAssembler<
     // TODO: For staggered scheme, overload
     // LocalAssemblerInterface::setInitialConditions to enable local_x contains
     // the primary variables from all coupled processes.
-    auto const p =
-        Eigen::Map<typename ShapeMatricesTypePressure::template VectorType<
-            pressure_size> const>(local_x.data() + pressure_index,
-                                  pressure_size);
+    auto const p = local_x.template segment<pressure_size>(pressure_index);
+
     double const dt = 0.0;
 
     MPL::VariableArray vars;
diff --git a/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsFEM.h b/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsFEM.h
index d82f37892014b41a48ecc1fe48783141b048330d..aafb9fd37c8bf2ed1ce1febbce0fb5d133a79079 100644
--- a/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsFEM.h
+++ b/ProcessLib/ThermoHydroMechanics/ThermoHydroMechanicsFEM.h
@@ -151,7 +151,7 @@ public:
         }
     }
 
-    void setInitialConditionsConcrete(std::vector<double> const& local_x,
+    void setInitialConditionsConcrete(Eigen::VectorXd const& local_x,
                                       double const t,
                                       bool const use_monolithic_scheme,
                                       int const process_id) override;
diff --git a/ProcessLib/ThermoRichardsFlow/ThermoRichardsFlowFEM-impl.h b/ProcessLib/ThermoRichardsFlow/ThermoRichardsFlowFEM-impl.h
index 0cfedaccb574a7c2867720ed95651bcbe58859cb..eceb1e2bb035c23303895d7c14ced50ff44ec6ba 100644
--- a/ProcessLib/ThermoRichardsFlow/ThermoRichardsFlowFEM-impl.h
+++ b/ProcessLib/ThermoRichardsFlow/ThermoRichardsFlowFEM-impl.h
@@ -109,16 +109,14 @@ std::size_t ThermoRichardsFlowLocalAssembler<ShapeFunction, GlobalDim>::
 
 template <typename ShapeFunction, int GlobalDim>
 void ThermoRichardsFlowLocalAssembler<ShapeFunction, GlobalDim>::
-    setInitialConditionsConcrete(std::vector<double> const& local_x,
+    setInitialConditionsConcrete(Eigen::VectorXd const& local_x,
                                  double const t,
                                  bool const /*use_monolithic_scheme*/,
                                  int const /*process_id*/)
 {
     assert(local_x.size() == temperature_size + pressure_size);
 
-    auto p_L = Eigen::Map<
-        typename ShapeMatricesType::template VectorType<pressure_size> const>(
-        local_x.data() + pressure_index, pressure_size);
+    auto const p_L = local_x.template segment<pressure_size>(pressure_index);
 
     auto const& medium = *_process_data.media_map.getMedium(_element.getID());
     MPL::VariableArray variables;
diff --git a/ProcessLib/ThermoRichardsFlow/ThermoRichardsFlowFEM.h b/ProcessLib/ThermoRichardsFlow/ThermoRichardsFlowFEM.h
index 2da0c458e1042a3158137f23f62a8bb7ffa26842..b50029b06eb00cf8cc151e32fcc6172dddbe1b3f 100644
--- a/ProcessLib/ThermoRichardsFlow/ThermoRichardsFlowFEM.h
+++ b/ProcessLib/ThermoRichardsFlow/ThermoRichardsFlowFEM.h
@@ -63,7 +63,7 @@ public:
         double const* values,
         int const integration_order) override;
 
-    void setInitialConditionsConcrete(std::vector<double> const& local_x,
+    void setInitialConditionsConcrete(Eigen::VectorXd const& local_x,
                                       double const t,
                                       bool const /*use_monolithic_scheme*/,
                                       int const /*process_id*/) override;
diff --git a/ProcessLib/ThermoRichardsMechanics/ThermoRichardsMechanicsFEM-impl.h b/ProcessLib/ThermoRichardsMechanics/ThermoRichardsMechanicsFEM-impl.h
index 1cf8ab51c7c557454c88f0e87bb3aaa6a2676ce1..b71cf10832a0664095aa76d4e0d4f87fd5baf503 100644
--- a/ProcessLib/ThermoRichardsMechanics/ThermoRichardsMechanicsFEM-impl.h
+++ b/ProcessLib/ThermoRichardsMechanics/ThermoRichardsMechanicsFEM-impl.h
@@ -86,7 +86,7 @@ template <typename ShapeFunctionDisplacement, typename ShapeFunction,
 void ThermoRichardsMechanicsLocalAssembler<ShapeFunctionDisplacement,
                                            ShapeFunction, DisplacementDim,
                                            ConstitutiveTraits>::
-    setInitialConditionsConcrete(std::vector<double> const& local_x,
+    setInitialConditionsConcrete(Eigen::VectorXd const& local_x,
                                  double const t,
                                  bool const /*use_monolithic_scheme*/,
                                  int const /*process_id*/)
@@ -94,13 +94,9 @@ void ThermoRichardsMechanicsLocalAssembler<ShapeFunctionDisplacement,
     assert(local_x.size() ==
            temperature_size + pressure_size + displacement_size);
 
-    auto const p_L = Eigen::Map<
-        typename ShapeMatricesType::template VectorType<pressure_size> const>(
-        local_x.data() + pressure_index, pressure_size);
-
-    auto const T = Eigen::Map<typename ShapeMatricesType::template VectorType<
-        temperature_size> const>(local_x.data() + temperature_index,
-                                 temperature_size);
+    auto const p_L = local_x.template segment<pressure_size>(pressure_index);
+    auto const T =
+        local_x.template segment<temperature_size>(temperature_index);
 
     constexpr double dt = std::numeric_limits<double>::quiet_NaN();
     auto const& medium =
diff --git a/ProcessLib/ThermoRichardsMechanics/ThermoRichardsMechanicsFEM.h b/ProcessLib/ThermoRichardsMechanics/ThermoRichardsMechanicsFEM.h
index 5cf6556c24856fb1d9d7cab897b92ec161df747a..4fe54313a3572bae9d24863662b2442a4bc24c6b 100644
--- a/ProcessLib/ThermoRichardsMechanics/ThermoRichardsMechanicsFEM.h
+++ b/ProcessLib/ThermoRichardsMechanics/ThermoRichardsMechanicsFEM.h
@@ -87,7 +87,7 @@ public:
         ThermoRichardsMechanicsProcessData<DisplacementDim, ConstitutiveTraits>&
             process_data);
 
-    void setInitialConditionsConcrete(std::vector<double> const& local_x,
+    void setInitialConditionsConcrete(Eigen::VectorXd const& local_x,
                                       double const t,
                                       bool const use_monolithic_scheme,
                                       int const process_id) override;