diff --git a/Tests/MeshLib/TestMeshValidation.cpp b/Tests/MeshLib/TestMeshValidation.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..158702926c4aa513e560198c1e3076219f27bc87
--- /dev/null
+++ b/Tests/MeshLib/TestMeshValidation.cpp
@@ -0,0 +1,135 @@
+/**
+ * @file TestMeshValidation.cpp
+ * @author Karsten Rink
+ * @date 2015-01-29
+ * @brief Tests for MeshRevision class
+ *
+ * @copyright
+ * Copyright (c) 2012-2014, OpenGeoSys Community (http://www.opengeosys.org)
+ *            Distributed under a Modified BSD License.
+ *              See accompanying file LICENSE.txt or
+ *              http://www.opengeosys.org/LICENSE.txt
+ */
+
+#include "gtest/gtest.h"
+
+#include "MeshLib/Mesh.h"
+#include "MeshLib/Node.h"
+#include "MeshLib/MeshQuality/MeshValidation.h"
+#include "MeshLib/MeshGenerators/MeshGenerator.h"
+#include "MeshLib/MeshGenerators/ConvertRasterToMesh.h"
+#include "MeshLib/MeshEditing/DuplicateMeshComponents.h"
+#include "MeshLib/Elements/Element.h"
+#include "MeshLib/Elements/Tri.h"
+#include "MeshLib/Elements/Quad.h"
+#include "MeshLib/Elements/Tet.h"
+#include "MeshLib/Elements/Hex.h"
+#include "MeshLib/Elements/Pyramid.h"
+#include "MeshLib/Elements/Prism.h"
+
+
+#include "GeoLib/Raster.h"
+
+TEST(MeshValidation, UnusedNodes)
+{
+	std::array<double, 12> pix = {0,0.1,0.2,0.1,0,0,0.1,0,0,0,-0.1,0};
+	GeoLib::Raster raster(4,3,0,0,1,pix.begin(), pix.end());
+	MeshLib::ConvertRasterToMesh conv(raster, MeshElemType::TRIANGLE, MeshLib::UseIntensityAs::ELEVATION);
+	MeshLib::Mesh* mesh = conv.execute();
+	std::vector<std::size_t> u_nodes = MeshLib::MeshValidation::findUnusedMeshNodes(*mesh);
+	ASSERT_EQ(0, u_nodes.size());
+
+	std::vector<MeshLib::Node*> nodes = MeshLib::copyNodeVector(mesh->getNodes());
+	nodes.push_back(new MeshLib::Node(-1,-1,-1));
+	std::vector<MeshLib::Element*> elems = MeshLib::copyElementVector(mesh->getElements(),nodes);
+	MeshLib::Mesh mesh2("mesh2", nodes, elems);
+	u_nodes = MeshLib::MeshValidation::findUnusedMeshNodes(mesh2);
+	ASSERT_EQ(1, u_nodes.size());
+	ASSERT_EQ(nodes.back()->getID(), u_nodes[0]);
+
+	delete mesh;
+}
+
+TEST(MeshValidation, DetectHolesTri)
+{
+	std::array<double, 12> pix = {0,0.1,0.2,0.1,0,0,0.1,0,0,0,-0.1,0};
+	GeoLib::Raster raster(4,3,0,0,1,pix.begin(), pix.end());
+	MeshLib::ConvertRasterToMesh conv(raster, MeshElemType::TRIANGLE, MeshLib::UseIntensityAs::ELEVATION);
+	MeshLib::Mesh* mesh = conv.execute();
+	unsigned n_holes = MeshLib::MeshValidation::detectHoles(*mesh);
+	ASSERT_EQ(0, n_holes);
+
+	{
+		std::vector<MeshLib::Node*> nodes = MeshLib::copyNodeVector(mesh->getNodes());
+		std::vector<MeshLib::Element*> elems = MeshLib::copyElementVector(mesh->getElements(),nodes);
+		elems.erase(elems.begin()+12);
+		MeshLib::Mesh mesh2("mesh2", nodes, elems);
+		n_holes = MeshLib::MeshValidation::detectHoles(mesh2);
+		ASSERT_EQ(1, n_holes);
+	}
+
+	{
+		std::vector<MeshLib::Node*> nodes = MeshLib::copyNodeVector(mesh->getNodes());
+		std::vector<MeshLib::Element*> elems = MeshLib::copyElementVector(mesh->getElements(),nodes);
+		elems.erase(elems.begin()+11);
+		elems.erase(elems.begin()+11);
+		MeshLib::Mesh mesh2("mesh2", nodes, elems);
+		n_holes = MeshLib::MeshValidation::detectHoles(mesh2);
+		ASSERT_EQ(1, n_holes);
+	}
+
+	{
+		std::vector<MeshLib::Node*> nodes = MeshLib::copyNodeVector(mesh->getNodes());
+		std::vector<MeshLib::Element*> elems = MeshLib::copyElementVector(mesh->getElements(),nodes);
+		elems.erase(elems.begin()+10);
+		elems.erase(elems.begin()+12);
+		MeshLib::Mesh mesh2("mesh2", nodes, elems);
+		n_holes = MeshLib::MeshValidation::detectHoles(mesh2);
+		ASSERT_EQ(2, n_holes);
+	}
+
+	delete mesh;
+}
+
+TEST(MeshValidation, DetectHolesHex)
+{
+	std::size_t xs=5, ys=4, zs=4;
+	GeoLib::Point origin(0,0,0);
+	MeshLib::Mesh* mesh = MeshLib::MeshGenerator::generateRegularHexMesh(5,4,4,1,1,1,origin, "mesh");
+	unsigned n_holes = MeshLib::MeshValidation::detectHoles(*mesh);
+	ASSERT_EQ(0, n_holes);
+
+	{
+		std::vector<MeshLib::Node*> nodes = MeshLib::copyNodeVector(mesh->getNodes());
+		std::vector<MeshLib::Element*> elems = MeshLib::copyElementVector(mesh->getElements(),nodes);
+		elems.erase(elems.begin()+27);
+		MeshLib::Mesh mesh2("mesh2", nodes, elems);
+		n_holes = MeshLib::MeshValidation::detectHoles(mesh2);
+		ASSERT_EQ(1, n_holes);
+	}
+
+	{
+		std::vector<MeshLib::Node*> nodes = MeshLib::copyNodeVector(mesh->getNodes());
+		std::vector<MeshLib::Element*> elems = MeshLib::copyElementVector(mesh->getElements(),nodes);
+		elems.erase(elems.begin()+28);
+		elems.erase(elems.begin()+27);
+		MeshLib::Mesh mesh2("mesh2", nodes, elems);
+		n_holes = MeshLib::MeshValidation::detectHoles(mesh2);
+		ASSERT_EQ(1, n_holes);
+	}
+
+	{
+		std::vector<MeshLib::Node*> nodes = MeshLib::copyNodeVector(mesh->getNodes());
+		std::vector<MeshLib::Element*> elems = MeshLib::copyElementVector(mesh->getElements(),nodes);
+		elems.erase(elems.begin()+29);
+		elems.erase(elems.begin()+27);
+		MeshLib::Mesh mesh2("mesh2", nodes, elems);
+		n_holes = MeshLib::MeshValidation::detectHoles(mesh2);
+		ASSERT_EQ(1, n_holes);
+	}
+	delete mesh;
+}
+
+
+
+