diff --git a/Mesh/meshGFaceTransfinite.cpp b/Mesh/meshGFaceTransfinite.cpp
index 77e16e3406c45f0508b7df86040fd71d270cd758..770cd8cc05329f05e18ab896f5d0841289ad3843 100644
--- a/Mesh/meshGFaceTransfinite.cpp
+++ b/Mesh/meshGFaceTransfinite.cpp
@@ -285,119 +285,78 @@ int MeshTransfiniteSurface(GFace *gf)
     }
   }  
 
-  // elliptic smoother (don't apply this by default)
-  if(corners.size() == 4){
-    int numSmooth = 0;
-    if(gf->meshAttributes.transfiniteSmoothing < 0 && CTX.mesh.nb_smoothing > 1)
-      numSmooth = CTX.mesh.nb_smoothing;
-    else if(gf->meshAttributes.transfiniteSmoothing > 0)
-      numSmooth = gf->meshAttributes.transfiniteSmoothing;
-    for (int IT = 0; IT < numSmooth; IT++){
+  // should we smooth the meshing using an elliptic smoother?
+  int numSmooth = 0;
+  if(gf->meshAttributes.transfiniteSmoothing < 0 && CTX.mesh.nb_smoothing > 1)
+    numSmooth = CTX.mesh.nb_smoothing;
+  else if(gf->meshAttributes.transfiniteSmoothing > 0)
+    numSmooth = gf->meshAttributes.transfiniteSmoothing;
+
+  if(corners.size() == 4 && numSmooth){
+    std::vector<std::vector<double> > u(L + 1), v(L + 1);
+    for(int i = 0; i <= L; i++){
+      u[i].resize(H + 1);
+      v[i].resize(H + 1);
+    }
+    for(int i = 0; i <= L; i++){
+      for(int j = 0; j <= H; j++){ 
+        int iP1 = N1 + i;
+        int iP2 = N2 + j;
+        int iP3 = N4 - i;
+        int iP4 = (N4 + (N3 - N2) - j) % m_vertices.size();
+        if(j == 0)     { u[i][j] = U[iP1]; v[i][j] = V[iP1]; }
+        else if(i == L){ u[i][j] = U[iP2]; v[i][j] = V[iP2]; }
+        else if(j == H){ u[i][j] = U[iP3]; v[i][j] = V[iP3]; }
+        else if(i == 0){ u[i][j] = U[iP4]; v[i][j] = V[iP4]; }
+        else{
+          tab[i][j]->getParameter(0, u[i][j]);
+          tab[i][j]->getParameter(1, v[i][j]);
+        }
+      }
+    }
+    for(int IT = 0; IT < numSmooth; IT++){
       for(int i = 1; i < L; i++){
         for(int j = 1; j < H; j++){
-
-          // TEST SMOOTHING PARAM COORD : we need to store the param
-          // coord in a separate array, as we need to compute them for
-          // the MEdgeVertices too! -- need to use
-          // reparamOnFace(gf, t)
-          /*
-          double uv[2][9];
-          for(int ii = 0; ii < 2; ii++){
-            tab[i - 1][j - 1]->getParameter(ii, uv[ii][0]);
-            tab[i - 1][j    ]->getParameter(ii, uv[ii][1]);
-            tab[i - 1][j + 1]->getParameter(ii, uv[ii][2]);           
-            tab[i    ][j - 1]->getParameter(ii, uv[ii][3]);
-            tab[i    ][j    ]->getParameter(ii, uv[ii][4]);
-            tab[i    ][j + 1]->getParameter(ii, uv[ii][5]);
-            tab[i + 1][j - 1]->getParameter(ii, uv[ii][6]);
-            tab[i + 1][j    ]->getParameter(ii, uv[ii][7]);
-            tab[i + 1][j + 1]->getParameter(ii, uv[ii][8]);
-          }
-          double alpha = 0.25 * (SQU(uv[0][5] - uv[0][3]) +
-                                 SQU(uv[1][5] - uv[1][3])) ;
-          double gamma = 0.25 * (SQU(uv[0][7] - uv[0][1]) +
-                                 SQU(uv[1][7] - uv[1][1]));
-          double beta = 0.0625 * ((uv[0][7] - uv[0][1]) * (uv[0][5] - uv[0][3]) +
-                                  (uv[1][7] - uv[1][1]) * (uv[1][5] - uv[1][3]));
-
-          double u = 0.5 * (alpha * (uv[0][7] + uv[0][1]) + 
-                            gamma * (uv[0][5] + uv[0][3]) -
-                            2. * beta * (uv[0][8] - uv[0][2] - uv[0][6] + uv[0][0]))
-            / (alpha + gamma);
-          double v = 0.5 * (alpha * (uv[1][7] + uv[1][1]) + 
-                            gamma * (uv[1][5] + uv[1][3]) -
-                            2. * beta * (uv[1][8] - uv[1][2] - uv[1][6] + uv[1][0]))
-            / (alpha + gamma);
-          GPoint p = gf->point(SPoint2(u, v));
-          tab[i][j]->x() = p.x();
-          tab[i][j]->y() = p.y();
-          tab[i][j]->z() = p.z();
-          tab[i][j]->setParameter(0, u);
-          tab[i][j]->setParameter(1, v);
-          */
-
-          MVertex *v11 = tab[i - 1][j - 1];
-          MVertex *v12 = tab[i - 1][j    ];
-          MVertex *v13 = tab[i - 1][j + 1];           
-          MVertex *v21 = tab[i    ][j - 1];
-          MVertex *v22 = tab[i    ][j    ];
-          MVertex *v23 = tab[i    ][j + 1];
-          MVertex *v31 = tab[i + 1][j - 1];
-          MVertex *v32 = tab[i + 1][j    ];
-          MVertex *v33 = tab[i + 1][j + 1];
-          double alpha = 0.25 * (SQU(v23->x() - v21->x()) +
-                                 SQU(v23->y() - v21->y()) +
-                                 SQU(v23->z() - v21->z()));
-          double gamma = 0.25 * (SQU(v32->x() - v12->x()) +
-                                 SQU(v32->y() - v12->y()) +
-                                 SQU(v32->z() - v12->z()));
-          double beta = 0.0625 * ((v32->x() - v12->x()) * (v23->x() - v21->x()) +
-                                  (v32->y() - v12->y()) * (v23->y() - v21->y()) +
-                                  (v32->z() - v12->z()) * (v23->z() - v21->z()));
-          v22->x() = 0.5 * (alpha * (v32->x() + v12->x()) + 
-                            gamma * (v23->x() + v21->x()) -
-                            2. * beta * (v33->x() - v13->x() - 
-                                         v31->x() + v11->x())) / (alpha + gamma);
-          v22->y() = 0.5 * (alpha * (v32->y() + v12->y()) +
-                            gamma * (v23->y() + v21->y()) -
-                            2. * beta * (v33->y() - v13->y() -
-                                         v31->y() + v11->y())) / (alpha + gamma);
-          v22->z() = 0.5 * (alpha * (v32->z() + v12->z()) +
-                            gamma * (v23->z() + v21->z()) -
-                            2. * beta * (v33->z() - v13->z() -
-                                         v31->z() + v11->z())) / (alpha + gamma);
-
-          if(IT ==  numSmooth - 1 && gf->geomType() != GEntity::Plane){
-            double init[2] = {0.5, 0.5}; // this is bad
-            GPoint p = gf->closestPoint(v22->point(), init);
-            v22->x() = p.x();
-            v22->y() = p.y();
-            v22->z() = p.z();
-          }
-
+          double alpha = 0.25 * (SQU(u[i][j + 1] - u[i][j - 1]) +
+                                 SQU(v[i][j + 1] - v[i][j - 1])) ;
+          double gamma = 0.25 * (SQU(u[i + 1][j] - u[i - 1][j]) +
+                                 SQU(v[i + 1][j] - v[i - 1][j]));
+          double beta = 0.0625 * 
+            ((u[i + 1][j] - u[i - 1][j]) * (u[i][j + 1] - u[i][j - 1]) +
+             (v[i + 1][j] - v[i - 1][j]) * (v[i][j + 1] - v[i][j - 1]));
+          u[i][j] = 0.5 * 
+            (alpha * (u[i + 1][j] + u[i - 1][j]) + 
+             gamma * (u[i][j + 1] + u[i][j - 1]) -
+             2. * beta * (u[i + 1][j + 1] - u[i - 1][j + 1] - 
+                          u[i + 1][j - 1] + u[i - 1][j - 1])) / (alpha + gamma);
+          v[i][j] = 0.5 * 
+            (alpha * (v[i + 1][j] + v[i - 1][j]) + 
+             gamma * (v[i][j + 1] + v[i][j - 1]) -
+             2. * beta * (v[i + 1][j + 1] - v[i - 1][j + 1] - 
+                          v[i + 1][j - 1] + v[i - 1][j - 1])) / (alpha + gamma);
         }
       }
     }
-
-    // recompute corresponding u,v coordinates (necessary e.g. for 2nd order algo)
     for(int i = 1; i < L; i++){
       for(int j = 1; j < H; j++){
-        MVertex *v = tab[i][j];
-        SPoint2 param = gf->parFromPoint(SPoint3(v->x(), v->y(), v->z()));
-        v->setParameter(0, param[0]);
-        v->setParameter(1, param[1]);
+        GPoint p = gf->point(SPoint2(u[i][j], v[i][j]));
+        tab[i][j]->x() = p.x();
+        tab[i][j]->y() = p.y();
+        tab[i][j]->z() = p.z();
+        tab[i][j]->setParameter(0, u[i][j]);
+        tab[i][j]->setParameter(1, v[i][j]);
       }
     }
   }
 
+  // create elements
   if(corners.size() == 4){ 
-    // create elements
     for(int i = 0; i < L ; i++){
       for(int j = 0; j < H; j++){
-        MVertex *v1 = tab[i    ][j    ];
-        MVertex *v2 = tab[i + 1][j    ];
+        MVertex *v1 = tab[i][j];
+        MVertex *v2 = tab[i + 1][j];
         MVertex *v3 = tab[i + 1][j + 1];
-        MVertex *v4 = tab[i    ][j + 1];
+        MVertex *v4 = tab[i][j + 1];
         if(gf->meshAttributes.recombine)
           gf->quadrangles.push_back(new MQuadrangle(v1, v2, v3, v4));
         else if(gf->meshAttributes.transfiniteArrangement == 1 ||
@@ -416,17 +375,17 @@ int MeshTransfiniteSurface(GFace *gf)
   }
   else{      
     for(int j = 0; j < H; j++){
-      MVertex *v1 = tab[0    ][0    ];
-      MVertex *v2 = tab[1    ][j    ];
-      MVertex *v3 = tab[1    ][j + 1];
+      MVertex *v1 = tab[0][0];
+      MVertex *v2 = tab[1][j];
+      MVertex *v3 = tab[1][j + 1];
       gf->triangles.push_back(new MTriangle(v1, v2, v3));
     }
     for(int i = 1; i < L ; i++){
       for(int j = 0; j < H; j++){
-        MVertex *v1 = tab[i    ][j    ];
-        MVertex *v2 = tab[i + 1][j    ];
+        MVertex *v1 = tab[i][j];
+        MVertex *v2 = tab[i + 1][j];
         MVertex *v3 = tab[i + 1][j + 1];
-        MVertex *v4 = tab[i    ][j + 1];
+        MVertex *v4 = tab[i][j + 1];
         if(gf->meshAttributes.recombine)
           gf->quadrangles.push_back(new MQuadrangle(v1, v2, v3, v4));
         else if(gf->meshAttributes.transfiniteArrangement == 1 ||
diff --git a/doc/TODO.txt b/doc/TODO.txt
index 68fe2c0a6c5a4ce1e7cf2fe8fc9c1b22e665b8a2..d35b4365922bf00fd9f3f9ac633011a9ebae1ed1 100644
--- a/doc/TODO.txt
+++ b/doc/TODO.txt
@@ -1,4 +1,10 @@
-$Id: TODO.txt,v 1.8 2008-10-12 14:57:58 geuzaine Exp $
+$Id: TODO.txt,v 1.9 2008-11-04 18:21:43 geuzaine Exp $
+
+********************************************************************
+
+Introduce keyword "All" or "*" in ListOfShapes so that we can apply an
+operator (e.g Recombine) on all defined entities (instead of doing
+"{1:N}")
 
 ********************************************************************