diff --git a/Mesh/simple3D.cpp b/Mesh/simple3D.cpp
index 97dde8d8745983026b6aeb1d183cd2b74c7c8b29..83b2c49d2729a80712b8920f57b40f1e4a984486 100644
--- a/Mesh/simple3D.cpp
+++ b/Mesh/simple3D.cpp
@@ -59,6 +59,7 @@ class Metric{
 class Node{
  private:
   int layer;
+  int limit;
   double h;
   Metric m;
   SPoint3 point;
@@ -69,10 +70,12 @@ class Node{
   Node(SPoint3);
   ~Node();
   void set_layer(int);
+  void set_limit(int);
   void set_size(double);
   void set_metric(Metric);
   void set_point(SPoint3);
   int get_layer();
+  int get_limit();
   double get_size();
   Metric get_metric();
   SPoint3 get_point();
@@ -239,10 +242,13 @@ double Metric::get_m33(){
 
 /*********class Node*********/
 
-Node::Node(){}
+Node::Node(){
+  limit = -1;
+}
 
 Node::Node(SPoint3 new_point){
   point = new_point;
+  limit = -1;
 }
 
 Node::~Node(){}
@@ -251,6 +257,10 @@ void Node::set_layer(int new_layer){
   layer = new_layer;
 }
 
+void Node::set_limit(int new_limit){
+  limit = new_limit;
+}
+
 void Node::set_size(double new_h){
   h = new_h;
 }
@@ -267,6 +277,10 @@ int Node::get_layer(){
   return layer;
 }
 
+int Node::get_limit(){
+  return limit;
+}
+
 double Node::get_size(){
   return h;
 }
@@ -354,8 +368,8 @@ void Filler::treat_region(GRegion* gr){
   unsigned int i;
   int j;
   int count;
+  int limit;
   bool ok2;
-  bool val;
   double x,y,z;
   SPoint3 point;
   Node *node,*individual,*parent;
@@ -371,9 +385,10 @@ void Filler::treat_region(GRegion* gr){
   std::vector<MVertex*> boundary_vertices;
   std::set<MVertex*> temp;
   std::list<GFace*> faces;
-  std::set<MVertex*> retired;
+  std::map<MVertex*,int> limits;
   std::set<MVertex*>::iterator it;
   std::list<GFace*>::iterator it2;
+  std::map<MVertex*,int>::iterator it3;
   RTree<Node*,double,3,double> rtree;
   
   Frame_field::init_region(gr);
@@ -385,37 +400,47 @@ void Filler::treat_region(GRegion* gr){
   temp.clear();
   new_vertices.clear();
   faces.clear();
-  retired.clear();
+  limits.clear();
 
   faces = gr->faces();	
   for(it2=faces.begin();it2!=faces.end();it2++){
     gf = *it2;
-	val = code(gf->tag());
+	limit = code(gf->tag());
 	for(i=0;i<gf->getNumMeshElements();i++){
 	  element = gf->getMeshElement(i);
       for(j=0;j<element->getNumVertices();j++){
 	    vertex = element->getVertex(j);
-		if(val){
-		  retired.insert(vertex);
-		}
-		//temp.insert(vertex);
+		temp.insert(vertex);
+		limits.insert(std::pair<MVertex*,int>(vertex,limit));
 	  }
 	}
   }
 		
-  for(i=0;i<gr->getNumMeshElements();i++){
+  /*for(i=0;i<gr->getNumMeshElements();i++){
     element = gr->getMeshElement(i);
     for(j=0;j<element->getNumVertices();j++){
       vertex = element->getVertex(j);
       temp.insert(vertex);
     }
-  }
+  }*/
 
   for(it=temp.begin();it!=temp.end();it++){
+    if((*it)->onWhat()->dim()==1){
+	  boundary_vertices.push_back(*it);
+	}
+  }
+	
+  for(it=temp.begin();it!=temp.end();it++){
+    if((*it)->onWhat()->dim()==2){
+	  boundary_vertices.push_back(*it);
+	}
+  }
+	
+  /*for(it=temp.begin();it!=temp.end();it++){
     if((*it)->onWhat()->dim()<3){
       boundary_vertices.push_back(*it);
     }
-  }
+  }*/
   //std::ofstream file("nodes.pos");
   //file << "View \"test\" {\n";	
 
@@ -427,10 +452,12 @@ void Filler::treat_region(GRegion* gr){
     node = new Node(SPoint3(x,y,z));
     compute_parameters(node,gr);
 	node->set_layer(0);
-    rtree.Insert(node->min,node->max,node);
-	if(retired.find(boundary_vertices[i])==retired.end()){
-      fifo.push(node);
-	}
+	
+	it3 = limits.find(boundary_vertices[i]);
+	node->set_limit(it3->second);
+	
+	rtree.Insert(node->min,node->max,node);
+	fifo.push(node);
     //print_node(node,file);
   }
   
@@ -439,7 +466,11 @@ void Filler::treat_region(GRegion* gr){
     parent = fifo.front();
 	fifo.pop();
 	garbage.push_back(parent);
-	
+	  
+	if(parent->get_limit()!=-1 && parent->get_layer()>=parent->get_limit()){
+	  continue;
+	}
+	  
 	spawns.clear();
 	spawns.resize(6);
 	  
@@ -460,6 +491,7 @@ void Filler::treat_region(GRegion* gr){
 	  if(inside_domain(octree,x,y,z)){
 		compute_parameters(individual,gr);
 		individual->set_layer(parent->get_layer()+1);
+		individual->set_limit(parent->get_limit());
 		
 		if(far_from_boundary(octree,individual)){
 		  wrapper.set_ok(1);
@@ -727,22 +759,25 @@ double Filler::improvement(GEntity* ge,MElementOctree* octree,SPoint3 point,doub
   return average;
 }
 
-bool Filler::code(int x){
-  bool val;
+int Filler::code(int tag){
+  int limit;
   std::string s;
   std::stringstream s2;
   
-  val = 0;
-  s2 << x;
+  limit = -1;
+  s2 << tag;
   s = s2.str();
 	
   if(s.length()>=5){
-    if(s.at(0)=='1' && s.at(1)=='2' && s.at(2)=='3' && s.at(3)=='4' && s.at(4)=='5'){
-	  val = 1;
+    if(s.at(0)=='1' && s.at(1)=='1' && s.at(2)=='1' && s.at(3)=='1' && s.at(4)=='1'){
+	  limit = 0;
+	}
+	else if(s.at(0)=='2' && s.at(1)=='2' && s.at(2)=='2' && s.at(3)=='2' && s.at(4)=='2'){
+	  limit = 1;
 	}
   }
   
-  return val;
+  return limit;
 }
 
 int Filler::get_nbr_new_vertices(){
@@ -779,29 +814,29 @@ void Filler::print_node(Node* node,std::ofstream& file){
   h = node->get_size();
   m = node->get_metric();
 
-  x1 = x + h*m.get_m11();
-  y1 = y + h*m.get_m21();
-  z1 = z + h*m.get_m31();
+  x1 = x + k1*h*m.get_m11();
+  y1 = y + k1*h*m.get_m21();
+  z1 = z + k1*h*m.get_m31();
 
-  x2 = x - h*m.get_m11();
-  y2 = y - h*m.get_m21();
-  z2 = z - h*m.get_m31();
+  x2 = x - k1*h*m.get_m11();
+  y2 = y - k1*h*m.get_m21();
+  z2 = z - k1*h*m.get_m31();
 
-  x3 = x + h*m.get_m12();
-  y3 = y + h*m.get_m22();
-  z3 = z + h*m.get_m32();
+  x3 = x + k1*h*m.get_m12();
+  y3 = y + k1*h*m.get_m22();
+  z3 = z + k1*h*m.get_m32();
 
-  x4 = x - h*m.get_m12();
-  y4 = y - h*m.get_m22();
-  z4 = z - h*m.get_m32();
+  x4 = x - k1*h*m.get_m12();
+  y4 = y - k1*h*m.get_m22();
+  z4 = z - k1*h*m.get_m32();
 
-  x5 = x + h*m.get_m13();
-  y5 = y + h*m.get_m23();
-  z5 = z + h*m.get_m33();
+  x5 = x + k1*h*m.get_m13();
+  y5 = y + k1*h*m.get_m23();
+  z5 = z + k1*h*m.get_m33();
 
-  x6 = x - h*m.get_m13();
-  y6 = y - h*m.get_m23();
-  z6 = z - h*m.get_m33();
+  x6 = x - k1*h*m.get_m13();
+  y6 = y - k1*h*m.get_m23();
+  z6 = z - k1*h*m.get_m33();
 
   print_segment(SPoint3(x,y,z),SPoint3(x1,y1,z1),file);
   print_segment(SPoint3(x,y,z),SPoint3(x2,y2,z2),file);
diff --git a/Mesh/simple3D.h b/Mesh/simple3D.h
index 0e75010f9653958664464a2273e06319d9d24ea2..4bddedcf72a18eac0c2928e08da8865169343b9e 100644
--- a/Mesh/simple3D.h
+++ b/Mesh/simple3D.h
@@ -26,7 +26,7 @@ class Filler{
   void compute_parameters(Node*,GEntity*);
   void create_spawns(GEntity*,MElementOctree*,Node*,std::vector<Node*>&);
   double improvement(GEntity*,MElementOctree*,SPoint3,double,SVector3);
-  bool code(int);
+  int code(int);
   void print_segment(SPoint3,SPoint3,std::ofstream&);
   void print_node(Node*,std::ofstream&);
  public: