diff --git a/Mesh/Generator.cpp b/Mesh/Generator.cpp
index 207266daca779070057a12316c6cf814f5f2e465..634023b92a6ad144f554dad1fc2f8474ca912e40 100644
--- a/Mesh/Generator.cpp
+++ b/Mesh/Generator.cpp
@@ -567,6 +567,22 @@ void AdaptMesh(GModel *m)
   Msg::StatusBar(2, true, "Done adaptating 3D mesh (%g s)", t2 - t1);
 }
 
+void RecombineMesh(GModel *m)
+{
+  Msg::StatusBar(2, true, "Recombining 2D mesh...");
+  double t1 = Cpu();
+  
+  for(GModel::fiter it = m->firstFace(); it != m->lastFace(); ++it){
+    GFace *gf = *it;
+    recombineIntoQuads(gf);
+  }
+
+  CTX::instance()->mesh.changed = ENT_ALL;
+
+  double t2 = Cpu();
+  Msg::StatusBar(2, true, "Done recombining 2D mesh (%g s)", t2 - t1);
+}
+
 void GenerateMesh(GModel *m, int ask)
 {
   if(CTX::instance()->lock) {
diff --git a/Mesh/Generator.h b/Mesh/Generator.h
index 135b70c229d4e273d447416f889b58d171879672..40f808322d930aa04768b0bc874e6ad645f99ac3 100644
--- a/Mesh/Generator.h
+++ b/Mesh/Generator.h
@@ -15,5 +15,6 @@ void OptimizeMesh(GModel *m);
 void OptimizeMeshNetgen(GModel *m);
 void RefineMesh(GModel *m, bool linear, bool splitIntoQuads=false,
                 bool splitIntoHexas=false);
+void RecombineMesh(GModel *m);
 
 #endif
diff --git a/Mesh/meshGFaceOptimize.cpp b/Mesh/meshGFaceOptimize.cpp
index a860fe5c74d72ee1d5ac77a2e862f525d1a3399d..f0503c57a43cd7e1dbeac32415fea1de20d270b4 100644
--- a/Mesh/meshGFaceOptimize.cpp
+++ b/Mesh/meshGFaceOptimize.cpp
@@ -1842,57 +1842,66 @@ void recombineIntoQuads(GFace *gf,
 			bool topologicalOpti,
 			bool nodeRepositioning)
 {
-
   double t1 = Cpu();
 
+  bool haveParam = true;
+  if(gf->geomType() == GEntity::DiscreteSurface && !gf->getCompound())
+    haveParam = false;
+
   gf->model()->writeMSH("before.msh");
-  if (topologicalOpti)removeFourTrianglesNodes(gf, false);
-  int success = _recombineIntoQuads(gf,0);
-  //  gf->addLayersOfQuads(1, 0);
+  if(haveParam && topologicalOpti)
+    removeFourTrianglesNodes(gf, false);
+
+  int success = _recombineIntoQuads(gf, 0);
+
+  // gf->addLayersOfQuads(1, 0);
+
   gf->model()->writeMSH("raw.msh");
-  if (nodeRepositioning)  
-    laplaceSmoothing(gf,CTX::instance()->mesh.nbSmoothing);
+  if(haveParam && nodeRepositioning)  
+    laplaceSmoothing(gf, CTX::instance()->mesh.nbSmoothing);
 
-    //blossom-quad algo
+  // blossom-quad algo
   if(success && CTX::instance()->mesh.algoRecombine == 1){    
-    if (topologicalOpti){
-      gf->model()->writeMSH("smoothed.msh");
-      int COUNT = 0;
-      char NAME[256];
-      while(1){
-	int x = removeTwoQuadsNodes(gf);
-	if(x){ sprintf(NAME,"iter%dTQ.msh",COUNT++); gf->model()->writeMSH(NAME);}
-	int y= removeDiamonds(gf);
-	if(y){ sprintf(NAME,"iter%dD.msh",COUNT++); gf->model()->writeMSH(NAME); }
-	laplaceSmoothing(gf);
-	int  z = 0 ;//edgeSwapQuadsForBetterQuality ( gf );
-	if(z){ sprintf(NAME,"iter%dS.msh",COUNT++); gf->model()->writeMSH(NAME); }
-	if (!(x+y+z))break;
+    if(topologicalOpti){
+      if(haveParam){
+        gf->model()->writeMSH("smoothed.msh");
+        int COUNT = 0;
+        char NAME[256];
+        while(1){
+          int x = removeTwoQuadsNodes(gf);
+          if(x){ sprintf(NAME,"iter%dTQ.msh",COUNT++); gf->model()->writeMSH(NAME);}
+          int y = removeDiamonds(gf);
+          if(y){ sprintf(NAME,"iter%dD.msh",COUNT++); gf->model()->writeMSH(NAME); }
+          laplaceSmoothing(gf);
+          int z = 0; //edgeSwapQuadsForBetterQuality(gf);
+          if(z){ sprintf(NAME,"iter%dS.msh",COUNT++); gf->model()->writeMSH(NAME); }
+          if (!(x+y+z)) break;
+        }
       }
-      edgeSwapQuadsForBetterQuality ( gf );
+      edgeSwapQuadsForBetterQuality(gf);
       //if(z){ sprintf(NAME,"iter%dS.msh",COUNT++); gf->model()->writeMSH(NAME); }
-      laplaceSmoothing(gf,CTX::instance()->mesh.nbSmoothing);
+      if(haveParam) laplaceSmoothing(gf,CTX::instance()->mesh.nbSmoothing);
     }
     double t2 = Cpu();
     Msg::Info("Blossom recombination algorithm completed (%g s)", t2 - t1);
     return;
   }
 
-    //simple recombination algo
-  _recombineIntoQuads(gf,0);
-  laplaceSmoothing(gf,CTX::instance()->mesh.nbSmoothing);
-  _recombineIntoQuads(gf,0);
-  laplaceSmoothing(gf,CTX::instance()->mesh.nbSmoothing);
+  // simple recombination algo
+  _recombineIntoQuads(gf, 0);
+  if(haveParam) laplaceSmoothing(gf, CTX::instance()->mesh.nbSmoothing);
+  _recombineIntoQuads(gf, 0);
+  if(haveParam)  laplaceSmoothing(gf, CTX::instance()->mesh.nbSmoothing);
+
   //  gf->model()->writeMSH("after.msh");
 
   double t2 = Cpu();
   Msg::Info("Simple recombination algorithm completed (%g s)", t2 - t1);
-
 }
 
-
 // give it a try : add one quad layer on the 
-void addOneLayerOnContour(GFace *gf, GVertex *gv){
+void addOneLayerOnContour(GFace *gf, GVertex *gv)
+{
   /*
 , int nbLayers, double hplus, double factor){
   // for each vertex
@@ -1985,7 +1994,8 @@ void addOneLayerOnContour(GFace *gf, GVertex *gv){
   */
 }
 
-void quadsToTriangles(GFace *gf, double minqual = -10000.){
+void quadsToTriangles(GFace *gf, double minqual = -10000.)
+{
   std::vector<MQuadrangle*> qds;
   for (int i=0;i<gf->quadrangles.size();i++){
     MQuadrangle *q = gf->quadrangles[i];
@@ -2023,8 +2033,8 @@ void quadsToTriangles(GFace *gf, double minqual = -10000.){
   gf->quadrangles = qds;
 }    
 
-void recombineIntoQuadsIterative(GFace *gf){
-  
+void recombineIntoQuadsIterative(GFace *gf)
+{
   recombineIntoQuads(gf);
   quadsToTriangles(gf,0.03);    
   return;