diff --git a/Mesh/2D_Mesh.cpp b/Mesh/2D_Mesh.cpp
index a39659cda36d06bf6fa10b7c2a131f2bbdda6a1d..3a6f257ae29c84bb230d5c2362a086192dc5bec7 100644
--- a/Mesh/2D_Mesh.cpp
+++ b/Mesh/2D_Mesh.cpp
@@ -1,4 +1,4 @@
-// $Id: 2D_Mesh.cpp,v 1.61 2004-06-22 17:34:10 geuzaine Exp $
+// $Id: 2D_Mesh.cpp,v 1.62 2004-06-22 18:04:10 geuzaine Exp $
 //
 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
 //
@@ -789,6 +789,18 @@ void ActionInvertTriQua(void *a, void *b)
   }
 }
 
+int isPointOnPlanarSurface(Surface * S, double X, double Y, double Z, double n[3]);
+
+int isMiddlePointOnPlanarSurface(Surface *s, Vertex *v1, Vertex *v2)
+{
+  double n[3] = {s->a, s->b, s->c};
+  norme(n);
+  double x = 0.5 * (v1->Pos.X + v2->Pos.X);
+  double y = 0.5 * (v1->Pos.Y + v2->Pos.Y);
+  double z = 0.5 * (v1->Pos.Z + v2->Pos.Z);
+  return isPointOnPlanarSurface(s, x, y, z, n);
+}
+
 void Get_SurfaceNormal(Surface *s, double n[3])
 {
   double t1[3], t2[3];
@@ -817,7 +829,7 @@ void Get_SurfaceNormal(Surface *s, double n[3])
 	t2[1] = v3->Pos.Y - v1->Pos.Y;
 	t2[2] = v3->Pos.Z - v1->Pos.Z;
 	prodve(t1, t2, n);
-	if(norme(n))
+	if(norme(n) && isMiddlePointOnPlanarSurface(s, v1, v3))
 	  break;
       }
     }
@@ -827,6 +839,7 @@ void Get_SurfaceNormal(Surface *s, double n[3])
       n[0] = s->a;
       n[1] = s->b;
       n[2] = s->c;
+      norme(n);
     }
     List_Delete(points);
   }