diff --git a/Parser/Gmsh.tab.cpp b/Parser/Gmsh.tab.cpp
index 211bbec64d61fdd66d5e0f3478e6bd8382b33b3b..446a2a9c8b81be13a73fa357c590396c325a8b03 100644
--- a/Parser/Gmsh.tab.cpp
+++ b/Parser/Gmsh.tab.cpp
@@ -993,26 +993,26 @@ static const yytype_uint16 yyrline[] =
     3029,  3028,  3042,  3041,  3055,  3054,  3068,  3067,  3080,  3087,
     3094,  3101,  3108,  3115,  3122,  3129,  3136,  3144,  3143,  3156,
     3155,  3168,  3167,  3180,  3179,  3192,  3191,  3204,  3203,  3216,
-    3215,  3228,  3227,  3240,  3239,  3255,  3258,  3264,  3273,  3293,
-    3316,  3320,  3324,  3328,  3332,  3336,  3355,  3368,  3371,  3387,
-    3390,  3403,  3406,  3412,  3415,  3422,  3478,  3548,  3553,  3620,
-    3656,  3664,  3707,  3746,  3766,  3793,  3833,  3856,  3879,  3883,
-    3887,  3926,  3971,  3975,  3985,  4020,  4021,  4022,  4026,  4032,
-    4044,  4062,  4090,  4091,  4092,  4093,  4094,  4095,  4096,  4097,
-    4098,  4105,  4106,  4107,  4108,  4109,  4110,  4111,  4112,  4113,
-    4114,  4115,  4116,  4117,  4118,  4119,  4120,  4121,  4122,  4123,
-    4124,  4125,  4126,  4127,  4128,  4129,  4130,  4131,  4132,  4133,
-    4134,  4135,  4136,  4139,  4140,  4141,  4142,  4143,  4144,  4145,
-    4146,  4147,  4148,  4149,  4150,  4151,  4152,  4153,  4154,  4155,
-    4156,  4157,  4158,  4159,  4168,  4169,  4170,  4171,  4172,  4173,
-    4174,  4178,  4199,  4218,  4236,  4248,  4265,  4286,  4291,  4296,
-    4306,  4316,  4321,  4330,  4357,  4361,  4365,  4369,  4373,  4380,
-    4384,  4388,  4392,  4399,  4404,  4411,  4416,  4420,  4425,  4429,
-    4437,  4448,  4452,  4464,  4472,  4480,  4487,  4497,  4517,  4521,
-    4525,  4529,  4533,  4562,  4591,  4620,  4649,  4659,  4669,  4682,
-    4694,  4706,  4725,  4746,  4751,  4755,  4759,  4771,  4775,  4787,
-    4794,  4804,  4808,  4823,  4828,  4835,  4839,  4852,  4860,  4871,
-    4875,  4883,  4891,  4899,  4907,  4921,  4935,  4939,  4961,  4966
+    3215,  3228,  3227,  3240,  3239,  3255,  3258,  3264,  3276,  3296,
+    3319,  3323,  3327,  3331,  3335,  3339,  3358,  3371,  3374,  3390,
+    3393,  3406,  3409,  3415,  3418,  3425,  3481,  3551,  3556,  3623,
+    3659,  3667,  3710,  3749,  3769,  3796,  3836,  3859,  3882,  3886,
+    3890,  3929,  3974,  3978,  3988,  4023,  4024,  4025,  4029,  4035,
+    4047,  4065,  4093,  4094,  4095,  4096,  4097,  4098,  4099,  4100,
+    4101,  4108,  4109,  4110,  4111,  4112,  4113,  4114,  4115,  4116,
+    4117,  4118,  4119,  4120,  4121,  4122,  4123,  4124,  4125,  4126,
+    4127,  4128,  4129,  4130,  4131,  4132,  4133,  4134,  4135,  4136,
+    4137,  4138,  4139,  4142,  4143,  4144,  4145,  4146,  4147,  4148,
+    4149,  4150,  4151,  4152,  4153,  4154,  4155,  4156,  4157,  4158,
+    4159,  4160,  4161,  4162,  4171,  4172,  4173,  4174,  4175,  4176,
+    4177,  4181,  4202,  4221,  4239,  4251,  4268,  4289,  4294,  4299,
+    4309,  4319,  4324,  4333,  4360,  4364,  4368,  4372,  4376,  4383,
+    4387,  4391,  4395,  4402,  4407,  4414,  4419,  4423,  4428,  4432,
+    4440,  4451,  4455,  4467,  4475,  4483,  4490,  4500,  4520,  4524,
+    4528,  4532,  4536,  4565,  4594,  4623,  4652,  4662,  4672,  4685,
+    4697,  4709,  4728,  4749,  4754,  4758,  4762,  4774,  4778,  4790,
+    4797,  4807,  4811,  4826,  4831,  4838,  4842,  4855,  4863,  4874,
+    4878,  4886,  4894,  4902,  4910,  4924,  4938,  4942,  4964,  4969
 };
 #endif
 
@@ -8245,19 +8245,22 @@ yyreduce:
 /* Line 1464 of yacc.c  */
 #line 3265 "Gmsh.y"
     {
-      extr.mesh.ExtrudeMesh = true;
-      extr.mesh.NbLayer = 1;
-      extr.mesh.NbElmLayer.clear();
-      extr.mesh.hLayer.clear();
-      extr.mesh.NbElmLayer.push_back((int)fabs((yyvsp[(3) - (5)].d)));
-      extr.mesh.hLayer.push_back(1.);
+      int n = (int)fabs((yyvsp[(3) - (5)].d));
+      if(n){ // we accept n==0 to easily disable layers
+        extr.mesh.ExtrudeMesh = true;
+        extr.mesh.NbLayer = 1;
+        extr.mesh.NbElmLayer.clear();
+        extr.mesh.hLayer.clear();
+        extr.mesh.NbElmLayer.push_back((int)fabs((yyvsp[(3) - (5)].d)));
+        extr.mesh.hLayer.push_back(1.);
+      }
     ;}
     break;
 
   case 258:
 
 /* Line 1464 of yacc.c  */
-#line 3274 "Gmsh.y"
+#line 3277 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = true;
       extr.mesh.NbLayer = List_Nbr((yyvsp[(3) - (7)].l));
@@ -8282,7 +8285,7 @@ yyreduce:
   case 259:
 
 /* Line 1464 of yacc.c  */
-#line 3294 "Gmsh.y"
+#line 3297 "Gmsh.y"
     {
       yymsg(0, "Explicit region numbers in layers are deprecated");
       extr.mesh.ExtrudeMesh = true;
@@ -8310,7 +8313,7 @@ yyreduce:
   case 260:
 
 /* Line 1464 of yacc.c  */
-#line 3317 "Gmsh.y"
+#line 3320 "Gmsh.y"
     {
       extr.mesh.Recombine = true;
     ;}
@@ -8319,7 +8322,7 @@ yyreduce:
   case 261:
 
 /* Line 1464 of yacc.c  */
-#line 3321 "Gmsh.y"
+#line 3324 "Gmsh.y"
     {
       extr.mesh.QuadToTri = QUADTRI_DBL_1;
     ;}
@@ -8328,7 +8331,7 @@ yyreduce:
   case 262:
 
 /* Line 1464 of yacc.c  */
-#line 3325 "Gmsh.y"
+#line 3328 "Gmsh.y"
     {
       extr.mesh.QuadToTri = QUADTRI_DBL_1_RECOMB;
     ;}
@@ -8337,7 +8340,7 @@ yyreduce:
   case 263:
 
 /* Line 1464 of yacc.c  */
-#line 3329 "Gmsh.y"
+#line 3332 "Gmsh.y"
     {
       extr.mesh.QuadToTri = QUADTRI_SNGL_1;
     ;}
@@ -8346,7 +8349,7 @@ yyreduce:
   case 264:
 
 /* Line 1464 of yacc.c  */
-#line 3333 "Gmsh.y"
+#line 3336 "Gmsh.y"
     {
       extr.mesh.QuadToTri = QUADTRI_SNGL_1_RECOMB;
     ;}
@@ -8355,7 +8358,7 @@ yyreduce:
   case 265:
 
 /* Line 1464 of yacc.c  */
-#line 3337 "Gmsh.y"
+#line 3340 "Gmsh.y"
     {
       int num = (int)(yyvsp[(3) - (9)].d);
       if(FindSurface(num)){
@@ -8379,7 +8382,7 @@ yyreduce:
   case 266:
 
 /* Line 1464 of yacc.c  */
-#line 3356 "Gmsh.y"
+#line 3359 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(2) - (6)].c), "Index"))
         extr.mesh.BoundaryLayerIndex = (yyvsp[(4) - (6)].d);
@@ -8392,7 +8395,7 @@ yyreduce:
   case 267:
 
 /* Line 1464 of yacc.c  */
-#line 3368 "Gmsh.y"
+#line 3371 "Gmsh.y"
     {
       (yyval.v)[0] = (yyval.v)[1] = 1.;
     ;}
@@ -8401,7 +8404,7 @@ yyreduce:
   case 268:
 
 /* Line 1464 of yacc.c  */
-#line 3372 "Gmsh.y"
+#line 3375 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(2) - (3)].c), "Progression") || !strcmp((yyvsp[(2) - (3)].c), "Power"))
         (yyval.v)[0] = 1.;
@@ -8419,7 +8422,7 @@ yyreduce:
   case 269:
 
 /* Line 1464 of yacc.c  */
-#line 3387 "Gmsh.y"
+#line 3390 "Gmsh.y"
     {
       (yyval.i) = -1; // left
     ;}
@@ -8428,7 +8431,7 @@ yyreduce:
   case 270:
 
 /* Line 1464 of yacc.c  */
-#line 3391 "Gmsh.y"
+#line 3394 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(1) - (1)].c), "Right"))
         (yyval.i) = 1;
@@ -8443,7 +8446,7 @@ yyreduce:
   case 271:
 
 /* Line 1464 of yacc.c  */
-#line 3403 "Gmsh.y"
+#line 3406 "Gmsh.y"
     {
      (yyval.l) = List_Create(1, 1, sizeof(double));
    ;}
@@ -8452,7 +8455,7 @@ yyreduce:
   case 272:
 
 /* Line 1464 of yacc.c  */
-#line 3407 "Gmsh.y"
+#line 3410 "Gmsh.y"
     {
      (yyval.l) = (yyvsp[(2) - (2)].l);
    ;}
@@ -8461,7 +8464,7 @@ yyreduce:
   case 273:
 
 /* Line 1464 of yacc.c  */
-#line 3412 "Gmsh.y"
+#line 3415 "Gmsh.y"
     {
       (yyval.i) = 45;
     ;}
@@ -8470,7 +8473,7 @@ yyreduce:
   case 274:
 
 /* Line 1464 of yacc.c  */
-#line 3416 "Gmsh.y"
+#line 3419 "Gmsh.y"
     {
       (yyval.i) = (int)(yyvsp[(2) - (2)].d);
     ;}
@@ -8479,7 +8482,7 @@ yyreduce:
   case 275:
 
 /* Line 1464 of yacc.c  */
-#line 3423 "Gmsh.y"
+#line 3426 "Gmsh.y"
     {
       int type = (int)(yyvsp[(6) - (7)].v)[0];
       double coef = fabs((yyvsp[(6) - (7)].v)[1]);
@@ -8540,7 +8543,7 @@ yyreduce:
   case 276:
 
 /* Line 1464 of yacc.c  */
-#line 3479 "Gmsh.y"
+#line 3482 "Gmsh.y"
     {
       int k = List_Nbr((yyvsp[(4) - (6)].l));
       if(k != 0 && k != 3 && k != 4){
@@ -8615,7 +8618,7 @@ yyreduce:
   case 277:
 
 /* Line 1464 of yacc.c  */
-#line 3549 "Gmsh.y"
+#line 3552 "Gmsh.y"
     {
       yymsg(1, "Elliptic Surface is deprecated: use Transfinite instead (with smoothing)");
       List_Delete((yyvsp[(7) - (8)].l));
@@ -8625,7 +8628,7 @@ yyreduce:
   case 278:
 
 /* Line 1464 of yacc.c  */
-#line 3554 "Gmsh.y"
+#line 3557 "Gmsh.y"
     {
       int k = List_Nbr((yyvsp[(4) - (5)].l));
       if(k != 0 && k != 6 && k != 8){
@@ -8697,7 +8700,7 @@ yyreduce:
   case 279:
 
 /* Line 1464 of yacc.c  */
-#line 3621 "Gmsh.y"
+#line 3624 "Gmsh.y"
     {
       if(!(yyvsp[(2) - (3)].l)){
   	  List_T *tmp = Tree2List(GModel::current()->getGEOInternals()->Volumes);
@@ -8738,7 +8741,7 @@ yyreduce:
   case 280:
 
 /* Line 1464 of yacc.c  */
-#line 3657 "Gmsh.y"
+#line 3660 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(4) - (7)].l)); i++){
 	double d;
@@ -8751,7 +8754,7 @@ yyreduce:
   case 281:
 
 /* Line 1464 of yacc.c  */
-#line 3665 "Gmsh.y"
+#line 3668 "Gmsh.y"
     {
       if(!(yyvsp[(3) - (5)].l)){
 	List_T *tmp = Tree2List(GModel::current()->getGEOInternals()->Surfaces);
@@ -8799,7 +8802,7 @@ yyreduce:
   case 282:
 
 /* Line 1464 of yacc.c  */
-#line 3708 "Gmsh.y"
+#line 3711 "Gmsh.y"
     {
       if(!(yyvsp[(3) - (4)].l)){
 	List_T *tmp = Tree2List(GModel::current()->getGEOInternals()->Volumes);
@@ -8843,7 +8846,7 @@ yyreduce:
   case 283:
 
 /* Line 1464 of yacc.c  */
-#line 3747 "Gmsh.y"
+#line 3750 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (6)].l)); i++){
 	double d;
@@ -8868,7 +8871,7 @@ yyreduce:
   case 284:
 
 /* Line 1464 of yacc.c  */
-#line 3767 "Gmsh.y"
+#line 3770 "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",
@@ -8900,7 +8903,7 @@ yyreduce:
   case 285:
 
 /* Line 1464 of yacc.c  */
-#line 3795 "Gmsh.y"
+#line 3798 "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 "
@@ -8944,7 +8947,7 @@ yyreduce:
   case 286:
 
 /* Line 1464 of yacc.c  */
-#line 3834 "Gmsh.y"
+#line 3837 "Gmsh.y"
     {
       Surface *s = FindSurface((int)(yyvsp[(8) - (10)].d));
       if(s){
@@ -8972,7 +8975,7 @@ yyreduce:
   case 287:
 
 /* Line 1464 of yacc.c  */
-#line 3857 "Gmsh.y"
+#line 3860 "Gmsh.y"
     {
       Surface *s = FindSurface((int)(yyvsp[(8) - (10)].d));
       if(s){
@@ -9000,7 +9003,7 @@ yyreduce:
   case 288:
 
 /* Line 1464 of yacc.c  */
-#line 3880 "Gmsh.y"
+#line 3883 "Gmsh.y"
     {
       Msg::Error("Line in Volume not implemented yet");
     ;}
@@ -9009,7 +9012,7 @@ yyreduce:
   case 289:
 
 /* Line 1464 of yacc.c  */
-#line 3884 "Gmsh.y"
+#line 3887 "Gmsh.y"
     {
       Msg::Error("Surface in Volume not implemented yet");
     ;}
@@ -9018,7 +9021,7 @@ yyreduce:
   case 290:
 
 /* Line 1464 of yacc.c  */
-#line 3888 "Gmsh.y"
+#line 3891 "Gmsh.y"
     {
       if(!(yyvsp[(3) - (4)].l)){
 	List_T *tmp = Tree2List(GModel::current()->getGEOInternals()->Surfaces);
@@ -9062,7 +9065,7 @@ yyreduce:
   case 291:
 
 /* Line 1464 of yacc.c  */
-#line 3927 "Gmsh.y"
+#line 3930 "Gmsh.y"
     {
       if(!(yyvsp[(3) - (4)].l)){
 	List_T *tmp = Tree2List(GModel::current()->getGEOInternals()->Curves);
@@ -9106,7 +9109,7 @@ yyreduce:
   case 292:
 
 /* Line 1464 of yacc.c  */
-#line 3972 "Gmsh.y"
+#line 3975 "Gmsh.y"
     {
       ReplaceAllDuplicates();
     ;}
@@ -9115,7 +9118,7 @@ yyreduce:
   case 293:
 
 /* Line 1464 of yacc.c  */
-#line 3976 "Gmsh.y"
+#line 3979 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(2) - (3)].c), "Geometry"))
         ReplaceAllDuplicates();
@@ -9130,7 +9133,7 @@ yyreduce:
   case 294:
 
 /* Line 1464 of yacc.c  */
-#line 3986 "Gmsh.y"
+#line 3989 "Gmsh.y"
     {
       if(List_Nbr((yyvsp[(4) - (6)].l)) >= 2){
         double d;
@@ -9165,28 +9168,28 @@ yyreduce:
   case 295:
 
 /* Line 1464 of yacc.c  */
-#line 4020 "Gmsh.y"
+#line 4023 "Gmsh.y"
     { (yyval.c) = (char*)"Homology"; ;}
     break;
 
   case 296:
 
 /* Line 1464 of yacc.c  */
-#line 4021 "Gmsh.y"
+#line 4024 "Gmsh.y"
     { (yyval.c) = (char*)"Cohomology"; ;}
     break;
 
   case 297:
 
 /* Line 1464 of yacc.c  */
-#line 4022 "Gmsh.y"
+#line 4025 "Gmsh.y"
     { (yyval.c) = (char*)"Betti"; ;}
     break;
 
   case 298:
 
 /* Line 1464 of yacc.c  */
-#line 4027 "Gmsh.y"
+#line 4030 "Gmsh.y"
     {
       std::vector<int> domain, subdomain, dim;
       for(int i = 0; i < 4; i++) dim.push_back(i);
@@ -9197,7 +9200,7 @@ yyreduce:
   case 299:
 
 /* Line 1464 of yacc.c  */
-#line 4033 "Gmsh.y"
+#line 4036 "Gmsh.y"
     {
       std::vector<int> domain, subdomain, dim;
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (5)].l)); i++){
@@ -9214,7 +9217,7 @@ yyreduce:
   case 300:
 
 /* Line 1464 of yacc.c  */
-#line 4045 "Gmsh.y"
+#line 4048 "Gmsh.y"
     {
       std::vector<int> domain, subdomain, dim;
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (7)].l)); i++){
@@ -9237,7 +9240,7 @@ yyreduce:
   case 301:
 
 /* Line 1464 of yacc.c  */
-#line 4063 "Gmsh.y"
+#line 4066 "Gmsh.y"
     {
       std::vector<int> domain, subdomain, dim;
       for(int i = 0; i < List_Nbr((yyvsp[(6) - (10)].l)); i++){
@@ -9265,63 +9268,63 @@ yyreduce:
   case 302:
 
 /* Line 1464 of yacc.c  */
-#line 4090 "Gmsh.y"
+#line 4093 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (1)].d);           ;}
     break;
 
   case 303:
 
 /* Line 1464 of yacc.c  */
-#line 4091 "Gmsh.y"
+#line 4094 "Gmsh.y"
     { (yyval.d) = (yyvsp[(2) - (3)].d);           ;}
     break;
 
   case 304:
 
 /* Line 1464 of yacc.c  */
-#line 4092 "Gmsh.y"
+#line 4095 "Gmsh.y"
     { (yyval.d) = -(yyvsp[(2) - (2)].d);          ;}
     break;
 
   case 305:
 
 /* Line 1464 of yacc.c  */
-#line 4093 "Gmsh.y"
+#line 4096 "Gmsh.y"
     { (yyval.d) = (yyvsp[(2) - (2)].d);           ;}
     break;
 
   case 306:
 
 /* Line 1464 of yacc.c  */
-#line 4094 "Gmsh.y"
+#line 4097 "Gmsh.y"
     { (yyval.d) = !(yyvsp[(2) - (2)].d);          ;}
     break;
 
   case 307:
 
 /* Line 1464 of yacc.c  */
-#line 4095 "Gmsh.y"
+#line 4098 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) - (yyvsp[(3) - (3)].d);      ;}
     break;
 
   case 308:
 
 /* Line 1464 of yacc.c  */
-#line 4096 "Gmsh.y"
+#line 4099 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) + (yyvsp[(3) - (3)].d);      ;}
     break;
 
   case 309:
 
 /* Line 1464 of yacc.c  */
-#line 4097 "Gmsh.y"
+#line 4100 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) * (yyvsp[(3) - (3)].d);      ;}
     break;
 
   case 310:
 
 /* Line 1464 of yacc.c  */
-#line 4099 "Gmsh.y"
+#line 4102 "Gmsh.y"
     {
       if(!(yyvsp[(3) - (3)].d))
 	yymsg(0, "Division by zero in '%g / %g'", (yyvsp[(1) - (3)].d), (yyvsp[(3) - (3)].d));
@@ -9333,427 +9336,427 @@ yyreduce:
   case 311:
 
 /* Line 1464 of yacc.c  */
-#line 4105 "Gmsh.y"
+#line 4108 "Gmsh.y"
     { (yyval.d) = (int)(yyvsp[(1) - (3)].d) % (int)(yyvsp[(3) - (3)].d);  ;}
     break;
 
   case 312:
 
 /* Line 1464 of yacc.c  */
-#line 4106 "Gmsh.y"
+#line 4109 "Gmsh.y"
     { (yyval.d) = pow((yyvsp[(1) - (3)].d), (yyvsp[(3) - (3)].d));  ;}
     break;
 
   case 313:
 
 /* Line 1464 of yacc.c  */
-#line 4107 "Gmsh.y"
+#line 4110 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) < (yyvsp[(3) - (3)].d);      ;}
     break;
 
   case 314:
 
 /* Line 1464 of yacc.c  */
-#line 4108 "Gmsh.y"
+#line 4111 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) > (yyvsp[(3) - (3)].d);      ;}
     break;
 
   case 315:
 
 /* Line 1464 of yacc.c  */
-#line 4109 "Gmsh.y"
+#line 4112 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) <= (yyvsp[(3) - (3)].d);     ;}
     break;
 
   case 316:
 
 /* Line 1464 of yacc.c  */
-#line 4110 "Gmsh.y"
+#line 4113 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) >= (yyvsp[(3) - (3)].d);     ;}
     break;
 
   case 317:
 
 /* Line 1464 of yacc.c  */
-#line 4111 "Gmsh.y"
+#line 4114 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) == (yyvsp[(3) - (3)].d);     ;}
     break;
 
   case 318:
 
 /* Line 1464 of yacc.c  */
-#line 4112 "Gmsh.y"
+#line 4115 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) != (yyvsp[(3) - (3)].d);     ;}
     break;
 
   case 319:
 
 /* Line 1464 of yacc.c  */
-#line 4113 "Gmsh.y"
+#line 4116 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) && (yyvsp[(3) - (3)].d);     ;}
     break;
 
   case 320:
 
 /* Line 1464 of yacc.c  */
-#line 4114 "Gmsh.y"
+#line 4117 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) || (yyvsp[(3) - (3)].d);     ;}
     break;
 
   case 321:
 
 /* Line 1464 of yacc.c  */
-#line 4115 "Gmsh.y"
+#line 4118 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (5)].d) ? (yyvsp[(3) - (5)].d) : (yyvsp[(5) - (5)].d); ;}
     break;
 
   case 322:
 
 /* Line 1464 of yacc.c  */
-#line 4116 "Gmsh.y"
+#line 4119 "Gmsh.y"
     { (yyval.d) = exp((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 323:
 
 /* Line 1464 of yacc.c  */
-#line 4117 "Gmsh.y"
+#line 4120 "Gmsh.y"
     { (yyval.d) = log((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 324:
 
 /* Line 1464 of yacc.c  */
-#line 4118 "Gmsh.y"
+#line 4121 "Gmsh.y"
     { (yyval.d) = log10((yyvsp[(3) - (4)].d));    ;}
     break;
 
   case 325:
 
 /* Line 1464 of yacc.c  */
-#line 4119 "Gmsh.y"
+#line 4122 "Gmsh.y"
     { (yyval.d) = sqrt((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 326:
 
 /* Line 1464 of yacc.c  */
-#line 4120 "Gmsh.y"
+#line 4123 "Gmsh.y"
     { (yyval.d) = sin((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 327:
 
 /* Line 1464 of yacc.c  */
-#line 4121 "Gmsh.y"
+#line 4124 "Gmsh.y"
     { (yyval.d) = asin((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 328:
 
 /* Line 1464 of yacc.c  */
-#line 4122 "Gmsh.y"
+#line 4125 "Gmsh.y"
     { (yyval.d) = cos((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 329:
 
 /* Line 1464 of yacc.c  */
-#line 4123 "Gmsh.y"
+#line 4126 "Gmsh.y"
     { (yyval.d) = acos((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 330:
 
 /* Line 1464 of yacc.c  */
-#line 4124 "Gmsh.y"
+#line 4127 "Gmsh.y"
     { (yyval.d) = tan((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 331:
 
 /* Line 1464 of yacc.c  */
-#line 4125 "Gmsh.y"
+#line 4128 "Gmsh.y"
     { (yyval.d) = atan((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 332:
 
 /* Line 1464 of yacc.c  */
-#line 4126 "Gmsh.y"
+#line 4129 "Gmsh.y"
     { (yyval.d) = atan2((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d));;}
     break;
 
   case 333:
 
 /* Line 1464 of yacc.c  */
-#line 4127 "Gmsh.y"
+#line 4130 "Gmsh.y"
     { (yyval.d) = sinh((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 334:
 
 /* Line 1464 of yacc.c  */
-#line 4128 "Gmsh.y"
+#line 4131 "Gmsh.y"
     { (yyval.d) = cosh((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 335:
 
 /* Line 1464 of yacc.c  */
-#line 4129 "Gmsh.y"
+#line 4132 "Gmsh.y"
     { (yyval.d) = tanh((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 336:
 
 /* Line 1464 of yacc.c  */
-#line 4130 "Gmsh.y"
+#line 4133 "Gmsh.y"
     { (yyval.d) = fabs((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 337:
 
 /* Line 1464 of yacc.c  */
-#line 4131 "Gmsh.y"
+#line 4134 "Gmsh.y"
     { (yyval.d) = floor((yyvsp[(3) - (4)].d));    ;}
     break;
 
   case 338:
 
 /* Line 1464 of yacc.c  */
-#line 4132 "Gmsh.y"
+#line 4135 "Gmsh.y"
     { (yyval.d) = ceil((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 339:
 
 /* Line 1464 of yacc.c  */
-#line 4133 "Gmsh.y"
+#line 4136 "Gmsh.y"
     { (yyval.d) = fmod((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d)); ;}
     break;
 
   case 340:
 
 /* Line 1464 of yacc.c  */
-#line 4134 "Gmsh.y"
+#line 4137 "Gmsh.y"
     { (yyval.d) = fmod((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d)); ;}
     break;
 
   case 341:
 
 /* Line 1464 of yacc.c  */
-#line 4135 "Gmsh.y"
+#line 4138 "Gmsh.y"
     { (yyval.d) = sqrt((yyvsp[(3) - (6)].d) * (yyvsp[(3) - (6)].d) + (yyvsp[(5) - (6)].d) * (yyvsp[(5) - (6)].d)); ;}
     break;
 
   case 342:
 
 /* Line 1464 of yacc.c  */
-#line 4136 "Gmsh.y"
+#line 4139 "Gmsh.y"
     { (yyval.d) = (yyvsp[(3) - (4)].d) * (double)rand() / (double)RAND_MAX; ;}
     break;
 
   case 343:
 
 /* Line 1464 of yacc.c  */
-#line 4139 "Gmsh.y"
+#line 4142 "Gmsh.y"
     { (yyval.d) = exp((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 344:
 
 /* Line 1464 of yacc.c  */
-#line 4140 "Gmsh.y"
+#line 4143 "Gmsh.y"
     { (yyval.d) = log((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 345:
 
 /* Line 1464 of yacc.c  */
-#line 4141 "Gmsh.y"
+#line 4144 "Gmsh.y"
     { (yyval.d) = log10((yyvsp[(3) - (4)].d));    ;}
     break;
 
   case 346:
 
 /* Line 1464 of yacc.c  */
-#line 4142 "Gmsh.y"
+#line 4145 "Gmsh.y"
     { (yyval.d) = sqrt((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 347:
 
 /* Line 1464 of yacc.c  */
-#line 4143 "Gmsh.y"
+#line 4146 "Gmsh.y"
     { (yyval.d) = sin((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 348:
 
 /* Line 1464 of yacc.c  */
-#line 4144 "Gmsh.y"
+#line 4147 "Gmsh.y"
     { (yyval.d) = asin((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 349:
 
 /* Line 1464 of yacc.c  */
-#line 4145 "Gmsh.y"
+#line 4148 "Gmsh.y"
     { (yyval.d) = cos((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 350:
 
 /* Line 1464 of yacc.c  */
-#line 4146 "Gmsh.y"
+#line 4149 "Gmsh.y"
     { (yyval.d) = acos((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 351:
 
 /* Line 1464 of yacc.c  */
-#line 4147 "Gmsh.y"
+#line 4150 "Gmsh.y"
     { (yyval.d) = tan((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 352:
 
 /* Line 1464 of yacc.c  */
-#line 4148 "Gmsh.y"
+#line 4151 "Gmsh.y"
     { (yyval.d) = atan((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 353:
 
 /* Line 1464 of yacc.c  */
-#line 4149 "Gmsh.y"
+#line 4152 "Gmsh.y"
     { (yyval.d) = atan2((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d));;}
     break;
 
   case 354:
 
 /* Line 1464 of yacc.c  */
-#line 4150 "Gmsh.y"
+#line 4153 "Gmsh.y"
     { (yyval.d) = sinh((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 355:
 
 /* Line 1464 of yacc.c  */
-#line 4151 "Gmsh.y"
+#line 4154 "Gmsh.y"
     { (yyval.d) = cosh((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 356:
 
 /* Line 1464 of yacc.c  */
-#line 4152 "Gmsh.y"
+#line 4155 "Gmsh.y"
     { (yyval.d) = tanh((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 357:
 
 /* Line 1464 of yacc.c  */
-#line 4153 "Gmsh.y"
+#line 4156 "Gmsh.y"
     { (yyval.d) = fabs((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 358:
 
 /* Line 1464 of yacc.c  */
-#line 4154 "Gmsh.y"
+#line 4157 "Gmsh.y"
     { (yyval.d) = floor((yyvsp[(3) - (4)].d));    ;}
     break;
 
   case 359:
 
 /* Line 1464 of yacc.c  */
-#line 4155 "Gmsh.y"
+#line 4158 "Gmsh.y"
     { (yyval.d) = ceil((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 360:
 
 /* Line 1464 of yacc.c  */
-#line 4156 "Gmsh.y"
+#line 4159 "Gmsh.y"
     { (yyval.d) = fmod((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d)); ;}
     break;
 
   case 361:
 
 /* Line 1464 of yacc.c  */
-#line 4157 "Gmsh.y"
+#line 4160 "Gmsh.y"
     { (yyval.d) = fmod((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d)); ;}
     break;
 
   case 362:
 
 /* Line 1464 of yacc.c  */
-#line 4158 "Gmsh.y"
+#line 4161 "Gmsh.y"
     { (yyval.d) = sqrt((yyvsp[(3) - (6)].d) * (yyvsp[(3) - (6)].d) + (yyvsp[(5) - (6)].d) * (yyvsp[(5) - (6)].d)); ;}
     break;
 
   case 363:
 
 /* Line 1464 of yacc.c  */
-#line 4159 "Gmsh.y"
+#line 4162 "Gmsh.y"
     { (yyval.d) = (yyvsp[(3) - (4)].d) * (double)rand() / (double)RAND_MAX; ;}
     break;
 
   case 364:
 
 /* Line 1464 of yacc.c  */
-#line 4168 "Gmsh.y"
+#line 4171 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (1)].d); ;}
     break;
 
   case 365:
 
 /* Line 1464 of yacc.c  */
-#line 4169 "Gmsh.y"
+#line 4172 "Gmsh.y"
     { (yyval.d) = 3.141592653589793; ;}
     break;
 
   case 366:
 
 /* Line 1464 of yacc.c  */
-#line 4170 "Gmsh.y"
+#line 4173 "Gmsh.y"
     { (yyval.d) = Msg::GetCommRank(); ;}
     break;
 
   case 367:
 
 /* Line 1464 of yacc.c  */
-#line 4171 "Gmsh.y"
+#line 4174 "Gmsh.y"
     { (yyval.d) = Msg::GetCommSize(); ;}
     break;
 
   case 368:
 
 /* Line 1464 of yacc.c  */
-#line 4172 "Gmsh.y"
+#line 4175 "Gmsh.y"
     { (yyval.d) = GetGmshMajorVersion(); ;}
     break;
 
   case 369:
 
 /* Line 1464 of yacc.c  */
-#line 4173 "Gmsh.y"
+#line 4176 "Gmsh.y"
     { (yyval.d) = GetGmshMinorVersion(); ;}
     break;
 
   case 370:
 
 /* Line 1464 of yacc.c  */
-#line 4174 "Gmsh.y"
+#line 4177 "Gmsh.y"
     { (yyval.d) = GetGmshPatchVersion(); ;}
     break;
 
   case 371:
 
 /* Line 1464 of yacc.c  */
-#line 4179 "Gmsh.y"
+#line 4182 "Gmsh.y"
     {
       if(!gmsh_yysymbols.count((yyvsp[(1) - (1)].c))){
 	yymsg(0, "Unknown variable '%s'", (yyvsp[(1) - (1)].c));
@@ -9775,7 +9778,7 @@ yyreduce:
   case 372:
 
 /* Line 1464 of yacc.c  */
-#line 4200 "Gmsh.y"
+#line 4203 "Gmsh.y"
     {
       char tmpstring[1024];
       sprintf(tmpstring, "%s_%d", (yyvsp[(1) - (5)].c), (int)(yyvsp[(4) - (5)].d)) ;
@@ -9799,7 +9802,7 @@ yyreduce:
   case 373:
 
 /* Line 1464 of yacc.c  */
-#line 4219 "Gmsh.y"
+#line 4222 "Gmsh.y"
     {
       int index = (int)(yyvsp[(3) - (4)].d);
       if(!gmsh_yysymbols.count((yyvsp[(1) - (4)].c))){
@@ -9822,7 +9825,7 @@ yyreduce:
   case 374:
 
 /* Line 1464 of yacc.c  */
-#line 4237 "Gmsh.y"
+#line 4240 "Gmsh.y"
     {
       if(!gmsh_yysymbols.count((yyvsp[(2) - (4)].c))){
 	yymsg(0, "Unknown variable '%s'", (yyvsp[(2) - (4)].c));
@@ -9839,7 +9842,7 @@ yyreduce:
   case 375:
 
 /* Line 1464 of yacc.c  */
-#line 4249 "Gmsh.y"
+#line 4252 "Gmsh.y"
     {
       if(!gmsh_yysymbols.count((yyvsp[(1) - (2)].c))){
 	yymsg(0, "Unknown variable '%s'", (yyvsp[(1) - (2)].c));
@@ -9861,7 +9864,7 @@ yyreduce:
   case 376:
 
 /* Line 1464 of yacc.c  */
-#line 4266 "Gmsh.y"
+#line 4269 "Gmsh.y"
     {
       int index = (int)(yyvsp[(3) - (5)].d);
       if(!gmsh_yysymbols.count((yyvsp[(1) - (5)].c))){
@@ -9884,7 +9887,7 @@ yyreduce:
   case 377:
 
 /* Line 1464 of yacc.c  */
-#line 4287 "Gmsh.y"
+#line 4290 "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));
@@ -9894,7 +9897,7 @@ yyreduce:
   case 378:
 
 /* Line 1464 of yacc.c  */
-#line 4292 "Gmsh.y"
+#line 4295 "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));
@@ -9904,7 +9907,7 @@ yyreduce:
   case 379:
 
 /* Line 1464 of yacc.c  */
-#line 4297 "Gmsh.y"
+#line 4300 "Gmsh.y"
     {
       double d = 0.;
       if(NumberOption(GMSH_GET, (yyvsp[(1) - (4)].c), 0, (yyvsp[(3) - (4)].c), d)){
@@ -9919,7 +9922,7 @@ yyreduce:
   case 380:
 
 /* Line 1464 of yacc.c  */
-#line 4307 "Gmsh.y"
+#line 4310 "Gmsh.y"
     {
       double d = 0.;
       if(NumberOption(GMSH_GET, (yyvsp[(1) - (7)].c), (int)(yyvsp[(3) - (7)].d), (yyvsp[(6) - (7)].c), d)){
@@ -9934,7 +9937,7 @@ yyreduce:
   case 381:
 
 /* Line 1464 of yacc.c  */
-#line 4317 "Gmsh.y"
+#line 4320 "Gmsh.y"
     {
       (yyval.d) = Msg::GetValue((yyvsp[(3) - (6)].c), (yyvsp[(5) - (6)].d));
       Free((yyvsp[(3) - (6)].c));
@@ -9944,7 +9947,7 @@ yyreduce:
   case 382:
 
 /* Line 1464 of yacc.c  */
-#line 4322 "Gmsh.y"
+#line 4325 "Gmsh.y"
     {
       std::string s((yyvsp[(3) - (6)].c)), substr((yyvsp[(5) - (6)].c));
       if(s.find(substr) != std::string::npos)
@@ -9958,7 +9961,7 @@ yyreduce:
   case 383:
 
 /* Line 1464 of yacc.c  */
-#line 4331 "Gmsh.y"
+#line 4334 "Gmsh.y"
     {
       int align = 0, font = 0, fontsize = CTX::instance()->glFontSize;
       if(List_Nbr((yyvsp[(3) - (4)].l)) % 2){
@@ -9987,7 +9990,7 @@ yyreduce:
   case 384:
 
 /* Line 1464 of yacc.c  */
-#line 4358 "Gmsh.y"
+#line 4361 "Gmsh.y"
     {
       memcpy((yyval.v), (yyvsp[(1) - (1)].v), 5*sizeof(double));
     ;}
@@ -9996,7 +9999,7 @@ yyreduce:
   case 385:
 
 /* Line 1464 of yacc.c  */
-#line 4362 "Gmsh.y"
+#line 4365 "Gmsh.y"
     {
       for(int i = 0; i < 5; i++) (yyval.v)[i] = -(yyvsp[(2) - (2)].v)[i];
     ;}
@@ -10005,7 +10008,7 @@ yyreduce:
   case 386:
 
 /* Line 1464 of yacc.c  */
-#line 4366 "Gmsh.y"
+#line 4369 "Gmsh.y"
     {
       for(int i = 0; i < 5; i++) (yyval.v)[i] = (yyvsp[(2) - (2)].v)[i];
     ;}
@@ -10014,7 +10017,7 @@ yyreduce:
   case 387:
 
 /* Line 1464 of yacc.c  */
-#line 4370 "Gmsh.y"
+#line 4373 "Gmsh.y"
     {
       for(int i = 0; i < 5; i++) (yyval.v)[i] = (yyvsp[(1) - (3)].v)[i] - (yyvsp[(3) - (3)].v)[i];
     ;}
@@ -10023,7 +10026,7 @@ yyreduce:
   case 388:
 
 /* Line 1464 of yacc.c  */
-#line 4374 "Gmsh.y"
+#line 4377 "Gmsh.y"
     {
       for(int i = 0; i < 5; i++) (yyval.v)[i] = (yyvsp[(1) - (3)].v)[i] + (yyvsp[(3) - (3)].v)[i];
     ;}
@@ -10032,7 +10035,7 @@ yyreduce:
   case 389:
 
 /* Line 1464 of yacc.c  */
-#line 4381 "Gmsh.y"
+#line 4384 "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);
     ;}
@@ -10041,7 +10044,7 @@ yyreduce:
   case 390:
 
 /* Line 1464 of yacc.c  */
-#line 4385 "Gmsh.y"
+#line 4388 "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;
     ;}
@@ -10050,7 +10053,7 @@ yyreduce:
   case 391:
 
 /* Line 1464 of yacc.c  */
-#line 4389 "Gmsh.y"
+#line 4392 "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;
     ;}
@@ -10059,7 +10062,7 @@ yyreduce:
   case 392:
 
 /* Line 1464 of yacc.c  */
-#line 4393 "Gmsh.y"
+#line 4396 "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;
     ;}
@@ -10068,7 +10071,7 @@ yyreduce:
   case 393:
 
 /* Line 1464 of yacc.c  */
-#line 4400 "Gmsh.y"
+#line 4403 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(List_T*));
       List_Add((yyval.l), &((yyvsp[(1) - (1)].l)));
@@ -10078,7 +10081,7 @@ yyreduce:
   case 394:
 
 /* Line 1464 of yacc.c  */
-#line 4405 "Gmsh.y"
+#line 4408 "Gmsh.y"
     {
       List_Add((yyval.l), &((yyvsp[(3) - (3)].l)));
     ;}
@@ -10087,7 +10090,7 @@ yyreduce:
   case 395:
 
 /* Line 1464 of yacc.c  */
-#line 4412 "Gmsh.y"
+#line 4415 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       List_Add((yyval.l), &((yyvsp[(1) - (1)].d)));
@@ -10097,7 +10100,7 @@ yyreduce:
   case 396:
 
 /* Line 1464 of yacc.c  */
-#line 4417 "Gmsh.y"
+#line 4420 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(1) - (1)].l);
     ;}
@@ -10106,7 +10109,7 @@ yyreduce:
   case 397:
 
 /* Line 1464 of yacc.c  */
-#line 4421 "Gmsh.y"
+#line 4424 "Gmsh.y"
     {
       // creates an empty list
       (yyval.l) = List_Create(2, 1, sizeof(double));
@@ -10116,7 +10119,7 @@ yyreduce:
   case 398:
 
 /* Line 1464 of yacc.c  */
-#line 4426 "Gmsh.y"
+#line 4429 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(2) - (3)].l);
     ;}
@@ -10125,7 +10128,7 @@ yyreduce:
   case 399:
 
 /* Line 1464 of yacc.c  */
-#line 4430 "Gmsh.y"
+#line 4433 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(3) - (4)].l);
       for(int i = 0; i < List_Nbr((yyval.l)); i++){
@@ -10138,7 +10141,7 @@ yyreduce:
   case 400:
 
 /* Line 1464 of yacc.c  */
-#line 4438 "Gmsh.y"
+#line 4441 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(4) - (5)].l);
       for(int i = 0; i < List_Nbr((yyval.l)); i++){
@@ -10151,7 +10154,7 @@ yyreduce:
   case 401:
 
 /* Line 1464 of yacc.c  */
-#line 4449 "Gmsh.y"
+#line 4452 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(1) - (1)].l);
     ;}
@@ -10160,7 +10163,7 @@ yyreduce:
   case 402:
 
 /* Line 1464 of yacc.c  */
-#line 4453 "Gmsh.y"
+#line 4456 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(1) - (1)].c), "*") || !strcmp((yyvsp[(1) - (1)].c), "all"))
         (yyval.l) = 0;
@@ -10174,7 +10177,7 @@ yyreduce:
   case 403:
 
 /* Line 1464 of yacc.c  */
-#line 4465 "Gmsh.y"
+#line 4468 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(2) - (2)].l);
       for(int i = 0; i < List_Nbr((yyval.l)); i++){
@@ -10187,7 +10190,7 @@ yyreduce:
   case 404:
 
 /* Line 1464 of yacc.c  */
-#line 4473 "Gmsh.y"
+#line 4476 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(3) - (3)].l);
       for(int i = 0; i < List_Nbr((yyval.l)); i++){
@@ -10200,7 +10203,7 @@ yyreduce:
   case 405:
 
 /* Line 1464 of yacc.c  */
-#line 4481 "Gmsh.y"
+#line 4484 "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));
@@ -10212,7 +10215,7 @@ yyreduce:
   case 406:
 
 /* Line 1464 of yacc.c  */
-#line 4488 "Gmsh.y"
+#line 4491 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       if(!(yyvsp[(5) - (5)].d)){  //|| ($1 < $3 && $5 < 0) || ($1 > $3 && $5 > 0)
@@ -10227,7 +10230,7 @@ yyreduce:
   case 407:
 
 /* Line 1464 of yacc.c  */
-#line 4498 "Gmsh.y"
+#line 4501 "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
@@ -10252,7 +10255,7 @@ yyreduce:
   case 408:
 
 /* Line 1464 of yacc.c  */
-#line 4518 "Gmsh.y"
+#line 4521 "Gmsh.y"
     {
       (yyval.l) = GetAllEntityNumbers(0);
     ;}
@@ -10261,7 +10264,7 @@ yyreduce:
   case 409:
 
 /* Line 1464 of yacc.c  */
-#line 4522 "Gmsh.y"
+#line 4525 "Gmsh.y"
     {
       (yyval.l) = GetAllEntityNumbers(1);
     ;}
@@ -10270,7 +10273,7 @@ yyreduce:
   case 410:
 
 /* Line 1464 of yacc.c  */
-#line 4526 "Gmsh.y"
+#line 4529 "Gmsh.y"
     {
       (yyval.l) = GetAllEntityNumbers(2);
     ;}
@@ -10279,7 +10282,7 @@ yyreduce:
   case 411:
 
 /* Line 1464 of yacc.c  */
-#line 4530 "Gmsh.y"
+#line 4533 "Gmsh.y"
     {
       (yyval.l) = GetAllEntityNumbers(3);
     ;}
@@ -10288,7 +10291,7 @@ yyreduce:
   case 412:
 
 /* Line 1464 of yacc.c  */
-#line 4534 "Gmsh.y"
+#line 4537 "Gmsh.y"
     {
       (yyval.l) = List_Create(10, 1, sizeof(double));
       for(int i = 0; i < List_Nbr((yyvsp[(4) - (5)].l)); i++){
@@ -10322,7 +10325,7 @@ yyreduce:
   case 413:
 
 /* Line 1464 of yacc.c  */
-#line 4563 "Gmsh.y"
+#line 4566 "Gmsh.y"
     {
       (yyval.l) = List_Create(10, 1, sizeof(double));
       for(int i = 0; i < List_Nbr((yyvsp[(4) - (5)].l)); i++){
@@ -10356,7 +10359,7 @@ yyreduce:
   case 414:
 
 /* Line 1464 of yacc.c  */
-#line 4592 "Gmsh.y"
+#line 4595 "Gmsh.y"
     {
       (yyval.l) = List_Create(10, 1, sizeof(double));
       for(int i = 0; i < List_Nbr((yyvsp[(4) - (5)].l)); i++){
@@ -10390,7 +10393,7 @@ yyreduce:
   case 415:
 
 /* Line 1464 of yacc.c  */
-#line 4621 "Gmsh.y"
+#line 4624 "Gmsh.y"
     {
       (yyval.l) = List_Create(10, 1, sizeof(double));
       for(int i = 0; i < List_Nbr((yyvsp[(4) - (5)].l)); i++){
@@ -10424,7 +10427,7 @@ yyreduce:
   case 416:
 
 /* Line 1464 of yacc.c  */
-#line 4650 "Gmsh.y"
+#line 4653 "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++){
@@ -10439,7 +10442,7 @@ yyreduce:
   case 417:
 
 /* Line 1464 of yacc.c  */
-#line 4660 "Gmsh.y"
+#line 4663 "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++){
@@ -10454,7 +10457,7 @@ yyreduce:
   case 418:
 
 /* Line 1464 of yacc.c  */
-#line 4670 "Gmsh.y"
+#line 4673 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       if(!gmsh_yysymbols.count((yyvsp[(1) - (3)].c)))
@@ -10471,7 +10474,7 @@ yyreduce:
   case 419:
 
 /* Line 1464 of yacc.c  */
-#line 4683 "Gmsh.y"
+#line 4686 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       if(!gmsh_yysymbols.count((yyvsp[(1) - (3)].c)))
@@ -10488,7 +10491,7 @@ yyreduce:
   case 420:
 
 /* Line 1464 of yacc.c  */
-#line 4695 "Gmsh.y"
+#line 4698 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       if(!gmsh_yysymbols.count((yyvsp[(3) - (4)].c)))
@@ -10505,7 +10508,7 @@ yyreduce:
   case 421:
 
 /* Line 1464 of yacc.c  */
-#line 4707 "Gmsh.y"
+#line 4710 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       if(!gmsh_yysymbols.count((yyvsp[(1) - (6)].c)))
@@ -10528,7 +10531,7 @@ yyreduce:
   case 422:
 
 /* Line 1464 of yacc.c  */
-#line 4726 "Gmsh.y"
+#line 4729 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       if(!gmsh_yysymbols.count((yyvsp[(1) - (6)].c)))
@@ -10551,7 +10554,7 @@ yyreduce:
   case 423:
 
 /* Line 1464 of yacc.c  */
-#line 4747 "Gmsh.y"
+#line 4750 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       List_Add((yyval.l), &((yyvsp[(1) - (1)].d)));
@@ -10561,7 +10564,7 @@ yyreduce:
   case 424:
 
 /* Line 1464 of yacc.c  */
-#line 4752 "Gmsh.y"
+#line 4755 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(1) - (1)].l);
     ;}
@@ -10570,7 +10573,7 @@ yyreduce:
   case 425:
 
 /* Line 1464 of yacc.c  */
-#line 4756 "Gmsh.y"
+#line 4759 "Gmsh.y"
     {
       List_Add((yyval.l), &((yyvsp[(3) - (3)].d)));
     ;}
@@ -10579,7 +10582,7 @@ yyreduce:
   case 426:
 
 /* Line 1464 of yacc.c  */
-#line 4760 "Gmsh.y"
+#line 4763 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (3)].l)); i++){
 	double d;
@@ -10593,7 +10596,7 @@ yyreduce:
   case 427:
 
 /* Line 1464 of yacc.c  */
-#line 4772 "Gmsh.y"
+#line 4775 "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));
     ;}
@@ -10602,7 +10605,7 @@ yyreduce:
   case 428:
 
 /* Line 1464 of yacc.c  */
-#line 4776 "Gmsh.y"
+#line 4779 "Gmsh.y"
     {
       (yyval.u) = CTX::instance()->packColor((int)(yyvsp[(2) - (7)].d), (int)(yyvsp[(4) - (7)].d), (int)(yyvsp[(6) - (7)].d), 255);
     ;}
@@ -10611,7 +10614,7 @@ yyreduce:
   case 429:
 
 /* Line 1464 of yacc.c  */
-#line 4788 "Gmsh.y"
+#line 4791 "Gmsh.y"
     {
       int flag;
       (yyval.u) = GetColorForString(-1, (yyvsp[(1) - (1)].c), &flag);
@@ -10623,7 +10626,7 @@ yyreduce:
   case 430:
 
 /* Line 1464 of yacc.c  */
-#line 4795 "Gmsh.y"
+#line 4798 "Gmsh.y"
     {
       unsigned int val = 0;
       ColorOption(GMSH_GET, (yyvsp[(1) - (5)].c), 0, (yyvsp[(5) - (5)].c), val);
@@ -10635,7 +10638,7 @@ yyreduce:
   case 431:
 
 /* Line 1464 of yacc.c  */
-#line 4805 "Gmsh.y"
+#line 4808 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(2) - (3)].l);
     ;}
@@ -10644,7 +10647,7 @@ yyreduce:
   case 432:
 
 /* Line 1464 of yacc.c  */
-#line 4809 "Gmsh.y"
+#line 4812 "Gmsh.y"
     {
       (yyval.l) = List_Create(256, 10, sizeof(unsigned int));
       GmshColorTable *ct = GetColorTable((int)(yyvsp[(3) - (6)].d));
@@ -10661,7 +10664,7 @@ yyreduce:
   case 433:
 
 /* Line 1464 of yacc.c  */
-#line 4824 "Gmsh.y"
+#line 4827 "Gmsh.y"
     {
       (yyval.l) = List_Create(256, 10, sizeof(unsigned int));
       List_Add((yyval.l), &((yyvsp[(1) - (1)].u)));
@@ -10671,7 +10674,7 @@ yyreduce:
   case 434:
 
 /* Line 1464 of yacc.c  */
-#line 4829 "Gmsh.y"
+#line 4832 "Gmsh.y"
     {
       List_Add((yyval.l), &((yyvsp[(3) - (3)].u)));
     ;}
@@ -10680,7 +10683,7 @@ yyreduce:
   case 435:
 
 /* Line 1464 of yacc.c  */
-#line 4836 "Gmsh.y"
+#line 4839 "Gmsh.y"
     {
       (yyval.c) = (yyvsp[(1) - (1)].c);
     ;}
@@ -10689,7 +10692,7 @@ yyreduce:
   case 436:
 
 /* Line 1464 of yacc.c  */
-#line 4840 "Gmsh.y"
+#line 4843 "Gmsh.y"
     {
       if(!gmsh_yystringsymbols.count((yyvsp[(1) - (1)].c))){
 	yymsg(0, "Unknown string variable '%s'", (yyvsp[(1) - (1)].c));
@@ -10707,7 +10710,7 @@ yyreduce:
   case 437:
 
 /* Line 1464 of yacc.c  */
-#line 4853 "Gmsh.y"
+#line 4856 "Gmsh.y"
     {
       std::string out;
       StringOption(GMSH_GET, (yyvsp[(1) - (3)].c), 0, (yyvsp[(3) - (3)].c), out);
@@ -10720,7 +10723,7 @@ yyreduce:
   case 438:
 
 /* Line 1464 of yacc.c  */
-#line 4861 "Gmsh.y"
+#line 4864 "Gmsh.y"
     {
       std::string out;
       StringOption(GMSH_GET, (yyvsp[(1) - (6)].c), (int)(yyvsp[(3) - (6)].d), (yyvsp[(6) - (6)].c), out);
@@ -10733,7 +10736,7 @@ yyreduce:
   case 439:
 
 /* Line 1464 of yacc.c  */
-#line 4872 "Gmsh.y"
+#line 4875 "Gmsh.y"
     {
       (yyval.c) = (yyvsp[(1) - (1)].c);
     ;}
@@ -10742,7 +10745,7 @@ yyreduce:
   case 440:
 
 /* Line 1464 of yacc.c  */
-#line 4876 "Gmsh.y"
+#line 4879 "Gmsh.y"
     {
       (yyval.c) = (char *)Malloc(32 * sizeof(char));
       time_t now;
@@ -10755,7 +10758,7 @@ yyreduce:
   case 441:
 
 /* Line 1464 of yacc.c  */
-#line 4884 "Gmsh.y"
+#line 4887 "Gmsh.y"
     {
       const char *env = GetEnvironmentVar((yyvsp[(3) - (4)].c));
       if(!env) env = "";
@@ -10768,7 +10771,7 @@ yyreduce:
   case 442:
 
 /* Line 1464 of yacc.c  */
-#line 4892 "Gmsh.y"
+#line 4895 "Gmsh.y"
     {
       std::string s = Msg::GetString((yyvsp[(3) - (6)].c), (yyvsp[(5) - (6)].c));
       (yyval.c) = (char *)Malloc((s.size() + 1) * sizeof(char));
@@ -10781,7 +10784,7 @@ yyreduce:
   case 443:
 
 /* Line 1464 of yacc.c  */
-#line 4900 "Gmsh.y"
+#line 4903 "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));
@@ -10794,7 +10797,7 @@ yyreduce:
   case 444:
 
 /* Line 1464 of yacc.c  */
-#line 4908 "Gmsh.y"
+#line 4911 "Gmsh.y"
     {
       (yyval.c) = (char *)Malloc((strlen((yyvsp[(3) - (4)].c)) + 1) * sizeof(char));
       int i;
@@ -10813,7 +10816,7 @@ yyreduce:
   case 445:
 
 /* Line 1464 of yacc.c  */
-#line 4922 "Gmsh.y"
+#line 4925 "Gmsh.y"
     {
       (yyval.c) = (char *)Malloc((strlen((yyvsp[(3) - (4)].c)) + 1) * sizeof(char));
       int i;
@@ -10832,7 +10835,7 @@ yyreduce:
   case 446:
 
 /* Line 1464 of yacc.c  */
-#line 4936 "Gmsh.y"
+#line 4939 "Gmsh.y"
     {
       (yyval.c) = (yyvsp[(3) - (4)].c);
     ;}
@@ -10841,7 +10844,7 @@ yyreduce:
   case 447:
 
 /* Line 1464 of yacc.c  */
-#line 4940 "Gmsh.y"
+#line 4943 "Gmsh.y"
     {
       char tmpstring[5000];
       int i = PrintListOfDouble((yyvsp[(3) - (6)].c), (yyvsp[(5) - (6)].l), tmpstring);
@@ -10865,7 +10868,7 @@ yyreduce:
   case 448:
 
 /* Line 1464 of yacc.c  */
-#line 4962 "Gmsh.y"
+#line 4965 "Gmsh.y"
     {
       (yyval.l) = List_Create(20,20,sizeof(char*));
       List_Add((yyval.l), &((yyvsp[(1) - (1)].c)));
@@ -10875,14 +10878,14 @@ yyreduce:
   case 449:
 
 /* Line 1464 of yacc.c  */
-#line 4967 "Gmsh.y"
+#line 4970 "Gmsh.y"
     { List_Add((yyval.l), &((yyvsp[(3) - (3)].c))); ;}
     break;
 
 
 
 /* Line 1464 of yacc.c  */
-#line 10886 "Gmsh.tab.cpp"
+#line 10889 "Gmsh.tab.cpp"
       default: break;
     }
   YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
@@ -11094,7 +11097,7 @@ yyreturn:
 
 
 /* Line 1684 of yacc.c  */
-#line 4970 "Gmsh.y"
+#line 4973 "Gmsh.y"
 
 
 int PrintListOfDouble(char *format, List_T *list, char *buffer)
diff --git a/Parser/Gmsh.y b/Parser/Gmsh.y
index 519c8371ff6cf9892190b90a0d5328dab9cc358f..9addf8d9ec01714c7937b593ef23606b5fd95d22 100644
--- a/Parser/Gmsh.y
+++ b/Parser/Gmsh.y
@@ -3263,12 +3263,15 @@ ExtrudeParameters :
 ExtrudeParameter :
     tLayers '{' FExpr '}' tEND
     {
-      extr.mesh.ExtrudeMesh = true;
-      extr.mesh.NbLayer = 1;
-      extr.mesh.NbElmLayer.clear();
-      extr.mesh.hLayer.clear();
-      extr.mesh.NbElmLayer.push_back((int)fabs($3));
-      extr.mesh.hLayer.push_back(1.);
+      int n = (int)fabs($3);
+      if(n){ // we accept n==0 to easily disable layers
+        extr.mesh.ExtrudeMesh = true;
+        extr.mesh.NbLayer = 1;
+        extr.mesh.NbElmLayer.clear();
+        extr.mesh.hLayer.clear();
+        extr.mesh.NbElmLayer.push_back((int)fabs($3));
+        extr.mesh.hLayer.push_back(1.);
+      }
     }
   | tLayers '{' ListOfDouble ',' ListOfDouble '}' tEND
     {