diff --git a/Mesh/meshGFaceTransfinite.cpp b/Mesh/meshGFaceTransfinite.cpp
index 121effb6849610c39b23cf2ae599b54017042ea7..6a4c36bc392d6d69b75c6cd965bb5d6e75c24bca 100644
--- a/Mesh/meshGFaceTransfinite.cpp
+++ b/Mesh/meshGFaceTransfinite.cpp
@@ -1,4 +1,4 @@
-// $Id: meshGFaceTransfinite.cpp,v 1.1 2006-09-05 21:37:59 remacle Exp $
+// $Id: meshGFaceTransfinite.cpp,v 1.2 2006-09-06 10:25:24 remacle Exp $
 //
 // Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
@@ -176,22 +176,47 @@ int MeshTransfiniteSurface( GFace *gf)
 	}
     }
 
-
-  for (int IT = 0;IT< 5;IT++)
+  // elliptic smoother
+  for (int IT = 0;IT< 15;IT++)
     {
       for(int i = 1; i<L; i++) 
 	{
 	  for(int j = 1; j < H; j++) 
 	    {
-	      MVertex *v1 = tab[std::make_pair(i,j)];
-	      MVertex *v2 = tab[std::make_pair(i+1,j)];
-	      MVertex *v3 = tab[std::make_pair(i-1,j)];
-	      MVertex *v4 = tab[std::make_pair(i,j+1)];	  
-	      MVertex *v5 = tab[std::make_pair(i,j-1)];	  
+	      MVertex *v11 = tab[std::make_pair(i-1,j-1)];
+	      MVertex *v12 = tab[std::make_pair(i-1,j)];
+	      MVertex *v13 = tab[std::make_pair(i-1,j+1)];	      
+	      MVertex *v21 = tab[std::make_pair(i,j-1)];
+	      MVertex *v22 = tab[std::make_pair(i,j)];
+	      MVertex *v23 = tab[std::make_pair(i,j+1)];
+	      MVertex *v31 = tab[std::make_pair(i+1,j-1)];
+	      MVertex *v32 = tab[std::make_pair(i+1,j)];
+	      MVertex *v33 = tab[std::make_pair(i+1,j+1)];
 	      
-	      v1->x() = 0.25 * (v2->x() +v3->x() +v4->x() +v5->x());
-	      v1->y() = 0.25 * (v2->y() +v3->y() +v4->y() +v5->y());
-	      v1->z() = 0.25 * (v2->z() +v3->z() +v4->z() +v5->z());
+	      double alpha = 0.25 * (DSQR(v23->x() - v21->x()) +
+				     DSQR(v23->y() - v21->y()));
+	      double gamma = 0.25 * (DSQR(v32->x() - v12->x()) +
+				     DSQR(v32->y() - v12->y()));
+	      double beta = 0.0625 * ((v32->x() - v12->x()) *
+				      (v23->x() - v21->x()) +
+				      (v32->y() - v12->y()) *
+				      (v23->y() - v21->y()));
+	
+	      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);
 	    }
 	}
     }
diff --git a/benchmarks/2d/transf_complex.geo b/benchmarks/2d/transf_complex.geo
new file mode 100644
index 0000000000000000000000000000000000000000..d47fef2930525db0b4e800c0098f2138a5b9a2bc
--- /dev/null
+++ b/benchmarks/2d/transf_complex.geo
@@ -0,0 +1,46 @@
+Point(1) = {0,0,0,0.1};
+Point(2) = {1,0,0,0.1};
+Point(3) = {2,0,0,0.1};
+Point(4) = {3,0,0,0.1};
+Point(5) = {4,0,0,0.1};
+Point(6) = {1,1,0,0.1};
+Point(7) = {4,1,0,0.1};
+Point(8) = {5,0,0,0.1};
+Point(9) = {-1,0,0,0.1};
+Point(10) = {6,0,0,0.1};
+Point(11) = {6,4,0,0.1};
+Point(12) = {0,4,0,0.1};
+Point(13) = {-1,4,0,0.1};
+
+Point(14) = {1,4,0,0.1};
+Point(15) = {2,4,0,0.1};
+Point(16) = {3,4,0,0.1};
+Point(17) = {4,4,0,0.1};
+Point(18) = {5,4,0,0.1};
+Point(19) = {2,3,0,0.1};
+Point(20) = {1,3,0,0.1};
+Point(21) = {8.25,1.8,0,0.1};
+Point(22) = {5,3,0,0.1};
+Circle(1) = {3,2,6};
+Circle(2) = {6,2,1};
+Circle(3) = {8,5,7};
+Circle(4) = {7,5,4};
+Point(23) = {4,3,0,0.1};
+Circle(5) = {18,17,23};
+Circle(6) = {23,17,16};
+Circle(7) = {15,14,20};
+Circle(8) = {20,14,12};
+Line(9) = {1,9};
+Line(10) = {9,13};
+Line(11) = {13,12};
+Line(12) = {15,16};
+Line(13) = {18,11};
+Line(14) = {11,10};
+Line(15) = {10,8};
+Line(16) = {4,3};
+Line Loop(17) = {14,15,3,4,16,1,2,9,10,11,-8,-7,12,-6,-5,13};
+Plane Surface(18) = {17};
+Transfinite Line {14,10} = 50 Using Bump 0.3;
+Transfinite Line {11,8,7,12,6,5,13,15,3,4,16,1,2,9} = 30 Using Progression 1;
+Transfinite Surface {18} = {9,13,11,10};
+Recombine Surface {18};