diff --git a/Geo/ExtrudeParams.cpp b/Geo/ExtrudeParams.cpp
index 06a078af9c7d0a2eefc3df390b755a3f1e8dbe27..79aa972a2d51e65a1e40b662cf92f8b5cd7a51ce 100644
--- a/Geo/ExtrudeParams.cpp
+++ b/Geo/ExtrudeParams.cpp
@@ -1,4 +1,4 @@
-// $Id: ExtrudeParams.cpp,v 1.19 2006-11-25 16:52:43 geuzaine Exp $
+// $Id: ExtrudeParams.cpp,v 1.20 2006-11-26 19:30:23 geuzaine Exp $
 //
 // Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
@@ -44,7 +44,6 @@ ExtrudeParams::ExtrudeParams(int ModeEx)
   mesh.Recombine = false;
 }
 
-
 void ExtrudeParams::fill(int type,
                          double T0, double T1, double T2,
                          double A0, double A1, double A2,
diff --git a/Mesh/meshGFaceExtruded.cpp b/Mesh/meshGFaceExtruded.cpp
index 36ad48b5264cd9c02c24a194de707f2f61d40998..1ade00cc354edf386b8d1d681217f37c9e652eab 100644
--- a/Mesh/meshGFaceExtruded.cpp
+++ b/Mesh/meshGFaceExtruded.cpp
@@ -1,4 +1,4 @@
-// $Id: meshGFaceExtruded.cpp,v 1.2 2006-11-26 16:24:04 geuzaine Exp $
+// $Id: meshGFaceExtruded.cpp,v 1.3 2006-11-26 19:30:23 geuzaine Exp $
 //
 // Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
@@ -31,6 +31,30 @@
 #include "Context.h"
 #include "Message.h"
 
+int extrudeVertex(GFace *gf, MVertex *v)
+{
+  ExtrudeParams *ep = gf->meshAttributes.extrude;
+  for(int i = 0; i < ep->mesh.NbLayer; i++) {
+    for(int j = 1; j < ep->mesh.NbElmLayer[i]; j++) {
+      double x = v->x(), y = v->y(), z = v->z();
+      ep->Extrude(i, j, x, y, z);
+      gf->mesh_vertices.push_back(new MVertex(x, y, z, gf));
+    }
+  }
+}
+
+int copyMesh(GFace *gf, GFace *from)
+{
+  ExtrudeParams *ep = gf->meshAttributes.extrude;
+  for(unsigned int i = 0; i < from->mesh_vertices.size(); i++){
+    MVertex *v = from->mesh_vertices[i];
+    double x = v->x(), y = v->y(), z = v->z();
+    ep->Extrude(ep->mesh.NbLayer - 1, ep->mesh.NbElmLayer[ep->mesh.NbLayer - 1], 
+		x, y, z);
+    gf->mesh_vertices.push_back(new MVertex(x, y, z, gf));
+  }
+}
+
 int MeshExtrudedSurface(GFace *gf)
 {
   ExtrudeParams *ep = gf->meshAttributes.extrude;
@@ -40,32 +64,18 @@ int MeshExtrudedSurface(GFace *gf)
 
   if(ep->geo.Mode == EXTRUDED_ENTITY) {
     // extruded from a curve
-    GEdge *ge = gf->model()->edgeByTag(ep->geo.Source);
-    if(!ge) return 0;
-    for(unsigned int i = 0; i < ge->mesh_vertices.size(); i++) {
-      //printf("extruding vertex %d\n", i);
-    }
-    /*
-    c = FindCurve(abs(ep->geo.Source));
-    if(!c)
-      return false;
-    for(int i = 0; i < List_Nbr(c->Vertices); i++) {
-      List_Read(c->Vertices, i, &v1);
-      Extrude_Vertex(&v1, NULL);
-    }
-    Extrude_Curve(&c, NULL);
-    */
+    GEdge *e = gf->model()->edgeByTag(std::abs(ep->geo.Source));
+    if(!e) return 0;
+    for(unsigned int i = 0; i < e->mesh_vertices.size(); i++)
+      extrudeVertex(gf, e->mesh_vertices[i]);
+    // get bounding edges and create quads/tris
   }
   else {
     // copy of a surface ("chapeau")
-    /*
-    source = FindSurface(ep->geo.Source);
-    if(!source)
-      return false;
-    copy_mesh(ss, s);
-    */
+    GFace *f = gf->model()->faceByTag(std::abs(ep->geo.Source));
+    if(!f) return 0;
+    copyMesh(gf, f);
   }
 
   return 1;
 }
-  
diff --git a/Mesh/meshGFaceTransfinite.cpp b/Mesh/meshGFaceTransfinite.cpp
index 3e54924726f3c597534521e5eec5276ef3c7a1a6..5abfb6f3e553132d4fa42eceecb74ee2b024f04b 100644
--- a/Mesh/meshGFaceTransfinite.cpp
+++ b/Mesh/meshGFaceTransfinite.cpp
@@ -1,4 +1,4 @@
-// $Id: meshGFaceTransfinite.cpp,v 1.5 2006-11-26 16:24:04 geuzaine Exp $
+// $Id: meshGFaceTransfinite.cpp,v 1.6 2006-11-26 19:30:23 geuzaine Exp $
 //
 // Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
@@ -93,6 +93,8 @@ int MeshTransfiniteSurface( GFace *gf)
   int Lb = N4 - N3;
   int Hb = m_vertices.size() - N4;
 
+  // FIXME need to reimplement 3-side transfinite interpolation!
+
   if(Lb != L || Hb != H){
     Msg(GERROR,"Surface %d cannot be meshed using the transfinite algo", gf->tag());
     return 0;