diff --git a/Mesh/periodical.cpp b/Mesh/periodical.cpp
index 914202ba9bfb84b3352e92fa2709a2e15bfe4ce0..4fa3f88338f3897acb087f9a888cf382d8519765 100644
--- a/Mesh/periodical.cpp
+++ b/Mesh/periodical.cpp
@@ -102,12 +102,18 @@ void voroMetal3D::execute(GRegion* gr){
 }
 
 void voroMetal3D::execute(std::vector<double>& vertices){
-  std::vector<SPoint3> pts;
-  for (unsigned int i=0;i<vertices.size()/3;i++){
-    SPoint3 pp (vertices[3*i],vertices[3*i+1],vertices[3*i+2]);
-    pts.push_back(pp);
+  unsigned int i;
+  SPoint3 point;
+  std::vector<SPoint3> temp;
+  
+  temp.clear();	
+	
+  for(i=0;i<vertices.size()/3;i++){
+	point = SPoint3(vertices[3*i],vertices[3*i+1],vertices[3*i+2]);
+    temp.push_back(point);
   }
-  execute(pts);
+  
+  execute(temp);
 }
 
 void voroMetal3D::execute(std::vector<SPoint3>& vertices)
@@ -130,6 +136,7 @@ void voroMetal3D::execute(std::vector<SPoint3>& vertices)
   double min_x,max_x;
   double min_y,max_y;
   double min_z,max_z;
+  double min_area;
   voronoicell_neighbor* pointer;
   voronoicell_neighbor cell;
   std::vector<int> faces;
@@ -138,6 +145,7 @@ void voroMetal3D::execute(std::vector<SPoint3>& vertices)
   std::vector<SPoint3> generators;
   std::vector<int> temp;
   std::vector<int> temp2;
+  std::vector<double> areas;
   geo_cell obj;
 
   min_x = 1000000000.0;
@@ -179,10 +187,27 @@ void voroMetal3D::execute(std::vector<SPoint3>& vertices)
 
   initialize_counter();
 
+  min_area = 1000000000.0;
+	
+  for(i=0;i<pointers.size();i++){
+    areas.clear();
+	
+    pointers[i]->face_areas(areas);
+	  
+    for(j=0;j<areas.size();j++){
+	  if(areas[j]<min_area){
+	    min_area = areas[j];
+	  }
+	}
+  }
+	
+  printf("Squared root of smallest face area : %.9f\n",sqrt(min_area));
+		
   std::ofstream file("cells.pos");
   file << "View \"test\" {\n";
   std::ofstream file2("cells.geo");
   file2 << "c = 1.0;\n";
+		
   for(i=0;i<pointers.size();i++){
 	obj = geo_cell();
 
@@ -288,6 +313,7 @@ void voroMetal3D::execute(std::vector<SPoint3>& vertices)
 	print_geo_volume(get_counter(),obj.face_loops2,file2);
 	increase_counter();
   }
+
   file2 << "Coherence;\n";	
   file << "};\n";
 
@@ -365,20 +391,30 @@ void voroMetal3D::print_geo_face_loop(int index,std::vector<int>& indices,std::o
   file << "};\n";
 }
 
-void voroMetal3D::correspondance(){
+void voroMetal3D::correspondance(double e){
   unsigned int i;
   unsigned int j;
+  int count;
+  int count2;
   bool flag;
-  double e;
+  double x,y,z;
+  double delta_x;
+  double delta_y;
+  double delta_z;
+  SPoint3 p1;
+  SPoint3 p2;
   GFace* gf;
   GModel* model = GModel::current();
   GModel::fiter it;
   std::vector<GFace*> faces;
+  std::list<GVertex*> vertices;
+  std::map<GFace*,SPoint3> centers;
   std::map<GFace*,bool> markings;
-  std::map<GFace*,bool>::iterator it1;
-  std::map<GFace*,bool>::iterator it2;
-  surface_params params1;
-  surface_params params2;
+  std::list<GVertex*>::iterator it2;
+  std::map<GFace*,SPoint3>::iterator it3;
+  std::map<GFace*,SPoint3>::iterator it4;
+  std::map<GFace*,bool>::iterator it5;
+  std::map<GFace*,bool>::iterator it6;
 	
   faces.clear();	
 	
@@ -388,50 +424,121 @@ void voroMetal3D::correspondance(){
 	if(gf->numRegions()==1){
 	  faces.push_back(gf);
 	}
-	printf("%d ",gf->numRegions());
   }
-  printf("\n");
-	
-  printf("%zu\n",faces.size());
 	
+  centers.clear();
   markings.clear();	
 	
+  for(i=0;i<faces.size();i++){
+	x = 0.0;
+	y = 0.0;
+	z = 0.0;
+	
+	vertices.clear();
+	
+	vertices = faces[i]->vertices();
+	
+	for(it2=vertices.begin();it2!=vertices.end();it2++){
+	  x = x + (*it2)->x();
+	  y = y + (*it2)->y();
+	  z = z + (*it2)->z();
+    }
+	  
+	x = x/vertices.size();
+	y = y/vertices.size();
+	z = z/vertices.size();
+	  
+	centers.insert(std::pair<GFace*,SPoint3>(faces[i],SPoint3(x,y,z)));
+  }	
+	
   for(i=0;i<faces.size();i++){
     markings.insert(std::pair<GFace*,bool>(faces[i],0));
   }
 	
-  e = 0.000001;	
-  
+  count = 0;
+  count2 = 0;
+	
   std::ofstream file;
   file.open("cells.geo",std::ios::out | std::ios::app);	
+  std::ofstream file2("check.pos");
+  file2 << "View \"test\" {\n";	
+		
+  printf("Face 1 nbr. - Face 2 nbr.\n");	
 	
   for(i=0;i<faces.size();i++){
     for(j=0;j<faces.size();j++){
 	  flag = 0;	
 	
-	  params1 = faces[i]->getSurfaceParams();
-	  params2 = faces[j]->getSurfaceParams();
+	  it3 = centers.find(faces[i]);
+	  it4 = centers.find(faces[j]);
+		
+	  p1 = it3->second;
+	  p2 = it4->second;
+		
+	  delta_x = fabs(p2.x()-p1.x());
+	  delta_y = fabs(p2.y()-p1.y());
+	  delta_z = fabs(p2.z()-p1.z());
 		
-	  if(fabs(params1.cx-params2.cx)<1.0+e && fabs(params1.cx-params2.cx)>1.0-e && fabs(params1.cy-params2.cy)<e && fabs(params1.cz-params2.cz)<e){
+	  if(equal(delta_x,1.0,e) && equal(delta_y,0.0,e) && equal(delta_z,0.0,e)){
+	    flag = 1;
+	  }
+	  if(equal(delta_x,0.0,e) && equal(delta_y,1.0,e) && equal(delta_z,0.0,e)){
+	    flag = 1;
+	  }
+	  if(equal(delta_x,0.0,e) && equal(delta_y,0.0,e) && equal(delta_z,1.0,e)){
+	    flag = 1;
+	  }
+	  
+	  if(equal(delta_x,1.0,e) && equal(delta_y,1.0,e) && equal(delta_z,0.0,e)){
+	    flag = 1;
+	  }
+	  if(equal(delta_x,0.0,e) && equal(delta_y,1.0,e) && equal(delta_z,1.0,e)){
 	    flag = 1;
 	  }
-	  if(fabs(params1.cy-params2.cy)<1.0+e && fabs(params1.cy-params2.cy)>1.0-e && fabs(params1.cx-params2.cx)<e && fabs(params1.cz-params2.cz)<e){
+	  if(equal(delta_x,1.0,e) && equal(delta_y,0.0,e) && equal(delta_z,1.0,e)){
 	    flag = 1;
 	  }
-	  if(fabs(params1.cz-params2.cz)<1.0+e && fabs(params1.cz-params2.cz)>1.0-e && fabs(params1.cy-params2.cy)<e && fabs(params1.cx-params2.cx)<e){
+			
+	  if(equal(delta_x,1.0,e) && equal(delta_y,1.0,e) && equal(delta_z,1.0,e)){
 	    flag = 1;
 	  }
 		
 	  if(flag){
-	    it1 = markings.find(faces[i]); 
-	    it2 = markings.find(faces[j]);
-		if(it1->second==0 && it2->second==0){
-		  it1->second = 1;
-		  it2->second = 1;
+	    it5 = markings.find(faces[i]);
+	    it6 = markings.find(faces[j]);
+		if(it5->second==0 && it6->second==0){
+		  it5->second = 1;
+		  it6->second = 1;
+		  
 		  printf("%d %d\n",faces[i]->tag(),faces[j]->tag());
+		  print_segment(p1,p2,file2);
 		  //file << faces[i]->tag() << " " << faces[j]->tag() << "\n";
+		  
+		  count++;
+		}
+		else{
+		  count2++;
 		}
 	  }
 	}
   }
+
+  file2 << "};\n";
+	
+  printf("Number of linked exterior faces : %d\n",2*count);
+  printf("Total number of exterior faces : %zu\n",faces.size());
+  printf("Number of mislinked : %d\n",count2-count);
+}
+
+bool voroMetal3D::equal(double x,double y,double e){
+  bool flag;
+	
+  if(x>y-e && x<y+e){
+    flag = 1;
+  }
+  else{
+    flag = 0;
+  }
+	
+  return flag;
 }
\ No newline at end of file
diff --git a/Mesh/periodical.h b/Mesh/periodical.h
index 066b18904537884d9ebedce1ac210bc3cff7aaa4..255fa2f9d1eb4f2da457c325fcda3427af2535bd 100644
--- a/Mesh/periodical.h
+++ b/Mesh/periodical.h
@@ -28,5 +28,6 @@ class voroMetal3D{
   void print_geo_volume(int,int,std::ofstream&);
   void print_geo_line_loop(int,std::vector<int>&,std::vector<int>&,std::ofstream&);
   void print_geo_face_loop(int,std::vector<int>&,std::ofstream&);
-  void correspondance();
+  void correspondance(double);
+  bool equal(double,double,double);
 };