diff --git a/Mesh/meshGFaceRecombine.cpp b/Mesh/meshGFaceRecombine.cpp
index 955ab5ed2dd275805d88ff0ea32ad5ebdb41f013..801931708d5ded8b22c15df6d27cf90ede5ed53e 100644
--- a/Mesh/meshGFaceRecombine.cpp
+++ b/Mesh/meshGFaceRecombine.cpp
@@ -13,6 +13,8 @@
 // #define REC2D_SMOOTH
  #define REC2D_DRAW
 
+#include <cmath>
+#include "OpenFile.h"//pour setboundingbox
 #include "meshGFaceRecombine.h"
 #include "MTriangle.h"
 #include "MQuadrangle.h"
@@ -244,12 +246,15 @@ bool Recombine2D::developTree()
 {
   double bestGlobalValue;
   Rec2DNode root(NULL, NULL, bestGlobalValue);
+  _data->printState();
   
   Msg::Info("best global value : %g", bestGlobalValue);
   Msg::Info("num end node : %d", Rec2DData::getNumEndNode());
   
   Rec2DData::sortEndNode();
-  Rec2DData::drawEndNode(10);
+  Rec2DData::drawEndNode(100);
+  SetBoundingBox();
+  //_gf->triangles.clear();
 }
 
 void Recombine2D::nextTreeActions(Rec2DAction *ra,
@@ -581,8 +586,8 @@ void Rec2DData::printState()
 {
   Msg::Info("State");
   Msg::Info("-----");
-  Msg::Info("numEdge %d (%d), valEdge %g => %g", _numEdge, _edges.size(), _valEdge, _valEdge/_numEdge);
-  Msg::Info("numVert %d (%d), valVert %g => %g", _numVert, _vertices.size(), _valVert, _valVert/_numVert);
+  Msg::Info("numEdge %d (%d), valEdge %g => %g", _numEdge, _edges.size(), (double)_valEdge, (double)_valEdge/_numEdge);
+  Msg::Info("numVert %d (%d), valVert %g => %g", _numVert, _vertices.size(), (double)_valVert, (double)_valVert/_numVert);
   Msg::Info("Element (%d)", _elements.size());
   Msg::Info("global Value %g", Rec2DData::getGlobalValue());
   Msg::Info("num action %d", _actions.size());
@@ -594,9 +599,9 @@ void Rec2DData::printState()
   iter_re ite;
   long double valEdge = .0;
   for (ite = firstEdge(); ite != lastEdge(); ++ite) {
-    valEdge += (long double)(*ite)->getQual();
+    valEdge += (long double)(*ite)->getVal();
   }
-  Msg::Info("valEdge : %g >< %g", (double)valEdge, _valEdge);
+  Msg::Info("valEdge : %g >< %g", (double)valEdge, (double)_valEdge);
   iter_rv itv;
   long double valVert = .0;
   for (itv = firstVertex(); itv != lastVertex(); ++itv) {
@@ -604,7 +609,7 @@ void Rec2DData::printState()
     if ((*itv)->getParity() == -1 || (*itv)->getParity() == 1)
       Msg::Error("parity %d, I'm very angry", (*itv)->getParity());
   }
-  Msg::Info("valVert : %g >< %g", (double)valVert, _valVert);
+  Msg::Info("valVert : %g >< %g", (double)valVert, (double)_valVert);
 }
 
 int Rec2DData::getNewParity()
@@ -825,7 +830,7 @@ Rec2DAction* Rec2DData::getBestAction()
 
 Rec2DAction* Rec2DData::getBestNonHiddenAction()
 {
-  _current->_actions.sort(lessRec2DAction());
+  _current->_actions.sort(greaterRec2DAction());
   std::list<Rec2DAction*>::iterator it = _current->_actions.begin();
   while (it != _current->_actions.end() && Rec2DData::isOutOfDate(*it)) ++it;
   if (it == _current->_actions.end())
@@ -850,13 +855,22 @@ bool Rec2DData::isOutOfDate(Rec2DAction *ra)
 
 void Rec2DData::drawEndNode(int num)
 {
+  double dx = .0, dy = .0;
   for (unsigned int i = 0; i < num && i < _current->_endNodes.size(); ++i) {
     std::map<int, std::vector<double> > data;
     Rec2DNode *currentNode = _current->_endNodes[i];
     Msg::Info("%d -> %g", i+1, currentNode->getGlobVal());
+    int k = 0;
+    if ( !((i+1) % ((int)std::sqrt(num)+1)) ) {
+      dx = .0;
+      dy -= 1.2;
+    }
+    else
+      dx += 1.2;
     while (currentNode && currentNode->getAction()) {
-      Msg::Info("%g", currentNode->getGlobVal());
-      data[currentNode->getNum()].push_back(currentNode->getGlobVal());
+      //Msg::Info("%g", currentNode->getGlobVal());
+      //data[currentNode->getNum()].push_back(currentNode->getGlobVal());
+      data[currentNode->getAction()->getNum(dx, dy)].push_back(++k);
       currentNode = currentNode->getFather();
     }
     new PView("Jmin_bad", "ElementData", Recombine2D::getGFace()->model(), data);
@@ -865,9 +879,9 @@ void Rec2DData::drawEndNode(int num)
 
 void Rec2DData::sortEndNode()
 {
-  Msg::Info("sort %g", (*_current->_endNodes.begin())->getGlobVal());
-  std::sort(_current->_endNodes.begin(), _current->_endNodes.end(), moreRec2DNode());
-  Msg::Info("sort %g", (*_current->_endNodes.begin())->getGlobVal());
+  std::sort(_current->_endNodes.begin(),
+            _current->_endNodes.end(),
+            moreRec2DNode()             );
 }
 
 /**  Rec2DAction  **/
@@ -877,6 +891,11 @@ bool lessRec2DAction::operator()(Rec2DAction *ra1, Rec2DAction *ra2) const
   return *ra1 < *ra2;
 }
 
+bool greaterRec2DAction::operator()(Rec2DAction *ra1, Rec2DAction *ra2) const
+{
+  return *ra2 < *ra1;
+}
+
 Rec2DAction::Rec2DAction()
 : _lastUpdate(Recombine2D::getNumChange()-1), _globValIfExecuted(.0)
 {
@@ -1012,10 +1031,10 @@ void Rec2DTwoTri2Quad::apply(std::vector<Rec2DVertex*> &newPar)
 }
 
 void Rec2DTwoTri2Quad::choose(Rec2DElement *&rel)
-{ 
-  _edges[4]->hide();
+{
   _triangles[0]->hide();
   _triangles[1]->hide();
+  _edges[4]->hide();
   
   rel = new Rec2DElement(_edges, true);
 }
@@ -1113,12 +1132,29 @@ void Rec2DTwoTri2Quad::getElements(std::vector<Rec2DElement*> &elem)
   elem.push_back(_triangles[1]);
 }
 
-int Rec2DTwoTri2Quad::getNum()
+int Rec2DTwoTri2Quad::getNum(double shiftx, double shifty)
 {
-  MQuadrangle *quad = new MQuadrangle(_vertices[0]->getMVertex(),
-                                      _vertices[2]->getMVertex(),
-                                      _vertices[1]->getMVertex(),
-                                      _vertices[3]->getMVertex());
+  MQuadrangle *quad;
+  if (shiftx == .0 && shifty == .0)
+    quad = new MQuadrangle(_vertices[0]->getMVertex(),
+                           _vertices[2]->getMVertex(),
+                           _vertices[1]->getMVertex(),
+                           _vertices[3]->getMVertex());
+  else {
+    MVertex *v0 = new MVertex(_vertices[0]->getMVertex()->x() + shiftx,
+                              _vertices[0]->getMVertex()->y() + shifty,
+                              _vertices[0]->getMVertex()->z()          );
+    MVertex *v1 = new MVertex(_vertices[1]->getMVertex()->x() + shiftx,
+                              _vertices[1]->getMVertex()->y() + shifty,
+                              _vertices[1]->getMVertex()->z()          );
+    MVertex *v2 = new MVertex(_vertices[2]->getMVertex()->x() + shiftx,
+                              _vertices[2]->getMVertex()->y() + shifty,
+                              _vertices[2]->getMVertex()->z()          );
+    MVertex *v3 = new MVertex(_vertices[3]->getMVertex()->x() + shiftx,
+                              _vertices[3]->getMVertex()->y() + shifty,
+                              _vertices[3]->getMVertex()->z()          );
+    quad = new MQuadrangle(v0, v2, v1, v3);
+  }
   Recombine2D::add(quad);
   return quad->getNum();
 }
@@ -1150,7 +1186,7 @@ void Rec2DEdge::hide()
   //_rv0->remove(this);
   //_rv1->remove(this);
   //Rec2DData::remove(this);
-  Rec2DData::addEdge(-_weight, -_weight*getQual());
+  Rec2DData::addEdge(-_weight, -getVal());
 }
 
 void Rec2DEdge::reveal()
@@ -1158,7 +1194,9 @@ void Rec2DEdge::reveal()
   //_rv0->add(this);
   //_rv1->add(this);
   //Rec2DData::remove(this);
-  Rec2DData::addEdge(_weight, _weight*getQual());
+  static int a = 0;
+  static double b = .0;
+  Rec2DData::addEdge(_weight, getVal());
 }
 
 void Rec2DEdge::_computeQual() //*
@@ -1174,23 +1212,34 @@ void Rec2DEdge::_computeQual() //*
 double Rec2DEdge::getQual()
 {
   if (_lastUpdate < Recombine2D::getNumChange() &&
-      _rv0->getLastMove() > _lastUpdate ||
-      _rv1->getLastMove() > _lastUpdate           ) {
+      (_rv0->getLastMove() > _lastUpdate ||
+       _rv1->getLastMove() > _lastUpdate   )      ) {
     _computeQual(); 
   }
   return _qual;
 }
 
-void Rec2DEdge::_addWeight(double val)
+double Rec2DEdge::getVal()
+{
+  if (_weight != .0                             &&
+      _lastUpdate < Recombine2D::getNumChange() &&
+      (_rv0->getLastMove() > _lastUpdate ||
+       _rv1->getLastMove() > _lastUpdate   )      ) {
+    _computeQual(); 
+  }
+  return _weight * _qual;
+}
+
+void Rec2DEdge::_addWeight(int w)
 {
-  _weight += val;
+  _weight += w;
   if (_weight > REC2D_EDGE_BASE + 2*REC2D_EDGE_QUAD)
     Msg::Error("[Rec2DEdge] Weight too high : %d (%d max)",
                _weight, REC2D_EDGE_BASE + 2*REC2D_EDGE_QUAD  );
   if (_weight < REC2D_EDGE_BASE)
     Msg::Error("[Rec2DEdge] Weight too low : %d (%d min)",
                _weight, REC2D_EDGE_BASE                   );
-  Rec2DData::addEdge(val, val*getQual());
+  Rec2DData::addEdge(w, w*getQual());
 }
 
 Rec2DElement* Rec2DEdge::getSingleElement(Rec2DEdge *re)
diff --git a/Mesh/meshGFaceRecombine.h b/Mesh/meshGFaceRecombine.h
index 4c3736d0d11da2f92b9fdab2545e3aadf97a7147..f2f40808f84cda5eecce777d3b9fdc019a28468c 100644
--- a/Mesh/meshGFaceRecombine.h
+++ b/Mesh/meshGFaceRecombine.h
@@ -26,6 +26,13 @@ class Rec2DEdge;
 class Rec2DElement;
 class Rec2DAction;
 class Rec2DData;
+struct lessRec2DAction {
+  bool operator()(Rec2DAction*, Rec2DAction*) const;
+};
+struct greaterRec2DAction {
+  bool operator()(Rec2DAction*, Rec2DAction*) const;
+};
+
 struct lessRec2DNode {
   bool operator()(Rec2DNode*, Rec2DNode*) const;
 };
@@ -118,6 +125,8 @@ class Rec2DData {
       _current->_valEdge += (long double)val;
     }
     
+    static inline int getNumEdge() {return _current->_numEdge;}
+    static inline double getValEdge() {return (double)_current->_valEdge;}
     static Rec2DAction* getBestAction();
     static Rec2DAction* getBestNonHiddenAction();
     
@@ -174,10 +183,6 @@ class Rec2DData {
     static void revertAssumedParities();
 };
 
-struct lessRec2DAction {
-  bool operator()(Rec2DAction*, Rec2DAction*) const;
-};
-
 class Rec2DAction {
   protected :
     double _globValIfExecuted;
@@ -200,7 +205,7 @@ class Rec2DAction {
     virtual void unChoose(Rec2DElement*) = 0;
     virtual int getNumElement() = 0;
     virtual void getElements(std::vector<Rec2DElement*>&) = 0;
-    virtual int getNum() = 0;
+    virtual int getNum(double shiftx, double shifty) = 0;
     
   private :
     virtual void _computeGlobVal() = 0;
@@ -228,7 +233,7 @@ class Rec2DTwoTri2Quad : public Rec2DAction {
     virtual void unChoose(Rec2DElement*);
     virtual inline int getNumElement() {return 2;}
     virtual void getElements(std::vector<Rec2DElement*>&);
-    virtual int getNum();
+    virtual int getNum(double shiftx, double shifty);
     
   private :
     virtual void _computeGlobVal();
@@ -248,6 +253,7 @@ class Rec2DEdge {
     void reveal();
     
     double getQual();
+    double getVal();
     
     inline double addHasTri() {_addWeight(-REC2D_EDGE_QUAD); ++_boundary;}
     inline double remHasTri() {_addWeight(REC2D_EDGE_QUAD); --_boundary;}
@@ -265,7 +271,7 @@ class Rec2DEdge {
     void _computeQual();
     double _straightAdimLength() const;
     double _straightAlignment() const;
-    void _addWeight(double);
+    void _addWeight(int);
 };
 
 struct AngleData {
@@ -400,7 +406,6 @@ class Rec2DElement {
     MQuadrangle* _createQuad() const;
 };
 
-
 class Rec2DNode {
   private :
     Rec2DNode *_father;
@@ -414,7 +419,7 @@ class Rec2DNode {
     
     bool operator<(Rec2DNode&);
     inline Rec2DNode* getFather() {return _father;}
-    inline int getNum() {return _ra->getNum();}
+    //inline int getNum() {return _ra->getNum();}
     inline Rec2DAction* getAction() {return _ra;}
     inline double getGlobVal() {return _globalValue;}
     inline int getNumTri() {return _remainingTri;}