diff --git a/Mesh/meshGFaceExtruded.cpp b/Mesh/meshGFaceExtruded.cpp
index 4d81462be3248a86aa4ed6ae7b426c031e78786b..36ad48b5264cd9c02c24a194de707f2f61d40998 100644
--- a/Mesh/meshGFaceExtruded.cpp
+++ b/Mesh/meshGFaceExtruded.cpp
@@ -1,4 +1,4 @@
-// $Id: meshGFaceExtruded.cpp,v 1.1 2006-11-26 04:36:46 geuzaine Exp $
+// $Id: meshGFaceExtruded.cpp,v 1.2 2006-11-26 16:24:04 geuzaine Exp $
 //
 // Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
@@ -22,6 +22,7 @@
 #include <map>
 #include "ExtrudeParams.h"
 #include "meshGFace.h"
+#include "GModel.h"
 #include "GVertex.h"
 #include "GEdge.h"
 #include "GFace.h"
@@ -35,12 +36,15 @@ int MeshExtrudedSurface(GFace *gf)
   ExtrudeParams *ep = gf->meshAttributes.extrude;
 
   if(!ep || !ep->mesh.ExtrudeMesh)
-    return false;
-
-  Msg(GERROR, "Extrusion has yet to be reinterfaced!");
+    return 0;
 
   if(ep->geo.Mode == EXTRUDED_ENTITY) {
     // extruded from a curve
+    GEdge *ge = gf->model()->edgeByTag(ep->geo.Source);
+    if(!ge) return 0;
+    for(unsigned int i = 0; i < ge->mesh_vertices.size(); i++) {
+      //printf("extruding vertex %d\n", i);
+    }
     /*
     c = FindCurve(abs(ep->geo.Source));
     if(!c)
@@ -53,7 +57,7 @@ int MeshExtrudedSurface(GFace *gf)
     */
   }
   else {
-    // this is the "hat" of an extruded surface
+    // copy of a surface ("chapeau")
     /*
     source = FindSurface(ep->geo.Source);
     if(!source)
diff --git a/Mesh/meshGFaceTransfinite.cpp b/Mesh/meshGFaceTransfinite.cpp
index 34c08972d291e0eb5d881cdb618b93898b4b7ece..3e54924726f3c597534521e5eec5276ef3c7a1a6 100644
--- a/Mesh/meshGFaceTransfinite.cpp
+++ b/Mesh/meshGFaceTransfinite.cpp
@@ -1,4 +1,4 @@
-// $Id: meshGFaceTransfinite.cpp,v 1.4 2006-09-08 02:39:43 geuzaine Exp $
+// $Id: meshGFaceTransfinite.cpp,v 1.5 2006-11-26 16:24:04 geuzaine Exp $
 //
 // Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
@@ -34,98 +34,98 @@
 
 int MeshTransfiniteSurface( GFace *gf)
 {
-  if(gf->meshAttributes.Method != TRANSFINI)
-    return 0;
+  if(gf->meshAttributes.Method != TRANSFINI) return 0;
+
   std::vector <MVertex *> corners;
   std::vector <MVertex *> d_vertices;
   std::vector <int> indices;
 
-  for (unsigned int i=0;i<gf->meshAttributes.corners.size();i++)
+  for(unsigned int i=0;i<gf->meshAttributes.corners.size();i++)
     corners.push_back(gf->meshAttributes.corners[i]->mesh_vertices[0]);
 
-  computeEdgeLoops (gf,d_vertices, indices);
+  computeEdgeLoops(gf, d_vertices, indices);
 
-  if (corners.size () != 3 && corners.size () != 4)
-    Msg (GERROR,"Surface %d is transfinite but has %d corners",gf->tag(),corners.size());
-  if (indices.size () != 2)
-    Msg (GERROR,"Surface %d is transfinite but has %d holes",gf->tag(),indices.size()-2);
+  if(corners.size () != 3 && corners.size () != 4){
+    Msg(GERROR,"Surface %d is transfinite but has %d corners", gf->tag(), corners.size());
+    return 0;
+  }
+  if(indices.size () != 2){
+    Msg(GERROR,"Surface %d is transfinite but has %d holes", gf->tag(), indices.size() - 2);
+    return 0;
+  }
 
   std::vector <MVertex *> m_vertices;
   unsigned int I;
-  for (I=0;I<d_vertices.size();I++)
-    if(d_vertices[I] == corners[0])break;
-  for (unsigned int j=0;j<d_vertices.size();j++)
-    m_vertices.push_back(d_vertices[(I+j)%d_vertices.size()]);
+  for(I = 0; I < d_vertices.size(); I++)
+    if(d_vertices[I] == corners[0]) break;
+  for(unsigned int j = 0; j < d_vertices.size(); j++)
+    m_vertices.push_back(d_vertices[(I + j) % d_vertices.size()]);
   
   int iCorner = 0;
   int N[4];
   std::vector<double> U;
   std::vector<double> V;
-
   std::map<std::pair<int,int> , MVertex*> tab;
 
-  for (unsigned int i=0;i<m_vertices.size();i++)
-    {
-      MVertex *v = m_vertices[i];
-      if (v==corners[0]||v==corners[1]||v==corners[2]|| (corners.size()==4 && v==corners[3]))
-	{
-	  N[iCorner++] = i;	  
-	  if (iCorner > 4)
-	    Msg (GERROR,"Surface %d transfinite parameters are incoherent",gf->tag());	  
-	}
-      SPoint2 param =  gf->parFromPoint (SPoint3(v->x(),v->y(),v->z()));      
-      U.push_back(param.x());
-      V.push_back(param.y());
+  for(unsigned int i = 0; i < m_vertices.size(); i++){
+    MVertex *v = m_vertices[i];
+    if(v == corners[0] || v == corners[1] || v == corners[2] || 
+       (corners.size() == 4 && v == corners[3])){
+      N[iCorner++] = i;	  
+      if (iCorner > 4){
+	Msg (GERROR,"Surface %d transfinite parameters are incoherent", gf->tag());
+	return 0;
+      }
     }
+    SPoint2 param =  gf->parFromPoint (SPoint3(v->x(),v->y(),v->z()));      
+    U.push_back(param.x());
+    V.push_back(param.y());
+  }
 
   int N1 = N[0];
   int N2 = N[1];
   int N3 = N[2];
   int N4 = N[3];
   
-  int L = N2-N1;
-  int H = N3-N2;
+  int L = N2 - N1;
+  int H = N3 - N2;
 
-  int Lb = N4-N3;
-  int Hb = m_vertices.size()-N4;
+  int Lb = N4 - N3;
+  int Hb = m_vertices.size() - N4;
 
-  if (Lb != L || Hb != H)
-    {
-      Msg(GERROR,"Surface %d cannot be meshed using the transfinite algo",gf->tag());
-      return 0;
-    }
+  if(Lb != L || Hb != H){
+    Msg(GERROR,"Surface %d cannot be meshed using the transfinite algo", gf->tag());
+    return 0;
+  }
 
   std::vector<double> lengths_i;
   std::vector<double> lengths_j;
 
-  double L_i=0;
-  double L_j=0;
-
-  lengths_i.push_back( 0. );
-  lengths_j.push_back( 0. );
-  for (int i=0;i<L;i++)
-    {
-      MVertex *v1 = m_vertices[i];
-      MVertex *v2 = m_vertices[i+1];
-      double l = sqrt ((v1->x()-v2->x())*(v1->x()-v2->x())+
-		       (v1->y()-v2->y())*(v1->y()-v2->y())+
-		       (v1->z()-v2->z())*(v1->z()-v2->z()));
-      L_i+= l;
-      lengths_i.push_back( L_i );
-    }
-  for (int i=L;i<L+H;i++)
-    {
-      MVertex *v1 = m_vertices[i];
-      MVertex *v2 = m_vertices[i+1];
-      double l = sqrt ((v1->x()-v2->x())*(v1->x()-v2->x())+
-		       (v1->y()-v2->y())*(v1->y()-v2->y())+
-		       (v1->z()-v2->z())*(v1->z()-v2->z()));
-      L_j+= l;
-      lengths_j.push_back( L_j );
-    }
-
-
-  //Msg (INFO,"L %d H %d -- %d -- %d %d %d %d",L,H,m_vertices.size(),N1,N2,N3,N4);
+  double L_i = 0;
+  double L_j = 0;
+
+  lengths_i.push_back(0.);
+  lengths_j.push_back(0.);
+  for(int i = 0; i < L; i++){
+    MVertex *v1 = m_vertices[i];
+    MVertex *v2 = m_vertices[i + 1];
+    double l = sqrt((v1->x() - v2->x()) * (v1->x() - v2->x()) +
+		    (v1->y() - v2->y()) * (v1->y() - v2->y()) +
+		    (v1->z() - v2->z()) * (v1->z() - v2->z()));
+    L_i += l;
+    lengths_i.push_back(L_i);
+  }
+  for(int i = L; i < L + H; i++){
+    MVertex *v1 = m_vertices[i];
+    MVertex *v2 = m_vertices[i + 1];
+    double l = sqrt((v1->x() - v2->x()) * (v1->x() - v2->x()) +
+		    (v1->y() - v2->y()) * (v1->y() - v2->y()) +
+		    (v1->z() - v2->z()) * (v1->z() - v2->z()));
+    L_j += l;
+    lengths_j.push_back(L_j);
+  }
+
+  //Msg(INFO,"L %d H %d -- %d -- %d %d %d %d", L, H, m_vertices.size(), N1, N2, N3, N4);
 
   /*
        2L+H
@@ -136,7 +136,6 @@ int MeshTransfiniteSurface( GFace *gf)
 2L+2H+2  |            |
          +------------+
          0             L
- 
   */
 
   tab[std::make_pair(0,0)] = m_vertices[0];
@@ -144,16 +143,14 @@ int MeshTransfiniteSurface( GFace *gf)
   tab[std::make_pair(L,H)] = m_vertices[L+H];
   tab[std::make_pair(0,H)] = m_vertices[2*L+H];
 
-  for (int i=1;i<L;i++)
-    {
-      tab[std::make_pair(i,0)] = m_vertices[i];
-      tab[std::make_pair(i,H)] = m_vertices[2*L+H-i];
-    }
-  for (int i=1;i<H;i++)
-    {
-      tab[std::make_pair(L,i)] = m_vertices[L+i];
-      tab[std::make_pair(0,i)] = m_vertices[2*L+2*H-i];
-    }
+  for (int i = 1; i < L; i++){
+    tab[std::make_pair(i,0)] = m_vertices[i];
+    tab[std::make_pair(i,H)] = m_vertices[2*L+H-i];
+  }
+  for(int i = 1; i < H;i++){
+    tab[std::make_pair(L,i)] = m_vertices[L+i];
+    tab[std::make_pair(0,i)] = m_vertices[2*L+2*H-i];
+  }
 
   double UC1 = U[N1];
   double UC2 = U[N2];
@@ -164,110 +161,86 @@ int MeshTransfiniteSurface( GFace *gf)
   double VC3 = V[N3];
   double VC4 = V[N4];
 
-
   //create points using transfinite interpolation
-  for(int i = 1; i<L; i++) 
-    {
-      double u = lengths_i[i]/L_i;
-      for(int j = 1; j < H; j++) 
-	{
-	  double v = lengths_j[j]/L_j;
-	  int iP1 = N1+i;
-	  int iP2 = N2+j;
-	  int iP3 = N4-i;
-	  int iP4 = (N4+(N3-N2)-j)%m_vertices.size();
-	  
-	  double Up = TRAN_QUA ( U[iP1], U[iP2], U[iP3], U[iP4] , UC1, UC2, UC3, UC4, u, v ); 
-	  double Vp = TRAN_QUA ( V[iP1], V[iP2], V[iP3], V[iP4] , VC1, VC2, VC3, VC4, u, v ); 
-	  
-	  GPoint gp = gf->point (SPoint2(Up,Vp));
-	  MFaceVertex *newv  = new MFaceVertex ( gp.x(),gp.y(),gp.z(), gf, Up, Vp );
-	  gf->mesh_vertices.push_back (newv);	  	  
-	  tab[std::make_pair(i,j)] = newv;
-	}
+  for(int i = 1; i < L; i++){
+    double u = lengths_i[i]/L_i;
+    for(int j = 1; j < H; j++){ 
+      double v = lengths_j[j]/L_j;
+      int iP1 = N1+i;
+      int iP2 = N2+j;
+      int iP3 = N4-i;
+      int iP4 = (N4+(N3-N2)-j)%m_vertices.size();
+      double Up = TRAN_QUA ( U[iP1], U[iP2], U[iP3], U[iP4] , UC1, UC2, UC3, UC4, u, v ); 
+      double Vp = TRAN_QUA ( V[iP1], V[iP2], V[iP3], V[iP4] , VC1, VC2, VC3, VC4, u, v ); 
+      GPoint gp = gf->point (SPoint2(Up,Vp));
+      MFaceVertex *newv  = new MFaceVertex ( gp.x(),gp.y(),gp.z(), gf, Up, Vp );
+      gf->mesh_vertices.push_back (newv);	  	  
+      tab[std::make_pair(i,j)] = newv;
     }
-
-  if (gf->geomType() == GEntity::Plane) // some work 2 be done to smooth the stuff in parametric coords
-                                        // parametric coords are available (MFaceVertex) !
-    {
-      // elliptic smoother
-      for (int IT = 0;IT< 10;IT++)
-	{
-	  for(int i = 1; i<L; i++) 
-	    {
-	      for(int j = 1; j < H; j++) 
-		{
-		  MVertex *v11 = tab[std::make_pair(i-1,j-1)];
-		  MVertex *v12 = tab[std::make_pair(i-1,j)];
-		  MVertex *v13 = tab[std::make_pair(i-1,j+1)];	      
-		  MVertex *v21 = tab[std::make_pair(i,j-1)];
-		  MVertex *v22 = tab[std::make_pair(i,j)];
-		  MVertex *v23 = tab[std::make_pair(i,j+1)];
-		  MVertex *v31 = tab[std::make_pair(i+1,j-1)];
-		  MVertex *v32 = tab[std::make_pair(i+1,j)];
-		  MVertex *v33 = tab[std::make_pair(i+1,j+1)];
-		  
-		  double alpha = 0.25 * (DSQR(v23->x() - v21->x()) +
-					 DSQR(v23->y() - v21->y()) +
-					 DSQR(v23->z() - v21->z()) 
-					 );
-		  double gamma = 0.25 * (DSQR(v32->x() - v12->x()) +
-					 DSQR(v32->y() - v12->y()) +
-					 DSQR(v32->z() - v12->z())
-					 );
-		  double beta = 0.0625 * ((v32->x() - v12->x()) *
-					  (v23->x() - v21->x()) +
-					  (v32->y() - v12->y()) *
-					  (v23->y() - v21->y()) +
-					  (v32->z() - v12->z()) *
-					  (v23->z() - v21->z())
-					  );
-		  
-		  v22->x() = 0.5 * (alpha * (v32->x() + v12->x()) +
-				    gamma * (v23->x() + v21->x()) -
-				    2. * beta * (v33->x() - v13->x() -
-						 v31->x() + v11->x()))
-		    / (alpha + gamma);
-		  v22->y() = 0.5 * (alpha * (v32->y() + v12->y()) +
-				    gamma * (v23->y() + v21->y()) -
-				    2. * beta * (v33->y() - v13->y() -
-						 v31->y() + v11->y()))
-		    / (alpha + gamma);
-		  v22->z() = 0.5 * (alpha * (v32->z() + v12->z()) +
-				    gamma * (v23->z() + v21->z()) -
-				    2. * beta * (v33->z() - v13->z() -
-						 v31->z() + v11->z()))
-		    / (alpha + gamma);
-		}
-	    }
+  }
+  
+  // elliptic smoother (don't apply this by default)
+  if(CTX.mesh.nb_smoothing > 1 && gf->geomType() == GEntity::Plane){
+    for (int IT = 0; IT< CTX.mesh.nb_smoothing; IT++){
+      for(int i = 1; i < L; i++){
+	for(int j = 1; j < H; j++){
+	  MVertex *v11 = tab[std::make_pair(i-1,j-1)];
+	  MVertex *v12 = tab[std::make_pair(i-1,j)];
+	  MVertex *v13 = tab[std::make_pair(i-1,j+1)];	      
+	  MVertex *v21 = tab[std::make_pair(i,j-1)];
+	  MVertex *v22 = tab[std::make_pair(i,j)];
+	  MVertex *v23 = tab[std::make_pair(i,j+1)];
+	  MVertex *v31 = tab[std::make_pair(i+1,j-1)];
+	  MVertex *v32 = tab[std::make_pair(i+1,j)];
+	  MVertex *v33 = tab[std::make_pair(i+1,j+1)];
+	  
+	  double alpha = 0.25 * (DSQR(v23->x() - v21->x()) +
+				 DSQR(v23->y() - v21->y()) +
+				 DSQR(v23->z() - v21->z()));
+	  double gamma = 0.25 * (DSQR(v32->x() - v12->x()) +
+				 DSQR(v32->y() - v12->y()) +
+				 DSQR(v32->z() - v12->z()));
+	  double beta = 0.0625 * ((v32->x() - v12->x()) * (v23->x() - v21->x()) +
+				  (v32->y() - v12->y()) * (v23->y() - v21->y()) +
+				  (v32->z() - v12->z()) * (v23->z() - v21->z()));
+	  v22->x() = 0.5 * (alpha * (v32->x() + v12->x()) + 
+			    gamma * (v23->x() + v21->x()) -
+			    2. * beta * (v33->x() - v13->x() - 
+					 v31->x() + v11->x())) / (alpha + gamma);
+	  v22->y() = 0.5 * (alpha * (v32->y() + v12->y()) +
+			    gamma * (v23->y() + v21->y()) -
+			    2. * beta * (v33->y() - v13->y() -
+					 v31->y() + v11->y())) / (alpha + gamma);
+	  v22->z() = 0.5 * (alpha * (v32->z() + v12->z()) +
+			    gamma * (v23->z() + v21->z()) -
+			    2. * beta * (v33->z() - v13->z() -
+					 v31->z() + v11->z())) / (alpha + gamma);
 	}
+      }
     }
+  }
+  
   // create elements
-  for(int i = 0; i < L ; i++) 
-    {
-      for(int j = 0; j < H; j++) 
-	{
-	  MVertex *v1 = tab[std::make_pair(i,j)];
-	  MVertex *v2 = tab[std::make_pair(i+1,j)];
-	  MVertex *v3 = tab[std::make_pair(i+1,j+1)];
-	  MVertex *v4 = tab[std::make_pair(i,j+1)];
-	  if (gf->meshAttributes.recombine)
-	    gf->quadrangles.push_back(new MQuadrangle (v1,v2,v3,v4));
-	  else if (  gf->meshAttributes.transfiniteArrangement == 1 ||
-		     (gf->meshAttributes.transfiniteArrangement == 0 && 
-		      (( i % 2 == 0 && j % 2 == 1 ) ||
-		       ( i % 2 == 1 && j % 2 == 0 ) ) ) )
-	    {
-	      gf->triangles.push_back(new MTriangle (v1,v2,v3));
-	      gf->triangles.push_back(new MTriangle (v3,v4,v1));
-	    }	  
-	  else 
-	    {
-	      gf->triangles.push_back(new MTriangle (v1,v2,v4));
-	      gf->triangles.push_back(new MTriangle (v4,v2,v3));
-	    }	  
-	}
+  for(int i = 0; i < L ; i++){
+    for(int j = 0; j < H; j++){
+      MVertex *v1 = tab[std::make_pair(i,j)];
+      MVertex *v2 = tab[std::make_pair(i+1,j)];
+      MVertex *v3 = tab[std::make_pair(i+1,j+1)];
+      MVertex *v4 = tab[std::make_pair(i,j+1)];
+      if(gf->meshAttributes.recombine)
+	gf->quadrangles.push_back(new MQuadrangle(v1, v2, v3, v4));
+      else if(gf->meshAttributes.transfiniteArrangement == 1 ||
+	      (gf->meshAttributes.transfiniteArrangement == 0 && 
+	       ((i % 2 == 0 && j % 2 == 1) ||
+		(i % 2 == 1 && j % 2 == 0)))){
+	gf->triangles.push_back(new MTriangle(v1, v2, v3));
+	gf->triangles.push_back(new MTriangle(v3, v4, v1));
+      }	  
+      else{
+	gf->triangles.push_back(new MTriangle(v1, v2, v4));
+	gf->triangles.push_back(new MTriangle(v4, v2, v3));
+      }	  
     }
+  }
   return 1;
 }
-  
diff --git a/configure b/configure
index c54796415e7c8c1c7f60c2ee556148609cc4b167..729597a6fb2b1006483984aec9fe197ed289447f 100755
--- a/configure
+++ b/configure
@@ -858,8 +858,8 @@ Optional Features:
   --enable-contrib        enable contrib packages (default=yes)
   --enable-triangle       compile Triangle if available (default=yes)
   --enable-netgen         compile Netgen if available (default=yes)
-  --enable-ann            compile ANN if available (default=yes)
-  --enable-metis          compile METIS if available (default=yes)
+  --enable-ann            compile ANN if available (default=no)
+  --enable-metis          compile METIS if available (default=no)
   --enable-tetgen         compile Tetgen if available (default=yes)
   --enable-matheval       compile MathEval if available (default=yes)
   --enable-osmesa         use OSMesa for offscreen rendering (default=no)
@@ -3984,7 +3984,7 @@ else
 fi
 
   if test "x${ANN}" = "xyes"; then
-    if test "x$enable_ann" != "xno"; then
+    if test "x$enable_ann" = "xyes"; then
        GMSH_DIRS="${GMSH_DIRS} contrib/ANN"
        GMSH_LIBS="${GMSH_LIBS} -lGmshANN"
        FLAGS="-DHAVE_ANN_ ${FLAGS}"
@@ -3998,7 +3998,7 @@ fi
        echo "********************************************************************"
     fi
   else
-    if test "x$enable_ann" != "xno"; then
+    if test "x$enable_ann" = "xyes"; then
        echo "********************************************************************"
        echo "If you want to use ANN for doing fast geometrical searchs in the"
        echo "STL mesher, please download ANN from the author's web site at"
@@ -4033,7 +4033,7 @@ else
 fi
 
   if test "x${METIS}" = "xyes"; then
-    if test "x$enable_metis" != "xno"; then
+    if test "x$enable_metis" = "xyes"; then
        GMSH_DIRS="${GMSH_DIRS} contrib/Metis"
        GMSH_LIBS="${GMSH_LIBS} -lGmshMetis"
        FLAGS="-DHAVE_METIS ${FLAGS}"
@@ -4047,7 +4047,7 @@ fi
        echo "********************************************************************"
     fi
   else
-    if test "x$enable-metis" != "xno"; then
+    if test "x$enable-metis" = "xyes"; then
        echo "********************************************************************"
        echo "If you want to use METIS for doing mesh partitioning, please"
        echo "download METIS from the author's web site at"
@@ -4422,7 +4422,9 @@ echo "$as_me: error: Could not find GSL, aborting." >&2;}
 fi
 
 if test "x${CGNS_PREFIX}" != "x"; then
-  enable_cgns="yes"
+  if test "x$enable_cgns" != "xno"; then
+    enable_cgns="yes"
+  fi
 fi
 if test "x$enable_cgns" = "xyes"; then
   if test "x${CGNS_PREFIX}" != "x"; then
@@ -4504,7 +4506,9 @@ fi
 fi
 
 if test "x${OCC_PREFIX}" != "x"; then
-  enable_occ="yes"
+  if test "x$enable_occ" != "xno"; then
+    enable_occ="yes"
+  fi
 fi
 if test "x$enable_occ" = "xyes"; then
   if test "x${OCC_PREFIX}" != "x"; then
diff --git a/configure.in b/configure.in
index 81da824dcc48522b7b0c5c304baa6dd3421f68e7..25fa758ce03d9917fa8ec19026ed6b3d413a97ae 100644
--- a/configure.in
+++ b/configure.in
@@ -1,4 +1,4 @@
-dnl $Id: configure.in,v 1.113 2006-11-21 23:03:13 geuzaine Exp $
+dnl $Id: configure.in,v 1.114 2006-11-26 16:24:04 geuzaine Exp $
 dnl
 dnl Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 dnl
@@ -95,10 +95,10 @@ AC_ARG_ENABLE(netgen,
                              [compile Netgen if available (default=yes)]))
 AC_ARG_ENABLE(ann,
               AC_HELP_STRING([--enable-ann],
-                             [compile ANN if available (default=yes)]))
+                             [compile ANN if available (default=no)]))
 AC_ARG_ENABLE(metis,
               AC_HELP_STRING([--enable-metis],
-                             [compile METIS if available (default=yes)]))
+                             [compile METIS if available (default=no)]))
 AC_ARG_ENABLE(tetgen,
               AC_HELP_STRING([--enable-tetgen],
                              [compile Tetgen if available (default=yes)]))
@@ -347,7 +347,7 @@ if test "x$enable_contrib" != "xno"; then
   dnl Check for ANN
   AC_CHECK_FILE(./contrib/ANN/include/ANN/ANN.h, ANN="yes", ANN="no")
   if test "x${ANN}" = "xyes"; then
-    if test "x$enable_ann" != "xno"; then
+    if test "x$enable_ann" = "xyes"; then
        GMSH_DIRS="${GMSH_DIRS} contrib/ANN"
        GMSH_LIBS="${GMSH_LIBS} -lGmshANN"
        FLAGS="-DHAVE_ANN_ ${FLAGS}"
@@ -361,7 +361,7 @@ if test "x$enable_contrib" != "xno"; then
        echo "********************************************************************"
     fi
   else
-    if test "x$enable_ann" != "xno"; then
+    if test "x$enable_ann" = "xyes"; then
        echo "********************************************************************"
        echo "If you want to use ANN for doing fast geometrical searchs in the"
        echo "STL mesher, please download ANN from the author's web site at"
@@ -375,7 +375,7 @@ if test "x$enable_contrib" != "xno"; then
   dnl Check for METIS
   AC_CHECK_FILE(./contrib/Metis/metis.h, METIS="yes", METIS="no")
   if test "x${METIS}" = "xyes"; then
-    if test "x$enable_metis" != "xno"; then
+    if test "x$enable_metis" = "xyes"; then
        GMSH_DIRS="${GMSH_DIRS} contrib/Metis"
        GMSH_LIBS="${GMSH_LIBS} -lGmshMetis"
        FLAGS="-DHAVE_METIS ${FLAGS}"
@@ -389,7 +389,7 @@ if test "x$enable_contrib" != "xno"; then
        echo "********************************************************************"
     fi
   else
-    if test "x$enable-metis" != "xno"; then
+    if test "x$enable-metis" = "xyes"; then
        echo "********************************************************************"
        echo "If you want to use METIS for doing mesh partitioning, please"
        echo "download METIS from the author's web site at"
@@ -529,7 +529,9 @@ fi
 
 dnl Check for CGNS
 if test "x${CGNS_PREFIX}" != "x"; then
-  enable_cgns="yes"
+  if test "x$enable_cgns" != "xno"; then
+    enable_cgns="yes"
+  fi
 fi
 if test "x$enable_cgns" = "xyes"; then
   if test "x${CGNS_PREFIX}" != "x"; then
@@ -549,7 +551,9 @@ fi
 
 dnl Check for OpenCascade
 if test "x${OCC_PREFIX}" != "x"; then
-  enable_occ="yes"
+  if test "x$enable_occ" != "xno"; then
+    enable_occ="yes"
+  fi
 fi
 if test "x$enable_occ" = "xyes"; then
   if test "x${OCC_PREFIX}" != "x"; then