diff --git a/Geo/MElementCut.cpp b/Geo/MElementCut.cpp
index 676cee9c348a402c0153487e79b8e5584167d219..3146757b26b505668c0aa8877291ba1b1825a268 100644
--- a/Geo/MElementCut.cpp
+++ b/Geo/MElementCut.cpp
@@ -1338,9 +1338,7 @@ GModel *buildCutMesh(GModel *gm, gLevelset *ls,
     }
 
     for(DI_Point::Container::iterator it = cp.begin(); it != cp.end(); it++) delete *it;
-    printf("coucou delet dim =%d\n", gmEntities[i]->dim());
     for(unsigned int k = 0; k < lines.size(); k++) delete lines[k];
-    printf("coucou delet \n");
     for(unsigned int k = 0; k < triangles.size(); k++) delete triangles[k];
     for(unsigned int k = 0; k < quads.size(); k++) delete quads[k];
     for(unsigned int k = 0; k < tetras.size(); k++) delete tetras[k];
diff --git a/Geo/gmshLevelset.h b/Geo/gmshLevelset.h
index 1b750089324f79826f90c8766e8b2351d6216b3e..de05cd67edf988883c5cb9f846c74bc599144b6f 100644
--- a/Geo/gmshLevelset.h
+++ b/Geo/gmshLevelset.h
@@ -271,13 +271,16 @@ class gLevelsetTools : public gLevelset
 {
 protected:
   std::vector<gLevelset *> children;
+  bool _delChildren;//flag to delete only if called from gmsh Parser
 public:
   gLevelsetTools () {}
-  gLevelsetTools (std::vector<gLevelset *> &p) {children = p;}
+  gLevelsetTools (const std::vector<gLevelset *> &p, bool delC=false) {children = p; _delChildren=delC;}
   gLevelsetTools (const gLevelsetTools &);
-  ~gLevelsetTools () {
-    for(int i = 0; i < (int)children.size(); i++)
-      delete children[i];
+  virtual ~gLevelsetTools () {
+    if (_delChildren){
+      for(int i = 0; i < (int)children.size(); i++)
+	delete children[i];
+    }
   }
   double operator () (const double x, const double y, const double z) const {
     double d = (*children[0])(x, y, z);
@@ -328,7 +331,7 @@ public:
 class gLevelsetCut : public gLevelsetTools
 {
 public:
-  gLevelsetCut (std::vector<gLevelset *> p) : gLevelsetTools(p) { }
+  gLevelsetCut (std::vector<gLevelset *> p, bool delC=false) : gLevelsetTools(p,delC) { }
   double choose (double d1, double d2) const {
     return (d1 > -d2) ? d1 : -d2; // greater of d1 and -d2
   }
@@ -341,7 +344,7 @@ public:
 class gLevelsetUnion : public gLevelsetTools
 {
 public:
-  gLevelsetUnion (std::vector<gLevelset *> p) : gLevelsetTools(p) { }
+  gLevelsetUnion (std::vector<gLevelset *> p, bool delC=false) : gLevelsetTools(p,delC) { }
   gLevelsetUnion(const gLevelsetUnion &lv):gLevelsetTools(lv){}
   virtual gLevelset * clone() const{return new gLevelsetUnion(*this);}
   
@@ -355,7 +358,7 @@ public:
 class gLevelsetIntersection : public gLevelsetTools
 {
 public:
-  gLevelsetIntersection (std::vector<gLevelset *> p) : gLevelsetTools(p) { }
+  gLevelsetIntersection (std::vector<gLevelset *> p, bool delC=false) : gLevelsetTools(p,delC) { }
   gLevelsetIntersection(const gLevelsetIntersection &lv):gLevelsetTools(lv) { }
   virtual gLevelset *clone() const { return new gLevelsetIntersection(*this); }
 
diff --git a/Parser/Gmsh.y b/Parser/Gmsh.y
index 5f3f1726a1e93748fe9a48f16a63f66388697edc..ae3e8afe78ce04bb0da86dfd9120f301dbb2052d 100644
--- a/Parser/Gmsh.y
+++ b/Parser/Gmsh.y
@@ -1987,7 +1987,7 @@ LevelSet :
 	    if(!pl) yymsg(0, "Levelset Union %d : unknown levelset %d", t, (int)d);
             else vl.push_back(pl->ls);
           }
-          gLevelset *ls = new gLevelsetUnion(vl);
+          gLevelset *ls = new gLevelsetUnion(vl, True);
           LevelSet *l = Create_LevelSet(t, ls);
           Tree_Add(GModel::current()->getGEOInternals()->LevelSets, &l);
         }
@@ -2005,7 +2005,7 @@ LevelSet :
 	    if(!pl) yymsg(0, "Levelset Intersection %d : unknown levelset %d", t, (int)d);
             else vl.push_back(pl->ls);
           }
-          gLevelset *ls = new gLevelsetIntersection(vl);
+          gLevelset *ls = new gLevelsetIntersection(vl, True);
           LevelSet *l = Create_LevelSet(t, ls);
           Tree_Add(GModel::current()->getGEOInternals()->LevelSets, &l);
         }
@@ -2023,7 +2023,7 @@ LevelSet :
 	    if(!pl) yymsg(0, "Levelset Cut %d : unknown levelset %d", t, (int)d);
             else vl.push_back(pl->ls);
           }
-          gLevelset *ls = new gLevelsetCut(vl);
+          gLevelset *ls = new gLevelsetCut(vl, True);
           LevelSet *l = Create_LevelSet(t, ls);
           Tree_Add(GModel::current()->getGEOInternals()->LevelSets, &l);
         }
@@ -2041,7 +2041,7 @@ LevelSet :
 	    if(!pl) yymsg(0, "Levelset Crack %d : unknown levelset %d", t, (int)d);
             else vl.push_back(pl->ls);
           }
-          gLevelset *ls = new gLevelsetCrack(vl);
+          gLevelset *ls = new gLevelsetCrack(vl, True);
           LevelSet *l = Create_LevelSet(t, ls);
           Tree_Add(GModel::current()->getGEOInternals()->LevelSets, &l);
         }