diff --git a/Mesh/2D_Recombine.cpp b/Mesh/2D_Recombine.cpp
index 672f18cc1a7ea1b36abc9a8f3c9f9614cb8db630..698c6ac04f78c42122d1997fd5d185e26d1100bc 100644
--- a/Mesh/2D_Recombine.cpp
+++ b/Mesh/2D_Recombine.cpp
@@ -1,4 +1,4 @@
-// $Id: 2D_Recombine.cpp,v 1.17 2004-02-07 01:40:21 geuzaine Exp $
+// $Id: 2D_Recombine.cpp,v 1.18 2004-04-18 17:45:39 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -29,8 +29,7 @@
 
 extern Context_T CTX;
 
-static Tree_T *RecEdges, *Triangles;
-static Tree_T *RecSimplex, *TREEELM;
+static Tree_T *RecEdges, *Triangles, *RecSimplex, *TREEELM;
 static double ALPHA;
 static int RECNUM;
 
@@ -98,7 +97,7 @@ void Recombine_Farce(void *a, void *b)
 
 int Recombine(Tree_T * TreeAllVert, Tree_T * TreeAllElg, double a)
 {
-  Tree_T *TreeEdges, *tnxe;
+  Tree_T *tnxe;
   int ntot;
 
   ALPHA = a;
@@ -109,16 +108,15 @@ int Recombine(Tree_T * TreeAllVert, Tree_T * TreeAllElg, double a)
 
     /* Initialisation */
     RECNUM = 0;
-    TreeEdges = Tree_Create(sizeof(Edge), compareedge);
     RecEdges = Tree_Create(sizeof(Edge), compareedge_angle);
     RecSimplex = Tree_Create(sizeof(Simplex *), compareSimplex);
     Triangles = Tree_Create(sizeof(Simplex *), compareSimplex);
 
     /* Recombinaison */
     Tree_Action(TreeAllElg, addTriangles);
-    crEdges(Triangles, TreeEdges);
-    Tree_Action(TreeEdges, CalculeAngles);
-    Tree_Action(TreeEdges, addrecedges);
+    EdgesContainer edges(Triangles, false);
+    Tree_Action(edges.AllEdges, CalculeAngles);
+    Tree_Action(edges.AllEdges, addrecedges);
     Tree_Action(RecEdges, Recombine_Farce);
 
     /* Lissage */
@@ -133,7 +131,6 @@ int Recombine(Tree_T * TreeAllVert, Tree_T * TreeAllElg, double a)
     }
 
     /* Destruction */
-    Tree_Delete(TreeEdges);
     Tree_Delete(RecEdges);
     Tree_Delete(RecSimplex);
     Tree_Delete(Triangles);
diff --git a/Mesh/3D_Coherence.cpp b/Mesh/3D_Coherence.cpp
index 214f25bec8d5ccf255cf6e969e424a1431e98dc9..eaa147f49d2990ce968a33cd5df2dd518847aa22 100644
--- a/Mesh/3D_Coherence.cpp
+++ b/Mesh/3D_Coherence.cpp
@@ -1,4 +1,4 @@
-// $Id: 3D_Coherence.cpp,v 1.31 2004-02-07 01:40:21 geuzaine Exp $
+// $Id: 3D_Coherence.cpp,v 1.32 2004-04-18 17:45:39 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -38,12 +38,6 @@ static List_T *Teti;
 List_T *Missing, *MissingF, *MissingS;
 Tree_T *EdgesTree, *FacesTree, *swaps, *touchedvertex;
 
-int edges_quad[4][2] = {
-  {0, 1},
-  {1, 2},
-  {2, 3},
-  {3, 0}
-};
 int edges_tetra[6][2] = {
   {0, 1},
   {1, 2},
@@ -53,7 +47,6 @@ int edges_tetra[6][2] = {
   {3, 1}
 };
 int edges_non[3] = { 2, 0, 1 };
-int EdgesInVolume = 1;
 
 int memesens(Vertex * v1, Vertex * v2, Vertex * v3,
              Vertex * c1, Vertex * c2, Vertex * c3)
@@ -243,18 +236,12 @@ void create_Edge(void *a, void *b)
   s = *ps;
   int edges[6][2];
 
-  if(s->V[3] && EdgesInVolume) {
+  if(s->V[3]) {
     N = 6;
     for(i = 0; i < N; i++)
       for(j = 0; j < 2; j++)
         edges[i][j] = edges_tetra[i][j];
   }
-  else if(s->V[3]) {
-    N = 4;
-    for(i = 0; i < N; i++)
-      for(j = 0; j < 2; j++)
-        edges[i][j] = edges_quad[i][j];
-  }
   else if(s->V[2]) {
     N = 3;
     for(i = 0; i < N; i++)
@@ -318,14 +305,6 @@ void create_Edges(Volume * V)
   }
 }
 
-
-void crEdges(Tree_T * TreeElem, Tree_T * treeedges)
-{
-  EdgesTree = treeedges;
-  Tree_Action(TreeElem, create_Edge);
-}
-
-
 void find_missing(void *a, void *b)
 {
   Edge *e;
diff --git a/Mesh/Mesh.h b/Mesh/Mesh.h
index 2ef267e7179335b564c8a6479c1fabbd80e579b2..83e155d8d86978dd69689a4d78f30aa507e94f3f 100644
--- a/Mesh/Mesh.h
+++ b/Mesh/Mesh.h
@@ -495,7 +495,6 @@ void Projette_Plan_Moyen (void *a, void *b);
 void Projette_Inverse (void *a, void *b);
 void Freeze_Vertex (void *a, void *b);
 void deFreeze_Vertex (void *a, void *b);
-void crEdges (Tree_T * TreeElem, Tree_T * treeedges);
 
 double Lc_XYZ (double X, double Y, double Z, Mesh * m);
 void Degre1();
diff --git a/Mesh/SecondOrder.cpp b/Mesh/SecondOrder.cpp
index 1d5180294d533b00ecdc83386933f0eb95d91203..c224b50ffb549801fa5b2535eaf6b38d40614e85 100644
--- a/Mesh/SecondOrder.cpp
+++ b/Mesh/SecondOrder.cpp
@@ -1,4 +1,4 @@
-// $Id: SecondOrder.cpp,v 1.19 2004-04-18 03:36:07 geuzaine Exp $
+// $Id: SecondOrder.cpp,v 1.20 2004-04-18 17:45:39 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -31,17 +31,16 @@
 // - middle face nodes for quads, hexas, prisms and pyramids
 
 // we really need to remove the quads from the simplex tree: it's a
-// real mess right now (EdgesInVolume makes sense only if we don't try
-// to do a 3D mesh with quads on surfaces)
-
-// -> add a Quad tree in Surface (like the Hax/Prism/Pyramid tree in
-// Volume); generalize Edge in terms of Element, and dynamic cast to
-// Simplex, Quandrangle, Hexahdra, etc.
+// real mess right now -> add a Quad tree in Surface (like the
+// Hax/Prism/Pyramid tree in Volume); generalize Edge in terms of
+// Element, and dynamic cast to Simplex, Quandrangle, Hexahdra, etc.
 
 extern Mesh *THEM;
 
-static Surface *THES;
-static Curve *THEC;
+static Surface *THES = NULL;
+static Curve *THEC = NULL;
+static EdgesContainer *edges = NULL;
+static List_T *VerticesToDelete = NULL;
 
 Vertex *oncurve(Vertex * v1, Vertex * v2)
 {
@@ -121,9 +120,20 @@ Vertex *onsurface(Vertex * v1, Vertex * v2)
   return pv;
 }
 
-extern int edges_tetra[6][2];
-extern int edges_quad[4][2];
-extern int EdgesInVolume;
+static int edges_tetra[6][2] = {
+  {0, 1},
+  {1, 2},
+  {2, 0},
+  {3, 0},
+  {3, 2},
+  {3, 1}
+};
+static int edges_quad[4][2] = {
+  {0, 1},
+  {1, 2},
+  {2, 3},
+  {3, 0}
+};
 
 void PutMiddlePoint(void *a, void *b)
 {
@@ -157,7 +167,7 @@ void PutMiddlePoint(void *a, void *b)
 
   for(i = 0; i < List_Nbr(ed->Simplexes); i++) {
     List_Read(ed->Simplexes, i, &s);
-    if(s->V[3] && EdgesInVolume) { // tetrahedron
+    if(s->V[3] && !THES) { // tetrahedron
       if(!s->VSUP)
         s->VSUP = (Vertex **) Malloc(6 * sizeof(Vertex *));
       N = 6;
@@ -201,9 +211,6 @@ void PutMiddlePoint(void *a, void *b)
   }
 }
 
-static Tree_T *TreeEdges = NULL;
-static List_T *VerticesToDelete = NULL;
-
 void ResetDegre2_Vertex(void *a, void *b)
 {
   Vertex *v = *(Vertex**)a;
@@ -242,9 +249,9 @@ void ResetDegre2_Volume(void *a, void *b)
 void Degre1()
 {
   // (re-)initialize the global tree of edges
-  if(TreeEdges)
-    Tree_Delete(TreeEdges);
-  TreeEdges = Tree_Create(sizeof(Edge), compareedge);
+  if(edges)
+    delete edges;
+  edges = new EdgesContainer();
 
   // reset VSUP in each element
   Tree_Action(THEM->Curves, ResetDegre2_Curve);
@@ -267,22 +274,20 @@ void Degre2_Curve(void *a, void *b)
 {
   Curve *c = *(Curve**)a;
   if(c->Dirty) return;
+  edges->AddTree(c->Simplexes, false);
   THEC = c;
   THES = NULL;
-  EdgesInVolume = 0;
-  crEdges(c->Simplexes, TreeEdges);
-  Tree_Action(TreeEdges, PutMiddlePoint);
+  Tree_Action(edges->AllEdges, PutMiddlePoint);
 }
 
 void Degre2_Surface(void *a, void *b)
 {
   Surface *s = *(Surface**)a;
   if(s->Dirty) return;
+  edges->AddTree(s->Simplexes, false);
   THEC = NULL;
   THES = s;
-  EdgesInVolume = 0;
-  crEdges(s->Simplexes, TreeEdges);
-  Tree_Action(TreeEdges, PutMiddlePoint);
+  Tree_Action(edges->AllEdges, PutMiddlePoint);
 }
 
 void Degre2_Volume(void *a, void *b)
@@ -297,36 +302,14 @@ void Degre2_Volume(void *a, void *b)
     return;
   }
 
+  edges->AddTree(v->Simplexes, true);
   THEC = NULL;
   THES = NULL;
-  EdgesInVolume = 1;
-  crEdges(v->Simplexes, TreeEdges);
-  Tree_Action(TreeEdges, PutMiddlePoint);
-}
-
-void Degre2(int dim)
-{
-  int old = EdgesInVolume;
-
-  Degre1();
-  if(dim >= 1)
-    Tree_Action(THEM->Curves, Degre2_Curve);
-  if(dim >= 2)
-    Tree_Action(THEM->Surfaces, Degre2_Surface);
-  if(dim >= 3)
-    Tree_Action(THEM->Volumes, Degre2_Volume);
-
-  EdgesInVolume = old;
+  Tree_Action(edges->AllEdges, PutMiddlePoint);
 }
 
-/* new interface
-EdgesContainer *edges = NULL;
-
 void Degre2(int dim)
 {
-  if(edges)
-    delete edges;
-  edges = new EdgesContainer();
   Degre1();
   if(dim >= 1)
     Tree_Action(THEM->Curves, Degre2_Curve);
@@ -335,4 +318,3 @@ void Degre2(int dim)
   if(dim >= 3)
     Tree_Action(THEM->Volumes, Degre2_Volume);
 }
-*/