Standard_Integer nbs, NbSamples = 0;
   if (theLength <= 2)
     NbSamples = 4;
+  gp_Pln FirstPlane;
+  PlaneOfWire(TopoDS::Wire(myWork(ideb)), FirstPlane);
+  gp_Pnt FirstBary = FirstPlane.Location();
+  gp_Vec NormalOfFirstPlane = FirstPlane.Axis().Direction();
   for (i = ideb+1; i <= ifin; i++)
     {
       const TopoDS_Wire& wire = TopoDS::Wire(myWork(i));
+
+      //Compute offset vector as current bary center projected on first plane
+      //to first bary center
+      gp_Pln CurPlane;
+      PlaneOfWire(wire, CurPlane);
+      gp_Pnt CurBary = CurPlane.Location();
+      gp_Vec aVec(FirstBary, CurBary);
+      gp_Vec anOffsetProj = (aVec * NormalOfFirstPlane) * NormalOfFirstPlane;
+      CurBary.Translate(-anOffsetProj); //projected current bary center
+      gp_Vec Offset(CurBary, FirstBary);
+      
       TopoDS_Wire newwire;
       BRep_Builder BB;
       BB.MakeWire(newwire);
       else
        for (j = 1; j <= theLength; j++)
          {
-            // get a vector to superpose SeqVertices(j) on PrevSeq(1)
-            const TopoDS_Vertex& Vprev = TopoDS::Vertex( PrevSeq(1) );
-            const TopoDS_Vertex& V = TopoDS::Vertex( SeqVertices(j) );
-            gp_Vec curToPrevVec( BRep_Tool::Pnt(V), BRep_Tool::Pnt(Vprev) );
-
            //Forward
            Standard_Real SumDist = 0.;
            for (k = j, n = 1; k <= theLength; k++, n++)
                const TopoDS_Vertex& Vprev = TopoDS::Vertex( PrevSeq(n) );
                gp_Pnt Pprev = BRep_Tool::Pnt(Vprev);
                const TopoDS_Vertex& V = TopoDS::Vertex( SeqVertices(k) );
-               gp_Pnt P = BRep_Tool::Pnt(V).XYZ() + curToPrevVec.XYZ();
+               gp_Pnt P = BRep_Tool::Pnt(V).XYZ() + Offset.XYZ();
                SumDist += Pprev.Distance(P);
                 if (NbSamples > 0)
                 {
                       (Ecurve.FirstParameter() + nbs*SampleOnCur) :
                       (Ecurve.FirstParameter() + (NbSamples-nbs)*SampleOnCur);
                     gp_Pnt PonPrev = PrevEcurve.Value(ParOnPrev);
-                    gp_Pnt PonCur = Ecurve.Value(ParOnCur).XYZ() + curToPrevVec.XYZ();
+                    gp_Pnt PonCur = Ecurve.Value(ParOnCur).XYZ() + Offset.XYZ();
                     SumDist += PonPrev.Distance(PonCur);
                   }
                 }
                const TopoDS_Vertex& Vprev = TopoDS::Vertex( PrevSeq(n) );
                gp_Pnt Pprev = BRep_Tool::Pnt(Vprev);
                const TopoDS_Vertex& V = TopoDS::Vertex( SeqVertices(k) );
-               gp_Pnt P = BRep_Tool::Pnt(V).XYZ() + curToPrevVec.XYZ();
+               gp_Pnt P = BRep_Tool::Pnt(V).XYZ() + Offset.XYZ();
                SumDist += Pprev.Distance(P);
                 if (NbSamples > 0)
                 {
                       (Ecurve.FirstParameter() + nbs*SampleOnCur) :
                       (Ecurve.FirstParameter() + (NbSamples-nbs)*SampleOnCur);
                     gp_Pnt PonPrev = PrevEcurve.Value(ParOnPrev);
-                    gp_Pnt PonCur = Ecurve.Value(ParOnCur).XYZ() + curToPrevVec.XYZ();
+                    gp_Pnt PonCur = Ecurve.Value(ParOnCur).XYZ() + Offset.XYZ();
                     SumDist += PonPrev.Distance(PonCur);
                   }
                 }
                const TopoDS_Vertex& Vprev = TopoDS::Vertex( PrevSeq(n) );
                gp_Pnt Pprev = BRep_Tool::Pnt(Vprev);
                const TopoDS_Vertex& V = TopoDS::Vertex( SeqVertices(k) );
-               gp_Pnt P = BRep_Tool::Pnt(V).XYZ() + curToPrevVec.XYZ();
+               gp_Pnt P = BRep_Tool::Pnt(V).XYZ() + Offset.XYZ();
                SumDist += Pprev.Distance(P);
                 if (NbSamples > 0)
                 {
                       (Ecurve.FirstParameter() + (NbSamples-nbs)*SampleOnCur) :
                       (Ecurve.FirstParameter() + nbs*SampleOnCur);
                     gp_Pnt PonPrev = PrevEcurve.Value(ParOnPrev);
-                    gp_Pnt PonCur = Ecurve.Value(ParOnCur).XYZ() + curToPrevVec.XYZ();
+                    gp_Pnt PonCur = Ecurve.Value(ParOnCur).XYZ() + Offset.XYZ();
                     SumDist += PonPrev.Distance(PonCur);
                   }
                 }
                const TopoDS_Vertex& Vprev = TopoDS::Vertex( PrevSeq(n) );
                gp_Pnt Pprev = BRep_Tool::Pnt(Vprev);
                const TopoDS_Vertex& V = TopoDS::Vertex( SeqVertices(k) );
-               gp_Pnt P = BRep_Tool::Pnt(V).XYZ() + curToPrevVec.XYZ();
+               gp_Pnt P = BRep_Tool::Pnt(V).XYZ() + Offset.XYZ();
                SumDist += Pprev.Distance(P);
                 if (NbSamples > 0)
                 {
                       (Ecurve.FirstParameter() + (NbSamples-nbs)*SampleOnCur) :
                       (Ecurve.FirstParameter() + nbs*SampleOnCur);
                     gp_Pnt PonPrev = PrevEcurve.Value(ParOnPrev);
-                    gp_Pnt PonCur = Ecurve.Value(ParOnCur).XYZ() + curToPrevVec.XYZ();
+                    gp_Pnt PonCur = Ecurve.Value(ParOnCur).XYZ() + Offset.XYZ();
                     SumDist += PonPrev.Distance(PonCur);
                   }
                 }