diff --git a/Mesh/3D_Extrude.cpp b/Mesh/3D_Extrude.cpp
index a5d088827f1fc89c21017e20b192a72d2cc3d62e..b30fdedb8b3b00f7d8a53df29a20dd974171f97b 100644
--- a/Mesh/3D_Extrude.cpp
+++ b/Mesh/3D_Extrude.cpp
@@ -1,4 +1,4 @@
-// $Id: 3D_Extrude.cpp,v 1.34 2001-08-15 07:00:44 geuzaine Exp $
+// $Id: 3D_Extrude.cpp,v 1.35 2001-08-15 08:16:30 geuzaine Exp $
 
 #include "Gmsh.h"
 #include "Numeric.h"
@@ -104,6 +104,15 @@ List_T* getnxl(Vertex *v, int dim){
   return 0;
 }
 
+void Free_ExtrudedPoints(List_T* Extruded_Points){
+  nxl *NXL;
+  for(int i=0; i<List_Nbr(Extruded_Points); i++){
+    NXL = (nxl*)List_Pointer(Extruded_Points, i);
+    List_Delete(NXL->List);
+  }
+  List_Delete(Extruded_Points);
+}
+
 typedef struct{
   int a, b;
 }nxn;
@@ -804,7 +813,7 @@ int Extrude_Mesh (Volume * v){
 }
 
 int Extrude_Mesh (Tree_T * Volumes){
-  int i, j, doit=0, reco=0;
+  int i, j, extrude=0, recombine=0;
   Surface *s;
   Vertex *v1;
   List_T *list;
@@ -812,14 +821,16 @@ int Extrude_Mesh (Tree_T * Volumes){
   InitExtrude ();
   DIM = 3;
 
+  Msg(STATUS2, "Mesh 3D... (initial)");
+
   List_T *vol = Tree2List(Volumes);
 
   for (int ivol = 0; ivol < List_Nbr(vol); ivol++){
     List_Read(vol, ivol, &THEV);
     ep = THEV->Extrude;
     if(ep && ep->mesh.ExtrudeMesh && ep->geo.Mode == EXTRUDED_ENTITY){
-      doit = 1;
-      if(ep->mesh.Recombine) reco = 1;
+      extrude = 1;
+      if(ep->mesh.Recombine) recombine = 1;
       for (i = 0; i < List_Nbr (THEV->Surfaces); i++){
 	List_Read (THEV->Surfaces, i, &s);
 	list = Tree2List (s->Vertices);
@@ -831,7 +842,7 @@ int Extrude_Mesh (Tree_T * Volumes){
       }
     }
   }
-  if(!doit) return false;
+  if(!extrude) return false;
 
   for (int ivol = 0; ivol < List_Nbr (vol); ivol++){
     List_Read(vol, ivol, &THEV);
@@ -839,11 +850,14 @@ int Extrude_Mesh (Tree_T * Volumes){
     NUM = THEV->Num;
     if(ep && ep->mesh.ExtrudeMesh && ep->geo.Mode == EXTRUDED_ENTITY){
       s = FindSurface (ep->geo.Source, THEM);
-      if(s) Extrude_Surface1 (s);
+      if(s){
+	Msg(STATUS3, "Meshing Volume %d", NUM);
+	Extrude_Surface1 (s);
+      }
     }
   }
-    
-  if(!reco){
+
+  if(!recombine){
     j = 0;
     do{
       TEST_IS_ALL_OK=0;
@@ -857,22 +871,27 @@ int Extrude_Mesh (Tree_T * Volumes){
 	  if(s) Extrude_Surface2 (s);
 	}
       }
-      Msg(INFO, "%d swaps", TEST_IS_ALL_OK);
+      Msg(STATUS3, "Swapping %d", TEST_IS_ALL_OK); 
       if(TEST_IS_ALL_OK == j){
-	Msg(GERROR, "Unable to swap all edges: try Recombine...");
+	if(j) Msg(GERROR, "Unable to swap all edges: try Recombine...");
 	break;
       }
       j = TEST_IS_ALL_OK;
     }while(TEST_IS_ALL_OK);
   }
 
+  Msg(STATUS2, "Mesh 3D... (Final)"); 
+
   for (int ivol = 0; ivol < List_Nbr (vol); ivol++){
     List_Read(vol, ivol, &THEV);
     ep = THEV->Extrude;
     NUM = THEV->Num;
     if(ep && ep->mesh.ExtrudeMesh && ep->geo.Mode == EXTRUDED_ENTITY){
       s = FindSurface (ep->geo.Source, THEM);
-      if(s) Extrude_Surface3 (s);
+      if(s){
+	Msg(STATUS3, "Meshing Volume %d", NUM);
+	Extrude_Surface3 (s);
+      }
     }
   }
 
@@ -880,7 +899,8 @@ int Extrude_Mesh (Tree_T * Volumes){
   for (int ivol = 0; ivol < List_Nbr (vol); ivol++){
     List_Read(vol, ivol, &THEV);
     ep = THEV->Extrude;
-    if(ep && ep->mesh.ExtrudeMesh && ep->geo.Mode == EXTRUDED_ENTITY){
+    if(ep && ep->mesh.ExtrudeMesh && ep->geo.Mode == EXTRUDED_ENTITY && 
+       !ep->mesh.Recombine){
       for (i = 0; i < List_Nbr (THEV->Surfaces); i++){
 	List_Read(THEV->Surfaces, i, &s);
 	if(!List_Search(list, &s, compareSurface))
@@ -894,6 +914,7 @@ int Extrude_Mesh (Tree_T * Volumes){
     Tree_Action(s->Simplexes, Free_NegativeSimplex);
     Tree_Delete(s->Simplexes);
     s->Simplexes = tmp;
+    Msg(STATUS3, "Coherence Surface %d", s->Num);
     Extrude_Mesh(s);
   }
 
diff --git a/Mesh/Generator.cpp b/Mesh/Generator.cpp
index 79cf5b9f93f0d90205f62cb92725092d854b277e..0b0a1143ee12eaf2bbfe03a7fbe5c8e993273e9a 100644
--- a/Mesh/Generator.cpp
+++ b/Mesh/Generator.cpp
@@ -1,4 +1,4 @@
-// $Id: Generator.cpp,v 1.25 2001-08-15 07:00:44 geuzaine Exp $
+// $Id: Generator.cpp,v 1.26 2001-08-15 08:16:30 geuzaine Exp $
 
 #include "Gmsh.h"
 #include "Numeric.h"
@@ -116,13 +116,11 @@ void Maillage_Dimension_3 (Mesh * M){
   Tree_Insert (M->Volumes, &v);
 
   if(CTX.mesh.oldxtrude){//old automatic extrusion algorithm
-    void Extrude_Mesh_Old(Mesh *M);
     Extrude_Mesh_Old(M);
   }
   else{
-    int Extrude_Mesh (Tree_T * Volumes);
     Extrude_Mesh(M->Volumes);
-    Tree_Action (M->Volumes, Maillage_Volume);
+    Tree_Action(M->Volumes, Maillage_Volume);
   }
 
   t2 = Cpu();
diff --git a/Mesh/Mesh.h b/Mesh/Mesh.h
index 064c0af77882095c1a34e8b4212e60c8893b07c2..9ce53106a62a849014cd68ef570135ca9a788bec 100644
--- a/Mesh/Mesh.h
+++ b/Mesh/Mesh.h
@@ -420,7 +420,9 @@ void Maillage_Volume (void *data, void *dum);
 int Extrude_Mesh (Curve * c);
 int Extrude_Mesh (Surface * s);
 int Extrude_Mesh (Volume * v);
+int Extrude_Mesh (Tree_T * Volumes);
 void ExitExtrude();
+void Extrude_Mesh_Old(Mesh *M);
 
 int MeshTransfiniteSurface (Surface *sur);
 int MeshTransfiniteVolume (Volume *vol);
diff --git a/Mesh/Vertex.cpp b/Mesh/Vertex.cpp
index d3397144de00be9eee0fd1572880dedc3d1c041d..dcbd509b26a5958c4636aec5e8abc89e358b4c0e 100644
--- a/Mesh/Vertex.cpp
+++ b/Mesh/Vertex.cpp
@@ -1,4 +1,4 @@
-// $Id: Vertex.cpp,v 1.8 2001-06-06 15:30:18 remacle Exp $
+// $Id: Vertex.cpp,v 1.9 2001-08-15 08:16:30 geuzaine Exp $
 
 #include "Gmsh.h"
 #include "Vertex.h"
@@ -80,7 +80,12 @@ void Delete_Vertex ( Vertex *pV )
     {
       List_Delete(pV->ListSurf);
       List_Delete(pV->ListCurves);
-      List_Delete(pV->Extruded_Points);
+      if(CTX.mesh.oldxtrude){//old automatic extrusion algorithm
+	List_Delete(pV->Extruded_Points);
+      }
+      else{
+	Free_ExtrudedPoints(pV->Extruded_Points);
+      }
       delete pV;
     }
 }
diff --git a/Mesh/Vertex.h b/Mesh/Vertex.h
index 5ea12b41461887a1ae2ce909babc755a48a1af7a..444baaf117e7595398d6f396ffdd3321569ce7c5 100644
--- a/Mesh/Vertex.h
+++ b/Mesh/Vertex.h
@@ -35,5 +35,6 @@ int comparePosition (const void *a, const void *b);
 Vertex *Create_Vertex (int Num, double X, double Y, double Z, double lc, double u);
 void Delete_Vertex ( Vertex *pV );
 void Free_Vertex (void *a, void *b);
+void Free_ExtrudedPoints(List_T* Extruded_Points);
 
 #endif