diff --git a/Geo/GEntity.h b/Geo/GEntity.h
index 9dbf88b098414bc5c049b5f5592732aa4ab9a011..07a07ac5abd36b50c1558873bc60611d32e86a28 100644
--- a/Geo/GEntity.h
+++ b/Geo/GEntity.h
@@ -93,7 +93,7 @@ class GEntity {
   // Returns a string describing the entity type
   virtual std::string getTypeString()
   {
-    char *name[] = {
+    const char *name[] = {
       "Unknown",
       "Point",
       "Boundary layer point",
diff --git a/Geo/MElement.cpp b/Geo/MElement.cpp
index 5d05978a344ba6645c8dbced8be3735149a5f0c5..eb05d6946f2db50ed89f44cec97179233cfba4e6 100644
--- a/Geo/MElement.cpp
+++ b/Geo/MElement.cpp
@@ -1,4 +1,4 @@
-// $Id: MElement.cpp,v 1.33 2007-03-16 10:03:40 remacle Exp $
+// $Id: MElement.cpp,v 1.34 2007-04-02 08:52:39 geuzaine Exp $
 //
 // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
 //
@@ -152,7 +152,7 @@ void MElement::writeMSH(FILE *fp, double version, bool binary, int num,
 
 void MElement::writePOS(FILE *fp, double scalingFactor, int elementary)
 {
-  char *str = getStringForPOS();
+  const char *str = getStringForPOS();
   if(!str) return;
 
   int n = getNumVertices();
@@ -278,7 +278,7 @@ void MElement::writeMESH(FILE *fp, int elementary)
 
 void MElement::writeBDF(FILE *fp, int format, int elementary)
 {
-  char *str = getStringForBDF();
+  const char *str = getStringForBDF();
   if(!str) return;
 
   setVolumePositive();
diff --git a/Geo/MElement.h b/Geo/MElement.h
index 73971a5302a7bcf7e49554b51600b7edb26ba311..2c50523ff8c02f9fb54469529ef39c00bb4d47fc 100644
--- a/Geo/MElement.h
+++ b/Geo/MElement.h
@@ -22,6 +22,7 @@
 
 #include <stdio.h>
 #include <algorithm>
+#include <string>
 #include "GmshDefines.h"
 #include "MVertex.h"
 #include "MEdge.h"
@@ -148,8 +149,8 @@ class MElement
   // info for specific IO formats
   virtual int getTypeForMSH() = 0;
   virtual int getTypeForUNV() = 0;
-  virtual char *getStringForPOS() = 0;
-  virtual char *getStringForBDF() = 0;
+  virtual const char *getStringForPOS() = 0;
+  virtual const char *getStringForBDF() = 0;
 };
 
 class MElementLessThanLexicographic{
@@ -192,8 +193,8 @@ class MLine : public MElement {
   virtual MFace getFace(int num){ throw; }
   virtual int getTypeForMSH(){ return MSH_LIN_2; }
   virtual int getTypeForUNV(){ return 21; } // linear beam
-  virtual char *getStringForPOS(){ return "SL"; }
-  virtual char *getStringForBDF(){ return "CBAR"; }
+  virtual const char *getStringForPOS(){ return "SL"; }
+  virtual const char *getStringForBDF(){ return "CBAR"; }
   virtual void revert() 
   {
     MVertex *tmp = _v[0]; _v[0] = _v[1]; _v[1] = tmp;
@@ -236,8 +237,8 @@ class MLine3 : public MLine {
   }
   virtual int getTypeForMSH(){ return MSH_LIN_3; }
   virtual int getTypeForUNV(){ return 24; } // parabolic beam
-  virtual char *getStringForPOS(){ return "SL2"; }
-  virtual char *getStringForBDF(){ return 0; } // not available
+  virtual const char *getStringForPOS(){ return "SL2"; }
+  virtual const char *getStringForBDF(){ return 0; } // not available
 };
 
 class MLineN : public MLine {
@@ -281,8 +282,8 @@ class MLineN : public MLine {
     throw;
   }
   virtual int getTypeForUNV(){ throw; } // not available
-  virtual char *getStringForPOS(){ return 0; } // not available
-  virtual char *getStringForBDF(){ return 0; } // not available
+  virtual const char *getStringForPOS(){ return 0; } // not available
+  virtual const char *getStringForBDF(){ return 0; } // not available
 };
 
 class MTriangle : public MElement {
@@ -337,8 +338,8 @@ class MTriangle : public MElement {
   }
   virtual int getTypeForMSH(){ return MSH_TRI_3; }
   virtual int getTypeForUNV(){ return 91; } // thin shell linear triangle
-  virtual char *getStringForPOS(){ return "ST"; }
-  virtual char *getStringForBDF(){ return "CTRIA3"; }
+  virtual const char *getStringForPOS(){ return "ST"; }
+  virtual const char *getStringForBDF(){ return "CTRIA3"; }
   virtual void revert() 
   {
     MVertex *tmp = _v[1]; _v[1] = _v[2]; _v[2] = tmp;
@@ -395,8 +396,8 @@ class MTriangle6 : public MTriangle {
   }
   virtual int getTypeForMSH(){ return MSH_TRI_6; }
   virtual int getTypeForUNV(){ return 92; } // thin shell parabolic triangle
-  virtual char *getStringForPOS(){ return "ST2"; }
-  virtual char *getStringForBDF(){ return "CTRIA6"; }
+  virtual const char *getStringForPOS(){ return "ST2"; }
+  virtual const char *getStringForBDF(){ return "CTRIA6"; }
   virtual void revert() 
   {
     MVertex *tmp;
@@ -457,8 +458,8 @@ class MTriangleN : public MTriangle {
     throw;
   }
   virtual int getTypeForUNV(){ throw; } // thin shell parabolic triangle
-  virtual char *getStringForPOS(){ return 0; }
-  virtual char *getStringForBDF(){ return 0; }
+  virtual const char *getStringForPOS(){ return 0; }
+  virtual const char *getStringForBDF(){ return 0; }
   virtual void revert() 
   {
     MVertex *tmp;
@@ -543,8 +544,8 @@ class MQuadrangle : public MElement {
   virtual MFace getFace(int num){ return MFace(_v[0], _v[1], _v[2], _v[3]); }
   virtual int getTypeForMSH(){ return MSH_QUA_4; }
   virtual int getTypeForUNV(){ return 94; } // thin shell linear quadrilateral
-  virtual char *getStringForPOS(){ return "SQ"; }
-  virtual char *getStringForBDF(){ return "CQUAD4"; }
+  virtual const char *getStringForPOS(){ return "SQ"; }
+  virtual const char *getStringForBDF(){ return "CQUAD4"; }
   virtual void revert() 
   {
     MVertex *tmp = _v[1]; _v[1] = _v[3]; _v[3] = tmp;
@@ -601,8 +602,8 @@ class MQuadrangle8 : public MQuadrangle {
   }
   virtual int getTypeForMSH(){ return MSH_QUA_8; }
   virtual int getTypeForUNV(){ return 95; } // shell parabolic quadrilateral
-  virtual char *getStringForPOS(){ return 0; } // not available
-  virtual char *getStringForBDF(){ return "CQUAD8"; }
+  virtual const char *getStringForPOS(){ return 0; } // not available
+  virtual const char *getStringForBDF(){ return "CQUAD8"; }
   virtual void revert() 
   {
     MVertex *tmp;
@@ -659,8 +660,8 @@ class MQuadrangle9 : public MQuadrangle {
   }
   virtual int getTypeForMSH(){ return MSH_QUA_9; }
   virtual int getTypeForUNV(){ return 0; } // not available
-  virtual char *getStringForPOS(){ return "SQ2"; }
-  virtual char *getStringForBDF(){ return 0; } // not available
+  virtual const char *getStringForPOS(){ return "SQ2"; }
+  virtual const char *getStringForBDF(){ return 0; } // not available
   virtual void revert() 
   {
     MVertex *tmp;
@@ -716,8 +717,8 @@ class MTetrahedron : public MElement {
   }
   virtual int getTypeForMSH(){ return MSH_TET_4; }
   virtual int getTypeForUNV(){ return 111; } // solid linear tetrahedron
-  virtual char *getStringForPOS(){ return "SS"; }
-  virtual char *getStringForBDF(){ return "CTETRA"; }
+  virtual const char *getStringForPOS(){ return "SS"; }
+  virtual const char *getStringForBDF(){ return "CTETRA"; }
   virtual void revert()
   {
     MVertex *tmp = _v[0]; _v[0] = _v[1]; _v[1] = tmp;
@@ -850,8 +851,8 @@ class MTetrahedron10 : public MTetrahedron {
   }
   virtual int getTypeForMSH(){ return MSH_TET_10; }
   virtual int getTypeForUNV(){ return 118; } // solid parabolic tetrahedron
-  virtual char *getStringForPOS(){ return "SS2"; }
-  virtual char *getStringForBDF(){ return "CTETRA"; }
+  virtual const char *getStringForPOS(){ return "SS2"; }
+  virtual const char *getStringForBDF(){ return "CTETRA"; }
   virtual void revert()
   {
     MVertex *tmp;
@@ -918,8 +919,8 @@ class MHexahedron : public MElement {
   }
   virtual int getTypeForMSH(){ return MSH_HEX_8; }
   virtual int getTypeForUNV(){ return 115; } // solid linear brick
-  virtual char *getStringForPOS(){ return "SH"; }
-  virtual char *getStringForBDF(){ return "CHEXA"; }
+  virtual const char *getStringForPOS(){ return "SH"; }
+  virtual const char *getStringForBDF(){ return "CHEXA"; }
   virtual void revert()
   {
     MVertex *tmp;
@@ -1017,8 +1018,8 @@ class MHexahedron20 : public MHexahedron {
   }
   virtual int getTypeForMSH(){ return MSH_HEX_20; }
   virtual int getTypeForUNV(){ return 116; } // solid parabolic brick
-  virtual char *getStringForPOS(){ return 0; } // not available
-  virtual char *getStringForBDF(){ return "CHEXA"; }
+  virtual const char *getStringForPOS(){ return 0; } // not available
+  virtual const char *getStringForBDF(){ return "CHEXA"; }
   virtual void revert()
   {
     MVertex *tmp;
@@ -1106,8 +1107,8 @@ class MHexahedron27 : public MHexahedron {
   }
   virtual int getTypeForMSH(){ return MSH_HEX_27; }
   virtual int getTypeForUNV(){ return 0; } // not available
-  virtual char *getStringForPOS(){ return "SH2"; }
-  virtual char *getStringForBDF(){ return 0; } // not available
+  virtual const char *getStringForPOS(){ return "SH2"; }
+  virtual const char *getStringForBDF(){ return 0; } // not available
   virtual void revert()
   {
     MVertex *tmp;
@@ -1182,8 +1183,8 @@ class MPrism : public MElement {
   }
   virtual int getTypeForMSH(){ return MSH_PRI_6; }
   virtual int getTypeForUNV(){ return 112; } // solid linear wedge
-  virtual char *getStringForPOS(){ return "SI"; }
-  virtual char *getStringForBDF(){ return "CPENTA"; }
+  virtual const char *getStringForPOS(){ return "SI"; }
+  virtual const char *getStringForBDF(){ return "CPENTA"; }
   virtual void revert()
   {
     MVertex *tmp;
@@ -1273,8 +1274,8 @@ class MPrism15 : public MPrism {
   }
   virtual int getTypeForMSH(){ return MSH_PRI_15; }
   virtual int getTypeForUNV(){ return 113; } // solid parabolic wedge
-  virtual char *getStringForPOS(){ return 0; } // not available
-  virtual char *getStringForBDF(){ return "CPENTA"; }
+  virtual const char *getStringForPOS(){ return 0; } // not available
+  virtual const char *getStringForBDF(){ return "CPENTA"; }
   virtual void revert()
   {
     MVertex *tmp;
@@ -1348,8 +1349,8 @@ class MPrism18 : public MPrism {
   }
   virtual int getTypeForMSH(){ return MSH_PRI_18; }
   virtual int getTypeForUNV(){ return 0; } // not available
-  virtual char *getStringForPOS(){ return "SI2"; }
-  virtual char *getStringForBDF(){ return 0; } // not available
+  virtual const char *getStringForPOS(){ return "SI2"; }
+  virtual const char *getStringForBDF(){ return 0; } // not available
   virtual void revert()
   {
     MVertex *tmp;
@@ -1413,8 +1414,8 @@ class MPyramid : public MElement {
   }
   virtual int getTypeForMSH(){ return MSH_PYR_5; }
   virtual int getTypeForUNV(){ return 0; } // not available
-  virtual char *getStringForPOS(){ return "SY"; }
-  virtual char *getStringForBDF(){ return "CPYRAM"; }
+  virtual const char *getStringForPOS(){ return "SY"; }
+  virtual const char *getStringForBDF(){ return "CPYRAM"; }
   virtual void revert()
   {
     MVertex *tmp = _v[0]; _v[0] = _v[2]; _v[2] = tmp;
@@ -1490,8 +1491,8 @@ class MPyramid13 : public MPyramid {
   }
   virtual int getTypeForMSH(){ return MSH_PYR_13; }
   virtual int getTypeForUNV(){ return 0; } // not available
-  virtual char *getStringForPOS(){ return 0; } // not available
-  virtual char *getStringForBDF(){ return 0; } // not available
+  virtual const char *getStringForPOS(){ return 0; } // not available
+  virtual const char *getStringForBDF(){ return 0; } // not available
   virtual void revert()
   {
     MVertex *tmp;
@@ -1560,8 +1561,8 @@ class MPyramid14 : public MPyramid {
   }
   virtual int getTypeForMSH(){ return MSH_PYR_14; }
   virtual int getTypeForUNV(){ return 0; } // not available
-  virtual char *getStringForPOS(){ return "SY2"; }
-  virtual char *getStringForBDF(){ return 0; } // not available
+  virtual const char *getStringForPOS(){ return "SY2"; }
+  virtual const char *getStringForBDF(){ return 0; } // not available
   virtual void revert()
   {
     MVertex *tmp;
diff --git a/contrib/ANN/src/ANN.cpp b/contrib/ANN/src/ANN.cpp
index 82f90f54afbab314e5940fe1160e451ff1309910..79d1215057c57d6c2985cadc529ddf5e4ced8ab0 100644
--- a/contrib/ANN/src/ANN.cpp
+++ b/contrib/ANN/src/ANN.cpp
@@ -26,6 +26,7 @@
 
 #include <ANN/ANNx.h>					// all ANN includes
 #include <ANN/ANNperf.h>				// ANN performance 
+#include <stdlib.h> // for gmsh
 
 using namespace std;					// make std:: accessible
 
diff --git a/contrib/ANN/src/kd_dump.cpp b/contrib/ANN/src/kd_dump.cpp
index e7015efe8511fed46c9a1db744b901a68dfaf59d..de6260c7d3f277ff4565f41af5b246fa8ee2eab8 100644
--- a/contrib/ANN/src/kd_dump.cpp
+++ b/contrib/ANN/src/kd_dump.cpp
@@ -33,6 +33,7 @@
 
 #include "kd_tree.h"					// kd-tree declarations
 #include "bd_tree.h"					// bd-tree declarations
+#include <stdlib.h> // for gmsh
 
 using namespace std;					// make std:: available