diff --git a/Common/CommandLine.cpp b/Common/CommandLine.cpp
index 4ed07b1e088043ced537a185f0c6cb76e4c1f83b..ab81e39ddfc82e28fcd98cf0d09b43507c353e04 100644
--- a/Common/CommandLine.cpp
+++ b/Common/CommandLine.cpp
@@ -69,9 +69,10 @@ void PrintUsage(const char *name)
   Msg::Direct("  -numsubedges          Set the number of subdivisions when displaying high order elements");  
   Msg::Direct("  -algo string          Select mesh algorithm (meshadapt, del2d, front2d, del3d, front3d)");
   Msg::Direct("  -smooth int           Set number of mesh smoothing steps");
-  Msg::Direct("  -optimize[_netgen]    Optimize quality of tetrahedral elements");
   Msg::Direct("  -order int            Set mesh order (1, ..., 5)");
+  Msg::Direct("  -optimize[_netgen]    Optimize quality of tetrahedral elements");
   Msg::Direct("  -optimize_hom         Optimize higher order meshes (in 2D)");
+  Msg::Direct("  -optimize_lloyd       Optimize 2D meshes using Lloyd algorithm");
   Msg::Direct("  -clscale float        Set characteristic length scaling factor");
   Msg::Direct("  -clmin float          Set minimum characteristic length");
   Msg::Direct("  -clmax float          Set maximum characteristic length");
@@ -227,6 +228,14 @@ void GetOptions(int argc, char *argv[])
         CTX::instance()->mesh.optimizeNetgen = 1;
         i++;
       }
+      else if(!strcmp(argv[i] + 1, "optimize_hom")) {
+        i++;
+        opt_mesh_smooth_internal_edges(0, GMSH_SET, 1);
+      }
+      else if(!strcmp(argv[i] + 1, "optimize_lloyd")) {
+        i++;
+        CTX::instance()->mesh.optimizeLloyd = 1;
+      }
       else if(!strcmp(argv[i] + 1, "nopopup")) {
         CTX::instance()->noPopup = 1;
         i++;
@@ -443,10 +452,6 @@ void GetOptions(int argc, char *argv[])
         else
           Msg::Fatal("Missing argument");
       }
-      else if(!strcmp(argv[i] + 1, "optimize_hom")) {
-        i++;
-        opt_mesh_smooth_internal_edges(0, GMSH_SET, 1);
-      }
       else if(!strcmp(argv[i] + 1, "format") || !strcmp(argv[i] + 1, "f")) {
         i++;
         if(argv[i]) {
diff --git a/Common/Context.cpp b/Common/Context.cpp
index 26b21abfd51e1a6b4868d780ad728b6c253eec03..0906ce556cca1c7183dbf088e8e15fcec1a5cdc1 100644
--- a/Common/Context.cpp
+++ b/Common/Context.cpp
@@ -80,6 +80,7 @@ CTX::CTX()
   numWindows = numTiles = 1;
   deltaFontSize = 0;
   recentFiles.resize(5);
+  mesh.optimizeLloyd = 0;
 }
 
 CTX *CTX::_instance = 0;
diff --git a/Common/Context.h b/Common/Context.h
index 0658b032cb046d1c5f8eb98b3eaf9ed342736361..45c61735ea4b7b6a17bb1237cb15d60b1668c390 100644
--- a/Common/Context.h
+++ b/Common/Context.h
@@ -17,8 +17,8 @@ struct contextMeshOptions {
   int draw, changed, light, lightTwoSide, lightLines, pointType;
   int points, lines, triangles, quadrangles, tetrahedra, hexahedra, prisms, pyramids;
   int surfacesEdges, surfacesFaces, volumesEdges, volumesFaces, numSubEdges;
-  int pointsNum, linesNum, surfacesNum, volumesNum;
-  int optimize, optimizeNetgen, refineSteps, qualityType, labelType, remove4triangles;
+  int pointsNum, linesNum, surfacesNum, volumesNum, qualityType, labelType;
+  int optimize, optimizeNetgen, optimizeLloyd, refineSteps, remove4triangles;
   double normals, tangents, explode, angleSmoothNormals, allowSwapEdgeAngle;
   double mshFileVersion, mshFilePartitioned, labelFrequency, pointSize, lineWidth;
   double qualityInf, qualitySup, radiusInf, radiusSup;
diff --git a/Mesh/Generator.cpp b/Mesh/Generator.cpp
index d80371fd3834ec398a219605ccf59c465708d75e..7728ca5a792f4438a6664f15345eba91b30d4106 100644
--- a/Mesh/Generator.cpp
+++ b/Mesh/Generator.cpp
@@ -419,16 +419,14 @@ static void Mesh2D(GModel *m)
     std::for_each(classFaces.begin(), classFaces.end(), meshGFace());
     std::for_each(compFaces.begin(), compFaces.end(), meshGFace());
 
-    //lloyd optimization
-    if (CTX::instance()->mesh.optimize > 0 ){
+    // lloyd optimization
+    if (CTX::instance()->mesh.optimizeLloyd){
       for(GModel::fiter it = m->firstFace(); it != m->lastFace(); ++it){
 	GFace *gf = *it;
 	int recombine = gf->meshAttributes.recombine;
 	Msg::Info("Lloyd optimization for face %d", gf->tag());
-	gf->lloyd(40,recombine);
-	
-	if(recombine) recombineIntoQuads(gf);   
-
+	gf->lloyd(40, recombine);
+	if(recombine) recombineIntoQuads(gf);
       }
     }
 
diff --git a/Mesh/meshGFace.cpp b/Mesh/meshGFace.cpp
index 158f6df89599c736ec4afdd7189c58998d09845f..e20c319fb853be716e9de16316d354af41a19fa4 100644
--- a/Mesh/meshGFace.cpp
+++ b/Mesh/meshGFace.cpp
@@ -674,9 +674,8 @@ static bool meshGenerator(GFace *gf, int RECUR_ITER,
   // delete the mesh
   delete m;
 
-  if(gf->meshAttributes.recombine && CTX::instance()->mesh.optimize == 0){
-    recombineIntoQuads(gf);   
-  }
+  if(gf->meshAttributes.recombine && !CTX::instance()->mesh.optimizeLloyd)
+    recombineIntoQuads(gf);
 
   computeElementShapes(gf, gf->meshStatistics.worst_element_shape,
                        gf->meshStatistics.average_element_shape,
@@ -1218,8 +1217,8 @@ static bool meshGeneratorPeriodic(GFace *gf, bool debug = true)
   // delete the mesh  
   delete m;
 
- if(gf->meshAttributes.recombine && CTX::instance()->mesh.optimize == 0)
-    recombineIntoQuads(gf);   
+ if(gf->meshAttributes.recombine && !CTX::instance()->mesh.optimizeLloyd)
+    recombineIntoQuads(gf);
  
   computeElementShapes(gf, gf->meshStatistics.worst_element_shape,
                        gf->meshStatistics.average_element_shape,