diff --git a/Parser/Gmsh.tab.cpp b/Parser/Gmsh.tab.cpp
index bce21df9d1e66d857577a2709453dd7c5e10506c..79ad29274913ec1723b4a88e8670791c6b0d9a9c 100644
--- a/Parser/Gmsh.tab.cpp
+++ b/Parser/Gmsh.tab.cpp
@@ -603,13 +603,21 @@ static gmshfpos_t yyposImbricatedLoopsTab[MAX_RECUR_LOOPS];
 static int yylinenoImbricatedLoopsTab[MAX_RECUR_LOOPS];
 static double LoopControlVariablesTab[MAX_RECUR_LOOPS][3];
 static std::string LoopControlVariablesNameTab[MAX_RECUR_LOOPS];
-static std::map<std::string, std::vector<double> > floatOptions;
-static std::map<std::string, std::vector<std::string> > charOptions;
 static std::string factory;
 static NameSpaces nameSpaces;
 static std::string struct_name, struct_namespace;
 static int flag_tSTRING_alloc = 0;
 
+static std::map<std::string, std::vector<double> > floatOptions;
+static std::map<std::string, std::vector<std::string> > charOptions;
+static int flag_Enum, member_ValMax;
+
+void init_Options(int member_ValMax_ = 0)
+{
+  floatOptions.clear(); charOptions.clear();
+  flag_Enum = 0; member_ValMax = member_ValMax_;
+}
+
 // parser functions defined at the end of this file
 void yyerror(const char *s);
 void yymsg(int level, const char *fmt, ...);
@@ -675,7 +683,7 @@ struct doubleXstring{
 
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
 typedef union YYSTYPE
-#line 139 "Gmsh.y"
+#line 147 "Gmsh.y"
 {
   char *c;
   int i;
@@ -687,7 +695,7 @@ typedef union YYSTYPE
   struct TwoChar c2;
 }
 /* Line 193 of yacc.c.  */
-#line 691 "Gmsh.tab.cpp"
+#line 699 "Gmsh.tab.cpp"
 	YYSTYPE;
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1
@@ -700,7 +708,7 @@ typedef union YYSTYPE
 
 
 /* Line 216 of yacc.c.  */
-#line 704 "Gmsh.tab.cpp"
+#line 712 "Gmsh.tab.cpp"
 
 #ifdef short
 # undef short
@@ -1367,63 +1375,63 @@ static const yytype_int16 yyrhs[] =
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
 static const yytype_uint16 yyrline[] =
 {
-       0,   238,   238,   239,   244,   246,   250,   251,   252,   253,
-     270,   271,   272,   273,   274,   275,   276,   277,   278,   279,
-     280,   281,   282,   283,   284,   285,   289,   293,   300,   305,
-     310,   324,   337,   350,   378,   392,   405,   418,   437,   442,
-     443,   444,   445,   446,   450,   452,   457,   459,   465,   569,
-     464,   587,   594,   605,   604,   622,   629,   640,   639,   656,
-     673,   696,   695,   709,   710,   711,   712,   713,   717,   718,
-     724,   724,   725,   725,   731,   732,   733,   734,   739,   745,
-     807,   822,   851,   861,   866,   874,   879,   887,   896,   901,
-     913,   930,   936,   945,   963,   981,   990,  1002,  1007,  1015,
-    1035,  1058,  1069,  1077,  1099,  1122,  1160,  1181,  1193,  1207,
-    1207,  1209,  1211,  1220,  1230,  1229,  1250,  1249,  1267,  1277,
-    1276,  1290,  1292,  1300,  1306,  1311,  1337,  1339,  1342,  1344,
-    1348,  1349,  1353,  1364,  1370,  1385,  1395,  1397,  1401,  1402,
-    1407,  1415,  1424,  1432,  1450,  1454,  1461,  1469,  1473,  1480,
-    1488,  1492,  1499,  1507,  1511,  1518,  1527,  1530,  1537,  1540,
-    1547,  1568,  1582,  1596,  1631,  1669,  1683,  1697,  1717,  1726,
-    1740,  1755,  1769,  1788,  1798,  1804,  1810,  1817,  1846,  1861,
-    1881,  1902,  1923,  1944,  1966,  1988,  2009,  2032,  2041,  2062,
-    2077,  2091,  2107,  2123,  2132,  2142,  2152,  2162,  2177,  2189,
-    2203,  2216,  2229,  2242,  2275,  2295,  2317,  2318,  2323,  2326,
-    2330,  2341,  2352,  2363,  2379,  2398,  2419,  2434,  2450,  2468,
-    2519,  2540,  2562,  2585,  2690,  2706,  2741,  2752,  2758,  2773,
-    2801,  2818,  2825,  2837,  2856,  2862,  2868,  2875,  2882,  2889,
-    2901,  2974,  2992,  3009,  3024,  3057,  3069,  3093,  3097,  3102,
-    3109,  3114,  3124,  3129,  3135,  3143,  3147,  3151,  3160,  3224,
-    3240,  3257,  3274,  3296,  3318,  3353,  3361,  3369,  3375,  3382,
-    3389,  3409,  3435,  3447,  3459,  3475,  3491,  3508,  3507,  3530,
-    3529,  3554,  3553,  3576,  3575,  3596,  3610,  3625,  3640,  3661,
-    3664,  3670,  3682,  3702,  3706,  3710,  3714,  3718,  3722,  3726,
-    3730,  3739,  3752,  3753,  3754,  3755,  3756,  3760,  3761,  3762,
-    3765,  3783,  3800,  3817,  3820,  3836,  3839,  3856,  3859,  3865,
-    3868,  3875,  3878,  3885,  3902,  3943,  3987,  4026,  4051,  4060,
-    4090,  4116,  4142,  4174,  4201,  4227,  4253,  4279,  4305,  4327,
-    4333,  4339,  4345,  4351,  4357,  4383,  4409,  4426,  4443,  4460,
-    4472,  4478,  4484,  4496,  4500,  4510,  4521,  4522,  4523,  4527,
-    4533,  4545,  4563,  4591,  4592,  4593,  4594,  4595,  4596,  4597,
-    4598,  4599,  4606,  4607,  4608,  4609,  4610,  4611,  4612,  4613,
-    4614,  4615,  4616,  4617,  4618,  4619,  4620,  4621,  4622,  4623,
-    4624,  4625,  4626,  4627,  4628,  4629,  4630,  4631,  4632,  4633,
-    4634,  4635,  4636,  4637,  4638,  4639,  4648,  4649,  4650,  4651,
-    4652,  4653,  4654,  4655,  4656,  4657,  4658,  4663,  4662,  4670,
-    4672,  4677,  4683,  4703,  4721,  4739,  4744,  4750,  4766,  4772,
-    4778,  4797,  4818,  4851,  4873,  4878,  4883,  4893,  4903,  4908,
-    4919,  4928,  4933,  4938,  4967,  4966,  4983,  4985,  4990,  4999,
-    5001,  5007,  5008,  5014,  5018,  5022,  5026,  5030,  5037,  5041,
-    5045,  5049,  5056,  5061,  5068,  5073,  5077,  5082,  5086,  5094,
-    5105,  5109,  5121,  5129,  5137,  5144,  5154,  5177,  5183,  5189,
-    5195,  5201,  5212,  5223,  5234,  5245,  5251,  5257,  5263,  5269,
-    5279,  5289,  5299,  5312,  5324,  5328,  5332,  5336,  5354,  5362,
-    5370,  5399,  5409,  5425,  5436,  5441,  5445,  5449,  5461,  5465,
-    5477,  5494,  5504,  5508,  5523,  5528,  5535,  5539,  5552,  5566,
-    5583,  5611,  5615,  5623,  5629,  5635,  5641,  5650,  5654,  5658,
-    5666,  5672,  5678,  5686,  5694,  5701,  5709,  5724,  5738,  5752,
-    5764,  5780,  5789,  5798,  5808,  5819,  5827,  5835,  5839,  5858,
-    5865,  5871,  5878,  5886,  5885,  5895,  5919,  5921,  5927,  5932,
-    5940,  5949,  5962,  5965,  5969
+       0,   246,   246,   247,   252,   254,   258,   259,   260,   261,
+     278,   279,   280,   281,   282,   283,   284,   285,   286,   287,
+     288,   289,   290,   291,   292,   293,   297,   301,   308,   313,
+     318,   332,   345,   358,   386,   400,   413,   426,   445,   450,
+     451,   452,   453,   454,   458,   460,   465,   467,   473,   577,
+     472,   595,   602,   613,   612,   630,   637,   648,   647,   664,
+     681,   704,   703,   717,   718,   719,   720,   721,   725,   726,
+     732,   732,   733,   733,   739,   740,   741,   742,   747,   753,
+     815,   830,   859,   869,   874,   882,   887,   895,   904,   909,
+     921,   938,   944,   953,   971,   989,   998,  1010,  1015,  1023,
+    1043,  1066,  1077,  1085,  1107,  1130,  1168,  1189,  1201,  1215,
+    1215,  1217,  1219,  1228,  1238,  1237,  1258,  1257,  1275,  1285,
+    1284,  1298,  1300,  1308,  1314,  1319,  1345,  1347,  1350,  1352,
+    1356,  1357,  1361,  1373,  1386,  1401,  1411,  1413,  1417,  1418,
+    1423,  1431,  1440,  1448,  1466,  1470,  1477,  1485,  1489,  1496,
+    1504,  1508,  1515,  1523,  1527,  1534,  1543,  1546,  1553,  1556,
+    1563,  1584,  1598,  1612,  1647,  1685,  1699,  1713,  1733,  1742,
+    1756,  1771,  1785,  1804,  1814,  1820,  1826,  1833,  1862,  1877,
+    1897,  1918,  1939,  1960,  1982,  2004,  2025,  2048,  2057,  2078,
+    2093,  2107,  2123,  2139,  2148,  2158,  2168,  2178,  2193,  2205,
+    2219,  2232,  2245,  2258,  2291,  2311,  2333,  2334,  2339,  2342,
+    2346,  2357,  2368,  2379,  2395,  2414,  2435,  2450,  2466,  2484,
+    2535,  2556,  2578,  2601,  2706,  2722,  2757,  2768,  2774,  2789,
+    2817,  2834,  2841,  2853,  2872,  2878,  2884,  2891,  2898,  2905,
+    2917,  2990,  3008,  3025,  3040,  3073,  3085,  3109,  3113,  3118,
+    3125,  3130,  3140,  3145,  3151,  3159,  3163,  3167,  3176,  3240,
+    3256,  3273,  3290,  3312,  3334,  3369,  3377,  3385,  3391,  3398,
+    3405,  3425,  3451,  3463,  3475,  3491,  3507,  3524,  3523,  3546,
+    3545,  3570,  3569,  3592,  3591,  3612,  3626,  3641,  3656,  3677,
+    3680,  3686,  3698,  3718,  3722,  3726,  3730,  3734,  3738,  3742,
+    3746,  3755,  3768,  3769,  3770,  3771,  3772,  3776,  3777,  3778,
+    3781,  3799,  3816,  3833,  3836,  3852,  3855,  3872,  3875,  3881,
+    3884,  3891,  3894,  3901,  3918,  3959,  4003,  4042,  4067,  4076,
+    4106,  4132,  4158,  4190,  4217,  4243,  4269,  4295,  4321,  4343,
+    4349,  4355,  4361,  4367,  4373,  4399,  4425,  4442,  4459,  4476,
+    4488,  4494,  4500,  4512,  4516,  4526,  4537,  4538,  4539,  4543,
+    4549,  4561,  4579,  4607,  4608,  4609,  4610,  4611,  4612,  4613,
+    4614,  4615,  4622,  4623,  4624,  4625,  4626,  4627,  4628,  4629,
+    4630,  4631,  4632,  4633,  4634,  4635,  4636,  4637,  4638,  4639,
+    4640,  4641,  4642,  4643,  4644,  4645,  4646,  4647,  4648,  4649,
+    4650,  4651,  4652,  4653,  4654,  4655,  4664,  4665,  4666,  4667,
+    4668,  4669,  4670,  4671,  4672,  4673,  4674,  4679,  4678,  4686,
+    4688,  4693,  4699,  4719,  4737,  4755,  4760,  4766,  4782,  4788,
+    4794,  4813,  4834,  4867,  4889,  4894,  4899,  4909,  4919,  4924,
+    4935,  4944,  4949,  4954,  4983,  4982,  5005,  5007,  5012,  5021,
+    5023,  5029,  5030,  5036,  5040,  5044,  5048,  5052,  5059,  5063,
+    5067,  5071,  5078,  5083,  5090,  5095,  5099,  5104,  5108,  5116,
+    5127,  5131,  5143,  5151,  5159,  5166,  5176,  5199,  5205,  5211,
+    5217,  5223,  5234,  5245,  5256,  5267,  5273,  5279,  5285,  5291,
+    5301,  5311,  5321,  5334,  5346,  5350,  5354,  5358,  5376,  5384,
+    5392,  5421,  5431,  5447,  5458,  5463,  5467,  5471,  5483,  5487,
+    5499,  5516,  5526,  5530,  5545,  5550,  5557,  5561,  5574,  5588,
+    5605,  5633,  5637,  5645,  5651,  5657,  5663,  5672,  5676,  5680,
+    5688,  5694,  5700,  5708,  5716,  5723,  5731,  5746,  5760,  5774,
+    5786,  5802,  5811,  5820,  5830,  5841,  5849,  5857,  5861,  5880,
+    5887,  5893,  5900,  5908,  5907,  5917,  5941,  5943,  5949,  5954,
+    5962,  5971,  5984,  5987,  5991
 };
 #endif
 
@@ -5875,27 +5883,27 @@ yyreduce:
   switch (yyn)
     {
         case 3:
-#line 239 "Gmsh.y"
+#line 247 "Gmsh.y"
     { yyerrok; return 1; ;}
     break;
 
   case 6:
-#line 250 "Gmsh.y"
+#line 258 "Gmsh.y"
     { return 1; ;}
     break;
 
   case 7:
-#line 251 "Gmsh.y"
+#line 259 "Gmsh.y"
     { return 1; ;}
     break;
 
   case 8:
-#line 252 "Gmsh.y"
+#line 260 "Gmsh.y"
     { return 1; ;}
     break;
 
   case 9:
-#line 254 "Gmsh.y"
+#line 262 "Gmsh.y"
     {
       factory = (yyvsp[(3) - (5)].c);
       if(factory == "OpenCASCADE"){
@@ -5915,101 +5923,101 @@ yyreduce:
     break;
 
   case 10:
-#line 270 "Gmsh.y"
+#line 278 "Gmsh.y"
     { return 1; ;}
     break;
 
   case 11:
-#line 271 "Gmsh.y"
+#line 279 "Gmsh.y"
     { List_Delete((yyvsp[(1) - (1)].l)); return 1; ;}
     break;
 
   case 12:
-#line 272 "Gmsh.y"
+#line 280 "Gmsh.y"
     { return 1; ;}
     break;
 
   case 13:
-#line 273 "Gmsh.y"
+#line 281 "Gmsh.y"
     { return 1; ;}
     break;
 
   case 14:
-#line 274 "Gmsh.y"
+#line 282 "Gmsh.y"
     { return 1; ;}
     break;
 
   case 15:
-#line 275 "Gmsh.y"
+#line 283 "Gmsh.y"
     { return 1; ;}
     break;
 
   case 16:
-#line 276 "Gmsh.y"
+#line 284 "Gmsh.y"
     { List_Delete((yyvsp[(1) - (1)].l)); return 1; ;}
     break;
 
   case 17:
-#line 277 "Gmsh.y"
+#line 285 "Gmsh.y"
     { List_Delete((yyvsp[(1) - (1)].l)); return 1; ;}
     break;
 
   case 18:
-#line 278 "Gmsh.y"
+#line 286 "Gmsh.y"
     { return 1; ;}
     break;
 
   case 19:
-#line 279 "Gmsh.y"
+#line 287 "Gmsh.y"
     { return 1; ;}
     break;
 
   case 20:
-#line 280 "Gmsh.y"
+#line 288 "Gmsh.y"
     { return 1; ;}
     break;
 
   case 21:
-#line 281 "Gmsh.y"
+#line 289 "Gmsh.y"
     { return 1; ;}
     break;
 
   case 22:
-#line 282 "Gmsh.y"
+#line 290 "Gmsh.y"
     { return 1; ;}
     break;
 
   case 23:
-#line 283 "Gmsh.y"
+#line 291 "Gmsh.y"
     { return 1; ;}
     break;
 
   case 24:
-#line 284 "Gmsh.y"
+#line 292 "Gmsh.y"
     { return 1; ;}
     break;
 
   case 25:
-#line 285 "Gmsh.y"
+#line 293 "Gmsh.y"
     { return 1; ;}
     break;
 
   case 26:
-#line 290 "Gmsh.y"
+#line 298 "Gmsh.y"
     {
       (yyval.c) = (char*)"w";
     ;}
     break;
 
   case 27:
-#line 294 "Gmsh.y"
+#line 302 "Gmsh.y"
     {
       (yyval.c) = (char*)"a";
     ;}
     break;
 
   case 28:
-#line 301 "Gmsh.y"
+#line 309 "Gmsh.y"
     {
       Msg::Direct((yyvsp[(3) - (5)].c));
       Free((yyvsp[(3) - (5)].c));
@@ -6017,7 +6025,7 @@ yyreduce:
     break;
 
   case 29:
-#line 306 "Gmsh.y"
+#line 314 "Gmsh.y"
     {
       Msg::Error((yyvsp[(3) - (5)].c));
       Free((yyvsp[(3) - (5)].c));
@@ -6025,7 +6033,7 @@ yyreduce:
     break;
 
   case 30:
-#line 311 "Gmsh.y"
+#line 319 "Gmsh.y"
     {
       std::string tmp = FixRelativePath(gmsh_yyname, (yyvsp[(6) - (7)].c));
       FILE *fp = Fopen(tmp.c_str(), (yyvsp[(5) - (7)].c));
@@ -6042,7 +6050,7 @@ yyreduce:
     break;
 
   case 31:
-#line 325 "Gmsh.y"
+#line 333 "Gmsh.y"
     {
       char tmpstring[5000];
       int i = printListOfDouble((yyvsp[(3) - (7)].c), (yyvsp[(5) - (7)].l), tmpstring);
@@ -6058,7 +6066,7 @@ yyreduce:
     break;
 
   case 32:
-#line 338 "Gmsh.y"
+#line 346 "Gmsh.y"
     {
       char tmpstring[5000];
       int i = printListOfDouble((yyvsp[(3) - (7)].c), (yyvsp[(5) - (7)].l), tmpstring);
@@ -6074,7 +6082,7 @@ yyreduce:
     break;
 
   case 33:
-#line 351 "Gmsh.y"
+#line 359 "Gmsh.y"
     {
       char tmpstring[5000];
       int i = printListOfDouble((yyvsp[(3) - (9)].c), (yyvsp[(5) - (9)].l), tmpstring);
@@ -6100,7 +6108,7 @@ yyreduce:
     break;
 
   case 34:
-#line 379 "Gmsh.y"
+#line 387 "Gmsh.y"
     {
 #if defined(HAVE_POST)
       if(!strcmp((yyvsp[(1) - (6)].c), "View") && ViewData->finalize()){
@@ -6117,7 +6125,7 @@ yyreduce:
     break;
 
   case 35:
-#line 393 "Gmsh.y"
+#line 401 "Gmsh.y"
     {
 #if defined(HAVE_POST)
       if(!strcmp((yyvsp[(2) - (6)].c), "View")){
@@ -6133,7 +6141,7 @@ yyreduce:
     break;
 
   case 36:
-#line 406 "Gmsh.y"
+#line 414 "Gmsh.y"
     {
 #if defined(HAVE_POST)
       if(!strcmp((yyvsp[(2) - (6)].c), "View")){
@@ -6149,7 +6157,7 @@ yyreduce:
     break;
 
   case 37:
-#line 419 "Gmsh.y"
+#line 427 "Gmsh.y"
     {
 #if defined(HAVE_POST)
       if(!strcmp((yyvsp[(2) - (8)].c), "View")){
@@ -6167,7 +6175,7 @@ yyreduce:
     break;
 
   case 38:
-#line 437 "Gmsh.y"
+#line 445 "Gmsh.y"
     {
 #if defined(HAVE_POST)
       ViewData = new PViewDataList();
@@ -6176,27 +6184,27 @@ yyreduce:
     break;
 
   case 44:
-#line 451 "Gmsh.y"
+#line 459 "Gmsh.y"
     { ViewCoord.push_back((yyvsp[(1) - (1)].d)); ;}
     break;
 
   case 45:
-#line 453 "Gmsh.y"
+#line 461 "Gmsh.y"
     { ViewCoord.push_back((yyvsp[(3) - (3)].d)); ;}
     break;
 
   case 46:
-#line 458 "Gmsh.y"
+#line 466 "Gmsh.y"
     { if(ViewValueList) ViewValueList->push_back((yyvsp[(1) - (1)].d)); ;}
     break;
 
   case 47:
-#line 460 "Gmsh.y"
+#line 468 "Gmsh.y"
     { if(ViewValueList) ViewValueList->push_back((yyvsp[(3) - (3)].d)); ;}
     break;
 
   case 48:
-#line 465 "Gmsh.y"
+#line 473 "Gmsh.y"
     {
 #if defined(HAVE_POST)
       if(!strncmp((yyvsp[(1) - (1)].c), "SP", 2)){
@@ -6303,7 +6311,7 @@ yyreduce:
     break;
 
   case 49:
-#line 569 "Gmsh.y"
+#line 577 "Gmsh.y"
     {
 #if defined(HAVE_POST)
       if(ViewValueList){
@@ -6316,7 +6324,7 @@ yyreduce:
     break;
 
   case 50:
-#line 579 "Gmsh.y"
+#line 587 "Gmsh.y"
     {
 #if defined(HAVE_POST)
       if(ViewValueList) (*ViewNumList)++;
@@ -6325,7 +6333,7 @@ yyreduce:
     break;
 
   case 51:
-#line 588 "Gmsh.y"
+#line 596 "Gmsh.y"
     {
 #if defined(HAVE_POST)
       for(int i = 0; i < (int)strlen((yyvsp[(1) - (1)].c)) + 1; i++) ViewData->T2C.push_back((yyvsp[(1) - (1)].c)[i]);
@@ -6335,7 +6343,7 @@ yyreduce:
     break;
 
   case 52:
-#line 595 "Gmsh.y"
+#line 603 "Gmsh.y"
     {
 #if defined(HAVE_POST)
       for(int i = 0; i < (int)strlen((yyvsp[(3) - (3)].c)) + 1; i++) ViewData->T2C.push_back((yyvsp[(3) - (3)].c)[i]);
@@ -6345,7 +6353,7 @@ yyreduce:
     break;
 
   case 53:
-#line 605 "Gmsh.y"
+#line 613 "Gmsh.y"
     {
 #if defined(HAVE_POST)
       ViewData->T2D.push_back((yyvsp[(3) - (8)].d));
@@ -6357,7 +6365,7 @@ yyreduce:
     break;
 
   case 54:
-#line 614 "Gmsh.y"
+#line 622 "Gmsh.y"
     {
 #if defined(HAVE_POST)
       ViewData->NbT2++;
@@ -6366,7 +6374,7 @@ yyreduce:
     break;
 
   case 55:
-#line 623 "Gmsh.y"
+#line 631 "Gmsh.y"
     {
 #if defined(HAVE_POST)
       for(int i = 0; i < (int)strlen((yyvsp[(1) - (1)].c)) + 1; i++) ViewData->T3C.push_back((yyvsp[(1) - (1)].c)[i]);
@@ -6376,7 +6384,7 @@ yyreduce:
     break;
 
   case 56:
-#line 630 "Gmsh.y"
+#line 638 "Gmsh.y"
     {
 #if defined(HAVE_POST)
       for(int i = 0; i < (int)strlen((yyvsp[(3) - (3)].c)) + 1; i++) ViewData->T3C.push_back((yyvsp[(3) - (3)].c)[i]);
@@ -6386,7 +6394,7 @@ yyreduce:
     break;
 
   case 57:
-#line 640 "Gmsh.y"
+#line 648 "Gmsh.y"
     {
 #if defined(HAVE_POST)
       ViewData->T3D.push_back((yyvsp[(3) - (10)].d)); ViewData->T3D.push_back((yyvsp[(5) - (10)].d));
@@ -6397,7 +6405,7 @@ yyreduce:
     break;
 
   case 58:
-#line 648 "Gmsh.y"
+#line 656 "Gmsh.y"
     {
 #if defined(HAVE_POST)
       ViewData->NbT3++;
@@ -6406,7 +6414,7 @@ yyreduce:
     break;
 
   case 59:
-#line 658 "Gmsh.y"
+#line 666 "Gmsh.y"
     {
 #if defined(HAVE_POST)
       int type =
@@ -6425,7 +6433,7 @@ yyreduce:
     break;
 
   case 60:
-#line 677 "Gmsh.y"
+#line 685 "Gmsh.y"
     {
 #if defined(HAVE_POST)
       int type =
@@ -6444,7 +6452,7 @@ yyreduce:
     break;
 
   case 61:
-#line 696 "Gmsh.y"
+#line 704 "Gmsh.y"
     {
 #if defined(HAVE_POST)
       ViewValueList = &ViewData->Time;
@@ -6453,68 +6461,68 @@ yyreduce:
     break;
 
   case 62:
-#line 702 "Gmsh.y"
+#line 710 "Gmsh.y"
     {
     ;}
     break;
 
   case 63:
-#line 709 "Gmsh.y"
+#line 717 "Gmsh.y"
     { (yyval.i) = 0; ;}
     break;
 
   case 64:
-#line 710 "Gmsh.y"
+#line 718 "Gmsh.y"
     { (yyval.i) = 1; ;}
     break;
 
   case 65:
-#line 711 "Gmsh.y"
+#line 719 "Gmsh.y"
     { (yyval.i) = 2; ;}
     break;
 
   case 66:
-#line 712 "Gmsh.y"
+#line 720 "Gmsh.y"
     { (yyval.i) = 3; ;}
     break;
 
   case 67:
-#line 713 "Gmsh.y"
+#line 721 "Gmsh.y"
     { (yyval.i) = 4; ;}
     break;
 
   case 68:
-#line 717 "Gmsh.y"
+#line 725 "Gmsh.y"
     { (yyval.i) = 1; ;}
     break;
 
   case 69:
-#line 718 "Gmsh.y"
+#line 726 "Gmsh.y"
     { (yyval.i) = -1; ;}
     break;
 
   case 70:
-#line 724 "Gmsh.y"
+#line 732 "Gmsh.y"
     { (yyval.c) = (char*)"("; ;}
     break;
 
   case 71:
-#line 724 "Gmsh.y"
+#line 732 "Gmsh.y"
     { (yyval.c) = (char*)"["; ;}
     break;
 
   case 72:
-#line 725 "Gmsh.y"
+#line 733 "Gmsh.y"
     { (yyval.c) = (char*)")"; ;}
     break;
 
   case 73:
-#line 725 "Gmsh.y"
+#line 733 "Gmsh.y"
     { (yyval.c) = (char*)"]"; ;}
     break;
 
   case 77:
-#line 735 "Gmsh.y"
+#line 743 "Gmsh.y"
     {
       Msg::SetOnelabNumber((yyvsp[(3) - (7)].c), (yyvsp[(5) - (7)].d));
       Free((yyvsp[(3) - (7)].c));
@@ -6522,7 +6530,7 @@ yyreduce:
     break;
 
   case 78:
-#line 740 "Gmsh.y"
+#line 748 "Gmsh.y"
     {
       Msg::SetOnelabString((yyvsp[(3) - (7)].c), (yyvsp[(5) - (7)].c));
       Free((yyvsp[(3) - (7)].c));
@@ -6531,7 +6539,7 @@ yyreduce:
     break;
 
   case 79:
-#line 746 "Gmsh.y"
+#line 754 "Gmsh.y"
     {
       if(!gmsh_yysymbols.count((yyvsp[(1) - (4)].c)) && (yyvsp[(2) - (4)].i) && List_Nbr((yyvsp[(3) - (4)].l)) == 1){
         yymsg(0, "Unknown variable '%s'", (yyvsp[(1) - (4)].c));
@@ -6596,7 +6604,7 @@ yyreduce:
     break;
 
   case 80:
-#line 808 "Gmsh.y"
+#line 816 "Gmsh.y"
     {
       if(!gmsh_yysymbols.count((yyvsp[(1) - (3)].c)))
 	yymsg(0, "Unknown variable '%s'", (yyvsp[(1) - (3)].c));
@@ -6614,7 +6622,7 @@ yyreduce:
     break;
 
   case 81:
-#line 823 "Gmsh.y"
+#line 831 "Gmsh.y"
     {
       gmsh_yysymbol &s(gmsh_yysymbols[(yyvsp[(1) - (6)].c)]);
       s.list = true;
@@ -6646,7 +6654,7 @@ yyreduce:
     break;
 
   case 82:
-#line 852 "Gmsh.y"
+#line 860 "Gmsh.y"
     {
       assignVariables((yyvsp[(1) - (9)].c), (yyvsp[(4) - (9)].l), (yyvsp[(7) - (9)].i), (yyvsp[(8) - (9)].l));
       Free((yyvsp[(1) - (9)].c));
@@ -6656,7 +6664,7 @@ yyreduce:
     break;
 
   case 83:
-#line 862 "Gmsh.y"
+#line 870 "Gmsh.y"
     {
       assignVariable((yyvsp[(1) - (7)].c), (int)(yyvsp[(3) - (7)].d), (yyvsp[(5) - (7)].i), (yyvsp[(6) - (7)].d));
       Free((yyvsp[(1) - (7)].c));
@@ -6664,7 +6672,7 @@ yyreduce:
     break;
 
   case 84:
-#line 867 "Gmsh.y"
+#line 875 "Gmsh.y"
     {
       incrementVariable((yyvsp[(1) - (6)].c), (yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].i));
       Free((yyvsp[(1) - (6)].c));
@@ -6672,7 +6680,7 @@ yyreduce:
     break;
 
   case 85:
-#line 875 "Gmsh.y"
+#line 883 "Gmsh.y"
     {
       assignVariable((yyvsp[(1) - (7)].c), (int)(yyvsp[(3) - (7)].d), (yyvsp[(5) - (7)].i), (yyvsp[(6) - (7)].d));
       Free((yyvsp[(1) - (7)].c));
@@ -6680,7 +6688,7 @@ yyreduce:
     break;
 
   case 86:
-#line 880 "Gmsh.y"
+#line 888 "Gmsh.y"
     {
       incrementVariable((yyvsp[(1) - (6)].c), (yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].i));
       Free((yyvsp[(1) - (6)].c));
@@ -6688,7 +6696,7 @@ yyreduce:
     break;
 
   case 87:
-#line 888 "Gmsh.y"
+#line 896 "Gmsh.y"
     {
       gmsh_yystringsymbols[(yyvsp[(1) - (4)].c)] = std::vector<std::string>(1, (yyvsp[(3) - (4)].c));
       Free((yyvsp[(1) - (4)].c));
@@ -6697,7 +6705,7 @@ yyreduce:
     break;
 
   case 88:
-#line 897 "Gmsh.y"
+#line 905 "Gmsh.y"
     {
       gmsh_yystringsymbols[(yyvsp[(1) - (8)].c)] = std::vector<std::string>();
       Free((yyvsp[(1) - (8)].c));
@@ -6705,7 +6713,7 @@ yyreduce:
     break;
 
   case 89:
-#line 902 "Gmsh.y"
+#line 910 "Gmsh.y"
     {
       std::vector<std::string> s;
       for(int i = 0; i < List_Nbr((yyvsp[(7) - (9)].l)); i++){
@@ -6720,7 +6728,7 @@ yyreduce:
     break;
 
   case 90:
-#line 914 "Gmsh.y"
+#line 922 "Gmsh.y"
     {
       if(gmsh_yystringsymbols.count((yyvsp[(1) - (9)].c))){
         for(int i = 0; i < List_Nbr((yyvsp[(7) - (9)].l)); i++){
@@ -6737,7 +6745,7 @@ yyreduce:
     break;
 
   case 91:
-#line 931 "Gmsh.y"
+#line 939 "Gmsh.y"
     {
       std::string tmp((yyvsp[(5) - (6)].c));
       StringOption(GMSH_SET|GMSH_GUI, (yyvsp[(1) - (6)].c), 0, (yyvsp[(3) - (6)].c), tmp);
@@ -6746,7 +6754,7 @@ yyreduce:
     break;
 
   case 92:
-#line 937 "Gmsh.y"
+#line 945 "Gmsh.y"
     {
       std::string tmp((yyvsp[(8) - (9)].c));
       StringOption(GMSH_SET|GMSH_GUI, (yyvsp[(1) - (9)].c), (int)(yyvsp[(3) - (9)].d), (yyvsp[(6) - (9)].c), tmp);
@@ -6755,7 +6763,7 @@ yyreduce:
     break;
 
   case 93:
-#line 946 "Gmsh.y"
+#line 954 "Gmsh.y"
     {
       double d = 0.;
       if(NumberOption(GMSH_GET, (yyvsp[(1) - (6)].c), 0, (yyvsp[(3) - (6)].c), d)){
@@ -6776,7 +6784,7 @@ yyreduce:
     break;
 
   case 94:
-#line 964 "Gmsh.y"
+#line 972 "Gmsh.y"
     {
       double d = 0.;
       if(NumberOption(GMSH_GET, (yyvsp[(1) - (9)].c), (int)(yyvsp[(3) - (9)].d), (yyvsp[(6) - (9)].c), d)){
@@ -6797,7 +6805,7 @@ yyreduce:
     break;
 
   case 95:
-#line 982 "Gmsh.y"
+#line 990 "Gmsh.y"
     {
       double d = 0.;
       if(NumberOption(GMSH_GET, (yyvsp[(1) - (5)].c), 0, (yyvsp[(3) - (5)].c), d)){
@@ -6809,7 +6817,7 @@ yyreduce:
     break;
 
   case 96:
-#line 991 "Gmsh.y"
+#line 999 "Gmsh.y"
     {
       double d = 0.;
       if(NumberOption(GMSH_GET, (yyvsp[(1) - (8)].c), (int)(yyvsp[(3) - (8)].d), (yyvsp[(6) - (8)].c), d)){
@@ -6821,7 +6829,7 @@ yyreduce:
     break;
 
   case 97:
-#line 1003 "Gmsh.y"
+#line 1011 "Gmsh.y"
     {
       ColorOption(GMSH_SET|GMSH_GUI, (yyvsp[(1) - (8)].c), 0, (yyvsp[(5) - (8)].c), (yyvsp[(7) - (8)].u));
       Free((yyvsp[(1) - (8)].c)); Free((yyvsp[(5) - (8)].c));
@@ -6829,7 +6837,7 @@ yyreduce:
     break;
 
   case 98:
-#line 1008 "Gmsh.y"
+#line 1016 "Gmsh.y"
     {
       ColorOption(GMSH_SET|GMSH_GUI, (yyvsp[(1) - (11)].c), (int)(yyvsp[(3) - (11)].d), (yyvsp[(8) - (11)].c), (yyvsp[(10) - (11)].u));
       Free((yyvsp[(1) - (11)].c)); Free((yyvsp[(8) - (11)].c));
@@ -6837,7 +6845,7 @@ yyreduce:
     break;
 
   case 99:
-#line 1016 "Gmsh.y"
+#line 1024 "Gmsh.y"
     {
       GmshColorTable *ct = GetColorTable(0);
       if(!ct)
@@ -6860,7 +6868,7 @@ yyreduce:
     break;
 
   case 100:
-#line 1036 "Gmsh.y"
+#line 1044 "Gmsh.y"
     {
       GmshColorTable *ct = GetColorTable((int)(yyvsp[(3) - (9)].d));
       if(!ct)
@@ -6883,7 +6891,7 @@ yyreduce:
     break;
 
   case 101:
-#line 1059 "Gmsh.y"
+#line 1067 "Gmsh.y"
     {
 #if defined(HAVE_MESH)
       if(!strcmp((yyvsp[(1) - (5)].c),"Background"))
@@ -6897,7 +6905,7 @@ yyreduce:
     break;
 
   case 102:
-#line 1070 "Gmsh.y"
+#line 1078 "Gmsh.y"
     {
 #if defined(HAVE_MESH)
       if(!GModel::current()->getFields()->newField((int)(yyvsp[(3) - (7)].d), (yyvsp[(6) - (7)].c)))
@@ -6908,7 +6916,7 @@ yyreduce:
     break;
 
   case 103:
-#line 1078 "Gmsh.y"
+#line 1086 "Gmsh.y"
     {
 #if defined(HAVE_MESH)
       Field *field = GModel::current()->getFields()->get((int)(yyvsp[(3) - (9)].d));
@@ -6933,7 +6941,7 @@ yyreduce:
     break;
 
   case 104:
-#line 1100 "Gmsh.y"
+#line 1108 "Gmsh.y"
     {
 #if defined(HAVE_MESH)
       Field *field = GModel::current()->getFields()->get((int)(yyvsp[(3) - (9)].d));
@@ -6959,7 +6967,7 @@ yyreduce:
     break;
 
   case 105:
-#line 1123 "Gmsh.y"
+#line 1131 "Gmsh.y"
     {
 #if defined(HAVE_MESH)
       Field *field = GModel::current()->getFields()->get((int)(yyvsp[(3) - (11)].d));
@@ -7000,7 +7008,7 @@ yyreduce:
     break;
 
   case 106:
-#line 1161 "Gmsh.y"
+#line 1169 "Gmsh.y"
     {
 #if defined(HAVE_MESH)
       Field *field = GModel::current()->getFields()->get((int)(yyvsp[(3) - (7)].d));
@@ -7021,7 +7029,7 @@ yyreduce:
     break;
 
   case 107:
-#line 1182 "Gmsh.y"
+#line 1190 "Gmsh.y"
     {
 #if defined(HAVE_PLUGINS)
       try {
@@ -7036,7 +7044,7 @@ yyreduce:
     break;
 
   case 108:
-#line 1194 "Gmsh.y"
+#line 1202 "Gmsh.y"
     {
 #if defined(HAVE_PLUGINS)
       try {
@@ -7051,7 +7059,7 @@ yyreduce:
     break;
 
   case 112:
-#line 1212 "Gmsh.y"
+#line 1220 "Gmsh.y"
     {
       std::string key((yyvsp[(3) - (3)].c));
       std::vector<double> val(1, 0.);
@@ -7063,7 +7071,7 @@ yyreduce:
     break;
 
   case 113:
-#line 1221 "Gmsh.y"
+#line 1229 "Gmsh.y"
     {
       std::string key((yyvsp[(3) - (5)].c));
       std::vector<double> val(1, (yyvsp[(5) - (5)].d));
@@ -7075,12 +7083,12 @@ yyreduce:
     break;
 
   case 114:
-#line 1230 "Gmsh.y"
-    { floatOptions.clear(); charOptions.clear(); ;}
+#line 1238 "Gmsh.y"
+    { init_Options(); ;}
     break;
 
   case 115:
-#line 1232 "Gmsh.y"
+#line 1240 "Gmsh.y"
     {
       if(List_Nbr((yyvsp[(6) - (9)].l)) != 1)
 	yymsg(1, "List notation should be used to define list '%s[]'", (yyvsp[(3) - (9)].c));
@@ -7101,12 +7109,12 @@ yyreduce:
     break;
 
   case 116:
-#line 1250 "Gmsh.y"
-    { floatOptions.clear(); charOptions.clear(); ;}
+#line 1258 "Gmsh.y"
+    { init_Options(); ;}
     break;
 
   case 117:
-#line 1252 "Gmsh.y"
+#line 1260 "Gmsh.y"
     {
       std::string key((yyvsp[(3) - (11)].c));
       std::vector<double> val;
@@ -7125,7 +7133,7 @@ yyreduce:
     break;
 
   case 118:
-#line 1268 "Gmsh.y"
+#line 1276 "Gmsh.y"
     {
       std::string key((yyvsp[(3) - (5)].c)), val((yyvsp[(5) - (5)].c));
       if(!gmsh_yystringsymbols.count(key)){
@@ -7137,12 +7145,12 @@ yyreduce:
     break;
 
   case 119:
-#line 1277 "Gmsh.y"
-    { floatOptions.clear(); charOptions.clear(); ;}
+#line 1285 "Gmsh.y"
+    { init_Options(); ;}
     break;
 
   case 120:
-#line 1279 "Gmsh.y"
+#line 1287 "Gmsh.y"
     {
       std::string key((yyvsp[(3) - (9)].c)), val((yyvsp[(6) - (9)].c));
       if(!gmsh_yysymbols.count(key)){
@@ -7155,7 +7163,7 @@ yyreduce:
     break;
 
   case 122:
-#line 1293 "Gmsh.y"
+#line 1301 "Gmsh.y"
     {
       std::string name((yyvsp[(3) - (3)].c));
       Msg::UndefineOnelabParameter(name);
@@ -7164,7 +7172,7 @@ yyreduce:
     break;
 
   case 123:
-#line 1301 "Gmsh.y"
+#line 1309 "Gmsh.y"
     {
       (yyval.l) = List_Create(20,20,sizeof(doubleXstring));
       doubleXstring v = {(yyvsp[(1) - (3)].d), (yyvsp[(3) - (3)].c)};
@@ -7173,7 +7181,7 @@ yyreduce:
     break;
 
   case 124:
-#line 1307 "Gmsh.y"
+#line 1315 "Gmsh.y"
     {
       doubleXstring v = {(yyvsp[(3) - (5)].d), (yyvsp[(5) - (5)].c)};
       List_Add((yyval.l), &v);
@@ -7181,7 +7189,7 @@ yyreduce:
     break;
 
   case 125:
-#line 1312 "Gmsh.y"
+#line 1320 "Gmsh.y"
     {
       (yyval.l) = List_Create(20,20,sizeof(doubleXstring));
       int n = List_Nbr((yyvsp[(1) - (5)].l));
@@ -7208,13 +7216,14 @@ yyreduce:
     break;
 
   case 132:
-#line 1354 "Gmsh.y"
+#line 1362 "Gmsh.y"
     {
       std::string key((yyvsp[(1) - (2)].c));
       for(int i = 0; i < List_Nbr((yyvsp[(2) - (2)].l)); i++){
         double v;
         List_Read((yyvsp[(2) - (2)].l), i, &v);
         floatOptions[key].push_back(v);
+        if (flag_Enum && !i) { member_ValMax = (int)v; }
       }
       Free((yyvsp[(1) - (2)].c));
       List_Delete((yyvsp[(2) - (2)].l));
@@ -7222,16 +7231,23 @@ yyreduce:
     break;
 
   case 133:
-#line 1365 "Gmsh.y"
+#line 1374 "Gmsh.y"
     {
       std::string key((yyvsp[(1) - (1)].c));
-      floatOptions[key].push_back(1.);
+      double v;
+      if (!flag_Enum) {
+        v = 1.;
+        if (key == "Enum") flag_Enum = 1;
+      }
+      else
+        v = (double)++member_ValMax;
+      floatOptions[key].push_back(v);
       Free((yyvsp[(1) - (1)].c));
     ;}
     break;
 
   case 134:
-#line 1371 "Gmsh.y"
+#line 1387 "Gmsh.y"
     {
       std::string key((yyvsp[(1) - (4)].c));
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (4)].l)); i++){
@@ -7248,7 +7264,7 @@ yyreduce:
     break;
 
   case 135:
-#line 1386 "Gmsh.y"
+#line 1402 "Gmsh.y"
     {
       std::string key((yyvsp[(1) - (2)].c));
       std::string val((yyvsp[(2) - (2)].c));
@@ -7259,7 +7275,7 @@ yyreduce:
     break;
 
   case 140:
-#line 1408 "Gmsh.y"
+#line 1424 "Gmsh.y"
     {
       std::string key((yyvsp[(1) - (2)].c));
       double val = (yyvsp[(2) - (2)].d);
@@ -7269,7 +7285,7 @@ yyreduce:
     break;
 
   case 141:
-#line 1416 "Gmsh.y"
+#line 1432 "Gmsh.y"
     {
       std::string key((yyvsp[(1) - (2)].c));
       std::string val((yyvsp[(2) - (2)].c));
@@ -7280,7 +7296,7 @@ yyreduce:
     break;
 
   case 142:
-#line 1425 "Gmsh.y"
+#line 1441 "Gmsh.y"
     {
       std::string key("Macro");
       std::string val((yyvsp[(2) - (2)].c));
@@ -7290,7 +7306,7 @@ yyreduce:
     break;
 
   case 143:
-#line 1433 "Gmsh.y"
+#line 1449 "Gmsh.y"
     {
       std::string key((yyvsp[(1) - (4)].c));
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (4)].l)); i++){
@@ -7306,14 +7322,14 @@ yyreduce:
     break;
 
   case 144:
-#line 1451 "Gmsh.y"
+#line 1467 "Gmsh.y"
     {
       (yyval.i) = (int)(yyvsp[(1) - (1)].d);
     ;}
     break;
 
   case 145:
-#line 1455 "Gmsh.y"
+#line 1471 "Gmsh.y"
     {
       int t = GModel::current()->getGEOInternals()->getMaxPhysicalTag();
       GModel::current()->getGEOInternals()->setMaxPhysicalTag(t + 1);
@@ -7323,7 +7339,7 @@ yyreduce:
     break;
 
   case 146:
-#line 1462 "Gmsh.y"
+#line 1478 "Gmsh.y"
     {
       (yyval.i) = GModel::current()->setPhysicalName(std::string((yyvsp[(1) - (3)].c)), 0, (yyvsp[(3) - (3)].d));
       Free((yyvsp[(1) - (3)].c));
@@ -7331,14 +7347,14 @@ yyreduce:
     break;
 
   case 147:
-#line 1470 "Gmsh.y"
+#line 1486 "Gmsh.y"
     {
       (yyval.i) = (int)(yyvsp[(1) - (1)].d);
     ;}
     break;
 
   case 148:
-#line 1474 "Gmsh.y"
+#line 1490 "Gmsh.y"
     {
       int t = GModel::current()->getGEOInternals()->getMaxPhysicalTag();
       GModel::current()->getGEOInternals()->setMaxPhysicalTag(t + 1);
@@ -7348,7 +7364,7 @@ yyreduce:
     break;
 
   case 149:
-#line 1481 "Gmsh.y"
+#line 1497 "Gmsh.y"
     {
       (yyval.i) = GModel::current()->setPhysicalName(std::string((yyvsp[(1) - (3)].c)), 1, (yyvsp[(3) - (3)].d));
       Free((yyvsp[(1) - (3)].c));
@@ -7356,14 +7372,14 @@ yyreduce:
     break;
 
   case 150:
-#line 1489 "Gmsh.y"
+#line 1505 "Gmsh.y"
     {
       (yyval.i) = (int)(yyvsp[(1) - (1)].d);
     ;}
     break;
 
   case 151:
-#line 1493 "Gmsh.y"
+#line 1509 "Gmsh.y"
     {
       int t = GModel::current()->getGEOInternals()->getMaxPhysicalTag();
       GModel::current()->getGEOInternals()->setMaxPhysicalTag(t + 1);
@@ -7373,7 +7389,7 @@ yyreduce:
     break;
 
   case 152:
-#line 1500 "Gmsh.y"
+#line 1516 "Gmsh.y"
     {
       (yyval.i) = GModel::current()->setPhysicalName(std::string((yyvsp[(1) - (3)].c)), 2, (yyvsp[(3) - (3)].d));
       Free((yyvsp[(1) - (3)].c));
@@ -7381,14 +7397,14 @@ yyreduce:
     break;
 
   case 153:
-#line 1508 "Gmsh.y"
+#line 1524 "Gmsh.y"
     {
       (yyval.i) = (int)(yyvsp[(1) - (1)].d);
     ;}
     break;
 
   case 154:
-#line 1512 "Gmsh.y"
+#line 1528 "Gmsh.y"
     {
       int t = GModel::current()->getGEOInternals()->getMaxPhysicalTag();
       GModel::current()->getGEOInternals()->setMaxPhysicalTag(t + 1);
@@ -7398,7 +7414,7 @@ yyreduce:
     break;
 
   case 155:
-#line 1519 "Gmsh.y"
+#line 1535 "Gmsh.y"
     {
       (yyval.i) = GModel::current()->setPhysicalName(std::string((yyvsp[(1) - (3)].c)), 3, (yyvsp[(3) - (3)].d));
       Free((yyvsp[(1) - (3)].c));
@@ -7406,35 +7422,35 @@ yyreduce:
     break;
 
   case 156:
-#line 1527 "Gmsh.y"
+#line 1543 "Gmsh.y"
     {
       (yyval.i) = -1;
     ;}
     break;
 
   case 157:
-#line 1531 "Gmsh.y"
+#line 1547 "Gmsh.y"
     {
       (yyval.i) = (int)(yyvsp[(4) - (5)].d);
     ;}
     break;
 
   case 158:
-#line 1537 "Gmsh.y"
+#line 1553 "Gmsh.y"
     {
       for(int i = 0; i < 4; i++) (yyval.v)[i] = 0.;
     ;}
     break;
 
   case 159:
-#line 1541 "Gmsh.y"
+#line 1557 "Gmsh.y"
     {
       for(int i = 0; i < 4; i++) (yyval.v)[i] = (yyvsp[(2) - (2)].v)[i];
     ;}
     break;
 
   case 160:
-#line 1548 "Gmsh.y"
+#line 1564 "Gmsh.y"
     {
       int num = (int)(yyvsp[(3) - (7)].d);
       double x = CTX::instance()->geom.scalingFactor * (yyvsp[(6) - (7)].v)[0];
@@ -7458,7 +7474,7 @@ yyreduce:
     break;
 
   case 161:
-#line 1569 "Gmsh.y"
+#line 1585 "Gmsh.y"
     {
       int num = (int)(yyvsp[(3) - (7)].d);
       std::vector<int> tags; ListOfDouble2Vector((yyvsp[(6) - (7)].l), tags);
@@ -7475,7 +7491,7 @@ yyreduce:
     break;
 
   case 162:
-#line 1583 "Gmsh.y"
+#line 1599 "Gmsh.y"
     {
       int num = (int)(yyvsp[(3) - (7)].d);
       std::vector<int> tags; ListOfDouble2Vector((yyvsp[(6) - (7)].l), tags);
@@ -7492,7 +7508,7 @@ yyreduce:
     break;
 
   case 163:
-#line 1597 "Gmsh.y"
+#line 1613 "Gmsh.y"
     {
       int num = (int)(yyvsp[(3) - (8)].d);
       std::vector<int> tags; ListOfDouble2Vector((yyvsp[(6) - (8)].l), tags);
@@ -7530,7 +7546,7 @@ yyreduce:
     break;
 
   case 164:
-#line 1632 "Gmsh.y"
+#line 1648 "Gmsh.y"
     {
       int num = (int)(yyvsp[(3) - (8)].d);
       std::vector<int> tags; ListOfDouble2Vector((yyvsp[(6) - (8)].l), tags);
@@ -7571,7 +7587,7 @@ yyreduce:
     break;
 
   case 165:
-#line 1670 "Gmsh.y"
+#line 1686 "Gmsh.y"
     {
       int num = (int)(yyvsp[(3) - (7)].d);
       std::vector<int> tags; ListOfDouble2Vector((yyvsp[(6) - (7)].l), tags);
@@ -7588,7 +7604,7 @@ yyreduce:
     break;
 
   case 166:
-#line 1684 "Gmsh.y"
+#line 1700 "Gmsh.y"
     {
       int num = (int)(yyvsp[(3) - (7)].d);
       std::vector<int> tags; ListOfDouble2Vector((yyvsp[(6) - (7)].l), tags);
@@ -7605,7 +7621,7 @@ yyreduce:
     break;
 
   case 167:
-#line 1699 "Gmsh.y"
+#line 1715 "Gmsh.y"
     {
       int num = (int)(yyvsp[(3) - (11)].d);
       std::vector<int> tags; ListOfDouble2Vector((yyvsp[(6) - (11)].l), tags);
@@ -7627,7 +7643,7 @@ yyreduce:
     break;
 
   case 168:
-#line 1718 "Gmsh.y"
+#line 1734 "Gmsh.y"
     {
       int num = (int)(yyvsp[(4) - (8)].d);
       std::vector<int> tags; ListOfDouble2Vector((yyvsp[(7) - (8)].l), tags);
@@ -7639,7 +7655,7 @@ yyreduce:
     break;
 
   case 169:
-#line 1727 "Gmsh.y"
+#line 1743 "Gmsh.y"
     {
       int num = (int)(yyvsp[(3) - (7)].d);
       std::vector<int> tags; ListOfDouble2Vector((yyvsp[(6) - (7)].l), tags);
@@ -7656,7 +7672,7 @@ yyreduce:
     break;
 
   case 170:
-#line 1741 "Gmsh.y"
+#line 1757 "Gmsh.y"
     {
       int num = (int)(yyvsp[(4) - (8)].d);
       std::vector<int> tags; ListOfDouble2Vector((yyvsp[(7) - (8)].l), tags);
@@ -7674,7 +7690,7 @@ yyreduce:
     break;
 
   case 171:
-#line 1756 "Gmsh.y"
+#line 1772 "Gmsh.y"
     {
       int num = (int)(yyvsp[(4) - (8)].d);
       std::vector<int> tags; ListOfDouble2Vector((yyvsp[(7) - (8)].l), tags);
@@ -7691,7 +7707,7 @@ yyreduce:
     break;
 
   case 172:
-#line 1770 "Gmsh.y"
+#line 1786 "Gmsh.y"
     {
       int num = (int)(yyvsp[(3) - (8)].d);
       std::vector<int> wires; ListOfDouble2Vector((yyvsp[(6) - (8)].l), wires);
@@ -7713,7 +7729,7 @@ yyreduce:
     break;
 
   case 173:
-#line 1789 "Gmsh.y"
+#line 1805 "Gmsh.y"
     {
       yymsg(2, "'Ruled Surface' command is deprecated: use 'Surface' instead");
       int num = (int)(yyvsp[(4) - (9)].d);
@@ -7726,7 +7742,7 @@ yyreduce:
     break;
 
   case 174:
-#line 1799 "Gmsh.y"
+#line 1815 "Gmsh.y"
     {
       myGmshSurface = 0;
       (yyval.s).Type = 0;
@@ -7735,7 +7751,7 @@ yyreduce:
     break;
 
   case 175:
-#line 1805 "Gmsh.y"
+#line 1821 "Gmsh.y"
     {
       myGmshSurface = gmshSurface::getSurface((int)(yyvsp[(3) - (4)].d));
       (yyval.s).Type = 0;
@@ -7744,7 +7760,7 @@ yyreduce:
     break;
 
   case 176:
-#line 1811 "Gmsh.y"
+#line 1827 "Gmsh.y"
     {
       int num = (int)(yyvsp[(4) - (10)].d);
       myGmshSurface = gmshParametricSurface::NewParametricSurface(num, (yyvsp[(7) - (10)].c), (yyvsp[(8) - (10)].c), (yyvsp[(9) - (10)].c));
@@ -7754,7 +7770,7 @@ yyreduce:
     break;
 
   case 177:
-#line 1818 "Gmsh.y"
+#line 1834 "Gmsh.y"
     {
       int num = (int)(yyvsp[(3) - (7)].d);
       std::vector<int> tags; ListOfDouble2Vector((yyvsp[(6) - (7)].l), tags);
@@ -7786,7 +7802,7 @@ yyreduce:
     break;
 
   case 178:
-#line 1847 "Gmsh.y"
+#line 1863 "Gmsh.y"
     {
       int num = (int)(yyvsp[(3) - (7)].d);
       std::vector<int> tags; ListOfDouble2Vector((yyvsp[(6) - (7)].l), tags);
@@ -7804,7 +7820,7 @@ yyreduce:
     break;
 
   case 179:
-#line 1862 "Gmsh.y"
+#line 1878 "Gmsh.y"
     {
       int num = (int)(yyvsp[(3) - (7)].d);
       std::vector<double> param; ListOfDouble2Vector((yyvsp[(6) - (7)].l), param);
@@ -7827,7 +7843,7 @@ yyreduce:
     break;
 
   case 180:
-#line 1882 "Gmsh.y"
+#line 1898 "Gmsh.y"
     {
       int num = (int)(yyvsp[(3) - (7)].d);
       std::vector<double> param; ListOfDouble2Vector((yyvsp[(6) - (7)].l), param);
@@ -7851,7 +7867,7 @@ yyreduce:
     break;
 
   case 181:
-#line 1903 "Gmsh.y"
+#line 1919 "Gmsh.y"
     {
       int num = (int)(yyvsp[(3) - (7)].d);
       std::vector<double> param; ListOfDouble2Vector((yyvsp[(6) - (7)].l), param);
@@ -7875,7 +7891,7 @@ yyreduce:
     break;
 
   case 182:
-#line 1924 "Gmsh.y"
+#line 1940 "Gmsh.y"
     {
       int num = (int)(yyvsp[(3) - (7)].d);
       std::vector<double> param; ListOfDouble2Vector((yyvsp[(6) - (7)].l), param);
@@ -7899,7 +7915,7 @@ yyreduce:
     break;
 
   case 183:
-#line 1945 "Gmsh.y"
+#line 1961 "Gmsh.y"
     {
       int num = (int)(yyvsp[(3) - (7)].d);
       std::vector<double> param; ListOfDouble2Vector((yyvsp[(6) - (7)].l), param);
@@ -7924,7 +7940,7 @@ yyreduce:
     break;
 
   case 184:
-#line 1967 "Gmsh.y"
+#line 1983 "Gmsh.y"
     {
       int num = (int)(yyvsp[(3) - (7)].d);
       std::vector<double> param; ListOfDouble2Vector((yyvsp[(6) - (7)].l), param);
@@ -7949,7 +7965,7 @@ yyreduce:
     break;
 
   case 185:
-#line 1989 "Gmsh.y"
+#line 2005 "Gmsh.y"
     {
       int num = (int)(yyvsp[(3) - (7)].d);
       std::vector<double> param; ListOfDouble2Vector((yyvsp[(6) - (7)].l), param);
@@ -7973,7 +7989,7 @@ yyreduce:
     break;
 
   case 186:
-#line 2010 "Gmsh.y"
+#line 2026 "Gmsh.y"
     {
       int num = (int)(yyvsp[(3) - (7)].d);
       std::vector<double> param; ListOfDouble2Vector((yyvsp[(6) - (7)].l), param);
@@ -7999,7 +8015,7 @@ yyreduce:
     break;
 
   case 187:
-#line 2033 "Gmsh.y"
+#line 2049 "Gmsh.y"
     {
       int num = (int)(yyvsp[(4) - (8)].d);
       std::vector<int> tags; ListOfDouble2Vector((yyvsp[(7) - (8)].l), tags);
@@ -8011,7 +8027,7 @@ yyreduce:
     break;
 
   case 188:
-#line 2043 "Gmsh.y"
+#line 2059 "Gmsh.y"
     {
       int num = (int)(yyvsp[(4) - (12)].d);
       std::vector<int> tags; ListOfDouble2Vector((yyvsp[(7) - (12)].l), tags);
@@ -8034,7 +8050,7 @@ yyreduce:
     break;
 
   case 189:
-#line 2063 "Gmsh.y"
+#line 2079 "Gmsh.y"
     {
       int num = (int)(yyvsp[(4) - (8)].d);
       std::vector<int> tags; ListOfDouble2Vector((yyvsp[(7) - (8)].l), tags);
@@ -8052,7 +8068,7 @@ yyreduce:
     break;
 
   case 190:
-#line 2078 "Gmsh.y"
+#line 2094 "Gmsh.y"
     {
       int num = (int)(yyvsp[(3) - (7)].d);
       std::vector<int> tags; ListOfDouble2Vector((yyvsp[(6) - (7)].l), tags);
@@ -8069,7 +8085,7 @@ yyreduce:
     break;
 
   case 191:
-#line 2092 "Gmsh.y"
+#line 2108 "Gmsh.y"
     {
       int num = (int)(yyvsp[(3) - (7)].d);
       std::vector<int> wires; ListOfDouble2Vector((yyvsp[(6) - (7)].l), wires);
@@ -8088,7 +8104,7 @@ yyreduce:
     break;
 
   case 192:
-#line 2108 "Gmsh.y"
+#line 2124 "Gmsh.y"
     {
       int num = (int)(yyvsp[(4) - (8)].d);
       std::vector<int> wires; ListOfDouble2Vector((yyvsp[(7) - (8)].l), wires);
@@ -8107,7 +8123,7 @@ yyreduce:
     break;
 
   case 193:
-#line 2124 "Gmsh.y"
+#line 2140 "Gmsh.y"
     {
       int num = (int)(yyvsp[(4) - (8)].d);
       std::vector<int> tags; ListOfDouble2Vector((yyvsp[(7) - (8)].l), tags);
@@ -8119,7 +8135,7 @@ yyreduce:
     break;
 
   case 194:
-#line 2133 "Gmsh.y"
+#line 2149 "Gmsh.y"
     {
       int num = (int)(yyvsp[(4) - (8)].i);
       int op = (yyvsp[(6) - (8)].i);
@@ -8132,7 +8148,7 @@ yyreduce:
     break;
 
   case 195:
-#line 2143 "Gmsh.y"
+#line 2159 "Gmsh.y"
     {
       int num = (int)(yyvsp[(4) - (8)].i);
       int op = (yyvsp[(6) - (8)].i);
@@ -8145,7 +8161,7 @@ yyreduce:
     break;
 
   case 196:
-#line 2153 "Gmsh.y"
+#line 2169 "Gmsh.y"
     {
       int num = (int)(yyvsp[(4) - (8)].i);
       int op = (yyvsp[(6) - (8)].i);
@@ -8158,7 +8174,7 @@ yyreduce:
     break;
 
   case 197:
-#line 2163 "Gmsh.y"
+#line 2179 "Gmsh.y"
     {
       int num = (int)(yyvsp[(4) - (8)].i);
       int op = (yyvsp[(6) - (8)].i);
@@ -8171,7 +8187,7 @@ yyreduce:
     break;
 
   case 198:
-#line 2178 "Gmsh.y"
+#line 2194 "Gmsh.y"
     {
       std::vector<std::pair<int, int> > dimTags;
       ListOfShapes2VectorOfPairs((yyvsp[(4) - (5)].l), dimTags);
@@ -8186,7 +8202,7 @@ yyreduce:
     break;
 
   case 199:
-#line 2190 "Gmsh.y"
+#line 2206 "Gmsh.y"
     {
       std::vector<std::pair<int, int> > dimTags;
       ListOfShapes2VectorOfPairs((yyvsp[(10) - (11)].l), dimTags);
@@ -8203,7 +8219,7 @@ yyreduce:
     break;
 
   case 200:
-#line 2204 "Gmsh.y"
+#line 2220 "Gmsh.y"
     {
       std::vector<std::pair<int, int> > dimTags;
       ListOfShapes2VectorOfPairs((yyvsp[(4) - (5)].l), dimTags);
@@ -8219,7 +8235,7 @@ yyreduce:
     break;
 
   case 201:
-#line 2217 "Gmsh.y"
+#line 2233 "Gmsh.y"
     {
       std::vector<std::pair<int, int> > dimTags;
       ListOfShapes2VectorOfPairs((yyvsp[(8) - (9)].l), dimTags);
@@ -8235,7 +8251,7 @@ yyreduce:
     break;
 
   case 202:
-#line 2230 "Gmsh.y"
+#line 2246 "Gmsh.y"
     {
       std::vector<std::pair<int, int> > dimTags;
       ListOfShapes2VectorOfPairs((yyvsp[(8) - (9)].l), dimTags);
@@ -8251,7 +8267,7 @@ yyreduce:
     break;
 
   case 203:
-#line 2243 "Gmsh.y"
+#line 2259 "Gmsh.y"
     {
       std::vector<std::pair<int, int> > inDimTags, outDimTags;
       ListOfShapes2VectorOfPairs((yyvsp[(3) - (4)].l), inDimTags);
@@ -8287,7 +8303,7 @@ yyreduce:
     break;
 
   case 204:
-#line 2276 "Gmsh.y"
+#line 2292 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       if(factory == "OpenCASCADE"){
@@ -8309,7 +8325,7 @@ yyreduce:
     break;
 
   case 205:
-#line 2296 "Gmsh.y"
+#line 2312 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       if(factory == "OpenCASCADE"){
@@ -8331,31 +8347,31 @@ yyreduce:
     break;
 
   case 206:
-#line 2317 "Gmsh.y"
+#line 2333 "Gmsh.y"
     { (yyval.l) = (yyvsp[(1) - (1)].l); ;}
     break;
 
   case 207:
-#line 2318 "Gmsh.y"
+#line 2334 "Gmsh.y"
     { (yyval.l) = (yyvsp[(1) - (1)].l); ;}
     break;
 
   case 208:
-#line 2323 "Gmsh.y"
+#line 2339 "Gmsh.y"
     {
       (yyval.l) = List_Create(3, 3, sizeof(Shape));
     ;}
     break;
 
   case 209:
-#line 2327 "Gmsh.y"
+#line 2343 "Gmsh.y"
     {
       List_Add((yyval.l), &(yyvsp[(2) - (2)].s));
     ;}
     break;
 
   case 210:
-#line 2331 "Gmsh.y"
+#line 2347 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(4) - (6)].l)); i++){
 	double d;
@@ -8369,7 +8385,7 @@ yyreduce:
     break;
 
   case 211:
-#line 2342 "Gmsh.y"
+#line 2358 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(4) - (6)].l)); i++){
 	double d;
@@ -8383,7 +8399,7 @@ yyreduce:
     break;
 
   case 212:
-#line 2353 "Gmsh.y"
+#line 2369 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(4) - (6)].l)); i++){
 	double d;
@@ -8397,7 +8413,7 @@ yyreduce:
     break;
 
   case 213:
-#line 2364 "Gmsh.y"
+#line 2380 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(4) - (6)].l)); i++){
 	double d;
@@ -8411,7 +8427,7 @@ yyreduce:
     break;
 
   case 214:
-#line 2380 "Gmsh.y"
+#line 2396 "Gmsh.y"
     {
       if(List_Nbr((yyvsp[(7) - (8)].l)) == 4){
         int t = (int)(yyvsp[(4) - (8)].d);
@@ -8433,7 +8449,7 @@ yyreduce:
     break;
 
   case 215:
-#line 2399 "Gmsh.y"
+#line 2415 "Gmsh.y"
     {
       int t = (int)(yyvsp[(4) - (10)].d);
       if(gLevelset::find(t)){
@@ -8457,7 +8473,7 @@ yyreduce:
     break;
 
   case 216:
-#line 2421 "Gmsh.y"
+#line 2437 "Gmsh.y"
     {
       int t = (int)(yyvsp[(4) - (14)].d);
       if(gLevelset::find(t)){
@@ -8474,7 +8490,7 @@ yyreduce:
     break;
 
   case 217:
-#line 2436 "Gmsh.y"
+#line 2452 "Gmsh.y"
     {
       int t = (int)(yyvsp[(4) - (16)].d);
       if(gLevelset::find(t)){
@@ -8492,7 +8508,7 @@ yyreduce:
     break;
 
   case 218:
-#line 2451 "Gmsh.y"
+#line 2467 "Gmsh.y"
     {
       if(List_Nbr((yyvsp[(10) - (12)].l)) == 1){
         int t = (int)(yyvsp[(4) - (12)].d);
@@ -8513,7 +8529,7 @@ yyreduce:
     break;
 
   case 219:
-#line 2470 "Gmsh.y"
+#line 2486 "Gmsh.y"
     {
       if(List_Nbr((yyvsp[(12) - (14)].l)) == 1){
         int t = (int)(yyvsp[(4) - (14)].d);
@@ -8566,7 +8582,7 @@ yyreduce:
     break;
 
   case 220:
-#line 2521 "Gmsh.y"
+#line 2537 "Gmsh.y"
     {
       if(List_Nbr((yyvsp[(12) - (14)].l)) == 1){
         int t = (int)(yyvsp[(4) - (14)].d);
@@ -8589,7 +8605,7 @@ yyreduce:
     break;
 
   case 221:
-#line 2542 "Gmsh.y"
+#line 2558 "Gmsh.y"
     {
       if(List_Nbr((yyvsp[(12) - (14)].l)) == 3){
         int t = (int)(yyvsp[(4) - (14)].d);
@@ -8613,7 +8629,7 @@ yyreduce:
     break;
 
   case 222:
-#line 2564 "Gmsh.y"
+#line 2580 "Gmsh.y"
     {
       if(List_Nbr((yyvsp[(12) - (14)].l)) == 5){
         int t = (int)(yyvsp[(4) - (14)].d);
@@ -8638,7 +8654,7 @@ yyreduce:
     break;
 
   case 223:
-#line 2586 "Gmsh.y"
+#line 2602 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(2) - (8)].c), "Union")){
         int t = (int)(yyvsp[(4) - (8)].d);
@@ -8746,7 +8762,7 @@ yyreduce:
     break;
 
   case 224:
-#line 2691 "Gmsh.y"
+#line 2707 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(2) - (8)].c), "MathEval")){
         int t = (int)(yyvsp[(4) - (8)].d);
@@ -8765,7 +8781,7 @@ yyreduce:
     break;
 
   case 225:
-#line 2707 "Gmsh.y"
+#line 2723 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(2) - (6)].c), "CutMesh")){
         int t = (int)(yyvsp[(4) - (6)].d);
@@ -8798,7 +8814,7 @@ yyreduce:
     break;
 
   case 226:
-#line 2742 "Gmsh.y"
+#line 2758 "Gmsh.y"
     {
       std::vector<std::pair<int, int> > dimTags;
       ListOfShapes2VectorOfPairs((yyvsp[(3) - (4)].l), dimTags);
@@ -8812,7 +8828,7 @@ yyreduce:
     break;
 
   case 227:
-#line 2753 "Gmsh.y"
+#line 2769 "Gmsh.y"
     {
 #if defined(HAVE_MESH)
       GModel::current()->getFields()->deleteField((int)(yyvsp[(4) - (6)].d));
@@ -8821,7 +8837,7 @@ yyreduce:
     break;
 
   case 228:
-#line 2759 "Gmsh.y"
+#line 2775 "Gmsh.y"
     {
 #if defined(HAVE_POST)
       if(!strcmp((yyvsp[(2) - (6)].c), "View")){
@@ -8839,7 +8855,7 @@ yyreduce:
     break;
 
   case 229:
-#line 2774 "Gmsh.y"
+#line 2790 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(2) - (3)].c), "Meshes") || !strcmp((yyvsp[(2) - (3)].c), "All")){
         ClearProject();
@@ -8870,7 +8886,7 @@ yyreduce:
     break;
 
   case 230:
-#line 2802 "Gmsh.y"
+#line 2818 "Gmsh.y"
     {
 #if defined(HAVE_POST)
       if(!strcmp((yyvsp[(2) - (4)].c), "Empty") && !strcmp((yyvsp[(3) - (4)].c), "Views")){
@@ -8885,7 +8901,7 @@ yyreduce:
     break;
 
   case 231:
-#line 2819 "Gmsh.y"
+#line 2835 "Gmsh.y"
     {
       std::vector<std::pair<int, int> > dimTags;
       ListOfShapes2VectorOfPairs((yyvsp[(4) - (5)].l), dimTags);
@@ -8895,7 +8911,7 @@ yyreduce:
     break;
 
   case 232:
-#line 2826 "Gmsh.y"
+#line 2842 "Gmsh.y"
     {
       std::vector<std::pair<int, int> > dimTags;
       ListOfShapes2VectorOfPairs((yyvsp[(5) - (6)].l), dimTags);
@@ -8905,7 +8921,7 @@ yyreduce:
     break;
 
   case 233:
-#line 2838 "Gmsh.y"
+#line 2854 "Gmsh.y"
     {
       std::vector<std::pair<int, int> > dimTags;
       ListOfShapes2VectorOfPairs((yyvsp[(4) - (5)].l), dimTags);
@@ -8922,7 +8938,7 @@ yyreduce:
     break;
 
   case 234:
-#line 2857 "Gmsh.y"
+#line 2873 "Gmsh.y"
     {
       std::string what = (yyvsp[(2) - (3)].c);
       setVisibility(-1, 1, false);
@@ -8931,7 +8947,7 @@ yyreduce:
     break;
 
   case 235:
-#line 2863 "Gmsh.y"
+#line 2879 "Gmsh.y"
     {
       std::string what = (yyvsp[(2) - (3)].c);
       setVisibility(-1, 0, false);
@@ -8940,7 +8956,7 @@ yyreduce:
     break;
 
   case 236:
-#line 2869 "Gmsh.y"
+#line 2885 "Gmsh.y"
     {
       std::vector<std::pair<int, int> > dimTags;
       ListOfShapes2VectorOfPairs((yyvsp[(3) - (4)].l), dimTags);
@@ -8950,7 +8966,7 @@ yyreduce:
     break;
 
   case 237:
-#line 2876 "Gmsh.y"
+#line 2892 "Gmsh.y"
     {
       std::vector<std::pair<int, int> > dimTags;
       ListOfShapes2VectorOfPairs((yyvsp[(4) - (5)].l), dimTags);
@@ -8960,7 +8976,7 @@ yyreduce:
     break;
 
   case 238:
-#line 2883 "Gmsh.y"
+#line 2899 "Gmsh.y"
     {
       std::vector<std::pair<int, int> > dimTags;
       ListOfShapes2VectorOfPairs((yyvsp[(3) - (4)].l), dimTags);
@@ -8970,7 +8986,7 @@ yyreduce:
     break;
 
   case 239:
-#line 2890 "Gmsh.y"
+#line 2906 "Gmsh.y"
     {
       std::vector<std::pair<int, int> > dimTags;
       ListOfShapes2VectorOfPairs((yyvsp[(4) - (5)].l), dimTags);
@@ -8980,7 +8996,7 @@ yyreduce:
     break;
 
   case 240:
-#line 2902 "Gmsh.y"
+#line 2918 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(1) - (3)].c), "Include")){
         std::string tmp = FixRelativePath(gmsh_yyname, (yyvsp[(2) - (3)].c));
@@ -9056,7 +9072,7 @@ yyreduce:
     break;
 
   case 241:
-#line 2975 "Gmsh.y"
+#line 2991 "Gmsh.y"
     {
       int n = List_Nbr((yyvsp[(3) - (5)].l));
       if(n == 1){
@@ -9077,7 +9093,7 @@ yyreduce:
     break;
 
   case 242:
-#line 2993 "Gmsh.y"
+#line 3009 "Gmsh.y"
     {
 #if defined(HAVE_POST)
       if(!strcmp((yyvsp[(1) - (7)].c), "Save") && !strcmp((yyvsp[(2) - (7)].c), "View")){
@@ -9097,7 +9113,7 @@ yyreduce:
     break;
 
   case 243:
-#line 3010 "Gmsh.y"
+#line 3026 "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")){
@@ -9115,7 +9131,7 @@ yyreduce:
     break;
 
   case 244:
-#line 3025 "Gmsh.y"
+#line 3041 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(1) - (3)].c), "Sleep")){
 	SleepInSeconds((yyvsp[(2) - (3)].d));
@@ -9151,7 +9167,7 @@ yyreduce:
     break;
 
   case 245:
-#line 3058 "Gmsh.y"
+#line 3074 "Gmsh.y"
     {
 #if defined(HAVE_PLUGINS)
        try {
@@ -9166,7 +9182,7 @@ yyreduce:
     break;
 
   case 246:
-#line 3070 "Gmsh.y"
+#line 3086 "Gmsh.y"
     {
 #if defined(HAVE_POST)
       if(!strcmp((yyvsp[(2) - (3)].c), "ElementsFromAllViews"))
@@ -9193,14 +9209,14 @@ yyreduce:
     break;
 
   case 247:
-#line 3094 "Gmsh.y"
+#line 3110 "Gmsh.y"
     {
       Msg::Exit(0);
     ;}
     break;
 
   case 248:
-#line 3098 "Gmsh.y"
+#line 3114 "Gmsh.y"
     {
       gmsh_yyerrorstate = 999; // this will be checked when yyparse returns
       YYABORT;
@@ -9208,7 +9224,7 @@ yyreduce:
     break;
 
   case 249:
-#line 3103 "Gmsh.y"
+#line 3119 "Gmsh.y"
     {
       // force sync
       if(GModel::current()->getOCCInternals())
@@ -9218,7 +9234,7 @@ yyreduce:
     break;
 
   case 250:
-#line 3110 "Gmsh.y"
+#line 3126 "Gmsh.y"
     {
       new GModel();
       GModel::current(GModel::list.size() - 1);
@@ -9226,7 +9242,7 @@ yyreduce:
     break;
 
   case 251:
-#line 3115 "Gmsh.y"
+#line 3131 "Gmsh.y"
     {
       CTX::instance()->forcedBBox = 0;
       if(GModel::current()->getOCCInternals() &&
@@ -9239,7 +9255,7 @@ yyreduce:
     break;
 
   case 252:
-#line 3125 "Gmsh.y"
+#line 3141 "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));
@@ -9247,7 +9263,7 @@ yyreduce:
     break;
 
   case 253:
-#line 3130 "Gmsh.y"
+#line 3146 "Gmsh.y"
     {
 #if defined(HAVE_OPENGL)
       drawContext::global()->draw();
@@ -9256,7 +9272,7 @@ yyreduce:
     break;
 
   case 254:
-#line 3136 "Gmsh.y"
+#line 3152 "Gmsh.y"
     {
 #if defined(HAVE_OPENGL)
      CTX::instance()->mesh.changed = ENT_ALL;
@@ -9267,21 +9283,21 @@ yyreduce:
     break;
 
   case 255:
-#line 3144 "Gmsh.y"
+#line 3160 "Gmsh.y"
     {
       GModel::current()->createTopologyFromMesh();
     ;}
     break;
 
   case 256:
-#line 3148 "Gmsh.y"
+#line 3164 "Gmsh.y"
     {
       GModel::current()->createTopologyFromMesh(1);
     ;}
     break;
 
   case 257:
-#line 3152 "Gmsh.y"
+#line 3168 "Gmsh.y"
     {
       if(GModel::current()->getOCCInternals() &&
          GModel::current()->getOCCInternals()->getChanged())
@@ -9293,7 +9309,7 @@ yyreduce:
     break;
 
   case 258:
-#line 3162 "Gmsh.y"
+#line 3178 "Gmsh.y"
     {
       int lock = CTX::instance()->lock;
       CTX::instance()->lock = 0;
@@ -9354,7 +9370,7 @@ yyreduce:
     break;
 
   case 259:
-#line 3225 "Gmsh.y"
+#line 3241 "Gmsh.y"
     {
 #if defined(HAVE_POPPLER)
        std::vector<int> is;
@@ -9369,7 +9385,7 @@ yyreduce:
     break;
 
   case 260:
-#line 3241 "Gmsh.y"
+#line 3257 "Gmsh.y"
     {
       LoopControlVariablesTab[ImbricatedLoop][0] = (yyvsp[(3) - (6)].d);
       LoopControlVariablesTab[ImbricatedLoop][1] = (yyvsp[(5) - (6)].d);
@@ -9389,7 +9405,7 @@ yyreduce:
     break;
 
   case 261:
-#line 3258 "Gmsh.y"
+#line 3274 "Gmsh.y"
     {
       LoopControlVariablesTab[ImbricatedLoop][0] = (yyvsp[(3) - (8)].d);
       LoopControlVariablesTab[ImbricatedLoop][1] = (yyvsp[(5) - (8)].d);
@@ -9409,7 +9425,7 @@ yyreduce:
     break;
 
   case 262:
-#line 3275 "Gmsh.y"
+#line 3291 "Gmsh.y"
     {
       LoopControlVariablesTab[ImbricatedLoop][0] = (yyvsp[(5) - (8)].d);
       LoopControlVariablesTab[ImbricatedLoop][1] = (yyvsp[(7) - (8)].d);
@@ -9434,7 +9450,7 @@ yyreduce:
     break;
 
   case 263:
-#line 3297 "Gmsh.y"
+#line 3313 "Gmsh.y"
     {
       LoopControlVariablesTab[ImbricatedLoop][0] = (yyvsp[(5) - (10)].d);
       LoopControlVariablesTab[ImbricatedLoop][1] = (yyvsp[(7) - (10)].d);
@@ -9459,7 +9475,7 @@ yyreduce:
     break;
 
   case 264:
-#line 3319 "Gmsh.y"
+#line 3335 "Gmsh.y"
     {
       if(ImbricatedLoop <= 0){
 	yymsg(0, "Invalid For/EndFor loop");
@@ -9497,7 +9513,7 @@ yyreduce:
     break;
 
   case 265:
-#line 3354 "Gmsh.y"
+#line 3370 "Gmsh.y"
     {
       if(!FunctionManager::Instance()->createFunction
          (std::string((yyvsp[(2) - (2)].c)), gmsh_yyin, gmsh_yyname, gmsh_yylineno))
@@ -9508,7 +9524,7 @@ yyreduce:
     break;
 
   case 266:
-#line 3362 "Gmsh.y"
+#line 3378 "Gmsh.y"
     {
       if(!FunctionManager::Instance()->createFunction
          (std::string((yyvsp[(2) - (2)].c)), gmsh_yyin, gmsh_yyname, gmsh_yylineno))
@@ -9519,7 +9535,7 @@ yyreduce:
     break;
 
   case 267:
-#line 3370 "Gmsh.y"
+#line 3386 "Gmsh.y"
     {
       if(!FunctionManager::Instance()->leaveFunction
          (&gmsh_yyin, gmsh_yyname, gmsh_yylineno))
@@ -9528,7 +9544,7 @@ yyreduce:
     break;
 
   case 268:
-#line 3376 "Gmsh.y"
+#line 3392 "Gmsh.y"
     {
       if(!FunctionManager::Instance()->enterFunction
          (std::string((yyvsp[(2) - (3)].c)), &gmsh_yyin, gmsh_yyname, gmsh_yylineno))
@@ -9538,7 +9554,7 @@ yyreduce:
     break;
 
   case 269:
-#line 3383 "Gmsh.y"
+#line 3399 "Gmsh.y"
     {
       if(!FunctionManager::Instance()->enterFunction
          (std::string((yyvsp[(2) - (3)].c)), &gmsh_yyin, gmsh_yyname, gmsh_yylineno))
@@ -9548,7 +9564,7 @@ yyreduce:
     break;
 
   case 270:
-#line 3390 "Gmsh.y"
+#line 3406 "Gmsh.y"
     {
       ImbricatedTest++;
       if(ImbricatedTest > MAX_RECUR_TESTS-1){
@@ -9571,7 +9587,7 @@ yyreduce:
     break;
 
   case 271:
-#line 3410 "Gmsh.y"
+#line 3426 "Gmsh.y"
     {
       if(ImbricatedTest > 0){
         if (statusImbricatedTests[ImbricatedTest]){
@@ -9600,7 +9616,7 @@ yyreduce:
     break;
 
   case 272:
-#line 3436 "Gmsh.y"
+#line 3452 "Gmsh.y"
     {
       if(ImbricatedTest > 0){
         if(statusImbricatedTests[ImbricatedTest]){
@@ -9615,7 +9631,7 @@ yyreduce:
     break;
 
   case 273:
-#line 3448 "Gmsh.y"
+#line 3464 "Gmsh.y"
     {
       ImbricatedTest--;
       if(ImbricatedTest < 0)
@@ -9624,7 +9640,7 @@ yyreduce:
     break;
 
   case 274:
-#line 3460 "Gmsh.y"
+#line 3476 "Gmsh.y"
     {
       std::vector<std::pair<int, int> > inDimTags, outDimTags;
       ListOfShapes2VectorOfPairs((yyvsp[(4) - (5)].l), inDimTags);
@@ -9643,7 +9659,7 @@ yyreduce:
     break;
 
   case 275:
-#line 3476 "Gmsh.y"
+#line 3492 "Gmsh.y"
     {
       std::vector<std::pair<int, int> > inDimTags, outDimTags;
       ListOfShapes2VectorOfPairs((yyvsp[(10) - (11)].l), inDimTags);
@@ -9662,7 +9678,7 @@ yyreduce:
     break;
 
   case 276:
-#line 3492 "Gmsh.y"
+#line 3508 "Gmsh.y"
     {
       std::vector<std::pair<int, int> > inDimTags, outDimTags;
       ListOfShapes2VectorOfPairs((yyvsp[(12) - (13)].l), inDimTags);
@@ -9681,7 +9697,7 @@ yyreduce:
     break;
 
   case 277:
-#line 3508 "Gmsh.y"
+#line 3524 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
       extr.mesh.QuadToTri = NO_QUADTRI;
@@ -9690,7 +9706,7 @@ yyreduce:
     break;
 
   case 278:
-#line 3514 "Gmsh.y"
+#line 3530 "Gmsh.y"
     {
       std::vector<std::pair<int, int> > inDimTags, outDimTags;
       ListOfShapes2VectorOfPairs((yyvsp[(4) - (7)].l), inDimTags);
@@ -9709,7 +9725,7 @@ yyreduce:
     break;
 
   case 279:
-#line 3530 "Gmsh.y"
+#line 3546 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
       extr.mesh.QuadToTri = NO_QUADTRI;
@@ -9718,7 +9734,7 @@ yyreduce:
     break;
 
   case 280:
-#line 3536 "Gmsh.y"
+#line 3552 "Gmsh.y"
     {
       std::vector<std::pair<int, int> > inDimTags, outDimTags;
       ListOfShapes2VectorOfPairs((yyvsp[(10) - (13)].l), inDimTags);
@@ -9739,7 +9755,7 @@ yyreduce:
     break;
 
   case 281:
-#line 3554 "Gmsh.y"
+#line 3570 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
       extr.mesh.QuadToTri = NO_QUADTRI;
@@ -9748,7 +9764,7 @@ yyreduce:
     break;
 
   case 282:
-#line 3560 "Gmsh.y"
+#line 3576 "Gmsh.y"
     {
       std::vector<std::pair<int, int> > inDimTags, outDimTags;
       ListOfShapes2VectorOfPairs((yyvsp[(12) - (15)].l), inDimTags);
@@ -9767,7 +9783,7 @@ yyreduce:
     break;
 
   case 283:
-#line 3576 "Gmsh.y"
+#line 3592 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
       extr.mesh.QuadToTri = NO_QUADTRI;
@@ -9776,7 +9792,7 @@ yyreduce:
     break;
 
   case 284:
-#line 3582 "Gmsh.y"
+#line 3598 "Gmsh.y"
     {
       std::vector<std::pair<int, int> > inDimTags, outDimTags;
       ListOfShapes2VectorOfPairs((yyvsp[(3) - (6)].l), inDimTags);
@@ -9794,7 +9810,7 @@ yyreduce:
     break;
 
   case 285:
-#line 3597 "Gmsh.y"
+#line 3613 "Gmsh.y"
     {
       std::vector<std::pair<int, int> > inDimTags, outDimTags;
       ListOfShapes2VectorOfPairs((yyvsp[(3) - (9)].l), inDimTags);
@@ -9811,7 +9827,7 @@ yyreduce:
     break;
 
   case 286:
-#line 3611 "Gmsh.y"
+#line 3627 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       if(factory == "OpenCASCADE" && GModel::current()->getOCCInternals()){
@@ -9829,7 +9845,7 @@ yyreduce:
     break;
 
   case 287:
-#line 3626 "Gmsh.y"
+#line 3642 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       if(factory == "OpenCASCADE" && GModel::current()->getOCCInternals()){
@@ -9847,7 +9863,7 @@ yyreduce:
     break;
 
   case 288:
-#line 3641 "Gmsh.y"
+#line 3657 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       if(factory == "OpenCASCADE" && GModel::current()->getOCCInternals()){
@@ -9868,19 +9884,19 @@ yyreduce:
     break;
 
   case 289:
-#line 3662 "Gmsh.y"
+#line 3678 "Gmsh.y"
     {
     ;}
     break;
 
   case 290:
-#line 3665 "Gmsh.y"
+#line 3681 "Gmsh.y"
     {
     ;}
     break;
 
   case 291:
-#line 3671 "Gmsh.y"
+#line 3687 "Gmsh.y"
     {
       int n = (int)fabs((yyvsp[(3) - (5)].d));
       if(n){ // we accept n==0 to easily disable layers
@@ -9895,7 +9911,7 @@ yyreduce:
     break;
 
   case 292:
-#line 3683 "Gmsh.y"
+#line 3699 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = true;
       extr.mesh.NbLayer = List_Nbr((yyvsp[(3) - (7)].l));
@@ -9918,56 +9934,56 @@ yyreduce:
     break;
 
   case 293:
-#line 3703 "Gmsh.y"
+#line 3719 "Gmsh.y"
     {
       extr.mesh.ScaleLast = true;
     ;}
     break;
 
   case 294:
-#line 3707 "Gmsh.y"
+#line 3723 "Gmsh.y"
     {
       extr.mesh.Recombine = true;
     ;}
     break;
 
   case 295:
-#line 3711 "Gmsh.y"
+#line 3727 "Gmsh.y"
     {
       extr.mesh.Recombine = (yyvsp[(2) - (3)].d) ? true : false;
     ;}
     break;
 
   case 296:
-#line 3715 "Gmsh.y"
+#line 3731 "Gmsh.y"
     {
       extr.mesh.QuadToTri = QUADTRI_ADDVERTS_1;
     ;}
     break;
 
   case 297:
-#line 3719 "Gmsh.y"
+#line 3735 "Gmsh.y"
     {
       extr.mesh.QuadToTri = QUADTRI_ADDVERTS_1_RECOMB;
     ;}
     break;
 
   case 298:
-#line 3723 "Gmsh.y"
+#line 3739 "Gmsh.y"
     {
       extr.mesh.QuadToTri = QUADTRI_NOVERTS_1;
     ;}
     break;
 
   case 299:
-#line 3727 "Gmsh.y"
+#line 3743 "Gmsh.y"
     {
       extr.mesh.QuadToTri = QUADTRI_NOVERTS_1_RECOMB;
     ;}
     break;
 
   case 300:
-#line 3731 "Gmsh.y"
+#line 3747 "Gmsh.y"
     {
       std::vector<int> tags; ListOfDouble2Vector((yyvsp[(6) - (9)].l), tags);
       int num = (int)(yyvsp[(3) - (9)].d);
@@ -9979,7 +9995,7 @@ yyreduce:
     break;
 
   case 301:
-#line 3740 "Gmsh.y"
+#line 3756 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(2) - (6)].c), "Index"))
         extr.mesh.BoundaryLayerIndex = (yyvsp[(4) - (6)].d);
@@ -9990,47 +10006,47 @@ yyreduce:
     break;
 
   case 302:
-#line 3752 "Gmsh.y"
+#line 3768 "Gmsh.y"
     { (yyval.i) = OCC_Internals::Union; ;}
     break;
 
   case 303:
-#line 3753 "Gmsh.y"
+#line 3769 "Gmsh.y"
     { (yyval.i) = OCC_Internals::Intersection; ;}
     break;
 
   case 304:
-#line 3754 "Gmsh.y"
+#line 3770 "Gmsh.y"
     { (yyval.i) = OCC_Internals::Difference; ;}
     break;
 
   case 305:
-#line 3755 "Gmsh.y"
+#line 3771 "Gmsh.y"
     { (yyval.i) = OCC_Internals::Section; ;}
     break;
 
   case 306:
-#line 3756 "Gmsh.y"
+#line 3772 "Gmsh.y"
     { (yyval.i) = OCC_Internals::Fragments; ;}
     break;
 
   case 307:
-#line 3760 "Gmsh.y"
+#line 3776 "Gmsh.y"
     { (yyval.i) = 0; ;}
     break;
 
   case 308:
-#line 3761 "Gmsh.y"
+#line 3777 "Gmsh.y"
     { (yyval.i) = 1; ;}
     break;
 
   case 309:
-#line 3762 "Gmsh.y"
+#line 3778 "Gmsh.y"
     { (yyval.i) = (yyvsp[(2) - (3)].d); ;}
     break;
 
   case 310:
-#line 3767 "Gmsh.y"
+#line 3783 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       if(factory == "OpenCASCADE" && GModel::current()->getOCCInternals()){
@@ -10050,7 +10066,7 @@ yyreduce:
     break;
 
   case 311:
-#line 3784 "Gmsh.y"
+#line 3800 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       if(factory == "OpenCASCADE" && GModel::current()->getOCCInternals()){
@@ -10067,7 +10083,7 @@ yyreduce:
     break;
 
   case 312:
-#line 3802 "Gmsh.y"
+#line 3818 "Gmsh.y"
     {
       if(factory == "OpenCASCADE" && GModel::current()->getOCCInternals()){
         std::vector<std::pair<int, int> > object, tool, out;
@@ -10082,14 +10098,14 @@ yyreduce:
     break;
 
   case 313:
-#line 3817 "Gmsh.y"
+#line 3833 "Gmsh.y"
     {
       (yyval.v)[0] = (yyval.v)[1] = 1.;
     ;}
     break;
 
   case 314:
-#line 3821 "Gmsh.y"
+#line 3837 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(2) - (3)].c), "Progression") || !strcmp((yyvsp[(2) - (3)].c), "Power"))
         (yyval.v)[0] = 1.;
@@ -10105,14 +10121,14 @@ yyreduce:
     break;
 
   case 315:
-#line 3836 "Gmsh.y"
+#line 3852 "Gmsh.y"
     {
       (yyval.i) = -1; // left
     ;}
     break;
 
   case 316:
-#line 3840 "Gmsh.y"
+#line 3856 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(1) - (1)].c), "Right"))
         (yyval.i) = 1;
@@ -10129,49 +10145,49 @@ yyreduce:
     break;
 
   case 317:
-#line 3856 "Gmsh.y"
+#line 3872 "Gmsh.y"
     {
      (yyval.l) = List_Create(1, 1, sizeof(double));
    ;}
     break;
 
   case 318:
-#line 3860 "Gmsh.y"
+#line 3876 "Gmsh.y"
     {
      (yyval.l) = (yyvsp[(2) - (2)].l);
    ;}
     break;
 
   case 319:
-#line 3865 "Gmsh.y"
+#line 3881 "Gmsh.y"
     {
       (yyval.i) = 45;
     ;}
     break;
 
   case 320:
-#line 3869 "Gmsh.y"
+#line 3885 "Gmsh.y"
     {
       (yyval.i) = (int)(yyvsp[(2) - (2)].d);
     ;}
     break;
 
   case 321:
-#line 3875 "Gmsh.y"
+#line 3891 "Gmsh.y"
     {
       (yyval.l) = List_Create(1, 1, sizeof(double));
     ;}
     break;
 
   case 322:
-#line 3879 "Gmsh.y"
+#line 3895 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(2) - (2)].l);
     ;}
     break;
 
   case 323:
-#line 3886 "Gmsh.y"
+#line 3902 "Gmsh.y"
     {
       // mesh sizes at vertices are stored in internal CAD data, as they can be
       // specified during vertex creation and copied around during CAD
@@ -10191,7 +10207,7 @@ yyreduce:
     break;
 
   case 324:
-#line 3903 "Gmsh.y"
+#line 3919 "Gmsh.y"
     {
       // transfinite constraints are stored in GEO internals in addition to
       // GModel, as they can be copied around during GEO operations
@@ -10235,7 +10251,7 @@ yyreduce:
     break;
 
   case 325:
-#line 3944 "Gmsh.y"
+#line 3960 "Gmsh.y"
     {
       // transfinite constraints are stored in GEO internals in addition to
       // GModel, as they can be copied around during GEO operations
@@ -10282,7 +10298,7 @@ yyreduce:
     break;
 
   case 326:
-#line 3988 "Gmsh.y"
+#line 4004 "Gmsh.y"
     {
       // transfinite constraints are stored in GEO internals in addition to
       // GModel, as they can be copied around during GEO operations
@@ -10324,7 +10340,7 @@ yyreduce:
     break;
 
   case 327:
-#line 4027 "Gmsh.y"
+#line 4043 "Gmsh.y"
     {
       // transfinite constraints are stored in GEO internals in addition to
       // GModel, as they can be copied around during GEO operations
@@ -10352,7 +10368,7 @@ yyreduce:
     break;
 
   case 328:
-#line 4052 "Gmsh.y"
+#line 4068 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(4) - (8)].l)); i++){
 	double d;
@@ -10364,7 +10380,7 @@ yyreduce:
     break;
 
   case 329:
-#line 4061 "Gmsh.y"
+#line 4077 "Gmsh.y"
     {
       // recombine constraints are stored in GEO internals in addition to
       // GModel, as they can be copied around during GEO operations
@@ -10397,7 +10413,7 @@ yyreduce:
     break;
 
   case 330:
-#line 4091 "Gmsh.y"
+#line 4107 "Gmsh.y"
     {
       // recombine constraints are stored in GEO internals in addition to
       // GModel, as they can be copied around during GEO operations
@@ -10426,7 +10442,7 @@ yyreduce:
     break;
 
   case 331:
-#line 4117 "Gmsh.y"
+#line 4133 "Gmsh.y"
     {
       // smoothing constraints are stored in GEO internals in addition to
       // GModel, as they can be copied around during GEO operations
@@ -10455,7 +10471,7 @@ yyreduce:
     break;
 
   case 332:
-#line 4144 "Gmsh.y"
+#line 4160 "Gmsh.y"
     {
       if (List_Nbr((yyvsp[(4) - (11)].l)) != List_Nbr((yyvsp[(8) - (11)].l))){
         yymsg(0, "Number of master lines (%d) different from number of "
@@ -10489,7 +10505,7 @@ yyreduce:
     break;
 
   case 333:
-#line 4176 "Gmsh.y"
+#line 4192 "Gmsh.y"
     {
       if (List_Nbr((yyvsp[(4) - (11)].l)) != List_Nbr((yyvsp[(8) - (11)].l))){
         yymsg(0, "Number of master faces (%d) different from number of "
@@ -10518,7 +10534,7 @@ yyreduce:
     break;
 
   case 334:
-#line 4203 "Gmsh.y"
+#line 4219 "Gmsh.y"
     {
       if (List_Nbr((yyvsp[(4) - (18)].l)) != List_Nbr((yyvsp[(8) - (18)].l))){
         yymsg(0, "Number of master edges (%d) different from number of "
@@ -10546,7 +10562,7 @@ yyreduce:
     break;
 
   case 335:
-#line 4229 "Gmsh.y"
+#line 4245 "Gmsh.y"
     {
       if (List_Nbr((yyvsp[(4) - (18)].l)) != List_Nbr((yyvsp[(8) - (18)].l))){
         yymsg(0, "Number of master faces (%d) different from number of "
@@ -10574,7 +10590,7 @@ yyreduce:
     break;
 
   case 336:
-#line 4255 "Gmsh.y"
+#line 4271 "Gmsh.y"
     {
       if (List_Nbr((yyvsp[(4) - (12)].l)) != List_Nbr((yyvsp[(8) - (12)].l))){
         yymsg(0, "Number of master edges (%d) different from number of "
@@ -10602,7 +10618,7 @@ yyreduce:
     break;
 
   case 337:
-#line 4281 "Gmsh.y"
+#line 4297 "Gmsh.y"
     {
       if (List_Nbr((yyvsp[(4) - (12)].l)) != List_Nbr((yyvsp[(8) - (12)].l))){
         yymsg(0, "Number of master faces (%d) different from number of "
@@ -10630,7 +10646,7 @@ yyreduce:
     break;
 
   case 338:
-#line 4307 "Gmsh.y"
+#line 4323 "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 "
@@ -10654,7 +10670,7 @@ yyreduce:
     break;
 
   case 339:
-#line 4328 "Gmsh.y"
+#line 4344 "Gmsh.y"
     {
       std::vector<int> tags; ListOfDouble2Vector((yyvsp[(3) - (10)].l), tags);
       addEmbedded(0, tags, 2, (int)(yyvsp[(8) - (10)].d));
@@ -10663,7 +10679,7 @@ yyreduce:
     break;
 
   case 340:
-#line 4334 "Gmsh.y"
+#line 4350 "Gmsh.y"
     {
       std::vector<int> tags; ListOfDouble2Vector((yyvsp[(3) - (10)].l), tags);
       addEmbedded(1, tags, 2, (int)(yyvsp[(8) - (10)].d));
@@ -10672,7 +10688,7 @@ yyreduce:
     break;
 
   case 341:
-#line 4340 "Gmsh.y"
+#line 4356 "Gmsh.y"
     {
       std::vector<int> tags; ListOfDouble2Vector((yyvsp[(3) - (10)].l), tags);
       addEmbedded(0, tags, 3, (int)(yyvsp[(8) - (10)].d));
@@ -10681,7 +10697,7 @@ yyreduce:
     break;
 
   case 342:
-#line 4346 "Gmsh.y"
+#line 4362 "Gmsh.y"
     {
       std::vector<int> tags; ListOfDouble2Vector((yyvsp[(3) - (10)].l), tags);
       addEmbedded(1, tags, 3, (int)(yyvsp[(8) - (10)].d));
@@ -10690,7 +10706,7 @@ yyreduce:
     break;
 
   case 343:
-#line 4352 "Gmsh.y"
+#line 4368 "Gmsh.y"
     {
       std::vector<int> tags; ListOfDouble2Vector((yyvsp[(3) - (10)].l), tags);
       addEmbedded(2, tags, 3, (int)(yyvsp[(8) - (10)].d));
@@ -10699,7 +10715,7 @@ yyreduce:
     break;
 
   case 344:
-#line 4358 "Gmsh.y"
+#line 4374 "Gmsh.y"
     {
       // reverse mesh constraints are stored in GEO internals in addition to
       // GModel, as they can be copied around during GEO operations
@@ -10728,7 +10744,7 @@ yyreduce:
     break;
 
   case 345:
-#line 4384 "Gmsh.y"
+#line 4400 "Gmsh.y"
     {
       // reverse mesh constraints are stored in GEO internals in addition to
       // GModel, as they can be copied around during GEO operations
@@ -10757,7 +10773,7 @@ yyreduce:
     break;
 
   case 346:
-#line 4410 "Gmsh.y"
+#line 4426 "Gmsh.y"
     {
       if(!(yyvsp[(3) - (4)].l)){
         for(GModel::viter it = GModel::current()->firstVertex();
@@ -10777,7 +10793,7 @@ yyreduce:
     break;
 
   case 347:
-#line 4427 "Gmsh.y"
+#line 4443 "Gmsh.y"
     {
       if(!(yyvsp[(3) - (4)].l)){
         for(GModel::eiter it = GModel::current()->firstEdge();
@@ -10797,7 +10813,7 @@ yyreduce:
     break;
 
   case 348:
-#line 4444 "Gmsh.y"
+#line 4460 "Gmsh.y"
     {
       if(!(yyvsp[(3) - (4)].l)){
         for(GModel::fiter it = GModel::current()->firstFace();
@@ -10817,7 +10833,7 @@ yyreduce:
     break;
 
   case 349:
-#line 4461 "Gmsh.y"
+#line 4477 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (4)].l)); i++){
 	double dnum;
@@ -10832,7 +10848,7 @@ yyreduce:
     break;
 
   case 350:
-#line 4473 "Gmsh.y"
+#line 4489 "Gmsh.y"
     {
       std::vector<int> tags; ListOfDouble2Vector((yyvsp[(3) - (4)].l), tags);
       GModel::current()->getGEOInternals()->setCompoundMesh(1, tags);
@@ -10841,7 +10857,7 @@ yyreduce:
     break;
 
   case 351:
-#line 4479 "Gmsh.y"
+#line 4495 "Gmsh.y"
     {
       std::vector<int> tags; ListOfDouble2Vector((yyvsp[(3) - (4)].l), tags);
       GModel::current()->getGEOInternals()->setCompoundMesh(2, tags);
@@ -10850,7 +10866,7 @@ yyreduce:
     break;
 
   case 352:
-#line 4485 "Gmsh.y"
+#line 4501 "Gmsh.y"
     {
       std::vector<int> tags; ListOfDouble2Vector((yyvsp[(3) - (4)].l), tags);
       GModel::current()->getGEOInternals()->setCompoundMesh(3, tags);
@@ -10859,14 +10875,14 @@ yyreduce:
     break;
 
   case 353:
-#line 4497 "Gmsh.y"
+#line 4513 "Gmsh.y"
     {
       GModel::current()->getGEOInternals()->removeAllDuplicates();
     ;}
     break;
 
   case 354:
-#line 4501 "Gmsh.y"
+#line 4517 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(2) - (3)].c), "Geometry"))
         GModel::current()->getGEOInternals()->removeAllDuplicates();
@@ -10879,7 +10895,7 @@ yyreduce:
     break;
 
   case 355:
-#line 4511 "Gmsh.y"
+#line 4527 "Gmsh.y"
     {
       std::vector<int> tags; ListOfDouble2Vector((yyvsp[(4) - (6)].l), tags);
       GModel::current()->getGEOInternals()->mergeVertices(tags);
@@ -10888,22 +10904,22 @@ yyreduce:
     break;
 
   case 356:
-#line 4521 "Gmsh.y"
+#line 4537 "Gmsh.y"
     { (yyval.c) = (char*)"Homology"; ;}
     break;
 
   case 357:
-#line 4522 "Gmsh.y"
+#line 4538 "Gmsh.y"
     { (yyval.c) = (char*)"Cohomology"; ;}
     break;
 
   case 358:
-#line 4523 "Gmsh.y"
+#line 4539 "Gmsh.y"
     { (yyval.c) = (char*)"Betti"; ;}
     break;
 
   case 359:
-#line 4528 "Gmsh.y"
+#line 4544 "Gmsh.y"
     {
       std::vector<int> domain, subdomain, dim;
       for(int i = 0; i < 4; i++) dim.push_back(i);
@@ -10912,7 +10928,7 @@ yyreduce:
     break;
 
   case 360:
-#line 4534 "Gmsh.y"
+#line 4550 "Gmsh.y"
     {
       std::vector<int> domain, subdomain, dim;
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (5)].l)); i++){
@@ -10927,7 +10943,7 @@ yyreduce:
     break;
 
   case 361:
-#line 4546 "Gmsh.y"
+#line 4562 "Gmsh.y"
     {
       std::vector<int> domain, subdomain, dim;
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (7)].l)); i++){
@@ -10948,7 +10964,7 @@ yyreduce:
     break;
 
   case 362:
-#line 4564 "Gmsh.y"
+#line 4580 "Gmsh.y"
     {
       std::vector<int> domain, subdomain, dim;
       for(int i = 0; i < List_Nbr((yyvsp[(6) - (10)].l)); i++){
@@ -10974,47 +10990,47 @@ yyreduce:
     break;
 
   case 363:
-#line 4591 "Gmsh.y"
+#line 4607 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (1)].d);           ;}
     break;
 
   case 364:
-#line 4592 "Gmsh.y"
+#line 4608 "Gmsh.y"
     { (yyval.d) = (yyvsp[(2) - (3)].d);           ;}
     break;
 
   case 365:
-#line 4593 "Gmsh.y"
+#line 4609 "Gmsh.y"
     { (yyval.d) = -(yyvsp[(2) - (2)].d);          ;}
     break;
 
   case 366:
-#line 4594 "Gmsh.y"
+#line 4610 "Gmsh.y"
     { (yyval.d) = (yyvsp[(2) - (2)].d);           ;}
     break;
 
   case 367:
-#line 4595 "Gmsh.y"
+#line 4611 "Gmsh.y"
     { (yyval.d) = !(yyvsp[(2) - (2)].d);          ;}
     break;
 
   case 368:
-#line 4596 "Gmsh.y"
+#line 4612 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) - (yyvsp[(3) - (3)].d);      ;}
     break;
 
   case 369:
-#line 4597 "Gmsh.y"
+#line 4613 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) + (yyvsp[(3) - (3)].d);      ;}
     break;
 
   case 370:
-#line 4598 "Gmsh.y"
+#line 4614 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) * (yyvsp[(3) - (3)].d);      ;}
     break;
 
   case 371:
-#line 4600 "Gmsh.y"
+#line 4616 "Gmsh.y"
     {
       if(!(yyvsp[(3) - (3)].d))
 	yymsg(0, "Division by zero in '%g / %g'", (yyvsp[(1) - (3)].d), (yyvsp[(3) - (3)].d));
@@ -11024,237 +11040,237 @@ yyreduce:
     break;
 
   case 372:
-#line 4606 "Gmsh.y"
+#line 4622 "Gmsh.y"
     { (yyval.d) = (int)(yyvsp[(1) - (3)].d) % (int)(yyvsp[(3) - (3)].d);  ;}
     break;
 
   case 373:
-#line 4607 "Gmsh.y"
+#line 4623 "Gmsh.y"
     { (yyval.d) = pow((yyvsp[(1) - (3)].d), (yyvsp[(3) - (3)].d));  ;}
     break;
 
   case 374:
-#line 4608 "Gmsh.y"
+#line 4624 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) < (yyvsp[(3) - (3)].d);      ;}
     break;
 
   case 375:
-#line 4609 "Gmsh.y"
+#line 4625 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) > (yyvsp[(3) - (3)].d);      ;}
     break;
 
   case 376:
-#line 4610 "Gmsh.y"
+#line 4626 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) <= (yyvsp[(3) - (3)].d);     ;}
     break;
 
   case 377:
-#line 4611 "Gmsh.y"
+#line 4627 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) >= (yyvsp[(3) - (3)].d);     ;}
     break;
 
   case 378:
-#line 4612 "Gmsh.y"
+#line 4628 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) == (yyvsp[(3) - (3)].d);     ;}
     break;
 
   case 379:
-#line 4613 "Gmsh.y"
+#line 4629 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) != (yyvsp[(3) - (3)].d);     ;}
     break;
 
   case 380:
-#line 4614 "Gmsh.y"
+#line 4630 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) && (yyvsp[(3) - (3)].d);     ;}
     break;
 
   case 381:
-#line 4615 "Gmsh.y"
+#line 4631 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) || (yyvsp[(3) - (3)].d);     ;}
     break;
 
   case 382:
-#line 4616 "Gmsh.y"
+#line 4632 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (5)].d) ? (yyvsp[(3) - (5)].d) : (yyvsp[(5) - (5)].d); ;}
     break;
 
   case 383:
-#line 4617 "Gmsh.y"
+#line 4633 "Gmsh.y"
     { (yyval.d) = exp((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 384:
-#line 4618 "Gmsh.y"
+#line 4634 "Gmsh.y"
     { (yyval.d) = log((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 385:
-#line 4619 "Gmsh.y"
+#line 4635 "Gmsh.y"
     { (yyval.d) = log10((yyvsp[(3) - (4)].d));    ;}
     break;
 
   case 386:
-#line 4620 "Gmsh.y"
+#line 4636 "Gmsh.y"
     { (yyval.d) = sqrt((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 387:
-#line 4621 "Gmsh.y"
+#line 4637 "Gmsh.y"
     { (yyval.d) = sin((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 388:
-#line 4622 "Gmsh.y"
+#line 4638 "Gmsh.y"
     { (yyval.d) = asin((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 389:
-#line 4623 "Gmsh.y"
+#line 4639 "Gmsh.y"
     { (yyval.d) = cos((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 390:
-#line 4624 "Gmsh.y"
+#line 4640 "Gmsh.y"
     { (yyval.d) = acos((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 391:
-#line 4625 "Gmsh.y"
+#line 4641 "Gmsh.y"
     { (yyval.d) = tan((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 392:
-#line 4626 "Gmsh.y"
+#line 4642 "Gmsh.y"
     { (yyval.d) = atan((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 393:
-#line 4627 "Gmsh.y"
+#line 4643 "Gmsh.y"
     { (yyval.d) = atan2((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d));;}
     break;
 
   case 394:
-#line 4628 "Gmsh.y"
+#line 4644 "Gmsh.y"
     { (yyval.d) = sinh((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 395:
-#line 4629 "Gmsh.y"
+#line 4645 "Gmsh.y"
     { (yyval.d) = cosh((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 396:
-#line 4630 "Gmsh.y"
+#line 4646 "Gmsh.y"
     { (yyval.d) = tanh((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 397:
-#line 4631 "Gmsh.y"
+#line 4647 "Gmsh.y"
     { (yyval.d) = fabs((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 398:
-#line 4632 "Gmsh.y"
+#line 4648 "Gmsh.y"
     { (yyval.d) = std::abs((yyvsp[(3) - (4)].d)); ;}
     break;
 
   case 399:
-#line 4633 "Gmsh.y"
+#line 4649 "Gmsh.y"
     { (yyval.d) = floor((yyvsp[(3) - (4)].d));    ;}
     break;
 
   case 400:
-#line 4634 "Gmsh.y"
+#line 4650 "Gmsh.y"
     { (yyval.d) = ceil((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 401:
-#line 4635 "Gmsh.y"
+#line 4651 "Gmsh.y"
     { (yyval.d) = floor((yyvsp[(3) - (4)].d) + 0.5); ;}
     break;
 
   case 402:
-#line 4636 "Gmsh.y"
+#line 4652 "Gmsh.y"
     { (yyval.d) = fmod((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d)); ;}
     break;
 
   case 403:
-#line 4637 "Gmsh.y"
+#line 4653 "Gmsh.y"
     { (yyval.d) = fmod((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d)); ;}
     break;
 
   case 404:
-#line 4638 "Gmsh.y"
+#line 4654 "Gmsh.y"
     { (yyval.d) = sqrt((yyvsp[(3) - (6)].d) * (yyvsp[(3) - (6)].d) + (yyvsp[(5) - (6)].d) * (yyvsp[(5) - (6)].d)); ;}
     break;
 
   case 405:
-#line 4639 "Gmsh.y"
+#line 4655 "Gmsh.y"
     { (yyval.d) = (yyvsp[(3) - (4)].d) * (double)rand() / (double)RAND_MAX; ;}
     break;
 
   case 406:
-#line 4648 "Gmsh.y"
+#line 4664 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (1)].d); ;}
     break;
 
   case 407:
-#line 4649 "Gmsh.y"
+#line 4665 "Gmsh.y"
     { (yyval.d) = 3.141592653589793; ;}
     break;
 
   case 408:
-#line 4650 "Gmsh.y"
+#line 4666 "Gmsh.y"
     { (yyval.d) = (double)ImbricatedTest; ;}
     break;
 
   case 409:
-#line 4651 "Gmsh.y"
+#line 4667 "Gmsh.y"
     { (yyval.d) = Msg::GetCommRank(); ;}
     break;
 
   case 410:
-#line 4652 "Gmsh.y"
+#line 4668 "Gmsh.y"
     { (yyval.d) = Msg::GetCommSize(); ;}
     break;
 
   case 411:
-#line 4653 "Gmsh.y"
+#line 4669 "Gmsh.y"
     { (yyval.d) = GetGmshMajorVersion(); ;}
     break;
 
   case 412:
-#line 4654 "Gmsh.y"
+#line 4670 "Gmsh.y"
     { (yyval.d) = GetGmshMinorVersion(); ;}
     break;
 
   case 413:
-#line 4655 "Gmsh.y"
+#line 4671 "Gmsh.y"
     { (yyval.d) = GetGmshPatchVersion(); ;}
     break;
 
   case 414:
-#line 4656 "Gmsh.y"
+#line 4672 "Gmsh.y"
     { (yyval.d) = Cpu(); ;}
     break;
 
   case 415:
-#line 4657 "Gmsh.y"
+#line 4673 "Gmsh.y"
     { (yyval.d) = GetMemoryUsage()/1024./1024.; ;}
     break;
 
   case 416:
-#line 4658 "Gmsh.y"
+#line 4674 "Gmsh.y"
     { (yyval.d) = TotalRam(); ;}
     break;
 
   case 417:
-#line 4663 "Gmsh.y"
-    { floatOptions.clear(); charOptions.clear(); ;}
+#line 4679 "Gmsh.y"
+    { init_Options(); ;}
     break;
 
   case 418:
-#line 4665 "Gmsh.y"
+#line 4681 "Gmsh.y"
     {
       std::vector<double> val(1, (yyvsp[(3) - (6)].d));
       Msg::ExchangeOnelabParameter("", val, floatOptions, charOptions);
@@ -11263,12 +11279,12 @@ yyreduce:
     break;
 
   case 419:
-#line 4671 "Gmsh.y"
+#line 4687 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (1)].d); ;}
     break;
 
   case 420:
-#line 4673 "Gmsh.y"
+#line 4689 "Gmsh.y"
     {
       (yyval.d) = Msg::GetOnelabNumber((yyvsp[(3) - (4)].c));
       Free((yyvsp[(3) - (4)].c));
@@ -11276,7 +11292,7 @@ yyreduce:
     break;
 
   case 421:
-#line 4678 "Gmsh.y"
+#line 4694 "Gmsh.y"
     {
       (yyval.d) = Msg::GetOnelabNumber((yyvsp[(3) - (6)].c), (yyvsp[(5) - (6)].d));
       Free((yyvsp[(3) - (6)].c));
@@ -11284,7 +11300,7 @@ yyreduce:
     break;
 
   case 422:
-#line 4684 "Gmsh.y"
+#line 4700 "Gmsh.y"
     {
       if(gmsh_yysymbols.count((yyvsp[(1) - (1)].c2).char2)){
         gmsh_yysymbol &s(gmsh_yysymbols[(yyvsp[(1) - (1)].c2).char2]);
@@ -11307,7 +11323,7 @@ yyreduce:
     break;
 
   case 423:
-#line 4704 "Gmsh.y"
+#line 4720 "Gmsh.y"
     {
       int index = (int)(yyvsp[(3) - (4)].d);
       if(!gmsh_yysymbols.count((yyvsp[(1) - (4)].c))){
@@ -11328,7 +11344,7 @@ yyreduce:
     break;
 
   case 424:
-#line 4722 "Gmsh.y"
+#line 4738 "Gmsh.y"
     {
       int index = (int)(yyvsp[(3) - (4)].d);
       if(!gmsh_yysymbols.count((yyvsp[(1) - (4)].c))){
@@ -11349,7 +11365,7 @@ yyreduce:
     break;
 
   case 425:
-#line 4740 "Gmsh.y"
+#line 4756 "Gmsh.y"
     {
       (yyval.d) = gmsh_yysymbols.count((yyvsp[(3) - (4)].c));
       Free((yyvsp[(3) - (4)].c));
@@ -11357,7 +11373,7 @@ yyreduce:
     break;
 
   case 426:
-#line 4745 "Gmsh.y"
+#line 4761 "Gmsh.y"
     {
       std::string tmp = FixRelativePath(gmsh_yyname, (yyvsp[(3) - (4)].c));
       (yyval.d) = !StatFile(tmp);
@@ -11366,7 +11382,7 @@ yyreduce:
     break;
 
   case 427:
-#line 4751 "Gmsh.y"
+#line 4767 "Gmsh.y"
     {
       if(gmsh_yysymbols.count((yyvsp[(2) - (4)].c))){
         gmsh_yysymbol &s(gmsh_yysymbols[(yyvsp[(2) - (4)].c)]);
@@ -11384,7 +11400,7 @@ yyreduce:
     break;
 
   case 428:
-#line 4767 "Gmsh.y"
+#line 4783 "Gmsh.y"
     {
       std::string struct_namespace((yyvsp[(2) - (3)].c));
       (yyval.d) = (double)nameSpaces[struct_namespace].size();
@@ -11393,7 +11409,7 @@ yyreduce:
     break;
 
   case 429:
-#line 4773 "Gmsh.y"
+#line 4789 "Gmsh.y"
     {
       std::string struct_namespace(std::string(""));
       (yyval.d) = (double)nameSpaces[struct_namespace].size();
@@ -11401,7 +11417,7 @@ yyreduce:
     break;
 
   case 430:
-#line 4779 "Gmsh.y"
+#line 4795 "Gmsh.y"
     {
       if(!gmsh_yysymbols.count((yyvsp[(1) - (2)].c))){
 	yymsg(0, "Unknown variable '%s'", (yyvsp[(1) - (2)].c));
@@ -11423,7 +11439,7 @@ yyreduce:
     break;
 
   case 431:
-#line 4798 "Gmsh.y"
+#line 4814 "Gmsh.y"
     {
       int index = (int)(yyvsp[(3) - (5)].d);
       if(!gmsh_yysymbols.count((yyvsp[(1) - (5)].c))){
@@ -11446,7 +11462,7 @@ yyreduce:
     break;
 
   case 432:
-#line 4819 "Gmsh.y"
+#line 4835 "Gmsh.y"
     {
       int index = (int)(yyvsp[(3) - (5)].d);
       if(!gmsh_yysymbols.count((yyvsp[(1) - (5)].c))){
@@ -11469,7 +11485,7 @@ yyreduce:
     break;
 
   case 433:
-#line 4852 "Gmsh.y"
+#line 4868 "Gmsh.y"
     {
       (yyval.d) = treat_Struct_FullName_dot_tSTRING_Float(NULL, (yyvsp[(1) - (3)].c), (yyvsp[(3) - (3)].c));
       /*
@@ -11494,14 +11510,14 @@ yyreduce:
     break;
 
   case 434:
-#line 4874 "Gmsh.y"
+#line 4890 "Gmsh.y"
     {
       (yyval.d) = treat_Struct_FullName_dot_tSTRING_Float((yyvsp[(1) - (5)].c), (yyvsp[(3) - (5)].c), (yyvsp[(5) - (5)].c));
     ;}
     break;
 
   case 435:
-#line 4879 "Gmsh.y"
+#line 4895 "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));
@@ -11509,7 +11525,7 @@ yyreduce:
     break;
 
   case 436:
-#line 4884 "Gmsh.y"
+#line 4900 "Gmsh.y"
     {
       double d = 0.;
       if(NumberOption(GMSH_GET, (yyvsp[(1) - (4)].c), 0, (yyvsp[(3) - (4)].c), d)){
@@ -11522,7 +11538,7 @@ yyreduce:
     break;
 
   case 437:
-#line 4894 "Gmsh.y"
+#line 4910 "Gmsh.y"
     {
       double d = 0.;
       if(NumberOption(GMSH_GET, (yyvsp[(1) - (7)].c), (int)(yyvsp[(3) - (7)].d), (yyvsp[(6) - (7)].c), d)){
@@ -11535,7 +11551,7 @@ yyreduce:
     break;
 
   case 438:
-#line 4904 "Gmsh.y"
+#line 4920 "Gmsh.y"
     {
       (yyval.d) = Msg::GetValue((yyvsp[(3) - (6)].c), (yyvsp[(5) - (6)].d));
       Free((yyvsp[(3) - (6)].c));
@@ -11543,7 +11559,7 @@ yyreduce:
     break;
 
   case 439:
-#line 4909 "Gmsh.y"
+#line 4925 "Gmsh.y"
     {
       int matches = 0;
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (6)].l)); i++){
@@ -11557,7 +11573,7 @@ yyreduce:
     break;
 
   case 440:
-#line 4920 "Gmsh.y"
+#line 4936 "Gmsh.y"
     {
       std::string s((yyvsp[(3) - (6)].c)), substr((yyvsp[(5) - (6)].c));
       if(s.find(substr) != std::string::npos)
@@ -11569,7 +11585,7 @@ yyreduce:
     break;
 
   case 441:
-#line 4929 "Gmsh.y"
+#line 4945 "Gmsh.y"
     {
       (yyval.d) = strlen((yyvsp[(3) - (4)].c));
       Free((yyvsp[(3) - (4)].c));
@@ -11577,7 +11593,7 @@ yyreduce:
     break;
 
   case 442:
-#line 4934 "Gmsh.y"
+#line 4950 "Gmsh.y"
     {
       (yyval.d) = strcmp((yyvsp[(3) - (6)].c), (yyvsp[(5) - (6)].c));
       Free((yyvsp[(3) - (6)].c)); Free((yyvsp[(5) - (6)].c));
@@ -11585,7 +11601,7 @@ yyreduce:
     break;
 
   case 443:
-#line 4939 "Gmsh.y"
+#line 4955 "Gmsh.y"
     {
       int align = 0, font = 0, fontsize = CTX::instance()->glFontSize;
       if(List_Nbr((yyvsp[(3) - (4)].l)) % 2){
@@ -11612,19 +11628,25 @@ yyreduce:
     break;
 
   case 444:
-#line 4967 "Gmsh.y"
-    { floatOptions.clear(); charOptions.clear(); ;}
+#line 4983 "Gmsh.y"
+    {
+      std::string struct_namespace((yyvsp[(2) - (3)].c2).char1? (yyvsp[(2) - (3)].c2).char1 : std::string("")),
+        struct_name((yyvsp[(2) - (3)].c2).char2);
+      init_Options
+        (nameSpaces.getMember_ValMax(struct_namespace, struct_name));
+    ;}
     break;
 
   case 445:
-#line 4969 "Gmsh.y"
+#line 4990 "Gmsh.y"
     {
       std::string struct_namespace((yyvsp[(2) - (7)].c2).char1? (yyvsp[(2) - (7)].c2).char1 : std::string("")),
         struct_name((yyvsp[(2) - (7)].c2).char2);
       Free((yyvsp[(2) - (7)].c2).char1); Free((yyvsp[(2) - (7)].c2).char2);
       int tag_out;
       if (nameSpaces.defStruct(struct_namespace, struct_name,
-                               floatOptions, charOptions, tag_out, (yyvsp[(3) - (7)].i)))
+                               floatOptions, charOptions,
+                               tag_out, member_ValMax, (yyvsp[(3) - (7)].i)))
         yymsg(0, "Redefinition of Struct '%s::%s'",
               struct_namespace.c_str(), struct_name.c_str());
       (yyval.d) = (double)tag_out;
@@ -11632,105 +11654,105 @@ yyreduce:
     break;
 
   case 446:
-#line 4984 "Gmsh.y"
+#line 5006 "Gmsh.y"
     { (yyval.c2).char1 = NULL; (yyval.c2).char2 = (yyvsp[(1) - (1)].c); ;}
     break;
 
   case 447:
-#line 4986 "Gmsh.y"
+#line 5008 "Gmsh.y"
     { (yyval.c2).char1 = (yyvsp[(1) - (3)].c); (yyval.c2).char2 = (yyvsp[(3) - (3)].c); ;}
     break;
 
   case 448:
-#line 4991 "Gmsh.y"
+#line 5013 "Gmsh.y"
     { (yyval.c) = (yyvsp[(1) - (1)].c); flag_tSTRING_alloc = 1; ;}
     break;
 
   case 449:
-#line 5000 "Gmsh.y"
+#line 5022 "Gmsh.y"
     { (yyval.i) = 99; ;}
     break;
 
   case 450:
-#line 5002 "Gmsh.y"
+#line 5024 "Gmsh.y"
     { (yyval.i) = (int)(yyvsp[(2) - (2)].d); ;}
     break;
 
   case 451:
-#line 5007 "Gmsh.y"
+#line 5029 "Gmsh.y"
     { (yyval.i) = 0; ;}
     break;
 
   case 452:
-#line 5009 "Gmsh.y"
+#line 5031 "Gmsh.y"
     { (yyval.i) = (yyvsp[(2) - (3)].i); ;}
     break;
 
   case 453:
-#line 5015 "Gmsh.y"
+#line 5037 "Gmsh.y"
     {
       memcpy((yyval.v), (yyvsp[(1) - (1)].v), 5*sizeof(double));
     ;}
     break;
 
   case 454:
-#line 5019 "Gmsh.y"
+#line 5041 "Gmsh.y"
     {
       for(int i = 0; i < 5; i++) (yyval.v)[i] = -(yyvsp[(2) - (2)].v)[i];
     ;}
     break;
 
   case 455:
-#line 5023 "Gmsh.y"
+#line 5045 "Gmsh.y"
     {
       for(int i = 0; i < 5; i++) (yyval.v)[i] = (yyvsp[(2) - (2)].v)[i];
     ;}
     break;
 
   case 456:
-#line 5027 "Gmsh.y"
+#line 5049 "Gmsh.y"
     {
       for(int i = 0; i < 5; i++) (yyval.v)[i] = (yyvsp[(1) - (3)].v)[i] - (yyvsp[(3) - (3)].v)[i];
     ;}
     break;
 
   case 457:
-#line 5031 "Gmsh.y"
+#line 5053 "Gmsh.y"
     {
       for(int i = 0; i < 5; i++) (yyval.v)[i] = (yyvsp[(1) - (3)].v)[i] + (yyvsp[(3) - (3)].v)[i];
     ;}
     break;
 
   case 458:
-#line 5038 "Gmsh.y"
+#line 5060 "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 459:
-#line 5042 "Gmsh.y"
+#line 5064 "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 460:
-#line 5046 "Gmsh.y"
+#line 5068 "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 461:
-#line 5050 "Gmsh.y"
+#line 5072 "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 462:
-#line 5057 "Gmsh.y"
+#line 5079 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(List_T*));
       List_Add((yyval.l), &((yyvsp[(1) - (1)].l)));
@@ -11738,14 +11760,14 @@ yyreduce:
     break;
 
   case 463:
-#line 5062 "Gmsh.y"
+#line 5084 "Gmsh.y"
     {
       List_Add((yyval.l), &((yyvsp[(3) - (3)].l)));
     ;}
     break;
 
   case 464:
-#line 5069 "Gmsh.y"
+#line 5091 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       List_Add((yyval.l), &((yyvsp[(1) - (1)].d)));
@@ -11753,14 +11775,14 @@ yyreduce:
     break;
 
   case 465:
-#line 5074 "Gmsh.y"
+#line 5096 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(1) - (1)].l);
     ;}
     break;
 
   case 466:
-#line 5078 "Gmsh.y"
+#line 5100 "Gmsh.y"
     {
       // creates an empty list
       (yyval.l) = List_Create(2, 1, sizeof(double));
@@ -11768,14 +11790,14 @@ yyreduce:
     break;
 
   case 467:
-#line 5083 "Gmsh.y"
+#line 5105 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(2) - (3)].l);
     ;}
     break;
 
   case 468:
-#line 5087 "Gmsh.y"
+#line 5109 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(3) - (4)].l);
       for(int i = 0; i < List_Nbr((yyval.l)); i++){
@@ -11786,7 +11808,7 @@ yyreduce:
     break;
 
   case 469:
-#line 5095 "Gmsh.y"
+#line 5117 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(4) - (5)].l);
       for(int i = 0; i < List_Nbr((yyval.l)); i++){
@@ -11797,14 +11819,14 @@ yyreduce:
     break;
 
   case 470:
-#line 5106 "Gmsh.y"
+#line 5128 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(1) - (1)].l);
     ;}
     break;
 
   case 471:
-#line 5110 "Gmsh.y"
+#line 5132 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(1) - (1)].c), "*") || !strcmp((yyvsp[(1) - (1)].c), "all"))
         (yyval.l) = 0;
@@ -11816,7 +11838,7 @@ yyreduce:
     break;
 
   case 472:
-#line 5122 "Gmsh.y"
+#line 5144 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(2) - (2)].l);
       for(int i = 0; i < List_Nbr((yyval.l)); i++){
@@ -11827,7 +11849,7 @@ yyreduce:
     break;
 
   case 473:
-#line 5130 "Gmsh.y"
+#line 5152 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(3) - (3)].l);
       for(int i = 0; i < List_Nbr((yyval.l)); i++){
@@ -11838,7 +11860,7 @@ yyreduce:
     break;
 
   case 474:
-#line 5138 "Gmsh.y"
+#line 5160 "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));
@@ -11848,7 +11870,7 @@ yyreduce:
     break;
 
   case 475:
-#line 5145 "Gmsh.y"
+#line 5167 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       if(!(yyvsp[(5) - (5)].d)){  //|| ($1 < $3 && $5 < 0) || ($1 > $3 && $5 > 0)
@@ -11861,7 +11883,7 @@ yyreduce:
     break;
 
   case 476:
-#line 5155 "Gmsh.y"
+#line 5177 "Gmsh.y"
     {
       (yyval.l) = List_Create(3, 1, sizeof(double));
       int tag = (int)(yyvsp[(3) - (4)].d);
@@ -11887,7 +11909,7 @@ yyreduce:
     break;
 
   case 477:
-#line 5178 "Gmsh.y"
+#line 5200 "Gmsh.y"
     {
       (yyval.l) = List_Create(10, 10, sizeof(double));
       getAllElementaryTags(0, (yyval.l));
@@ -11896,7 +11918,7 @@ yyreduce:
     break;
 
   case 478:
-#line 5184 "Gmsh.y"
+#line 5206 "Gmsh.y"
     {
       (yyval.l) = List_Create(10, 10, sizeof(double));
       getAllElementaryTags(1, (yyval.l));
@@ -11905,7 +11927,7 @@ yyreduce:
     break;
 
   case 479:
-#line 5190 "Gmsh.y"
+#line 5212 "Gmsh.y"
     {
       (yyval.l) = List_Create(10, 10, sizeof(double));
       getAllElementaryTags(2, (yyval.l));
@@ -11914,7 +11936,7 @@ yyreduce:
     break;
 
   case 480:
-#line 5196 "Gmsh.y"
+#line 5218 "Gmsh.y"
     {
       (yyval.l) = List_Create(10, 10, sizeof(double));
       getAllElementaryTags(3, (yyval.l));
@@ -11923,7 +11945,7 @@ yyreduce:
     break;
 
   case 481:
-#line 5202 "Gmsh.y"
+#line 5224 "Gmsh.y"
     {
       (yyval.l) = List_Create(10, 10, sizeof(double));
       if(!(yyvsp[(3) - (3)].l)){
@@ -11937,7 +11959,7 @@ yyreduce:
     break;
 
   case 482:
-#line 5213 "Gmsh.y"
+#line 5235 "Gmsh.y"
     {
       (yyval.l) = List_Create(10, 10, sizeof(double));
       if(!(yyvsp[(3) - (3)].l)){
@@ -11951,7 +11973,7 @@ yyreduce:
     break;
 
   case 483:
-#line 5224 "Gmsh.y"
+#line 5246 "Gmsh.y"
     {
       (yyval.l) = List_Create(10, 10, sizeof(double));
       if(!(yyvsp[(3) - (3)].l)){
@@ -11965,7 +11987,7 @@ yyreduce:
     break;
 
   case 484:
-#line 5235 "Gmsh.y"
+#line 5257 "Gmsh.y"
     {
       (yyval.l) = List_Create(10, 10, sizeof(double));
       if(!(yyvsp[(3) - (3)].l)){
@@ -11979,7 +12001,7 @@ yyreduce:
     break;
 
   case 485:
-#line 5247 "Gmsh.y"
+#line 5269 "Gmsh.y"
     {
       (yyval.l) = List_Create(10, 10, sizeof(double));
       getElementaryTagsInBoundingBox(0, (yyvsp[(5) - (16)].d), (yyvsp[(7) - (16)].d), (yyvsp[(9) - (16)].d), (yyvsp[(11) - (16)].d), (yyvsp[(13) - (16)].d), (yyvsp[(15) - (16)].d), (yyval.l));
@@ -11987,7 +12009,7 @@ yyreduce:
     break;
 
   case 486:
-#line 5253 "Gmsh.y"
+#line 5275 "Gmsh.y"
     {
       (yyval.l) = List_Create(10, 10, sizeof(double));
       getElementaryTagsInBoundingBox(1, (yyvsp[(5) - (16)].d), (yyvsp[(7) - (16)].d), (yyvsp[(9) - (16)].d), (yyvsp[(11) - (16)].d), (yyvsp[(13) - (16)].d), (yyvsp[(15) - (16)].d), (yyval.l));
@@ -11995,7 +12017,7 @@ yyreduce:
     break;
 
   case 487:
-#line 5259 "Gmsh.y"
+#line 5281 "Gmsh.y"
     {
       (yyval.l) = List_Create(10, 10, sizeof(double));
       getElementaryTagsInBoundingBox(2, (yyvsp[(5) - (16)].d), (yyvsp[(7) - (16)].d), (yyvsp[(9) - (16)].d), (yyvsp[(11) - (16)].d), (yyvsp[(13) - (16)].d), (yyvsp[(15) - (16)].d), (yyval.l));
@@ -12003,7 +12025,7 @@ yyreduce:
     break;
 
   case 488:
-#line 5265 "Gmsh.y"
+#line 5287 "Gmsh.y"
     {
       (yyval.l) = List_Create(10, 10, sizeof(double));
       getElementaryTagsInBoundingBox(3, (yyvsp[(5) - (16)].d), (yyvsp[(7) - (16)].d), (yyvsp[(9) - (16)].d), (yyvsp[(11) - (16)].d), (yyvsp[(13) - (16)].d), (yyvsp[(15) - (16)].d), (yyval.l));
@@ -12011,7 +12033,7 @@ yyreduce:
     break;
 
   case 489:
-#line 5270 "Gmsh.y"
+#line 5292 "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++){
@@ -12024,7 +12046,7 @@ yyreduce:
     break;
 
   case 490:
-#line 5280 "Gmsh.y"
+#line 5302 "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++){
@@ -12037,7 +12059,7 @@ yyreduce:
     break;
 
   case 491:
-#line 5290 "Gmsh.y"
+#line 5312 "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++){
@@ -12050,7 +12072,7 @@ yyreduce:
     break;
 
   case 492:
-#line 5300 "Gmsh.y"
+#line 5322 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       if(!gmsh_yysymbols.count((yyvsp[(1) - (3)].c)))
@@ -12065,7 +12087,7 @@ yyreduce:
     break;
 
   case 493:
-#line 5313 "Gmsh.y"
+#line 5335 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       if(!gmsh_yysymbols.count((yyvsp[(3) - (4)].c)))
@@ -12080,28 +12102,28 @@ yyreduce:
     break;
 
   case 494:
-#line 5325 "Gmsh.y"
+#line 5347 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(3) - (4)].l);
     ;}
     break;
 
   case 495:
-#line 5329 "Gmsh.y"
+#line 5351 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(3) - (4)].l);
     ;}
     break;
 
   case 496:
-#line 5333 "Gmsh.y"
+#line 5355 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(4) - (6)].l);
     ;}
     break;
 
   case 497:
-#line 5337 "Gmsh.y"
+#line 5359 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       if(!gmsh_yysymbols.count((yyvsp[(1) - (6)].c)))
@@ -12122,7 +12144,7 @@ yyreduce:
     break;
 
   case 498:
-#line 5355 "Gmsh.y"
+#line 5377 "Gmsh.y"
     {
       (yyval.l) = List_Create(20,20,sizeof(double));
       for(int i = 0; i < (int)(yyvsp[(7) - (8)].d); i++) {
@@ -12133,7 +12155,7 @@ yyreduce:
     break;
 
   case 499:
-#line 5363 "Gmsh.y"
+#line 5385 "Gmsh.y"
     {
       (yyval.l) = List_Create(20,20,sizeof(double));
       for(int i = 0; i < (int)(yyvsp[(7) - (8)].d); i++) {
@@ -12144,7 +12166,7 @@ yyreduce:
     break;
 
   case 500:
-#line 5371 "Gmsh.y"
+#line 5393 "Gmsh.y"
     {
       Msg::Barrier();
       FILE *File;
@@ -12176,7 +12198,7 @@ yyreduce:
     break;
 
   case 501:
-#line 5400 "Gmsh.y"
+#line 5422 "Gmsh.y"
     {
       double x0 = (yyvsp[(3) - (14)].d), x1 = (yyvsp[(5) - (14)].d), y0 = (yyvsp[(7) - (14)].d), y1 = (yyvsp[(9) - (14)].d), ys = (yyvsp[(11) - (14)].d);
       int N = (int)(yyvsp[(13) - (14)].d);
@@ -12189,7 +12211,7 @@ yyreduce:
     break;
 
   case 502:
-#line 5410 "Gmsh.y"
+#line 5432 "Gmsh.y"
     {
       std::vector<double> tmp;
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (4)].l)); i++){
@@ -12208,7 +12230,7 @@ yyreduce:
     break;
 
   case 503:
-#line 5426 "Gmsh.y"
+#line 5448 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (4)].l)); i++){
         double *d = (double*)List_Pointer((yyvsp[(3) - (4)].l), i);
@@ -12219,7 +12241,7 @@ yyreduce:
     break;
 
   case 504:
-#line 5437 "Gmsh.y"
+#line 5459 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       List_Add((yyval.l), &((yyvsp[(1) - (1)].d)));
@@ -12227,21 +12249,21 @@ yyreduce:
     break;
 
   case 505:
-#line 5442 "Gmsh.y"
+#line 5464 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(1) - (1)].l);
     ;}
     break;
 
   case 506:
-#line 5446 "Gmsh.y"
+#line 5468 "Gmsh.y"
     {
       List_Add((yyval.l), &((yyvsp[(3) - (3)].d)));
     ;}
     break;
 
   case 507:
-#line 5450 "Gmsh.y"
+#line 5472 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (3)].l)); i++){
 	double d;
@@ -12253,21 +12275,21 @@ yyreduce:
     break;
 
   case 508:
-#line 5462 "Gmsh.y"
+#line 5484 "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 509:
-#line 5466 "Gmsh.y"
+#line 5488 "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 510:
-#line 5478 "Gmsh.y"
+#line 5500 "Gmsh.y"
     {
       int flag = 0;
       if(gmsh_yystringsymbols.count((yyvsp[(1) - (1)].c))){
@@ -12287,7 +12309,7 @@ yyreduce:
     break;
 
   case 511:
-#line 5495 "Gmsh.y"
+#line 5517 "Gmsh.y"
     {
       unsigned int val = 0;
       ColorOption(GMSH_GET, (yyvsp[(1) - (5)].c), 0, (yyvsp[(5) - (5)].c), val);
@@ -12297,14 +12319,14 @@ yyreduce:
     break;
 
   case 512:
-#line 5505 "Gmsh.y"
+#line 5527 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(2) - (3)].l);
     ;}
     break;
 
   case 513:
-#line 5509 "Gmsh.y"
+#line 5531 "Gmsh.y"
     {
       (yyval.l) = List_Create(256, 10, sizeof(unsigned int));
       GmshColorTable *ct = GetColorTable((int)(yyvsp[(3) - (6)].d));
@@ -12319,7 +12341,7 @@ yyreduce:
     break;
 
   case 514:
-#line 5524 "Gmsh.y"
+#line 5546 "Gmsh.y"
     {
       (yyval.l) = List_Create(256, 10, sizeof(unsigned int));
       List_Add((yyval.l), &((yyvsp[(1) - (1)].u)));
@@ -12327,21 +12349,21 @@ yyreduce:
     break;
 
   case 515:
-#line 5529 "Gmsh.y"
+#line 5551 "Gmsh.y"
     {
       List_Add((yyval.l), &((yyvsp[(3) - (3)].u)));
     ;}
     break;
 
   case 516:
-#line 5536 "Gmsh.y"
+#line 5558 "Gmsh.y"
     {
       (yyval.c) = (yyvsp[(1) - (1)].c);
     ;}
     break;
 
   case 517:
-#line 5540 "Gmsh.y"
+#line 5562 "Gmsh.y"
     {
       std::string val;
       if(!gmsh_yystringsymbols.count((yyvsp[(1) - (1)].c)))
@@ -12357,7 +12379,7 @@ yyreduce:
     break;
 
   case 518:
-#line 5553 "Gmsh.y"
+#line 5575 "Gmsh.y"
     {
       std::string val;
       int j = (int)(yyvsp[(3) - (4)].d);
@@ -12374,7 +12396,7 @@ yyreduce:
     break;
 
   case 519:
-#line 5567 "Gmsh.y"
+#line 5589 "Gmsh.y"
     {
       std::string val;
       int j = (int)(yyvsp[(3) - (4)].d);
@@ -12391,7 +12413,7 @@ yyreduce:
     break;
 
   case 520:
-#line 5584 "Gmsh.y"
+#line 5606 "Gmsh.y"
     {
       (yyval.c) = treat_Struct_FullName_dot_tSTRING_String(NULL, (yyvsp[(1) - (3)].c), (yyvsp[(3) - (3)].c));
       /*
@@ -12422,12 +12444,12 @@ yyreduce:
     break;
 
   case 521:
-#line 5612 "Gmsh.y"
+#line 5634 "Gmsh.y"
     { (yyval.c) = treat_Struct_FullName_dot_tSTRING_String((yyvsp[(1) - (5)].c), (yyvsp[(3) - (5)].c), (yyvsp[(5) - (5)].c)); ;}
     break;
 
   case 522:
-#line 5616 "Gmsh.y"
+#line 5638 "Gmsh.y"
     {
       std::string out;
       StringOption(GMSH_GET, (yyvsp[(1) - (6)].c), (int)(yyvsp[(3) - (6)].d), (yyvsp[(6) - (6)].c), out);
@@ -12438,7 +12460,7 @@ yyreduce:
     break;
 
   case 523:
-#line 5624 "Gmsh.y"
+#line 5646 "Gmsh.y"
     {
       std::string name = GModel::current()->getPhysicalName(0, (int)(yyvsp[(4) - (5)].d));
       (yyval.c) = (char*)Malloc((name.size() + 1) * sizeof(char));
@@ -12447,7 +12469,7 @@ yyreduce:
     break;
 
   case 524:
-#line 5630 "Gmsh.y"
+#line 5652 "Gmsh.y"
     {
       std::string name = GModel::current()->getPhysicalName(1, (int)(yyvsp[(4) - (5)].d));
       (yyval.c) = (char*)Malloc((name.size() + 1) * sizeof(char));
@@ -12456,7 +12478,7 @@ yyreduce:
     break;
 
   case 525:
-#line 5636 "Gmsh.y"
+#line 5658 "Gmsh.y"
     {
       std::string name = GModel::current()->getPhysicalName(2, (int)(yyvsp[(4) - (5)].d));
       (yyval.c) = (char*)Malloc((name.size() + 1) * sizeof(char));
@@ -12465,7 +12487,7 @@ yyreduce:
     break;
 
   case 526:
-#line 5642 "Gmsh.y"
+#line 5664 "Gmsh.y"
     {
       std::string name = GModel::current()->getPhysicalName(3, (int)(yyvsp[(4) - (5)].d));
       (yyval.c) = (char*)Malloc((name.size() + 1) * sizeof(char));
@@ -12474,21 +12496,21 @@ yyreduce:
     break;
 
   case 527:
-#line 5651 "Gmsh.y"
+#line 5673 "Gmsh.y"
     {
       (yyval.c) = (yyvsp[(1) - (1)].c);
     ;}
     break;
 
   case 528:
-#line 5655 "Gmsh.y"
+#line 5677 "Gmsh.y"
     {
       (yyval.c) = (yyvsp[(3) - (4)].c);
     ;}
     break;
 
   case 529:
-#line 5659 "Gmsh.y"
+#line 5681 "Gmsh.y"
     {
       (yyval.c) = (char *)Malloc(32 * sizeof(char));
       time_t now;
@@ -12499,7 +12521,7 @@ yyreduce:
     break;
 
   case 530:
-#line 5667 "Gmsh.y"
+#line 5689 "Gmsh.y"
     {
       std::string exe = Msg::GetExecutableName();
       (yyval.c) = (char *)Malloc(exe.size() + 1);
@@ -12508,7 +12530,7 @@ yyreduce:
     break;
 
   case 531:
-#line 5673 "Gmsh.y"
+#line 5695 "Gmsh.y"
     {
       std::string action = Msg::GetOnelabAction();
       (yyval.c) = (char *)Malloc(action.size() + 1);
@@ -12517,7 +12539,7 @@ yyreduce:
     break;
 
   case 532:
-#line 5679 "Gmsh.y"
+#line 5701 "Gmsh.y"
     {
       const char *env = GetEnvironmentVar((yyvsp[(3) - (4)].c));
       if(!env) env = "";
@@ -12528,7 +12550,7 @@ yyreduce:
     break;
 
   case 533:
-#line 5687 "Gmsh.y"
+#line 5709 "Gmsh.y"
     {
       std::string s = Msg::GetString((yyvsp[(3) - (6)].c), (yyvsp[(5) - (6)].c));
       (yyval.c) = (char *)Malloc((s.size() + 1) * sizeof(char));
@@ -12539,7 +12561,7 @@ yyreduce:
     break;
 
   case 534:
-#line 5695 "Gmsh.y"
+#line 5717 "Gmsh.y"
     {
       std::string s = Msg::GetOnelabString((yyvsp[(3) - (4)].c));
       (yyval.c) = (char *)Malloc((s.size() + 1) * sizeof(char));
@@ -12549,7 +12571,7 @@ yyreduce:
     break;
 
   case 535:
-#line 5702 "Gmsh.y"
+#line 5724 "Gmsh.y"
     {
       std::string s = Msg::GetOnelabString((yyvsp[(3) - (6)].c), (yyvsp[(5) - (6)].c));
       (yyval.c) = (char *)Malloc((s.size() + 1) * sizeof(char));
@@ -12560,7 +12582,7 @@ yyreduce:
     break;
 
   case 536:
-#line 5710 "Gmsh.y"
+#line 5732 "Gmsh.y"
     {
       int size = 1;
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (4)].l)); i++)
@@ -12578,7 +12600,7 @@ yyreduce:
     break;
 
   case 537:
-#line 5725 "Gmsh.y"
+#line 5747 "Gmsh.y"
     {
       (yyval.c) = (char *)Malloc((strlen((yyvsp[(3) - (4)].c)) + 1) * sizeof(char));
       int i;
@@ -12595,7 +12617,7 @@ yyreduce:
     break;
 
   case 538:
-#line 5739 "Gmsh.y"
+#line 5761 "Gmsh.y"
     {
       (yyval.c) = (char *)Malloc((strlen((yyvsp[(3) - (4)].c)) + 1) * sizeof(char));
       int i;
@@ -12612,7 +12634,7 @@ yyreduce:
     break;
 
   case 539:
-#line 5753 "Gmsh.y"
+#line 5775 "Gmsh.y"
     {
       std::string input = (yyvsp[(3) - (8)].c);
       std::string substr_old = (yyvsp[(5) - (8)].c);
@@ -12627,7 +12649,7 @@ yyreduce:
     break;
 
   case 540:
-#line 5765 "Gmsh.y"
+#line 5787 "Gmsh.y"
     {
       int size = 1;
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (4)].l)); i++)
@@ -12646,7 +12668,7 @@ yyreduce:
     break;
 
   case 541:
-#line 5781 "Gmsh.y"
+#line 5803 "Gmsh.y"
     {
       int i = 0;
       while ((yyvsp[(3) - (4)].c)[i]) {
@@ -12658,7 +12680,7 @@ yyreduce:
     break;
 
   case 542:
-#line 5790 "Gmsh.y"
+#line 5812 "Gmsh.y"
     {
       int i = 0;
       while ((yyvsp[(3) - (4)].c)[i]) {
@@ -12670,7 +12692,7 @@ yyreduce:
     break;
 
   case 543:
-#line 5799 "Gmsh.y"
+#line 5821 "Gmsh.y"
     {
       int i = 0;
       while ((yyvsp[(3) - (4)].c)[i]) {
@@ -12683,7 +12705,7 @@ yyreduce:
     break;
 
   case 544:
-#line 5809 "Gmsh.y"
+#line 5831 "Gmsh.y"
     {
       if((yyvsp[(3) - (8)].d)){
         (yyval.c) = (yyvsp[(5) - (8)].c);
@@ -12697,7 +12719,7 @@ yyreduce:
     break;
 
   case 545:
-#line 5820 "Gmsh.y"
+#line 5842 "Gmsh.y"
     {
       std::string in = (yyvsp[(3) - (8)].c);
       std::string out = in.substr((int)(yyvsp[(5) - (8)].d), (int)(yyvsp[(7) - (8)].d));
@@ -12708,7 +12730,7 @@ yyreduce:
     break;
 
   case 546:
-#line 5828 "Gmsh.y"
+#line 5850 "Gmsh.y"
     {
       std::string in = (yyvsp[(3) - (6)].c);
       std::string out = in.substr((int)(yyvsp[(5) - (6)].d), std::string::npos);
@@ -12719,14 +12741,14 @@ yyreduce:
     break;
 
   case 547:
-#line 5836 "Gmsh.y"
+#line 5858 "Gmsh.y"
     {
       (yyval.c) = (yyvsp[(3) - (4)].c);
     ;}
     break;
 
   case 548:
-#line 5840 "Gmsh.y"
+#line 5862 "Gmsh.y"
     {
       char tmpstring[5000];
       int i = printListOfDouble((yyvsp[(3) - (6)].c), (yyvsp[(5) - (6)].l), tmpstring);
@@ -12748,7 +12770,7 @@ yyreduce:
     break;
 
   case 549:
-#line 5859 "Gmsh.y"
+#line 5881 "Gmsh.y"
     {
       std::string tmp = FixRelativePath(gmsh_yyname, (yyvsp[(3) - (4)].c));
       (yyval.c) = (char*)Malloc((tmp.size() + 1) * sizeof(char));
@@ -12758,7 +12780,7 @@ yyreduce:
     break;
 
   case 550:
-#line 5866 "Gmsh.y"
+#line 5888 "Gmsh.y"
     {
       std::string tmp = SplitFileName(GetAbsolutePath(gmsh_yyname))[0];
       (yyval.c) = (char*)Malloc((tmp.size() + 1) * sizeof(char));
@@ -12767,7 +12789,7 @@ yyreduce:
     break;
 
   case 551:
-#line 5872 "Gmsh.y"
+#line 5894 "Gmsh.y"
     {
       std::string tmp = SplitFileName((yyvsp[(3) - (4)].c))[0];
       (yyval.c) = (char*)Malloc((tmp.size() + 1) * sizeof(char));
@@ -12777,7 +12799,7 @@ yyreduce:
     break;
 
   case 552:
-#line 5879 "Gmsh.y"
+#line 5901 "Gmsh.y"
     {
       std::string tmp = GetAbsolutePath((yyvsp[(3) - (4)].c));
       (yyval.c) = (char*)Malloc((tmp.size() + 1) * sizeof(char));
@@ -12787,12 +12809,12 @@ yyreduce:
     break;
 
   case 553:
-#line 5886 "Gmsh.y"
-    { floatOptions.clear(); charOptions.clear(); ;}
+#line 5908 "Gmsh.y"
+    { init_Options(); ;}
     break;
 
   case 554:
-#line 5888 "Gmsh.y"
+#line 5910 "Gmsh.y"
     {
       std::string val((yyvsp[(3) - (6)].c));
       Msg::ExchangeOnelabParameter("", val, floatOptions, charOptions);
@@ -12803,7 +12825,7 @@ yyreduce:
     break;
 
   case 555:
-#line 5896 "Gmsh.y"
+#line 5918 "Gmsh.y"
     {
       std::string out;
       const std::string * key_struct = NULL;
@@ -12827,17 +12849,17 @@ yyreduce:
     break;
 
   case 556:
-#line 5920 "Gmsh.y"
+#line 5942 "Gmsh.y"
     { struct_namespace = std::string(""); (yyval.d) = (yyvsp[(2) - (2)].d); ;}
     break;
 
   case 557:
-#line 5922 "Gmsh.y"
+#line 5944 "Gmsh.y"
     { struct_namespace = (yyvsp[(1) - (4)].c); Free((yyvsp[(1) - (4)].c)); (yyval.d) = (yyvsp[(4) - (4)].d); ;}
     break;
 
   case 558:
-#line 5928 "Gmsh.y"
+#line 5950 "Gmsh.y"
     {
       (yyval.l) = List_Create(20,20,sizeof(char*));
       List_Add((yyval.l), &((yyvsp[(1) - (1)].c)));
@@ -12845,14 +12867,14 @@ yyreduce:
     break;
 
   case 559:
-#line 5933 "Gmsh.y"
+#line 5955 "Gmsh.y"
     {
       List_Add((yyval.l), &((yyvsp[(3) - (3)].c)));
     ;}
     break;
 
   case 560:
-#line 5941 "Gmsh.y"
+#line 5963 "Gmsh.y"
     {
       char tmpstr[256];
       sprintf(tmpstr, "_%d", (int)(yyvsp[(4) - (5)].d));
@@ -12863,7 +12885,7 @@ yyreduce:
     break;
 
   case 561:
-#line 5950 "Gmsh.y"
+#line 5972 "Gmsh.y"
     {
       char tmpstr[256];
       sprintf(tmpstr, "_%d", (int)(yyvsp[(4) - (5)].d));
@@ -12874,23 +12896,23 @@ yyreduce:
     break;
 
   case 562:
-#line 5963 "Gmsh.y"
+#line 5985 "Gmsh.y"
     { (yyval.c) = (yyvsp[(1) - (1)].c); ;}
     break;
 
   case 563:
-#line 5966 "Gmsh.y"
+#line 5988 "Gmsh.y"
     { (yyval.c) = (yyvsp[(1) - (1)].c); ;}
     break;
 
   case 564:
-#line 5970 "Gmsh.y"
+#line 5992 "Gmsh.y"
     { (yyval.c) = (yyvsp[(3) - (4)].c); ;}
     break;
 
 
 /* Line 1267 of yacc.c.  */
-#line 12894 "Gmsh.tab.cpp"
+#line 12916 "Gmsh.tab.cpp"
       default: break;
     }
   YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
@@ -13104,7 +13126,7 @@ yyreturn:
 }
 
 
-#line 5973 "Gmsh.y"
+#line 5995 "Gmsh.y"
 
 
 void assignVariable(const std::string &name, int index, int assignType,
diff --git a/Parser/Gmsh.tab.hpp b/Parser/Gmsh.tab.hpp
index 3065a85ef359c216a426585951dc3c15008c7c27..16a4578c94bb319dd9f285f7a8fe0400fd498248 100644
--- a/Parser/Gmsh.tab.hpp
+++ b/Parser/Gmsh.tab.hpp
@@ -482,7 +482,7 @@
 
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
 typedef union YYSTYPE
-#line 139 "Gmsh.y"
+#line 147 "Gmsh.y"
 {
   char *c;
   int i;
diff --git a/Parser/Gmsh.y b/Parser/Gmsh.y
index 6b99274916e67b0b79eb840bfcfd9d993e5e36c9..30e8e6ecd01d30ab7c772302665799f4899cbf9f 100644
--- a/Parser/Gmsh.y
+++ b/Parser/Gmsh.y
@@ -84,13 +84,21 @@ static gmshfpos_t yyposImbricatedLoopsTab[MAX_RECUR_LOOPS];
 static int yylinenoImbricatedLoopsTab[MAX_RECUR_LOOPS];
 static double LoopControlVariablesTab[MAX_RECUR_LOOPS][3];
 static std::string LoopControlVariablesNameTab[MAX_RECUR_LOOPS];
-static std::map<std::string, std::vector<double> > floatOptions;
-static std::map<std::string, std::vector<std::string> > charOptions;
 static std::string factory;
 static NameSpaces nameSpaces;
 static std::string struct_name, struct_namespace;
 static int flag_tSTRING_alloc = 0;
 
+static std::map<std::string, std::vector<double> > floatOptions;
+static std::map<std::string, std::vector<std::string> > charOptions;
+static int flag_Enum, member_ValMax;
+
+void init_Options(int member_ValMax_ = 0)
+{
+  floatOptions.clear(); charOptions.clear();
+  flag_Enum = 0; member_ValMax = member_ValMax_;
+}
+
 // parser functions defined at the end of this file
 void yyerror(const char *s);
 void yymsg(int level, const char *fmt, ...);
@@ -1227,7 +1235,7 @@ DefineConstants :
       Free($3);
     }
   | DefineConstants Comma String__Index tAFFECT '{' ListOfDouble
-    { floatOptions.clear(); charOptions.clear(); }
+    { init_Options(); }
     FloatParameterOptionsOrNone '}'
     {
       if(List_Nbr($6) != 1)
@@ -1247,7 +1255,7 @@ DefineConstants :
       Free($6);
     }
   | DefineConstants Comma String__Index LP RP tAFFECT '{' ListOfDouble
-    { floatOptions.clear(); charOptions.clear(); }
+    { init_Options(); }
     FloatParameterOptionsOrNone '}'
     {
       std::string key($3);
@@ -1274,7 +1282,7 @@ DefineConstants :
       Free($5);
     }
   | DefineConstants Comma String__Index tAFFECT '{' StringExpr
-    { floatOptions.clear(); charOptions.clear(); }
+    { init_Options(); }
       CharParameterOptionsOrNone '}'
     {
       std::string key($3), val($6);
@@ -1357,6 +1365,7 @@ FloatParameterOption :
         double v;
         List_Read($2, i, &v);
         floatOptions[key].push_back(v);
+        if (flag_Enum && !i) { member_ValMax = (int)v; }
       }
       Free($1);
       List_Delete($2);
@@ -1364,7 +1373,14 @@ FloatParameterOption :
   | tSTRING
     {
       std::string key($1);
-      floatOptions[key].push_back(1.);
+      double v;
+      if (!flag_Enum) {
+        v = 1.;
+        if (key == "Enum") flag_Enum = 1;
+      }
+      else
+        v = (double)++member_ValMax;
+      floatOptions[key].push_back(v);
       Free($1);
     }
   | tSTRING '{' Enumeration '}'
@@ -4660,7 +4676,7 @@ FExpr_Single :
   // Variables
 
   | tDefineNumber LP FExpr
-    { floatOptions.clear(); charOptions.clear(); }
+    { init_Options(); }
     FloatParameterOptionsOrNone RP
     {
       std::vector<double> val(1, $3);
@@ -4964,7 +4980,12 @@ FExpr_Single :
 
 DefineStruct :
     tDefineStruct Struct_FullName AppendOrNot
-    { floatOptions.clear(); charOptions.clear(); }
+    {
+      std::string struct_namespace($2.char1? $2.char1 : std::string("")),
+        struct_name($2.char2);
+      init_Options
+        (nameSpaces.getMember_ValMax(struct_namespace, struct_name));
+    }
     '[' FloatParameterOptionsOrNone_NoComma ']'
     {
       std::string struct_namespace($2.char1? $2.char1 : std::string("")),
@@ -4972,7 +4993,8 @@ DefineStruct :
       Free($2.char1); Free($2.char2);
       int tag_out;
       if (nameSpaces.defStruct(struct_namespace, struct_name,
-                               floatOptions, charOptions, tag_out, $3))
+                               floatOptions, charOptions,
+                               tag_out, member_ValMax, $3))
         yymsg(0, "Redefinition of Struct '%s::%s'",
               struct_namespace.c_str(), struct_name.c_str());
       $$ = (double)tag_out;
@@ -5883,7 +5905,7 @@ StringExpr :
       Free($3);
     }
   | tDefineString LP StringExpr
-    { floatOptions.clear(); charOptions.clear(); }
+    { init_Options(); }
     CharParameterOptionsOrNone RP
     {
       std::string val($3);
diff --git a/Parser/Parser.h b/Parser/Parser.h
index 9be0626d4469ad840094fd74842eca7b9c019a07..3005851cf36f1340a43bb28021e37e6af4d5c6f1 100644
--- a/Parser/Parser.h
+++ b/Parser/Parser.h
@@ -36,22 +36,27 @@ public:
   Struct() {}
   Struct(int tag,
          std::map<std::string, std::vector<double> > & fopt,
-         std::map<std::string, std::vector<std::string> > & copt) :
-    _tag(tag), _fopt(fopt), _copt(copt) {}
+         std::map<std::string, std::vector<std::string> > & copt,
+         int member_ValMax) :
+    _tag(tag), _member_ValMax(member_ValMax), _fopt(fopt), _copt(copt) {}
   ~Struct() {}
 
   int append(int tag,
              std::map<std::string, std::vector<double> > & fopt,
-             std::map<std::string, std::vector<std::string> > & copt) {
+             std::map<std::string, std::vector<std::string> > & copt,
+             int member_ValMax)
+  {
     _fopt.insert(fopt.begin(), fopt.end());
     _copt.insert(copt.begin(), copt.end());
+    _member_ValMax = member_ValMax;
     if (tag >= 0) _tag = tag;
     return _tag;
   }
 
   inline int getTag() const { return _tag; }
 
-  int getMember (std::string & key_member, double & out) const {
+  int getMember (std::string & key_member, double & out) const
+  {
     std::map<std::string, std::vector<double> >::const_iterator
       it = _fopt.find(key_member);
     if (it != _fopt.end()) {
@@ -62,7 +67,8 @@ public:
     }
   }
 
-  int getMember (std::string & key_member, const std::string * & out) const {
+  int getMember (std::string & key_member, const std::string * & out) const
+  {
     std::map<std::string, std::vector<std::string> >::const_iterator
       it = _copt.find(key_member);
     if (it != _copt.end()) {
@@ -73,6 +79,8 @@ public:
     }
   }
 
+  int getMember_ValMax () const { return _member_ValMax; }
+
   void sprint(std::string & str,
               const std::string & struct_name, const std::string & struct_namespace)
     const
@@ -100,7 +108,7 @@ public:
   }
 
 private:
-  int _tag;
+  int _tag, _member_ValMax;
   std::map<std::string, std::vector<double> > _fopt;
   std::map<std::string, std::vector<std::string> > _copt;
 };
@@ -112,13 +120,15 @@ public:
   Map() {}
   ~Map() {}
 
-  T * Find(K key) {
+  T * Find(K key)
+  {
     typename std::map<K, T>::iterator it;
     if ( (it = _map.find(key)) != _map.end() ) return &it->second;
     else return NULL;
   }
 
-  const T * Find(K key) const {
+  const T * Find(K key) const
+  {
     typename std::map<K, T>::const_iterator it;
     if ( (it = _map.find(key)) != _map.end() ) return &it->second;
     else return NULL;
@@ -145,7 +155,8 @@ public:
   int defStruct(std::string & struct_name,
                 std::map<std::string, std::vector<double> > & fopt,
                 std::map<std::string, std::vector<std::string> > & copt,
-                bool append = false) {
+                int member_ValMax, bool append = false)
+  {
     int tag;
     std::map<std::string, std::vector<double> >::const_iterator it = fopt.find("Tag");
     if (it != fopt.end()) {
@@ -157,13 +168,14 @@ public:
       if (!append) fopt["Tag"].push_back((double)tag);
     }
     if (!append)
-      (*this)[struct_name] = Struct(tag, fopt, copt);
+      (*this)[struct_name] = Struct(tag, fopt, copt, member_ValMax);
     else
-      (*this)[struct_name].append(tag, fopt, copt);
+      (*this)[struct_name].append(tag, fopt, copt, member_ValMax);
     return tag;
   }
 
-  int get_key_struct_from_tag(int tag, const std::string * & key_struct) const {
+  int get_key_struct_from_tag(int tag, const std::string * & key_struct) const
+  {
     Map_string_Struct::const_iterator it_st;
     for (it_st = this->get().begin(); it_st != this->get().end(); ++it_st )
       if (it_st->second.getTag() == tag) break;
@@ -172,7 +184,8 @@ public:
     return 0; // 0: no error
   }
 
-  void sprint(std::string & str, const std::string & struct_namespace) const {
+  void sprint(std::string & str, const std::string & struct_namespace) const
+  {
     for (Map_string_Struct::const_iterator it_st = this->get().begin();
          it_st != this->get().end(); ++it_st )
       it_st->second.sprint(str, it_st->first, struct_namespace);
@@ -193,18 +206,20 @@ public:
   int defStruct(std::string & key_namespace, std::string & key_name,
                 std::map<std::string, std::vector<double> > & fopt,
                 std::map<std::string, std::vector<std::string> > & copt,
-                int & tag_out, bool append = false) {
+                int & tag_out, int member_ValMax, bool append = false)
+  {
     Structs * structs_P = &(*this)[key_namespace];
     if (!append && structs_P->count(key_name)) {
       tag_out = (*structs_P)[key_name].getTag();
       return 1; // 1: Error: Redefinition of Struct
     }
-    tag_out = structs_P->defStruct(key_name, fopt, copt, append);
+    tag_out = structs_P->defStruct(key_name, fopt, copt, member_ValMax, append);
     return 0; // 0: no error
   }
 
   int getTag(std::string & key_namespace, std::string & key_name,
-             double & out) const {
+             double & out) const
+  {
     const Structs * structs_P = this->Find(key_namespace);
     const Struct * struct_P = (structs_P)? structs_P->Find(key_name) : NULL;
     if (structs_P && struct_P) {
@@ -233,7 +248,8 @@ public:
   }
 
   int getMember(std::string & key_namespace, std::string & key_name,
-                std::string & key_member, const std::string * & out) const {
+                std::string & key_member, const std::string * & out) const
+  {
 
     const Structs * structs_P = this->Find(key_namespace);
     const Struct * struct_P = (structs_P)? structs_P->Find(key_name) : NULL;
@@ -249,14 +265,23 @@ public:
   }
 
   int get_key_struct_from_tag(std::string & key_namespace,
-                              int tag, const std::string * & key_struct) const {
+                              int tag, const std::string * & key_struct) const
+  {
     const Structs * structs_P = this->Find(key_namespace);
     if (structs_P != NULL)
       return structs_P->get_key_struct_from_tag(tag, key_struct);
     else return 1; // 1: Error: Unknown NameSpace
   }
 
-  void sprint(std::string & str) const {
+  int getMember_ValMax(std::string & key_namespace, std::string & key_name)
+  {
+    const Structs * structs_P = this->Find(key_namespace);
+    const Struct * struct_P = (structs_P)? structs_P->Find(key_name) : NULL;
+    return (structs_P && struct_P)? struct_P->getMember_ValMax() : -1;
+  }
+
+  void sprint(std::string & str) const
+  {
     for (Map_string_Structs::const_iterator it_ns = this->get().begin();
          it_ns != this->get().end(); ++it_ns )
       it_ns->second.sprint(str, it_ns->first);