diff --git a/CMakeLists.txt b/CMakeLists.txt
index 289feab9c34a8a7c69c68ac254bbbb0b899aec29..27e6609259fd43ef5dded2c02928ff4c40aca70c 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1145,11 +1145,6 @@ if(ENABLE_OCC)
       elseif(MSVC)
         add_definitions(-DWNT)
       endif(CYGWIN)
-      find_path(OCC_CONFIG_H "config.h" PATHS ${OCC_INC} ${OCC_CONFIG_H_PATH}
-                NO_DEFAULT_PATH)
-      if(NOT OCC_CONFIG_H)
-        add_definitions(-DHAVE_NO_OCC_CONFIG_H)
-      endif(NOT OCC_CONFIG_H)
     endif(OCC_INC)
   endif(NUM_OCC_LIBS EQUAL NUM_OCC_LIBS_REQUIRED)
 endif(ENABLE_OCC)
@@ -1848,7 +1843,9 @@ if(NOT DISABLE_GMSH_TESTS)
     # use relative path for cygwin/mingw (the pure win exe built with the mingw
     # compilers does not understand a full cygwin-style path)
     FILE(RELATIVE_PATH TEST ${CMAKE_CURRENT_BINARY_DIR} ${TESTFILE})
-    add_test(${TEST} ./gmsh ${TEST} -3 -nopopup -o ./tmp.msh)
+    if(HAVE_OCC OR NOT ${TEST} MATCHES "boolean")
+      add_test(${TEST} ./gmsh ${TEST} -3 -nopopup -o ./tmp.msh)
+    endif(HAVE_OCC OR NOT ${TEST} MATCHES "boolean")
   endforeach()
   # if(HAVE_PYTHON)
   #   file(GLOB_RECURSE TESTFILES tutorial/*.py)
@@ -1874,7 +1871,7 @@ message(STATUS "")
 mark_as_advanced(GMSH_EXTRA_VERSION
                  ACIS_LIB ANN_INC ANN_LIB CAIRO_LIB CAIRO_INC CGNS_INC GMM_INC
                  GMP_INC GMP_LIB MMG3D_INC MMG3D_LIB HDF5_LIB
-                 MED_LIB OCC_INC OCC_CONFIG_H SZ_LIB
+                 MED_LIB OCC_INC SZ_LIB
                  PETSC_LIBS SLEPC_INC SLEPC_INC2 SLEPC_LIB
                  BISON FLEX MAKEINFO TEXI2PDF FLTK_CONFIG_SCRIPT
                  GMSH_EXTERNAL_INCLUDE_DIRS GMSH_EXTERNAL_LIBRARIES)
diff --git a/Geo/GModelIO_OCC.h b/Geo/GModelIO_OCC.h
index 3049319dfa1bfc527f1c6549ec9fd84c0ac9033b..eacefcca6e0e62d1aa22e15af0f0aaa7b012394a 100644
--- a/Geo/GModelIO_OCC.h
+++ b/Geo/GModelIO_OCC.h
@@ -259,6 +259,11 @@ class OCC_Internals {
 #else
 
 class OCC_Internals {
+private:
+  void _error(std::string what)
+  {
+    Msg::Error("Gmsh requires OpenCASCADE to %s", what.c_str());
+  }
 public:
   enum BooleanOperator { Union, Intersection, Difference, Section, Fragments };
   OCC_Internals(){}
@@ -266,75 +271,79 @@ public:
   void reset(){}
   void setTagConstraints(int dim, int val){}
   int getMaxTag(int dim) const { return 0; }
-  void addVertex(int tag, double x, double y, double z, double meshSize=MAX_LC){}
-  void addLine(int tag, int startTag, int endTag){}
-  void addLine(int tag, std::vector<int> vertexTags){}
-  void addCircleArc(int tag, int startTag, int centerTag, int endTag){}
+  void addVertex(int tag, double x, double y, double z, double meshSize=MAX_LC)
+  { _error("add vertex"); }
+  void addLine(int tag, int startTag, int endTag){ _error("add line"); }
+  void addLine(int tag, std::vector<int> vertexTags){ _error("add line"); }
+  void addCircleArc(int tag, int startTag, int centerTag, int endTag)
+  { _error("add circle arc"); }
   void addCircle(int tag, double x, double y, double z, double r, double angle1,
-                 double angle2){}
-  void addEllipseArc(int tag, int startTag, int centerTag, int endTag){}
+                 double angle2){ _error("add circle"); }
+  void addEllipseArc(int tag, int startTag, int centerTag, int endTag)
+  { _error("add ellipse arc"); }
   void addEllipse(int tag, double x, double y, double z, double r1, double r2,
-                  double angle1, double angle2){}
-  void addBezier(int tag, std::vector<int> vertexTags){};
-  void addBSpline(int tag, std::vector<int> vertexTags){};
-  void addWire(int tag, std::vector<int> edgeTags, bool closed){}
-  void addLineLoop(int tag, std::vector<int> edgeTags){}
+                  double angle1, double angle2){ _error("add ellipse"); }
+  void addBezier(int tag, std::vector<int> vertexTags){ _error("add Bezier"); }
+  void addBSpline(int tag, std::vector<int> vertexTags){ _error("add BSpline"); }
+  void addWire(int tag, std::vector<int> edgeTags, bool closed){ _error("add wire"); }
+  void addLineLoop(int tag, std::vector<int> edgeTags){ _error("add line loop"); }
   void addRectangle(int tag, double x1, double y1, double z1,
-                    double x2, double y2, double z2, double roundedRadius=0.){}
-  void addDisk(int tag, double xc, double yc, double zc, double rx, double ry){}
-  void addPlaneSurface(int tag, std::vector<int> wireTags){}
-  void addSurfaceFilling(int tag, int wireTag){}
-  void addSurfaceLoop(int tag, std::vector<int> faceTags){}
-  void addVolume(int tag, std::vector<int> shellTags){}
+                    double x2, double y2, double z2, double roundedRadius=0.)
+  { _error("add rectangle"); }
+  void addDisk(int tag, double xc, double yc, double zc, double rx, double ry)
+  { _error("add disk"); }
+  void addPlaneSurface(int tag, std::vector<int> wireTags)
+  { _error("add plane surface"); }
+  void addSurfaceFilling(int tag, int wireTag){ _error("add surface filling"); }
+  void addSurfaceLoop(int tag, std::vector<int> faceTags){ _error("add surface loop"); }
+  void addVolume(int tag, std::vector<int> shellTags){ _error("add volume"); }
   void addSphere(int tag, double xc, double yc, double zc, double radius,
-                 double angle){};
+                 double angle){ _error("add sphere"); }
   void addBlock(int tag, double x1, double y1, double z1,
-                double x2, double y2, double z2){}
+                double x2, double y2, double z2){ _error("add block"); }
   void addCylinder(int tag, double x1, double y1, double z1, double x2, double y2,
-                   double z2, double r, double angle){}
+                   double z2, double r, double angle){ _error("add cylinder"); }
   void addCone(int tag, double x1, double y1, double z1, double x2, double y2,
-               double z2, double r1, double r2, double angle){}
+               double z2, double r1, double r2, double angle){ _error("add cone"); }
   void addWedge(int tag, double x, double y, double z, double dx, double dy,
-                double dz, double ltx){}
+                double dz, double ltx){ _error("add wedge"); }
   void addTorus(int tag, double x, double y, double z, double r1, double r2,
-                double angle){}
+                double angle){ _error("add torus"); }
   void addThruSections(int tag, std::vector<int> wireTags,
                        std::vector<int> outTags[4],
-                       bool makeSolid, bool makeRuled){}
+                       bool makeSolid, bool makeRuled){ _error("add thrusection"); }
   void addThickSolid(int tag, int solidTag, std::vector<int> excludeFaceTags,
-                     double offset){}
+                     double offset){ _error("add thick solid"); }
   void extrude(int tag, std::vector<int> inTags[4],
                double dx, double dy, double dz,
-               std::vector<int> outTags[4]){}
+               std::vector<int> outTags[4]){ _error("create extrusion"); }
   void revolve(int tag, std::vector<int> inTags[4],
                double x, double y, double z, double dx, double dy, double dz,
-               double angle, std::vector<int> outTags[4]){};
+               double angle, std::vector<int> outTags[4]){}
   void addPipe(int tag, std::vector<int> inTags[4], int wireTag,
-               std::vector<int> outTags[4]){}
+               std::vector<int> outTags[4]){ _error("add pipe"); }
   void fillet(std::vector<int> regionTags, std::vector<int> edgeTags,
-              double radius, std::vector<int> outTags[4]){}
+              double radius, std::vector<int> outTags[4]){ _error("create fillet"); }
   void applyBooleanOperator(int tag, BooleanOperator op,
                             std::vector<int> shapeTags[4],
                             std::vector<int> toolTags[4],
                             std::vector<int> outTags[4],
                             bool removeShape=true,
-                            bool removeTool=true){}
+                            bool removeTool=true){ _error("apply boolean operator"); }
   void getBoundary(std::vector<int> inTags[4], std::vector<int> outTags[4],
-                   bool combined=false){}
-  void translate(std::vector<int> inTags[4], double dx, double dy, double dz){}
+                   bool combined=false){ _error("extract boundary"); }
+  void translate(std::vector<int> inTags[4], double dx, double dy, double dz)
+  { _error("apply translation"); }
   void rotate(std::vector<int> inTags[4], double x, double y, double z,
-              double dx, double dy, double dz, double angle){}
-  void copy(std::vector<int> inTags[4], std::vector<int> outTags[4]){}
+              double dx, double dy, double dz, double angle){ _error("apply rotation"); }
+  void copy(std::vector<int> inTags[4], std::vector<int> outTags[4])
+  { _error("copy shape"); }
   void remove(std::vector<int> inTags[4]){}
   void importShapes(const std::string &fileName, bool highestDimOnly,
                     std::vector<int> outTags[4], const std::string &format="")
-  {
-    Msg::Error("Gmsh requires OpenCASCADE to import '%s'", fileName.c_str());
-  }
+  { _error("import shape"); }
   void exportShapes(const std::string &fileName, const std::string &format="")
-  {
-    Msg::Error("Gmsh requires OpenCASCADE to export '%s'", fileName.c_str());
-  }
+  { _error("export shape"); }
   void setMeshSize(int dim, int tag, double size){}
   void synchronize(GModel *model){}
   bool getVertex(int tag, double &x, double &y, double &z){ return false; }
diff --git a/Parser/Gmsh.tab.cpp b/Parser/Gmsh.tab.cpp
index b27f3b1f44cba18370f23951c9ed143af4a1027b..2274b251b57a2d50f6fdde9d7fa8eb9713951431 100644
--- a/Parser/Gmsh.tab.cpp
+++ b/Parser/Gmsh.tab.cpp
@@ -1436,15 +1436,15 @@ static const yytype_uint16 yyrline[] =
     5587,  5596,  5601,  5606,  5633,  5637,  5641,  5645,  5649,  5656,
     5660,  5664,  5668,  5675,  5680,  5687,  5692,  5696,  5701,  5705,
     5713,  5724,  5728,  5740,  5748,  5756,  5763,  5773,  5795,  5799,
-    5803,  5807,  5811,  5815,  5819,  5823,  5827,  5858,  5889,  5920,
-    5951,  5967,  5983,  5999,  6015,  6025,  6035,  6045,  6057,  6070,
-    6082,  6086,  6090,  6094,  6098,  6116,  6134,  6142,  6150,  6179,
-    6189,  6208,  6213,  6217,  6221,  6233,  6237,  6249,  6266,  6276,
-    6280,  6295,  6300,  6307,  6311,  6324,  6338,  6352,  6366,  6380,
-    6388,  6399,  6403,  6407,  6415,  6421,  6427,  6435,  6443,  6450,
-    6458,  6473,  6487,  6501,  6513,  6529,  6538,  6547,  6557,  6568,
-    6576,  6584,  6588,  6607,  6614,  6620,  6627,  6635,  6634,  6647,
-    6652,  6658,  6667,  6680,  6683,  6687
+    5803,  5807,  5811,  5815,  5819,  5823,  5827,  5856,  5885,  5914,
+    5943,  5959,  5975,  5991,  6007,  6017,  6027,  6037,  6049,  6062,
+    6074,  6078,  6082,  6086,  6090,  6108,  6126,  6134,  6142,  6171,
+    6181,  6200,  6205,  6209,  6213,  6225,  6229,  6241,  6258,  6268,
+    6272,  6287,  6292,  6299,  6303,  6316,  6330,  6344,  6358,  6372,
+    6380,  6391,  6395,  6399,  6407,  6413,  6419,  6427,  6435,  6442,
+    6450,  6465,  6479,  6493,  6505,  6521,  6530,  6539,  6549,  6560,
+    6568,  6576,  6580,  6599,  6606,  6612,  6619,  6627,  6626,  6639,
+    6644,  6650,  6659,  6672,  6675,  6679
 };
 #endif
 
@@ -13064,8 +13064,6 @@ yyreduce:
   case 516:
 #line 5828 "Gmsh.y"
     {
-      // FIXME: physical groups should not be stored in GEO_Internals, but
-      // directly in GModel
       (yyval.l) = List_Create(10, 1, sizeof(double));
       for(int i = 0; i < List_Nbr((yyvsp[(4) - (5)].l)); i++){
         double num;
@@ -13096,10 +13094,8 @@ yyreduce:
     break;
 
   case 517:
-#line 5859 "Gmsh.y"
+#line 5857 "Gmsh.y"
     {
-      // FIXME: physical groups should not be stored in GEO_Internals, but
-      // directly in GModel
       (yyval.l) = List_Create(10, 1, sizeof(double));
       for(int i = 0; i < List_Nbr((yyvsp[(4) - (5)].l)); i++){
         double num;
@@ -13130,10 +13126,8 @@ yyreduce:
     break;
 
   case 518:
-#line 5890 "Gmsh.y"
+#line 5886 "Gmsh.y"
     {
-      // FIXME: physical groups should not be stored in GEO_Internals, but
-      // directly in GModel
       (yyval.l) = List_Create(10, 1, sizeof(double));
       for(int i = 0; i < List_Nbr((yyvsp[(4) - (5)].l)); i++){
         double num;
@@ -13164,10 +13158,8 @@ yyreduce:
     break;
 
   case 519:
-#line 5921 "Gmsh.y"
+#line 5915 "Gmsh.y"
     {
-      // FIXME: physical groups should not be stored in GEO_Internals, but
-      // directly in GModel
       (yyval.l) = List_Create(10, 1, sizeof(double));
       for(int i = 0; i < List_Nbr((yyvsp[(4) - (5)].l)); i++){
         double num;
@@ -13198,7 +13190,7 @@ yyreduce:
     break;
 
   case 520:
-#line 5953 "Gmsh.y"
+#line 5945 "Gmsh.y"
     {
       if(GModel::current()->getOCCInternals()->getChanged())
         GModel::current()->getOCCInternals()->synchronize(GModel::current());
@@ -13216,7 +13208,7 @@ yyreduce:
     break;
 
   case 521:
-#line 5969 "Gmsh.y"
+#line 5961 "Gmsh.y"
     {
       if(GModel::current()->getOCCInternals()->getChanged())
         GModel::current()->getOCCInternals()->synchronize(GModel::current());
@@ -13234,7 +13226,7 @@ yyreduce:
     break;
 
   case 522:
-#line 5985 "Gmsh.y"
+#line 5977 "Gmsh.y"
     {
       if(GModel::current()->getOCCInternals()->getChanged())
         GModel::current()->getOCCInternals()->synchronize(GModel::current());
@@ -13252,7 +13244,7 @@ yyreduce:
     break;
 
   case 523:
-#line 6001 "Gmsh.y"
+#line 5993 "Gmsh.y"
     {
       if(GModel::current()->getOCCInternals()->getChanged())
         GModel::current()->getOCCInternals()->synchronize(GModel::current());
@@ -13270,7 +13262,7 @@ yyreduce:
     break;
 
   case 524:
-#line 6016 "Gmsh.y"
+#line 6008 "Gmsh.y"
     {
       (yyval.l) = List_Create(List_Nbr((yyvsp[(1) - (1)].l)), 1, sizeof(double));
       for(int i = 0; i < List_Nbr((yyvsp[(1) - (1)].l)); i++){
@@ -13283,7 +13275,7 @@ yyreduce:
     break;
 
   case 525:
-#line 6026 "Gmsh.y"
+#line 6018 "Gmsh.y"
     {
       (yyval.l) = List_Create(List_Nbr((yyvsp[(1) - (1)].l)), 1, sizeof(double));
       for(int i = 0; i < List_Nbr((yyvsp[(1) - (1)].l)); i++){
@@ -13296,7 +13288,7 @@ yyreduce:
     break;
 
   case 526:
-#line 6036 "Gmsh.y"
+#line 6028 "Gmsh.y"
     {
       (yyval.l) = List_Create(List_Nbr((yyvsp[(1) - (1)].l)), 1, sizeof(double));
       for(int i = 0; i < List_Nbr((yyvsp[(1) - (1)].l)); i++){
@@ -13309,7 +13301,7 @@ yyreduce:
     break;
 
   case 527:
-#line 6046 "Gmsh.y"
+#line 6038 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       if(!gmsh_yysymbols.count((yyvsp[(1) - (3)].c)))
@@ -13324,7 +13316,7 @@ yyreduce:
     break;
 
   case 528:
-#line 6058 "Gmsh.y"
+#line 6050 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       if(!gmsh_yysymbols.count((yyvsp[(1) - (3)].c)))
@@ -13339,7 +13331,7 @@ yyreduce:
     break;
 
   case 529:
-#line 6071 "Gmsh.y"
+#line 6063 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       if(!gmsh_yysymbols.count((yyvsp[(3) - (4)].c)))
@@ -13354,35 +13346,35 @@ yyreduce:
     break;
 
   case 530:
-#line 6083 "Gmsh.y"
+#line 6075 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(3) - (4)].l);
     ;}
     break;
 
   case 531:
-#line 6087 "Gmsh.y"
+#line 6079 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(3) - (4)].l);
     ;}
     break;
 
   case 532:
-#line 6091 "Gmsh.y"
+#line 6083 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(4) - (6)].l);
     ;}
     break;
 
   case 533:
-#line 6095 "Gmsh.y"
+#line 6087 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(4) - (6)].l);
     ;}
     break;
 
   case 534:
-#line 6099 "Gmsh.y"
+#line 6091 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       if(!gmsh_yysymbols.count((yyvsp[(1) - (6)].c)))
@@ -13403,7 +13395,7 @@ yyreduce:
     break;
 
   case 535:
-#line 6117 "Gmsh.y"
+#line 6109 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       if(!gmsh_yysymbols.count((yyvsp[(1) - (6)].c)))
@@ -13424,7 +13416,7 @@ yyreduce:
     break;
 
   case 536:
-#line 6135 "Gmsh.y"
+#line 6127 "Gmsh.y"
     {
       (yyval.l) = List_Create(20,20,sizeof(double));
       for(int i = 0; i < (int)(yyvsp[(7) - (8)].d); i++) {
@@ -13435,7 +13427,7 @@ yyreduce:
     break;
 
   case 537:
-#line 6143 "Gmsh.y"
+#line 6135 "Gmsh.y"
     {
       (yyval.l) = List_Create(20,20,sizeof(double));
       for(int i = 0; i < (int)(yyvsp[(7) - (8)].d); i++) {
@@ -13446,7 +13438,7 @@ yyreduce:
     break;
 
   case 538:
-#line 6151 "Gmsh.y"
+#line 6143 "Gmsh.y"
     {
       Msg::Barrier();
       FILE *File;
@@ -13478,7 +13470,7 @@ yyreduce:
     break;
 
   case 539:
-#line 6180 "Gmsh.y"
+#line 6172 "Gmsh.y"
     {
       double x0 = (yyvsp[(3) - (14)].d), x1 = (yyvsp[(5) - (14)].d), y0 = (yyvsp[(7) - (14)].d), y1 = (yyvsp[(9) - (14)].d), ys = (yyvsp[(11) - (14)].d);
       int N = (int)(yyvsp[(13) - (14)].d);
@@ -13491,7 +13483,7 @@ yyreduce:
     break;
 
   case 540:
-#line 6190 "Gmsh.y"
+#line 6182 "Gmsh.y"
     {
       std::vector<double> tmp;
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (4)].l)); i++){
@@ -13510,7 +13502,7 @@ yyreduce:
     break;
 
   case 541:
-#line 6209 "Gmsh.y"
+#line 6201 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       List_Add((yyval.l), &((yyvsp[(1) - (1)].d)));
@@ -13518,21 +13510,21 @@ yyreduce:
     break;
 
   case 542:
-#line 6214 "Gmsh.y"
+#line 6206 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(1) - (1)].l);
     ;}
     break;
 
   case 543:
-#line 6218 "Gmsh.y"
+#line 6210 "Gmsh.y"
     {
       List_Add((yyval.l), &((yyvsp[(3) - (3)].d)));
     ;}
     break;
 
   case 544:
-#line 6222 "Gmsh.y"
+#line 6214 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (3)].l)); i++){
 	double d;
@@ -13544,21 +13536,21 @@ yyreduce:
     break;
 
   case 545:
-#line 6234 "Gmsh.y"
+#line 6226 "Gmsh.y"
     {
       (yyval.u) = CTX::instance()->packColor((int)(yyvsp[(2) - (9)].d), (int)(yyvsp[(4) - (9)].d), (int)(yyvsp[(6) - (9)].d), (int)(yyvsp[(8) - (9)].d));
     ;}
     break;
 
   case 546:
-#line 6238 "Gmsh.y"
+#line 6230 "Gmsh.y"
     {
       (yyval.u) = CTX::instance()->packColor((int)(yyvsp[(2) - (7)].d), (int)(yyvsp[(4) - (7)].d), (int)(yyvsp[(6) - (7)].d), 255);
     ;}
     break;
 
   case 547:
-#line 6250 "Gmsh.y"
+#line 6242 "Gmsh.y"
     {
       int flag = 0;
       if(gmsh_yystringsymbols.count((yyvsp[(1) - (1)].c))){
@@ -13578,7 +13570,7 @@ yyreduce:
     break;
 
   case 548:
-#line 6267 "Gmsh.y"
+#line 6259 "Gmsh.y"
     {
       unsigned int val = 0;
       ColorOption(GMSH_GET, (yyvsp[(1) - (5)].c), 0, (yyvsp[(5) - (5)].c), val);
@@ -13588,14 +13580,14 @@ yyreduce:
     break;
 
   case 549:
-#line 6277 "Gmsh.y"
+#line 6269 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(2) - (3)].l);
     ;}
     break;
 
   case 550:
-#line 6281 "Gmsh.y"
+#line 6273 "Gmsh.y"
     {
       (yyval.l) = List_Create(256, 10, sizeof(unsigned int));
       GmshColorTable *ct = GetColorTable((int)(yyvsp[(3) - (6)].d));
@@ -13610,7 +13602,7 @@ yyreduce:
     break;
 
   case 551:
-#line 6296 "Gmsh.y"
+#line 6288 "Gmsh.y"
     {
       (yyval.l) = List_Create(256, 10, sizeof(unsigned int));
       List_Add((yyval.l), &((yyvsp[(1) - (1)].u)));
@@ -13618,21 +13610,21 @@ yyreduce:
     break;
 
   case 552:
-#line 6301 "Gmsh.y"
+#line 6293 "Gmsh.y"
     {
       List_Add((yyval.l), &((yyvsp[(3) - (3)].u)));
     ;}
     break;
 
   case 553:
-#line 6308 "Gmsh.y"
+#line 6300 "Gmsh.y"
     {
       (yyval.c) = (yyvsp[(1) - (1)].c);
     ;}
     break;
 
   case 554:
-#line 6312 "Gmsh.y"
+#line 6304 "Gmsh.y"
     {
       std::string val;
       if(!gmsh_yystringsymbols.count((yyvsp[(1) - (1)].c)))
@@ -13648,7 +13640,7 @@ yyreduce:
     break;
 
   case 555:
-#line 6325 "Gmsh.y"
+#line 6317 "Gmsh.y"
     {
       std::string val;
       int j = (int)(yyvsp[(3) - (4)].d);
@@ -13665,7 +13657,7 @@ yyreduce:
     break;
 
   case 556:
-#line 6339 "Gmsh.y"
+#line 6331 "Gmsh.y"
     {
       std::string val;
       int j = (int)(yyvsp[(3) - (4)].d);
@@ -13682,7 +13674,7 @@ yyreduce:
     break;
 
   case 557:
-#line 6353 "Gmsh.y"
+#line 6345 "Gmsh.y"
     {
       std::string val;
       int j = (int)(yyvsp[(3) - (4)].d);
@@ -13699,7 +13691,7 @@ yyreduce:
     break;
 
   case 558:
-#line 6367 "Gmsh.y"
+#line 6359 "Gmsh.y"
     {
       std::string val;
       int j = (int)(yyvsp[(3) - (4)].d);
@@ -13716,7 +13708,7 @@ yyreduce:
     break;
 
   case 559:
-#line 6381 "Gmsh.y"
+#line 6373 "Gmsh.y"
     {
       std::string out;
       StringOption(GMSH_GET, (yyvsp[(1) - (3)].c), 0, (yyvsp[(3) - (3)].c), out);
@@ -13727,7 +13719,7 @@ yyreduce:
     break;
 
   case 560:
-#line 6389 "Gmsh.y"
+#line 6381 "Gmsh.y"
     {
       std::string out;
       StringOption(GMSH_GET, (yyvsp[(1) - (6)].c), (int)(yyvsp[(3) - (6)].d), (yyvsp[(6) - (6)].c), out);
@@ -13738,21 +13730,21 @@ yyreduce:
     break;
 
   case 561:
-#line 6400 "Gmsh.y"
+#line 6392 "Gmsh.y"
     {
       (yyval.c) = (yyvsp[(1) - (1)].c);
     ;}
     break;
 
   case 562:
-#line 6404 "Gmsh.y"
+#line 6396 "Gmsh.y"
     {
       (yyval.c) = (yyvsp[(3) - (4)].c);
     ;}
     break;
 
   case 563:
-#line 6408 "Gmsh.y"
+#line 6400 "Gmsh.y"
     {
       (yyval.c) = (char *)Malloc(32 * sizeof(char));
       time_t now;
@@ -13763,7 +13755,7 @@ yyreduce:
     break;
 
   case 564:
-#line 6416 "Gmsh.y"
+#line 6408 "Gmsh.y"
     {
       std::string exe = Msg::GetExecutableName();
       (yyval.c) = (char *)Malloc(exe.size() + 1);
@@ -13772,7 +13764,7 @@ yyreduce:
     break;
 
   case 565:
-#line 6422 "Gmsh.y"
+#line 6414 "Gmsh.y"
     {
       std::string action = Msg::GetOnelabAction();
       (yyval.c) = (char *)Malloc(action.size() + 1);
@@ -13781,7 +13773,7 @@ yyreduce:
     break;
 
   case 566:
-#line 6428 "Gmsh.y"
+#line 6420 "Gmsh.y"
     {
       const char *env = GetEnvironmentVar((yyvsp[(3) - (4)].c));
       if(!env) env = "";
@@ -13792,7 +13784,7 @@ yyreduce:
     break;
 
   case 567:
-#line 6436 "Gmsh.y"
+#line 6428 "Gmsh.y"
     {
       std::string s = Msg::GetString((yyvsp[(3) - (6)].c), (yyvsp[(5) - (6)].c));
       (yyval.c) = (char *)Malloc((s.size() + 1) * sizeof(char));
@@ -13803,7 +13795,7 @@ yyreduce:
     break;
 
   case 568:
-#line 6444 "Gmsh.y"
+#line 6436 "Gmsh.y"
     {
       std::string s = Msg::GetOnelabString((yyvsp[(3) - (4)].c));
       (yyval.c) = (char *)Malloc((s.size() + 1) * sizeof(char));
@@ -13813,7 +13805,7 @@ yyreduce:
     break;
 
   case 569:
-#line 6451 "Gmsh.y"
+#line 6443 "Gmsh.y"
     {
       std::string s = Msg::GetOnelabString((yyvsp[(3) - (6)].c), (yyvsp[(5) - (6)].c));
       (yyval.c) = (char *)Malloc((s.size() + 1) * sizeof(char));
@@ -13824,7 +13816,7 @@ yyreduce:
     break;
 
   case 570:
-#line 6459 "Gmsh.y"
+#line 6451 "Gmsh.y"
     {
       int size = 1;
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (4)].l)); i++)
@@ -13842,7 +13834,7 @@ yyreduce:
     break;
 
   case 571:
-#line 6474 "Gmsh.y"
+#line 6466 "Gmsh.y"
     {
       (yyval.c) = (char *)Malloc((strlen((yyvsp[(3) - (4)].c)) + 1) * sizeof(char));
       int i;
@@ -13859,7 +13851,7 @@ yyreduce:
     break;
 
   case 572:
-#line 6488 "Gmsh.y"
+#line 6480 "Gmsh.y"
     {
       (yyval.c) = (char *)Malloc((strlen((yyvsp[(3) - (4)].c)) + 1) * sizeof(char));
       int i;
@@ -13876,7 +13868,7 @@ yyreduce:
     break;
 
   case 573:
-#line 6502 "Gmsh.y"
+#line 6494 "Gmsh.y"
     {
       std::string input = (yyvsp[(3) - (8)].c);
       std::string substr_old = (yyvsp[(5) - (8)].c);
@@ -13891,7 +13883,7 @@ yyreduce:
     break;
 
   case 574:
-#line 6514 "Gmsh.y"
+#line 6506 "Gmsh.y"
     {
       int size = 1;
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (4)].l)); i++)
@@ -13910,7 +13902,7 @@ yyreduce:
     break;
 
   case 575:
-#line 6530 "Gmsh.y"
+#line 6522 "Gmsh.y"
     {
       int i = 0;
       while ((yyvsp[(3) - (4)].c)[i]) {
@@ -13922,7 +13914,7 @@ yyreduce:
     break;
 
   case 576:
-#line 6539 "Gmsh.y"
+#line 6531 "Gmsh.y"
     {
       int i = 0;
       while ((yyvsp[(3) - (4)].c)[i]) {
@@ -13934,7 +13926,7 @@ yyreduce:
     break;
 
   case 577:
-#line 6548 "Gmsh.y"
+#line 6540 "Gmsh.y"
     {
       int i = 0;
       while ((yyvsp[(3) - (4)].c)[i]) {
@@ -13947,7 +13939,7 @@ yyreduce:
     break;
 
   case 578:
-#line 6558 "Gmsh.y"
+#line 6550 "Gmsh.y"
     {
       if((yyvsp[(3) - (8)].d)){
         (yyval.c) = (yyvsp[(5) - (8)].c);
@@ -13961,7 +13953,7 @@ yyreduce:
     break;
 
   case 579:
-#line 6569 "Gmsh.y"
+#line 6561 "Gmsh.y"
     {
       std::string in = (yyvsp[(3) - (8)].c);
       std::string out = in.substr((int)(yyvsp[(5) - (8)].d), (int)(yyvsp[(7) - (8)].d));
@@ -13972,7 +13964,7 @@ yyreduce:
     break;
 
   case 580:
-#line 6577 "Gmsh.y"
+#line 6569 "Gmsh.y"
     {
       std::string in = (yyvsp[(3) - (6)].c);
       std::string out = in.substr((int)(yyvsp[(5) - (6)].d), std::string::npos);
@@ -13983,14 +13975,14 @@ yyreduce:
     break;
 
   case 581:
-#line 6585 "Gmsh.y"
+#line 6577 "Gmsh.y"
     {
       (yyval.c) = (yyvsp[(3) - (4)].c);
     ;}
     break;
 
   case 582:
-#line 6589 "Gmsh.y"
+#line 6581 "Gmsh.y"
     {
       char tmpstring[5000];
       int i = PrintListOfDouble((yyvsp[(3) - (6)].c), (yyvsp[(5) - (6)].l), tmpstring);
@@ -14012,7 +14004,7 @@ yyreduce:
     break;
 
   case 583:
-#line 6608 "Gmsh.y"
+#line 6600 "Gmsh.y"
     {
       std::string tmp = FixRelativePath(gmsh_yyname, (yyvsp[(3) - (4)].c));
       (yyval.c) = (char*)Malloc((tmp.size() + 1) * sizeof(char));
@@ -14022,7 +14014,7 @@ yyreduce:
     break;
 
   case 584:
-#line 6615 "Gmsh.y"
+#line 6607 "Gmsh.y"
     {
       std::string tmp = SplitFileName(GetAbsolutePath(gmsh_yyname))[0];
       (yyval.c) = (char*)Malloc((tmp.size() + 1) * sizeof(char));
@@ -14031,7 +14023,7 @@ yyreduce:
     break;
 
   case 585:
-#line 6621 "Gmsh.y"
+#line 6613 "Gmsh.y"
     {
       std::string tmp = SplitFileName((yyvsp[(3) - (4)].c))[0];
       (yyval.c) = (char*)Malloc((tmp.size() + 1) * sizeof(char));
@@ -14041,7 +14033,7 @@ yyreduce:
     break;
 
   case 586:
-#line 6628 "Gmsh.y"
+#line 6620 "Gmsh.y"
     {
       std::string tmp = GetAbsolutePath((yyvsp[(3) - (4)].c));
       (yyval.c) = (char*)Malloc((tmp.size() + 1) * sizeof(char));
@@ -14051,12 +14043,12 @@ yyreduce:
     break;
 
   case 587:
-#line 6635 "Gmsh.y"
+#line 6627 "Gmsh.y"
     { floatOptions.clear(); charOptions.clear(); ;}
     break;
 
   case 588:
-#line 6637 "Gmsh.y"
+#line 6629 "Gmsh.y"
     {
       std::string val((yyvsp[(3) - (6)].c));
       Msg::ExchangeOnelabParameter("", val, floatOptions, charOptions);
@@ -14067,7 +14059,7 @@ yyreduce:
     break;
 
   case 589:
-#line 6648 "Gmsh.y"
+#line 6640 "Gmsh.y"
     {
       (yyval.l) = List_Create(20,20,sizeof(char*));
       List_Add((yyval.l), &((yyvsp[(1) - (1)].c)));
@@ -14075,12 +14067,12 @@ yyreduce:
     break;
 
   case 590:
-#line 6653 "Gmsh.y"
+#line 6645 "Gmsh.y"
     { List_Add((yyval.l), &((yyvsp[(3) - (3)].c))); ;}
     break;
 
   case 591:
-#line 6659 "Gmsh.y"
+#line 6651 "Gmsh.y"
     {
       char tmpstr[256];
       sprintf(tmpstr, "_%d", (int)(yyvsp[(4) - (5)].d));
@@ -14091,7 +14083,7 @@ yyreduce:
     break;
 
   case 592:
-#line 6668 "Gmsh.y"
+#line 6660 "Gmsh.y"
     {
       char tmpstr[256];
       sprintf(tmpstr, "_%d", (int)(yyvsp[(4) - (5)].d));
@@ -14102,23 +14094,23 @@ yyreduce:
     break;
 
   case 593:
-#line 6681 "Gmsh.y"
+#line 6673 "Gmsh.y"
     { (yyval.c) = (yyvsp[(1) - (1)].c); ;}
     break;
 
   case 594:
-#line 6684 "Gmsh.y"
+#line 6676 "Gmsh.y"
     { (yyval.c) = (yyvsp[(1) - (1)].c); ;}
     break;
 
   case 595:
-#line 6688 "Gmsh.y"
+#line 6680 "Gmsh.y"
     { (yyval.c) = (yyvsp[(3) - (4)].c); ;}
     break;
 
 
 /* Line 1267 of yacc.c.  */
-#line 14122 "Gmsh.tab.cpp"
+#line 14114 "Gmsh.tab.cpp"
       default: break;
     }
   YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
@@ -14332,7 +14324,7 @@ yyreturn:
 }
 
 
-#line 6691 "Gmsh.y"
+#line 6683 "Gmsh.y"
 
 
 void assignVariable(const std::string &name, int index, int assignType,
diff --git a/Parser/Gmsh.y b/Parser/Gmsh.y
index fec0d7d85225735f8037369ca9ee25e7d1ed4ea3..1c86379855af9f6d94ef6e14a48f62d353869090 100644
--- a/Parser/Gmsh.y
+++ b/Parser/Gmsh.y
@@ -5826,8 +5826,6 @@ FExpr_Multi :
     }
   | tPhysical tPoint '{' RecursiveListOfDouble '}'
     {
-      // FIXME: physical groups should not be stored in GEO_Internals, but
-      // directly in GModel
       $$ = List_Create(10, 1, sizeof(double));
       for(int i = 0; i < List_Nbr($4); i++){
         double num;
@@ -5857,8 +5855,6 @@ FExpr_Multi :
     }
   | tPhysical tLine '{' RecursiveListOfDouble '}'
     {
-      // FIXME: physical groups should not be stored in GEO_Internals, but
-      // directly in GModel
       $$ = List_Create(10, 1, sizeof(double));
       for(int i = 0; i < List_Nbr($4); i++){
         double num;
@@ -5888,8 +5884,6 @@ FExpr_Multi :
     }
   | tPhysical tSurface '{' RecursiveListOfDouble '}'
     {
-      // FIXME: physical groups should not be stored in GEO_Internals, but
-      // directly in GModel
       $$ = List_Create(10, 1, sizeof(double));
       for(int i = 0; i < List_Nbr($4); i++){
         double num;
@@ -5919,8 +5913,6 @@ FExpr_Multi :
     }
   | tPhysical tVolume '{' RecursiveListOfDouble '}'
     {
-      // FIXME: physical groups should not be stored in GEO_Internals, but
-      // directly in GModel
       $$ = List_Create(10, 1, sizeof(double));
       for(int i = 0; i < List_Nbr($4); i++){
         double num;