diff --git a/FileIO/GmshIO/GMSHPolygonTree.cpp b/FileIO/GmshIO/GMSHPolygonTree.cpp
index 8690ce94c3d3137ba206818a7976fda37c0326bf..f6d9143f24ff8c28104d032a9015e53664e901d3 100644
--- a/FileIO/GmshIO/GMSHPolygonTree.cpp
+++ b/FileIO/GmshIO/GMSHPolygonTree.cpp
@@ -103,34 +103,33 @@ void GMSHPolygonTree::insertPolyline(GeoLib::PolylineWithSegmentMarker * ply)
     // calculate possible intersection points between the node polygon
     // (_node_polygon) and the given polyline ply
     // pay attention: loop bound is not fix!
-    std::size_t n_segments(ply->getNumberOfSegments());
     GeoLib::Point tmp_pnt;
     GeoLib::PointVec & pnt_vec(*(_geo_objs.getPointVecObj(_geo_name)));
-    for (std::size_t k(0); k<n_segments; k++) {
-        if (ply->isSegmentMarked(k))
+    for (auto segment_it(ply->begin()); segment_it != ply->end();
+         ++segment_it)
+    {
+        if (ply->isSegmentMarked(segment_it.getSegmentNumber()))
             continue;
 
-        if (_node_polygon->containsSegment(*(ply->getPoint(k)),
-                                           *(ply->getPoint(k + 1)))) {
-            ply->markSegment(k, true);
+        if (_node_polygon->containsSegment(*segment_it)) {
+            ply->markSegment(segment_it.getSegmentNumber(), true);
             continue;
         }
 
         std::size_t seg_num(0);
-        GeoLib::Point *intersection_pnt(new GeoLib::Point);
+        GeoLib::Point intersection_pnt;
         while (_node_polygon->getNextIntersectionPointPolygonLine(
-            *(ply->getPoint(k)), *(ply->getPoint(k + 1)), intersection_pnt,
-            seg_num))
+            *segment_it, intersection_pnt, seg_num))
         {
             // insert the intersection point to point vector of GEOObjects instance
             const std::size_t pnt_vec_size(pnt_vec.size());
-            std::size_t pnt_id(pnt_vec.push_back(intersection_pnt));
+            std::size_t pnt_id(
+                pnt_vec.push_back(new GeoLib::Point(intersection_pnt)));
             if (pnt_vec_size < pnt_vec.size()) { // case: new point
                 // modify the polygon
                 _node_polygon->insertPoint(seg_num+1, pnt_id);
                 // modify the polyline
-                ply->insertPoint(k+1, pnt_id);
-                n_segments++;
+                ply->insertPoint(segment_it.getSegmentNumber(), pnt_id);
             } else { // case: existing point
                 // check if point id is within the polygon
                 if (! _node_polygon->isPointIDInPolyline(pnt_id)) {
@@ -139,44 +138,45 @@ void GMSHPolygonTree::insertPolyline(GeoLib::PolylineWithSegmentMarker * ply)
 
                 // check if point id is in polyline
                 if (! ply->isPointIDInPolyline(pnt_id)) {
-                    ply->insertPoint(k+1, pnt_id);
-                    n_segments++;
+                    ply->insertPoint(segment_it.getSegmentNumber()+1, pnt_id);
                 }
             }
 
             std::size_t tmp_seg_num(seg_num+1);
             if (!_node_polygon->getNextIntersectionPointPolygonLine(
-                    *(ply->getPoint(k)), *(ply->getPoint(k + 1)), &tmp_pnt,
-                    tmp_seg_num))
+                    *segment_it, tmp_pnt, tmp_seg_num))
             {
                 // check a point of the segment except the end points
                 for (std::size_t i(0); i<3; i++) {
-                    tmp_pnt[i] = ((*(ply->getPoint(k)))[i] + (*(ply->getPoint(k+1)))[i]) / 2;
+                    tmp_pnt[i] = ((*segment_it).getBeginPoint()[i] +
+                                  (*segment_it).getEndPoint()[i]) /
+                                 2;
                 }
                 if (_node_polygon->isPntInPolygon(tmp_pnt)) {
-                    ply->markSegment(k, true);
+                    ply->markSegment(segment_it.getSegmentNumber(), true);
                     // insert line segment as constraint
-                    _gmsh_lines_for_constraints.push_back(new GMSHLine(ply->getPointID(k), ply->getPointID(k+1)));
+                    _gmsh_lines_for_constraints.push_back(
+                        new GMSHLine((*segment_it).getBeginPoint().getID(),
+                                     (*segment_it).getEndPoint().getID()));
                 }
             }
-            intersection_pnt = new GeoLib::Point;
             seg_num++;
 
             // check a point of the segment except the end points
             for (std::size_t i(0); i<3; i++) {
-                tmp_pnt[i] =
-                    ((*(ply->getPoint(k)))[i] + (*(ply->getPoint(k + 1)))[i]) /
-                    2;
+                tmp_pnt[i] = ((*segment_it).getBeginPoint()[i] +
+                              (*segment_it).getEndPoint()[i]) /
+                             2;
             }
 
-            checkIntersectionsSegmentExistingPolylines(ply, k);
-            n_segments = ply->getNumberOfSegments(); // update
+            checkIntersectionsSegmentExistingPolylines(ply, segment_it);
 
             if (_node_polygon->isPntInPolygon(tmp_pnt)) {
-                ply->markSegment(k, true);
+                ply->markSegment(segment_it.getSegmentNumber(), true);
                 // insert line segment as constraint
                 _gmsh_lines_for_constraints.push_back(
-                    new GMSHLine(ply->getPointID(k), ply->getPointID(k + 1)));
+                    new GMSHLine((*segment_it).getBeginPoint().getID(),
+                                 (*segment_it).getEndPoint().getID()));
             }
         }
     }
@@ -185,31 +185,29 @@ void GMSHPolygonTree::insertPolyline(GeoLib::PolylineWithSegmentMarker * ply)
 }
 
 void GMSHPolygonTree::checkIntersectionsSegmentExistingPolylines(
-        GeoLib::PolylineWithSegmentMarker * ply,
-        std::size_t & ply_segment_number)
+    GeoLib::PolylineWithSegmentMarker* ply,
+    GeoLib::Polyline::SegmentIterator const& seg_it)
 {
-    GeoLib::Point const& a(*(ply->getPoint(ply_segment_number)));
-    GeoLib::Point const& b(*(ply->getPoint(ply_segment_number+1)));
-
+    std::size_t const ply_segment_number(seg_it.getSegmentNumber());
     for(GeoLib::PolylineWithSegmentMarker *const p : _plys) {
         std::size_t n_segments(p->getNumberOfSegments());
         GeoLib::PointVec & pnt_vec(*(_geo_objs.getPointVecObj(_geo_name)));
-        for (std::size_t k(0); k<n_segments; k++) {
+        for (auto seg_it_p(p->begin()); seg_it_p != p->end(); ++seg_it_p) {
             GeoLib::Point s; // intersection point
-            if (GeoLib::lineSegmentIntersect(a, b, *(p->getPoint(k)),
-                                             *(p->getPoint(k+1)), s))
+            if (GeoLib::lineSegmentIntersect(*seg_it, *seg_it_p, s))
             {
                 const std::size_t pnt_vec_size(pnt_vec.size());
                 // point id of new point in GEOObjects instance
                 const std::size_t pnt_id(pnt_vec.push_back(new GeoLib::Point(s)));
                 if (pnt_vec_size < pnt_vec.size()) { // case: new point
                     // modify polyline already in this node
-                    p->insertPoint(k+1, pnt_id);
+                    p->insertPoint(seg_it_p.getSegmentNumber()+1, pnt_id);
                     n_segments++;
                     // modify polyline
                     ply->insertPoint(ply_segment_number+1, pnt_id);
                 } else { // case: point exists already in geometry
                     // check if point is not alread in polyline p
+                    std::size_t const k(seg_it_p.getSegmentNumber());
                     if (p->getPointID(k) != pnt_id && p->getPointID(k+1) != pnt_id) {
                         p->insertPoint(k+1, pnt_id);
                         n_segments++;
diff --git a/FileIO/GmshIO/GMSHPolygonTree.h b/FileIO/GmshIO/GMSHPolygonTree.h
index 59003ebf999c5173bbda03f887218d8b0474795a..b234fbb64e51dfe3a1d62898d49d189efb39a6de 100644
--- a/FileIO/GmshIO/GMSHPolygonTree.h
+++ b/FileIO/GmshIO/GMSHPolygonTree.h
@@ -90,8 +90,9 @@ public:
 private:
     void getPointsFromSubPolygons(std::vector<GeoLib::Point const*>& pnts);
     void getStationsInsideSubPolygons(std::vector<GeoLib::Point const*>& stations);
-    void checkIntersectionsSegmentExistingPolylines(GeoLib::PolylineWithSegmentMarker * ply,
-            std::size_t & ply_segment_number);
+    void checkIntersectionsSegmentExistingPolylines(
+        GeoLib::PolylineWithSegmentMarker* ply,
+        GeoLib::Polyline::SegmentIterator const& segment_iterator);
 
     GeoLib::GEOObjects & _geo_objs;
     std::string const& _geo_name;