diff --git a/Common/Visibility.cpp b/Common/Visibility.cpp
index e6bad0349546f1de570e1a76281c3470125b5c51..548421192700a1db81820ea63c0f6c6bce6ed161 100644
--- a/Common/Visibility.cpp
+++ b/Common/Visibility.cpp
@@ -1,4 +1,4 @@
-// $Id: Visibility.cpp,v 1.24 2006-11-29 20:40:46 geuzaine Exp $
+// $Id: Visibility.cpp,v 1.25 2006-11-30 01:06:07 geuzaine Exp $
 //
 // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
 //
@@ -258,10 +258,19 @@ void VisibilityManager::setVisibilityByNumber(int type, int num, char val, bool
       if(all || (*it)->tag() == num) (*it)->setVisibility(val, recursive);
     break;
   case 6: // physical point
+    for(GModel::viter it = GMODEL->firstVertex(); it != GMODEL->lastVertex(); it++)
+      for(unsigned int i = 0; i < (*it)->physicals.size(); i++)
+	if (all || (*it)->physicals[i] == num) (*it)->setVisibility(val, recursive);
     break;
   case 7: // physical line
+    for(GModel::eiter it = GMODEL->firstEdge(); it != GMODEL->lastEdge(); it++)
+      for(unsigned int i = 0; i < (*it)->physicals.size(); i++)
+	if (all || (*it)->physicals[i] == num) (*it)->setVisibility(val, recursive);
     break;
   case 8: // physical surface
+    for(GModel::fiter it = GMODEL->firstFace(); it != GMODEL->lastFace(); it++)
+      for(unsigned int i = 0; i < (*it)->physicals.size(); i++)
+	if (all || (*it)->physicals[i] == num) (*it)->setVisibility(val, recursive);
     break;
   case 9: // physical volume
     for(GModel::riter it = GMODEL->firstRegion(); it != GMODEL->lastRegion(); it++)
diff --git a/Fltk/Callbacks.cpp b/Fltk/Callbacks.cpp
index 14903e10a773e3d5c8c96717e1a6912ba0ad615c..f1719c11b8673a958ebbed1f54bcc77e42261d1e 100644
--- a/Fltk/Callbacks.cpp
+++ b/Fltk/Callbacks.cpp
@@ -1,4 +1,4 @@
-// $Id: Callbacks.cpp,v 1.488 2006-11-29 20:40:46 geuzaine Exp $
+// $Id: Callbacks.cpp,v 1.489 2006-11-30 01:06:07 geuzaine Exp $
 //
 // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
 //
@@ -2163,7 +2163,7 @@ void visibility_number_cb(CALLBACK_ARGS)
   Draw();
 }
 
-void visibility_hide_cb(CALLBACK_ARGS)
+void visibility_interactive_cb(CALLBACK_ARGS)
 {
   char *str = (char*)data;
   int what;
@@ -2201,27 +2201,53 @@ 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();
     Msg(ONSCREEN, "Select %s\n[Press 'q' to abort]", str);
     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();
       if(CTX.pick_elements){
 	for(unsigned int i = 0; i < elements.size(); i++)
 	  elements[i]->setVisibility(0);
       }
       else{
-	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, recursive);
-	for(unsigned int i = 0; i < faces.size(); i++)
-	  faces[i]->setVisibility(0, recursive);
-	for(unsigned int i = 0; i < regions.size(); i++)
-	  regions[i]->setVisibility(0, recursive);
+	for(unsigned int i = 0; i < vertices.size(); i++){
+	  if(type == 0) // hide elementary entity
+	    vertices[i]->setVisibility(0, recursive);
+	  else // hide physical entity
+	    for(unsigned int j = 0; j < vertices[i]->physicals.size(); j++)
+	      VisibilityManager::instance()->setVisibilityByNumber
+		(6, vertices[i]->physicals[j], 0, recursive);
+	}
+	for(unsigned int i = 0; i < edges.size(); i++){
+	  if(type == 0)
+	    edges[i]->setVisibility(0, recursive);
+	  else
+	    for(unsigned int j = 0; j < edges[i]->physicals.size(); j++)
+	      VisibilityManager::instance()->setVisibilityByNumber
+		(7, edges[i]->physicals[j], 0, recursive);
+	}
+	for(unsigned int i = 0; i < faces.size(); i++){
+	  if(type == 0)
+	    faces[i]->setVisibility(0, recursive);
+	  else
+	    for(unsigned int j = 0; j < faces[i]->physicals.size(); j++)
+	      VisibilityManager::instance()->setVisibilityByNumber
+		(8, faces[i]->physicals[j], 0, recursive);
+	}
+	for(unsigned int i = 0; i < regions.size(); i++){
+	  if(type == 0)
+	    regions[i]->setVisibility(0, recursive);
+	  else
+	    for(unsigned int j = 0; j < regions[i]->physicals.size(); j++)
+	      VisibilityManager::instance()->setVisibilityByNumber
+		(9, regions[i]->physicals[j], 0, recursive);
+	}
       }
       int pos = WID->vis_browser->position();
       visibility_cb(NULL, NULL);
diff --git a/Fltk/Callbacks.h b/Fltk/Callbacks.h
index 0b9a01233232a27edb1d4dad00eb02f0ec2aad0a..5abd6bbcc4d92cea2414c04ea93fd0b32ef88ecb 100644
--- a/Fltk/Callbacks.h
+++ b/Fltk/Callbacks.h
@@ -153,7 +153,7 @@ void message_save_cb(CALLBACK_ARGS);
 void visibility_cb(CALLBACK_ARGS);
 void visibility_sort_cb(CALLBACK_ARGS);
 void visibility_number_cb(CALLBACK_ARGS);
-void visibility_hide_cb(CALLBACK_ARGS);
+void visibility_interactive_cb(CALLBACK_ARGS);
 void visibility_ok_cb(CALLBACK_ARGS);
 void visibility_save_cb(CALLBACK_ARGS);
 void visibility_delete_cb(CALLBACK_ARGS);
diff --git a/Fltk/GUI.cpp b/Fltk/GUI.cpp
index e7768cca03cc2946917dd78a3056e90285a32faa..34da9e609d1275b03a5a8cfb89dca43f43bd6623 100644
--- a/Fltk/GUI.cpp
+++ b/Fltk/GUI.cpp
@@ -1,4 +1,4 @@
-// $Id: GUI.cpp,v 1.571 2006-11-29 20:40:46 geuzaine Exp $
+// $Id: GUI.cpp,v 1.572 2006-11-30 01:06:07 geuzaine Exp $
 //
 // Copyright (C) 1997-2007 C. Geuzaine, J.-F. Remacle
 //
@@ -4015,15 +4015,15 @@ 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_hide_cb, (void *)"elements");
+    butt1->callback(visibility_interactive_cb, (void *)"elements");
     Fl_Button *butt2 = new Fl_Button(2*WB, 3 * WB + 4 * BH, IW, BH, "Points");
-    butt2->callback(visibility_hide_cb, (void *)"points");
+    butt2->callback(visibility_interactive_cb, (void *)"points");
     Fl_Button *butt3 = new Fl_Button(2*WB, 3 * WB + 5 * BH, IW, BH, "Lines");
-    butt3->callback(visibility_hide_cb, (void *)"lines");
+    butt3->callback(visibility_interactive_cb, (void *)"lines");
     Fl_Button *butt4 = new Fl_Button(2*WB, 3 * WB + 6 * BH, IW, BH, "Surfaces");
-    butt4->callback(visibility_hide_cb, (void *)"surfaces");
+    butt4->callback(visibility_interactive_cb, (void *)"surfaces");
     Fl_Button *butt5 = new Fl_Button(2*WB, 3 * WB + 7 * BH, IW, BH, "Volumes");
-    butt5->callback(visibility_hide_cb, (void *)"volumes");
+    butt5->callback(visibility_interactive_cb, (void *)"volumes");
     
     vis_group[2]->end();
   }