diff --git a/MeshLib/MeshGenerators/LayeredVolume.cpp b/MeshLib/MeshGenerators/LayeredVolume.cpp
index 5bb71e3eee7a5f6f6f000557015ccd798a9e39cb..f32dee40fb1f4060cded110282899ae95c11c5b1 100644
--- a/MeshLib/MeshGenerators/LayeredVolume.cpp
+++ b/MeshLib/MeshGenerators/LayeredVolume.cpp
@@ -20,6 +20,7 @@
 
 #include "MeshLib/Elements/Tri.h"
 #include "MeshLib/Elements/Quad.h"
+#include "MeshLib/Properties.h"
 #include "MeshLib/MeshEditing/DuplicateMeshComponents.h"
 #include "MeshLib/MeshEditing/RemoveMeshComponents.h"
 #include "MeshLib/MeshGenerators/MeshLayerMapper.h"
@@ -45,19 +46,29 @@ bool LayeredVolume::createRasterLayers(const MeshLib::Mesh &mesh,
 	if (top==nullptr)
 		top = new MeshLib::Mesh(mesh);
 
-	if (!MeshLib::MeshLayerMapper::layerMapping(*top, *rasters.back(), noDataReplacementValue))
+	if (!MeshLib::MeshLayerMapper::layerMapping(*top, *rasters.back(), noDataReplacementValue)) {
+		delete top;
 		return false;
+	}
 
 	MeshLib::Mesh* bottom (new MeshLib::Mesh(*top));
 	if (!MeshLib::MeshLayerMapper::layerMapping(*bottom, *rasters[0], 0))
 	{
 		delete top;
+		delete bottom;
 		return false;
 	}
 
 	this->_minimum_thickness = minimum_thickness;
 	_nodes = MeshLib::copyNodeVector(bottom->getNodes());
 	_elements = MeshLib::copyElementVector(bottom->getElements(), _nodes);
+	if (!_materials.empty()) {
+		ERR("The materials vector is not empty.");
+		delete top;
+		delete bottom;
+		return false;
+	}
+	_materials.resize(_elements.size(), 0);
 	delete bottom;
 
 	// map each layer and attach to subsurface mesh
@@ -68,6 +79,7 @@ bool LayeredVolume::createRasterLayers(const MeshLib::Mesh &mesh,
 	// close boundaries between layers
 	this->addLayerBoundaries(*top, nRasters);
 	this->removeCongruentElements(nRasters, top->getNElements());
+
 	delete top;
 	return true;
 }
@@ -90,7 +102,8 @@ void LayeredVolume::addLayerToMesh(const MeshLib::Mesh &dem_mesh, unsigned layer
 			std::array<MeshLib::Node*,3> tri_nodes = {{ _nodes[node_id_offset+elem->getNodeIndex(0)],
 			                                            _nodes[node_id_offset+elem->getNodeIndex(1)],
 			                                            _nodes[node_id_offset+elem->getNodeIndex(2)] }};
-			_elements.push_back(new MeshLib::Tri(tri_nodes, layer_id));
+			_elements.push_back(new MeshLib::Tri(tri_nodes));
+			_materials.push_back(layer_id);
 		}
 		else if (elem->getGeomType() == MeshLib::MeshElemType::QUAD)
 		{
@@ -98,7 +111,8 @@ void LayeredVolume::addLayerToMesh(const MeshLib::Mesh &dem_mesh, unsigned layer
 			                                             _nodes[node_id_offset+elem->getNodeIndex(1)],
 			                                             _nodes[node_id_offset+elem->getNodeIndex(2)],
 			                                             _nodes[node_id_offset+elem->getNodeIndex(3)] }};
-			_elements.push_back(new MeshLib::Quad(quad_nodes, layer_id));
+			_elements.push_back(new MeshLib::Quad(quad_nodes));
+			_materials.push_back(layer_id);
 		}
 	}
 }
@@ -124,12 +138,14 @@ void LayeredVolume::addLayerBoundaries(const MeshLib::Mesh &layer, std::size_t n
 					if (MathLib::Vector3(*n1, *n2).getLength() > std::numeric_limits<double>::epsilon())
 					{
 						const std::array<MeshLib::Node*,3> tri_nodes = {{ n0, n2, n1 }};
-						_elements.push_back(new MeshLib::Tri(tri_nodes, nLayers+1+j));
+						_elements.push_back(new MeshLib::Tri(tri_nodes));
+						_materials.push_back(nLayers+j);
 					}
 					if (MathLib::Vector3(*n0, *n3).getLength() > std::numeric_limits<double>::epsilon())
 					{
 						const std::array<MeshLib::Node*,3> tri_nodes = {{ n0, n3, n2 }};
-						_elements.push_back(new MeshLib::Tri(tri_nodes, nLayers+1+j));
+						_elements.push_back(new MeshLib::Tri(tri_nodes));
+						_materials.push_back(nLayers+j);
 					}
 				}
 	}
@@ -158,15 +174,20 @@ void LayeredVolume::removeCongruentElements(std::size_t nLayers, std::size_t nEl
 			if (count == nElemNodes)
 			{
 				delete _elements[upper_offset+j];
+				// mark element and material entries for deletion
 				_elements[upper_offset+j] = nullptr;
+				_materials[upper_offset+j] = -1;
 			}
 			else
 			{
 				MeshLib::Node attr = high->getCenterOfGravity();
-				_attribute_points.push_back(MeshLib::Node(attr[0], attr[1], (attr[2] + low->getCenterOfGravity()[2])/2.0, low->getValue()));
+				_attribute_points.push_back(MeshLib::Node(attr[0], attr[1], (attr[2] + low->getCenterOfGravity()[2])/2.0, _materials[lower_offset+j]));
 			}
 		}
 	}
+	// delete marked entries
 	auto elem_vec_end = std::remove(_elements.begin(), _elements.end(), nullptr);
 	_elements.erase(elem_vec_end, _elements.end());
+	auto mat_vec_end = std::remove(_materials.begin(), _materials.end(), -1);
+	_materials.erase(mat_vec_end, _materials.end());
 }