diff --git a/Geo/MVertex.cpp b/Geo/MVertex.cpp
index 178f05fb404112401b0e4259ef11fef26f8824c3..874e84f8be1bbb7c609518bc0a7003ed06147a3f 100644
--- a/Geo/MVertex.cpp
+++ b/Geo/MVertex.cpp
@@ -466,12 +466,13 @@ bool reparamMeshVertexOnFace(MVertex *v, const GFace *gf, SPoint2 &param,
     return true;
   }
 
+#if defined(HAVE_ANN) && defined(HAVE_SOLVER)
   if (gf->geomType() == GEntity::DiscreteDiskSurface ){
     discreteDiskFace *gfc = (discreteDiskFace*) gf;
     param = gfc->parFromVertex(v);
     return true;
   }
-
+#endif
 
   if(v->onWhat()->geomType() == GEntity::DiscreteCurve ||
      v->onWhat()->geomType() == GEntity::BoundaryLayerCurve){
diff --git a/Geo/discreteDiskFace.cpp b/Geo/discreteDiskFace.cpp
index f67a4e2aab72663086c19827bc9db3bfb54264f6..355e81eb9bba0c696388265095e1141c1b32df0b 100644
--- a/Geo/discreteDiskFace.cpp
+++ b/Geo/discreteDiskFace.cpp
@@ -5,6 +5,9 @@
 
 #include <stdlib.h>
 #include "GmshConfig.h"
+
+#if defined(HAVE_SOLVER) && defined(HAVE_ANN)
+
 #include "GmshMessage.h"
 #include "Octree.h"
 #include "discreteDiskFace.h"
@@ -15,7 +18,7 @@
 #include "OS.h"
 #include "ANN/ANN.h"
 #include "linearSystemCSR.h"
-#include "dofManager.h" 
+#include "dofManager.h"
 #include "laplaceTerm.h"
 #include "convexLaplaceTerm.h"
 #include "convexCombinationTerm.h"  // #
@@ -65,17 +68,17 @@ static int discreteDiskFaceInEle(void *a, double*c)
   sys2x2(M, R, X);
   if(X[0] > -eps && X[1] > -eps && 1. - X[0] - X[1] > -eps)
     return 1;
-  
+
   return 0;
 }
 
 static bool orderVertices(const double &tot_length, const std::vector<MVertex*> &l, std::vector<double> &coord)
-{ // called once by constructor ; organize the vertices for the linear system expressing the mapping  
-  coord.clear();  
-  coord.push_back(0.);   
-  
+{ // called once by constructor ; organize the vertices for the linear system expressing the mapping
+  coord.clear();
+  coord.push_back(0.);
+
   MVertex* first = l[0];
-  
+
   for(unsigned int i=1; i < l.size(); i++){
 
     MVertex* next = l[i];
@@ -83,7 +86,7 @@ static bool orderVertices(const double &tot_length, const std::vector<MVertex*>
     const double length = sqrt( (next->x() - first->x()) * (next->x() - first->x()) +
 				(next->y() - first->y()) * (next->y() - first->y()) +
 				(next->z() - first->z()) * (next->z() - first->z()) );
-    
+
     coord.push_back(coord[coord.size()-1] + length / tot_length);
 
     first = next;
@@ -95,7 +98,7 @@ static bool orderVertices(const double &tot_length, const std::vector<MVertex*>
 }
 
 /*BUILDER*/
-discreteDiskFace::discreteDiskFace(GFace *gf, std::vector<MTriangle*> &mesh) : 
+discreteDiskFace::discreteDiskFace(GFace *gf, std::vector<MTriangle*> &mesh) :
   GFace(gf->model(),123), _parent (gf)
 {
   std::map<MVertex*,MVertex*> v2v;
@@ -106,7 +109,7 @@ discreteDiskFace::discreteDiskFace(GFace *gf, std::vector<MTriangle*> &mesh) :
       if (v->onWhat() == gf) {
 	std::map<MVertex*,MVertex*> :: iterator it = v2v.find(v);
 	if (it == v2v.end()){
-	  MFaceVertex *vv = new MFaceVertex ( v->x(),  v->y(),  v->z(), this, 0, 0);	
+	  MFaceVertex *vv = new MFaceVertex ( v->x(),  v->y(),  v->z(), this, 0, 0);
 	  v2v[v] = vv;
 	  discrete_vertices.push_back(vv);
 	  vs[j] = vv;
@@ -145,20 +148,20 @@ void discreteDiskFace::getBoundingEdges()
       else allEdges.erase(it);
     }
   }
-  
+
   std::map<MVertex*,MVertex*> edges; // useless ?
   std::map<MVertex*,MVertex*> firstNode2Edge;
   for (std::set<MEdge>::iterator ie = allEdges.begin(); ie != allEdges.end() ; ++ie) {
     MEdge ed = *ie;
     MVertex *first = ed.getVertex(0);
     MVertex *last  = ed.getVertex(1);
-   
+
     std::map<MVertex*,MVertex*>::iterator im = firstNode2Edge.find(first);
     if (im != firstNode2Edge.end()) Msg::Fatal("Incorrect topology in discreteDiskFace %d", tag());
 
     firstNode2Edge[first] = last;
   }
-  
+
   while (!firstNode2Edge.empty()) { // quid not empty but in within the map ?
     std::vector<MVertex*> loop;
     double length = 0.;
@@ -166,7 +169,7 @@ void discreteDiskFace::getBoundingEdges()
     while(in != firstNode2Edge.end()) {
       MVertex *first = in->first;
       MVertex *last  = in->second;
-      length += sqrt( (last->x()-first->x()) * (last->x()-first->x()) + 
+      length += sqrt( (last->x()-first->x()) * (last->x()-first->x()) +
 		      (last->y()-first->y()) * (last->y()-first->y()) +
 		      (last->z()-first->z()) * (last->z()-first->z()) );
       loop.push_back(first);
@@ -175,18 +178,18 @@ void discreteDiskFace::getBoundingEdges()
     }
     _loops.insert(std::make_pair(length,loop)); // it shouldn't be possible to have twice the same length ? mark
   }
-  
-  
-  // dirichlet BC    
+
+
+  // dirichlet BC
   _U0  = _loops.rbegin()->second;
   _totLength = _loops.rbegin()->first;
 }
 
 void discreteDiskFace::buildOct() const
-{ 
+{
   SBoundingBox3d bb;
-  int count = 0;  
-  
+  int count = 0;
+
   for(unsigned int i = 0; i < discrete_triangles.size(); ++i){
     MTriangle *t = discrete_triangles[i];
     //create bounding box
@@ -213,7 +216,7 @@ void discreteDiskFace::buildOct() const
   const int maxElePerBucket = 15;
   oct = Octree_Create(maxElePerBucket, origin, ssize, discreteDiskFaceBB,
                       discreteDiskFaceCentroid, discreteDiskFaceInEle);
-    
+
   count = 0;
 
   for(unsigned int i = 0; i < discrete_triangles.size(); ++i){
@@ -227,7 +230,7 @@ void discreteDiskFace::buildOct() const
     _ddft[count].p1 = it0->second;
     _ddft[count].p2 = it1->second;
     _ddft[count].p3 = it2->second;
-    if(geomType() != GEntity::DiscreteDiskSurface){// CAD    
+    if(geomType() != GEntity::DiscreteDiskSurface){// CAD
       if (t->getVertex(0)->onWhat()->dim() == 2){
 	reparamMeshEdgeOnFace(t->getVertex(0), t->getVertex(1), _parent,
 			      _ddft[count].gfp1, _ddft[count].gfp2);
@@ -261,7 +264,7 @@ void discreteDiskFace::buildOct() const
     _ddft[count].gf = _parent;
     _ddft[count].tri = t;
 
-    
+
     //compute first derivatives for every triangle , to disappear (erase)
     double mat[2][2] = {{_ddft[count].p2.x() - _ddft[count].p1.x(),
 			 _ddft[count].p3.x() - _ddft[count].p1.x()},
@@ -272,7 +275,7 @@ void discreteDiskFace::buildOct() const
     inv2x2(mat, inv);
     SVector3 dXdxi (_ddft[count].v2 - _ddft[count].v1); // constant
     SVector3 dXdeta(_ddft[count].v3 - _ddft[count].v1); // constant
-    SVector3 dXdu(dXdxi * inv[0][0] + dXdeta * inv[1][0]); // to be modified for higher order 
+    SVector3 dXdu(dXdxi * inv[0][0] + dXdeta * inv[1][0]); // to be modified for higher order
     SVector3 dXdv(dXdxi * inv[0][1] + dXdeta * inv[1][1]); // to be modified for higher order
     firstElemDerivatives[(MElement*)t] = Pair<SVector3,SVector3>(dXdu,dXdv);
 
@@ -283,14 +286,14 @@ void discreteDiskFace::buildOct() const
     Octree_Insert(&_ddft[count], oct);
     count++;
   }
-  
+
   Octree_Arrange(oct);
 
   // USELESS, laplacian
   //smooth first derivatives at vertices
   if(adjv.size() == 0){
     std::vector<MTriangle*> allTri;
-    allTri.insert(allTri.end(), discrete_triangles.begin(), discrete_triangles.end() );    
+    allTri.insert(allTri.end(), discrete_triangles.begin(), discrete_triangles.end() );
     buildVertexToTriangle(allTri, adjv);
   }
   for(v2t_cont::iterator it = adjv.begin(); it!= adjv.end(); ++it){
@@ -306,7 +309,7 @@ void discreteDiskFace::buildOct() const
     dXdv *= 1./nbTri;
     firstDerivatives[v] = Pair<SVector3, SVector3>(dXdu, dXdv);
   }
-  
+
   kdtree = new ANNkd_tree(nodes, count, 3);
 
 }
@@ -314,25 +317,25 @@ void discreteDiskFace::buildOct() const
 
 bool discreteDiskFace::parametrize() const
 { // mark, to improve
- 
+
   Msg::Info("Parametrizing surface %d with 'harmonic map'", tag());
 
   linearSystem<double> *lsys_u;
   linearSystem<double> *lsys_v;
-  
+
   lsys_u = new linearSystemCSRTaucs<double>; // taucs :-)
   lsys_v = new linearSystemCSRTaucs<double>; // taucs :-)
-  
+
   dofManager<double> myAssemblerU(lsys_u);   // hashing
-  dofManager<double> myAssemblerV(lsys_v);  
-    
-  for(size_t i = 0; i < _U0.size(); i++){ 
+  dofManager<double> myAssemblerV(lsys_v);
+
+  for(size_t i = 0; i < _U0.size(); i++){
     MVertex *v = _U0[i];
     const double theta = 2 * M_PI * _coords[i];
     myAssemblerU.fixVertex(v, 0, 1, cos(theta));
     myAssemblerV.fixVertex(v, 0, 1, sin(theta));
   }
- 
+
   for(size_t i = 0; i < discrete_triangles.size(); ++i){
     MTriangle *t = discrete_triangles[i];
 
@@ -343,8 +346,8 @@ bool discreteDiskFace::parametrize() const
     myAssemblerV.numberVertex(t->getVertex(0), 0, 1);
     myAssemblerV.numberVertex(t->getVertex(1), 0, 1);
     myAssemblerV.numberVertex(t->getVertex(2), 0, 1);
-  }  
-  
+  }
+
 
   Msg::Debug("Creating term %d dofs numbered %d fixed",
              myAssemblerU.sizeOfR() + myAssemblerV.sizeOfR(), myAssemblerU.sizeOfF() + myAssemblerV.sizeOfF());
@@ -352,15 +355,15 @@ bool discreteDiskFace::parametrize() const
   double t1 = Cpu();
 
   simpleFunction<double> ONE(1.0);
-  
-  convexLaplaceTerm mappingU(0, 1, &ONE);  
-  convexLaplaceTerm mappingV(0, 1, &ONE);  
+
+  convexLaplaceTerm mappingU(0, 1, &ONE);
+  convexLaplaceTerm mappingV(0, 1, &ONE);
 
   for(unsigned int i = 0; i < discrete_triangles.size(); ++i){
     SElement se(discrete_triangles[i]);
     mappingU.addToMatrix(myAssemblerU, &se);
     mappingV.addToMatrix(myAssemblerV, &se);
-  }  
+  }
 
 
   //  lsys_v->printMatlab("testv.m");
@@ -394,12 +397,12 @@ bool discreteDiskFace::parametrize() const
   delete lsys_v;
 
   return true;
-  
+
 }
 
 void discreteDiskFace::getTriangleUV(const double u,const double v,
-				     discreteDiskFaceTriangle **mt, 
-				     double &_u, double &_v)const{ 
+				     discreteDiskFaceTriangle **mt,
+				     double &_u, double &_v)const{
   double uv[3] = {u,v,0.};
   *mt = (discreteDiskFaceTriangle*) Octree_Search(uv,oct);
   if (!(*mt))return;
@@ -447,7 +450,7 @@ SPoint2 discreteDiskFace::parFromVertex(MVertex *v) const
   // The 1D mesh has been re-done
   if (v->onWhat()->dim()==1){
     Msg::Fatal("FIXME TO DO %d %s",__LINE__,__FILE__);
-    // get the discrete edge on which v is classified 
+    // get the discrete edge on which v is classified
     // get the two ending vertices A and B on both sides of v    A-------v----------B
     // interpolate between the two uv coordinates of A and B
   }
@@ -471,7 +474,7 @@ double discreteDiskFace::curvatureMax(const SPoint2 &param) const
 double discreteDiskFace::curvatures(const SPoint2 &param, SVector3 *dirMax, SVector3 *dirMin,
                                 double *curvMax, double *curvMin) const
 {
-    return false;  
+    return false;
 }
 
 Pair<SVector3, SVector3> discreteDiskFace::firstDer(const SPoint2 &param) const
@@ -483,21 +486,21 @@ Pair<SVector3, SVector3> discreteDiskFace::firstDer(const SPoint2 &param) const
 
   MTriangle* tri = NULL;
   if (ddft) tri = ddft->tri;
-  else Msg::Error("discreteDiskFace::firstDer << triangle not found");  
+  else Msg::Error("discreteDiskFace::firstDer << triangle not found");
 
-  std::map<MVertex*, Pair<SVector3,SVector3> >::iterator it0 = 
+  std::map<MVertex*, Pair<SVector3,SVector3> >::iterator it0 =
     firstDerivatives.find(tri->getVertex(0));
   if (it0 == firstDerivatives.end()) Msg::Fatal ("Vertex %d (0) has no firstDerivatives",
-						 tri->getVertex(0)->getNum());	 
-  std::map<MVertex*, Pair<SVector3,SVector3> >::iterator it1 = 
+						 tri->getVertex(0)->getNum());
+  std::map<MVertex*, Pair<SVector3,SVector3> >::iterator it1 =
     firstDerivatives.find(tri->getVertex(1));
   if (it1 == firstDerivatives.end()) Msg::Fatal ("Vertex %d (1) has no firstDerivatives",
-						 tri->getVertex(1)->getNum());	 
-  std::map<MVertex*, Pair<SVector3,SVector3> >::iterator it2 = 
+						 tri->getVertex(1)->getNum());
+  std::map<MVertex*, Pair<SVector3,SVector3> >::iterator it2 =
     firstDerivatives.find(tri->getVertex(2));
   if (it2 == firstDerivatives.end()) Msg::Fatal ("Vertex %d (2) has no firstDerivatives",
-						 tri->getVertex(2)->getNum());	 
-  
+						 tri->getVertex(2)->getNum());
+
 
   SVector3 dXdu1 = it0->second.first();
   SVector3 dXdu2 = it1->second.first();
@@ -509,9 +512,9 @@ Pair<SVector3, SVector3> discreteDiskFace::firstDer(const SPoint2 &param) const
 
   SVector3 dXdu = dXdu1*(1.-U-V) + dXdu2*U + dXdu3*V;
   SVector3 dXdv = dXdv1*(1.-U-V) + dXdv2*U + dXdv3*V;
-  
 
-  return Pair<SVector3, SVector3>(dXdu,dXdv);  
+
+  return Pair<SVector3, SVector3>(dXdu,dXdv);
 
 }
 
@@ -519,11 +522,11 @@ void discreteDiskFace::secondDer(const SPoint2 &param,
                              SVector3 *dudu, SVector3 *dvdv, SVector3 *dudv) const
 { // cf Sauvage's thesis
 
-  
+
     return;
 }
 
-void discreteDiskFace::buildAllNodes() 
+void discreteDiskFace::buildAllNodes()
 {
   // allNodes contains all mesh-nodes
   for(unsigned int i = 0; i < discrete_triangles.size(); ++i){
@@ -551,13 +554,14 @@ void discreteDiskFace::putOnView()
   PView* view_u = new PView("u", "NodeData", GModel::current(), u);
   PView* view_v = new PView("u", "NodeData", GModel::current(), v);
   view_u->setChanged(true);
-  view_v->setChanged(true);  
+  view_v->setChanged(true);
   view_u->write("param_u.msh", 5);
   view_v->write("param_v.msh", 5);
   delete view_u;
   delete view_v;
 #else
   Msg::Error("discreteDiskFace: cannot export without post module")
-#endif 
+#endif
 }
- 
+
+#endif
diff --git a/Geo/discreteDiskFace.h b/Geo/discreteDiskFace.h
index f82f6437097dae3e7aaeae3b1c29836d9e4b4947..4d553f8d60fdfa1494e5ec75dd427c5cf540f223 100644
--- a/Geo/discreteDiskFace.h
+++ b/Geo/discreteDiskFace.h
@@ -6,6 +6,9 @@
 #ifndef _DISCRETE_DISK_FACE_H_
 #define _DISCRETE_DISK_FACE_H_
 
+#include "GmshConfig.h"
+
+#if defined(HAVE_SOLVER) && defined(HAVE_ANN)
 
 #include <list>
 #include <map>
@@ -17,7 +20,7 @@
 #include "linearSystem.h"
 #include "MElementOctree.h"
 #include "meshGFaceOptimize.h"
-#include "../Post/PView.h"
+#include "PView.h"
 
 class ANNkd_tree;
 class Octree;
@@ -54,7 +57,7 @@ class discreteDiskFace : public GFace {
   double curvatureMax(const SPoint2&) const;
   double curvatures(const SPoint2&,SVector3*,SVector3*,double*,double*) const;
   virtual Pair<SVector3, SVector3> firstDer(const SPoint2 &param) const;
-  virtual void secondDer(const SPoint2 &param, 
+  virtual void secondDer(const SPoint2 &param,
                          SVector3 *dudu, SVector3 *dvdv, SVector3 *dudv) const;
   GEntity::GeomType geomType() const { return DiscreteDiskSurface; }
  protected:
@@ -80,13 +83,6 @@ class discreteDiskFace : public GFace {
 
 };
 
-// ----------------
-
-
-
-
-
-
-
+#endif
 
 #endif
diff --git a/Geo/discreteFace.cpp b/Geo/discreteFace.cpp
index 3cd561be92ae489a6cdfc204d9edfef9e27670ef..d02ebff1e167cc44bc7ac5f04ba53e20517077e2 100644
--- a/Geo/discreteFace.cpp
+++ b/Geo/discreteFace.cpp
@@ -7,6 +7,7 @@
 #include "GmshConfig.h"
 #include "GmshMessage.h"
 #include "discreteFace.h"
+#include "discreteDiskFace.h"
 #include "MTriangle.h"
 #include "MEdge.h"
 #include "Geo.h"
@@ -18,7 +19,7 @@ discreteFace::discreteFace(GModel *model, int num) : GFace(model, num)
 {
   Surface *s = Create_Surface(num, MSH_SURF_DISCRETE);
   Tree_Add(model->getGEOInternals()->Surfaces, &s);
-  meshStatistics.status = GFace::DONE;  
+  meshStatistics.status = GFace::DONE;
 }
 
 void discreteFace::setBoundEdges(GModel *gm, std::vector<int> tagEdges)
@@ -128,7 +129,7 @@ Pair<SVector3, SVector3> discreteFace::firstDer(const SPoint2 &param) const
 void discreteFace::secondDer(const SPoint2 &param,
                              SVector3 *dudu, SVector3 *dvdv, SVector3 *dudv) const
 {
- 
+
   if (getCompound()){
     return getCompound()->secondDer(param, dudu, dvdv, dudv);
   }
@@ -140,14 +141,17 @@ void discreteFace::secondDer(const SPoint2 &param,
 
 // FIXME PAB ----> really create an atlas !!!!!!!!!!!!!!!
 void discreteFace::createGeometry() {
+#if defined(HAVE_ANN) && defined(HAVE_SOLVER)
   if (!_atlas.empty())return;
   // parametrization is done here !!!
   discreteDiskFace *df = new discreteDiskFace (this, triangles);
   df->replaceEdges(l_edges);
   _atlas.push_back(df);
+#endif
 }
 
 void discreteFace::gatherMeshes() {
+#if defined(HAVE_ANN) && defined(HAVE_SOLVER)
   for (unsigned int i=0;i<triangles.size();i++)delete triangles[i];
   for (unsigned int i=0;i<mesh_vertices.size();i++)delete mesh_vertices[i];
   triangles.clear();
@@ -156,17 +160,18 @@ void discreteFace::gatherMeshes() {
     triangles.insert(triangles.begin(), _atlas[i]->triangles.begin(), _atlas[i]->triangles.end());
     mesh_vertices.insert(mesh_vertices.begin(), _atlas[i]->mesh_vertices.begin(), _atlas[i]->mesh_vertices.end());
   }
+#endif
 }
 
 void discreteFace::mesh(bool verbose) {
-#if defined(HAVE_MESH)
+#if defined(HAVE_ANN) && defined(HAVE_SOLVER) && defined(HAVE_MESH)
   return;
   createGeometry();
   for (unsigned int i=0;i<_atlas.size();i++)
     _atlas[i]->mesh(verbose);
   gatherMeshes();
-#endif
   meshStatistics.status = GFace::DONE;
+#endif
 }
 
 // delete all discrete disk faces
@@ -180,12 +185,9 @@ void discreteFace::writeGEO(FILE *fp)
   int count = 0;
   for (std::list<GEdge*>::iterator it = l_edges.begin();
        it != l_edges.end() ;++it){
-    if (count == 0) fprintf(fp, "%d", (*it)->tag());    
-    else fprintf(fp, ",%d", (*it)->tag());    
+    if (count == 0) fprintf(fp, "%d", (*it)->tag());
+    else fprintf(fp, ",%d", (*it)->tag());
     count ++;
   }
-  fprintf(fp, "};\n");    
+  fprintf(fp, "};\n");
 }
-
-
-
diff --git a/Geo/discreteFace.h b/Geo/discreteFace.h
index 0fd0ac93f42e91e36629542f5d7e44fca2f2a23b..4faf8673758eb32e782d78e75f5e263aad998566 100644
--- a/Geo/discreteFace.h
+++ b/Geo/discreteFace.h
@@ -9,12 +9,13 @@
 #include "GModel.h"
 #include "GFace.h"
 #include "discreteEdge.h"
-#include "discreteDiskFace.h"
 #include "MEdge.h"
 
+class discreteDiskFace;
+
 class discreteFace : public GFace {
-  // FIXME we should at the end use a 
-  // mesh() functioon that is specific to 
+  // FIXME we should at the end use a
+  // mesh() functioon that is specific to
   // discreteFace
   // we should also SAVE those data's
  public:
@@ -29,7 +30,7 @@ class discreteFace : public GFace {
   virtual bool haveParametrization() { return getCompound(); }
   GEntity::GeomType geomType() const { return DiscreteSurface; }
   virtual Pair<SVector3, SVector3> firstDer(const SPoint2 &param) const;
-  virtual void secondDer(const SPoint2 &param, 
+  virtual void secondDer(const SPoint2 &param,
                          SVector3 *dudu, SVector3 *dvdv, SVector3 *dudv) const;
   void setBoundEdges(GModel *gm, std::vector<int> tagEdges);
   void findEdges(std::map<MEdge, std::vector<int>, Less_Edge > &map_edges);
@@ -37,7 +38,7 @@ class discreteFace : public GFace {
   void createGeometry();
   void gatherMeshes();
   virtual void mesh (bool verbose);
-  std::vector<discreteDiskFace*> _atlas; 
+  std::vector<discreteDiskFace*> _atlas;
 };
 
 #endif