diff --git a/Geo/MElement.cpp b/Geo/MElement.cpp
index 4914775dd8b4b36cbc797055e4c4ae0f1564349f..50ffe11dad6d8854ee0539493995130e96efbd85 100644
--- a/Geo/MElement.cpp
+++ b/Geo/MElement.cpp
@@ -77,6 +77,19 @@ void MElement::_getEdgeRep(MVertex *v0, MVertex *v1,
   }
 }
 
+void MElement::_getFaceRepQuad(MVertex *v0, MVertex *v1, MVertex *v2, MVertex *v3,
+                               double *x, double *y, double *z, SVector3 *n)
+{
+  x[0] = v0->x(); x[1] = v1->x(); x[2] = (x[0]+x[1]+v2->x()+v3->x())/4;
+  y[0] = v0->y(); y[1] = v1->y(); y[2] = (y[0]+y[1]+v2->y()+v3->y())/4;
+  z[0] = v0->z(); z[1] = v1->z(); z[2] = (z[0]+z[1]+v2->z()+v3->z())/4;;
+  SVector3 t1(x[1] - x[0], y[1] - y[0], z[1] - z[0]);
+  SVector3 t2(x[2] - x[0], y[2] - y[0], z[2] - z[0]);
+  SVector3 normal = crossprod(t1, t2);
+  normal.normalize();
+  for(int i = 0; i < 3; i++) n[i] = normal;
+}
+
 void MElement::_getFaceRep(MVertex *v0, MVertex *v1, MVertex *v2,
                            double *x, double *y, double *z, SVector3 *n)
 {
diff --git a/Geo/MElement.h b/Geo/MElement.h
index cf86a181b4c360fc157a8623725ac20c5c056599..fc841446370c4d140368c37c4e70bfb0e30cafff 100644
--- a/Geo/MElement.h
+++ b/Geo/MElement.h
@@ -43,6 +43,8 @@ class MElement
                    int faceIndex=-1);
   void _getFaceRep(MVertex *v0, MVertex *v1, MVertex *v2,
                    double *x, double *y, double *z, SVector3 *n);
+  void _getFaceRepQuad(MVertex *v0, MVertex *v1, MVertex *v2, MVertex *v3,
+                       double *x, double *y, double *z, SVector3 *n);
  public :
   MElement(int num=0, int part=0);
   virtual ~MElement(){}
diff --git a/Geo/MHexahedron.h b/Geo/MHexahedron.h
index ba874743441510d1c514e54555af6fd464da08d6..1ed4c5b5f87105f068003d7702dab1ca47d3cd5d 100644
--- a/Geo/MHexahedron.h
+++ b/Geo/MHexahedron.h
@@ -87,18 +87,29 @@ class MHexahedron : public MElement {
   virtual double getInnerRadius();
   virtual double angleShapeMeasure();
   virtual void getFaceInfo(const MFace & face, int &ithFace, int &sign, int &rot) const;
-  virtual int getNumFacesRep(bool curved){ return 12; }
+  virtual int getNumFacesRep(bool curved){ return 24; }
   virtual void getFaceRep(bool curved, int num, double *x, double *y, double *z, SVector3 *n)
   {
-    static const int f[12][3] = {
-      {0, 3, 2}, {0, 2, 1},
-      {0, 1, 5}, {0, 5, 4},
-      {0, 4, 7}, {0, 7, 3},
-      {1, 2, 6}, {1, 6, 5},
-      {2, 3, 7}, {2, 7, 6},
-      {4, 5, 6}, {4, 6, 7}
+//    static const int f[12][3] = {
+//      {0, 3, 2}, {0, 2, 1},
+//      {0, 1, 5}, {0, 5, 4},
+//      {0, 4, 7}, {0, 7, 3},
+//      {1, 2, 6}, {1, 6, 5},
+//      {2, 3, 7}, {2, 7, 6},
+//      {4, 5, 6}, {4, 6, 7}
+//    };
+//    _getFaceRep(_v[f[num][0]], _v[f[num][1]], _v[f[num][2]], x, y, z, n);
+    static const int f[24][4] = {
+      {0, 3, 2, 1}, {3, 2, 1, 0}, {2, 1, 0, 3}, {1, 0, 3, 2},
+      {0, 1, 5, 4}, {1, 5, 4, 0}, {5, 4, 0, 1}, {4, 0, 1, 5},
+      {0, 4, 7, 3}, {4, 7, 3, 0}, {7, 3, 0, 4}, {3, 0, 4, 7},
+      {1, 2, 6, 5}, {2, 6, 5, 1}, {6, 5, 1, 2}, {5, 1, 2, 6},
+      {2, 3, 7, 6}, {3, 7, 6, 2}, {7, 6, 2, 3}, {6, 2, 3, 7},
+      {4, 5, 6, 7}, {5, 6, 7, 4}, {6, 7, 4, 5}, {7, 4, 5, 6}
     };
-    _getFaceRep(_v[f[num][0]], _v[f[num][1]], _v[f[num][2]], x, y, z, n);
+    _getFaceRepQuad(getVertex(f[num][0]), getVertex(f[num][1]),
+                    getVertex(f[num][2]), getVertex(f[num][3]),
+                    x, y, z, n);
   }
   virtual void getFaceVertices(const int num, std::vector<MVertex*> &v) const
   {
diff --git a/Geo/MPrism.h b/Geo/MPrism.h
index bfbde23d5f91855236ff49859fce46ff2cf96a9c..428a438b2f7a66130f25ea590453f95f8eb5c3d0 100644
--- a/Geo/MPrism.h
+++ b/Geo/MPrism.h
@@ -92,17 +92,31 @@ class MPrism : public MElement {
                    _v[faces_prism(num, 2)],
                    _v[faces_prism(num, 3)]);
   }
-  virtual int getNumFacesRep(bool curved){ return 8; }
+  virtual int getNumFacesRep(bool curved){ return 14; }
   virtual void getFaceRep(bool curved, int num, double *x, double *y, double *z, SVector3 *n)
   {
-    static const int f[8][3] = {
-      {0, 2, 1},
-      {3, 4, 5},
-      {0, 1, 4}, {0, 4, 3},
-      {0, 3, 5}, {0, 5, 2},
-      {1, 2, 5}, {1, 5, 4}
+//    static const int f[8][3] = {
+//      {0, 2, 1},
+//      {3, 4, 5},
+//      {0, 1, 4}, {0, 4, 3},
+//      {0, 3, 5}, {0, 5, 2},
+//      {1, 2, 5}, {1, 5, 4}
+//    };
+//    _getFaceRep(_v[f[num][0]], _v[f[num][1]], _v[f[num][2]], x, y, z, n);
+    static const int f[14][4] = {
+      {0, 2, 1, -1},
+      {3, 4, 5, -1},
+      {0, 1, 4, 3}, {1, 4, 3, 0}, {4, 3, 0, 1}, {3, 0, 1, 4},
+      {1, 2, 5, 4}, {2, 5, 4, 1}, {5, 4, 1, 2}, {4, 1, 2, 5},
+      {2, 0, 3, 5}, {0, 3, 5, 2}, {3, 5, 2, 0}, {5, 2, 0, 3}
     };
-    _getFaceRep(_v[f[num][0]], _v[f[num][1]], _v[f[num][2]], x, y, z, n);
+    if (num < 2)
+      _getFaceRep(getVertex(f[num][0]), getVertex(f[num][1]), getVertex(f[num][2]),
+                  x, y, z, n);
+    else
+      _getFaceRepQuad(getVertex(f[num][0]), getVertex(f[num][1]),
+                      getVertex(f[num][2]), getVertex(f[num][3]),
+                      x, y, z, n);
   }
   virtual void getFaceVertices(const int num, std::vector<MVertex*> &v) const
   {
diff --git a/Geo/MPyramid.h b/Geo/MPyramid.h
index 3bfe80a329da5966e1172e7cc5ea4de2663a76f0..9bf4c6ac6605f8c3c28291d4b04c379a61ab654b 100644
--- a/Geo/MPyramid.h
+++ b/Geo/MPyramid.h
@@ -97,7 +97,7 @@ class MPyramid : public MElement {
     else
       return MFace(_v[0], _v[3], _v[2], _v[1]);
   }
-  virtual int getNumFacesRep(bool curved){ return 6; }
+  virtual int getNumFacesRep(bool curved){ return 8; }
   virtual void getFaceRep(bool curved, int num, double *x, double *y, double *z,
                           SVector3 *n)
   {
@@ -110,6 +110,20 @@ class MPyramid : public MElement {
     };
     _getFaceRep(getVertex(f[num][0]), getVertex(f[num][1]), getVertex(f[num][2]),
                 x, y, z, n);
+//    static const int f[8][4] = {
+//      {0, 1, 4, -1},
+//      {1, 2, 4, -1},
+//      {2, 3, 4, -1},
+//      {3, 0, 4, -1},
+//      {0, 3, 2, 1}, {3, 2, 1, 0}, {2, 1, 0, 3}, {1, 0, 3, 2}
+//    };
+//    if (num < 4)
+//      _getFaceRep(getVertex(f[num][0]), getVertex(f[num][1]), getVertex(f[num][2]),
+//                  x, y, z, n);
+//    else
+//      _getFaceRepQuad(getVertex(f[num][0]), getVertex(f[num][1]),
+//                      getVertex(f[num][2]), getVertex(f[num][3]),
+//                      x, y, z, n);
   }
   virtual void getFaceVertices(const int num, std::vector<MVertex*> &v) const
   {
diff --git a/Geo/MQuadrangle.h b/Geo/MQuadrangle.h
index 15cb09446efdc2fdf675c7d849e84a9403fadfc1..da5f351de0b325d1970196f826fce93ef9b812e9 100644
--- a/Geo/MQuadrangle.h
+++ b/Geo/MQuadrangle.h
@@ -91,13 +91,20 @@ class MQuadrangle : public MElement {
   }
   virtual int getNumFaces(){ return 1; }
   virtual MFace getFace(int num){ return MFace(_v[0], _v[1], _v[2], _v[3]); }
-  virtual int getNumFacesRep(bool curved){ return 2; }
+  virtual int getNumFacesRep(bool curved){ return 4; }
   virtual void getFaceRep(bool curved, int num, double *x, double *y, double *z, SVector3 *n)
   {
-    static const int f[2][3] = {
-      {0, 1, 2}, {0, 2, 3}
+//    static const int f[2][3] = {
+//      {0, 1, 2}, {0, 2, 3}
+//    };
+//    _getFaceRep(_v[f[num][0]], _v[f[num][1]], _v[f[num][2]], x, y, z, n);
+
+    static const int f[4][4] = {
+      {0, 1, 2, 3}, {1, 2, 3, 0}, {2, 3, 0, 1}, {3, 0, 1, 2}
     };
-    _getFaceRep(_v[f[num][0]], _v[f[num][1]], _v[f[num][2]], x, y, z, n);
+    _getFaceRepQuad(getVertex(f[num][0]), getVertex(f[num][1]),
+                    getVertex(f[num][2]), getVertex(f[num][3]),
+                    x, y, z, n);
   }
   virtual void getFaceVertices(const int num, std::vector<MVertex*> &v) const
   {