diff --git a/Mesh/meshGFaceRecombine.cpp b/Mesh/meshGFaceRecombine.cpp
index f26be98e21061e7fc1a4766232db91838338538e..138225d30374b1b937e3aa475797262e9cc8fb82 100644
--- a/Mesh/meshGFaceRecombine.cpp
+++ b/Mesh/meshGFaceRecombine.cpp
@@ -237,6 +237,50 @@ bool Recombine2D::recombine()
   return 1;
 }
 
+bool Recombine2D::recombine()
+{
+  Rec2DAction *nextAction;
+  while (nextAction = Rec2DData::getBestAction()) {
+#ifdef REC2D_DRAW
+    FlGui::instance()->check();
+    double time = Cpu();
+    nextAction->color(0, 0, 200);
+    CTX::instance()->mesh.changed = (ENT_ALL);
+    drawContext::global()->draw();
+#endif
+    
+    if (!_remainAllQuad(nextAction)) {
+      nextAction->color(190, 0, 0);
+      delete nextAction;
+      continue;
+    }
+    ++_numChange;
+    std::vector<Rec2DVertex*> newPar;
+    nextAction->apply(newPar);
+    
+    // forall v in newPar : check obsoletes action;
+    
+#ifdef REC2D_DRAW
+    _gf->triangles = _data->_tri;
+    _gf->quadrangles = _data->_quad;
+    CTX::instance()->mesh.changed = (ENT_ALL);
+    drawContext::global()->draw();
+    while (Cpu()-time < REC2D_WAIT_TIME)
+      FlGui::instance()->check();
+#endif
+    
+    delete nextAction;
+  }
+  
+  _data->printState();
+#ifdef REC2D_SMOOTH
+    laplaceSmoothing(_gf,100);
+#endif
+    CTX::instance()->mesh.changed = (ENT_ALL);
+    drawContext::global()->draw();
+  return 1;
+}
+
 double Recombine2D::_geomAngle(MVertex *v,
                                std::vector<GEdge*> &gEdge,
                                std::vector<MElement*> &elem) //*
@@ -931,6 +975,61 @@ void Rec2DTwoTri2Quad::apply(std::vector<Rec2DVertex*> &newPar)
   /*new Rec2DCollapse(*/new Rec2DElement(_edges)/*)*/;
 }
 
+void Rec2DTwoTri2Quad::choose()
+{
+  if (isObsolete()) {
+    Msg::Error("[Rec2DTwoTri2Quad] No way ! I won't apply ! Find someone else...");
+    return;
+  }
+  
+  int min = Rec2DData::getNewParity(), index = -1;
+  for (int i = 0; i < 4; ++i) {
+    if (_vertices[i]->getParity() && min > _vertices[i]->getParity()) {
+      min = _vertices[i]->getParity();
+      index = i;
+    }
+  }
+  if (index == -1) {
+    _vertices[0]->setParity(min);
+    _vertices[1]->setParity(min);
+    _vertices[2]->setParity(min+1);
+    _vertices[3]->setParity(min+1);
+  }
+  else {
+    for (int i = 0; i < 4; i += 2) {
+      int par;
+      if ((index/2) * 2 == i)
+        par = min;
+      else
+        par = otherParity(min);
+      for (int j = 0; j < 2; ++j) {
+        if (!_vertices[i+j]->getParity())
+          _vertices[i+j]->setParity(par);
+        else if (_vertices[i+j]->getParity() != par &&
+                 _vertices[i+j]->getParity() != otherParity(par))
+          Rec2DData::associateParity(_vertices[i+j]->getParity(), par);
+      }
+    }
+  }
+  
+  _triangles[0]->remove(this);
+  _triangles[1]->remove(this);
+  
+  std::vector<Rec2DAction*> actions;
+  _triangles[0]->getUniqueActions(actions);
+  _triangles[1]->getUniqueActions(actions);
+  for (unsigned int i = 0; i < actions.size(); ++i)
+    delete actions[i];
+  
+  delete _triangles[0];
+  delete _triangles[1];
+  _triangles[0] = NULL;
+  _triangles[1] = NULL;
+  delete _edges[4];
+  
+  /*new Rec2DCollapse(*/new Rec2DElement(_edges)/*)*/;
+}
+
 bool Rec2DTwoTri2Quad::isObsolete()
 {
   int p[4];
@@ -1745,3 +1844,30 @@ MQuadrangle* Rec2DElement::_createQuad() const
 }
 
 
+/**  Rec2DNode  **/
+/*****************/
+Rec2DNode::Rec2DNode(Rec2DNode *father, Rec2DEction *ra, double &bestEndGlobVal)
+: _father(father), _ra(ra), _son0(NULL), _son1(NULL), _son2(NULL),
+  _globalValue(.0), _bestEndGlobVal(.0)
+{
+  int parities[4];
+  _ra.choose(parities);
+  
+  double 2;
+  int k = 0;
+  Rec2DElement *rel = Recombine2D::nextTreeActions(_ra);
+  for (int i = 0; i < rel->getNumActions(); ++i) {
+    if (!rel->getAction(i)->is'Obsolete'()) {
+      son[k] = new Rec2DNode(this, rel->getAction(i), endGlobValSon);
+      _bestEndGlobVal = max(_bestEndGlobVal, endGlobValSon);
+      ++k;
+    }
+  }
+  
+  if (k == 0) {
+    Rec2DData::addEndNode(this);
+  }
+  bestEndGlobVal = _bestEndGlobVal;
+  _ra.revert(parities);
+}
+
diff --git a/Mesh/meshGFaceRecombine.h b/Mesh/meshGFaceRecombine.h
index 847dd61a321ad2689c829a0b36481279f1de263f..f800bbc9c47a9faf06e4904d205d5555c63b7804 100644
--- a/Mesh/meshGFaceRecombine.h
+++ b/Mesh/meshGFaceRecombine.h
@@ -46,6 +46,7 @@ class Recombine2D {
     ~Recombine2D();
     
     bool recombine();
+    bool developTree();
     
     static inline GFace* getGFace() {return _current->_gf;}
     static inline int getNumChange() {return _current->_numChange;}
@@ -351,4 +352,15 @@ class Rec2DElement {
     MQuadrangle* _createQuad() const;
 };
 
+class Rec2DNode {
+  private :
+    Rec2DNode *_father;
+    Rec2DNode *_son0, *_son1, *_son2;
+    Rec2DAction *_ra;
+    double _globalValue, _bestEndGlobVal;
+    
+  public :
+    Rec2DNode(Rec2DAction*);
+};
+
 #endif
\ No newline at end of file