diff --git a/Fltk/Callbacks.cpp b/Fltk/Callbacks.cpp
index 5f7eecdb5e4df51022af7e480fcdddb4509086e5..749e3b38462121b1f9bd0ad4d69fa39518fdd49e 100644
--- a/Fltk/Callbacks.cpp
+++ b/Fltk/Callbacks.cpp
@@ -1,4 +1,4 @@
-// $Id: Callbacks.cpp,v 1.471 2006-11-04 15:21:32 geuzaine Exp $
+// $Id: Callbacks.cpp,v 1.472 2006-11-05 18:02:59 geuzaine Exp $
 //
 // Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
@@ -3516,46 +3516,70 @@ void mesh_delete_cb(CALLBACK_ARGS)
 void mesh_delete_parts_cb(CALLBACK_ARGS)
 {
   char *str = (char*)data;
+  int what;
 
-  if(!strcmp(str, "elements"))
+  if(!strcmp(str, "elements")){
     CTX.pick_elements = 1;
-  else
+    what = ENT_ALL;
+  }
+  else if(!strcmp(str, "lines")){
     CTX.pick_elements = 0;
-  CTX.mesh.changed = ENT_ALL;
+    what = ENT_LINE;
+  }
+  else if(!strcmp(str, "surfaces")){
+    CTX.pick_elements = 0;
+    what = ENT_SURFACE;
+  }
+  else if(!strcmp(str, "volumes")){
+    CTX.pick_elements = 0;
+    what = ENT_VOLUME;
+  }
+  else
+    return;
 
   std::vector<GVertex*> vertices;
   std::vector<GEdge*> edges;
-  std::vector<GFace*> faces, fac;
+  std::vector<GFace*> faces;
   std::vector<GRegion*> regions;
-  std::vector<MElement*> elements, ele;
+  std::vector<MElement*> elements;
+
+  std::vector<MElement*> ele;
+  std::vector<GEntity*> ent;
 
   while(1) {
-    if(CTX.pick_elements) CTX.mesh.changed = ENT_ALL;
+    CTX.mesh.changed = ENT_ALL;
     Draw();
 
-    if(ele.size() || fac.size())
+    if(ele.size() || ent.size())
       Msg(ONSCREEN, "Select %s\n"
 	  "[Press 'e' to end selection, 'u' to undo last selection or 'q' to abort]", str);
     else
       Msg(ONSCREEN, "Select %s\n"
 	  "[Press 'e' to end selection or 'q' to abort]", str);
 
-    char ib = SelectEntity(CTX.pick_elements ? ENT_ALL : ENT_SURFACE, 
-			   vertices, edges, faces, regions, elements);
+    char ib = SelectEntity(what, vertices, edges, faces, regions, elements);
     if(ib == 'l') {
       if(CTX.pick_elements){
 	for(unsigned int i = 0; i < elements.size(); i++){
 	  if(elements[i]->getVisibility() != 2){
-	    elements[i]->setVisibility(2);
-	    ele.push_back(elements[i]);
+	    elements[i]->setVisibility(2); ele.push_back(elements[i]);
 	  }
 	}
       }
       else{
+	for(unsigned int i = 0; i < edges.size(); i++){
+	  if(edges[i]->getSelection() != 1){
+	    edges[i]->setSelection(1); ent.push_back(edges[i]);
+	  }
+	}
 	for(unsigned int i = 0; i < faces.size(); i++){
 	  if(faces[i]->getSelection() != 1){
-	    faces[i]->setSelection(1);
-	    fac.push_back(faces[i]);
+	    faces[i]->setSelection(1); ent.push_back(faces[i]);
+	  }
+	}
+	for(unsigned int i = 0; i < regions.size(); i++){
+	  if(regions[i]->getSelection() != 1){
+	    regions[i]->setSelection(1); ent.push_back(regions[i]);
 	  }
 	}
       }
@@ -3566,8 +3590,12 @@ void mesh_delete_parts_cb(CALLBACK_ARGS)
 	  elements[i]->setVisibility(1);
       }
       else{
+	for(unsigned int i = 0; i < edges.size(); i++)
+	  edges[i]->setSelection(0);
 	for(unsigned int i = 0; i < faces.size(); i++)
 	  faces[i]->setSelection(0);
+	for(unsigned int i = 0; i < regions.size(); i++)
+	  regions[i]->setSelection(0);
       }
     }
     if(ib == 'u') {
@@ -3578,9 +3606,9 @@ void mesh_delete_parts_cb(CALLBACK_ARGS)
 	}
       }
       else{
-	if(fac.size()){
-	  fac[fac.size() - 1]->setSelection(0);
-	  fac.pop_back();
+	if(ent.size()){
+	  ent[ent.size() - 1]->setSelection(0);
+	  ent.pop_back();
 	}
       }
     }
@@ -3590,12 +3618,12 @@ void mesh_delete_parts_cb(CALLBACK_ARGS)
 	  if(ele[i]->getVisibility() == 2) ele[i]->setVisibility(0);
       }
       else{
-	for(unsigned int i = 0; i < fac.size(); i++)
-	  if(fac[i]->getSelection() == 1) fac[i]->setVisibility(0);
+	for(unsigned int i = 0; i < ent.size(); i++)
+	  if(ent[i]->getSelection() == 1) ent[i]->setVisibility(0);
       }
-      GMODEL->removeInvisible();
+      GMODEL->removeInvisibleElements();
       ele.clear();
-      fac.clear();
+      ent.clear();
     }
     if(ib == 'q') {
       ZeroHighlight();
@@ -3603,8 +3631,8 @@ void mesh_delete_parts_cb(CALLBACK_ARGS)
     }
   }
 
-  CTX.pick_elements = 0;
   CTX.mesh.changed = ENT_ALL;
+  CTX.pick_elements = 0;
   Draw();  
   Msg(ONSCREEN, "");
 }
diff --git a/Fltk/GUI.cpp b/Fltk/GUI.cpp
index 17f7ff5f08a5c7b51d35f3b2bf078aead31f8783..9aab3e8223dd3147ad524cd419b763220e86236e 100644
--- a/Fltk/GUI.cpp
+++ b/Fltk/GUI.cpp
@@ -1,4 +1,4 @@
-// $Id: GUI.cpp,v 1.559 2006-11-04 15:21:32 geuzaine Exp $
+// $Id: GUI.cpp,v 1.560 2006-11-05 18:02:59 geuzaine Exp $
 //
 // Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
@@ -346,7 +346,9 @@ Context_Item menu_mesh[] = {
         Context_Item menu_mesh_delete[] = {
           {"1Mesh>Edit>Delete", NULL} ,
           {"Elements", (Fl_Callback *)mesh_delete_parts_cb, (void*)"elements"} ,
+          {"Lines",    (Fl_Callback *)mesh_delete_parts_cb, (void*)"lines"} ,
           {"Surfaces", (Fl_Callback *)mesh_delete_parts_cb, (void*)"surfaces"} ,
+          {"Volumes",  (Fl_Callback *)mesh_delete_parts_cb, (void*)"volumes"} ,
           {0} 
         };  
     Context_Item menu_mesh_define[] = {
diff --git a/Geo/GModel.cpp b/Geo/GModel.cpp
index ce5f393cd01249b3045268e5efbdf9e7663e78a9..4c430b0337bfe20530e1aa0925b9695ce8a98dc5 100644
--- a/Geo/GModel.cpp
+++ b/Geo/GModel.cpp
@@ -1,4 +1,4 @@
-// $Id: GModel.cpp,v 1.20 2006-11-03 00:41:15 geuzaine Exp $
+// $Id: GModel.cpp,v 1.21 2006-11-05 18:03:00 geuzaine Exp $
 //
 // Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
@@ -20,6 +20,7 @@
 // Please report all bugs and problems to <gmsh@geuz.org>.
 
 #include "GModel.h"
+#include "MRep.h"
 
 void GModel::destroy()
 {
@@ -82,56 +83,40 @@ GVertex * GModel::vertexByTag(int n) const
 }
 
 template <class T>
-static void removeInvisibleElements(std::vector<T*> &elements)
+static void removeInvisible(std::vector<T*> &elements, bool all)
 {
   std::vector<T*> tmp;
   for(unsigned int i = 0; i < elements.size(); i++){
-    if(elements[i]->getVisibility()) 
-      tmp.push_back(elements[i]);
-    else
+    if(all || !elements[i]->getVisibility()) 
       delete elements[i];
+    else
+      tmp.push_back(elements[i]);
   }
-  if(tmp.size() < elements.size()){
-    elements.clear();
-    elements = tmp;
-  }
+  elements.clear();
+  elements = tmp;
 }
 
-void GModel::removeInvisible()
+void GModel::removeInvisibleElements()
 {
   for(riter it = firstRegion(); it != lastRegion(); ++it){
-    removeInvisibleElements((*it)->tetrahedra);
-    removeInvisibleElements((*it)->hexahedra);
-    removeInvisibleElements((*it)->prisms);
-    removeInvisibleElements((*it)->pyramids);
+    bool all = !(*it)->getVisibility(); 
+    removeInvisible((*it)->tetrahedra, all);
+    removeInvisible((*it)->hexahedra, all);
+    removeInvisible((*it)->prisms, all);
+    removeInvisible((*it)->pyramids, all);
+    if((*it)->meshRep) (*it)->meshRep->destroy();
   }
   for(fiter it = firstFace(); it != lastFace(); ++it){
-    removeInvisibleElements((*it)->triangles);
-    removeInvisibleElements((*it)->quadrangles);
+    bool all = !(*it)->getVisibility(); 
+    removeInvisible((*it)->triangles, all);
+    removeInvisible((*it)->quadrangles, all);
+    if((*it)->meshRep) (*it)->meshRep->destroy();
   }
   for(eiter it = firstEdge(); it != lastEdge(); ++it){
-    removeInvisibleElements((*it)->lines);
+    bool all = !(*it)->getVisibility(); 
+    removeInvisible((*it)->lines, all);
+    if((*it)->meshRep) (*it)->meshRep->destroy();
   }
-
-  std::vector<GRegion*> r;
-  for(riter it = firstRegion(); it != lastRegion(); ++it)
-    if(!(*it)->getVisibility()) r.push_back(*it);
-  for(unsigned int i = 0; i < r.size(); i++){ remove(r[i]); delete r[i]; }
-
-  std::vector<GFace*> f;
-  for(fiter it = firstFace(); it != lastFace(); ++it)
-    if(!(*it)->getVisibility()) f.push_back(*it);
-  for(unsigned int i = 0; i < f.size(); i++){ remove(f[i]); delete f[i]; }
-
-  std::vector<GEdge*> e;
-  for(eiter it = firstEdge(); it != lastEdge(); ++it)
-    if(!(*it)->getVisibility()) e.push_back(*it);
-  for(unsigned int i = 0; i < e.size(); i++){ remove(e[i]); delete e[i]; }
-
-  std::vector<GVertex*> v;
-  for(viter it = firstVertex(); it != lastVertex(); ++it)
-    if(!(*it)->getVisibility()) v.push_back(*it);
-  for(unsigned int i = 0; i < v.size(); i++){ remove(v[i]); delete v[i]; }
 }
 
 int GModel::renumberMeshVertices()
diff --git a/Geo/GModel.h b/Geo/GModel.h
index ffcf7ee62b6dd0ee945b071cb8e1d7a9568a194b..b2809b01fa825e0d814947f44b19ea8bcd2d275c 100644
--- a/Geo/GModel.h
+++ b/Geo/GModel.h
@@ -91,12 +91,12 @@ class GModel
   void remove(GEdge *e) { edges.erase(std::find(firstEdge(), lastEdge(), e)); }
   void remove(GVertex *v) { vertices.erase(std::find(firstVertex(), lastVertex(), v)); }
 
-  // Deletes all invisble entities and mesh elements
-  void removeInvisible();
-
   // Renumber all the mesh vertices in a continuous sequence
   int renumberMeshVertices();
 
+  // Deletes all invisble mesh elements
+  void removeInvisibleElements();
+
   // Checks if there are no physical entities in the model
   bool noPhysicalGroups();