diff --git a/Fltk/highOrderToolsWindow.cpp b/Fltk/highOrderToolsWindow.cpp
index 843508804fa5b13d4b10b788779fd5a53c3d3043..6b6a5bcd98a721b030446fd05b5a64d6f0d1cc81 100644
--- a/Fltk/highOrderToolsWindow.cpp
+++ b/Fltk/highOrderToolsWindow.cpp
@@ -41,6 +41,23 @@ typedef unsigned long intptr_t;
 #include "Parser.h"
 #endif
 
+
+static void change_completeness_cb(Fl_Widget *w, void *data){
+
+  highOrderToolsWindow *o = FlGui::instance()->highordertools;
+  bool onlyVisible = (bool)o->butt[1]->value(); 
+  if (!o->complete){
+    SetHighOrderComplete (GModel::current(), onlyVisible);
+    o->complete = 1;
+  }
+  else if (o->complete){
+    SetHighOrderInComplete (GModel::current(), onlyVisible);
+    o->complete = 0;
+  }
+  CTX::instance()->mesh.changed |= (ENT_LINE | ENT_SURFACE | ENT_VOLUME);
+  drawContext::global()->draw();
+}
+
 static void highordertools_runp_cb(Fl_Widget *w, void *data)
 {
   highOrderToolsWindow *o = FlGui::instance()->highordertools;
@@ -76,18 +93,18 @@ static void chooseopti_cb(Fl_Widget *w, void *data){
   
   if (elastic){
     o->butt[4]->value(0); 
-    o->choice[0]->hide(); 
+    o->choice[0]->deactivate(); 
     for (int i=3;i<=6;i++)
-      o->value[i]->hide(); 
-    o->push[1]->hide();
+      o->value[i]->deactivate(); 
+    o->push[1]->deactivate();
   }
   else {
     o->butt[3]->value(0); 
-    o->push[0]->show();
-    o->choice[0]->show(); 
+    o->push[0]->activate();
+    o->choice[0]->activate(); 
     for (int i=3;i<=6;i++)
-      o->value[i]->show(); 
-    o->push[1]->show();
+      o->value[i]->activate(); 
+    o->push[1]->activate();
   }
   
 }
@@ -99,22 +116,49 @@ static void chooseopti2_cb(Fl_Widget *w, void *data){
   
   if (elastic){
     o->butt[4]->value(0); 
-    o->choice[0]->hide(); 
+    o->choice[0]->deactivate(); 
     for (int i=3;i<=6;i++)
-      o->value[i]->hide(); 
-    o->push[1]->hide();
+      o->value[i]->deactivate(); 
+    o->push[1]->deactivate();
   }
   else {
     o->butt[3]->value(0); 
-    o->push[0]->show();
-    o->choice[0]->show(); 
+    o->push[0]->activate();
+    o->choice[0]->activate(); 
     for (int i=3;i<=6;i++)
-      o->value[i]->show(); 
-    o->push[1]->show();
+      o->value[i]->activate(); 
+    o->push[1]->activate();
   }
   
 }
 
+static void getMeshInfo (GModel *gm, 
+			 int &meshOrder, 
+			 bool &complete, 
+			 bool &CAD){
+  meshOrder = -1;
+  CAD = true;
+  for (GModel::riter itr = gm->firstRegion(); itr != gm->lastRegion(); ++itr) {
+    if ((*itr)->getNumMeshElements()){
+      meshOrder = (*itr)->getMeshElement(0)->getPolynomialOrder(); 
+      complete = (meshOrder <= 2) ? 1 :  (*itr)->getMeshElement(0)->getNumVolumeVertices(); 
+      break;
+    } 
+  }
+  for (GModel::fiter itf = gm->firstFace(); itf != gm->lastFace(); ++itf) {
+    printf("%d\n",(*itf)->getNumMeshElements());
+    if ((*itf)->getNumMeshElements()){
+      if (meshOrder == -1) {
+	meshOrder = (*itf)->getMeshElement(0)->getPolynomialOrder(); 
+	complete = (meshOrder <= 2) ? 1 :  (*itf)->getMeshElement(0)->getNumFaceVertices(); 
+	if ((*itf)->geomType() == GEntity::DiscreteSurface)CAD = false;
+	printf("%d %d %d\n",meshOrder,complete, CAD);
+	break;
+      }
+    }     
+  }
+}
+
 
 static void highordertools_runelas_cb(Fl_Widget *w, void *data)
 {
@@ -141,9 +185,10 @@ static void highordertools_runelas_cb(Fl_Widget *w, void *data)
     p.weightFixed =  o->value[5]->value(); 
     p.weightFree =  o->value[6]->value(); 
     p.DistanceFactor =  o->value[7]->value(); 
-    p.method =  (int)o->choice[0]->value(); 
+    p.method =  o->CAD ? (int)o->choice[0]->value() : 2; 
     p.filter =  (int)o->choice[1]->value(); 
     HighOrderMeshOptimizer (GModel::current(),p);
+    printf("CPU TIME = %4f seconds\n",p.CPU);
   }
 
 
@@ -180,6 +225,13 @@ highOrderToolsWindow::highOrderToolsWindow(int deltaFontSize)
     int y = WB;
     int x = 2*WB;
 
+    output[0] = new Fl_Output
+      (x,y, IW, BH, "CAD MODEL");
+    output[0]->align(FL_ALIGN_RIGHT);
+    output[0]->value("AVAILABLE");
+
+    y += BH;
+
     butt[1] = new Fl_Check_Button
       (x,y, IW, BH, "Apply to visible entities only");
     butt[1]->type(FL_TOGGLE_BUTTON);
@@ -207,14 +259,15 @@ highOrderToolsWindow::highOrderToolsWindow(int deltaFontSize)
     value[0]->maximum(10);
     value[0]->step(1);
     value[0]->align(FL_ALIGN_RIGHT);
-    value[0]->value(1);
+    value[0]->value(meshOrder);
 
     y += BH;
 
     butt[0] = new Fl_Check_Button
       (x,y, IW, BH, "Use Incomplete Elements");
     butt[0]->type(FL_TOGGLE_BUTTON);
-    butt[0]->value(0);
+    butt[0]->value(!complete);
+    butt[0]->callback(change_completeness_cb);
 
     y += BH;
 
@@ -313,7 +366,7 @@ highOrderToolsWindow::highOrderToolsWindow(int deltaFontSize)
       };
 
       
-      static Fl_Menu_Item menu_filter[] = {
+      static Fl_Menu_Item menu_strategy[] = {
         {"GLOBAL", 0, 0, 0},
         {"BLOBS ", 0, 0, 0},
         {0}
@@ -328,8 +381,8 @@ highOrderToolsWindow::highOrderToolsWindow(int deltaFontSize)
 
       y += BH;
       choice[1] = new Fl_Choice
-        (x,y, IW, BH, "Filter");
-      choice[1]->menu(menu_filter);
+        (x,y, IW, BH, "Strategy");
+      choice[1]->menu(menu_strategy);
       choice[1]->align(FL_ALIGN_RIGHT);
       
 
@@ -382,10 +435,17 @@ highOrderToolsWindow::highOrderToolsWindow(int deltaFontSize)
 
 void highOrderToolsWindow::show(bool redrawOnly)
 {
+  getMeshInfo (GModel::current(),meshOrder,complete, CAD); 
+
   if(win->shown() && redrawOnly)
     win->redraw();
-  else
+  else {
+    value[0]->value(meshOrder);
+    butt[0]->value(!complete);
+    if (CAD)output[0]->value("AVAILABLE");
+    else output[0]->value("NOT AVAILABLE");
     win->show();
+  }
 }
 void highordertools_cb(Fl_Widget *w, void *data)
 {
diff --git a/Fltk/highOrderToolsWindow.h b/Fltk/highOrderToolsWindow.h
index 9a1506dd107269060e9a3c925f367a457b866b79..43862d8daa1c4ff2769d8f59ff4648c8de5ca54c 100644
--- a/Fltk/highOrderToolsWindow.h
+++ b/Fltk/highOrderToolsWindow.h
@@ -13,15 +13,19 @@
 #include <FL/Fl_Button.H>
 #include <FL/Fl_Check_Button.H>
 #include <FL/Fl_Input.H>
+#include <FL/Fl_Output.H>
 #include "GmshConfig.h"
 
 class highOrderToolsWindow{
  public:
+  bool CAD, complete;
+  int meshOrder;
   Fl_Window *win;
   Fl_Check_Button *butt[20];
   Fl_Value_Input *value[20];
   Fl_Choice *choice[20];
   Fl_Button *push[20];
+  Fl_Output *output[20];
  public:
   highOrderToolsWindow(int deltaFontSize=0);
   void show(bool redrawOnly);
diff --git a/Mesh/Field.cpp b/Mesh/Field.cpp
index addd52d47e0ff9922afe0c38043ee81f511ec5ee..f7c1cec6d4722fa2d1e99911c0150c802e1cda58 100644
--- a/Mesh/Field.cpp
+++ b/Mesh/Field.cpp
@@ -1961,7 +1961,7 @@ void BoundaryLayerField::operator() (double x, double y, double z,
     }
     for(std::list<int>::iterator it = edges_id.begin();
 	it != edges_id.end(); ++it) {
-      _att_fields.push_back(new AttractorField(1,*it,3000));
+      _att_fields.push_back(new AttractorField(1,*it,100000));
     }
     for(std::list<int>::iterator it = faces_id.begin();
 	it != faces_id.end(); ++it) {
diff --git a/Mesh/HighOrder.cpp b/Mesh/HighOrder.cpp
index fc188427649d5a8f48e8e0fa1bdc710686f6aaeb..43b1f16f2dd34140a3f718cecd1752e6de866ef2 100644
--- a/Mesh/HighOrder.cpp
+++ b/Mesh/HighOrder.cpp
@@ -1374,3 +1374,97 @@ void computeDistanceFromMeshToGeometry (GModel *m, distanceFromMeshToGeometry_t
     
   }
 }
+
+
+void SetHighOrderComplete (GModel *m, bool onlyVisible){
+  faceContainer faceVertices;
+  for(GModel::fiter it = m->firstFace(); it != m->lastFace(); ++it) {
+    if (onlyVisible && !(*it)->getVisibility())continue;
+    std::vector<MTriangle*> newT;
+    std::vector<MQuadrangle*> newQ;
+    for (int i=0;i<(*it)->triangles.size();i++){
+      MTriangle *t = (*it)->triangles[i];
+      std::vector<MVertex*> vf, vt;     
+      int nPts = t->getPolynomialOrder() - 1;
+      MTriangle TEMP (t->getVertex(0), t->getVertex(1), t->getVertex(2));
+      getFaceVertices (*it, t, t, vf, faceVertices, false, nPts);
+      for (int j=3;j<t->getNumVertices();j++)vt.push_back(t->getVertex(j));
+      vt.insert(vt.end(), vf.begin(), vf.end());
+      MTriangleN *newTr = new MTriangleN(t->getVertex(0), t->getVertex(1), t->getVertex(2),
+					 vt, nPts + 1);
+      newT.push_back(newTr);
+      
+      delete t;
+    }
+    (*it)->triangles = newT;
+
+    for (int i=0;i<(*it)->quadrangles.size();i++){
+      MQuadrangle *t = (*it)->quadrangles[i];
+      std::vector<MVertex*> vf, vt;     
+      int nPts = t->getPolynomialOrder() - 1;
+      MQuadrangle TEMP (t->getVertex(0), t->getVertex(1), t->getVertex(2), t->getVertex(3));
+      getFaceVertices (*it, t, &TEMP, vf, faceVertices, false, nPts);
+      for (int j=4;j<t->getNumVertices();j++)vt.push_back(t->getVertex(j));
+      vt.insert(vt.end(), vf.begin(), vf.end());
+      newQ.push_back(new MQuadrangleN(t->getVertex(0), t->getVertex(1), t->getVertex(2), t->getVertex(3),
+				      vt, nPts + 1));
+      
+      delete t;
+    }
+    (*it)->quadrangles = newQ;
+
+
+    std::set<MVertex*> newV;
+    for (int i=0;i<(*it)->getNumMeshElements();++i){
+      MElement *e = (*it)->getMeshElement(i);
+      for (int j=0;j<e->getNumVertices();j++)newV.insert(e->getVertex(j));
+    }
+    (*it)->mesh_vertices.clear();
+    (*it)->mesh_vertices.insert((*it)->mesh_vertices.begin(), newV.begin(), newV.end());
+
+
+  } 
+}
+
+
+void SetHighOrderInComplete (GModel *m, bool onlyVisible){
+  std::set<MVertex*> toDelete;
+  for(GModel::fiter it = m->firstFace(); it != m->lastFace(); ++it) {
+    if (onlyVisible && !(*it)->getVisibility())continue;
+    std::vector<MTriangle*> newT;
+    std::vector<MQuadrangle*> newQ;
+    for (int i=0;i<(*it)->triangles.size();i++){
+      MTriangle *t = (*it)->triangles[i];
+      std::vector<MVertex*> vt;     
+      int order = t->getPolynomialOrder();
+      for (int j=3;j<t->getNumVertices()-t->getNumFaceVertices();j++)vt.push_back(t->getVertex(j));
+      for (int j=t->getNumVertices()-t->getNumFaceVertices();j<t->getNumVertices();j++)toDelete.insert(t->getVertex(j));
+      newT.push_back(new MTriangleN(t->getVertex(0), t->getVertex(1), t->getVertex(2),
+				    vt, order));
+      
+      delete t;
+    }
+    (*it)->triangles = newT;
+
+    for (int i=0;i<(*it)->quadrangles.size();i++){
+      MQuadrangle *t = (*it)->quadrangles[i];
+      std::vector<MVertex*> vt;     
+      int nPts = t->getPolynomialOrder() - 1;
+      for (int j=4;j<t->getNumVertices()-t->getNumFaceVertices();j++)vt.push_back(t->getVertex(j));
+      newQ.push_back(new MQuadrangleN(t->getVertex(0), t->getVertex(1), t->getVertex(2), t->getVertex(3),
+				      vt, nPts + 1));      
+      delete t;
+    }
+    (*it)->quadrangles = newQ;
+    std::vector<MVertex*> newV;
+    for (int i=0;i<(*it)->mesh_vertices.size();++i){
+      if (toDelete.find((*it)->mesh_vertices[i]) == toDelete.end())
+	newV.push_back((*it)->mesh_vertices[i]);
+      else
+	delete (*it)->mesh_vertices[i];
+    }
+    (*it)->mesh_vertices = newV;
+  }
+ 
+}
+
diff --git a/Mesh/HighOrder.h b/Mesh/HighOrder.h
index f8f5090f0f4f0d8532267aa95e0d71625a9ff067..49be09e410236f4d40eab5a08c280b340f05d402 100644
--- a/Mesh/HighOrder.h
+++ b/Mesh/HighOrder.h
@@ -22,6 +22,8 @@ typedef std::map<MFace, std::vector<MVertex*>, Less_Face> faceContainer;
 void SetOrder1(GModel *m, bool onlyVisible = false);
 void SetOrderN(GModel *m, int order, bool linear=true, bool incomplete=false, bool onlyVisible = false);
 void ElasticAnalogy ( GModel *m, double threshold, bool onlyVisible);
+void SetHighOrderComplete (GModel *m, bool onlyVisible); // generate complete elements
+void SetHighOrderInComplete (GModel *m, bool onlyVisible); // generate in-complete elements
 MTriangle* setHighOrder(MTriangle *t, GFace *gf, 
                         edgeContainer &edgeVertices, 
                         faceContainer &faceVertices, 
diff --git a/contrib/HighOrderMeshOptimizer/OptHomRun.cpp b/contrib/HighOrderMeshOptimizer/OptHomRun.cpp
index 022e1b00d7d008d4ad4c37386a23771ed241cc24..af13664aa191bd585d37ecf239675e6e27ee2f62 100644
--- a/contrib/HighOrderMeshOptimizer/OptHomRun.cpp
+++ b/contrib/HighOrderMeshOptimizer/OptHomRun.cpp
@@ -424,6 +424,9 @@ static std::vector<std::set<MElement*> > splitConnex(const std::set<MElement*> &
 
 void HighOrderMeshOptimizer (GModel *gm, OptHomParameters &p)
 {
+
+  clock_t t1 = clock();
+
   int samples = 20;
 
 //  int method = Mesh::METHOD_RELAXBND | Mesh::METHOD_PHYSCOORD | Mesh::METHOD_PROJJAC;
@@ -437,7 +440,7 @@ void HighOrderMeshOptimizer (GModel *gm, OptHomParameters &p)
   else if (p.method == 2)
     method = Mesh::METHOD_FIXBND | Mesh::METHOD_PHYSCOORD | Mesh::METHOD_PROJJAC;
 
-  printf("p.method = %d\n",p.method);
+  //  printf("p.method = %d\n",p.method);
 
 //  int method = Mesh::METHOD_SURFCOORD | Mesh::METHOD_PROJJAC;
 //  int method = Mesh::METHOD_RELAXBND | Mesh::METHOD_SURFCOORD | Mesh::METHOD_PROJJAC;
@@ -513,4 +516,6 @@ void HighOrderMeshOptimizer (GModel *gm, OptHomParameters &p)
       //      temp->mesh.writeMSH("final.msh");
     }
   }  
+  clock_t t2 = clock();
+  p.CPU = (double)(t2-t2)/CLOCKS_PER_SEC;
 }
diff --git a/contrib/HighOrderMeshOptimizer/OptHomRun.h b/contrib/HighOrderMeshOptimizer/OptHomRun.h
index 83e3107bde73ba9f7b943d046433f0396c6fbbce..feac05b006f3b45f0ecac6ad5d0595748b926c85 100644
--- a/contrib/HighOrderMeshOptimizer/OptHomRun.h
+++ b/contrib/HighOrderMeshOptimizer/OptHomRun.h
@@ -21,7 +21,7 @@ struct OptHomParameters {
   // OUTPUT ------> 
   int SUCCESS ; // 0 --> success , 1 --> Not converged
   double minJac, maxJac; // after optimization, range of jacobians
-  double DT; // Time for optimization
+  double CPU; // Time for optimization
   
   OptHomParameters () 
   // default values