diff --git a/Common/Visibility.cpp b/Common/Visibility.cpp
index 0763fc20d176af399691aebdba48e27e8cdcd68e..14792f62f2d0fc488ce8f55d991cfeb36e5fe45c 100644
--- a/Common/Visibility.cpp
+++ b/Common/Visibility.cpp
@@ -1,4 +1,4 @@
-// $Id: Visibility.cpp,v 1.22 2006-11-29 03:11:18 geuzaine Exp $
+// $Id: Visibility.cpp,v 1.23 2006-11-29 16:11:26 geuzaine Exp $
 //
 // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
 //
@@ -189,7 +189,8 @@ std::string VisibilityManager::getStringForGEO()
   return str;
 }
 
-void VisibilityManager::setVisibilityByNumber(int type, int num, int all, bool val)
+void VisibilityManager::setVisibilityByNumber(int type, int num, int all, char val, 
+					      bool recursive)
 {
   switch(type){
   case 0: // nodes
@@ -241,19 +242,19 @@ void VisibilityManager::setVisibilityByNumber(int type, int num, int all, bool v
     break;
   case 2: // point
     for(GModel::viter it = GMODEL->firstVertex(); it != GMODEL->lastVertex(); it++)
-      if(all || (*it)->tag() == num) (*it)->setVisibility(val);
+      if(all || (*it)->tag() == num) (*it)->setVisibility(val, recursive);
     break;
   case 3: // line
     for(GModel::eiter it = GMODEL->firstEdge(); it != GMODEL->lastEdge(); it++)
-      if(all || (*it)->tag() == num) (*it)->setVisibility(val);
+      if(all || (*it)->tag() == num) (*it)->setVisibility(val, recursive);
     break;
   case 4: // surface
     for(GModel::fiter it = GMODEL->firstFace(); it != GMODEL->lastFace(); it++)
-      if(all || (*it)->tag() == num) (*it)->setVisibility(val);
+      if(all || (*it)->tag() == num) (*it)->setVisibility(val, recursive);
     break;
   case 5: // volume
     for(GModel::riter it = GMODEL->firstRegion(); it != GMODEL->lastRegion(); it++)
-      if(all || (*it)->tag() == num) (*it)->setVisibility(val);
+      if(all || (*it)->tag() == num) (*it)->setVisibility(val, recursive);
     break;
   }
 }
diff --git a/Common/Visibility.h b/Common/Visibility.h
index 96bc0c958e7ee90a8ae4ccaf14d1e3335c53a759..9541b46c2f3406884f41c8d2c8c6e03ec964de52 100644
--- a/Common/Visibility.h
+++ b/Common/Visibility.h
@@ -136,7 +136,7 @@ class VisibilityManager {
 
   // set the visibility of one or all entites of a given type (0=node,
   // 1=element, 2=point, 3=line, 4=surface, 5=volume)
-  void setVisibilityByNumber(int type, int num, int all, bool val);
+  void setVisibilityByNumber(int type, int num, int all, char val, bool recursive=false);
 
   // get the tag of the nth entity in the manager
   int getTag(int n){ return _entities[n]->getTag(); }
diff --git a/Fltk/Callbacks.cpp b/Fltk/Callbacks.cpp
index b0edde13d8d63ba31b1389f0b6cc44232a4fd52a..3b6b2f3916b90cd463d24988e41aed408797dba3 100644
--- a/Fltk/Callbacks.cpp
+++ b/Fltk/Callbacks.cpp
@@ -1,4 +1,4 @@
-// $Id: Callbacks.cpp,v 1.486 2006-11-29 04:50:42 geuzaine Exp $
+// $Id: Callbacks.cpp,v 1.487 2006-11-29 16:11:26 geuzaine Exp $
 //
 // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
 //
@@ -2139,8 +2139,9 @@ void visibility_number_cb(CALLBACK_ARGS)
   
   char *str = (char *)WID->vis_input[type]->value();  
   int all = !strcmp(str, "all") || !strcmp(str, "*");
-  int num = all ? 0 : atoi(str); 
-  VisibilityManager::instance()->setVisibilityByNumber(type, num, all, val);
+  int num = all ? 0 : atoi(str);
+  int recursive = WID->vis_butt[0]->value();
+  VisibilityManager::instance()->setVisibilityByNumber(type, num, all, val, recursive);
   int pos = WID->vis_browser->position();
   visibility_cb(NULL, NULL);
   WID->vis_browser->position(pos);
@@ -2159,18 +2160,22 @@ void visibility_hide_cb(CALLBACK_ARGS)
   else if(!strcmp(str, "points")){
     CTX.pick_elements = 0;
     what = ENT_POINT;
+    opt_geometry_points(0, GMSH_SET | GMSH_GUI, 1);
   }
   else if(!strcmp(str, "lines")){
     CTX.pick_elements = 0;
     what = ENT_LINE;
+    opt_geometry_lines(0, GMSH_SET | GMSH_GUI, 1);
   }
   else if(!strcmp(str, "surfaces")){
     CTX.pick_elements = 0;
     what = ENT_SURFACE;
+    opt_geometry_surfaces(0, GMSH_SET | GMSH_GUI, 1);
   }
   else if(!strcmp(str, "volumes")){
     CTX.pick_elements = 0;
     what = ENT_VOLUME;
+    opt_geometry_volumes(0, GMSH_SET | GMSH_GUI, 1);
   }
   else
     return;
@@ -2181,6 +2186,8 @@ void visibility_hide_cb(CALLBACK_ARGS)
   std::vector<GRegion*> regions;
   std::vector<MElement*> elements;
 
+  int recursive = WID->vis_butt[0]->value();
+
   while(1) {
     CTX.mesh.changed = ENT_ALL;
     Draw();
@@ -2195,11 +2202,11 @@ void visibility_hide_cb(CALLBACK_ARGS)
 	for(unsigned int i = 0; i < vertices.size(); i++)
 	  vertices[i]->setVisibility(0);
 	for(unsigned int i = 0; i < edges.size(); i++)
-	  edges[i]->setVisibility(0);
+	  edges[i]->setVisibility(0, recursive);
 	for(unsigned int i = 0; i < faces.size(); i++)
-	  faces[i]->setVisibility(0);
+	  faces[i]->setVisibility(0, recursive);
 	for(unsigned int i = 0; i < regions.size(); i++)
-	  regions[i]->setVisibility(0);
+	  regions[i]->setVisibility(0, recursive);
       }
       int pos = WID->vis_browser->position();
       visibility_cb(NULL, NULL);