diff --git a/Parser/Gmsh.tab.cpp b/Parser/Gmsh.tab.cpp
index 4a57cc05f061568a5559522e96c94c98b28b5e4f..0e10fa949156302eff86be6e649435ac4e1af48c 100644
--- a/Parser/Gmsh.tab.cpp
+++ b/Parser/Gmsh.tab.cpp
@@ -980,29 +980,29 @@ static const yytype_uint16 yyrline[] =
     1265,  1283,  1301,  1327,  1344,  1363,  1381,  1420,  1426,  1432,
     1439,  1464,  1489,  1505,  1525,  1543,  1560,  1581,  1586,  1591,
     1596,  1601,  1612,  1618,  1627,  1628,  1633,  1636,  1640,  1663,
-    1686,  1709,  1737,  1746,  1750,  1765,  1788,  1805,  1819,  1825,
-    1831,  1840,  1854,  1902,  1920,  1935,  1954,  1966,  1990,  1994,
-    1999,  2004,  2016,  2033,  2050,  2076,  2102,  2132,  2140,  2146,
-    2153,  2157,  2166,  2174,  2182,  2191,  2190,  2203,  2202,  2215,
-    2214,  2227,  2226,  2239,  2246,  2253,  2260,  2267,  2274,  2281,
-    2288,  2295,  2303,  2302,  2314,  2313,  2325,  2324,  2336,  2335,
-    2347,  2346,  2358,  2357,  2369,  2368,  2380,  2379,  2391,  2390,
-    2405,  2408,  2414,  2423,  2443,  2466,  2470,  2494,  2512,  2530,
-    2548,  2577,  2612,  2617,  2644,  2658,  2671,  2688,  2694,  2700,
-    2703,  2712,  2722,  2723,  2724,  2725,  2726,  2727,  2728,  2729,
-    2730,  2737,  2738,  2739,  2740,  2741,  2742,  2743,  2744,  2745,
-    2746,  2747,  2748,  2749,  2750,  2751,  2752,  2753,  2754,  2755,
-    2756,  2757,  2758,  2759,  2760,  2761,  2762,  2763,  2764,  2765,
-    2766,  2767,  2768,  2770,  2771,  2772,  2773,  2774,  2775,  2776,
-    2777,  2778,  2779,  2780,  2781,  2782,  2783,  2784,  2785,  2786,
-    2787,  2788,  2789,  2790,  2799,  2800,  2801,  2802,  2803,  2804,
-    2805,  2809,  2824,  2838,  2857,  2869,  2881,  2903,  2908,  2913,
-    2923,  2933,  2941,  2945,  2949,  2953,  2957,  2964,  2968,  2972,
-    2976,  2983,  2988,  2995,  3000,  3004,  3009,  3013,  3021,  3032,
-    3040,  3048,  3054,  3065,  3085,  3095,  3105,  3121,  3147,  3152,
-    3156,  3160,  3172,  3176,  3188,  3195,  3205,  3209,  3224,  3229,
-    3236,  3240,  3247,  3251,  3259,  3267,  3281,  3295,  3299,  3318,
-    3326
+    1686,  1709,  1737,  1746,  1750,  1765,  1791,  1808,  1822,  1828,
+    1834,  1843,  1857,  1905,  1923,  1938,  1957,  1969,  1993,  1997,
+    2002,  2007,  2019,  2036,  2053,  2079,  2105,  2135,  2143,  2149,
+    2156,  2160,  2169,  2177,  2185,  2194,  2193,  2206,  2205,  2218,
+    2217,  2230,  2229,  2242,  2249,  2256,  2263,  2270,  2277,  2284,
+    2291,  2298,  2306,  2305,  2317,  2316,  2328,  2327,  2339,  2338,
+    2350,  2349,  2361,  2360,  2372,  2371,  2383,  2382,  2394,  2393,
+    2408,  2411,  2417,  2426,  2446,  2469,  2473,  2497,  2515,  2533,
+    2551,  2580,  2615,  2620,  2647,  2661,  2674,  2691,  2697,  2703,
+    2706,  2715,  2725,  2726,  2727,  2728,  2729,  2730,  2731,  2732,
+    2733,  2740,  2741,  2742,  2743,  2744,  2745,  2746,  2747,  2748,
+    2749,  2750,  2751,  2752,  2753,  2754,  2755,  2756,  2757,  2758,
+    2759,  2760,  2761,  2762,  2763,  2764,  2765,  2766,  2767,  2768,
+    2769,  2770,  2771,  2773,  2774,  2775,  2776,  2777,  2778,  2779,
+    2780,  2781,  2782,  2783,  2784,  2785,  2786,  2787,  2788,  2789,
+    2790,  2791,  2792,  2793,  2802,  2803,  2804,  2805,  2806,  2807,
+    2808,  2812,  2827,  2841,  2860,  2872,  2884,  2906,  2911,  2916,
+    2926,  2936,  2944,  2948,  2952,  2956,  2960,  2967,  2971,  2975,
+    2979,  2986,  2991,  2998,  3003,  3007,  3012,  3016,  3024,  3035,
+    3043,  3051,  3057,  3068,  3088,  3098,  3108,  3124,  3150,  3155,
+    3159,  3163,  3175,  3179,  3191,  3198,  3208,  3212,  3227,  3232,
+    3239,  3243,  3250,  3254,  3262,  3270,  3284,  3298,  3302,  3321,
+    3329
 };
 #endif
 
@@ -5549,7 +5549,7 @@ yyreduce:
   case 135:
 #line 1766 "Gmsh.y"
     {
-      if(!strcmp((yyvsp[(2) - (3)].c), "Meshes") || !strcmp((yyvsp[(2) - (3)].c), "All")){
+      if(!strcmp((yyvsp[(2) - (3)].c), "Model") || !strcmp((yyvsp[(2) - (3)].c), "Meshes") || !strcmp((yyvsp[(2) - (3)].c), "All")){
 	GModel::current()->destroy();
 	GModel::current()->getGEOInternals()->destroy();
       }
@@ -5557,6 +5557,9 @@ yyreduce:
 	GModel::current()->getGEOInternals()->reset_physicals();
 	GModel::current()->deletePhysicalGroups();
       }
+      else if(!strcmp((yyvsp[(2) - (3)].c), "Variables")){
+	InitSymbols();
+      }
       else{
 	Symbol TheSymbol, *pSymbol;
 	TheSymbol.Name = (yyvsp[(2) - (3)].c);
@@ -5573,7 +5576,7 @@ yyreduce:
     break;
 
   case 136:
-#line 1789 "Gmsh.y"
+#line 1792 "Gmsh.y"
     {
 #if !defined(HAVE_NO_POST)
       if(!strcmp((yyvsp[(2) - (4)].c), "Empty") && !strcmp((yyvsp[(3) - (4)].c), "Views")){
@@ -5588,7 +5591,7 @@ yyreduce:
     break;
 
   case 137:
-#line 1806 "Gmsh.y"
+#line 1809 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(4) - (5)].l)); i++){
 	Shape TheShape;
@@ -5600,7 +5603,7 @@ yyreduce:
     break;
 
   case 138:
-#line 1820 "Gmsh.y"
+#line 1823 "Gmsh.y"
     {
       for(int i = 0; i < 4; i++)
 	VisibilityShape((yyvsp[(2) - (3)].c), i, 1);
@@ -5609,7 +5612,7 @@ yyreduce:
     break;
 
   case 139:
-#line 1826 "Gmsh.y"
+#line 1829 "Gmsh.y"
     {
       for(int i = 0; i < 4; i++)
 	VisibilityShape((yyvsp[(2) - (3)].c), i, 0);
@@ -5618,7 +5621,7 @@ yyreduce:
     break;
 
   case 140:
-#line 1832 "Gmsh.y"
+#line 1835 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (4)].l)); i++){
 	Shape TheShape;
@@ -5630,7 +5633,7 @@ yyreduce:
     break;
 
   case 141:
-#line 1841 "Gmsh.y"
+#line 1844 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (4)].l)); i++){
 	Shape TheShape;
@@ -5642,7 +5645,7 @@ yyreduce:
     break;
 
   case 142:
-#line 1855 "Gmsh.y"
+#line 1858 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(1) - (3)].c), "Include")){
 	char tmpstring[1024];
@@ -5693,7 +5696,7 @@ yyreduce:
     break;
 
   case 143:
-#line 1903 "Gmsh.y"
+#line 1906 "Gmsh.y"
     {
 #if !defined(HAVE_NO_POST)
       if(!strcmp((yyvsp[(1) - (7)].c), "Save") && !strcmp((yyvsp[(2) - (7)].c), "View")){
@@ -5714,7 +5717,7 @@ yyreduce:
     break;
 
   case 144:
-#line 1921 "Gmsh.y"
+#line 1924 "Gmsh.y"
     {
 #if !defined(HAVE_NO_POST)
       if(!strcmp((yyvsp[(1) - (7)].c), "Background") && !strcmp((yyvsp[(2) - (7)].c), "Mesh")  && !strcmp((yyvsp[(3) - (7)].c), "View")){
@@ -5732,7 +5735,7 @@ yyreduce:
     break;
 
   case 145:
-#line 1936 "Gmsh.y"
+#line 1939 "Gmsh.y"
     {
       if(!strcmp((yyvsp[(1) - (3)].c), "Sleep")){
 	SleepInSeconds((yyvsp[(2) - (3)].d));
@@ -5754,7 +5757,7 @@ yyreduce:
     break;
 
   case 146:
-#line 1955 "Gmsh.y"
+#line 1958 "Gmsh.y"
     {
 #if !defined(HAVE_NO_POST)
        try {
@@ -5769,7 +5772,7 @@ yyreduce:
     break;
 
   case 147:
-#line 1967 "Gmsh.y"
+#line 1970 "Gmsh.y"
     {
 #if !defined(HAVE_NO_POST)
       if(!strcmp((yyvsp[(2) - (3)].c), "ElementsFromAllViews"))
@@ -5796,14 +5799,14 @@ yyreduce:
     break;
 
   case 148:
-#line 1991 "Gmsh.y"
+#line 1994 "Gmsh.y"
     {
       exit(0);
     ;}
     break;
 
   case 149:
-#line 1995 "Gmsh.y"
+#line 1998 "Gmsh.y"
     {
       CTX.forced_bbox = 0;
       SetBoundingBox();
@@ -5811,7 +5814,7 @@ yyreduce:
     break;
 
   case 150:
-#line 2000 "Gmsh.y"
+#line 2003 "Gmsh.y"
     {
       CTX.forced_bbox = 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));
@@ -5819,7 +5822,7 @@ yyreduce:
     break;
 
   case 151:
-#line 2005 "Gmsh.y"
+#line 2008 "Gmsh.y"
     {
 #if defined(HAVE_FLTK)
       Draw();
@@ -5828,7 +5831,7 @@ yyreduce:
     break;
 
   case 152:
-#line 2017 "Gmsh.y"
+#line 2020 "Gmsh.y"
     {
       LoopControlVariablesTab[ImbricatedLoop][0] = (yyvsp[(3) - (6)].d);
       LoopControlVariablesTab[ImbricatedLoop][1] = (yyvsp[(5) - (6)].d);
@@ -5848,7 +5851,7 @@ yyreduce:
     break;
 
   case 153:
-#line 2034 "Gmsh.y"
+#line 2037 "Gmsh.y"
     {
       LoopControlVariablesTab[ImbricatedLoop][0] = (yyvsp[(3) - (8)].d);
       LoopControlVariablesTab[ImbricatedLoop][1] = (yyvsp[(5) - (8)].d);
@@ -5868,7 +5871,7 @@ yyreduce:
     break;
 
   case 154:
-#line 2051 "Gmsh.y"
+#line 2054 "Gmsh.y"
     {
       LoopControlVariablesTab[ImbricatedLoop][0] = (yyvsp[(5) - (8)].d);
       LoopControlVariablesTab[ImbricatedLoop][1] = (yyvsp[(7) - (8)].d);
@@ -5897,7 +5900,7 @@ yyreduce:
     break;
 
   case 155:
-#line 2077 "Gmsh.y"
+#line 2080 "Gmsh.y"
     {
       LoopControlVariablesTab[ImbricatedLoop][0] = (yyvsp[(5) - (10)].d);
       LoopControlVariablesTab[ImbricatedLoop][1] = (yyvsp[(7) - (10)].d);
@@ -5926,7 +5929,7 @@ yyreduce:
     break;
 
   case 156:
-#line 2103 "Gmsh.y"
+#line 2106 "Gmsh.y"
     {
       if(ImbricatedLoop <= 0){
 	yymsg(0, "Invalid For/EndFor loop");
@@ -5959,7 +5962,7 @@ yyreduce:
     break;
 
   case 157:
-#line 2133 "Gmsh.y"
+#line 2136 "Gmsh.y"
     {
       if(!FunctionManager::Instance()->createFunction((yyvsp[(2) - (2)].c), gmsh_yyin, gmsh_yyname,
 						      gmsh_yylineno))
@@ -5970,7 +5973,7 @@ yyreduce:
     break;
 
   case 158:
-#line 2141 "Gmsh.y"
+#line 2144 "Gmsh.y"
     {
       if(!FunctionManager::Instance()->leaveFunction(&gmsh_yyin, gmsh_yyname,
 						     gmsh_yylineno))
@@ -5979,7 +5982,7 @@ yyreduce:
     break;
 
   case 159:
-#line 2147 "Gmsh.y"
+#line 2150 "Gmsh.y"
     {
       if(!FunctionManager::Instance()->enterFunction((yyvsp[(2) - (3)].c), &gmsh_yyin, gmsh_yyname,
 						     gmsh_yylineno))
@@ -5989,20 +5992,20 @@ yyreduce:
     break;
 
   case 160:
-#line 2154 "Gmsh.y"
+#line 2157 "Gmsh.y"
     {
       if(!(yyvsp[(3) - (4)].d)) skip_until("If", "EndIf");
     ;}
     break;
 
   case 161:
-#line 2158 "Gmsh.y"
+#line 2161 "Gmsh.y"
     {
     ;}
     break;
 
   case 162:
-#line 2167 "Gmsh.y"
+#line 2170 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShapes(TRANSLATE, (yyvsp[(4) - (5)].l), 
@@ -6013,7 +6016,7 @@ yyreduce:
     break;
 
   case 163:
-#line 2175 "Gmsh.y"
+#line 2178 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShapes(ROTATE, (yyvsp[(10) - (11)].l), 
@@ -6024,7 +6027,7 @@ yyreduce:
     break;
 
   case 164:
-#line 2183 "Gmsh.y"
+#line 2186 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShapes(TRANSLATE_ROTATE, (yyvsp[(12) - (13)].l), 
@@ -6035,14 +6038,14 @@ yyreduce:
     break;
 
   case 165:
-#line 2191 "Gmsh.y"
+#line 2194 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
     ;}
     break;
 
   case 166:
-#line 2195 "Gmsh.y"
+#line 2198 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShapes(TRANSLATE, (yyvsp[(4) - (7)].l), 
@@ -6053,14 +6056,14 @@ yyreduce:
     break;
 
   case 167:
-#line 2203 "Gmsh.y"
+#line 2206 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
     ;}
     break;
 
   case 168:
-#line 2207 "Gmsh.y"
+#line 2210 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShapes(ROTATE, (yyvsp[(10) - (13)].l), 
@@ -6071,14 +6074,14 @@ yyreduce:
     break;
 
   case 169:
-#line 2215 "Gmsh.y"
+#line 2218 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
     ;}
     break;
 
   case 170:
-#line 2219 "Gmsh.y"
+#line 2222 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShapes(TRANSLATE_ROTATE, (yyvsp[(12) - (15)].l), 
@@ -6089,14 +6092,14 @@ yyreduce:
     break;
 
   case 171:
-#line 2227 "Gmsh.y"
+#line 2230 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
     ;}
     break;
 
   case 172:
-#line 2231 "Gmsh.y"
+#line 2234 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShapes(BOUNDARY_LAYER, (yyvsp[(3) - (6)].l), 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
@@ -6106,7 +6109,7 @@ yyreduce:
     break;
 
   case 173:
-#line 2240 "Gmsh.y"
+#line 2243 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(TRANSLATE, MSH_POINT, (int)(yyvsp[(4) - (8)].d), 
@@ -6116,7 +6119,7 @@ yyreduce:
     break;
 
   case 174:
-#line 2247 "Gmsh.y"
+#line 2250 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(TRANSLATE, MSH_SEGM_LINE, (int)(yyvsp[(4) - (8)].d), 
@@ -6126,7 +6129,7 @@ yyreduce:
     break;
 
   case 175:
-#line 2254 "Gmsh.y"
+#line 2257 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(TRANSLATE, MSH_SURF_PLAN, (int)(yyvsp[(4) - (8)].d), 
@@ -6136,7 +6139,7 @@ yyreduce:
     break;
 
   case 176:
-#line 2261 "Gmsh.y"
+#line 2264 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(ROTATE, MSH_POINT, (int)(yyvsp[(4) - (12)].d), 
@@ -6146,7 +6149,7 @@ yyreduce:
     break;
 
   case 177:
-#line 2268 "Gmsh.y"
+#line 2271 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(ROTATE, MSH_SEGM_LINE, (int)(yyvsp[(4) - (12)].d), 
@@ -6156,7 +6159,7 @@ yyreduce:
     break;
 
   case 178:
-#line 2275 "Gmsh.y"
+#line 2278 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(ROTATE, MSH_SURF_PLAN, (int)(yyvsp[(4) - (12)].d), 
@@ -6166,7 +6169,7 @@ yyreduce:
     break;
 
   case 179:
-#line 2282 "Gmsh.y"
+#line 2285 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(TRANSLATE_ROTATE, MSH_POINT, (int)(yyvsp[(4) - (14)].d), 
@@ -6176,7 +6179,7 @@ yyreduce:
     break;
 
   case 180:
-#line 2289 "Gmsh.y"
+#line 2292 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(TRANSLATE_ROTATE, MSH_SEGM_LINE, (int)(yyvsp[(4) - (14)].d), 
@@ -6186,7 +6189,7 @@ yyreduce:
     break;
 
   case 181:
-#line 2296 "Gmsh.y"
+#line 2299 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(TRANSLATE_ROTATE, MSH_SURF_PLAN, (int)(yyvsp[(4) - (14)].d), 
@@ -6196,14 +6199,14 @@ yyreduce:
     break;
 
   case 182:
-#line 2303 "Gmsh.y"
+#line 2306 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
     ;}
     break;
 
   case 183:
-#line 2307 "Gmsh.y"
+#line 2310 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(TRANSLATE, MSH_POINT, (int)(yyvsp[(4) - (12)].d), 
@@ -6213,14 +6216,14 @@ yyreduce:
     break;
 
   case 184:
-#line 2314 "Gmsh.y"
+#line 2317 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
     ;}
     break;
 
   case 185:
-#line 2318 "Gmsh.y"
+#line 2321 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(TRANSLATE, MSH_SEGM_LINE, (int)(yyvsp[(4) - (12)].d), 
@@ -6230,14 +6233,14 @@ yyreduce:
     break;
 
   case 186:
-#line 2325 "Gmsh.y"
+#line 2328 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
     ;}
     break;
 
   case 187:
-#line 2329 "Gmsh.y"
+#line 2332 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(TRANSLATE, MSH_SURF_PLAN, (int)(yyvsp[(4) - (12)].d), 
@@ -6247,14 +6250,14 @@ yyreduce:
     break;
 
   case 188:
-#line 2336 "Gmsh.y"
+#line 2339 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
     ;}
     break;
 
   case 189:
-#line 2340 "Gmsh.y"
+#line 2343 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(ROTATE, MSH_POINT, (int)(yyvsp[(4) - (16)].d), 
@@ -6264,14 +6267,14 @@ yyreduce:
     break;
 
   case 190:
-#line 2347 "Gmsh.y"
+#line 2350 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
     ;}
     break;
 
   case 191:
-#line 2351 "Gmsh.y"
+#line 2354 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(ROTATE, MSH_SEGM_LINE, (int)(yyvsp[(4) - (16)].d), 
@@ -6281,14 +6284,14 @@ yyreduce:
     break;
 
   case 192:
-#line 2358 "Gmsh.y"
+#line 2361 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
     ;}
     break;
 
   case 193:
-#line 2362 "Gmsh.y"
+#line 2365 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(ROTATE, MSH_SURF_PLAN, (int)(yyvsp[(4) - (16)].d), 
@@ -6298,14 +6301,14 @@ yyreduce:
     break;
 
   case 194:
-#line 2369 "Gmsh.y"
+#line 2372 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
     ;}
     break;
 
   case 195:
-#line 2373 "Gmsh.y"
+#line 2376 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(TRANSLATE_ROTATE, MSH_POINT, (int)(yyvsp[(4) - (18)].d), 
@@ -6315,14 +6318,14 @@ yyreduce:
     break;
 
   case 196:
-#line 2380 "Gmsh.y"
+#line 2383 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
     ;}
     break;
 
   case 197:
-#line 2384 "Gmsh.y"
+#line 2387 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(TRANSLATE_ROTATE, MSH_SEGM_LINE, (int)(yyvsp[(4) - (18)].d), 
@@ -6332,14 +6335,14 @@ yyreduce:
     break;
 
   case 198:
-#line 2391 "Gmsh.y"
+#line 2394 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false;
     ;}
     break;
 
   case 199:
-#line 2395 "Gmsh.y"
+#line 2398 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(Shape));
       ExtrudeShape(TRANSLATE_ROTATE, MSH_SURF_PLAN, (int)(yyvsp[(4) - (18)].d), 
@@ -6349,19 +6352,19 @@ yyreduce:
     break;
 
   case 200:
-#line 2406 "Gmsh.y"
+#line 2409 "Gmsh.y"
     {
     ;}
     break;
 
   case 201:
-#line 2409 "Gmsh.y"
+#line 2412 "Gmsh.y"
     {
     ;}
     break;
 
   case 202:
-#line 2415 "Gmsh.y"
+#line 2418 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = true;
       extr.mesh.NbLayer = 1;
@@ -6373,7 +6376,7 @@ yyreduce:
     break;
 
   case 203:
-#line 2424 "Gmsh.y"
+#line 2427 "Gmsh.y"
     {
       extr.mesh.ExtrudeMesh = true;
       extr.mesh.NbLayer = List_Nbr((yyvsp[(3) - (7)].l));
@@ -6396,7 +6399,7 @@ yyreduce:
     break;
 
   case 204:
-#line 2444 "Gmsh.y"
+#line 2447 "Gmsh.y"
     {
       yymsg(0, "Explicit region numbers in layers are deprecated");
       extr.mesh.ExtrudeMesh = true;
@@ -6422,14 +6425,14 @@ yyreduce:
     break;
 
   case 205:
-#line 2467 "Gmsh.y"
+#line 2470 "Gmsh.y"
     {
       extr.mesh.Recombine = true;
     ;}
     break;
 
   case 206:
-#line 2471 "Gmsh.y"
+#line 2474 "Gmsh.y"
     {
       int num = (int)(yyvsp[(3) - (9)].d);
       if(FindSurface(num)){
@@ -6451,7 +6454,7 @@ yyreduce:
     break;
 
   case 207:
-#line 2495 "Gmsh.y"
+#line 2498 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (6)].l)); i++){
 	double d;
@@ -6472,7 +6475,7 @@ yyreduce:
     break;
 
   case 208:
-#line 2513 "Gmsh.y"
+#line 2516 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (9)].l)); i++){
 	double d;
@@ -6493,7 +6496,7 @@ yyreduce:
     break;
 
   case 209:
-#line 2531 "Gmsh.y"
+#line 2534 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (9)].l)); i++){
 	double d;
@@ -6514,7 +6517,7 @@ yyreduce:
     break;
 
   case 210:
-#line 2549 "Gmsh.y"
+#line 2552 "Gmsh.y"
     {
       Surface *s = FindSurface((int)(yyvsp[(4) - (8)].d));
       if(!s)
@@ -6546,7 +6549,7 @@ yyreduce:
     break;
 
   case 211:
-#line 2578 "Gmsh.y"
+#line 2581 "Gmsh.y"
     {
       Surface *s = FindSurface((int)(yyvsp[(4) - (9)].d));
       if(!s)
@@ -6584,7 +6587,7 @@ yyreduce:
     break;
 
   case 212:
-#line 2613 "Gmsh.y"
+#line 2616 "Gmsh.y"
     {
       yymsg(1, "Elliptic Surface is deprecated: use Transfinite instead (with smoothing)");
       List_Delete((yyvsp[(7) - (8)].l));
@@ -6592,7 +6595,7 @@ yyreduce:
     break;
 
   case 213:
-#line 2618 "Gmsh.y"
+#line 2621 "Gmsh.y"
     {
       Volume *v = FindVolume((int)(yyvsp[(4) - (8)].d));
       if(!v)
@@ -6622,7 +6625,7 @@ yyreduce:
     break;
 
   case 214:
-#line 2645 "Gmsh.y"
+#line 2648 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (6)].l)); i++){
 	double d;
@@ -6639,7 +6642,7 @@ yyreduce:
     break;
 
   case 215:
-#line 2659 "Gmsh.y"
+#line 2662 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (4)].l)); i++){
 	double d;
@@ -6655,7 +6658,7 @@ yyreduce:
     break;
 
   case 216:
-#line 2672 "Gmsh.y"
+#line 2675 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (6)].l)); i++){
 	double d;
@@ -6669,7 +6672,7 @@ yyreduce:
     break;
 
   case 217:
-#line 2689 "Gmsh.y"
+#line 2692 "Gmsh.y"
     { 
       Surface *s = FindSurface((int)(yyvsp[(8) - (10)].d));
       if(s)
@@ -6678,7 +6681,7 @@ yyreduce:
     break;
 
   case 218:
-#line 2695 "Gmsh.y"
+#line 2698 "Gmsh.y"
     {
       Surface *s = FindSurface((int)(yyvsp[(8) - (10)].d));
       if(s)
@@ -6687,66 +6690,66 @@ yyreduce:
     break;
 
   case 219:
-#line 2701 "Gmsh.y"
+#line 2704 "Gmsh.y"
     {
     ;}
     break;
 
   case 220:
-#line 2704 "Gmsh.y"
+#line 2707 "Gmsh.y"
     {
     ;}
     break;
 
   case 221:
-#line 2713 "Gmsh.y"
+#line 2716 "Gmsh.y"
     { 
       ReplaceAllDuplicates();
     ;}
     break;
 
   case 222:
-#line 2722 "Gmsh.y"
+#line 2725 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (1)].d);           ;}
     break;
 
   case 223:
-#line 2723 "Gmsh.y"
+#line 2726 "Gmsh.y"
     { (yyval.d) = (yyvsp[(2) - (3)].d);           ;}
     break;
 
   case 224:
-#line 2724 "Gmsh.y"
+#line 2727 "Gmsh.y"
     { (yyval.d) = -(yyvsp[(2) - (2)].d);          ;}
     break;
 
   case 225:
-#line 2725 "Gmsh.y"
+#line 2728 "Gmsh.y"
     { (yyval.d) = (yyvsp[(2) - (2)].d);           ;}
     break;
 
   case 226:
-#line 2726 "Gmsh.y"
+#line 2729 "Gmsh.y"
     { (yyval.d) = !(yyvsp[(2) - (2)].d);          ;}
     break;
 
   case 227:
-#line 2727 "Gmsh.y"
+#line 2730 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) - (yyvsp[(3) - (3)].d);      ;}
     break;
 
   case 228:
-#line 2728 "Gmsh.y"
+#line 2731 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) + (yyvsp[(3) - (3)].d);      ;}
     break;
 
   case 229:
-#line 2729 "Gmsh.y"
+#line 2732 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) * (yyvsp[(3) - (3)].d);      ;}
     break;
 
   case 230:
-#line 2731 "Gmsh.y"
+#line 2734 "Gmsh.y"
     { 
       if(!(yyvsp[(3) - (3)].d))
 	yymsg(0, "Division by zero in '%g / %g'", (yyvsp[(1) - (3)].d), (yyvsp[(3) - (3)].d));
@@ -6756,307 +6759,307 @@ yyreduce:
     break;
 
   case 231:
-#line 2737 "Gmsh.y"
+#line 2740 "Gmsh.y"
     { (yyval.d) = (int)(yyvsp[(1) - (3)].d) % (int)(yyvsp[(3) - (3)].d);  ;}
     break;
 
   case 232:
-#line 2738 "Gmsh.y"
+#line 2741 "Gmsh.y"
     { (yyval.d) = pow((yyvsp[(1) - (3)].d), (yyvsp[(3) - (3)].d));  ;}
     break;
 
   case 233:
-#line 2739 "Gmsh.y"
+#line 2742 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) < (yyvsp[(3) - (3)].d);      ;}
     break;
 
   case 234:
-#line 2740 "Gmsh.y"
+#line 2743 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) > (yyvsp[(3) - (3)].d);      ;}
     break;
 
   case 235:
-#line 2741 "Gmsh.y"
+#line 2744 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) <= (yyvsp[(3) - (3)].d);     ;}
     break;
 
   case 236:
-#line 2742 "Gmsh.y"
+#line 2745 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) >= (yyvsp[(3) - (3)].d);     ;}
     break;
 
   case 237:
-#line 2743 "Gmsh.y"
+#line 2746 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) == (yyvsp[(3) - (3)].d);     ;}
     break;
 
   case 238:
-#line 2744 "Gmsh.y"
+#line 2747 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) != (yyvsp[(3) - (3)].d);     ;}
     break;
 
   case 239:
-#line 2745 "Gmsh.y"
+#line 2748 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) && (yyvsp[(3) - (3)].d);     ;}
     break;
 
   case 240:
-#line 2746 "Gmsh.y"
+#line 2749 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (3)].d) || (yyvsp[(3) - (3)].d);     ;}
     break;
 
   case 241:
-#line 2747 "Gmsh.y"
+#line 2750 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (5)].d) ? (yyvsp[(3) - (5)].d) : (yyvsp[(5) - (5)].d); ;}
     break;
 
   case 242:
-#line 2748 "Gmsh.y"
+#line 2751 "Gmsh.y"
     { (yyval.d) = exp((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 243:
-#line 2749 "Gmsh.y"
+#line 2752 "Gmsh.y"
     { (yyval.d) = log((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 244:
-#line 2750 "Gmsh.y"
+#line 2753 "Gmsh.y"
     { (yyval.d) = log10((yyvsp[(3) - (4)].d));    ;}
     break;
 
   case 245:
-#line 2751 "Gmsh.y"
+#line 2754 "Gmsh.y"
     { (yyval.d) = sqrt((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 246:
-#line 2752 "Gmsh.y"
+#line 2755 "Gmsh.y"
     { (yyval.d) = sin((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 247:
-#line 2753 "Gmsh.y"
+#line 2756 "Gmsh.y"
     { (yyval.d) = asin((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 248:
-#line 2754 "Gmsh.y"
+#line 2757 "Gmsh.y"
     { (yyval.d) = cos((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 249:
-#line 2755 "Gmsh.y"
+#line 2758 "Gmsh.y"
     { (yyval.d) = acos((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 250:
-#line 2756 "Gmsh.y"
+#line 2759 "Gmsh.y"
     { (yyval.d) = tan((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 251:
-#line 2757 "Gmsh.y"
+#line 2760 "Gmsh.y"
     { (yyval.d) = atan((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 252:
-#line 2758 "Gmsh.y"
+#line 2761 "Gmsh.y"
     { (yyval.d) = atan2((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d));;}
     break;
 
   case 253:
-#line 2759 "Gmsh.y"
+#line 2762 "Gmsh.y"
     { (yyval.d) = sinh((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 254:
-#line 2760 "Gmsh.y"
+#line 2763 "Gmsh.y"
     { (yyval.d) = cosh((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 255:
-#line 2761 "Gmsh.y"
+#line 2764 "Gmsh.y"
     { (yyval.d) = tanh((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 256:
-#line 2762 "Gmsh.y"
+#line 2765 "Gmsh.y"
     { (yyval.d) = fabs((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 257:
-#line 2763 "Gmsh.y"
+#line 2766 "Gmsh.y"
     { (yyval.d) = floor((yyvsp[(3) - (4)].d));    ;}
     break;
 
   case 258:
-#line 2764 "Gmsh.y"
+#line 2767 "Gmsh.y"
     { (yyval.d) = ceil((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 259:
-#line 2765 "Gmsh.y"
+#line 2768 "Gmsh.y"
     { (yyval.d) = fmod((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d)); ;}
     break;
 
   case 260:
-#line 2766 "Gmsh.y"
+#line 2769 "Gmsh.y"
     { (yyval.d) = fmod((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d)); ;}
     break;
 
   case 261:
-#line 2767 "Gmsh.y"
+#line 2770 "Gmsh.y"
     { (yyval.d) = sqrt((yyvsp[(3) - (6)].d) * (yyvsp[(3) - (6)].d) + (yyvsp[(5) - (6)].d) * (yyvsp[(5) - (6)].d)); ;}
     break;
 
   case 262:
-#line 2768 "Gmsh.y"
+#line 2771 "Gmsh.y"
     { (yyval.d) = (yyvsp[(3) - (4)].d) * (double)rand() / (double)RAND_MAX; ;}
     break;
 
   case 263:
-#line 2770 "Gmsh.y"
+#line 2773 "Gmsh.y"
     { (yyval.d) = exp((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 264:
-#line 2771 "Gmsh.y"
+#line 2774 "Gmsh.y"
     { (yyval.d) = log((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 265:
-#line 2772 "Gmsh.y"
+#line 2775 "Gmsh.y"
     { (yyval.d) = log10((yyvsp[(3) - (4)].d));    ;}
     break;
 
   case 266:
-#line 2773 "Gmsh.y"
+#line 2776 "Gmsh.y"
     { (yyval.d) = sqrt((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 267:
-#line 2774 "Gmsh.y"
+#line 2777 "Gmsh.y"
     { (yyval.d) = sin((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 268:
-#line 2775 "Gmsh.y"
+#line 2778 "Gmsh.y"
     { (yyval.d) = asin((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 269:
-#line 2776 "Gmsh.y"
+#line 2779 "Gmsh.y"
     { (yyval.d) = cos((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 270:
-#line 2777 "Gmsh.y"
+#line 2780 "Gmsh.y"
     { (yyval.d) = acos((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 271:
-#line 2778 "Gmsh.y"
+#line 2781 "Gmsh.y"
     { (yyval.d) = tan((yyvsp[(3) - (4)].d));      ;}
     break;
 
   case 272:
-#line 2779 "Gmsh.y"
+#line 2782 "Gmsh.y"
     { (yyval.d) = atan((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 273:
-#line 2780 "Gmsh.y"
+#line 2783 "Gmsh.y"
     { (yyval.d) = atan2((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d));;}
     break;
 
   case 274:
-#line 2781 "Gmsh.y"
+#line 2784 "Gmsh.y"
     { (yyval.d) = sinh((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 275:
-#line 2782 "Gmsh.y"
+#line 2785 "Gmsh.y"
     { (yyval.d) = cosh((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 276:
-#line 2783 "Gmsh.y"
+#line 2786 "Gmsh.y"
     { (yyval.d) = tanh((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 277:
-#line 2784 "Gmsh.y"
+#line 2787 "Gmsh.y"
     { (yyval.d) = fabs((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 278:
-#line 2785 "Gmsh.y"
+#line 2788 "Gmsh.y"
     { (yyval.d) = floor((yyvsp[(3) - (4)].d));    ;}
     break;
 
   case 279:
-#line 2786 "Gmsh.y"
+#line 2789 "Gmsh.y"
     { (yyval.d) = ceil((yyvsp[(3) - (4)].d));     ;}
     break;
 
   case 280:
-#line 2787 "Gmsh.y"
+#line 2790 "Gmsh.y"
     { (yyval.d) = fmod((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d)); ;}
     break;
 
   case 281:
-#line 2788 "Gmsh.y"
+#line 2791 "Gmsh.y"
     { (yyval.d) = fmod((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d)); ;}
     break;
 
   case 282:
-#line 2789 "Gmsh.y"
+#line 2792 "Gmsh.y"
     { (yyval.d) = sqrt((yyvsp[(3) - (6)].d) * (yyvsp[(3) - (6)].d) + (yyvsp[(5) - (6)].d) * (yyvsp[(5) - (6)].d)); ;}
     break;
 
   case 283:
-#line 2790 "Gmsh.y"
+#line 2793 "Gmsh.y"
     { (yyval.d) = (yyvsp[(3) - (4)].d) * (double)rand() / (double)RAND_MAX; ;}
     break;
 
   case 284:
-#line 2799 "Gmsh.y"
+#line 2802 "Gmsh.y"
     { (yyval.d) = (yyvsp[(1) - (1)].d); ;}
     break;
 
   case 285:
-#line 2800 "Gmsh.y"
+#line 2803 "Gmsh.y"
     { (yyval.d) = 3.141592653589793; ;}
     break;
 
   case 286:
-#line 2801 "Gmsh.y"
+#line 2804 "Gmsh.y"
     { (yyval.d) = Msg::GetCommRank(); ;}
     break;
 
   case 287:
-#line 2802 "Gmsh.y"
+#line 2805 "Gmsh.y"
     { (yyval.d) = Msg::GetCommSize(); ;}
     break;
 
   case 288:
-#line 2803 "Gmsh.y"
+#line 2806 "Gmsh.y"
     { (yyval.d) = Get_GmshMajorVersion(); ;}
     break;
 
   case 289:
-#line 2804 "Gmsh.y"
+#line 2807 "Gmsh.y"
     { (yyval.d) = Get_GmshMinorVersion(); ;}
     break;
 
   case 290:
-#line 2805 "Gmsh.y"
+#line 2808 "Gmsh.y"
     { (yyval.d) = Get_GmshPatchVersion(); ;}
     break;
 
   case 291:
-#line 2810 "Gmsh.y"
+#line 2813 "Gmsh.y"
     {
       Symbol TheSymbol, *pSymbol;
       TheSymbol.Name = (yyvsp[(1) - (1)].c);
@@ -7071,7 +7074,7 @@ yyreduce:
     break;
 
   case 292:
-#line 2825 "Gmsh.y"
+#line 2828 "Gmsh.y"
     {
       char tmpstring[1024];
       sprintf(tmpstring, "%s_%d", (yyvsp[(1) - (5)].c), (int)(yyvsp[(4) - (5)].d)) ;
@@ -7088,7 +7091,7 @@ yyreduce:
     break;
 
   case 293:
-#line 2839 "Gmsh.y"
+#line 2842 "Gmsh.y"
     {
       Symbol TheSymbol, *pSymbol;
       TheSymbol.Name = (yyvsp[(1) - (4)].c);
@@ -7110,7 +7113,7 @@ yyreduce:
     break;
 
   case 294:
-#line 2858 "Gmsh.y"
+#line 2861 "Gmsh.y"
     {
       Symbol TheSymbol, *pSymbol;
       TheSymbol.Name = (yyvsp[(2) - (4)].c);
@@ -7125,7 +7128,7 @@ yyreduce:
     break;
 
   case 295:
-#line 2870 "Gmsh.y"
+#line 2873 "Gmsh.y"
     {
       Symbol TheSymbol, *pSymbol;
       TheSymbol.Name = (yyvsp[(1) - (2)].c);
@@ -7140,7 +7143,7 @@ yyreduce:
     break;
 
   case 296:
-#line 2882 "Gmsh.y"
+#line 2885 "Gmsh.y"
     {
       Symbol TheSymbol, *pSymbol;
       TheSymbol.Name = (yyvsp[(1) - (5)].c);
@@ -7162,7 +7165,7 @@ yyreduce:
     break;
 
   case 297:
-#line 2904 "Gmsh.y"
+#line 2907 "Gmsh.y"
     {
       NumberOption(GMSH_GET, (yyvsp[(1) - (3)].c), 0, (yyvsp[(3) - (3)].c), (yyval.d));
       Free((yyvsp[(1) - (3)].c)); Free((yyvsp[(3) - (3)].c));
@@ -7170,7 +7173,7 @@ yyreduce:
     break;
 
   case 298:
-#line 2909 "Gmsh.y"
+#line 2912 "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));
@@ -7178,7 +7181,7 @@ yyreduce:
     break;
 
   case 299:
-#line 2914 "Gmsh.y"
+#line 2917 "Gmsh.y"
     {
       double d = 0.;
       if(NumberOption(GMSH_GET, (yyvsp[(1) - (4)].c), 0, (yyvsp[(3) - (4)].c), d)){
@@ -7191,7 +7194,7 @@ yyreduce:
     break;
 
   case 300:
-#line 2924 "Gmsh.y"
+#line 2927 "Gmsh.y"
     {
       double d = 0.;
       if(NumberOption(GMSH_GET, (yyvsp[(1) - (7)].c), (int)(yyvsp[(3) - (7)].d), (yyvsp[(6) - (7)].c), d)){
@@ -7204,7 +7207,7 @@ yyreduce:
     break;
 
   case 301:
-#line 2934 "Gmsh.y"
+#line 2937 "Gmsh.y"
     { 
       (yyval.d) = Msg::GetValue((yyvsp[(3) - (6)].c), (yyvsp[(5) - (6)].d));
       Free((yyvsp[(3) - (6)].c));
@@ -7212,70 +7215,70 @@ yyreduce:
     break;
 
   case 302:
-#line 2942 "Gmsh.y"
+#line 2945 "Gmsh.y"
     {
       memcpy((yyval.v), (yyvsp[(1) - (1)].v), 5*sizeof(double));
     ;}
     break;
 
   case 303:
-#line 2946 "Gmsh.y"
+#line 2949 "Gmsh.y"
     {
       for(int i = 0; i < 5; i++) (yyval.v)[i] = -(yyvsp[(2) - (2)].v)[i];
     ;}
     break;
 
   case 304:
-#line 2950 "Gmsh.y"
+#line 2953 "Gmsh.y"
     { 
       for(int i = 0; i < 5; i++) (yyval.v)[i] = (yyvsp[(2) - (2)].v)[i];
     ;}
     break;
 
   case 305:
-#line 2954 "Gmsh.y"
+#line 2957 "Gmsh.y"
     { 
       for(int i = 0; i < 5; i++) (yyval.v)[i] = (yyvsp[(1) - (3)].v)[i] - (yyvsp[(3) - (3)].v)[i];
     ;}
     break;
 
   case 306:
-#line 2958 "Gmsh.y"
+#line 2961 "Gmsh.y"
     {
       for(int i = 0; i < 5; i++) (yyval.v)[i] = (yyvsp[(1) - (3)].v)[i] + (yyvsp[(3) - (3)].v)[i];
     ;}
     break;
 
   case 307:
-#line 2965 "Gmsh.y"
+#line 2968 "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 308:
-#line 2969 "Gmsh.y"
+#line 2972 "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 309:
-#line 2973 "Gmsh.y"
+#line 2976 "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 310:
-#line 2977 "Gmsh.y"
+#line 2980 "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 311:
-#line 2984 "Gmsh.y"
+#line 2987 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(List_T*));
       List_Add((yyval.l), &((yyvsp[(1) - (1)].l)));
@@ -7283,14 +7286,14 @@ yyreduce:
     break;
 
   case 312:
-#line 2989 "Gmsh.y"
+#line 2992 "Gmsh.y"
     {
       List_Add((yyval.l), &((yyvsp[(3) - (3)].l)));
     ;}
     break;
 
   case 313:
-#line 2996 "Gmsh.y"
+#line 2999 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       List_Add((yyval.l), &((yyvsp[(1) - (1)].d)));
@@ -7298,14 +7301,14 @@ yyreduce:
     break;
 
   case 314:
-#line 3001 "Gmsh.y"
+#line 3004 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(1) - (1)].l);
     ;}
     break;
 
   case 315:
-#line 3005 "Gmsh.y"
+#line 3008 "Gmsh.y"
     {
       // creates an empty list
       (yyval.l) = List_Create(2, 1, sizeof(double));
@@ -7313,14 +7316,14 @@ yyreduce:
     break;
 
   case 316:
-#line 3010 "Gmsh.y"
+#line 3013 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(2) - (3)].l);
     ;}
     break;
 
   case 317:
-#line 3014 "Gmsh.y"
+#line 3017 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(3) - (4)].l);
       for(int i = 0; i < List_Nbr((yyval.l)); i++){
@@ -7331,7 +7334,7 @@ yyreduce:
     break;
 
   case 318:
-#line 3022 "Gmsh.y"
+#line 3025 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(4) - (5)].l);
       for(int i = 0; i < List_Nbr((yyval.l)); i++){
@@ -7342,7 +7345,7 @@ yyreduce:
     break;
 
   case 319:
-#line 3033 "Gmsh.y"
+#line 3036 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(2) - (2)].l);
       for(int i = 0; i < List_Nbr((yyval.l)); i++){
@@ -7353,7 +7356,7 @@ yyreduce:
     break;
 
   case 320:
-#line 3041 "Gmsh.y"
+#line 3044 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(3) - (3)].l);
       for(int i = 0; i < List_Nbr((yyval.l)); i++){
@@ -7364,7 +7367,7 @@ yyreduce:
     break;
 
   case 321:
-#line 3049 "Gmsh.y"
+#line 3052 "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)); ((yyvsp[(1) - (3)].d) < (yyvsp[(3) - (3)].d)) ? (d += 1.) : (d -= 1.)) 
@@ -7373,7 +7376,7 @@ yyreduce:
     break;
 
   case 322:
-#line 3055 "Gmsh.y"
+#line 3058 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double)); 
       if(!(yyvsp[(5) - (5)].d) || ((yyvsp[(1) - (5)].d) < (yyvsp[(3) - (5)].d) && (yyvsp[(5) - (5)].d) < 0) || ((yyvsp[(1) - (5)].d) > (yyvsp[(3) - (5)].d) && (yyvsp[(5) - (5)].d) > 0)){
@@ -7387,7 +7390,7 @@ yyreduce:
     break;
 
   case 323:
-#line 3066 "Gmsh.y"
+#line 3069 "Gmsh.y"
     {
       // Returns the coordinates of a point and fills a list with it.
       // This allows to ensure e.g. that relative point positions are
@@ -7410,7 +7413,7 @@ yyreduce:
     break;
 
   case 324:
-#line 3086 "Gmsh.y"
+#line 3089 "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++){
@@ -7423,7 +7426,7 @@ yyreduce:
     break;
 
   case 325:
-#line 3096 "Gmsh.y"
+#line 3099 "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++){
@@ -7436,7 +7439,7 @@ yyreduce:
     break;
 
   case 326:
-#line 3106 "Gmsh.y"
+#line 3109 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       Symbol TheSymbol, *pSymbol;
@@ -7455,7 +7458,7 @@ yyreduce:
     break;
 
   case 327:
-#line 3122 "Gmsh.y"
+#line 3125 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       Symbol TheSymbol, *pSymbol;
@@ -7481,7 +7484,7 @@ yyreduce:
     break;
 
   case 328:
-#line 3148 "Gmsh.y"
+#line 3151 "Gmsh.y"
     {
       (yyval.l) = List_Create(2, 1, sizeof(double));
       List_Add((yyval.l), &((yyvsp[(1) - (1)].d)));
@@ -7489,21 +7492,21 @@ yyreduce:
     break;
 
   case 329:
-#line 3153 "Gmsh.y"
+#line 3156 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(1) - (1)].l);
     ;}
     break;
 
   case 330:
-#line 3157 "Gmsh.y"
+#line 3160 "Gmsh.y"
     {
       List_Add((yyval.l), &((yyvsp[(3) - (3)].d)));
     ;}
     break;
 
   case 331:
-#line 3161 "Gmsh.y"
+#line 3164 "Gmsh.y"
     {
       for(int i = 0; i < List_Nbr((yyvsp[(3) - (3)].l)); i++){
 	double d;
@@ -7515,21 +7518,21 @@ yyreduce:
     break;
 
   case 332:
-#line 3173 "Gmsh.y"
+#line 3176 "Gmsh.y"
     {
       (yyval.u) = CTX.PACK_COLOR((int)(yyvsp[(2) - (9)].d), (int)(yyvsp[(4) - (9)].d), (int)(yyvsp[(6) - (9)].d), (int)(yyvsp[(8) - (9)].d));
     ;}
     break;
 
   case 333:
-#line 3177 "Gmsh.y"
+#line 3180 "Gmsh.y"
     {
       (yyval.u) = CTX.PACK_COLOR((int)(yyvsp[(2) - (7)].d), (int)(yyvsp[(4) - (7)].d), (int)(yyvsp[(6) - (7)].d), 255);
     ;}
     break;
 
   case 334:
-#line 3189 "Gmsh.y"
+#line 3192 "Gmsh.y"
     {
       int flag;
       (yyval.u) = Get_ColorForString(ColorString, -1, (yyvsp[(1) - (1)].c), &flag);
@@ -7539,7 +7542,7 @@ yyreduce:
     break;
 
   case 335:
-#line 3196 "Gmsh.y"
+#line 3199 "Gmsh.y"
     {
       unsigned int val = 0;
       ColorOption(GMSH_GET, (yyvsp[(1) - (5)].c), 0, (yyvsp[(5) - (5)].c), val);
@@ -7549,14 +7552,14 @@ yyreduce:
     break;
 
   case 336:
-#line 3206 "Gmsh.y"
+#line 3209 "Gmsh.y"
     {
       (yyval.l) = (yyvsp[(2) - (3)].l);
     ;}
     break;
 
   case 337:
-#line 3210 "Gmsh.y"
+#line 3213 "Gmsh.y"
     {
       (yyval.l) = List_Create(256, 10, sizeof(unsigned int));
       GmshColorTable *ct = Get_ColorTable((int)(yyvsp[(3) - (6)].d));
@@ -7571,7 +7574,7 @@ yyreduce:
     break;
 
   case 338:
-#line 3225 "Gmsh.y"
+#line 3228 "Gmsh.y"
     {
       (yyval.l) = List_Create(256, 10, sizeof(unsigned int));
       List_Add((yyval.l), &((yyvsp[(1) - (1)].u)));
@@ -7579,35 +7582,35 @@ yyreduce:
     break;
 
   case 339:
-#line 3230 "Gmsh.y"
+#line 3233 "Gmsh.y"
     {
       List_Add((yyval.l), &((yyvsp[(3) - (3)].u)));
     ;}
     break;
 
   case 340:
-#line 3237 "Gmsh.y"
+#line 3240 "Gmsh.y"
     {
       (yyval.c) = (yyvsp[(1) - (1)].c);
     ;}
     break;
 
   case 341:
-#line 3241 "Gmsh.y"
+#line 3244 "Gmsh.y"
     {
       Msg::Warning("Named string expressions not implemented yet");
     ;}
     break;
 
   case 342:
-#line 3248 "Gmsh.y"
+#line 3251 "Gmsh.y"
     {
       (yyval.c) = (yyvsp[(1) - (1)].c);
     ;}
     break;
 
   case 343:
-#line 3252 "Gmsh.y"
+#line 3255 "Gmsh.y"
     {
       (yyval.c) = (char *)Malloc(32*sizeof(char));
       time_t now;
@@ -7618,7 +7621,7 @@ yyreduce:
     break;
 
   case 344:
-#line 3260 "Gmsh.y"
+#line 3263 "Gmsh.y"
     {
       (yyval.c) = (char *)Malloc((strlen((yyvsp[(3) - (6)].c))+strlen((yyvsp[(5) - (6)].c))+1)*sizeof(char));
       strcpy((yyval.c), (yyvsp[(3) - (6)].c));
@@ -7629,7 +7632,7 @@ yyreduce:
     break;
 
   case 345:
-#line 3268 "Gmsh.y"
+#line 3271 "Gmsh.y"
     {
       (yyval.c) = (char *)Malloc((strlen((yyvsp[(3) - (4)].c))+1)*sizeof(char));
       int i;
@@ -7646,7 +7649,7 @@ yyreduce:
     break;
 
   case 346:
-#line 3282 "Gmsh.y"
+#line 3285 "Gmsh.y"
     {
       (yyval.c) = (char *)Malloc((strlen((yyvsp[(3) - (4)].c))+1)*sizeof(char));
       int i;
@@ -7663,14 +7666,14 @@ yyreduce:
     break;
 
   case 347:
-#line 3296 "Gmsh.y"
+#line 3299 "Gmsh.y"
     {
       (yyval.c) = (yyvsp[(3) - (4)].c);
     ;}
     break;
 
   case 348:
-#line 3300 "Gmsh.y"
+#line 3303 "Gmsh.y"
     {
       char tmpstring[1024];
       int i = PrintListOfDouble((yyvsp[(3) - (6)].c), (yyvsp[(5) - (6)].l), tmpstring);
@@ -7692,7 +7695,7 @@ yyreduce:
     break;
 
   case 349:
-#line 3319 "Gmsh.y"
+#line 3322 "Gmsh.y"
     { 
       const char *val = "";
       StringOption(GMSH_GET, (yyvsp[(3) - (6)].c), 0, (yyvsp[(5) - (6)].c), val);
@@ -7703,7 +7706,7 @@ yyreduce:
     break;
 
   case 350:
-#line 3327 "Gmsh.y"
+#line 3330 "Gmsh.y"
     { 
       const char *val = "";
       StringOption(GMSH_GET, (yyvsp[(3) - (9)].c), (int)(yyvsp[(5) - (9)].d), (yyvsp[(8) - (9)].c), val);
@@ -7715,7 +7718,7 @@ yyreduce:
 
 
 /* Line 1267 of yacc.c.  */
-#line 7719 "Gmsh.tab.cpp"
+#line 7722 "Gmsh.tab.cpp"
       default: break;
     }
   YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
@@ -7929,7 +7932,7 @@ yyreturn:
 }
 
 
-#line 3336 "Gmsh.y"
+#line 3339 "Gmsh.y"
 
 
 void DeleteSymbol(void *a, void *b)
diff --git a/Parser/Gmsh.y b/Parser/Gmsh.y
index 2c4e1de61d6b35a4ac896899c5759af4a1d0466e..ab5807b1116d534ab74aa2cb0dfb8286a7b36806 100644
--- a/Parser/Gmsh.y
+++ b/Parser/Gmsh.y
@@ -1764,7 +1764,7 @@ Delete :
     }
   | tDelete tSTRING tEND
     {
-      if(!strcmp($2, "Meshes") || !strcmp($2, "All")){
+      if(!strcmp($2, "Model") || !strcmp($2, "Meshes") || !strcmp($2, "All")){
 	GModel::current()->destroy();
 	GModel::current()->getGEOInternals()->destroy();
       }
@@ -1772,6 +1772,9 @@ Delete :
 	GModel::current()->getGEOInternals()->reset_physicals();
 	GModel::current()->deletePhysicalGroups();
       }
+      else if(!strcmp($2, "Variables")){
+	InitSymbols();
+      }
       else{
 	Symbol TheSymbol, *pSymbol;
 	TheSymbol.Name = $2;
diff --git a/doc/texinfo/gmsh.texi b/doc/texinfo/gmsh.texi
index f43ade0904ade4d8126c2e8d28343917606420cc..1d6a36bfd60cf024436949ab2265a5f4151eff8d 100644
--- a/doc/texinfo/gmsh.texi
+++ b/doc/texinfo/gmsh.texi
@@ -1280,12 +1280,16 @@ the views.
 Forces the bounding box of the scene to the given @w{@var{expression}s} (X
 min, X max, Y min, Y max, Z min, Z max).
 
-@item Delete All;
-Deletes all geometrical entities and all currently loaded meshes.
+@item Delete Model;
+Deletes the current model (all geometrical entities and their associated
+meshes).
 
 @item Delete Physicals;
 Deletes all physical groups.
 
+@item Delete Variables;
+Deletes all the expressions.
+
 @item Delete @var{string};
 Deletes the expression @var{string}.