diff --git a/Graphics/Mesh.cpp b/Graphics/Mesh.cpp
index e9966bce04d7265047eef26b817c1c27799c0751..fa54b716f035c0db093fad0008de7945476578ed 100644
--- a/Graphics/Mesh.cpp
+++ b/Graphics/Mesh.cpp
@@ -1,4 +1,4 @@
-// $Id: Mesh.cpp,v 1.28 2001-06-02 19:44:35 remacle Exp $
+// $Id: Mesh.cpp,v 1.29 2001-06-03 11:27:25 geuzaine Exp $
 
 #include "Gmsh.h"
 #include "GmshUI.h"
@@ -483,7 +483,7 @@ void Draw_Simplex_Surfaces (void *a, void *b){
     
     if(CTX.mesh.lines){
       if(CTX.mesh.color_carousel && ! (CTX.mesh.hidden || CTX.mesh.shade))
-	ColorSwitch((*s)->iEnt);
+	ColorSwitch(iColor);
       else
 	glColor4ubv((GLubyte*)&CTX.color.mesh.line);
       glBegin(GL_LINE_LOOP);
diff --git a/Mesh/2D_Mesh.cpp b/Mesh/2D_Mesh.cpp
index f65fca8a17dd6d867879f42d54a276b767e192ff..c07b63d8ffed0098ec34125c5f13461756ea52c2 100644
--- a/Mesh/2D_Mesh.cpp
+++ b/Mesh/2D_Mesh.cpp
@@ -1,4 +1,4 @@
-// $Id: 2D_Mesh.cpp,v 1.24 2001-06-02 16:24:51 geuzaine Exp $
+// $Id: 2D_Mesh.cpp,v 1.25 2001-06-03 11:19:52 geuzaine Exp $
 
 /*
    Maillage Delaunay d'une surface (Point insertion Technique)
@@ -1033,7 +1033,7 @@ void ActionEndTheCurve (void *a, void *b){
 void Maillage_Surface (void *data, void *dum){
   Surface  **pS, *s;
   Tree_T    *tnxe;
-  int        ori;
+  int        ori, nbqua = 0;
 
   pS = (Surface **) data;
   s = *pS;
@@ -1105,8 +1105,9 @@ void Maillage_Surface (void *data, void *dum){
     Tree_Delete (tnxe);
   }
 
+
   if (s->Recombine)
-    Recombine (s->Vertices, s->Simplexes, s->RecombineAngle);
+    nbqua = Recombine (s->Vertices, s->Simplexes, s->RecombineAngle);
 
   s->Typ = TypSurface;
 
@@ -1138,6 +1139,7 @@ void Maillage_Surface (void *data, void *dum){
     Degre2 (THEM->Vertices, THEM->VertexEdges, s->Simplexes, NULL, THESUPPORT);
 
   THEM->Statistics[5] += Tree_Nbr(THESURFACE->Vertices);
-  THEM->Statistics[7] += Tree_Nbr(THESURFACE->Simplexes);
+  THEM->Statistics[7] += Tree_Nbr(THESURFACE->Simplexes); // tri+qua
+  THEM->Statistics[8] += nbqua;
 
 }
diff --git a/Mesh/2D_Recombine.cpp b/Mesh/2D_Recombine.cpp
index 11dba3ae28d8aa5af0c8dfffbda194bc6f479653..453c67e501b2df86c30ba2e2f0779f7a0ff50e5e 100644
--- a/Mesh/2D_Recombine.cpp
+++ b/Mesh/2D_Recombine.cpp
@@ -1,4 +1,4 @@
-// $Id: 2D_Recombine.cpp,v 1.5 2001-01-12 13:29:00 geuzaine Exp $
+// $Id: 2D_Recombine.cpp,v 1.6 2001-06-03 11:19:52 geuzaine Exp $
 
 #include "Gmsh.h"
 #include "Const.h"
@@ -6,8 +6,9 @@
 #include "2D_Mesh.h"
 #include "Create.h"
 #include "Numeric.h"
+#include "Context.h"
 
-extern Mesh     *THEM; 
+extern Context_T CTX;
 
 Tree_T    *RecEdges,*Triangles;
 Tree_T    *RecSimplex,*TREEELM;
@@ -66,7 +67,7 @@ void Recombine_Farce (void *a, void *b){
   }
 }
 
-void Recombine (Tree_T *TreeAllVert, Tree_T *TreeAllElg, double a){
+int Recombine (Tree_T *TreeAllVert, Tree_T *TreeAllElg, double a){
   Tree_T *TreeEdges,*tnxe;
   int ntot;
 
@@ -91,12 +92,14 @@ void Recombine (Tree_T *TreeAllVert, Tree_T *TreeAllElg, double a){
     Tree_Action(RecEdges,Recombine_Farce);
 
     /* Lissage */
-    tnxe = Tree_Create(sizeof(NXE),compareNXE);
-    create_NXE(TreeAllVert,TreeAllElg,tnxe);
-    Tree_Action(tnxe,ActionLissSurf);
-    Tree_Action(tnxe,ActionLissSurf);
-    Tree_Action(tnxe,ActionLissSurf);
-    Tree_Delete(tnxe);
+    if(CTX.mesh.nb_smoothing){
+      Msg(STATUS3, "Mesh smoothing");
+      tnxe = Tree_Create(sizeof(NXE),compareNXE);
+      create_NXE(TreeAllVert,TreeAllElg,tnxe);
+      for (int i = 0; i < CTX.mesh.nb_smoothing; i++)
+	Tree_Action(tnxe,ActionLissSurf);
+      Tree_Delete(tnxe);
+    }
 
     /* Destruction */
     Tree_Delete(TreeEdges);
@@ -111,8 +114,7 @@ void Recombine (Tree_T *TreeAllVert, Tree_T *TreeAllElg, double a){
 
   Msg(STATUS2, "Recombined %d Quadrangles",ntot); 
 
-  THEM->Statistics[7] -= ntot/2; 
-  THEM->Statistics[8] += ntot; 
+  return ntot ;
   
 }
 
diff --git a/Mesh/2D_SMesh.cpp b/Mesh/2D_SMesh.cpp
index d2656585619317b681aa9bdce0dc4160f40f348f..a5360db3b6425d12374c3c58d7e7c1483fef3dd1 100644
--- a/Mesh/2D_SMesh.cpp
+++ b/Mesh/2D_SMesh.cpp
@@ -1,4 +1,4 @@
-// $Id: 2D_SMesh.cpp,v 1.6 2001-06-02 16:24:51 geuzaine Exp $
+// $Id: 2D_SMesh.cpp,v 1.7 2001-06-03 11:21:02 geuzaine Exp $
 
 /*  
   Maillage transfini surfacique                                                 
@@ -277,7 +277,7 @@ int MeshTransfiniteSurface (Surface *sur) {
     return(0);
   }  
 
-  free(list);
+  Free(list);
 
   // We count this here, to be able to distinguish very quickly
   // between triangles and quadrangles later
diff --git a/Mesh/Mesh.h b/Mesh/Mesh.h
index 440b6d259ee0f8dd2ccd0d4a43a829cd891bdfee..5e2d0245699f129b3ed1bac155d6f494b848886e 100644
--- a/Mesh/Mesh.h
+++ b/Mesh/Mesh.h
@@ -59,7 +59,6 @@ typedef struct _CONTOUR ContourRecord, *ContourPeek;
 typedef struct _DOC DocRecord, *DocPeek;
 typedef struct _CDLIST DListRecord, *DListPeek;
 typedef struct _MAILLAGE maillage, *maipeek;
-typedef struct _MAICON maillage_c;
 typedef struct _DELAUNAY Delaunay, *delpeek;
 typedef int PointNumero;
 class STL_Data;
@@ -144,11 +143,6 @@ struct _CONTOUR{
   int numpoints, numerocontour, numerozon, info;
 };
 
-struct _MAICON{
-  PointRecord *points;
-  int numpoints, numcontour, numeroseg;
-};
-
 struct _MAILLAGE{
   PointRecord *points;
   delpeek *listdel;
@@ -444,7 +438,7 @@ void Degre2 (Tree_T * AllNodes, Tree_T * TreeNodes, Tree_T * TreeElm,
              Curve * c, Surface * s);
 void ActionLiss (void *data, void *dummy);
 void ActionLissSurf (void *data, void *dummy);
-void Recombine (Tree_T *TreeAllVert, Tree_T *TreeAllElg, double a);
+int  Recombine (Tree_T *TreeAllVert, Tree_T *TreeAllElg, double a);
 void ApplyLcFactor(Mesh *M);
 
 void Gamma_Maillage (Mesh * m, double *gamma, double *gammamax, double *gammamin);
diff --git a/Parser/Gmsh.tab.cpp b/Parser/Gmsh.tab.cpp
index ca228879e531f8b5366e63ac3bdd35fc215cf3b6..b664d465a750a60b63875c6f205e59ababe69853 100644
--- a/Parser/Gmsh.tab.cpp
+++ b/Parser/Gmsh.tab.cpp
@@ -169,7 +169,7 @@
 #line 1 "Gmsh.y"
  
 
-// $Id: Gmsh.tab.cpp,v 1.88 2001-06-02 19:44:35 remacle Exp $
+// $Id: Gmsh.tab.cpp,v 1.89 2001-06-03 11:25:09 geuzaine Exp $
 
   //
   // Generaliser sprintf avec des chaines de caracteres
@@ -592,18 +592,18 @@ static const short yyrline[] = { 0,
   1385,  1396,  1414,  1422,  1427,  1438,  1506,  1526,  1530,  1550,
   1566,  1580,  1605,  1630,  1656,  1662,  1667,  1672,  1676,  1686,
   1692,  1698,  1702,  1706,  1710,  1714,  1719,  1726,  1730,  1735,
-  1756,  1766,  1785,  1803,  1821,  1843,  1864,  1885,  1903,  1928,
-  1933,  1944,  1946,  1947,  1948,  1949,  1952,  1954,  1955,  1956,
-  1957,  1958,  1959,  1960,  1961,  1968,  1969,  1970,  1971,  1972,
-  1973,  1974,  1975,  1976,  1977,  1978,  1979,  1980,  1981,  1982,
-  1983,  1984,  1985,  1986,  1987,  1988,  1989,  1990,  1991,  1992,
-  1993,  1994,  1995,  1996,  1997,  1998,  1999,  2004,  2009,  2013,
-  2024,  2041,  2052,  2071,  2087,  2103,  2119,  2136,  2143,  2156,
-  2161,  2165,  2169,  2173,  2178,  2183,  2187,  2191,  2197,  2201,
-  2206,  2210,  2215,  2219,  2223,  2229,  2235,  2242,  2247,  2251,
-  2261,  2267,  2271,  2285,  2301,  2321,  2345,  2350,  2354,  2361,
-  2372,  2385,  2402,  2424,  2429,  2433,  2438,  2443,  2461,  2466,
-  2479,  2485,  2491,  2496,  2500
+  1756,  1766,  1785,  1803,  1821,  1843,  1864,  1885,  1899,  1920,
+  1925,  1936,  1938,  1939,  1940,  1941,  1944,  1946,  1947,  1948,
+  1949,  1950,  1951,  1952,  1953,  1960,  1961,  1962,  1963,  1964,
+  1965,  1966,  1967,  1968,  1969,  1970,  1971,  1972,  1973,  1974,
+  1975,  1976,  1977,  1978,  1979,  1980,  1981,  1982,  1983,  1984,
+  1985,  1986,  1987,  1988,  1989,  1990,  1991,  1996,  2001,  2005,
+  2016,  2033,  2044,  2063,  2079,  2095,  2111,  2128,  2135,  2148,
+  2153,  2157,  2161,  2165,  2170,  2175,  2179,  2183,  2189,  2193,
+  2198,  2202,  2207,  2211,  2215,  2221,  2227,  2234,  2239,  2243,
+  2253,  2259,  2263,  2277,  2293,  2313,  2337,  2342,  2346,  2353,
+  2364,  2377,  2394,  2416,  2421,  2425,  2430,  2435,  2453,  2458,
+  2471,  2477,  2483,  2488,  2492
 };
 #endif
 
@@ -4841,31 +4841,23 @@ case 228:
 	List_Read(yyvsp[-3].l,i,&d);
 	j = (int)d;
 	s = FindSurface(j,THEM);
-	if(!s){
-	  /* Allow generic lists, even if the surfaces don't exist
-	     vyyerror("Unkown Surface %d", j); */
-	}
-	else{
+	if(s){
 	  s->Recombine = 1;
-	  s->RecombineAngle = yyvsp[-1].d;
+	  s->RecombineAngle = (yyvsp[-1].d > 0 && yyvsp[-1].d < 90) ? yyvsp[-1].d : 90;
 	}
       }
       List_Delete(yyvsp[-3].l);
     ;
     break;}
 case 229:
-#line 1904 "Gmsh.y"
+#line 1900 "Gmsh.y"
 {
       Surface *s;
       for(i=0;i<List_Nbr(yyvsp[-1].l);i++){
 	List_Read(yyvsp[-1].l,i,&d);
 	j = (int)d;
         s = FindSurface(j,THEM);
-	if(!s){
-	  /* Allow generic lists, even if the surfaces don't exist
-	     vyyerror("Unkown Surface %d", j); */
-	}
-	else{
+	if(s){
 	  s->Recombine = 1;
 	  s->RecombineAngle = 30.;
         }
@@ -4874,71 +4866,71 @@ case 229:
     ;
     break;}
 case 230:
-#line 1930 "Gmsh.y"
+#line 1922 "Gmsh.y"
 { 
       Coherence_PS();
     ;
     break;}
 case 231:
-#line 1934 "Gmsh.y"
+#line 1926 "Gmsh.y"
 { 
       IntersectAllSegmentsTogether();
     ;
     break;}
 case 232:
-#line 1945 "Gmsh.y"
+#line 1937 "Gmsh.y"
 {yyval.i = 1;;
     break;}
 case 233:
-#line 1946 "Gmsh.y"
+#line 1938 "Gmsh.y"
 {yyval.i = 0;;
     break;}
 case 234:
-#line 1947 "Gmsh.y"
+#line 1939 "Gmsh.y"
 {yyval.i = -1;;
     break;}
 case 235:
-#line 1948 "Gmsh.y"
+#line 1940 "Gmsh.y"
 {yyval.i = -1;;
     break;}
 case 236:
-#line 1949 "Gmsh.y"
+#line 1941 "Gmsh.y"
 {yyval.i = -1;;
     break;}
 case 237:
-#line 1953 "Gmsh.y"
+#line 1945 "Gmsh.y"
 { yyval.d = yyvsp[0].d;           ;
     break;}
 case 238:
-#line 1954 "Gmsh.y"
+#line 1946 "Gmsh.y"
 { yyval.d = yyvsp[-1].d ;          ;
     break;}
 case 239:
-#line 1955 "Gmsh.y"
+#line 1947 "Gmsh.y"
 { yyval.d = -yyvsp[0].d ;         ;
     break;}
 case 240:
-#line 1956 "Gmsh.y"
+#line 1948 "Gmsh.y"
 { yyval.d = yyvsp[0].d;           ;
     break;}
 case 241:
-#line 1957 "Gmsh.y"
+#line 1949 "Gmsh.y"
 { yyval.d = !yyvsp[0].d ;         ;
     break;}
 case 242:
-#line 1958 "Gmsh.y"
+#line 1950 "Gmsh.y"
 { yyval.d = yyvsp[-2].d - yyvsp[0].d ;     ;
     break;}
 case 243:
-#line 1959 "Gmsh.y"
+#line 1951 "Gmsh.y"
 { yyval.d = yyvsp[-2].d + yyvsp[0].d ;     ;
     break;}
 case 244:
-#line 1960 "Gmsh.y"
+#line 1952 "Gmsh.y"
 { yyval.d = yyvsp[-2].d * yyvsp[0].d ;     ;
     break;}
 case 245:
-#line 1962 "Gmsh.y"
+#line 1954 "Gmsh.y"
 { 
       if(!yyvsp[0].d)
 	vyyerror("Division by zero in '%g / %g'", yyvsp[-2].d, yyvsp[0].d);
@@ -4947,143 +4939,143 @@ case 245:
     ;
     break;}
 case 246:
-#line 1968 "Gmsh.y"
+#line 1960 "Gmsh.y"
 { yyval.d = (int)yyvsp[-2].d % (int)yyvsp[0].d ;  ;
     break;}
 case 247:
-#line 1969 "Gmsh.y"
+#line 1961 "Gmsh.y"
 { yyval.d = pow(yyvsp[-2].d,yyvsp[0].d) ;  ;
     break;}
 case 248:
-#line 1970 "Gmsh.y"
+#line 1962 "Gmsh.y"
 { yyval.d = yyvsp[-2].d < yyvsp[0].d ;     ;
     break;}
 case 249:
-#line 1971 "Gmsh.y"
+#line 1963 "Gmsh.y"
 { yyval.d = yyvsp[-2].d > yyvsp[0].d ;     ;
     break;}
 case 250:
-#line 1972 "Gmsh.y"
+#line 1964 "Gmsh.y"
 { yyval.d = yyvsp[-2].d <= yyvsp[0].d ;    ;
     break;}
 case 251:
-#line 1973 "Gmsh.y"
+#line 1965 "Gmsh.y"
 { yyval.d = yyvsp[-2].d >= yyvsp[0].d ;    ;
     break;}
 case 252:
-#line 1974 "Gmsh.y"
+#line 1966 "Gmsh.y"
 { yyval.d = yyvsp[-2].d == yyvsp[0].d ;    ;
     break;}
 case 253:
-#line 1975 "Gmsh.y"
+#line 1967 "Gmsh.y"
 { yyval.d = yyvsp[-2].d != yyvsp[0].d ;    ;
     break;}
 case 254:
-#line 1976 "Gmsh.y"
+#line 1968 "Gmsh.y"
 { yyval.d = yyvsp[-2].d && yyvsp[0].d ;    ;
     break;}
 case 255:
-#line 1977 "Gmsh.y"
+#line 1969 "Gmsh.y"
 { yyval.d = yyvsp[-2].d || yyvsp[0].d ;    ;
     break;}
 case 256:
-#line 1978 "Gmsh.y"
+#line 1970 "Gmsh.y"
 { yyval.d = yyvsp[-4].d? yyvsp[-2].d : yyvsp[0].d ; ;
     break;}
 case 257:
-#line 1979 "Gmsh.y"
+#line 1971 "Gmsh.y"
 { yyval.d = exp(yyvsp[-1].d);      ;
     break;}
 case 258:
-#line 1980 "Gmsh.y"
+#line 1972 "Gmsh.y"
 { yyval.d = log(yyvsp[-1].d);      ;
     break;}
 case 259:
-#line 1981 "Gmsh.y"
+#line 1973 "Gmsh.y"
 { yyval.d = log10(yyvsp[-1].d);    ;
     break;}
 case 260:
-#line 1982 "Gmsh.y"
+#line 1974 "Gmsh.y"
 { yyval.d = sqrt(yyvsp[-1].d);     ;
     break;}
 case 261:
-#line 1983 "Gmsh.y"
+#line 1975 "Gmsh.y"
 { yyval.d = sin(yyvsp[-1].d);      ;
     break;}
 case 262:
-#line 1984 "Gmsh.y"
+#line 1976 "Gmsh.y"
 { yyval.d = asin(yyvsp[-1].d);     ;
     break;}
 case 263:
-#line 1985 "Gmsh.y"
+#line 1977 "Gmsh.y"
 { yyval.d = cos(yyvsp[-1].d);      ;
     break;}
 case 264:
-#line 1986 "Gmsh.y"
+#line 1978 "Gmsh.y"
 { yyval.d = acos(yyvsp[-1].d);     ;
     break;}
 case 265:
-#line 1987 "Gmsh.y"
+#line 1979 "Gmsh.y"
 { yyval.d = tan(yyvsp[-1].d);      ;
     break;}
 case 266:
-#line 1988 "Gmsh.y"
+#line 1980 "Gmsh.y"
 { yyval.d = atan(yyvsp[-1].d);     ;
     break;}
 case 267:
-#line 1989 "Gmsh.y"
+#line 1981 "Gmsh.y"
 { yyval.d = atan2(yyvsp[-3].d,yyvsp[-1].d); ;
     break;}
 case 268:
-#line 1990 "Gmsh.y"
+#line 1982 "Gmsh.y"
 { yyval.d = sinh(yyvsp[-1].d);     ;
     break;}
 case 269:
-#line 1991 "Gmsh.y"
+#line 1983 "Gmsh.y"
 { yyval.d = cosh(yyvsp[-1].d);     ;
     break;}
 case 270:
-#line 1992 "Gmsh.y"
+#line 1984 "Gmsh.y"
 { yyval.d = tanh(yyvsp[-1].d);     ;
     break;}
 case 271:
-#line 1993 "Gmsh.y"
+#line 1985 "Gmsh.y"
 { yyval.d = fabs(yyvsp[-1].d);     ;
     break;}
 case 272:
-#line 1994 "Gmsh.y"
+#line 1986 "Gmsh.y"
 { yyval.d = floor(yyvsp[-1].d);    ;
     break;}
 case 273:
-#line 1995 "Gmsh.y"
+#line 1987 "Gmsh.y"
 { yyval.d = ceil(yyvsp[-1].d);     ;
     break;}
 case 274:
-#line 1996 "Gmsh.y"
+#line 1988 "Gmsh.y"
 { yyval.d = fmod(yyvsp[-3].d,yyvsp[-1].d);  ;
     break;}
 case 275:
-#line 1997 "Gmsh.y"
+#line 1989 "Gmsh.y"
 { yyval.d = fmod(yyvsp[-3].d,yyvsp[-1].d);  ;
     break;}
 case 276:
-#line 1998 "Gmsh.y"
+#line 1990 "Gmsh.y"
 { yyval.d = sqrt(yyvsp[-3].d*yyvsp[-3].d+yyvsp[-1].d*yyvsp[-1].d); ;
     break;}
 case 277:
-#line 1999 "Gmsh.y"
+#line 1991 "Gmsh.y"
 { yyval.d = yyvsp[-1].d*(double)rand()/(double)RAND_MAX; ;
     break;}
 case 278:
-#line 2008 "Gmsh.y"
+#line 2000 "Gmsh.y"
 { yyval.d = yyvsp[0].d; ;
     break;}
 case 279:
-#line 2009 "Gmsh.y"
+#line 2001 "Gmsh.y"
 { yyval.d = 3.141592653589793; ;
     break;}
 case 280:
-#line 2014 "Gmsh.y"
+#line 2006 "Gmsh.y"
 {
       TheSymbol.Name = yyvsp[0].c ;
       if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols))) {
@@ -5095,7 +5087,7 @@ case 280:
     ;
     break;}
 case 281:
-#line 2025 "Gmsh.y"
+#line 2017 "Gmsh.y"
 {
       TheSymbol.Name = yyvsp[-3].c ;
       if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols))) {
@@ -5113,7 +5105,7 @@ case 281:
     ;
     break;}
 case 282:
-#line 2042 "Gmsh.y"
+#line 2034 "Gmsh.y"
 {
       TheSymbol.Name = yyvsp[-1].c ;
       if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols))) {
@@ -5125,7 +5117,7 @@ case 282:
     ;
     break;}
 case 283:
-#line 2053 "Gmsh.y"
+#line 2045 "Gmsh.y"
 {
       TheSymbol.Name = yyvsp[-4].c ;
       if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols))) {
@@ -5143,7 +5135,7 @@ case 283:
     ;
     break;}
 case 284:
-#line 2072 "Gmsh.y"
+#line 2064 "Gmsh.y"
 {
       if(!(pNumCat = Get_NumberOptionCategory(yyvsp[-2].c))){
 	vyyerror("Unknown numeric option class '%s'", yyvsp[-2].c);
@@ -5160,7 +5152,7 @@ case 284:
     ;
     break;}
 case 285:
-#line 2088 "Gmsh.y"
+#line 2080 "Gmsh.y"
 {
       if(!(pNumCat = Get_NumberOptionCategory(yyvsp[-5].c))){
 	vyyerror("Unknown numeric option class '%s'", yyvsp[-5].c);
@@ -5177,7 +5169,7 @@ case 285:
     ;
     break;}
 case 286:
-#line 2104 "Gmsh.y"
+#line 2096 "Gmsh.y"
 {
       if(!(pNumCat = Get_NumberOptionCategory(yyvsp[-3].c))){
 	vyyerror("Unknown numeric option class '%s'", yyvsp[-3].c);
@@ -5194,7 +5186,7 @@ case 286:
     ;
     break;}
 case 287:
-#line 2120 "Gmsh.y"
+#line 2112 "Gmsh.y"
 {
       if(!(pNumCat = Get_NumberOptionCategory(yyvsp[-6].c))){
 	vyyerror("Unknown numeric option class '%s'", yyvsp[-6].c);
@@ -5211,7 +5203,7 @@ case 287:
     ;
     break;}
 case 288:
-#line 2138 "Gmsh.y"
+#line 2130 "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.)) 
@@ -5219,7 +5211,7 @@ case 288:
     ;
     break;}
 case 289:
-#line 2144 "Gmsh.y"
+#line 2136 "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)){
@@ -5232,123 +5224,123 @@ case 289:
    ;
     break;}
 case 290:
-#line 2158 "Gmsh.y"
+#line 2150 "Gmsh.y"
 {
       memcpy(yyval.v, yyvsp[0].v, 5*sizeof(double)) ;
     ;
     break;}
 case 291:
-#line 2162 "Gmsh.y"
+#line 2154 "Gmsh.y"
 {
       for(i=0 ; i<5 ; i++) yyval.v[i] = -yyvsp[0].v[i] ;
     ;
     break;}
 case 292:
-#line 2166 "Gmsh.y"
+#line 2158 "Gmsh.y"
 { 
       for(i=0 ; i<5 ; i++) yyval.v[i] = yyvsp[0].v[i];
     ;
     break;}
 case 293:
-#line 2170 "Gmsh.y"
+#line 2162 "Gmsh.y"
 { 
       for(i=0 ; i<5 ; i++) yyval.v[i] = yyvsp[-2].v[i] - yyvsp[0].v[i] ;
     ;
     break;}
 case 294:
-#line 2174 "Gmsh.y"
+#line 2166 "Gmsh.y"
 {
       for(i=0 ; i<5 ; i++) yyval.v[i] = yyvsp[-2].v[i] + yyvsp[0].v[i] ;
     ;
     break;}
 case 295:
-#line 2180 "Gmsh.y"
+#line 2172 "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 296:
-#line 2184 "Gmsh.y"
+#line 2176 "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 297:
-#line 2188 "Gmsh.y"
+#line 2180 "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 298:
-#line 2192 "Gmsh.y"
+#line 2184 "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 299:
-#line 2199 "Gmsh.y"
+#line 2191 "Gmsh.y"
 {
     ;
     break;}
 case 300:
-#line 2202 "Gmsh.y"
+#line 2194 "Gmsh.y"
 {
     ;
     break;}
 case 301:
-#line 2208 "Gmsh.y"
+#line 2200 "Gmsh.y"
 {
     ;
     break;}
 case 302:
-#line 2211 "Gmsh.y"
+#line 2203 "Gmsh.y"
 {
     ;
     break;}
 case 303:
-#line 2217 "Gmsh.y"
+#line 2209 "Gmsh.y"
 {
     ;
     break;}
 case 304:
-#line 2220 "Gmsh.y"
+#line 2212 "Gmsh.y"
 {
        yyval.l=yyvsp[-1].l;
     ;
     break;}
 case 305:
-#line 2224 "Gmsh.y"
+#line 2216 "Gmsh.y"
 {
        yyval.l=yyvsp[-1].l;
     ;
     break;}
 case 306:
-#line 2231 "Gmsh.y"
+#line 2223 "Gmsh.y"
 {
       yyval.l = List_Create(2,1,sizeof(List_T*)) ;
       List_Add(yyval.l, &(yyvsp[0].l)) ;
     ;
     break;}
 case 307:
-#line 2236 "Gmsh.y"
+#line 2228 "Gmsh.y"
 {
       List_Add(yyval.l, &(yyvsp[0].l)) ;
     ;
     break;}
 case 308:
-#line 2244 "Gmsh.y"
+#line 2236 "Gmsh.y"
 {
       yyval.l = yyvsp[0].l ;
     ;
     break;}
 case 309:
-#line 2248 "Gmsh.y"
+#line 2240 "Gmsh.y"
 {
       yyval.l=yyvsp[-1].l;
     ;
     break;}
 case 310:
-#line 2252 "Gmsh.y"
+#line 2244 "Gmsh.y"
 {
       yyval.l=yyvsp[-1].l;
       for(i=0 ; i<List_Nbr(yyval.l) ; i++){
@@ -5358,20 +5350,20 @@ case 310:
     ;
     break;}
 case 311:
-#line 2263 "Gmsh.y"
+#line 2255 "Gmsh.y"
 {
       yyval.l = List_Create(2,1,sizeof(double)) ;
       List_Add(yyval.l, &(yyvsp[0].d)) ;
     ;
     break;}
 case 312:
-#line 2268 "Gmsh.y"
+#line 2260 "Gmsh.y"
 { 
       yyval.l = yyvsp[0].l;
     ;
     break;}
 case 313:
-#line 2272 "Gmsh.y"
+#line 2264 "Gmsh.y"
 {
       yyval.l = List_Create(2,1,sizeof(double)) ;
       TheSymbol.Name = yyvsp[-2].c ;
@@ -5387,7 +5379,7 @@ case 313:
     ;
     break;}
 case 314:
-#line 2286 "Gmsh.y"
+#line 2278 "Gmsh.y"
 {
       yyval.l = List_Create(2,1,sizeof(double)) ;
       TheSymbol.Name = yyvsp[-2].c ;
@@ -5405,7 +5397,7 @@ case 314:
     ;
     break;}
 case 315:
-#line 2302 "Gmsh.y"
+#line 2294 "Gmsh.y"
 {
       yyval.l = List_Create(2,1,sizeof(double)) ;
       TheSymbol.Name = yyvsp[-5].c ;
@@ -5427,7 +5419,7 @@ case 315:
     ;
     break;}
 case 316:
-#line 2322 "Gmsh.y"
+#line 2314 "Gmsh.y"
 {
       yyval.l = List_Create(2,1,sizeof(double)) ;
       TheSymbol.Name = yyvsp[-5].c ;
@@ -5451,19 +5443,19 @@ case 316:
     ;
     break;}
 case 317:
-#line 2347 "Gmsh.y"
+#line 2339 "Gmsh.y"
 {
       yyval.l = yyvsp[0].l ;
     ;
     break;}
 case 318:
-#line 2351 "Gmsh.y"
+#line 2343 "Gmsh.y"
 {
       List_Add(yyval.l, &(yyvsp[0].d)) ;
     ;
     break;}
 case 319:
-#line 2355 "Gmsh.y"
+#line 2347 "Gmsh.y"
 {
       for(i=0 ; i<List_Nbr(yyvsp[0].l) ; i++){
 	List_Read(yyvsp[0].l, i, &d) ;
@@ -5472,7 +5464,7 @@ case 319:
     ;
     break;}
 case 320:
-#line 2362 "Gmsh.y"
+#line 2354 "Gmsh.y"
 {
       TheSymbol.Name = yyvsp[-2].c ;
       if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols))) {
@@ -5485,7 +5477,7 @@ case 320:
     ;
     break;}
 case 321:
-#line 2373 "Gmsh.y"
+#line 2365 "Gmsh.y"
 {
       TheSymbol.Name = yyvsp[-2].c ;
       if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols))) {
@@ -5500,7 +5492,7 @@ case 321:
     ;
     break;}
 case 322:
-#line 2386 "Gmsh.y"
+#line 2378 "Gmsh.y"
 {
       TheSymbol.Name = yyvsp[-5].c ;
       if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols))) {
@@ -5519,7 +5511,7 @@ case 322:
     ;
     break;}
 case 323:
-#line 2403 "Gmsh.y"
+#line 2395 "Gmsh.y"
 {
       TheSymbol.Name = yyvsp[-5].c ;
       if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols))) {
@@ -5540,33 +5532,33 @@ case 323:
     ;
     break;}
 case 324:
-#line 2426 "Gmsh.y"
+#line 2418 "Gmsh.y"
 {
       yyval.u = PACK_COLOR((int)yyvsp[-7].d, (int)yyvsp[-5].d, (int)yyvsp[-3].d, (int)yyvsp[-1].d);
     ;
     break;}
 case 325:
-#line 2430 "Gmsh.y"
+#line 2422 "Gmsh.y"
 {
       yyval.u = PACK_COLOR((int)yyvsp[-5].d, (int)yyvsp[-3].d, (int)yyvsp[-1].d, 255);
     ;
     break;}
 case 326:
-#line 2434 "Gmsh.y"
+#line 2426 "Gmsh.y"
 {
       yyval.u = Get_ColorForString(ColorString, (int)yyvsp[-1].d, yyvsp[-3].c, &flag);
       if(flag) vyyerror("Unknown color '%s'", yyvsp[-3].c);
     ;
     break;}
 case 327:
-#line 2439 "Gmsh.y"
+#line 2431 "Gmsh.y"
 {
       yyval.u = Get_ColorForString(ColorString, -1, yyvsp[0].c, &flag);
       if(flag) vyyerror("Unknown color '%s'", yyvsp[0].c);
     ;
     break;}
 case 328:
-#line 2444 "Gmsh.y"
+#line 2436 "Gmsh.y"
 {
       if(!(pColCat = Get_ColorOptionCategory(yyvsp[-4].c))){
 	vyyerror("Unknown color option class '%s'", yyvsp[-4].c);
@@ -5584,13 +5576,13 @@ case 328:
     ;
     break;}
 case 329:
-#line 2463 "Gmsh.y"
+#line 2455 "Gmsh.y"
 {
       yyval.l = yyvsp[-1].l;
     ;
     break;}
 case 330:
-#line 2467 "Gmsh.y"
+#line 2459 "Gmsh.y"
 {
       yyval.l = List_Create(256,10,sizeof(unsigned int)) ;
       ColorTable *ct = Get_ColorTable((int)yyvsp[-3].d);
@@ -5603,32 +5595,32 @@ case 330:
     ;
     break;}
 case 331:
-#line 2481 "Gmsh.y"
+#line 2473 "Gmsh.y"
 {
       yyval.l = List_Create(256,10,sizeof(unsigned int)) ;
       List_Add(yyval.l, &(yyvsp[0].u)) ;
     ;
     break;}
 case 332:
-#line 2486 "Gmsh.y"
+#line 2478 "Gmsh.y"
 {
       List_Add(yyval.l, &(yyvsp[0].u)) ;
     ;
     break;}
 case 333:
-#line 2493 "Gmsh.y"
+#line 2485 "Gmsh.y"
 {
       yyval.c = yyvsp[0].c;
     ;
     break;}
 case 334:
-#line 2497 "Gmsh.y"
+#line 2489 "Gmsh.y"
 {
       yyval.c = yyvsp[-1].c;
     ;
     break;}
 case 335:
-#line 2501 "Gmsh.y"
+#line 2493 "Gmsh.y"
 {
       for(i = 0 ; i<List_Nbr(yyvsp[-1].l) ; i++){
 	if(!i){
@@ -5875,7 +5867,7 @@ yyerrhandle:
     }
   return 1;
 }
-#line 2526 "Gmsh.y"
+#line 2518 "Gmsh.y"
 
 
 void InitSymbols(void){
diff --git a/Parser/Gmsh.y b/Parser/Gmsh.y
index 1fb593129aa2a466e72e05fab06e9d7b08c1af54..395a2df2dc2c288c90366c4a6c6f099375de72d0 100644
--- a/Parser/Gmsh.y
+++ b/Parser/Gmsh.y
@@ -1,6 +1,6 @@
 %{ 
 
-// $Id: Gmsh.y,v 1.77 2001-05-16 15:11:45 geuzaine Exp $
+// $Id: Gmsh.y,v 1.78 2001-06-03 11:21:36 geuzaine Exp $
 
   //
   // Generaliser sprintf avec des chaines de caracteres
@@ -1889,13 +1889,9 @@ Transfini :
 	List_Read($3,i,&d);
 	j = (int)d;
 	s = FindSurface(j,THEM);
-	if(!s){
-	  /* Allow generic lists, even if the surfaces don't exist
-	     vyyerror("Unkown Surface %d", j); */
-	}
-	else{
+	if(s){
 	  s->Recombine = 1;
-	  s->RecombineAngle = $5;
+	  s->RecombineAngle = ($5 > 0 && $5 < 90) ? $5 : 90;
 	}
       }
       List_Delete($3);
@@ -1907,11 +1903,7 @@ Transfini :
 	List_Read($3,i,&d);
 	j = (int)d;
         s = FindSurface(j,THEM);
-	if(!s){
-	  /* Allow generic lists, even if the surfaces don't exist
-	     vyyerror("Unkown Surface %d", j); */
-	}
-	else{
+	if(s){
 	  s->Recombine = 1;
 	  s->RecombineAngle = 30.;
         }
diff --git a/Parser/Gmsh.yy.cpp b/Parser/Gmsh.yy.cpp
index 0b36900a0dd3a3bf8fd4c8f49d4acd11993d254a..93f5746826cf2e55b7cc4123f6d38712689a09da 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.88 2001-06-02 19:44:35 remacle Exp $
+ * $Header: /cvsroot/gmsh/Parser/Gmsh.yy.cpp,v 1.89 2001-06-03 11:25:09 geuzaine Exp $
  */
 
 #define FLEX_SCANNER
@@ -10,6 +10,7 @@
 #define YY_FLEX_MINOR_VERSION 5
 
 #include <stdio.h>
+#include <unistd.h>
 
 
 /* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */
@@ -23,7 +24,6 @@
 #ifdef __cplusplus
 
 #include <stdlib.h>
-#include <unistd.h>
 
 /* Use prototypes in function declarations. */
 #define YY_USE_PROTOS
@@ -978,7 +978,7 @@ char *yytext;
 #define INITIAL 0
 #line 2 "Gmsh.l"
 
-// $Id: Gmsh.yy.cpp,v 1.88 2001-06-02 19:44:35 remacle Exp $
+// $Id: Gmsh.yy.cpp,v 1.89 2001-06-03 11:25:09 geuzaine Exp $
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -2713,11 +2713,6 @@ YY_BUFFER_STATE b;
 	}
 
 
-#ifndef YY_ALWAYS_INTERACTIVE
-#ifndef YY_NEVER_INTERACTIVE
-extern int isatty YY_PROTO(( int ));
-#endif
-#endif
 
 #ifdef YY_USE_PROTOS
 void yy_init_buffer( YY_BUFFER_STATE b, FILE *file )
diff --git a/doc/gmsh.1 b/doc/gmsh.1
index f9cf3d9a17ac7a8e8bb9eab3898423830eb410f6..1b71df27634794a5d821d46e3bdab806684d7c86 100644
--- a/doc/gmsh.1
+++ b/doc/gmsh.1
@@ -212,10 +212,8 @@ Christophe Geuzaine (Christope.Geuzaine@ulg.ac.be) and Jean-Francois
 Remacle (Remacle@scorec.rpi.edu). 
 .\" ======================================================================
 .SH SEE ALSO
-Gmsh homepage at \fIhttp://www.geuz.org/gmsh/\fR
-.PP
-Gmsh example files in \fI/usr/doc/gmsh-1.20/\fR
-.PP
-GetDP (a scientific computation software for the numerical solution of
-integro-differential equations, using finite element and integral type
-methods) at \fIhttp://www.geuz.org/getdp/\fR
+.BR getdp (1),
+.br
+Gmsh examples (\fI/usr/doc/gmsh-1.20/\fR),
+.br
+Gmsh homepage (\fIhttp://www.geuz.org/gmsh/\fR).
diff --git a/tutorial/t7.geo b/tutorial/t7.geo
index 671359e84f2cdb1be409ce785cac0dacc99a9e78..fba2dadcd7e5c0499f10577274682895b02e3ee6 100644
--- a/tutorial/t7.geo
+++ b/tutorial/t7.geo
@@ -37,6 +37,6 @@ Line(5) = {11,22};
 
 // Anisotropic attractors can be defined on points and lines:
 
-//Attractor Line{5} = {.1, 0.01, 17};
+Attractor Line{5} = {.1, 0.01, 17};
 
 Attractor Line{1,2} = {0.1, 0.005, 3};