diff --git a/Mesh/meshGFaceRecombine.cpp b/Mesh/meshGFaceRecombine.cpp
index d22dd44a2e858836ecac3cd57015d12ca062adbf..395f1ae86172ec149ab1e0745632521998618375 100644
--- a/Mesh/meshGFaceRecombine.cpp
+++ b/Mesh/meshGFaceRecombine.cpp
@@ -1918,11 +1918,26 @@ void Rec2DTwoTri2Quad::getNeighbourElements(std::vector<Rec2DElement*> &elem) co
   elem.clear();
   _triangles[0]->getMoreNeighbours(elem);
   _triangles[1]->getMoreNeighbours(elem);
-  for (unsigned int i = 0; i < elem.size(); ++i) {
+  unsigned int i = 0;
+  while (i < elem.size()) {
     if (elem[i] == _triangles[0] || elem[i] == _triangles[0]) {
       elem[i] = elem.back();
       elem.pop_back();
     }
+    else ++i;
+  }
+}
+
+void Rec2DTwoTri2Quad::getNeighbElemWithActions(std::vector<Rec2DElement*> &elem) const
+{
+  getNeighbourElements(elem);
+  unsigned int i = 0;
+  while (i < elem.size()) {
+    if (!elem[i]->getNumActions()) {
+      elem[i] = elem.back();
+      elem.pop_back();
+    }
+    else ++i;
   }
 }
 
@@ -3536,41 +3551,39 @@ Rec2DNode::Rec2DNode(Rec2DNode *father, Rec2DAction *ra,
   for (int i = 0; i < REC2D_NUMB_SONS; ++i)
     _son[i] = NULL;
   
-  std::vector<Rec2DElement*> neighbours;
-  if (_ra) {
-    if (depth)
-      _ra->getNeighbourElements(neighbours);
-    _dataChange = Rec2DData::getNewDataChange();
-    _ra->apply(_dataChange, _createdActions);
-    _ra->addPointing();
+  if (!depth && !ra) {
+    Msg::Error("[Rec2DNode] Nothing to do");
+    return;
   }
   
-  if (father)
+  if (!depth) {
+    _globalQuality = _ra->getReward();
     _remainingTri = father->getNumTri() - _ra->getNumElement();
-  else
+    _bestEndGlobQual = bestEndGlobQual = _globalQuality;
+  }
+  else {
+    std::vector<Rec2DElement*> neighbours;
+    if (_ra) {
+      _ra->getNeighbElemWithActions(neighbours);
+      _dataChange = Rec2DData::getNewDataChange();
+      _ra->apply(_dataChange, _createdActions);
+      _ra->addPointing();
+    }
     _remainingTri = Rec2DData::getNumElement();
-  _globalQuality = Rec2DData::getGlobalQuality();
-  Msg::Warning("@ %d %d %g %g", Rec2DData::getNumVert(),
-                                Rec2DData::getNumEdge(),
-                                Rec2DData::getValVert(),
-                                Rec2DData::getValEdge() );
-  
-  if (depth) {
+    _globalQuality = Rec2DData::getGlobalQuality();
+    
     Recombine2D::incNumChange();
     std::vector<Rec2DAction*> actions;
     Recombine2D::nextTreeActions(actions, neighbours);
     
     if (actions.empty()) {
       _bestEndGlobQual = _globalQuality;
-      if (depth < 0)
+      if (depth < 0) // when developping all the tree
         Rec2DData::addEndNode(this);
     }
     else {
       for (unsigned int i = 0; i < actions.size(); ++i) {
-        std::vector<Rec2DElement*> elem;
-        actions[i]->getElements(elem);
         double bestSonEGQ;
-        
         _son[i] = new Rec2DNode(this, actions[i], bestSonEGQ, depth-1);
         if (bestSonEGQ > _bestEndGlobQual) {
           _bestEndGlobQual = bestSonEGQ;
@@ -3580,18 +3593,13 @@ Rec2DNode::Rec2DNode(Rec2DNode *father, Rec2DAction *ra,
         }
       }
     }
-  }
-  else
-    _bestEndGlobQual = _globalQuality;
-  
-  bestEndGlobQual = _bestEndGlobQual;
-  
-  if (_dataChange) {
-    if (depth)
+    bestEndGlobQual = _bestEndGlobQual;
+    if (_dataChange) {
       Recombine2D::incNumChange();
-    if (!Rec2DData::revertDataChange(_dataChange))
-      Msg::Error(" 1 - don't reverted changes");
-    _dataChange = NULL;
+      if (!Rec2DData::revertDataChange(_dataChange))
+        Msg::Error(" 1 - don't reverted changes");
+      _dataChange = NULL;
+    }
   }
 }
 
@@ -3618,36 +3626,17 @@ Rec2DNode* Rec2DNode::selectBestNode()
 
 void Rec2DNode::develop(int depth, double &bestEndGlobQual)
 {
-  if (!_ra) {
-    Msg::Error("[Rec2DNode] no action in node");
-    return;
-  }
-  if (depth < 1) {
-    Msg::Error("[Rec2DNode] That should not happen :'(");
-    Msg::Error(" ");
+  if (!_ra || depth < 1 || _dataChange) {
+    Msg::Error("[Rec2DNode] should not be there");
     return;
   }
   
   _bestEndGlobQual = .0;
-  bool delChanges = !_dataChange;
   std::vector<Rec2DElement*> neighbours;
-  
-  if (_ra) {
-    _ra->getNeighbourElements(neighbours);
-    unsigned int i = 0;
-    while (i < neighbours.size()) {
-      if (!neighbours[i]->getNumActions()) {
-        neighbours[i] = neighbours.back();
-        neighbours.pop_back();
-      }
-      else
-        ++i;
-    }
-  }
-  if (delChanges) {
-    _dataChange = Rec2DData::getNewDataChange();
-    _ra->apply(_dataChange, _createdActions);
-  }
+  _ra->getNeighbElemWithActions(neighbours);
+  _dataChange = Rec2DData::getNewDataChange();
+  _ra->apply(_dataChange, _createdActions);
+  _ra->addPointing();
   
   if (_son[0]) {
     int i = 0;
@@ -3663,16 +3652,15 @@ void Rec2DNode::develop(int depth, double &bestEndGlobQual)
       ++i;
     }
   }
-  else {
+  else { 
     Recombine2D::incNumChange();
     std::vector<Rec2DAction*> actions;
     Recombine2D::nextTreeActions(actions, neighbours);
     
-    if (actions.size()) {
+    if (actions.empty())
+      _bestEndGlobQual = _globalQuality;
+    else {
       for (unsigned int i = 0; i < actions.size(); ++i) {
-        if (!actions[i]) {
-          Msg::Error("null %d/%d", i, actions.size());
-        }
         double bestSonEGQ;
         _son[i] = new Rec2DNode(this, actions[i], bestSonEGQ, depth-1);
         if (bestSonEGQ > _bestEndGlobQual) {
@@ -3683,18 +3671,12 @@ void Rec2DNode::develop(int depth, double &bestEndGlobQual)
         }
       }
     }
-    else
-      _bestEndGlobQual = _globalQuality;
   }
-  
   bestEndGlobQual = _bestEndGlobQual;
-  
-  if (delChanges) {
-    Recombine2D::incNumChange();
-    if (!Rec2DData::revertDataChange(_dataChange))
-      Msg::Error(" 1 - don't reverted changes");Msg::Error(" ");
-    _dataChange = NULL;
-  }
+  Recombine2D::incNumChange();
+  if (!Rec2DData::revertDataChange(_dataChange))
+    Msg::Error(" 1 - don't reverted changes");
+  _dataChange = NULL;
 }
 
 bool Rec2DNode::makeChanges()
diff --git a/Mesh/meshGFaceRecombine.h b/Mesh/meshGFaceRecombine.h
index f3b2b196b73e987a0bae60e7e29e353dfc5cc106..81fad4df25da8a2c26c4a46fdccd6f389a5342a6 100644
--- a/Mesh/meshGFaceRecombine.h
+++ b/Mesh/meshGFaceRecombine.h
@@ -316,6 +316,7 @@ class Rec2DAction {
     virtual int getNumElement() = 0;
     virtual void getElements(std::vector<Rec2DElement*>&) const = 0;
     virtual void getNeighbourElements(std::vector<Rec2DElement*>&) const = 0;
+    virtual void getNeighbElemWithActions(std::vector<Rec2DElement*>&) const = 0;
     virtual int getNum(double shiftx, double shifty) = 0;
     virtual Rec2DElement* getRandomElement() const = 0;
     //virtual void print() = 0;
@@ -362,6 +363,7 @@ class Rec2DTwoTri2Quad : public Rec2DAction {
     virtual inline int getNumElement() {return 2;}
     virtual void getElements(std::vector<Rec2DElement*>&) const;
     virtual void getNeighbourElements(std::vector<Rec2DElement*>&) const;
+    virtual void getNeighbElemWithActions(std::vector<Rec2DElement*>&) const;
     virtual int getNum(double shiftx, double shifty);
     virtual Rec2DElement* getRandomElement() const;
     //virtual void print();
@@ -412,6 +414,9 @@ class Rec2DCollapse : public Rec2DAction {
     virtual void getNeighbourElements(std::vector<Rec2DElement*> &vec) const {
       _rec->getNeighbourElements(vec);
     }
+    virtual void getNeighbElemWithActions(std::vector<Rec2DElement*> &vec) const {
+      _rec->getNeighbElemWithActions(vec);
+    }
     virtual int getNum(double shiftx, double shifty) {
       return -1;
     }