diff --git a/Mesh/Levy3D.cpp b/Mesh/Levy3D.cpp
index a6fe2d97b96538483f00e0b233a3e472c64a592e..3e294fab56647230feed73e30ef2f23244fc9386 100644
--- a/Mesh/Levy3D.cpp
+++ b/Mesh/Levy3D.cpp
@@ -1336,11 +1336,15 @@ double LpCVT::df_dz(SPoint3 p1,SPoint3 p2,Tensor t,int p){
 }
 
 SVector3 LpCVT::bisectors3(SVector3 dIdC,SPoint3 C,SPoint3 x0,SPoint3 x1,SPoint3 x2,SPoint3 x3){
+  double e;
   fullMatrix<double> A(3,3);
   fullMatrix<double> B(3,3);
   fullMatrix<double> M(3,3);
   fullMatrix<double> _dIdC(1,3);
   fullMatrix<double> _val(1,3);
+  
+  e = 0.000000001;	
+	
   A(0,0) = x1.x() - x0.x();
   A(0,1) = x1.y() - x0.y();
   A(0,2) = x1.z() - x0.z();
@@ -1350,7 +1354,22 @@ SVector3 LpCVT::bisectors3(SVector3 dIdC,SPoint3 C,SPoint3 x0,SPoint3 x1,SPoint3
   A(2,0) = x3.x() - x0.x();
   A(2,1) = x3.y() - x0.y();
   A(2,2) = x3.z() - x0.z();
+  
+  if(fabs(A.determinant())<e){
+    srand(time(NULL));
+    A(0,0) = A(0,0) + e*((double)rand())/((double)RAND_MAX);
+    A(0,1) = A(0,1) + e*((double)rand())/((double)RAND_MAX);
+    A(0,2) = A(0,2) + e*((double)rand())/((double)RAND_MAX);
+    A(1,0) = A(1,0) + e*((double)rand())/((double)RAND_MAX);
+    A(1,1) = A(1,1) + e*((double)rand())/((double)RAND_MAX);
+    A(1,2) = A(1,2) + e*((double)rand())/((double)RAND_MAX);
+    A(2,0) = A(2,0) + e*((double)rand())/((double)RAND_MAX);
+    A(2,1) = A(2,1) + e*((double)rand())/((double)RAND_MAX);
+    A(2,2) = A(2,2) + e*((double)rand())/((double)RAND_MAX);
+  }
+
   A.invertInPlace();
+
   B(0,0) = C.x() - x0.x();
   B(0,1) = C.y() - x0.y();
   B(0,2) = C.z() - x0.z();
@@ -1360,11 +1379,14 @@ SVector3 LpCVT::bisectors3(SVector3 dIdC,SPoint3 C,SPoint3 x0,SPoint3 x1,SPoint3
   B(2,0) = C.x() - x0.x();
   B(2,1) = C.y() - x0.y();
   B(2,2) = C.z() - x0.z();
+  
   A.mult_naive(B,M);
+  
   _dIdC(0,0) = dIdC.x();
   _dIdC(0,1) = dIdC.y();
   _dIdC(0,2) = dIdC.z();
   _dIdC.mult_naive(M,_val);
+  
   return SVector3(_val(0,0),_val(0,1),_val(0,2));
 }
 
@@ -1374,6 +1396,7 @@ SVector3 LpCVT::bisectors2(SVector3 dIdC,SPoint3 C,SPoint3 x0,SPoint3 x1,SPoint3
   fullMatrix<double> M(3,3);
   fullMatrix<double> _dIdC(1,3);
   fullMatrix<double> _val(1,3);
+  
   A(0,0) = x1.x() - x0.x();
   A(0,1) = x1.y() - x0.y();
   A(0,2) = x1.z() - x0.z();
@@ -1383,7 +1406,9 @@ SVector3 LpCVT::bisectors2(SVector3 dIdC,SPoint3 C,SPoint3 x0,SPoint3 x1,SPoint3
   A(2,0) = normal1.x();
   A(2,1) = normal1.y();
   A(2,2) = normal1.z();
+  
   A.invertInPlace();
+  
   B(0,0) = C.x() - x0.x();
   B(0,1) = C.y() - x0.y();
   B(0,2) = C.z() - x0.z();
@@ -1393,11 +1418,14 @@ SVector3 LpCVT::bisectors2(SVector3 dIdC,SPoint3 C,SPoint3 x0,SPoint3 x1,SPoint3
   B(2,0) = 0.0;
   B(2,1) = 0.0;
   B(2,2) = 0.0;
+  
   A.mult_naive(B,M);
+  
   _dIdC(0,0) = dIdC.x();
   _dIdC(0,1) = dIdC.y();
   _dIdC(0,2) = dIdC.z();
   _dIdC.mult_naive(M,_val);
+  
   return SVector3(_val(0,0),_val(0,1),_val(0,2));
 }
 
@@ -1407,6 +1435,7 @@ SVector3 LpCVT::bisectors1(SVector3 dIdC,SPoint3 C,SPoint3 x0,SPoint3 x1,SVector
   fullMatrix<double> M(3,3);
   fullMatrix<double> _dIdC(1,3);
   fullMatrix<double> _val(1,3);
+  
   A(0,0) = x1.x() - x0.x();
   A(0,1) = x1.y() - x0.y();
   A(0,2) = x1.z() - x0.z();
@@ -1416,7 +1445,9 @@ SVector3 LpCVT::bisectors1(SVector3 dIdC,SPoint3 C,SPoint3 x0,SPoint3 x1,SVector
   A(2,0) = normal2.x();
   A(2,1) = normal2.y();
   A(2,2) = normal2.z();
+  
   A.invertInPlace();
+  
   B(0,0) = C.x() - x0.x();
   B(0,1) = C.y() - x0.y();
   B(0,2) = C.z() - x0.z();
@@ -1426,11 +1457,14 @@ SVector3 LpCVT::bisectors1(SVector3 dIdC,SPoint3 C,SPoint3 x0,SPoint3 x1,SVector
   B(2,0) = 0.0;
   B(2,1) = 0.0;
   B(2,2) = 0.0;
+  
   A.mult_naive(B,M);
+  
   _dIdC(0,0) = dIdC.x();
   _dIdC(0,1) = dIdC.y();
   _dIdC(0,2) = dIdC.z();
   _dIdC.mult_naive(M,_val);
+  
   return SVector3(_val(0,0),_val(0,1),_val(0,2));
 }