diff --git a/Mesh/meshGFaceRecombine.cpp b/Mesh/meshGFaceRecombine.cpp
index 341994d4c6e67b1212763c9c056a24d369800642..c3831f4b2e7b2314e42bbe80b39b993d66e11bfb 100644
--- a/Mesh/meshGFaceRecombine.cpp
+++ b/Mesh/meshGFaceRecombine.cpp
@@ -198,7 +198,8 @@ Recombine2D::Recombine2D(GFace *gf) : _gf(gf), _strategy(0), _numChange(0)
     }
   }
   
-  _data->printState();
+  static int rea = -1;
+  if (++rea < 1) _data->printState();
 }
 
 Recombine2D::~Recombine2D()
@@ -262,16 +263,13 @@ bool Recombine2D::recombine(int depth)
   Rec2DNode *root = new Rec2DNode(NULL, NULL, bestGlobalQuality, depth);
   Rec2DNode *currentNode = root->selectBestNode();
   
-  int i = 0;
-  while (Rec2DData::hasAction()) {
-    Msg::Info("{%d}", ++i);
-    Msg::Info(" ");
+  while (currentNode) {
     currentNode->develop(depth, bestGlobalQuality);
     currentNode = currentNode->selectBestNode();
   }
-  currentNode->selectBestNode();
   
   Msg::Info("==> %g", Rec2DData::getGlobalQuality());
+  //_data->printState();
 }
 
 bool Recombine2D::developTree()
@@ -688,6 +686,7 @@ bool Rec2DData::revertDataChange(Rec2DDataChange *rdc)
   _current->_changes.pop_back();
   rdc->revert();
   delete rdc;
+  return true;
 }
 
 void Rec2DData::removeParity(Rec2DVertex *rv, int p)
@@ -972,6 +971,14 @@ void Rec2DDataChange::revert()
     _hiddenElement[i]->reveal();
   for (unsigned int i = 0; i < _hiddenAction.size(); ++i)
     _hiddenAction[i]->reveal();
+  _newEdge.clear();
+  _newVertex.clear();
+  _newAction.clear();
+  _newElement.clear();
+  _hiddenEdge.clear();
+  _hiddenVertex.clear();
+  _hiddenAction.clear();
+  _hiddenElement.clear();
 }
 
 
@@ -2245,7 +2252,9 @@ Rec2DNode::Rec2DNode(Rec2DNode *father, Rec2DAction *ra,
   bestEndGlobQual = _bestEndGlobQual;
   
   if (_dataChange) {
-    Rec2DData::revertDataChange(_dataChange);
+    if (!Rec2DData::revertDataChange(_dataChange)) {
+      Msg::Error(" 1 - don't reverted changes");Msg::Error(" ");
+    }
     _dataChange = NULL;
   }
 }
@@ -2263,21 +2272,38 @@ Rec2DNode* Rec2DNode::selectBestNode()
     _son[i] = NULL;
   }
   
-  if (_ra) {
-    _dataChange = Rec2DData::getNewDataChange();
-    _ra->apply(_dataChange);
-  }
+  if (_son[0] && !_son[0]->makeChanges())
+    Msg::Error("[Rec2DNode] No changes");
   
   return _son[0];
 }
 
 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(" ");
+    return;
+  }
+  
   _bestEndGlobQual = .0;
-  if (_son[0] && depth > 0) {
+  bool delChanges = !_dataChange;
+  std::vector<Rec2DElement*> neighbours;
+  
+  if (delChanges) {
+    _ra->getNeighbourElements(neighbours);
+    _dataChange = Rec2DData::getNewDataChange();
+    _ra->apply(_dataChange);
+  }
+  
+  if (_son[0]) {
     int i = 0;
     double bestSonEGQ;
-    while (_son[i]) {
+    while (_son[i] && i < REC2D_NUM_SON) {
       _son[i]->develop(depth-1, bestSonEGQ);
       if (bestSonEGQ > _bestEndGlobQual) {
         _bestEndGlobQual = bestSonEGQ;
@@ -2288,14 +2314,7 @@ void Rec2DNode::develop(int depth, double &bestEndGlobQual)
       ++i;
     }
   }
-  else if (depth > 0) {
-    std::vector<Rec2DElement*> neighbours;
-    if (_ra) {
-      _ra->getNeighbourElements(neighbours);
-      _dataChange = Rec2DData::getNewDataChange();
-      _ra->apply(_dataChange);
-    }
-    
+  else {
     std::vector<Rec2DAction*> actions;
     Recombine2D::nextTreeActions(actions, neighbours);
     
@@ -2305,39 +2324,33 @@ void Rec2DNode::develop(int depth, double &bestEndGlobQual)
         _son[i] = new Rec2DNode(this, actions[i], bestSonEGQ, depth-1);
         if (bestSonEGQ > _bestEndGlobQual) {
           _bestEndGlobQual = bestSonEGQ;
-          if (i > 0) {
-            Rec2DNode *tmp = _son[0];
-            _son[0] = _son[i];
-            _son[i] = tmp;
-          }
+          Rec2DNode *tmp = _son[0];
+          _son[0] = _son[i];
+          _son[i] = tmp;
         }
       }
     }
     else
       _bestEndGlobQual = _globalQuality;
   }
-  else
-    Msg::Error("[Rec2DNode] That should not happen :'(");
   
   bestEndGlobQual = _bestEndGlobQual;
+  
+  if (delChanges) {
+    if (!Rec2DData::revertDataChange(_dataChange)) {
+      Msg::Error(" 1 - don't reverted changes");Msg::Error(" ");
+    }
+    _dataChange = NULL;
+  }
 }
 
-bool Rec2DNode::hasAction()
+bool Rec2DNode::makeChanges()
 {
-  Msg::Warning("FIXME Need definition");
-  /*Rec2DElement *newElement;
-  if (_ra)
-    _ra->choose(newElement);
-    
-  std::vector<Rec2DAction*> actions;
-  Recombine2D::nextTreeActions(_ra, actions);
-  
-  bool b = !actions.empty();
-  
-  if (_ra)
-    _ra->unChoose(newElement);
-  
-  return b;*/
+  if (_dataChange || !_ra)
+    return false;
+  _dataChange = Rec2DData::getNewDataChange();
+  _ra->apply(_dataChange);
+  return true;
 }
 
 bool Rec2DNode::operator<(Rec2DNode &other)
diff --git a/Mesh/meshGFaceRecombine.h b/Mesh/meshGFaceRecombine.h
index 5905d2c2479dead9df8ebc4c54712a98e269bcee..103e1dadce2870bc400bfc50065097245d8879d8 100644
--- a/Mesh/meshGFaceRecombine.h
+++ b/Mesh/meshGFaceRecombine.h
@@ -109,6 +109,8 @@ class Rec2DData {
     std::vector<MTriangle*> _tri;
     std::vector<MQuadrangle*> _quad;
 #endif
+
+    static int getNumChange() {return _current->_changes.size();}
     
     static inline int getNumEndNode() {return _current->_endNodes.size();}
     static inline int getNumElement() {return _current->_elements.size();}
@@ -459,7 +461,7 @@ class Rec2DNode {
     void rmvSon(Rec2DNode*);
     void develop(int depth, double &bestEndGlobQual);
     inline bool hasSon() {return _son[0];}
-    bool hasAction();
+    bool makeChanges();
     
     bool operator<(Rec2DNode&);
     inline Rec2DNode* getFather() {return _father;}