diff --git a/DataStr/Tree.cpp b/DataStr/Tree.cpp
index 9a03b1738cd27065f3b2f2cac714a385f460d2ab..e237ba3dcd69b3cd7842c471ab357370895fc158 100644
--- a/DataStr/Tree.cpp
+++ b/DataStr/Tree.cpp
@@ -1,4 +1,4 @@
-// $Id: Tree.cpp,v 1.13 2003-03-01 22:36:37 geuzaine Exp $
+// $Id: Tree.cpp,v 1.14 2003-03-16 21:23:17 geuzaine Exp $
 //
 // Copyright (C) 1997 - 2003 C. Geuzaine, J.-F. Remacle
 //
@@ -78,10 +78,15 @@ int Tree_Nbr(Tree_T * tree)
   return (avl_count(tree->root));
 }
 
-void Tree_Insert(Tree_T * tree, void *data)
+int Tree_Insert(Tree_T * tree, void *data)
 {
-  if(Tree_Search(tree, data) == 0)
+  if(Tree_Search(tree, data) == 0){
     Tree_Add(tree, data);
+    return 1;
+  }
+  else{
+    return 0;
+  }
 }
 
 int Tree_Replace(Tree_T * tree, void *data)
@@ -100,6 +105,7 @@ int Tree_Replace(Tree_T * tree, void *data)
   }
   else {
     memcpy(ptr, data, tree->size);
+    Msg(INFO, "memcpy in tree_repl");
     return (1);
   }
 }
diff --git a/DataStr/Tree.h b/DataStr/Tree.h
index 575f89e367bd832b94ed8922f2ba719530a77e5e..f00f184221de50462cd532414e74a6225ec4b3e1 100644
--- a/DataStr/Tree.h
+++ b/DataStr/Tree.h
@@ -32,7 +32,7 @@ void    Tree_Delete(Tree_T *Tree);
 void    Tree_Add(Tree_T *tree, void *data);
 void   *Tree_AddP(Tree_T *tree, void *data);
 int     Tree_Nbr(Tree_T *Tree);
-void    Tree_Insert(Tree_T *Tree, void *data);
+int     Tree_Insert(Tree_T *Tree, void *data);
 int     Tree_Replace(Tree_T *Tree, void *data);
 int     Tree_Search(Tree_T *Tree, void *data);
 int     Tree_Query(Tree_T *Tree, void *data);
diff --git a/Mesh/1D_Mesh.cpp b/Mesh/1D_Mesh.cpp
index 2b0e4015a2d08830660f0cf414e392ffcf13fc82..f618704c94688241c210b815b894b63465eb2f40 100644
--- a/Mesh/1D_Mesh.cpp
+++ b/Mesh/1D_Mesh.cpp
@@ -1,4 +1,4 @@
-// $Id: 1D_Mesh.cpp,v 1.30 2003-03-01 22:36:40 geuzaine Exp $
+// $Id: 1D_Mesh.cpp,v 1.31 2003-03-16 21:23:17 geuzaine Exp $
 //
 // Copyright (C) 1997 - 2003 C. Geuzaine, J.-F. Remacle
 //
@@ -184,7 +184,6 @@ void Maillage_Curve(void *data, void *dummy)
     v = &c->beg;
     if((vexist = (Vertex **) Tree_PQuery(THEM->Vertices, v))) {
       (*vexist)->u = c->ubeg;
-      Tree_Insert(THEM->Vertices, vexist);
       if((*vexist)->ListCurves)
         List_Add((*vexist)->ListCurves, &c);
       List_Add(c->Vertices, vexist);
@@ -194,7 +193,7 @@ void Maillage_Curve(void *data, void *dummy)
                          (*v)->Pos.Z, (*v)->lc, c->ubeg);
       pV->ListCurves = List_Create(1, 1, sizeof(Curve *));
       List_Add(pV->ListCurves, &c);
-      Tree_Insert(THEM->Vertices, &pV);
+      Tree_Add(THEM->Vertices, &pV);
       List_Add(c->Vertices, &pV);
     }
 
@@ -215,7 +214,7 @@ void Maillage_Curve(void *data, void *dummy)
         pV->w = V.w;
         pV->ListCurves = List_Create(1, 1, sizeof(Curve *));
         List_Add(pV->ListCurves, &c);
-        Tree_Insert(THEM->Vertices, &pV);
+        Tree_Add(THEM->Vertices, &pV);
         List_Add(c->Vertices, &pV);
         NUMP++;
       }
@@ -229,7 +228,6 @@ void Maillage_Curve(void *data, void *dummy)
     v = &c->end;
     if((vexist = (Vertex **) Tree_PQuery(THEM->Vertices, v))) {
       (*vexist)->u = c->uend;
-      Tree_Insert(THEM->Vertices, vexist);
       if((*vexist)->ListCurves)
         List_Add((*vexist)->ListCurves, &c);
       List_Add(c->Vertices, vexist);
@@ -239,7 +237,7 @@ void Maillage_Curve(void *data, void *dummy)
                          (*v)->Pos.Z, (*v)->lc, c->uend);
       pV->ListCurves = List_Create(1, 1, sizeof(Curve *));
       List_Add(pV->ListCurves, &c);
-      Tree_Insert(THEM->Vertices, &pV);
+      Tree_Add(THEM->Vertices, &pV);
       List_Add(c->Vertices, &pV);
     }
   }
diff --git a/Mesh/2D_SMesh.cpp b/Mesh/2D_SMesh.cpp
index f480f1258b07efa14068ff96330d85f9ca86c16c..1c172b3c740904a4678b27af4a04b683e206686b 100644
--- a/Mesh/2D_SMesh.cpp
+++ b/Mesh/2D_SMesh.cpp
@@ -1,4 +1,4 @@
-// $Id: 2D_SMesh.cpp,v 1.13 2003-03-01 22:36:41 geuzaine Exp $
+// $Id: 2D_SMesh.cpp,v 1.14 2003-03-16 21:23:17 geuzaine Exp $
 //
 // Copyright (C) 1997 - 2003 C. Geuzaine, J.-F. Remacle
 //
@@ -230,7 +230,7 @@ int MeshTransfiniteSurface(Surface * sur)
     if(nb == 4) {
       for(i = 0; i < N1; i++) {
         for(j = 0; j < N2; j++) {
-          Tree_Replace(sur->Vertices, &list[i + N1 * j]);
+          Tree_Insert(sur->Vertices, &list[i + N1 * j]);
         }
       }
       for(i = 0; i < N1 - 1; i++) {
@@ -269,10 +269,10 @@ int MeshTransfiniteSurface(Surface * sur)
       }
     }
     else if(nb == 3) {
-      Tree_Replace(sur->Vertices, &list[0]);
+      Tree_Insert(sur->Vertices, &list[0]);
       for(i = 1; i < N1; i++) {
         for(j = 0; j < N2; j++) {
-          Tree_Replace(sur->Vertices, &list[i + N1 * j]);
+          Tree_Insert(sur->Vertices, &list[i + N1 * j]);
         }
       }
       for(j = 0; j < N2 - 1; j++) {
diff --git a/Mesh/3D_Extrude.cpp b/Mesh/3D_Extrude.cpp
index 763e2e4f4004a91df4a7bb4237361c0dd7bc37b3..a4fa6b81872449eb6e34cf0a00bebfe024162510 100644
--- a/Mesh/3D_Extrude.cpp
+++ b/Mesh/3D_Extrude.cpp
@@ -1,4 +1,4 @@
-// $Id: 3D_Extrude.cpp,v 1.62 2003-03-11 06:53:36 geuzaine Exp $
+// $Id: 3D_Extrude.cpp,v 1.63 2003-03-16 21:23:17 geuzaine Exp $
 //
 // Copyright (C) 1997 - 2003 C. Geuzaine, J.-F. Remacle
 //
@@ -176,14 +176,14 @@ static int compnxn(const void *a, const void *b)
   return 0;
 }
 
-void ReplaceInVertexBound(void *a, void *b)
+void InsertInVertexBound(void *a, void *b)
 {
-  Tree_Replace(Vertex_Bound, a);
+  Tree_Insert(Vertex_Bound, a);
 }
 
-void ReplaceInPointBound(void *a, void *b)
+void InsertInPointBound(void *a, void *b)
 {
-  Tree_Replace(Point_Bound, a);
+  Tree_Insert(Point_Bound, a);
 }
 
 void InitExtrude()
@@ -201,8 +201,8 @@ void InitExtrude()
     Tree_Delete(Vertex_Bound);
   Vertex_Bound = Tree_Create(sizeof(Vertex *), comparePosition);
 
-  Tree_Action(THEM->Points, ReplaceInPointBound);
-  Tree_Action(THEM->Vertices, ReplaceInVertexBound);
+  Tree_Action(THEM->Points, InsertInPointBound);
+  Tree_Action(THEM->Vertices, InsertInVertexBound);
 }
 
 void ExitExtrude()
@@ -628,7 +628,7 @@ void Extrude_Vertex(void *data, void *dum)
 	  newv->Num = (*vexist)->Num;
 	}
         List_Add(NXL.List, &newv);
-        Tree_Insert(THEM->Vertices, &newv);
+        Tree_Add(THEM->Vertices, &newv);
         Tree_Insert(Vertex_Bound, &newv);
       }
     }
@@ -765,7 +765,7 @@ void copy_mesh(Curve * from, Curve * to, int direction)
   }
   else {
     newv = Create_Vertex(v->Num, v->Pos.X, v->Pos.Y, v->Pos.Z, v->lc, to->ubeg);
-    Tree_Insert(THEM->Vertices, &newv);
+    Tree_Add(THEM->Vertices, &newv);
     newv->ListCurves = List_Create(1, 1, sizeof(Curve *));
     List_Add(newv->ListCurves, &to);
     List_Add(to->Vertices, &newv);
@@ -796,7 +796,7 @@ void copy_mesh(Curve * from, Curve * to, int direction)
 	// pointing to the same memory location
 	newv->Num = (*vexist)->Num;
       }
-      Tree_Insert(THEM->Vertices, &newv);
+      Tree_Add(THEM->Vertices, &newv);
       Tree_Insert(Vertex_Bound, &newv);
     }
     if(!newv->ListCurves)
@@ -814,7 +814,7 @@ void copy_mesh(Curve * from, Curve * to, int direction)
   }
   else {
     newv = Create_Vertex(v->Num, v->Pos.X, v->Pos.Y, v->Pos.Z, v->lc, to->uend);
-    Tree_Insert(THEM->Vertices, &newv);
+    Tree_Add(THEM->Vertices, &newv);
     newv->ListCurves = List_Create(1, 1, sizeof(Curve *));
     List_Add(newv->ListCurves, &to);
     List_Add(to->Vertices, &newv);
@@ -853,7 +853,7 @@ int Extrude_Mesh(Curve * c)
       newv = Create_Vertex(v->Num, v->Pos.X, v->Pos.Y, v->Pos.Z, v->lc, 0.0);
       newv->ListCurves = List_Create(1, 1, sizeof(Curve *));
       List_Add(newv->ListCurves, &c);
-      Tree_Insert(THEM->Vertices, &newv);
+      Tree_Add(THEM->Vertices, &newv);
       List_Add(c->Vertices, &newv);
     }
 
@@ -878,7 +878,7 @@ int Extrude_Mesh(Curve * c)
       newv = Create_Vertex(v->Num, v->Pos.X, v->Pos.Y, v->Pos.Z, v->lc, 0.0);
       newv->ListCurves = List_Create(1, 1, sizeof(Curve *));
       List_Add(newv->ListCurves, &c);
-      Tree_Insert(THEM->Vertices, &newv);
+      Tree_Add(THEM->Vertices, &newv);
       List_Add(c->Vertices, &newv);
     }
     return true;
@@ -926,7 +926,7 @@ void copy_mesh(Surface * from, Surface * to)
 	    // pointing to the same memory location
 	    newv[j]->Num = (*vexist)->Num;
 	  }
-          Tree_Insert(THEM->Vertices, &newv[j]);
+          Tree_Add(THEM->Vertices, &newv[j]);
           Tree_Insert(Vertex_Bound, &newv[j]);
         }
       }
@@ -952,7 +952,7 @@ void AddVertsInSurf(void *a, void *b)
   Simplex *s = *(Simplex **) a;
   for(int i = 0; i < 4; i++)
     if(s->V[i])
-      Tree_Replace(THES->Vertices, &s->V[i]);
+      Tree_Insert(THES->Vertices, &s->V[i]);
 }
 
 int Extrude_Mesh(Surface * s)
diff --git a/Mesh/3D_SMesh.cpp b/Mesh/3D_SMesh.cpp
index f2ba2b2dc0b697e7f9b5bed9c7de454b60d8beb5..42e6bdb43c84a3d074c5b0e8c32e794501535720 100644
--- a/Mesh/3D_SMesh.cpp
+++ b/Mesh/3D_SMesh.cpp
@@ -1,4 +1,4 @@
-// $Id: 3D_SMesh.cpp,v 1.17 2003-03-02 16:10:28 geuzaine Exp $
+// $Id: 3D_SMesh.cpp,v 1.18 2003-03-16 21:23:18 geuzaine Exp $
 //
 // Copyright (C) 1997 - 2003 C. Geuzaine, J.-F. Remacle
 //
@@ -411,8 +411,8 @@ int MeshTransfiniteVolume(Volume * vol)
   for(i = 0; i < N1; i++) {
     for(j = 0; j < N2; j++) {
       for(k = 0; k < N3; k++) {
-        Tree_Replace(THEM->Vertices, &list[i + N1 * j + N1 * N2 * k]);
-        Tree_Replace(vol->Vertices, &list[i + N1 * j + N1 * N2 * k]);
+        Tree_Insert(THEM->Vertices, &list[i + N1 * j + N1 * N2 * k]);
+        Tree_Insert(vol->Vertices, &list[i + N1 * j + N1 * N2 * k]);
       }
     }
   }
@@ -425,7 +425,7 @@ int MeshTransfiniteVolume(Volume * vol)
              G[3]->Recombine && G[4]->Recombine && G[5]->Recombine) {
             hexa = CREATE_HEX;
             hexa->iEnt = vol->Num;
-            Tree_Replace(vol->Hexahedra, &hexa);
+            Tree_Add(vol->Hexahedra, &hexa);
 
             nbhex++;
           }
@@ -438,7 +438,7 @@ int MeshTransfiniteVolume(Volume * vol)
                                  list[(i + 1) + N1 * (j + 1) + N1 * N2 * (k)],
                                  list[(i) + N1 * (j + 1) + N1 * N2 * (k + 1)]);
             prism->iEnt = vol->Num;
-            Tree_Replace(vol->Prisms, &prism);
+            Tree_Add(vol->Prisms, &prism);
 
             prism = Create_Prism(list[(i + 1) + N1 * (j) + N1 * N2 * (k + 1)],
                                  list[(i) + N1 * (j) + N1 * N2 * (k + 1)],
@@ -447,7 +447,7 @@ int MeshTransfiniteVolume(Volume * vol)
                                  list[(i) + N1 * (j + 1) + N1 * N2 * (k + 1)],
                                  list[(i + 1) + N1 * (j + 1) + N1 * N2 * (k)]);
             prism->iEnt = vol->Num;
-            Tree_Replace(vol->Prisms, &prism);
+            Tree_Add(vol->Prisms, &prism);
 
             nbpri += 2;
           }
@@ -460,7 +460,7 @@ int MeshTransfiniteVolume(Volume * vol)
                                  list[(i) + N1 * (j + 1) + N1 * N2 * (k)],
                                  list[(i) + N1 * (j) + N1 * N2 * (k + 1)]);
             prism->iEnt = vol->Num;
-            Tree_Replace(vol->Prisms, &prism);
+            Tree_Add(vol->Prisms, &prism);
 
             prism =
               Create_Prism(list[(i + 1) + N1 * (j + 1) + N1 * N2 * (k + 1)],
@@ -470,7 +470,7 @@ int MeshTransfiniteVolume(Volume * vol)
                            list[(i) + N1 * (j) + N1 * N2 * (k + 1)],
                            list[(i) + N1 * (j + 1) + N1 * N2 * (k)]);
             prism->iEnt = vol->Num;
-            Tree_Replace(vol->Prisms, &prism);
+            Tree_Add(vol->Prisms, &prism);
 
             nbpri += 2;
           }
@@ -478,10 +478,10 @@ int MeshTransfiniteVolume(Volume * vol)
                   G[3]->Recombine && !G[4]->Recombine && !G[5]->Recombine) {
             prism = CREATE_PRISM_1;
             prism->iEnt = vol->Num;
-            Tree_Replace(vol->Prisms, &prism);
+            Tree_Add(vol->Prisms, &prism);
             prism = CREATE_PRISM_2;
             prism->iEnt = vol->Num;
-            Tree_Replace(vol->Prisms, &prism);
+            Tree_Add(vol->Prisms, &prism);
 
             nbpri += 2;
           }
@@ -489,22 +489,22 @@ int MeshTransfiniteVolume(Volume * vol)
                   !G[3]->Recombine && !G[4]->Recombine && !G[5]->Recombine) {
             simp = CREATE_SIM_1;
             simp->iEnt = vol->Num;
-            Tree_Replace(vol->Simplexes, &simp);
+            Tree_Add(vol->Simplexes, &simp);
             simp = CREATE_SIM_2;
             simp->iEnt = vol->Num;
-            Tree_Replace(vol->Simplexes, &simp);
+            Tree_Add(vol->Simplexes, &simp);
             simp = CREATE_SIM_3;
             simp->iEnt = vol->Num;
-            Tree_Replace(vol->Simplexes, &simp);
+            Tree_Add(vol->Simplexes, &simp);
             simp = CREATE_SIM_4;
             simp->iEnt = vol->Num;
-            Tree_Replace(vol->Simplexes, &simp);
+            Tree_Add(vol->Simplexes, &simp);
             simp = CREATE_SIM_5;
             simp->iEnt = vol->Num;
-            Tree_Replace(vol->Simplexes, &simp);
+            Tree_Add(vol->Simplexes, &simp);
             simp = CREATE_SIM_6;
             simp->iEnt = vol->Num;
-            Tree_Replace(vol->Simplexes, &simp);
+            Tree_Add(vol->Simplexes, &simp);
 
             nbtet += 6;
           }
@@ -531,7 +531,7 @@ int MeshTransfiniteVolume(Volume * vol)
                                list[1 + N1 * (j) + N1 * N2 * (k + 1)],
                                list[1 + N1 * (j + 1) + N1 * N2 * (k + 1)]);
           prism->iEnt = vol->Num;
-          Tree_Replace(vol->Prisms, &prism);
+          Tree_Add(vol->Prisms, &prism);
 
           nbpri++;
         }
@@ -542,21 +542,21 @@ int MeshTransfiniteVolume(Volume * vol)
                                 list[1 + N1 * (j + 1) + N1 * N2 * (k)],
                                 list[+N1 * (j) + N1 * N2 * (k + 1)]);
           simp->iEnt = vol->Num;
-          Tree_Replace(vol->Simplexes, &simp);
+          Tree_Add(vol->Simplexes, &simp);
 
           simp = Create_Simplex(list[1 + N1 * (j) + N1 * N2 * (k)],
                                 list[1 + N1 * (j + 1) + N1 * N2 * (k)],
                                 list[+N1 * (j) + N1 * N2 * (k + 1)],
                                 list[1 + N1 * (j) + N1 * N2 * (k + 1)]);
           simp->iEnt = vol->Num;
-          Tree_Replace(vol->Simplexes, &simp);
+          Tree_Add(vol->Simplexes, &simp);
 
           simp = Create_Simplex(list[+N1 * (j) + N1 * N2 * (k + 1)],
                                 list[1 + N1 * (j + 1) + N1 * N2 * (k + 1)],
                                 list[1 + N1 * (j) + N1 * N2 * (k + 1)],
                                 list[1 + N1 * (j + 1) + N1 * N2 * (k)]);
           simp->iEnt = vol->Num;
-          Tree_Replace(vol->Simplexes, &simp);
+          Tree_Add(vol->Simplexes, &simp);
 
           nbtet += 2;
         }
@@ -574,7 +574,7 @@ int MeshTransfiniteVolume(Volume * vol)
              G[4]->Recombine && G[5]->Recombine) {
             hexa = CREATE_HEX;
             hexa->iEnt = vol->Num;
-            Tree_Replace(vol->Hexahedra, &hexa);
+            Tree_Add(vol->Hexahedra, &hexa);
 
             nbhex++;
           }
@@ -582,10 +582,10 @@ int MeshTransfiniteVolume(Volume * vol)
                   !G[4]->Recombine && !G[5]->Recombine) {
             prism = CREATE_PRISM_1;
             prism->iEnt = vol->Num;
-            Tree_Replace(vol->Prisms, &prism);
+            Tree_Add(vol->Prisms, &prism);
             prism = CREATE_PRISM_2;
             prism->iEnt = vol->Num;
-            Tree_Replace(vol->Prisms, &prism);
+            Tree_Add(vol->Prisms, &prism);
 
             nbpri += 2;
           }
@@ -593,22 +593,22 @@ int MeshTransfiniteVolume(Volume * vol)
                   !G[4]->Recombine && !G[5]->Recombine) {
             simp = CREATE_SIM_1;
             simp->iEnt = vol->Num;
-            Tree_Replace(vol->Simplexes, &simp);
+            Tree_Add(vol->Simplexes, &simp);
             simp = CREATE_SIM_2;
             simp->iEnt = vol->Num;
-            Tree_Replace(vol->Simplexes, &simp);
+            Tree_Add(vol->Simplexes, &simp);
             simp = CREATE_SIM_3;
             simp->iEnt = vol->Num;
-            Tree_Replace(vol->Simplexes, &simp);
+            Tree_Add(vol->Simplexes, &simp);
             simp = CREATE_SIM_4;
             simp->iEnt = vol->Num;
-            Tree_Replace(vol->Simplexes, &simp);
+            Tree_Add(vol->Simplexes, &simp);
             simp = CREATE_SIM_5;
             simp->iEnt = vol->Num;
-            Tree_Replace(vol->Simplexes, &simp);
+            Tree_Add(vol->Simplexes, &simp);
             simp = CREATE_SIM_6;
             simp->iEnt = vol->Num;
-            Tree_Replace(vol->Simplexes, &simp);
+            Tree_Add(vol->Simplexes, &simp);
 
             nbtet += 6;
           }
diff --git a/Mesh/Read_Mesh.cpp b/Mesh/Read_Mesh.cpp
index 16c8469ec97abba7528e90cf44087a49f2144678..e9030f24b921c2858adec8051d23bbb50ecbf615 100644
--- a/Mesh/Read_Mesh.cpp
+++ b/Mesh/Read_Mesh.cpp
@@ -1,4 +1,4 @@
-// $Id: Read_Mesh.cpp,v 1.51 2003-03-10 04:26:32 geuzaine Exp $
+// $Id: Read_Mesh.cpp,v 1.52 2003-03-16 21:23:18 geuzaine Exp $
 //
 // Copyright (C) 1997 - 2003 C. Geuzaine, J.-F. Remacle
 //
@@ -123,7 +123,10 @@ void Read_Mesh_MSH(Mesh * M, FILE * File_GEO)
         fscanf(File_GEO, "%d %lf %lf %lf %lf %lf", &Num, &x, &y, &z, &lc1,
                &lc2);
         vert = Create_Vertex(Num, x, y, z, lc1, lc2);
-        Tree_Replace(M->Points, &vert);
+        if(!Tree_Insert(M->Points, &vert)){
+	  Msg(GERROR, "Point %d already exists\n", vert->Num);
+	  Free_Vertex(&vert, 0);
+	}
       }
     }
 
@@ -139,11 +142,13 @@ void Read_Mesh_MSH(Mesh * M, FILE * File_GEO)
       for(i_Node = 0; i_Node < Nbr_Nodes; i_Node++) {
         fscanf(File_GEO, "%d %lf %lf %lf", &Num, &x, &y, &z);
         vert = Create_Vertex(Num, x, y, z, 1.0, 0.0);
-        Tree_Replace(M->Vertices, &vert);
-        if(CTX.mesh.check_duplicates) {
+        if(!Tree_Insert(M->Vertices, &vert)){
+	  Msg(GERROR, "Node %d already exists\n", vert->Num);
+	  Free_Vertex(&vert, 0);
+	}
+	else if(CTX.mesh.check_duplicates) {
           if((vertspp = (Vertex **) Tree_PQuery(Duplicates, &vert)))
-            Msg(GERROR,
-                "Nodes %d and %d have identical coordinates (%g, %g, %g)",
+            Msg(GERROR, "Nodes %d and %d have identical coordinates (%g, %g, %g)",
                 Num, (*vertspp)->Num, x, y, z);
           else
             Tree_Add(Duplicates, &vert);
@@ -244,7 +249,7 @@ void Read_Mesh_MSH(Mesh * M, FILE * File_GEO)
           vert->Pos.Y /= (double)Nbr_Nodes;
           vert->Pos.Z /= (double)Nbr_Nodes;
           if((vertspp = (Vertex **) Tree_PQuery(Duplicates, &vert)))
-            Msg(GERROR, "Elements %d and %d have identical barycenters",
+            Msg(WARNING, "Elements %d and %d have identical barycenters",
                 Num, (*vertspp)->Num);
           else
             Tree_Add(Duplicates, &vert);
@@ -255,72 +260,97 @@ void Read_Mesh_MSH(Mesh * M, FILE * File_GEO)
           simp = Create_Simplex(vertsp[0], vertsp[1], NULL, NULL);
           simp->Num = Num;
           simp->iEnt = Elementary;
-          Tree_Replace(c->Simplexes, &simp);
-          //NO!!! Tree_Replace(M->Simplexes, &simp) ; 
+          if(!Tree_Insert(c->Simplexes, &simp)){
+	    Msg(GERROR, "Line element %d already exists\n", simp->Num);
+	    Free_Simplex(&simp, 0);
+	  }
+          //NO!!! Tree_Insert(M->Simplexes, &simp) ; 
           break;
         case TRI1:
           simp = Create_Simplex(vertsp[0], vertsp[1], vertsp[2], NULL);
           simp->Num = Num;
           simp->iEnt = Elementary;
-          Tree_Replace(s->Simplexes, &simp);
-          replace = Tree_Replace(M->Simplexes, &simp);
-          if(!replace)
+          if(Tree_Insert(s->Simplexes, &simp) && Tree_Insert(M->Simplexes, &simp)){
             M->Statistics[7]++;
+	  }
+          else{
+	    Msg(GERROR, "Triangle %d already exists\n", simp->Num);
+	    Free_Simplex(&simp, 0);
+	  }
           break;
         case QUA1:
-          simp =
-            Create_Quadrangle(vertsp[0], vertsp[1], vertsp[2], vertsp[3]);
+          simp = Create_Quadrangle(vertsp[0], vertsp[1], vertsp[2], vertsp[3]);
           simp->Num = Num;
           simp->iEnt = Elementary;
-          Tree_Replace(s->Simplexes, &simp);
-          replace = Tree_Replace(M->Simplexes, &simp);
-          if(!replace) {
+          if(Tree_Insert(s->Simplexes, &simp) && Tree_Insert(M->Simplexes, &simp)){
             M->Statistics[7]++; //since s->Simplexes holds quads, too :-(
             M->Statistics[8]++;
           }
+	  else{
+	    Msg(GERROR, "Quadrangle %d already exists\n", simp->Num);
+	    Free_Simplex(&simp, 0);
+	  }
           break;
         case TET1:
           simp = Create_Simplex(vertsp[0], vertsp[1], vertsp[2], vertsp[3]);
           simp->Num = Num;
           simp->iEnt = Elementary;
-          Tree_Replace(v->Simplexes, &simp);
-          replace = Tree_Replace(M->Simplexes, &simp);
-          if(!replace)
+          if(Tree_Insert(v->Simplexes, &simp) && Tree_Insert(M->Simplexes, &simp)){
             M->Statistics[9]++;
+	  }
+	  else{
+	    Msg(GERROR, "Tetrahedron %d already exists\n", simp->Num);
+	    Free_Simplex(&simp, 0);
+	  }
           break;
         case HEX1:
           hex = Create_Hexahedron(vertsp[0], vertsp[1], vertsp[2], vertsp[3],
                                   vertsp[4], vertsp[5], vertsp[6], vertsp[7]);
           hex->Num = Num;
           hex->iEnt = Elementary;
-          replace = Tree_Replace(v->Hexahedra, &hex);
-          if(!replace)
+          if(Tree_Insert(v->Hexahedra, &hex)){
             M->Statistics[10]++;
+	  }
+	  else{
+	    Msg(GERROR, "Hexahedron %d already exists\n", hex->Num);
+	    Free_Hexahedron(&hex, 0);
+	  }
           break;
         case PRI1:
           pri = Create_Prism(vertsp[0], vertsp[1], vertsp[2],
                              vertsp[3], vertsp[4], vertsp[5]);
           pri->Num = Num;
           pri->iEnt = Elementary;
-          replace = Tree_Replace(v->Prisms, &pri);
-          if(!replace)
+          if(Tree_Insert(v->Prisms, &pri)){
             M->Statistics[11]++;
+	  }
+	  else{
+	    Msg(GERROR, "Prism %d already exists\n", pri->Num);
+	    Free_Prism(&pri, 0);
+	  }
           break;
         case PYR1:
           pyr = Create_Pyramid(vertsp[0], vertsp[1], vertsp[2],
                                vertsp[3], vertsp[4]);
           pyr->Num = Num;
           pyr->iEnt = Elementary;
-          replace = Tree_Replace(v->Pyramids, &pyr);
-          if(!replace)
+          if(Tree_Insert(v->Pyramids, &pyr)){
             M->Statistics[12]++;
+	  }
+	  else{
+	    Msg(GERROR, "Pyramid %d already exists\n", pri->Num);
+	    Free_Pyramid(&pyr, 0);
+	  }
           break;
         case PNT:
 	  // we need to make a new one: vertices in M->Vertices and
 	  // M->Points should never point to the same memory location
 	  vert = Create_Vertex(vertsp[0]->Num, vertsp[0]->Pos.X, vertsp[0]->Pos.Y, 
 			       vertsp[0]->Pos.Z, vertsp[0]->lc, vertsp[0]->w);
-          Tree_Replace(M->Points, &vert);
+          if(!Tree_Insert(M->Points, &vert)){
+	    Msg(GERROR, "Point %d already exists\n", vert->Num);
+	    Free_Vertex(&vert, 0);
+	  }
           break;
         default:
           Msg(WARNING, "Unknown type of element in Read_Mesh");
diff --git a/TODO b/TODO
index 8b912ae9e357104af927703531d3f1a2c8f5319c..bc7a6224c078899c865e92caeb4de981380a84fd 100644
--- a/TODO
+++ b/TODO
@@ -1,13 +1,28 @@
-$Id: TODO,v 1.14 2003-03-11 07:16:10 geuzaine Exp $
+$Id: TODO,v 1.15 2003-03-16 21:23:17 geuzaine Exp $
 
 ********************************************************************
 
-Memory leaks, memory leaks (start with mesh_domain() and the parser)
+Memory leaks, memory leaks
+
+- start with mesh_domain() and the parser
+
+- check all calls to Tree_Replace: we shouldn't use it with trees of
+pointers, since we loose the original pointer when we actually do a
+'replace'
+
+- check all calls to Tree_Insert, and test the return value
 
 ********************************************************************
 
-Include Tetgen (the same way we did it with Triangle--the license is
-the same).
+Rewrite the geometry module in C++: we should have
+
+Point.cpp
+Curve.cpp
+Surface.cpp
+Volume.cpp
+
+It's much shorter than one may think. We could just keep a C interface
+like in Vertex.cpp and Simplex.cpp.
 
 ********************************************************************
 
@@ -15,6 +30,11 @@ Rewrite the View interface in C++
 
 ********************************************************************
 
+Include Tetgen (the same way we did it with Triangle--the license is
+the same).
+
+********************************************************************
+
 Two-field plots <nicolas.moes@ec-nantes.fr>
 
 Imagine I would like to plot a temperature field on a deformed
diff --git a/doc/CONTRIBUTORS b/doc/CONTRIBUTORS
index 2de82e4820a2b3de1a833900eeebdb4c8a8db888..b05b3c5a83563f888558a47430ad9cb3480dcf67 100644
--- a/doc/CONTRIBUTORS
+++ b/doc/CONTRIBUTORS
@@ -1,4 +1,4 @@
-$Id: CONTRIBUTORS,v 1.25 2003-03-12 23:41:45 geuzaine Exp $
+$Id: CONTRIBUTORS,v 1.26 2003-03-16 21:23:18 geuzaine Exp $
 
 Gmsh is copyright (c) 1997-2003 by
 
@@ -46,4 +46,5 @@ access to exotic machines for testing Gmsh:
   Francois Henrotte <fhenrott@@esat.kuleuven.ac.be>
   Benoit Meys <bmeys@@techspace-aero.be>
   Nicolas Moes <moes@@tam9.mech.nwu.edu>
+  Osamu Nakamura <naka@@hasaki.sumitomometals.co.jp>
   Chad Schmutzer <schmutze@@acm.caltech.edu>
\ No newline at end of file