diff --git a/Geo/GeoInterpolation.cpp b/Geo/GeoInterpolation.cpp
index 06ff057b61b4f46117c6c6ab19773fea921fe893..ddff735cdbe2d6973725a9232ab8d607b28b65b8 100644
--- a/Geo/GeoInterpolation.cpp
+++ b/Geo/GeoInterpolation.cpp
@@ -1,4 +1,4 @@
-// $Id: GeoInterpolation.cpp,v 1.37 2008-06-10 12:59:12 remacle Exp $
+// $Id: GeoInterpolation.cpp,v 1.38 2008-06-22 06:13:48 geuzaine Exp $
 //
 // Copyright (C) 1997-2008 C. Geuzaine, J.-F. Remacle
 //
@@ -660,11 +660,14 @@ Vertex InterpolateSurface(Surface *s, double u, double v, int derivee, int u_v)
     return T;
   }
 
-  // use the exact extrusion formula if the surface is extruded
+  // FIXME: WARNING -- this is a major hack: we use the exact
+  // extrusion formula if the surface is extruded, so that we create
+  // exact surfaces of revolution. But this WILL fail if the extruded
+  // surface is transformed after the extrusion!
   if(s->Extrude && s->Extrude->geo.Mode == EXTRUDED_ENTITY && 
      s->Typ != MSH_SURF_PLAN)
     return InterpolateExtrudedSurface(s, u, v);
-  
+
   switch (s->Typ) {
   case MSH_SURF_REGL:
   case MSH_SURF_TRIC: 
diff --git a/Makefile b/Makefile
index 5c3d71d6a44339fa4f34b21bcc665909f31764ee..7e0f07a753fabc4bd2cafdb9a25e89b17fa708f2 100644
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,4 @@
-# $Id: Makefile,v 1.487 2008-06-20 05:54:08 geuzaine Exp $
+# $Id: Makefile,v 1.488 2008-06-22 06:15:09 geuzaine Exp $
 #
 # Copyright (C) 1997-2008 C. Geuzaine, J.-F. Remacle
 #
@@ -23,7 +23,7 @@ include variables
 
 GMSH_MAJOR_VERSION = 2
 GMSH_MINOR_VERSION = 2
-GMSH_PATCH_VERSION = 2
+GMSH_PATCH_VERSION = 3
 GMSH_EXTRA_VERSION =
 
 GMSH_VERSION = ${GMSH_MAJOR_VERSION}.${GMSH_MINOR_VERSION}.${GMSH_PATCH_VERSION}${GMSH_EXTRA_VERSION}
diff --git a/benchmarks/2d/HEA100.geo b/benchmarks/2d/HEA100.geo
deleted file mode 100644
index d605efd4486c68e80df27f4cb7393df2d32f17c1..0000000000000000000000000000000000000000
--- a/benchmarks/2d/HEA100.geo
+++ /dev/null
@@ -1,6 +0,0 @@
-h = 96;
-c = 100/2;
-d = 5;
-t = 8;
-r = 12;
-Include "IPE.geo";
diff --git a/benchmarks/2d/IPE.geo b/benchmarks/2d/IPE.geo
index 0c4f85bc5d0f8e460a7370b3bd19707db0794191..caa1d5f86218eaaf26ad0ad2686ddac2f2028b18 100644
--- a/benchmarks/2d/IPE.geo
+++ b/benchmarks/2d/IPE.geo
@@ -1,48 +1,66 @@
-LC   = t/2;
-LC2  = r/4;
-
-Point(1) = {-c,-h/2,0,LC};
-Point(2) = {-c,-h/2+t,0,LC};
-Point(3) = {-t/2-r,-h/2+t,0,LC2};
-Point(4) = {-t/2,-h/2+t+r,0,LC2};
-Point(5) = {-t/2-r,-h/2+t+r,0,LC2};
-
-Point(11) = {-c,h/2,0,LC};
-Point(12) = {-c,h/2-t,0,LC};
-Point(13) = {-t/2-r,h/2-t,0,LC2};
-Point(14) = {-t/2,h/2-t-r,0,LC2};
-Point(15) = {-t/2-r,h/2-t-r,0,LC2};
-
-Point(21) = {c,-h/2,0,LC};
-Point(22) = {c,-h/2+t,0,LC};
-Point(23) = {t/2+r,-h/2+t,0,LC2};
-Point(24) = {t/2,-h/2+t+r,0,LC2};
-Point(25) = {t/2+r,-h/2+t+r,0,LC2};
-
-Point(31) = {c,h/2,0,LC};
-Point(32) = {c,h/2-t,0,LC};
-Point(33) = {t/2+r,h/2-t,0,LC2};
-Point(34) = {t/2,h/2-t-r,0,LC2};
-Point(35) = {t/2+r,h/2-t-r,0,LC2};
-
-
-Line(1) = {1,21};
-Line(2) = {21,22};
-Line(3) = {22,23};
-Line(4) = {1,2};
-Line(5) = {2,3};
-Line(6) = {4,14};
-Line(7) = {34,24};
-Line(8) = {11,31};
-Line(9) = {31,32};
-Line(10) = {32,33};
-Line(11) = {11,12};
-Line(12) = {12,13};
-Circle(13) = {13,15,14};
-Circle(14) = {33,35,34};
-Circle(15) = {3,5,4};
-Circle(16) = {23,25,24};
-Line Loop(17) = {-7,-14,-10,-9,-8,11,12,13,-6,-15,-5,-4,1,2,3,16};
-Plane Surface(18) = {17};
-Physical Line(19) = {8,9,10,14,7,16,3,2,1,4,5,15,6,13,12,11};
-Physical Surface(20) = {18};
+Function IPE
+
+// create vertices
+p1 = newp; Point(p1) = {0, h, 0, lc};
+p2 = newp; Point(p2) = {b, h, 0, lc};
+p3 = newp; Point(p3) = {b, h-e, 0, lc};
+p4 = newp; Point(p4) = {(0.5*b)+(0.5*a)+r, h-e, 0, lc};
+p5 = newp; Point(p5) = {(0.5*b)+(0.5*a)+r, h-e-r, 0, lc};
+p6 = newp; Point(p6) = {(0.5*b)+(0.5*a), h-e-r, 0, lc};
+p7 = newp; Point(p7) = {(0.5*b)+(0.5*a), e+r, 0, lc};
+p8 = newp; Point(p8) = {(0.5*b)+(0.5*a)+r, e+r, 0, lc};
+p9 = newp; Point(p9) = {(0.5*b)+(0.5*a)+r, e, 0, lc};
+p10 = newp; Point(p10) = {b, e, 0, lc};
+p11 = newp; Point(p11) = {b, 0, 0, lc};
+p12 = newp; Point(p12) = {0, 0, 0, lc};
+p13 = newp; Point(p13) = {0, e, 0, lc};
+p14 = newp; Point(p14) = {(0.5*b)-(0.5*a)-r, e, 0, lc};
+p15 = newp; Point(p15) = {(0.5*b)-(0.5*a)-r, e+r, 0, lc};
+p16 = newp; Point(p16) = {(0.5*b)-(0.5*a), e+r, 0, lc};
+p17 = newp; Point(p17) = {(0.5*b)-(0.5*a), h-e-r, 0, lc};
+p18 = newp; Point(p18) = {(0.5*b)-(0.5*a)-r, h-e-r, 0, lc};
+p19 = newp; Point(p19) = {(0.5*b)-(0.5*a)-r, h-e, 0, lc};
+p20 = newp; Point(p20) = {0, h-e, 0, lc};
+
+// create a line from two points;
+ligne1 = newl; Line(ligne1) = {p1, p2};
+ligne2 = newl; Line(ligne2) = {p2, p3};
+ligne3 = newl; Line(ligne3) = {p3, p4};
+ligne4 = newl; Line(ligne4) = {p6, p7};
+ligne5 = newl; Line(ligne5) = {p9, p10};
+ligne6 = newl; Line(ligne6) = {p10, p11};
+ligne7 = newl; Line(ligne7) = {p11, p12};
+ligne8 = newl; Line(ligne8) = {p12, p13};
+ligne9 = newl; Line(ligne9) = {p13, p14};
+ligne10 = newl; Line(ligne10) = {p16, p17};
+ligne11 = newl; Line(ligne11) = {p19, p20};
+ligne12 = newl; Line(ligne12) = {p20, p1};
+
+// create a curve 
+Arc1 = newl; Circle(Arc1) = {p4, p5 , p6};
+Arc2 = newl; Circle(Arc2) = {p7, p8 , p9};
+Arc3 = newl; Circle(Arc3) = {p14, p15 , p16};
+Arc4 = newl; Circle(Arc4) = {p17, p18 , p19};
+
+// create a wire
+wire = newll; Line Loop(wire) = {ligne1, ligne2, ligne3, Arc1, ligne4, Arc2, ligne5, ligne6, ligne7, ligne8, ligne9, Arc3, ligne10, Arc4, ligne11, ligne12};
+
+// create a face
+face = news; Plane Surface(face) = {wire};
+Return
+
+
+lc = 10;
+
+b = 200.;
+e = 16.;
+h = 500.;
+a = 10.2;
+r = 21.;
+Call IPE;
+
+e = 40;
+r = 61.;
+a = 40.2;
+Call IPE;
+Translate{300,0,0}{Surface{face};}
diff --git a/benchmarks/2d/predator.geo b/benchmarks/2d/predator.geo
new file mode 100644
index 0000000000000000000000000000000000000000..6be8c35c9c2923da9ccee7c9ce4bb0f6b2a92970
--- /dev/null
+++ b/benchmarks/2d/predator.geo
@@ -0,0 +1,1263 @@
+// Parameters definitions of a .geo model
+// for the "Predator" airplane.
+// Does not run with Vista and GMSH 2.1.1 compiled version
+// (2D meshing fails)
+// Does run with Vista and GMSH 1.65 compiled version
+
+
+lc1 = 0.08;
+
+lc2 = 0.08;
+
+
+
+Point(1) = {0, 0, 0, lc1};
+
+Point(2) = {0, 8.15, 0.275, lc1};
+
+Point(3) = {0.4, 3.5, 0, lc2};
+
+Point(4) = {-0.4, 3.5, 0, lc1};
+
+Point(5) = {-0.4, 4.75, 0, lc1};
+
+Point(6) = {0.4, 4.75, 0, lc2};
+
+Point(7) = {7.4, 4.45, 0, lc2};
+
+Point(8) = {-7.4, 4.45, 0, lc1};
+
+Point(9) = {-7.4, 3.9, 0, lc1};
+
+Point(10) = {7.4, 3.9, 0, lc2};
+
+Point(15) = {0.5, 0.35, 0, lc1};
+
+Point(16) = {-0.5, 0.35, 0, lc1};
+
+Point(17) = {-0.6, 0.95, 0, lc1};
+
+Point(18) = {0.6, 0.95, 0, lc1};
+
+Point(19) = {0.5, 2, 0, lc1};
+
+Point(20) = {-0.5, 2, 0, lc1};
+
+Point(21) = {-0.3, 6.9, 0, lc1};
+
+Point(22) = {0.3, 6.9, 0, lc1};
+
+Point(23) = {0.15, 7.6, 0, lc1};
+
+Point(24) = {-0.15, 7.6, 0, lc1};
+
+Point(25) = {0, 7.9, 0.08, lc1};
+
+Point(26) = {0, 7.9, 0.47, lc1};
+
+Point(27) = {0.1, 8.1, 0.275, lc1};
+
+Point(28) = {-0.1, 8.1, 0.275, lc1};
+
+Point(29) = {2, 6.9, -1.2, lc1};
+
+Point(30) = {-2, 6.9, -1.2, lc1};
+
+Point(31) = {-2, 7.6, -1.2, lc1};
+
+Point(32) = {2, 7.6, -1.2, lc1};
+
+Point(33) = {0, 0.8, 0.68, lc1};
+
+Point(66) = {0, 1.1, 0.75, lc1};
+
+Point(68) = {0, 3.25, 0.55, lc1};
+
+Point(70) = {0, 4.4, 0.55, lc1};
+
+Point(72) = {0.37, 3.5, 0.1, lc2};
+
+Point(73) = {-0.37, 3.5, 0.1, lc1};
+
+Point(74) = {-0.37, 4.75, 0.1, lc1};
+
+Point(75) = {0.37, 4.75, 0.1, lc2};
+
+Point(78) = {7.4, 4.45, 0.05, lc2};
+
+Point(79) = {-7.4, 4.45, 0.05, lc1};
+
+Point(115) = {-7.4, 3.9, 0.05, lc1};
+
+Point(116) = {7.4, 3.9, 0.05, lc2};
+
+Point(117) = {0, 3.65, 0.68, lc1};
+
+Point(178) = {2, 6.9, -1.15, lc1};
+
+Point(179) = {-2, 6.9, -1.15, lc1};
+
+Point(180) = {-2, 7.6, -1.15, lc1};
+
+Point(181) = {2, 7.6, -1.15, lc1};
+
+Point(182) = {0.37, 6.9, 0.1, lc1};
+
+Point(183) = {-0.37, 6.9, 0.1, lc1};
+
+Point(184) = {-0.27, 7.6, 0.1, lc1};
+
+Point(185) = {0.27, 7.6, 0.1, lc1};
+
+Point(186) = {0, 1.1, 0.75, lc1};
+
+Point(187) = {0.45, 1.1, 0.4, lc1};
+
+Point(188) = {-0.45, 1.1, 0.4, lc1};
+
+Point(189) = {-0.55, 1.1, 0.1, lc1};
+
+Point(190) = {0.55, 1.1, 0.1, lc1};
+
+Point(252) = {0, 0.35, -0.35, lc1};
+
+Point(259) = {0.3, 0.35, -0.22, lc1};
+
+Point(260) = {-0.3, 0.35, -0.22, lc1};
+
+Point(261) = {0.4, 0.35, -0.07000000000000001, lc1};
+
+Point(262) = {-0.4, 0.35, -0.07000000000000001, lc1};
+
+Point(263) = {0.45, 0.35, 0.1, lc1};
+
+Point(264) = {-0.45, 0.35, 0.1, lc1};
+
+Point(265) = {0, 3.7, -0.06, lc1};
+
+Point(266) = {0, 2, -0.22, lc1};
+
+Point(267) = {0, 6.9, -0.05, lc1};
+
+Point(269) = {0, 8.1, 0.375, lc1};
+
+Point(270) = {0, 8.1, 0.275, lc1};
+
+Point(271) = {0, 8.1, 0.175, lc1};
+
+Point(272) = {0, 7.6, 0, lc1};
+
+Point(273) = {0, 7.8, 0.5, lc1};
+
+Point(274) = {0, 7.8, 0.05, lc1};
+
+Point(275) = {0.225, 7.8, 0.275, lc1};
+
+Point(276) = {-0.225, 7.8, 0.275, lc1};
+
+Point(277) = {0, 7.8, 0.275, lc1};
+
+Point(278) = {0.6, 1.1, 0, lc1};
+
+Point(279) = {-0.6, 1.1, 0, lc1};
+
+Point(280) = {0, 1.1, -0.3, lc1};
+
+Point(281) = {0.3, 1.1, -0.17, lc1};
+
+Point(282) = {-0.3, 1.1, -0.17, lc1};
+
+Point(283) = {0.45, 1.1, -0.05, lc1};
+
+Point(284) = {-0.45, 1.1, -0.05, lc1};
+
+Point(285) = {0, 3.25, -0.1, lc1};
+
+Point(286) = {0.3, 3.25, 0.35, lc1};
+
+Point(287) = {-0.3, 3.25, 0.35, lc1};
+
+Point(288) = {-0.37, 3.25, 0.1, lc1};
+
+Point(289) = {0.37, 3.25, 0.1, lc1};
+
+Point(290) = {-0.3, 3.25, -0.025, lc1};
+
+Point(291) = {0.3, 3.25, -0.025, lc1};
+
+Point(292) = {0.2, 3.25, -0.07000000000000001, lc1};
+
+Point(293) = {-0.2, 3.25, -0.07000000000000001, lc1};
+
+Point(294) = {0.4, 3.25, 0, lc1};
+
+Point(295) = {-0.4, 3.25, 0, lc1};
+
+Point(296) = {0, 4.75, 0.55, lc1};
+
+Point(297) = {-0.3, 4.75, 0.35, lc1};
+
+Point(298) = {0.3, 4.75, 0.35, lc1};
+
+Point(299) = {0, 4.75, -0.05, lc1};
+
+Point(300) = {0.2, 3.65, 0.5, lc1};
+
+Point(301) = {-0.2, 3.65, 0.5, lc1};
+
+Point(302) = {0.3, 3.65, 0.35, lc1};
+
+Point(303) = {-0.3, 3.65, 0.35, lc1};
+
+Point(304) = {0.37, 3.65, 0.127, lc1};
+
+Point(305) = {-0.37, 3.65, 0.127, lc1};
+
+Point(306) = {0, 3.65, 0.55, lc1};
+
+Point(307) = {0, 6.9, 0.55, lc1};
+
+Point(311) = {0.27, 6.9, 0.35, lc1};
+
+Point(312) = {-0.27, 6.9, 0.35, lc1};
+
+Point(313) = {0.195, 7.9, 0.275, lc1};
+
+Point(314) = {-0.195, 7.9, 0.275, lc1};
+
+Point(315) = {0, 7.9, 0.275, lc1};
+
+Point(316) = {0, 7.6, 0.55, lc1};
+
+Point(317) = {-0.2, 7.6, 0.35, lc1};
+
+Point(318) = {0.2, 7.6, 0.35, lc1};
+
+Point(319) = {0.3, 0.35, 0.3, lc1};
+
+Point(320) = {-0.3, 0.35, 0.3, lc1};
+
+Point(321) = {0, 0.35, 0.45, lc1};
+
+Point(322) = {0, 0.1, 0.1, lc1};
+
+Point(323) = {0.3, 1.1, 0.63, lc1};
+
+Point(324) = {-0.3, 1.1, 0.63, lc1};
+
+Point(325) = {0.15, 1.1, 0.72, lc1};
+
+Point(326) = {-0.15, 1.1, 0.72, lc1};
+
+Point(327) = {0.15, 0.35, 0.4, lc1};
+
+Point(328) = {-0.15, 0.35, 0.4, lc1};
+
+Point(329) = {-0.15, 0.35, -0.32, lc1};
+
+Point(330) = {0.15, 0.35, -0.32, lc1};
+
+Point(331) = {0.2, 1.1, -0.25, lc1};
+
+Point(332) = {-0.2, 1.1, -0.25, lc1};
+
+Point(333) = {0.15, 3.25, 0.5, lc1};
+
+Point(334) = {-0.15, 3.25, 0.5, lc1};
+
+Point(335) = {-0.15, 4.75, 0.5, lc1};
+
+Point(336) = {0.15, 4.75, 0.5, lc1};
+
+Point(337) = {0.1, 3.65, 0.63, lc1};
+
+Point(338) = {-0.1, 3.65, 0.63, lc1};
+
+Point(339) = {0.15, 6.9, 0.5, lc1};
+
+Point(340) = {-0.15, 6.9, 0.5, lc1};
+
+Point(341) = {-0.12, 7.6, 0.5, lc1};
+
+Point(342) = {0.12, 7.6, 0.5, lc1};
+
+Point(343) = {0.05, 6.9, -0.05, lc1};
+
+Point(344) = {-0.05, 6.9, -0.05, lc1};
+
+Point(345) = {-0.05, 7.6, 0, lc1};
+
+Point(346) = {0.05, 7.6, 0, lc1};
+
+Point(347) = {0.025, 7.6, -0.8, lc1};
+
+Point(348) = {-0.025, 7.6, -0.8, lc1};
+
+Point(349) = {-0.025, 6.9, -0.8, lc1};
+
+Point(350) = {0.025, 6.9, -0.8, lc1};
+
+Point(351) = {-7.4, 4.1, -0.02, lc1};
+
+Point(352) = {-7.4, 4.1, 0.08, lc1};
+
+Point(353) = {-0.4, 3.8, -0.02, lc1};
+
+Point(354) = {-0.37, 3.9, 0.15, lc1};
+
+Point(355) = {7.4, 4.1, 0.08, lc2};
+
+Point(356) = {7.4, 4.1, -0.02, lc2};
+
+Point(357) = {0.37, 3.9, 0.15, lc2};
+
+Point(358) = {0.4, 3.8, -0.02, lc2};
+
+Point(359) = {0.2, 0.06, 0, lc1};
+
+Point(360) = {-0.2, 0.06, 0, lc1};
+
+Point(362) = {0.25, 0.16, 0.1, lc1};
+
+Point(363) = {-0.25, 0.16, 0.1, lc1};
+
+Point(445) = {0.0495, 7.9, 0.4636, lc1};
+
+Point(446) = {-0.0495, 7.9, 0.4636, lc1};
+
+Point(447) = {-0.0495, 7.9, 0.0864, lc1};
+
+Point(448) = {0.0495, 7.9, 0.0864, lc1};
+
+Point(449) = {0.0496, 7.9, 0.8636, lc1};
+
+Point(450) = {-0.0496, 7.9, 0.8636, lc1};
+
+Point(451) = {-0.03, 7.88, 1.0636, lc1};
+
+Point(452) = {0.03, 7.88, 1.0636, lc1};
+
+Point(453) = {0.03, 7.88, -0.5135999999999999, lc1};
+
+Point(454) = {-0.03, 7.88, -0.5135999999999999, lc1};
+
+Point(456) = {-0.0495, 7.9, -0.3136, lc1};
+
+Point(457) = {0.0495, 7.9, -0.3136, lc1};
+
+Point(458) = {0.0496, 7.8, 0.0555, lc1};
+
+Point(459) = {-0.0496, 7.8, 0.0555, lc1};
+
+Point(460) = {-0.0496, 7.8, 0.4945, lc1};
+
+Point(461) = {0.0496, 7.8, 0.4945, lc1};
+
+Point(462) = {0.03, 7.82, -0.5135999999999999, lc1};
+
+Point(463) = {-0.03, 7.82, -0.5135999999999999, lc1};
+
+Point(464) = {-0.03, 7.82, 1.0636, lc1};
+
+Point(465) = {0.03, 7.82, 1.0636, lc1};
+
+Point(466) = {0.0496, 7.8, -0.3136, lc1};
+
+Point(467) = {-0.0496, 7.8, -0.3136, lc1};
+
+Point(468) = {-0.0496, 7.8, 0.8636, lc1};
+
+Point(469) = {0.0496, 7.8, 0.8636, lc1};
+
+Point(470) = {0, 0.08, -0.14, lc1};
+
+Point(471) = {0, 0.6, -0.4, lc1};
+
+Point(472) = {0.2, 4.75, -0.04, lc1};
+
+Point(473) = {-0.2, 4.75, -0.04, lc1};
+
+Point(474) = {0.2, 6.9, -0.04, lc1};
+
+Point(475) = {-0.2, 6.9, -0.04, lc1};
+
+Point(476) = {0.3, 3.5, -0.025, lc1};
+
+Point(477) = {-0.3, 3.5, -0.025, lc1};
+
+Point(478) = {-0.2, 3.5, -0.07000000000000001, lc1};
+
+Point(479) = {0.2, 3.5, -0.07000000000000001, lc1};
+
+Point(480) = {0, 3.5, -0.07000000000000001, lc1};
+
+Point(481) = {-0.05, 5.4, -0.05, lc1};
+
+Point(482) = {0.05, 5.4, -0.05, lc1};
+
+Point(483) = {0.13, 4, 0.52, lc1};
+
+Point(484) = {-0.13, 4, 0.52, lc1};
+
+Point(485) = {-0.1, 3.4, 0.52, lc1};
+
+Point(486) = {0.1, 3.4, 0.52, lc1};
+
+Point(487) = {0, 4, 0.63, lc1};
+
+Point(488) = {0, 3.4, 0.63, lc1};
+
+Point(489) = {0, 0.2, 0.3, lc1};
+
+Point(23502) = {-0.3, 4, 0.35, lc1};
+
+Point(23503) = {0.3, 4, 0.35, lc1};
+
+Point(23504) = {0, 7.88, -0.5135999999999999, lc1};
+
+Point(23505) = {0, 7.82, -0.5135999999999999, lc1};
+
+Point(23506) = {0, 7.88, 1.0636, lc1};
+
+Point(23507) = {0, 7.82, 1.0636, lc1};
+
+Point(23508) = {0, 7.8, 0.8636, lc1};
+
+Point(23509) = {0, 7.9, 0.8636, lc1};
+
+Point(23510) = {0, 7.8, -0.3136, lc1};
+
+Point(23511) = {0, 7.9, -0.3136, lc1};
+
+Line (1) = {4, 9};
+
+Line (4) = {3, 10};
+
+Line (5) = {6, 7};
+
+Line (7) = {6, 22};
+
+Line (15) = {73, 4};
+
+Line (16) = {74, 79};
+
+Line (18) = {79, 8};
+
+Line (19) = {115, 9};
+
+Line (20) = {115, 73};
+
+Line (22) = {21, 30};
+
+Line (23) = {24, 31};
+
+Line (24) = {31, 30};
+
+Line (26) = {29, 32};
+
+Line (27) = {23, 32};
+
+Line (29) = {72, 116};
+
+Line (30) = {75, 78};
+
+Line (32) = {78, 7};
+
+Line (33) = {116, 10};
+
+Line (39) = {183, 179};
+
+Line (40) = {179, 180};
+
+Line (41) = {180, 31};
+
+Line (42) = {179, 30};
+
+Line (43) = {183, 184};
+
+Line (44) = {178, 181};
+
+Line (45) = {181, 185};
+
+Line (46) = {178, 182};
+
+Line (47) = {182, 185};
+
+Line (48) = {23, 22};
+
+Line (49) = {24, 21};
+
+Line (50) = {178, 29};
+
+Line (51) = {181, 32};
+
+Circle (62) = {269, 270, 28} Plane{0, 0, 1};
+
+Circle (63) = {28, 270, 271} Plane{0, 0, 1};
+
+Circle (64) = {271, 270, 27} Plane{0, 0, 1};
+
+Circle (65) = {27, 270, 269} Plane{0, 0, 1};
+
+Line (78) = {184, 180};
+
+Line (85) = {72, 3};
+
+Line (88) = {8, 5};
+
+CatmullRom (101) = {285, 293, 290, 295};
+
+CatmullRom (102) = {285, 292, 291, 294};
+
+Line (118) = {70, 296};
+
+Line (126) = {22, 29};
+
+CatmullRom (138) = {2, 27, 313};
+
+CatmullRom (139) = {2, 271, 25};
+
+CatmullRom (140) = {2, 269, 26};
+
+CatmullRom (141) = {2, 28, 314};
+
+Line (146) = {296, 296};
+
+Line (147) = {296, 307};
+
+Line (149) = {74, 183};
+
+Line (150) = {75, 182};
+
+Line (151) = {5, 21};
+
+CatmullRom (159) = {68, 186};
+
+CatmullRom (172) = {16, 262, 260, 329, 252};
+
+CatmullRom (174) = {278, 283, 281, 331, 280};
+
+CatmullRom (175) = {279, 284, 282, 332, 280};
+
+CatmullRom (180) = {300, 337, 117};
+
+CatmullRom (181) = {301, 338, 117};
+
+Line (188) = {346, 343};
+
+Line (189) = {345, 344};
+
+Line (190) = {344, 349};
+
+Line (191) = {343, 350};
+
+Line (192) = {345, 348};
+
+Line (193) = {346, 347};
+
+Line (194) = {348, 349};
+
+Line (195) = {350, 347};
+
+Line (196) = {350, 349};
+
+Line (197) = {347, 348};
+
+Line (198) = {307, 316};
+
+Line (200) = {273, 26};
+
+Line (201) = {25, 274};
+
+Line (202) = {313, 275};
+
+Line (203) = {314, 276};
+
+CatmullRom (204) = {79, 352, 115};
+
+CatmullRom (205) = {8, 351, 9};
+
+CatmullRom (207) = {74, 354, 305, 73};
+
+CatmullRom (208) = {116, 355, 78};
+
+CatmullRom (209) = {10, 356, 7};
+
+CatmullRom (211) = {75, 357, 304, 72};
+
+Circle (216) = {26, 315, 445} Plane{0, 0, 1};
+
+Circle (217) = {445, 315, 313} Plane{0, 0, 1};
+
+Circle (218) = {313, 315, 448} Plane{0, 0, 1};
+
+Circle (219) = {448, 315, 25} Plane{0, 0, 1};
+
+Circle (220) = {25, 315, 447} Plane{0, 0, 1};
+
+Circle (221) = {447, 315, 314} Plane{0, 0, 1};
+
+Circle (222) = {314, 315, 446} Plane{0, 0, 1};
+
+Circle (223) = {446, 315, 26} Plane{0, 0, 1};
+
+CatmullRom (226) = {446, 450, 451};
+
+CatmullRom (227) = {445, 449, 452};
+
+CatmullRom (229) = {448, 457, 453};
+
+CatmullRom (230) = {447, 456, 454};
+
+Circle (232) = {273, 277, 461} Plane{0, 0, 1};
+
+Circle (233) = {461, 277, 275} Plane{0, 0, 1};
+
+Circle (234) = {275, 277, 458} Plane{0, 0, 1};
+
+Circle (235) = {458, 277, 274} Plane{0, 0, 1};
+
+Circle (236) = {274, 277, 459} Plane{0, 0, 1};
+
+Circle (237) = {459, 277, 276} Plane{0, 0, 1};
+
+Circle (238) = {276, 277, 460} Plane{0, 0, 1};
+
+Circle (239) = {460, 277, 273} Plane{0, 0, 1};
+
+CatmullRom (240) = {461, 469, 465};
+
+CatmullRom (241) = {460, 468, 464};
+
+Line (243) = {452, 465};
+
+Line (244) = {451, 464};
+
+Line (245) = {445, 461};
+
+Line (246) = {446, 460};
+
+CatmullRom (248) = {458, 466, 462};
+
+CatmullRom (249) = {459, 467, 463};
+
+Line (250) = {448, 458};
+
+Line (251) = {447, 459};
+
+Line (252) = {453, 462};
+
+Line (253) = {454, 463};
+
+CatmullRom (254) = {252, 330, 259, 261, 15};
+
+CatmullRom (255) = {1, 359, 15};
+
+CatmullRom (256) = {15, 18, 278};
+
+CatmullRom (258) = {321, 33, 186};
+
+Line (260) = {75, 6};
+
+CatmullRom (261) = {296, 336, 298, 75};
+
+Line (262) = {5, 74};
+
+CatmullRom (263) = {74, 297, 335, 296};
+
+CatmullRom (268) = {279, 17, 16};
+
+CatmullRom (269) = {16, 360, 1};
+
+CatmullRom (276) = {1, 470, 252};
+
+CatmullRom (277) = {252, 471, 280};
+
+CatmullRom (278) = {278, 19, 294};
+
+CatmullRom (280) = {279, 20, 295};
+
+CatmullRom (286) = {280, 266, 285};
+
+CatmullRom (298) = {6, 472, 299};
+
+CatmullRom (299) = {299, 473, 5};
+
+Line (308) = {343, 344};
+
+CatmullRom (310) = {22, 474, 343};
+
+CatmullRom (311) = {344, 475, 21};
+
+CatmullRom (354) = {480, 265, 299};
+
+CatmullRom (355) = {4, 477, 478, 480};
+
+CatmullRom (356) = {480, 479, 476, 3};
+
+CatmullRom (357) = {5, 353, 4};
+
+Line (358) = {295, 4};
+
+CatmullRom (359) = {6, 358, 3};
+
+Line (360) = {294, 3};
+
+Line (362) = {480, 285};
+
+CatmullRom (1000371) = {343, 482, 299};
+
+CatmullRom (1000372) = {299, 481, 344};
+
+CatmullRom (2000397) = {70, 487, 117};
+
+CatmullRom (2000398) = {68, 488, 117};
+
+CatmullRom (2000399) = {70, 483, 300};
+
+CatmullRom (2000400) = {300, 486, 68};
+
+CatmullRom (2000401) = {70, 484, 301};
+
+CatmullRom (2000402) = {301, 485, 68};
+
+Line (2000411) = {289, 190};
+
+Line (2000412) = {289, 72};
+
+Line (2000413) = {189, 288};
+
+Line (2000414) = {288, 73};
+
+CatmullRom (2000415) = {68, 333, 286, 289};
+
+Line (2000416) = {289, 294};
+
+CatmullRom (2000417) = {68, 334, 287, 288};
+
+Line (2000418) = {288, 295};
+
+CatmullRom (2000419) = {186, 325, 323, 187, 190};
+
+Line (2000420) = {190, 278};
+
+CatmullRom (2000421) = {321, 327, 319, 263};
+
+CatmullRom (2000422) = {322, 362, 263};
+
+Line (2000423) = {263, 15};
+
+Line (2000424) = {263, 190};
+
+CatmullRom (2000435) = {186, 326, 324, 188, 189};
+
+Line (2000436) = {189, 279};
+
+CatmullRom (2000443) = {322, 363, 264};
+
+CatmullRom (2000444) = {264, 320, 328, 321};
+
+Line (2000445) = {264, 189};
+
+Line (2000446) = {16, 264};
+
+Line (2000452) = {322, 1};
+
+CatmullRom (2000453) = {321, 489, 322};
+
+CatmullRom (3000466) = {300, 302, 72};
+
+CatmullRom (3000469) = {301, 303, 73};
+
+CatmullRom (3000473) = {301, 23502, 74};
+
+CatmullRom (3000474) = {300, 23503, 75};
+
+CatmullRom (5000480) = {307, 340, 312, 183};
+
+Line (5000481) = {183, 21};
+
+CatmullRom (5000482) = {307, 339, 311, 182};
+
+Line (5000483) = {182, 22};
+
+CatmullRom (5000484) = {316, 342, 318, 185};
+
+Line (5000485) = {185, 23};
+
+CatmullRom (5000486) = {316, 341, 317, 184};
+
+Line (5000487) = {184, 24};
+
+Line (6000508) = {453, 23504};
+
+Line (6000509) = {23504, 23505};
+
+Line (6000510) = {23505, 462};
+
+Line (6000511) = {23505, 463};
+
+Line (6000512) = {454, 23504};
+
+Line (6000527) = {23506, 452};
+
+Line (6000528) = {465, 23507};
+
+Line (6000529) = {23507, 23506};
+
+Line (6000530) = {23506, 451};
+
+Line (6000531) = {23507, 464};
+
+Line (7000546) = {23, 346};
+
+Line (7000548) = {346, 458};
+
+CatmullRom (7000549) = {346, 272, 345};
+
+Line (7000550) = {345, 458};
+
+Line (7000551) = {345, 459};
+
+Line (7000560) = {24, 345};
+
+Line (7000563) = {275, 185};
+
+Line (7000566) = {316, 461};
+
+Line (7000567) = {316, 460};
+
+Line (7000572) = {184, 276};
+
+Line (8000575) = {459, 24};
+
+Line (8000580) = {458, 23};
+
+CatmullRom (9000586) = {274, 23510, 23505};
+
+CatmullRom (9000604) = {273, 23508, 23507};
+
+CatmullRom (9000605) = {26, 23509, 23506};
+
+CatmullRom (10000622) = {23504, 23511, 25};
+
+Line Loop (1000289) = {278, -102, -286, -174};
+
+Ruled Surface (289) = {1000289};
+
+Line Loop (1000291) = {256, 174, -277, 254};
+
+Ruled Surface (291) = {1000291};
+
+Line Loop (1000293) = {277, -175, 268, 172};
+
+Ruled Surface (293) = {1000293};
+
+Line Loop (1000295) = {175, 286, 101, -280};
+
+Ruled Surface (295) = {1000295};
+
+Line Loop (1000321) = {47, -45, -44, 46};
+
+Ruled Surface (321) = {1000321};
+
+Line Loop (1000323) = {50, 26, -51, -44};
+
+Plane Surface (323) = {1000323};
+
+Line Loop (1000325) = {40, 41, 24, -42};
+
+Plane Surface (325) = {1000325};
+
+Line Loop (1000327) = {22, -24, -23, 49};
+
+Ruled Surface (327) = {1000327};
+
+Line Loop (1000329) = {43, 78, -40, -39};
+
+Ruled Surface (329) = {1000329};
+
+Line Loop (1000344) = {191, 195, -193, 188};
+
+Plane Surface (344) = {1000344};
+
+Line Loop (1000346) = {189, 190, -194, -192};
+
+Plane Surface (346) = {1000346};
+
+Line Loop (1000348) = {195, 197, 194, -196};
+
+Plane Surface (348) = {1000348};
+
+Line Loop (1000350) = {308, 190, -196, -191};
+
+Ruled Surface (350) = {1000350};
+
+Line Loop (1000352) = {207, -20, -204, -16};
+
+Ruled Surface (352) = {1000352};
+
+/* Line Loop (1000353) = {207, -20, -204, -16};
+
+Ruled Surface (353) = {1000353};   is obviously duplicated */
+
+Line Loop (1000364) = {358, 355, 362, 101};
+
+Ruled Surface (364) = {1000364};
+
+Line Loop (1000366) = {362, 102, 360, -356};
+
+Ruled Surface (366) = {1000366};
+
+Line Loop (1000368) = {357, 355, 354, 299};
+
+Ruled Surface (368) = {1000368};
+
+Line Loop (1000370) = {298, -354, 356, -359};
+
+Ruled Surface (370) = {1000370};
+
+Line Loop (2000374) = {1000372, -308, 1000371}; // CHANGED ORDER
+
+Ruled Surface (1000374) = {2000374};
+
+Line Loop (2000376) = {1000371, -298, 7, 310};
+
+Ruled Surface (1000376) = {2000376};
+
+Line Loop (2000378) = {1000372, 311, -151, -299};
+
+Ruled Surface (1000378) = {2000378};
+
+Line Loop (2000380) = {357, 1, -205, 88};
+
+Ruled Surface (1000380) = {2000380};
+
+Line Loop (2000382) = {15, 1, -19, 20};
+
+Plane Surface (1000382) = {2000382};
+
+Line Loop (2000384) = {262, 16, 18, 88};
+
+Plane Surface (1000384) = {2000384};
+
+Line Loop (2000386) = {205, -19, -204, 18};
+
+Ruled Surface (1000386) = {2000386};
+
+Line Loop (2000388) = {209, -32, -208, 33};
+
+Ruled Surface (1000388) = {2000388};
+
+Line Loop (2000390) = {359, 4, 209, -5};
+
+Ruled Surface (1000390) = {2000390};
+
+Line Loop (2000392) = {30, -208, -29, -211};
+
+Ruled Surface (1000392) = {2000392};
+
+Line Loop (2000394) = {5, -32, -30, 260};
+
+Plane Surface (1000394) = {2000394};
+
+Line Loop (2000396) = {33, -4, -85, 29};
+
+Plane Surface (1000396) = {2000396};
+
+Line Loop (3000404) = {2000399, 180, -2000397};
+
+Ruled Surface (2000404) = {3000404};
+
+Line Loop (3000406) = {2000401, 181, -2000397};
+
+Ruled Surface (2000406) = {3000406};
+
+Line Loop (3000408) = {2000402, 2000398, -181};
+
+Ruled Surface (2000408) = {3000408};
+
+Line Loop (3000410) = {2000400, 2000398, -180};
+
+Ruled Surface (2000410) = {3000410};
+
+Line Loop (3000426) = {2000419, -2000424, -2000421, 258};
+
+Ruled Surface (2000426) = {3000426};
+
+Line Loop (3000428) = {2000424, 2000420, -256, -2000423};
+
+Ruled Surface (2000428) = {3000428};
+
+Line Loop (3000430) = {2000419, -2000411, -2000415, 159};
+
+Ruled Surface (2000430) = {3000430};
+
+Line Loop (3000432) = {2000420, 278, -2000416, 2000411};
+
+Ruled Surface (2000432) = {3000432};
+
+Line Loop (3000434) = {360, -85, -2000412, 2000416};
+
+Ruled Surface (2000434) = {3000434};
+
+Line Loop (3000438) = {2000417, -2000413, -2000435, -159};
+
+Ruled Surface (2000438) = {3000438};
+
+Line Loop (3000440) = {2000418, -280, -2000436, 2000413};
+
+Ruled Surface (2000440) = {3000440};
+
+Line Loop (3000442) = {2000418, 358, -15, -2000414};
+
+Ruled Surface (2000442) = {3000442};
+
+Line Loop (3000448) = {258, 2000435, -2000445, 2000444};
+
+Ruled Surface (2000448) = {3000448};
+
+Line Loop (3000450) = {2000445, 2000436, 268, 2000446};
+
+Ruled Surface (2000450) = {3000450};
+
+Line Loop (3000455) = {2000453, 2000443, 2000444};
+
+Ruled Surface (2000455) = {3000455};
+
+Line Loop (3000457) = {2000422, -2000421, 2000453};
+
+Ruled Surface (2000457) = {3000457};
+
+Line Loop (3000459) = {269, -2000452, 2000443, -2000446};
+
+Ruled Surface (2000459) = {3000459};
+
+Line Loop (3000461) = {255, -2000423, -2000422, 2000452};
+
+Ruled Surface (2000461) = {3000461};
+
+Line Loop (3000463) = {172, -276, -269};
+
+Ruled Surface (2000463) = {3000463};
+
+Line Loop (3000465) = {276, 254, -255};
+
+Ruled Surface (2000465) = {3000465};
+
+Line Loop (4000468) = {3000466, -2000412, -2000415, -2000400};
+
+Ruled Surface (3000468) = {4000468};
+
+Line Loop (4000471) = {2000417, 2000414, -3000469, 2000402};
+
+Ruled Surface (3000471) = {4000471};
+
+Line Loop (5000473) = {261, -3000474, -2000399, 118};
+
+Ruled Surface (4000473) = {5000473};
+
+Line Loop (5000475) = {211, -3000466, 3000474};
+
+Ruled Surface (4000475) = {5000475};
+
+Line Loop (5000477) = {3000473, 263, -118, 2000401};
+
+Ruled Surface (4000477) = {5000477};
+
+Line Loop (5000479) = {3000473, 207, -3000469};
+
+Ruled Surface (4000479) = {5000479};
+
+Line Loop (6000489) = {149, -5000480, -147, -263};
+
+Ruled Surface (5000489) = {6000489};
+
+Line Loop (6000491) = {262, 149, 5000481, -151};
+
+Ruled Surface (5000491) = {6000491};
+
+Line Loop (6000493) = {5000483, -7, -260, 150};
+
+Ruled Surface (5000493) = {6000493};
+
+Line Loop (6000495) = {5000482, -150, -261, 147};
+
+Ruled Surface (5000495) = {6000495};
+
+Line Loop (6000497) = {47, -5000484, -198, 5000482};
+
+Ruled Surface (5000497) = {6000497};
+
+Line Loop (6000499) = {198, 5000486, -43, -5000480};
+
+Ruled Surface (5000499) = {6000499};
+
+Line Loop (6000501) = {23, -41, -78, 5000487};
+
+Ruled Surface (5000501) = {6000501};
+
+Line Loop (6000503) = {5000481, 22, -42, -39};
+
+Ruled Surface (5000503) = {6000503};
+
+Line Loop (6000505) = {50, -126, -5000483, -46};
+
+Ruled Surface (5000505) = {6000505};
+
+Line Loop (6000507) = {5000485, 27, -51, 45};
+
+Ruled Surface (5000507) = {6000507};
+
+Line Loop (6000509) = {140, 216, 217, -138};
+
+Ruled Surface (5000509) = {6000509};
+
+Line Loop (6000511) = {141, 222, 223, -140};
+
+Ruled Surface (5000511) = {6000511};
+
+Line Loop (6000513) = {139, -219, -218, -138};
+
+Ruled Surface (5000513) = {6000513};
+
+Line Loop (6000515) = {220, 221, -141, 139};
+
+Ruled Surface (5000515) = {6000515};
+
+Line Loop (6000517) = {217, 202, -233, -245};
+
+Ruled Surface (5000517) = {6000517};
+
+Line Loop (6000519) = {202, 234, -250, -218};
+
+Ruled Surface (5000519) = {6000519};
+
+Line Loop (6000521) = {222, 246, -238, -203};
+
+Ruled Surface (5000521) = {6000521};
+
+Line Loop (6000523) = {237, -203, -221, 251};
+
+Ruled Surface (5000523) = {6000523};
+
+Line Loop (7000516) = {6000512, 6000509, 6000511, -253};
+
+Plane Surface (6000516) = {7000516};
+
+Line Loop (7000518) = {6000508, 6000509, 6000510, -252};
+
+Plane Surface (6000518) = {7000518};
+
+Line Loop (7000533) = {6000529, 6000527, 243, 6000528};
+
+Plane Surface (6000533) = {7000533};
+
+Line Loop (7000535) = {6000530, 244, -6000531, 6000529};
+
+Plane Surface (6000535) = {7000535};
+
+Line Loop (8000553) = {7000549, 7000550, -7000548};
+
+Ruled Surface (7000553) = {8000553};
+
+Line Loop (8000555) = {7000551, -236, -235, -7000550};
+
+Ruled Surface (7000555) = {8000555};
+
+Line Loop (8000557) = {7000549, 192, -197, -193};
+
+Ruled Surface (7000557) = {8000557};
+
+Line Loop (8000559) = {188, -310, -48, 7000546};
+
+Ruled Surface (7000559) = {8000559};
+
+Line Loop (8000562) = {311, -49, 7000560, 189};
+
+Ruled Surface (7000562) = {8000562};
+
+Line Loop (8000569) = {7000566, 233, 7000563, -5000484};
+
+Ruled Surface (7000569) = {8000569};
+
+Line Loop (8000571) = {7000566, -232, -239, -7000567};
+
+Ruled Surface (7000571) = {8000571};
+
+Line Loop (8000574) = {238, -7000567, 5000486, 7000572};
+
+Ruled Surface (7000574) = {8000574};
+
+Line Loop (9000577) = {7000560, 7000551, 8000575};
+
+Ruled Surface (8000577) = {9000577};
+
+Line Loop (9000579) = {5000487, -8000575, 237, -7000572};
+
+Ruled Surface (8000579) = {9000579};
+
+Line Loop (9000582) = {7000548, 8000580, 7000546};
+
+Ruled Surface (8000582) = {9000582};
+
+Line Loop (9000584) = {8000580, -5000485, -7000563, 234};
+
+Ruled Surface (8000584) = {9000584};
+
+Line Loop (10000588) = {230, 6000512};
+
+//Plane Surface (9000588) = {10000588}; // BAD!!!
+
+
+Line Loop (10000607) = {6000528, -9000604, 232, 240};
+
+Ruled Surface (9000607) = {10000607};
+
+Line Loop (10000608) = {245, 240, -243, -227};
+
+Ruled Surface (9000608) = {10000608};
+
+Line Loop (10000610) = {6000531, -241, 239, 9000604};
+
+Ruled Surface (9000610) = {10000610};
+
+Line Loop (10000612) = {6000527, -227, -216, 9000605};
+
+Ruled Surface (9000612) = {10000612};
+
+Line Loop (10000614) = {6000530, -226, 223, 9000605};
+
+Ruled Surface (9000614) = {10000614};
+
+Line Loop (10000615) = {244, -241, -246, 226};
+
+Ruled Surface (9000615) = {10000615};
+
+Line Loop (11000623) = {6000511, -249, -236, 9000586};
+
+Ruled Surface (10000623) = {11000623};
+
+Line Loop (11000624) = {248, -6000510, -9000586, -235};
+
+Ruled Surface (10000624) = {11000624};
+
+Line Loop (11000625) = {230, 253, -249, -251};
+
+Ruled Surface (10000625) = {11000625};
+
+Line Loop (11000626) = {250, 248, -252, -229};
+
+Ruled Surface (10000626) = {11000626};
+
+Line Loop (11000628) = {6000512, 10000622, 220, 230};
+
+Ruled Surface (10000628) = {11000628};
+
+Line Loop (11000630) = {6000508, 10000622, -219, 229};
+
+Ruled Surface (10000630) = {11000630};
+
+Line Loop (12000632) = {26, -27, 48, 126};
+
+Ruled Surface (11000632) = {12000632};
diff --git a/benchmarks/bugs/bug_rabchevitch_optimize.geo b/benchmarks/bugs/bug_rabchevitch_optimize.geo
new file mode 100644
index 0000000000000000000000000000000000000000..7a0fd63d2c85dbc9d7fb0e8a191e652f5f16dcfb
--- /dev/null
+++ b/benchmarks/bugs/bug_rabchevitch_optimize.geo
@@ -0,0 +1,300 @@
+// Gmsh project created on Thu Nov 01 10:31:41 2007
+
+//indenter which has a little blunt radius
+
+Z1 = 0.15; //Z of the sphere tip
+
+
+D = 1.7; //contact radius
+
+beta = 90 / 2 * Pi / 180; //half the angle of the cone
+
+d = D * Cos(beta); //diameter of the touch of cone and contact sphere 
+
+//alpha is the distance from sphere tip to some point on the sphere
+//alpha = 0.5 * (D - (D ^ 2 - d ^ 2) ^ 0.5), where d is a diameter at alpha
+
+alpha = 0.5 * (D - (D ^ 2 - d ^ 2) ^ 0.5);
+
+D2 =  4; //pivot diameter
+
+L1 = 0.5 * (D2 - d) / Tan(beta); //length of the cone
+
+L2 = 20; //pivot length
+
+Di = 0.85 * D; //inner sphere diameter for better meshing
+
+
+//characteristic lengths
+l0 = 0.2 * (D - Di);  //sphere tip
+l1 = 2.0 * l0; //outer sphere
+l2 = 0.5 * Di; //inner sphere can be coarse
+l3 = 0.5 * D2;
+
+
+
+
+//points
+
+//outer sphere
+Point(100) = {0, 0, Z1+0.5*D, l0}; //virtual point - sphere center - for setting sphere surfaces
+Point(101) = {0, 0, Z1, l0}; //sphere tip
+r = 0.5 * d;
+l = l1;
+h = alpha;
+Point(102) = {0,0,Z1+h,l};
+Point(103) = {r,0,Z1+h,l};
+tmp104[] = Rotate {{0, 0, 1}, {0,0,0}, Pi/4} { Duplicata{ Point{103}; } } ;
+tmp105[] = Rotate {{0, 0, 1}, {0,0,0}, Pi/2} { Duplicata{ Point{103}; } } ;
+
+
+
+
+//cone
+h = alpha + L1;
+a = 0.5 * D2;
+a1 = 0.5 * a;
+l = 0.5 * a;
+Point(122) = {0,0,Z1+h,l};
+Point(123) = {a,0,Z1+h,l};
+tmp124[] = Rotate {{0, 0, 1}, {0,0,0}, Pi/4} { Duplicata{ Point{123}; } } ;
+tmp125[] = Rotate {{0, 0, 1}, {0,0,0}, Pi/2} { Duplicata{ Point{123}; } } ;
+
+
+
+//thick cylinder
+H = alpha + L1;
+h = L2 * 0.2;
+l = 0.5 * D2;
+a1 = 0.5 * 0.5 * D2;
+Point(142) = {0,0,H+h,l};
+Point(143) = {0.5 * D2,0,H+h,l};
+tmp144[] = Rotate {{0, 0, 1}, {0,0,0}, Pi/4} { Duplicata{ Point{143}; } } ;
+tmp145[] = Rotate {{0, 0, 1}, {0,0,0}, Pi/2} { Duplicata{ Point{143}; } } ;
+
+
+
+
+Point(152) = {0,0,H+2*h,l};
+Point(153) = {0.5 * D2,0,H+2*h,l};
+tmp154[] = Rotate {{0, 0, 1}, {0,0,0}, Pi/4} { Duplicata{ Point{153}; } } ;
+tmp155[] = Rotate {{0, 0, 1}, {0,0,0}, Pi/2} { Duplicata{ Point{153}; } } ;
+
+
+
+
+Point(162) = {0,0,H+3*h,l};
+Point(163) = {0.5 * D2,0,H+3*h,l};
+tmp164[] = Rotate {{0, 0, 1}, {0,0,0}, Pi/4} { Duplicata{ Point{163}; } } ;
+tmp165[] = Rotate {{0, 0, 1}, {0,0,0}, Pi/2} { Duplicata{ Point{163}; } } ;
+
+
+
+
+Point(172) = {0,0,H+4*h,l};
+Point(173) = {0.5 * D2,0,H+4*h,l};
+tmp174[] = Rotate {{0, 0, 1}, {0,0,0}, Pi/4} { Duplicata{ Point{173}; } } ;
+tmp175[] = Rotate {{0, 0, 1}, {0,0,0}, Pi/2} { Duplicata{ Point{173}; } } ;
+
+
+
+
+Point(182) = {0,0,H+5*h,l};
+Point(183) = {0.5 * D2,0,H+5*h,l};
+tmp184[] = Rotate {{0, 0, 1}, {0,0,0}, Pi/4} { Duplicata{ Point{183}; } } ;
+tmp185[] = Rotate {{0, 0, 1}, {0,0,0}, Pi/2} { Duplicata{ Point{183}; } } ;
+
+
+
+
+Circle(1) = {103,102,104};
+Circle(2) = {104,102,105};
+Circle(3) = {103,100,101};
+Circle(4) = {104,100,101};
+Circle(5) = {105,100,101};
+Circle(6) = {123,122,124};
+Circle(7) = {124,122,125};
+Circle(8) = {143,142,144};
+Circle(9) = {144,142,145};
+Circle(10) = {153,152,154};
+Circle(11) = {154,152,155};
+Circle(12) = {163,162,164};
+Circle(13) = {164,162,165};
+Circle(14) = {173,172,174};
+Circle(15) = {174,172,175};
+Circle(16) = {183,182,184};
+Circle(17) = {184,182,185};
+Line(18) = {103,102};
+Line(19) = {104,102};
+Line(20) = {105,102};
+Line(21) = {123,122};
+Line(22) = {124,122};
+Line(23) = {125,122};
+Line(24) = {143,142};
+Line(25) = {144,142};
+Line(26) = {145,142};
+Line(27) = {153,152};
+Line(28) = {154,152};
+Line(29) = {155,152};
+Line(30) = {163,162};
+Line(31) = {164,162};
+Line(32) = {165,162};
+Line(33) = {173,172};
+Line(34) = {174,172};
+Line(35) = {175,172};
+Line(36) = {183,182};
+Line(37) = {184,182};
+Line(38) = {185,182};
+Line(39) = {101,102};
+Line(40) = {102,100};
+Line(41) = {100,122};
+Line(42) = {122,142};
+Line(43) = {142,152};
+Line(44) = {152,162};
+Line(45) = {162,172};
+Line(46) = {172,182};
+Line(47) = {103,123};
+Line(48) = {123,143};
+Line(49) = {143,153};
+Line(50) = {153,163};
+Line(51) = {163,173};
+Line(52) = {173,183};
+Line(53) = {104,124};
+Line(54) = {124,144};
+Line(55) = {144,154};
+Line(56) = {154,164};
+Line(57) = {164,174};
+Line(58) = {174,184};
+Line(59) = {125,145};
+Line(60) = {145,155};
+Line(61) = {155,165};
+Line(62) = {165,175};
+Line(63) = {175,185};
+Line(64) = {105,125};
+Line Loop(65) = {5,-4,2};
+Ruled Surface(66) = {65};
+Line Loop(67) = {4,-3,1};
+Ruled Surface(68) = {67};
+Line Loop(69) = {64,-7,-53,2};
+Ruled Surface(70) = {69};
+Line Loop(71) = {53,-6,-47,1};
+Ruled Surface(72) = {71};
+Line Loop(73) = {48,8,-54,-6};
+Ruled Surface(74) = {73};
+Line Loop(75) = {54,9,-59,-7};
+Ruled Surface(76) = {75};
+Line Loop(77) = {8,55,-10,-49};
+Ruled Surface(78) = {77};
+Line Loop(79) = {55,11,-60,-9};
+Ruled Surface(80) = {79};
+Line Loop(81) = {10,56,-12,-50};
+Ruled Surface(82) = {81};
+Line Loop(83) = {56,13,-61,-11};
+Ruled Surface(84) = {83};
+Line Loop(85) = {51,14,-57,-12};
+Ruled Surface(86) = {85};
+Line Loop(87) = {57,15,-62,-13};
+Ruled Surface(88) = {87};
+Line Loop(89) = {52,16,-58,-14};
+Ruled Surface(90) = {89};
+Line Loop(91) = {58,17,-63,-15};
+Ruled Surface(92) = {91};
+Line Loop(93) = {3,39,-18};
+Plane Surface(94) = {93};
+Line Loop(95) = {4,39,-19};
+Plane Surface(96) = {95};
+Line Loop(97) = {5,39,-20};
+Plane Surface(98) = {97};
+Line Loop(99) = {18,40,41,-21,-47};
+Plane Surface(100) = {99};
+Line Loop(101) = {19,40,41,-22,-53};
+Plane Surface(102) = {101};
+Line Loop(103) = {20,40,41,-23,-64};
+Plane Surface(104) = {103};
+Line Loop(105) = {21,42,-24,-48};
+Plane Surface(106) = {105};
+Line Loop(107) = {22,42,-25,-54};
+Plane Surface(108) = {107};
+Line Loop(109) = {23,42,-26,-59};
+Plane Surface(110) = {109};
+Line Loop(111) = {24,43,-27,-49};
+Plane Surface(112) = {111};
+Line Loop(113) = {25,43,-28,-55};
+Plane Surface(114) = {113};
+Line Loop(115) = {26,43,-29,-60};
+Plane Surface(116) = {115};
+Line Loop(117) = {27,44,-30,-50};
+Plane Surface(118) = {117};
+Line Loop(119) = {28,44,-31,-56};
+Plane Surface(120) = {119};
+Line Loop(121) = {29,44,-32,-61};
+Plane Surface(122) = {121};
+Line Loop(123) = {30,45,-33,-51};
+Plane Surface(124) = {123};
+Line Loop(125) = {31,45,-34,-57};
+Plane Surface(126) = {125};
+Line Loop(127) = {32,45,-35,-62};
+Plane Surface(128) = {127};
+Line Loop(129) = {33,46,-36,-52};
+Plane Surface(130) = {129};
+Line Loop(131) = {34,46,-37,-58};
+Plane Surface(132) = {131};
+Line Loop(133) = {35,46,-38,-63};
+Plane Surface(134) = {133};
+Line Loop(135) = {18,-19,-1};
+Plane Surface(136) = {135};
+Line Loop(137) = {19,-20,-2};
+Plane Surface(138) = {137};
+Line Loop(139) = {21,-22,-6};
+Plane Surface(140) = {139};
+Line Loop(141) = {22,-23,-7};
+Plane Surface(142) = {141};
+Line Loop(143) = {24,-25,-8};
+Plane Surface(144) = {143};
+Line Loop(145) = {25,-26,-9};
+Plane Surface(146) = {145};
+Line Loop(147) = {27,-28,-10};
+Plane Surface(148) = {147};
+Line Loop(149) = {28,-29,-11};
+Plane Surface(150) = {149};
+Line Loop(151) = {30,-31,-12};
+Plane Surface(152) = {151};
+Line Loop(153) = {31,-32,-13};
+Plane Surface(154) = {153};
+Line Loop(155) = {33,-34,-14};
+Plane Surface(156) = {155};
+Line Loop(157) = {34,-35,-15};
+Plane Surface(158) = {157};
+Line Loop(159) = {36,-37,-16};
+Plane Surface(160) = {159};
+Line Loop(161) = {37,-38,-17};
+Plane Surface(162) = {161};
+Surface Loop(163) = {94,68,96,136};
+Volume(164) = {163};
+Surface Loop(165) = {98,66,138,96};
+Volume(166) = {165};
+Surface Loop(167) = {136,140,72,100,102};
+Volume(168) = {167};
+Surface Loop(169) = {142,138,104,70,102};
+Volume(170) = {169};
+Surface Loop(171) = {74,106,108,144,140};
+Volume(172) = {171};
+Surface Loop(173) = {76,110,146,142,108};
+Volume(174) = {173};
+Surface Loop(175) = {78,112,148,144,114};
+Volume(176) = {175};
+Surface Loop(177) = {150,80,116,146,114};
+Volume(178) = {177};
+Surface Loop(179) = {82,118,152,148,120};
+Volume(180) = {179};
+Surface Loop(181) = {84,122,154,150,120};
+Volume(182) = {181};
+Surface Loop(183) = {86,124,156,152,126};
+Volume(184) = {183};
+Surface Loop(185) = {88,128,158,154,126};
+Volume(186) = {185};
+Surface Loop(187) = {90,130,160,156,132};
+Volume(188) = {187};
+Surface Loop(189) = {92,162,134,158,132};
+Volume(190) = {189};
+Physical Volume(191) = {164,166,168,170,172,174,176,178,180,182,184,186,188,190};
diff --git a/benchmarks/bugs/known_extrusion_interpolation_bug.geo b/benchmarks/bugs/known_extrusion_interpolation_bug.geo
new file mode 100644
index 0000000000000000000000000000000000000000..2eaf50dc32347899439054d40bd0c9fc939b66ca
--- /dev/null
+++ b/benchmarks/bugs/known_extrusion_interpolation_bug.geo
@@ -0,0 +1,30 @@
+l1=0.1;
+Point(1) = {0,0,0,l1};
+Point(2) = {1,0,0,l1};
+Point(3) = {1,1,0,l1};
+Point(4) = {0,1,0,l1};
+Point(5) = {0,0,1,l1};
+Point(6) = {0,1,1,l1};
+Line(1) = {4,3};
+Line(2) = {3,2};
+Line(3) = {2,1};
+Line(4) = {1,4};
+Line Loop(5) = {2,3,4,1};
+Ruled Surface(6) = {5};
+
+// This is OK
+/*
+Line(7) = {6,4};
+Line(8) = {1,5};
+Line(9) = {5,6};
+Line Loop(10) = {7,-4,8,9};
+Ruled Surface(11) = {10};
+Rotate {{0,1,0}, {0,0,0}, Pi/4} { Surface{6,11}; }
+*/
+
+// This will fail, since at the moment we use the extrusion formula to
+// interpolate the surface (which is wrong since the surface has been
+// transformed). We do this so that we can create exact surfaces of
+// revolution... One more shortcoming of our little CAD engine :-)
+Extrude {0,0,1}{ Line{4}; }
+Rotate {{0,1,0}, {0,0,0}, Pi/4} { Surface{6,10}; }