diff --git a/Mesh/periodical.cpp b/Mesh/periodical.cpp
index 1361b4dbc2532e235fe1de4f5e8b884d42bc1110..cfa384f8dd0cfce5adafed931f161eb175ba3c89 100644
--- a/Mesh/periodical.cpp
+++ b/Mesh/periodical.cpp
@@ -395,7 +395,9 @@ void voroMetal3D::correspondance(double e){
   unsigned int i;
   unsigned int j;
   int count;
-  int index;
+  int val;
+  int normal;
+  int phase;
   bool flag;
   bool flag1;
   bool flag2;
@@ -418,11 +420,14 @@ void voroMetal3D::correspondance(double e){
   GModel::fiter it;
   std::vector<GFace*> faces;
   std::vector<std::pair<GFace*,GFace*> > pairs;
+  std::vector<int> categories;
   std::vector<int> indices1;
   std::vector<int> indices2;
   std::list<GVertex*> vertices;
   std::list<GEdge*> edges1;
   std::list<GEdge*> edges2;
+  std::list<int> orientations1;
+  std::list<int> orientations2;
   std::map<GFace*,SPoint3> centers;
   std::map<GFace*,bool> markings;
   std::list<GVertex*>::iterator it2;
@@ -432,6 +437,9 @@ void voroMetal3D::correspondance(double e){
   std::map<GFace*,bool>::iterator it6;
   std::list<GEdge*>::iterator it7;
   std::list<GEdge*>::iterator it8;
+  std::list<int>::iterator it9;
+  std::list<int>::iterator it10;
+  std::list<GEdge*>::iterator mem;
 	
   faces.clear();	
 	
@@ -446,6 +454,7 @@ void voroMetal3D::correspondance(double e){
   centers.clear();
   markings.clear();
   pairs.clear();
+  categories.clear();
 	
   for(i=0;i<faces.size();i++){
 	x = 0.0;
@@ -477,7 +486,8 @@ void voroMetal3D::correspondance(double e){
 	
   std::ofstream file("check.pos");
   file << "View \"test\" {\n";
-  std::ofstream file3("vectors");
+  
+  std::ofstream file2("vectors");
 	
   for(i=0;i<faces.size();i++){
     for(j=0;j<faces.size();j++){
@@ -491,7 +501,7 @@ void voroMetal3D::correspondance(double e){
 	  delta_y = fabs(p2.y()-p1.y());
 	  delta_z = fabs(p2.z()-p1.z());
 		
-	  flag = correspondance(delta_x,delta_y,delta_z,e);
+	  flag = correspondance(delta_x,delta_y,delta_z,e,val);
 		
 	  if(flag){
 	    it5 = markings.find(faces[i]);
@@ -502,10 +512,11 @@ void voroMetal3D::correspondance(double e){
 		  it6->second = 1;
 		  
 		  pairs.push_back(std::pair<GFace*,GFace*>(faces[i],faces[j]));
+		  categories.push_back(val);
 			
 		  print_segment(p1,p2,file);
 		  
-		  file3 << faces[i]->tag() << " " << faces[j]->tag() << " " << p2.x()-p1.x() << " " << p2.y()-p1.y() << " " << p2.z()-p1.z() << "\n";	
+		  file2 << faces[i]->tag() << " " << faces[j]->tag() << " " << p2.x()-p1.x() << " " << p2.y()-p1.y() << " " << p2.z()-p1.z() << "\n";	
 			
 		  count++;
 		}
@@ -518,9 +529,12 @@ void voroMetal3D::correspondance(double e){
   printf("\nNumber of exterior face periodicities : %d\n",2*count);
   printf("Total number of exterior faces : %zu\n\n",faces.size());
 	
-  std::ofstream file2;
-  file2.open("cells.geo",std::ios::out | std::ios::app);
-	
+  std::ofstream file3;
+  file3.open("cells.geo",std::ios::out | std::ios::app);
+  
+  std::ofstream file4("check2.pos");
+  file4 << "View \"test\" {\n";
+		
   for(i=0;i<pairs.size();i++){
     gf1 = pairs[i].first;
 	gf2 = pairs[i].second;
@@ -528,95 +542,183 @@ void voroMetal3D::correspondance(double e){
 	edges1 = gf1->edges();
 	edges2 = gf2->edges();  
 	 
+	orientations1 = gf1->edgeOrientations();
+	orientations2 = gf2->edgeOrientations();
+	  
 	indices1.clear();
 	indices2.clear();
 	  
+	phase = 1;
+	normal = 0;  
+	  
+	it9 = orientations1.begin(); 
 	for(it7=edges1.begin();it7!=edges1.end();it7++){
 	  v1 = (*it7)->getBeginVertex();
 	  v2 = (*it7)->getEndVertex();
 		
+	  indices1.push_back((*it7)->tag());
+		
 	  flag1 = 0;
 	  flag2 = 0;
 	  flag3 = 0;
 	  flag4 = 0;
-		
-	  indices1.push_back((*it7)->tag());	
-		
+			
+	  it10 = orientations2.begin();	
 	  for(it8=edges2.begin();it8!=edges2.end();it8++){
 	    v3 = (*it8)->getBeginVertex();
 		v4 = (*it8)->getEndVertex();
 		  
-		flag1 = correspondance(fabs(v3->x()-v1->x()),fabs(v3->y()-v1->y()),fabs(v3->z()-v1->z()),e);
-		flag2 = correspondance(fabs(v4->x()-v2->x()),fabs(v4->y()-v2->y()),fabs(v4->z()-v2->z()),e);
+		correspondance(fabs(v3->x()-v1->x()),fabs(v3->y()-v1->y()),fabs(v3->z()-v1->z()),e,categories[i],flag1);
+		correspondance(fabs(v4->x()-v2->x()),fabs(v4->y()-v2->y()),fabs(v4->z()-v2->z()),e,categories[i],flag2);
 		  
-		flag3 = correspondance(fabs(v4->x()-v1->x()),fabs(v4->y()-v1->y()),fabs(v4->z()-v1->z()),e);
-		flag4 = correspondance(fabs(v3->x()-v2->x()),fabs(v3->y()-v2->y()),fabs(v3->z()-v2->z()),e);
+		correspondance(fabs(v4->x()-v1->x()),fabs(v4->y()-v1->y()),fabs(v4->z()-v1->z()),e,categories[i],flag3);
+		correspondance(fabs(v3->x()-v2->x()),fabs(v3->y()-v2->y()),fabs(v3->z()-v2->z()),e,categories[i],flag4);
 		  
 		if(flag1 && flag2){
-		  index = (*it8)->tag();
+	      if(phase==1){
+		    mem = it8;
+			phase = 2;
+		  }
+		  else if(phase==2){
+			mem++;
+			  
+			if(it8==mem){
+			  normal = 1;
+			}
+			else{
+			  normal = -1;
+			}
+			  
+			phase = 3;
+		  }
+			
+		  indices2.push_back((*it8)->tag());	
+			
+		  print_segment(SPoint3(v3->x(),v3->y(),v3->z()),SPoint3(v1->x(),v1->y(),v1->z()),file4);
+		  print_segment(SPoint3(v4->x(),v4->y(),v4->z()),SPoint3(v2->x(),v2->y(),v2->z()),file4);
 		}
 		else if(flag3 && flag4){
-		  index = -((*it8)->tag());
+		  if(phase==1){
+		    mem = it8;
+			phase = 2;
+		  }
+		  else if(phase==2){
+		    mem++;
+			  
+			if(it8==mem){
+			  normal = 1;
+			}
+			else{
+			  normal = -1;
+			}
+			  
+			phase = 3;
+		  }
+		  
+		  indices2.push_back(-(*it8)->tag());	
+			
+		  print_segment(SPoint3(v4->x(),v4->y(),v4->z()),SPoint3(v1->x(),v1->y(),v1->z()),file4);
+		  print_segment(SPoint3(v3->x(),v3->y(),v3->z()),SPoint3(v2->x(),v2->y(),v2->z()),file4);
 		}
+		  
+		it10++;
 	  }
-				
-	  indices2.push_back(index);
+		
+	  it9++;
 	}
 	  
 	if(indices1.size()!=indices2.size()){
 	  printf("Error\n\n");
 	}
 	  
-	file2 << "Periodic Surface " << gf1->tag() << " {";  
+	file3 << "Periodic Surface " << gf1->tag() << " {";  
 	  
 	for(j=0;j<indices1.size();j++){
-	  if(j>0) file2 << ",";
-	  file2 << indices1[j];
+	  if(j>0) file3 << ",";
+	  file3 << indices1[j];
 	}
 	  
-	file2 << "} = " << gf2->tag() << " {";
+	file3 << "} = " << gf2->tag() << " {";
 	  
 	for(j=0;j<indices2.size();j++){
-      if(j>0) file2 << ",";
-	  file2 << indices2[j];
+      if(j>0) file3 << ",";
+	  file3 << indices2[j];
 	}
 	  
-	file2 << "};\n";
+	file3 << "};\n";
   }
+	
+  file4 << "};\n";
 }
 
-bool voroMetal3D::correspondance(double delta_x,double delta_y,double delta_z,double e){
+bool voroMetal3D::correspondance(double delta_x,double delta_y,double delta_z,double e,int& val){
   bool flag;
 	
   flag = 0;
+  val = 1000;
 	
   if(equal(delta_x,1.0,e) && equal(delta_y,0.0,e) && equal(delta_z,0.0,e)){
     flag = 1;
+	val = 1;
   }
   if(equal(delta_x,0.0,e) && equal(delta_y,1.0,e) && equal(delta_z,0.0,e)){
     flag = 1;
+	val = 2;
   }
   if(equal(delta_x,0.0,e) && equal(delta_y,0.0,e) && equal(delta_z,1.0,e)){
     flag = 1;
+	val = 3;
   }
 	
   if(equal(delta_x,1.0,e) && equal(delta_y,1.0,e) && equal(delta_z,0.0,e)){
     flag = 1;
+	val = 4;
   }
   if(equal(delta_x,0.0,e) && equal(delta_y,1.0,e) && equal(delta_z,1.0,e)){
     flag = 1;
+	val = 5;
   }
   if(equal(delta_x,1.0,e) && equal(delta_y,0.0,e) && equal(delta_z,1.0,e)){
     flag = 1;
+	val = 6;
   }
 	
   if(equal(delta_x,1.0,e) && equal(delta_y,1.0,e) && equal(delta_z,1.0,e)){
     flag = 1;
+	val = 7;
   }
 	
   return flag;
 }
 
+void voroMetal3D::correspondance(double delta_x,double delta_y,double delta_z,double e,int val,bool& flag){
+  flag = 0;
+	
+  if(val==1 && equal(delta_x,1.0,e) && equal(delta_y,0.0,e) && equal(delta_z,0.0,e)){
+    flag = 1;
+  }
+  if(val==2 && equal(delta_x,0.0,e) && equal(delta_y,1.0,e) && equal(delta_z,0.0,e)){
+    flag = 1;
+  }
+  if(val==3 && equal(delta_x,0.0,e) && equal(delta_y,0.0,e) && equal(delta_z,1.0,e)){
+    flag = 1;
+  }
+	
+  if(val==4 && equal(delta_x,1.0,e) && equal(delta_y,1.0,e) && equal(delta_z,0.0,e)){
+    flag = 1;
+  }
+  if(val==5 && equal(delta_x,0.0,e) && equal(delta_y,1.0,e) && equal(delta_z,1.0,e)){
+    flag = 1;
+  }
+  if(val==6 && equal(delta_x,1.0,e) && equal(delta_y,0.0,e) && equal(delta_z,1.0,e)){
+    flag = 1;
+  }
+	
+  if(val==7 && equal(delta_x,1.0,e) && equal(delta_y,1.0,e) && equal(delta_z,1.0,e)){
+    flag = 1;
+  }
+}
+
 bool voroMetal3D::equal(double x,double y,double e){
   bool flag;