diff --git a/Geo/MElement.cpp b/Geo/MElement.cpp
index 50ffe11dad6d8854ee0539493995130e96efbd85..50e4f519c9edd127ce0f2fdd49ef3036380c7673 100644
--- a/Geo/MElement.cpp
+++ b/Geo/MElement.cpp
@@ -77,6 +77,7 @@ void MElement::_getEdgeRep(MVertex *v0, MVertex *v1,
   }
 }
 
+#if defined(HAVE_VISUDEV)
 void MElement::_getFaceRepQuad(MVertex *v0, MVertex *v1, MVertex *v2, MVertex *v3,
                                double *x, double *y, double *z, SVector3 *n)
 {
@@ -89,6 +90,7 @@ void MElement::_getFaceRepQuad(MVertex *v0, MVertex *v1, MVertex *v2, MVertex *v
   normal.normalize();
   for(int i = 0; i < 3; i++) n[i] = normal;
 }
+#endif
 
 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 fc841446370c4d140368c37c4e70bfb0e30cafff..f9e20c25ce9964a0b6524f4f87c4f5da4f082199 100644
--- a/Geo/MElement.h
+++ b/Geo/MElement.h
@@ -43,8 +43,10 @@ class MElement
                    int faceIndex=-1);
   void _getFaceRep(MVertex *v0, MVertex *v1, MVertex *v2,
                    double *x, double *y, double *z, SVector3 *n);
+#if defined(HAVE_VISUDEV)
   void _getFaceRepQuad(MVertex *v0, MVertex *v1, MVertex *v2, MVertex *v3,
                        double *x, double *y, double *z, SVector3 *n);
+#endif
  public :
   MElement(int num=0, int part=0);
   virtual ~MElement(){}
diff --git a/Geo/MHexahedron.cpp b/Geo/MHexahedron.cpp
index c7075e7717e1cb826406bcebba3793b71d5e3c44..eb7e9d4a98ce37aaf80fdcb2ca1937df97aa1e9c 100644
--- a/Geo/MHexahedron.cpp
+++ b/Geo/MHexahedron.cpp
@@ -370,6 +370,39 @@ void _myGetFaceRep(MHexahedron *hex, int num, double *x, double *y, double *z,
   n[2] = n[0];
 }
 
+void MHexahedron::getFaceRep(bool curved, int num,
+                             double *x, double *y, double *z, SVector3 *n)
+{
+#if defined(HAVE_VISUDEV)
+  static const int fquad[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}
+  };
+  if (CTX::instance()->heavyVisu) {
+    if (CTX::instance()->mesh.numSubEdges > 1) {
+      _myGetFaceRep(this, num, x, y, z, n, CTX::instance()->mesh.numSubEdges);
+      return;
+    }
+    _getFaceRepQuad(getVertex(fquad[num][0]), getVertex(fquad[num][1]),
+                    getVertex(fquad[num][2]), getVertex(fquad[num][3]),
+                    x, y, z, n);
+    return;
+  }
+#endif
+  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);
+}
 
 void MHexahedron20::getFaceRep(bool curved, int num,
                                double *x, double *y, double *z, SVector3 *n)
@@ -392,13 +425,24 @@ void MHexahedronN::getFaceRep(bool curved, int num,
   else MHexahedron::getFaceRep(false, num, x, y, z, n);
 }
 
+int MHexahedron::getNumFacesRep(bool curved)
+{
+#if defined(HAVE_VISUDEV)
+  if (CTX::instance()->heavyVisu) {
+    if (CTX::instance()->mesh.numSubEdges == 1) return 24;
+    return 6 * 2 * CTX::instance()->mesh.numSubEdges
+           * CTX::instance()->mesh.numSubEdges;
+  }
+#endif
+  return 12;
+}
+
 int MHexahedron20::getNumFacesRep(bool curved)
 {
   return curved ? 6 * (CTX::instance()->mesh.numSubEdges *
                        CTX::instance()->mesh.numSubEdges * 2) : 12;
 }
 
-
 int MHexahedron27::getNumFacesRep(bool curved)
 {
   return curved ? 6 * (CTX::instance()->mesh.numSubEdges *
@@ -411,41 +455,6 @@ int MHexahedronN::getNumFacesRep(bool curved)
                        CTX::instance()->mesh.numSubEdges * 2) : 12;
 }
 
-int MHexahedron::getNumFacesRep(bool curved)
-{
-  if (CTX::instance()->mesh.numSubEdges == 1) return 24;
-  return 6 * (CTX::instance()->mesh.numSubEdges *
-              CTX::instance()->mesh.numSubEdges * 2);
-}
-
-void MHexahedron::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}
-//    };
-//    _getFaceRep(_v[f[num][0]], _v[f[num][1]], _v[f[num][2]], x, y, z, n);
-  if (CTX::instance()->mesh.numSubEdges > 1) {
-    _myGetFaceRep(this, num, x, y, z, n, CTX::instance()->mesh.numSubEdges);
-    return;
-  }
-  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}
-  };
-  _getFaceRepQuad(getVertex(f[num][0]), getVertex(f[num][1]),
-                  getVertex(f[num][2]), getVertex(f[num][3]),
-                  x, y, z, n);
-}
-
 void _getIndicesReversedHex(int order, indicesReversed &indices)
 {
   fullMatrix<double> ref = gmshGenerateMonomialsHexahedron(order);
diff --git a/Geo/MPrism.h b/Geo/MPrism.h
index 428a438b2f7a66130f25ea590453f95f8eb5c3d0..6592f1f406e84bcdb9ed2e762704213d1eb88d22 100644
--- a/Geo/MPrism.h
+++ b/Geo/MPrism.h
@@ -8,6 +8,10 @@
 
 #include "MElement.h"
 
+#if defined(HAVE_VISUDEV)
+#include <Context.h>
+#endif
+
 /*
  * MPrism
  *
@@ -92,31 +96,37 @@ class MPrism : public MElement {
                    _v[faces_prism(num, 2)],
                    _v[faces_prism(num, 3)]);
   }
-  virtual int getNumFacesRep(bool curved){ return 14; }
+  virtual int getNumFacesRep(bool curved)
+  {
+#if defined(HAVE_VISUDEV)
+    if (CTX::instance()->heavyVisu) return 14;
+#endif
+    return 8;
+  }
   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}
-//    };
-//    _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}
+#if defined(HAVE_VISUDEV)
+    static const int fquad[12][4] = {
+        {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}
     };
-    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]),
+    if (CTX::instance()->heavyVisu && num > 1) {
+      int i = num - 2;
+      _getFaceRepQuad(getVertex(fquad[i][0]), getVertex(fquad[i][1]),
+                      getVertex(fquad[i][2]), getVertex(fquad[i][3]),
                       x, y, z, n);
+      return;
+    }
+#endif
+    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);
   }
   virtual void getFaceVertices(const int num, std::vector<MVertex*> &v) const
   {
diff --git a/Geo/MPyramid.h b/Geo/MPyramid.h
index 9bf4c6ac6605f8c3c28291d4b04c379a61ab654b..c56db5eb57aee1fbe364bdf1c7e45661c78c70bf 100644
--- a/Geo/MPyramid.h
+++ b/Geo/MPyramid.h
@@ -8,6 +8,10 @@
 
 #include "MElement.h"
 
+#if defined(HAVE_VISUDEV)
+#include <Context.h>
+#endif
+
 /*
  * MPyramid
  *
@@ -97,10 +101,28 @@ class MPyramid : public MElement {
     else
       return MFace(_v[0], _v[3], _v[2], _v[1]);
   }
-  virtual int getNumFacesRep(bool curved){ return 8; }
+  virtual int getNumFacesRep(bool curved)
+  {
+#if defined(HAVE_VISUDEV)
+    if (CTX::instance()->heavyVisu) return 8;
+#endif
+    return 6;
+  }
   virtual void getFaceRep(bool curved, int num, double *x, double *y, double *z,
                           SVector3 *n)
   {
+#if defined(HAVE_VISUDEV)
+    static const int fquad[4][4] = {
+        {0, 3, 2, 1}, {3, 2, 1, 0}, {2, 1, 0, 3}, {1, 0, 3, 2}
+    };
+    if (CTX::instance()->heavyVisu && num > 3) {
+      int i = num - 4;
+      _getFaceRepQuad(getVertex(fquad[i][0]), getVertex(fquad[i][1]),
+                      getVertex(fquad[i][2]), getVertex(fquad[i][3]),
+                      x, y, z, n);
+      return;
+    }
+#endif
     static const int f[6][3] = {
       {0, 1, 4},
       {3, 0, 4},
@@ -110,20 +132,6 @@ 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 da5f351de0b325d1970196f826fce93ef9b812e9..643f4fdf77486182893b3b9b3d6e3689ba058eb3 100644
--- a/Geo/MQuadrangle.h
+++ b/Geo/MQuadrangle.h
@@ -8,6 +8,10 @@
 
 #include "MElement.h"
 
+#if defined(HAVE_VISUDEV)
+#include <Context.h>
+#endif
+
 /*
  * MQuadrangle
  *
@@ -91,20 +95,30 @@ 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 4; }
+  virtual int getNumFacesRep(bool curved)
+  {
+#if defined(HAVE_VISUDEV)
+    if (CTX::instance()->heavyVisu) return 4;
+#endif
+    return 2;
+  }
   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}
-//    };
-//    _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}
+#if defined(HAVE_VISUDEV)
+    static const int fquad[4][4] = {
+        {0, 1, 2, 3}, {1, 2, 3, 0}, {2, 3, 0, 1}, {3, 0, 1, 2}
+    };
+    if (CTX::instance()->heavyVisu) {
+      _getFaceRepQuad(getVertex(fquad[num][0]), getVertex(fquad[num][1]),
+                      getVertex(fquad[num][2]), getVertex(fquad[num][3]),
+                      x, y, z, n);
+      return;
+    }
+#endif
+    static const int f[2][3] = {
+        {0, 1, 2}, {0, 2, 3}
     };
-    _getFaceRepQuad(getVertex(f[num][0]), getVertex(f[num][1]),
-                    getVertex(f[num][2]), getVertex(f[num][3]),
-                    x, y, z, n);
+    _getFaceRep(_v[f[num][0]], _v[f[num][1]], _v[f[num][2]], x, y, z, n);
   }
   virtual void getFaceVertices(const int num, std::vector<MVertex*> &v) const
   {