diff --git a/Fltk/Callbacks.cpp b/Fltk/Callbacks.cpp
index 474e3a1b3023b64026bb3a05b13c8ba239d7e27c..31c6dbe450d266d47af2fb04f78dbb6d08e1eb3b 100644
--- a/Fltk/Callbacks.cpp
+++ b/Fltk/Callbacks.cpp
@@ -1,4 +1,4 @@
-// $Id: Callbacks.cpp,v 1.491 2006-12-01 14:32:29 geuzaine Exp $
+// $Id: Callbacks.cpp,v 1.492 2006-12-03 04:00:18 geuzaine Exp $
 //
 // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
 //
@@ -2032,12 +2032,12 @@ void visibility_ok_cb(CALLBACK_ARGS)
   // browser and apply them into the model
   if(VisibilityManager::instance()->getNumEntities()){
     CTX.mesh.changed = ENT_LINE | ENT_SURFACE | ENT_VOLUME;
-    int recursive = WID->vis_butt[0]->value();
+    bool recursive = WID->vis_butt[0]->value() ? true : false;
     int type = WID->vis_type->value();
     VisibilityManager::instance()->setAllInvisible(type);
     for(int i = 0; i < VisibilityManager::instance()->getNumEntities(); i++)
       if(WID->vis_browser->selected(i + 1))
-	VisibilityManager::instance()->setVisibility(i, true, recursive);
+	VisibilityManager::instance()->setVisibility(i, 1, recursive);
     // then refresh the browser to account for recursive selections
     for(int i = 0; i < VisibilityManager::instance()->getNumEntities(); i++)
       if(VisibilityManager::instance()->getVisibility(i))
@@ -2133,19 +2133,19 @@ void visibility_number_cb(CALLBACK_ARGS)
   // physical lines, 8 for physical surfaces and 9 for physical
   // volumes
   int what = (int)(long)data;
-  bool val;
+  char val;
   if(what >= 100){ // show
-    val = true;
+    val = 1;
     what -= 100;
   }
   else{ // hide
-    val = false;
+    val = 0;
   }
   char *str = (char *)WID->vis_input[what]->value();
   if(type == 1 && what >= 2 && what <= 5) what += 4;
 
   int num = (!strcmp(str, "all") || !strcmp(str, "*")) ? -1 : atoi(str);
-  int recursive = WID->vis_butt[0]->value();
+  bool recursive = WID->vis_butt[0]->value() ? true : false;
   
   VisibilityManager::instance()->setVisibilityByNumber(what, num, val, recursive);
 
@@ -2159,34 +2159,69 @@ void visibility_interactive_cb(CALLBACK_ARGS)
 {
   char *str = (char*)data;
   int what;
+  char mode;
 
-  if(!strcmp(str, "elements")){
+  if(!strcmp(str, "hide_elements")){
     CTX.pick_elements = 1;
     what = ENT_ALL;
+    mode = 0;
   }
-  else if(!strcmp(str, "points")){
+  else if(!strcmp(str, "hide_points")){
     CTX.pick_elements = 0;
     what = ENT_POINT;
+    mode = 0;
     opt_geometry_points(0, GMSH_SET | GMSH_GUI, 1);
   }
-  else if(!strcmp(str, "lines")){
+  else if(!strcmp(str, "hide_lines")){
     CTX.pick_elements = 0;
     what = ENT_LINE;
+    mode = 0;
     opt_geometry_lines(0, GMSH_SET | GMSH_GUI, 1);
   }
-  else if(!strcmp(str, "surfaces")){
+  else if(!strcmp(str, "hide_surfaces")){
     CTX.pick_elements = 0;
     what = ENT_SURFACE;
+    mode = 0;
     opt_geometry_surfaces(0, GMSH_SET | GMSH_GUI, 1);
   }
-  else if(!strcmp(str, "volumes")){
+  else if(!strcmp(str, "hide_volumes")){
+    CTX.pick_elements = 0;
+    what = ENT_VOLUME;
+    mode = 0;
+    opt_geometry_volumes(0, GMSH_SET | GMSH_GUI, 1);
+  }
+  else if(!strcmp(str, "show_elements")){
+    CTX.pick_elements = 1;
+    what = ENT_ALL;
+    mode = 1;
+  }
+  else if(!strcmp(str, "show_points")){
+    CTX.pick_elements = 0;
+    what = ENT_POINT;
+    mode = 1;
+    opt_geometry_points(0, GMSH_SET | GMSH_GUI, 1);
+  }
+  else if(!strcmp(str, "show_lines")){
+    CTX.pick_elements = 0;
+    what = ENT_LINE;
+    mode = 1;
+    opt_geometry_lines(0, GMSH_SET | GMSH_GUI, 1);
+  }
+  else if(!strcmp(str, "show_surfaces")){
+    CTX.pick_elements = 0;
+    what = ENT_SURFACE;
+    mode = 1;
+    opt_geometry_surfaces(0, GMSH_SET | GMSH_GUI, 1);
+  }
+  else if(!strcmp(str, "show_volumes")){
     CTX.pick_elements = 0;
     what = ENT_VOLUME;
+    mode = 1;
     opt_geometry_volumes(0, GMSH_SET | GMSH_GUI, 1);
   }
   else if(!strcmp(str, "show_all")){
     for(int i = 1; i <= 5; i++) // elements, points, lines, surfaces, volumes
-      VisibilityManager::instance()->setVisibilityByNumber(i, -1, true, false);
+      VisibilityManager::instance()->setVisibilityByNumber(i, -1, 1, false);
     CTX.mesh.changed = ENT_ALL;
     Draw();  
     return;
@@ -2203,49 +2238,60 @@ void visibility_interactive_cb(CALLBACK_ARGS)
   while(1) {
     CTX.mesh.changed = ENT_ALL;
     Draw();
-    Msg(ONSCREEN, "Select %s\n[Press 'q' to abort]", str);
+    Msg(ONSCREEN, "Select %s to %s\n[Press 'q' to abort]", 
+	str, mode ? "show (exclusively)" : "hide");
+
     char ib = SelectEntity(what, vertices, edges, faces, regions, elements);
     if(ib == 'l') {
       // type = 0 for elementary, 1 for physical and 2 for partitions
       int type = WID->vis_type->value();
       if(type != 0 && type != 1) break;
-      int recursive = WID->vis_butt[0]->value();
+      bool recursive = WID->vis_butt[0]->value() ? true : false;
+
+      if(mode == 1){ // first hide everything
+	if(CTX.pick_elements)
+	  VisibilityManager::instance()->setVisibilityByNumber(1, -1, 0, false);
+	else
+	  for(int i = 2; i <= 5; i++)
+	    VisibilityManager::instance()->setVisibilityByNumber(i, -1, 0, false);
+      }
+
       if(CTX.pick_elements){
 	for(unsigned int i = 0; i < elements.size(); i++)
-	  elements[i]->setVisibility(0);
+	  elements[i]->setVisibility(mode);
       }
       else{
 	for(unsigned int i = 0; i < vertices.size(); i++){
-	  if(type == 0) // hide elementary entity
-	    vertices[i]->setVisibility(0, recursive);
-	  else // hide physical entity
+	  if(type == 0)
+	    vertices[i]->setVisibility(mode, recursive);
+	  else
 	    for(unsigned int j = 0; j < vertices[i]->physicals.size(); j++)
 	      VisibilityManager::instance()->setVisibilityByNumber
-		(6, vertices[i]->physicals[j], 0, recursive);
+		(6, vertices[i]->physicals[j], mode, recursive);
 	}
 	for(unsigned int i = 0; i < edges.size(); i++){
 	  if(type == 0)
-	    edges[i]->setVisibility(0, recursive);
+	    edges[i]->setVisibility(mode, recursive);
 	  else
 	    for(unsigned int j = 0; j < edges[i]->physicals.size(); j++)
 	      VisibilityManager::instance()->setVisibilityByNumber
-		(7, edges[i]->physicals[j], 0, recursive);
+		(7, edges[i]->physicals[j], mode, recursive);
 	}
 	for(unsigned int i = 0; i < faces.size(); i++){
 	  if(type == 0)
-	    faces[i]->setVisibility(0, recursive);
+	    faces[i]->setVisibility(mode, recursive);
 	  else
 	    for(unsigned int j = 0; j < faces[i]->physicals.size(); j++)
 	      VisibilityManager::instance()->setVisibilityByNumber
-		(8, faces[i]->physicals[j], 0, recursive);
+		(8, faces[i]->physicals[j], mode, recursive);
 	}
 	for(unsigned int i = 0; i < regions.size(); i++){
 	  if(type == 0)
-	    regions[i]->setVisibility(0, recursive);
+	    regions[i]->setVisibility(mode, recursive);
 	  else
 	    for(unsigned int j = 0; j < regions[i]->physicals.size(); j++)
 	      VisibilityManager::instance()->setVisibilityByNumber
-		(9, regions[i]->physicals[j], 0, recursive);
+		(9, regions[i]->physicals[j], mode, recursive);
 	}
       }
       int pos = WID->vis_browser->position();
diff --git a/Fltk/GUI.cpp b/Fltk/GUI.cpp
index 9b5dc557aa1c3524c5255384538798bd36b38d3c..a2115bc8dc39b7618e8169d03a236584deef2af6 100644
--- a/Fltk/GUI.cpp
+++ b/Fltk/GUI.cpp
@@ -1,4 +1,4 @@
-// $Id: GUI.cpp,v 1.577 2006-12-01 14:32:29 geuzaine Exp $
+// $Id: GUI.cpp,v 1.578 2006-12-03 04:00:18 geuzaine Exp $
 //
 // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
 //
@@ -3951,18 +3951,34 @@ void GUI::create_visibility_window()
     b2->align(FL_ALIGN_INSIDE|FL_ALIGN_LEFT);
 
     Fl_Button *butt1 = new Fl_Button(2*WB, 3 * WB + 3 * BH, IW, BH, "Elements");
-    butt1->callback(visibility_interactive_cb, (void *)"elements");
+    butt1->callback(visibility_interactive_cb, (void *)"hide_elements");
     Fl_Button *butt2 = new Fl_Button(2*WB, 3 * WB + 4 * BH, IW, BH, "Points");
-    butt2->callback(visibility_interactive_cb, (void *)"points");
+    butt2->callback(visibility_interactive_cb, (void *)"hide_points");
     Fl_Button *butt3 = new Fl_Button(2*WB, 3 * WB + 5 * BH, IW, BH, "Lines");
-    butt3->callback(visibility_interactive_cb, (void *)"lines");
+    butt3->callback(visibility_interactive_cb, (void *)"hide_lines");
     Fl_Button *butt4 = new Fl_Button(2*WB, 3 * WB + 6 * BH, IW, BH, "Surfaces");
-    butt4->callback(visibility_interactive_cb, (void *)"surfaces");
+    butt4->callback(visibility_interactive_cb, (void *)"hide_surfaces");
     Fl_Button *butt5 = new Fl_Button(2*WB, 3 * WB + 7 * BH, IW, BH, "Volumes");
-    butt5->callback(visibility_interactive_cb, (void *)"volumes");
+    butt5->callback(visibility_interactive_cb, (void *)"hide_volumes");
 
     Fl_Button *butt6 = new Fl_Button(3*WB + IW, 3 * WB + 3 * BH, 2 * BH, 5*BH, "Show\nAll");
     butt6->callback(visibility_interactive_cb, (void *)"show_all");
+
+    int ww = 4*WB + IW + 2*BH;
+
+    Fl_Box *b12 = new Fl_Box(FL_NO_BOX, ww, 3 * WB + 2 * BH, brw, BH, "Show with the mouse:");
+    b12->align(FL_ALIGN_INSIDE|FL_ALIGN_LEFT);
+
+    Fl_Button *butt11 = new Fl_Button(ww, 3 * WB + 3 * BH, IW, BH, "Elements");
+    butt11->callback(visibility_interactive_cb, (void *)"show_elements");
+    Fl_Button *butt12 = new Fl_Button(ww, 3 * WB + 4 * BH, IW, BH, "Points");
+    butt12->callback(visibility_interactive_cb, (void *)"show_points");
+    Fl_Button *butt13 = new Fl_Button(ww, 3 * WB + 5 * BH, IW, BH, "Lines");
+    butt13->callback(visibility_interactive_cb, (void *)"show_lines");
+    Fl_Button *butt14 = new Fl_Button(ww, 3 * WB + 6 * BH, IW, BH, "Surfaces");
+    butt14->callback(visibility_interactive_cb, (void *)"show_surfaces");
+    Fl_Button *butt15 = new Fl_Button(ww, 3 * WB + 7 * BH, IW, BH, "Volumes");
+    butt15->callback(visibility_interactive_cb, (void *)"show_volumes");
     
     vis_group[2]->end();
   }