diff --git a/Geo/Geo.cpp b/Geo/Geo.cpp
index dfcff7b6dc843c311e0b611016888bcdb96211b5..2c4c974190ac89f1b16ba3ac1c3c24e20c193cf9 100644
--- a/Geo/Geo.cpp
+++ b/Geo/Geo.cpp
@@ -1,4 +1,4 @@
-// $Id: Geo.cpp,v 1.33 2003-05-22 19:25:58 geuzaine Exp $
+// $Id: Geo.cpp,v 1.34 2003-05-22 21:41:12 geuzaine Exp $
 //
 // Copyright (C) 1997-2003 C. Geuzaine, J.-F. Remacle
 //
@@ -58,7 +58,6 @@ double evaluate_scalarfunction(char *var, double val, char *funct)
   }
 
   // pose "variable = function" and evaluate function
-
   fprintf(yyin, "%s = %.16g ;\n", var, val);
   fprintf(yyin, "ValeurTemporaire__ = %s ;\n", funct);
   fclose(yyin);
@@ -67,16 +66,18 @@ double evaluate_scalarfunction(char *var, double val, char *funct)
     yyparse();
   }
   fclose(yyin);
-  Symbol TheSymbol;
-  TheSymbol.Name = (char *)malloc(100);
-  strcpy(TheSymbol.Name, "ValeurTemporaire__");
   yyin = tempf;
-  if(!List_Query(Symbol_L, &TheSymbol, CompareSymbols)) {
-    free(TheSymbol.Name);
+
+  // retreive value
+  Symbol TheSymbol, *TheSymbol_P;
+  TheSymbol.Name = (char *)Malloc(100*sizeof(char));
+  strcpy(TheSymbol.Name, "ValeurTemporaire__");
+  if(!(TheSymbol_P = (Symbol*)Tree_PQuery(Symbol_T, &TheSymbol))) {
+    Free(TheSymbol.Name);
     return 0.0;
   }
-  free(TheSymbol.Name);
-  return *(double *)List_Pointer_Fast(TheSymbol.val, 0);
+  Free(TheSymbol.Name);
+  return *(double *)List_Pointer(TheSymbol_P->val, 0);
 }
 
 void add_infile(char *text, char *fich)
diff --git a/Graphics/Visibility.cpp b/Graphics/Visibility.cpp
index 64dd276d0749d5efc2a9347285fcc6a1a7c3f8c6..9300fc57c1b11a7e4713af9f7ef37d996856e002 100644
--- a/Graphics/Visibility.cpp
+++ b/Graphics/Visibility.cpp
@@ -1,4 +1,4 @@
-// $Id: Visibility.cpp,v 1.8 2003-03-21 00:52:39 geuzaine Exp $
+// $Id: Visibility.cpp,v 1.9 2003-05-22 21:41:12 geuzaine Exp $
 //
 // Copyright (C) 1997-2003 C. Geuzaine, J.-F. Remacle
 //
@@ -443,12 +443,20 @@ static void AddVolume(void *a, void *b)
   List_Add(ElementaryEntities, &e);
 }
 
-List_T *GetVisibilityList(int type)
-{
-  int i, j;
+static void addInNumxSymb(void *a, void *b){
   Symbol *s;
   NxS nxs;
 
+  s = (Symbol *)a;
+  for(int j = 0; j < List_Nbr(s->val); j++) {
+    nxs.n = (int)(*(double *)List_Pointer(s->val, j));
+    nxs.s = s->Name;
+    List_Add(NumxSymb, &nxs);
+  }
+}
+
+List_T *GetVisibilityList(int type)
+{
   if(!ElementaryEntities)
     ElementaryEntities = List_Create(100, 100, sizeof(Entity));
   else
@@ -464,14 +472,7 @@ List_T *GetVisibilityList(int type)
   else
     List_Reset(NumxSymb);
 
-  for(i = 0; i < List_Nbr(Symbol_L); i++) {
-    s = (Symbol *) List_Pointer(Symbol_L, i);
-    for(j = 0; j < List_Nbr(s->val); j++) {
-      nxs.n = (int)(*(double *)List_Pointer(s->val, j));
-      nxs.s = s->Name;
-      List_Add(NumxSymb, &nxs);
-    }
-  }
+  Tree_Action(Symbol_T, addInNumxSymb);
 
   List_Action(THEM->PhysicalGroups, AddPhysical);
 
diff --git a/Mesh/2D_Tree.cpp b/Mesh/2D_Tree.cpp
index b1beb5a1f4f07c8f8d2ee5b34bcf76abf8e82d17..f4c8c13f7c6eed2d1e2e81edcc6e56fb133412d3 100644
--- a/Mesh/2D_Tree.cpp
+++ b/Mesh/2D_Tree.cpp
@@ -1,4 +1,4 @@
-// $Id: 2D_Tree.cpp,v 1.10 2003-03-21 00:52:41 geuzaine Exp $
+// $Id: 2D_Tree.cpp,v 1.11 2003-05-22 21:41:12 geuzaine Exp $
 //
 // Copyright (C) 1997-2003 C. Geuzaine, J.-F. Remacle
 //
@@ -57,7 +57,7 @@ int avltree_remove(avlstruct ** root)
 int avltree_insert(avlstruct ** root, void *item,
                    int (*fcmp) (void *a, void *b))
 {
-  int cmpresult;
+  int cmpresult = 0;
 
   if(*root != NULL)
     cmpresult = fcmp(item, (*root)->treedata);
@@ -83,7 +83,7 @@ int avltree_delete(avlstruct ** root, void *item,
                    int (*fcmp) (void *a, void *b))
 {
   avlstruct *t1, *t12;
-  int cmpresult;
+  int cmpresult = 0;
 
   if(*root != NULL)
     cmpresult = fcmp(item, (*root)->treedata);
diff --git a/Parser/Gmsh.tab.cpp b/Parser/Gmsh.tab.cpp
index 2f785622e1cc5ed7cad07e5a52d80615262a1d34..9729ff7e6a3fe686950e6da2bb9899b6158cbef8 100644
--- a/Parser/Gmsh.tab.cpp
+++ b/Parser/Gmsh.tab.cpp
@@ -189,7 +189,7 @@
 #line 1 "Gmsh.y"
  
 
-// $Id: Gmsh.tab.cpp,v 1.157 2003-04-19 22:10:28 geuzaine Exp $
+// $Id: Gmsh.tab.cpp,v 1.158 2003-05-22 21:41:12 geuzaine Exp $
 //
 // Copyright (C) 1997-2003 C. Geuzaine, J.-F. Remacle
 //
@@ -235,7 +235,7 @@
 #include "CreateFile.h"
 #include "STL.h"
 
-List_T *Symbol_L = NULL;
+Tree_T *Symbol_T = NULL;
 
 extern Context_T CTX;
 extern Mesh *THEM;
@@ -5790,11 +5790,11 @@ case 210:
 #line 1195 "Gmsh.y"
 {
       TheSymbol.Name = yyvsp[-3].c;
-      if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols))){
+      if (!(pSymbol = (Symbol*)Tree_PQuery(Symbol_T, &TheSymbol))){
 	TheSymbol.val = List_Create(1,1,sizeof(double));
 	if(!yyvsp[-2].i){
 	  List_Put(TheSymbol.val, 0, &yyvsp[-1].d);
-	  List_Add(Symbol_L, &TheSymbol);
+	  Tree_Add(Symbol_T, &TheSymbol);
 	}
 	else
 	  yymsg(GERROR, "Unknown variable '%s'", yyvsp[-3].c) ;
@@ -5818,11 +5818,11 @@ case 211:
 #line 1222 "Gmsh.y"
 {
       TheSymbol.Name = yyvsp[-6].c;
-      if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols))){
+      if (!(pSymbol = (Symbol*)Tree_PQuery(Symbol_T, &TheSymbol))){
 	TheSymbol.val = List_Create(5,5,sizeof(double));
 	if(!yyvsp[-2].i){
 	  List_Put(TheSymbol.val, (int)yyvsp[-4].d, &yyvsp[-1].d);
-	  List_Add(Symbol_L, &TheSymbol);
+	  Tree_Add(Symbol_T, &TheSymbol);
 	}
 	else
 	  yymsg(GERROR, "Unknown variable '%s'", yyvsp[-6].c) ;
@@ -5856,14 +5856,14 @@ case 212:
 	yymsg(GERROR, "Incompatible array dimensions in affectation");
       else{
 	TheSymbol.Name = yyvsp[-8].c;
-	if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols))){
+	if (!(pSymbol = (Symbol*)Tree_PQuery(Symbol_T, &TheSymbol))){
 	  TheSymbol.val = List_Create(5,5,sizeof(double));
 	  if(!yyvsp[-2].i){
 	    for(i=0 ; i<List_Nbr(yyvsp[-5].l) ; i++){
 	      List_Put(TheSymbol.val, (int)(*(double*)List_Pointer(yyvsp[-5].l,i)),
 		       (double*)List_Pointer(yyvsp[-1].l,i));
 	    }
-	    List_Add(Symbol_L, &TheSymbol);
+	    Tree_Add(Symbol_T, &TheSymbol);
 	  }
 	  else
 	    yymsg(GERROR, "Unknown variable '%s'", yyvsp[-8].c) ;
@@ -5901,10 +5901,10 @@ case 213:
 #line 1303 "Gmsh.y"
 {
       TheSymbol.Name = yyvsp[-5].c;
-      if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols))){
+      if (!(pSymbol = (Symbol*)Tree_PQuery(Symbol_T, &TheSymbol))){
 	TheSymbol.val = List_Create(5,5,sizeof(double));
 	List_Copy(yyvsp[-1].l,TheSymbol.val);
-	List_Add(Symbol_L, &TheSymbol);
+	Tree_Add(Symbol_T, &TheSymbol);
       }
       else{
 	List_Reset(pSymbol->val);
@@ -5917,7 +5917,7 @@ case 214:
 #line 1318 "Gmsh.y"
 {
       TheSymbol.Name = yyvsp[-2].c;
-      if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols)))
+      if (!(pSymbol = (Symbol*)Tree_PQuery(Symbol_T, &TheSymbol)))
 	yymsg(GERROR, "Unknown variable '%s'", yyvsp[-2].c) ; 
       else
 	*(double*)List_Pointer_Fast(pSymbol->val, 0) += yyvsp[-1].i; 
@@ -5927,7 +5927,7 @@ case 215:
 #line 1327 "Gmsh.y"
 {
       TheSymbol.Name = yyvsp[-5].c ;
-      if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols)))
+      if (!(pSymbol = (Symbol*)Tree_PQuery(Symbol_T, &TheSymbol)))
 	yymsg(GERROR, "Unknown variable '%s'", yyvsp[-5].c) ; 
       else{
 	if((pd = (double*)List_Pointer_Test(pSymbol->val, (int)yyvsp[-3].d)))
@@ -6761,10 +6761,10 @@ case 280:
       LoopControlVariablesNameTab[ImbricatedLoop] = yyvsp[-6].c ;
       
       TheSymbol.Name = yyvsp[-6].c;
-      if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols))){
+      if (!(pSymbol = (Symbol*)Tree_PQuery(Symbol_T, &TheSymbol))){
 	TheSymbol.val = List_Create(1,1,sizeof(double));
 	List_Put(TheSymbol.val, 0, &yyvsp[-3].d);
-	List_Add(Symbol_L, &TheSymbol);
+	Tree_Add(Symbol_T, &TheSymbol);
       }
       else{
 	List_Write(pSymbol->val, 0, &yyvsp[-3].d);
@@ -6784,10 +6784,10 @@ case 281:
       LoopControlVariablesNameTab[ImbricatedLoop] = yyvsp[-8].c ;
 
       TheSymbol.Name = yyvsp[-8].c;
-      if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols))){
+      if (!(pSymbol = (Symbol*)Tree_PQuery(Symbol_T, &TheSymbol))){
 	TheSymbol.val = List_Create(1,1,sizeof(double));
 	List_Put(TheSymbol.val, 0, &yyvsp[-5].d);
-	List_Add(Symbol_L, &TheSymbol);
+	Tree_Add(Symbol_T, &TheSymbol);
       }
       else{
 	List_Write(pSymbol->val, 0, &yyvsp[-5].d);
@@ -6808,7 +6808,7 @@ case 282:
 	
 	if(strlen(LoopControlVariablesNameTab[ImbricatedLoop-1])){
 	  TheSymbol.Name = LoopControlVariablesNameTab[ImbricatedLoop-1];
-	  pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols);
+	  pSymbol = (Symbol*)Tree_PQuery(Symbol_T, &TheSymbol);
 	  *(double*)List_Pointer_Fast(pSymbol->val, 0) += 
 	    LoopControlVariablesTab[ImbricatedLoop-1][2] ;
 	}
@@ -7595,7 +7595,7 @@ case 401:
 #line 2691 "Gmsh.y"
 {
       TheSymbol.Name = yyvsp[0].c ;
-      if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols))) {
+      if (!(pSymbol = (Symbol*)Tree_PQuery(Symbol_T, &TheSymbol))) {
 	yymsg(GERROR, "Unknown variable '%s'", yyvsp[0].c) ;
 	yyval.d = 0. ;
       }
@@ -7607,7 +7607,7 @@ case 402:
 #line 2702 "Gmsh.y"
 {
       TheSymbol.Name = yyvsp[-3].c ;
-      if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols))) {
+      if (!(pSymbol = (Symbol*)Tree_PQuery(Symbol_T, &TheSymbol))) {
 	yymsg(GERROR, "Unknown variable '%s'", yyvsp[-3].c) ;
 	yyval.d = 0. ;
       }
@@ -7625,7 +7625,7 @@ case 403:
 #line 2719 "Gmsh.y"
 {
       TheSymbol.Name = yyvsp[-1].c ;
-      if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols))) {
+      if (!(pSymbol = (Symbol*)Tree_PQuery(Symbol_T, &TheSymbol))) {
 	yymsg(GERROR, "Unknown variable '%s'", yyvsp[-1].c) ;
 	yyval.d = 0. ;
       }
@@ -7637,7 +7637,7 @@ case 404:
 #line 2730 "Gmsh.y"
 {
       TheSymbol.Name = yyvsp[-4].c ;
-      if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols))) {
+      if (!(pSymbol = (Symbol*)Tree_PQuery(Symbol_T, &TheSymbol))) {
 	yymsg(GERROR, "Unknown variable '%s'", yyvsp[-4].c) ;
 	yyval.d = 0. ;
       }
@@ -7878,7 +7878,7 @@ case 433:
 {
       yyval.l = List_Create(2,1,sizeof(double)) ;
       TheSymbol.Name = yyvsp[-2].c ;
-      if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols))) {
+      if (!(pSymbol = (Symbol*)Tree_PQuery(Symbol_T, &TheSymbol))) {
 	yymsg(GERROR, "Unknown variable '%s'", yyvsp[-2].c) ;
 	d = 0.0 ;
 	List_Add(yyval.l, &d);
@@ -7894,7 +7894,7 @@ case 434:
 {
       yyval.l = List_Create(2,1,sizeof(double)) ;
       TheSymbol.Name = yyvsp[-2].c ;
-      if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols))) {
+      if (!(pSymbol = (Symbol*)Tree_PQuery(Symbol_T, &TheSymbol))) {
 	yymsg(GERROR, "Unknown variable '%s'", yyvsp[-2].c) ;
 	d = 0.0 ;
 	List_Add(yyval.l, &d);
@@ -7912,7 +7912,7 @@ case 435:
 {
       yyval.l = List_Create(2,1,sizeof(double)) ;
       TheSymbol.Name = yyvsp[-5].c ;
-      if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols))) {
+      if (!(pSymbol = (Symbol*)Tree_PQuery(Symbol_T, &TheSymbol))) {
 	yymsg(GERROR, "Unknown variable '%s'", yyvsp[-5].c) ;
 	d = 0.0 ;
 	List_Add(yyval.l, &d);
@@ -7934,7 +7934,7 @@ case 436:
 {
       yyval.l = List_Create(2,1,sizeof(double)) ;
       TheSymbol.Name = yyvsp[-5].c ;
-      if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols))) {
+      if (!(pSymbol = (Symbol*)Tree_PQuery(Symbol_T, &TheSymbol))) {
 	yymsg(GERROR, "Unknown variable '%s'", yyvsp[-5].c) ;
 	d = 0.0 ;
 	List_Add(yyval.l, &d);
@@ -8376,24 +8376,24 @@ yyreturn:
 #line 3188 "Gmsh.y"
 
 
-void InitSymbols(void){
-  if(!Symbol_L)
-    Symbol_L = List_Create(50,10,sizeof(Symbol));
-  else
-    List_Reset(Symbol_L);
-}
-
-void DeleteSymbols(void){
-  int i;
-  for(i = 0 ; i < List_Nbr(Symbol_L) ; i++)
-    List_Delete(((Symbol*)List_Pointer_Fast(Symbol_L,i))->val);
-  List_Delete(Symbol_L);
+void DeleteSymbol(void *a, void *b){
+  Symbol *s = (Symbol*)a;
+  Free(s->Name);
+  List_Delete(s->val);
 }
 
 int CompareSymbols (const void *a, const void *b){
   return(strcmp(((Symbol*)a)->Name,((Symbol*)b)->Name));
 }
 
+void InitSymbols(void){
+  if(Symbol_T){
+    Tree_Action(Symbol_T, DeleteSymbol);
+    Tree_Delete(Symbol_T);
+  }
+  Symbol_T = Tree_Create(sizeof(Symbol), CompareSymbols);
+}
+
 int PrintListOfDouble(char *format, List_T *list, char *buffer){
   int i, j, k;
   char tmp1[256], tmp2[256];
diff --git a/Parser/Gmsh.y b/Parser/Gmsh.y
index 61089192a619854bc90b95609488d11b44353802..8abf8f3498088d946f43901be19a432488a8fd45 100644
--- a/Parser/Gmsh.y
+++ b/Parser/Gmsh.y
@@ -1,6 +1,6 @@
 %{ 
 
-// $Id: Gmsh.y,v 1.138 2003-04-19 22:10:29 geuzaine Exp $
+// $Id: Gmsh.y,v 1.139 2003-05-22 21:41:13 geuzaine Exp $
 //
 // Copyright (C) 1997-2003 C. Geuzaine, J.-F. Remacle
 //
@@ -46,7 +46,7 @@
 #include "CreateFile.h"
 #include "STL.h"
 
-List_T *Symbol_L = NULL;
+Tree_T *Symbol_T = NULL;
 
 extern Context_T CTX;
 extern Mesh *THEM;
@@ -1194,11 +1194,11 @@ Affectation :
     tSTRING NumericAffectation FExpr tEND
     {
       TheSymbol.Name = $1;
-      if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols))){
+      if (!(pSymbol = (Symbol*)Tree_PQuery(Symbol_T, &TheSymbol))){
 	TheSymbol.val = List_Create(1,1,sizeof(double));
 	if(!$2){
 	  List_Put(TheSymbol.val, 0, &$3);
-	  List_Add(Symbol_L, &TheSymbol);
+	  Tree_Add(Symbol_T, &TheSymbol);
 	}
 	else
 	  yymsg(GERROR, "Unknown variable '%s'", $1) ;
@@ -1221,11 +1221,11 @@ Affectation :
   | tSTRING '[' FExpr ']' NumericAffectation FExpr tEND
     {
       TheSymbol.Name = $1;
-      if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols))){
+      if (!(pSymbol = (Symbol*)Tree_PQuery(Symbol_T, &TheSymbol))){
 	TheSymbol.val = List_Create(5,5,sizeof(double));
 	if(!$5){
 	  List_Put(TheSymbol.val, (int)$3, &$6);
-	  List_Add(Symbol_L, &TheSymbol);
+	  Tree_Add(Symbol_T, &TheSymbol);
 	}
 	else
 	  yymsg(GERROR, "Unknown variable '%s'", $1) ;
@@ -1258,14 +1258,14 @@ Affectation :
 	yymsg(GERROR, "Incompatible array dimensions in affectation");
       else{
 	TheSymbol.Name = $1;
-	if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols))){
+	if (!(pSymbol = (Symbol*)Tree_PQuery(Symbol_T, &TheSymbol))){
 	  TheSymbol.val = List_Create(5,5,sizeof(double));
 	  if(!$7){
 	    for(i=0 ; i<List_Nbr($4) ; i++){
 	      List_Put(TheSymbol.val, (int)(*(double*)List_Pointer($4,i)),
 		       (double*)List_Pointer($8,i));
 	    }
-	    List_Add(Symbol_L, &TheSymbol);
+	    Tree_Add(Symbol_T, &TheSymbol);
 	  }
 	  else
 	    yymsg(GERROR, "Unknown variable '%s'", $1) ;
@@ -1302,10 +1302,10 @@ Affectation :
   | tSTRING '[' ']' tAFFECT ListOfDouble tEND
     {
       TheSymbol.Name = $1;
-      if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols))){
+      if (!(pSymbol = (Symbol*)Tree_PQuery(Symbol_T, &TheSymbol))){
 	TheSymbol.val = List_Create(5,5,sizeof(double));
 	List_Copy($5,TheSymbol.val);
-	List_Add(Symbol_L, &TheSymbol);
+	Tree_Add(Symbol_T, &TheSymbol);
       }
       else{
 	List_Reset(pSymbol->val);
@@ -1317,7 +1317,7 @@ Affectation :
   | tSTRING NumericIncrement tEND
     {
       TheSymbol.Name = $1;
-      if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols)))
+      if (!(pSymbol = (Symbol*)Tree_PQuery(Symbol_T, &TheSymbol)))
 	yymsg(GERROR, "Unknown variable '%s'", $1) ; 
       else
 	*(double*)List_Pointer_Fast(pSymbol->val, 0) += $2; 
@@ -1326,7 +1326,7 @@ Affectation :
   | tSTRING '[' FExpr ']' NumericIncrement tEND
     {
       TheSymbol.Name = $1 ;
-      if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols)))
+      if (!(pSymbol = (Symbol*)Tree_PQuery(Symbol_T, &TheSymbol)))
 	yymsg(GERROR, "Unknown variable '%s'", $1) ; 
       else{
 	if((pd = (double*)List_Pointer_Test(pSymbol->val, (int)$3)))
@@ -2113,10 +2113,10 @@ Loop :
       LoopControlVariablesNameTab[ImbricatedLoop] = $2 ;
       
       TheSymbol.Name = $2;
-      if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols))){
+      if (!(pSymbol = (Symbol*)Tree_PQuery(Symbol_T, &TheSymbol))){
 	TheSymbol.val = List_Create(1,1,sizeof(double));
 	List_Put(TheSymbol.val, 0, &$5);
-	List_Add(Symbol_L, &TheSymbol);
+	Tree_Add(Symbol_T, &TheSymbol);
       }
       else{
 	List_Write(pSymbol->val, 0, &$5);
@@ -2134,10 +2134,10 @@ Loop :
       LoopControlVariablesNameTab[ImbricatedLoop] = $2 ;
 
       TheSymbol.Name = $2;
-      if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols))){
+      if (!(pSymbol = (Symbol*)Tree_PQuery(Symbol_T, &TheSymbol))){
 	TheSymbol.val = List_Create(1,1,sizeof(double));
 	List_Put(TheSymbol.val, 0, &$5);
-	List_Add(Symbol_L, &TheSymbol);
+	Tree_Add(Symbol_T, &TheSymbol);
       }
       else{
 	List_Write(pSymbol->val, 0, &$5);
@@ -2156,7 +2156,7 @@ Loop :
 	
 	if(strlen(LoopControlVariablesNameTab[ImbricatedLoop-1])){
 	  TheSymbol.Name = LoopControlVariablesNameTab[ImbricatedLoop-1];
-	  pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols);
+	  pSymbol = (Symbol*)Tree_PQuery(Symbol_T, &TheSymbol);
 	  *(double*)List_Pointer_Fast(pSymbol->val, 0) += 
 	    LoopControlVariablesTab[ImbricatedLoop-1][2] ;
 	}
@@ -2690,7 +2690,7 @@ FExpr_Single :
   | tSTRING
     {
       TheSymbol.Name = $1 ;
-      if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols))) {
+      if (!(pSymbol = (Symbol*)Tree_PQuery(Symbol_T, &TheSymbol))) {
 	yymsg(GERROR, "Unknown variable '%s'", $1) ;
 	$$ = 0. ;
       }
@@ -2701,7 +2701,7 @@ FExpr_Single :
   | tSTRING '[' FExpr ']'
     {
       TheSymbol.Name = $1 ;
-      if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols))) {
+      if (!(pSymbol = (Symbol*)Tree_PQuery(Symbol_T, &TheSymbol))) {
 	yymsg(GERROR, "Unknown variable '%s'", $1) ;
 	$$ = 0. ;
       }
@@ -2718,7 +2718,7 @@ FExpr_Single :
   | tSTRING NumericIncrement
     {
       TheSymbol.Name = $1 ;
-      if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols))) {
+      if (!(pSymbol = (Symbol*)Tree_PQuery(Symbol_T, &TheSymbol))) {
 	yymsg(GERROR, "Unknown variable '%s'", $1) ;
 	$$ = 0. ;
       }
@@ -2729,7 +2729,7 @@ FExpr_Single :
   | tSTRING '[' FExpr ']' NumericIncrement
     {
       TheSymbol.Name = $1 ;
-      if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols))) {
+      if (!(pSymbol = (Symbol*)Tree_PQuery(Symbol_T, &TheSymbol))) {
 	yymsg(GERROR, "Unknown variable '%s'", $1) ;
 	$$ = 0. ;
       }
@@ -2943,7 +2943,7 @@ FExpr_Multi :
     {
       $$ = List_Create(2,1,sizeof(double)) ;
       TheSymbol.Name = $1 ;
-      if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols))) {
+      if (!(pSymbol = (Symbol*)Tree_PQuery(Symbol_T, &TheSymbol))) {
 	yymsg(GERROR, "Unknown variable '%s'", $1) ;
 	d = 0.0 ;
 	List_Add($$, &d);
@@ -2957,7 +2957,7 @@ FExpr_Multi :
     {
       $$ = List_Create(2,1,sizeof(double)) ;
       TheSymbol.Name = $2 ;
-      if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols))) {
+      if (!(pSymbol = (Symbol*)Tree_PQuery(Symbol_T, &TheSymbol))) {
 	yymsg(GERROR, "Unknown variable '%s'", $2) ;
 	d = 0.0 ;
 	List_Add($$, &d);
@@ -2973,7 +2973,7 @@ FExpr_Multi :
     {
       $$ = List_Create(2,1,sizeof(double)) ;
       TheSymbol.Name = $1 ;
-      if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols))) {
+      if (!(pSymbol = (Symbol*)Tree_PQuery(Symbol_T, &TheSymbol))) {
 	yymsg(GERROR, "Unknown variable '%s'", $1) ;
 	d = 0.0 ;
 	List_Add($$, &d);
@@ -2993,7 +2993,7 @@ FExpr_Multi :
     {
       $$ = List_Create(2,1,sizeof(double)) ;
       TheSymbol.Name = $2 ;
-      if (!(pSymbol = (Symbol*)List_PQuery(Symbol_L, &TheSymbol, CompareSymbols))) {
+      if (!(pSymbol = (Symbol*)Tree_PQuery(Symbol_T, &TheSymbol))) {
 	yymsg(GERROR, "Unknown variable '%s'", $2) ;
 	d = 0.0 ;
 	List_Add($$, &d);
@@ -3187,24 +3187,24 @@ StringExpr :
 
 %%
 
-void InitSymbols(void){
-  if(!Symbol_L)
-    Symbol_L = List_Create(50,10,sizeof(Symbol));
-  else
-    List_Reset(Symbol_L);
-}
-
-void DeleteSymbols(void){
-  int i;
-  for(i = 0 ; i < List_Nbr(Symbol_L) ; i++)
-    List_Delete(((Symbol*)List_Pointer_Fast(Symbol_L,i))->val);
-  List_Delete(Symbol_L);
+void DeleteSymbol(void *a, void *b){
+  Symbol *s = (Symbol*)a;
+  Free(s->Name);
+  List_Delete(s->val);
 }
 
 int CompareSymbols (const void *a, const void *b){
   return(strcmp(((Symbol*)a)->Name,((Symbol*)b)->Name));
 }
 
+void InitSymbols(void){
+  if(Symbol_T){
+    Tree_Action(Symbol_T, DeleteSymbol);
+    Tree_Delete(Symbol_T);
+  }
+  Symbol_T = Tree_Create(sizeof(Symbol), CompareSymbols);
+}
+
 int PrintListOfDouble(char *format, List_T *list, char *buffer){
   int i, j, k;
   char tmp1[256], tmp2[256];
diff --git a/Parser/Gmsh.yy.cpp b/Parser/Gmsh.yy.cpp
index 3a62c3452560c06d5658e4250e34bde3ca3623cf..12187011ee6e9d8f5400cc895de4bd97eab46ecf 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.156 2003-04-19 22:10:29 geuzaine Exp $
+ * $Header: /cvsroot/gmsh/Parser/Gmsh.yy.cpp,v 1.157 2003-05-22 21:41:13 geuzaine Exp $
  */
 
 #define FLEX_SCANNER
@@ -1012,7 +1012,7 @@ char *yytext;
 #define INITIAL 0
 #line 2 "Gmsh.l"
 
-// $Id: Gmsh.yy.cpp,v 1.156 2003-04-19 22:10:29 geuzaine Exp $
+// $Id: Gmsh.yy.cpp,v 1.157 2003-05-22 21:41:13 geuzaine Exp $
 //
 // Copyright (C) 1997-2003 C. Geuzaine, J.-F. Remacle
 //
diff --git a/Parser/Parser.h b/Parser/Parser.h
index 0b742dd3587ae6781f8d1ba2f86e3e6c9c021523..d7bcb3738561908e5fd38e9d4d587638ac40bfa5 100644
--- a/Parser/Parser.h
+++ b/Parser/Parser.h
@@ -31,7 +31,7 @@ void InitSymbols (void);
 void DeleteSymbols(void);
 int CompareSymbols (const void *a, const void *b);
 
-extern List_T *Symbol_L;
+extern Tree_T *Symbol_T;
 
 int yyparse (void);
 int yylex ();
diff --git a/doc/VERSIONS b/doc/VERSIONS
index 65fa3b40db7963fa02ee73e04d288e6d199b0f5b..a92dfbafa4893bf75134f380b9b574fa4e208928 100644
--- a/doc/VERSIONS
+++ b/doc/VERSIONS
@@ -1,7 +1,8 @@
-$Id: VERSIONS,v 1.143 2003-05-14 14:23:10 geuzaine Exp $
+$Id: VERSIONS,v 1.144 2003-05-22 21:41:14 geuzaine Exp $
 
 New in 1.45: small bug fixes (min/max computation for tensor views,
-physical points in read mesh, etc.); documentation updates;
+physical points in read mesh, etc.); variable definition speedup;
+documentation updates;
 
 New in 1.44: new reference manual; added support for PNG output; fixed
 small configure script bugs;