diff --git a/Parser/Gmsh.tab.cpp b/Parser/Gmsh.tab.cpp
index 10c231fbc1415d0147daab113ac2763bd25866dd..3cb00fb4cce9b6528bc0b7cf46ae632bf9893817 100644
--- a/Parser/Gmsh.tab.cpp
+++ b/Parser/Gmsh.tab.cpp
@@ -1169,35 +1169,35 @@ static const yytype_uint16 yyrline[] =
     2023,  2028,  2033,  2056,  2062,  2073,  2074,  2079,  2082,  2086,
     2109,  2132,  2155,  2183,  2204,  2230,  2251,  2273,  2293,  2405,
     2424,  2462,  2571,  2580,  2586,  2601,  2629,  2646,  2655,  2669,
-    2675,  2681,  2690,  2699,  2708,  2722,  2774,  2791,  2806,  2825,
-    2837,  2861,  2865,  2870,  2877,  2883,  2888,  2894,  2902,  2906,
-    2910,  2915,  2970,  2983,  3000,  3017,  3038,  3059,  3094,  3102,
-    3108,  3115,  3119,  3128,  3136,  3144,  3153,  3152,  3167,  3166,
-    3181,  3180,  3195,  3194,  3208,  3215,  3222,  3229,  3236,  3243,
-    3250,  3257,  3264,  3272,  3271,  3285,  3284,  3298,  3297,  3311,
-    3310,  3324,  3323,  3337,  3336,  3350,  3349,  3363,  3362,  3376,
-    3375,  3392,  3395,  3401,  3413,  3433,  3457,  3462,  3466,  3470,
-    3474,  3478,  3482,  3486,  3490,  3494,  3498,  3517,  3530,  3533,
-    3549,  3552,  3569,  3572,  3578,  3581,  3588,  3644,  3714,  3719,
-    3786,  3822,  3830,  3873,  3912,  3932,  3959,  3999,  4022,  4045,
-    4049,  4053,  4076,  4115,  4154,  4175,  4196,  4223,  4227,  4237,
-    4272,  4273,  4274,  4278,  4284,  4296,  4314,  4342,  4343,  4344,
-    4345,  4346,  4347,  4348,  4349,  4350,  4357,  4358,  4359,  4360,
-    4361,  4362,  4363,  4364,  4365,  4366,  4367,  4368,  4369,  4370,
-    4371,  4372,  4373,  4374,  4375,  4376,  4377,  4378,  4379,  4380,
-    4381,  4382,  4383,  4384,  4385,  4386,  4387,  4388,  4389,  4392,
-    4393,  4394,  4395,  4396,  4397,  4398,  4399,  4400,  4401,  4402,
-    4403,  4404,  4405,  4406,  4407,  4408,  4409,  4410,  4411,  4412,
-    4413,  4422,  4423,  4424,  4425,  4426,  4427,  4428,  4429,  4430,
-    4434,  4452,  4470,  4482,  4499,  4520,  4525,  4530,  4540,  4550,
-    4555,  4564,  4569,  4596,  4600,  4604,  4608,  4612,  4619,  4623,
-    4627,  4631,  4638,  4643,  4650,  4655,  4659,  4664,  4668,  4676,
-    4687,  4691,  4703,  4711,  4719,  4726,  4736,  4756,  4760,  4764,
-    4768,  4772,  4801,  4830,  4859,  4888,  4898,  4908,  4921,  4933,
-    4945,  4964,  4985,  4990,  4994,  4998,  5010,  5014,  5026,  5033,
-    5043,  5047,  5062,  5067,  5074,  5078,  5091,  5099,  5110,  5114,
-    5122,  5128,  5136,  5144,  5153,  5161,  5175,  5189,  5201,  5218,
-    5234,  5239,  5243,  5263,  5285,  5290,  5296,  5305,  5318,  5321
+    2675,  2681,  2690,  2699,  2708,  2722,  2775,  2792,  2807,  2826,
+    2838,  2862,  2866,  2871,  2878,  2884,  2889,  2895,  2903,  2907,
+    2911,  2916,  2971,  2984,  3001,  3018,  3039,  3060,  3095,  3103,
+    3109,  3116,  3120,  3129,  3137,  3145,  3154,  3153,  3168,  3167,
+    3182,  3181,  3196,  3195,  3209,  3216,  3223,  3230,  3237,  3244,
+    3251,  3258,  3265,  3273,  3272,  3286,  3285,  3299,  3298,  3312,
+    3311,  3325,  3324,  3338,  3337,  3351,  3350,  3364,  3363,  3377,
+    3376,  3393,  3396,  3402,  3414,  3434,  3458,  3463,  3467,  3471,
+    3475,  3479,  3483,  3487,  3491,  3495,  3499,  3518,  3531,  3534,
+    3550,  3553,  3570,  3573,  3579,  3582,  3589,  3645,  3715,  3720,
+    3787,  3823,  3831,  3874,  3913,  3933,  3960,  4000,  4023,  4046,
+    4050,  4054,  4077,  4116,  4155,  4176,  4197,  4224,  4228,  4238,
+    4273,  4274,  4275,  4279,  4285,  4297,  4315,  4343,  4344,  4345,
+    4346,  4347,  4348,  4349,  4350,  4351,  4358,  4359,  4360,  4361,
+    4362,  4363,  4364,  4365,  4366,  4367,  4368,  4369,  4370,  4371,
+    4372,  4373,  4374,  4375,  4376,  4377,  4378,  4379,  4380,  4381,
+    4382,  4383,  4384,  4385,  4386,  4387,  4388,  4389,  4390,  4393,
+    4394,  4395,  4396,  4397,  4398,  4399,  4400,  4401,  4402,  4403,
+    4404,  4405,  4406,  4407,  4408,  4409,  4410,  4411,  4412,  4413,
+    4414,  4423,  4424,  4425,  4426,  4427,  4428,  4429,  4430,  4431,
+    4435,  4453,  4471,  4483,  4500,  4521,  4526,  4531,  4541,  4551,
+    4556,  4565,  4570,  4597,  4601,  4605,  4609,  4613,  4620,  4624,
+    4628,  4632,  4639,  4644,  4651,  4656,  4660,  4665,  4669,  4677,
+    4688,  4692,  4704,  4712,  4720,  4727,  4737,  4757,  4761,  4765,
+    4769,  4773,  4802,  4831,  4860,  4889,  4899,  4909,  4922,  4934,
+    4946,  4965,  4986,  4991,  4995,  4999,  5011,  5015,  5027,  5034,
+    5044,  5048,  5063,  5068,  5075,  5079,  5092,  5100,  5111,  5115,
+    5123,  5129,  5137,  5145,  5154,  5162,  5176,  5190,  5202,  5219,
+    5235,  5240,  5244,  5264,  5286,  5291,  5297,  5306,  5319,  5322
 };
 #endif
 
@@ -7448,7 +7448,8 @@ yyreduce:
 	GModel::current()->setName((yyvsp[(2) - (3)].c));
       }
       else if(!strcmp((yyvsp[(1) - (3)].c), "CreateDir")){
-	CreateSingleDir(std::string((yyvsp[(2) - (3)].c)));
+        std::string tmp = FixRelativePath(gmsh_yyname, (yyvsp[(2) - (3)].c));
+	CreateSingleDir(tmp);
       }
       else{
 	yymsg(0, "Unknown command '%s'", (yyvsp[(1) - (3)].c));
@@ -7458,7 +7459,7 @@ yyreduce:
     break;
 
   case 196:
-#line 2775 "Gmsh.y"
+#line 2776 "Gmsh.y"
     {
 #if defined(HAVE_POST)
       if(!strcmp((yyvsp[(1) - (7)].c), "Save") && !strcmp((yyvsp[(2) - (7)].c), "View")){
@@ -7478,7 +7479,7 @@ yyreduce:
     break;
 
   case 197:
-#line 2792 "Gmsh.y"
+#line 2793 "Gmsh.y"
     {
 #if defined(HAVE_POST) && defined(HAVE_MESH)
       if(!strcmp((yyvsp[(1) - (7)].c), "Background") && !strcmp((yyvsp[(2) - (7)].c), "Mesh")  && !strcmp((yyvsp[(3) - (7)].c), "View")){
@@ -7496,7 +7497,7 @@ yyreduce:
     break;
 
   case 198:
-#line 2807 "Gmsh.y"
+#line 2808 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(1) - (3)].c), "Sleep")){
 	SleepInSeconds((yyvsp[(2) - (3)].d));
@@ -7518,7 +7519,7 @@ yyreduce:
     break;
 
   case 199:
-#line 2826 "Gmsh.y"
+#line 2827 "Gmsh.y"
     {
 #if defined(HAVE_PLUGINS)
        try {
@@ -7533,7 +7534,7 @@ yyreduce:
     break;
 
   case 200:
-#line 2838 "Gmsh.y"
+#line 2839 "Gmsh.y"
     {
 #if defined(HAVE_POST)
       if(!strcmp((yyvsp[(2) - (3)].c), "ElementsFromAllViews"))
@@ -7560,14 +7561,14 @@ yyreduce:
     break;
 
   case 201:
-#line 2862 "Gmsh.y"
+#line 2863 "Gmsh.y"
     {
       Msg::Exit(0);
     ;}
     break;
 
   case 202:
-#line 2866 "Gmsh.y"
+#line 2867 "Gmsh.y"
     {
       gmsh_yyerrorstate = 999; // this will be checked when yyparse returns
       YYABORT;
@@ -7575,7 +7576,7 @@ yyreduce:
     break;
 
   case 203:
-#line 2871 "Gmsh.y"
+#line 2872 "Gmsh.y"
     {
       // FIXME: this is a hack to force a transfer from the old DB to
       // the new DB. This will become unnecessary if/when we fill the
@@ -7585,7 +7586,7 @@ yyreduce:
     break;
 
   case 204:
-#line 2878 "Gmsh.y"
+#line 2879 "Gmsh.y"
     {
       CTX::instance()->forcedBBox = 0;
       GModel::current()->importGEOInternals();
@@ -7594,7 +7595,7 @@ yyreduce:
     break;
 
   case 205:
-#line 2884 "Gmsh.y"
+#line 2885 "Gmsh.y"
     {
       CTX::instance()->forcedBBox = 1;
       SetBoundingBox((yyvsp[(3) - (15)].d), (yyvsp[(5) - (15)].d), (yyvsp[(7) - (15)].d), (yyvsp[(9) - (15)].d), (yyvsp[(11) - (15)].d), (yyvsp[(13) - (15)].d));
@@ -7602,7 +7603,7 @@ yyreduce:
     break;
 
   case 206:
-#line 2889 "Gmsh.y"
+#line 2890 "Gmsh.y"
     {
 #if defined(HAVE_OPENGL)
       drawContext::global()->draw();
@@ -7611,7 +7612,7 @@ yyreduce:
     break;
 
   case 207:
-#line 2895 "Gmsh.y"
+#line 2896 "Gmsh.y"
     {
 #if defined(HAVE_OPENGL)
      CTX::instance()->mesh.changed = ENT_ALL;
@@ -7622,21 +7623,21 @@ yyreduce:
     break;
 
   case 208:
-#line 2903 "Gmsh.y"
+#line 2904 "Gmsh.y"
     {
       GModel::current()->createTopologyFromMesh();
     ;}
     break;
 
   case 209:
-#line 2907 "Gmsh.y"
+#line 2908 "Gmsh.y"
     {
       GModel::current()->createTopologyFromMesh(1);
     ;}
     break;
 
   case 210:
-#line 2911 "Gmsh.y"
+#line 2912 "Gmsh.y"
     {
       GModel::current()->importGEOInternals();
       GModel::current()->refineMesh(CTX::instance()->mesh.secondOrderLinear);
@@ -7644,7 +7645,7 @@ yyreduce:
     break;
 
   case 211:
-#line 2917 "Gmsh.y"
+#line 2918 "Gmsh.y"
     {
       int lock = CTX::instance()->lock;
       CTX::instance()->lock = 0;
@@ -7701,7 +7702,7 @@ yyreduce:
     break;
 
   case 212:
-#line 2971 "Gmsh.y"
+#line 2972 "Gmsh.y"
     {
 #if defined(HAVE_MESH)
       SetOrderN(GModel::current(), (yyvsp[(2) - (3)].d), CTX::instance()->mesh.secondOrderLinear,
@@ -7712,7 +7713,7 @@ yyreduce:
     break;
 
   case 213:
-#line 2984 "Gmsh.y"
+#line 2985 "Gmsh.y"
     {
       LoopControlVariablesTab[ImbricatedLoop][0] = (yyvsp[(3) - (6)].d);
       LoopControlVariablesTab[ImbricatedLoop][1] = (yyvsp[(5) - (6)].d);
@@ -7732,7 +7733,7 @@ yyreduce:
     break;
 
   case 214:
-#line 3001 "Gmsh.y"
+#line 3002 "Gmsh.y"
     {
       LoopControlVariablesTab[ImbricatedLoop][0] = (yyvsp[(3) - (8)].d);
       LoopControlVariablesTab[ImbricatedLoop][1] = (yyvsp[(5) - (8)].d);
@@ -7752,7 +7753,7 @@ yyreduce:
     break;
 
   case 215:
-#line 3018 "Gmsh.y"
+#line 3019 "Gmsh.y"
     {
       LoopControlVariablesTab[ImbricatedLoop][0] = (yyvsp[(5) - (8)].d);
       LoopControlVariablesTab[ImbricatedLoop][1] = (yyvsp[(7) - (8)].d);
@@ -7776,7 +7777,7 @@ yyreduce:
     break;
 
   case 216:
-#line 3039 "Gmsh.y"
+#line 3040 "Gmsh.y"
     {
       LoopControlVariablesTab[ImbricatedLoop][0] = (yyvsp[(5) - (10)].d);
       LoopControlVariablesTab[ImbricatedLoop][1] = (yyvsp[(7) - (10)].d);
@@ -7800,7 +7801,7 @@ yyreduce:
     break;
 
   case 217:
-#line 3060 "Gmsh.y"
+#line 3061 "Gmsh.y"
     {
       if(ImbricatedLoop <= 0){
 	yymsg(0, "Invalid For/EndFor loop");
@@ -7838,7 +7839,7 @@ yyreduce:
     break;
 
   case 218:
-#line 3095 "Gmsh.y"
+#line 3096 "Gmsh.y"
     {
       if(!FunctionManager::Instance()->createFunction
          ((yyvsp[(2) - (2)].c), gmsh_yyin, gmsh_yyname, gmsh_yylineno))
@@ -7849,7 +7850,7 @@ yyreduce:
     break;
 
   case 219:
-#line 3103 "Gmsh.y"
+#line 3104 "Gmsh.y"
     {
       if(!FunctionManager::Instance()->leaveFunction
          (&gmsh_yyin, gmsh_yyname, gmsh_yylineno))
@@ -7858,7 +7859,7 @@ yyreduce:
     break;
 
   case 220:
-#line 3109 "Gmsh.y"
+#line 3110 "Gmsh.y"
     {
       if(!FunctionManager::Instance()->enterFunction
          ((yyvsp[(2) - (3)].c), &gmsh_yyin, gmsh_yyname, gmsh_yylineno))
@@ -7868,20 +7869,20 @@ yyreduce:
     break;
 
   case 221:
-#line 3116 "Gmsh.y"
+#line 3117 "Gmsh.y"
     {
       if(!(yyvsp[(3) - (4)].d)) skip_until("If", "EndIf");
     ;}
     break;
 
   case 222:
-#line 3120 "Gmsh.y"
+#line 3121 "Gmsh.y"
     {
     ;}
     break;
 
   case 223:
-#line 3129 "Gmsh.y"
+#line 3130 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShapes(TRANSLATE, (yyvsp[(4) - (5)].l),
@@ -7892,7 +7893,7 @@ yyreduce:
     break;
 
   case 224:
-#line 3137 "Gmsh.y"
+#line 3138 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShapes(ROTATE, (yyvsp[(10) - (11)].l),
@@ -7903,7 +7904,7 @@ yyreduce:
     break;
 
   case 225:
-#line 3145 "Gmsh.y"
+#line 3146 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShapes(TRANSLATE_ROTATE, (yyvsp[(12) - (13)].l),
@@ -7914,7 +7915,7 @@ yyreduce:
     break;
 
   case 226:
-#line 3153 "Gmsh.y"
+#line 3154 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
       extr.mesh.QuadToTri = NO_QUADTRI;
@@ -7923,7 +7924,7 @@ yyreduce:
     break;
 
   case 227:
-#line 3159 "Gmsh.y"
+#line 3160 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShapes(TRANSLATE, (yyvsp[(4) - (7)].l),
@@ -7934,7 +7935,7 @@ yyreduce:
     break;
 
   case 228:
-#line 3167 "Gmsh.y"
+#line 3168 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
       extr.mesh.QuadToTri = NO_QUADTRI;
@@ -7943,7 +7944,7 @@ yyreduce:
     break;
 
   case 229:
-#line 3173 "Gmsh.y"
+#line 3174 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShapes(ROTATE, (yyvsp[(10) - (13)].l),
@@ -7954,7 +7955,7 @@ yyreduce:
     break;
 
   case 230:
-#line 3181 "Gmsh.y"
+#line 3182 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
       extr.mesh.QuadToTri = NO_QUADTRI;
@@ -7963,7 +7964,7 @@ yyreduce:
     break;
 
   case 231:
-#line 3187 "Gmsh.y"
+#line 3188 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShapes(TRANSLATE_ROTATE, (yyvsp[(12) - (15)].l),
@@ -7974,7 +7975,7 @@ yyreduce:
     break;
 
   case 232:
-#line 3195 "Gmsh.y"
+#line 3196 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
       extr.mesh.QuadToTri = NO_QUADTRI;
@@ -7983,7 +7984,7 @@ yyreduce:
     break;
 
   case 233:
-#line 3201 "Gmsh.y"
+#line 3202 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShapes(BOUNDARY_LAYER, (yyvsp[(3) - (6)].l), 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
@@ -7993,7 +7994,7 @@ yyreduce:
     break;
 
   case 234:
-#line 3209 "Gmsh.y"
+#line 3210 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(TRANSLATE, MSH_POINT, (int)(yyvsp[(4) - (8)].d),
@@ -8003,7 +8004,7 @@ yyreduce:
     break;
 
   case 235:
-#line 3216 "Gmsh.y"
+#line 3217 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(TRANSLATE, MSH_SEGM_LINE, (int)(yyvsp[(4) - (8)].d),
@@ -8013,7 +8014,7 @@ yyreduce:
     break;
 
   case 236:
-#line 3223 "Gmsh.y"
+#line 3224 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(TRANSLATE, MSH_SURF_PLAN, (int)(yyvsp[(4) - (8)].d),
@@ -8023,7 +8024,7 @@ yyreduce:
     break;
 
   case 237:
-#line 3230 "Gmsh.y"
+#line 3231 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(ROTATE, MSH_POINT, (int)(yyvsp[(4) - (12)].d),
@@ -8033,7 +8034,7 @@ yyreduce:
     break;
 
   case 238:
-#line 3237 "Gmsh.y"
+#line 3238 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(ROTATE, MSH_SEGM_LINE, (int)(yyvsp[(4) - (12)].d),
@@ -8043,7 +8044,7 @@ yyreduce:
     break;
 
   case 239:
-#line 3244 "Gmsh.y"
+#line 3245 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(ROTATE, MSH_SURF_PLAN, (int)(yyvsp[(4) - (12)].d),
@@ -8053,7 +8054,7 @@ yyreduce:
     break;
 
   case 240:
-#line 3251 "Gmsh.y"
+#line 3252 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(TRANSLATE_ROTATE, MSH_POINT, (int)(yyvsp[(4) - (14)].d),
@@ -8063,7 +8064,7 @@ yyreduce:
     break;
 
   case 241:
-#line 3258 "Gmsh.y"
+#line 3259 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(TRANSLATE_ROTATE, MSH_SEGM_LINE, (int)(yyvsp[(4) - (14)].d),
@@ -8073,7 +8074,7 @@ yyreduce:
     break;
 
   case 242:
-#line 3265 "Gmsh.y"
+#line 3266 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(TRANSLATE_ROTATE, MSH_SURF_PLAN, (int)(yyvsp[(4) - (14)].d),
@@ -8083,7 +8084,7 @@ yyreduce:
     break;
 
   case 243:
-#line 3272 "Gmsh.y"
+#line 3273 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
       extr.mesh.QuadToTri = NO_QUADTRI;
@@ -8092,7 +8093,7 @@ yyreduce:
     break;
 
   case 244:
-#line 3278 "Gmsh.y"
+#line 3279 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(TRANSLATE, MSH_POINT, (int)(yyvsp[(4) - (12)].d),
@@ -8102,7 +8103,7 @@ yyreduce:
     break;
 
   case 245:
-#line 3285 "Gmsh.y"
+#line 3286 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
       extr.mesh.QuadToTri = NO_QUADTRI;
@@ -8111,7 +8112,7 @@ yyreduce:
     break;
 
   case 246:
-#line 3291 "Gmsh.y"
+#line 3292 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(TRANSLATE, MSH_SEGM_LINE, (int)(yyvsp[(4) - (12)].d),
@@ -8121,7 +8122,7 @@ yyreduce:
     break;
 
   case 247:
-#line 3298 "Gmsh.y"
+#line 3299 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
       extr.mesh.QuadToTri = NO_QUADTRI;
@@ -8130,7 +8131,7 @@ yyreduce:
     break;
 
   case 248:
-#line 3304 "Gmsh.y"
+#line 3305 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(TRANSLATE, MSH_SURF_PLAN, (int)(yyvsp[(4) - (12)].d),
@@ -8140,7 +8141,7 @@ yyreduce:
     break;
 
   case 249:
-#line 3311 "Gmsh.y"
+#line 3312 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
       extr.mesh.QuadToTri = NO_QUADTRI;
@@ -8149,7 +8150,7 @@ yyreduce:
     break;
 
   case 250:
-#line 3317 "Gmsh.y"
+#line 3318 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(ROTATE, MSH_POINT, (int)(yyvsp[(4) - (16)].d),
@@ -8159,7 +8160,7 @@ yyreduce:
     break;
 
   case 251:
-#line 3324 "Gmsh.y"
+#line 3325 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
       extr.mesh.QuadToTri = NO_QUADTRI;
@@ -8168,7 +8169,7 @@ yyreduce:
     break;
 
   case 252:
-#line 3330 "Gmsh.y"
+#line 3331 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(ROTATE, MSH_SEGM_LINE, (int)(yyvsp[(4) - (16)].d),
@@ -8178,7 +8179,7 @@ yyreduce:
     break;
 
   case 253:
-#line 3337 "Gmsh.y"
+#line 3338 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
       extr.mesh.QuadToTri = NO_QUADTRI;
@@ -8187,7 +8188,7 @@ yyreduce:
     break;
 
   case 254:
-#line 3343 "Gmsh.y"
+#line 3344 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(ROTATE, MSH_SURF_PLAN, (int)(yyvsp[(4) - (16)].d),
@@ -8197,7 +8198,7 @@ yyreduce:
     break;
 
   case 255:
-#line 3350 "Gmsh.y"
+#line 3351 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
       extr.mesh.QuadToTri = NO_QUADTRI;
@@ -8206,7 +8207,7 @@ yyreduce:
     break;
 
   case 256:
-#line 3356 "Gmsh.y"
+#line 3357 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(TRANSLATE_ROTATE, MSH_POINT, (int)(yyvsp[(4) - (18)].d),
@@ -8216,7 +8217,7 @@ yyreduce:
     break;
 
   case 257:
-#line 3363 "Gmsh.y"
+#line 3364 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
       extr.mesh.QuadToTri = NO_QUADTRI;
@@ -8225,7 +8226,7 @@ yyreduce:
     break;
 
   case 258:
-#line 3369 "Gmsh.y"
+#line 3370 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(TRANSLATE_ROTATE, MSH_SEGM_LINE, (int)(yyvsp[(4) - (18)].d),
@@ -8235,7 +8236,7 @@ yyreduce:
     break;
 
   case 259:
-#line 3376 "Gmsh.y"
+#line 3377 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
       extr.mesh.QuadToTri = NO_QUADTRI;
@@ -8244,7 +8245,7 @@ yyreduce:
     break;
 
   case 260:
-#line 3382 "Gmsh.y"
+#line 3383 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(TRANSLATE_ROTATE, MSH_SURF_PLAN, (int)(yyvsp[(4) - (18)].d),
@@ -8254,19 +8255,19 @@ yyreduce:
     break;
 
   case 261:
-#line 3393 "Gmsh.y"
+#line 3394 "Gmsh.y"
     {
     ;}
     break;
 
   case 262:
-#line 3396 "Gmsh.y"
+#line 3397 "Gmsh.y"
     {
     ;}
     break;
 
   case 263:
-#line 3402 "Gmsh.y"
+#line 3403 "Gmsh.y"
     {
       int n = (int)fabs((yyvsp[(3) - (5)].d));
       if(n){ // we accept n==0 to easily disable layers
@@ -8281,7 +8282,7 @@ yyreduce:
     break;
 
   case 264:
-#line 3414 "Gmsh.y"
+#line 3415 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = true;
       extr.mesh.NbLayer = List_Nbr((yyvsp[(3) - (7)].l));
@@ -8304,7 +8305,7 @@ yyreduce:
     break;
 
   case 265:
-#line 3434 "Gmsh.y"
+#line 3435 "Gmsh.y"
     {
       yymsg(0, "Explicit region numbers in layers are deprecated");
       extr.mesh.ExtrudeMesh = true;
@@ -8330,77 +8331,77 @@ yyreduce:
     break;
 
   case 266:
-#line 3458 "Gmsh.y"
+#line 3459 "Gmsh.y"
     {
       extr.mesh.ScaleLast = true;
     ;}
     break;
 
   case 267:
-#line 3463 "Gmsh.y"
+#line 3464 "Gmsh.y"
     {
       extr.mesh.Recombine = true;
     ;}
     break;
 
   case 268:
-#line 3467 "Gmsh.y"
+#line 3468 "Gmsh.y"
     {
       yymsg(0, "Keyword 'QuadTriSngl' deprecated. Use 'QuadTriNoNewVerts' instead.");
     ;}
     break;
 
   case 269:
-#line 3471 "Gmsh.y"
+#line 3472 "Gmsh.y"
     {
       yymsg(0, "Keyword 'QuadTriSngl' deprecated. Use 'QuadTriNoNewVerts' instead.");
     ;}
     break;
 
   case 270:
-#line 3475 "Gmsh.y"
+#line 3476 "Gmsh.y"
     {
       yymsg(0, "Method 'QuadTriDbl' deprecated. Use 'QuadTriAddVerts' instead, which has no requirement for the number of extrusion layers and meshes with body-centered vertices.");
     ;}
     break;
 
   case 271:
-#line 3479 "Gmsh.y"
+#line 3480 "Gmsh.y"
     {
       yymsg(0, "Method 'QuadTriDbl' deprecated. Use 'QuadTriAddVerts' instead, which has no requirement for the number of extrusion layers and meshes with body-centered vertices.");
     ;}
     break;
 
   case 272:
-#line 3483 "Gmsh.y"
+#line 3484 "Gmsh.y"
     {
       extr.mesh.QuadToTri = QUADTRI_ADDVERTS_1;
     ;}
     break;
 
   case 273:
-#line 3487 "Gmsh.y"
+#line 3488 "Gmsh.y"
     {
       extr.mesh.QuadToTri = QUADTRI_ADDVERTS_1_RECOMB;
     ;}
     break;
 
   case 274:
-#line 3491 "Gmsh.y"
+#line 3492 "Gmsh.y"
     {
       extr.mesh.QuadToTri = QUADTRI_NOVERTS_1;
     ;}
     break;
 
   case 275:
-#line 3495 "Gmsh.y"
+#line 3496 "Gmsh.y"
     {
       extr.mesh.QuadToTri = QUADTRI_NOVERTS_1_RECOMB;
     ;}
     break;
 
   case 276:
-#line 3499 "Gmsh.y"
+#line 3500 "Gmsh.y"
     {
       int num = (int)(yyvsp[(3) - (9)].d);
       if(FindSurface(num)){
@@ -8422,7 +8423,7 @@ yyreduce:
     break;
 
   case 277:
-#line 3518 "Gmsh.y"
+#line 3519 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(2) - (6)].c), "Index"))
         extr.mesh.BoundaryLayerIndex = (yyvsp[(4) - (6)].d);
@@ -8433,14 +8434,14 @@ yyreduce:
     break;
 
   case 278:
-#line 3530 "Gmsh.y"
+#line 3531 "Gmsh.y"
     {
       (yyval.v)[0] = (yyval.v)[1] = 1.;
     ;}
     break;
 
   case 279:
-#line 3534 "Gmsh.y"
+#line 3535 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(2) - (3)].c), "Progression") || !strcmp((yyvsp[(2) - (3)].c), "Power"))
         (yyval.v)[0] = 1.;
@@ -8456,14 +8457,14 @@ yyreduce:
     break;
 
   case 280:
-#line 3549 "Gmsh.y"
+#line 3550 "Gmsh.y"
     {
       (yyval.i) = -1; // left
     ;}
     break;
 
   case 281:
-#line 3553 "Gmsh.y"
+#line 3554 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(1) - (1)].c), "Right"))
         (yyval.i) = 1;
@@ -8480,35 +8481,35 @@ yyreduce:
     break;
 
   case 282:
-#line 3569 "Gmsh.y"
+#line 3570 "Gmsh.y"
     {
      (yyval.l) = List_Create(1, 1, sizeof(double));
    ;}
     break;
 
   case 283:
-#line 3573 "Gmsh.y"
+#line 3574 "Gmsh.y"
     {
      (yyval.l) = (yyvsp[(2) - (2)].l);
    ;}
     break;
 
   case 284:
-#line 3578 "Gmsh.y"
+#line 3579 "Gmsh.y"
     {
       (yyval.i) = 45;
     ;}
     break;
 
   case 285:
-#line 3582 "Gmsh.y"
+#line 3583 "Gmsh.y"
     {
       (yyval.i) = (int)(yyvsp[(2) - (2)].d);
     ;}
     break;
 
   case 286:
-#line 3589 "Gmsh.y"
+#line 3590 "Gmsh.y"
     {
       int type = (int)(yyvsp[(6) - (7)].v)[0];
       double coef = fabs((yyvsp[(6) - (7)].v)[1]);
@@ -8567,7 +8568,7 @@ yyreduce:
     break;
 
   case 287:
-#line 3645 "Gmsh.y"
+#line 3646 "Gmsh.y"
     {
       int k = List_Nbr((yyvsp[(4) - (6)].l));
       if(k != 0 && k != 3 && k != 4){
@@ -8640,7 +8641,7 @@ yyreduce:
     break;
 
   case 288:
-#line 3715 "Gmsh.y"
+#line 3716 "Gmsh.y"
     {
       yymsg(1, "Elliptic Surface is deprecated: use Transfinite instead (with smoothing)");
       List_Delete((yyvsp[(7) - (8)].l));
@@ -8648,7 +8649,7 @@ yyreduce:
     break;
 
   case 289:
-#line 3720 "Gmsh.y"
+#line 3721 "Gmsh.y"
     {
       int k = List_Nbr((yyvsp[(4) - (5)].l));
       if(k != 0 && k != 6 && k != 8){
@@ -8718,7 +8719,7 @@ yyreduce:
     break;
 
   case 290:
-#line 3787 "Gmsh.y"
+#line 3788 "Gmsh.y"
     {
       if(!(yyvsp[(2) - (3)].l)){
   	  List_T *tmp = Tree2List(GModel::current()->getGEOInternals()->Volumes);
@@ -8757,7 +8758,7 @@ yyreduce:
     break;
 
   case 291:
-#line 3823 "Gmsh.y"
+#line 3824 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(4) - (7)].l)); i++){
 	double d;
@@ -8768,7 +8769,7 @@ yyreduce:
     break;
 
   case 292:
-#line 3831 "Gmsh.y"
+#line 3832 "Gmsh.y"
     {
       if(!(yyvsp[(3) - (5)].l)){
 	List_T *tmp = Tree2List(GModel::current()->getGEOInternals()->Surfaces);
@@ -8814,7 +8815,7 @@ yyreduce:
     break;
 
   case 293:
-#line 3874 "Gmsh.y"
+#line 3875 "Gmsh.y"
     {
       if(!(yyvsp[(3) - (4)].l)){
 	List_T *tmp = Tree2List(GModel::current()->getGEOInternals()->Volumes);
@@ -8856,7 +8857,7 @@ yyreduce:
     break;
 
   case 294:
-#line 3913 "Gmsh.y"
+#line 3914 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (6)].l)); i++){
 	double d;
@@ -8879,7 +8880,7 @@ yyreduce:
     break;
 
   case 295:
-#line 3933 "Gmsh.y"
+#line 3934 "Gmsh.y"
     {
       if(List_Nbr((yyvsp[(5) - (6)].l)) != List_Nbr((yyvsp[(3) - (6)].l))){
 	yymsg(0, "Number of master (%d) different from number of slave (%d) lines",
@@ -8909,7 +8910,7 @@ yyreduce:
     break;
 
   case 296:
-#line 3961 "Gmsh.y"
+#line 3962 "Gmsh.y"
     {
       if (List_Nbr((yyvsp[(5) - (12)].l)) != List_Nbr((yyvsp[(10) - (12)].l))){
 	yymsg(0, "Number of master surface edges (%d) different from number of "
@@ -8951,7 +8952,7 @@ yyreduce:
     break;
 
   case 297:
-#line 4000 "Gmsh.y"
+#line 4001 "Gmsh.y"
     {
       Surface *s = FindSurface((int)(yyvsp[(8) - (10)].d));
       if(s){
@@ -8977,7 +8978,7 @@ yyreduce:
     break;
 
   case 298:
-#line 4023 "Gmsh.y"
+#line 4024 "Gmsh.y"
     {
       Surface *s = FindSurface((int)(yyvsp[(8) - (10)].d));
       if(s){
@@ -9003,21 +9004,21 @@ yyreduce:
     break;
 
   case 299:
-#line 4046 "Gmsh.y"
+#line 4047 "Gmsh.y"
     {
       Msg::Error("Point in Volume not implemented yet");
     ;}
     break;
 
   case 300:
-#line 4050 "Gmsh.y"
+#line 4051 "Gmsh.y"
     {
       Msg::Error("Line in Volume not implemented yet");
     ;}
     break;
 
   case 301:
-#line 4054 "Gmsh.y"
+#line 4055 "Gmsh.y"
     {
       Volume *v = FindVolume((int)(yyvsp[(8) - (10)].d));
       if(v){
@@ -9043,7 +9044,7 @@ yyreduce:
     break;
 
   case 302:
-#line 4077 "Gmsh.y"
+#line 4078 "Gmsh.y"
     {
       if(!(yyvsp[(3) - (4)].l)){
 	List_T *tmp = Tree2List(GModel::current()->getGEOInternals()->Surfaces);
@@ -9085,7 +9086,7 @@ yyreduce:
     break;
 
   case 303:
-#line 4116 "Gmsh.y"
+#line 4117 "Gmsh.y"
     {
       if(!(yyvsp[(3) - (4)].l)){
 	List_T *tmp = Tree2List(GModel::current()->getGEOInternals()->Curves);
@@ -9127,7 +9128,7 @@ yyreduce:
     break;
 
   case 304:
-#line 4155 "Gmsh.y"
+#line 4156 "Gmsh.y"
     {
       if(!(yyvsp[(3) - (4)].l)){
         for(GModel::viter it = GModel::current()->firstVertex();
@@ -9151,7 +9152,7 @@ yyreduce:
     break;
 
   case 305:
-#line 4176 "Gmsh.y"
+#line 4177 "Gmsh.y"
     {
       if(!(yyvsp[(3) - (4)].l)){
         for(GModel::eiter it = GModel::current()->firstEdge();
@@ -9175,7 +9176,7 @@ yyreduce:
     break;
 
   case 306:
-#line 4197 "Gmsh.y"
+#line 4198 "Gmsh.y"
     {
       if(!(yyvsp[(3) - (4)].l)){
         for(GModel::fiter it = GModel::current()->firstFace();
@@ -9199,14 +9200,14 @@ yyreduce:
     break;
 
   case 307:
-#line 4224 "Gmsh.y"
+#line 4225 "Gmsh.y"
     {
       ReplaceAllDuplicates();
     ;}
     break;
 
   case 308:
-#line 4228 "Gmsh.y"
+#line 4229 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(2) - (3)].c), "Geometry"))
         ReplaceAllDuplicates();
@@ -9219,7 +9220,7 @@ yyreduce:
     break;
 
   case 309:
-#line 4238 "Gmsh.y"
+#line 4239 "Gmsh.y"
     {
       if(List_Nbr((yyvsp[(4) - (6)].l)) >= 2){
         double d;
@@ -9252,22 +9253,22 @@ yyreduce:
     break;
 
   case 310:
-#line 4272 "Gmsh.y"
+#line 4273 "Gmsh.y"
     { (yyval.c) = (char*)"Homology"; ;}
     break;
 
   case 311:
-#line 4273 "Gmsh.y"
+#line 4274 "Gmsh.y"
     { (yyval.c) = (char*)"Cohomology"; ;}
     break;
 
   case 312:
-#line 4274 "Gmsh.y"
+#line 4275 "Gmsh.y"
     { (yyval.c) = (char*)"Betti"; ;}
     break;
 
   case 313:
-#line 4279 "Gmsh.y"
+#line 4280 "Gmsh.y"
     {
       std::vector<int> domain, subdomain, dim;
       for(int i = 0; i < 4; i++) dim.push_back(i);
@@ -9276,7 +9277,7 @@ yyreduce:
     break;
 
   case 314:
-#line 4285 "Gmsh.y"
+#line 4286 "Gmsh.y"
     {
       std::vector<int> domain, subdomain, dim;
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (5)].l)); i++){
@@ -9291,7 +9292,7 @@ yyreduce:
     break;
 
   case 315:
-#line 4297 "Gmsh.y"
+#line 4298 "Gmsh.y"
     {
       std::vector<int> domain, subdomain, dim;
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (7)].l)); i++){
@@ -9312,7 +9313,7 @@ yyreduce:
     break;
 
   case 316:
-#line 4315 "Gmsh.y"
+#line 4316 "Gmsh.y"
     {
       std::vector<int> domain, subdomain, dim;
       for(int i = 0; i < List_Nbr((yyvsp[(6) - (10)].l)); i++){
@@ -9338,47 +9339,47 @@ yyreduce:
     break;
 
   case 317:
-#line 4342 "Gmsh.y"
+#line 4343 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (1)].d);           ;}
     break;
 
   case 318:
-#line 4343 "Gmsh.y"
+#line 4344 "Gmsh.y"
     { (yyval.d) = (yyvsp[(2) - (3)].d);           ;}
     break;
 
   case 319:
-#line 4344 "Gmsh.y"
+#line 4345 "Gmsh.y"
     { (yyval.d) = -(yyvsp[(2) - (2)].d);          ;}
     break;
 
   case 320:
-#line 4345 "Gmsh.y"
+#line 4346 "Gmsh.y"
     { (yyval.d) = (yyvsp[(2) - (2)].d);           ;}
     break;
 
   case 321:
-#line 4346 "Gmsh.y"
+#line 4347 "Gmsh.y"
     { (yyval.d) = !(yyvsp[(2) - (2)].d);          ;}
     break;
 
   case 322:
-#line 4347 "Gmsh.y"
+#line 4348 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) - (yyvsp[(3) - (3)].d);      ;}
     break;
 
   case 323:
-#line 4348 "Gmsh.y"
+#line 4349 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) + (yyvsp[(3) - (3)].d);      ;}
     break;
 
   case 324:
-#line 4349 "Gmsh.y"
+#line 4350 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) * (yyvsp[(3) - (3)].d);      ;}
     break;
 
   case 325:
-#line 4351 "Gmsh.y"
+#line 4352 "Gmsh.y"
     {
       if(!(yyvsp[(3) - (3)].d))
 	yymsg(0, "Division by zero in '%g / %g'", (yyvsp[(1) - (3)].d), (yyvsp[(3) - (3)].d));
@@ -9388,327 +9389,327 @@ yyreduce:
     break;
 
   case 326:
-#line 4357 "Gmsh.y"
+#line 4358 "Gmsh.y"
     { (yyval.d) = (int)(yyvsp[(1) - (3)].d) % (int)(yyvsp[(3) - (3)].d);  ;}
     break;
 
   case 327:
-#line 4358 "Gmsh.y"
+#line 4359 "Gmsh.y"
     { (yyval.d) = pow((yyvsp[(1) - (3)].d), (yyvsp[(3) - (3)].d));  ;}
     break;
 
   case 328:
-#line 4359 "Gmsh.y"
+#line 4360 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) < (yyvsp[(3) - (3)].d);      ;}
     break;
 
   case 329:
-#line 4360 "Gmsh.y"
+#line 4361 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) > (yyvsp[(3) - (3)].d);      ;}
     break;
 
   case 330:
-#line 4361 "Gmsh.y"
+#line 4362 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) <= (yyvsp[(3) - (3)].d);     ;}
     break;
 
   case 331:
-#line 4362 "Gmsh.y"
+#line 4363 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) >= (yyvsp[(3) - (3)].d);     ;}
     break;
 
   case 332:
-#line 4363 "Gmsh.y"
+#line 4364 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) == (yyvsp[(3) - (3)].d);     ;}
     break;
 
   case 333:
-#line 4364 "Gmsh.y"
+#line 4365 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) != (yyvsp[(3) - (3)].d);     ;}
     break;
 
   case 334:
-#line 4365 "Gmsh.y"
+#line 4366 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) && (yyvsp[(3) - (3)].d);     ;}
     break;
 
   case 335:
-#line 4366 "Gmsh.y"
+#line 4367 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) || (yyvsp[(3) - (3)].d);     ;}
     break;
 
   case 336:
-#line 4367 "Gmsh.y"
+#line 4368 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (5)].d) ? (yyvsp[(3) - (5)].d) : (yyvsp[(5) - (5)].d); ;}
     break;
 
   case 337:
-#line 4368 "Gmsh.y"
+#line 4369 "Gmsh.y"
     { (yyval.d) = exp((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 338:
-#line 4369 "Gmsh.y"
+#line 4370 "Gmsh.y"
     { (yyval.d) = log((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 339:
-#line 4370 "Gmsh.y"
+#line 4371 "Gmsh.y"
     { (yyval.d) = log10((yyvsp[(3) - (4)].d));    ;}
     break;
 
   case 340:
-#line 4371 "Gmsh.y"
+#line 4372 "Gmsh.y"
     { (yyval.d) = sqrt((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 341:
-#line 4372 "Gmsh.y"
+#line 4373 "Gmsh.y"
     { (yyval.d) = sin((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 342:
-#line 4373 "Gmsh.y"
+#line 4374 "Gmsh.y"
     { (yyval.d) = asin((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 343:
-#line 4374 "Gmsh.y"
+#line 4375 "Gmsh.y"
     { (yyval.d) = cos((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 344:
-#line 4375 "Gmsh.y"
+#line 4376 "Gmsh.y"
     { (yyval.d) = acos((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 345:
-#line 4376 "Gmsh.y"
+#line 4377 "Gmsh.y"
     { (yyval.d) = tan((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 346:
-#line 4377 "Gmsh.y"
+#line 4378 "Gmsh.y"
     { (yyval.d) = atan((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 347:
-#line 4378 "Gmsh.y"
+#line 4379 "Gmsh.y"
     { (yyval.d) = atan2((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d));;}
     break;
 
   case 348:
-#line 4379 "Gmsh.y"
+#line 4380 "Gmsh.y"
     { (yyval.d) = sinh((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 349:
-#line 4380 "Gmsh.y"
+#line 4381 "Gmsh.y"
     { (yyval.d) = cosh((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 350:
-#line 4381 "Gmsh.y"
+#line 4382 "Gmsh.y"
     { (yyval.d) = tanh((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 351:
-#line 4382 "Gmsh.y"
+#line 4383 "Gmsh.y"
     { (yyval.d) = fabs((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 352:
-#line 4383 "Gmsh.y"
+#line 4384 "Gmsh.y"
     { (yyval.d) = floor((yyvsp[(3) - (4)].d));    ;}
     break;
 
   case 353:
-#line 4384 "Gmsh.y"
+#line 4385 "Gmsh.y"
     { (yyval.d) = ceil((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 354:
-#line 4385 "Gmsh.y"
+#line 4386 "Gmsh.y"
     { (yyval.d) = floor((yyvsp[(3) - (4)].d) + 0.5); ;}
     break;
 
   case 355:
-#line 4386 "Gmsh.y"
+#line 4387 "Gmsh.y"
     { (yyval.d) = fmod((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d)); ;}
     break;
 
   case 356:
-#line 4387 "Gmsh.y"
+#line 4388 "Gmsh.y"
     { (yyval.d) = fmod((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d)); ;}
     break;
 
   case 357:
-#line 4388 "Gmsh.y"
+#line 4389 "Gmsh.y"
     { (yyval.d) = sqrt((yyvsp[(3) - (6)].d) * (yyvsp[(3) - (6)].d) + (yyvsp[(5) - (6)].d) * (yyvsp[(5) - (6)].d)); ;}
     break;
 
   case 358:
-#line 4389 "Gmsh.y"
+#line 4390 "Gmsh.y"
     { (yyval.d) = (yyvsp[(3) - (4)].d) * (double)rand() / (double)RAND_MAX; ;}
     break;
 
   case 359:
-#line 4392 "Gmsh.y"
+#line 4393 "Gmsh.y"
     { (yyval.d) = exp((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 360:
-#line 4393 "Gmsh.y"
+#line 4394 "Gmsh.y"
     { (yyval.d) = log((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 361:
-#line 4394 "Gmsh.y"
+#line 4395 "Gmsh.y"
     { (yyval.d) = log10((yyvsp[(3) - (4)].d));    ;}
     break;
 
   case 362:
-#line 4395 "Gmsh.y"
+#line 4396 "Gmsh.y"
     { (yyval.d) = sqrt((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 363:
-#line 4396 "Gmsh.y"
+#line 4397 "Gmsh.y"
     { (yyval.d) = sin((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 364:
-#line 4397 "Gmsh.y"
+#line 4398 "Gmsh.y"
     { (yyval.d) = asin((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 365:
-#line 4398 "Gmsh.y"
+#line 4399 "Gmsh.y"
     { (yyval.d) = cos((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 366:
-#line 4399 "Gmsh.y"
+#line 4400 "Gmsh.y"
     { (yyval.d) = acos((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 367:
-#line 4400 "Gmsh.y"
+#line 4401 "Gmsh.y"
     { (yyval.d) = tan((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 368:
-#line 4401 "Gmsh.y"
+#line 4402 "Gmsh.y"
     { (yyval.d) = atan((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 369:
-#line 4402 "Gmsh.y"
+#line 4403 "Gmsh.y"
     { (yyval.d) = atan2((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d));;}
     break;
 
   case 370:
-#line 4403 "Gmsh.y"
+#line 4404 "Gmsh.y"
     { (yyval.d) = sinh((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 371:
-#line 4404 "Gmsh.y"
+#line 4405 "Gmsh.y"
     { (yyval.d) = cosh((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 372:
-#line 4405 "Gmsh.y"
+#line 4406 "Gmsh.y"
     { (yyval.d) = tanh((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 373:
-#line 4406 "Gmsh.y"
+#line 4407 "Gmsh.y"
     { (yyval.d) = fabs((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 374:
-#line 4407 "Gmsh.y"
+#line 4408 "Gmsh.y"
     { (yyval.d) = floor((yyvsp[(3) - (4)].d));    ;}
     break;
 
   case 375:
-#line 4408 "Gmsh.y"
+#line 4409 "Gmsh.y"
     { (yyval.d) = ceil((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 376:
-#line 4409 "Gmsh.y"
+#line 4410 "Gmsh.y"
     { (yyval.d) = floor((yyvsp[(3) - (4)].d) + 0.5);    ;}
     break;
 
   case 377:
-#line 4410 "Gmsh.y"
+#line 4411 "Gmsh.y"
     { (yyval.d) = fmod((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d)); ;}
     break;
 
   case 378:
-#line 4411 "Gmsh.y"
+#line 4412 "Gmsh.y"
     { (yyval.d) = fmod((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d)); ;}
     break;
 
   case 379:
-#line 4412 "Gmsh.y"
+#line 4413 "Gmsh.y"
     { (yyval.d) = sqrt((yyvsp[(3) - (6)].d) * (yyvsp[(3) - (6)].d) + (yyvsp[(5) - (6)].d) * (yyvsp[(5) - (6)].d)); ;}
     break;
 
   case 380:
-#line 4413 "Gmsh.y"
+#line 4414 "Gmsh.y"
     { (yyval.d) = (yyvsp[(3) - (4)].d) * (double)rand() / (double)RAND_MAX; ;}
     break;
 
   case 381:
-#line 4422 "Gmsh.y"
+#line 4423 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (1)].d); ;}
     break;
 
   case 382:
-#line 4423 "Gmsh.y"
+#line 4424 "Gmsh.y"
     { (yyval.d) = 3.141592653589793; ;}
     break;
 
   case 383:
-#line 4424 "Gmsh.y"
+#line 4425 "Gmsh.y"
     { (yyval.d) = Msg::GetCommRank(); ;}
     break;
 
   case 384:
-#line 4425 "Gmsh.y"
+#line 4426 "Gmsh.y"
     { (yyval.d) = Msg::GetCommSize(); ;}
     break;
 
   case 385:
-#line 4426 "Gmsh.y"
+#line 4427 "Gmsh.y"
     { (yyval.d) = GetGmshMajorVersion(); ;}
     break;
 
   case 386:
-#line 4427 "Gmsh.y"
+#line 4428 "Gmsh.y"
     { (yyval.d) = GetGmshMinorVersion(); ;}
     break;
 
   case 387:
-#line 4428 "Gmsh.y"
+#line 4429 "Gmsh.y"
     { (yyval.d) = GetGmshPatchVersion(); ;}
     break;
 
   case 388:
-#line 4429 "Gmsh.y"
+#line 4430 "Gmsh.y"
     { (yyval.d) = Cpu(); ;}
     break;
 
   case 389:
-#line 4430 "Gmsh.y"
+#line 4431 "Gmsh.y"
     { (yyval.d) = GetMemoryUsage()/1024./1024.; ;}
     break;
 
   case 390:
-#line 4435 "Gmsh.y"
+#line 4436 "Gmsh.y"
     {
       if(!gmsh_yysymbols.count((yyvsp[(1) - (1)].c))){
 	yymsg(0, "Unknown variable '%s'", (yyvsp[(1) - (1)].c));
@@ -9728,7 +9729,7 @@ yyreduce:
     break;
 
   case 391:
-#line 4453 "Gmsh.y"
+#line 4454 "Gmsh.y"
     {
       int index = (int)(yyvsp[(3) - (4)].d);
       if(!gmsh_yysymbols.count((yyvsp[(1) - (4)].c))){
@@ -9749,7 +9750,7 @@ yyreduce:
     break;
 
   case 392:
-#line 4471 "Gmsh.y"
+#line 4472 "Gmsh.y"
     {
       if(!gmsh_yysymbols.count((yyvsp[(2) - (4)].c))){
 	yymsg(0, "Unknown variable '%s'", (yyvsp[(2) - (4)].c));
@@ -9764,7 +9765,7 @@ yyreduce:
     break;
 
   case 393:
-#line 4483 "Gmsh.y"
+#line 4484 "Gmsh.y"
     {
       if(!gmsh_yysymbols.count((yyvsp[(1) - (2)].c))){
 	yymsg(0, "Unknown variable '%s'", (yyvsp[(1) - (2)].c));
@@ -9784,7 +9785,7 @@ yyreduce:
     break;
 
   case 394:
-#line 4500 "Gmsh.y"
+#line 4501 "Gmsh.y"
     {
       int index = (int)(yyvsp[(3) - (5)].d);
       if(!gmsh_yysymbols.count((yyvsp[(1) - (5)].c))){
@@ -9805,7 +9806,7 @@ yyreduce:
     break;
 
   case 395:
-#line 4521 "Gmsh.y"
+#line 4522 "Gmsh.y"
     {
       NumberOption(GMSH_GET, (yyvsp[(1) - (3)].c), 0, (yyvsp[(3) - (3)].c), (yyval.d));
       Free((yyvsp[(1) - (3)].c)); Free((yyvsp[(3) - (3)].c));
@@ -9813,7 +9814,7 @@ yyreduce:
     break;
 
   case 396:
-#line 4526 "Gmsh.y"
+#line 4527 "Gmsh.y"
     {
       NumberOption(GMSH_GET, (yyvsp[(1) - (6)].c), (int)(yyvsp[(3) - (6)].d), (yyvsp[(6) - (6)].c), (yyval.d));
       Free((yyvsp[(1) - (6)].c)); Free((yyvsp[(6) - (6)].c));
@@ -9821,7 +9822,7 @@ yyreduce:
     break;
 
   case 397:
-#line 4531 "Gmsh.y"
+#line 4532 "Gmsh.y"
     {
       double d = 0.;
       if(NumberOption(GMSH_GET, (yyvsp[(1) - (4)].c), 0, (yyvsp[(3) - (4)].c), d)){
@@ -9834,7 +9835,7 @@ yyreduce:
     break;
 
   case 398:
-#line 4541 "Gmsh.y"
+#line 4542 "Gmsh.y"
     {
       double d = 0.;
       if(NumberOption(GMSH_GET, (yyvsp[(1) - (7)].c), (int)(yyvsp[(3) - (7)].d), (yyvsp[(6) - (7)].c), d)){
@@ -9847,7 +9848,7 @@ yyreduce:
     break;
 
   case 399:
-#line 4551 "Gmsh.y"
+#line 4552 "Gmsh.y"
     {
       (yyval.d) = Msg::GetValue((yyvsp[(3) - (6)].c), (yyvsp[(5) - (6)].d));
       Free((yyvsp[(3) - (6)].c));
@@ -9855,7 +9856,7 @@ yyreduce:
     break;
 
   case 400:
-#line 4556 "Gmsh.y"
+#line 4557 "Gmsh.y"
     {
       std::string s((yyvsp[(3) - (6)].c)), substr((yyvsp[(5) - (6)].c));
       if(s.find(substr) != std::string::npos)
@@ -9867,7 +9868,7 @@ yyreduce:
     break;
 
   case 401:
-#line 4565 "Gmsh.y"
+#line 4566 "Gmsh.y"
     {
       (yyval.d) = strcmp((yyvsp[(3) - (6)].c), (yyvsp[(5) - (6)].c));
       Free((yyvsp[(3) - (6)].c)); Free((yyvsp[(5) - (6)].c));
@@ -9875,7 +9876,7 @@ yyreduce:
     break;
 
   case 402:
-#line 4570 "Gmsh.y"
+#line 4571 "Gmsh.y"
     {
       int align = 0, font = 0, fontsize = CTX::instance()->glFontSize;
       if(List_Nbr((yyvsp[(3) - (4)].l)) % 2){
@@ -9902,70 +9903,70 @@ yyreduce:
     break;
 
   case 403:
-#line 4597 "Gmsh.y"
+#line 4598 "Gmsh.y"
     {
       memcpy((yyval.v), (yyvsp[(1) - (1)].v), 5*sizeof(double));
     ;}
     break;
 
   case 404:
-#line 4601 "Gmsh.y"
+#line 4602 "Gmsh.y"
     {
       for(int i = 0; i < 5; i++) (yyval.v)[i] = -(yyvsp[(2) - (2)].v)[i];
     ;}
     break;
 
   case 405:
-#line 4605 "Gmsh.y"
+#line 4606 "Gmsh.y"
     {
       for(int i = 0; i < 5; i++) (yyval.v)[i] = (yyvsp[(2) - (2)].v)[i];
     ;}
     break;
 
   case 406:
-#line 4609 "Gmsh.y"
+#line 4610 "Gmsh.y"
     {
       for(int i = 0; i < 5; i++) (yyval.v)[i] = (yyvsp[(1) - (3)].v)[i] - (yyvsp[(3) - (3)].v)[i];
     ;}
     break;
 
   case 407:
-#line 4613 "Gmsh.y"
+#line 4614 "Gmsh.y"
     {
       for(int i = 0; i < 5; i++) (yyval.v)[i] = (yyvsp[(1) - (3)].v)[i] + (yyvsp[(3) - (3)].v)[i];
     ;}
     break;
 
   case 408:
-#line 4620 "Gmsh.y"
+#line 4621 "Gmsh.y"
     {
       (yyval.v)[0] = (yyvsp[(2) - (11)].d);  (yyval.v)[1] = (yyvsp[(4) - (11)].d);  (yyval.v)[2] = (yyvsp[(6) - (11)].d);  (yyval.v)[3] = (yyvsp[(8) - (11)].d); (yyval.v)[4] = (yyvsp[(10) - (11)].d);
     ;}
     break;
 
   case 409:
-#line 4624 "Gmsh.y"
+#line 4625 "Gmsh.y"
     {
       (yyval.v)[0] = (yyvsp[(2) - (9)].d);  (yyval.v)[1] = (yyvsp[(4) - (9)].d);  (yyval.v)[2] = (yyvsp[(6) - (9)].d);  (yyval.v)[3] = (yyvsp[(8) - (9)].d); (yyval.v)[4] = 1.0;
     ;}
     break;
 
   case 410:
-#line 4628 "Gmsh.y"
+#line 4629 "Gmsh.y"
     {
       (yyval.v)[0] = (yyvsp[(2) - (7)].d);  (yyval.v)[1] = (yyvsp[(4) - (7)].d);  (yyval.v)[2] = (yyvsp[(6) - (7)].d);  (yyval.v)[3] = 0.0; (yyval.v)[4] = 1.0;
     ;}
     break;
 
   case 411:
-#line 4632 "Gmsh.y"
+#line 4633 "Gmsh.y"
     {
       (yyval.v)[0] = (yyvsp[(2) - (7)].d);  (yyval.v)[1] = (yyvsp[(4) - (7)].d);  (yyval.v)[2] = (yyvsp[(6) - (7)].d);  (yyval.v)[3] = 0.0; (yyval.v)[4] = 1.0;
     ;}
     break;
 
   case 412:
-#line 4639 "Gmsh.y"
+#line 4640 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(List_T*));
       List_Add((yyval.l), &((yyvsp[(1) - (1)].l)));
@@ -9973,14 +9974,14 @@ yyreduce:
     break;
 
   case 413:
-#line 4644 "Gmsh.y"
+#line 4645 "Gmsh.y"
     {
       List_Add((yyval.l), &((yyvsp[(3) - (3)].l)));
     ;}
     break;
 
   case 414:
-#line 4651 "Gmsh.y"
+#line 4652 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       List_Add((yyval.l), &((yyvsp[(1) - (1)].d)));
@@ -9988,14 +9989,14 @@ yyreduce:
     break;
 
   case 415:
-#line 4656 "Gmsh.y"
+#line 4657 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(1) - (1)].l);
     ;}
     break;
 
   case 416:
-#line 4660 "Gmsh.y"
+#line 4661 "Gmsh.y"
     {
       // creates an empty list
       (yyval.l) = List_Create(2, 1, sizeof(double));
@@ -10003,14 +10004,14 @@ yyreduce:
     break;
 
   case 417:
-#line 4665 "Gmsh.y"
+#line 4666 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(2) - (3)].l);
     ;}
     break;
 
   case 418:
-#line 4669 "Gmsh.y"
+#line 4670 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(3) - (4)].l);
       for(int i = 0; i < List_Nbr((yyval.l)); i++){
@@ -10021,7 +10022,7 @@ yyreduce:
     break;
 
   case 419:
-#line 4677 "Gmsh.y"
+#line 4678 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(4) - (5)].l);
       for(int i = 0; i < List_Nbr((yyval.l)); i++){
@@ -10032,14 +10033,14 @@ yyreduce:
     break;
 
   case 420:
-#line 4688 "Gmsh.y"
+#line 4689 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(1) - (1)].l);
     ;}
     break;
 
   case 421:
-#line 4692 "Gmsh.y"
+#line 4693 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(1) - (1)].c), "*") || !strcmp((yyvsp[(1) - (1)].c), "all"))
         (yyval.l) = 0;
@@ -10051,7 +10052,7 @@ yyreduce:
     break;
 
   case 422:
-#line 4704 "Gmsh.y"
+#line 4705 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(2) - (2)].l);
       for(int i = 0; i < List_Nbr((yyval.l)); i++){
@@ -10062,7 +10063,7 @@ yyreduce:
     break;
 
   case 423:
-#line 4712 "Gmsh.y"
+#line 4713 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(3) - (3)].l);
       for(int i = 0; i < List_Nbr((yyval.l)); i++){
@@ -10073,7 +10074,7 @@ yyreduce:
     break;
 
   case 424:
-#line 4720 "Gmsh.y"
+#line 4721 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       for(double d = (yyvsp[(1) - (3)].d); ((yyvsp[(1) - (3)].d) < (yyvsp[(3) - (3)].d)) ? (d <= (yyvsp[(3) - (3)].d)) : (d >= (yyvsp[(3) - (3)].d));
@@ -10083,7 +10084,7 @@ yyreduce:
     break;
 
   case 425:
-#line 4727 "Gmsh.y"
+#line 4728 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       if(!(yyvsp[(5) - (5)].d)){  //|| ($1 < $3 && $5 < 0) || ($1 > $3 && $5 > 0)
@@ -10096,7 +10097,7 @@ yyreduce:
     break;
 
   case 426:
-#line 4737 "Gmsh.y"
+#line 4738 "Gmsh.y"
     {
       // Returns the coordinates of a point and fills a list with it.
       // This allows to ensure e.g. that relative point positions are
@@ -10119,35 +10120,35 @@ yyreduce:
     break;
 
   case 427:
-#line 4757 "Gmsh.y"
+#line 4758 "Gmsh.y"
     {
       (yyval.l) = GetAllEntityNumbers(0);
     ;}
     break;
 
   case 428:
-#line 4761 "Gmsh.y"
+#line 4762 "Gmsh.y"
     {
       (yyval.l) = GetAllEntityNumbers(1);
     ;}
     break;
 
   case 429:
-#line 4765 "Gmsh.y"
+#line 4766 "Gmsh.y"
     {
       (yyval.l) = GetAllEntityNumbers(2);
     ;}
     break;
 
   case 430:
-#line 4769 "Gmsh.y"
+#line 4770 "Gmsh.y"
     {
       (yyval.l) = GetAllEntityNumbers(3);
     ;}
     break;
 
   case 431:
-#line 4773 "Gmsh.y"
+#line 4774 "Gmsh.y"
     {
       (yyval.l) = List_Create(10, 1, sizeof(double));
       for(int i = 0; i < List_Nbr((yyvsp[(4) - (5)].l)); i++){
@@ -10179,7 +10180,7 @@ yyreduce:
     break;
 
   case 432:
-#line 4802 "Gmsh.y"
+#line 4803 "Gmsh.y"
     {
       (yyval.l) = List_Create(10, 1, sizeof(double));
       for(int i = 0; i < List_Nbr((yyvsp[(4) - (5)].l)); i++){
@@ -10211,7 +10212,7 @@ yyreduce:
     break;
 
   case 433:
-#line 4831 "Gmsh.y"
+#line 4832 "Gmsh.y"
     {
       (yyval.l) = List_Create(10, 1, sizeof(double));
       for(int i = 0; i < List_Nbr((yyvsp[(4) - (5)].l)); i++){
@@ -10243,7 +10244,7 @@ yyreduce:
     break;
 
   case 434:
-#line 4860 "Gmsh.y"
+#line 4861 "Gmsh.y"
     {
       (yyval.l) = List_Create(10, 1, sizeof(double));
       for(int i = 0; i < List_Nbr((yyvsp[(4) - (5)].l)); i++){
@@ -10275,7 +10276,7 @@ yyreduce:
     break;
 
   case 435:
-#line 4889 "Gmsh.y"
+#line 4890 "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++){
@@ -10288,7 +10289,7 @@ yyreduce:
     break;
 
   case 436:
-#line 4899 "Gmsh.y"
+#line 4900 "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++){
@@ -10301,7 +10302,7 @@ yyreduce:
     break;
 
   case 437:
-#line 4909 "Gmsh.y"
+#line 4910 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       if(!gmsh_yysymbols.count((yyvsp[(1) - (3)].c)))
@@ -10316,7 +10317,7 @@ yyreduce:
     break;
 
   case 438:
-#line 4922 "Gmsh.y"
+#line 4923 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       if(!gmsh_yysymbols.count((yyvsp[(1) - (3)].c)))
@@ -10331,7 +10332,7 @@ yyreduce:
     break;
 
   case 439:
-#line 4934 "Gmsh.y"
+#line 4935 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       if(!gmsh_yysymbols.count((yyvsp[(3) - (4)].c)))
@@ -10346,7 +10347,7 @@ yyreduce:
     break;
 
   case 440:
-#line 4946 "Gmsh.y"
+#line 4947 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       if(!gmsh_yysymbols.count((yyvsp[(1) - (6)].c)))
@@ -10367,7 +10368,7 @@ yyreduce:
     break;
 
   case 441:
-#line 4965 "Gmsh.y"
+#line 4966 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       if(!gmsh_yysymbols.count((yyvsp[(1) - (6)].c)))
@@ -10388,7 +10389,7 @@ yyreduce:
     break;
 
   case 442:
-#line 4986 "Gmsh.y"
+#line 4987 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       List_Add((yyval.l), &((yyvsp[(1) - (1)].d)));
@@ -10396,21 +10397,21 @@ yyreduce:
     break;
 
   case 443:
-#line 4991 "Gmsh.y"
+#line 4992 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(1) - (1)].l);
     ;}
     break;
 
   case 444:
-#line 4995 "Gmsh.y"
+#line 4996 "Gmsh.y"
     {
       List_Add((yyval.l), &((yyvsp[(3) - (3)].d)));
     ;}
     break;
 
   case 445:
-#line 4999 "Gmsh.y"
+#line 5000 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (3)].l)); i++){
 	double d;
@@ -10422,21 +10423,21 @@ yyreduce:
     break;
 
   case 446:
-#line 5011 "Gmsh.y"
+#line 5012 "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 447:
-#line 5015 "Gmsh.y"
+#line 5016 "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 448:
-#line 5027 "Gmsh.y"
+#line 5028 "Gmsh.y"
     {
       int flag;
       (yyval.u) = GetColorForString(-1, (yyvsp[(1) - (1)].c), &flag);
@@ -10446,7 +10447,7 @@ yyreduce:
     break;
 
   case 449:
-#line 5034 "Gmsh.y"
+#line 5035 "Gmsh.y"
     {
       unsigned int val = 0;
       ColorOption(GMSH_GET, (yyvsp[(1) - (5)].c), 0, (yyvsp[(5) - (5)].c), val);
@@ -10456,14 +10457,14 @@ yyreduce:
     break;
 
   case 450:
-#line 5044 "Gmsh.y"
+#line 5045 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(2) - (3)].l);
     ;}
     break;
 
   case 451:
-#line 5048 "Gmsh.y"
+#line 5049 "Gmsh.y"
     {
       (yyval.l) = List_Create(256, 10, sizeof(unsigned int));
       GmshColorTable *ct = GetColorTable((int)(yyvsp[(3) - (6)].d));
@@ -10478,7 +10479,7 @@ yyreduce:
     break;
 
   case 452:
-#line 5063 "Gmsh.y"
+#line 5064 "Gmsh.y"
     {
       (yyval.l) = List_Create(256, 10, sizeof(unsigned int));
       List_Add((yyval.l), &((yyvsp[(1) - (1)].u)));
@@ -10486,21 +10487,21 @@ yyreduce:
     break;
 
   case 453:
-#line 5068 "Gmsh.y"
+#line 5069 "Gmsh.y"
     {
       List_Add((yyval.l), &((yyvsp[(3) - (3)].u)));
     ;}
     break;
 
   case 454:
-#line 5075 "Gmsh.y"
+#line 5076 "Gmsh.y"
     {
       (yyval.c) = (yyvsp[(1) - (1)].c);
     ;}
     break;
 
   case 455:
-#line 5079 "Gmsh.y"
+#line 5080 "Gmsh.y"
     {
       if(!gmsh_yystringsymbols.count((yyvsp[(1) - (1)].c))){
 	yymsg(0, "Unknown string variable '%s'", (yyvsp[(1) - (1)].c));
@@ -10516,7 +10517,7 @@ yyreduce:
     break;
 
   case 456:
-#line 5092 "Gmsh.y"
+#line 5093 "Gmsh.y"
     {
       std::string out;
       StringOption(GMSH_GET, (yyvsp[(1) - (3)].c), 0, (yyvsp[(3) - (3)].c), out);
@@ -10527,7 +10528,7 @@ yyreduce:
     break;
 
   case 457:
-#line 5100 "Gmsh.y"
+#line 5101 "Gmsh.y"
     {
       std::string out;
       StringOption(GMSH_GET, (yyvsp[(1) - (6)].c), (int)(yyvsp[(3) - (6)].d), (yyvsp[(6) - (6)].c), out);
@@ -10538,14 +10539,14 @@ yyreduce:
     break;
 
   case 458:
-#line 5111 "Gmsh.y"
+#line 5112 "Gmsh.y"
     {
       (yyval.c) = (yyvsp[(1) - (1)].c);
     ;}
     break;
 
   case 459:
-#line 5115 "Gmsh.y"
+#line 5116 "Gmsh.y"
     {
       (yyval.c) = (char *)Malloc(32 * sizeof(char));
       time_t now;
@@ -10556,7 +10557,7 @@ yyreduce:
     break;
 
   case 460:
-#line 5123 "Gmsh.y"
+#line 5124 "Gmsh.y"
     {
       std::string action = Msg::GetGmshOnelabAction();
       (yyval.c) = (char *)Malloc(action.size() + 1);
@@ -10565,7 +10566,7 @@ yyreduce:
     break;
 
   case 461:
-#line 5129 "Gmsh.y"
+#line 5130 "Gmsh.y"
     {
       const char *env = GetEnvironmentVar((yyvsp[(3) - (4)].c));
       if(!env) env = "";
@@ -10576,7 +10577,7 @@ yyreduce:
     break;
 
   case 462:
-#line 5137 "Gmsh.y"
+#line 5138 "Gmsh.y"
     {
       std::string s = Msg::GetString((yyvsp[(3) - (6)].c), (yyvsp[(5) - (6)].c));
       (yyval.c) = (char *)Malloc((s.size() + 1) * sizeof(char));
@@ -10587,7 +10588,7 @@ yyreduce:
     break;
 
   case 463:
-#line 5145 "Gmsh.y"
+#line 5146 "Gmsh.y"
     {
       (yyval.c) = (char *)Malloc((strlen((yyvsp[(3) - (6)].c)) + strlen((yyvsp[(5) - (6)].c)) + 1) * sizeof(char));
       strcpy((yyval.c), (yyvsp[(3) - (6)].c));
@@ -10598,7 +10599,7 @@ yyreduce:
     break;
 
   case 464:
-#line 5154 "Gmsh.y"
+#line 5155 "Gmsh.y"
     {
       (yyval.c) = (char *)Malloc((strlen((yyvsp[(3) - (6)].c)) + strlen((yyvsp[(5) - (6)].c)) + 1) * sizeof(char));
       strcpy((yyval.c), (yyvsp[(3) - (6)].c));
@@ -10609,7 +10610,7 @@ yyreduce:
     break;
 
   case 465:
-#line 5162 "Gmsh.y"
+#line 5163 "Gmsh.y"
     {
       (yyval.c) = (char *)Malloc((strlen((yyvsp[(3) - (4)].c)) + 1) * sizeof(char));
       int i;
@@ -10626,7 +10627,7 @@ yyreduce:
     break;
 
   case 466:
-#line 5176 "Gmsh.y"
+#line 5177 "Gmsh.y"
     {
       (yyval.c) = (char *)Malloc((strlen((yyvsp[(3) - (4)].c)) + 1) * sizeof(char));
       int i;
@@ -10643,7 +10644,7 @@ yyreduce:
     break;
 
   case 467:
-#line 5190 "Gmsh.y"
+#line 5191 "Gmsh.y"
     {
       std::string input = (yyvsp[(3) - (8)].c);
       std::string substr_old = (yyvsp[(5) - (8)].c);
@@ -10658,7 +10659,7 @@ yyreduce:
     break;
 
   case 468:
-#line 5202 "Gmsh.y"
+#line 5203 "Gmsh.y"
     {
       int size = 0;
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (4)].l)); i++)
@@ -10677,7 +10678,7 @@ yyreduce:
     break;
 
   case 469:
-#line 5219 "Gmsh.y"
+#line 5220 "Gmsh.y"
     {
       int size = 0;
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (4)].l)); i++)
@@ -10696,21 +10697,21 @@ yyreduce:
     break;
 
   case 470:
-#line 5235 "Gmsh.y"
+#line 5236 "Gmsh.y"
     {
       (yyval.c) = (yyvsp[(3) - (4)].c);
     ;}
     break;
 
   case 471:
-#line 5240 "Gmsh.y"
+#line 5241 "Gmsh.y"
     {
       (yyval.c) = (yyvsp[(3) - (4)].c);
     ;}
     break;
 
   case 472:
-#line 5244 "Gmsh.y"
+#line 5245 "Gmsh.y"
     {
       char tmpstring[5000];
       int i = PrintListOfDouble((yyvsp[(3) - (6)].c), (yyvsp[(5) - (6)].l), tmpstring);
@@ -10732,7 +10733,7 @@ yyreduce:
     break;
 
   case 473:
-#line 5264 "Gmsh.y"
+#line 5265 "Gmsh.y"
     {
       char tmpstring[5000];
       int i = PrintListOfDouble((yyvsp[(3) - (6)].c), (yyvsp[(5) - (6)].l), tmpstring);
@@ -10754,7 +10755,7 @@ yyreduce:
     break;
 
   case 474:
-#line 5286 "Gmsh.y"
+#line 5287 "Gmsh.y"
     {
       (yyval.l) = List_Create(20,20,sizeof(char*));
       List_Add((yyval.l), &((yyvsp[(1) - (1)].c)));
@@ -10762,12 +10763,12 @@ yyreduce:
     break;
 
   case 475:
-#line 5291 "Gmsh.y"
+#line 5292 "Gmsh.y"
     { List_Add((yyval.l), &((yyvsp[(3) - (3)].c))); ;}
     break;
 
   case 476:
-#line 5297 "Gmsh.y"
+#line 5298 "Gmsh.y"
     {
       char tmpstr[256];
       sprintf(tmpstr, "_%d", (int)(yyvsp[(4) - (5)].d));
@@ -10778,7 +10779,7 @@ yyreduce:
     break;
 
   case 477:
-#line 5306 "Gmsh.y"
+#line 5307 "Gmsh.y"
     {
       char tmpstr[256];
       sprintf(tmpstr, "_%d", (int)(yyvsp[(4) - (5)].d));
@@ -10789,18 +10790,18 @@ yyreduce:
     break;
 
   case 478:
-#line 5319 "Gmsh.y"
+#line 5320 "Gmsh.y"
     { (yyval.c) = (yyvsp[(1) - (1)].c); ;}
     break;
 
   case 479:
-#line 5322 "Gmsh.y"
+#line 5323 "Gmsh.y"
     { (yyval.c) = (yyvsp[(1) - (1)].c); ;}
     break;
 
 
 /* Line 1267 of yacc.c.  */
-#line 10804 "Gmsh.tab.cpp"
+#line 10805 "Gmsh.tab.cpp"
       default: break;
     }
   YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
@@ -11014,7 +11015,7 @@ yyreturn:
 }
 
 
-#line 5326 "Gmsh.y"
+#line 5327 "Gmsh.y"
 
 
 int PrintListOfDouble(char *format, List_T *list, char *buffer)
diff --git a/Parser/Gmsh.y b/Parser/Gmsh.y
index d3d986f03b08fe54517c60da49e532c6ba1ee196..1f3cd669867ad525ad9d9b87e3304436fb075c4e 100644
--- a/Parser/Gmsh.y
+++ b/Parser/Gmsh.y
@@ -2764,7 +2764,8 @@ Command :
 	GModel::current()->setName($2);
       }
       else if(!strcmp($1, "CreateDir")){
-	CreateSingleDir(std::string($2));
+        std::string tmp = FixRelativePath(gmsh_yyname, $2);
+	CreateSingleDir(tmp);
       }
       else{
 	yymsg(0, "Unknown command '%s'", $1);