diff --git a/Fltk/graphicWindow.cpp b/Fltk/graphicWindow.cpp
index 48e9a0f7c7f64b21b5ab909f280a62d2d2d9488f..aa5b3d4a5e28f84838bee2733cf37f51a262ad6e 100644
--- a/Fltk/graphicWindow.cpp
+++ b/Fltk/graphicWindow.cpp
@@ -1313,30 +1313,42 @@ static void action_point_line_surface_volume(int action, const std::string &what
       drawContext::global()->draw();
     }
     if(ib == 'r') {
-      // FIXME: TODO
+      std::vector<std::pair<int, int> >::iterator it;
       for(unsigned int i = 0; i < FlGui::instance()->selectedVertices.size(); i++){
-        //tag = FlGui::instance()->selectedVertices[i]->tag();
-        //index = List_ISearchSeq(List1, &tag, fcmp_int);
-        //if(index >= 0) List_PSuppress(List1, index);
-        //FlGui::instance()->selectedVertices[i]->setSelection(0);
+        std::pair<int, int> t(0, FlGui::instance()->selectedVertices[i]->tag());
+        it = std::find(dimTags.begin(), dimTags.end(), t);
+        if(it != dimTags.end()){
+          dimTags.erase(it);
+          GEntity *ge = GModel::current()->getEntityByTag(t.first, t.second);
+          if(ge) ge->setSelection(0);
+        }
       }
       for(unsigned int i = 0; i < FlGui::instance()->selectedEdges.size(); i++){
-        //tag = FlGui::instance()->selectedEdges[i]->tag();
-        //index = List_ISearchSeq(List1, &tag, fcmp_int);
-        //if(index >= 0) List_PSuppress(List1, index);
-        //FlGui::instance()->selectedEdges[i]->setSelection(0);
+        std::pair<int, int> t(1, FlGui::instance()->selectedEdges[i]->tag());
+        it = std::find(dimTags.begin(), dimTags.end(), t);
+        if(it != dimTags.end()){
+          dimTags.erase(it);
+          GEntity *ge = GModel::current()->getEntityByTag(t.first, t.second);
+          if(ge) ge->setSelection(0);
+        }
       }
       for(unsigned int i = 0; i < FlGui::instance()->selectedFaces.size(); i++){
-        //tag = FlGui::instance()->selectedFaces[i]->tag();
-        //index = List_ISearchSeq(List1, &tag, fcmp_int);
-        //if(index >= 0) List_PSuppress(List1, index);
-        //FlGui::instance()->selectedFaces[i]->setSelection(0);
+        std::pair<int, int> t(2, FlGui::instance()->selectedFaces[i]->tag());
+        it = std::find(dimTags.begin(), dimTags.end(), t);
+        if(it != dimTags.end()){
+          dimTags.erase(it);
+          GEntity *ge = GModel::current()->getEntityByTag(t.first, t.second);
+          if(ge) ge->setSelection(0);
+        }
       }
       for(unsigned int i = 0; i < FlGui::instance()->selectedRegions.size(); i++){
-        //tag = FlGui::instance()->selectedRegions[i]->tag();
-        //index = List_ISearchSeq(List1, &tag, fcmp_int);
-        //if(index >= 0) List_PSuppress(List1, index);
-        //FlGui::instance()->selectedRegions[i]->setSelection(0);
+        std::pair<int, int> t(3, FlGui::instance()->selectedRegions[i]->tag());
+        it = std::find(dimTags.begin(), dimTags.end(), t);
+        if(it != dimTags.end()){
+          dimTags.erase(it);
+          GEntity *ge = GModel::current()->getEntityByTag(t.first, t.second);
+          if(ge) ge->setSelection(0);
+        }
       }
       drawContext::global()->draw();
     }
@@ -1406,7 +1418,8 @@ static void action_point_line_surface_volume(int action, const std::string &what
                   FlGui::instance()->transformContext->input[9]->value());
           break;
         case 6:
-          delete_entities(GModel::current()->getFileName(), dimTags);
+          delete_entities(GModel::current()->getFileName(), dimTags,
+                          FlGui::instance()->transformContext->butt[6]->value());
           break;
         case 7:
         case 11:
@@ -1586,7 +1599,7 @@ static void geometry_elementary_boolean_cb(Fl_Widget *w, void *data)
       }
     }
     if(ib == 'r') {
-      Msg::Warning("Entity de-selection not implemented yet in boolean operations");
+      Msg::Warning("Entity de-selection not supported yet during boolean operation");
     }
     if(ib == 'u') {
       if(selectObject && object.size()){
diff --git a/Geo/GeoStringInterface.cpp b/Geo/GeoStringInterface.cpp
index 71ef6c8e87df9828facf4f765295b724c2e5409d..1323e1aab52f5821b72e26741ead253d1dac5794 100644
--- a/Geo/GeoStringInterface.cpp
+++ b/Geo/GeoStringInterface.cpp
@@ -675,9 +675,10 @@ void coherence(const std::string &fileName)
 }
 
 void delete_entities(const std::string &fileName,
-                     const std::vector<std::pair<int, int> > &l)
+                     const std::vector<std::pair<int, int> > &l, bool recursive)
 {
   std::ostringstream sstream;
+  if(recursive) sstream << "Recursive ";
   sstream << "Delete {\n  " << dimTags2String(l) << "\n}";
   add_infile(sstream.str(), fileName);
 }
diff --git a/Geo/GeoStringInterface.h b/Geo/GeoStringInterface.h
index c28573e9bd380d1c067d737757c141066b754bdd..9e41ceda06d2dbf9a6ccabbfd3060ce0b557e4d7 100644
--- a/Geo/GeoStringInterface.h
+++ b/Geo/GeoStringInterface.h
@@ -103,6 +103,7 @@ void apply_boolean(const std::string &fileName, const std::string &op,
                    int deleteObject, int deleteTool);
 void coherence(const std::string &fileName);
 void delete_entities(const std::string &fileName,
-                     const std::vector<std::pair<int, int> > &l);
+                     const std::vector<std::pair<int, int> > &l,
+                     bool recursive);
 
 #endif