diff --git a/Common/Context.h b/Common/Context.h
index f378299e51eaa21b2c981c9d28fa410926c83fd2..c14a3cbf5b76b1f2f4924345cf856589425b5cf9 100644
--- a/Common/Context.h
+++ b/Common/Context.h
@@ -172,7 +172,7 @@ public :
     double label_frequency;
     int point_type; // flat or 3D
     double point_size, line_width;
-    int optimize;
+    int optimize, refine_steps;
     int quality_type, label_type;
     double quality_inf, quality_sup, radius_inf, radius_sup;
     double scaling_factor, lc_factor, rand_factor, lc_integration_precision;
diff --git a/Common/DefaultOptions.h b/Common/DefaultOptions.h
index 057746aa2399d527d1f83bdf69610b9f5a865d35..4d33b58a370dfa0ef766b83e8a44cd812ba997b0 100644
--- a/Common/DefaultOptions.h
+++ b/Common/DefaultOptions.h
@@ -1007,6 +1007,8 @@ StringXNumber MeshOptions_Number[] = {
     "Only display elements whose longest edge is smaller than RadiusSup" },
   { F|O, "RandomFactor" , opt_mesh_rand_factor , 1.e-9 ,
     "Random factor used in 2D and 3D meshing algorithm (test other values when the algorithm fails)" },
+  { F|O, "RefineSteps" , opt_mesh_refine_steps , 10 ,
+    "Number of refinement steps in the MeshAdapt-based 2D algorithms" }, 
   { F|O, "RecombineAlgo" , opt_mesh_recombine_algo , 1 ,
     "Recombine algorithm (1=mixed triangles-quadrangles, 2=all quadrangles)" }, 
   { F|O, "ReverseAllNormals" , opt_mesh_reverse_all_normals , 0. , 
diff --git a/Common/Options.cpp b/Common/Options.cpp
index f750f3e9f8b3a698fbaece268c3e7e7b0a10f66c..e30d3d2bd5748ef3eb4a435a979438266181bf00 100644
--- a/Common/Options.cpp
+++ b/Common/Options.cpp
@@ -1,4 +1,4 @@
-// $Id: Options.cpp,v 1.358 2007-09-15 17:11:50 geuzaine Exp $
+// $Id: Options.cpp,v 1.359 2007-09-19 14:21:56 geuzaine Exp $
 //
 // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
 //
@@ -4206,6 +4206,13 @@ double opt_mesh_optimize(OPT_ARGS_NUM)
   return CTX.mesh.optimize;
 }
 
+double opt_mesh_refine_steps(OPT_ARGS_NUM)
+{
+  if(action & GMSH_SET)
+    CTX.mesh.refine_steps =(int) val;
+  return CTX.mesh.refine_steps;
+}
+
 double opt_mesh_normals(OPT_ARGS_NUM)
 {
   if(action & GMSH_SET) {
diff --git a/Common/Options.h b/Common/Options.h
index c0cb6754175cc886459b3826b304ba0e17a6085b..793c33033cf6c8506384d7755dee278740abf5ea 100644
--- a/Common/Options.h
+++ b/Common/Options.h
@@ -426,6 +426,7 @@ double opt_geometry_snap1(OPT_ARGS_NUM);
 double opt_geometry_snap2(OPT_ARGS_NUM);
 double opt_mesh_label_frequency(OPT_ARGS_NUM);
 double opt_mesh_optimize(OPT_ARGS_NUM);
+double opt_mesh_refine_steps(OPT_ARGS_NUM);
 double opt_mesh_normals(OPT_ARGS_NUM);
 double opt_mesh_tangents(OPT_ARGS_NUM);
 double opt_mesh_explode(OPT_ARGS_NUM);
diff --git a/Mesh/meshGFace.cpp b/Mesh/meshGFace.cpp
index 31f7deb689467b05e65e9c2ca50d15780b0f42b0..e407d139404c92639e72c6e812be377f074551a1 100644
--- a/Mesh/meshGFace.cpp
+++ b/Mesh/meshGFace.cpp
@@ -1,4 +1,4 @@
-// $Id: meshGFace.cpp,v 1.87 2007-09-12 20:14:34 geuzaine Exp $
+// $Id: meshGFace.cpp,v 1.88 2007-09-19 14:21:56 geuzaine Exp $
 //
 // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
 //
@@ -923,9 +923,9 @@ bool gmsh2DMeshGenerator ( GFace *gf , bool debug = true)
   // start mesh generation
   if (!AlgoDelaunay2D ( gf ))
     {
-      RefineMesh (gf,*m,10);
+      RefineMesh (gf,*m, CTX.mesh.refine_steps);
       OptimizeMesh(gf, *m, 2);
-      RefineMesh (gf,*m,-10);
+      RefineMesh (gf,*m, -CTX.mesh.refine_steps);
       OptimizeMesh(gf, *m, 2);
       if (gf->meshAttributes.recombine)
 	{
@@ -1466,9 +1466,9 @@ bool gmsh2DMeshGeneratorPeriodic ( GFace *gf , bool debug = true)
   
   if (!AlgoDelaunay2D ( gf ))
     {
-      RefineMesh (gf,*m,10);
+      RefineMesh (gf,*m,CTX.mesh.refine_steps);
       OptimizeMesh(gf, *m, 2);
-      RefineMesh (gf,*m,-10);
+      RefineMesh (gf,*m,-CTX.mesh.refine_steps);
       OptimizeMesh(gf, *m, 2);
 
       if (gf->meshAttributes.recombine)