diff --git a/Geo/MFace.cpp b/Geo/MFace.cpp
index 10c407262e39aa2a9f50658775153663ca5f796b..725cb2530c38b3ad9d53adb8669c56c9a04643c6 100644
--- a/Geo/MFace.cpp
+++ b/Geo/MFace.cpp
@@ -57,6 +57,15 @@ MFace::MFace(std::vector<MVertex*> v)
   sortVertices(_v,_si);
 }
 
+double MFace::approximateArea() const
+{
+  SPoint3 p0 = _v[0]->point(), p1 = _v[1]->point(), p2 = _v[2]->point();
+  double a = triangle_area(p0, p1, p2);
+  if (_v.size() == 3) return a;
+  a += triangle_area(p0, p2, _v[3]->point());
+  return a;
+}
+
 SVector3 MFace::normal() const
 {
   double n[3];
diff --git a/Geo/MFace.h b/Geo/MFace.h
index 4cf0fc8c97ffa44dd91e9cf139d0b99b17c2c382..cbb072fcc683534fb1bd08a09a7fe48d326730b4 100644
--- a/Geo/MFace.h
+++ b/Geo/MFace.h
@@ -43,6 +43,7 @@ class MFace {
     for(int i = 0; i < getNumVertices(); i++)
       verts[i] = getSortedVertex(i);
   }
+  double approximateArea() const;
   SVector3 normal() const;
   SVector3 tangent(int num) const
   {
diff --git a/contrib/HighOrderMeshOptimizer/OptHomFastCurving.cpp b/contrib/HighOrderMeshOptimizer/OptHomFastCurving.cpp
index f056d5850655c40e4031652f7da78155215caf35..cd3b6cdaaf77fa66c7fe2f5bce05246e4ca9e9b2 100644
--- a/contrib/HighOrderMeshOptimizer/OptHomFastCurving.cpp
+++ b/contrib/HighOrderMeshOptimizer/OptHomFastCurving.cpp
@@ -317,13 +317,13 @@ void getOppositeFacePrism(MElement *el, const MFace &elBaseFace,
   elTopFace = MFace(topVert);
 
   // Compute min. (side faces) and max. (top face) face areas
-  faceSurfMax = elTopFace.area();
+  faceSurfMax = elTopFace.approximateArea();
   MFace sideFace0 = el->getFace(2);
-  faceSurfMin = sideFace0.area();
+  faceSurfMin = sideFace0.approximateArea();
   MFace sideFace1 = el->getFace(3);
-  faceSurfMin = std::min(faceSurfMin, sideFace1.area());
+  faceSurfMin = std::min(faceSurfMin, sideFace1.approximateArea());
   MFace sideFace2 = el->getFace(4);
-  faceSurfMin = std::min(faceSurfMin, sideFace2.area());
+  faceSurfMin = std::min(faceSurfMin, sideFace2.approximateArea());
 }
 
 
@@ -364,15 +364,15 @@ void getOppositeFaceHex(MElement *el, const MFace &elBaseFace, MFace &elTopFace,
   elTopFace = MFace(topVert);
 
   // Compute min. (side faces) and max. (top face) face areas
-  faceSurfMax = elTopFace.area();
+  faceSurfMax = elTopFace.approximateArea();
   MFace sideFace0 = el->getFace(sideFace[0]);
-  faceSurfMin = sideFace0.area();
+  faceSurfMin = sideFace0.approximateArea();
   MFace sideFace1 = el->getFace(sideFace[1]);
-  faceSurfMin = std::min(faceSurfMin, sideFace1.area());
+  faceSurfMin = std::min(faceSurfMin, sideFace1.approximateArea());
   MFace sideFace2 = el->getFace(sideFace[2]);
-  faceSurfMin = std::min(faceSurfMin, sideFace2.area());
+  faceSurfMin = std::min(faceSurfMin, sideFace2.approximateArea());
   MFace sideFace3 = el->getFace(sideFace[3]);
-  faceSurfMin = std::min(faceSurfMin, sideFace3.area());
+  faceSurfMin = std::min(faceSurfMin, sideFace3.approximateArea());
 }
 
 
@@ -392,7 +392,7 @@ void getOppositeFaceTet(MElement *el, const MFace &elBaseFace, MFace &elTopFace,
   for (int iElFace = 0; iElFace < el->getNumFaces(); iElFace++) {
     if (iElFace != iElBaseFace) {
       MFace faceTest = el->getFace(iElFace);
-      const double faceSurfTest = faceTest.area();
+      const double faceSurfTest = faceTest.approximateArea();
       if (faceSurfTest < faceSurfMin) faceSurfMin = faceSurfTest;
       if (faceSurfTest > faceSurfMax) {
         faceSurfMax = faceSurfTest;