diff --git a/Common/Context.h b/Common/Context.h
index a468e0c57749d82b4ac99cb8cc187147316ba38b..cd9f0e69c1d3316746517b1c97bf45d10cbb8c60 100644
--- a/Common/Context.h
+++ b/Common/Context.h
@@ -152,7 +152,6 @@ class Context_T {
     double tolerance;
     double snap[3];
     int occ_fix_small_edges, occ_fix_small_faces, occ_sew_faces;
-    int sphere_geodesic;
   } geom;
 
   // mesh options 
@@ -174,6 +173,7 @@ class Context_T {
     int light, light_two_side, light_lines;
     int format, nb_smoothing, algo2d, algo3d, algo_recombine;
     int order, second_order_linear, second_order_incomplete;
+    int second_order_experimental;
     int smooth_internal_edges, c1_continuity;
     int min_circ_points, min_curv_points;
     double normals, tangents, explode;
diff --git a/Common/DefaultOptions.h b/Common/DefaultOptions.h
index a852255dc9c99968f448085a5c96a113e266ad5b..b3bae8bf32b7113df570aed2e858fecfc9fc6b8c 100644
--- a/Common/DefaultOptions.h
+++ b/Common/DefaultOptions.h
@@ -871,8 +871,6 @@ StringXNumber GeometryOptions_Number[] = {
     "Snapping grid spacing along the Y-axis" },
   { F|O, "SnapZ" , opt_geometry_snap2 , 0.1 ,
     "Snapping grid spacing along the Z-axis" },
-  { F|O, "SphereGeodesic" , opt_geometry_sphere_geodesic , 0. ,
-    "Use projection to compute sphere geodesic" },
   { F|O, "Surfaces" , opt_geometry_surfaces , 0. , 
     "Display geometry surfaces?" },
   { F|O, "SurfaceNumbers" , opt_geometry_surfaces_num , 0. , 
@@ -1049,6 +1047,8 @@ StringXNumber MeshOptions_Number[] = {
     "Save groups of nodes for each physical line and surface (UNV mesh format only)" },
   { F|O, "ScalingFactor" , opt_mesh_scaling_factor , 1.0 ,
     "Global scaling factor applied to the saved mesh" },
+  { F|O, "SecondOrderExperimental" , opt_mesh_second_order_experimental , 0. ,
+    "Use experimental code to generate second order mesh" },
   { F|O, "SecondOrderIncomplete" , opt_mesh_second_order_incomplete , 1. ,
     "Create incomplete second order elements? (8-node quads, 20-node hexas, etc.)" },
   { F|O, "SecondOrderLinear" , opt_mesh_second_order_linear , 0. ,
diff --git a/Common/Options.cpp b/Common/Options.cpp
index 4c0b3782dc6b6f79d1f118c45170df9123c611de..24b6a03bef1b372d7a95692e3b984384bfbf497d 100644
--- a/Common/Options.cpp
+++ b/Common/Options.cpp
@@ -1,4 +1,4 @@
-// $Id: Options.cpp,v 1.400 2008-06-20 05:51:36 geuzaine Exp $
+// $Id: Options.cpp,v 1.401 2008-06-20 11:50:00 geuzaine Exp $
 //
 // Copyright (C) 1997-2008 C. Geuzaine, J.-F. Remacle
 //
@@ -4035,13 +4035,6 @@ double opt_geometry_tolerance(OPT_ARGS_NUM)
   return CTX.geom.tolerance;
 }
 
-double opt_geometry_sphere_geodesic(OPT_ARGS_NUM)
-{
-  if(action & GMSH_SET)
-    CTX.geom.sphere_geodesic = val;
-  return CTX.geom.sphere_geodesic;
-}
-
 double opt_geometry_normals(OPT_ARGS_NUM)
 {
   if(action & GMSH_SET)
@@ -5139,6 +5132,13 @@ double opt_mesh_smooth_internal_edges(OPT_ARGS_NUM)
   return CTX.mesh.smooth_internal_edges;
 }
 
+double opt_mesh_second_order_experimental(OPT_ARGS_NUM)
+{
+  if(action & GMSH_SET)
+    CTX.mesh.second_order_experimental = (int)val;
+  return CTX.mesh.second_order_experimental;
+}
+
 double opt_mesh_second_order_linear(OPT_ARGS_NUM)
 {
   if(action & GMSH_SET)
diff --git a/Common/Options.h b/Common/Options.h
index 0beacbcfca7b44f28c569f1a69a683cd0d900c05..7dbce6a5ab0c2057fdec6102c04fe4d058310f0d 100644
--- a/Common/Options.h
+++ b/Common/Options.h
@@ -399,7 +399,6 @@ double opt_general_light53(OPT_ARGS_NUM);
 double opt_geometry_auto_coherence(OPT_ARGS_NUM);
 double opt_geometry_highlight_orphans(OPT_ARGS_NUM);
 double opt_geometry_tolerance(OPT_ARGS_NUM);
-double opt_geometry_sphere_geodesic(OPT_ARGS_NUM);
 double opt_geometry_normals(OPT_ARGS_NUM);
 double opt_geometry_tangents(OPT_ARGS_NUM);
 double opt_geometry_points(OPT_ARGS_NUM);
@@ -493,6 +492,7 @@ double opt_mesh_min_curv_points(OPT_ARGS_NUM);
 double opt_mesh_order(OPT_ARGS_NUM);
 double opt_mesh_c1(OPT_ARGS_NUM);
 double opt_mesh_smooth_internal_edges(OPT_ARGS_NUM);
+double opt_mesh_second_order_experimental(OPT_ARGS_NUM);
 double opt_mesh_second_order_linear(OPT_ARGS_NUM);
 double opt_mesh_second_order_incomplete(OPT_ARGS_NUM);
 double opt_mesh_dual(OPT_ARGS_NUM);
diff --git a/Geo/gmshFace.cpp b/Geo/gmshFace.cpp
index 85c9c9ada36fafe69c297ce39488b7ed1d72e0dc..9897d25ba685294708077bd704c0f5d0094652b0 100644
--- a/Geo/gmshFace.cpp
+++ b/Geo/gmshFace.cpp
@@ -1,4 +1,4 @@
-// $Id: gmshFace.cpp,v 1.61 2008-06-20 05:51:37 geuzaine Exp $
+// $Id: gmshFace.cpp,v 1.62 2008-06-20 11:50:00 geuzaine Exp $
 //
 // Copyright (C) 1997-2008 C. Geuzaine, J.-F. Remacle
 //
@@ -249,7 +249,7 @@ GEntity::GeomType gmshFace::geomType() const
 // by default we assume that straight lines are geodesics
 SPoint2 gmshFace::geodesic(const SPoint2 &pt1 , const SPoint2 &pt2 , double t)
 {
-  if(isSphere && CTX.geom.sphere_geodesic){
+  if(isSphere && CTX.mesh.second_order_experimental){
     // FIXME: this is buggy -- remove the CTX option once we do it in
     // a robust manner
     GPoint gp1 = point(pt1.x(), pt1.y());
diff --git a/Mesh/meshGRegion.cpp b/Mesh/meshGRegion.cpp
index 1bc78152c28895afa3096c66ff50b01392cc7ec9..09b80552a0a1aee3ddc0dc462ce04c64846b5323 100644
--- a/Mesh/meshGRegion.cpp
+++ b/Mesh/meshGRegion.cpp
@@ -1,4 +1,4 @@
-// $Id: meshGRegion.cpp,v 1.52 2008-06-12 12:23:29 geuzaine Exp $
+// $Id: meshGRegion.cpp,v 1.53 2008-06-20 11:50:00 geuzaine Exp $
 //
 // Copyright (C) 1997-2008 C. Geuzaine, J.-F. Remacle
 //
@@ -183,7 +183,7 @@ void TransferTetgenMesh(GRegion *gr, tetgenio &in, tetgenio &out,
                      v[j]->onWhat()->mesh_vertices.end(),
                      v[j]));
         MVertex *v1b;
-	if (CTX.mesh.order > 1){
+	if (CTX.mesh.order > 1 && CTX.mesh.second_order_experimental){
 	  // PARAMETRIC COORDINATES SHOULD BE SET for the vertex !!!!!!!!!!!!!
 	  // This is not 100 % safe yet, so we reserve that operation for high order
 	  // meshes.