diff --git a/Geo/ExtrudeParams.h b/Geo/ExtrudeParams.h
index 90f28a2f633f6fbdc2b69261c509301103f9ad6c..a5ba17477685850c2f06548e8947e1c2369a6527 100644
--- a/Geo/ExtrudeParams.h
+++ b/Geo/ExtrudeParams.h
@@ -1,7 +1,7 @@
 #ifndef _EXTRUDE_PARAMS_H_
 #define _EXTRUDE_PARAMS_H_
 
-#define NB_LAYER_MAX 30
+#define NB_LAYER_MAX 500
 
 #define EXTRUDED_ENTITY 1
 #define COPIED_ENTITY 2
diff --git a/Parser/Gmsh.tab.cpp b/Parser/Gmsh.tab.cpp
index ff3066c833f9b5b39dacb45d32807b0dbd9edbaa..45e7279b1f69db39a9344c2098a33294e6d127d8 100644
--- a/Parser/Gmsh.tab.cpp
+++ b/Parser/Gmsh.tab.cpp
@@ -175,7 +175,7 @@
 #line 1 "Gmsh.y"
  
 
-// $Id: Gmsh.tab.cpp,v 1.109 2001-08-17 08:31:31 geuzaine Exp $
+// $Id: Gmsh.tab.cpp,v 1.110 2001-08-20 10:30:19 geuzaine Exp $
 
   //
   // Generaliser sprintf avec des chaines de caracteres
@@ -606,19 +606,19 @@ static const short yyrline[] = { 0,
   1419,  1420,  1423,  1428,  1439,  1457,  1465,  1470,  1481,  1549,
   1569,  1575,  1579,  1599,  1615,  1629,  1654,  1679,  1705,  1711,
   1716,  1721,  1725,  1735,  1741,  1747,  1751,  1755,  1759,  1763,
-  1768,  1773,  1779,  1786,  1790,  1795,  1816,  1826,  1845,  1863,
-  1881,  1903,  1924,  1945,  1959,  1980,  1985,  1996,  1998,  1999,
-  2000,  2001,  2004,  2006,  2007,  2008,  2009,  2010,  2011,  2012,
-  2013,  2020,  2021,  2022,  2023,  2024,  2025,  2026,  2027,  2028,
-  2029,  2030,  2031,  2032,  2033,  2034,  2035,  2036,  2037,  2038,
-  2039,  2040,  2041,  2042,  2043,  2044,  2045,  2046,  2047,  2048,
-  2049,  2050,  2051,  2056,  2061,  2062,  2063,  2067,  2078,  2095,
-  2106,  2125,  2141,  2157,  2173,  2190,  2195,  2199,  2203,  2207,
-  2212,  2217,  2221,  2225,  2231,  2235,  2240,  2244,  2249,  2253,
-  2257,  2263,  2269,  2276,  2282,  2286,  2290,  2300,  2307,  2318,
-  2332,  2348,  2368,  2392,  2398,  2402,  2406,  2417,  2422,  2433,
-  2438,  2456,  2461,  2474,  2480,  2486,  2491,  2499,  2512,  2516,
-  2541,  2555
+  1768,  1773,  1779,  1786,  1790,  1795,  1825,  1835,  1854,  1872,
+  1890,  1912,  1933,  1954,  1968,  1989,  1994,  2005,  2007,  2008,
+  2009,  2010,  2013,  2015,  2016,  2017,  2018,  2019,  2020,  2021,
+  2022,  2029,  2030,  2031,  2032,  2033,  2034,  2035,  2036,  2037,
+  2038,  2039,  2040,  2041,  2042,  2043,  2044,  2045,  2046,  2047,
+  2048,  2049,  2050,  2051,  2052,  2053,  2054,  2055,  2056,  2057,
+  2058,  2059,  2060,  2065,  2070,  2071,  2072,  2076,  2087,  2104,
+  2115,  2134,  2150,  2166,  2182,  2199,  2204,  2208,  2212,  2216,
+  2221,  2226,  2230,  2234,  2240,  2244,  2249,  2253,  2258,  2262,
+  2266,  2272,  2278,  2285,  2291,  2295,  2299,  2309,  2316,  2327,
+  2341,  2357,  2377,  2401,  2407,  2411,  2415,  2426,  2431,  2442,
+  2447,  2465,  2470,  2483,  2489,  2495,  2500,  2508,  2521,  2525,
+  2550,  2564
 };
 #endif
 
@@ -4744,15 +4744,24 @@ case 226:
       int j;
       extr.mesh.ExtrudeMesh = true;
       extr.mesh.NbLayer = List_Nbr(yyvsp[-6].l);
-      for(int i=0;i<List_Nbr(yyvsp[-6].l);i++){
-	List_Read(yyvsp[-6].l,i,&d);
-	j = (int)d;
-	extr.mesh.NbElmLayer[i] = j;
-	List_Read(yyvsp[-4].l,i,&d);
-	j = (int)d;
-	extr.mesh.ZonLayer[i] = j;
-	List_Read(yyvsp[-2].l,i,&d);
-	extr.mesh.hLayer[i] = d;
+      if(extr.mesh.NbLayer > NB_LAYER_MAX){
+	vyyerror("Too many layers in extrusion");
+      }
+      else if(List_Nbr(yyvsp[-6].l) == List_Nbr(yyvsp[-4].l) && List_Nbr(yyvsp[-6].l) == List_Nbr(yyvsp[-2].l)){
+	for(int i=0;i<List_Nbr(yyvsp[-6].l);i++){
+	  List_Read(yyvsp[-6].l,i,&d);
+	  j = (int)d;
+	  extr.mesh.NbElmLayer[i] = j;
+	  List_Read(yyvsp[-4].l,i,&d);
+	  j = (int)d;
+	  extr.mesh.ZonLayer[i] = j;
+	  List_Read(yyvsp[-2].l,i,&d);
+	  extr.mesh.hLayer[i] = d;
+	}
+      }
+      else{
+	vyyerror("Wrong layer definition {%d, %d, %d}", 
+	       List_Nbr(yyvsp[-6].l), List_Nbr(yyvsp[-4].l), List_Nbr(yyvsp[-2].l));
       }
       List_Delete(yyvsp[-6].l);
       List_Delete(yyvsp[-4].l);
@@ -4760,13 +4769,13 @@ case 226:
     ;
     break;}
 case 227:
-#line 1817 "Gmsh.y"
+#line 1826 "Gmsh.y"
 {
       extr.mesh.Recombine = true;
     ;
     break;}
 case 228:
-#line 1828 "Gmsh.y"
+#line 1837 "Gmsh.y"
 {
       Curve *c;
       for(i=0;i<List_Nbr(yyvsp[-3].l);i++){
@@ -4786,7 +4795,7 @@ case 228:
     ;
     break;}
 case 229:
-#line 1846 "Gmsh.y"
+#line 1855 "Gmsh.y"
 {
       Curve *c;
       for(i=0;i<List_Nbr(yyvsp[-6].l);i++){
@@ -4806,7 +4815,7 @@ case 229:
     ;
     break;}
 case 230:
-#line 1864 "Gmsh.y"
+#line 1873 "Gmsh.y"
 {
       Curve *c;
       for(i=0;i<List_Nbr(yyvsp[-6].l);i++){
@@ -4826,7 +4835,7 @@ case 230:
     ;
     break;}
 case 231:
-#line 1882 "Gmsh.y"
+#line 1891 "Gmsh.y"
 {
       Surface *s = FindSurface((int)yyvsp[-4].d,THEM);
       if(!s)
@@ -4850,7 +4859,7 @@ case 231:
     ;
     break;}
 case 232:
-#line 1904 "Gmsh.y"
+#line 1913 "Gmsh.y"
 {
       Surface *s = FindSurface((int)yyvsp[-4].d,THEM);
       if(!s)
@@ -4873,7 +4882,7 @@ case 232:
     ;
     break;}
 case 233:
-#line 1925 "Gmsh.y"
+#line 1934 "Gmsh.y"
 {
       Volume *v = FindVolume((int)yyvsp[-4].d,THEM);
       if(!v)
@@ -4896,7 +4905,7 @@ case 233:
     ;
     break;}
 case 234:
-#line 1946 "Gmsh.y"
+#line 1955 "Gmsh.y"
 {
       Surface *s;
       for(i=0;i<List_Nbr(yyvsp[-3].l);i++){
@@ -4912,7 +4921,7 @@ case 234:
     ;
     break;}
 case 235:
-#line 1960 "Gmsh.y"
+#line 1969 "Gmsh.y"
 {
       Surface *s;
       for(i=0;i<List_Nbr(yyvsp[-1].l);i++){
@@ -4928,71 +4937,71 @@ case 235:
     ;
     break;}
 case 236:
-#line 1982 "Gmsh.y"
+#line 1991 "Gmsh.y"
 { 
       Coherence_PS();
     ;
     break;}
 case 237:
-#line 1986 "Gmsh.y"
+#line 1995 "Gmsh.y"
 { 
       IntersectAllSegmentsTogether();
     ;
     break;}
 case 238:
-#line 1997 "Gmsh.y"
+#line 2006 "Gmsh.y"
 {yyval.i = 1;;
     break;}
 case 239:
-#line 1998 "Gmsh.y"
+#line 2007 "Gmsh.y"
 {yyval.i = 0;;
     break;}
 case 240:
-#line 1999 "Gmsh.y"
+#line 2008 "Gmsh.y"
 {yyval.i = -1;;
     break;}
 case 241:
-#line 2000 "Gmsh.y"
+#line 2009 "Gmsh.y"
 {yyval.i = -1;;
     break;}
 case 242:
-#line 2001 "Gmsh.y"
+#line 2010 "Gmsh.y"
 {yyval.i = -1;;
     break;}
 case 243:
-#line 2005 "Gmsh.y"
+#line 2014 "Gmsh.y"
 { yyval.d = yyvsp[0].d;           ;
     break;}
 case 244:
-#line 2006 "Gmsh.y"
+#line 2015 "Gmsh.y"
 { yyval.d = yyvsp[-1].d ;          ;
     break;}
 case 245:
-#line 2007 "Gmsh.y"
+#line 2016 "Gmsh.y"
 { yyval.d = -yyvsp[0].d ;         ;
     break;}
 case 246:
-#line 2008 "Gmsh.y"
+#line 2017 "Gmsh.y"
 { yyval.d = yyvsp[0].d;           ;
     break;}
 case 247:
-#line 2009 "Gmsh.y"
+#line 2018 "Gmsh.y"
 { yyval.d = !yyvsp[0].d ;         ;
     break;}
 case 248:
-#line 2010 "Gmsh.y"
+#line 2019 "Gmsh.y"
 { yyval.d = yyvsp[-2].d - yyvsp[0].d ;     ;
     break;}
 case 249:
-#line 2011 "Gmsh.y"
+#line 2020 "Gmsh.y"
 { yyval.d = yyvsp[-2].d + yyvsp[0].d ;     ;
     break;}
 case 250:
-#line 2012 "Gmsh.y"
+#line 2021 "Gmsh.y"
 { yyval.d = yyvsp[-2].d * yyvsp[0].d ;     ;
     break;}
 case 251:
-#line 2014 "Gmsh.y"
+#line 2023 "Gmsh.y"
 { 
       if(!yyvsp[0].d)
 	vyyerror("Division by zero in '%g / %g'", yyvsp[-2].d, yyvsp[0].d);
@@ -5001,151 +5010,151 @@ case 251:
     ;
     break;}
 case 252:
-#line 2020 "Gmsh.y"
+#line 2029 "Gmsh.y"
 { yyval.d = (int)yyvsp[-2].d % (int)yyvsp[0].d ;  ;
     break;}
 case 253:
-#line 2021 "Gmsh.y"
+#line 2030 "Gmsh.y"
 { yyval.d = pow(yyvsp[-2].d,yyvsp[0].d) ;  ;
     break;}
 case 254:
-#line 2022 "Gmsh.y"
+#line 2031 "Gmsh.y"
 { yyval.d = yyvsp[-2].d < yyvsp[0].d ;     ;
     break;}
 case 255:
-#line 2023 "Gmsh.y"
+#line 2032 "Gmsh.y"
 { yyval.d = yyvsp[-2].d > yyvsp[0].d ;     ;
     break;}
 case 256:
-#line 2024 "Gmsh.y"
+#line 2033 "Gmsh.y"
 { yyval.d = yyvsp[-2].d <= yyvsp[0].d ;    ;
     break;}
 case 257:
-#line 2025 "Gmsh.y"
+#line 2034 "Gmsh.y"
 { yyval.d = yyvsp[-2].d >= yyvsp[0].d ;    ;
     break;}
 case 258:
-#line 2026 "Gmsh.y"
+#line 2035 "Gmsh.y"
 { yyval.d = yyvsp[-2].d == yyvsp[0].d ;    ;
     break;}
 case 259:
-#line 2027 "Gmsh.y"
+#line 2036 "Gmsh.y"
 { yyval.d = yyvsp[-2].d != yyvsp[0].d ;    ;
     break;}
 case 260:
-#line 2028 "Gmsh.y"
+#line 2037 "Gmsh.y"
 { yyval.d = yyvsp[-2].d && yyvsp[0].d ;    ;
     break;}
 case 261:
-#line 2029 "Gmsh.y"
+#line 2038 "Gmsh.y"
 { yyval.d = yyvsp[-2].d || yyvsp[0].d ;    ;
     break;}
 case 262:
-#line 2030 "Gmsh.y"
+#line 2039 "Gmsh.y"
 { yyval.d = yyvsp[-4].d? yyvsp[-2].d : yyvsp[0].d ; ;
     break;}
 case 263:
-#line 2031 "Gmsh.y"
+#line 2040 "Gmsh.y"
 { yyval.d = exp(yyvsp[-1].d);      ;
     break;}
 case 264:
-#line 2032 "Gmsh.y"
+#line 2041 "Gmsh.y"
 { yyval.d = log(yyvsp[-1].d);      ;
     break;}
 case 265:
-#line 2033 "Gmsh.y"
+#line 2042 "Gmsh.y"
 { yyval.d = log10(yyvsp[-1].d);    ;
     break;}
 case 266:
-#line 2034 "Gmsh.y"
+#line 2043 "Gmsh.y"
 { yyval.d = sqrt(yyvsp[-1].d);     ;
     break;}
 case 267:
-#line 2035 "Gmsh.y"
+#line 2044 "Gmsh.y"
 { yyval.d = sin(yyvsp[-1].d);      ;
     break;}
 case 268:
-#line 2036 "Gmsh.y"
+#line 2045 "Gmsh.y"
 { yyval.d = asin(yyvsp[-1].d);     ;
     break;}
 case 269:
-#line 2037 "Gmsh.y"
+#line 2046 "Gmsh.y"
 { yyval.d = cos(yyvsp[-1].d);      ;
     break;}
 case 270:
-#line 2038 "Gmsh.y"
+#line 2047 "Gmsh.y"
 { yyval.d = acos(yyvsp[-1].d);     ;
     break;}
 case 271:
-#line 2039 "Gmsh.y"
+#line 2048 "Gmsh.y"
 { yyval.d = tan(yyvsp[-1].d);      ;
     break;}
 case 272:
-#line 2040 "Gmsh.y"
+#line 2049 "Gmsh.y"
 { yyval.d = atan(yyvsp[-1].d);     ;
     break;}
 case 273:
-#line 2041 "Gmsh.y"
+#line 2050 "Gmsh.y"
 { yyval.d = atan2(yyvsp[-3].d,yyvsp[-1].d); ;
     break;}
 case 274:
-#line 2042 "Gmsh.y"
+#line 2051 "Gmsh.y"
 { yyval.d = sinh(yyvsp[-1].d);     ;
     break;}
 case 275:
-#line 2043 "Gmsh.y"
+#line 2052 "Gmsh.y"
 { yyval.d = cosh(yyvsp[-1].d);     ;
     break;}
 case 276:
-#line 2044 "Gmsh.y"
+#line 2053 "Gmsh.y"
 { yyval.d = tanh(yyvsp[-1].d);     ;
     break;}
 case 277:
-#line 2045 "Gmsh.y"
+#line 2054 "Gmsh.y"
 { yyval.d = fabs(yyvsp[-1].d);     ;
     break;}
 case 278:
-#line 2046 "Gmsh.y"
+#line 2055 "Gmsh.y"
 { yyval.d = floor(yyvsp[-1].d);    ;
     break;}
 case 279:
-#line 2047 "Gmsh.y"
+#line 2056 "Gmsh.y"
 { yyval.d = ceil(yyvsp[-1].d);     ;
     break;}
 case 280:
-#line 2048 "Gmsh.y"
+#line 2057 "Gmsh.y"
 { yyval.d = fmod(yyvsp[-3].d,yyvsp[-1].d);  ;
     break;}
 case 281:
-#line 2049 "Gmsh.y"
+#line 2058 "Gmsh.y"
 { yyval.d = fmod(yyvsp[-3].d,yyvsp[-1].d);  ;
     break;}
 case 282:
-#line 2050 "Gmsh.y"
+#line 2059 "Gmsh.y"
 { yyval.d = sqrt(yyvsp[-3].d*yyvsp[-3].d+yyvsp[-1].d*yyvsp[-1].d); ;
     break;}
 case 283:
-#line 2051 "Gmsh.y"
+#line 2060 "Gmsh.y"
 { yyval.d = yyvsp[-1].d*(double)rand()/(double)RAND_MAX; ;
     break;}
 case 284:
-#line 2060 "Gmsh.y"
+#line 2069 "Gmsh.y"
 { yyval.d = yyvsp[0].d; ;
     break;}
 case 285:
-#line 2061 "Gmsh.y"
+#line 2070 "Gmsh.y"
 { yyval.d = 3.141592653589793; ;
     break;}
 case 286:
-#line 2062 "Gmsh.y"
+#line 2071 "Gmsh.y"
 { yyval.d = ParUtil::Instance()->rank(); ;
     break;}
 case 287:
-#line 2063 "Gmsh.y"
+#line 2072 "Gmsh.y"
 { yyval.d = ParUtil::Instance()->size(); ;
     break;}
 case 288:
-#line 2068 "Gmsh.y"
+#line 2077 "Gmsh.y"
 {
       TheSymbol.Name = yyvsp[0].c ;
       if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols))) {
@@ -5157,7 +5166,7 @@ case 288:
     ;
     break;}
 case 289:
-#line 2079 "Gmsh.y"
+#line 2088 "Gmsh.y"
 {
       TheSymbol.Name = yyvsp[-3].c ;
       if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols))) {
@@ -5175,7 +5184,7 @@ case 289:
     ;
     break;}
 case 290:
-#line 2096 "Gmsh.y"
+#line 2105 "Gmsh.y"
 {
       TheSymbol.Name = yyvsp[-1].c ;
       if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols))) {
@@ -5187,7 +5196,7 @@ case 290:
     ;
     break;}
 case 291:
-#line 2107 "Gmsh.y"
+#line 2116 "Gmsh.y"
 {
       TheSymbol.Name = yyvsp[-4].c ;
       if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols))) {
@@ -5205,7 +5214,7 @@ case 291:
     ;
     break;}
 case 292:
-#line 2126 "Gmsh.y"
+#line 2135 "Gmsh.y"
 {
       if(!(pNumCat = Get_NumberOptionCategory(yyvsp[-2].c))){
 	vyyerror("Unknown numeric option class '%s'", yyvsp[-2].c);
@@ -5222,7 +5231,7 @@ case 292:
     ;
     break;}
 case 293:
-#line 2142 "Gmsh.y"
+#line 2151 "Gmsh.y"
 {
       if(!(pNumCat = Get_NumberOptionCategory(yyvsp[-5].c))){
 	vyyerror("Unknown numeric option class '%s'", yyvsp[-5].c);
@@ -5239,7 +5248,7 @@ case 293:
     ;
     break;}
 case 294:
-#line 2158 "Gmsh.y"
+#line 2167 "Gmsh.y"
 {
       if(!(pNumCat = Get_NumberOptionCategory(yyvsp[-3].c))){
 	vyyerror("Unknown numeric option class '%s'", yyvsp[-3].c);
@@ -5256,7 +5265,7 @@ case 294:
     ;
     break;}
 case 295:
-#line 2174 "Gmsh.y"
+#line 2183 "Gmsh.y"
 {
       if(!(pNumCat = Get_NumberOptionCategory(yyvsp[-6].c))){
 	vyyerror("Unknown numeric option class '%s'", yyvsp[-6].c);
@@ -5273,130 +5282,130 @@ case 295:
     ;
     break;}
 case 296:
-#line 2192 "Gmsh.y"
+#line 2201 "Gmsh.y"
 {
       memcpy(yyval.v, yyvsp[0].v, 5*sizeof(double)) ;
     ;
     break;}
 case 297:
-#line 2196 "Gmsh.y"
+#line 2205 "Gmsh.y"
 {
       for(i=0 ; i<5 ; i++) yyval.v[i] = -yyvsp[0].v[i] ;
     ;
     break;}
 case 298:
-#line 2200 "Gmsh.y"
+#line 2209 "Gmsh.y"
 { 
       for(i=0 ; i<5 ; i++) yyval.v[i] = yyvsp[0].v[i];
     ;
     break;}
 case 299:
-#line 2204 "Gmsh.y"
+#line 2213 "Gmsh.y"
 { 
       for(i=0 ; i<5 ; i++) yyval.v[i] = yyvsp[-2].v[i] - yyvsp[0].v[i] ;
     ;
     break;}
 case 300:
-#line 2208 "Gmsh.y"
+#line 2217 "Gmsh.y"
 {
       for(i=0 ; i<5 ; i++) yyval.v[i] = yyvsp[-2].v[i] + yyvsp[0].v[i] ;
     ;
     break;}
 case 301:
-#line 2214 "Gmsh.y"
+#line 2223 "Gmsh.y"
 { 
       yyval.v[0]=yyvsp[-9].d;  yyval.v[1]=yyvsp[-7].d;  yyval.v[2]=yyvsp[-5].d;  yyval.v[3]=yyvsp[-3].d; yyval.v[4]=yyvsp[-1].d;
     ;
     break;}
 case 302:
-#line 2218 "Gmsh.y"
+#line 2227 "Gmsh.y"
 { 
       yyval.v[0]=yyvsp[-7].d;  yyval.v[1]=yyvsp[-5].d;  yyval.v[2]=yyvsp[-3].d;  yyval.v[3]=yyvsp[-1].d; yyval.v[4]=1.0;
     ;
     break;}
 case 303:
-#line 2222 "Gmsh.y"
+#line 2231 "Gmsh.y"
 {
       yyval.v[0]=yyvsp[-5].d;  yyval.v[1]=yyvsp[-3].d;  yyval.v[2]=yyvsp[-1].d;  yyval.v[3]=0.0; yyval.v[4]=1.0;
     ;
     break;}
 case 304:
-#line 2226 "Gmsh.y"
+#line 2235 "Gmsh.y"
 {
       yyval.v[0]=yyvsp[-5].d;  yyval.v[1]=yyvsp[-3].d;  yyval.v[2]=yyvsp[-1].d;  yyval.v[3]=0.0; yyval.v[4]=1.0;
     ;
     break;}
 case 305:
-#line 2233 "Gmsh.y"
+#line 2242 "Gmsh.y"
 {
     ;
     break;}
 case 306:
-#line 2236 "Gmsh.y"
+#line 2245 "Gmsh.y"
 {
     ;
     break;}
 case 307:
-#line 2242 "Gmsh.y"
+#line 2251 "Gmsh.y"
 {
     ;
     break;}
 case 308:
-#line 2245 "Gmsh.y"
+#line 2254 "Gmsh.y"
 {
     ;
     break;}
 case 309:
-#line 2251 "Gmsh.y"
+#line 2260 "Gmsh.y"
 {
     ;
     break;}
 case 310:
-#line 2254 "Gmsh.y"
+#line 2263 "Gmsh.y"
 {
        yyval.l=yyvsp[-1].l;
     ;
     break;}
 case 311:
-#line 2258 "Gmsh.y"
+#line 2267 "Gmsh.y"
 {
        yyval.l=yyvsp[-1].l;
     ;
     break;}
 case 312:
-#line 2265 "Gmsh.y"
+#line 2274 "Gmsh.y"
 {
       yyval.l = List_Create(2,1,sizeof(List_T*)) ;
       List_Add(yyval.l, &(yyvsp[0].l)) ;
     ;
     break;}
 case 313:
-#line 2270 "Gmsh.y"
+#line 2279 "Gmsh.y"
 {
       List_Add(yyval.l, &(yyvsp[0].l)) ;
     ;
     break;}
 case 314:
-#line 2278 "Gmsh.y"
+#line 2287 "Gmsh.y"
 {
       yyval.l = List_Create(2,1,sizeof(double)) ;
       List_Add(yyval.l, &(yyvsp[0].d)) ;
     ;
     break;}
 case 315:
-#line 2283 "Gmsh.y"
+#line 2292 "Gmsh.y"
 {
       yyval.l = yyvsp[0].l ;
     ;
     break;}
 case 316:
-#line 2287 "Gmsh.y"
+#line 2296 "Gmsh.y"
 {
       yyval.l=yyvsp[-1].l;
     ;
     break;}
 case 317:
-#line 2291 "Gmsh.y"
+#line 2300 "Gmsh.y"
 {
       yyval.l=yyvsp[-1].l;
       for(i=0 ; i<List_Nbr(yyval.l) ; i++){
@@ -5406,7 +5415,7 @@ case 317:
     ;
     break;}
 case 318:
-#line 2302 "Gmsh.y"
+#line 2311 "Gmsh.y"
 { 
       yyval.l = List_Create(2,1,sizeof(double)) ; 
       for(d=yyvsp[-2].d ; (yyvsp[-2].d<yyvsp[0].d)?(d<=yyvsp[0].d):(d>=yyvsp[0].d) ; (yyvsp[-2].d<yyvsp[0].d)?(d+=1.):(d-=1.)) 
@@ -5414,7 +5423,7 @@ case 318:
     ;
     break;}
 case 319:
-#line 2308 "Gmsh.y"
+#line 2317 "Gmsh.y"
 {
       yyval.l = List_Create(2,1,sizeof(double)) ; 
       if(!yyvsp[0].d || (yyvsp[-4].d<yyvsp[-2].d && yyvsp[0].d<0) || (yyvsp[-4].d>yyvsp[-2].d && yyvsp[0].d>0)){
@@ -5427,7 +5436,7 @@ case 319:
    ;
     break;}
 case 320:
-#line 2319 "Gmsh.y"
+#line 2328 "Gmsh.y"
 {
       yyval.l = List_Create(2,1,sizeof(double)) ;
       TheSymbol.Name = yyvsp[-2].c ;
@@ -5443,7 +5452,7 @@ case 320:
     ;
     break;}
 case 321:
-#line 2333 "Gmsh.y"
+#line 2342 "Gmsh.y"
 {
       yyval.l = List_Create(2,1,sizeof(double)) ;
       TheSymbol.Name = yyvsp[-2].c ;
@@ -5461,7 +5470,7 @@ case 321:
     ;
     break;}
 case 322:
-#line 2349 "Gmsh.y"
+#line 2358 "Gmsh.y"
 {
       yyval.l = List_Create(2,1,sizeof(double)) ;
       TheSymbol.Name = yyvsp[-5].c ;
@@ -5483,7 +5492,7 @@ case 322:
     ;
     break;}
 case 323:
-#line 2369 "Gmsh.y"
+#line 2378 "Gmsh.y"
 {
       yyval.l = List_Create(2,1,sizeof(double)) ;
       TheSymbol.Name = yyvsp[-5].c ;
@@ -5507,26 +5516,26 @@ case 323:
     ;
     break;}
 case 324:
-#line 2394 "Gmsh.y"
+#line 2403 "Gmsh.y"
 {
       yyval.l = List_Create(2,1,sizeof(double)) ;
       List_Add(yyval.l, &(yyvsp[0].d)) ;
     ;
     break;}
 case 325:
-#line 2399 "Gmsh.y"
+#line 2408 "Gmsh.y"
 {
       yyval.l = yyvsp[0].l ;
     ;
     break;}
 case 326:
-#line 2403 "Gmsh.y"
+#line 2412 "Gmsh.y"
 {
       List_Add(yyval.l, &(yyvsp[0].d)) ;
     ;
     break;}
 case 327:
-#line 2407 "Gmsh.y"
+#line 2416 "Gmsh.y"
 {
       for(i=0 ; i<List_Nbr(yyvsp[0].l) ; i++){
 	List_Read(yyvsp[0].l, i, &d) ;
@@ -5536,26 +5545,26 @@ case 327:
     ;
     break;}
 case 328:
-#line 2419 "Gmsh.y"
+#line 2428 "Gmsh.y"
 {
       yyval.u = PACK_COLOR((int)yyvsp[-7].d, (int)yyvsp[-5].d, (int)yyvsp[-3].d, (int)yyvsp[-1].d);
     ;
     break;}
 case 329:
-#line 2423 "Gmsh.y"
+#line 2432 "Gmsh.y"
 {
       yyval.u = PACK_COLOR((int)yyvsp[-5].d, (int)yyvsp[-3].d, (int)yyvsp[-1].d, 255);
     ;
     break;}
 case 330:
-#line 2434 "Gmsh.y"
+#line 2443 "Gmsh.y"
 {
       yyval.u = Get_ColorForString(ColorString, -1, yyvsp[0].c, &flag);
       if(flag) vyyerror("Unknown color '%s'", yyvsp[0].c);
     ;
     break;}
 case 331:
-#line 2439 "Gmsh.y"
+#line 2448 "Gmsh.y"
 {
       if(!(pColCat = Get_ColorOptionCategory(yyvsp[-4].c))){
 	vyyerror("Unknown color option class '%s'", yyvsp[-4].c);
@@ -5573,13 +5582,13 @@ case 331:
     ;
     break;}
 case 332:
-#line 2458 "Gmsh.y"
+#line 2467 "Gmsh.y"
 {
       yyval.l = yyvsp[-1].l;
     ;
     break;}
 case 333:
-#line 2462 "Gmsh.y"
+#line 2471 "Gmsh.y"
 {
       yyval.l = List_Create(256,10,sizeof(unsigned int)) ;
       ColorTable *ct = Get_ColorTable((int)yyvsp[-3].d);
@@ -5592,26 +5601,26 @@ case 333:
     ;
     break;}
 case 334:
-#line 2476 "Gmsh.y"
+#line 2485 "Gmsh.y"
 {
       yyval.l = List_Create(256,10,sizeof(unsigned int)) ;
       List_Add(yyval.l, &(yyvsp[0].u)) ;
     ;
     break;}
 case 335:
-#line 2481 "Gmsh.y"
+#line 2490 "Gmsh.y"
 {
       List_Add(yyval.l, &(yyvsp[0].u)) ;
     ;
     break;}
 case 336:
-#line 2488 "Gmsh.y"
+#line 2497 "Gmsh.y"
 {
       yyval.c = yyvsp[0].c;
     ;
     break;}
 case 337:
-#line 2492 "Gmsh.y"
+#line 2501 "Gmsh.y"
 {
       yyval.c = (char *)Malloc((strlen(yyvsp[-3].c)+strlen(yyvsp[-1].c)+1)*sizeof(char)) ;
       strcpy(yyval.c, yyvsp[-3].c) ;  
@@ -5621,7 +5630,7 @@ case 337:
     ;
     break;}
 case 338:
-#line 2500 "Gmsh.y"
+#line 2509 "Gmsh.y"
 {
       yyval.c = (char *)Malloc((strlen(yyvsp[-1].c)+1)*sizeof(char)) ;
       for(i=strlen(yyvsp[-1].c)-1; i>=0; i--){
@@ -5636,13 +5645,13 @@ case 338:
     ;
     break;}
 case 339:
-#line 2513 "Gmsh.y"
+#line 2522 "Gmsh.y"
 {
       yyval.c = yyvsp[-1].c;
     ;
     break;}
 case 340:
-#line 2517 "Gmsh.y"
+#line 2526 "Gmsh.y"
 {
       for(i = 0 ; i<List_Nbr(yyvsp[-1].l) ; i++){
 	if(!i){
@@ -5669,7 +5678,7 @@ case 340:
     ;
     break;}
 case 341:
-#line 2542 "Gmsh.y"
+#line 2551 "Gmsh.y"
 { 
       if(!(pStrCat = Get_StringOptionCategory(yyvsp[-3].c)))
 	vyyerror("Unknown string option class '%s'", yyvsp[-3].c);
@@ -5685,7 +5694,7 @@ case 341:
     ;
     break;}
 case 342:
-#line 2556 "Gmsh.y"
+#line 2565 "Gmsh.y"
 { 
       if(!(pStrCat = Get_StringOptionCategory(yyvsp[-6].c)))
 	vyyerror("Unknown string option class '%s'", yyvsp[-6].c);
@@ -5922,7 +5931,7 @@ yyerrhandle:
     }
   return 1;
 }
-#line 2571 "Gmsh.y"
+#line 2580 "Gmsh.y"
 
 
 void InitSymbols(void){
diff --git a/Parser/Gmsh.y b/Parser/Gmsh.y
index a5826ceccee23d6f4b770830432315848b40ff92..f96299fea5fb5a6b436d265a333dafa8f2a1863e 100644
--- a/Parser/Gmsh.y
+++ b/Parser/Gmsh.y
@@ -1,6 +1,6 @@
 %{ 
 
-// $Id: Gmsh.y,v 1.95 2001-08-17 08:31:32 geuzaine Exp $
+// $Id: Gmsh.y,v 1.96 2001-08-20 10:30:20 geuzaine Exp $
 
   //
   // Generaliser sprintf avec des chaines de caracteres
@@ -1799,15 +1799,24 @@ ExtrudeParameter :
       int j;
       extr.mesh.ExtrudeMesh = true;
       extr.mesh.NbLayer = List_Nbr($3);
-      for(int i=0;i<List_Nbr($3);i++){
-	List_Read($3,i,&d);
-	j = (int)d;
-	extr.mesh.NbElmLayer[i] = j;
-	List_Read($5,i,&d);
-	j = (int)d;
-	extr.mesh.ZonLayer[i] = j;
-	List_Read($7,i,&d);
-	extr.mesh.hLayer[i] = d;
+      if(extr.mesh.NbLayer > NB_LAYER_MAX){
+	vyyerror("Too many layers in extrusion");
+      }
+      else if(List_Nbr($3) == List_Nbr($5) && List_Nbr($3) == List_Nbr($7)){
+	for(int i=0;i<List_Nbr($3);i++){
+	  List_Read($3,i,&d);
+	  j = (int)d;
+	  extr.mesh.NbElmLayer[i] = j;
+	  List_Read($5,i,&d);
+	  j = (int)d;
+	  extr.mesh.ZonLayer[i] = j;
+	  List_Read($7,i,&d);
+	  extr.mesh.hLayer[i] = d;
+	}
+      }
+      else{
+	vyyerror("Wrong layer definition {%d, %d, %d}", 
+	       List_Nbr($3), List_Nbr($5), List_Nbr($7));
       }
       List_Delete($3);
       List_Delete($5);
diff --git a/Parser/Gmsh.yy.cpp b/Parser/Gmsh.yy.cpp
index 7916e8ea3bd5c65b4b3ad08a5321b1e45ec0adaf..9eae60b210ec808f48dc81cd5eb810dc1ca613d9 100644
--- a/Parser/Gmsh.yy.cpp
+++ b/Parser/Gmsh.yy.cpp
@@ -2,7 +2,7 @@
 /* A lexical scanner generated by flex */
 
 /* Scanner skeleton version:
- * $Header: /cvsroot/gmsh/Parser/Gmsh.yy.cpp,v 1.109 2001-08-17 08:31:32 geuzaine Exp $
+ * $Header: /cvsroot/gmsh/Parser/Gmsh.yy.cpp,v 1.110 2001-08-20 10:30:20 geuzaine Exp $
  */
 
 #define FLEX_SCANNER
@@ -998,7 +998,7 @@ char *yytext;
 #define INITIAL 0
 #line 2 "Gmsh.l"
 
-// $Id: Gmsh.yy.cpp,v 1.109 2001-08-17 08:31:32 geuzaine Exp $
+// $Id: Gmsh.yy.cpp,v 1.110 2001-08-20 10:30:20 geuzaine Exp $
 
 #include <stdio.h>
 #include <stdlib.h>