diff --git a/MeshLib/ElementStatus.cpp b/MeshLib/ElementStatus.cpp
index 97a6e88bd0e9e164570d3d4341bb62803990b413..683cea2fe2c6ed1bc0b075ab35399b57d24ea25c 100644
--- a/MeshLib/ElementStatus.cpp
+++ b/MeshLib/ElementStatus.cpp
@@ -78,6 +78,21 @@ unsigned ElementStatus::getNActiveElements() const
 	return static_cast<unsigned>(std::count(_element_status.begin(), _element_status.end(), true));
 }
 
+void ElementStatus::setAll(bool status)
+{
+	std::fill(_element_status.begin(), _element_status.end(), status);
+
+	if (status)
+	{
+		const std::vector<MeshLib::Node*> &nodes (_mesh->getNodes());
+		const std::size_t nNodes (_mesh->getNNodes());
+		for (std::size_t i=0; i<nNodes; ++i)
+			_active_nodes[i] = nodes[i]->getNElements();
+	}
+	else
+		std::fill(_active_nodes.begin(), _active_nodes.end(), 0);
+}
+
 void ElementStatus::setElementStatus(unsigned i, bool status)
 {
 	if (_element_status[i] != status)
diff --git a/MeshLib/ElementStatus.h b/MeshLib/ElementStatus.h
index 03a10d965c6b93352e2ddc3504f44250fbd872c1..90b61e47cf299d2b9fdf02912cbb04a2b5da6dd6 100644
--- a/MeshLib/ElementStatus.h
+++ b/MeshLib/ElementStatus.h
@@ -52,6 +52,9 @@ public:
 	/// Returns the status of element 
 	bool isActive(unsigned i) const { return _element_status[i]; } 
 
+	/// Activates/Deactives all mesh elements
+	void setAll(bool status);
+
 	/// Sets the status of element i
 	void setElementStatus(unsigned i, bool status);
 
diff --git a/Tests/MeshLib/TestElementStatus.cpp b/Tests/MeshLib/TestElementStatus.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..449a6c033c3ae22135b9adb64d214fe56cda29cf
--- /dev/null
+++ b/Tests/MeshLib/TestElementStatus.cpp
@@ -0,0 +1,88 @@
+/**
+ * @file TestElementStatus.cpp
+ * @author Karsten Rink
+ * @date 2013-03-14
+ * @brief Tests for ElementStatus class
+ *
+ * @copyright
+ * Copyright (c) 2013, 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 "Mesh.h"
+#include "Node.h"
+#include "Elements/Element.h"
+#include "ElementStatus.h"
+#include "MeshGenerators/MeshGenerator.h"
+
+
+TEST(MeshLib, ElementStatus)
+{
+const unsigned width (100);
+	const unsigned elements_per_side (20);
+	MeshLib::Mesh* mesh (MeshLib::MeshGenerator::generateRegularQuadMesh(width, elements_per_side));
+	MeshLib::ElementStatus status(mesh);
+	const std::vector<MeshLib::Element*> elements (mesh->getElements());
+
+	for (unsigned i=0; i<elements_per_side; ++i)
+	{
+		for (unsigned j=0; j<elements_per_side; ++j)
+			elements[i*elements_per_side + j]->setValue(i);
+	}
+
+	// all elements active
+	ASSERT_EQ (status.getNActiveElements(), elements.size());
+	// all nodes active
+	ASSERT_EQ (status.getNActiveNodes(), mesh->getNNodes());
+
+	// set material 1 to false
+	status.setMaterialStatus(1, false);
+	ASSERT_EQ (status.getNActiveElements(), elements.size()-elements_per_side);
+
+	// set material 1 to false (again)
+	status.setMaterialStatus(1, false);
+	ASSERT_EQ (status.getNActiveElements(), elements.size()-elements_per_side);
+
+	// set material 0 to false
+	status.setMaterialStatus(0, false);
+	ASSERT_EQ (status.getNActiveElements(), elements.size()-(2*elements_per_side));
+
+	// active elements
+	std::vector<unsigned> active_elements (status.getActiveElements());
+	ASSERT_EQ (active_elements.size(), status.getNActiveElements());
+
+	// active nodes
+	std::vector<unsigned> active_nodes (status.getActiveNodes());
+	ASSERT_EQ (active_nodes.size(), status.getNActiveNodes());
+
+	// set element 1 to false (yet again)
+	status.setElementStatus(1, false);
+	status.isActive(1);
+	ASSERT_EQ (status.getNActiveElements(), elements.size()-(2*elements_per_side));
+	ASSERT_EQ (status.getNActiveNodes(), mesh->getNNodes()-(2*(elements_per_side+1)));
+
+	// set element 1 to true
+	status.setElementStatus(1, true);
+	ASSERT_EQ (status.getNActiveElements(), elements.size()-(2*elements_per_side)+1);
+	ASSERT_EQ (status.getNActiveNodes(), mesh->getNNodes()-(2*(elements_per_side+1))+4);
+	ASSERT_EQ(status.isActive(1), true);
+
+	std::vector<unsigned> active_elements_at_node (status.getActiveElementsAtNode(2));
+	ASSERT_EQ(active_elements_at_node.size(), 1);
+	active_elements_at_node = status.getActiveElementsAtNode(22);
+	ASSERT_EQ(active_elements_at_node.size(), 1);
+	active_elements_at_node = status.getActiveElementsAtNode(102);
+	ASSERT_EQ(active_elements_at_node.size(), 4);
+
+	status.setAll(true);
+	ASSERT_EQ(status.getNActiveElements(), elements.size());
+	ASSERT_EQ(status.getNActiveNodes(), mesh->getNNodes());
+
+	status.setAll(false);
+	ASSERT_EQ(0, status.getNActiveElements());
+	ASSERT_EQ(0, status.getNActiveNodes());
+}