diff --git a/MeshLib/MeshGenerators/LayeredVolume.cpp b/MeshLib/MeshGenerators/LayeredVolume.cpp
index 3263dcb0343c30bc69accbfb9605e2c0e53c5409..7dca13f4f08e49e3f1e68531fd7bffaae445c70c 100644
--- a/MeshLib/MeshGenerators/LayeredVolume.cpp
+++ b/MeshLib/MeshGenerators/LayeredVolume.cpp
@@ -69,9 +69,9 @@ void LayeredVolume::addLayerToMesh(const MeshLib::Mesh &mesh_layer, unsigned lay
 
 	for (std::size_t i=0; i<nNodes; ++i)
 	{
-		if (layer_id > 0 &&
-		   ((*layer_nodes[i])[2] == no_data_value ||
-		    (*_nodes[last_layer_offset+i])[2]-(*layer_nodes[i])[2] < _elevation_epsilon))
+		if ((layer_id > 0) &&
+		    ((std::abs((*layer_nodes[i])[2] - no_data_value) < std::numeric_limits<double>::epsilon()) ||
+		     ((*_nodes[last_layer_offset+i])[2]-(*layer_nodes[i])[2] < _elevation_epsilon)))
 			_nodes.push_back(new MeshLib::Node(*_nodes[last_layer_offset+i]));
 		else
 			_nodes.push_back(new MeshLib::Node(layer_nodes[i]->getCoords(), _nodes.size()));
@@ -83,16 +83,16 @@ void LayeredVolume::addLayerToMesh(const MeshLib::Mesh &mesh_layer, unsigned lay
 		if (elem->getGeomType() == MeshElemType::TRIANGLE)
 		{
 			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)] }};
+			                                            _nodes[node_id_offset+elem->getNodeIndex(1)],
+			                                            _nodes[node_id_offset+elem->getNodeIndex(2)] }};
 			_elements.push_back(new MeshLib::Tri(tri_nodes, layer_id+1));
 		}
 		else if (elem->getGeomType() == MeshElemType::QUAD)
 		{
 			std::array<MeshLib::Node*,4> quad_nodes = {{ _nodes[node_id_offset+elem->getNodeIndex(0)],
-			                                            _nodes[node_id_offset+elem->getNodeIndex(1)],
-			                                            _nodes[node_id_offset+elem->getNodeIndex(2)],
-			                                            _nodes[node_id_offset+elem->getNodeIndex(3)] }};
+			                                             _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+1));
 		}
 	}
@@ -138,15 +138,15 @@ void LayeredVolume::removeCongruentElements(std::size_t nLayers, std::size_t nEl
 		const std::size_t lower_offset ( i    * nElementsPerLayer);
 		for (std::size_t j=0; j<nElementsPerLayer; ++j)
 		{
-			MeshLib::Element const*const high (_elements[upper_offset+j]);
-			MeshLib::Element *low  (_elements[lower_offset+j]);
+			MeshLib::Element *const high (_elements[upper_offset+j]);
+			MeshLib::Element const*const low  (_elements[lower_offset+j]);
 
 			unsigned count(0);
 			const std::size_t nElemNodes (low->getNNodes());
 			for (std::size_t k=0; k<nElemNodes; ++k)
 				if (high->getNodeIndex(k) == low->getNodeIndex(k))
 				{
-					low->setNode(k, _nodes[high->getNodeIndex(k)]);
+					high->setNode(k, _nodes[low->getNodeIndex(k)]);
 					count++;
 				}
 
diff --git a/MeshLib/MeshGenerators/MeshLayerMapper.cpp b/MeshLib/MeshGenerators/MeshLayerMapper.cpp
index c56b846d7089d364e21ead757fad6eb349914d5a..656ca3b7bff3a0e78632f8fcc8b6549ef26f9ce9 100644
--- a/MeshLib/MeshGenerators/MeshLayerMapper.cpp
+++ b/MeshLib/MeshGenerators/MeshLayerMapper.cpp
@@ -108,30 +108,38 @@ MeshLib::Mesh* MeshLayerMapper::createStaticLayers(MeshLib::Mesh const& mesh, st
 
 bool MeshLayerMapper::createRasterLayers(MeshLib::Mesh const& mesh, std::vector<GeoLib::Raster const*> const& rasters, double noDataReplacementValue)
 {
-    const std::size_t nLayers(rasters.size());
-    if (nLayers < 1 || mesh.getDimension() != 2)
-    {
-        ERR("MeshLayerMapper::createRasterLayers(): A 2D mesh and at least two rasters required as input.");
-        return nullptr;
-    }
+	const std::size_t nLayers(rasters.size());
+	if (nLayers < 1 || mesh.getDimension() != 2)
+	{
+		ERR("MeshLayerMapper::createRasterLayers(): A 2D mesh and at least two rasters required as input.");
+		return nullptr;
+	}
 
-    MeshLib::Mesh* dem_mesh (new MeshLib::Mesh(mesh));
-    if (layerMapping(*dem_mesh, *rasters.back(), 0))
-    {
-        std::size_t const nNodes = mesh.getNNodes();
-        _nodes.reserve(nLayers * nNodes);
+	MeshLib::Mesh* top (new MeshLib::Mesh(mesh));
+	if (!layerMapping(*top, *rasters.back(), 0))
+		return false;
+
+	MeshLib::Mesh* bottom (new MeshLib::Mesh(mesh));
+	if (!layerMapping(*bottom, *rasters[0], 0))
+		return false;
 
-        // number of triangles in the original mesh
-        std::size_t const nElems (std::count_if(mesh.getElements().begin(), mesh.getElements().end(),
-            [](MeshLib::Element const* elem) { return (elem->getGeomType() == MeshElemType::TRIANGLE);}));
-        _elements.reserve(nElems * (nLayers-1));
+	std::size_t const nNodes = mesh.getNNodes();
+	_nodes.reserve(nLayers * nNodes);
 
-        for (std::size_t i=0; i<nLayers; ++i)
-            addLayerToMesh(*dem_mesh, i, *rasters[i]);
+	// number of triangles in the original mesh
+	std::size_t const nElems (std::count_if(mesh.getElements().begin(), mesh.getElements().end(),
+		[](MeshLib::Element const* elem) { return (elem->getGeomType() == MeshElemType::TRIANGLE);}));
+	_elements.reserve(nElems * (nLayers-1));
 
-        return true;
-    }
-    return false;
+	// bottom layer
+	std::vector<MeshLib::Node*> const& nodes = bottom->getNodes();
+	std::copy(nodes.cbegin(), nodes.cend(), std::back_inserter(_nodes));
+	
+	// the other layers
+	for (std::size_t i=1; i<nLayers; ++i)
+		addLayerToMesh(*top, i, *rasters[i]);
+
+	return true;
 }
 
 void MeshLayerMapper::addLayerToMesh(const MeshLib::Mesh &dem_mesh, unsigned layer_id, GeoLib::Raster const& raster)
@@ -147,17 +155,13 @@ void MeshLayerMapper::addLayerToMesh(const MeshLib::Mesh &dem_mesh, unsigned lay
         // min of dem elevation and layer elevation
         double const elevation = std::min(raster.interpolateValueAtPoint(*nodes[i]), (*nodes[i])[2]);
 
-        if ((layer_id > 0) && 
-            ((std::abs(elevation - no_data_value) < std::numeric_limits<double>::epsilon()) ||
-             (elevation - (*_nodes[last_layer_node_offset + i])[2] < std::numeric_limits<double>::epsilon())))
+        if ((std::abs(elevation - no_data_value) < std::numeric_limits<double>::epsilon()) ||
+            (elevation - (*_nodes[last_layer_node_offset + i])[2] < std::numeric_limits<double>::epsilon()))
             _nodes.push_back(new MeshLib::Node((*nodes[i])[0], (*nodes[i])[1], elevation, _nodes[last_layer_node_offset +i]->getID()));
         else
             _nodes.push_back(new MeshLib::Node((*nodes[i])[0], (*nodes[i])[1], elevation, (layer_id * nNodes) + i));
     }
 
-    if (layer_id == 0)
-        return;
-
     std::vector<MeshLib::Element*> const& elems = dem_mesh.getElements();
     std::size_t const nElems (dem_mesh.getNElements());