diff --git a/Fltk/Callbacks.cpp b/Fltk/Callbacks.cpp
index dae7aae2cf476d5260ceb28394f811fca31efba4..6a9a6c81152974f89432dc0e38dbbaf306a76d82 100644
--- a/Fltk/Callbacks.cpp
+++ b/Fltk/Callbacks.cpp
@@ -1,4 +1,4 @@
-// $Id: Callbacks.cpp,v 1.99 2001-12-04 16:42:42 geuzaine Exp $
+// $Id: Callbacks.cpp,v 1.100 2001-12-06 08:10:59 geuzaine Exp $
 
 #include <sys/types.h>
 #include <signal.h>
@@ -643,29 +643,8 @@ void opt_visibility_sort_cb(CALLBACK_ARGS){
   }
 }
 
-static int vnod, velm, vcur, vsur, vvol;
-static void vis_nod(void *a, void *b){ (*(Vertex**)a)->Visible = vnod; }
-static void vis_sim(void *a, void *b){ (*(Simplex**)a)->Visible = velm; }
-static void vis_hex(void *a, void *b){ (*(Hexahedron**)a)->Visible = velm; }
-static void vis_pri(void *a, void *b){ (*(Prism**)a)->Visible = velm; }
-static void vis_pyr(void *a, void *b){ (*(Pyramid**)a)->Visible = velm; }
-static void vis_cur(void *a, void *b){ (*(Curve**)a)->Visible = vcur; }
-static void vis_sur(void *a, void *b){ (*(Surface**)a)->Visible = vsur; }
-static void vis_vol(void *a, void *b){ (*(Volume**)a)->Visible = vvol; }
-
 void opt_visibility_number_cb(CALLBACK_ARGS){
-  static int allnod=1, allelm=1, allpnt=1, allcur=1, allsur=1, allvol=1;
-  int i, found, num, mode;
-  int type = WID->vis_input_mode->value();
-  List_T *tmp;
-  Vertex vv,*v,**pv;
-  Curve *c;
-  Surface *s;
-  Volume *V;
-  Simplex SS, *S, **pS;
-  Hexahedron HH, *H, **pH;
-  Prism PP, *P, **pP;
-  Pyramid QQ, *Q, **pQ;
+  int pos, mode, type = WID->vis_input_mode->value();
   char *str = (char*)((Fl_Input*)w)->value(); 
 
   switch(WID->vis_browser_mode->value()){
@@ -674,139 +653,11 @@ void opt_visibility_number_cb(CALLBACK_ARGS){
   default: mode = VIS_MESH; break;
   }
 
-  if (!strcmp(str,"all") || !strcmp(str,"*")){
-    switch(type){
-    case 0: //node
-      allnod = !allnod;
-      vnod = allnod ? VIS_MESH : 0;
-      Tree_Action(THEM->Vertices, vis_nod);
-      break;
-    case 1: //element
-      allelm = !allelm;
-      velm = allelm ? VIS_MESH : 0;
-      tmp = Tree2List(THEM->Curves);
-      for(i=0; i<List_Nbr(tmp); i++){
-	List_Read(tmp, i, &c);
-	Tree_Action(c->Simplexes, vis_sim);
-      }
-      List_Delete(tmp);
-      tmp = Tree2List(THEM->Surfaces);
-      for(i=0; i<List_Nbr(tmp); i++){
-	List_Read(tmp, i, &s);
-	Tree_Action(s->Simplexes, vis_sim);
-      }
-      List_Delete(tmp);
-      Tree_Action(THEM->Simplexes, vis_sim);
-      tmp = Tree2List(THEM->Volumes);
-      for(i=0; i<List_Nbr(tmp); i++){
-	List_Read(tmp, i, &V);
-	Tree_Action(V->Hexahedra, vis_hex);
-	Tree_Action(V->Prisms, vis_pri);
-	Tree_Action(V->Pyramids, vis_pyr);
-      }
-      List_Delete(tmp);
-      break;
-    case 2: //point
-      allpnt = !allpnt;
-      vnod = allpnt ? VIS_MESH|VIS_GEOM : 0;
-      Tree_Action(THEM->Points, vis_nod);
-      break;
-    case 3: //curve
-      allcur = !allcur;
-      vcur = allcur ? VIS_MESH|VIS_GEOM : 0;
-      Tree_Action(THEM->Curves, vis_cur);
-      break;
-    case 4: //surface
-      allsur = !allsur;
-      vsur = allsur ? VIS_MESH|VIS_GEOM : 0;
-      Tree_Action(THEM->Surfaces, vis_sur);
-      break;
-    case 5: //volume
-      allvol= !allvol;
-      vvol = allvol ? VIS_MESH|VIS_GEOM : 0;
-      Tree_Action(THEM->Volumes, vis_vol);
-      break;
-    }
-  }
-  else{ 
-    num = atoi(str);
-
-    switch(type){
-    case 0: //node
-      vv.Num = num; v = &vv;
-      if((pv = (Vertex**)Tree_PQuery(THEM->Vertices, &v)))
-	(*pv)->Visible = (*pv)->Visible ? 0 : VIS_MESH;
-      else
-	Msg(WARNING, "Unknown node %d (use '*' to hide/show all nodes)", num);
-      break;
-    case 1: //element
-      SS.Num = num; S = &SS;
-      HH.Num = num; H = &HH;
-      PP.Num = num; P = &PP;
-      QQ.Num = num; Q = &QQ;
-      found = 0;
-      tmp = Tree2List(THEM->Curves);
-      for(i=0; i<List_Nbr(tmp); i++){
-	List_Read(tmp, i, &c);
-	if((pS = (Simplex**)Tree_PQuery(c->Simplexes, &S))){
-	  (*pS)->Visible = (*pS)->Visible ? 0 : VIS_MESH; found = 1; break;
-	}
-      }
-      List_Delete(tmp);
-      if(!found){
-	tmp = Tree2List(THEM->Surfaces);
-	for(i=0; i<List_Nbr(tmp); i++){
-	  List_Read(tmp, i, &s);
-	  if((pS = (Simplex**)Tree_PQuery(s->Simplexes, &S))){
-	    (*pS)->Visible = (*pS)->Visible ? 0 : VIS_MESH; found = 1; break;
-	  }
-	}
-	List_Delete(tmp);
-	if(!found){
-	  if((pS = (Simplex**)Tree_PQuery(THEM->Simplexes, &S))){
-	    (*pS)->Visible = (*pS)->Visible ? 0 : VIS_MESH;
-	  }
-	  else{
-	    tmp = Tree2List(THEM->Volumes);
-	    for(i=0; i<List_Nbr(tmp); i++){
-	      List_Read(tmp, i, &V);
-	      if((pH = (Hexahedron**)Tree_PQuery(V->Hexahedra, &H))){
-		(*pH)->Visible = (*pH)->Visible ? 0 : VIS_MESH; found = 1; break;
-	      }
-	      if((pP = (Prism**)Tree_PQuery(V->Prisms, &P))){
-		(*pP)->Visible = (*pP)->Visible ? 0 : VIS_MESH; found = 1; break;
-	      }
-	      if((pQ = (Pyramid**)Tree_PQuery(V->Pyramids, &Q))){
-		(*pQ)->Visible = (*pQ)->Visible ? 0 : VIS_MESH; found = 1; break;
-	      }
-	    }
-	    List_Delete(tmp);
-	    if(!found) 
-	      Msg(WARNING, "Unknown element %d (use '*' to hide/show all elements)", num);
-	  }
-	}
-      }
-      break;
-    case 2: //point
-      if((v=FindPoint(num,THEM))) v->Visible = v->Visible ? 0 : VIS_GEOM|VIS_MESH ;
-      else Msg(WARNING, "Unknown point %d (use '*' to hide/show all points)", num);
-      break;
-    case 3: //curve
-      if((c=FindCurve(num,THEM))) c->Visible = c->Visible ? 0 : VIS_GEOM|VIS_MESH ;
-      else Msg(WARNING, "Unknown curve %d (use '*' to hide/show all curves)", num);
-      break;
-    case 4: //surface
-      if((s=FindSurface(num,THEM))) s->Visible = s->Visible ? 0 : VIS_GEOM|VIS_MESH ;
-      else Msg(WARNING, "Unknown surface %d (use '*' to hide/show all surfaces)", num);
-      break;
-    case 5: //volume
-      if((V=FindVolume(num,THEM))) V->Visible = V->Visible ? 0 : VIS_GEOM|VIS_MESH ;
-      else Msg(WARNING, "Unknown volume %d (use '*' to hide/show all volumes)", num);
-      break;
-    }
-  }
-
+  SetVisibilityByNumber(str, type, mode);
+  pos = WID->vis_browser->position();
   opt_visibility_cb(NULL,NULL);
+  WID->vis_browser->position(pos);
+
   Draw();
 }
 
diff --git a/Fltk/GUI.cpp b/Fltk/GUI.cpp
index cac7bdfef1f2db8833f675baac528e0c095c5ebb..f64080efacca18fd6d225a136a1d2d15cd171d92 100644
--- a/Fltk/GUI.cpp
+++ b/Fltk/GUI.cpp
@@ -1,4 +1,4 @@
-// $Id: GUI.cpp,v 1.140 2001-12-04 12:06:49 geuzaine Exp $
+// $Id: GUI.cpp,v 1.141 2001-12-06 08:10:59 geuzaine Exp $
 
 // To make the interface as visually consistent as possible, please:
 // - use the IW, BB, BH, BW and WB values
@@ -1956,7 +1956,7 @@ void GUI::create_visibility_window(){
     return;
   }
 
-  static int cols[5] = {15,100,100,200,0};  
+  static int cols[5] = {15,95,95,180,0};  
   static Fl_Menu_Item type_table[] = {
     {"Elementary",  0, (Fl_Callback *)opt_visibility_cb},
     {"Physical",    0, (Fl_Callback *)opt_visibility_cb},
@@ -2029,7 +2029,8 @@ void GUI::create_visibility_window(){
   vis_browser->type(FL_MULTI_BROWSER);
   vis_browser->column_widths(cols);
 
-  vis_window->resizable(new Fl_Box(width-3*WB-2*BB-10,height-5*WB-2*BH-10, 10,10));
+  vis_window->resizable(new Fl_Box(width-3*WB-2*BB-10,3*WB+2*BH+10, 10,10));
+  vis_window->size_range(width, 5*BH+5*WB);
 
   vis_input = new Fl_Input(1*WB, height-2*WB-2*BH, brw/3, BH);
   vis_input->labelsize(CTX.fontsize);
diff --git a/Graphics/Visibility.cpp b/Graphics/Visibility.cpp
index 7b30a18b0879339c330f6c9d70824c747d2cd1df..f6cd64f9ebd273e56bae0ba410c03ba414ca0bf2 100644
--- a/Graphics/Visibility.cpp
+++ b/Graphics/Visibility.cpp
@@ -1,4 +1,4 @@
-// $Id: Visibility.cpp,v 1.1 2001-12-03 10:01:06 geuzaine Exp $
+// $Id: Visibility.cpp,v 1.2 2001-12-06 08:10:59 geuzaine Exp $
 #include "Gmsh.h"
 #include "Geo.h"
 #include "CAD.h"
@@ -387,3 +387,159 @@ void InitVisibilityThroughPhysical(){
     VisibleThroughPhysical[i] = Tree_Create(sizeof(int),fcmp_absint);
   }
 }
+
+static int vnod, velm, vcur, vsur, vvol;
+static void vis_nod(void *a, void *b){ (*(Vertex**)a)->Visible = vnod; }
+static void vis_sim(void *a, void *b){ (*(Simplex**)a)->Visible = velm; }
+static void vis_hex(void *a, void *b){ (*(Hexahedron**)a)->Visible = velm; }
+static void vis_pri(void *a, void *b){ (*(Prism**)a)->Visible = velm; }
+static void vis_pyr(void *a, void *b){ (*(Pyramid**)a)->Visible = velm; }
+static void vis_cur(void *a, void *b){ (*(Curve**)a)->Visible = vcur; }
+static void vis_sur(void *a, void *b){ (*(Surface**)a)->Visible = vsur; }
+static void vis_vol(void *a, void *b){ (*(Volume**)a)->Visible = vvol; }
+
+void SetVisibilityByNumber(char *str, int type, int mode){
+  static int allnod=1, allelm=1, allpnt=1, allcur=1, allsur=1, allvol=1;
+  int i, found, num;
+  List_T *tmp;
+  Vertex vv,*v,**pv;
+  Curve *c;
+  Surface *s;
+  Volume *V;
+  Simplex SS, *S, **pS;
+  Hexahedron HH, *H, **pH;
+  Prism PP, *P, **pP;
+  Pyramid QQ, *Q, **pQ;
+
+  if (!strcmp(str,"all") || !strcmp(str,"*")){
+    switch(type){
+    case 0: //node
+      allnod = !allnod;
+      vnod = allnod ? VIS_MESH : 0;
+      Tree_Action(THEM->Vertices, vis_nod);
+      break;
+    case 1: //element
+      allelm = !allelm;
+      velm = allelm ? VIS_MESH : 0;
+      tmp = Tree2List(THEM->Curves);
+      for(i=0; i<List_Nbr(tmp); i++){
+	List_Read(tmp, i, &c);
+	Tree_Action(c->Simplexes, vis_sim);
+      }
+      List_Delete(tmp);
+      tmp = Tree2List(THEM->Surfaces);
+      for(i=0; i<List_Nbr(tmp); i++){
+	List_Read(tmp, i, &s);
+	Tree_Action(s->Simplexes, vis_sim);
+      }
+      List_Delete(tmp);
+      Tree_Action(THEM->Simplexes, vis_sim);
+      tmp = Tree2List(THEM->Volumes);
+      for(i=0; i<List_Nbr(tmp); i++){
+	List_Read(tmp, i, &V);
+	Tree_Action(V->Hexahedra, vis_hex);
+	Tree_Action(V->Prisms, vis_pri);
+	Tree_Action(V->Pyramids, vis_pyr);
+      }
+      List_Delete(tmp);
+      break;
+    case 2: //point
+      allpnt = !allpnt;
+      vnod = allpnt ? VIS_MESH|VIS_GEOM : 0;
+      Tree_Action(THEM->Points, vis_nod);
+      break;
+    case 3: //curve
+      allcur = !allcur;
+      vcur = allcur ? VIS_MESH|VIS_GEOM : 0;
+      Tree_Action(THEM->Curves, vis_cur);
+      break;
+    case 4: //surface
+      allsur = !allsur;
+      vsur = allsur ? VIS_MESH|VIS_GEOM : 0;
+      Tree_Action(THEM->Surfaces, vis_sur);
+      break;
+    case 5: //volume
+      allvol= !allvol;
+      vvol = allvol ? VIS_MESH|VIS_GEOM : 0;
+      Tree_Action(THEM->Volumes, vis_vol);
+      break;
+    }
+  }
+  else{ 
+    num = atoi(str);
+
+    switch(type){
+    case 0: //node
+      vv.Num = num; v = &vv;
+      if((pv = (Vertex**)Tree_PQuery(THEM->Vertices, &v)))
+	(*pv)->Visible = (*pv)->Visible ? 0 : VIS_MESH;
+      else
+	Msg(WARNING, "Unknown node %d (use '*' to hide/show all nodes)", num);
+      break;
+    case 1: //element
+      SS.Num = num; S = &SS;
+      HH.Num = num; H = &HH;
+      PP.Num = num; P = &PP;
+      QQ.Num = num; Q = &QQ;
+      found = 0;
+      tmp = Tree2List(THEM->Curves);
+      for(i=0; i<List_Nbr(tmp); i++){
+	List_Read(tmp, i, &c);
+	if((pS = (Simplex**)Tree_PQuery(c->Simplexes, &S))){
+	  (*pS)->Visible = (*pS)->Visible ? 0 : VIS_MESH; found = 1; break;
+	}
+      }
+      List_Delete(tmp);
+      if(!found){
+	tmp = Tree2List(THEM->Surfaces);
+	for(i=0; i<List_Nbr(tmp); i++){
+	  List_Read(tmp, i, &s);
+	  if((pS = (Simplex**)Tree_PQuery(s->Simplexes, &S))){
+	    (*pS)->Visible = (*pS)->Visible ? 0 : VIS_MESH; found = 1; break;
+	  }
+	}
+	List_Delete(tmp);
+	if(!found){
+	  if((pS = (Simplex**)Tree_PQuery(THEM->Simplexes, &S))){
+	    (*pS)->Visible = (*pS)->Visible ? 0 : VIS_MESH;
+	  }
+	  else{
+	    tmp = Tree2List(THEM->Volumes);
+	    for(i=0; i<List_Nbr(tmp); i++){
+	      List_Read(tmp, i, &V);
+	      if((pH = (Hexahedron**)Tree_PQuery(V->Hexahedra, &H))){
+		(*pH)->Visible = (*pH)->Visible ? 0 : VIS_MESH; found = 1; break;
+	      }
+	      if((pP = (Prism**)Tree_PQuery(V->Prisms, &P))){
+		(*pP)->Visible = (*pP)->Visible ? 0 : VIS_MESH; found = 1; break;
+	      }
+	      if((pQ = (Pyramid**)Tree_PQuery(V->Pyramids, &Q))){
+		(*pQ)->Visible = (*pQ)->Visible ? 0 : VIS_MESH; found = 1; break;
+	      }
+	    }
+	    List_Delete(tmp);
+	    if(!found) 
+	      Msg(WARNING, "Unknown element %d (use '*' to hide/show all elements)", num);
+	  }
+	}
+      }
+      break;
+    case 2: //point
+      if((v=FindPoint(num,THEM))) v->Visible = v->Visible ? 0 : VIS_GEOM|VIS_MESH ;
+      else Msg(WARNING, "Unknown point %d (use '*' to hide/show all points)", num);
+      break;
+    case 3: //curve
+      if((c=FindCurve(num,THEM))) c->Visible = c->Visible ? 0 : VIS_GEOM|VIS_MESH ;
+      else Msg(WARNING, "Unknown curve %d (use '*' to hide/show all curves)", num);
+      break;
+    case 4: //surface
+      if((s=FindSurface(num,THEM))) s->Visible = s->Visible ? 0 : VIS_GEOM|VIS_MESH ;
+      else Msg(WARNING, "Unknown surface %d (use '*' to hide/show all surfaces)", num);
+      break;
+    case 5: //volume
+      if((V=FindVolume(num,THEM))) V->Visible = V->Visible ? 0 : VIS_GEOM|VIS_MESH ;
+      else Msg(WARNING, "Unknown volume %d (use '*' to hide/show all volumes)", num);
+      break;
+    }
+  }
+}
diff --git a/Graphics/Visibility.h b/Graphics/Visibility.h
index ad9b793b258eb58f0a403beb1a64a40edbd3f310..13be0205ba0d832cba5f907293de51920e4fbc20 100644
--- a/Graphics/Visibility.h
+++ b/Graphics/Visibility.h
@@ -31,5 +31,6 @@ void    SetVisibilitySort(int sort);
 List_T* GetVisibilityList(int type);
 void    ClearVisibilityList(int type);
 void    InitVisibilityThroughPhysical();
+void    SetVisibilityByNumber(char *str, int type, int mode);
 
 #endif
diff --git a/Makefile b/Makefile
index 75a0f76d988a6fea76493a1d973f9a7f4aa38d09..8e6e8aa3cb967251c8cde4673840bac1621b0968 100644
--- a/Makefile
+++ b/Makefile
@@ -1,8 +1,8 @@
-# $Id: Makefile,v 1.176 2001-12-05 09:54:25 geuzaine Exp $
+# $Id: Makefile,v 1.177 2001-12-06 08:10:59 geuzaine Exp $
 
 GMSH_MAJOR_VERSION = 1
 GMSH_MINOR_VERSION = 32
-GMSH_PATCH_VERSION = 0
+GMSH_PATCH_VERSION = 1
 
 MAKE = make
 CXX = c++