diff --git a/Applications/FileIO/FEFLOW/FEFLOWMeshInterface.cpp b/Applications/FileIO/FEFLOW/FEFLOWMeshInterface.cpp
index 99054b77d0096d4e99a12b3b45f98ba3ae3c4f38..bf2d608b0ab4ad3e53b06416cac5b4818421ef2a 100644
--- a/Applications/FileIO/FEFLOW/FEFLOWMeshInterface.cpp
+++ b/Applications/FileIO/FEFLOW/FEFLOWMeshInterface.cpp
@@ -691,7 +691,7 @@ void FEFLOWMeshInterface::setMaterialIDs(
         for (std::size_t i = 0; i < vec_elements.size(); i++)
         {
             MeshLib::Element* e = vec_elements[i];
-            unsigned e_min_nodeID = std::numeric_limits<unsigned>::max();
+            std::size_t e_min_nodeID = std::numeric_limits<std::size_t>::max();
             for (std::size_t j = 0; j < e->getNumberOfBaseNodes(); j++)
                 e_min_nodeID = std::min(e_min_nodeID, e->getNodeIndex(j));
             std::size_t layer_id = e_min_nodeID / no_nodes_per_layer;
diff --git a/MeshLib/Elements/Element.cpp b/MeshLib/Elements/Element.cpp
index 385547b4ac48c336af0fd0edbf62c3580fd37cb0..5c9061bee495f3d4a2228e3856a99d59bdb80ec7 100644
--- a/MeshLib/Elements/Element.cpp
+++ b/MeshLib/Elements/Element.cpp
@@ -161,7 +161,7 @@ void Element::setNode(unsigned idx, Node* node)
         _nodes[idx] = node;
 }
 
-unsigned Element::getNodeIndex(unsigned i) const
+std::size_t Element::getNodeIndex(unsigned i) const
 {
 #ifndef NDEBUG
     if (i<getNumberOfNodes())
@@ -169,7 +169,7 @@ unsigned Element::getNodeIndex(unsigned i) const
         return _nodes[i]->getID();
 #ifndef NDEBUG
     ERR("Error in MeshLib::Element::getNodeIndex() - Index does not exist.");
-    return std::numeric_limits<unsigned>::max();
+    return std::numeric_limits<std::size_t>::max();
 #endif
 }
 
diff --git a/MeshLib/Elements/Element.h b/MeshLib/Elements/Element.h
index 64db3a1af5c98a4ebce21a09a3fa20191636b3b3..e6ffd9b6b432744b582e82171231fc9641c32a65 100644
--- a/MeshLib/Elements/Element.h
+++ b/MeshLib/Elements/Element.h
@@ -120,7 +120,7 @@ public:
      * @return the global index or std::numeric_limits<unsigned>::max()
      * @sa Element::getNode()
      */
-    unsigned getNodeIndex(unsigned i) const;
+    std::size_t getNodeIndex(unsigned i) const;
 
     /**
      * Get the type of the mesh element in geometric context (as a MeshElemType-enum).
diff --git a/MeshLib/Mesh.cpp b/MeshLib/Mesh.cpp
index 3b647a1f4b5ac50e9d94116f28a505db68c42096..de759c6875662db438e6d402a21d28f3ba194fce 100644
--- a/MeshLib/Mesh.cpp
+++ b/MeshLib/Mesh.cpp
@@ -50,6 +50,10 @@ Mesh::Mesh(std::string name,
     assert(_n_base_nodes <= _nodes.size());
     this->resetNodeIDs();
     this->resetElementIDs();
+    if (_n_base_nodes == 0)
+    {
+        recalculateMaxBaseNodeId();
+    }
     if ((_n_base_nodes == 0 && hasNonlinearElement()) || isNonlinear())
         this->checkNonlinearNodeIDs();
     this->setDimension();
@@ -119,18 +123,24 @@ void Mesh::addElement(Element* elem)
 
 void Mesh::resetNodeIDs()
 {
-    const std::size_t nNodes (this->_nodes.size());
-    for (unsigned i=0; i<nNodes; ++i)
+    const std::size_t nNodes(_nodes.size());
+    for (std::size_t i = 0; i < nNodes; ++i)
+    {
         _nodes[i]->setID(i);
+    }
+}
 
-    if (_n_base_nodes==0)
+void Mesh::recalculateMaxBaseNodeId()
+{
+    std::size_t max_basenode_ID = 0;
+    for (Element const* e : _elements)
     {
-        unsigned max_basenode_ID = 0;
-        for (Element const* e : _elements)
-            for (unsigned i=0; i<e->getNumberOfBaseNodes(); i++)
-                max_basenode_ID = std::max(max_basenode_ID, e->getNodeIndex(i));
-        _n_base_nodes = max_basenode_ID + 1;
+        for (std::size_t i = 0; i < e->getNumberOfBaseNodes(); i++)
+        {
+            max_basenode_ID = std::max(max_basenode_ID, e->getNodeIndex(i));
+        }
     }
+    _n_base_nodes = max_basenode_ID + 1;
 }
 
 void Mesh::resetElementIDs()
diff --git a/MeshLib/Mesh.h b/MeshLib/Mesh.h
index b07d4e493d11ca64581bad9f5c23b4892d19fd4e..7f9e8c77bf290b2ea617fe1ecf6b6b0d89f1cdc3 100644
--- a/MeshLib/Mesh.h
+++ b/MeshLib/Mesh.h
@@ -113,6 +113,9 @@ public:
     /// Resets the IDs of all mesh-nodes to their position in the node vector
     void resetNodeIDs();
 
+    /// Finds the maximum id among all of the base nodes.
+    void recalculateMaxBaseNodeId();
+
     /// Changes the name of the mesh.
     void setName(const std::string &name) { this->_name = name; }
 
diff --git a/MeshLib/MeshGenerators/VtkMeshConverter.cpp b/MeshLib/MeshGenerators/VtkMeshConverter.cpp
index 82bc7af1a775cb1311bd1554b259328d42d3e3f3..9c26daec86d6b6d8def084ad1760d087d365c867 100644
--- a/MeshLib/MeshGenerators/VtkMeshConverter.cpp
+++ b/MeshLib/MeshGenerators/VtkMeshConverter.cpp
@@ -43,12 +43,13 @@ namespace detail
 {
 template <class T_ELEMENT>
 MeshLib::Element* createElementWithSameNodeOrder(
-    const std::vector<MeshLib::Node*>& nodes, vtkIdList* const node_ids)
+    const std::vector<MeshLib::Node*>& nodes, vtkIdList* const node_ids,
+    std::size_t const element_id)
 {
     auto** ele_nodes = new MeshLib::Node*[T_ELEMENT::n_all_nodes];
     for (unsigned k(0); k < T_ELEMENT::n_all_nodes; k++)
         ele_nodes[k] = nodes[node_ids->GetId(k)];
-    return new T_ELEMENT(ele_nodes);
+    return new T_ELEMENT(ele_nodes, element_id);
 }
 }  // namespace detail
 
@@ -65,7 +66,7 @@ MeshLib::Mesh* VtkMeshConverter::convertUnstructuredGrid(
     for (std::size_t i = 0; i < nNodes; i++)
     {
         coords = grid->GetPoints()->GetPoint(i);
-        nodes[i] = new MeshLib::Node(coords[0], coords[1], coords[2]);
+        nodes[i] = new MeshLib::Node(coords[0], coords[1], coords[2], i);
     }
 
     // set mesh elements
@@ -83,25 +84,25 @@ MeshLib::Mesh* VtkMeshConverter::convertUnstructuredGrid(
             case VTK_VERTEX:
             {
                 elem = detail::createElementWithSameNodeOrder<MeshLib::Point>(
-                    nodes, node_ids);
+                    nodes, node_ids, i);
                 break;
             }
             case VTK_LINE:
             {
                 elem = detail::createElementWithSameNodeOrder<MeshLib::Line>(
-                    nodes, node_ids);
+                    nodes, node_ids, i);
                 break;
             }
             case VTK_TRIANGLE:
             {
                 elem = detail::createElementWithSameNodeOrder<MeshLib::Tri>(
-                    nodes, node_ids);
+                    nodes, node_ids, i);
                 break;
             }
             case VTK_QUAD:
             {
                 elem = detail::createElementWithSameNodeOrder<MeshLib::Quad>(
-                    nodes, node_ids);
+                    nodes, node_ids, i);
                 break;
             }
             case VTK_PIXEL:
@@ -111,19 +112,19 @@ MeshLib::Mesh* VtkMeshConverter::convertUnstructuredGrid(
                 quad_nodes[1] = nodes[node_ids->GetId(1)];
                 quad_nodes[2] = nodes[node_ids->GetId(3)];
                 quad_nodes[3] = nodes[node_ids->GetId(2)];
-                elem = new MeshLib::Quad(quad_nodes);
+                elem = new MeshLib::Quad(quad_nodes, i);
                 break;
             }
             case VTK_TETRA:
             {
                 elem = detail::createElementWithSameNodeOrder<MeshLib::Tet>(
-                    nodes, node_ids);
+                    nodes, node_ids, i);
                 break;
             }
             case VTK_HEXAHEDRON:
             {
                 elem = detail::createElementWithSameNodeOrder<MeshLib::Hex>(
-                    nodes, node_ids);
+                    nodes, node_ids, i);
                 break;
             }
             case VTK_VOXEL:
@@ -137,13 +138,13 @@ MeshLib::Mesh* VtkMeshConverter::convertUnstructuredGrid(
                 voxel_nodes[5] = nodes[node_ids->GetId(5)];
                 voxel_nodes[6] = nodes[node_ids->GetId(7)];
                 voxel_nodes[7] = nodes[node_ids->GetId(6)];
-                elem = new MeshLib::Hex(voxel_nodes);
+                elem = new MeshLib::Hex(voxel_nodes, i);
                 break;
             }
             case VTK_PYRAMID:
             {
                 elem = detail::createElementWithSameNodeOrder<MeshLib::Pyramid>(
-                    nodes, node_ids);
+                    nodes, node_ids, i);
                 break;
             }
             case VTK_WEDGE:
@@ -154,50 +155,50 @@ MeshLib::Mesh* VtkMeshConverter::convertUnstructuredGrid(
                     prism_nodes[i] = nodes[node_ids->GetId(i + 3)];
                     prism_nodes[i + 3] = nodes[node_ids->GetId(i)];
                 }
-                elem = new MeshLib::Prism(prism_nodes);
+                elem = new MeshLib::Prism(prism_nodes, i);
                 break;
             }
             case VTK_QUADRATIC_EDGE:
             {
                 elem = detail::createElementWithSameNodeOrder<MeshLib::Line3>(
-                    nodes, node_ids);
+                    nodes, node_ids, i);
                 break;
             }
             case VTK_QUADRATIC_TRIANGLE:
             {
                 elem = detail::createElementWithSameNodeOrder<MeshLib::Tri6>(
-                    nodes, node_ids);
+                    nodes, node_ids, i);
                 break;
             }
             case VTK_QUADRATIC_QUAD:
             {
                 elem = detail::createElementWithSameNodeOrder<MeshLib::Quad8>(
-                    nodes, node_ids);
+                    nodes, node_ids, i);
                 break;
             }
             case VTK_BIQUADRATIC_QUAD:
             {
                 elem = detail::createElementWithSameNodeOrder<MeshLib::Quad9>(
-                    nodes, node_ids);
+                    nodes, node_ids, i);
                 break;
             }
             case VTK_QUADRATIC_TETRA:
             {
                 elem = detail::createElementWithSameNodeOrder<MeshLib::Tet10>(
-                    nodes, node_ids);
+                    nodes, node_ids, i);
                 break;
             }
             case VTK_QUADRATIC_HEXAHEDRON:
             {
                 elem = detail::createElementWithSameNodeOrder<MeshLib::Hex20>(
-                    nodes, node_ids);
+                    nodes, node_ids, i);
                 break;
             }
             case VTK_QUADRATIC_PYRAMID:
             {
                 elem =
                     detail::createElementWithSameNodeOrder<MeshLib::Pyramid13>(
-                        nodes, node_ids);
+                        nodes, node_ids, i);
                 break;
             }
             case VTK_QUADRATIC_WEDGE:
@@ -215,7 +216,7 @@ MeshLib::Mesh* VtkMeshConverter::convertUnstructuredGrid(
                 prism_nodes[11] = nodes[node_ids->GetId(13)];
                 for (unsigned i = 0; i < 3; ++i)
                     prism_nodes[12 + i] = nodes[node_ids->GetId(11 - i)];
-                elem = new MeshLib::Prism15(prism_nodes);
+                elem = new MeshLib::Prism15(prism_nodes, i);
                 break;
             }
             default: