diff --git a/Geo/CAD.cpp b/Geo/CAD.cpp
index 15fee06adc08627b3b1e1f587849b3b837f8b771..85df308ff7e6b25b5c4d4a03f0f0247bc67d18e5 100644
--- a/Geo/CAD.cpp
+++ b/Geo/CAD.cpp
@@ -1,4 +1,4 @@
-// $Id: CAD.cpp,v 1.26 2001-08-11 23:28:31 geuzaine Exp $
+// $Id: CAD.cpp,v 1.27 2001-08-12 12:30:49 geuzaine Exp $
 
 #include "Gmsh.h"
 #include "Numeric.h"
@@ -1068,7 +1068,8 @@ void Extrude_ProtudeSurface(int ep, int is,
       }
     c->Extrude = new ExtrudeParams(COPIED_ENTITY);
     c->Extrude->fill(ep,A,B,C,X,Y,Z,alpha);
-    c->Extrude->geo.Source = abs(c2->Num);
+    //pas de abs()! il faut le signe pour copy_mesh dans ExtrudeMesh
+    c->Extrude->geo.Source = c2->Num; 
     if(e)c->Extrude->mesh = e->mesh;
   }
   
diff --git a/Mesh/1D_Mesh.cpp b/Mesh/1D_Mesh.cpp
index 17b5ac1685e73f3b427b17eb77e6d4d78dee4125..a80b6494cf230269812f8193b87c70293f306fdb 100644
--- a/Mesh/1D_Mesh.cpp
+++ b/Mesh/1D_Mesh.cpp
@@ -1,4 +1,4 @@
-// $Id: 1D_Mesh.cpp,v 1.18 2001-08-11 23:28:32 geuzaine Exp $
+// $Id: 1D_Mesh.cpp,v 1.19 2001-08-12 12:30:48 geuzaine Exp $
 
 #include "Gmsh.h"
 #include "Numeric.h"
@@ -227,4 +227,13 @@ void Maillage_Curve (void *data, void *dummy){
 
   THEM->Statistics[4] += List_Nbr (c->Vertices);
 
+#if 1
+  if(fabs(c->Num) != 41) return;
+  printf("curve %d : ", c->Num);
+  for (i = 0; i < List_Nbr (c->Vertices); i++){
+    List_Read (c->Vertices, i, &v1);
+    printf(" %d (%g %g %g)", v1->Num, v1->Pos.X, v1->Pos.Y, v1->Pos.Z);
+  }
+  printf("\n");
+#endif
 }
diff --git a/Mesh/3D_Extrude.cpp b/Mesh/3D_Extrude.cpp
index 83984477bbe7a584f0c0ffe5ac5215a92379335b..61508db1a368e40624b69c8fdc8c72ece7f5a29e 100644
--- a/Mesh/3D_Extrude.cpp
+++ b/Mesh/3D_Extrude.cpp
@@ -1,4 +1,4 @@
-// $Id: 3D_Extrude.cpp,v 1.25 2001-08-12 09:29:47 geuzaine Exp $
+// $Id: 3D_Extrude.cpp,v 1.26 2001-08-12 12:30:48 geuzaine Exp $
 
 #include "Gmsh.h"
 #include "Numeric.h"
@@ -448,7 +448,7 @@ void Extrude_Curve (void *data, void *dum){
   }
 }
 
-void copy_mesh (Curve * from, Curve * to){
+void copy_mesh (Curve * from, Curve * to, int direction){
   List_T *list = from->Vertices;
   Vertex *vi, *v, **vv, **vexist;
 
@@ -466,6 +466,7 @@ void copy_mesh (Curve * from, Curve * to){
   if ((vexist = (Vertex **) Tree_PQuery (THEM->Vertices, vv))){
     (*vexist)->u = to->ubeg;
     Tree_Insert (THEM->Vertices, vexist);
+    Tree_Insert (Vertex_Bound, vexist);
     if ((*vexist)->ListCurves)
       List_Add ((*vexist)->ListCurves, &to);
     List_Add (to->Vertices, vexist);
@@ -474,18 +475,23 @@ void copy_mesh (Curve * from, Curve * to){
     vi = Create_Vertex ((*vv)->Num, (*vv)->Pos.X, (*vv)->Pos.Y, (*vv)->Pos.Z,
 			(*vv)->lc, to->ubeg);
     Tree_Insert (THEM->Vertices, &vi);
+    Tree_Insert (Vertex_Bound, &vi);
     vi->ListCurves = List_Create (1, 1, sizeof (Curve *));
     List_Add (vi->ListCurves, &to);
     List_Add (to->Vertices, &vi);
   }
 
-  for (int i = 1; i < List_Nbr (list)-1; i++){
-    List_Read (list, i, &v);
+  for (int i = 1; i < List_Nbr(list)-1; i++){
+    if(direction < 0) 
+      List_Read (list, List_Nbr(list)-1-i, &v);
+    else
+      List_Read (list, i, &v);
     vi = Create_Vertex (++CurrentNodeNumber, v->Pos.X,
-			v->Pos.Y, v->Pos.Z, v->lc, v->u);
+			v->Pos.Y, v->Pos.Z, v->lc, (direction>0)?v->u:(1.-v->u));
     ep->Extrude (ep->mesh.NbLayer - 1, ep->mesh.NbElmLayer[ep->mesh.NbLayer - 1],
 		 vi->Pos.X, vi->Pos.Y, vi->Pos.Z);
     Tree_Insert (THEM->Vertices, &vi);
+    Tree_Insert (Vertex_Bound, &vi);
     if(!vi->ListCurves)
       vi->ListCurves = List_Create (1, 1, sizeof (Curve *));
     List_Add (vi->ListCurves, &to);
@@ -496,6 +502,7 @@ void copy_mesh (Curve * from, Curve * to){
   if ((vexist = (Vertex **) Tree_PQuery (THEM->Vertices, vv))){
     (*vexist)->u = to->uend;
     Tree_Insert (THEM->Vertices, vexist);
+    Tree_Insert (Vertex_Bound, vexist);
     if ((*vexist)->ListCurves)
       List_Add ((*vexist)->ListCurves, &to);
     List_Add (to->Vertices, vexist);
@@ -504,6 +511,7 @@ void copy_mesh (Curve * from, Curve * to){
     vi = Create_Vertex ((*vv)->Num, (*vv)->Pos.X, (*vv)->Pos.Y, (*vv)->Pos.Z, 
 			(*vv)->lc, to->uend);
     Tree_Insert (THEM->Vertices, &vi);
+    Tree_Insert (Vertex_Bound, &vi);
     vi->ListCurves = List_Create (1, 1, sizeof (Curve *));
     List_Add (vi->ListCurves, &to);
     List_Add (to->Vertices, &vi);
@@ -568,9 +576,9 @@ int Extrude_Mesh (Curve * c){
     return true;
   }
   else{
-    Curve *cc = FindCurve (ep->geo.Source, THEM);
+    Curve *cc = FindCurve (abs(ep->geo.Source), THEM);
     if (!cc) return false;
-    copy_mesh (cc, c);
+    copy_mesh (cc, c, sign(ep->geo.Source));
     return true;
   }
 }
@@ -647,7 +655,7 @@ int Extrude_Mesh (Surface * s){
     }
   }
   if (ep->geo.Mode == EXTRUDED_ENTITY){
-    Curve *c = FindCurve (ep->geo.Source, THEM);
+    Curve *c = FindCurve (abs(ep->geo.Source), THEM);
     if (!c) return false;
     for (i = 0; i < List_Nbr (c->Vertices); i++){
       List_Read (c->Vertices, i, &v1);