diff --git a/CMakeLists.txt b/CMakeLists.txt
index 16393c6634f342eb2a737c93738a76cb5e16da48..6cb12f9dd3ef0976449b883c84cfbb356246930c 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -133,7 +133,7 @@ set(GMSH_API
   Mesh/meshGEdge.h Mesh/meshGFace.h Mesh/meshGFaceOptimize.h
     Mesh/meshGFaceElliptic.h Mesh/meshPartition.h Mesh/meshGFaceDelaunayInsertion.h
     Mesh/simple3D.h Mesh/meshPartitionOptions.h Mesh/directions3D.h Mesh/yamakawa.h
-    Mesh/Voronoi3D.h Mesh/Levy3D.h Mesh/periodical.h Mesh/meshMetric.h
+    Mesh/Voronoi3D.h Mesh/Levy3D.h Mesh/periodical.h Mesh/meshMetric.h Mesh/ThinLayer.h
   Numeric/mathEvaluator.h
   Solver/dofManager.h Solver/femTerm.h Solver/laplaceTerm.h Solver/elasticityTerm.h
     Solver/crossConfTerm.h Solver/orthogonalTerm.h
diff --git a/Common/GmshDefines.h b/Common/GmshDefines.h
index d68ec33f65abc395e944a4cd0780eaa6e24b05c2..6a3e985ea7e2c84d34d081718bec9afe45a40315 100644
--- a/Common/GmshDefines.h
+++ b/Common/GmshDefines.h
@@ -237,6 +237,7 @@
 #define ALGO_2D_BAMG           7
 #define ALGO_2D_FRONTAL_QUAD   8
 #define ALGO_2D_PACK_PRLGRMS   9
+#define ALGO_2D_PACK_PRLGRMS_CSTR   10
 
 // 3D meshing algorithms (numbers should not be changed)
 #define ALGO_3D_DELAUNAY       1
diff --git a/Geo/GFace.h b/Geo/GFace.h
index 93b55f9a2d27cae84b9f3e60d3f8fdbc8e95d129..97e21ab0c84daae2135d9746d83c9fa968d479a5 100644
--- a/Geo/GFace.h
+++ b/Geo/GFace.h
@@ -74,6 +74,10 @@ class GFace : public GEntity{
   GFace(GModel *model, int tag);
   virtual ~GFace();
 
+
+  std::vector<MVertex*> additionalVertices;
+  std::set<MVertex*> constr_vertices;
+
   // delete mesh data
   virtual void deleteMesh();
 
diff --git a/Mesh/CMakeLists.txt b/Mesh/CMakeLists.txt
index c1cef52f21b542f243cbe9f3e6d49f77e4430dee..53c2aaca3b37f43c256d3756d416df3a7ba88a1c 100644
--- a/Mesh/CMakeLists.txt
+++ b/Mesh/CMakeLists.txt
@@ -35,7 +35,7 @@ set(SRC
     multiscalePartition.cpp
     QuadTriUtils.cpp
       QuadTriExtruded2D.cpp QuadTriExtruded3D.cpp QuadTriTransfinite3D.cpp
-    simple3D.cpp
+    simple3D.cpp ThinLayer.cpp
   DivideAndConquer.cpp
     Voronoi3D.cpp
     Levy3D.cpp
diff --git a/Mesh/ThinLayer.cpp b/Mesh/ThinLayer.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..8b6749a692db01cb684f23ff064ec53c4339c395
--- /dev/null
+++ b/Mesh/ThinLayer.cpp
@@ -0,0 +1,529 @@
+/*
+ * ThinLayer.cpp
+ *
+ *  Created on: Oct 13, 2014
+ *      Author: nicolas
+ */
+
+#include "ThinLayer.h"
+#include "GModel.h"
+#include "robustPredicates.h"
+#include "GRegion.h"
+
+
+CorrespVertices::CorrespVertices(){}
+CorrespVertices::~CorrespVertices(){}
+void CorrespVertices::setStartPoint(MVertex* v){
+	this->StartPoint = v;
+}
+void CorrespVertices::setEndPoint(SPoint3 p){
+	this->EndPoint = p;
+}
+void CorrespVertices::setStartNormal(SVector3 v){
+	this->StartNormal = v;
+}
+void CorrespVertices::setEndNormal(SVector3 v){
+	this->EndNormal = v;
+}
+void CorrespVertices::setEndTriangle(faceXtet f){
+	this->EndTriangle = f;
+}
+void CorrespVertices::setdistP2P(double d){
+	this->distP2P = d;
+}
+void CorrespVertices::setangleProd(double a){
+	this->angleProd = a;
+}
+void CorrespVertices::setActive(bool b){
+	this->Active = b;
+}
+void CorrespVertices::setEndTriangleActive(bool b){
+	this->EndTriangleActive = b;
+}
+void CorrespVertices::setIsMaster(bool b){
+	this->IsMaster = b;
+}
+void CorrespVertices::setTagMaster(int i){
+	this->tagMaster = i;
+}
+MVertex* CorrespVertices::getStartPoint(){
+	return StartPoint;
+}
+SPoint3 CorrespVertices::getEndPoint(){
+	return EndPoint;
+}
+SVector3 CorrespVertices::getStartNormal(){
+	return StartNormal;
+}
+SVector3 CorrespVertices::getEndNormal(){
+	return EndNormal;
+}
+faceXtet CorrespVertices::getEndTriangle(){
+	return EndTriangle;
+}
+double CorrespVertices::getdistP2P(){
+	return distP2P;
+}
+double CorrespVertices::getangleProd(){
+	return angleProd;
+}
+bool CorrespVertices::getActive(){
+	return Active;
+}
+bool CorrespVertices::getEndTriangleActive(){
+	return EndTriangleActive;
+}
+bool CorrespVertices::getIsMaster(){
+	return IsMaster;
+}
+int CorrespVertices::getTagMaster(){
+	return tagMaster;
+}
+
+
+
+ThinLayer::ThinLayer(){}
+
+ThinLayer::~ThinLayer(){}
+
+void ThinLayer::perform(){
+	ThinLayer::fillVertexToTets();
+	ThinLayer::fillTetToTet4();
+	std::map<MVertex*,double> AllDist = ThinLayer::computeAllDistToOppSide();
+	ThinLayer::checkOppositeTriangles();
+	ThinLayer::fillvecOfThinSheets();
+	std::set<MVertex*> constr_vertices;
+}
+
+void ThinLayer::checkOppositeTriangles(){
+	//all endTriangle will be set to active or not
+	for (std::map<MVertex*,std::vector<CorrespVertices*> >::iterator it1 = VertexToCorresp.begin();it1 != VertexToCorresp.end();it1++){
+		MVertex* vertTmp = (*it1).first;
+		std::vector<CorrespVertices*> vecCorr = (*it1).second;
+		for (unsigned int i = 0;i < vecCorr.size();i++){
+			CorrespVertices* currentCorr = vecCorr[i];
+			faceXtet currentEndTri = currentCorr->getEndTriangle();
+			MVertex* endP0 = currentEndTri.v[0];
+			MVertex* endP1 = currentEndTri.v[1];
+			MVertex* endP2 = currentEndTri.v[2];
+			std::map<MVertex*,std::vector<CorrespVertices*> >::iterator it2 = VertexToCorresp.find(endP0);
+			std::map<MVertex*,std::vector<CorrespVertices*> >::iterator it3 = VertexToCorresp.find(endP1);
+			std::map<MVertex*,std::vector<CorrespVertices*> >::iterator it4 = VertexToCorresp.find(endP2);
+			(*it1).second[i]->setEndTriangleActive(false);
+			if (it2 != VertexToCorresp.end()){
+				if (it3 != VertexToCorresp.end()){
+					if (it4 != VertexToCorresp.end()){
+						if ((*it2).second[0]->getActive()){
+							if ((*it3).second[0]->getActive()){
+								if ((*it4).second[0]->getActive()){
+									(*it1).second[i]->setEndTriangleActive(true);
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+}
+
+void ThinLayer::fillvecOfThinSheets(){
+	for (std::map<MVertex*,std::vector<CorrespVertices*> >::iterator it1 = VertexToCorresp.begin();it1 != VertexToCorresp.end();it1++){
+		MVertex* vertTmp = (*it1).first;
+		std::vector<CorrespVertices*> vecCorr = (*it1).second;
+		for (unsigned int i = 0;i < vecCorr.size();i++){
+			CorrespVertices* currentCorr = vecCorr[i];
+			if ((currentCorr->getStartPoint()->onWhat()->dim() == 2) && (currentCorr->getActive()) && (currentCorr->getEndTriangleActive()) && (currentCorr->getTagMaster() == (-2))){
+				//Found the first node of a new master sheet
+				std::vector<CorrespVertices*> MasterSheet;
+				MasterSheet.clear();
+				(*it1).second[i]->setTagMaster(-1);
+				faceXtet faceEndSlave = (*it1).second[i]->getEndTriangle();
+				for (unsigned int j = 0;j < 3;j++){
+					std::map<MVertex*,std::vector<CorrespVertices*> >::iterator it2 = VertexToCorresp.find(faceEndSlave.v[j]);
+					if (it2 != VertexToCorresp.end()){
+						if (faceEndSlave.v[j]->onWhat()->dim() == 2){
+							(*it2).second[0]->setTagMaster((*it1).second[i]->getStartPoint()->onWhat()->tag());
+						}
+					}
+				}
+				MasterSheet.push_back((*it1).second[i]);
+				std::set<MVertex*> CurrentSheet;
+				CurrentSheet.clear();
+				CurrentSheet.insert((*it1).second[i]->getStartPoint());
+				while (CurrentSheet.size() != 0){
+					MVertex* VToDo = (*CurrentSheet.begin());
+					std::vector<MTetrahedron*> surroundingTet = VertexToTets[VToDo];
+					for (unsigned int j = 0;j < surroundingTet.size();j++){
+						for (unsigned int k = 0;k < surroundingTet[j]->getNumVertices();k++){
+							MVertex* ToInsertTmp = surroundingTet[j]->getVertex(k);
+							std::map<MVertex*,std::vector<CorrespVertices*> >::iterator it2 = VertexToCorresp.find(ToInsertTmp);
+							if (ToInsertTmp->onWhat()->tag() == VToDo->onWhat()->tag()){//TODO: OR that onwhat -> dim <, for edges
+								if (it2 != VertexToCorresp.end()){
+									CorrespVertices* correspToInsert = ((*it2).second)[0];
+									if ((correspToInsert->getStartPoint()->onWhat()->dim() == 2) && (correspToInsert->getActive()) && (correspToInsert->getEndTriangleActive()) && (correspToInsert->getTagMaster() == (-2))){
+										MasterSheet.push_back((*it2).second[0]);
+										(*it2).second[0]->setTagMaster(-1);
+										faceXtet faceEndSlave2 = (*it2).second[0]->getEndTriangle();
+										for (unsigned int j = 0;j < 3;j++){
+											std::map<MVertex*,std::vector<CorrespVertices*> >::iterator it3 = VertexToCorresp.find(faceEndSlave2.v[j]);
+											if (it3 != VertexToCorresp.end()){
+												if (faceEndSlave2.v[j]->onWhat()->dim() == 2){
+													(*it3).second[0]->setTagMaster((*it2).second[i]->getStartPoint()->onWhat()->tag());
+												}
+											}
+										}
+										CurrentSheet.insert(ToInsertTmp);
+									}
+								}
+							}
+						}
+					}
+					CurrentSheet.erase(VToDo);
+				}
+				vecOfThinSheets.push_back(MasterSheet);
+			}
+		}
+	}
+}
+std::map<MVertex*,double> ThinLayer::computeAllDistToOppSide(){
+	std::map<MVertex*,double> AllDistToOppSide;
+	GModel *m = GModel::current();
+//	std::vector<MElement*> crackElements;
+	std::set<MVertex*> BoundaryVertices;
+
+
+
+	for (GModel::riter itr= m->firstRegion();itr != m->lastRegion();itr++){
+		GRegion* rTmp = (*itr);
+		for(unsigned int i = 0; i < rTmp->tetrahedra.size(); i++){
+			MTet4* tet4Tmp = TetToTet4[rTmp->tetrahedra[i]];
+			for (unsigned int j = 0;j < 4;j++){
+				if (tet4Tmp->getNeigh(j) == 0){
+					//find the 4th point,and fill the two vector of the boundary triangle
+					faceXtet fxtTmp(tet4Tmp,j);
+					for (int k = 0;k < 3;k++){
+						MVertex* toTest = fxtTmp.v[k];
+						if (toTest->onWhat()->dim() == 2){
+							if(BoundaryVertices.find(toTest) == BoundaryVertices.end()){
+								BoundaryVertices.insert(toTest);
+							}
+						}
+					}
+					//			crackElements.push_back(rTmp->getMeshElement(j));
+				}
+			}
+		}
+	}
+	for(std::set<MVertex*>::iterator it = BoundaryVertices.begin(); it != BoundaryVertices.end(); it++){
+		MVertex* toCompute = (*it);
+		double resultTmp = computeDistToOppSide(toCompute);
+		AllDistToOppSide[toCompute] = resultTmp;
+	}
+
+
+	return AllDistToOppSide;
+}
+
+double ThinLayer::computeDistToOppSide(MVertex* v){
+	double DistToOppSide;
+	//We assume v is on the boundary
+	//First we need to get the internal normal
+	SVector3 InteriorNormal = ThinLayer::computeInteriorNormal(v);
+	//Then we find the first triangle
+	MTet4* FirstTet = ThinLayer::getTetFromPoint(v,InteriorNormal);
+	MTet4* CurrentTet = FirstTet;
+	MTet4* PastTet = FirstTet;
+	SPoint3 CurrentPos = SPoint3(v->x(),v->y(),v->z());
+	SPoint3 LastPos = CurrentPos;
+	int* CurrentTri = 0;
+	CorrespVertices CVTemp;
+	CVTemp.setStartPoint(v);
+	CVTemp.setStartNormal(InteriorNormal);
+	FindNewPoint((&CurrentPos),CurrentTri,CurrentTet,InteriorNormal);
+	faceXtet fxtCV(CurrentTet,(*CurrentTri));
+//	while(CurrentTet->getNeigh((*CurrentTri)) != 0){
+	while(CurrentTet != 0){
+		PastTet = CurrentTet;
+		faceXtet fxtCVtmp(PastTet,(*CurrentTri));
+		FindNewPoint((&CurrentPos),CurrentTri,CurrentTet,InteriorNormal);
+		CurrentTet = CurrentTet->getNeigh((*CurrentTri));
+		DistToOppSide += CurrentPos.distance(LastPos);
+		LastPos = CurrentPos;
+	}
+	CVTemp.setEndPoint(LastPos);
+	CVTemp.setEndTriangle(fxtCV);
+	SVector3 EndDir1(fxtCV.v[1]->x() - fxtCV.v[0]->x(),fxtCV.v[1]->y() - fxtCV.v[0]->y(),fxtCV.v[1]->z() - fxtCV.v[0]->z());
+	SVector3 EndDir2(fxtCV.v[2]->x() - fxtCV.v[0]->x(),fxtCV.v[2]->y() - fxtCV.v[0]->y(),fxtCV.v[2]->z() - fxtCV.v[0]->z());
+	SVector3 EndNormal(EndDir1.y() * EndDir2.z() - EndDir1.z() * EndDir2.y(),EndDir1.z() * EndDir2.x() - EndDir1.x() * EndDir2.z(),EndDir1.x() * EndDir2.y() - EndDir1.y() * EndDir2.x());
+	EndNormal.normalize();
+	CVTemp.setEndNormal(EndNormal);
+	CVTemp.setangleProd(fabs(CVTemp.getStartNormal().x() * CVTemp.getEndNormal().x() + CVTemp.getStartNormal().y() * CVTemp.getEndNormal().y() + CVTemp.getStartNormal().z() * CVTemp.getEndNormal().z()));
+	CVTemp.setdistP2P(DistToOppSide);
+	if ((CVTemp.getangleProd() > angleMax) &&(CVTemp.getdistP2P() < distP2PMax)){
+		CVTemp.setActive(true);
+	}
+	else{
+		CVTemp.setActive(false);
+	}
+	CVTemp.setTagMaster(-2);
+	VertexToCorresp[v].push_back(&CVTemp);
+	return DistToOppSide;
+}
+
+SVector3 ThinLayer::computeInteriorNormal(MVertex* v){
+	SPoint3 InteriorNormal(0.0,0.0,0.0);
+	std::vector<MTetrahedron*> currentVecTet = VertexToTets[v];
+	std::vector<SPoint3> vecInteriorNodes;
+	std::vector<SPoint3> vecFirstDir;
+	std::vector<SPoint3> vecSecondDir;
+	for (unsigned int i = 0;i < currentVecTet.size();i++){
+		MTet4* tet4Tmp = TetToTet4[currentVecTet[i]];
+		for (int j = 0;j < 4 ; j++){
+			if (tet4Tmp->getNeigh(j) == 0){
+				//find the 4th point,and fill the two vector of the boundary triangle
+				faceXtet fxtTmp(tet4Tmp,j);
+				for (int k = 0;k < 4;k++){
+					bool foundInteriorPoint = true;
+					for (int l = 0;l < 3;l++){
+						if (tet4Tmp->tet()->getVertex(k) == fxtTmp.v[l]){
+							foundInteriorPoint = false;
+						}
+					}
+					if (foundInteriorPoint){
+						SPoint3 pointTmp(tet4Tmp->tet()->getVertex(k)->x(),tet4Tmp->tet()->getVertex(k)->y(),tet4Tmp->tet()->getVertex(k)->z());
+						vecInteriorNodes.push_back(pointTmp);
+					}
+				}
+				SPoint3 pointTmp1(fxtTmp.v[1]->x() - fxtTmp.v[0]->x(),fxtTmp.v[1]->y() - fxtTmp.v[0]->y(),fxtTmp.v[1]->z() - fxtTmp.v[0]->z());
+				SPoint3 pointTmp2(fxtTmp.v[2]->x() - fxtTmp.v[0]->x(),fxtTmp.v[2]->y() - fxtTmp.v[0]->y(),fxtTmp.v[2]->z() - fxtTmp.v[0]->z());
+				vecFirstDir.push_back(pointTmp1);
+				vecSecondDir.push_back(pointTmp2);
+			}
+		}
+	}
+	//at this point we have all the info necessary.
+	SPoint3 pointInteriorAverage(0.0,0.0,0.0);
+	for (unsigned int i = 0;i < vecInteriorNodes.size();i++){
+		pointInteriorAverage += SPoint3(vecInteriorNodes[i].x(),vecInteriorNodes[i].y(),vecInteriorNodes[i].z());
+//		pointInteriorAverage.x() += vecInteriorNodes[i].x();
+//		pointInteriorAverage.y() += vecInteriorNodes[i].y();
+//		pointInteriorAverage.z() += vecInteriorNodes[i].z();
+	}
+	pointInteriorAverage = SPoint3(pointInteriorAverage.x() / (double(vecInteriorNodes.size())),pointInteriorAverage.y() / (double(vecInteriorNodes.size())),pointInteriorAverage.z() / (double(vecInteriorNodes.size())));
+//	pointInteriorAverage.x() = pointInteriorAverage.x() / (double(vecInteriorNodes.size()));
+//	pointInteriorAverage.y() = pointInteriorAverage.y() / (double(vecInteriorNodes.size()));
+//	pointInteriorAverage.z() = pointInteriorAverage.z() / (double(vecInteriorNodes.size()));
+	SPoint3 dirInteriorAverage(pointInteriorAverage.x() - v->x(),pointInteriorAverage.y() - v->y(),pointInteriorAverage.z() - v->z());
+	double norme = sqrt(dirInteriorAverage.x() * dirInteriorAverage.x() + dirInteriorAverage.y() * dirInteriorAverage.y() + dirInteriorAverage.z() * dirInteriorAverage.z());
+	dirInteriorAverage = SPoint3(dirInteriorAverage.x() / norme,dirInteriorAverage.y() / norme,dirInteriorAverage.z() / norme);
+//	dirInteriorAverage.x() = dirInteriorAverage.x() / norme;
+//	dirInteriorAverage.y() = dirInteriorAverage.y() / norme;
+//	dirInteriorAverage.z() = dirInteriorAverage.z() / norme;
+	std::vector<SPoint3> vecOrthogDir;
+	for(unsigned int i = 0;i < vecFirstDir.size();i++){
+		SPoint3 pointTmp(vecFirstDir[i].y() * vecSecondDir[i].z() - vecFirstDir[i].z() * vecSecondDir[i].y(),vecFirstDir[i].z() * vecSecondDir[i].x() - vecFirstDir[i].x() * vecSecondDir[i].z(),vecFirstDir[i].x() * vecSecondDir[i].y() - vecFirstDir[i].y() * vecSecondDir[i].x());
+		vecOrthogDir.push_back(pointTmp);
+	}
+	for(unsigned int i = 0;i < vecOrthogDir.size();i++){
+		double prodScalTmp = vecOrthogDir[i].x() * dirInteriorAverage.x() + vecOrthogDir[i].y() * dirInteriorAverage.y() + vecOrthogDir[i].z() * dirInteriorAverage.z();
+		if (prodScalTmp < 0.0){
+			vecOrthogDir[i] = SPoint3(- vecOrthogDir[i].x(),- vecOrthogDir[i].y(),- vecOrthogDir[i].z());
+//			vecOrthogDir[i].x() = - vecOrthogDir[i].x();
+//			vecOrthogDir[i].y() = - vecOrthogDir[i].y();
+//			vecOrthogDir[i].z() = - vecOrthogDir[i].z();
+		}
+		double normeTmp = sqrt(vecOrthogDir[i].x() * vecOrthogDir[i].x() + vecOrthogDir[i].y() * vecOrthogDir[i].y() + vecOrthogDir[i].z() * vecOrthogDir[i].z());
+		vecOrthogDir[i] = SPoint3(vecOrthogDir[i].x() / normeTmp,vecOrthogDir[i].y() / normeTmp,vecOrthogDir[i].z() / normeTmp);
+//		vecOrthogDir[i].x() = vecOrthogDir[i].x() / normeTmp;
+//		vecOrthogDir[i].y() = vecOrthogDir[i].y() / normeTmp;
+//		vecOrthogDir[i].z() = vecOrthogDir[i].z() / normeTmp;
+		InteriorNormal += SPoint3(vecOrthogDir[i].x(),vecOrthogDir[i].y(),vecOrthogDir[i].z());
+//		InteriorNormal.x() += vecOrthogDir[i].x();
+//		InteriorNormal.y() += vecOrthogDir[i].y();
+//		InteriorNormal.z() += vecOrthogDir[i].z();
+	}
+	norme = sqrt(InteriorNormal.x() * InteriorNormal.x() + InteriorNormal.y() * InteriorNormal.y() + InteriorNormal.z() * InteriorNormal.z());
+	InteriorNormal = SPoint3(InteriorNormal.x() / norme,InteriorNormal.y() / norme,InteriorNormal.z() / norme);
+//	InteriorNormal.x() = InteriorNormal.x() / norme;
+//	InteriorNormal.y() = InteriorNormal.y() / norme;
+//	InteriorNormal.z() = InteriorNormal.z() / norme;
+	return InteriorNormal;
+}
+
+MTet4* ThinLayer::getTetFromPoint(MVertex* v, SVector3 InteriorNormal){
+	MTet4* TetToGet = 0;
+	std::vector<MTetrahedron*> currentVecTet = VertexToTets[v];
+	for (unsigned int i = 0;i < currentVecTet.size();i++){
+		std::vector<SVector3> vecDir;
+		for (int j = 0;j < 4 ; j++){
+			if (currentVecTet[i]->getVertex(j) != v){
+				SVector3 DirTmp(currentVecTet[i]->getVertex(j)->x() - v->x(),currentVecTet[i]->getVertex(j)->y() - v->y(),currentVecTet[i]->getVertex(j)->z() - v->z());
+				vecDir.push_back(DirTmp);
+			}
+		}
+		bool IsPositiv = ThinLayer::IsPositivOrientation(vecDir[0],vecDir[1],vecDir[2]);
+		if (!IsPositiv){
+			SVector3 DirTmp1 = vecDir[1];
+			SVector3 DirTmp2 = vecDir[0];
+			SVector3 DirTmp3 = vecDir[2];
+			vecDir.clear();
+			vecDir.push_back(DirTmp1);
+			vecDir.push_back(DirTmp2);
+			vecDir.push_back(DirTmp3);
+		}
+		bool isPositiv1 = ThinLayer::IsPositivOrientation(vecDir[0],vecDir[1],InteriorNormal);
+		bool isPositiv2 = ThinLayer::IsPositivOrientation(vecDir[1],vecDir[2],InteriorNormal);
+		bool isPositiv3 = ThinLayer::IsPositivOrientation(vecDir[2],vecDir[0],InteriorNormal);
+		if (isPositiv1){
+			if (isPositiv2){
+				if (isPositiv3){
+					TetToGet = TetToTet4[currentVecTet[i]];
+				}
+			}
+		}
+	}
+	return TetToGet;
+}
+
+bool ThinLayer::IsPositivOrientation(SVector3 a, SVector3 b, SVector3 c){
+	bool result = false;
+	SPoint3 ProdVec(a.y() * b.z() - a.z() * b.y(),a.z() * b.x() - a.x() * b.z(),a.x() * b.y() - a.y() * b.x());
+	double ProdScal = ProdVec.x() * c.x() + ProdVec.y() * c.y() + ProdVec.z() * c.z();
+	if (ProdScal >= 0.0){
+		result = true;
+	}
+	return result;
+}
+
+
+void ThinLayer::FindNewPoint(SPoint3* CurrentPoint, int* CurrentTri, MTet4* CurrentTet, SVector3 InteriorNormal){
+	double distanceP2P = 0.0;
+	double alphaMax;
+	double betaMax;
+	SPoint3 ResultPoint;
+	int triToGet = 0;
+	for (unsigned int n = 0;n < 4 ; n++){
+		//calculer matrice a inverser
+		faceXtet fxt(CurrentTet,n);
+		double a = fxt.v[1]->x() - fxt.v[0]->x();
+		double b = fxt.v[2]->x() - fxt.v[0]->x();
+		double c = InteriorNormal.x();
+		double d = fxt.v[1]->y() - fxt.v[0]->y();
+		double e = fxt.v[2]->y() - fxt.v[0]->y();
+		double f = InteriorNormal.y();
+		double g = fxt.v[1]->z() - fxt.v[0]->z();
+		double h = fxt.v[2]->z() - fxt.v[0]->z();
+		double i = InteriorNormal.z();
+		//produit matrice inverse par vecteur donne poids
+		double detMat = a * e * i  + b * f * g + c * d * h - c * e * g - f * h * a - i * b * d;
+		double ai = e * i - f * h;
+		double bi = c * h - b * i;
+		double ci = b * f - c * e;
+		double di = f * g - d * i;
+		double ei = a * i - c * g;
+		double fi = c * d - a * f;
+//		double gi = d * h - e * g;
+//		double hi = b * g - a * h;
+//		double ii = a * e - b * d;
+		double oppx = (*CurrentPoint).x() - fxt.v[0]->x();
+		double oppy = (*CurrentPoint).y() - fxt.v[0]->y();
+		double oppz = (*CurrentPoint).z() - fxt.v[0]->z();
+		double alpha = ai / detMat * oppx + bi / detMat * oppy + ci / detMat * oppz;
+		double beta = di / detMat * oppx + ei / detMat * oppy + fi / detMat * oppz;
+//		double gamma = gi / detMat * oppx + hi / detMat * oppy + ii / detMat * oppz;
+		//Test si poids entre 0 et 1 et si length maximale
+		if ((alpha >= (0.0-epsilon)) && (alpha <= (1.0 + epsilon))){
+			if ((beta >= (0.0-epsilon)) && (beta <= (1.0 + epsilon))){
+				if (((1.0 - alpha - beta) >= (0.0-epsilon)) && ((1.0 - alpha - beta) <= (1.0 + epsilon))){
+					SPoint3 PointTmp(fxt.v[0]->x() + alpha * (fxt.v[1]->x() - fxt.v[0]->x()) + beta * (fxt.v[2]->x() - fxt.v[0]->x()),fxt.v[0]->y() + alpha * (fxt.v[1]->y() - fxt.v[0]->y()) + beta * (fxt.v[2]->y() - fxt.v[0]->y()),fxt.v[0]->z() + alpha * (fxt.v[1]->z() - fxt.v[0]->z()) + beta * (fxt.v[2]->z() - fxt.v[0]->z()));
+					double distanceTmp = PointTmp.distance((*CurrentPoint));
+					if (distanceTmp > distanceP2P){
+						distanceP2P = distanceTmp;
+						ResultPoint = PointTmp;
+						triToGet = n;
+						alphaMax = alpha;
+						betaMax = beta;
+					}
+				}
+			}
+		}
+	}
+	//test si trop proche d'un point / une arete
+	if (((alphaMax < epsilon) && (betaMax < epsilon)) || ((alphaMax < epsilon) && ((1.0 - alphaMax - betaMax) < epsilon)) || (((1.0 - alphaMax - betaMax) < epsilon) && (betaMax < epsilon))){
+		//proche d'un point
+		double DistMinTmp = 10000000.0;
+		int indexMinTmp;
+		for (unsigned int i = 0;i < 4;i++){
+			double distanceTmp = sqrt((CurrentTet->tet()->getVertex(i)->x() - ResultPoint.x()) * (CurrentTet->tet()->getVertex(i)->x() - ResultPoint.x()) + (CurrentTet->tet()->getVertex(i)->y() - ResultPoint.y()) * (CurrentTet->tet()->getVertex(i)->y() - ResultPoint.y()) + (CurrentTet->tet()->getVertex(i)->z() - ResultPoint.z()) * (CurrentTet->tet()->getVertex(i)->z() - ResultPoint.z()));
+			if (distanceTmp < DistMinTmp){
+				DistMinTmp = distanceTmp;
+				indexMinTmp = i;
+			}
+		}
+		MTet4* NewTet = ThinLayer::getTetFromPoint(CurrentTet->tet()->getVertex(indexMinTmp),InteriorNormal);
+		SPoint3 PointTmp(CurrentTet->tet()->getVertex(indexMinTmp)->x(),CurrentTet->tet()->getVertex(indexMinTmp)->y(),CurrentTet->tet()->getVertex(indexMinTmp)->z());
+		(*CurrentPoint) = PointTmp;
+		CurrentTet = NewTet;
+	}
+	else if ((alphaMax < epsilon) || (betaMax < epsilon) || ((1.0 - alphaMax - betaMax) < epsilon)){
+		//trop proche d'une arete
+	}
+	else{
+		(*CurrentPoint) = ResultPoint;
+		(*CurrentTri) = triToGet;
+		CurrentTet = CurrentTet->getNeigh(triToGet);
+	}
+}
+
+void ThinLayer::fillVertexToTets(){
+	GModel *m = GModel::current();
+	for (GModel::riter itr= m->firstRegion();itr != m->lastRegion();itr++){
+		GRegion* rTmp = (*itr);
+		for (unsigned int i = 0; i < rTmp->tetrahedra.size();i++){
+			MTetrahedron* elem = rTmp->tetrahedra[i];
+			for (unsigned int j = 0; j < 4;j++){
+				std::vector<MTetrahedron*> emptyTetVec;
+				emptyTetVec.clear();
+				VertexToTets[elem->getVertex(j)] = emptyTetVec;
+				std::vector<CorrespVertices*> emptyCVVec;
+				emptyCVVec.clear();
+				VertexToCorresp[elem->getVertex(j)] = emptyCVVec;
+			}
+		}
+	}
+	for (GModel::riter itr= m->firstRegion();itr != m->lastRegion();itr++){
+		GRegion* rTmp = (*itr);
+		for (unsigned int i = 0; i < rTmp->tetrahedra.size();i++){
+			MTetrahedron* elem = rTmp->tetrahedra[i];
+			for (unsigned int j = 0; j < 4;j++){
+				VertexToTets[elem->getVertex(j)].push_back(elem);
+			}
+		}
+	}
+}
+
+void ThinLayer::fillTetToTet4(){
+	GModel *m = GModel::current();
+	std::vector<MTet4*> vecAllTet4;
+	vecAllTet4.clear();
+	for (GModel::riter itr= m->firstRegion();itr != m->lastRegion();itr++){
+		GRegion* rTmp = (*itr);
+		for (unsigned int i = 0; i < rTmp->tetrahedra.size();i++){
+			MTetrahedron* elem = rTmp->tetrahedra[i];
+			MTet4 tet4tmp = MTet4(elem,0.0);
+			MTet4* currentTet4 = &tet4tmp;
+			TetToTet4[elem] = currentTet4;
+			vecAllTet4.clear();
+		}
+	}
+	connectTets(vecAllTet4);
+}
+
+/****************static declarations****************/
+
+std::map<MVertex*,std::vector<MTetrahedron*> > ThinLayer::VertexToTets;
+std::map<MTetrahedron*,MTet4*> ThinLayer::TetToTet4;
+std::map<MVertex*,std::vector<CorrespVertices*> > ThinLayer::VertexToCorresp;
+std::vector<std::vector<CorrespVertices*> > ThinLayer::vecOfThinSheets;
+
diff --git a/Mesh/ThinLayer.h b/Mesh/ThinLayer.h
new file mode 100644
index 0000000000000000000000000000000000000000..de9e37c819f6429bc122b36ac262ee3ce127e30c
--- /dev/null
+++ b/Mesh/ThinLayer.h
@@ -0,0 +1,137 @@
+/*
+ * ThinLayer.h
+ *
+ *  Created on: Oct 13, 2014
+ *      Author: nicolas
+ */
+
+#ifndef THINLAYER_H_
+#define THINLAYER_H_
+
+#include "MVertex.h"
+#include "MTriangle.h"
+#include "meshGRegionDelaunayInsertion.h"
+
+
+static int faces[4][3] = {{0,1,2}, {0,2,3}, {0,3,1}, {1,3,2}};
+
+struct faceXtet{
+  MVertex *v[3],*unsorted[3];
+  MTet4 *t1;
+  int i1;
+  faceXtet(MTet4 *_t=0, int iFac=0) : t1(_t), i1(iFac)
+  {
+    MVertex *v0 = t1->tet()->getVertex(faces[iFac][0]);
+    MVertex *v1 = t1->tet()->getVertex(faces[iFac][1]);
+    MVertex *v2 = t1->tet()->getVertex(faces[iFac][2]);
+
+    unsorted[0] = v0;
+    unsorted[1] = v1;
+    unsorted[2] = v2;
+
+    v[0] = std::min(std::min(v0,v1),v2);
+    v[2] = std::max(std::max(v0,v1),v2);
+    v[1] = (v0 != v[0] && v0 != v[2]) ? v0 : (v1 != v[0] && v1 != v[2]) ? v1 : v2;
+    //
+    //    std::sort(v, v + 3);
+  }
+
+  inline MVertex * getVertex (int i) const { return unsorted[i];}
+
+ inline bool operator < (const faceXtet & other) const
+  {
+    if (v[0] < other.v[0]) return true;
+    if (v[0] > other.v[0]) return false;
+    if (v[1] < other.v[1]) return true;
+    if (v[1] > other.v[1]) return false;
+    if (v[2] < other.v[2]) return true;
+    return false;
+  }
+  inline bool operator == (const faceXtet & other) const
+  {
+    return (v[0] == other.v[0] &&
+	    v[1] == other.v[1] &&
+	    v[2] == other.v[2] );
+  }
+  bool visible (MVertex *v){
+    MVertex* v0 = t1->tet()->getVertex(faces[i1][0]);
+    MVertex* v1 = t1->tet()->getVertex(faces[i1][1]);
+    MVertex* v2 = t1->tet()->getVertex(faces[i1][2]);
+    double a[3] = {v0->x(),v0->y(),v0->z()};
+    double b[3] = {v1->x(),v1->y(),v1->z()};
+    double c[3] = {v2->x(),v2->y(),v2->z()};
+    double d[3] = {v->x(),v->y(),v->z()};
+    double o = robustPredicates :: orient3d(a,b,c,d);
+    return o < 0;
+  }
+};
+
+class CorrespVertices{
+private:
+	MVertex* StartPoint;
+	SPoint3 EndPoint;
+	SVector3 StartNormal;
+	SVector3 EndNormal;
+	faceXtet EndTriangle;
+	double distP2P;
+	double angleProd;
+	bool Active;
+	bool EndTriangleActive;
+	bool IsMaster;
+	int tagMaster;
+public:
+	CorrespVertices();
+	~CorrespVertices();
+	void setStartPoint(MVertex* v);
+	void setEndPoint(SPoint3 p);
+	void setStartNormal(SVector3 v);
+	void setEndNormal(SVector3 v);
+	void setEndTriangle(faceXtet f);
+	void setdistP2P(double d);
+	void setangleProd(double a);
+	void setActive(bool b);
+	void setEndTriangleActive(bool b);
+	void setIsMaster(bool b);
+	void setTagMaster(int i);
+	MVertex* getStartPoint();
+	SPoint3 getEndPoint();
+	SVector3 getStartNormal();
+	SVector3 getEndNormal();
+	faceXtet getEndTriangle();
+	double getdistP2P();
+	double getangleProd();
+	bool getActive();
+	bool getEndTriangleActive();
+	bool getIsMaster();
+	int getTagMaster();
+};
+
+class ThinLayer{
+private:
+public:
+	ThinLayer();
+	~ThinLayer();
+	static void perform();
+	static void checkOppositeTriangles();
+	static void fillvecOfThinSheets();
+	static std::map<MVertex*,double> computeAllDistToOppSide();
+	static double computeDistToOppSide(MVertex* v);
+	static SVector3 computeInteriorNormal(MVertex* v);
+	static MTet4* getTetFromPoint(MVertex* v, SVector3 InteriorNormal);
+	static bool IsPositivOrientation(SVector3 a, SVector3 b, SVector3 c);
+	static void FindNewPoint(SPoint3* CurrentPoint, int* CurrentTri, MTet4* CurrentTet, SVector3 InteriorNormal);
+	static std::map<MVertex*,std::vector<MTetrahedron*> > VertexToTets;
+	static std::map<MTetrahedron*,MTet4*> TetToTet4;
+	static std::map<MVertex*,std::vector<CorrespVertices*> > VertexToCorresp;
+	static std::vector<std::vector<CorrespVertices*> > vecOfThinSheets;
+	static const double epsilon = 0.00001;
+	static const double angleMax = 0.9;
+	static const double distP2PMax = 0.3;
+	static void fillVertexToTets();
+	static void fillTetToTet4();
+};
+
+
+
+
+#endif /* THINLAYER_H_ */
diff --git a/Mesh/meshGFace.cpp b/Mesh/meshGFace.cpp
index 197e197ed7bcc641a836456201f984f6bd291bbb..fdb3717b6d9fbfa4300e7f2b16dd90b3ce013046 100644
--- a/Mesh/meshGFace.cpp
+++ b/Mesh/meshGFace.cpp
@@ -496,6 +496,7 @@ static bool algoDelaunay2D(GFace *gf)
      gf->getMeshingAlgo() == ALGO_2D_FRONTAL ||
      gf->getMeshingAlgo() == ALGO_2D_FRONTAL_QUAD ||
      gf->getMeshingAlgo() == ALGO_2D_PACK_PRLGRMS ||
+     gf->getMeshingAlgo() == ALGO_2D_PACK_PRLGRMS_CSTR ||
      gf->getMeshingAlgo() == ALGO_2D_BAMG)
     return true;
 
@@ -1498,7 +1499,8 @@ bool meshGenerator(GFace *gf, int RECUR_ITER,
 
   bool infty = false;
   if (gf->getMeshingAlgo() == ALGO_2D_FRONTAL_QUAD ||
-      gf->getMeshingAlgo() == ALGO_2D_PACK_PRLGRMS)
+      gf->getMeshingAlgo() == ALGO_2D_PACK_PRLGRMS ||
+      gf->getMeshingAlgo() == ALGO_2D_PACK_PRLGRMS_CSTR)
     infty = true;
   if (!onlyInitialMesh) {
     if (infty)
@@ -1519,6 +1521,9 @@ bool meshGenerator(GFace *gf, int RECUR_ITER,
     else if(gf->getMeshingAlgo() == ALGO_2D_PACK_PRLGRMS){
       bowyerWatsonParallelograms(gf);
     }
+    else if(gf->getMeshingAlgo() == ALGO_2D_PACK_PRLGRMS_CSTR){
+      bowyerWatsonParallelogramsConstrained(gf,gf->constr_vertices);
+    }
     else if(gf->getMeshingAlgo() == ALGO_2D_DELAUNAY ||
             gf->getMeshingAlgo() == ALGO_2D_AUTO)
       bowyerWatson(gf);
@@ -2313,7 +2318,8 @@ static bool meshGeneratorPeriodic(GFace *gf, bool debug = true)
 
   bool infty = false;
   if (gf->getMeshingAlgo() == ALGO_2D_FRONTAL_QUAD ||
-      gf->getMeshingAlgo() == ALGO_2D_PACK_PRLGRMS)
+      gf->getMeshingAlgo() == ALGO_2D_PACK_PRLGRMS ||
+      gf->getMeshingAlgo() == ALGO_2D_PACK_PRLGRMS_CSTR)
     infty = true;
   if (infty)
     buildBackGroundMesh (gf, &equivalence, &parametricCoordinates);
@@ -2328,6 +2334,8 @@ static bool meshGeneratorPeriodic(GFace *gf, bool debug = true)
       bowyerWatsonFrontalLayers(gf,true, &equivalence, &parametricCoordinates);
     else if(gf->getMeshingAlgo() == ALGO_2D_PACK_PRLGRMS)
       bowyerWatsonParallelograms(gf,&equivalence, &parametricCoordinates);
+    else if(gf->getMeshingAlgo() == ALGO_2D_PACK_PRLGRMS_CSTR)
+      bowyerWatsonParallelogramsConstrained(gf,gf->constr_vertices,&equivalence, &parametricCoordinates);
     else if(gf->getMeshingAlgo() == ALGO_2D_DELAUNAY ||
             gf->getMeshingAlgo() == ALGO_2D_AUTO)
       bowyerWatson(gf,1000000000, &equivalence, &parametricCoordinates);
diff --git a/Mesh/meshGFaceDelaunayInsertion.cpp b/Mesh/meshGFaceDelaunayInsertion.cpp
index 14cad8fad2278fd4bce86292988023faba3f9cdb..106365a53a1fa78bdc44ab5261b0907d9158bd8a 100644
--- a/Mesh/meshGFaceDelaunayInsertion.cpp
+++ b/Mesh/meshGFaceDelaunayInsertion.cpp
@@ -1812,6 +1812,113 @@ void bowyerWatsonFrontalLayers(GFace *gf, bool quad,
 #endif
   }
 
+void bowyerWatsonParallelogramsConstrained(GFace *gf,
+		  std::set<MVertex*> constr_vertices,
+		  std::map<MVertex* , MVertex*>* equivalence,
+		  std::map<MVertex*, SPoint2> * parametricCoordinates)
+{
+	std::cout<<"   entered bowyerWatsonParallelogramsConstrained"<<std::endl;
+  std::set<MTri3*,compareTri3Ptr> AllTris;
+  bidimMeshData DATA(equivalence, parametricCoordinates);
+  std::vector<MVertex*> packed;
+  std::vector<SMetric3> metrics;
+
+  //  printf("creating the points\n");
+  std::cout<<"   entering packingOfParallelogramsConstrained"<<std::endl;
+  packingOfParallelogramsConstrained(gf, constr_vertices, packed, metrics);
+  //  printf("points created\n");
+  std::cout<<"out of packingOfParallelogramsConstrained"<<std::endl;
+
+  buildMeshGenerationDataStructures (gf, AllTris, DATA);
+
+  std::cout<<"out of buildMeshGenerationDataStructures"<<std::endl;
+  // delaunise the initial mesh
+  int nbSwaps = edgeSwapPass(gf, AllTris, SWCR_DEL, DATA);
+  Msg::Debug("Delaunization of the initial mesh done (%d swaps)", nbSwaps);
+
+  std::sort(packed.begin(), packed.end(), MVertexLessThanLexicographic());
+  std::cout<<"out of sort"<<std::endl;
+
+  //  printf("staring to insert points\n");
+  N_GLOBAL_SEARCH = 0;
+  N_SEARCH = 0;
+  DT_INSERT_VERTEX = 0;
+  // double t1 = Cpu();
+  MTri3 *oneNewTriangle = 0;
+  std::cout<<"entering for packed"<<std::endl;
+  for (unsigned int i=0;i<packed.size();){
+	  std::cout<<"   First stop for"<<std::endl;
+    MTri3 *worst = *AllTris.begin();
+    std::cout<<"   got worst"<<std::endl;
+    if (worst->isDeleted()){
+      delete worst->tri();
+      delete worst;
+      AllTris.erase(AllTris.begin());
+    }
+    else{
+      double newPoint[2] ;
+      packed[i]->getParameter(0,newPoint[0]);
+      packed[i]->getParameter(1,newPoint[1]);
+      delete packed[i];
+      double metric[3];
+      //      buildMetric(gf, newPoint, metrics[i], metric);
+      buildMetric(gf, newPoint, metric);
+
+      bool success = insertAPoint(gf, AllTris.begin(), newPoint, metric, DATA , AllTris, 0, oneNewTriangle, &oneNewTriangle);
+      if (!success) oneNewTriangle = 0;
+	//      if (!success)printf("success %d %d\n",success,AllTris.size());
+      i++;
+    }
+    std::cout<<"   out of first if"<<std::endl;
+
+    if(1.0* AllTris.size() > 2.5 * DATA.vSizes.size()){
+      //      int n1 = AllTris.size();
+      std::set<MTri3*,compareTri3Ptr>::iterator itd = AllTris.begin();
+      while(itd != AllTris.end()){
+        if((*itd)->isDeleted()){
+          delete  *itd;
+          AllTris.erase(itd++);
+        }
+        else
+          itd++;
+      }
+      //      Msg::Info("cleaning up the memory %d -> %d", n1, AllTris.size());
+    }
+    std::cout<<"   out of second if"<<std::endl;
+
+
+  }
+  std::cout<<"out of for packed"<<std::endl;
+  //  printf("%d vertices \n",(int)packed.size());
+  //clock_t t2 = clock();
+  //double DT = (double)(t2-t1)/CLOCKS_PER_SEC;
+  //if (packed.size())printf("points inserted DT %12.5E points per minut : %12.5E %d global searchs %d seachs per insertion\n",DT,60.*packed.size()/DT,N_GLOBAL_SEARCH,N_SEARCH / packed.size());
+  transferDataStructure(gf, AllTris, DATA);
+  std::cout<<"out of transferDataStructure"<<std::endl;
+  std::cout<<"testing all vertices of gf"<<std::endl;
+  for (unsigned int i = 0; i < gf->getNumMeshVertices();i++){
+	  MVertex* vtest = gf->getMeshVertex(i);
+      std::cout<<"going to test out parameterisation of the point after pacjing and everything"<<std::endl;
+      double para0, para1;
+      vtest->getParameter(0,para0);
+      vtest->getParameter(1,para1);
+      std::cout<<"            point tested: para 1 "<<para0<<" and para 2 "<<para1<<std::endl;
+  }
+  backgroundMesh::unset();
+#if defined(HAVE_ANN)
+  {
+    FieldManager *fields = gf->model()->getFields();
+    BoundaryLayerField *blf = 0;
+    if(fields->getBoundaryLayerField() > 0){
+      Field *bl_field = fields->get(fields->getBoundaryLayerField());
+      blf = dynamic_cast<BoundaryLayerField*> (bl_field);
+      if (blf && !blf->iRecombine)quadsToTriangles(gf,10000);
+    }
+  }
+#endif
+  std::cout<<"out of Everything"<<std::endl;
+}
+
 
   static void initialSquare(std::vector<MVertex*> &v,
       MVertex *box[4],
diff --git a/Mesh/meshGFaceDelaunayInsertion.h b/Mesh/meshGFaceDelaunayInsertion.h
index bd627df025c7c6c6d749fbca89be71b64836e3ee..79a8c389af307c7b0225ec359d9249a0baf9f494 100644
--- a/Mesh/meshGFaceDelaunayInsertion.h
+++ b/Mesh/meshGFaceDelaunayInsertion.h
@@ -157,6 +157,10 @@ void bowyerWatsonFrontalLayers(GFace *gf, bool quad,
 void bowyerWatsonParallelograms(GFace *gf,
 		  std::map<MVertex* , MVertex*>* equivalence= 0,
 		  std::map<MVertex*, SPoint2> * parametricCoordinates= 0);
+void bowyerWatsonParallelogramsConstrained(GFace *gf,
+		  std::set<MVertex*> constr_vertices,
+		  std::map<MVertex* , MVertex*>* equivalence= 0,
+		  std::map<MVertex*, SPoint2> * parametricCoordinates= 0);
 void buildBackGroundMesh (GFace *gf,
 		  std::map<MVertex* , MVertex*>* equivalence= 0,
 		  std::map<MVertex*, SPoint2> * parametricCoordinates= 0);
diff --git a/Mesh/simple3D.cpp b/Mesh/simple3D.cpp
index efda80006986c55f5a62ffff3aeeb81617778c35..95ffaf3025345d821b515de6d1d2eef89d76cee0 100644
--- a/Mesh/simple3D.cpp
+++ b/Mesh/simple3D.cpp
@@ -17,6 +17,7 @@
 #include "CenterlineField.h"
 #include <algorithm>
 #include "directions3D.h"
+#include "ThinLayer.h"
 #include "Context.h"
 #include <iostream>
 #include <string>
diff --git a/Mesh/surfaceFiller.cpp b/Mesh/surfaceFiller.cpp
index e205176e72be10e2360e5807538cbfb0452d9059..d352c5bf98a332bd30183001370d364da9037e7b 100644
--- a/Mesh/surfaceFiller.cpp
+++ b/Mesh/surfaceFiller.cpp
@@ -1036,3 +1036,171 @@ void packingOfParallelograms(GFace* gf,  std::vector<MVertex*> &packed, std::vec
     //  delete rtree;
 }
 
+
+// fills a surface with points in order to build a nice
+// quad mesh ------------
+void packingOfParallelogramsConstrained(GFace* gf, std::set<MVertex*> constr_vertices, std::vector<MVertex*> &packed, std::vector<SMetric3> &metrics){
+  //PE MODIF
+//  packingOfParallelogramsSmoothness(gf,packed,metrics);
+//  return;
+  // END PE MODIF
+#if defined(HAVE_RTREE)
+
+	std::cout<<"      inside packingOfParallelogramsConstrained"<<std::endl;
+  const bool goNonLinear = true;
+
+  //  FILE *f = Fopen ("parallelograms.pos","w");
+
+  // get all the boundary vertices
+  std::set<MVertex*> bnd_vertices;
+  for(unsigned int i=0;i<gf->getNumMeshElements();i++){
+    MElement* element = gf->getMeshElement(i);
+    for(int j=0;j<element->getNumVertices();j++){
+      MVertex *vertex = element->getVertex(j);
+      if (vertex->onWhat()->dim() < 2)bnd_vertices.insert(vertex);
+    }
+  }
+  std::cout<<"      got all the boundary vertices"<<std::endl;
+
+  // put boundary vertices in a fifo queue
+  // std::queue<surfacePointWithExclusionRegion*> fifo;
+  std::set<surfacePointWithExclusionRegion*,  compareSurfacePointWithExclusionRegionPtr> fifo;
+  std::vector<surfacePointWithExclusionRegion*> vertices;
+  // put the RTREE
+  RTree<surfacePointWithExclusionRegion*,double,2,double> rtree;
+  SMetric3 metricField(1.0);
+  SPoint2 newp[4][NUMDIR];
+  std::set<MVertex*>::iterator it =  bnd_vertices.begin() ;
+
+  char NAME[345]; sprintf(NAME,"crossReal%d.pos",gf->tag());
+  FILE *crossf = Fopen (NAME,"w");
+  if (crossf)fprintf(crossf,"View \"\"{\n");
+  std::cout<<"      entering first for"<<std::endl;
+  for (; it !=  bnd_vertices.end() ; ++it){
+    SPoint2 midpoint;
+    compute4neighbors (gf, *it, midpoint, goNonLinear, newp, metricField,crossf);
+    surfacePointWithExclusionRegion *sp =
+      new surfacePointWithExclusionRegion (*it, newp, midpoint,metricField);
+    //    fifo.push(sp);
+    fifo.insert(sp);
+    vertices.push_back(sp);
+    double _min[2],_max[2];
+    sp->minmax(_min,_max);
+    //    printf("%g %g .. %g %g\n",_min[0],_min[1],_max[0],_max[1]);
+    rtree.Insert(_min,_max,sp);
+    //    sp->print(f);
+  }
+
+  std::set<MVertex*>::iterator it_constr =  constr_vertices.begin() ;
+  std::cout<<"      entering second for"<<std::endl;
+  for (; it_constr !=  constr_vertices.end() ; ++it_constr){
+    SPoint2 midpoint;
+    std::cout<<"going to test out parameterisation of the new point"<<std::endl;
+    double para0, para1;
+    (*it_constr)->getParameter(0,para0);
+    (*it_constr)->getParameter(1,para1);
+    std::cout<<"            point tested: para 1 "<<para0<<" and para 2 "<<para1<<std::endl;
+    std::cout<<"         going to compute4neighbors"<<std::endl;
+    compute4neighbors (gf, *it_constr, midpoint, goNonLinear, newp, metricField,crossf);
+    std::cout<<"         going to surfacePointWithExclusionRegion"<<std::endl;
+    surfacePointWithExclusionRegion *sp =
+      new surfacePointWithExclusionRegion (*it_constr, newp, midpoint,metricField);
+    //    fifo.push(sp);
+    std::cout<<"         done surfacePointWithExclusionRegion"<<std::endl;
+    fifo.insert(sp);
+    vertices.push_back(sp);
+    double _min[2],_max[2];
+    sp->minmax(_min,_max);
+    //    printf("%g %g .. %g %g\n",_min[0],_min[1],_max[0],_max[1]);
+    rtree.Insert(_min,_max,sp);
+    //    sp->print(f);
+  }
+
+  //  printf("initially : %d vertices in the domain\n",vertices.size());
+
+
+  std::cout<<"      entering while"<<std::endl;
+  while(!fifo.empty()){
+    //surfacePointWithExclusionRegion & parent = fifo.top();
+    //    surfacePointWithExclusionRegion * parent = fifo.front();
+    surfacePointWithExclusionRegion * parent = *fifo.begin();
+    //    fifo.pop();
+    fifo.erase(fifo.begin());
+    for (int dir=0;dir<NUMDIR;dir++){
+      //      printf("dir = %d\n",dir);
+      int countOK = 0;
+      for (int i=0;i<4;i++){
+        //	printf("i = %d %12.5E %12.5E \n",i,parent._p[i][dir].x(),parent._p[i][dir].y());
+
+        //	if (!w._tooclose){
+        if (!inExclusionZone (parent->_p[i][dir], rtree, vertices) ){
+          countOK++;
+          GPoint gp = gf->point(parent->_p[i][dir]);
+          MFaceVertex *v = new MFaceVertex(gp.x(),gp.y(),gp.z(),gf,gp.u(),gp.v());
+          std::cout<<"going to test out parameterisation of the new point"<<std::endl;
+          double para0, para1;
+          v->getParameter(0,para0);
+          v->getParameter(1,para1);
+//          if (v->getNum() == 341){
+//        	  std::cout<<" 341 dans surface filler !!!!"<<std::endl;
+//      		std::system("pause");
+//      		getchar();
+//          }
+          std::cout<<"            point tested: para 1 "<<para0<<" and para 2 "<<para1<<std::endl;
+          //	  	printf(" %g %g %g %g\n",parent._center.x(),parent._center.y(),gp.u(),gp.v());
+          SPoint2 midpoint;
+          compute4neighbors (gf, v, midpoint, goNonLinear, newp, metricField,crossf);
+          surfacePointWithExclusionRegion *sp =
+            new surfacePointWithExclusionRegion (v, newp, midpoint, metricField, parent);
+          //	  fifo.push(sp);
+          fifo.insert(sp);
+          vertices.push_back(sp);
+          double _min[2],_max[2];
+          sp->minmax(_min,_max);
+          rtree.Insert(_min,_max,sp);
+        }
+      }
+      if (countOK)break;
+      }
+      //    printf("%d\n",vertices.size());
+    }
+  std::cout<<"      entering if"<<std::endl;
+    if (crossf){
+      fprintf(crossf,"};\n");
+      fclose (crossf);
+    }
+    //  printf("done\n");
+
+    // add the vertices as additional vertices in the
+    // surface mesh
+    char ccc[256]; sprintf(ccc,"points%d.pos",gf->tag());
+    FILE *f = Fopen(ccc,"w");
+    fprintf(f,"View \"\"{\n");
+    std::cout<<"      entering another for"<<std::endl;
+    for (unsigned int i=0;i<vertices.size();i++){
+      //    if(vertices[i]->_v->onWhat() != gf)
+      vertices[i]->print(f,i);
+      if(vertices[i]->_v->onWhat() == gf) {
+        packed.push_back(vertices[i]->_v);
+        metrics.push_back(vertices[i]->_meshMetric);
+        SPoint2 midpoint;
+        reparamMeshVertexOnFace(vertices[i]->_v, gf, midpoint);
+        std::cout<<"going to test out parameterisation of the REPARAM point"<<std::endl;
+        double para0, para1;
+        vertices[i]->_v->getParameter(0,para0);
+        vertices[i]->_v->getParameter(1,para1);
+        std::cout<<"            point tested: para 1 "<<para0<<" and para 2 "<<para1<<std::endl;
+        //      fprintf(f,"TP(%22.15E,%22.15E,%g){%22.15E,%22.15E,%22.15E,%22.15E,%22.15E,%22.15E,%22.15E,%22.15E,%22.15E};\n",vertices[i]->_v->x(),vertices[i]->_v->y(),vertices[i]->_v->z(),
+        //	      vertices[i]->_meshMetric(0,0),vertices[i]->_meshMetric(0,1),vertices[i]->_meshMetric(0,2),
+        //	      vertices[i]->_meshMetric(1,0),vertices[i]->_meshMetric(1,1),vertices[i]->_meshMetric(1,2),
+        //	      vertices[i]->_meshMetric(2,0),vertices[i]->_meshMetric(2,1),vertices[i]->_meshMetric(2,2));
+        //fprintf(f,"SP(%22.15E,%22.15E,%g){1};\n",midpoint.x(),midpoint.y(),0.0);
+      }
+      delete  vertices[i];
+    }
+    fprintf(f,"};");
+    fclose(f);
+    //  printf("packed.size = %d\n",packed.size());
+    //  delete rtree;
+#endif
+}
diff --git a/Mesh/surfaceFiller.h b/Mesh/surfaceFiller.h
index dabb87040b6c5eed4b33f161a6ed3dbcd4d06a4a..d317cb01800f40bbee91a2c57394f55c9309ef7d 100644
--- a/Mesh/surfaceFiller.h
+++ b/Mesh/surfaceFiller.h
@@ -8,14 +8,16 @@
 #define _SURFACEFILLER_H_
 
 #include <vector>
+#include <set>
 #include "STensor3.h"
 
 class GFace;
 class MVertex;
 
-void packingOfParallelogramsSmoothness(GFace* gf, std::vector<MVertex*> &packed,
-                                       std::vector<SMetric3> &metrics);
-void packingOfParallelograms(GFace* gf, std::vector<MVertex*> &packed,
-                             std::vector<SMetric3> &metrics);
+void packingOfParallelogramsSmoothness(GFace* gf, std::vector<MVertex*> &packed, std::vector<SMetric3> &metrics );
+void packingOfParallelograms(GFace* gf, std::vector<MVertex*> &packed, std::vector<SMetric3> &metrics );
+void packingOfParallelogramsConstrained(GFace* gf, std::set<MVertex*> constr_vertices, std::vector<MVertex*> &packed, std::vector<SMetric3> &metrics );
+
+
 
 #endif
diff --git a/Plugin/CMakeLists.txt b/Plugin/CMakeLists.txt
index e542921345ffaf8ea0e2c3f5ceadf9c8587a8903..1853783794d5e205f22b7f3e2d00c8a135151733 100644
--- a/Plugin/CMakeLists.txt
+++ b/Plugin/CMakeLists.txt
@@ -32,7 +32,7 @@ set(SRC
   Scal2Tens.cpp Scal2Vec.cpp
   CutMesh.cpp
   NewView.cpp
-  SimplePartition.cpp Crack.cpp DuplicateBoundaries.cpp
+  SimplePartition.cpp Crack.cpp DuplicateBoundaries.cpp ThinLayerFixMesh.cpp
   FaultZone.cpp
   MeshSubEntities.cpp
   CVTRemesh.cpp
diff --git a/Plugin/DuplicateBoundaries.cpp b/Plugin/DuplicateBoundaries.cpp
index 04fdb1694376e414cb712839dd5f60345b6538d4..33e31b7f3e1dff4f0ecba697a31620515fb0e37f 100644
--- a/Plugin/DuplicateBoundaries.cpp
+++ b/Plugin/DuplicateBoundaries.cpp
@@ -177,26 +177,8 @@ PView *GMSH_DuplicateBoundariesPlugin::executeBis(PView *view)
 
 		for (unsigned int i = 0; i < fTmp->getNumMeshElements();i++){
 			MElement* elem = fTmp->getMeshElement(i);
-//			std::cout<<"TEST INITIAL"<<std::endl;
 
-			if (elem->getVertex(0)->getNum() > 100000){
-				std::cout<<"on a un getnum de "<<elem->getVertex(0)->getNum()<<std::endl;
-				while (1){
-
-				}
-			}
-			if (elem->getVertex(1)->getNum() > 100000){
-				std::cout<<"on a un getnum de "<<elem->getVertex(1)->getNum()<<std::endl;
-				while (1){
-
-				}
-			}
-			if (elem->getVertex(2)->getNum() > 100000){
-				std::cout<<"on a un getnum de "<<elem->getVertex(2)->getNum()<<std::endl;
-				while (1){
-
-				}
-			}
+	
 		}
 
 
@@ -205,10 +187,8 @@ PView *GMSH_DuplicateBoundariesPlugin::executeBis(PView *view)
 		}
 		else{
 			facesBound.push_back(fTmp);
-			//ToDuplicateListBoundary.insert(fTmp);
 		}
 	}
-	std::cout<<"FIN INIT"<<std::endl;
 
 	for(unsigned int i=0;i<facesBound.size();i++){
 		double x = 0.0;
@@ -250,63 +230,34 @@ PView *GMSH_DuplicateBoundariesPlugin::executeBis(PView *view)
 					if (abs((p2.z()-p1.z()))<0.0001){
 						pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
 						ToDuplicateListBoundary.insert(facesBound[i]);
-						std::cout<<"case 1"<<std::endl;
-//						std::cout<<"on a p1.x() = "<<p1.x()<<" et p2.x() = "<<p2.x()<<" et abs((p2.x()-p1.x()-1.0)) = "<<abs((p2.x()-p1.x()-1.0))<<std::endl;
-//						std::cout<<"on a abs(0.5) = "<<abs(0.5)<<" et abs(-0.5) = "<<abs(-0.5)<<" et abs(1.5) = "<<abs(1.5)<<" et abs(-1.5) = "<<abs(-1.5)<<std::endl;
-//						std::cout<<"on a mis dans la liste: x "<<p1.x()<<" y "<<p1.y()<<" z "<<p1.z()<<std::endl;
-//						std::cout<<"on avait pour second: x "<<p2.x()<<" y "<<p2.y()<<" z "<<p2.z()<<std::endl;
 					}else if(abs((p2.z()-p1.z()-1.0))<0.0001){
 						pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
 						ToDuplicateListBoundary.insert(facesBound[i]);
-//						std::cout<<"case 2"<<std::endl;
-//						std::cout<<"on a mis dans la liste: x "<<p1.x()<<" y "<<p1.y()<<" z "<<p1.z()<<std::endl;
-//						std::cout<<"on avait pour second: x "<<p2.x()<<" y "<<p2.y()<<" z "<<p2.z()<<std::endl;
 					}else if (abs((p1.z()-p2.z()-1.0))<0.0001){
 						pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
 						ToDuplicateListBoundary.insert(facesBound[i]);
-//						std::cout<<"case 3"<<std::endl;
-//						std::cout<<"on a mis dans la liste: x "<<p1.x()<<" y "<<p1.y()<<" z "<<p1.z()<<std::endl;
-//						std::cout<<"on avait pour second: x "<<p2.x()<<" y "<<p2.y()<<" z "<<p2.z()<<std::endl;
 					}
 				}else if (abs((p2.y()-p1.y()-1.0))<0.0001){
 					if (abs((p2.z()-p1.z()))<0.0001){
 						pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
 						ToDuplicateListBoundary.insert(facesBound[i]);
-//						std::cout<<"case 4"<<std::endl;
-//						std::cout<<"on a mis dans la liste: x "<<p1.x()<<" y "<<p1.y()<<" z "<<p1.z()<<std::endl;
-//						std::cout<<"on avait pour second: x "<<p2.x()<<" y "<<p2.y()<<" z "<<p2.z()<<std::endl;
 					}else if (abs((p2.z()-p1.z()-1.0))<0.0001){
 						pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
 						ToDuplicateListBoundary.insert(facesBound[i]);
-//						std::cout<<"case 5"<<std::endl;
-//						std::cout<<"on a mis dans la liste: x "<<p1.x()<<" y "<<p1.y()<<" z "<<p1.z()<<std::endl;
-//						std::cout<<"on avait pour second: x "<<p2.x()<<" y "<<p2.y()<<" z "<<p2.z()<<std::endl;
 					}else if (abs((p1.z()-p2.z()-1.0))<0.0001){
 						pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
 						ToDuplicateListBoundary.insert(facesBound[i]);
-//						std::cout<<"case 6"<<std::endl;
-//						std::cout<<"on a mis dans la liste: x "<<p1.x()<<" y "<<p1.y()<<" z "<<p1.z()<<std::endl;
-//						std::cout<<"on avait pour second: x "<<p2.x()<<" y "<<p2.y()<<" z "<<p2.z()<<std::endl;
 					}
 				}else if (abs((p1.y()-p2.y()-1.0))<0.0001){
 					if (abs((p2.z()-p1.z()))<0.0001){
 						pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
 						ToDuplicateListBoundary.insert(facesBound[i]);
-//						std::cout<<"case 7"<<std::endl;
-//						std::cout<<"on a mis dans la liste: x "<<p1.x()<<" y "<<p1.y()<<" z "<<p1.z()<<std::endl;
-//						std::cout<<"on avait pour second: x "<<p2.x()<<" y "<<p2.y()<<" z "<<p2.z()<<std::endl;
 					}else if (abs((p2.z()-p1.z()-1.0))<0.0001){
 						pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
 						ToDuplicateListBoundary.insert(facesBound[i]);
-//						std::cout<<"case 8"<<std::endl;
-//						std::cout<<"on a mis dans la liste: x "<<p1.x()<<" y "<<p1.y()<<" z "<<p1.z()<<std::endl;
-//						std::cout<<"on avait pour second: x "<<p2.x()<<" y "<<p2.y()<<" z "<<p2.z()<<std::endl;
 					}else if (abs((p1.z()-p2.z()-1.0))<0.0001){
 						pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
 						ToDuplicateListBoundary.insert(facesBound[i]);
-//						std::cout<<"case 9"<<std::endl;
-//						std::cout<<"on a mis dans la liste: x "<<p1.x()<<" y "<<p1.y()<<" z "<<p1.z()<<std::endl;
-//						std::cout<<"on avait pour second: x "<<p2.x()<<" y "<<p2.y()<<" z "<<p2.z()<<std::endl;
 					}
 				}
 			}else if (abs((p1.x()-p2.x()-1.0))<0.0001){
@@ -340,21 +291,12 @@ PView *GMSH_DuplicateBoundariesPlugin::executeBis(PView *view)
 					if (abs((p2.z()-p1.z()))<0.0001){
 						pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
 						ToDuplicateListBoundary.insert(facesBound[i]);
-//						std::cout<<"case 10"<<std::endl;
-//						std::cout<<"on a mis dans la liste: x "<<p1.x()<<" y "<<p1.y()<<" z "<<p1.z()<<std::endl;
-//						std::cout<<"on avait pour second: x "<<p2.x()<<" y "<<p2.y()<<" z "<<p2.z()<<std::endl;
 					}else if (abs((p2.z()-p1.z()-1.0))<0.0001){
 						pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
 						ToDuplicateListBoundary.insert(facesBound[i]);
-//						std::cout<<"case 11"<<std::endl;
-//						std::cout<<"on a mis dans la liste: x "<<p1.x()<<" y "<<p1.y()<<" z "<<p1.z()<<std::endl;
-//						std::cout<<"on avait pour second: x "<<p2.x()<<" y "<<p2.y()<<" z "<<p2.z()<<std::endl;
 					}else if (abs((p1.z()-p2.z()-1.0))<0.0001){
 						pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
 						ToDuplicateListBoundary.insert(facesBound[i]);
-//						std::cout<<"case 12"<<std::endl;
-//						std::cout<<"on a mis dans la liste: x "<<p1.x()<<" y "<<p1.y()<<" z "<<p1.z()<<std::endl;
-//						std::cout<<"on avait pour second: x "<<p2.x()<<" y "<<p2.y()<<" z "<<p2.z()<<std::endl;
 					}
 				}else if (abs((p1.y()-p2.y()-1.0))<0.0001){
 					if (abs((p2.z()-p1.z()))<0.0001){
@@ -368,9 +310,6 @@ PView *GMSH_DuplicateBoundariesPlugin::executeBis(PView *view)
 					if (abs((p2.z()-p1.z()-1.0))<0.0001){
 						pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
 						ToDuplicateListBoundary.insert(facesBound[i]);
-//						std::cout<<"case 13"<<std::endl;
-//						std::cout<<"on a mis dans la liste: x "<<p1.x()<<" y "<<p1.y()<<" z "<<p1.z()<<std::endl;
-//						std::cout<<"on avait pour second: x "<<p2.x()<<" y "<<p2.y()<<" z "<<p2.z()<<std::endl;
 					}else if (abs((p1.z()-p2.z()-1.0))<0.0001){
 						//NOTHING
 					}
@@ -378,12 +317,10 @@ PView *GMSH_DuplicateBoundariesPlugin::executeBis(PView *view)
 			}
 		}
 	}
-	std::cout<<"on a une taille de facesBound = "<<facesBound.size()<<" et ToDuplicateListBoundary = "<<ToDuplicateListBoundary.size()<<std::endl;
 
 	int counterNbDone = 10000;
 	//int tagEdges = 10000;
 	for (std::set<GFace*>::iterator itr = ToDuplicateList.begin();itr != ToDuplicateList.end();itr++){
-		std::cout<<"on est entre pour la fois numero "<<counterNbDone<<std::endl;
 		counterNbDone++;
 		GFace* fTmp = (*itr);
 		//on doit dupliquer la face, les noeuds, les aretes, puis creer une region entre les deux
@@ -395,10 +332,8 @@ PView *GMSH_DuplicateBoundariesPlugin::executeBis(PView *view)
 		GRegion *rTmp = fTmp->getRegion(1);
 		std::list<GFace*> facesReg;
 		facesReg = rTmp->faces();
-		std::cout<<"rmtp a un nombre INITIAL de faces de "<<rTmp->faces().size()<<std::endl;
 		for (std::list<GFace*>::iterator it2=facesReg.begin();it2!=facesReg.end();it2++){
 			GFace* fTemp = (*it2);
-			std::cout<<" ID "<<fTemp->tag();
 		}
 		double xCenterReg = 0.0;
 		double yCenterReg = 0.0;
@@ -407,9 +342,6 @@ PView *GMSH_DuplicateBoundariesPlugin::executeBis(PView *view)
 
 
 
-		std::cout<<"nb de faces de la region 2: "<<rTmp->faces().size()<<std::endl;
-		std::cout<<"nb de points de la face 1 de region 2: "<<rTmp->faces().front()->vertices().size()<<std::endl;
-		std::cout<<"nb de points de la region 2: "<<rTmp->vertices().size()<<std::endl;
 
 		int counterPts = 0;
 		for(std::list<GFace*>::iterator it2=facesReg.begin();it2!=facesReg.end();it2++){
@@ -427,12 +359,9 @@ PView *GMSH_DuplicateBoundariesPlugin::executeBis(PView *view)
 		yCenterReg = yCenterReg/counterPts;
 		zCenterReg = zCenterReg/counterPts;
 
-		std::cout<<"debut boucle for "<<counterNbDone<<std::endl;
 		for (std::list<GVertex*>::iterator itv = vlist.begin();itv != vlist.end();itv++){
 			//duplication Gvertex
-			std::cout<<"point 1 "<<counterNbDone<<std::endl;
 			GVertex* vTmp = (*itv);
-			std::cout<<"point 2 "<<counterNbDone<<std::endl;
 			double ponderatedX = 0.99999999999 * vTmp->x() + 0.00000000001 * xCenterReg;
 			double ponderatedY = 0.99999999999 * vTmp->y() + 0.00000000001 * yCenterReg;
 			double ponderatedZ = 0.99999999999 * vTmp->z() + 0.00000000001 * zCenterReg;
@@ -441,42 +370,19 @@ PView *GMSH_DuplicateBoundariesPlugin::executeBis(PView *view)
 //			double ponderatedZ = 1.0 * vTmp->z() + 0.0 * zCenterReg;
 			//GVertex* newv = new gmshVertex(m,vTmp->prescribedMeshSizeAtVertex());
 			GVertex* newv = m->addVertex(ponderatedX,ponderatedY,ponderatedZ,vTmp->prescribedMeshSizeAtVertex());
-			std::cout<<"point 3 "<<counterNbDone<<std::endl;
 			GVertexAssociation[vTmp] = newv;
-			std::cout<<"test du ancien point: "<<vTmp->x()<<" et "<<vTmp->y()<<" et "<<vTmp->z()<<std::endl;
 			//creation des Gedge correspondantes
-			std::cout<<"point 4 "<<counterNbDone<<std::endl;
-			std::cout<<"test du nouveau point: "<<newv->x()<<" et "<<newv->y()<<" et "<<newv->z()<<std::endl;
 			//GEdge* newE = new GEdge(m,tagEdges,vTmp,newv);
 			//tagEdges++;
 			//m->add(newE);
-			std::cout<<"point gloubigoulba "<<counterNbDone<<std::endl;
 			GEdge* newE = m->addLine(vTmp,newv);
-			std::cout<<"point 5 "<<counterNbDone<<std::endl;
 			SurroudingEdges[vTmp] = newE;
 			//maintenant traitement mesh
-			std::cout<<"point 6 "<<counterNbDone<<std::endl;
 			MVertex *vMesh = vTmp->mesh_vertices[0];
-			std::cout<<"point 7 "<<counterNbDone<<std::endl;
 			MVertex *newMv = new MVertex(vMesh->x(), vMesh->y(), vMesh->z(), (GEntity*)newv);
-			std::cout<<"point 8 "<<counterNbDone<<std::endl;
 			VertexAssociation[vMesh] = newMv;
-			std::cout<<"point 9 "<<counterNbDone<<std::endl;
 			newv->addMeshVertex(newMv);
-			if (newMv->getNum() > 100000){
-				std::cout<<"on a un getnum de "<<newMv->getNum()<<std::endl;
-				while (1){
-
-				}
-			}
-			if (vMesh->getNum() > 100000){
-				std::cout<<"What ? on a un getnum vtmp de "<<newMv->getNum()<<std::endl;
-				while (1){
-
-				}
-			}
 		}
-		std::cout<<"apres points "<<counterNbDone<<std::endl;
 		std::list<GEdge*> elist = fTmp->edges();
 		std::vector<GEdge*> newEdgesVector;
 		std::vector<GFace*> SurroundingsFaces;
@@ -513,7 +419,6 @@ PView *GMSH_DuplicateBoundariesPlugin::executeBis(PView *view)
 				newE->addLine(newLine);
 			}
 		}
-		std::cout<<"apres lignes "<<counterNbDone<<std::endl;
 		std::vector<std::vector<GEdge*> > VecOfVec;
 		VecOfVec.push_back(newEdgesVector);
 		//creation de la nouvelle face
@@ -533,46 +438,9 @@ PView *GMSH_DuplicateBoundariesPlugin::executeBis(PView *view)
 			MTriangle *newTri = new MTriangle(firstE,secondE,thirdE);
 			GFaceAssociation->addTriangle(newTri);
 
-			if (elem->getVertex(0)->getNum() > 100000){
-				std::cout<<"ANCIENT TRI on a un getnum de "<<elem->getVertex(0)->getNum()<<std::endl;
-				while (1){
-
-				}
-			}
-			if (elem->getVertex(1)->getNum() > 100000){
-				std::cout<<"ANCIENT TRI on a un getnum de "<<elem->getVertex(1)->getNum()<<std::endl;
-				while (1){
-
-				}
-			}
-			if (elem->getVertex(2)->getNum() > 100000){
-				std::cout<<"ANCIENT TRI on a un getnum de "<<elem->getVertex(2)->getNum()<<std::endl;
-				while (1){
-
-				}
-			}
-
-			if (firstE->getNum() > 100000){
-				std::cout<<"CREAT TRI on a un getnum de "<<firstE->getNum()<<std::endl;
-				while (1){
-
-				}
-			}
-			if (secondE->getNum() > 100000){
-				std::cout<<"CREAT TRI on a un getnum de "<<secondE->getNum()<<std::endl;
-				while (1){
 
-				}
-			}
-			if (thirdE->getNum() > 100000){
-				std::cout<<"CREAT TRI on a un getnum de "<<thirdE->getNum()<<std::endl;
-				while (1){
-
-				}
-			}
 
 		}
-		std::cout<<"apres faces "<<counterNbDone<<std::endl;
 		std::vector<GFace*> VectorFaces;
 		std::list<GFace*> listFaces;
 		VectorFaces.push_back(fTmp);
@@ -585,150 +453,66 @@ PView *GMSH_DuplicateBoundariesPlugin::executeBis(PView *view)
 		listFaces.push_back(GFaceAssociation);
 		std::vector<std::vector<GFace*> > VecOfVecGFace;
 		VecOfVecGFace.push_back(VectorFaces);
-		std::cout<<"creation de la nouvelle region "<<counterNbDone<<std::endl;
 		//creation de la nouvelle region
 
 		GRegion* createdRegion = new GRegion(m,counterNbDone);
 		createdRegion->addPhysicalEntity(PhysicalInterface);
 		createdRegion->set(listFaces);
 		m->add(createdRegion);
-//		std::cout<<"plop 1"<<std::endl;
 		std::list<GFace*> RegFaces = rTmp->faces();
-//		std::cout<<"plop 2"<<std::endl;
 		std::list<GFace*>::iterator it = std::find(RegFaces.begin(), RegFaces.end(), fTmp);
-//		std::cout<<"plop 3"<<std::endl;
-//		std::cout<<"RegFaces a un nombre de faces de "<<RegFaces.size()<<std::endl;
 		std::cout<<(*it)->tag()<<std::endl;
 		if(it != RegFaces.end()) RegFaces.erase(it);
-//		std::cout<<"RegFaces a un nombre de faces de "<<RegFaces.size()<<std::endl;
-//		if(it != RegFaces.end()) RegFaces.remove((*it));
-//		std::cout<<"plop 4"<<std::endl;
 		RegFaces.push_back(GFaceAssociation);
-//		std::cout<<GFaceAssociation->tag()<<std::endl;
-//		std::cout<<"plop 5"<<std::endl;
 		rTmp->set(RegFaces);
-//		std::cout<<"rmtp a un nombre de faces de "<<rTmp->faces().size()<<std::endl;
 		std::list<GFace*> NewFacesReg;
 		NewFacesReg = rTmp->faces();
 		for (std::list<GFace*>::iterator it2=NewFacesReg.begin();it2!=NewFacesReg.end();it2++){
 			GFace* fTemp = (*it2);
-//			std::cout<<" ID "<<fTemp->tag();
 			for (std::list<GEdge*>::iterator ite = elist.begin();ite != elist.end();ite++){
 				GEdge* eTmp = (*ite);
 				GEdge* newE = GEdgeAssociation[eTmp];
 				fTemp->replaceEdge(eTmp,newE);
 			}
 		}
-		std::cout<<"plop 6"<<std::endl;
 		for (unsigned int i = 0; i < fTmp->getNumMeshElements();i++){
 			MElement* elem = fTmp->getMeshElement(i);
-//			std::cout<<"on an element with a number of vertices of: "<<elem->getNumVertices()<<std::endl;
 
-			if (elem->getVertex(0)->getNum() > 100000){
-				std::cout<<"on a un getnum de "<<elem->getVertex(0)->getNum()<<std::endl;
-				while (1){
+	
 
-				}
-			}
-			if (elem->getVertex(1)->getNum() > 100000){
-				std::cout<<"on a un getnum de "<<elem->getVertex(1)->getNum()<<std::endl;
-				while (1){
-
-				}
-			}
-			if (elem->getVertex(2)->getNum() > 100000){
-				std::cout<<"on a un getnum de "<<elem->getVertex(2)->getNum()<<std::endl;
-				while (1){
-
-				}
-			}
-
-//			std::cout<<"on a un element avec un nb de vertex de "<<elem->getNumVertices()<<std::endl;
 			MVertex *firstE = VertexAssociation.find(elem->getVertex(0))->second;
 			MVertex *secondE = VertexAssociation.find(elem->getVertex(1))->second;
 			MVertex *thirdE = VertexAssociation.find(elem->getVertex(2))->second;
 
-			if (firstE->getNum() > 100000){
-				std::cout<<"on a un getnum de "<<firstE->getNum()<<std::endl;
-				while (1){
+	
 
-				}
-			}
-			if (secondE->getNum() > 100000){
-				std::cout<<"on a un getnum de "<<secondE->getNum()<<std::endl;
-				while (1){
-
-				}
-			}
-			if (thirdE->getNum() > 100000){
-				std::cout<<"on a un getnum de "<<thirdE->getNum()<<std::endl;
-				while (1){
-
-				}
-			}
-//			std::cout<<"on a les 3 vertices: "<<elem->getVertex(0)->getNum()<<" "<<elem->getVertex(1)->getNum()<<" "<<elem->getVertex(2)->getNum()<<std::endl;
-//			std::cout<<"et les 3 vertices: "<<firstE->getNum()<<" "<<secondE->getNum()<<" "<<thirdE->getNum()<<std::endl;
-//			std::cout<<"creation de prisme "<<counterNbDone<<std::endl;
 			MPrism *newPri = new MPrism(elem->getVertex(0),elem->getVertex(1),elem->getVertex(2),firstE,secondE,thirdE);
-//			std::cout<<"addition de prisme "<<counterNbDone<<std::endl;
 
 			createdRegion->addPrism(newPri);
-//			std::cout<<"fin de for"<<std::endl;
 		}
-		std::cout<<"apres region, refonte points "<<counterNbDone<<std::endl;
 		for (unsigned int i = 0; i < rTmp->getNumMeshElements();i++){
 			MElement* elem = rTmp->getMeshElement(i);
 			for (int j = 0;j < elem->getNumVertices();j++){
 				MVertex* vert = elem->getVertex(j);
 				std::map<MVertex*,MVertex* >::iterator itMap = VertexAssociation.find(vert);
 				if (itMap != VertexAssociation.end()){
-//					std::cout<<"on va changer un point"<<std::endl;
 					elem->setVertex(j,itMap->second);
-//					std::cout<<"on a introduit "<<itMap->second->getNum()<<std::endl;
-//					std::cout<<"maintenant elem j "<<elem->getVertex(j)->getNum()<<std::endl;
-//					std::cout<<"youpi"<<std::endl;
 				}
 			}
 		}
-		std::cout<<"plop 7"<<std::endl;
-//		std::cout<<"rmtp a un nombre de faces de "<<rTmp->faces().size()<<std::endl;
 		int countTmp = 0;
 		//maitenant refonte points dans faces
 		for (std::list<GFace*>::iterator itTmp = NewFacesReg.begin();itTmp != NewFacesReg.end();itTmp++){
 			GFace* GFaceTmp = (*itTmp);
-//			std::cout<<GFaceTmp->tag()<<std::endl;
 			countTmp++;
-//			std::cout<<" iteration "<<countTmp<<std::endl;
 			for (unsigned int i = 0; i < GFaceTmp->getNumMeshElements();i++){
-//				std::cout<<" plop 7.1"<<std::endl;
 				MElement* elem = GFaceTmp->getMeshElement(i);
 				for (int j = 0;j < elem->getNumVertices();j++){
-//					std::cout<<" plop 7.2"<<std::endl;
 					MVertex* vert = elem->getVertex(j);
-//					std::cout<<" plop 7.3"<<std::endl;
 					std::map<MVertex*,MVertex* >::iterator itMap = VertexAssociation.find(vert);
-//					std::cout<<" plop 7.4"<<std::endl;
 					if (itMap != VertexAssociation.end()){
-//						std::cout<<"on va changer un point"<<std::endl;
-//						if (elem->getNumVertices() != 3){
-//							std::cout<<"on a un pb ! nb de vertices de "<<elem->getNumVertices()<<std::endl;
-//							while (1){
-//
-//							}
-//						}
 						elem->setVertex(j,itMap->second);
-						if (elem->getVertex(j)->getNum() > 100000){
-							std::cout<<"PENDANT CHANGEMENT on a un getnum de "<<elem->getVertex(j)->getNum()<<std::endl;
-							while (1){
-
-							}
-						}
-						if (itMap->second->getNum() > 100000){
-							std::cout<<"PENDANT CHANGEMENT on a un ITMAP getnum de "<<itMap->second->getNum()<<std::endl;
-							while (1){
-
-							}
-						}
+	
 
 
 						std::vector<MVertex*> FaceVerti = GFaceTmp->mesh_vertices;
@@ -740,20 +524,14 @@ PView *GMSH_DuplicateBoundariesPlugin::executeBis(PView *view)
 						}
 
 
-//						std::cout<<"rmtp a un nombre de faces de "<<rTmp->faces().size()<<std::endl;
-//						std::cout<<"on a introduit "<<itMap->second->getNum()<<std::endl;
-//						std::cout<<"maintenant elem j "<<elem->getVertex(j)->getNum()<<std::endl;
-//						std::cout<<"youpi"<<std::endl;
 					}
 				}
 			}
-//			std::cout<<"plop 8"<<std::endl;
 		}
 	}
 
 	//maintenant on attaque les faces au bord
 	for (std::set<GFace*>::iterator itr = ToDuplicateListBoundary.begin();itr != ToDuplicateListBoundary.end();itr++){
-		std::cout<<"AU BORD on est entre pour la fois numero "<<counterNbDone<<std::endl;
 		counterNbDone++;
 		GFace* fTmp = (*itr);
 		//on doit dupliquer la face, les noeuds, les aretes, puis creer une region entre les deux
@@ -787,48 +565,23 @@ PView *GMSH_DuplicateBoundariesPlugin::executeBis(PView *view)
 		yCenterReg = yCenterReg/counterPts;
 		zCenterReg = zCenterReg/counterPts;
 
-//		std::cout<<"debut boucle for "<<counterNbDone<<std::endl;
 		for (std::list<GVertex*>::iterator itv = vlist.begin();itv != vlist.end();itv++){
 			//duplication Gvertex
-//			std::cout<<"point 1 "<<counterNbDone<<std::endl;
 			GVertex* vTmp = (*itv);
-//			std::cout<<"point 2 "<<counterNbDone<<std::endl;
 			double ponderatedX = 0.99999999999 * vTmp->x() + 0.00000000001 * xCenterReg;
 			double ponderatedY = 0.99999999999 * vTmp->y() + 0.00000000001 * yCenterReg;
 			double ponderatedZ = 0.99999999999 * vTmp->z() + 0.00000000001 * zCenterReg;
-//			double ponderatedX = 1.0 * vTmp->x() + 0.0 * xCenterReg;
-//			double ponderatedY = 1.0 * vTmp->y() + 0.0 * yCenterReg;
-//			double ponderatedZ = 1.0 * vTmp->z() + 0.0 * zCenterReg;
-			//GVertex* newv = new gmshVertex(m,vTmp->prescribedMeshSizeAtVertex());
 			GVertex* newv = m->addVertex(ponderatedX,ponderatedY,ponderatedZ,vTmp->prescribedMeshSizeAtVertex());
-//			std::cout<<"point 3 "<<counterNbDone<<std::endl;
 			GVertexAssociation[vTmp] = newv;
 			//creation des Gedge correspondantes
-//			std::cout<<"point 4 "<<counterNbDone<<std::endl;
-//			std::cout<<"test du nouveau point: "<<newv->x()<<" et "<<newv->y()<<" et "<<newv->z()<<std::endl;
-			//GEdge* newE = new GEdge(m,tagEdges,vTmp,newv);
-			//tagEdges++;
-			//m->add(newE);
 			GEdge* newE = m->addLine(vTmp,newv);
-//			std::cout<<"point 5 "<<counterNbDone<<std::endl;
 			SurroudingEdges[vTmp] = newE;
 			//maintenant traitement mesh
-//			std::cout<<"point 6 "<<counterNbDone<<std::endl;
 			MVertex *vMesh = vTmp->mesh_vertices[0];
-//			std::cout<<"point 7 "<<counterNbDone<<std::endl;
 			MVertex *newMv = new MVertex(vMesh->x(), vMesh->y(), vMesh->z(), (GEntity*)newv);
-//			std::cout<<"point 8 "<<counterNbDone<<std::endl;
 			VertexAssociation[vMesh] = newMv;
-//			std::cout<<"point 9 "<<counterNbDone<<std::endl;
 			newv->addMeshVertex(newMv);
-			if (newMv->getNum() > 100000){
-				std::cout<<"on a un getnum de "<<newMv->getNum()<<std::endl;
-				while (1){
-
-				}
-			}
 		}
-//		std::cout<<"apres points "<<counterNbDone<<std::endl;
 		std::list<GEdge*> elist = fTmp->edges();
 		std::vector<GEdge*> newEdgesVector;
 		std::vector<GFace*> SurroundingsFaces;
@@ -865,7 +618,6 @@ PView *GMSH_DuplicateBoundariesPlugin::executeBis(PView *view)
 				newE->addLine(newLine);
 			}
 		}
-//		std::cout<<"apres lignes "<<counterNbDone<<std::endl;
 		std::vector<std::vector<GEdge*> > VecOfVec;
 		VecOfVec.push_back(newEdgesVector);
 		//creation de la nouvelle face
@@ -885,7 +637,6 @@ PView *GMSH_DuplicateBoundariesPlugin::executeBis(PView *view)
 			MTriangle *newTri = new MTriangle(firstE,secondE,thirdE);
 			GFaceAssociation->addTriangle(newTri);
 		}
-//		std::cout<<"apres faces "<<counterNbDone<<std::endl;
 		std::vector<GFace*> VectorFaces;
 		std::list<GFace*> listFaces;
 		VectorFaces.push_back(fTmp);
@@ -898,7 +649,6 @@ PView *GMSH_DuplicateBoundariesPlugin::executeBis(PView *view)
 		listFaces.push_back(GFaceAssociation);
 		std::vector<std::vector<GFace*> > VecOfVecGFace;
 		VecOfVecGFace.push_back(VectorFaces);
-//		std::cout<<"creation de la nouvelle region "<<counterNbDone<<std::endl;
 		//creation de la nouvelle region
 
 		GRegion* createdRegion = new GRegion(m,counterNbDone);
@@ -927,16 +677,12 @@ PView *GMSH_DuplicateBoundariesPlugin::executeBis(PView *view)
 
 		for (unsigned int i = 0; i < fTmp->getNumMeshElements();i++){
 			MElement* elem = fTmp->getMeshElement(i);
-//			std::cout<<"on a un element avec un nb de vertex de "<<elem->getNumVertices()<<std::endl;
 			MVertex *firstE = VertexAssociation.find(elem->getVertex(0))->second;
 			MVertex *secondE = VertexAssociation.find(elem->getVertex(1))->second;
 			MVertex *thirdE = VertexAssociation.find(elem->getVertex(2))->second;
-//			std::cout<<"creation de prisme "<<counterNbDone<<std::endl;
 			MPrism *newPri = new MPrism(elem->getVertex(0),elem->getVertex(1),elem->getVertex(2),firstE,secondE,thirdE);
-//			std::cout<<"addition de prisme "<<counterNbDone<<std::endl;
 
 			createdRegion->addPrism(newPri);
-//			std::cout<<"fin de for"<<std::endl;
 		}
 		for (unsigned int i = 0; i < rTmp->getNumMeshElements();i++){
 			MElement* elem = rTmp->getMeshElement(i);
@@ -1004,84 +750,11 @@ PView *GMSH_DuplicateBoundariesPlugin::executeBis(PView *view)
 
 
 
-/*
-	std::map<std::pair<MVertex*,GRegion*>,MVertex* > VertexAssociation;
-	for (GModel::viter itv = m->firstVertex();itv != m->lastVertex();itv++){
-//		std::cout<<"entering first for"<<std::endl;
-		GVertex* vTmp = (*itv);
-		std::list<GRegion*> r = vTmp->regions();
-		std::cout<<"size of mesh_vertices: "<<vTmp->mesh_vertices.size()<<std::endl;
-		MVertex *vMesh = vTmp->mesh_vertices[0];
-		std::cout<<"size of r: "<<r.size()<<std::endl;
-		// for all regions, create association
-//		for (int i = 0; i < vTmp->getNumMeshVertices();i++){
-//			std::cout<<"entering second for"<<std::endl;
-//			MVertex* vMesh = vTmp->getMeshVertex(i);
-//			for (GModel::riter itr = vTmp->regions().begin();itr != vTmp->regions().end();itr++){
-		for (std::list<GRegion*>::iterator itr = r.begin();itr != r.end();itr++){
-			std::cout<<"entering third for"<<std::endl;
-			GRegion* vReg = (*itr);
-			//				std::cout<<"we have the region "<<vReg->
-			MVertex *newv = new MVertex(vMesh->x(), vMesh->y(), vMesh->z(), (GEntity*)vReg);
-			vReg->mesh_vertices.push_back(newv);
-			VertexAssociation[std::make_pair(vMesh,vReg)] = newv;
-			std::cout<<"end third for"<<std::endl;
-		}
-//			std::cout<<"end second for"<<std::endl;
-//		}
-//		std::cout<<"end first for"<<std::endl;
-	}
-	std::cout<<"Phase 1 done for DuplicateBoundaries"<<std::endl;
-	for (GModel::eiter ite = m->firstEdge();ite != m->lastEdge();ite++){
-		GEdge* eTmp = (*ite);
-		for (int i = 0; i < eTmp->mesh_vertices.size();i++){
-			MVertex* vMesh = eTmp->mesh_vertices[i];
-			std::list<GRegion*> r = eTmp->regions();
-			for (std::list<GRegion*>::iterator itr = r.begin();itr != r.end();itr++){
-				GRegion* vReg = (*itr);
-				MVertex *newv = new MVertex(vMesh->x(), vMesh->y(), vMesh->z(), (GEntity*)vReg);
-				vReg->mesh_vertices.push_back(newv);
-				VertexAssociation[std::make_pair(vMesh,vReg)] = newv;
-			}
-		}
-	}
-	std::cout<<"Phase 2 done for DuplicateBoundaries"<<std::endl;
-	for (GModel::fiter itf = m->firstFace();itf != m->lastFace();itf++){
-		GFace* fTmp = (*itf);
-		for (int i = 0; i < fTmp->mesh_vertices.size();i++){
-			MVertex* vMesh = fTmp->mesh_vertices[i];
-			std::list<GRegion*> r = fTmp->regions();
-			for (std::list<GRegion*>::iterator itr = r.begin();itr != r.end();itr++){
-				GRegion* vReg = (*itr);
-				MVertex *newv = new MVertex(vMesh->x(), vMesh->y(), vMesh->z(), (GEntity*)vReg);
-				vReg->mesh_vertices.push_back(newv);
-				VertexAssociation[std::make_pair(vMesh,vReg)] = newv;
-			}
-		}
-	}
-	std::cout<<"Phase 3 done for DuplicateBoundaries"<<std::endl;
-	for (GModel::riter itr = m->firstRegion();itr != m->lastRegion();itr++){
-		GRegion* rTmp = (*itr);
-		for (int i = 0; i < rTmp->getNumMeshElements();i++){
-			MElement* elem = rTmp->getMeshElement(i);
-			for (int j = 0;j < elem->getNumVertices();j++){
-				MVertex* vert = elem->getVertex(j);
-				std::map<std::pair<MVertex*,GRegion*>,MVertex* >::iterator itMap = VertexAssociation.find(std::make_pair(vert,rTmp));
-				if (itMap != VertexAssociation.end()){
-					elem->setVertex(j,itMap->second);
-				}
-			}
-		}
-	}
-	*/
-//	std::cout<<"number for seeds: "<<PhysicalSeeds<<" and for interface: "<<PhysicalInterface<<std::endl;
-	std::cout<<"End of DuplicateBoundaries"<<std::endl;
 	return view;
 }
 
 PView *GMSH_DuplicateBoundariesPlugin::executeFourth(PView *view)
 {
-	std::cout<<"starting DuplicateBoundaries"<<std::endl;
 	GModel *m = GModel::current();
 	m->setFactory("geo");
 	std::set<GFace*> ToDuplicateList;
@@ -1152,63 +825,34 @@ PView *GMSH_DuplicateBoundariesPlugin::executeFourth(PView *view)
 					if (abs((p2.z()-p1.z()))<0.0001){
 						pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
 						ToDuplicateListBoundary.insert(facesBound[i]);
-//						std::cout<<"case 1"<<std::endl;
-//						std::cout<<"on a p1.x() = "<<p1.x()<<" et p2.x() = "<<p2.x()<<" et abs((p2.x()-p1.x()-1.0)) = "<<abs((p2.x()-p1.x()-1.0))<<std::endl;
-//						std::cout<<"on a abs(0.5) = "<<abs(0.5)<<" et abs(-0.5) = "<<abs(-0.5)<<" et abs(1.5) = "<<abs(1.5)<<" et abs(-1.5) = "<<abs(-1.5)<<std::endl;
-//						std::cout<<"on a mis dans la liste: x "<<p1.x()<<" y "<<p1.y()<<" z "<<p1.z()<<std::endl;
-//						std::cout<<"on avait pour second: x "<<p2.x()<<" y "<<p2.y()<<" z "<<p2.z()<<std::endl;
 					}else if(abs((p2.z()-p1.z()-1.0))<0.0001){
 						pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
 						ToDuplicateListBoundary.insert(facesBound[i]);
-//						std::cout<<"case 2"<<std::endl;
-//						std::cout<<"on a mis dans la liste: x "<<p1.x()<<" y "<<p1.y()<<" z "<<p1.z()<<std::endl;
-//						std::cout<<"on avait pour second: x "<<p2.x()<<" y "<<p2.y()<<" z "<<p2.z()<<std::endl;
 					}else if (abs((p1.z()-p2.z()-1.0))<0.0001){
 						pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
 						ToDuplicateListBoundary.insert(facesBound[i]);
-//						std::cout<<"case 3"<<std::endl;
-//						std::cout<<"on a mis dans la liste: x "<<p1.x()<<" y "<<p1.y()<<" z "<<p1.z()<<std::endl;
-//						std::cout<<"on avait pour second: x "<<p2.x()<<" y "<<p2.y()<<" z "<<p2.z()<<std::endl;
 					}
 				}else if (abs((p2.y()-p1.y()-1.0))<0.0001){
 					if (abs((p2.z()-p1.z()))<0.0001){
 						pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
 						ToDuplicateListBoundary.insert(facesBound[i]);
-//						std::cout<<"case 4"<<std::endl;
-//						std::cout<<"on a mis dans la liste: x "<<p1.x()<<" y "<<p1.y()<<" z "<<p1.z()<<std::endl;
-//						std::cout<<"on avait pour second: x "<<p2.x()<<" y "<<p2.y()<<" z "<<p2.z()<<std::endl;
 					}else if (abs((p2.z()-p1.z()-1.0))<0.0001){
 						pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
 						ToDuplicateListBoundary.insert(facesBound[i]);
-//						std::cout<<"case 5"<<std::endl;
-//						std::cout<<"on a mis dans la liste: x "<<p1.x()<<" y "<<p1.y()<<" z "<<p1.z()<<std::endl;
-//						std::cout<<"on avait pour second: x "<<p2.x()<<" y "<<p2.y()<<" z "<<p2.z()<<std::endl;
 					}else if (abs((p1.z()-p2.z()-1.0))<0.0001){
 						pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
 						ToDuplicateListBoundary.insert(facesBound[i]);
-//						std::cout<<"case 6"<<std::endl;
-//						std::cout<<"on a mis dans la liste: x "<<p1.x()<<" y "<<p1.y()<<" z "<<p1.z()<<std::endl;
-//						std::cout<<"on avait pour second: x "<<p2.x()<<" y "<<p2.y()<<" z "<<p2.z()<<std::endl;
 					}
 				}else if (abs((p1.y()-p2.y()-1.0))<0.0001){
 					if (abs((p2.z()-p1.z()))<0.0001){
 						pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
 						ToDuplicateListBoundary.insert(facesBound[i]);
-//						std::cout<<"case 7"<<std::endl;
-//						std::cout<<"on a mis dans la liste: x "<<p1.x()<<" y "<<p1.y()<<" z "<<p1.z()<<std::endl;
-//						std::cout<<"on avait pour second: x "<<p2.x()<<" y "<<p2.y()<<" z "<<p2.z()<<std::endl;
 					}else if (abs((p2.z()-p1.z()-1.0))<0.0001){
 						pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
 						ToDuplicateListBoundary.insert(facesBound[i]);
-//						std::cout<<"case 8"<<std::endl;
-//						std::cout<<"on a mis dans la liste: x "<<p1.x()<<" y "<<p1.y()<<" z "<<p1.z()<<std::endl;
-//						std::cout<<"on avait pour second: x "<<p2.x()<<" y "<<p2.y()<<" z "<<p2.z()<<std::endl;
 					}else if (abs((p1.z()-p2.z()-1.0))<0.0001){
 						pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
 						ToDuplicateListBoundary.insert(facesBound[i]);
-//						std::cout<<"case 9"<<std::endl;
-//						std::cout<<"on a mis dans la liste: x "<<p1.x()<<" y "<<p1.y()<<" z "<<p1.z()<<std::endl;
-//						std::cout<<"on avait pour second: x "<<p2.x()<<" y "<<p2.y()<<" z "<<p2.z()<<std::endl;
 					}
 				}
 			}else if (abs((p1.x()-p2.x()-1.0))<0.0001){
@@ -1242,21 +886,12 @@ PView *GMSH_DuplicateBoundariesPlugin::executeFourth(PView *view)
 					if (abs((p2.z()-p1.z()))<0.0001){
 						pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
 						ToDuplicateListBoundary.insert(facesBound[i]);
-//						std::cout<<"case 10"<<std::endl;
-//						std::cout<<"on a mis dans la liste: x "<<p1.x()<<" y "<<p1.y()<<" z "<<p1.z()<<std::endl;
-//						std::cout<<"on avait pour second: x "<<p2.x()<<" y "<<p2.y()<<" z "<<p2.z()<<std::endl;
 					}else if (abs((p2.z()-p1.z()-1.0))<0.0001){
 						pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
 						ToDuplicateListBoundary.insert(facesBound[i]);
-//						std::cout<<"case 11"<<std::endl;
-//						std::cout<<"on a mis dans la liste: x "<<p1.x()<<" y "<<p1.y()<<" z "<<p1.z()<<std::endl;
-//						std::cout<<"on avait pour second: x "<<p2.x()<<" y "<<p2.y()<<" z "<<p2.z()<<std::endl;
 					}else if (abs((p1.z()-p2.z()-1.0))<0.0001){
 						pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
 						ToDuplicateListBoundary.insert(facesBound[i]);
-//						std::cout<<"case 12"<<std::endl;
-//						std::cout<<"on a mis dans la liste: x "<<p1.x()<<" y "<<p1.y()<<" z "<<p1.z()<<std::endl;
-//						std::cout<<"on avait pour second: x "<<p2.x()<<" y "<<p2.y()<<" z "<<p2.z()<<std::endl;
 					}
 				}else if (abs((p1.y()-p2.y()-1.0))<0.0001){
 					if (abs((p2.z()-p1.z()))<0.0001){
@@ -1270,9 +905,6 @@ PView *GMSH_DuplicateBoundariesPlugin::executeFourth(PView *view)
 					if (abs((p2.z()-p1.z()-1.0))<0.0001){
 						pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
 						ToDuplicateListBoundary.insert(facesBound[i]);
-//						std::cout<<"case 13"<<std::endl;
-//						std::cout<<"on a mis dans la liste: x "<<p1.x()<<" y "<<p1.y()<<" z "<<p1.z()<<std::endl;
-//						std::cout<<"on avait pour second: x "<<p2.x()<<" y "<<p2.y()<<" z "<<p2.z()<<std::endl;
 					}else if (abs((p1.z()-p2.z()-1.0))<0.0001){
 						//NOTHING
 					}
@@ -1280,7 +912,6 @@ PView *GMSH_DuplicateBoundariesPlugin::executeFourth(PView *view)
 			}
 		}
 	}
-	std::cout<<"on a une taille de facesBound = "<<facesBound.size()<<" et ToDuplicateListBoundary = "<<ToDuplicateListBoundary.size()<<std::endl;
 
 
 
@@ -1295,49 +926,7 @@ PView *GMSH_DuplicateBoundariesPlugin::executeFourth(PView *view)
 	std::map<std::pair<GVertex*,GRegion*>,GVertex* > GVertexGlobalAssociation;
 	std::map<std::pair<GEdge*,GRegion*>,GEdge* > GEdgeGlobalAssociation;
 	std::map<std::pair<GFace*,GRegion*>,GFace* > GFaceGlobalAssociation;
-//	for (GModel::viter itv= m->firstVertex();itv != m->lastVertex();itv++){
-//		GVertex* vTmp = (*itv);
-//		std::vector<GVertex* > vecTmp;
-//		vecTmp.clear();
-//		GVertexGlobalAssociation[vTmp] = vecTmp;
-//		for (int i = 0; i < vTmp->mesh_vertices.size();i++){
-//			MVertex *vMesh = vTmp->mesh_vertices[i];
-//			std::vector<MVertex* > vecTmpBis;
-//			vecTmpBis.clear();
-//			VertexGlobalAssociation[vMesh] = vecTmpBis;
-//		}
-//	}
-//	for (GModel::eiter ite= m->firstEdge();ite != m->lastEdge();ite++){
-//		GEdge* eTmp = (*ite);
-//		std::vector<GEdge* > vecTmp;
-//		vecTmp.clear();
-//		GEdgeGlobalAssociation[eTmp] = vecTmp;
-//		for (int i = 0; i < eTmp->mesh_vertices.size();i++){
-//			MVertex *vMesh = eTmp->mesh_vertices[i];
-//			std::vector<MVertex* > vecTmpBis;
-//			vecTmpBis.clear();
-//			VertexGlobalAssociation[vMesh] = vecTmpBis;
-//		}
-//	}
-//	for (GModel::fiter itf= m->firstFace();itf != m->lastFace();itf++){
-//		GFace* fTmp = (*itf);
-//		for (int i = 0; i < fTmp->mesh_vertices.size();i++){
-//			MVertex *vMesh = fTmp->mesh_vertices[i];
-//			std::vector<MVertex* > vecTmpBis;
-//			vecTmpBis.clear();
-//			VertexGlobalAssociation[vMesh] = vecTmpBis;
-//		}
-//	}
-//	for (GModel::riter itr= m->firstRegion();itr != m->lastRegion();itr++){
-//		GRegion* rTmp = (*itr);
-//		for (int i = 0; i < rTmp->mesh_vertices.size();i++){
-//			MVertex *vMesh = rTmp->mesh_vertices[i];
-//			std::vector<MVertex* > vecTmpBis;
-//			vecTmpBis.clear();
-//			VertexGlobalAssociation[vMesh] = vecTmpBis;
-//		}
-//	}
-	std::cout<<"entree dans regions first pass"<<std::endl;
+
 	for (GModel::riter itr= m->firstRegion();itr != m->lastRegion();itr++){
 		GRegion* rTmp = (*itr);
 		std::list<GFace*> RegFaces = rTmp->faces();
@@ -1366,27 +955,17 @@ PView *GMSH_DuplicateBoundariesPlugin::executeFourth(PView *view)
 		std::list<GVertex*> vlist;
 
 
-		std::cout<<"wut 1"<<std::endl;
 		std::list<GFace*> listFacesTmp = rTmp->faces();
 		for (std::list<GFace*>::iterator itTp = listFacesTmp.begin();itTp != listFacesTmp.end();itTp++){
-			std::cout<<"wut 2"<<std::endl;
 			std::list<GVertex*> vlist2;
-			std::cout<<"wut 3"<<std::endl;
 			vlist2 = (*itTp)->vertices();
-			std::cout<<"wut 4"<<std::endl;
 			for (std::list<GVertex*>::iterator itTp2 = vlist2.begin();itTp2 != vlist2.end();itTp2++){
-				std::cout<<"wut 5"<<std::endl;
 				if(std::find(vlist.begin(), vlist.end(), *itTp2) == vlist.end())
 					vlist.push_back(*itTp2);
-				std::cout<<"wut 6"<<std::endl;
 			}
-			std::cout<<"wut 7"<<std::endl;
 		}
-		std::cout<<"wut 8"<<std::endl;
 
 
-		std::cout<<"on a une taille vlist de "<<vlist.size()<<std::endl;
-		std::cout<<"init done entering vertices"<<std::endl;
 		for (std::list<GVertex*>::iterator itv = vlist.begin();itv != vlist.end();itv++){
 			//duplication Gvertex
 			GVertex* vTmp = (*itv);
@@ -1394,7 +973,6 @@ PView *GMSH_DuplicateBoundariesPlugin::executeFourth(PView *view)
 			double ponderatedY = 0.99999999999 * vTmp->y() + 0.00000000001 * yCenterReg;
 			double ponderatedZ = 0.99999999999 * vTmp->z() + 0.00000000001 * zCenterReg;
 			GVertex* newv = m->addVertex(ponderatedX,ponderatedY,ponderatedZ,vTmp->prescribedMeshSizeAtVertex());
-			std::cout<<"inserted correspondance between : "<<vTmp->tag()<<" and : "<<newv->tag()<<std::endl;
 			GVertexAssociation[vTmp] = newv;
 			GVertexGlobalAssociation[std::make_pair(vTmp,rTmp)] = newv;
 			//creation des Gedge correspondantes
@@ -1409,18 +987,12 @@ PView *GMSH_DuplicateBoundariesPlugin::executeFourth(PView *view)
 		}
 		//maintenant on soccupe de duppliquer les edges de la region
 		std::list<GEdge*> elist = rTmp->edges();
-		std::cout<<"on a une taille elist de "<<elist.size()<<std::endl;
-		std::cout<<"vertices done entering edges"<<std::endl;
 
 		std::vector<GFace*> SurroundingsFaces;
 		for (std::list<GEdge*>::iterator ite = elist.begin();ite != elist.end();ite++){
 			//duplication Gedge
 			GEdge* eTmp = (*ite);
-			std::cout<<"before addline"<<std::endl;
-			std::cout<<"begin ID : "<<eTmp->getBeginVertex()->tag()<<" and end ID : "<<eTmp->getEndVertex()->tag()<<std::endl;
-			std::cout<<"corresponding begin ID : "<<GVertexAssociation[eTmp->getBeginVertex()]->tag()<<" and end ID : "<<GVertexAssociation[eTmp->getEndVertex()]->tag()<<std::endl;
 			GEdge* newE = m->addLine(GVertexAssociation[eTmp->getEndVertex()],GVertexAssociation[eTmp->getBeginVertex()]);
-			std::cout<<"after addline"<<std::endl;
 			GEdgeAssociation[eTmp] = newE;
 			GEdgeGlobalAssociation[std::make_pair(eTmp,rTmp)] = newE;
 			//creation des GFace correspondantes
@@ -1443,7 +1015,6 @@ PView *GMSH_DuplicateBoundariesPlugin::executeFourth(PView *view)
 				VertexGlobalAssociation[std::make_pair(vMesh,rTmp)] = newMv;
 				newE->addMeshVertex(newMv);
 			}
-			std::cout<<"after newvertices"<<std::endl;
 			for (unsigned int i = 0; i < eTmp->getNumMeshElements();i++){
 				MElement* elem = eTmp->getMeshElement(i);
 				MVertex *firstETmp = VertexAssociation.find(elem->getVertex(0))->second;
@@ -1451,9 +1022,7 @@ PView *GMSH_DuplicateBoundariesPlugin::executeFourth(PView *view)
 				MLine *newLine = new MLine(firstETmp,lastETmp);
 				newE->addLine(newLine);
 			}
-			std::cout<<"after newMlines"<<std::endl;
 		}
-		std::cout<<"edges done entering faces"<<std::endl;
 		for (std::list<GFace*>::iterator itf = RegFaces.begin();itf != RegFaces.end();itf++){
 			GFace* fTmp = (*itf);
 			std::vector<GEdge*> newEdgesVector;
@@ -1485,9 +1054,7 @@ PView *GMSH_DuplicateBoundariesPlugin::executeFourth(PView *view)
 			}
 			GFaceGlobalAssociation[std::make_pair(fTmp,rTmp)] = GFaceAssociation;
 		}
-		std::cout<<"faces done for regions"<<std::endl;
 	}
-	std::cout<<"Regions done first pass"<<std::endl;
 	int counterNbDone = 10000;
 	//maintenant on va traiter les faces initiales
 	for (std::set<GFace*>::iterator itf = ToDuplicateList.begin();itf != ToDuplicateList.end();itf++){
@@ -1618,25 +1185,17 @@ PView *GMSH_DuplicateBoundariesPlugin::executeFourth(PView *view)
 			if (itMap != VertexGlobalAssociation.end()){
 				v6 = itMap->second;
 			}
-//			std::cout<<"creation de prisme "<<counterNbDone<<std::endl;
 			MPrism *newPri = new MPrism(v1,v2,v3,v4,v5,v6);
-//			std::cout<<"addition de prisme "<<counterNbDone<<std::endl;
 
 			createdRegion->addPrism(newPri);
-//			std::cout<<"fin de for"<<std::endl;
 		}
-		std::cout<<"apres region, refonte points "<<counterNbDone<<std::endl;
 		for (unsigned int i = 0; i < reg1->getNumMeshElements();i++){
 			MElement* elem = reg1->getMeshElement(i);
 			for (int j = 0;j < elem->getNumVertices();j++){
 				MVertex* vert = elem->getVertex(j);
 				std::map<std::pair<MVertex*,GRegion*>,MVertex* >::iterator itMap = VertexGlobalAssociation.find(std::make_pair(vert,reg1));
 				if (itMap != VertexGlobalAssociation.end()){
-//					std::cout<<"on va changer un point"<<std::endl;
 					elem->setVertex(j,itMap->second);
-//					std::cout<<"on a introduit "<<itMap->second->getNum()<<std::endl;
-//					std::cout<<"maintenant elem j "<<elem->getVertex(j)->getNum()<<std::endl;
-//					std::cout<<"youpi"<<std::endl;
 				}
 			}
 		}
@@ -1646,16 +1205,11 @@ PView *GMSH_DuplicateBoundariesPlugin::executeFourth(PView *view)
 				MVertex* vert = elem->getVertex(j);
 				std::map<std::pair<MVertex*,GRegion*>,MVertex* >::iterator itMap = VertexGlobalAssociation.find(std::make_pair(vert,reg2));
 				if (itMap != VertexGlobalAssociation.end()){
-//					std::cout<<"on va changer un point"<<std::endl;
 					elem->setVertex(j,itMap->second);
-//					std::cout<<"on a introduit "<<itMap->second->getNum()<<std::endl;
-//					std::cout<<"maintenant elem j "<<elem->getVertex(j)->getNum()<<std::endl;
-//					std::cout<<"youpi"<<std::endl;
 				}
 			}
 		}
 	}
-	std::cout<<"interior faces done"<<std::endl;
 	//maintenant on va traiter les faces du bord
 	for (std::set<GFace*>::iterator itf = ToDuplicateListBoundary.begin();itf != ToDuplicateListBoundary.end();itf++){
 		counterNbDone++;
@@ -1754,25 +1308,17 @@ PView *GMSH_DuplicateBoundariesPlugin::executeFourth(PView *view)
 			if (itMap != VertexGlobalAssociation.end()){
 				v3 = itMap->second;
 			}
-			//			std::cout<<"creation de prisme "<<counterNbDone<<std::endl;
 			MPrism *newPri = new MPrism(v1,v2,v3,elem->getVertex(0),elem->getVertex(1),elem->getVertex(2));
-			//			std::cout<<"addition de prisme "<<counterNbDone<<std::endl;
 
 			createdRegion->addPrism(newPri);
-			//			std::cout<<"fin de for"<<std::endl;
 		}
-		std::cout<<"apres region, refonte points "<<counterNbDone<<std::endl;
 		for (unsigned int i = 0; i < reg1->getNumMeshElements();i++){
 			MElement* elem = reg1->getMeshElement(i);
 			for (int j = 0;j < elem->getNumVertices();j++){
 				MVertex* vert = elem->getVertex(j);
 				std::map<std::pair<MVertex*,GRegion*>,MVertex* >::iterator itMap = VertexGlobalAssociation.find(std::make_pair(vert,reg1));
 				if (itMap != VertexGlobalAssociation.end()){
-//					std::cout<<"on va changer un point"<<std::endl;
 					elem->setVertex(j,itMap->second);
-//					std::cout<<"on a introduit "<<itMap->second->getNum()<<std::endl;
-//					std::cout<<"maintenant elem j "<<elem->getVertex(j)->getNum()<<std::endl;
-//					std::cout<<"youpi"<<std::endl;
 				}
 			}
 		}
@@ -2027,63 +1573,34 @@ PView *GMSH_DuplicateBoundariesPlugin::executeDuplicate(PView *view)
 					if (abs((p2.z()-p1.z()))<0.0001){
 						pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
 						ToDuplicateListBoundary.insert(facesBound[i]);
-//						std::cout<<"case 1"<<std::endl;
-//						std::cout<<"on a p1.x() = "<<p1.x()<<" et p2.x() = "<<p2.x()<<" et abs((p2.x()-p1.x()-1.0)) = "<<abs((p2.x()-p1.x()-1.0))<<std::endl;
-//						std::cout<<"on a abs(0.5) = "<<abs(0.5)<<" et abs(-0.5) = "<<abs(-0.5)<<" et abs(1.5) = "<<abs(1.5)<<" et abs(-1.5) = "<<abs(-1.5)<<std::endl;
-//						std::cout<<"on a mis dans la liste: x "<<p1.x()<<" y "<<p1.y()<<" z "<<p1.z()<<std::endl;
-//						std::cout<<"on avait pour second: x "<<p2.x()<<" y "<<p2.y()<<" z "<<p2.z()<<std::endl;
 					}else if(abs((p2.z()-p1.z()-1.0))<0.0001){
 						pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
 						ToDuplicateListBoundary.insert(facesBound[i]);
-//						std::cout<<"case 2"<<std::endl;
-//						std::cout<<"on a mis dans la liste: x "<<p1.x()<<" y "<<p1.y()<<" z "<<p1.z()<<std::endl;
-//						std::cout<<"on avait pour second: x "<<p2.x()<<" y "<<p2.y()<<" z "<<p2.z()<<std::endl;
 					}else if (abs((p1.z()-p2.z()-1.0))<0.0001){
 						pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
 						ToDuplicateListBoundary.insert(facesBound[i]);
-//						std::cout<<"case 3"<<std::endl;
-//						std::cout<<"on a mis dans la liste: x "<<p1.x()<<" y "<<p1.y()<<" z "<<p1.z()<<std::endl;
-//						std::cout<<"on avait pour second: x "<<p2.x()<<" y "<<p2.y()<<" z "<<p2.z()<<std::endl;
 					}
 				}else if (abs((p2.y()-p1.y()-1.0))<0.0001){
 					if (abs((p2.z()-p1.z()))<0.0001){
 						pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
 						ToDuplicateListBoundary.insert(facesBound[i]);
-//						std::cout<<"case 4"<<std::endl;
-//						std::cout<<"on a mis dans la liste: x "<<p1.x()<<" y "<<p1.y()<<" z "<<p1.z()<<std::endl;
-//						std::cout<<"on avait pour second: x "<<p2.x()<<" y "<<p2.y()<<" z "<<p2.z()<<std::endl;
 					}else if (abs((p2.z()-p1.z()-1.0))<0.0001){
 						pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
 						ToDuplicateListBoundary.insert(facesBound[i]);
-//						std::cout<<"case 5"<<std::endl;
-//						std::cout<<"on a mis dans la liste: x "<<p1.x()<<" y "<<p1.y()<<" z "<<p1.z()<<std::endl;
-//						std::cout<<"on avait pour second: x "<<p2.x()<<" y "<<p2.y()<<" z "<<p2.z()<<std::endl;
 					}else if (abs((p1.z()-p2.z()-1.0))<0.0001){
 						pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
 						ToDuplicateListBoundary.insert(facesBound[i]);
-//						std::cout<<"case 6"<<std::endl;
-//						std::cout<<"on a mis dans la liste: x "<<p1.x()<<" y "<<p1.y()<<" z "<<p1.z()<<std::endl;
-//						std::cout<<"on avait pour second: x "<<p2.x()<<" y "<<p2.y()<<" z "<<p2.z()<<std::endl;
 					}
 				}else if (abs((p1.y()-p2.y()-1.0))<0.0001){
 					if (abs((p2.z()-p1.z()))<0.0001){
 						pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
 						ToDuplicateListBoundary.insert(facesBound[i]);
-//						std::cout<<"case 7"<<std::endl;
-//						std::cout<<"on a mis dans la liste: x "<<p1.x()<<" y "<<p1.y()<<" z "<<p1.z()<<std::endl;
-//						std::cout<<"on avait pour second: x "<<p2.x()<<" y "<<p2.y()<<" z "<<p2.z()<<std::endl;
 					}else if (abs((p2.z()-p1.z()-1.0))<0.0001){
 						pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
 						ToDuplicateListBoundary.insert(facesBound[i]);
-//						std::cout<<"case 8"<<std::endl;
-//						std::cout<<"on a mis dans la liste: x "<<p1.x()<<" y "<<p1.y()<<" z "<<p1.z()<<std::endl;
-//						std::cout<<"on avait pour second: x "<<p2.x()<<" y "<<p2.y()<<" z "<<p2.z()<<std::endl;
 					}else if (abs((p1.z()-p2.z()-1.0))<0.0001){
 						pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
 						ToDuplicateListBoundary.insert(facesBound[i]);
-//						std::cout<<"case 9"<<std::endl;
-//						std::cout<<"on a mis dans la liste: x "<<p1.x()<<" y "<<p1.y()<<" z "<<p1.z()<<std::endl;
-//						std::cout<<"on avait pour second: x "<<p2.x()<<" y "<<p2.y()<<" z "<<p2.z()<<std::endl;
 					}
 				}
 			}else if (abs((p1.x()-p2.x()-1.0))<0.0001){
@@ -2117,21 +1634,12 @@ PView *GMSH_DuplicateBoundariesPlugin::executeDuplicate(PView *view)
 					if (abs((p2.z()-p1.z()))<0.0001){
 						pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
 						ToDuplicateListBoundary.insert(facesBound[i]);
-//						std::cout<<"case 10"<<std::endl;
-//						std::cout<<"on a mis dans la liste: x "<<p1.x()<<" y "<<p1.y()<<" z "<<p1.z()<<std::endl;
-//						std::cout<<"on avait pour second: x "<<p2.x()<<" y "<<p2.y()<<" z "<<p2.z()<<std::endl;
 					}else if (abs((p2.z()-p1.z()-1.0))<0.0001){
 						pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
 						ToDuplicateListBoundary.insert(facesBound[i]);
-//						std::cout<<"case 11"<<std::endl;
-//						std::cout<<"on a mis dans la liste: x "<<p1.x()<<" y "<<p1.y()<<" z "<<p1.z()<<std::endl;
-//						std::cout<<"on avait pour second: x "<<p2.x()<<" y "<<p2.y()<<" z "<<p2.z()<<std::endl;
 					}else if (abs((p1.z()-p2.z()-1.0))<0.0001){
 						pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
 						ToDuplicateListBoundary.insert(facesBound[i]);
-//						std::cout<<"case 12"<<std::endl;
-//						std::cout<<"on a mis dans la liste: x "<<p1.x()<<" y "<<p1.y()<<" z "<<p1.z()<<std::endl;
-//						std::cout<<"on avait pour second: x "<<p2.x()<<" y "<<p2.y()<<" z "<<p2.z()<<std::endl;
 					}
 				}else if (abs((p1.y()-p2.y()-1.0))<0.0001){
 					if (abs((p2.z()-p1.z()))<0.0001){
@@ -2145,9 +1653,6 @@ PView *GMSH_DuplicateBoundariesPlugin::executeDuplicate(PView *view)
 					if (abs((p2.z()-p1.z()-1.0))<0.0001){
 						pairs.push_back(std::pair<GFace*,GFace*>(facesBound[i],facesBound[j]));
 						ToDuplicateListBoundary.insert(facesBound[i]);
-//						std::cout<<"case 13"<<std::endl;
-//						std::cout<<"on a mis dans la liste: x "<<p1.x()<<" y "<<p1.y()<<" z "<<p1.z()<<std::endl;
-//						std::cout<<"on avait pour second: x "<<p2.x()<<" y "<<p2.y()<<" z "<<p2.z()<<std::endl;
 					}else if (abs((p1.z()-p2.z()-1.0))<0.0001){
 						//NOTHING
 					}
@@ -2155,7 +1660,6 @@ PView *GMSH_DuplicateBoundariesPlugin::executeDuplicate(PView *view)
 			}
 		}
 	}
-//	std::cout<<"on a une taille de facesBound = "<<facesBound.size()<<" et ToDuplicateListBoundary = "<<ToDuplicateListBoundary.size()<<std::endl;
 
 
 
@@ -2212,7 +1716,6 @@ PView *GMSH_DuplicateBoundariesPlugin::executeDuplicate(PView *view)
 //			VertexGlobalAssociation[vMesh] = vecTmpBis;
 //		}
 //	}
-//	std::cout<<"entree dans regions first pass"<<std::endl;
 	for (GModel::riter itr= m->firstRegion();itr != m->lastRegion();itr++){
 		GRegion* rTmp = (*itr);
 		std::list<GFace*> RegFaces = rTmp->faces();
@@ -2241,27 +1744,17 @@ PView *GMSH_DuplicateBoundariesPlugin::executeDuplicate(PView *view)
 		std::list<GVertex*> vlist;
 
 
-//		std::cout<<"wut 1"<<std::endl;
 		std::list<GFace*> listFacesTmp = rTmp->faces();
 		for (std::list<GFace*>::iterator itTp = listFacesTmp.begin();itTp != listFacesTmp.end();itTp++){
-//			std::cout<<"wut 2"<<std::endl;
 			std::list<GVertex*> vlist2;
-//			std::cout<<"wut 3"<<std::endl;
 			vlist2 = (*itTp)->vertices();
-//			std::cout<<"wut 4"<<std::endl;
 			for (std::list<GVertex*>::iterator itTp2 = vlist2.begin();itTp2 != vlist2.end();itTp2++){
-//				std::cout<<"wut 5"<<std::endl;
 				if(std::find(vlist.begin(), vlist.end(), *itTp2) == vlist.end())
 					vlist.push_back(*itTp2);
-//				std::cout<<"wut 6"<<std::endl;
 			}
-//			std::cout<<"wut 7"<<std::endl;
 		}
-//		std::cout<<"wut 8"<<std::endl;
 
 
-//		std::cout<<"on a une taille vlist de "<<vlist.size()<<std::endl;
-//		std::cout<<"init done entering vertices"<<std::endl;
 		for (std::list<GVertex*>::iterator itv = vlist.begin();itv != vlist.end();itv++){
 			//duplication Gvertex
 			GVertex* vTmp = (*itv);
@@ -2269,7 +1762,6 @@ PView *GMSH_DuplicateBoundariesPlugin::executeDuplicate(PView *view)
 			double ponderatedY = 0.99999999999 * vTmp->y() + 0.00000000001 * yCenterReg;
 			double ponderatedZ = 0.99999999999 * vTmp->z() + 0.00000000001 * zCenterReg;
 			GVertex* newv = m->addVertex(ponderatedX,ponderatedY,ponderatedZ,vTmp->prescribedMeshSizeAtVertex());
-//			std::cout<<"inserted correspondance between : "<<vTmp->tag()<<" and : "<<newv->tag()<<std::endl;
 			GVertexAssociation[vTmp] = newv;
 			GVertexGlobalAssociation[std::make_pair(vTmp,rTmp)] = newv;
 			//creation des Gedge correspondantes
@@ -2284,18 +1776,12 @@ PView *GMSH_DuplicateBoundariesPlugin::executeDuplicate(PView *view)
 		}
 		//maintenant on soccupe de duppliquer les edges de la region
 		std::list<GEdge*> elist = rTmp->edges();
-//		std::cout<<"on a une taille elist de "<<elist.size()<<std::endl;
-//		std::cout<<"vertices done entering edges"<<std::endl;
 
 		std::vector<GFace*> SurroundingsFaces;
 		for (std::list<GEdge*>::iterator ite = elist.begin();ite != elist.end();ite++){
 			//duplication Gedge
 			GEdge* eTmp = (*ite);
-//			std::cout<<"before addline"<<std::endl;
-//			std::cout<<"begin ID : "<<eTmp->getBeginVertex()->tag()<<" and end ID : "<<eTmp->getEndVertex()->tag()<<std::endl;
-//			std::cout<<"corresponding begin ID : "<<GVertexAssociation[eTmp->getBeginVertex()]->tag()<<" and end ID : "<<GVertexAssociation[eTmp->getEndVertex()]->tag()<<std::endl;
 			GEdge* newE = m->addLine(GVertexAssociation[eTmp->getEndVertex()],GVertexAssociation[eTmp->getBeginVertex()]);
-//			std::cout<<"after addline"<<std::endl;
 			GEdgeAssociation[eTmp] = newE;
 			GEdgeGlobalAssociation[std::make_pair(eTmp,rTmp)] = newE;
 			//creation des GFace correspondantes
@@ -2318,7 +1804,6 @@ PView *GMSH_DuplicateBoundariesPlugin::executeDuplicate(PView *view)
 				VertexGlobalAssociation[std::make_pair(vMesh,rTmp)] = newMv;
 				newE->addMeshVertex(newMv);
 			}
-//			std::cout<<"after newvertices"<<std::endl;
 			for (unsigned int i = 0; i < eTmp->getNumMeshElements();i++){
 				MElement* elem = eTmp->getMeshElement(i);
 				MVertex *firstETmp = VertexAssociation.find(elem->getVertex(0))->second;
@@ -2327,9 +1812,7 @@ PView *GMSH_DuplicateBoundariesPlugin::executeDuplicate(PView *view)
 				MLine3 *newLine = new MLine3(firstETmp,lastETmp,midETmp);
 				newE->addLine(newLine);
 			}
-//			std::cout<<"after newMlines"<<std::endl;
 		}
-//		std::cout<<"edges done entering faces"<<std::endl;
 		for (std::list<GFace*>::iterator itf = RegFaces.begin();itf != RegFaces.end();itf++){
 			GFace* fTmp = (*itf);
 			std::vector<GEdge*> newEdgesVector;
@@ -2352,7 +1835,6 @@ PView *GMSH_DuplicateBoundariesPlugin::executeDuplicate(PView *view)
 //			nameSurf += ss.str();
 //			int PhysicalSurfaceTmp = m->setPhysicalName(nameSurf,2);
 //			GFaceAssociation->addPhysicalEntity(PhysicalSurfaceTmp);
-//			std::cout<<"on a associe a la face : "<<fTmp->tag()<<" la face : "<<GFaceAssociation->tag()<<std::endl;
 			//maintenant traitement mesh
 			for (unsigned int i = 0; i < fTmp->mesh_vertices.size();i++){
 				MVertex *vMesh = fTmp->mesh_vertices[i];
@@ -2374,9 +1856,7 @@ PView *GMSH_DuplicateBoundariesPlugin::executeDuplicate(PView *view)
 			}
 			GFaceGlobalAssociation[std::make_pair(fTmp,rTmp)] = GFaceAssociation;
 		}
-//		std::cout<<"faces done for regions"<<std::endl;
 	}
-//	std::cout<<"Regions done first pass"<<std::endl;
 	int counterNbDone = 10000;
 	//maintenant on va traiter les faces initiales
 	for (std::set<GFace*>::iterator itf = ToDuplicateList.begin();itf != ToDuplicateList.end();itf++){
@@ -2507,12 +1987,9 @@ PView *GMSH_DuplicateBoundariesPlugin::executeDuplicate(PView *view)
 			if (itMap != VertexGlobalAssociation.end()){
 				v6 = itMap->second;
 			}
-//			std::cout<<"creation de prisme "<<counterNbDone<<std::endl;
 			MPrism *newPri = new MPrism(v1,v3,v2,v4,v6,v5);
-//			std::cout<<"addition de prisme "<<counterNbDone<<std::endl;
 
 			createdRegion->addPrism(newPri);
-//			std::cout<<"fin de for"<<std::endl;
 
 			//second
 			itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(1),reg1));
@@ -2539,9 +2016,7 @@ PView *GMSH_DuplicateBoundariesPlugin::executeDuplicate(PView *view)
 			if (itMap != VertexGlobalAssociation.end()){
 				v6 = itMap->second;
 			}
-			//			std::cout<<"creation de prisme "<<counterNbDone<<std::endl;
 			MPrism *newPri2 = new MPrism(v1,v3,v2,v4,v6,v5);
-			//			std::cout<<"addition de prisme "<<counterNbDone<<std::endl;
 
 			createdRegion->addPrism(newPri2);
 			//third
@@ -2569,9 +2044,7 @@ PView *GMSH_DuplicateBoundariesPlugin::executeDuplicate(PView *view)
 			if (itMap != VertexGlobalAssociation.end()){
 				v6 = itMap->second;
 			}
-			//			std::cout<<"creation de prisme "<<counterNbDone<<std::endl;
 			MPrism *newPri3 = new MPrism(v1,v3,v2,v4,v6,v5);
-			//			std::cout<<"addition de prisme "<<counterNbDone<<std::endl;
 
 			createdRegion->addPrism(newPri3);
 			//fourth
@@ -2599,24 +2072,17 @@ PView *GMSH_DuplicateBoundariesPlugin::executeDuplicate(PView *view)
 			if (itMap != VertexGlobalAssociation.end()){
 				v6 = itMap->second;
 			}
-			//			std::cout<<"creation de prisme "<<counterNbDone<<std::endl;
 			MPrism *newPri4 = new MPrism(v1,v3,v2,v4,v6,v5);
-			//			std::cout<<"addition de prisme "<<counterNbDone<<std::endl;
 
 			createdRegion->addPrism(newPri4);
 		}
-//		std::cout<<"apres region, refonte points "<<counterNbDone<<std::endl;
 		for (unsigned int i = 0; i < reg1->getNumMeshElements();i++){
 			MElement* elem = reg1->getMeshElement(i);
 			for (int j = 0;j < elem->getNumVertices();j++){
 				MVertex* vert = elem->getVertex(j);
 				std::map<std::pair<MVertex*,GRegion*>,MVertex* >::iterator itMap = VertexGlobalAssociation.find(std::make_pair(vert,reg1));
 				if (itMap != VertexGlobalAssociation.end()){
-//					std::cout<<"on va changer un point"<<std::endl;
 					elem->setVertex(j,itMap->second);
-//					std::cout<<"on a introduit "<<itMap->second->getNum()<<std::endl;
-//					std::cout<<"maintenant elem j "<<elem->getVertex(j)->getNum()<<std::endl;
-//					std::cout<<"youpi"<<std::endl;
 				}
 			}
 		}
@@ -2626,16 +2092,11 @@ PView *GMSH_DuplicateBoundariesPlugin::executeDuplicate(PView *view)
 				MVertex* vert = elem->getVertex(j);
 				std::map<std::pair<MVertex*,GRegion*>,MVertex* >::iterator itMap = VertexGlobalAssociation.find(std::make_pair(vert,reg2));
 				if (itMap != VertexGlobalAssociation.end()){
-//					std::cout<<"on va changer un point"<<std::endl;
 					elem->setVertex(j,itMap->second);
-//					std::cout<<"on a introduit "<<itMap->second->getNum()<<std::endl;
-//					std::cout<<"maintenant elem j "<<elem->getVertex(j)->getNum()<<std::endl;
-//					std::cout<<"youpi"<<std::endl;
 				}
 			}
 		}
 	}
-//	std::cout<<"interior faces done"<<std::endl;
 	//maintenant on va traiter les faces du bord
 	for (std::set<GFace*>::iterator itf = ToDuplicateListBoundary.begin();itf != ToDuplicateListBoundary.end();itf++){
 		counterNbDone++;
@@ -2734,12 +2195,9 @@ PView *GMSH_DuplicateBoundariesPlugin::executeDuplicate(PView *view)
 			if (itMap != VertexGlobalAssociation.end()){
 				v3 = itMap->second;
 			}
-			//			std::cout<<"creation de prisme "<<counterNbDone<<std::endl;
 			MPrism *newPri = new MPrism(v1,v3,v2,elem->getVertex(0),elem->getVertex(5),elem->getVertex(3));
-			//			std::cout<<"addition de prisme "<<counterNbDone<<std::endl;
 
 			createdRegion->addPrism(newPri);
-			//			std::cout<<"fin de for"<<std::endl;
 			//second
 			itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(1),reg1));
 			if (itMap != VertexGlobalAssociation.end()){
@@ -2753,9 +2211,7 @@ PView *GMSH_DuplicateBoundariesPlugin::executeDuplicate(PView *view)
 			if (itMap != VertexGlobalAssociation.end()){
 				v3 = itMap->second;
 			}
-			//			std::cout<<"creation de prisme "<<counterNbDone<<std::endl;
 			MPrism *newPri2 = new MPrism(v1,v3,v2,elem->getVertex(1),elem->getVertex(3),elem->getVertex(4));
-			//			std::cout<<"addition de prisme "<<counterNbDone<<std::endl;
 
 			createdRegion->addPrism(newPri2);
 			//third
@@ -2771,9 +2227,7 @@ PView *GMSH_DuplicateBoundariesPlugin::executeDuplicate(PView *view)
 			if (itMap != VertexGlobalAssociation.end()){
 				v3 = itMap->second;
 			}
-			//			std::cout<<"creation de prisme "<<counterNbDone<<std::endl;
 			MPrism *newPri3 = new MPrism(v1,v3,v2,elem->getVertex(2),elem->getVertex(4),elem->getVertex(5));
-			//			std::cout<<"addition de prisme "<<counterNbDone<<std::endl;
 
 			createdRegion->addPrism(newPri3);
 			//fourth
@@ -2789,24 +2243,17 @@ PView *GMSH_DuplicateBoundariesPlugin::executeDuplicate(PView *view)
 			if (itMap != VertexGlobalAssociation.end()){
 				v3 = itMap->second;
 			}
-			//			std::cout<<"creation de prisme "<<counterNbDone<<std::endl;
 			MPrism *newPri4 = new MPrism(v1,v3,v2,elem->getVertex(3),elem->getVertex(5),elem->getVertex(4));
-			//			std::cout<<"addition de prisme "<<counterNbDone<<std::endl;
 
 			createdRegion->addPrism(newPri4);
 		}
-//		std::cout<<"apres region, refonte points "<<counterNbDone<<std::endl;
 		for (unsigned int i = 0; i < reg1->getNumMeshElements();i++){
 			MElement* elem = reg1->getMeshElement(i);
 			for (int j = 0;j < elem->getNumVertices();j++){
 				MVertex* vert = elem->getVertex(j);
 				std::map<std::pair<MVertex*,GRegion*>,MVertex* >::iterator itMap = VertexGlobalAssociation.find(std::make_pair(vert,reg1));
 				if (itMap != VertexGlobalAssociation.end()){
-//					std::cout<<"on va changer un point"<<std::endl;
 					elem->setVertex(j,itMap->second);
-//					std::cout<<"on a introduit "<<itMap->second->getNum()<<std::endl;
-//					std::cout<<"maintenant elem j "<<elem->getVertex(j)->getNum()<<std::endl;
-//					std::cout<<"youpi"<<std::endl;
 				}
 			}
 		}
@@ -3004,21 +2451,8 @@ PView *GMSH_DuplicateBoundariesPlugin::execute2D(PView *view)
 	std::vector<std::pair<GFace*,GFace*> > pairs;
 	std::vector<std::pair<GFace*,GFace*> > newPairs;
 	int PhysicalInterface = m->setPhysicalName("Interface",2);
-//	for (GModel::fiter itf= m->firstFace();itf != m->lastFace();itf++){
-//		GFace* ftmp= (*itf);
-//		std::list<GEdge*> edgesFace = ftmp->edges();
-////		std::cout<<"size de edgesFace "<<edgesFace.size()<<std::endl;
-//		for (std::list<GEdge*>::iterator it2=edgesFace.begin();it2!=edgesFace.end();it2++){
-//			GEdge* etmp = (*it2);
-////			std::cout<<"on a la edge "<<etmp->tag()<<std::endl;
-////			std::cout<<"size de face de etmp before : "<<etmp->faces().size()<<std::endl;
-//			etmp->addFace(ftmp);
-////			std::cout<<"size de face de etmp after : "<<etmp->faces().size()<<std::endl;
-//		}
-//	}
 	for (GModel::eiter ite= m->firstEdge();ite != m->lastEdge();ite++){
 		GEdge* eTmp = (*ite);
-//		std::cout<<"on a size de face de etmp de "<<eTmp->faces().size()<<std::endl;
 		if (eTmp->faces().size() == 2){
 			ToDuplicateList.insert(eTmp);
 		}
@@ -3037,7 +2471,6 @@ PView *GMSH_DuplicateBoundariesPlugin::execute2D(PView *view)
 	std::map<std::pair<GVertex*,GFace*>,GVertex* > GVertexGlobalAssociation;
 	std::map<std::pair<GEdge*,GFace*>,GEdge* > GEdgeGlobalAssociation;
 	std::map<std::pair<GFace*,GRegion*>,GFace* > GFaceGlobalAssociation;
-	std::cout<<"entree dans regions first pass"<<std::endl;
 	for (GModel::fiter itr= m->firstFace();itr != m->lastFace();itr++){
 		GFace* rTmp = (*itr);
 		std::list<GEdge*> RegEdges = rTmp->edges();
@@ -3066,33 +2499,17 @@ PView *GMSH_DuplicateBoundariesPlugin::execute2D(PView *view)
 		std::list<GVertex*> vlist;
 
 
-//		std::cout<<"wut 1"<<std::endl;
 		std::list<GEdge*> listedgesTmp = rTmp->edges();
 		std::cout<<"listeEdge size "<<listedgesTmp.size()<<std::endl;
 		for (std::list<GEdge*>::iterator itTp = listedgesTmp.begin();itTp != listedgesTmp.end();itTp++){
-//			std::cout<<"wut 2"<<std::endl;
 			std::list<GVertex*> vlist2;
-//			std::cout<<"wut 3"<<std::endl;
 			if(std::find(vlist.begin(), vlist.end(),(*itTp)->getBeginVertex()) == vlist.end())
 				vlist.push_back((*itTp)->getBeginVertex());
 			if(std::find(vlist.begin(), vlist.end(),(*itTp)->getEndVertex()) == vlist.end())
 				vlist.push_back((*itTp)->getEndVertex());
-//			vlist2 = (*itTp)->vertices();
-//			std::cout<<"vlist2 size "<<vlist2.size()<<std::endl;
-////			std::cout<<"wut 4"<<std::endl;
-//			for (std::list<GVertex*>::iterator itTp2 = vlist2.begin();itTp2 != vlist2.end();itTp2++){
-////				std::cout<<"wut 5"<<std::endl;
-//				if(std::find(vlist.begin(), vlist.end(), *itTp2) == vlist.end())
-//					vlist.push_back(*itTp2);
-////				std::cout<<"wut 6"<<std::endl;
-//			}
-//			std::cout<<"wut 7"<<std::endl;
 		}
-//		std::cout<<"wut 8"<<std::endl;
 
 
-//		std::cout<<"on a une taille vlist de "<<vlist.size()<<std::endl;
-//		std::cout<<"init done entering vertices"<<std::endl;
 		for (std::list<GVertex*>::iterator itv = vlist.begin();itv != vlist.end();itv++){
 			//duplication Gvertex
 			GVertex* vTmp = (*itv);
@@ -3100,7 +2517,6 @@ PView *GMSH_DuplicateBoundariesPlugin::execute2D(PView *view)
 			double ponderatedY = 0.99999999999 * vTmp->y() + 0.00000000001 * yCenterReg;
 			double ponderatedZ = 0.99999999999 * vTmp->z() + 0.00000000001 * zCenterReg;
 			GVertex* newv = m->addVertex(ponderatedX,ponderatedY,ponderatedZ,vTmp->prescribedMeshSizeAtVertex());
-//			std::cout<<"inserted correspondance between : "<<vTmp->tag()<<" and : "<<newv->tag()<<std::endl;
 			GVertexAssociation[vTmp] = newv;
 			GVertexGlobalAssociation[std::make_pair(vTmp,rTmp)] = newv;
 			//creation des Gedge correspondantes
@@ -3115,86 +2531,19 @@ PView *GMSH_DuplicateBoundariesPlugin::execute2D(PView *view)
 		}
 		//maintenant on soccupe de duppliquer les edges de la region
 		std::list<GEdge*> elist = rTmp->edges();
-		std::cout<<"on a une taille elist de "<<elist.size()<<std::endl;
-		std::cout<<"vertices done entering edges"<<std::endl;
 
 		std::vector<GFace*> SurroundingsFaces;
-//		for (std::list<GEdge*>::iterator ite = elist.begin();ite != elist.end();ite++){
-//			//duplication Gedge
-//			GEdge* eTmp = (*ite);
-////			std::cout<<"before addline"<<std::endl;
-////			std::cout<<"begin ID : "<<eTmp->getBeginVertex()->tag()<<" and end ID : "<<eTmp->getEndVertex()->tag()<<std::endl;
-////			std::cout<<"corresponding begin ID : "<<GVertexAssociation[eTmp->getBeginVertex()]->tag()<<" and end ID : "<<GVertexAssociation[eTmp->getEndVertex()]->tag()<<std::endl;
-//			GEdge* newE = m->addLine(GVertexAssociation[eTmp->getEndVertex()],GVertexAssociation[eTmp->getBeginVertex()]);
-////			std::cout<<"after addline"<<std::endl;
-//			GEdgeAssociation[eTmp] = newE;
-//			GEdgeGlobalAssociation[std::make_pair(eTmp,rTmp)] = newE;
-//			//creation des GFace correspondantes
-////			GEdge* firstE = SurroudingEdges.find(eTmp->getEndVertex())->second;
-////			GEdge* lastE = SurroudingEdges.find(eTmp->getBeginVertex())->second;
-////			std::vector<GEdge*> VecEdgesTmp;
-////			VecEdgesTmp.push_back(eTmp);
-////			VecEdgesTmp.push_back(firstE);
-////			VecEdgesTmp.push_back(newE);
-////			VecEdgesTmp.push_back(lastE);
-////			std::vector<std::vector<GEdge*> > VecOfVecTmp;
-////			VecOfVecTmp.push_back(VecEdgesTmp);
-////			GFace* newFaceTmp = m->addPlanarFace(VecOfVecTmp);
-////			SurroundingsFaces.push_back(newFaceTmp);
-//			//maintenant traitement mesh
-//			for (int i = 0; i < eTmp->mesh_vertices.size();i++){
-//				MVertex *vMesh = eTmp->mesh_vertices[i];
-//				MVertex *newMv = new MVertex(vMesh->x(), vMesh->y(), vMesh->z(), (GEntity*)newE);
-//				VertexAssociation[vMesh] = newMv;
-//				VertexGlobalAssociation[std::make_pair(vMesh,rTmp)] = newMv;
-//				newE->addMeshVertex(newMv);
-//			}
-////			std::cout<<"after newvertices"<<std::endl;
-//			for (int i = 0; i < eTmp->getNumMeshElements();i++){
-//				MElement* elem = eTmp->getMeshElement(i);
-//				MVertex *firstETmp = VertexAssociation.find(elem->getVertex(0))->second;
-//				MVertex *lastETmp = VertexAssociation.find(elem->getVertex(1))->second;
-//				MVertex *midETmp = VertexAssociation.find(elem->getVertex(2))->second;
-//				MLine3 *newLine = new MLine3(firstETmp,lastETmp,midETmp);
-//				newE->addLine(newLine);
-//			}
-////			std::cout<<"after newMlines"<<std::endl;
-//		}
-		std::cout<<"edges done entering faces"<<std::endl;
-		std::cout<<"RegEdges size : "<<RegEdges.size()<<std::endl;
 		for (std::list<GEdge*>::iterator itf = RegEdges.begin();itf != RegEdges.end();itf++){
 			GEdge* eTmp = (*itf);
-//			std::vector<GEdge*> newEdgesVector;
-//			std::list<GEdge*> elistFace = fTmp->edges();
-//			for (std::list<GEdge*>::iterator ite = elistFace.begin();ite != elistFace.end();ite++){
-//				GEdge* eTmp = (*ite);
-//				GEdge* eToFind = GEdgeAssociation[eTmp];
-//				newEdgesVector.push_back(eToFind);
-//			}
-//			std::vector<std::vector<GEdge*> > VecOfVec;
-//			VecOfVec.push_back(newEdgesVector);
 			//creation de la nouvelle face
-			std::cout<<"before newvertices"<<std::endl;
-			std::cout<<"beginvertex : "<<eTmp->getBeginVertex()->tag()<<std::endl;
-			std::cout<<"endvertex : "<<eTmp->getEndVertex()->tag()<<std::endl;
-			std::cout<<"associated begin "<<GVertexAssociation[eTmp->getBeginVertex()]->tag()<<std::endl;
-			std::cout<<"associated end "<<GVertexAssociation[eTmp->getEndVertex()]->tag()<<std::endl;
 			GEdge* newE = m->addLine(GVertexAssociation[eTmp->getBeginVertex()],GVertexAssociation[eTmp->getEndVertex()]);
-//			std::cout<<"plop1"<<std::endl;
 			for (unsigned int i = 0; i < eTmp->mesh_vertices.size();i++){
-//				std::cout<<"plop2"<<std::endl;
 				MVertex *vMesh = eTmp->mesh_vertices[i];
-//				std::cout<<"plop3"<<std::endl;
 				MVertex *newMv = new MVertex(vMesh->x(), vMesh->y(), vMesh->z(), (GEntity*)newE);
-//				std::cout<<"plop4"<<std::endl;
 				VertexAssociation[vMesh] = newMv;
-//				std::cout<<"plop5"<<std::endl;
 				VertexGlobalAssociation[std::make_pair(vMesh,rTmp)] = newMv;
-//				std::cout<<"plop6"<<std::endl;
 				newE->addMeshVertex(newMv);
-//				std::cout<<"plop7"<<std::endl;
 			}
-			std::cout<<"after newvertices"<<std::endl;
 			for (unsigned int i = 0; i < eTmp->getNumMeshElements();i++){
 				MElement* elem = eTmp->getMeshElement(i);
 				MVertex *firstETmp = VertexAssociation.find(elem->getVertex(0))->second;
@@ -3203,51 +2552,15 @@ PView *GMSH_DuplicateBoundariesPlugin::execute2D(PView *view)
 				MLine3 *newLine = new MLine3(firstETmp,lastETmp,midETmp);
 				newE->addLine(newLine);
 			}
-			std::cout<<"after addline"<<std::endl;
 			GEdgeGlobalAssociation[std::make_pair(eTmp,rTmp)] = newE;
-//			GEdge* GFaceAssociation = m->addPlanarFace(VecOfVec);
-//			int tagTmp = GFaceAssociation->tag();
-//			std::ostringstream ss;
-//			ss << tagTmp;
-////			char *intStr = itoa(tagTmp);
-//			std::string nameSurf = "SURFACE";
-////			nameSurf += std::string(intStr);
-//			nameSurf += ss.str();
-//			int PhysicalSurfaceTmp = m->setPhysicalName(nameSurf,2);
-//			GFaceAssociation->addPhysicalEntity(PhysicalSurfaceTmp);
-//			std::cout<<"on a associe a la face : "<<fTmp->tag()<<" la face : "<<GFaceAssociation->tag()<<std::endl;
-//			//maintenant traitement mesh
-//			for (int i = 0; i < fTmp->mesh_vertices.size();i++){
-//				MVertex *vMesh = fTmp->mesh_vertices[i];
-//				MVertex *newMv = new MVertex(vMesh->x(), vMesh->y(), vMesh->z(), (GEntity*)GFaceAssociation);
-//				VertexAssociation[vMesh] = newMv;
-//				VertexGlobalAssociation[std::make_pair(vMesh,rTmp)] = newMv;
-//				GFaceAssociation->addMeshVertex(newMv);
-//			}
-//			for (int i = 0; i < fTmp->getNumMeshElements();i++){
-//				MElement* elem = fTmp->getMeshElement(i);
-//				MVertex *firstE = VertexAssociation.find(elem->getVertex(0))->second;
-//				MVertex *secondE = VertexAssociation.find(elem->getVertex(1))->second;
-//				MVertex *thirdE = VertexAssociation.find(elem->getVertex(2))->second;
-//				MVertex *fourthE = VertexAssociation.find(elem->getVertex(3))->second;
-//				MVertex *fifthE = VertexAssociation.find(elem->getVertex(4))->second;
-//				MVertex *sisthE = VertexAssociation.find(elem->getVertex(5))->second;
-//				MTriangle6 *newTri = new MTriangle6(firstE,secondE,thirdE,fourthE,fifthE,sisthE);
-//				GFaceAssociation->addTriangle(newTri);
-//			}
-//			GFaceGlobalAssociation[std::make_pair(fTmp,rTmp)] = GFaceAssociation;
 		}
-//		std::cout<<"faces done for regions"<<std::endl;
 	}
-	std::cout<<"Regions done first pass"<<std::endl;
 	int counterNbDone = 10000;
 	//maintenant on va traiter les faces initiales
 	for (std::set<GEdge*>::iterator itf = ToDuplicateList.begin();itf != ToDuplicateList.end();itf++){
 		counterNbDone++;
-		std::cout<<"entree dans toduplicateList numero "<<counterNbDone<<std::endl;
 		GEdge* eTmp = (*itf);
 		std::list<GFace*> listFacesTmpT = eTmp->faces();
-		std::cout<<"on a une taille de list faces de "<<listFacesTmpT.size()<<std::endl;
 		std::list<GFace*>::iterator itTmpFace = listFacesTmpT.begin();
 		GFace* fac1 = (*itTmpFace);
 		itTmpFace++;
@@ -3258,33 +2571,21 @@ PView *GMSH_DuplicateBoundariesPlugin::execute2D(PView *view)
 		vlist.push_back(eTmp->getBeginVertex());
 		vlist.push_back(eTmp->getEndVertex());
 		std::map<GVertex*,GEdge* > SurroudingEdges;
-		std::cout<<"entre dans vlist.begin"<<std::endl;
 		for (std::list<GVertex*>::iterator itv = vlist.begin();itv != vlist.end();itv++){
 			GVertex* vTmp = (*itv);
-			std::cout<<"test1"<<std::endl;
-			std::cout<<"on a fac1 "<<fac1->tag()<<" et fac2 "<<fac2->tag()<<" et vTmp "<<vTmp->tag()<<std::endl;
 			GVertex* v1=0;
 			GVertex* v2=0;
 			std::map<std::pair<GVertex*,GFace*>,GVertex* >::iterator itMap = GVertexGlobalAssociation.find(std::make_pair(vTmp,fac1));
-			std::cout<<"test2"<<std::endl;
 			if (itMap != GVertexGlobalAssociation.end()){
 				v1 = itMap->second;
-				std::cout<<"assigned v1"<<std::endl;
 			}
-			std::cout<<"test3"<<std::endl;
 			itMap = GVertexGlobalAssociation.find(std::make_pair(vTmp,fac2));
-			std::cout<<"test4"<<std::endl;
 			if (itMap != GVertexGlobalAssociation.end()){
 				v2 = itMap->second;
-				std::cout<<"assigned v2"<<std::endl;
 			}
-			std::cout<<"test5"<<std::endl;
 			GEdge* newE = m->addLine(v1,v2);
-			std::cout<<"test6"<<std::endl;
 			SurroudingEdges[vTmp] = newE;
-			std::cout<<"test7"<<std::endl;
 		}
-		std::cout<<"vertex traites"<<std::endl;
 		//ici tous les vertex sont traites
 		//on va traiter les edges
 //		std::list<GEdge*> elist = fTmp->edges();
@@ -3302,7 +2603,6 @@ PView *GMSH_DuplicateBoundariesPlugin::execute2D(PView *view)
 		if (itMap != GEdgeGlobalAssociation.end()){
 			e2 = itMap->second;
 		}
-		std::cout<<"creation des GFace correspondantes"<<std::endl;
 		//creation des GFace correspondantes
 		GEdge* firstE = SurroudingEdges.find(eTmp->getBeginVertex())->second;
 		GEdge* lastE = SurroudingEdges.find(eTmp->getEndVertex())->second;
@@ -3336,7 +2636,6 @@ PView *GMSH_DuplicateBoundariesPlugin::execute2D(PView *view)
 		newFaceTmp->addPhysicalEntity(PhysicalInterface);
 //		createdRegion->set(listFaces);
 //		m->add(createdRegion);
-		std::cout<<"eTmp->getNumMeshElements() "<<eTmp->getNumMeshElements()<<std::endl;
 		for (unsigned int i = 0; i < eTmp->getNumMeshElements();i++){
 			MElement* elem = eTmp->getMeshElement(i);
 			MVertex* v1=0;
@@ -3369,13 +2668,9 @@ PView *GMSH_DuplicateBoundariesPlugin::execute2D(PView *view)
 //			if (itMap != VertexGlobalAssociation.end()){
 //				v6 = itMap->second;
 //			}
-//			std::cout<<"creation de prisme "<<counterNbDone<<std::endl;
 			MQuadrangle *newQua = new MQuadrangle(v1,v2,v3,v4);
-			std::cout<<"addition du quad "<<newQua->getNum()<<" avec les vertices "<<v1->getNum()<<" ; "<<v2->getNum()<<" ; "<<v3->getNum()<<" ; "<<v4->getNum()<<std::endl;
-//			std::cout<<"addition de prisme "<<counterNbDone<<std::endl;
 
 			newFaceTmp->addQuadrangle(newQua);
-//			std::cout<<"fin de for"<<std::endl;
 
 			//second
 			itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(2),fac1));
@@ -3402,10 +2697,7 @@ PView *GMSH_DuplicateBoundariesPlugin::execute2D(PView *view)
 			//			if (itMap != VertexGlobalAssociation.end()){
 			//				v6 = itMap->second;
 			//			}
-			//			std::cout<<"creation de prisme "<<counterNbDone<<std::endl;
 			MQuadrangle *newQua2 = new MQuadrangle(v1,v2,v3,v4);
-			std::cout<<"addition du quad "<<newQua2->getNum()<<" avec les vertices "<<v1->getNum()<<" ; "<<v2->getNum()<<" ; "<<v3->getNum()<<" ; "<<v4->getNum()<<std::endl;
-			//			std::cout<<"addition de prisme "<<counterNbDone<<std::endl;
 
 			newFaceTmp->addQuadrangle(newQua2);
 
@@ -3413,18 +2705,13 @@ PView *GMSH_DuplicateBoundariesPlugin::execute2D(PView *view)
 
 
 		}
-//		std::cout<<"apres region, refonte points "<<counterNbDone<<std::endl;
 		for (unsigned int i = 0; i < fac1->getNumMeshElements();i++){
 			MElement* elem = fac1->getMeshElement(i);
 			for (int j = 0;j < elem->getNumVertices();j++){
 				MVertex* vert = elem->getVertex(j);
 				std::map<std::pair<MVertex*,GFace*>,MVertex* >::iterator itMap = VertexGlobalAssociation.find(std::make_pair(vert,fac1));
 				if (itMap != VertexGlobalAssociation.end()){
-//					std::cout<<"on va changer un point"<<std::endl;
 					elem->setVertex(j,itMap->second);
-//					std::cout<<"on a introduit "<<itMap->second->getNum()<<std::endl;
-//					std::cout<<"maintenant elem j "<<elem->getVertex(j)->getNum()<<std::endl;
-//					std::cout<<"youpi"<<std::endl;
 				}
 			}
 		}
@@ -3434,16 +2721,11 @@ PView *GMSH_DuplicateBoundariesPlugin::execute2D(PView *view)
 				MVertex* vert = elem->getVertex(j);
 				std::map<std::pair<MVertex*,GFace*>,MVertex* >::iterator itMap = VertexGlobalAssociation.find(std::make_pair(vert,fac2));
 				if (itMap != VertexGlobalAssociation.end()){
-//					std::cout<<"on va changer un point"<<std::endl;
 					elem->setVertex(j,itMap->second);
-//					std::cout<<"on a introduit "<<itMap->second->getNum()<<std::endl;
-//					std::cout<<"maintenant elem j "<<elem->getVertex(j)->getNum()<<std::endl;
-//					std::cout<<"youpi"<<std::endl;
 				}
 			}
 		}
 	}
-	std::cout<<"interior faces done"<<std::endl;
 	//maintenant on va traiter les faces du bord
 //	std::ofstream file("MicrostructurePolycrystal3D.pos");
 //	file << "View \"test\" {\n";
@@ -3652,21 +2934,9 @@ PView *GMSH_DuplicateBoundariesPlugin::execute2DWithBound(PView *view)
 	std::vector<std::pair<GFace*,GFace*> > pairs;
 	std::vector<std::pair<GFace*,GFace*> > newPairs;
 	int PhysicalInterface = m->setPhysicalName("Interface",2);
-//	for (GModel::fiter itf= m->firstFace();itf != m->lastFace();itf++){
-//		GFace* ftmp= (*itf);
-//		std::list<GEdge*> edgesFace = ftmp->edges();
-////		std::cout<<"size de edgesFace "<<edgesFace.size()<<std::endl;
-//		for (std::list<GEdge*>::iterator it2=edgesFace.begin();it2!=edgesFace.end();it2++){
-//			GEdge* etmp = (*it2);
-////			std::cout<<"on a la edge "<<etmp->tag()<<std::endl;
-////			std::cout<<"size de face de etmp before : "<<etmp->faces().size()<<std::endl;
-//			etmp->addFace(ftmp);
-////			std::cout<<"size de face de etmp after : "<<etmp->faces().size()<<std::endl;
-//		}
-//	}
+
 	for (GModel::eiter ite= m->firstEdge();ite != m->lastEdge();ite++){
 		GEdge* eTmp = (*ite);
-//		std::cout<<"on a size de face de etmp de "<<eTmp->faces().size()<<std::endl;
 		if (eTmp->faces().size() == 2){
 			ToDuplicateList.insert(eTmp);
 		}
@@ -3688,7 +2958,6 @@ PView *GMSH_DuplicateBoundariesPlugin::execute2DWithBound(PView *view)
 	std::map<std::pair<GVertex*,GFace*>,GVertex* > GVertexGlobalAssociation;
 	std::map<std::pair<GEdge*,GFace*>,GEdge* > GEdgeGlobalAssociation;
 	std::map<std::pair<GFace*,GRegion*>,GFace* > GFaceGlobalAssociation;
-//	std::cout<<"entree dans regions first pass"<<std::endl;
 	for (GModel::fiter itr= m->firstFace();itr != m->lastFace();itr++){
 		GFace* rTmp = (*itr);
 		std::list<GEdge*> RegEdges = rTmp->edges();
@@ -3717,33 +2986,16 @@ PView *GMSH_DuplicateBoundariesPlugin::execute2DWithBound(PView *view)
 		std::list<GVertex*> vlist;
 
 
-//		std::cout<<"wut 1"<<std::endl;
 		std::list<GEdge*> listedgesTmp = rTmp->edges();
-//		std::cout<<"listeEdge size "<<listedgesTmp.size()<<std::endl;
 		for (std::list<GEdge*>::iterator itTp = listedgesTmp.begin();itTp != listedgesTmp.end();itTp++){
-//			std::cout<<"wut 2"<<std::endl;
 			std::list<GVertex*> vlist2;
-//			std::cout<<"wut 3"<<std::endl;
 			if(std::find(vlist.begin(), vlist.end(),(*itTp)->getBeginVertex()) == vlist.end())
 				vlist.push_back((*itTp)->getBeginVertex());
 			if(std::find(vlist.begin(), vlist.end(),(*itTp)->getEndVertex()) == vlist.end())
 				vlist.push_back((*itTp)->getEndVertex());
-//			vlist2 = (*itTp)->vertices();
-//			std::cout<<"vlist2 size "<<vlist2.size()<<std::endl;
-////			std::cout<<"wut 4"<<std::endl;
-//			for (std::list<GVertex*>::iterator itTp2 = vlist2.begin();itTp2 != vlist2.end();itTp2++){
-////				std::cout<<"wut 5"<<std::endl;
-//				if(std::find(vlist.begin(), vlist.end(), *itTp2) == vlist.end())
-//					vlist.push_back(*itTp2);
-////				std::cout<<"wut 6"<<std::endl;
-//			}
-//			std::cout<<"wut 7"<<std::endl;
 		}
-//		std::cout<<"wut 8"<<std::endl;
 
 
-//		std::cout<<"on a une taille vlist de "<<vlist.size()<<std::endl;
-//		std::cout<<"init done entering vertices"<<std::endl;
 		for (std::list<GVertex*>::iterator itv = vlist.begin();itv != vlist.end();itv++){
 			//duplication Gvertex
 			GVertex* vTmp = (*itv);
@@ -3751,7 +3003,6 @@ PView *GMSH_DuplicateBoundariesPlugin::execute2DWithBound(PView *view)
 			double ponderatedY = 0.99999999999 * vTmp->y() + 0.00000000001 * yCenterReg;
 			double ponderatedZ = 0.99999999999 * vTmp->z() + 0.00000000001 * zCenterReg;
 			GVertex* newv = m->addVertex(ponderatedX,ponderatedY,ponderatedZ,vTmp->prescribedMeshSizeAtVertex());
-//			std::cout<<"inserted correspondance between : "<<vTmp->tag()<<" and : "<<newv->tag()<<std::endl;
 			GVertexAssociation[vTmp] = newv;
 			GVertexGlobalAssociation[std::make_pair(vTmp,rTmp)] = newv;
 			//creation des Gedge correspondantes
@@ -3766,86 +3017,18 @@ PView *GMSH_DuplicateBoundariesPlugin::execute2DWithBound(PView *view)
 		}
 		//maintenant on soccupe de duppliquer les edges de la region
 		std::list<GEdge*> elist = rTmp->edges();
-//		std::cout<<"on a une taille elist de "<<elist.size()<<std::endl;
-//		std::cout<<"vertices done entering edges"<<std::endl;
 
 		std::vector<GFace*> SurroundingsFaces;
-//		for (std::list<GEdge*>::iterator ite = elist.begin();ite != elist.end();ite++){
-//			//duplication Gedge
-//			GEdge* eTmp = (*ite);
-////			std::cout<<"before addline"<<std::endl;
-////			std::cout<<"begin ID : "<<eTmp->getBeginVertex()->tag()<<" and end ID : "<<eTmp->getEndVertex()->tag()<<std::endl;
-////			std::cout<<"corresponding begin ID : "<<GVertexAssociation[eTmp->getBeginVertex()]->tag()<<" and end ID : "<<GVertexAssociation[eTmp->getEndVertex()]->tag()<<std::endl;
-//			GEdge* newE = m->addLine(GVertexAssociation[eTmp->getEndVertex()],GVertexAssociation[eTmp->getBeginVertex()]);
-////			std::cout<<"after addline"<<std::endl;
-//			GEdgeAssociation[eTmp] = newE;
-//			GEdgeGlobalAssociation[std::make_pair(eTmp,rTmp)] = newE;
-//			//creation des GFace correspondantes
-////			GEdge* firstE = SurroudingEdges.find(eTmp->getEndVertex())->second;
-////			GEdge* lastE = SurroudingEdges.find(eTmp->getBeginVertex())->second;
-////			std::vector<GEdge*> VecEdgesTmp;
-////			VecEdgesTmp.push_back(eTmp);
-////			VecEdgesTmp.push_back(firstE);
-////			VecEdgesTmp.push_back(newE);
-////			VecEdgesTmp.push_back(lastE);
-////			std::vector<std::vector<GEdge*> > VecOfVecTmp;
-////			VecOfVecTmp.push_back(VecEdgesTmp);
-////			GFace* newFaceTmp = m->addPlanarFace(VecOfVecTmp);
-////			SurroundingsFaces.push_back(newFaceTmp);
-//			//maintenant traitement mesh
-//			for (int i = 0; i < eTmp->mesh_vertices.size();i++){
-//				MVertex *vMesh = eTmp->mesh_vertices[i];
-//				MVertex *newMv = new MVertex(vMesh->x(), vMesh->y(), vMesh->z(), (GEntity*)newE);
-//				VertexAssociation[vMesh] = newMv;
-//				VertexGlobalAssociation[std::make_pair(vMesh,rTmp)] = newMv;
-//				newE->addMeshVertex(newMv);
-//			}
-////			std::cout<<"after newvertices"<<std::endl;
-//			for (int i = 0; i < eTmp->getNumMeshElements();i++){
-//				MElement* elem = eTmp->getMeshElement(i);
-//				MVertex *firstETmp = VertexAssociation.find(elem->getVertex(0))->second;
-//				MVertex *lastETmp = VertexAssociation.find(elem->getVertex(1))->second;
-//				MVertex *midETmp = VertexAssociation.find(elem->getVertex(2))->second;
-//				MLine3 *newLine = new MLine3(firstETmp,lastETmp,midETmp);
-//				newE->addLine(newLine);
-//			}
-////			std::cout<<"after newMlines"<<std::endl;
-//		}
-//		std::cout<<"edges done entering faces"<<std::endl;
-//		std::cout<<"RegEdges size : "<<RegEdges.size()<<std::endl;
 		for (std::list<GEdge*>::iterator itf = RegEdges.begin();itf != RegEdges.end();itf++){
 			GEdge* eTmp = (*itf);
-//			std::vector<GEdge*> newEdgesVector;
-//			std::list<GEdge*> elistFace = fTmp->edges();
-//			for (std::list<GEdge*>::iterator ite = elistFace.begin();ite != elistFace.end();ite++){
-//				GEdge* eTmp = (*ite);
-//				GEdge* eToFind = GEdgeAssociation[eTmp];
-//				newEdgesVector.push_back(eToFind);
-//			}
-//			std::vector<std::vector<GEdge*> > VecOfVec;
-//			VecOfVec.push_back(newEdgesVector);
-			//creation de la nouvelle face
-//			std::cout<<"before newvertices"<<std::endl;
-//			std::cout<<"beginvertex : "<<eTmp->getBeginVertex()->tag()<<std::endl;
-//			std::cout<<"endvertex : "<<eTmp->getEndVertex()->tag()<<std::endl;
-//			std::cout<<"associated begin "<<GVertexAssociation[eTmp->getBeginVertex()]->tag()<<std::endl;
-//			std::cout<<"associated end "<<GVertexAssociation[eTmp->getEndVertex()]->tag()<<std::endl;
 			GEdge* newE = m->addLine(GVertexAssociation[eTmp->getBeginVertex()],GVertexAssociation[eTmp->getEndVertex()]);
-//			std::cout<<"plop1"<<std::endl;
 			for (unsigned int i = 0; i < eTmp->mesh_vertices.size();i++){
-//				std::cout<<"plop2"<<std::endl;
 				MVertex *vMesh = eTmp->mesh_vertices[i];
-//				std::cout<<"plop3"<<std::endl;
 				MVertex *newMv = new MVertex(vMesh->x(), vMesh->y(), vMesh->z(), (GEntity*)newE);
-//				std::cout<<"plop4"<<std::endl;
 				VertexAssociation[vMesh] = newMv;
-//				std::cout<<"plop5"<<std::endl;
 				VertexGlobalAssociation[std::make_pair(vMesh,rTmp)] = newMv;
-//				std::cout<<"plop6"<<std::endl;
 				newE->addMeshVertex(newMv);
-//				std::cout<<"plop7"<<std::endl;
 			}
-//			std::cout<<"after newvertices"<<std::endl;
 			for (unsigned int i = 0; i < eTmp->getNumMeshElements();i++){
 				MElement* elem = eTmp->getMeshElement(i);
 				MVertex *firstETmp = VertexAssociation.find(elem->getVertex(0))->second;
@@ -3854,51 +3037,15 @@ PView *GMSH_DuplicateBoundariesPlugin::execute2DWithBound(PView *view)
 				MLine3 *newLine = new MLine3(firstETmp,lastETmp,midETmp);
 				newE->addLine(newLine);
 			}
-//			std::cout<<"after addline"<<std::endl;
 			GEdgeGlobalAssociation[std::make_pair(eTmp,rTmp)] = newE;
-//			GEdge* GFaceAssociation = m->addPlanarFace(VecOfVec);
-//			int tagTmp = GFaceAssociation->tag();
-//			std::ostringstream ss;
-//			ss << tagTmp;
-////			char *intStr = itoa(tagTmp);
-//			std::string nameSurf = "SURFACE";
-////			nameSurf += std::string(intStr);
-//			nameSurf += ss.str();
-//			int PhysicalSurfaceTmp = m->setPhysicalName(nameSurf,2);
-//			GFaceAssociation->addPhysicalEntity(PhysicalSurfaceTmp);
-//			std::cout<<"on a associe a la face : "<<fTmp->tag()<<" la face : "<<GFaceAssociation->tag()<<std::endl;
-//			//maintenant traitement mesh
-//			for (int i = 0; i < fTmp->mesh_vertices.size();i++){
-//				MVertex *vMesh = fTmp->mesh_vertices[i];
-//				MVertex *newMv = new MVertex(vMesh->x(), vMesh->y(), vMesh->z(), (GEntity*)GFaceAssociation);
-//				VertexAssociation[vMesh] = newMv;
-//				VertexGlobalAssociation[std::make_pair(vMesh,rTmp)] = newMv;
-//				GFaceAssociation->addMeshVertex(newMv);
-//			}
-//			for (int i = 0; i < fTmp->getNumMeshElements();i++){
-//				MElement* elem = fTmp->getMeshElement(i);
-//				MVertex *firstE = VertexAssociation.find(elem->getVertex(0))->second;
-//				MVertex *secondE = VertexAssociation.find(elem->getVertex(1))->second;
-//				MVertex *thirdE = VertexAssociation.find(elem->getVertex(2))->second;
-//				MVertex *fourthE = VertexAssociation.find(elem->getVertex(3))->second;
-//				MVertex *fifthE = VertexAssociation.find(elem->getVertex(4))->second;
-//				MVertex *sisthE = VertexAssociation.find(elem->getVertex(5))->second;
-//				MTriangle6 *newTri = new MTriangle6(firstE,secondE,thirdE,fourthE,fifthE,sisthE);
-//				GFaceAssociation->addTriangle(newTri);
-//			}
-//			GFaceGlobalAssociation[std::make_pair(fTmp,rTmp)] = GFaceAssociation;
 		}
-//		std::cout<<"faces done for regions"<<std::endl;
 	}
-//	std::cout<<"Regions done first pass"<<std::endl;
 	int counterNbDone = 10000;
 	//maintenant on va traiter les faces initiales
 	for (std::set<GEdge*>::iterator itf = ToDuplicateList.begin();itf != ToDuplicateList.end();itf++){
 		counterNbDone++;
-//		std::cout<<"entree dans toduplicateList numero "<<counterNbDone<<std::endl;
 		GEdge* eTmp = (*itf);
 		std::list<GFace*> listFacesTmpT = eTmp->faces();
-//		std::cout<<"on a une taille de list faces de "<<listFacesTmpT.size()<<std::endl;
 		std::list<GFace*>::iterator itTmpFace = listFacesTmpT.begin();
 		GFace* fac1 = (*itTmpFace);
 		itTmpFace++;
@@ -3909,36 +3056,23 @@ PView *GMSH_DuplicateBoundariesPlugin::execute2DWithBound(PView *view)
 		vlist.push_back(eTmp->getBeginVertex());
 		vlist.push_back(eTmp->getEndVertex());
 		std::map<GVertex*,GEdge* > SurroudingEdges;
-//		std::cout<<"entre dans vlist.begin"<<std::endl;
 		for (std::list<GVertex*>::iterator itv = vlist.begin();itv != vlist.end();itv++){
 			GVertex* vTmp = (*itv);
-//			std::cout<<"test1"<<std::endl;
-//			std::cout<<"on a fac1 "<<fac1->tag()<<" et fac2 "<<fac2->tag()<<" et vTmp "<<vTmp->tag()<<std::endl;
 			GVertex* v1=0;
 			GVertex* v2=0;
 			std::map<std::pair<GVertex*,GFace*>,GVertex* >::iterator itMap = GVertexGlobalAssociation.find(std::make_pair(vTmp,fac1));
-//			std::cout<<"test2"<<std::endl;
 			if (itMap != GVertexGlobalAssociation.end()){
 				v1 = itMap->second;
-//				std::cout<<"assigned v1"<<std::endl;
 			}
-//			std::cout<<"test3"<<std::endl;
 			itMap = GVertexGlobalAssociation.find(std::make_pair(vTmp,fac2));
-//			std::cout<<"test4"<<std::endl;
 			if (itMap != GVertexGlobalAssociation.end()){
 				v2 = itMap->second;
-//				std::cout<<"assigned v2"<<std::endl;
 			}
-//			std::cout<<"test5"<<std::endl;
 			GEdge* newE = m->addLine(v1,v2);
-//			std::cout<<"test6"<<std::endl;
 			SurroudingEdges[vTmp] = newE;
-//			std::cout<<"test7"<<std::endl;
 		}
-//		std::cout<<"vertex traites"<<std::endl;
 		//ici tous les vertex sont traites
 		//on va traiter les edges
-//		std::list<GEdge*> elist = fTmp->edges();
 		std::vector<GEdge*> newEdgesVector;
 		std::vector<GFace*> SurroundingsFaces;
 		//duplication Gedge
@@ -3953,7 +3087,6 @@ PView *GMSH_DuplicateBoundariesPlugin::execute2DWithBound(PView *view)
 		if (itMap != GEdgeGlobalAssociation.end()){
 			e2 = itMap->second;
 		}
-//		std::cout<<"creation des GFace correspondantes"<<std::endl;
 		//creation des GFace correspondantes
 		GEdge* firstE = SurroudingEdges.find(eTmp->getBeginVertex())->second;
 		GEdge* lastE = SurroudingEdges.find(eTmp->getEndVertex())->second;
@@ -3987,7 +3120,6 @@ PView *GMSH_DuplicateBoundariesPlugin::execute2DWithBound(PView *view)
 		newFaceTmp->addPhysicalEntity(PhysicalInterface);
 //		createdRegion->set(listFaces);
 //		m->add(createdRegion);
-//		std::cout<<"eTmp->getNumMeshElements() "<<eTmp->getNumMeshElements()<<std::endl;
 		for (unsigned int i = 0; i < eTmp->getNumMeshElements();i++){
 			MElement* elem = eTmp->getMeshElement(i);
 			MVertex* v1=0;
@@ -4020,13 +3152,9 @@ PView *GMSH_DuplicateBoundariesPlugin::execute2DWithBound(PView *view)
 //			if (itMap != VertexGlobalAssociation.end()){
 //				v6 = itMap->second;
 //			}
-//			std::cout<<"creation de prisme "<<counterNbDone<<std::endl;
 			MQuadrangle *newQua = new MQuadrangle(v1,v2,v3,v4);
-//			std::cout<<"addition du quad "<<newQua->getNum()<<" avec les vertices "<<v1->getNum()<<" ; "<<v2->getNum()<<" ; "<<v3->getNum()<<" ; "<<v4->getNum()<<std::endl;
-//			std::cout<<"addition de prisme "<<counterNbDone<<std::endl;
 
 			newFaceTmp->addQuadrangle(newQua);
-//			std::cout<<"fin de for"<<std::endl;
 
 			//second
 			itMap = VertexGlobalAssociation.find(std::make_pair(elem->getVertex(2),fac1));
@@ -4053,10 +3181,7 @@ PView *GMSH_DuplicateBoundariesPlugin::execute2DWithBound(PView *view)
 			//			if (itMap != VertexGlobalAssociation.end()){
 			//				v6 = itMap->second;
 			//			}
-			//			std::cout<<"creation de prisme "<<counterNbDone<<std::endl;
 			MQuadrangle *newQua2 = new MQuadrangle(v1,v2,v3,v4);
-//			std::cout<<"addition du quad "<<newQua2->getNum()<<" avec les vertices "<<v1->getNum()<<" ; "<<v2->getNum()<<" ; "<<v3->getNum()<<" ; "<<v4->getNum()<<std::endl;
-			//			std::cout<<"addition de prisme "<<counterNbDone<<std::endl;
 
 			newFaceTmp->addQuadrangle(newQua2);
 
@@ -4064,18 +3189,13 @@ PView *GMSH_DuplicateBoundariesPlugin::execute2DWithBound(PView *view)
 
 
 		}
-//		std::cout<<"apres region, refonte points "<<counterNbDone<<std::endl;
 		for (unsigned int i = 0; i < fac1->getNumMeshElements();i++){
 			MElement* elem = fac1->getMeshElement(i);
 			for (int j = 0;j < elem->getNumVertices();j++){
 				MVertex* vert = elem->getVertex(j);
 				std::map<std::pair<MVertex*,GFace*>,MVertex* >::iterator itMap = VertexGlobalAssociation.find(std::make_pair(vert,fac1));
 				if (itMap != VertexGlobalAssociation.end()){
-//					std::cout<<"on va changer un point"<<std::endl;
 					elem->setVertex(j,itMap->second);
-//					std::cout<<"on a introduit "<<itMap->second->getNum()<<std::endl;
-//					std::cout<<"maintenant elem j "<<elem->getVertex(j)->getNum()<<std::endl;
-//					std::cout<<"youpi"<<std::endl;
 				}
 			}
 		}
@@ -4085,16 +3205,11 @@ PView *GMSH_DuplicateBoundariesPlugin::execute2DWithBound(PView *view)
 				MVertex* vert = elem->getVertex(j);
 				std::map<std::pair<MVertex*,GFace*>,MVertex* >::iterator itMap = VertexGlobalAssociation.find(std::make_pair(vert,fac2));
 				if (itMap != VertexGlobalAssociation.end()){
-//					std::cout<<"on va changer un point"<<std::endl;
 					elem->setVertex(j,itMap->second);
-//					std::cout<<"on a introduit "<<itMap->second->getNum()<<std::endl;
-//					std::cout<<"maintenant elem j "<<elem->getVertex(j)->getNum()<<std::endl;
-//					std::cout<<"youpi"<<std::endl;
 				}
 			}
 		}
 	}
-//	std::cout<<"interior faces done"<<std::endl;
 
 
 
@@ -4216,18 +3331,13 @@ PView *GMSH_DuplicateBoundariesPlugin::execute2DWithBound(PView *view)
 			MQuadrangle *newQua2 = new MQuadrangle(v1,v2,elem->getVertex(1),elem->getVertex(2));
 			newFaceTmp->addQuadrangle(newQua2);
 		}
-//		std::cout<<"apres region, refonte points "<<counterNbDone<<std::endl;
 		for (unsigned int i = 0; i < fac1->getNumMeshElements();i++){
 			MElement* elem = fac1->getMeshElement(i);
 			for (int j = 0;j < elem->getNumVertices();j++){
 				MVertex* vert = elem->getVertex(j);
 				std::map<std::pair<MVertex*,GFace*>,MVertex* >::iterator itMap = VertexGlobalAssociation.find(std::make_pair(vert,fac1));
 				if (itMap != VertexGlobalAssociation.end()){
-//					std::cout<<"on va changer un point"<<std::endl;
 					elem->setVertex(j,itMap->second);
-//					std::cout<<"on a introduit "<<itMap->second->getNum()<<std::endl;
-//					std::cout<<"maintenant elem j "<<elem->getVertex(j)->getNum()<<std::endl;
-//					std::cout<<"youpi"<<std::endl;
 				}
 			}
 		}
@@ -4497,7 +3607,6 @@ PView *GMSH_DuplicateBoundariesPlugin::executeTer(PView *view)
 	std::map<std::pair<GEdge*,GRegion*>,GEdge* > GEdgeGlobalAssociation;
 	std::map<std::pair<GFace*,GRegion*>,GFace* > GFaceGlobalAssociation;
 
-	std::cout<<"entree dans regions first pass"<<std::endl;
 	for (GModel::riter itr= m->firstRegion();itr != m->lastRegion();itr++){
 		GRegion* rTmp = (*itr);
 		std::list<GFace*> RegFaces = rTmp->faces();
@@ -4526,27 +3635,17 @@ PView *GMSH_DuplicateBoundariesPlugin::executeTer(PView *view)
 		std::list<GVertex*> vlist;
 
 
-		std::cout<<"wut 1"<<std::endl;
 		std::list<GFace*> listFacesTmp = rTmp->faces();
 		for (std::list<GFace*>::iterator itTp = listFacesTmp.begin();itTp != listFacesTmp.end();itTp++){
-			std::cout<<"wut 2"<<std::endl;
 			std::list<GVertex*> vlist2;
-			std::cout<<"wut 3"<<std::endl;
 			vlist2 = (*itTp)->vertices();
-			std::cout<<"wut 4"<<std::endl;
 			for (std::list<GVertex*>::iterator itTp2 = vlist2.begin();itTp2 != vlist2.end();itTp2++){
-				std::cout<<"wut 5"<<std::endl;
 				if(std::find(vlist.begin(), vlist.end(), *itTp2) == vlist.end())
 					vlist.push_back(*itTp2);
-				std::cout<<"wut 6"<<std::endl;
 			}
-			std::cout<<"wut 7"<<std::endl;
 		}
-		std::cout<<"wut 8"<<std::endl;
 
 
-		std::cout<<"on a une taille vlist de "<<vlist.size()<<std::endl;
-		std::cout<<"init done entering vertices"<<std::endl;
 		for (std::list<GVertex*>::iterator itv = vlist.begin();itv != vlist.end();itv++){
 			//duplication Gvertex
 			GVertex* vTmp = (*itv);
@@ -4554,7 +3653,6 @@ PView *GMSH_DuplicateBoundariesPlugin::executeTer(PView *view)
 			double ponderatedY = 0.99999999999 * vTmp->y() + 0.00000000001 * yCenterReg;
 			double ponderatedZ = 0.99999999999 * vTmp->z() + 0.00000000001 * zCenterReg;
 			GVertex* newv = m->addVertex(ponderatedX,ponderatedY,ponderatedZ,vTmp->prescribedMeshSizeAtVertex());
-			std::cout<<"inserted correspondance between : "<<vTmp->tag()<<" and : "<<newv->tag()<<std::endl;
 			GVertexAssociation[vTmp] = newv;
 			GVertexGlobalAssociation[std::make_pair(vTmp,rTmp)] = newv;
 			//creation des Gedge correspondantes
@@ -4569,18 +3667,12 @@ PView *GMSH_DuplicateBoundariesPlugin::executeTer(PView *view)
 		}
 		//maintenant on soccupe de duppliquer les edges de la region
 		std::list<GEdge*> elist = rTmp->edges();
-		std::cout<<"on a une taille elist de "<<elist.size()<<std::endl;
-		std::cout<<"vertices done entering edges"<<std::endl;
 
 		std::vector<GFace*> SurroundingsFaces;
 		for (std::list<GEdge*>::iterator ite = elist.begin();ite != elist.end();ite++){
 			//duplication Gedge
 			GEdge* eTmp = (*ite);
-			std::cout<<"before addline"<<std::endl;
-			std::cout<<"begin ID : "<<eTmp->getBeginVertex()->tag()<<" and end ID : "<<eTmp->getEndVertex()->tag()<<std::endl;
-			std::cout<<"corresponding begin ID : "<<GVertexAssociation[eTmp->getBeginVertex()]->tag()<<" and end ID : "<<GVertexAssociation[eTmp->getEndVertex()]->tag()<<std::endl;
 			GEdge* newE = m->addLine(GVertexAssociation[eTmp->getEndVertex()],GVertexAssociation[eTmp->getBeginVertex()]);
-			std::cout<<"after addline"<<std::endl;
 			GEdgeAssociation[eTmp] = newE;
 			GEdgeGlobalAssociation[std::make_pair(eTmp,rTmp)] = newE;
 			//creation des GFace correspondantes
@@ -4603,7 +3695,6 @@ PView *GMSH_DuplicateBoundariesPlugin::executeTer(PView *view)
 				VertexGlobalAssociation[std::make_pair(vMesh,rTmp)] = newMv;
 				newE->addMeshVertex(newMv);
 			}
-			std::cout<<"after newvertices"<<std::endl;
 			for (unsigned int i = 0; i < eTmp->getNumMeshElements();i++){
 				MElement* elem = eTmp->getMeshElement(i);
 				MVertex *firstETmp = VertexAssociation.find(elem->getVertex(0))->second;
@@ -4611,9 +3702,7 @@ PView *GMSH_DuplicateBoundariesPlugin::executeTer(PView *view)
 				MLine *newLine = new MLine(firstETmp,lastETmp);
 				newE->addLine(newLine);
 			}
-			std::cout<<"after newMlines"<<std::endl;
 		}
-		std::cout<<"edges done entering faces"<<std::endl;
 		for (std::list<GFace*>::iterator itf = RegFaces.begin();itf != RegFaces.end();itf++){
 			GFace* fTmp = (*itf);
 			std::vector<GEdge*> newEdgesVector;
@@ -4645,9 +3734,7 @@ PView *GMSH_DuplicateBoundariesPlugin::executeTer(PView *view)
 			}
 			GFaceGlobalAssociation[std::make_pair(fTmp,rTmp)] = GFaceAssociation;
 		}
-		std::cout<<"faces done for regions"<<std::endl;
 	}
-	std::cout<<"Regions done first pass"<<std::endl;
 	int counterNbDone = 10000;
 	//maintenant on va traiter les faces initiales
 	for (std::set<GFace*>::iterator itf = ToDuplicateList.begin();itf != ToDuplicateList.end();itf++){
@@ -4778,25 +3865,17 @@ PView *GMSH_DuplicateBoundariesPlugin::executeTer(PView *view)
 			if (itMap != VertexGlobalAssociation.end()){
 				v6 = itMap->second;
 			}
-//			std::cout<<"creation de prisme "<<counterNbDone<<std::endl;
 			MPrism *newPri = new MPrism(v1,v2,v3,v4,v5,v6);
-//			std::cout<<"addition de prisme "<<counterNbDone<<std::endl;
 
 			createdRegion->addPrism(newPri);
-//			std::cout<<"fin de for"<<std::endl;
 		}
-		std::cout<<"apres region, refonte points "<<counterNbDone<<std::endl;
 		for (unsigned int i = 0; i < reg1->getNumMeshElements();i++){
 			MElement* elem = reg1->getMeshElement(i);
 			for (int j = 0;j < elem->getNumVertices();j++){
 				MVertex* vert = elem->getVertex(j);
 				std::map<std::pair<MVertex*,GRegion*>,MVertex* >::iterator itMap = VertexGlobalAssociation.find(std::make_pair(vert,reg1));
 				if (itMap != VertexGlobalAssociation.end()){
-//					std::cout<<"on va changer un point"<<std::endl;
 					elem->setVertex(j,itMap->second);
-//					std::cout<<"on a introduit "<<itMap->second->getNum()<<std::endl;
-//					std::cout<<"maintenant elem j "<<elem->getVertex(j)->getNum()<<std::endl;
-//					std::cout<<"youpi"<<std::endl;
 				}
 			}
 		}
@@ -4806,16 +3885,11 @@ PView *GMSH_DuplicateBoundariesPlugin::executeTer(PView *view)
 				MVertex* vert = elem->getVertex(j);
 				std::map<std::pair<MVertex*,GRegion*>,MVertex* >::iterator itMap = VertexGlobalAssociation.find(std::make_pair(vert,reg2));
 				if (itMap != VertexGlobalAssociation.end()){
-//					std::cout<<"on va changer un point"<<std::endl;
 					elem->setVertex(j,itMap->second);
-//					std::cout<<"on a introduit "<<itMap->second->getNum()<<std::endl;
-//					std::cout<<"maintenant elem j "<<elem->getVertex(j)->getNum()<<std::endl;
-//					std::cout<<"youpi"<<std::endl;
 				}
 			}
 		}
 	}
-	std::cout<<"interior faces done"<<std::endl;
 
 	for (std::set<GFace*>::iterator itf = ToDuplicateListBoundary.begin();itf != ToDuplicateListBoundary.end();itf++){
 		GFace* fTmp = (*itf);
diff --git a/Plugin/PluginManager.cpp b/Plugin/PluginManager.cpp
index 14c1de6efc6fda92034f6981c798f16468bfc22e..c460a099d608cd82747823163cea5e8e7cca8676 100644
--- a/Plugin/PluginManager.cpp
+++ b/Plugin/PluginManager.cpp
@@ -26,6 +26,7 @@
 #include "SimplePartition.h"
 #include "Crack.h"
 #include "DuplicateBoundaries.h"
+#include "ThinLayerFixMesh.h"
 #include "HarmonicToTime.h"
 #include "ModulusPhase.h"
 #include "Integrate.h"
@@ -260,6 +261,8 @@ void PluginManager::registerDefaultPlugins()
                       ("FaultZone", GMSH_RegisterFaultZonePlugin()));
     allPlugins.insert(std::pair<std::string, GMSH_Plugin*>
                       ("DuplicateBoundaries", GMSH_RegisterDuplicateBoundariesPlugin()));
+    allPlugins.insert(std::pair<std::string, GMSH_Plugin*>
+                      ("ThinLayerFixMesh", GMSH_RegisterThinLayerFixMeshPlugin()));
     allPlugins.insert(std::pair<std::string, GMSH_Plugin*>
                       ("MeshSubEntities", GMSH_RegisterMeshSubEntitiesPlugin()));
 #if defined(HAVE_REVOROPT)
diff --git a/Plugin/ThinLayerFixMesh.cpp b/Plugin/ThinLayerFixMesh.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..fc13bc63e5ad3da24bb79491d98f9f75d11219a4
--- /dev/null
+++ b/Plugin/ThinLayerFixMesh.cpp
@@ -0,0 +1,1162 @@
+/*
+ * ThinLayerFixMesh.cpp
+ *
+ *  Created on: Oct 13, 2014
+ *      Author: nicolas
+ */
+
+#include "ThinLayerFixMesh.h"
+#include "GModel.h"
+#include "robustPredicates.h"
+#include "GRegion.h"
+#include "meshGFaceDelaunayInsertion.h"
+//#include "meshGFace.h"
+
+
+
+CorrespVerticesFixMesh::CorrespVerticesFixMesh(){
+//	std::cout<<"started init CorrespVerticesFixMesh"<<std::endl;
+//	this->EndTriangle = faceXtetFM();
+//	this->StartPoint = 0;
+//	this->EndPoint = SPoint3(0.0,0.0,0.0);
+//	this->StartNormal = SVector3(0.0,0.0,0.0);
+//	this->EndNormal = SVector3(0.0,0.0,0.0);
+//	this->distP2P = 0.0;
+//	this->angleProd = 0.0;
+//	this->Active = false;
+//	this->EndTriangleActive = false;
+//	this->IsMaster = false;
+//	this->tagMaster = 0;
+//	std::cout<<"completed init CorrespVerticesFixMesh"<<std::endl;
+}
+CorrespVerticesFixMesh::~CorrespVerticesFixMesh(){}
+void CorrespVerticesFixMesh::setStartPoint(MVertex* v){
+	this->StartPoint = v;
+}
+void CorrespVerticesFixMesh::setEndPoint(SPoint3 p){
+	this->EndPoint = p;
+}
+void CorrespVerticesFixMesh::setStartNormal(SVector3 v){
+	this->StartNormal = v;
+}
+void CorrespVerticesFixMesh::setEndNormal(SVector3 v){
+	this->EndNormal = v;
+}
+//void CorrespVerticesFixMesh::setEndTriangle(faceXtetFM f){
+//	this->EndTriangle(f.t1,f.i1);
+//}
+void CorrespVerticesFixMesh::setEndTrianglePoint1(MVertex* v){
+	this->EndTrianglePoint1 = v;
+}
+void CorrespVerticesFixMesh::setEndTrianglePoint2(MVertex* v){
+	this->EndTrianglePoint2 = v;
+}
+void CorrespVerticesFixMesh::setEndTrianglePoint3(MVertex* v){
+	this->EndTrianglePoint3 = v;
+}
+void CorrespVerticesFixMesh::setdistP2P(double d){
+	this->distP2P = d;
+}
+void CorrespVerticesFixMesh::setangleProd(double a){
+	this->angleProd = a;
+}
+void CorrespVerticesFixMesh::setActive(bool b){
+	this->Active = b;
+}
+void CorrespVerticesFixMesh::setEndTriangleActive(bool b){
+	this->EndTriangleActive = b;
+}
+void CorrespVerticesFixMesh::setIsMaster(bool b){
+	this->IsMaster = b;
+}
+void CorrespVerticesFixMesh::setTagMaster(int i){
+	this->tagMaster = i;
+}
+MVertex* CorrespVerticesFixMesh::getStartPoint(){
+	return StartPoint;
+}
+SPoint3 CorrespVerticesFixMesh::getEndPoint(){
+	return EndPoint;
+}
+SVector3 CorrespVerticesFixMesh::getStartNormal(){
+	return StartNormal;
+}
+SVector3 CorrespVerticesFixMesh::getEndNormal(){
+	return EndNormal;
+}
+//faceXtetFM CorrespVerticesFixMesh::getEndTriangle(){
+//	return EndTriangle;
+//}
+MVertex* CorrespVerticesFixMesh::getEndTrianglePoint1(){
+	return EndTrianglePoint1;
+}
+MVertex* CorrespVerticesFixMesh::getEndTrianglePoint2(){
+	return EndTrianglePoint2;
+}
+MVertex* CorrespVerticesFixMesh::getEndTrianglePoint3(){
+	return EndTrianglePoint3;
+}
+double CorrespVerticesFixMesh::getdistP2P(){
+	return distP2P;
+}
+double CorrespVerticesFixMesh::getangleProd(){
+	return angleProd;
+}
+bool CorrespVerticesFixMesh::getActive(){
+	return Active;
+}
+bool CorrespVerticesFixMesh::getEndTriangleActive(){
+	return EndTriangleActive;
+}
+bool CorrespVerticesFixMesh::getIsMaster(){
+	return IsMaster;
+}
+int CorrespVerticesFixMesh::getTagMaster(){
+	return tagMaster;
+}
+
+StringXNumber ThingLayerFixMeshOptions_Number[] = {
+//  {GMSH_FULLRC, "Dimension", NULL, 1.},
+//  {GMSH_FULLRC, "PhysicalGroup", NULL, 1.},
+//  {GMSH_FULLRC, "OpenBoundaryPhysicalGroup", NULL, 0.},
+};
+
+extern "C"
+{
+  GMSH_Plugin *GMSH_RegisterThinLayerFixMeshPlugin()
+  {
+    return new GMSH_ThinLayerFixMeshPlugin();
+  }
+}
+
+//GMSH_ThinLayerFixMeshPlugin::GMSH_ThinLayerFixMeshPlugin(){}
+
+//GMSH_ThinLayerFixMeshPlugin::~GMSH_ThinLayerFixMeshPlugin(){}
+
+std::string GMSH_ThinLayerFixMeshPlugin::getHelp() const
+{
+  return "Fix the mesh in thin parts";
+}
+
+int GMSH_ThinLayerFixMeshPlugin::getNbOptions() const
+{
+  return sizeof(ThingLayerFixMeshOptions_Number) / sizeof(StringXNumber);
+}
+
+StringXNumber *GMSH_ThinLayerFixMeshPlugin::getOption(int iopt)
+{
+  return &ThingLayerFixMeshOptions_Number[iopt];
+}
+
+PView *GMSH_ThinLayerFixMeshPlugin::execute(PView *view)
+{
+	GModel *m = GModel::current();
+	GMSH_ThinLayerFixMeshPlugin::perform();
+//	if (m->getDim() == 3){
+//		view = GMSH_DuplicateBoundariesPlugin::executeDuplicate(view);
+//	}
+//	else if (m->getDim() == 2){
+//		view = GMSH_DuplicateBoundariesPlugin::execute2DWithBound(view);
+//	}
+	return view;
+}
+
+void GMSH_ThinLayerFixMeshPlugin::perform(){
+	VertexToTets.clear();
+	TetToTet4.clear();
+	VertexToCorresp.clear();
+	vecOfThinSheets.clear();
+	GMSH_ThinLayerFixMeshPlugin::fillVertexToTets();
+	GMSH_ThinLayerFixMeshPlugin::fillTetToTet4();
+	//std::cout<<"computeAllDistToOppSide"<<std::endl;
+	std::map<MVertex*,double> AllDist = GMSH_ThinLayerFixMeshPlugin::computeAllDistToOppSide();
+	for (std::map<MVertex*,double>::iterator allDistIt = AllDist.begin();allDistIt != AllDist.end();allDistIt++){
+		//std::cout<<"allDist of point "<<(*allDistIt).first->getNum()<<" with Pos "<<(*allDistIt).first->x()<<" ; "<<(*allDistIt).first->z()<<" ; "<<(*allDistIt).first->y()<<" is "<<(*allDistIt).second<<std::endl;
+		//std::cout<<"   Size of vertexToCorresp "<<VertexToCorresp[(*allDistIt).first].size()<<std::endl;
+//		//std::cout<<"      Testing FaceXTet out of while fourth time "<<VertexToCorresp[(*allDistIt).first][VertexToCorresp[(*allDistIt).first].size() - 1]->getEndTriangle().t1->tet()->getNum()<<std::endl;
+		//std::cout<<"      Testing StartPoint "<<VertexToCorresp[(*allDistIt).first][VertexToCorresp[(*allDistIt).first].size() - 1]->getStartPoint()->getNum()<<std::endl;
+		//std::cout<<"      Testing StartNormal "<<VertexToCorresp[(*allDistIt).first][VertexToCorresp[(*allDistIt).first].size() - 1]->getStartNormal().norm()<<std::endl;
+	}
+	//std::cout<<"checkOppositeTriangles !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"<<std::endl;
+	GMSH_ThinLayerFixMeshPlugin::checkOppositeTriangles();
+	//std::cout<<"fillvecOfThinSheets !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"<<std::endl;
+	GMSH_ThinLayerFixMeshPlugin::fillvecOfThinSheets();
+	//std::cout<<"Out of fillvecOfThinSheets"<<std::endl;
+//	std::set<MVertex*> constr_vertices;
+	for (unsigned int i = 0;i < vecOfThinSheets.size();i++){
+		if (vecOfThinSheets[i].size() > 1){
+			GFace* OnSurf;
+			for (unsigned int j = 0;j < vecOfThinSheets[i].size();j++){
+				//find a point on the surface
+				MVertex* vertOnSurf = vecOfThinSheets[i][j]->getEndTrianglePoint1();
+				if (vertOnSurf->onWhat()->dim() < 2){
+					vertOnSurf = vecOfThinSheets[i][j]->getEndTrianglePoint2();
+				}
+				if (vertOnSurf->onWhat()->dim() < 2){
+					vertOnSurf = vecOfThinSheets[i][j]->getEndTrianglePoint3();
+				}
+				OnSurf = dynamic_cast<GFace*>(vertOnSurf->onWhat());
+				SPoint2 ParOnSurf = OnSurf->parFromPoint(vecOfThinSheets[i][j]->getEndPoint(),1);
+				MVertex* StartPo = vecOfThinSheets[i][j]->getStartPoint();
+				double param1 = 0.0;
+				double param2 = 0.0;
+				StartPo->getParameter(0,param1);
+				StartPo->getParameter(1,param2);
+				//std::cout<<" PointBegin is "<<StartPo->x()<<" ; "<<StartPo->y()<<" ; "<<StartPo->z()<<" with param "<<param1<<" ; "<<param2<<std::endl;
+				//std::cout<<"insertion of point "<<vecOfThinSheets[i][j]->getEndPoint().x()<<" ; "<<vecOfThinSheets[i][j]->getEndPoint().y()<<" ; "<<vecOfThinSheets[i][j]->getEndPoint().z()<<" with param "<<ParOnSurf.x()<<" ; "<<ParOnSurf.y()<<std::endl;
+				MFaceVertex *v = new MFaceVertex(vecOfThinSheets[i][j]->getEndPoint().x(),vecOfThinSheets[i][j]->getEndPoint().y(),vecOfThinSheets[i][j]->getEndPoint().z(),OnSurf,ParOnSurf.x(),ParOnSurf.y());
+				OnSurf->setMeshingAlgo(ALGO_2D_PACK_PRLGRMS_CSTR);
+				OnSurf->constr_vertices.insert(v);
+//				OnSurf->addMeshVertex(v);
+//				constr_vertices.insert(v);
+				//std::cout<<"inserted point with tag "<<v->getNum()<<" on surface "<<OnSurf->tag()<<std::endl;
+			}
+//			OnSurf->setMeshingAlgo(ALGO_2D_PACK_PRLGRMS_CSTR);
+//			OnSurf->GFace::deleteMesh();
+//			buildBackGroundMesh (OnSurf);
+//			meshGFace::modifyInitialMeshForTakingIntoAccountBoundaryLayers(OnSurf);
+//			OnSurf->meshStatistics.status = GFace::PENDING;
+//			OnSurf->meshStatistics.nbTriangle = OnSurf->meshStatistics.nbEdge = 0;
+//			OnSurf->correspondingVertices.clear();
+//			std::map<MVertex* , MVertex*>* equivalence;
+//			std::map<MVertex*, SPoint2> * parametricCoordinates;
+//			bowyerWatsonParallelogramsConstrained(OnSurf,constr_vertices);
+		}
+//		constr_vertices.clear();
+	}
+	for (std::map<MVertex*,std::vector<CorrespVerticesFixMesh*> >::iterator it1 = VertexToCorresp.begin();it1 != VertexToCorresp.end();it1++){
+		std::vector<CorrespVerticesFixMesh*> vecCorr = (*it1).second;
+		for (unsigned int i = 0;i < vecCorr.size();i++){
+			delete vecCorr[i];
+		}
+	}
+}
+
+void GMSH_ThinLayerFixMeshPlugin::checkOppositeTriangles(){
+	//all endTriangle will be set to active or not
+	for (std::map<MVertex*,std::vector<CorrespVerticesFixMesh*> >::iterator it1 = VertexToCorresp.begin();it1 != VertexToCorresp.end();it1++){
+//		std::cout<<"   Entering For"<<std::endl;
+		MVertex* vertTmp = (*it1).first;
+		//std::cout<<"   Vert Tested is "<<vertTmp->getNum()<<" and its vector size is "<<(*it1).second.size()<<" pos "<<vertTmp->x()<<" ; "<<vertTmp->y()<<" ; "<<vertTmp->z()<<std::endl;
+		std::vector<CorrespVerticesFixMesh*> vecCorr = (*it1).second;
+		for (unsigned int i = 0;i < vecCorr.size();i++){
+			//std::cout<<"      Entering deeper For"<<std::endl;
+			CorrespVerticesFixMesh* currentCorr = vecCorr[i];
+//			std::cout<<"      Step 1"<<std::endl;
+//			faceXtetFM currentEndTri = (*(currentCorr->getEndTriangle()));
+//			std::cout<<"      Step 2"<<std::endl;
+			MVertex* endP0 = currentCorr->getEndTrianglePoint1();
+//			std::cout<<"      Step 3"<<std::endl;
+			MVertex* endP1 = currentCorr->getEndTrianglePoint2();
+//			std::cout<<"      Step 4"<<std::endl;
+			MVertex* endP2 = currentCorr->getEndTrianglePoint3();
+//			std::cout<<"      Step 5"<<std::endl;
+			std::map<MVertex*,std::vector<CorrespVerticesFixMesh*> >::iterator it2 = VertexToCorresp.find(endP0);
+//			std::cout<<"      Step 6 ?"<<std::endl;
+//			std::cout<<"      Tet is "<<currentCorr->getEndTriangle().t1->tet()->getNum()<<std::endl;
+//			std::cout<<"      Face number is "<<currentCorr->getEndTriangle().i1<<std::endl;
+//			std::cout<<"      Tet is made of vertex 0 "<<currentCorr->getEndTriangle().t1->tet()->getVertex(0)->getNum()<<std::endl;
+//			std::cout<<"      Tet is made of vertex 1 "<<currentCorr->getEndTriangle().t1->tet()->getVertex(1)->getNum()<<std::endl;
+//			std::cout<<"      Tet is made of vertex 2 "<<currentCorr->getEndTriangle().t1->tet()->getVertex(2)->getNum()<<std::endl;
+//			std::cout<<"      Tet is made of vertex 3 "<<currentCorr->getEndTriangle().t1->tet()->getVertex(3)->getNum()<<std::endl;
+//			std::cout<<"      Adresses of endP0 "<<endP0<<" and endP1 "<<endP1<<" and endP2 "<<endP2<<std::endl;
+			//std::cout<<"      endP0 is "<<endP0->getNum()<<" pos "<<endP0->x()<<" ; "<<endP0->y()<<" ; "<<endP0->z()<<std::endl;
+//			std::cout<<"      Step 6"<<std::endl;
+			std::map<MVertex*,std::vector<CorrespVerticesFixMesh*> >::iterator it3 = VertexToCorresp.find(endP1);
+			//std::cout<<"      endP1 is "<<endP1->getNum()<<" pos "<<endP1->x()<<" ; "<<endP1->y()<<" ; "<<endP1->z()<<std::endl;
+//			std::cout<<"      Step 7"<<std::endl;
+			std::map<MVertex*,std::vector<CorrespVerticesFixMesh*> >::iterator it4 = VertexToCorresp.find(endP2);
+			//std::cout<<"      endP2 is "<<endP2->getNum()<<" pos "<<endP2->x()<<" ; "<<endP2->y()<<" ; "<<endP2->z()<<std::endl;
+//			std::cout<<"      Step 8"<<std::endl;
+			(*it1).second[i]->setEndTriangleActive(false);
+			//std::cout<<"      Starting tests"<<std::endl;
+			bool test0 = false;
+			bool test1 = false;
+			bool test2 = false;
+			if (endP0->onWhat()->dim() < 2){
+				test0 = true;
+				//std::cout<<"         test0 true by dim"<<std::endl;
+			}
+			if (endP1->onWhat()->dim() < 2){
+				test1 = true;
+				//std::cout<<"         test1 true by dim"<<std::endl;
+			}
+			if (endP2->onWhat()->dim() < 2){
+				test2 = true;
+				//std::cout<<"         test2 true by dim"<<std::endl;
+			}
+			if (it2 != VertexToCorresp.end()){
+				if ((*it2).second.size() > 0){
+					if ((*it2).second[0]->getActive()){
+						test0 = true;
+						//std::cout<<"         test0 true by active"<<std::endl;
+					}
+				}
+			}
+			if (it3 != VertexToCorresp.end()){
+				if ((*it3).second.size() > 0){
+					if ((*it3).second[0]->getActive()){
+						test1 = true;
+						//std::cout<<"         test1 true by active"<<std::endl;
+					}
+				}
+			}
+			if (it4 != VertexToCorresp.end()){
+				if ((*it4).second.size() > 0){
+					if ((*it4).second[0]->getActive()){
+						test2 = true;
+						//std::cout<<"         test2 true by active"<<std::endl;
+					}
+				}
+			}
+			if (test0){
+				if (test1){
+					if (test2){
+						(*it1).second[i]->setEndTriangleActive(true);
+						//std::cout<<"                        EndTriangle Activated"<<std::endl;
+					}
+				}
+			}
+//			if (it2 != VertexToCorresp.end()){
+////				std::cout<<"         Passed Number 1"<<std::endl;
+//				if (it3 != VertexToCorresp.end()){
+////					std::cout<<"            Passed Number 2"<<std::endl;
+//					if (it4 != VertexToCorresp.end()){
+////						std::cout<<"               Passed Number 3"<<std::endl;
+//						if (((*it2).second.size() > 0)  || (endP0->onWhat()->dim() < 2)){
+//							std::cout<<"         Passed Number 1 Bis"<<std::endl;
+//							if (((*it3).second.size() > 0)  || (endP1->onWhat()->dim() < 2)){
+//								std::cout<<"            Passed Number 2 Bis"<<std::endl;
+//								if (((*it4).second.size() > 0)  || (endP2->onWhat()->dim() < 2)){
+//									std::cout<<"               Passed Number 3 Bis"<<std::endl;
+//									if (((*it2).second[0]->getActive()) || (endP0->onWhat()->dim() < 2)){
+//										std::cout<<"                  Passed Number 4"<<std::endl;
+//										if (((*it3).second[0]->getActive()) || (endP1->onWhat()->dim() < 2)){
+//											std::cout<<"                     Passed Number 5"<<std::endl;
+//											if (((*it4).second[0]->getActive()) || (endP2->onWhat()->dim() < 2)){
+//												std::cout<<"                        Passed Number 6"<<std::endl;
+//												(*it1).second[i]->setEndTriangleActive(true);
+//											}
+//										}
+//									}
+//								}
+//							}
+//						}
+//					}
+//				}
+//			}
+			//std::cout<<"      Exiting out of deeper For"<<std::endl;
+		}
+//		std::cout<<"   Getting Out Of For"<<std::endl;
+	}
+}
+
+void GMSH_ThinLayerFixMeshPlugin::fillvecOfThinSheets(){
+	for (std::map<MVertex*,std::vector<CorrespVerticesFixMesh*> >::iterator it1 = VertexToCorresp.begin();it1 != VertexToCorresp.end();it1++){
+		MVertex* vertTmp = (*it1).first;
+		std::vector<CorrespVerticesFixMesh*> vecCorr = (*it1).second;
+		for (unsigned int i = 0;i < vecCorr.size();i++){
+			CorrespVerticesFixMesh* currentCorr = vecCorr[i];
+			//std::cout<<"going to test vecCorr["<<i<<"]"<<" vertex "<<currentCorr->getStartPoint()->getNum()<<" and pos "<<currentCorr->getStartPoint()->x()<<" ; "<<currentCorr->getStartPoint()->y()<<" ; "<<currentCorr->getStartPoint()->z()<<std::endl;
+			if (currentCorr->getStartPoint()->onWhat()->dim() == 2)
+				//std::cout<<"On a surface ; ";
+			if (currentCorr->getActive())
+				//std::cout<<"Is active ; ";
+			if (currentCorr->getEndTriangleActive())
+				//std::cout<<"End Triangle active ; ";
+			if (currentCorr->getTagMaster() == (-2))
+				//std::cout<<"Has yet to be used ; ";
+			//std::cout<<std::endl;
+			if ((currentCorr->getStartPoint()->onWhat()->dim() == 2) && (currentCorr->getActive()) && (currentCorr->getEndTriangleActive()) && (currentCorr->getTagMaster() == (-2))){
+				//Found the first node of a new master sheet
+				//std::cout<<"entering a new master sheet !"<<std::endl;
+				std::vector<CorrespVerticesFixMesh*> MasterSheet;
+				MasterSheet.clear();
+				(*it1).second[i]->setTagMaster(-1);
+//				faceXtetFM faceEndSlave = (*((*it1).second[i]->getEndTriangle()));
+//				faceXtetFM faceEndSlave = ((*it1).second[i]->getEndTriangle());
+				{
+					std::map<MVertex*,std::vector<CorrespVerticesFixMesh*> >::iterator it2 = VertexToCorresp.find((*it1).second[i]->getEndTrianglePoint1());
+					if (it2 != VertexToCorresp.end()){
+						if ((*it2).second.size() > 0){
+							if ((*it1).second[i]->getEndTrianglePoint1()->onWhat()->dim() == 2){
+								(*it2).second[0]->setTagMaster((*it1).second[i]->getStartPoint()->onWhat()->tag());
+							}
+						}
+					}
+					it2 = VertexToCorresp.find((*it1).second[i]->getEndTrianglePoint2());
+					if (it2 != VertexToCorresp.end()){
+						if ((*it2).second.size() > 0){
+							if ((*it1).second[i]->getEndTrianglePoint2()->onWhat()->dim() == 2){
+								(*it2).second[0]->setTagMaster((*it1).second[i]->getStartPoint()->onWhat()->tag());
+							}
+						}
+					}
+					it2 = VertexToCorresp.find((*it1).second[i]->getEndTrianglePoint3());
+					if (it2 != VertexToCorresp.end()){
+						if ((*it2).second.size() > 0){
+							if ((*it1).second[i]->getEndTrianglePoint3()->onWhat()->dim() == 2){
+								(*it2).second[0]->setTagMaster((*it1).second[i]->getStartPoint()->onWhat()->tag());
+							}
+						}
+					}
+				}
+//				for (unsigned int j = 0;j < 3;j++){
+//					std::map<MVertex*,std::vector<CorrespVerticesFixMesh*> >::iterator it2 = VertexToCorresp.find(faceEndSlave.v[j]);
+//					if (it2 != VertexToCorresp.end()){
+//						if (faceEndSlave.v[j]->onWhat()->dim() == 2){
+//							(*it2).second[0]->setTagMaster((*it1).second[i]->getStartPoint()->onWhat()->tag());
+//						}
+//					}
+//				}
+				MasterSheet.push_back((*it1).second[i]);
+				std::set<MVertex*> CurrentSheet;
+				CurrentSheet.clear();
+				CurrentSheet.insert((*it1).second[i]->getStartPoint());
+				while (CurrentSheet.size() != 0){
+					MVertex* VToDo = (*CurrentSheet.begin());
+					std::vector<MTetrahedron*> surroundingTet = VertexToTets[VToDo];
+					for (unsigned int j = 0;j < surroundingTet.size();j++){
+						for (unsigned int k = 0;k < surroundingTet[j]->getNumVertices();k++){
+							MVertex* ToInsertTmp = surroundingTet[j]->getVertex(k);
+							std::map<MVertex*,std::vector<CorrespVerticesFixMesh*> >::iterator it2 = VertexToCorresp.find(ToInsertTmp);
+							if (ToInsertTmp->onWhat()->tag() == VToDo->onWhat()->tag()){//TODO: OR that onwhat -> dim <, for edges
+								if (it2 != VertexToCorresp.end()){
+									if ((*it2).second.size() > 0){
+										CorrespVerticesFixMesh* correspToInsert = ((*it2).second)[0];
+										//std::cout<<"      Testing "<<((*it2).second)[0]->getStartPoint()->getNum()<<" with ";
+										if (correspToInsert->getStartPoint()->onWhat()->dim() == 2)
+											//std::cout<<"On a surface ; ";
+										if (correspToInsert->getActive())
+											//std::cout<<"Is active ; ";
+										if (correspToInsert->getEndTriangleActive())
+											//std::cout<<"End Triangle active ; ";
+										if (correspToInsert->getTagMaster() == (-2))
+											//std::cout<<"Has yet to be used ; ";
+										//std::cout<<std::endl;
+										if ((correspToInsert->getStartPoint()->onWhat()->dim() == 2) && (correspToInsert->getActive()) && (correspToInsert->getEndTriangleActive()) && (correspToInsert->getTagMaster() == (-2))){
+											MasterSheet.push_back((*it2).second[0]);
+											(*it2).second[0]->setTagMaster(-1);
+											//										faceXtetFM faceEndSlave2 = (*((*it2).second[0]->getEndTriangle()));
+											//										faceXtetFM faceEndSlave2 = ((*it2).second[0]->getEndTriangle());
+											{
+												std::map<MVertex*,std::vector<CorrespVerticesFixMesh*> >::iterator it3 = VertexToCorresp.find((*it2).second[0]->getEndTrianglePoint1());
+												if (it3 != VertexToCorresp.end()){
+													if ((*it3).second.size() > 0){
+														if ((*it2).second[0]->getEndTrianglePoint1()->onWhat()->dim() == 2){
+															(*it3).second[0]->setTagMaster((*it2).second[i]->getStartPoint()->onWhat()->tag());
+														}
+													}
+												}
+												it3 = VertexToCorresp.find((*it2).second[0]->getEndTrianglePoint2());
+												if (it3 != VertexToCorresp.end()){
+													if ((*it3).second.size() > 0){
+														if ((*it2).second[0]->getEndTrianglePoint2()->onWhat()->dim() == 2){
+															(*it3).second[0]->setTagMaster((*it2).second[i]->getStartPoint()->onWhat()->tag());
+														}
+													}
+												}
+												it3 = VertexToCorresp.find((*it2).second[0]->getEndTrianglePoint3());
+												if (it3 != VertexToCorresp.end()){
+													if ((*it3).second.size() > 0){
+														if ((*it2).second[0]->getEndTrianglePoint3()->onWhat()->dim() == 2){
+															(*it3).second[0]->setTagMaster((*it2).second[i]->getStartPoint()->onWhat()->tag());
+														}
+													}
+												}
+											}
+											//										for (unsigned int j = 0;j < 3;j++){
+											//											std::map<MVertex*,std::vector<CorrespVerticesFixMesh*> >::iterator it3 = VertexToCorresp.find(faceEndSlave2.v[j]);
+											//											if (it3 != VertexToCorresp.end()){
+											//												if (faceEndSlave2.v[j]->onWhat()->dim() == 2){
+											//													(*it3).second[0]->setTagMaster((*it2).second[i]->getStartPoint()->onWhat()->tag());
+											//												}
+											//											}
+											//										}
+											CurrentSheet.insert(ToInsertTmp);
+										}
+									}
+								}
+							}
+						}
+					}
+					CurrentSheet.erase(VToDo);
+				}
+				vecOfThinSheets.push_back(MasterSheet);
+				//std::cout<<"describing new MasterSheet !"<<std::endl;
+				for (unsigned int j = 0;j < MasterSheet.size();j++){
+					//std::cout<<"Number "<<j<<" is "<<MasterSheet[j]->getStartPoint()->getNum()<<" with position "<<MasterSheet[j]->getStartPoint()->x()<<" ; "<<MasterSheet[j]->getStartPoint()->y()<<" ; "<<MasterSheet[j]->getStartPoint()->z()<<std::endl;
+				}
+				//std::cout<<"exiting the master sheet !"<<std::endl;
+			}
+		}
+	}
+}
+std::map<MVertex*,double> GMSH_ThinLayerFixMeshPlugin::computeAllDistToOppSide(){
+	std::map<MVertex*,double> AllDistToOppSide;
+	AllDistToOppSide.clear();
+	GModel *m = GModel::current();
+//	std::vector<MElement*> crackElements;
+	std::set<MVertex*> BoundaryVertices;
+	int countdown = 0;
+
+
+
+	for (GModel::riter itr= m->firstRegion();itr != m->lastRegion();itr++){
+		GRegion* rTmp = (*itr);
+		//std::cout<<"   Entering region "<<rTmp->tag()<<std::endl;
+		for(unsigned int i = 0; i < rTmp->tetrahedra.size(); i++){
+			countdown++;
+			//std::cout<<"      Entering tet "<<rTmp->tetrahedra[i]->getNum()<<" its the "<<countdown<<"st"<<std::endl;
+			MTet4* tet4Tmp = TetToTet4[rTmp->tetrahedra[i]];
+			//std::cout<<"      Neighbours 0: "<<tet4Tmp->getNeigh(0)<<" Neighbours 1: "<<tet4Tmp->getNeigh(1)<<" Neighbours 2: "<<tet4Tmp->getNeigh(2)<<" Neighbours 3: "<<tet4Tmp->getNeigh(3)<<std::endl;
+			for (unsigned int j = 0;j < 4;j++){
+				//std::cout<<"         Entering neighbour "<<j<<std::endl;
+				if (tet4Tmp->getNeigh(j) == 0){
+					//std::cout<<"         Test Passed "<<std::endl;
+					//find the 4th point,and fill the two vector of the boundary triangle
+					faceXtetFM fxtTmp(tet4Tmp,j);
+					//std::cout<<"         fxtTmp created "<<std::endl;
+					for (int k = 0;k < 3;k++){
+						//std::cout<<"            Entering Point "<<k<<std::endl;
+						MVertex* toTest = fxtTmp.v[k];
+						if (toTest->onWhat()->dim() == 2){
+							//std::cout<<"               Passed First test "<<std::endl;
+							if(BoundaryVertices.find(toTest) == BoundaryVertices.end()){
+								//std::cout<<"                  Passed Second test "<<std::endl;
+								BoundaryVertices.insert(toTest);
+							}
+						}
+						//std::cout<<"            Exiting Point "<<k<<std::endl;
+					}
+					//			crackElements.push_back(rTmp->getMeshElement(j));
+				}
+				//std::cout<<"         Exiting neighbour "<<j<<std::endl;
+			}
+			//std::cout<<"      Exiting tet "<<rTmp->tetrahedra[i]->getNum()<<std::endl;
+		}
+		//std::cout<<"   Exiting region "<<rTmp->tag()<<std::endl;
+	}
+	//std::cout<<"Entering computeDistToOppSide"<<std::endl;
+	countdown = 0;
+	for(std::set<MVertex*>::iterator it = BoundaryVertices.begin(); it != BoundaryVertices.end(); it++){
+		countdown++;
+		//std::cout<<"   entering Bound Vert "<<(*it)->getNum()<<" it's the "<<countdown<<"st"<<std::endl;
+		MVertex* toCompute = (*it);
+		double resultTmp = computeDistToOppSide(toCompute);
+		int lastTmp = VertexToCorresp[toCompute].size() - 1;
+		//std::cout<<"            getEndNormal is "<<VertexToCorresp[toCompute][lastTmp]->getEndNormal().x()<<" ; "<<VertexToCorresp[toCompute][lastTmp]->getEndNormal().y()<<" ; "<<VertexToCorresp[toCompute][lastTmp]->getEndNormal().z()<<std::endl;
+		//std::cout<<"            getEndNormal is "<<VertexToCorresp[toCompute][lastTmp]->getEndNormal().x()<<" ; "<<VertexToCorresp[toCompute][lastTmp]->getEndNormal().y()<<" ; "<<VertexToCorresp[toCompute][lastTmp]->getEndNormal().z()<<std::endl;
+		//std::cout<<"            getEndNormal is "<<VertexToCorresp[toCompute][lastTmp]->getEndNormal().x()<<" ; "<<VertexToCorresp[toCompute][lastTmp]->getEndNormal().y()<<" ; "<<VertexToCorresp[toCompute][lastTmp]->getEndNormal().z()<<std::endl;
+//		std::cout<<"         Testing FaceXTet out of while third time "<<VertexToCorresp[toCompute][lastTmp]->getEndTriangle().t1->tet()->getNum()<<std::endl;
+		//std::cout<<"            LastTmp is "<<lastTmp<<std::endl;
+		//std::cout<<"            ToCompute is "<<toCompute->getNum()<<std::endl;
+		//std::cout<<"               ToCompute adress is "<<toCompute<<std::endl;
+		//std::cout<<"            VertexToCorresp[toCompute][lastTmp] is "<<VertexToCorresp[toCompute][lastTmp]<<std::endl;
+//		std::cout<<"            getEndTriangle is "<<VertexToCorresp[toCompute][lastTmp]->getEndTriangle()<<std::endl;
+//		std::cout<<"            t1 is "<<VertexToCorresp[toCompute][lastTmp]->getEndTriangle().t1<<std::endl;
+//		std::cout<<"            tet is "<<VertexToCorresp[toCompute][lastTmp]->getEndTriangle().t1->tet()<<std::endl;
+//		std::cout<<"         Testing FaceXTet out of while popo "<<VertexToCorresp[toCompute][lastTmp]->getEndTriangle().t1->tet()->getNum()<<std::endl;
+		//std::cout<<"     size of AllDistToOppSide is "<<AllDistToOppSide.size()<<std::endl;
+		//std::cout<<"            LastTmp is "<<lastTmp<<std::endl;
+		//std::cout<<"            ToCompute is "<<toCompute->getNum()<<std::endl;
+		//std::cout<<"               ToCompute adress is "<<toCompute<<std::endl;
+		//std::cout<<"            VertexToCorresp[toCompute][lastTmp] is "<<VertexToCorresp[toCompute][lastTmp]<<std::endl;
+//		std::cout<<"            getEndTriangle is "<<VertexToCorresp[toCompute][lastTmp]->getEndTriangle()<<std::endl;
+		//std::cout<<"            getEndNormal is "<<VertexToCorresp[toCompute][lastTmp]->getEndNormal()<<std::endl;
+		//std::cout<<"            getEndNormal is "<<VertexToCorresp[toCompute][lastTmp]->getEndNormal().x()<<" ; "<<VertexToCorresp[toCompute][lastTmp]->getEndNormal().y()<<" ; "<<VertexToCorresp[toCompute][lastTmp]->getEndNormal().z()<<std::endl;
+		//std::cout<<"            getEndNormal is "<<VertexToCorresp[toCompute][lastTmp]->getEndNormal().x()<<" ; "<<VertexToCorresp[toCompute][lastTmp]->getEndNormal().y()<<" ; "<<VertexToCorresp[toCompute][lastTmp]->getEndNormal().z()<<std::endl;
+//		std::cout<<"            t1 is "<<VertexToCorresp[toCompute][lastTmp]->getEndTriangle().t1<<std::endl;
+//		std::cout<<"            tet is "<<VertexToCorresp[toCompute][lastTmp]->getEndTriangle().t1->tet()<<std::endl;
+		//std::cout<<"            VertexToCorresp[toCompute][lastTmp] is "<<VertexToCorresp[toCompute][lastTmp]<<std::endl;
+//		std::cout<<"            getEndTriangle is "<<VertexToCorresp[toCompute][lastTmp]->getEndTriangle()<<std::endl;
+		//std::cout<<"            getEndNormal is "<<VertexToCorresp[toCompute][lastTmp]->getEndNormal()<<std::endl;
+		//std::cout<<"            getEndNormal is "<<VertexToCorresp[toCompute][lastTmp]->getEndNormal().x()<<" ; "<<VertexToCorresp[toCompute][lastTmp]->getEndNormal().y()<<" ; "<<VertexToCorresp[toCompute][lastTmp]->getEndNormal().z()<<std::endl;
+//		std::cout<<"     VertexToCorresp[toCompute][lastTmp]->getEndTriangle().t1 adress is "<<&(VertexToCorresp[toCompute][lastTmp]->getEndTriangle().t1)<<std::endl;
+		//std::cout<<"            VertexToCorresp[toCompute][lastTmp] is "<<VertexToCorresp[toCompute][lastTmp]<<std::endl;
+//		std::cout<<"            getEndTriangle is "<<VertexToCorresp[toCompute][lastTmp]->getEndTriangle()<<std::endl;
+		//std::cout<<"            getEndNormal is "<<VertexToCorresp[toCompute][lastTmp]->getEndNormal()<<std::endl;
+		//std::cout<<"            getEndNormal is "<<VertexToCorresp[toCompute][lastTmp]->getEndNormal().x()<<" ; "<<VertexToCorresp[toCompute][lastTmp]->getEndNormal().y()<<" ; "<<VertexToCorresp[toCompute][lastTmp]->getEndNormal().z()<<std::endl;
+//		std::cout<<"     VertexToCorresp[toCompute][lastTmp]->getEndTriangle().t1 adress is "<<&(VertexToCorresp[toCompute][lastTmp]->getEndTriangle().t1)<<std::endl;
+		//std::cout<<"               ToCompute adress is "<<toCompute<<std::endl;
+//		std::cout<<"         Testing FaceXTet out of while popo 2 "<<VertexToCorresp[toCompute][lastTmp]->getEndTriangle().t1->tet()->getNum()<<std::endl;
+		AllDistToOppSide.insert(std::make_pair(toCompute, resultTmp));
+		//std::cout<<"     AllDistToOppSide[toCompute] is "<<AllDistToOppSide[toCompute]<<std::endl;
+		//std::cout<<"               ToCompute adress is "<<toCompute<<std::endl;
+		//std::cout<<"            VertexToCorresp[toCompute][lastTmp] is "<<VertexToCorresp[toCompute][lastTmp]<<std::endl;
+//		std::cout<<"            getEndTriangle is "<<VertexToCorresp[toCompute][lastTmp]->getEndTriangle()<<std::endl;
+		//std::cout<<"            getEndNormal is "<<VertexToCorresp[toCompute][lastTmp]->getEndNormal()<<std::endl;
+		//std::cout<<"            getEndNormal is "<<VertexToCorresp[toCompute][lastTmp]->getEndNormal().x()<<" ; "<<VertexToCorresp[toCompute][lastTmp]->getEndNormal().y()<<" ; "<<VertexToCorresp[toCompute][lastTmp]->getEndNormal().z()<<std::endl;
+//		std::cout<<"     VertexToCorresp[toCompute][lastTmp]->getEndTriangle().t1 adress is "<<&(VertexToCorresp[toCompute][lastTmp]->getEndTriangle().t1)<<std::endl;
+		//std::cout<<"               ToCompute adress is "<<toCompute<<std::endl;
+		//std::cout<<"            VertexToCorresp[toCompute][lastTmp] is "<<VertexToCorresp[toCompute][lastTmp]<<std::endl;
+//		std::cout<<"            getEndTriangle is "<<VertexToCorresp[toCompute][lastTmp]->getEndTriangle()<<std::endl;
+//		std::cout<<"     VertexToCorresp[toCompute][lastTmp]->getEndTriangle().t1 adress is "<<&(VertexToCorresp[toCompute][lastTmp]->getEndTriangle().t1)<<std::endl;
+		//std::cout<<"     AllDistToOppSide[toCompute] adress is "<<&AllDistToOppSide[toCompute]<<std::endl;
+		//std::cout<<"            VertexToCorresp[toCompute][lastTmp] is "<<VertexToCorresp[toCompute][lastTmp]<<std::endl;
+//		std::cout<<"            getEndTriangle is "<<VertexToCorresp[toCompute][lastTmp]->getEndTriangle()<<std::endl;
+//		std::cout<<"     VertexToCorresp[toCompute][lastTmp]->getEndTriangle().t1 adress is "<<&(VertexToCorresp[toCompute][lastTmp]->getEndTriangle().t1)<<std::endl;
+		//std::cout<<"            VertexToCorresp[toCompute][lastTmp] is "<<VertexToCorresp[toCompute][lastTmp]<<std::endl;
+//		std::cout<<"            getEndTriangle is "<<VertexToCorresp[toCompute][lastTmp]->getEndTriangle()<<std::endl;
+//		std::cout<<"     VertexToCorresp[toCompute][lastTmp]->getEndTriangle().t1 adress is "<<&(VertexToCorresp[toCompute][lastTmp]->getEndTriangle().t1)<<std::endl;
+		//std::cout<<"            VertexToCorresp[toCompute][lastTmp] is "<<VertexToCorresp[toCompute][lastTmp]<<std::endl;
+//		std::cout<<"            getEndTriangle is "<<VertexToCorresp[toCompute][lastTmp]->getEndTriangle()<<std::endl;
+//		std::cout<<"     VertexToCorresp[toCompute][lastTmp]->getEndTriangle().t1 adress is "<<&(VertexToCorresp[toCompute][lastTmp]->getEndTriangle().t1)<<std::endl;
+		//std::cout<<"            LastTmp is "<<lastTmp<<std::endl;
+		//std::cout<<"            ToCompute is "<<toCompute->getNum()<<std::endl;
+		//std::cout<<"               ToCompute adress is "<<toCompute<<std::endl;
+		//std::cout<<"            VertexToCorresp[toCompute][lastTmp] is "<<VertexToCorresp[toCompute][lastTmp]<<std::endl;
+//		std::cout<<"            getEndTriangle is "<<VertexToCorresp[toCompute][lastTmp]->getEndTriangle()<<std::endl;
+//		std::cout<<"            t1 is "<<VertexToCorresp[toCompute][lastTmp]->getEndTriangle().t1<<std::endl;
+//		std::cout<<"            tet is "<<VertexToCorresp[toCompute][lastTmp]->getEndTriangle().t1->tet()<<std::endl;
+//		std::cout<<"         Testing FaceXTet out of while popo 3 "<<VertexToCorresp[toCompute][lastTmp]->getEndTriangle().t1->tet()->getNum()<<std::endl;
+//		AllDistToOppSide[toCompute] = 0.0;
+//		std::cout<<"            LastTmp is "<<lastTmp<<std::endl;
+//		std::cout<<"            ToCompute is "<<toCompute->getNum()<<std::endl;
+//		std::cout<<"            getEndTriangle is "<<VertexToCorresp[toCompute][lastTmp]->getEndTriangle()<<std::endl;
+//		std::cout<<"            t1 is "<<VertexToCorresp[toCompute][lastTmp]->getEndTriangle().t1<<std::endl;
+//		std::cout<<"            tet is "<<VertexToCorresp[toCompute][lastTmp]->getEndTriangle().t1->tet()<<std::endl;
+//		std::cout<<"     size of AllDistToOppSide is "<<AllDistToOppSide.size()<<std::endl;
+//		std::cout<<"            LastTmp is "<<lastTmp<<std::endl;
+//		std::cout<<"            ToCompute is "<<toCompute->getNum()<<std::endl;
+//		std::cout<<"            getEndTriangle is "<<VertexToCorresp[toCompute][lastTmp]->getEndTriangle()<<std::endl;
+//		std::cout<<"            t1 is "<<VertexToCorresp[toCompute][lastTmp]->getEndTriangle().t1<<std::endl;
+//		std::cout<<"            tet is "<<VertexToCorresp[toCompute][lastTmp]->getEndTriangle().t1->tet()<<std::endl;
+		AllDistToOppSide[toCompute] = resultTmp;
+		//std::cout<<" observation "<<countdown<<std::endl;
+		//std::cout<<"            LastTmp is "<<lastTmp<<std::endl;
+		//std::cout<<"            ToCompute is "<<toCompute->getNum()<<std::endl;
+		//std::cout<<"            VertexToCorresp[toCompute][lastTmp] is "<<VertexToCorresp[toCompute][lastTmp]<<std::endl;
+//		std::cout<<"            getEndTriangle is "<<VertexToCorresp[toCompute][lastTmp]->getEndTriangle()<<std::endl;
+//		std::cout<<"            t1 is "<<VertexToCorresp[toCompute][lastTmp]->getEndTriangle().t1<<std::endl;
+//		std::cout<<"            tet is "<<VertexToCorresp[toCompute][lastTmp]->getEndTriangle().t1->tet()<<std::endl;
+//		std::cout<<"         Testing FaceXTet out of while bis repetita "<<VertexToCorresp[toCompute][lastTmp]->getEndTriangle().t1->tet()->getNum()<<std::endl;
+		for (std::map<MVertex*,double>::iterator allDistIt = AllDistToOppSide.begin();allDistIt != AllDistToOppSide.end();allDistIt++){
+			//std::cout<<"allDist of point "<<(*allDistIt).first->getNum()<<" with Pos "<<(*allDistIt).first->x()<<" ; "<<(*allDistIt).first->z()<<" ; "<<(*allDistIt).first->y()<<" is "<<(*allDistIt).second<<std::endl;
+			//std::cout<<"   Size of vertexToCorresp "<<VertexToCorresp[(*allDistIt).first].size()<<std::endl;
+			MVertex* toComputeTest = (*allDistIt).first;
+			//std::cout<<"   ToComputeTest is "<<toComputeTest->getNum()<<std::endl;
+			int lastTmpTest = VertexToCorresp[toComputeTest].size() - 1;
+//			std::cout<<"         Testing FaceXTet out of while ter repetita "<<VertexToCorresp[toComputeTest][lastTmpTest]->getEndTriangle().t1->tet()->getNum()<<std::endl;
+//			std::cout<<"      Testing FaceXTet out of while fourth time "<<VertexToCorresp[(*allDistIt).first][VertexToCorresp[(*allDistIt).first].size() - 1]->getEndTriangle().t1->tet()->getNum()<<std::endl;
+		}
+	}
+
+	//std::cout<<"first observation"<<std::endl;
+	for (std::map<MVertex*,double>::iterator allDistIt = AllDistToOppSide.begin();allDistIt != AllDistToOppSide.end();allDistIt++){
+		//std::cout<<"allDist of point "<<(*allDistIt).first->getNum()<<" with Pos "<<(*allDistIt).first->x()<<" ; "<<(*allDistIt).first->z()<<" ; "<<(*allDistIt).first->y()<<" is "<<(*allDistIt).second<<std::endl;
+		//std::cout<<"   Size of vertexToCorresp "<<VertexToCorresp[(*allDistIt).first].size()<<std::endl;
+//		std::cout<<"      Testing FaceXTet out of while fourth time "<<VertexToCorresp[(*allDistIt).first][VertexToCorresp[(*allDistIt).first].size() - 1]->getEndTriangle().t1->tet()->getNum()<<std::endl;
+	}
+
+	return AllDistToOppSide;
+}
+
+double GMSH_ThinLayerFixMeshPlugin::computeDistToOppSide(MVertex* v){
+	double DistToOppSide = 0.0;
+	//We assume v is on the boundary
+	//First we need to get the internal normal
+	//std::cout<<"      Entering ComputeDistToOppSide Function"<<std::endl;
+	SVector3 InteriorNormal = GMSH_ThinLayerFixMeshPlugin::computeInteriorNormal(v);
+	//std::cout<<"      Normal computed"<<std::endl;
+	//Then we find the first triangle
+	MTet4* FirstTet = GMSH_ThinLayerFixMeshPlugin::getTetFromPoint(v,InteriorNormal);
+	//std::cout<<"   FirstTet is tet "<<FirstTet->tet()->getNum()<<std::endl;
+	//std::cout<<"      got FirstTet"<<std::endl;
+	MTet4* CurrentTet = FirstTet;
+	//std::cout<<"      set currentTet"<<std::endl;
+	MTet4* PastTet = FirstTet;
+	//std::cout<<"      set PastTet"<<std::endl;
+	SPoint3 CurrentPos = SPoint3(v->x(),v->y(),v->z());
+	//std::cout<<"      set CurrentPos"<<std::endl;
+	SPoint3 LastPos = CurrentPos;
+	//std::cout<<"      set LasPos"<<std::endl;
+	int CurrentTriValue = 0;
+	int* CurrentTri = &CurrentTriValue;
+	//std::cout<<"      set CurrentTri"<<std::endl;
+	CorrespVerticesFixMesh* CVTemp = new CorrespVerticesFixMesh();
+	//std::cout<<"      Created CVTemp"<<std::endl;
+	CorrespVerticesFixMesh CVTemp2;
+	//std::cout<<"      Created CVTemp2"<<std::endl;
+	CVTemp->setStartPoint(v);
+	CVTemp2.setStartPoint(v);
+	//std::cout<<"      setStartPoint"<<std::endl;
+	CVTemp->setStartNormal(InteriorNormal);
+	CVTemp2.setStartNormal(InteriorNormal);
+	//std::cout<<"      setStartNormal"<<std::endl;
+	FindNewPoint((&CurrentPos),CurrentTri,&CurrentTet,InteriorNormal);
+	DistToOppSide += CurrentPos.distance(LastPos);
+	LastPos = CurrentPos;
+	//std::cout<<"      Found New Point"<<std::endl;
+//	faceXtetFM fxtCV(PastTet,(*CurrentTri));
+//	CVTemp->setEndTriangle(&fxtCV);
+//	while(CurrentTet->getNeigh((*CurrentTri)) != 0){
+	int countWhile = 0;
+	int prevprevtet = 1;
+	int prevtet = 2;
+	while((CurrentTet != 0) && (countWhile < 50)){
+		//std::cout<<"                                    Entering While"<<std::endl;
+		//std::cout<<"CurrentTet is "<<CurrentTet->tet()->getNum()<< "adress "<<CurrentTet<< " and currentTri "<<(*CurrentTri)<<std::endl;
+		//std::cout<<"currentPos is "<<CurrentPos.x()<<" ; "<<CurrentPos.y()<<" ; "<<CurrentPos.z()<<std::endl;
+		countWhile++;
+		faceXtetFM fxtCVtmp(PastTet,(*CurrentTri));
+		PastTet = CurrentTet;
+		CVTemp->setEndTrianglePoint1(PastTet->tet()->getVertex(faces[(*CurrentTri)][0]));
+		CVTemp->setEndTrianglePoint2(PastTet->tet()->getVertex(faces[(*CurrentTri)][1]));
+		CVTemp->setEndTrianglePoint3(PastTet->tet()->getVertex(faces[(*CurrentTri)][2]));
+		CVTemp2.setEndTrianglePoint1(PastTet->tet()->getVertex(faces[(*CurrentTri)][0]));
+		CVTemp2.setEndTrianglePoint2(PastTet->tet()->getVertex(faces[(*CurrentTri)][1]));
+		CVTemp2.setEndTrianglePoint3(PastTet->tet()->getVertex(faces[(*CurrentTri)][2]));
+//		CVTemp->setEndTriangle(fxtCVtmp);
+//		CVTemp2.setEndTriangle(fxtCVtmp);
+		//std::cout<<"         FaceXTetCreated"<<std::endl;
+		//std::cout<<"         Testing FaceXTet in while "<<fxtCVtmp.t1->tet()->getNum()<<std::endl;
+		//std::cout<<"            CurrentTet before FindNewPoint "<<CurrentTet<<std::endl;
+		FindNewPoint((&CurrentPos),CurrentTri,&CurrentTet,InteriorNormal);
+		//std::cout<<"            CurrentTet after FindNewPoint "<<CurrentTet<<std::endl;
+		//std::cout<<"         FoundNewPoint While"<<std::endl;
+//		CurrentTet = CurrentTet->getNeigh((*CurrentTri));
+//		//std::cout<<"         GotNeigh While"<<std::endl;
+		DistToOppSide += CurrentPos.distance(LastPos);
+		LastPos = CurrentPos;
+
+		if (CurrentTet != 0){
+			if ((CurrentTet->tet()->getNum()) == prevprevtet){
+				//std::cout<<"reached standstill"<<std::endl;
+				while (1){
+
+				}
+			}
+			prevprevtet = prevtet;
+			prevtet=CurrentTet->tet()->getNum();
+		}
+		//std::cout<<"                                    Exiting While"<<std::endl;
+	}
+	//std::cout<<"      Out Of While"<<std::endl;
+	CVTemp->setEndPoint(LastPos);
+	CVTemp2.setEndPoint(LastPos);
+	faceXtetFM fxtCV(PastTet,(*CurrentTri));
+	//std::cout<<"         Testing FaceXTet out of while "<<fxtCV.t1->tet()->getNum()<<std::endl;
+	CVTemp->setEndTrianglePoint1(PastTet->tet()->getVertex(faces[(*CurrentTri)][0]));
+	CVTemp->setEndTrianglePoint2(PastTet->tet()->getVertex(faces[(*CurrentTri)][1]));
+	CVTemp->setEndTrianglePoint3(PastTet->tet()->getVertex(faces[(*CurrentTri)][2]));
+	CVTemp2.setEndTrianglePoint1(PastTet->tet()->getVertex(faces[(*CurrentTri)][0]));
+	CVTemp2.setEndTrianglePoint2(PastTet->tet()->getVertex(faces[(*CurrentTri)][1]));
+	CVTemp2.setEndTrianglePoint3(PastTet->tet()->getVertex(faces[(*CurrentTri)][2]));
+//	CVTemp->setEndTriangle(fxtCV);
+//	CVTemp2.setEndTriangle(fxtCV);
+//	//std::cout<<"         Testing FaceXTet out of while second time "<<CVTemp->getEndTriangle().t1->tet()->getNum()<<std::endl;
+//	//std::cout<<"         Testing FaceXTet out of while second time CVTemp2 "<<CVTemp2.getEndTriangle().t1->tet()->getNum()<<std::endl;
+//	CVTemp->setEndTriangle(&fxtCV);
+//	SVector3 EndDir1(fxtCV.v[1]->x() - fxtCV.v[0]->x(),fxtCV.v[1]->y() - fxtCV.v[0]->y(),fxtCV.v[1]->z() - fxtCV.v[0]->z());
+//	SVector3 EndDir2(fxtCV.v[2]->x() - fxtCV.v[0]->x(),fxtCV.v[2]->y() - fxtCV.v[0]->y(),fxtCV.v[2]->z() - fxtCV.v[0]->z());
+//	SVector3 EndNormal(EndDir1.y() * EndDir2.z() - EndDir1.z() * EndDir2.y(),EndDir1.z() * EndDir2.x() - EndDir1.x() * EndDir2.z(),EndDir1.x() * EndDir2.y() - EndDir1.y() * EndDir2.x());
+	SVector3 EndNormal(-InteriorNormal.x(),-InteriorNormal.y(),-InteriorNormal.z());
+	EndNormal.normalize();
+	CVTemp->setEndNormal(EndNormal);
+	CVTemp2.setEndNormal(EndNormal);
+	CVTemp->setangleProd(fabs(CVTemp->getStartNormal().x() * CVTemp->getEndNormal().x() + CVTemp->getStartNormal().y() * CVTemp->getEndNormal().y() + CVTemp->getStartNormal().z() * CVTemp->getEndNormal().z()));
+	CVTemp2.setangleProd(fabs(CVTemp2.getStartNormal().x() * CVTemp2.getEndNormal().x() + CVTemp2.getStartNormal().y() * CVTemp2.getEndNormal().y() + CVTemp2.getStartNormal().z() * CVTemp2.getEndNormal().z()));
+	CVTemp->setdistP2P(DistToOppSide);
+	CVTemp2.setdistP2P(DistToOppSide);
+	if ((CVTemp->getangleProd() > angleMax) &&(CVTemp->getdistP2P() < distP2PMax)){
+		CVTemp->setActive(true);
+	}
+	else{
+		CVTemp->setActive(false);
+	}
+	if ((CVTemp2.getangleProd() > angleMax) &&(CVTemp2.getdistP2P() < distP2PMax)){
+		CVTemp2.setActive(true);
+	}
+	else{
+		CVTemp2.setActive(false);
+	}
+	CVTemp->setTagMaster(-2);
+	CVTemp2.setTagMaster(-2);
+	//std::cout<<"            getEndNormal is "<<CVTemp2.getEndNormal().x()<<" ; "<<CVTemp2.getEndNormal().y()<<" ; "<<CVTemp2.getEndNormal().z()<<std::endl;
+	//std::cout<<"            getEndNormal is "<<CVTemp2.getEndNormal().x()<<" ; "<<CVTemp2.getEndNormal().y()<<" ; "<<CVTemp2.getEndNormal().z()<<std::endl;
+
+	VertexToCorresp[v].push_back(CVTemp);
+//	VertexToCorresp[v].push_back(&CVTemp2);
+	//std::cout<<"              getEndNormal test is "<<VertexToCorresp[v][VertexToCorresp[v].size() - 1]->getEndNormal().x()<<" ; "<<VertexToCorresp[v][VertexToCorresp[v].size() - 1]->getEndNormal().y()<<" ; "<<VertexToCorresp[v][VertexToCorresp[v].size() - 1]->getEndNormal().z()<<std::endl;
+	//std::cout<<"              getEndNormal is "<<VertexToCorresp[v][VertexToCorresp[v].size() - 1]->getEndNormal().x()<<" ; "<<VertexToCorresp[v][VertexToCorresp[v].size() - 1]->getEndNormal().y()<<" ; "<<VertexToCorresp[v][VertexToCorresp[v].size() - 1]->getEndNormal().z()<<std::endl;
+	//std::cout<<"              getEndNormal is "<<VertexToCorresp[v][VertexToCorresp[v].size() - 1]->getEndNormal().x()<<" ; "<<VertexToCorresp[v][VertexToCorresp[v].size() - 1]->getEndNormal().y()<<" ; "<<VertexToCorresp[v][VertexToCorresp[v].size() - 1]->getEndNormal().z()<<std::endl;
+	//std::cout<<"              getEndNormal is "<<VertexToCorresp[v][VertexToCorresp[v].size() - 1]->getEndNormal().x()<<" ; "<<VertexToCorresp[v][VertexToCorresp[v].size() - 1]->getEndNormal().y()<<" ; "<<VertexToCorresp[v][VertexToCorresp[v].size() - 1]->getEndNormal().z()<<std::endl;
+
+	return DistToOppSide;
+}
+
+SVector3 GMSH_ThinLayerFixMeshPlugin::computeInteriorNormal(MVertex* v){
+	SPoint3 InteriorNormal(0.0,0.0,0.0);
+	//std::cout<<"         Entering computeInteriorNormal"<<std::endl;
+	std::vector<MTetrahedron*> currentVecTet = VertexToTets[v];
+	std::vector<SPoint3> vecInteriorNodes;
+	std::vector<SPoint3> vecFirstDir;
+	std::vector<SPoint3> vecSecondDir;
+	for (unsigned int i = 0;i < currentVecTet.size();i++){
+		//std::cout<<"            Entering for "<<i<<std::endl;
+		MTet4* tet4Tmp = TetToTet4[currentVecTet[i]];
+		for (int j = 0;j < 4 ; j++){
+			//std::cout<<"            Entering for "<<j<<std::endl;
+			if (tet4Tmp->getNeigh(j) == 0){
+				//std::cout<<"               Test Passed neigh zero "<<std::endl;
+				//find the 4th point,and fill the two vector of the boundary triangle
+				faceXtetFM fxtTmp(tet4Tmp,j);
+				//std::cout<<"               Face Created "<<j<<std::endl;
+				for (int k = 0;k < 4;k++){
+					//std::cout<<"                  Entering for "<<k<<std::endl;
+					bool foundInteriorPoint = true;
+					for (int l = 0;l < 3;l++){
+						if (tet4Tmp->tet()->getVertex(k) == fxtTmp.v[l]){
+							foundInteriorPoint = false;
+						}
+					}
+					if (foundInteriorPoint){
+						SPoint3 pointTmp(tet4Tmp->tet()->getVertex(k)->x(),tet4Tmp->tet()->getVertex(k)->y(),tet4Tmp->tet()->getVertex(k)->z());
+						vecInteriorNodes.push_back(pointTmp);
+					}
+				}
+				SPoint3 pointTmp1(fxtTmp.v[1]->x() - fxtTmp.v[0]->x(),fxtTmp.v[1]->y() - fxtTmp.v[0]->y(),fxtTmp.v[1]->z() - fxtTmp.v[0]->z());
+				SPoint3 pointTmp2(fxtTmp.v[2]->x() - fxtTmp.v[0]->x(),fxtTmp.v[2]->y() - fxtTmp.v[0]->y(),fxtTmp.v[2]->z() - fxtTmp.v[0]->z());
+				vecFirstDir.push_back(pointTmp1);
+				vecSecondDir.push_back(pointTmp2);
+			}
+		}
+	}
+	//std::cout<<"         Out of loop for "<<std::endl;
+	//at this point we have all the info necessary.
+	SPoint3 pointInteriorAverage(0.0,0.0,0.0);
+	for (unsigned int i = 0;i < vecInteriorNodes.size();i++){
+		pointInteriorAverage += SPoint3(vecInteriorNodes[i].x(),vecInteriorNodes[i].y(),vecInteriorNodes[i].z());
+//		pointInteriorAverage.x() += vecInteriorNodes[i].x();
+//		pointInteriorAverage.y() += vecInteriorNodes[i].y();
+//		pointInteriorAverage.z() += vecInteriorNodes[i].z();
+	}
+	pointInteriorAverage = SPoint3(pointInteriorAverage.x() / (double(vecInteriorNodes.size())),pointInteriorAverage.y() / (double(vecInteriorNodes.size())),pointInteriorAverage.z() / (double(vecInteriorNodes.size())));
+//	pointInteriorAverage.x() = pointInteriorAverage.x() / (double(vecInteriorNodes.size()));
+//	pointInteriorAverage.y() = pointInteriorAverage.y() / (double(vecInteriorNodes.size()));
+//	pointInteriorAverage.z() = pointInteriorAverage.z() / (double(vecInteriorNodes.size()));
+	SPoint3 dirInteriorAverage(pointInteriorAverage.x() - v->x(),pointInteriorAverage.y() - v->y(),pointInteriorAverage.z() - v->z());
+	double norme = sqrt(dirInteriorAverage.x() * dirInteriorAverage.x() + dirInteriorAverage.y() * dirInteriorAverage.y() + dirInteriorAverage.z() * dirInteriorAverage.z());
+	dirInteriorAverage = SPoint3(dirInteriorAverage.x() / norme,dirInteriorAverage.y() / norme,dirInteriorAverage.z() / norme);
+//	dirInteriorAverage.x() = dirInteriorAverage.x() / norme;
+//	dirInteriorAverage.y() = dirInteriorAverage.y() / norme;
+//	dirInteriorAverage.z() = dirInteriorAverage.z() / norme;
+	std::vector<SPoint3> vecOrthogDir;
+	for(unsigned int i = 0;i < vecFirstDir.size();i++){
+		SPoint3 pointTmp(vecFirstDir[i].y() * vecSecondDir[i].z() - vecFirstDir[i].z() * vecSecondDir[i].y(),vecFirstDir[i].z() * vecSecondDir[i].x() - vecFirstDir[i].x() * vecSecondDir[i].z(),vecFirstDir[i].x() * vecSecondDir[i].y() - vecFirstDir[i].y() * vecSecondDir[i].x());
+		vecOrthogDir.push_back(pointTmp);
+	}
+	for(unsigned int i = 0;i < vecOrthogDir.size();i++){
+		double prodScalTmp = vecOrthogDir[i].x() * dirInteriorAverage.x() + vecOrthogDir[i].y() * dirInteriorAverage.y() + vecOrthogDir[i].z() * dirInteriorAverage.z();
+		if (prodScalTmp < 0.0){
+			vecOrthogDir[i] = SPoint3(- vecOrthogDir[i].x(),- vecOrthogDir[i].y(),- vecOrthogDir[i].z());
+//			vecOrthogDir[i].x() = - vecOrthogDir[i].x();
+//			vecOrthogDir[i].y() = - vecOrthogDir[i].y();
+//			vecOrthogDir[i].z() = - vecOrthogDir[i].z();
+		}
+		double normeTmp = sqrt(vecOrthogDir[i].x() * vecOrthogDir[i].x() + vecOrthogDir[i].y() * vecOrthogDir[i].y() + vecOrthogDir[i].z() * vecOrthogDir[i].z());
+		vecOrthogDir[i] = SPoint3(vecOrthogDir[i].x() / normeTmp,vecOrthogDir[i].y() / normeTmp,vecOrthogDir[i].z() / normeTmp);
+//		vecOrthogDir[i].x() = vecOrthogDir[i].x() / normeTmp;
+//		vecOrthogDir[i].y() = vecOrthogDir[i].y() / normeTmp;
+//		vecOrthogDir[i].z() = vecOrthogDir[i].z() / normeTmp;
+		InteriorNormal += SPoint3(vecOrthogDir[i].x(),vecOrthogDir[i].y(),vecOrthogDir[i].z());
+//		InteriorNormal.x() += vecOrthogDir[i].x();
+//		InteriorNormal.y() += vecOrthogDir[i].y();
+//		InteriorNormal.z() += vecOrthogDir[i].z();
+	}
+	norme = sqrt(InteriorNormal.x() * InteriorNormal.x() + InteriorNormal.y() * InteriorNormal.y() + InteriorNormal.z() * InteriorNormal.z());
+	InteriorNormal = SPoint3(InteriorNormal.x() / norme,InteriorNormal.y() / norme,InteriorNormal.z() / norme);
+//	InteriorNormal.x() = InteriorNormal.x() / norme;
+//	InteriorNormal.y() = InteriorNormal.y() / norme;
+//	InteriorNormal.z() = InteriorNormal.z() / norme;
+	return InteriorNormal;
+}
+
+MTet4* GMSH_ThinLayerFixMeshPlugin::getTetFromPoint(MVertex* v, SVector3 InteriorNormal){
+	MTet4* TetToGet = 0;
+	std::vector<MTetrahedron*> currentVecTet = VertexToTets[v];
+	//std::cout<<"   entering getTetFromPoint, vertex "<<v->x()<<" ; "<<v->y()<<" ; "<<v->z()<<" and dir "<<InteriorNormal.x()<<" ; "<<InteriorNormal.y()<<" ; "<<InteriorNormal.z()<<std::endl;
+	for (unsigned int i = 0;i < currentVecTet.size();i++){
+		std::vector<SVector3> vecDir;
+		for (int j = 0;j < 4 ; j++){
+			if (currentVecTet[i]->getVertex(j) != v){
+				SVector3 DirTmp(currentVecTet[i]->getVertex(j)->x() - v->x(),currentVecTet[i]->getVertex(j)->y() - v->y(),currentVecTet[i]->getVertex(j)->z() - v->z());
+				vecDir.push_back(DirTmp);
+			}
+		}
+		bool IsPositiv = GMSH_ThinLayerFixMeshPlugin::IsPositivOrientation(vecDir[0],vecDir[1],vecDir[2]);
+		if (!IsPositiv){
+			SVector3 DirTmp1 = vecDir[1];
+			SVector3 DirTmp2 = vecDir[0];
+			SVector3 DirTmp3 = vecDir[2];
+			vecDir.clear();
+			vecDir.push_back(DirTmp1);
+			vecDir.push_back(DirTmp2);
+			vecDir.push_back(DirTmp3);
+		}
+		bool isPositiv1 = GMSH_ThinLayerFixMeshPlugin::IsPositivOrientation(vecDir[0],vecDir[1],InteriorNormal);
+		bool isPositiv2 = GMSH_ThinLayerFixMeshPlugin::IsPositivOrientation(vecDir[1],vecDir[2],InteriorNormal);
+		bool isPositiv3 = GMSH_ThinLayerFixMeshPlugin::IsPositivOrientation(vecDir[2],vecDir[0],InteriorNormal);
+		if (isPositiv1){
+			if (isPositiv2){
+				if (isPositiv3){
+					TetToGet = TetToTet4[currentVecTet[i]];
+					//std::cout<<"      Found one fitting ! "<<TetToGet->tet()->getNum()<<std::endl;
+				}
+			}
+		}
+	}
+	//std::cout<<"   exiting getTetFromPoint with result "<<TetToGet<<std::endl;
+	//std::cout<<"   getTetFromPoint is tet "<<TetToGet->tet()->getNum()<<std::endl;
+	return TetToGet;
+}
+
+bool GMSH_ThinLayerFixMeshPlugin::IsPositivOrientation(SVector3 a, SVector3 b, SVector3 c){
+	bool result = false;
+	SPoint3 ProdVec(a.y() * b.z() - a.z() * b.y(),a.z() * b.x() - a.x() * b.z(),a.x() * b.y() - a.y() * b.x());
+	double ProdScal = ProdVec.x() * c.x() + ProdVec.y() * c.y() + ProdVec.z() * c.z();
+	if (ProdScal >= 0.0){
+		result = true;
+	}
+	return result;
+}
+
+
+void GMSH_ThinLayerFixMeshPlugin::FindNewPoint(SPoint3* CurrentPoint, int* CurrentTri, MTet4** CurrentTet, SVector3 InteriorNormal){
+	double distanceP2P = 0.0;
+	double alphaMax;
+	double betaMax;
+	SPoint3 ResultPoint;
+	int triToGet = -1;
+	//std::cout<<"   Entered FindNewPoint"<<std::endl;
+	for (unsigned int n = 0;n < 4 ; n++){
+		//calculer matrice a inverser
+		faceXtetFM fxt((*CurrentTet),n);
+		double a = fxt.v[1]->x() - fxt.v[0]->x();
+		double b = fxt.v[2]->x() - fxt.v[0]->x();
+		double c = InteriorNormal.x();
+		double d = fxt.v[1]->y() - fxt.v[0]->y();
+		double e = fxt.v[2]->y() - fxt.v[0]->y();
+		double f = InteriorNormal.y();
+		double g = fxt.v[1]->z() - fxt.v[0]->z();
+		double h = fxt.v[2]->z() - fxt.v[0]->z();
+		double i = InteriorNormal.z();
+		//produit matrice inverse par vecteur donne poids
+		double detMat = a * e * i  + b * f * g + c * d * h - c * e * g - f * h * a - i * b * d;
+		double ai = e * i - f * h;
+		double bi = c * h - b * i;
+		double ci = b * f - c * e;
+		double di = f * g - d * i;
+		double ei = a * i - c * g;
+		double fi = c * d - a * f;
+//		double gi = d * h - e * g;
+//		double hi = b * g - a * h;
+//		double ii = a * e - b * d;
+		double oppx = (*CurrentPoint).x() - fxt.v[0]->x();
+		double oppy = (*CurrentPoint).y() - fxt.v[0]->y();
+		double oppz = (*CurrentPoint).z() - fxt.v[0]->z();
+		double alpha = ai / detMat * oppx + bi / detMat * oppy + ci / detMat * oppz;
+		double beta = di / detMat * oppx + ei / detMat * oppy + fi / detMat * oppz;
+//		double gamma = gi / detMat * oppx + hi / detMat * oppy + ii / detMat * oppz;
+		//Test si poids entre 0 et 1 et si length maximale
+		if ((alpha >= (0.0-epsilon)) && (alpha <= (1.0 + epsilon))){
+			if ((beta >= (0.0-epsilon)) && (beta <= (1.0 + epsilon))){
+				if (((1.0 - alpha - beta) >= (0.0-epsilon)) && ((1.0 - alpha - beta) <= (1.0 + epsilon))){
+					SPoint3 PointTmp(fxt.v[0]->x() + alpha * (fxt.v[1]->x() - fxt.v[0]->x()) + beta * (fxt.v[2]->x() - fxt.v[0]->x()),fxt.v[0]->y() + alpha * (fxt.v[1]->y() - fxt.v[0]->y()) + beta * (fxt.v[2]->y() - fxt.v[0]->y()),fxt.v[0]->z() + alpha * (fxt.v[1]->z() - fxt.v[0]->z()) + beta * (fxt.v[2]->z() - fxt.v[0]->z()));
+					double distanceTmp = PointTmp.distance((*CurrentPoint));
+					if (distanceTmp > distanceP2P){
+						distanceP2P = distanceTmp;
+						ResultPoint = PointTmp;
+						triToGet = n;
+						alphaMax = alpha;
+						betaMax = beta;
+					}
+				}
+			}
+		}
+	}
+	//std::cout<<"   End of For loop"<<std::endl;
+	//test si trop proche d'un point / une arete
+	if (((alphaMax < epsilon) && (betaMax < epsilon)) || ((alphaMax < epsilon) && ((1.0 - alphaMax - betaMax) < epsilon)) || (((1.0 - alphaMax - betaMax) < epsilon) && (betaMax < epsilon))){
+		//proche d'un point
+		//std::cout<<"      Close to point"<<std::endl;
+		double DistMinTmp = 10000000.0;
+		int indexMinTmp;
+		for (unsigned int i = 0;i < 4;i++){
+			double distanceTmp = sqrt(((*CurrentTet)->tet()->getVertex(i)->x() - ResultPoint.x()) * ((*CurrentTet)->tet()->getVertex(i)->x() - ResultPoint.x()) + ((*CurrentTet)->tet()->getVertex(i)->y() - ResultPoint.y()) * ((*CurrentTet)->tet()->getVertex(i)->y() - ResultPoint.y()) + ((*CurrentTet)->tet()->getVertex(i)->z() - ResultPoint.z()) * ((*CurrentTet)->tet()->getVertex(i)->z() - ResultPoint.z()));
+			if (distanceTmp < DistMinTmp){
+				DistMinTmp = distanceTmp;
+				indexMinTmp = i;
+			}
+		}
+		////std::cout<<"NewTet before is "<<NewTet<<std::endl;
+		MTet4* NewTet = GMSH_ThinLayerFixMeshPlugin::getTetFromPoint((*CurrentTet)->tet()->getVertex(indexMinTmp),InteriorNormal);
+		//std::cout<<"NewTet after is "<<NewTet<<std::endl;
+		SPoint3 PointTmp((*CurrentTet)->tet()->getVertex(indexMinTmp)->x(),(*CurrentTet)->tet()->getVertex(indexMinTmp)->y(),(*CurrentTet)->tet()->getVertex(indexMinTmp)->z());
+		(*CurrentPoint) = PointTmp;
+		(*CurrentTet) = NewTet;
+	}
+	else if ((alphaMax < epsilon) || (betaMax < epsilon) || ((1.0 - alphaMax - betaMax) < epsilon)){
+		//trop proche d'une arete
+		//std::cout<<"      Close to edge"<<std::endl;
+	}
+	else{
+		//std::cout<<"      Close to nothing"<<std::endl;
+		//std::cout<<"      ResultPoint is "<<ResultPoint.x()<<"; "<<ResultPoint.y()<<"; "<<ResultPoint.z()<<"; "<<" and tritoget is "<<triToGet<<std::endl;
+		//std::cout<<"      CurrentPoint is "<<(*CurrentPoint).x()<<"; "<<(*CurrentPoint).y()<<"; "<<(*CurrentPoint).z()<<std::endl;
+		(*CurrentPoint) = ResultPoint;
+		//std::cout<<"      test 1"<<std::endl;
+		//std::cout<<"      CurrentTri is "<<(*CurrentTri)<<std::endl;
+		(*CurrentTri) = triToGet;
+		//std::cout<<"      test 2"<<std::endl;
+		//std::cout<<"      CurrentTet is "<<(*CurrentTet)<<" and has neighbours "<< (*CurrentTet)->getNeigh(0)<<" ; "<< (*CurrentTet)->getNeigh(1)<<" ; "<< (*CurrentTet)->getNeigh(2)<<" ; "<< (*CurrentTet)->getNeigh(3)<<std::endl;
+		(*CurrentTet) = (*CurrentTet)->getNeigh(triToGet);
+		//std::cout<<"      CurrentTet has been changed to "<<(*CurrentTet)<<std::endl;
+		//std::cout<<"      test 3"<<std::endl;
+	}
+	//std::cout<<"   Exit FindNewPoint"<<std::endl;
+}
+
+void GMSH_ThinLayerFixMeshPlugin::fillVertexToTets(){
+	GModel *m = GModel::current();
+	for (GModel::riter itr= m->firstRegion();itr != m->lastRegion();itr++){
+		GRegion* rTmp = (*itr);
+		for (unsigned int i = 0; i < rTmp->tetrahedra.size();i++){
+			MTetrahedron* elem = rTmp->tetrahedra[i];
+			for (unsigned int j = 0; j < 4;j++){
+				std::vector<MTetrahedron*> emptyTetVec;
+				emptyTetVec.clear();
+				VertexToTets[elem->getVertex(j)] = emptyTetVec;
+				std::vector<CorrespVerticesFixMesh*> emptyCVVec;
+				emptyCVVec.clear();
+				VertexToCorresp[elem->getVertex(j)] = emptyCVVec;
+			}
+		}
+	}
+	for (GModel::riter itr= m->firstRegion();itr != m->lastRegion();itr++){
+		GRegion* rTmp = (*itr);
+		for (unsigned int i = 0; i < rTmp->tetrahedra.size();i++){
+			MTetrahedron* elem = rTmp->tetrahedra[i];
+			for (unsigned int j = 0; j < 4;j++){
+				VertexToTets[elem->getVertex(j)].push_back(elem);
+			}
+		}
+	}
+}
+
+static void setLcsFM(MTriangle *t, std::map<MVertex*, double> &vSizes,
+                   std::set<MVertex*> &bndVertices)
+{
+  for(int i = 0; i < 3; i++){
+    bndVertices.insert(t->getVertex(i));
+    MEdge e = t->getEdge(i);
+    MVertex *vi = e.getVertex(0);
+    MVertex *vj = e.getVertex(1);
+    double dx = vi->x()-vj->x();
+    double dy = vi->y()-vj->y();
+    double dz = vi->z()-vj->z();
+    double l = sqrt(dx * dx + dy * dy + dz * dz);
+    std::map<MVertex*,double>::iterator iti = vSizes.find(vi);
+    std::map<MVertex*,double>::iterator itj = vSizes.find(vj);
+    // use largest edge length
+    if (iti == vSizes.end() || iti->second < l) vSizes[vi] = l;
+    if (itj == vSizes.end() || itj->second < l) vSizes[vj] = l;
+  }
+}
+
+static void setLcsFM(MTetrahedron *t, std::map<MVertex*, double> &vSizes,
+                   std::set<MVertex*> &bndVertices)
+{
+  for (int i = 0; i < 4; i++){
+    for (int j = i + 1; j < 4; j++){
+      MVertex *vi = t->getVertex(i);
+      MVertex *vj = t->getVertex(j);
+      double dx = vi->x()-vj->x();
+      double dy = vi->y()-vj->y();
+      double dz = vi->z()-vj->z();
+      double l = sqrt(dx * dx + dy * dy + dz * dz);
+      std::map<MVertex*,double>::iterator iti = vSizes.find(vi);
+      std::map<MVertex*,double>::iterator itj = vSizes.find(vj);
+      std::set<MVertex*>::iterator itvi = bndVertices.find(vi);
+      std::set<MVertex*>::iterator itvj = bndVertices.find(vj);
+      // smallest tet edge
+      if (itvi == bndVertices.end() &&
+          (iti == vSizes.end() || iti->second > l)) vSizes[vi] = l;
+      if (itvj == bndVertices.end() &&
+          (itj == vSizes.end() || itj->second > l)) vSizes[vj] = l;
+    }
+  }
+}
+
+void GMSH_ThinLayerFixMeshPlugin::fillTetToTet4(){
+	GModel *m = GModel::current();
+	std::vector<double> vSizes;
+	std::vector<double> vSizesBGM;
+	MTet4Factory myFactory(1600000);
+	std::set<MTet4*, compareTet4Ptr> &allTets = myFactory.getAllTets();
+	std::set<MTet4*, compareTet4Ptr> activeTets;
+	int NUM = 0;
+
+	for (GModel::riter itr= m->firstRegion();itr != m->lastRegion();itr++){
+		GRegion* gr = (*itr);
+		{ // leave this in a block so the map gets deallocated directly
+			std::map<MVertex*, double> vSizesMap;
+			std::set<MVertex*> bndVertices;
+			for(GModel::fiter it = gr->model()->firstFace(); it != gr->model()->lastFace(); ++it){
+				GFace *gf = *it;
+				for(unsigned int i = 0; i < gf->triangles.size(); i++){
+					setLcsFM(gf->triangles[i], vSizesMap, bndVertices);
+				}
+			}
+			for(unsigned int i = 0; i < gr->tetrahedra.size(); i++)
+				setLcsFM(gr->tetrahedra[i], vSizesMap, bndVertices);
+			for(std::map<MVertex*, double>::iterator it = vSizesMap.begin();
+					it != vSizesMap.end(); ++it){
+				it->first->setIndex(NUM++);
+				vSizes.push_back(it->second);
+				vSizesBGM.push_back(it->second);
+			}
+		}
+		for(unsigned int i = 0; i < gr->tetrahedra.size(); i++)
+		{
+			MTet4* currentTet4 = myFactory.Create(gr->tetrahedra[i], vSizes,vSizesBGM);
+			TetToTet4[gr->tetrahedra[i]] = currentTet4;
+			allTets.insert(currentTet4);
+		}
+	}
+
+
+	std::vector<MTet4*> vecAllTet4;
+	vecAllTet4.clear();
+	for (std::set<MTet4*, compareTet4Ptr>::iterator itTp = allTets.begin();itTp != allTets.end();itTp++){
+		vecAllTet4.push_back((*itTp));
+//		//std::cout<<"inserted "<<(*itTp)->tet()->getNum()<<std::endl;
+	}
+	connectTets(vecAllTet4);
+
+
+
+//	GModel *m = GModel::current();
+//	std::vector<MTet4*> vecAllTet4;
+//	vecAllTet4.clear();
+//	for (GModel::riter itr= m->firstRegion();itr != m->lastRegion();itr++){
+//		GRegion* rTmp = (*itr);
+//		for (unsigned int i = 0; i < rTmp->tetrahedra.size();i++){
+//			MTetrahedron* elem = rTmp->tetrahedra[i];
+//			MTet4 tet4tmp = MTet4(elem,0.0);
+//			MTet4* currentTet4 = &tet4tmp;
+//			TetToTet4[elem] = currentTet4;
+//			vecAllTet4.push_back(currentTet4);
+//		}
+//	}
+//	connectTets(vecAllTet4);
+}
+
+/****************static declarations****************/
+
+std::map<MVertex*,std::vector<MTetrahedron*> > GMSH_ThinLayerFixMeshPlugin::VertexToTets;
+std::map<MTetrahedron*,MTet4*> GMSH_ThinLayerFixMeshPlugin::TetToTet4;
+std::map<MVertex*,std::vector<CorrespVerticesFixMesh*> > GMSH_ThinLayerFixMeshPlugin::VertexToCorresp;
+std::vector<std::vector<CorrespVerticesFixMesh*> > GMSH_ThinLayerFixMeshPlugin::vecOfThinSheets;
+
diff --git a/Plugin/ThinLayerFixMesh.h b/Plugin/ThinLayerFixMesh.h
new file mode 100644
index 0000000000000000000000000000000000000000..ad412189247c0534e2d5bc7f62e3edcf17a35d74
--- /dev/null
+++ b/Plugin/ThinLayerFixMesh.h
@@ -0,0 +1,178 @@
+/*
+ * ThinLayerFixMesh.h
+ *
+ *  Created on: Oct 13, 2014
+ *      Author: nicolas
+ */
+
+#ifndef THINLAYERFIXMESH_H_
+#define THINLAYERFIXMESH_H_
+
+#include "Plugin.h"
+#include "MVertex.h"
+#include "MTriangle.h"
+#include "meshGRegionDelaunayInsertion.h"
+
+extern "C"
+{
+  GMSH_Plugin *GMSH_RegisterThinLayerFixMeshPlugin();
+}
+
+static int faces[4][3] = {{0,1,2}, {0,2,3}, {0,3,1}, {1,3,2}};
+
+struct faceXtetFM{
+  MVertex *v[3],*unsorted[3];
+  MTet4 *t1;
+  int i1;
+  faceXtetFM(MTet4 *_t=0, int iFac=0) : t1(_t), i1(iFac)
+  {
+//	  std::cout<<"entering faceXTet"<<std::endl;
+//	  std::cout<<"tag of tet is "<<t1->tet()->getNum()<<std::endl;
+//	  std::cout<<"first vec of tet is "<<t1->tet()->getVertex(0)->getNum()<<std::endl;
+//	  std::cout<<"second vec of tet is "<<t1->tet()->getVertex(1)->getNum()<<std::endl;
+//	  std::cout<<"third vec of tet is "<<t1->tet()->getVertex(2)->getNum()<<std::endl;
+//	  std::cout<<"fourth vec of tet is "<<t1->tet()->getVertex(3)->getNum()<<std::endl;
+    MVertex *v0 = t1->tet()->getVertex(faces[iFac][0]);
+//    std::cout<<"after first vert"<<std::endl;
+    MVertex *v1 = t1->tet()->getVertex(faces[iFac][1]);
+//    std::cout<<"after second vert"<<std::endl;
+    MVertex *v2 = t1->tet()->getVertex(faces[iFac][2]);
+//    std::cout<<"after third vert"<<std::endl;
+
+    unsorted[0] = v0;
+//    std::cout<<"after first unsorted"<<std::endl;
+    unsorted[1] = v1;
+//    std::cout<<"after second unsorted"<<std::endl;
+    unsorted[2] = v2;
+//    std::cout<<"after third unsorted"<<std::endl;
+
+    v[0] = std::min(std::min(v0,v1),v2);
+//    std::cout<<"after min"<<std::endl;
+    v[2] = std::max(std::max(v0,v1),v2);
+//    std::cout<<"after max"<<std::endl;
+    v[1] = (v0 != v[0] && v0 != v[2]) ? v0 : (v1 != v[0] && v1 != v[2]) ? v1 : v2;
+//    std::cout<<"after minimax"<<std::endl;
+    //
+    //    std::sort(v, v + 3);
+  }
+
+  inline MVertex * getVertex (int i) const { return unsorted[i];}
+
+ inline bool operator < (const faceXtetFM & other) const
+  {
+    if (v[0] < other.v[0]) return true;
+    if (v[0] > other.v[0]) return false;
+    if (v[1] < other.v[1]) return true;
+    if (v[1] > other.v[1]) return false;
+    if (v[2] < other.v[2]) return true;
+    return false;
+  }
+  inline bool operator == (const faceXtetFM & other) const
+  {
+    return (v[0] == other.v[0] &&
+	    v[1] == other.v[1] &&
+	    v[2] == other.v[2] );
+  }
+  bool visible (MVertex *v){
+    MVertex* v0 = t1->tet()->getVertex(faces[i1][0]);
+    MVertex* v1 = t1->tet()->getVertex(faces[i1][1]);
+    MVertex* v2 = t1->tet()->getVertex(faces[i1][2]);
+    double a[3] = {v0->x(),v0->y(),v0->z()};
+    double b[3] = {v1->x(),v1->y(),v1->z()};
+    double c[3] = {v2->x(),v2->y(),v2->z()};
+    double d[3] = {v->x(),v->y(),v->z()};
+    double o = robustPredicates :: orient3d(a,b,c,d);
+    return o < 0;
+  }
+};
+
+class CorrespVerticesFixMesh{
+private:
+	MVertex* StartPoint;
+	SPoint3 EndPoint;
+	SVector3 StartNormal;
+	SVector3 EndNormal;
+	MVertex* EndTrianglePoint1;
+	MVertex* EndTrianglePoint2;
+	MVertex* EndTrianglePoint3;
+//	faceXtetFM EndTriangle;
+	double distP2P;
+	double angleProd;
+	bool Active;
+	bool EndTriangleActive;
+	bool IsMaster;
+	int tagMaster;
+public:
+	CorrespVerticesFixMesh();
+	~CorrespVerticesFixMesh();
+	void setStartPoint(MVertex* v);
+	void setEndPoint(SPoint3 p);
+	void setStartNormal(SVector3 v);
+	void setEndNormal(SVector3 v);
+//	void setEndTriangle(faceXtetFM f);
+	void setEndTrianglePoint1(MVertex* v);
+	void setEndTrianglePoint2(MVertex* v);
+	void setEndTrianglePoint3(MVertex* v);
+	void setdistP2P(double d);
+	void setangleProd(double a);
+	void setActive(bool b);
+	void setEndTriangleActive(bool b);
+	void setIsMaster(bool b);
+	void setTagMaster(int i);
+	MVertex* getStartPoint();
+	SPoint3 getEndPoint();
+	SVector3 getStartNormal();
+	SVector3 getEndNormal();
+//	faceXtetFM getEndTriangle();
+	MVertex* getEndTrianglePoint1();
+	MVertex* getEndTrianglePoint2();
+	MVertex* getEndTrianglePoint3();
+	double getdistP2P();
+	double getangleProd();
+	bool getActive();
+	bool getEndTriangleActive();
+	bool getIsMaster();
+	int getTagMaster();
+};
+
+class GMSH_ThinLayerFixMeshPlugin : public GMSH_PostPlugin
+{
+private:
+public:
+	GMSH_ThinLayerFixMeshPlugin(){}
+	//~GMSH_ThinLayerFixMeshPlugin();
+	std::string getName() const { return "ThinLayerFixMesh"; }
+	std::string getShortHelp() const
+	{
+		return "Fix the mesh in thin parts";
+	}
+	std::string getHelp() const;
+	int getNbOptions() const;
+	StringXNumber* getOption(int iopt);
+	PView *execute(PView *);
+	static void perform();
+	static void checkOppositeTriangles();
+	static void fillvecOfThinSheets();
+	static std::map<MVertex*,double> computeAllDistToOppSide();
+	static double computeDistToOppSide(MVertex* v);
+	static SVector3 computeInteriorNormal(MVertex* v);
+	static MTet4* getTetFromPoint(MVertex* v, SVector3 InteriorNormal);
+	static bool IsPositivOrientation(SVector3 a, SVector3 b, SVector3 c);
+	static void FindNewPoint(SPoint3* CurrentPoint, int* CurrentTri, MTet4** CurrentTet, SVector3 InteriorNormal);
+	static std::map<MVertex*,std::vector<MTetrahedron*> > VertexToTets;
+	static std::map<MTetrahedron*,MTet4*> TetToTet4;
+	static std::map<MVertex*,std::vector<CorrespVerticesFixMesh*> > VertexToCorresp;
+	static std::vector<std::vector<CorrespVerticesFixMesh*> > vecOfThinSheets;
+//	static const double epsilon = 0.00001;
+	static const double epsilon = 0.00000000001;
+	static const double angleMax = 0.9;
+//	static const double distP2PMax = 0.3;
+	static const double distP2PMax = 5.0;
+	static void fillVertexToTets();
+	static void fillTetToTet4();
+};
+
+
+
+
+#endif /* THINLAYERFIXMESH_H_ */