diff --git a/Fltk/GUI.cpp b/Fltk/GUI.cpp
index 3b557d504049f4829cf3fe257e45c18ff9e96966..55fdf98c77b322abdceb3cc0490943359b1877ff 100644
--- a/Fltk/GUI.cpp
+++ b/Fltk/GUI.cpp
@@ -1,4 +1,4 @@
-// $Id: GUI.cpp,v 1.595 2007-01-25 08:56:13 geuzaine Exp $
+// $Id: GUI.cpp,v 1.596 2007-01-29 08:22:33 geuzaine Exp $
 //
 // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
 //
@@ -1678,16 +1678,16 @@ void GUI::create_option_window()
   // Buttons
 
   {
-    opt_redraw = new Fl_Return_Button((int)(width - 3.5 * BB - 3 * WB), height - BH - WB, BB, BH, "Redraw");
-    opt_redraw->callback(redraw_cb);
+    Fl_Button *o = new Fl_Button(width - BB - WB, height - BH - WB, BB, BH, "Cancel");
+    o->callback(cancel_cb, (void *)opt_window);
   }
   {
     Fl_Button *o = new Fl_Button((int)(width - 2.5 * BB - 2 * WB), height - BH - WB, (int)(1.5 * BB), BH, "Save as defaults");
     o->callback(options_save_cb);
   }
   {
-    Fl_Button *o = new Fl_Button(width - BB - WB, height - BH - WB, BB, BH, "Cancel");
-    o->callback(cancel_cb, (void *)opt_window);
+    opt_redraw = new Fl_Return_Button((int)(width - 3.5 * BB - 3 * WB), height - BH - WB, BB, BH, "Redraw");
+    opt_redraw->callback(redraw_cb);
   }
 
   // Selection browser
diff --git a/Geo/MElement.h b/Geo/MElement.h
index 2d01526fc70d7a48e49619cdc9c9c9c1e5e9ee98..5763e87e266ef4a2cfcab51d3a6f3ac4c202411b 100644
--- a/Geo/MElement.h
+++ b/Geo/MElement.h
@@ -469,18 +469,15 @@ class MQuadrangle8 : public MQuadrangle {
     };
     return MEdge(getVertex(edges_qua8[num][0]), getVertex(edges_qua8[num][1]));
   }
-  virtual int getNumFacesRep(){ return 5; }
+  virtual int getNumFacesRep(){ return 6; }
   virtual MFace getFaceRep(int num)
   { 
-    static const int trifaces_qua8[4][3] = {
-      {0, 4, 7}, {1, 5, 4}, {2, 6, 5}, {3, 7, 6}
+    static const int trifaces_qua8[6][3] = {
+      {0, 4, 7}, {1, 5, 4}, {2, 6, 5}, {3, 7, 6}, {4, 5, 6}, {4, 6, 7}
     };
-    if(num < 4)
-      return MFace(getVertex(trifaces_qua8[num][0]),
-		   getVertex(trifaces_qua8[num][1]),
-		   getVertex(trifaces_qua8[num][2]));
-    else
-      return MFace(_vs[0], _vs[1], _vs[2], _vs[3]);
+    return MFace(getVertex(trifaces_qua8[num][0]),
+		 getVertex(trifaces_qua8[num][1]),
+		 getVertex(trifaces_qua8[num][2]));
   }
   virtual int getTypeForMSH(){ return MSH_QUA_8; }
   virtual int getTypeForUNV(){ return 95; } // shell parabolic quadrilateral
@@ -529,16 +526,16 @@ class MQuadrangle9 : public MQuadrangle {
     };
     return MEdge(getVertex(edges_qua9[num][0]), getVertex(edges_qua9[num][1]));
   }
-  virtual int getNumFacesRep(){ return 4; }
+  virtual int getNumFacesRep(){ return 8; }
   virtual MFace getFaceRep(int num)
   { 
-    static const int quadfaces_qua9[4][4] = {
-      {0, 4, 8, 7}, {1, 5, 8, 4}, {2, 6, 8, 5}, {3, 7, 8, 6}
+    static const int trifaces_qua9[8][4] = {
+      {0, 4, 8}, {0, 8, 7}, {1, 5, 8}, {1, 8, 4}, 
+      {2, 6, 8}, {2, 8, 5}, {3, 7, 8}, {3, 8, 6}
     };
-    return MFace(getVertex(quadfaces_qua9[num][0]),
-		 getVertex(quadfaces_qua9[num][1]),
-		 getVertex(quadfaces_qua9[num][2]),
-		 getVertex(quadfaces_qua9[num][3]));
+    return MFace(getVertex(trifaces_qua9[num][0]),
+		 getVertex(trifaces_qua9[num][1]),
+		 getVertex(trifaces_qua9[num][2]));
   }
   virtual int getTypeForMSH(){ return MSH_QUA_9; }
   virtual int getTypeForUNV(){ return 0; } // not available
@@ -883,34 +880,20 @@ class MHexahedron20 : public MHexahedron {
     };
     return MEdge(getVertex(edges_hexa20[num][0]), getVertex(edges_hexa20[num][1]));
   }
-  virtual int getNumFacesRep(){ return 30; }
+  virtual int getNumFacesRep(){ return 36; }
   virtual MFace getFaceRep(int num)
   { 
-    static const int trifaces_hexa20[24][3] = {
-      {0, 9, 8}, {3, 13, 9}, {2, 11, 13}, {1, 8, 11},
-      {0, 8, 10}, {1, 12, 8}, {5, 16, 12}, {4, 10, 16},
-      {0, 10, 9}, {4, 17, 10}, {7, 15, 17}, {3, 9, 7},
-      {1, 11, 12}, {2, 14, 11}, {6, 18, 14}, {5, 12, 18},
-      {2, 13, 14}, {3, 15, 13}, {7, 19, 15}, {6, 14, 19},
-      {4, 16, 17}, {5, 18, 16}, {6, 19, 18}, {7, 17, 19}
+    static const int trifaces_hexa20[36][3] = {
+      {0, 9, 8}, {3, 13, 9}, {2, 11, 13}, {1, 8, 11}, {8, 9, 13}, {8, 13, 11},
+      {0, 8, 10}, {1, 12, 8}, {5, 16, 12}, {4, 10, 16}, {8, 12, 16}, {8, 16, 10},
+      {0, 10, 9}, {4, 17, 10}, {7, 15, 17}, {3, 9, 7}, {9, 10, 17}, {9, 17, 15},
+      {1, 11, 12}, {2, 14, 11}, {6, 18, 14}, {5, 12, 18}, {11, 14, 18}, {11, 18, 12},
+      {2, 13, 14}, {3, 15, 13}, {7, 19, 15}, {6, 14, 19}, {13, 15, 19}, {13, 19, 14},
+      {4, 16, 17}, {5, 18, 16}, {6, 19, 18}, {7, 17, 19}, {16, 18, 19}, {16, 19, 17}
     };
-    static const int quadfaces_hexa20[6][4] = {
-      {8, 9, 13, 11},
-      {8, 12, 16, 10},
-      {9, 10, 17, 15},
-      {11, 14, 18, 12},
-      {13, 15, 19, 14},
-      {16, 18, 19, 17}
-    };
-    if(num < 24)
-      return MFace(getVertex(trifaces_hexa20[num][0]),
-	  	   getVertex(trifaces_hexa20[num][1]),
-		   getVertex(trifaces_hexa20[num][2]));
-    else
-      return MFace(getVertex(quadfaces_hexa20[num - 24][0]),
-	  	   getVertex(quadfaces_hexa20[num - 24][1]),
-		   getVertex(quadfaces_hexa20[num - 24][2]),
-                   getVertex(quadfaces_hexa20[num - 24][3]));
+    return MFace(getVertex(trifaces_hexa20[num][0]),
+		 getVertex(trifaces_hexa20[num][1]),
+		 getVertex(trifaces_hexa20[num][2]));
   }
   virtual int getTypeForMSH(){ return MSH_HEX_20; }
   virtual int getTypeForUNV(){ return 116; } // solid parabolic brick
@@ -980,21 +963,26 @@ class MHexahedron27 : public MHexahedron {
     };
     return MEdge(getVertex(edges_hexa27[num][0]), getVertex(edges_hexa27[num][1]));
   }
-  virtual int getNumFacesRep(){ return 24; }
+  virtual int getNumFacesRep(){ return 48; }
   virtual MFace getFaceRep(int num)
   { 
-    static const int quadfaces_hexa27[24][4] = {
-      {0, 9, 20, 8}, {3, 13, 20, 9}, {2, 11, 20, 13}, {1, 8, 20, 11},
-      {0, 8, 21, 10}, {1, 12, 21, 8}, {5, 16, 21, 12}, {4, 10, 21, 16},
-      {0, 10, 22, 9}, {4, 17, 22, 10}, {7, 15, 22, 17}, {3, 9, 22, 15},
-      {1, 11, 23, 12}, {2, 14, 23, 11}, {6, 18, 23, 14}, {5, 12, 23, 18},
-      {2, 13, 24, 14}, {3, 15, 24, 13}, {7, 19, 24, 15}, {6, 14, 24, 19},
-      {4, 16, 25, 17}, {5, 18, 25, 16}, {6, 19, 25, 18}, {7, 17, 25, 19}
+    static const int trifaces_hexa27[48][3] = {
+      {0, 9, 20}, {0, 20, 8}, {3, 13, 20}, {3, 20, 9}, 
+      {2, 11, 20}, {2, 20, 13}, {1, 8, 20}, {1, 20, 11},
+      {0, 8, 21}, {0, 21, 10}, {1, 12, 21}, {1, 21, 8}, 
+      {5, 16, 21}, {5, 21, 12}, {4, 10, 21}, {4, 21, 16}, 
+      {0, 10, 22}, {0, 22, 9}, {4, 17, 22}, {4, 22, 10}, 
+      {7, 15, 22}, {7, 22, 17}, {3, 9, 22}, {3, 22, 15},  
+      {1, 11, 23}, {1, 23, 12}, {2, 14, 23}, {2, 23, 11}, 
+      {6, 18, 23}, {6, 23, 14}, {5, 12, 23}, {5, 23, 18}, 
+      {2, 13, 24}, {2, 24, 14}, {3, 15, 24}, {3, 24, 13}, 
+      {7, 19, 24}, {7, 24, 15}, {6, 14, 24}, {6, 24, 19}, 
+      {4, 16, 25}, {4, 25, 17}, {5, 18, 25}, {5, 25, 16}, 
+      {6, 19, 25}, {6, 25, 18}, {7, 17, 25}, {7, 25, 19}  
     };
-    return MFace(getVertex(quadfaces_hexa27[num][0]),
-		 getVertex(quadfaces_hexa27[num][1]),
-		 getVertex(quadfaces_hexa27[num][2]),
-		 getVertex(quadfaces_hexa27[num][3]));
+    return MFace(getVertex(trifaces_hexa27[num][0]),
+		 getVertex(trifaces_hexa27[num][1]),
+		 getVertex(trifaces_hexa27[num][2]));
   }
   virtual int getTypeForMSH(){ return MSH_HEX_27; }
   virtual int getTypeForUNV(){ return 0; } // not available
@@ -1149,30 +1137,19 @@ class MPrism15 : public MPrism {
     };
     return MEdge(getVertex(edges_prism15[num][0]), getVertex(edges_prism15[num][1]));
   }
-  virtual int getNumFacesRep(){ return 23; }
+  virtual int getNumFacesRep(){ return 26; }
   virtual MFace getFaceRep(int num)
   { 
-    static const int trifaces_prism15[20][3] = {
+    static const int trifaces_prism15[26][3] = {
       {0, 7, 6}, {2, 9, 7}, {1, 6, 9}, {6, 7, 9},
       {3, 12, 13}, {4, 14, 12}, {5, 13, 14}, {12, 14, 13},
-      {0, 6, 8}, {1, 10, 6}, {4, 12, 10}, {3, 8, 12},
-      {0, 8, 7}, {3, 13, 8}, {5, 11, 13}, {2, 7, 11},
-      {1, 9, 10}, {2, 11, 9}, {5, 14, 11}, {4, 10, 14}
-    };
-    static const int quadfaces_prism15[3][4] = {
-      {6, 10, 12, 8},
-      {7, 8, 13, 11},
-      {9, 11, 14, 10}
+      {0, 6, 8}, {1, 10, 6}, {4, 12, 10}, {3, 8, 12}, {6, 10, 12}, {6, 12, 8},
+      {0, 8, 7}, {3, 13, 8}, {5, 11, 13}, {2, 7, 11}, {7, 8, 13}, {7, 13, 11},
+      {1, 9, 10}, {2, 11, 9}, {5, 14, 11}, {4, 10, 14}, {9, 11, 14}, {9, 14, 10}
     };
-    if(num < 20)
-      return MFace(getVertex(trifaces_prism15[num][0]),
-	  	   getVertex(trifaces_prism15[num][1]),
-		   getVertex(trifaces_prism15[num][2]));
-    else
-      return MFace(getVertex(quadfaces_prism15[num - 20][0]),
-	  	   getVertex(quadfaces_prism15[num - 20][1]),
-		   getVertex(quadfaces_prism15[num - 20][2]),
-                   getVertex(quadfaces_prism15[num - 20][3]));
+    return MFace(getVertex(trifaces_prism15[num][0]),
+		 getVertex(trifaces_prism15[num][1]),
+		 getVertex(trifaces_prism15[num][2]));
   }
   virtual int getTypeForMSH(){ return MSH_PRI_15; }
   virtual int getTypeForUNV(){ return 113; } // solid parabolic wedge
@@ -1232,27 +1209,22 @@ class MPrism18 : public MPrism {
     };
     return MEdge(getVertex(edges_prism18[num][0]), getVertex(edges_prism18[num][1]));
   }
-  virtual int getNumFacesRep(){ return 20; }
+  virtual int getNumFacesRep(){ return 32; }
   virtual MFace getFaceRep(int num)
   { 
-    static const int trifaces_prism18[8][3] = {
+    static const int trifaces_prism18[32][3] = {
       {0, 7, 6}, {2, 9, 7}, {1, 6, 9}, {6, 7, 9},
       {3, 12, 13}, {4, 14, 12}, {5, 13, 14}, {12, 14, 13},
+      {0, 6, 15}, {0, 15, 8}, {1, 10, 15}, {1, 15, 6},  
+      {4, 12, 15}, {4, 15, 10}, {3, 8, 15}, {3, 15, 12},  
+      {0, 8, 16}, {0, 16, 7}, {3, 13, 16}, {3, 16, 8},  
+      {5, 11, 16}, {5, 16, 13}, {2, 7, 16}, {2, 16, 11},  
+      {1, 9, 17}, {1, 17, 10}, {2, 11, 17}, {2, 17, 9},  
+      {5, 14, 17}, {5, 17, 11}, {4, 10, 17}, {4, 17, 14}
     };
-    static const int quadfaces_prism18[12][4] = {
-      {0, 6, 15, 8}, {1, 10, 15, 6}, {4, 12, 15, 10}, {3, 8, 15, 12},
-      {0, 8, 16, 7}, {3, 13, 16, 8}, {5, 11, 16, 13}, {2, 7, 16, 11},
-      {1, 9, 17, 10}, {2, 11, 17, 9}, {5, 14, 17, 11}, {4, 10, 17, 14}
-    };
-    if(num < 8)
-      return MFace(getVertex(trifaces_prism18[num][0]),
-	  	   getVertex(trifaces_prism18[num][1]),
-		   getVertex(trifaces_prism18[num][2]));
-    else
-      return MFace(getVertex(quadfaces_prism18[num - 8][0]),
-	  	   getVertex(quadfaces_prism18[num - 8][1]),
-		   getVertex(quadfaces_prism18[num - 8][2]),
-                   getVertex(quadfaces_prism18[num - 8][3]));
+    return MFace(getVertex(trifaces_prism18[num][0]),
+		 getVertex(trifaces_prism18[num][1]),
+		 getVertex(trifaces_prism18[num][2]));
   }
   virtual int getTypeForMSH(){ return MSH_PRI_18; }
   virtual int getTypeForUNV(){ return 0; } // not available
@@ -1312,18 +1284,12 @@ class MPyramid : public MElement {
       {1, 2, 4},
       {2, 3, 4}
     };
-    static const int quadfaces_pyramid[1][4] = {
-      {0, 3, 2, 1}
-    };
     if(num < 4)
       return MFace(_v[trifaces_pyramid[num][0]],
 		   _v[trifaces_pyramid[num][1]],
 		   _v[trifaces_pyramid[num][2]]);
     else
-      return MFace(_v[quadfaces_pyramid[num - 4][0]],
-		   _v[quadfaces_pyramid[num - 4][1]],
-		   _v[quadfaces_pyramid[num - 4][2]],
-		   _v[quadfaces_pyramid[num - 4][3]]);
+      return MFace(_v[0], _v[3], _v[2], _v[1]);
   }
   virtual int getTypeForMSH(){ return MSH_PYR_5; }
   virtual int getTypeForUNV(){ return 0; } // not available
@@ -1388,28 +1354,19 @@ class MPyramid13 : public MPyramid {
     };
     return MEdge(getVertex(edges_pyramid13[num][0]), getVertex(edges_pyramid13[num][1]));
   }
-  virtual int getNumFacesRep(){ return 21; }
+  virtual int getNumFacesRep(){ return 22; }
   virtual MFace getFaceRep(int num)
   { 
-    static const int trifaces_pyramid13[20][3] = {
+    static const int trifaces_pyramid13[22][3] = {
       {0, 5, 7}, {1, 9, 5}, {4, 7, 9}, {5, 9, 7},
       {3, 6, 12}, {0, 7, 6}, {4, 12, 7}, {6, 7, 12},
       {1, 8, 9}, {2, 11, 8}, {4, 9, 11}, {8, 11, 9},
       {2, 10, 11}, {3, 12, 10}, {4, 11, 12}, {10, 12, 11},
-      {0, 6, 5}, {3, 10, 6}, {2, 8, 10}, {1, 5, 8}
+      {0, 6, 5}, {3, 10, 6}, {2, 8, 10}, {1, 5, 8}, {5, 6, 10}, {5, 10, 8}
     };
-    static const int quadfaces_pyramid13[1][4] = {
-      {5, 6, 10, 8}
-    };
-    if(num < 20)
-      return MFace(getVertex(trifaces_pyramid13[num][0]),
-	  	   getVertex(trifaces_pyramid13[num][1]),
-		   getVertex(trifaces_pyramid13[num][2]));
-    else
-      return MFace(getVertex(quadfaces_pyramid13[num - 20][0]),
-	  	   getVertex(quadfaces_pyramid13[num - 20][1]),
-		   getVertex(quadfaces_pyramid13[num - 20][2]),
-                   getVertex(quadfaces_pyramid13[num - 20][3]));
+    return MFace(getVertex(trifaces_pyramid13[num][0]),
+		 getVertex(trifaces_pyramid13[num][1]),
+		 getVertex(trifaces_pyramid13[num][2]));
   }
   virtual int getTypeForMSH(){ return MSH_PYR_13; }
   virtual int getTypeForUNV(){ return 0; } // not available
@@ -1466,27 +1423,20 @@ class MPyramid14 : public MPyramid {
     };
     return MEdge(getVertex(edges_pyramid14[num][0]), getVertex(edges_pyramid14[num][1]));
   }
-  virtual int getNumFacesRep(){ return 20; }
+  virtual int getNumFacesRep(){ return 24; }
   virtual MFace getFaceRep(int num)
   { 
-    static const int trifaces_pyramid14[16][3] = {
+    static const int trifaces_pyramid14[24][3] = {
       {0, 5, 7}, {1, 9, 5}, {4, 7, 9}, {5, 9, 7},
       {3, 6, 12}, {0, 7, 6}, {4, 12, 7}, {6, 7, 12},
       {1, 8, 9}, {2, 11, 8}, {4, 9, 11}, {8, 11, 9},
-      {2, 10, 11}, {3, 12, 10}, {4, 11, 12}, {10, 12, 11}
-    };
-    static const int quadfaces_pyramid14[4][4] = {
-      {0, 6, 13, 5}, {3, 10, 13, 6}, {2, 8, 13, 10}, {1, 5, 13, 8}
+      {2, 10, 11}, {3, 12, 10}, {4, 11, 12}, {10, 12, 11},
+      {0, 6, 13}, {0, 13, 5}, {3, 10, 13}, {3, 13, 6}, 
+      {2, 8, 13}, {2, 13, 10}, {1, 5, 13}, {1, 13, 8}
     };
-    if(num < 16)
-      return MFace(getVertex(trifaces_pyramid14[num][0]),
-	  	   getVertex(trifaces_pyramid14[num][1]),
-		   getVertex(trifaces_pyramid14[num][2]));
-    else
-      return MFace(getVertex(quadfaces_pyramid14[num - 16][0]),
-	  	   getVertex(quadfaces_pyramid14[num - 16][1]),
-		   getVertex(quadfaces_pyramid14[num - 16][2]),
-                   getVertex(quadfaces_pyramid14[num - 16][3]));
+    return MFace(getVertex(trifaces_pyramid14[num][0]),
+		 getVertex(trifaces_pyramid14[num][1]),
+		 getVertex(trifaces_pyramid14[num][2]));
   }
   virtual int getTypeForMSH(){ return MSH_PYR_14; }
   virtual int getTypeForUNV(){ return 0; } // not available
diff --git a/Parser/OpenFile.cpp b/Parser/OpenFile.cpp
index 845e4a7a27552e3dc5ecf47901a1b9d203214dd3..bddc29afdf1c77285f256c1cafb8e00f1035af84 100644
--- a/Parser/OpenFile.cpp
+++ b/Parser/OpenFile.cpp
@@ -1,4 +1,4 @@
-// $Id: OpenFile.cpp,v 1.140 2007-01-18 13:18:42 geuzaine Exp $
+// $Id: OpenFile.cpp,v 1.141 2007-01-29 08:22:34 geuzaine Exp $
 //
 // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
 //
@@ -250,6 +250,7 @@ void ParseString(char *str)
     fprintf(fp, "\n");
     fclose(fp);
     ParseFile(CTX.tmp_filename_fullpath, 1);
+    if(GMODEL) GMODEL->importTHEM();
   }
 }