diff --git a/Geo/GeoUtils.cpp b/Geo/GeoUtils.cpp
index a065a41fff0de8d767054e1902deb964b93cdb6d..81ce31524f173687ecc0d454d27f5653db6037b9 100644
--- a/Geo/GeoUtils.cpp
+++ b/Geo/GeoUtils.cpp
@@ -1,4 +1,4 @@
-// $Id: GeoUtils.cpp,v 1.1 2004-02-28 00:48:49 geuzaine Exp $
+// $Id: GeoUtils.cpp,v 1.2 2004-06-26 05:07:47 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -115,14 +115,14 @@ void setSurfaceGeneratrices(Surface *s, List_T *loops)
 
 void setVolumeSurfaces(Volume *v, List_T * loops)
 {
-  v->Surfaces = List_Create(4, 1, sizeof(Surface *));
+  List_Reset(v->Surfaces);
+  List_Reset(v->SurfacesOrientations);
   for(int i = 0; i < List_Nbr(loops); i++) {
     int il;
     List_Read(loops, i, &il);
     SurfaceLoop *sl;
     if(!(sl = FindSurfaceLoop(il, THEM))) {
       Msg(GERROR, "Unknown Surface Loop %d", il);
-      List_Delete(v->Surfaces);
       return;
     }
     else {
@@ -130,13 +130,19 @@ void setVolumeSurfaces(Volume *v, List_T * loops)
 	int is;
         List_Read(sl->Surfaces, j, &is);
 	Surface *s;
+	// FIXME: this is a little bit tricky: contrary to curves in
+	// edge loops, we don't actually create "negative"
+	// surfaces. So we just store the signs in another list
+	// (beeerk...)
         if(!(s = FindSurface(abs(is), THEM))) {
           Msg(GERROR, "Unknown Surface %d", is);
-          List_Delete(v->Surfaces);
           return;
         }
-        else
+        else{
           List_Add(v->Surfaces, &s);
+	  int tmp = (s->Num > 0) ? 1 : -1;
+	  List_Add(v->SurfacesOrientations, &tmp);
+	}
       }
     }
   }
diff --git a/Mesh/Create.cpp b/Mesh/Create.cpp
index 09bf3715eb3034817153391c33ab914119f5027e..dfc5f309af5ee337f25daeadbae8515cfa6565b5 100644
--- a/Mesh/Create.cpp
+++ b/Mesh/Create.cpp
@@ -1,4 +1,4 @@
-// $Id: Create.cpp,v 1.59 2004-06-23 22:23:42 geuzaine Exp $
+// $Id: Create.cpp,v 1.60 2004-06-26 05:07:47 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -719,6 +719,7 @@ Volume *Create_Volume(int Num, int Typ)
     pV->ipar[i] = 0;
   pV->TrsfPoints = List_Create(6, 6, sizeof(Vertex *));
   pV->Surfaces = List_Create(1, 2, sizeof(Surface *));
+  pV->SurfacesOrientations = List_Create(1, 2, sizeof(int));
   pV->Simplexes = Tree_Create(sizeof(Simplex *), compareQuality);
   pV->Vertices = Tree_Create(sizeof(Vertex *), compareVertex);
   pV->Hexahedra = Tree_Create(sizeof(Hexahedron *), compareHexahedron);
@@ -739,6 +740,7 @@ void Free_Volume(void *a, void *b)
   if(pV) {
     List_Delete(pV->TrsfPoints);
     List_Delete(pV->Surfaces);  // surfaces freed elsewhere
+    List_Delete(pV->SurfacesOrientations);
     Tree_Action(pV->Simplexes, Free_Simplex);
     Tree_Delete(pV->Simplexes);
     Tree_Delete(pV->Simp_Surf); // for old extrusion mesh generator
diff --git a/Mesh/Mesh.h b/Mesh/Mesh.h
index 224bc57c865d0785d71e1e5fe6a6a7124e82ef36..8ef09c18f0cd591a5aaca657245ebac4465756b6 100644
--- a/Mesh/Mesh.h
+++ b/Mesh/Mesh.h
@@ -301,6 +301,7 @@ typedef struct {
   ExtrudeParams *Extrude;
   List_T *TrsfPoints;
   List_T *Surfaces;
+  List_T *SurfacesOrientations;
   Tree_T *Vertices;
   Tree_T *Edges;
   Tree_T *Faces;