diff --git a/MaterialLib/PorousMedium/CreatePorousMediaProperties.cpp b/MaterialLib/PorousMedium/CreatePorousMediaProperties.cpp
index 45ac97c4f86566aed8564ea31b7b6d61dfef172c..4e524bd1380baa2ec6e70ad99d258f010f80c70b 100644
--- a/MaterialLib/PorousMedium/CreatePorousMediaProperties.cpp
+++ b/MaterialLib/PorousMedium/CreatePorousMediaProperties.cpp
@@ -76,19 +76,11 @@ PorousMediaProperties createPorousMediaProperties(
     BaseLib::reorderVector(porosity_models, mat_ids);
     BaseLib::reorderVector(storage_models, mat_ids);
 
-    std::vector<int> material_ids(mesh.getNumberOfElements());
-    if (mesh.getProperties().existsPropertyVector<int>(
-            "MaterialIDs", MeshLib::MeshItemType::Cell, 1))
-    {
-        auto const& mesh_material_ids =
-            mesh.getProperties().getPropertyVector<int>(
-                "MaterialIDs", MeshLib::MeshItemType::Cell, 1);
-        material_ids.reserve(mesh_material_ids->size());
-        std::copy(mesh_material_ids->cbegin(), mesh_material_ids->cend(),
-                  material_ids.begin());
-    }
+    auto const material_ids = materialIDs(mesh);
     int const max_material_id =
-        *std::max_element(material_ids.cbegin(), material_ids.cend());
+        !material_ids
+            ? 0
+            : *std::max_element(begin(*material_ids), end(*material_ids));
 
     if (max_material_id > static_cast<int>(mat_ids.size() - 1))
         OGS_FATAL(
@@ -112,8 +104,7 @@ PorousMediaProperties createPorousMediaProperties(
 
     return PorousMediaProperties{std::move(porosity_models),
                                  std::move(intrinsic_permeability_models),
-                                 std::move(storage_models),
-                                 std::move(material_ids)};
+                                 std::move(storage_models), material_ids};
 }
 
 }  // namespace ComponentTransport
diff --git a/MaterialLib/PorousMedium/PorousMediaProperties.cpp b/MaterialLib/PorousMedium/PorousMediaProperties.cpp
index cdc37f81d5844fef7a9523b500f73d0ee68d5112..4213be83705deeddfec8774e3ffdb612ee511747 100644
--- a/MaterialLib/PorousMedium/PorousMediaProperties.cpp
+++ b/MaterialLib/PorousMedium/PorousMediaProperties.cpp
@@ -18,8 +18,7 @@ namespace PorousMedium
 int PorousMediaProperties::getMaterialID(
     ProcessLib::SpatialPosition const& pos) const
 {
-    int const element_id = pos.getElementID().get();
-    return _material_ids[element_id];
+    return _material_ids ? (*_material_ids)[pos.getElementID().get()] : 0;
 }
 
 MaterialLib::PorousMedium::Porosity const& PorousMediaProperties::getPorosity(
diff --git a/MaterialLib/PorousMedium/PorousMediaProperties.h b/MaterialLib/PorousMedium/PorousMediaProperties.h
index b37766dfdccffde83346e2aa34741d195e9de3ff..4424ccf0c9b0c445edf333204d89d64c55c9184c 100644
--- a/MaterialLib/PorousMedium/PorousMediaProperties.h
+++ b/MaterialLib/PorousMedium/PorousMediaProperties.h
@@ -36,23 +36,16 @@ public:
             intrinsic_permeability_models,
         std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>>&&
             specific_storage_models,
-        std::vector<int>&& material_ids)
+        MeshLib::PropertyVector<int> const* const material_ids)
         : _porosity_models(std::move(porosity_models)),
           _intrinsic_permeability_models(
               std::move(intrinsic_permeability_models)),
           _specific_storage_models(std::move(specific_storage_models)),
-          _material_ids(std::move(material_ids))
+          _material_ids(material_ids)
     {
     }
 
-    PorousMediaProperties(PorousMediaProperties&& other)
-        : _porosity_models(std::move(other._porosity_models)),
-          _intrinsic_permeability_models(
-              std::move(other._intrinsic_permeability_models)),
-          _specific_storage_models(std::move(other._specific_storage_models)),
-          _material_ids(other._material_ids)
-    {
-    }
+    PorousMediaProperties(PorousMediaProperties&& other) = default;
 
     MaterialLib::PorousMedium::Porosity const& getPorosity(
         double t, ProcessLib::SpatialPosition const& pos) const;
@@ -72,7 +65,7 @@ private:
         _intrinsic_permeability_models;
     std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>>
         _specific_storage_models;
-    std::vector<int> _material_ids;
+    MeshLib::PropertyVector<int> const* const _material_ids;
 };
 
 }
diff --git a/ProcessLib/LiquidFlow/CreateLiquidFlowMaterialProperties.cpp b/ProcessLib/LiquidFlow/CreateLiquidFlowMaterialProperties.cpp
index f699249430ea53658a984834ba1847ba3ab41cdd..1e94afb1f573f6de41d693a583c06b1b61a16f80 100644
--- a/ProcessLib/LiquidFlow/CreateLiquidFlowMaterialProperties.cpp
+++ b/ProcessLib/LiquidFlow/CreateLiquidFlowMaterialProperties.cpp
@@ -40,8 +40,7 @@ std::unique_ptr<LiquidFlowMaterialProperties>
 createLiquidFlowMaterialProperties(
     BaseLib::ConfigTree const& config,
     std::vector<std::unique_ptr<ParameterBase>> const& parameters,
-    bool const has_material_ids,
-    MeshLib::PropertyVector<int> const& material_ids)
+    MeshLib::PropertyVector<int> const* const material_ids)
 {
     DBUG("Reading material properties of liquid flow process.");
 
@@ -99,8 +98,7 @@ createLiquidFlowMaterialProperties(
 
     return std::make_unique<LiquidFlowMaterialProperties>(
         std::move(fluid_properties), std::move(intrinsic_permeability_models),
-        std::move(porosity_models), std::move(storage_models), has_material_ids,
-        material_ids);
+        std::move(porosity_models), std::move(storage_models), material_ids);
 }
 
 }  // end of namespace
diff --git a/ProcessLib/LiquidFlow/CreateLiquidFlowMaterialProperties.h b/ProcessLib/LiquidFlow/CreateLiquidFlowMaterialProperties.h
index eb908fbe7bf1dee5b31882a3180aadc1f7a6bbe6..b8ae712e80d956172fbfc42455a25daf09a3107d 100644
--- a/ProcessLib/LiquidFlow/CreateLiquidFlowMaterialProperties.h
+++ b/ProcessLib/LiquidFlow/CreateLiquidFlowMaterialProperties.h
@@ -45,8 +45,7 @@ std::unique_ptr<LiquidFlowMaterialProperties>
 createLiquidFlowMaterialProperties(
     BaseLib::ConfigTree const& config,
     std::vector<std::unique_ptr<ParameterBase>> const& parameters,
-    bool const has_material_ids,
-    MeshLib::PropertyVector<int> const& material_ids);
+    MeshLib::PropertyVector<int> const* const material_ids);
 
 }  // end of namespace
 }  // end of namespace
diff --git a/ProcessLib/LiquidFlow/CreateLiquidFlowProcess.cpp b/ProcessLib/LiquidFlow/CreateLiquidFlowProcess.cpp
index f8fc4511dc3923cc35a2f3b2e4b2e6f42516462c..3264dd7e1ce2801e1c4f3f6c976986e3ad2d65c2 100644
--- a/ProcessLib/LiquidFlow/CreateLiquidFlowProcess.cpp
+++ b/ProcessLib/LiquidFlow/CreateLiquidFlowProcess.cpp
@@ -91,39 +91,21 @@ std::unique_ptr<Process> createLiquidFlowProcess(
     //! \ogs_file_param{prj__processes__process__LIQUID_FLOW__material_property}
     auto const& mat_config = config.getConfigSubtree("material_property");
 
-    if (mesh.getProperties().existsPropertyVector<int>(
-            "MaterialIDs", MeshLib::MeshItemType::Cell, 1))
+    auto const material_ids = materialIDs(mesh);
+    if (material_ids)
     {
         INFO("The liquid flow is in heterogeneous porous media.");
-        const bool has_material_ids = true;
-        auto const& mat_ids = mesh.getProperties().getPropertyVector<int>(
-            "MaterialIDs", MeshLib::MeshItemType::Cell, 1);
-        return std::unique_ptr<Process>{new LiquidFlowProcess{
-            mesh, std::move(jacobian_assembler), parameters, integration_order,
-            std::move(process_variables), std::move(secondary_variables),
-            std::move(named_function_caller), *mat_ids, has_material_ids,
-            gravity_axis_id, g, reference_temperature, mat_config}};
     }
-
-    INFO("The liquid flow is in homogeneous porous media.");
-
-    MeshLib::Properties dummy_property;
-    // For a reference argument of LiquidFlowProcess(...).
-    auto const& dummy_property_vector =
-        dummy_property.createNewPropertyVector<int>(
-            "MaterialIDs", MeshLib::MeshItemType::Cell, 1);
-
-    // Since dummy_property_vector is only visible in this function,
-    // the following constant, has_material_ids, is employed to indicate
-    // that material_ids does not exist.
-    const bool has_material_ids = false;
+    else
+    {
+        INFO("The liquid flow is in homogeneous porous media.");
+    }
 
     return std::unique_ptr<Process>{new LiquidFlowProcess{
         mesh, std::move(jacobian_assembler), parameters, integration_order,
         std::move(process_variables), std::move(secondary_variables),
-        std::move(named_function_caller), *dummy_property_vector,
-        has_material_ids, gravity_axis_id, g, reference_temperature,
-        mat_config}};
+        std::move(named_function_caller), material_ids, gravity_axis_id, g,
+        reference_temperature, mat_config}};
 }
 
 }  // end of namespace
diff --git a/ProcessLib/LiquidFlow/LiquidFlowMaterialProperties.cpp b/ProcessLib/LiquidFlow/LiquidFlowMaterialProperties.cpp
index bc7aa51c7ccea8e9d12fe01c44a8bfa6b491b6c6..da7a9e0c464e3252a1b31f8d9346089421cf5d8f 100644
--- a/ProcessLib/LiquidFlow/LiquidFlowMaterialProperties.cpp
+++ b/ProcessLib/LiquidFlow/LiquidFlowMaterialProperties.cpp
@@ -33,13 +33,13 @@ namespace LiquidFlow
 int LiquidFlowMaterialProperties::getMaterialID(
     const SpatialPosition& pos) const
 {
-    if (!_has_material_ids)
+    if (!_material_ids)
     {
         return 0;
     }
 
-    assert(pos.getElementID().get() < _material_ids.size());
-    return _material_ids[pos.getElementID().get()];
+    assert(pos.getElementID().get() < _material_ids->size());
+    return (*_material_ids)[pos.getElementID().get()];
 }
 
 double LiquidFlowMaterialProperties::getLiquidDensity(const double p,
diff --git a/ProcessLib/LiquidFlow/LiquidFlowMaterialProperties.h b/ProcessLib/LiquidFlow/LiquidFlowMaterialProperties.h
index bafb35327de3896175649b9e922939c41b9a4b50..d95374c6b2fbb3684c5a33a4f399cfe0b37349b5 100644
--- a/ProcessLib/LiquidFlow/LiquidFlowMaterialProperties.h
+++ b/ProcessLib/LiquidFlow/LiquidFlowMaterialProperties.h
@@ -56,10 +56,8 @@ public:
             porosity_models,
         std::vector<std::unique_ptr<MaterialLib::PorousMedium::Storage>>&&
             storage_models,
-        bool const has_material_ids,
-        MeshLib::PropertyVector<int> const& material_ids)
-        : _has_material_ids(has_material_ids),
-          _material_ids(material_ids),
+        MeshLib::PropertyVector<int> const* const material_ids)
+        : _material_ids(material_ids),
           _fluid_properties(std::move(fluid_properties)),
           _intrinsic_permeability_models(
               std::move(intrinsic_permeability_models)),
@@ -106,13 +104,10 @@ public:
                        const double porosity_variable, const double T) const;
 
 private:
-    /// A flag to indicate whether the reference member, _material_ids,
-    /// is not assigned.
-    const bool _has_material_ids;
     /** Use porous medium models for different material zones.
      *  Material IDs must be given as mesh element properties.
      */
-    MeshLib::PropertyVector<int> const& _material_ids;
+    MeshLib::PropertyVector<int> const* const _material_ids;
 
     const std::unique_ptr<MaterialLib::Fluid::FluidProperties>
         _fluid_properties;
diff --git a/ProcessLib/LiquidFlow/LiquidFlowProcess.cpp b/ProcessLib/LiquidFlow/LiquidFlowProcess.cpp
index 8c04ad6d3c694ddf6aed3ec7fffc903b057f01c4..3e113c5d9679f546997c2887dbcad06c48503218 100644
--- a/ProcessLib/LiquidFlow/LiquidFlowProcess.cpp
+++ b/ProcessLib/LiquidFlow/LiquidFlowProcess.cpp
@@ -39,8 +39,7 @@ LiquidFlowProcess::LiquidFlowProcess(
         process_variables,
     SecondaryVariableCollection&& secondary_variables,
     NumLib::NamedFunctionCaller&& named_function_caller,
-    MeshLib::PropertyVector<int> const& material_ids,
-    bool const has_material_ids,
+    MeshLib::PropertyVector<int> const* const material_ids,
     int const gravitational_axis_id,
     double const gravitational_acceleration,
     double const reference_temperature,
@@ -51,8 +50,8 @@ LiquidFlowProcess::LiquidFlowProcess(
       _gravitational_axis_id(gravitational_axis_id),
       _gravitational_acceleration(gravitational_acceleration),
       _reference_temperature(reference_temperature),
-      _material_properties(createLiquidFlowMaterialProperties(
-          config, parameters, has_material_ids, material_ids))
+      _material_properties(
+          createLiquidFlowMaterialProperties(config, parameters, material_ids))
 {
     DBUG("Create Liquid flow process.");
 }
diff --git a/ProcessLib/LiquidFlow/LiquidFlowProcess.h b/ProcessLib/LiquidFlow/LiquidFlowProcess.h
index 0383591dfcaeee4f0da792765d8d8b01cbe834e9..c12501bceec21f2bee81dd9dbe386c303687657c 100644
--- a/ProcessLib/LiquidFlow/LiquidFlowProcess.h
+++ b/ProcessLib/LiquidFlow/LiquidFlowProcess.h
@@ -66,8 +66,7 @@ public:
             process_variables,
         SecondaryVariableCollection&& secondary_variables,
         NumLib::NamedFunctionCaller&& named_function_caller,
-        MeshLib::PropertyVector<int> const& material_ids,
-        bool const has_material_ids,
+        MeshLib::PropertyVector<int> const* const material_ids,
         int const gravitational_axis_id,
         double const gravitational_acceleration,
         double const reference_temperature,