diff --git a/Fltk/graphicWindow.cpp b/Fltk/graphicWindow.cpp
index e6455ed60ce15b7424ad5b83d67de4d0facaea1b..64dbf1d4176a94c5b481d0d7eb37300a49f11666 100644
--- a/Fltk/graphicWindow.cpp
+++ b/Fltk/graphicWindow.cpp
@@ -2352,7 +2352,113 @@ static void mesh_define_transfinite_volume_cb(Fl_Widget *w, void *data)
 
 static void mesh_define_embedded_cb(Fl_Widget *w, void *data)
 {
-  // TODO
+  if(!data) return;
+  std::string what((const char*)data);
+  std::vector<int> entities;
+  bool selectEntities = true;
+
+  int type; const char *str = "";
+  if(what == "Surface"){
+    type = ENT_SURFACE; str = "surfaces";
+    opt_geometry_surfaces(0, GMSH_SET | GMSH_GUI, 1);
+  }
+  else if(what == "Line"){
+    type = ENT_LINE; str = "lines";
+    opt_geometry_lines(0, GMSH_SET | GMSH_GUI, 1);
+  }
+  else if(what == "Point"){
+    type = ENT_POINT; str = "points";
+    opt_geometry_points(0, GMSH_SET | GMSH_GUI, 1);
+  }
+  else{
+    Msg::Error("Unknown type of entity to embed: %s", what.c_str());
+    return;
+  }
+  while(1) {
+    if(entities.empty())
+      Msg::StatusGl("Select %s\n"
+                    "[Press 'e' to end selection or 'q' to abort]", str);
+    else if(selectEntities)
+      Msg::StatusGl("Select %s\n"
+                    "[Press 'e' to end selection, 'u' to undo last selection or "
+                    "'q' to abort]", str);
+    else
+      Msg::StatusGl("Select entity in which to embed the %s\n"
+                    "[Press 'e' to end selection or 'q' to abort]", str);
+    int t = type;
+    if(!selectEntities){
+      switch(FlGui::instance()->transformContext->choice->value()){
+      case 2: t = ENT_LINE; break;
+      case 3: t = ENT_SURFACE; break;
+      case 4: t = ENT_VOLUME; break;
+      default: t = ENT_ALL; break;
+      }
+    }
+    char ib = FlGui::instance()->selectEntity(t);
+    if(ib == 'l') {
+      if(selectEntities && what == "Point"){
+        for(unsigned int i = 0; i < FlGui::instance()->selectedVertices.size(); i++){
+          if(FlGui::instance()->selectedVertices[i]->getSelection() != 1){
+            FlGui::instance()->selectedVertices[i]->setSelection(1);
+            entities.push_back(FlGui::instance()->selectedVertices[i]->tag());
+          }
+        }
+      }
+      else if(selectEntities && what == "Line"){
+        for(unsigned int i = 0; i < FlGui::instance()->selectedEdges.size(); i++){
+          if(FlGui::instance()->selectedEdges[i]->getSelection() != 1){
+            FlGui::instance()->selectedEdges[i]->setSelection(1);
+            entities.push_back(FlGui::instance()->selectedEdges[i]->tag());
+          }
+        }
+      }
+      else if(selectEntities && what == "Surface"){
+        for(unsigned int i = 0; i < FlGui::instance()->selectedFaces.size(); i++){
+          if(FlGui::instance()->selectedFaces[i]->getSelection() != 1){
+            FlGui::instance()->selectedFaces[i]->setSelection(1);
+            entities.push_back(FlGui::instance()->selectedFaces[i]->tag());
+          }
+        }
+      }
+      else if(!selectEntities && (FlGui::instance()->selectedFaces.size() ||
+                                  FlGui::instance()->selectedRegions.size())){
+        int dim = FlGui::instance()->selectedFaces.size() ? 2 : 3;
+        int tag = (dim == 2) ? FlGui::instance()->selectedFaces[0]->tag() :
+          FlGui::instance()->selectedRegions[0]->tag();
+        add_embedded(GModel::current()->getFileName(), what, entities, dim, tag);
+        GModel::current()->setSelection(0);
+        selectEntities = true;
+        entities.clear();
+      }
+    }
+    if(ib == 'r') {
+      Msg::Warning("Entity de-selection not supported yet during boolean operation");
+    }
+    if(ib == 'u') {
+      if(selectEntities && entities.size()){
+        int dim = (what == "Surface") ? 2 : (what == "Line") ? 1 : 0;
+        GEntity *ge = GModel::current()->getEntityByTag(dim, entities.back());
+        if(ge) ge->setSelection(0);
+        entities.pop_back();
+      }
+    }
+    if(ib == 'e') {
+      if(selectEntities){
+        if(entities.empty())
+          Msg::Error("At least one entity must be selected");
+        else
+          selectEntities = false;
+      }
+    }
+    if(ib == 'q') {
+      GModel::current()->setSelection(0);
+      break;
+    }
+  }
+
+  FlGui::instance()->transformContext->hide();
+  drawContext::global()->draw();
+  Msg::StatusGl("");
 }
 
 static void mesh_define_compound_entity_cb(Fl_Widget *w, void *data)
@@ -4084,14 +4190,12 @@ static menuItem static_modules[] = {
    (Fl_Callback *)mesh_define_length_cb  } ,
   {"0Modules/Mesh/Define/Size fields",
    (Fl_Callback *)field_cb},
-  /* TODO:
   {"0Modules/Mesh/Define/Embedded/Point",
    (Fl_Callback *)mesh_define_embedded_cb, (void*)"Point" } ,
   {"0Modules/Mesh/Define/Embedded/Line",
    (Fl_Callback *)mesh_define_embedded_cb, (void*)"Line" } ,
   {"0Modules/Mesh/Define/Embedded/Surface",
    (Fl_Callback *)mesh_define_embedded_cb, (void*)"Surface" } ,
-  */
   {"0Modules/Mesh/Define/Transfinite/Line",
    (Fl_Callback *)mesh_define_transfinite_line_cb} ,
   {"0Modules/Mesh/Define/Transfinite/Surface",
diff --git a/Geo/GeoStringInterface.cpp b/Geo/GeoStringInterface.cpp
index 5cb64f8ae411c2b12a708e764c66cdbe6f636f79..967cf8b7137f2575f2989934668facbe27882170 100644
--- a/Geo/GeoStringInterface.cpp
+++ b/Geo/GeoStringInterface.cpp
@@ -249,16 +249,14 @@ void add_trsfvol(std::vector<int> &l, const std::string &fileName)
   add_infile(sstream.str(), fileName);
 }
 
-void add_embedded(const std::string &what, std::vector<int> &l,
-                  const std::string &fileName)
+void add_embedded(const std::string &fileName, const std::string &what,
+                  std::vector<int> &l, int dim, int tag)
 {
   std::ostringstream sstream;
-  sstream << "Point{";
-  for(unsigned int i = 1; i < l.size(); i++) {
-    if(i > 1) sstream << ", ";
-    sstream << l[i];
-  }
-  sstream << "} In Surface{" << l[0] << "};";
+  sstream << what << "{" << vector2String(l) << "} In ";
+  if(dim == 2) sstream << "Surface{";
+  else sstream << "Volume{";
+  sstream << tag << "};";
   add_infile(sstream.str(), fileName);
 }
 
diff --git a/Geo/GeoStringInterface.h b/Geo/GeoStringInterface.h
index a66a8a2734a2e508c2c5bcc9abbe998b02f0dcd6..7df9473cf99d4855b4af82001b51c229b2ffa7d9 100644
--- a/Geo/GeoStringInterface.h
+++ b/Geo/GeoStringInterface.h
@@ -20,8 +20,8 @@ void add_trsfline(std::vector<int> &l, const std::string &fileName,
 void add_trsfsurf(std::vector<int> &l, const std::string &fileName,
                   const std::string &dir);
 void add_trsfvol(std::vector<int> &l, const std::string &fileName);
-void add_embedded(const std::string &what, std::vector<int> &l,
-                  const std::string &fileName);
+void add_embedded(const std::string &fileName, const std::string &what,
+                  std::vector<int> &l, int dim, int tag);
 void add_param(const std::string &par, const std::string &value,
                const std::string &label, const std::string &path,
                const std::string &fileName);