diff --git a/Applications/DataExplorer/DataView/MeshView.cpp b/Applications/DataExplorer/DataView/MeshView.cpp
index 556be406e101f6f1e74da489563f2822b1815da9..839e7db2bffc1f1a736308ed71900a8d51e96d27 100644
--- a/Applications/DataExplorer/DataView/MeshView.cpp
+++ b/Applications/DataExplorer/DataView/MeshView.cpp
@@ -304,7 +304,8 @@ void MeshView::openAddLayerDialog()
     bool const copy_material_ids = false;
     double const thickness(dlg.getThickness());
     std::unique_ptr<MeshLib::Mesh> result(MeshToolsLib::addLayerToMesh(
-        *mesh, thickness, dlg.getName(), dlg.isTopLayer(), copy_material_ids));
+        *mesh, thickness, dlg.getName(), dlg.isTopLayer(), copy_material_ids,
+        std::nullopt));
 
     if (result)
     {
diff --git a/Applications/Utils/MeshEdit/AddLayer.cpp b/Applications/Utils/MeshEdit/AddLayer.cpp
index 86bc9b8a15b7e6eec4586fb707bfaa1c31c31b92..4f00368bc3f5d91ddb084d9e99ab4fd4815fa25e 100644
--- a/Applications/Utils/MeshEdit/AddLayer.cpp
+++ b/Applications/Utils/MeshEdit/AddLayer.cpp
@@ -68,8 +68,22 @@ int main(int argc, char* argv[])
         false);
     cmd.add(copy_material_ids_arg);
 
+    TCLAP::ValueArg<int> set_material_arg("", "set-material-id",
+                                          "the material id of the new layer",
+                                          false, 0, "integer value");
+    cmd.add(set_material_arg);
     cmd.parse(argc, argv);
 
+    if (set_material_arg.isSet() && copy_material_ids_arg.isSet())
+    {
+        ERR("It is not possiblo to set both options '--copy-material-ids' and "
+            "'--set-material-id'.");
+#ifdef USE_PETSC
+        MPI_Finalize();
+#endif
+        return EXIT_FAILURE;
+    }
+
 #ifdef USE_PETSC
     MPI_Init(&argc, &argv);
 #endif
@@ -87,9 +101,16 @@ int main(int argc, char* argv[])
     }
     INFO("done.");
 
+    std::optional<int> layer_id;
+    if (set_material_arg.isSet())
+    {
+        layer_id = set_material_arg.getValue();
+    }
+
     std::unique_ptr<MeshLib::Mesh> result(MeshToolsLib::addLayerToMesh(
         *subsfc_mesh, layer_thickness_arg.getValue(), mesh_out_arg.getValue(),
-        layer_position_arg.getValue(), copy_material_ids_arg.getValue()));
+        layer_position_arg.getValue(), copy_material_ids_arg.getValue(),
+        layer_id));
     if (!result)
     {
         ERR("Failure while adding layer.");
diff --git a/MeshToolsLib/MeshEditing/AddLayerToMesh.cpp b/MeshToolsLib/MeshEditing/AddLayerToMesh.cpp
index 4c661e58b9fccff7256afcdf2297391081bc1696..8285bf5f228ba7ff1d73ae645a1b8a6f568b61f6 100644
--- a/MeshToolsLib/MeshEditing/AddLayerToMesh.cpp
+++ b/MeshToolsLib/MeshEditing/AddLayerToMesh.cpp
@@ -81,9 +81,10 @@ MeshLib::Element* extrudeElement(
     return nullptr;
 }
 
-MeshLib::Mesh* addLayerToMesh(MeshLib::Mesh const& mesh, double thickness,
-                              std::string const& name, bool on_top,
-                              bool copy_material_ids)
+MeshLib::Mesh* addLayerToMesh(MeshLib::Mesh const& mesh, double const thickness,
+                              std::string const& name, bool const on_top,
+                              bool const copy_material_ids,
+                              std::optional<int> const layer_id)
 {
     INFO("Extracting top surface of mesh '{:s}' ... ", mesh.getName());
     double const flag = on_top ? -1.0 : 1.0;
@@ -199,8 +200,11 @@ MeshLib::Mesh* addLayerToMesh(MeshLib::Mesh const& mesh, double thickness,
     }
     else
     {
-        int const new_layer_id(
-            *(std::max_element(materials->cbegin(), materials->cend())) + 1);
+        int const new_layer_id =
+            layer_id.has_value()
+                ? layer_id.value()
+                : *(std::max_element(materials->cbegin(), materials->cend())) +
+                      1;
         auto const n_new_props(subsfc_elements.size() -
                                mesh.getNumberOfElements());
         std::fill_n(std::back_inserter(*new_materials), n_new_props,
diff --git a/MeshToolsLib/MeshEditing/AddLayerToMesh.h b/MeshToolsLib/MeshEditing/AddLayerToMesh.h
index 99d3f1ddd29fbd5bdf03d983a3d136953088f963..4a7190dce01fbcb20e0340acd0944c8d141d1a86 100644
--- a/MeshToolsLib/MeshEditing/AddLayerToMesh.h
+++ b/MeshToolsLib/MeshEditing/AddLayerToMesh.h
@@ -14,6 +14,7 @@
 
 #pragma once
 
+#include <optional>
 #include <string>
 #include <vector>
 
@@ -30,8 +31,9 @@ namespace MeshToolsLib
 
 /// Adds a layer to the mesh. If on_top is true, the layer is added on top,
 /// if it is false, the layer is added at the bottom.
-MeshLib::Mesh* addLayerToMesh(MeshLib::Mesh const& mesh, double thickness,
-                              std::string const& name, bool on_top,
-                              bool copy_material_ids);
+MeshLib::Mesh* addLayerToMesh(MeshLib::Mesh const& mesh, double const thickness,
+                              std::string const& name, bool const on_top,
+                              bool const copy_material_ids,
+                              std::optional<int> const layer_id);
 
 }  // namespace MeshToolsLib
diff --git a/MeshToolsLib/MeshGenerators/MeshGenerator.cpp b/MeshToolsLib/MeshGenerators/MeshGenerator.cpp
index 14cc336d385aff700a0c3d05925c91414ac12258..a48afd206a3f0d7e825548422ce66e7346488139 100644
--- a/MeshToolsLib/MeshGenerators/MeshGenerator.cpp
+++ b/MeshToolsLib/MeshGenerators/MeshGenerator.cpp
@@ -616,7 +616,8 @@ MeshLib::Mesh* MeshGenerator::generateRegularPrismMesh(
     for (std::size_t i = 0; i < n_z_cells; ++i)
     {
         mesh.reset(MeshToolsLib::addLayerToMesh(*mesh, cell_size_z, mesh_name,
-                                                true, copy_material_ids));
+                                                true, copy_material_ids,
+                                                std::nullopt));
     }
     std::vector<std::size_t> elem_ids(n_tris);
     std::iota(elem_ids.begin(), elem_ids.end(), 0);
diff --git a/Tests/MeshLib/TestAddLayerToMesh.cpp b/Tests/MeshLib/TestAddLayerToMesh.cpp
index 80dff5ca83e7510c6bb97f103afb505abcd65462..52e45cdf7c2f1efe63c72a45717c36d4180c90b4 100644
--- a/Tests/MeshLib/TestAddLayerToMesh.cpp
+++ b/Tests/MeshLib/TestAddLayerToMesh.cpp
@@ -75,7 +75,7 @@ TEST(MeshLib, AddTopLayerToLineMesh)
     double const height(1);
     constexpr bool const copy_material_ids = false;
     std::unique_ptr<MeshLib::Mesh> const result(MeshToolsLib::addLayerToMesh(
-        *mesh, height, "mesh", true, copy_material_ids));
+        *mesh, height, "mesh", true, copy_material_ids, std::nullopt));
 
     ASSERT_EQ(2 * mesh->getNumberOfNodes(), result->getNumberOfNodes());
     ASSERT_EQ(2 * mesh->getNumberOfElements(), result->getNumberOfElements());
@@ -96,7 +96,7 @@ TEST(MeshLib, AddBottomLayerToLineMesh)
     double const height(1);
     constexpr bool const copy_material_ids = false;
     std::unique_ptr<MeshLib::Mesh> const result(MeshToolsLib::addLayerToMesh(
-        *mesh, height, "mesh", false, copy_material_ids));
+        *mesh, height, "mesh", false, copy_material_ids, std::nullopt));
 
     ASSERT_EQ(2 * mesh->getNumberOfNodes(), result->getNumberOfNodes());
     ASSERT_EQ(2 * mesh->getNumberOfElements(), result->getNumberOfElements());
@@ -131,7 +131,7 @@ TEST(MeshLib, AddTopLayerToTriMesh)
     double const height(1);
     constexpr bool copy_material_ids = false;
     std::unique_ptr<MeshLib::Mesh> const result(MeshToolsLib::addLayerToMesh(
-        *mesh, height, "mesh", true, copy_material_ids));
+        *mesh, height, "mesh", true, copy_material_ids, std::nullopt));
 
     ASSERT_EQ(2 * mesh->getNumberOfNodes(), result->getNumberOfNodes());
     ASSERT_EQ(2 * mesh->getNumberOfElements(), result->getNumberOfElements());
@@ -162,7 +162,7 @@ TEST(MeshLib, AddBottomLayerToTriMesh)
     double const height(1);
     constexpr bool copy_material_ids = false;
     std::unique_ptr<MeshLib::Mesh> const result(MeshToolsLib::addLayerToMesh(
-        *mesh, height, "mesh", false, copy_material_ids));
+        *mesh, height, "mesh", false, copy_material_ids, std::nullopt));
 
     ASSERT_EQ(2 * mesh->getNumberOfNodes(), result->getNumberOfNodes());
     ASSERT_EQ(2 * mesh->getNumberOfElements(), result->getNumberOfElements());
@@ -183,7 +183,7 @@ TEST(MeshLib, AddTopLayerToQuadMesh)
     double const height(1);
     constexpr bool copy_material_ids = false;
     std::unique_ptr<MeshLib::Mesh> const result(MeshToolsLib::addLayerToMesh(
-        *mesh, height, "mesh", true, copy_material_ids));
+        *mesh, height, "mesh", true, copy_material_ids, std::nullopt));
 
     ASSERT_EQ(2 * mesh->getNumberOfNodes(), result->getNumberOfNodes());
     ASSERT_EQ(2 * mesh->getNumberOfElements(), result->getNumberOfElements());
@@ -204,7 +204,7 @@ TEST(MeshLib, AddBottomLayerToQuadMesh)
     double const height(1);
     constexpr bool copy_material_ids = false;
     std::unique_ptr<MeshLib::Mesh> const result(MeshToolsLib::addLayerToMesh(
-        *mesh, height, "mesh", false, copy_material_ids));
+        *mesh, height, "mesh", false, copy_material_ids, std::nullopt));
 
     ASSERT_EQ(2 * mesh->getNumberOfNodes(), result->getNumberOfNodes());
     ASSERT_EQ(2 * mesh->getNumberOfElements(), result->getNumberOfElements());
@@ -225,7 +225,7 @@ TEST(MeshLib, AddTopLayerToHexMesh)
     double const height(1);
     constexpr bool copy_material_ids = false;
     std::unique_ptr<MeshLib::Mesh> const result(MeshToolsLib::addLayerToMesh(
-        *mesh, height, "mesh", true, copy_material_ids));
+        *mesh, height, "mesh", true, copy_material_ids, std::nullopt));
 
     ASSERT_EQ(mesh->getNumberOfNodes(), result->getNumberOfNodes() - 36);
     ASSERT_EQ(mesh->getNumberOfElements(), result->getNumberOfElements() - 25);
@@ -250,7 +250,7 @@ TEST(MeshLib, AddBottomLayerToHexMesh)
     double const height(1);
     constexpr bool copy_material_ids = false;
     std::unique_ptr<MeshLib::Mesh> const result(MeshToolsLib::addLayerToMesh(
-        *mesh, height, "mesh", false, copy_material_ids));
+        *mesh, height, "mesh", false, copy_material_ids, std::nullopt));
 
     ASSERT_EQ(mesh->getNumberOfNodes(), result->getNumberOfNodes() - 36);
     ASSERT_EQ(mesh->getNumberOfElements(), result->getNumberOfElements() - 25);
@@ -274,10 +274,10 @@ TEST(MeshLib, AddTopLayerToPrismMesh)
         MeshToolsLib::MeshGenerator::generateRegularTriMesh(5, 5));
     constexpr bool copy_material_ids = false;
     std::unique_ptr<MeshLib::Mesh> const mesh2(MeshToolsLib::addLayerToMesh(
-        *mesh, 5, "mesh", true, copy_material_ids));
+        *mesh, 5, "mesh", true, copy_material_ids, std::nullopt));
     double const height(1);
     std::unique_ptr<MeshLib::Mesh> const result(MeshToolsLib::addLayerToMesh(
-        *mesh2, height, "mesh", true, copy_material_ids));
+        *mesh2, height, "mesh", true, copy_material_ids, std::nullopt));
 
     ASSERT_EQ(mesh2->getNumberOfNodes() / 2.0 * 3, result->getNumberOfNodes());
     ASSERT_EQ(mesh2->getNumberOfElements() / 2.0 * 3,
@@ -303,7 +303,7 @@ TEST(MeshLib, AddBottomLayerToPrismMesh)
         MeshToolsLib::MeshGenerator::generateRegularTriMesh(5, 5));
     constexpr bool copy_material_ids = false;
     std::unique_ptr<MeshLib::Mesh> const mesh2(MeshToolsLib::addLayerToMesh(
-        *mesh, 5, "mesh", true, copy_material_ids));
+        *mesh, 5, "mesh", true, copy_material_ids, std::nullopt));
     double const height(1);
     std::string const& mat_name("MaterialIDs");
     auto* const mats = mesh2->getProperties().createNewPropertyVector<int>(
@@ -314,7 +314,7 @@ TEST(MeshLib, AddBottomLayerToPrismMesh)
     }
 
     std::unique_ptr<MeshLib::Mesh> const result(MeshToolsLib::addLayerToMesh(
-        *mesh2, height, "mesh", false, copy_material_ids));
+        *mesh2, height, "mesh", false, copy_material_ids, std::nullopt));
     ASSERT_EQ(mesh2->getNumberOfNodes() / 2.0 * 3, result->getNumberOfNodes());
     ASSERT_EQ(mesh2->getNumberOfElements() / 2.0 * 3,
               result->getNumberOfElements());