diff --git a/GeoLib/Surface.cpp b/GeoLib/Surface.cpp
index dba6e27e8b9c343e4907a97b0cf2764cf1a1a011..2c6f3d8fb0194d9c648f8bf2fb8a295045f00b8b 100644
--- a/GeoLib/Surface.cpp
+++ b/GeoLib/Surface.cpp
@@ -35,6 +35,18 @@ Surface::Surface(const std::vector<Point*>& pnt_vec)
 {
 }
 
+Surface::Surface(Surface const& src)
+    : _sfc_pnts(src._sfc_pnts),
+      _bounding_volume(new AABB(*(src._bounding_volume))),
+      _surface_grid(nullptr)
+{
+    _sfc_triangles.reserve(src._sfc_triangles.size());
+    std::transform(src._sfc_triangles.cbegin(),
+                   src._sfc_triangles.cend(),
+                   std::back_inserter(_sfc_triangles),
+                   [](Triangle* t) { return new Triangle(*t); });
+}
+
 Surface::~Surface()
 {
     for (std::size_t k(0); k < _sfc_triangles.size(); k++)
diff --git a/GeoLib/Surface.h b/GeoLib/Surface.h
index ac6460ac782f55f5bc38284609529743a9575e07..494b9574ee9e86c8657c267b2583192094fa7c92 100644
--- a/GeoLib/Surface.h
+++ b/GeoLib/Surface.h
@@ -36,6 +36,7 @@ class Surface final : public GeoObject
 {
 public:
     explicit Surface(const std::vector<Point*>& pnt_vec);
+    Surface(Surface const& src);
     ~Surface();
 
     /// return a geometry type