diff --git a/Tests/MeshLib/TestQuadraticMesh.cpp b/Tests/MeshLib/TestQuadraticMesh.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..d8c9af506d1a4f6bcab691e1edea89e348e9e9be
--- /dev/null
+++ b/Tests/MeshLib/TestQuadraticMesh.cpp
@@ -0,0 +1,190 @@
+/**
+ * \copyright
+ * Copyright (c) 2012-2016, OpenGeoSys Community (http://www.opengeosys.org)
+ *            Distributed under a Modified BSD License.
+ *              See accompanying file LICENSE.txt or
+ *              http://www.opengeosys.org/project/license
+ *
+ */
+
+#include "gtest/gtest.h"
+
+#include <memory>
+
+#include "GeoLib/Polyline.h"
+#include "GeoLib/PolylineVec.h"
+
+#include "MeshLib/Elements/Element.h"
+#include "MeshLib/Mesh.h"
+#include "MeshLib/MeshGenerators/MeshGenerator.h"
+#include "MeshLib/MeshGenerators/QuadraticeMeshGenerator.h"
+#include "MeshLib/Node.h"
+#include "MeshGeoToolsLib/AppendLinesAlongPolyline.h"
+
+TEST(MeshLib, QuadraticOrderMesh_Line)
+{
+    using namespace MeshLib;
+
+    std::unique_ptr<Mesh> linear_mesh(MeshGenerator::generateLineMesh(
+        1, std::size_t(2)));
+    std::unique_ptr<Mesh> mesh(createQuadraticOrderMesh(*linear_mesh.get()));
+    ASSERT_EQ(5u, mesh->getNumberOfNodes());
+    ASSERT_EQ(3u, mesh->getNumberOfBaseNodes());
+    ASSERT_EQ(2u, mesh->getNumberOfElements());
+
+    for (MeshLib::Element const* e : mesh->getElements())
+    {
+        ASSERT_EQ(MeshLib::CellType::LINE3, e->getCellType());
+        ASSERT_EQ(2u, e->getNumberOfBaseNodes());
+        ASSERT_EQ(3u, e->getNumberOfNodes());
+
+        for (unsigned i=0; i<e->getNumberOfBaseNodes(); i++)
+            ASSERT_TRUE(mesh->isBaseNode(e->getNodeIndex(i)));
+        for (unsigned i=e->getNumberOfBaseNodes(); i<e->getNumberOfNodes(); i++)
+            ASSERT_FALSE(mesh->isBaseNode(e->getNodeIndex(i)));
+    }
+
+    for (MeshLib::Node const* node : mesh->getNodes())
+    {
+        if (node->getID() == 1)
+        {
+            ASSERT_EQ(2u, node->getElements().size());
+            ASSERT_EQ(5u, node->getConnectedNodes().size());
+        }
+        else
+        {
+            ASSERT_EQ(1u, node->getElements().size());
+            ASSERT_EQ(3u, node->getConnectedNodes().size());
+        }
+    }
+}
+
+TEST(MeshLib, QuadraticOrderMesh_Quad)
+{
+    using namespace MeshLib;
+
+    std::unique_ptr<Mesh> linear_mesh(MeshGenerator::generateRegularQuadMesh(
+        1, 1, std::size_t(2), std::size_t(2)));
+    std::unique_ptr<Mesh> mesh(createQuadraticOrderMesh(*linear_mesh.get()));
+    ASSERT_EQ(21u, mesh->getNumberOfNodes());
+    ASSERT_EQ(9u, mesh->getNumberOfBaseNodes());
+    ASSERT_EQ(4u, mesh->getNumberOfElements());
+
+    for (MeshLib::Element const* e : mesh->getElements())
+    {
+        ASSERT_EQ(MeshLib::CellType::QUAD8, e->getCellType());
+        ASSERT_EQ(4u, e->getNumberOfBaseNodes());
+        ASSERT_EQ(8u, e->getNumberOfNodes());
+
+        for (unsigned i=0; i<e->getNumberOfBaseNodes(); i++)
+            ASSERT_TRUE(mesh->isBaseNode(e->getNodeIndex(i)));
+        for (unsigned i=e->getNumberOfBaseNodes(); i<e->getNumberOfNodes(); i++)
+            ASSERT_FALSE(mesh->isBaseNode(e->getNodeIndex(i)));
+    }
+
+    auto isIn = [](MeshLib::Node const* node, std::initializer_list<std::size_t> list)
+    {
+        return list.end() != std::find(list.begin(), list.end(), node->getID());
+    };
+
+    for (MeshLib::Node const* node : mesh->getNodes())
+    {
+        if (isIn(node, {4}))
+        {
+            ASSERT_EQ(4u, node->getElements().size());
+            ASSERT_EQ(21u, node->getConnectedNodes().size());
+        }
+        else if (isIn(node, {0, 2, 6, 8, 9, 10, 11, 13, 15, 18, 19, 20}))
+        {
+            ASSERT_EQ(1u, node->getElements().size());
+            ASSERT_EQ(8u, node->getConnectedNodes().size());
+        }
+        else
+        {
+            ASSERT_EQ(2u, node->getElements().size());
+            ASSERT_EQ(13u, node->getConnectedNodes().size());
+        }
+    }
+}
+
+TEST(MeshLib, QuadraticOrderMesh_LineQuad)
+{
+    using namespace MeshLib;
+
+    std::unique_ptr<Mesh> linear_quad_mesh(MeshGenerator::generateRegularQuadMesh(
+        1, 1, std::size_t(2), std::size_t(2)));
+
+    std::unique_ptr<Mesh> linear_mesh;
+    {
+        std::vector<GeoLib::Point*> pnts;
+        pnts.push_back(new GeoLib::Point(0,0.5,0,0));
+        pnts.push_back(new GeoLib::Point(1,0.5,0,1));
+        GeoLib::Polyline* ply = new GeoLib::Polyline(pnts);
+        ply->addPoint(0);
+        ply->addPoint(1);
+        std::unique_ptr<std::vector<GeoLib::Polyline*>> plys(new std::vector<GeoLib::Polyline*>());
+        plys->push_back(ply);
+        GeoLib::PolylineVec ply_vec("", std::move(plys));
+
+        linear_mesh = MeshGeoToolsLib::appendLinesAlongPolylines(*linear_quad_mesh.get(), ply_vec);
+
+        for (auto p : pnts)
+            delete p;
+    }
+    ASSERT_EQ(6u, linear_mesh->getNumberOfElements());
+
+    std::unique_ptr<Mesh> mesh(createQuadraticOrderMesh(*linear_mesh.get()));
+    ASSERT_EQ(21u, mesh->getNumberOfNodes());
+    ASSERT_EQ(9u, mesh->getNumberOfBaseNodes());
+    ASSERT_EQ(6u, mesh->getNumberOfElements());
+
+    for (MeshLib::Element const* e : mesh->getElements())
+    {
+        if (e->getID() < 4)
+        {
+            ASSERT_EQ(MeshLib::CellType::QUAD8, e->getCellType());
+            ASSERT_EQ(4u, e->getNumberOfBaseNodes());
+            ASSERT_EQ(8u, e->getNumberOfNodes());
+        }
+        else
+        {
+            ASSERT_EQ(MeshLib::CellType::LINE3, e->getCellType());
+            ASSERT_EQ(2u, e->getNumberOfBaseNodes());
+            ASSERT_EQ(3u, e->getNumberOfNodes());
+        }
+
+        for (unsigned i=0; i<e->getNumberOfBaseNodes(); i++)
+            ASSERT_TRUE(mesh->isBaseNode(e->getNodeIndex(i)));
+        for (unsigned i=e->getNumberOfBaseNodes(); i<e->getNumberOfNodes(); i++)
+            ASSERT_FALSE(mesh->isBaseNode(e->getNodeIndex(i)));
+    }
+
+    auto isIn = [](MeshLib::Node const* node, std::initializer_list<std::size_t> list)
+    {
+        return list.end() != std::find(list.begin(), list.end(), node->getID());
+    };
+
+    for (MeshLib::Node const* node : mesh->getNodes())
+    {
+        if (isIn(node, {4}))
+        {
+            ASSERT_EQ(6u, node->getElements().size());
+            ASSERT_EQ(21u, node->getConnectedNodes().size());
+        }
+        else if (isIn(node, {0, 2, 6, 8, 9, 10, 11, 13, 15, 18, 19, 20}))
+        {
+            ASSERT_EQ(1u, node->getElements().size());
+            ASSERT_EQ(8u, node->getConnectedNodes().size());
+        }
+        else if (isIn(node, {3, 5, 14, 16}))
+        {
+            ASSERT_EQ(3u, node->getElements().size());
+            ASSERT_EQ(13u, node->getConnectedNodes().size());
+        }
+        else
+        {
+            ASSERT_EQ(2u, node->getElements().size());
+            ASSERT_EQ(13u, node->getConnectedNodes().size());
+        }
+    }
+}