diff --git a/Geo/CAD.cpp b/Geo/CAD.cpp
index ac1fd5de932f0e512c7c7066986614d1165f10e8..75cad6df555176f44e672436b83f5ac832bb40d3 100644
--- a/Geo/CAD.cpp
+++ b/Geo/CAD.cpp
@@ -1,4 +1,4 @@
-// $Id: CAD.cpp,v 1.24 2001-06-07 15:13:08 geuzaine Exp $
+// $Id: CAD.cpp,v 1.25 2001-06-25 18:34:59 remacle Exp $
 
 #include "Gmsh.h"
 #include "Geo.h"
@@ -1258,6 +1258,8 @@ void ReplaceAllDuplicates ( Mesh *m ){
   Volume *vol;
   int i,j,start,end;
 
+  List_T *points2delete = List_Create(100,100,sizeof(Vertex*));
+
   /* Create unique points */
 
   All = Tree2List(m->Points);
@@ -1271,6 +1273,8 @@ void ReplaceAllDuplicates ( Mesh *m ){
     }
     else{
       Tree_Suppress(m->Points,&v);
+      Tree_Suppress(m->Vertices,&v);      
+      //      List_Add(points2delete,&v);      
     }
   }
 
@@ -1396,6 +1400,14 @@ void ReplaceAllDuplicates ( Mesh *m ){
                               List_Pointer(vol->Surfaces,j)));
     }
   }
+
+  for(int k = 0; k < List_Nbr(points2delete);k++)
+    {
+      List_Read(points2delete,i,&v);      
+      Free_Vertex(&v,0);
+    }
+
+
 }
 
 /* NEW CAD FUNCTIONS */
diff --git a/Mesh/2D_Mesh.cpp b/Mesh/2D_Mesh.cpp
index 2ed9ba2226f8ecd1d6c45b8540f8ea51972a0123..dbe5d1042b44d354b5f85f511e963a7bd424d929 100644
--- a/Mesh/2D_Mesh.cpp
+++ b/Mesh/2D_Mesh.cpp
@@ -1,4 +1,4 @@
-// $Id: 2D_Mesh.cpp,v 1.28 2001-06-25 13:30:57 remacle Exp $
+// $Id: 2D_Mesh.cpp,v 1.29 2001-06-25 18:34:59 remacle Exp $
 
 /*
    Maillage Delaunay d'une surface (Point insertion Technique)
@@ -693,6 +693,8 @@ int mesh_domain (ContourPeek * ListContours, int numcontours,
           break;
         }
       }
+      // MEMORY_LEAK -JF
+      //      Free(del_P);
     }
 
     *numpoints = doc->numPoints;
diff --git a/Mesh/2D_Util.cpp b/Mesh/2D_Util.cpp
index 21e220484c551d5d6bfdbfe95b6b9e94a6372052..b7358ee61121cfd55a8110a29210031179140e0d 100644
--- a/Mesh/2D_Util.cpp
+++ b/Mesh/2D_Util.cpp
@@ -1,4 +1,4 @@
-// $Id: 2D_Util.cpp,v 1.10 2001-05-20 19:24:53 geuzaine Exp $
+// $Id: 2D_Util.cpp,v 1.11 2001-06-25 18:34:59 remacle Exp $
 
 #include "Gmsh.h"
 #include "Const.h"
@@ -82,7 +82,7 @@ int Insert_Point (MPoint pt, int *numpoints, int *numalloc,
       gPointArray[*numpoints].quality = MIN(find_quality(pt,BGM),qual);
     else 
       gPointArray[*numpoints].quality = qual;
-    Free(v);
+    Free_Vertex(&v,0);
   }
     
   (*numpoints)++;
diff --git a/Mesh/3D_Extrude.cpp b/Mesh/3D_Extrude.cpp
index 9d5153640d4921a230023bcac6be949fdbed5c8f..c4dc60197ebddfe6ee1e7192cd8e76f5b32ef7b0 100644
--- a/Mesh/3D_Extrude.cpp
+++ b/Mesh/3D_Extrude.cpp
@@ -1,4 +1,4 @@
-// $Id: 3D_Extrude.cpp,v 1.10 2001-06-07 14:20:08 remacle Exp $
+// $Id: 3D_Extrude.cpp,v 1.11 2001-06-25 18:34:59 remacle Exp $
 
 #include "Gmsh.h"
 #include "Const.h"
@@ -16,7 +16,7 @@ static int TEST_IS_ALL_OK;
 static Surface *THES;
 static Volume *THEV;
 static ExtrudeParams *ep;
-static Tree_T *Vertex_Bound, *ToAdd = NULL;
+static Tree_T *Vertex_Bound = NULL, *ToAdd = NULL;
 
 typedef struct{
   int a, b;
@@ -42,6 +42,19 @@ void InitExtrude (){
     Tree_Ares = Tree_Create (sizeof (nxn), compnxn);
   if (!Tree_Swaps)
     Tree_Swaps = Tree_Create (sizeof (nxn), compnxn);
+  if(Vertex_Bound)
+    Tree_Delete(Vertex_Bound);
+  Vertex_Bound = Tree_Create (sizeof (Vertex *), comparePosition);
+  List_T *l1 = Tree2List (THEM->Points);
+  List_T *l2 = Tree2List (THEM->Vertices);
+
+  for(int i=0;i<List_Nbr(l1);i++)Tree_Insert(Vertex_Bound,List_Pointer(l1,i));
+  for(int i=0;i<List_Nbr(l2);i++)Tree_Insert(Vertex_Bound,List_Pointer(l2,i));
+
+  List_Delete(l1);
+  List_Delete(l2);
+
+  //Vertex_Bound = THEM->Vertices;
 }
 
 /* MEMORY LEAK JF */
@@ -325,8 +338,9 @@ void Extrude_Vertex (void *data, void *dum){
 
   pV = (Vertex **) data;
   v = *pV;
-  if (v->Extruded_Points)
-    List_Delete (v->Extruded_Points);
+  // BUG FOR MULTIPLE POINTS IN EXTRUSION
+  if (v->Extruded_Points)return;
+  //    List_Delete (v->Extruded_Points);
   v->Extruded_Points = List_Create (ep->mesh.NbLayer, 1, sizeof (Vertex *));
   List_Add (v->Extruded_Points, &v);
 
@@ -346,6 +360,7 @@ void Extrude_Vertex (void *data, void *dum){
       else{
         List_Add (v->Extruded_Points, &newv);
         Tree_Insert (THEM->Vertices, &newv);
+        Tree_Insert (Vertex_Bound, &newv);
         if (ToAdd)
           Tree_Insert (ToAdd, &newv);
       }
@@ -437,10 +452,12 @@ int Extrude_Mesh (Curve * c){
   if (!c->Extrude->mesh.ExtrudeMesh)
     return false;
 
-  Vertex_Bound = NULL;
+  InitExtrude();
+
+  //  Vertex_Bound = NULL;
   ep = c->Extrude;
 
-  Tree_Ares = Tree_Swaps = NULL;
+  //  Tree_Ares = Tree_Swaps = NULL;
 
   if (ep->geo.Mode == EXTRUDED_ENTITY){
     Extrude_Vertex (&c->beg, NULL);
@@ -576,7 +593,7 @@ int Extrude_Mesh (Surface * s){
   if (!s->Extrude->mesh.ExtrudeMesh)
     return false;
   FACE_DIMENSION = 2;
-  Vertex_Bound = Tree_Create (sizeof (Vertex *), comparePosition);
+  //  Vertex_Bound = Tree_Create (sizeof (Vertex *), comparePosition);
 
   ep = s->Extrude;
   THES = s;
@@ -621,8 +638,6 @@ int Extrude_Mesh (Volume * v){
   if (!v->Extrude->mesh.ExtrudeMesh)
     return false;
 
-  Vertex_Bound = Tree_Create (sizeof (Vertex *), comparePosition);
-
   ep = v->Extrude;
   THEV = v;
   if (ep->geo.Mode == EXTRUDED_ENTITY){