diff --git a/Applications/ApplicationsLib/ProjectData.cpp b/Applications/ApplicationsLib/ProjectData.cpp
index 1f52451511b7eea16501cfff12e9490055c911d6..17f63414460d7c0ce0e0ec55e490d32300aac4ac 100644
--- a/Applications/ApplicationsLib/ProjectData.cpp
+++ b/Applications/ApplicationsLib/ProjectData.cpp
@@ -14,9 +14,9 @@
 #include "ProjectData.h"
 
 #include <algorithm>
-#include <set>
-
+#include <cctype>
 #include <logog/include/logog.hpp>
+#include <set>
 
 #ifdef OGS_USE_PYTHON
 #include <pybind11/eval.h>
@@ -447,20 +447,52 @@ void ProjectData::parseMedia(
          //! \ogs_file_param{prj__media__medium}
          media_config->getConfigSubtreeList("medium"))
     {
-        //! \ogs_file_attr{prj__media__medium__id}
-        auto const material_id = medium_config.getConfigAttribute<int>("id", 0);
-
-        if (_media.find(material_id) != _media.end())
+        auto material_id_string =
+            //! \ogs_file_attr{prj__media__medium__id}
+            medium_config.getConfigAttribute<std::string>("id", "0");
+        material_id_string.erase(
+            remove_if(begin(material_id_string), end(material_id_string),
+                      [](unsigned char const c) { return std::isspace(c); }),
+            end(material_id_string));
+        auto const material_ids_strings =
+            BaseLib::splitString(material_id_string, ',');
+
+        // Convert strings to ints;
+        std::vector<int> material_ids;
+        std::transform(
+            begin(material_ids_strings), end(material_ids_strings),
+            std::back_inserter(material_ids), [](std::string const& m_id) {
+                if (auto const it = std::find_if_not(
+                        begin(m_id), end(m_id),
+                        [](unsigned char const c) { return std::isdigit(c); });
+                    it != end(m_id))
+                {
+                    OGS_FATAL(
+                        "Could not parse material ID's from '%s'. Please "
+                        "separate multiple material ID's by comma only. "
+                        "Invalid character: '%c'",
+                        m_id.c_str(), *it);
+                }
+                return std::stoi(m_id);
+            });
+
+        for (auto const& id : material_ids)
         {
-            OGS_FATAL(
-                "Multiple media were specified for the same material id %d. "
-                "Keep in mind, that if no material id is specified, it is "
-                "assumed to be 0 by default.",
-                material_id);
-        }
+            if (_media.find(id) != end(_media))
+            {
+                OGS_FATAL(
+                    "Multiple media were specified for the same material id "
+                    "'%d'. "
+                    "Keep in mind, that if no material id is specified, it is "
+                    "assumed to be 0 by default.",
+                    id);
+            }
 
-        _media[material_id] =
-            MaterialPropertyLib::createMedium(medium_config, _parameters);
+            _media[id] = (id == material_ids[0])
+                             ? MaterialPropertyLib::createMedium(medium_config,
+                                                                 _parameters)
+                             : _media[material_ids[0]];
+        }
     }
 
     if (_media.empty())
diff --git a/Applications/ApplicationsLib/ProjectData.h b/Applications/ApplicationsLib/ProjectData.h
index e80ddd36ca165b1de9968f59a128cd0355d8291a..e1593be124c61f57eb79fa84bff23ce5e9db8229 100644
--- a/Applications/ApplicationsLib/ProjectData.h
+++ b/Applications/ApplicationsLib/ProjectData.h
@@ -125,7 +125,7 @@ private:
 
     boost::optional<ParameterLib::CoordinateSystem> _local_coordinate_system;
 
-    std::map<int, std::unique_ptr<MaterialPropertyLib::Medium>> _media;
+    std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> _media;
 
     /// The time loop used to solve this project's processes.
     std::unique_ptr<ProcessLib::TimeLoop> _time_loop;
diff --git a/MaterialLib/MPL/CreateMaterialSpatialDistributionMap.cpp b/MaterialLib/MPL/CreateMaterialSpatialDistributionMap.cpp
index 95afd5115c8563d5de220585c003f958b35d6a3c..f4e31dc2700a401330c00cc47ec8a0f76bedc792 100644
--- a/MaterialLib/MPL/CreateMaterialSpatialDistributionMap.cpp
+++ b/MaterialLib/MPL/CreateMaterialSpatialDistributionMap.cpp
@@ -16,7 +16,7 @@ namespace MaterialPropertyLib
 {
 std::unique_ptr<MaterialSpatialDistributionMap>
 createMaterialSpatialDistributionMap(
-    std::map<int, std::unique_ptr<Medium>> const& media,
+    std::map<int, std::shared_ptr<Medium>> const& media,
     MeshLib::Mesh const& mesh)
 {
     auto const material_ids = materialIDs(mesh);
diff --git a/MaterialLib/MPL/CreateMaterialSpatialDistributionMap.h b/MaterialLib/MPL/CreateMaterialSpatialDistributionMap.h
index 8d60b9c5f6db8fd0f3681b41f5401295ee2e38dd..2062e86fe5821a38bf383675313002eb1d2fdaab 100644
--- a/MaterialLib/MPL/CreateMaterialSpatialDistributionMap.h
+++ b/MaterialLib/MPL/CreateMaterialSpatialDistributionMap.h
@@ -26,6 +26,6 @@ class Medium;
 
 std::unique_ptr<MaterialSpatialDistributionMap>
 createMaterialSpatialDistributionMap(
-    std::map<int, std::unique_ptr<Medium>> const& media,
+    std::map<int, std::shared_ptr<Medium>> const& media,
     MeshLib::Mesh const& mesh);
 }  // namespace MaterialPropertyLib
diff --git a/MaterialLib/MPL/MaterialSpatialDistributionMap.h b/MaterialLib/MPL/MaterialSpatialDistributionMap.h
index 06c86509e764abec5daf135f82cf5edf0175898c..f51f94a0d3d4b5d0132b369edfd74f03ac2454f1 100644
--- a/MaterialLib/MPL/MaterialSpatialDistributionMap.h
+++ b/MaterialLib/MPL/MaterialSpatialDistributionMap.h
@@ -29,7 +29,7 @@ class MaterialSpatialDistributionMap
 {
 public:
     MaterialSpatialDistributionMap(
-        std::map<int, std::unique_ptr<Medium>> const& media,
+        std::map<int, std::shared_ptr<Medium>> const& media,
         MeshLib::PropertyVector<int> const* const material_ids)
         : _media(media), _material_ids(material_ids)
     {
@@ -38,7 +38,7 @@ public:
     Medium* getMedium(std::size_t element_id);
 
 private:
-    std::map<int, std::unique_ptr<Medium>> const& _media;
+    std::map<int, std::shared_ptr<Medium>> const& _media;
     MeshLib::PropertyVector<int> const* const _material_ids;
 };
 }  // namespace MaterialPropertyLib
diff --git a/ProcessLib/ComponentTransport/CreateComponentTransportProcess.cpp b/ProcessLib/ComponentTransport/CreateComponentTransportProcess.cpp
index 558022ef13b28e51a076bd851168df6b7eccd124..c38fda09ea42558ab8bdd7618d36d1ed97f3b393 100644
--- a/ProcessLib/ComponentTransport/CreateComponentTransportProcess.cpp
+++ b/ProcessLib/ComponentTransport/CreateComponentTransportProcess.cpp
@@ -32,7 +32,7 @@ std::unique_ptr<Process> createComponentTransportProcess(
     BaseLib::ConfigTree const& config,
     std::vector<std::unique_ptr<MeshLib::Mesh>> const& meshes,
     std::string const& output_directory,
-    std::map<int, std::unique_ptr<MaterialPropertyLib::Medium>> const& media)
+    std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media)
 {
     //! \ogs_file_param{prj__processes__process__type}
     config.checkConfigParameter("type", "ComponentTransport");
diff --git a/ProcessLib/ComponentTransport/CreateComponentTransportProcess.h b/ProcessLib/ComponentTransport/CreateComponentTransportProcess.h
index a5baa0892874e99f29ab2b84df798a0afa12c072..2fe8a2f395103fef857b6cd4ec0363df4290561b 100644
--- a/ProcessLib/ComponentTransport/CreateComponentTransportProcess.h
+++ b/ProcessLib/ComponentTransport/CreateComponentTransportProcess.h
@@ -32,7 +32,7 @@ std::unique_ptr<Process> createComponentTransportProcess(
     BaseLib::ConfigTree const& config,
     std::vector<std::unique_ptr<MeshLib::Mesh>> const& meshes,
     std::string const& output_directory,
-    std::map<int, std::unique_ptr<MaterialPropertyLib::Medium>> const& media);
+    std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media);
 
 }  // namespace ComponentTransport
 }  // namespace ProcessLib
diff --git a/ProcessLib/HT/CreateHTProcess.cpp b/ProcessLib/HT/CreateHTProcess.cpp
index 2c3ea66626afba5d91da9c23b76b130796e31216..10ec33b1e1980b9a8ed6036fa767ddf374cca3e1 100644
--- a/ProcessLib/HT/CreateHTProcess.cpp
+++ b/ProcessLib/HT/CreateHTProcess.cpp
@@ -36,7 +36,7 @@ std::unique_ptr<Process> createHTProcess(
     BaseLib::ConfigTree const& config,
     std::vector<std::unique_ptr<MeshLib::Mesh>> const& meshes,
     std::string const& output_directory,
-    std::map<int, std::unique_ptr<MaterialPropertyLib::Medium>> const& media)
+    std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media)
 {
     //! \ogs_file_param{prj__processes__process__type}
     config.checkConfigParameter("type", "HT");
diff --git a/ProcessLib/HT/CreateHTProcess.h b/ProcessLib/HT/CreateHTProcess.h
index d5a0e053cb6ba9e98a5bf305c6b0f29d04986567..38a1305c704e9a191cad3a5d6c2dc03c57e34a65 100644
--- a/ProcessLib/HT/CreateHTProcess.h
+++ b/ProcessLib/HT/CreateHTProcess.h
@@ -33,7 +33,7 @@ std::unique_ptr<Process> createHTProcess(
     BaseLib::ConfigTree const& config,
     std::vector<std::unique_ptr<MeshLib::Mesh>> const& meshes,
     std::string const& output_directory,
-    std::map<int, std::unique_ptr<MaterialPropertyLib::Medium>> const& media);
+    std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media);
 
 }  // namespace HT
 }  // namespace ProcessLib
diff --git a/ProcessLib/HeatTransportBHE/CreateHeatTransportBHEProcess.cpp b/ProcessLib/HeatTransportBHE/CreateHeatTransportBHEProcess.cpp
index b7e7ec8dbd3d602e44e1041b165ad7a6d96e0746..9deeded9983794783538a85b9341624bf3efdbeb 100644
--- a/ProcessLib/HeatTransportBHE/CreateHeatTransportBHEProcess.cpp
+++ b/ProcessLib/HeatTransportBHE/CreateHeatTransportBHEProcess.cpp
@@ -39,7 +39,7 @@ std::unique_ptr<Process> createHeatTransportBHEProcess(
     std::map<std::string,
              std::unique_ptr<MathLib::PiecewiseLinearInterpolation>> const&
         curves,
-    std::map<int, std::unique_ptr<MaterialPropertyLib::Medium>> const& media)
+    std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media)
 {
     //! \ogs_file_param{prj__processes__process__type}
     config.checkConfigParameter("type", "HEAT_TRANSPORT_BHE");
diff --git a/ProcessLib/HeatTransportBHE/CreateHeatTransportBHEProcess.h b/ProcessLib/HeatTransportBHE/CreateHeatTransportBHEProcess.h
index bfc3debc09bfa9f6efc0dce0cfc394bb93b7fda1..b53296d0314ec9e8c8efc85dbfb72a0397d97344 100644
--- a/ProcessLib/HeatTransportBHE/CreateHeatTransportBHEProcess.h
+++ b/ProcessLib/HeatTransportBHE/CreateHeatTransportBHEProcess.h
@@ -30,6 +30,6 @@ std::unique_ptr<Process> createHeatTransportBHEProcess(
     std::map<std::string,
              std::unique_ptr<MathLib::PiecewiseLinearInterpolation>> const&
         curves,
-    std::map<int, std::unique_ptr<MaterialPropertyLib::Medium>> const& media);
+    std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media);
 }  // namespace HeatTransportBHE
 }  // namespace ProcessLib
diff --git a/ProcessLib/HydroMechanics/CreateHydroMechanicsProcess.cpp b/ProcessLib/HydroMechanics/CreateHydroMechanicsProcess.cpp
index 410299d5da0769e3e259e220c1e7df5f3ac79a4c..c688a1211563ed077621eae0afc579d3dc4d08d5 100644
--- a/ProcessLib/HydroMechanics/CreateHydroMechanicsProcess.cpp
+++ b/ProcessLib/HydroMechanics/CreateHydroMechanicsProcess.cpp
@@ -38,7 +38,7 @@ std::unique_ptr<Process> createHydroMechanicsProcess(
     boost::optional<ParameterLib::CoordinateSystem> const&
         local_coordinate_system,
     unsigned const integration_order, BaseLib::ConfigTree const& config,
-    std::map<int, std::unique_ptr<MaterialPropertyLib::Medium>> const& media)
+    std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media)
 {
     //! \ogs_file_param{prj__processes__process__type}
     config.checkConfigParameter("type", "HYDRO_MECHANICS");
@@ -232,7 +232,7 @@ template std::unique_ptr<Process> createHydroMechanicsProcess<2>(
         local_coordinate_system,
     unsigned const integration_order,
     BaseLib::ConfigTree const& config,
-    std::map<int, std::unique_ptr<MaterialPropertyLib::Medium>> const& media);
+    std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media);
 
 template std::unique_ptr<Process> createHydroMechanicsProcess<3>(
     std::string name,
@@ -244,7 +244,7 @@ template std::unique_ptr<Process> createHydroMechanicsProcess<3>(
         local_coordinate_system,
     unsigned const integration_order,
     BaseLib::ConfigTree const& config,
-    std::map<int, std::unique_ptr<MaterialPropertyLib::Medium>> const& media);
+    std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media);
 
 }  // namespace HydroMechanics
 }  // namespace ProcessLib
diff --git a/ProcessLib/HydroMechanics/CreateHydroMechanicsProcess.h b/ProcessLib/HydroMechanics/CreateHydroMechanicsProcess.h
index 7fb0b496022043f36fa050c224e1be5d37601ea9..d77e971b6ce202f7b4e44f4be704a353900e4ecf 100644
--- a/ProcessLib/HydroMechanics/CreateHydroMechanicsProcess.h
+++ b/ProcessLib/HydroMechanics/CreateHydroMechanicsProcess.h
@@ -54,7 +54,7 @@ std::unique_ptr<Process> createHydroMechanicsProcess(
         local_coordinate_system,
     unsigned const integration_order,
     BaseLib::ConfigTree const& config,
-    std::map<int, std::unique_ptr<MaterialPropertyLib::Medium>> const& media);
+    std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media);
 
 extern template std::unique_ptr<Process> createHydroMechanicsProcess<2>(
     std::string name,
@@ -66,7 +66,7 @@ extern template std::unique_ptr<Process> createHydroMechanicsProcess<2>(
         local_coordinate_system,
     unsigned const integration_order,
     BaseLib::ConfigTree const& config,
-    std::map<int, std::unique_ptr<MaterialPropertyLib::Medium>> const& media);
+    std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media);
 
 extern template std::unique_ptr<Process> createHydroMechanicsProcess<3>(
     std::string name,
@@ -78,6 +78,6 @@ extern template std::unique_ptr<Process> createHydroMechanicsProcess<3>(
         local_coordinate_system,
     unsigned const integration_order,
     BaseLib::ConfigTree const& config,
-    std::map<int, std::unique_ptr<MaterialPropertyLib::Medium>> const& media);
+    std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media);
 }  // namespace HydroMechanics
 }  // namespace ProcessLib
diff --git a/ProcessLib/ThermoHydroMechanics/CreateThermoHydroMechanicsProcess.cpp b/ProcessLib/ThermoHydroMechanics/CreateThermoHydroMechanicsProcess.cpp
index 6269dc0971def0498f1d60a2d155c4c32c2315d7..a0d7118f78d1829574eb170650a125c1e22bca10 100644
--- a/ProcessLib/ThermoHydroMechanics/CreateThermoHydroMechanicsProcess.cpp
+++ b/ProcessLib/ThermoHydroMechanics/CreateThermoHydroMechanicsProcess.cpp
@@ -37,7 +37,7 @@ std::unique_ptr<Process> createThermoHydroMechanicsProcess(
     boost::optional<ParameterLib::CoordinateSystem> const&
         local_coordinate_system,
     unsigned const integration_order, BaseLib::ConfigTree const& config,
-    std::map<int, std::unique_ptr<MaterialPropertyLib::Medium>> const& media)
+    std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media)
 {
     //! \ogs_file_param{prj__processes__process__type}
     config.checkConfigParameter("type", "THERMO_HYDRO_MECHANICS");
@@ -186,7 +186,7 @@ template std::unique_ptr<Process> createThermoHydroMechanicsProcess<2>(
         local_coordinate_system,
     unsigned const integration_order,
     BaseLib::ConfigTree const& config,
-    std::map<int, std::unique_ptr<MaterialPropertyLib::Medium>> const& media);
+    std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media);
 
 template std::unique_ptr<Process> createThermoHydroMechanicsProcess<3>(
     std::string name,
@@ -198,6 +198,6 @@ template std::unique_ptr<Process> createThermoHydroMechanicsProcess<3>(
         local_coordinate_system,
     unsigned const integration_order,
     BaseLib::ConfigTree const& config,
-    std::map<int, std::unique_ptr<MaterialPropertyLib::Medium>> const& media);
+    std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media);
 }  // namespace ThermoHydroMechanics
 }  // namespace ProcessLib
diff --git a/ProcessLib/ThermoHydroMechanics/CreateThermoHydroMechanicsProcess.h b/ProcessLib/ThermoHydroMechanics/CreateThermoHydroMechanicsProcess.h
index 80546f1b842082cae4859f3c33387a2f1ff9a8ee..3b9637abdf357b0eff92ae5b7b690c39faa077e2 100644
--- a/ProcessLib/ThermoHydroMechanics/CreateThermoHydroMechanicsProcess.h
+++ b/ProcessLib/ThermoHydroMechanics/CreateThermoHydroMechanicsProcess.h
@@ -57,7 +57,7 @@ std::unique_ptr<Process> createThermoHydroMechanicsProcess(
         local_coordinate_system,
     unsigned const integration_order,
     BaseLib::ConfigTree const& config,
-    std::map<int, std::unique_ptr<MaterialPropertyLib::Medium>> const& media);
+    std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media);
 
 extern template std::unique_ptr<Process> createThermoHydroMechanicsProcess<2>(
     std::string name, MeshLib::Mesh& mesh,
@@ -67,7 +67,7 @@ extern template std::unique_ptr<Process> createThermoHydroMechanicsProcess<2>(
     boost::optional<ParameterLib::CoordinateSystem> const&
         local_coordinate_system,
     unsigned const integration_order, BaseLib::ConfigTree const& config,
-    std::map<int, std::unique_ptr<MaterialPropertyLib::Medium>> const& media);
+    std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media);
 
 extern template std::unique_ptr<Process> createThermoHydroMechanicsProcess<3>(
     std::string name,
@@ -79,6 +79,6 @@ extern template std::unique_ptr<Process> createThermoHydroMechanicsProcess<3>(
         local_coordinate_system,
     unsigned const integration_order,
     BaseLib::ConfigTree const& config,
-    std::map<int, std::unique_ptr<MaterialPropertyLib::Medium>> const& media);
+    std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media);
 }  // namespace ThermoHydroMechanics
 }  // namespace ProcessLib
diff --git a/ProcessLib/TwoPhaseFlowWithPP/CreateTwoPhaseFlowWithPPProcess.cpp b/ProcessLib/TwoPhaseFlowWithPP/CreateTwoPhaseFlowWithPPProcess.cpp
index d8ab2b2192e23d2b109ca5c808d0ef8d39d5fe7c..bce744c33b946a5a8045d7842de5ccf097952f69 100644
--- a/ProcessLib/TwoPhaseFlowWithPP/CreateTwoPhaseFlowWithPPProcess.cpp
+++ b/ProcessLib/TwoPhaseFlowWithPP/CreateTwoPhaseFlowWithPPProcess.cpp
@@ -34,7 +34,7 @@ std::unique_ptr<Process> createTwoPhaseFlowWithPPProcess(
     std::map<std::string,
              std::unique_ptr<MathLib::PiecewiseLinearInterpolation>> const&
         curves,
-    std::map<int, std::unique_ptr<MaterialPropertyLib::Medium>> const& media)
+    std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media)
 {
     //! \ogs_file_param{prj__processes__process__type}
     config.checkConfigParameter("type", "TWOPHASE_FLOW_PP");
diff --git a/ProcessLib/TwoPhaseFlowWithPP/CreateTwoPhaseFlowWithPPProcess.h b/ProcessLib/TwoPhaseFlowWithPP/CreateTwoPhaseFlowWithPPProcess.h
index 56a79530b198eb2148a057bebb15c4e9651243eb..2739147c30511356a48ed598c746c785c694fe93 100644
--- a/ProcessLib/TwoPhaseFlowWithPP/CreateTwoPhaseFlowWithPPProcess.h
+++ b/ProcessLib/TwoPhaseFlowWithPP/CreateTwoPhaseFlowWithPPProcess.h
@@ -63,6 +63,6 @@ std::unique_ptr<Process> createTwoPhaseFlowWithPPProcess(
     std::map<std::string,
              std::unique_ptr<MathLib::PiecewiseLinearInterpolation>> const&
         curves,
-    std::map<int, std::unique_ptr<MaterialPropertyLib::Medium>> const& media);
+    std::map<int, std::shared_ptr<MaterialPropertyLib::Medium>> const& media);
 }  // namespace TwoPhaseFlowWithPP
 }  // namespace ProcessLib