diff --git a/Mesh/Create.cpp b/Mesh/Create.cpp
index e68a10c68688a74c6250dc8b9b6cf5be19c1bc16..150e62e40166fd19d11cdf69aa512b959bccb5be 100644
--- a/Mesh/Create.cpp
+++ b/Mesh/Create.cpp
@@ -1,4 +1,4 @@
-// $Id: Create.cpp,v 1.15 2001-05-22 07:11:14 geuzaine Exp $
+// $Id: Create.cpp,v 1.16 2001-05-29 13:28:26 geuzaine Exp $
 
 #include "Gmsh.h"
 #include "Const.h"
@@ -7,6 +7,7 @@
 #include "Mesh.h"
 #include "Numeric.h"
 #include "Context.h"
+#include "Create.h"
 
 extern Mesh      *THEM;
 extern Context_T  CTX;
@@ -511,6 +512,20 @@ Curve *Create_Curve (int Num, int Typ, int Order, List_T * Liste,
   return (pC);
 }
 
+void Free_Curve(void *a, void *b){
+  Curve *pC = *(Curve**)a;
+  if(pC){
+    List_Delete(pC->Vertices);
+    Tree_Action(pC->Simplexes, Free_Simplex);
+    Tree_Delete(pC->Simplexes);
+    List_Delete(pC->TrsfSimplexes);
+    Free(pC->k);
+    List_Delete(pC->Control_Points);
+    Free(pC);
+    pC = NULL;
+  }
+}
+
 Surface * Create_Surface (int Num, int Typ, int Mat){
   Surface *pS;
 
@@ -534,6 +549,21 @@ Surface * Create_Surface (int Num, int Typ, int Mat){
   return (pS);
 }
 
+void Free_Surface(void *a, void *b){
+  Surface *pS = *(Surface**)a;
+  if(pS){
+    Tree_Action(pS->Simplexes, Free_Simplex);
+    Tree_Delete(pS->Simplexes);
+    List_Delete(pS->TrsfSimplexes);
+    Tree_Delete(pS->Vertices); //the vertices are freed globally before
+    List_Delete(pS->TrsfVertices);
+    List_Delete(pS->Contours);
+    List_Delete(pS->Control_Points);
+    Free(pS);
+    pS = NULL;
+  }
+}
+
 Volume * Create_Volume (int Num, int Typ, int Mat){
   Volume *pV;
 
@@ -551,6 +581,23 @@ Volume * Create_Volume (int Num, int Typ, int Mat){
   return pV;
 }
 
+void Free_Volume(void *a, void *b){
+  /*
+  Volume *pV = *(Volume**)a;
+  if(pV){
+    List_Delete(pV->Surfaces); //surfaces freed elsewhere
+    Tree_Action(pV->Simplexes, Free_Simplex);
+    Tree_Delete(pV->Simplexes);
+    Tree_Delete(pV->Vertices); //vertices freed elsewhere
+    Tree_Action(pV->Hexahedra, Free_Hexahedron);
+    Tree_Delete(pV->Hexahedra);
+    Tree_Action(pV->Prisms, Free_Prism);
+    Tree_Delete(pV->Prisms);
+    Free(pV);
+    pV = NULL;
+  }
+  */
+}
 
 Hexahedron * Create_Hexahedron (Vertex * v1, Vertex * v2, Vertex * v3, Vertex * v4,
                                 Vertex * v5, Vertex * v6, Vertex * v7, Vertex * v8){
@@ -572,6 +619,14 @@ Hexahedron * Create_Hexahedron (Vertex * v1, Vertex * v2, Vertex * v3, Vertex *
   return (h);
 }
 
+void Free_Hexahedron(void *a, void *b){
+  Hexahedron *pH = *(Hexahedron**)a;
+  if(pH){
+    Free(pH);
+    pH = NULL;
+  }
+}
+
 Prism * Create_Prism (Vertex * v1, Vertex * v2, Vertex * v3,
                       Vertex * v4, Vertex * v5, Vertex * v6){
   Prism *p;
@@ -589,3 +644,11 @@ Prism * Create_Prism (Vertex * v1, Vertex * v2, Vertex * v3,
 
   return (p);
 }
+
+void Free_Prism(void *a, void *b){
+  Prism *pP = *(Prism**)a;
+  if(pP){
+    Free(pP);
+    pP = NULL;
+  }
+}