diff --git a/Geo/DataBase.cpp b/Geo/DataBase.cpp
index 6f3d7f4a5fb3e252a16ea602bb342d372e64b9c3..b7a4a26e2917a91232d8bffb1849b9270eae560d 100644
--- a/Geo/DataBase.cpp
+++ b/Geo/DataBase.cpp
@@ -1,4 +1,4 @@
-// $Id: DataBase.cpp,v 1.13 2001-06-02 16:24:51 geuzaine Exp $
+// $Id: DataBase.cpp,v 1.14 2001-06-06 21:29:58 remacle Exp $
 
 #include "Gmsh.h"
 #include "Const.h"
@@ -328,6 +328,10 @@ void Cdbz101(int izon, int typzon,int o1, int o2, int nbu, int nbv,
   else{
     Add_PhysicalGroup(izon,typzon,templist,THEM);
   }
+  
+  if(liste)List_Delete (templist);
+    
+
 }
 
 void CreateNurbsSurfaceSupport (int Num , int Order1, int Order2 ,
diff --git a/Mesh/2D_Mesh.cpp b/Mesh/2D_Mesh.cpp
index ae9b9de55a8ad05dfaa86c78864bf4c1b9038ba4..4c85908fe56acfc8e78fa21534a361c1a1f46490 100644
--- a/Mesh/2D_Mesh.cpp
+++ b/Mesh/2D_Mesh.cpp
@@ -1,4 +1,4 @@
-// $Id: 2D_Mesh.cpp,v 1.26 2001-06-06 15:30:18 remacle Exp $
+// $Id: 2D_Mesh.cpp,v 1.27 2001-06-06 21:29:58 remacle Exp $
 
 /*
    Maillage Delaunay d'une surface (Point insertion Technique)
@@ -1102,7 +1102,8 @@ void Maillage_Surface (void *data, void *dum){
     create_NXE (s->Vertices, s->Simplexes, tnxe);
     for (int i = 0; i < CTX.mesh.nb_smoothing; i++)
       Tree_Action (tnxe, ActionLiss);
-    Tree_Delete (tnxe);
+    // MEMORY LEAK (JF)
+    delete_NXE (tnxe);
   }
 
 
diff --git a/Mesh/2D_Mesh.h b/Mesh/2D_Mesh.h
index 66259a1997e6ffc6d9c21a4171b5d4dc4fad74f1..2657828585337be43e6d46ccdb855118af6dc3ba 100644
--- a/Mesh/2D_Mesh.h
+++ b/Mesh/2D_Mesh.h
@@ -66,6 +66,7 @@ int CircumCircle(double x1,double y1,double x2,double y2,double x3,double y3,
 double find_quality (MPoint center, DocRecord * BGMESH);
 void create_NXE (Tree_T * TreeAllNod, Tree_T * TreeAllElg,
                  Tree_T * TreeAllNXE);
+void delete_NXE (Tree_T * TreeAllNXE);
 
 int Is_left_of(PointNumero x,PointNumero y,PointNumero check);
 int Is_right_of(PointNumero x,PointNumero y,PointNumero check);
diff --git a/Mesh/2D_Mesh_Aniso.cpp b/Mesh/2D_Mesh_Aniso.cpp
index a4b551ce9aeb245d2d12796dbca4c255c8a3ded9..c7b732b7e067e74c1ee946dd2d23e4e86c7baaf2 100644
--- a/Mesh/2D_Mesh_Aniso.cpp
+++ b/Mesh/2D_Mesh_Aniso.cpp
@@ -1,4 +1,4 @@
-// $Id: 2D_Mesh_Aniso.cpp,v 1.16 2001-06-06 15:30:18 remacle Exp $
+// $Id: 2D_Mesh_Aniso.cpp,v 1.17 2001-06-06 21:29:58 remacle Exp $
 
 /*
    Jean-Francois Remacle
@@ -239,6 +239,9 @@ void Box_2_Triangles (List_T * P, Surface * s){
         ps->S[j] = &MyNewBoundary;
     Tree_Replace (s->Simplexes, &ps);
   }
+  // MEMORY LEAK (JF)
+  List_Delete(smp);
+
 }
 
 
@@ -847,6 +850,11 @@ void Restore_Surface (Surface * s){
     List_Reset (ListCurves);
     List_Reset (StackSimp);
   }
+  // MEMORY LEAK (JF)
+  List_Delete (StackSimp);
+  List_Delete (ListCurves);
+  List_Delete (ListAllCurves);
+
 }
 
 void suppress_simplex_2D (void *data, void *dum){
@@ -1025,13 +1033,15 @@ int AlgorithmeMaillage2DAnisotropeModeJF (Surface * s){
 
   Restore_Surface (s);
 
+  // MEMORY LEAK (JF)
+  Tree_Delete(FacesTree);
+
   Suppress = List_Create (10, 10, sizeof (Simplex *));
   Tree_Action (s->Simplexes, suppress_simplex_2D);
   for (i = 0; i < List_Nbr (Suppress); i++){
     Tree_Suppress (s->Simplexes, List_Pointer (Suppress, i));
   }
-  List_Delete (Suppress);
-  
+
   if(!Tree_Right (s->Simplexes, &simp))
     Msg(WARNING, "No simplex left");
   else{
@@ -1094,7 +1104,10 @@ int AlgorithmeMaillage2DAnisotropeModeJF (Surface * s){
     List_Read (List, i, &THEV);
     if (THEV->Num < 0){
       Tree_Suppress (s->Vertices, &THEV);
-      //delete THEV;
+      // BUG BUG BUG BUG BUG BUG BUG BUG BUG BUG BUG BUG 
+      // MEMORY LEAK (JF) BUT THIS CAUSES PROBLEMS AFTER !!      
+      // Free(THEV);
+      // BUG BUG BUG BUG BUG BUG BUG BUG BUG BUG BUG BUG 
     }
   }
   List_Delete (List);
@@ -1109,5 +1122,15 @@ int AlgorithmeMaillage2DAnisotropeModeJF (Surface * s){
   //IntelligentSwapEdges(s,THEM->Metric);
 
   List_Delete (Points);
+
+
+  // WAS A MEMORY LEAK
+  for (i = 0; i < List_Nbr (Suppress); i++){
+    Free_Simplex(List_Pointer (Suppress, i),0);
+  }
+  List_Delete (Suppress);
+  
+
   return 1;
 }
+
diff --git a/Mesh/2D_Recombine.cpp b/Mesh/2D_Recombine.cpp
index 453c67e501b2df86c30ba2e2f0779f7a0ff50e5e..b7dee3ff79b20474f1859e2b056246ff70e405d2 100644
--- a/Mesh/2D_Recombine.cpp
+++ b/Mesh/2D_Recombine.cpp
@@ -1,4 +1,4 @@
-// $Id: 2D_Recombine.cpp,v 1.6 2001-06-03 11:19:52 geuzaine Exp $
+// $Id: 2D_Recombine.cpp,v 1.7 2001-06-06 21:29:58 remacle Exp $
 
 #include "Gmsh.h"
 #include "Const.h"
@@ -98,7 +98,8 @@ int Recombine (Tree_T *TreeAllVert, Tree_T *TreeAllElg, double a){
       create_NXE(TreeAllVert,TreeAllElg,tnxe);
       for (int i = 0; i < CTX.mesh.nb_smoothing; i++)
 	Tree_Action(tnxe,ActionLissSurf);
-      Tree_Delete(tnxe);
+      // MEMORY LEAK (JF)
+      delete_NXE(tnxe);
     }
 
     /* Destruction */
diff --git a/Mesh/3D_Extrude.cpp b/Mesh/3D_Extrude.cpp
index 31309753a04a6d857f10e608a481d2272a418bef..e262b723d23b3e331ff680688c1bfed89395ba83 100644
--- a/Mesh/3D_Extrude.cpp
+++ b/Mesh/3D_Extrude.cpp
@@ -1,4 +1,4 @@
-// $Id: 3D_Extrude.cpp,v 1.8 2001-06-02 16:24:51 geuzaine Exp $
+// $Id: 3D_Extrude.cpp,v 1.9 2001-06-06 21:29:58 remacle Exp $
 
 #include "Gmsh.h"
 #include "Const.h"
@@ -16,6 +16,7 @@ static int TEST_IS_ALL_OK;
 static Surface *THES;
 static Volume *THEV;
 static ExtrudeParams *ep;
+static Tree_T *Vertex_Bound, *ToAdd = NULL;
 
 typedef struct{
   int a, b;
@@ -43,6 +44,15 @@ void InitExtrude (){
     Tree_Swaps = Tree_Create (sizeof (nxn), compnxn);
 }
 
+/* MEMORY LEAK JF */
+void ExitExtrude (){
+  if (Tree_Ares)Tree_Delete(Tree_Ares);
+  if (Tree_Swaps)Tree_Delete(Tree_Swaps);
+  if(Vertex_Bound)Tree_Delete (Vertex_Bound);
+  Tree_Ares = Tree_Swaps = NULL;
+  ToAdd = Vertex_Bound = NULL;
+}
+
 int are_exist (Vertex * v1, Vertex * v2, Tree_T * t){
   nxn n;
   n.a = IMAX (v1->Num, v2->Num);
@@ -307,7 +317,6 @@ void Extrude_Simplex_Phase2 (void *data, void *dum){
   }
 }
 
-static Tree_T *Vertex_Bound, *ToAdd = NULL;
 
 void Extrude_Vertex (void *data, void *dum){
 
@@ -637,7 +646,6 @@ int Extrude_Mesh (Volume * v){
     }
 
     Extrude_Surface3 (s);
-    //Tree_Ares = Tree_Swaps = NULL;
     return true;
   }
   else{
diff --git a/Mesh/3D_Mesh.cpp b/Mesh/3D_Mesh.cpp
index 46a58fedc76ec473cb8aa1b9a6caf9e869655176..7a28cd0049f41e041e886d8ff17e4289eceb9a78 100644
--- a/Mesh/3D_Mesh.cpp
+++ b/Mesh/3D_Mesh.cpp
@@ -1,4 +1,4 @@
-// $Id: 3D_Mesh.cpp,v 1.18 2001-05-23 07:29:42 geuzaine Exp $
+// $Id: 3D_Mesh.cpp,v 1.19 2001-06-06 21:29:58 remacle Exp $
 
 /*
  
@@ -855,7 +855,7 @@ void Maillage_Volume (void *data, void *dum){
       create_NXE (v->Vertices, v->Simplexes, tnxe);
       for (int i = 0; i < CTX.mesh.nb_smoothing; i++)
         Tree_Action (tnxe, ActionLiss);
-      Tree_Delete (tnxe);
+      delete_NXE (tnxe);
       Msg(STATUS3, "Swapping edges (last pass)");
       SwapEdges3D (THEM, v, 0.5, true);
       */
diff --git a/Mesh/Create.cpp b/Mesh/Create.cpp
index ef49fa4b4c3bf6ca272d87e28db26102fcdcb869..18428a7c88811128fc4c8df4ff9c405f587f3692 100644
--- a/Mesh/Create.cpp
+++ b/Mesh/Create.cpp
@@ -1,4 +1,4 @@
-// $Id: Create.cpp,v 1.18 2001-06-02 16:24:51 geuzaine Exp $
+// $Id: Create.cpp,v 1.19 2001-06-06 21:29:58 remacle Exp $
 
 #include "Gmsh.h"
 #include "Const.h"
@@ -370,7 +370,9 @@ void End_Curve (Curve * c){
     // c->end->lc = DMIN (R*Pi/(fabs(c->Circle.t1-c->Circle.t2)*CIRC_GRAN),c->end->lc);
     
   }
-  c->cp = (float *) malloc (4 * List_Nbr (c->Control_Points) * sizeof (float));
+  // MEMORY LEAK (JF)
+  if (c->cp) Free (c->cp);
+  c->cp = (float *) Malloc (4 * List_Nbr (c->Control_Points) * sizeof (float));
   for (i = 0; i < List_Nbr (c->Control_Points); i++){
     List_Read (c->Control_Points, i, &v[0]);
     c->cp[4 * i] = v[0]->Pos.X;
@@ -421,6 +423,7 @@ Curve *Create_Curve (int Num, int Typ, int Order, List_T * Liste,
                           {1, 0, 0, 0.0} };
 
   pC = (Curve *) Malloc (sizeof (Curve));
+  pC->cp = NULL;
   pC->Vertices = NULL;
   pC->Extrude = NULL;
   pC->Typ = Typ;
@@ -520,6 +523,8 @@ void Free_Curve(void *a, void *b){
     List_Delete(pC->TrsfSimplexes);
     Free(pC->k);
     List_Delete(pC->Control_Points);
+    // MEMORY_LEAK (JF)
+    Free(pC->cp);
     Free(pC);
     pC = NULL;
   }
@@ -556,7 +561,7 @@ void Free_Surface(void *a, void *b){
     Tree_Action(pS->Simplexes, Free_Simplex);
     Tree_Delete(pS->Simplexes);
     List_Delete(pS->TrsfSimplexes);
-    //Tree_Delete(pS->Vertices);//fait planter l'extrusion (1D-2D-1D boum)
+    Tree_Delete(pS->Vertices);//fait planter l'extrusion (1D-2D-1D boum)
                       //the vertices are freed globally before
     List_Delete(pS->TrsfVertices);
     List_Delete(pS->Contours);
diff --git a/Mesh/CrossData.cpp b/Mesh/CrossData.cpp
index e2f4e0c4c97e46bfa2f7e3a42c97231f87591d24..ed863269e9a5c38ebce722b6c08ace611ae09b82 100644
--- a/Mesh/CrossData.cpp
+++ b/Mesh/CrossData.cpp
@@ -1,4 +1,4 @@
-// $Id: CrossData.cpp,v 1.4 2001-01-08 08:05:45 geuzaine Exp $
+// $Id: CrossData.cpp,v 1.5 2001-06-06 21:29:58 remacle Exp $
 
 
 #include "Gmsh.h"
@@ -6,6 +6,23 @@
 
 Tree_T *TreeTemp;
 
+NXE::NXE()
+{
+  v = NULL;
+  Liste = NULL;
+}
+
+NXE::~NXE()
+{
+  //  if(Liste)List_Delete(Liste);
+}
+
+void Delete_NXE (void *data, void *dummy)
+{
+  NXE *pnxe = (NXE*)data;
+  if(pnxe->Liste)List_Delete(pnxe->Liste);
+}
+
 void AddTable (void *data, void *dummy){
   Simplex *s;
   NXE nxe, *pnxe;
@@ -33,3 +50,8 @@ void create_NXE (Tree_T * TreeAllNod, Tree_T * TreeAllElg,
   TreeTemp = TreeAllNXE;
   Tree_Action (TreeAllElg, AddTable);
 }
+
+void delete_NXE (Tree_T * TreeAllNXE){
+  Tree_Action (TreeAllNXE, Delete_NXE);
+  Tree_Delete (TreeAllNXE);
+}
diff --git a/Mesh/Edge.cpp b/Mesh/Edge.cpp
index 00bdb614f5219cda766d08f7fd7022651beea0f4..52dcb872edd8b5365d35612886bda3fa8e3c58dc 100644
--- a/Mesh/Edge.cpp
+++ b/Mesh/Edge.cpp
@@ -1,4 +1,4 @@
-// $Id: Edge.cpp,v 1.4 2001-01-08 08:05:45 geuzaine Exp $
+// $Id: Edge.cpp,v 1.5 2001-06-06 21:29:58 remacle Exp $
 
 #include "Gmsh.h"
 #include "Mesh.h"
@@ -126,7 +126,16 @@ void EdgesContainer::AddTree (Tree_T * Simplexes, bool EdgesInVolume){
   List_Delete (temp);
 }
 
+void Free_Edge (void *a, void *b)
+{
+  Edge *e = (Edge*)a;
+  if(e->Liste)List_Delete(e->Liste);
+  if(e->Simplexes)List_Delete(e->Simplexes);
+  if(e->Points)List_Delete(e->Points);  
+}
+
 EdgesContainer::~EdgesContainer (){
+  Tree_Action (AllEdges,Free_Edge);
   Tree_Delete (AllEdges);
 }
 bool EdgesContainer::Search (Vertex * v1, Vertex * v2){
diff --git a/Mesh/Edge.h b/Mesh/Edge.h
index 6794c4b6604d15e210d436b24123eaad13f56569..a09fb8c5d6fb91734deeb805579b06a9e48b0791 100644
--- a/Mesh/Edge.h
+++ b/Mesh/Edge.h
@@ -23,6 +23,13 @@ public :
       Simplexes = NULL;
       Points = NULL;
     }
+  // MEMORY LEAK (JF)
+  ~Edge()
+    {
+      //if(Liste)List_Delete(Liste);
+      //if(Simplexes)List_Delete(Simplexes);
+      //if(Points)List_Delete(Points);
+    }
 };
 
 class EdgesContainer
diff --git a/Mesh/Generator.cpp b/Mesh/Generator.cpp
index cf8dfc79bf21f659b20a3f48d86d2d8f60d71c15..37f52a8670063fbbdb8178ad7f56b7aed19b2982 100644
--- a/Mesh/Generator.cpp
+++ b/Mesh/Generator.cpp
@@ -1,4 +1,4 @@
-// $Id: Generator.cpp,v 1.18 2001-06-06 15:30:18 remacle Exp $
+// $Id: Generator.cpp,v 1.19 2001-06-06 21:29:58 remacle Exp $
 
 #include "Gmsh.h"
 #include "Const.h"
@@ -88,7 +88,7 @@ void Maillage_Dimension_2 (Mesh * M){
 
   Tree_Action (M->Surfaces, Maillage_Surface);
 
-  t2 = Cpu();
+  t2 = Cpu();  
 
   M->Statistics[13] = t2 - t1;
 }
@@ -124,6 +124,8 @@ void Maillage_Dimension_3 (Mesh * M){
 
 void Init_Mesh (Mesh * M, int all){
   THEM = M;
+
+  ExitExtrude();
   
   if (M->Vertices){
     Tree_Action (M->Vertices, Free_Vertex);
diff --git a/Mesh/Mesh.h b/Mesh/Mesh.h
index 5e2d0245699f129b3ed1bac155d6f494b848886e..448fc596351ad3bf52a7609336562ce4920046e2 100644
--- a/Mesh/Mesh.h
+++ b/Mesh/Mesh.h
@@ -153,10 +153,13 @@ struct _MAILLAGE{
   int zone;
 };
 
-typedef struct{
+class NXE{
+  public :
   Vertex *v;
   List_T *Liste;
-}NXE;
+  ~NXE();
+  NXE();
+};
 
 typedef struct{
   int Num;              /* Numero                                       */
@@ -413,6 +416,7 @@ void Maillage_Volume (void *data, void *dum);
 int Extrude_Mesh (Curve * c);
 int Extrude_Mesh (Surface * s);
 int Extrude_Mesh (Volume * v);
+void ExitExtrude();
 
 int MeshTransfiniteSurface (Surface *sur);
 int MeshTransfiniteVolume (Volume *vol);
diff --git a/Mesh/Smoothing.cpp b/Mesh/Smoothing.cpp
index c086573a3db0073610bdd5e1c1195f0cb6ea29dc..ab13c852d411a83fceb6d9462388bac4aac4e7b4 100644
--- a/Mesh/Smoothing.cpp
+++ b/Mesh/Smoothing.cpp
@@ -1,4 +1,4 @@
-// $Id: Smoothing.cpp,v 1.4 2001-01-08 08:05:46 geuzaine Exp $
+// $Id: Smoothing.cpp,v 1.5 2001-06-06 21:29:58 remacle Exp $
 
 #include "Gmsh.h"
 #include "Const.h"
@@ -50,24 +50,20 @@ void AmelioreSurface_EliminationTripet (Surface * surf, Mesh * m, Tree_T * tnxe)
 
 
 void ActionLiss (void *data, void *dummy){
-  static int deb = 1;
-  static List_T *nodes;
+  List_T *nodes;
 
   NXE *pnxe;
   Simplex *s;
   double X, Y, Z, Sum;
   int i, j;
 
-  if (deb){
-    deb = 0;
-    nodes = List_Create (2, 2, sizeof (Vertex *));
-  }
-  List_Reset (nodes);
+
   pnxe = (NXE *) data;
 
   /* On Ne Lisse Point Les Points sur les courbes (quelle horreur) */
   if (pnxe->v->ListCurves)
     return;
+  nodes = List_Create (2, 2, sizeof (Vertex *));
 
   X = Y = Z = Sum = 0.0;
   double volume_before = 0.0;
@@ -117,7 +113,7 @@ void ActionLiss (void *data, void *dummy){
     pnxe->v->Pos.Y = yold;
     pnxe->v->Pos.Z = zold;
   }
-  
+  List_Delete(nodes);
 }