diff --git a/Applications/DataExplorer/DataView/DirectConditionGenerator.cpp b/Applications/DataExplorer/DataView/DirectConditionGenerator.cpp
index 81d7428537a36087b0b79e623ac217c189ddea5a..34e9b4ddbd0b7ca0d221e8a05bfbb3048b00f995 100644
--- a/Applications/DataExplorer/DataView/DirectConditionGenerator.cpp
+++ b/Applications/DataExplorer/DataView/DirectConditionGenerator.cpp
@@ -30,36 +30,45 @@
 #include <cmath>
 #include <limits>
 
-const std::vector< std::pair<std::size_t,double> >& DirectConditionGenerator::directToSurfaceNodes(const MeshLib::Mesh &mesh, const std::string &filename)
+const std::vector<std::pair<std::size_t, double>>&
+DirectConditionGenerator::directToSurfaceNodes(const MeshLib::Mesh& mesh,
+                                               const std::string& filename)
 {
     if (_direct_values.empty())
     {
-        GeoLib::Raster* raster (GeoLib::IO::AsciiRasterInterface::readRaster(filename));
-        if (! raster) {
-            ERR("Error in DirectConditionGenerator::directToSurfaceNodes() - could not load raster file.");
+        GeoLib::Raster* raster(
+            GeoLib::IO::AsciiRasterInterface::readRaster(filename));
+        if (!raster)
+        {
+            ERR("Error in DirectConditionGenerator::directToSurfaceNodes() - "
+                "could not load raster file.");
             return _direct_values;
         }
 
-        const MathLib::Vector3 dir(0,0,-1);
-        const std::vector<GeoLib::Point*> surface_nodes(MeshLib::MeshSurfaceExtraction::getSurfaceNodes(mesh, dir, 90) );
-        const std::size_t nNodes(surface_nodes.size());
-        const double no_data (raster->getHeader().no_data);
-        _direct_values.reserve(nNodes);
-        for (std::size_t i=0; i<nNodes; i++)
+        const MathLib::Vector3 dir(0, 0, -1);
+        const std::vector<MeshLib::Node*> surface_nodes(
+            MeshLib::MeshSurfaceExtraction::getSurfaceNodes(mesh, dir, 90));
+        const double no_data(raster->getHeader().no_data);
+        _direct_values.reserve(surface_nodes.size());
+        for (auto const* surface_node : surface_nodes)
         {
-            double val (raster->getValueAtPoint(*surface_nodes[i]));
+            double val(raster->getValueAtPoint(*surface_node));
             val = (val == no_data) ? 0 : val;
-            _direct_values.push_back (std::pair<std::size_t, double>(surface_nodes[i]->getID(), val));
+            _direct_values.push_back(
+                std::make_pair(surface_node->getID(), val));
         }
         delete raster;
+
+        std::for_each(surface_nodes.begin(), surface_nodes.end(),
+                      std::default_delete<MeshLib::Node>());
     }
     else
-        ERR("Error in DirectConditionGenerator::directToSurfaceNodes() - Data vector contains outdated values.");
+        ERR("Error in DirectConditionGenerator::directToSurfaceNodes() - Data "
+            "vector contains outdated values.");
 
     return _direct_values;
 }
 
-
 const std::vector< std::pair<std::size_t,double> >& DirectConditionGenerator::directWithSurfaceIntegration(MeshLib::Mesh &mesh, const std::string &filename, double scaling)
 {
     if (!_direct_values.empty()) {
diff --git a/Applications/Utils/MeshGeoTools/ComputeSurfaceNodeIDsInPolygonalRegion.cpp b/Applications/Utils/MeshGeoTools/ComputeSurfaceNodeIDsInPolygonalRegion.cpp
index 75db24be21a13347bf068ec8e378a0b4f87f54f4..5359216727013cedd8cecb021d96a914517cbe9e 100644
--- a/Applications/Utils/MeshGeoTools/ComputeSurfaceNodeIDsInPolygonalRegion.cpp
+++ b/Applications/Utils/MeshGeoTools/ComputeSurfaceNodeIDsInPolygonalRegion.cpp
@@ -110,11 +110,12 @@ int main (int argc, char* argv[])
     };
 
     std::vector<double> areas(computeElementTopSurfaceAreas(*mesh, dir, angle));
-    std::vector<GeoLib::Point*> all_sfc_pnts(
+    std::vector<MeshLib::Node*> all_sfc_nodes(
         MeshLib::MeshSurfaceExtraction::getSurfaceNodes(*mesh, dir, angle)
     );
 
-    std::for_each(all_sfc_pnts.begin(), all_sfc_pnts.end(), [](GeoLib::Point* p) { (*p)[2] = 0.0; });
+    std::for_each(all_sfc_nodes.begin(), all_sfc_nodes.end(),
+                  [](MeshLib::Node* p) { (*p)[2] = 0.0; });
 
     std::vector<MeshLib::Node*> const& mesh_nodes(mesh->getNodes());
     GeoLib::PolylineVec const* ply_vec(
@@ -134,9 +135,9 @@ int main (int argc, char* argv[])
         GeoLib::Polygon const& polygon(*(plys[j]));
         // ids of mesh nodes on surface that are within the given polygon
         std::vector<std::pair<std::size_t, double>> ids_and_areas;
-        for (std::size_t k(0); k<all_sfc_pnts.size(); k++) {
-            GeoLib::Point const& pnt(*(all_sfc_pnts[k]));
-            if (polygon.isPntInPolygon(pnt)) {
+        for (std::size_t k(0); k<all_sfc_nodes.size(); k++) {
+            MeshLib::Node const& pnt(*(all_sfc_nodes[k]));
+            if (polygon.isPntInPolygon(pnt[0], pnt[1], pnt[2])) {
                 ids_and_areas.push_back(std::make_pair(pnt.getID(), areas[k]));
             }
         }
@@ -161,7 +162,8 @@ int main (int argc, char* argv[])
         writeToFile(id_and_area_fname, csv_fname, ids_and_areas, mesh_nodes);
     }
 
-    std::for_each(all_sfc_pnts.begin(), all_sfc_pnts.end(), std::default_delete<GeoLib::Point>());
+    std::for_each(all_sfc_nodes.begin(), all_sfc_nodes.end(),
+                  std::default_delete<MeshLib::Node>());
 
     return 0;
 }
diff --git a/MeshLib/MeshSurfaceExtraction.cpp b/MeshLib/MeshSurfaceExtraction.cpp
index 57a8f6373ebac78a8bdd89b7d62f0d24f41bf168..4f87902f17f0ad0d372d6bed90bfa52225b97d8a 100644
--- a/MeshLib/MeshSurfaceExtraction.cpp
+++ b/MeshLib/MeshSurfaceExtraction.cpp
@@ -18,8 +18,6 @@
 
 #include "logog/include/logog.hpp"
 
-#include "GeoLib/Point.h"
-
 #include "MeshLib/Mesh.h"
 #include "MeshLib/Elements/Line.h"
 #include "MeshLib/Elements/Tri.h"
@@ -223,51 +221,48 @@ void MeshSurfaceExtraction::get2DSurfaceElements(const std::vector<MeshLib::Elem
     }
 }
 
-void MeshSurfaceExtraction::get2DSurfaceNodes(std::vector<MeshLib::Node*> &sfc_nodes, std::size_t n_all_nodes, const std::vector<MeshLib::Element*> &sfc_elements, std::vector<std::size_t> &node_id_map)
+void MeshSurfaceExtraction::get2DSurfaceNodes(
+    std::vector<MeshLib::Node*>& sfc_nodes, std::size_t n_all_nodes,
+    const std::vector<MeshLib::Element*>& sfc_elements,
+    std::vector<std::size_t>& node_id_map)
 {
-    const std::size_t nNewElements (sfc_elements.size());
     std::vector<const MeshLib::Node*> tmp_nodes(n_all_nodes, nullptr);
-    for (std::size_t i=0; i<nNewElements; ++i)
+    for (auto const* elem : sfc_elements)
     {
-        const MeshLib::Element* elem (sfc_elements[i]);
-        for (unsigned j=0; j<elem->getNumberOfBaseNodes(); ++j)
+        for (unsigned j = 0; j < elem->getNumberOfBaseNodes(); ++j)
         {
-            const MeshLib::Node* node (elem->getNode(j));
+            const MeshLib::Node* node(elem->getNode(j));
             tmp_nodes[node->getID()] = node;
         }
     }
-    const std::size_t nNodes (tmp_nodes.size());
-    for (unsigned i=0; i<nNodes; ++i)
+    const std::size_t nNodes(tmp_nodes.size());
+    for (unsigned i = 0; i < nNodes; ++i)
     {
         if (tmp_nodes[i])
         {
             node_id_map[i] = sfc_nodes.size();
-            sfc_nodes.push_back(new MeshLib::Node(tmp_nodes[i]->getCoords(), tmp_nodes[i]->getID()));
+            sfc_nodes.push_back(new MeshLib::Node(*tmp_nodes[i]));
         }
     }
 }
 
-std::vector<GeoLib::Point*> MeshSurfaceExtraction::getSurfaceNodes(const MeshLib::Mesh &mesh, const MathLib::Vector3 &dir, double angle)
+std::vector<MeshLib::Node*> MeshSurfaceExtraction::getSurfaceNodes(
+    const MeshLib::Mesh& mesh, const MathLib::Vector3& dir, double angle)
 {
     INFO ("Extracting surface nodes...");
     std::vector<MeshLib::Element*> sfc_elements;
-    get2DSurfaceElements(mesh.getElements(), sfc_elements, dir, angle, mesh.getDimension());
+    get2DSurfaceElements(mesh.getElements(), sfc_elements, dir, angle,
+                         mesh.getDimension());
 
     std::vector<MeshLib::Node*> sfc_nodes;
     std::vector<std::size_t> node_id_map(mesh.getNumberOfNodes());
-    get2DSurfaceNodes(sfc_nodes, mesh.getNumberOfNodes(), sfc_elements, node_id_map);
+    get2DSurfaceNodes(sfc_nodes, mesh.getNumberOfNodes(), sfc_elements,
+                      node_id_map);
 
     for (auto e : sfc_elements)
         delete e;
 
-    const std::size_t nNodes (sfc_nodes.size());
-    std::vector<GeoLib::Point*> surface_pnts(nNodes);
-    for (std::size_t i=0; i<nNodes; ++i)
-    {
-        surface_pnts[i] = new GeoLib::Point(*(sfc_nodes[i]), sfc_nodes[i]->getID());
-        delete sfc_nodes[i];
-    }
-    return surface_pnts;
+    return sfc_nodes;
 }
 
 } // end namespace MeshLib
diff --git a/MeshLib/MeshSurfaceExtraction.h b/MeshLib/MeshSurfaceExtraction.h
index 3a213a6810c068b2fd6ee8937e57401b9b7031f0..d22ec59145b60a21328da14f93bbe2df5e24cf1a 100644
--- a/MeshLib/MeshSurfaceExtraction.h
+++ b/MeshLib/MeshSurfaceExtraction.h
@@ -20,10 +20,6 @@
 
 #include "MathLib/Vector3.h"
 
-namespace GeoLib {
-    class Point;
-}
-
 namespace MeshLib {
 // forward declarations
 class Mesh;
@@ -40,7 +36,8 @@ public:
     static std::vector<double> getSurfaceAreaForNodes(const MeshLib::Mesh &mesh);
 
     /// Returns the surface nodes of a mesh.
-    static std::vector<GeoLib::Point*> getSurfaceNodes(const MeshLib::Mesh &mesh, const MathLib::Vector3 &dir, double angle);
+    static std::vector<MeshLib::Node*> getSurfaceNodes(
+        const MeshLib::Mesh& mesh, const MathLib::Vector3& dir, double angle);
 
     /**
      * Returns the 2d-element mesh representing the surface of the given mesh.
@@ -72,10 +69,19 @@ public:
 
 private:
     /// Functionality needed for getSurfaceNodes() and getMeshSurface()
-    static void get2DSurfaceElements(const std::vector<MeshLib::Element*> &all_elements, std::vector<MeshLib::Element*> &sfc_elements, const MathLib::Vector3 &dir, double angle, unsigned mesh_dimension);
+    static void get2DSurfaceElements(
+        const std::vector<MeshLib::Element*>& all_elements,
+        std::vector<MeshLib::Element*>& sfc_elements,
+        const MathLib::Vector3& dir,
+        double angle,
+        unsigned mesh_dimension);
 
     /// Functionality needed for getSurfaceNodes() and getMeshSurface()
-    static void get2DSurfaceNodes(std::vector<MeshLib::Node*> &sfc_nodes, std::size_t n_all_nodes, const std::vector<MeshLib::Element*> &sfc_elements, std::vector<std::size_t> &node_id_map);
+    static void get2DSurfaceNodes(
+        std::vector<MeshLib::Node*>& sfc_nodes,
+        std::size_t n_all_nodes,
+        const std::vector<MeshLib::Element*>& sfc_elements,
+        std::vector<std::size_t>& node_id_map);
 };
 
 } // end namespace MeshLib