diff --git a/NonLinearSolver/internalPoints/ipMullinsEffect.cpp b/NonLinearSolver/internalPoints/ipMullinsEffect.cpp
index 99537d3102cd264b3588efe24307825c24f6ad8b..a8044ed2a3ec3b7a636b416bf31dafad014d55f6 100644
--- a/NonLinearSolver/internalPoints/ipMullinsEffect.cpp
+++ b/NonLinearSolver/internalPoints/ipMullinsEffect.cpp
@@ -11,7 +11,7 @@
 #include "ipMullinsEffect.h"
 
 IPMullinsEffect::IPMullinsEffect(): eta(1.0), DetaDpsi(0.), DDetaDpsipsi(0.), DetaDT(0.), DDetaDTT(0.), psiMax(0.), 
-                                    DpsiNew_DpsiMax(0.), DDpsiNew_DpsiMaxDpsi(0.), DDpsiNew_DpsiMaxDT(0.)
+                                    DpsiNew_DpsiMax(0.), DDpsiNew_DpsiMaxDpsi(0.), DDpsiNew_DpsiMaxDT(0.), DpsiMax_Dpsi(0.)
 {
 }
 
@@ -26,6 +26,7 @@ IPMullinsEffect::IPMullinsEffect(const IPMullinsEffect &source)
   DpsiNew_DpsiMax = source.DpsiNew_DpsiMax;
   DDpsiNew_DpsiMaxDpsi = source.DDpsiNew_DpsiMaxDpsi;
   DDpsiNew_DpsiMaxDT = source.DDpsiNew_DpsiMaxDT;
+  DpsiMax_Dpsi = source.DpsiMax_Dpsi;
 }
 
 IPMullinsEffect &IPMullinsEffect::operator=(const IPMullinsEffect &source)
@@ -39,6 +40,7 @@ IPMullinsEffect &IPMullinsEffect::operator=(const IPMullinsEffect &source)
   DpsiNew_DpsiMax = source.DpsiNew_DpsiMax;
   DDpsiNew_DpsiMaxDpsi = source.DDpsiNew_DpsiMaxDpsi;
   DDpsiNew_DpsiMaxDT = source.DDpsiNew_DpsiMaxDT;
+  DpsiMax_Dpsi = source.DpsiMax_Dpsi;
   return *this;
 }
 
@@ -53,5 +55,6 @@ void IPMullinsEffect::restart()
   restartManager::restart(DpsiNew_DpsiMax);
   restartManager::restart(DDpsiNew_DpsiMaxDpsi);
   restartManager::restart(DDpsiNew_DpsiMaxDT);
+  restartManager::restart(DpsiMax_Dpsi);
   return;
 }
diff --git a/NonLinearSolver/internalPoints/ipMullinsEffect.h b/NonLinearSolver/internalPoints/ipMullinsEffect.h
index 460699d19c96d16b2b92ddb95baa3ba5de859995..cbd10de2be8f724bf69a8a96d7a5d1867a7ce692 100644
--- a/NonLinearSolver/internalPoints/ipMullinsEffect.h
+++ b/NonLinearSolver/internalPoints/ipMullinsEffect.h
@@ -25,6 +25,7 @@ class IPMullinsEffect{
     double DpsiNew_DpsiMax;
     double DDpsiNew_DpsiMaxDpsi;
     double DDpsiNew_DpsiMaxDT;
+    double DpsiMax_Dpsi;
 
   public:
     IPMullinsEffect();
@@ -44,6 +45,7 @@ class IPMullinsEffect{
     virtual double getDpsiNew_DpsiMax() const{ return DpsiNew_DpsiMax;};
     virtual double getDDpsiNew_DpsiMaxDpsi() const{ return DDpsiNew_DpsiMaxDpsi;};
     virtual double getDDpsiNew_DpsiMaxDT() const{ return DDpsiNew_DpsiMaxDT;};
+    virtual double getDpsiMax_Dpsi() const{ return DpsiMax_Dpsi;};
     virtual void set(const double &_eta, const double &_DetaDpsi, const double& _DDetaDpsipsi, 
                      const double& _DetaDT, const double& _DDetaDTT,
                      const double& _DpsiNew_DpsiMax, const double& _DDpsiNew_DpsiMaxDpsi, const double& _DDpsiNew_DpsiMaxDT)
@@ -60,6 +62,9 @@ class IPMullinsEffect{
     virtual void setPsiMax(const double &_psiMax){
       psiMax = _psiMax;  
     }
+    virtual void setDpsiMax_Dpsi(const double &_DpsiMax_Dpsi){
+      DpsiMax_Dpsi = _DpsiMax_Dpsi;
+    }
 };
 
 
diff --git a/NonLinearSolver/internalPoints/ipNonLinearTVM.cpp b/NonLinearSolver/internalPoints/ipNonLinearTVM.cpp
index 9a2db9172fee0a70a0281008f9a03b75261b46f8..cd70e403b1808d18a74c9a01e4e2b51df52b7586 100644
--- a/NonLinearSolver/internalPoints/ipNonLinearTVM.cpp
+++ b/NonLinearSolver/internalPoints/ipNonLinearTVM.cpp
@@ -21,7 +21,7 @@ IPNonLinearTVM::IPNonLinearTVM(const J2IsotropicHardening* comp,
                      _psiMax(0.), _mullinsDamage(0.), _DpsiDT(0.), _DpsiDE(0.), _DmullinsDamage_Dpsi_cap(0.), _DmullinsDamage_DT(0.), _P_cap(0.),
                      _pressure(0.), _Av_TVE(1.), _Bd_TVE(1.), _dAv_dTrEe(0.), _dBd_dTrEe(0.), _dAv_dTrEe_TVE(0.), _intAv_TVE(0.), _intBd_TVE(0.), 
                      _intAv_1_TVE(0.), _intBd_1_TVE(0.), _intAv_2_TVE(0.), _intBd_2_TVE(0.), _dBd_dDevEe(0.), _dBd_dDevEe_TVE(0.),
-                     _viscousDissipatedEnergy(0.), _mullinsDissipatedEnergy(0.){
+                     _viscousDissipatedEnergy(0.), _mullinsDissipatedEnergy(0.), _psiInfCorrector(0.){
         
     _DA_DT.clear(); _DDA_DTT.clear(); 
     _DA_DtrE.clear(); _DDA_DTDtrE.clear();
@@ -76,7 +76,7 @@ IPNonLinearTVM::IPNonLinearTVM(const IPNonLinearTVM& src): IPHyperViscoElastoPla
             _dBd_dDevEe(src._dBd_dDevEe), _dBd_dDevEe_TVE(src._dBd_dDevEe_TVE),
             _Av_TVE_vector(src._Av_TVE_vector), _Bd_TVE_vector(src._Bd_TVE_vector), _dAv_dTrEe_TVE_vector(src._dAv_dTrEe_TVE_vector), _dBd_dTrEe_TVE_vector(src._dBd_dTrEe_TVE_vector),
             _intAv_TVE_vector(src._intAv_TVE_vector), _intBd_TVE_vector(src._intBd_TVE_vector), _dBd_dDevEe_TVE_vector(src._dBd_dDevEe_TVE_vector),
-            _viscousDissipatedEnergy(src._viscousDissipatedEnergy), _mullinsDissipatedEnergy(src._mullinsDissipatedEnergy){
+            _viscousDissipatedEnergy(src._viscousDissipatedEnergy), _mullinsDissipatedEnergy(src._mullinsDissipatedEnergy), _psiInfCorrector(src._psiInfCorrector){
                 
     if (src._ipMullinsEffect != NULL)
         _ipMullinsEffect = dynamic_cast<IPMullinsEffect*>(src._ipMullinsEffect->clone());
@@ -146,6 +146,7 @@ IPNonLinearTVM& IPNonLinearTVM::operator=(const IPVariable& src)
     _dBd_dDevEe_TVE_vector = psrc->_dBd_dDevEe_TVE_vector;
     _viscousDissipatedEnergy = psrc->_viscousDissipatedEnergy;
     _mullinsDissipatedEnergy = psrc->_mullinsDissipatedEnergy;
+    _psiInfCorrector = psrc->_psiInfCorrector;
     
     if ( psrc->_ipMullinsEffect != NULL) {
       if (_ipMullinsEffect == NULL){
@@ -229,6 +230,7 @@ void IPNonLinearTVM::restart(){
   restartManager::restart(_dBd_dDevEe_TVE_vector);
   restartManager::restart(_viscousDissipatedEnergy);
   restartManager::restart(_mullinsDissipatedEnergy);
+  restartManager::restart(_psiInfCorrector);
   
   if (_ipMullinsEffect != NULL)
    restartManager::restart(_ipMullinsEffect);
diff --git a/NonLinearSolver/internalPoints/ipNonLinearTVM.h b/NonLinearSolver/internalPoints/ipNonLinearTVM.h
index feaafe8519e6b5765b624d7f7767e7d8e3fcc844..9b7ada89f44c0d0f634509549357e0531b1899e5 100644
--- a/NonLinearSolver/internalPoints/ipNonLinearTVM.h
+++ b/NonLinearSolver/internalPoints/ipNonLinearTVM.h
@@ -34,6 +34,7 @@ class IPNonLinearTVM : public IPHyperViscoElastoPlastic{
         double _trCorKirinf_TVE;
         STensor3 _devCorKirinf_TVE;
         STensor3 _corKirExtra;
+        double _psiInfCorrector;
         double _pressure;
         double _dAv_dTrEe, _dBd_dTrEe;
         double _Av_TVE, _Bd_TVE, _dAv_dTrEe_TVE;
diff --git a/NonLinearSolver/materialLaw/j2IsotropicHardening.cpp b/NonLinearSolver/materialLaw/j2IsotropicHardening.cpp
index 527b927e285b178e9e8951b80c4b08eb2c56bb90..3626c2fa8a6e1f6eb7897f71e9784e506474b472 100644
--- a/NonLinearSolver/materialLaw/j2IsotropicHardening.cpp
+++ b/NonLinearSolver/materialLaw/j2IsotropicHardening.cpp
@@ -2773,7 +2773,296 @@ J2IsotropicHardening* LinearFollowedByExponentialFollowedByMultiplePowerLawJ2Iso
   return new LinearFollowedByExponentialFollowedByMultiplePowerLawJ2IsotropicHardening(*this);
 }
 
+LinearFollowedByMultipleSwiftJ2IsotropicHardening::LinearFollowedByMultipleSwiftJ2IsotropicHardening(const int num,  double yield0, double h0, double p1, double h1, double n1, double p2, double h2, double n2, bool init):
+    J2IsotropicHardening(num,yield0,init), _h0(h0), _h1(h1), _h2(h2), _n1(n1), _n2(n2), _p1(p1), _p2(p2)
+{
+  if(h0 < 0. or h1 < 0. or h2 < 0. or n1 < 0. or n2 < 0. or p1 <= 0. or p2 < p1) Msg::Error("LinearFollowedByMultipleSwiftJ2IsotropicHardening :: negative or unsuitable hardening parameters");
+  _temFunc_h0 = new constantScalarFunction(1.);
+  _temFunc_h1 = new constantScalarFunction(1.);
+  _temFunc_h2 = new constantScalarFunction(1.);
+  _temFunc_n1 = new constantScalarFunction(1.);
+  _temFunc_n2 = new constantScalarFunction(1.);
+}
+
+LinearFollowedByMultipleSwiftJ2IsotropicHardening::LinearFollowedByMultipleSwiftJ2IsotropicHardening(const LinearFollowedByMultipleSwiftJ2IsotropicHardening &source) :
+    J2IsotropicHardening(source)
+{
+  _h0 = source._h0;
+  _h1 = source._h1;
+  _h2 = source._h2;
+  _n1 = source._n1;
+  _n2 = source._n2;
+  _p1 = source._p1;
+  _p2 = source._p2;
+
+  _temFunc_h0 = NULL;
+  if (source._temFunc_h0 != NULL){
+    _temFunc_h0 = source._temFunc_h0->clone();
+  }
+  _temFunc_h1 = NULL;
+  if (source._temFunc_h1 != NULL){
+    _temFunc_h1 = source._temFunc_h1->clone();
+  }
+  _temFunc_h2 = NULL;
+  if (source._temFunc_h2 != NULL){
+    _temFunc_h2 = source._temFunc_h2->clone();
+  }
+  _temFunc_n1 = NULL;
+  if (source._temFunc_n1 != NULL){
+	 _temFunc_n1 = source._temFunc_n1->clone();
+  }
+  _temFunc_n2 = NULL;
+  if (source._temFunc_n2 != NULL){
+	 _temFunc_n2 = source._temFunc_n2->clone();
+  }
+}
+
+LinearFollowedByMultipleSwiftJ2IsotropicHardening& LinearFollowedByMultipleSwiftJ2IsotropicHardening::operator=(const J2IsotropicHardening &source)
+{
+  J2IsotropicHardening::operator=(source);
+  const LinearFollowedByMultipleSwiftJ2IsotropicHardening* src = dynamic_cast<const LinearFollowedByMultipleSwiftJ2IsotropicHardening*>(&source);
+  if(src != NULL)
+  {
+	_h0 = src->_h0;
+    _h1 = src->_h1;
+    _h2 = src->_h2;
+    _n1 = src->_n1;
+    _n2 = src->_n2;
+    _p1 = src->_p1;
+    _p2 = src->_p2;
+
+    if (src->_temFunc_h0 != NULL){
+      if (_temFunc_h0 != NULL){
+        _temFunc_h0->operator=(*src->_temFunc_h0);
+      }
+      else{
+        _temFunc_h0 = src->_temFunc_h0->clone();
+      }
+    }
+
+    if (src->_temFunc_h1 != NULL){
+      if (_temFunc_h1 != NULL){
+        _temFunc_h1->operator=(*src->_temFunc_h1);
+      }
+      else{
+        _temFunc_h1 = src->_temFunc_h1->clone();
+      }
+    }
+
+    if (src->_temFunc_h2 != NULL){
+      if (_temFunc_h2 != NULL){
+        _temFunc_h2->operator=(*src->_temFunc_h2);
+      }
+      else{
+        _temFunc_h2 = src->_temFunc_h2->clone();
+      }
+    }
+
+    if (src->_temFunc_n1 != NULL){
+      if (_temFunc_n1 != NULL){
+    	  _temFunc_n1->operator=(*src->_temFunc_n1);
+      }
+      else{
+    	  _temFunc_n1 = src->_temFunc_n1->clone();
+      }
+    }
 
+    if (src->_temFunc_n2 != NULL){
+      if (_temFunc_n2 != NULL){
+    	  _temFunc_n2->operator=(*src->_temFunc_n2);
+      }
+      else{
+    	  _temFunc_n2 = src->_temFunc_n2->clone();
+      }
+    }
+  }
+  return *this;
+}
+
+LinearFollowedByMultipleSwiftJ2IsotropicHardening::~LinearFollowedByMultipleSwiftJ2IsotropicHardening(){
+  if (_temFunc_h0 != NULL) {delete _temFunc_h0; _temFunc_h0 = NULL;};
+  if (_temFunc_h1 != NULL) {delete _temFunc_h1; _temFunc_h1 = NULL;};
+  if (_temFunc_h2 != NULL) {delete _temFunc_h2; _temFunc_h2 = NULL;};
+  if (_temFunc_n1 != NULL) {delete _temFunc_n1; _temFunc_n1 = NULL;};
+  if (_temFunc_n2 != NULL) {delete _temFunc_n2; _temFunc_n2 = NULL;};
+};
+
+void LinearFollowedByMultipleSwiftJ2IsotropicHardening::setTemperatureFunction_h0(const scalarFunction& Tfunc){
+  if (_temFunc_h0 != NULL) delete _temFunc_h0;
+  _temFunc_h0 = Tfunc.clone();
+}
+void LinearFollowedByMultipleSwiftJ2IsotropicHardening::setTemperatureFunction_h1(const scalarFunction& Tfunc){
+  if (_temFunc_h1 != NULL) delete _temFunc_h1;
+  _temFunc_h1 = Tfunc.clone();
+}
+void LinearFollowedByMultipleSwiftJ2IsotropicHardening::setTemperatureFunction_h2(const scalarFunction& Tfunc){
+  if (_temFunc_h2 != NULL) delete _temFunc_h2;
+  _temFunc_h2 = Tfunc.clone();
+}
+void LinearFollowedByMultipleSwiftJ2IsotropicHardening::setTemperatureFunction_n1(const scalarFunction& Tfunc){
+  if (_temFunc_n1 != NULL) delete _temFunc_n1;
+  _temFunc_n1 = Tfunc.clone();
+}
+void LinearFollowedByMultipleSwiftJ2IsotropicHardening::setTemperatureFunction_n2(const scalarFunction& Tfunc){
+  if (_temFunc_n2 != NULL) delete _temFunc_n2;
+  _temFunc_n2 = Tfunc.clone();
+}
+
+
+void LinearFollowedByMultipleSwiftJ2IsotropicHardening::createIPVariable(IPJ2IsotropicHardening* &ipv) const
+{
+  if(ipv != NULL) delete ipv;
+  ipv = new IPLinearFollowedByExponentialJ2IsotropicHardening(getYield0());
+}
+
+void LinearFollowedByMultipleSwiftJ2IsotropicHardening::hardening(double p0, const IPJ2IsotropicHardening &ipvprev, double p, IPJ2IsotropicHardening &ipv) const
+{
+  double R0 = getYield0();
+  double R = R0;
+  double dR(0.), ddR(0.), intR(0.), dRdT(0.), ddRdTT(0.),ddRdT(0.);
+  if (ipvprev.isSaturated()){
+    R = ipvprev.getR();
+    dR = 0.;
+    ddR = 0.;
+    intR = ipvprev.getIntegR()+ R*(p-p0);
+  }
+  else {
+
+    if(p < 1.e-16) // Elastic case
+    {
+      R = getYield0();
+      dR = _h0;
+      ddR = 0.;
+    }
+    else if (p <= _p1) // Plastic case: linear part
+    {
+      R += _h0*p;
+      dR = _h0;
+      ddR = 0.;
+      intR = R0*p + 0.5*_h0*p*p;
+    }
+    else if (_p1 < p and p <= _p2)// Plastic case: Swift1
+    {
+      double temp0 = R0 + _h0*p;
+      double pp = 1.+ _h1*(p-_p1);
+      R = temp0*pow(pp,_n1);
+      dR = _h0*pow(pp,_n1) + temp0*_h1*_n1*pow(pp,_n1-1);
+      ddR = 2*_h0*_h1*_n1*pow(pp,_n1-1) + _h1*_h1*(_n1-1)*_n1*temp0*pow(pp,_n1-2);
+      intR = ( pow(pp,_n1+1) * (_h1*(_h0*((_n1+1)*p+_p1)+R0*(_n1+2))-_h0) ) / (_h1*_h1*(_n1+1)*(_n1+2));
+    }
+    else{
+      double temp0 = R0 + _h0*p;
+      double temp1 = temp0*pow(1.+_h1*(p-_p1), _n1);
+      double pp = 1.+_h2*(p-_p2);
+      R = temp1*pow(pp,_n2);
+
+      double Dtemp0 = _h0;
+      double Dtemp1 = Dtemp0*pow(1.+_h1*(p-_p1), _n1) + temp0*_h1*_n1*pow(1.+_h1*(p-_p1), _n1-1);
+      double DDtemp1 = 2*Dtemp0*_h1*_n1*pow(1.+_h1*(p-_p1), _n1-1) + temp0*_h1*_h1*_n1*(_n1-1)*pow(1.+_h1*(p-_p1), _n1-2);
+      dR = Dtemp1*pow(pp,_n2) + temp1*_h2*_n2*pow(pp,_n2-1);
+      ddR = DDtemp1*pow(pp,_n2) + 2*Dtemp1*_h2*_n2*pow(pp,_n2-1) + temp1*_h2*_h2*_n2*(_n2-1)*pow(pp,_n2-2);
+      intR = ipvprev.getIntegR()+ 0.5*(R+ipvprev.getR())*(p-p0); // approximation
+    }
+  }
+  ipv.set(R0,R,dR,ddR,intR,dRdT,ddRdTT,ddRdT);
+}
+//-----------------------------added
+void LinearFollowedByMultipleSwiftJ2IsotropicHardening::hardening(double p0, const IPJ2IsotropicHardening &ipvprev, double p,double T, IPJ2IsotropicHardening &ipv) const
+{
+  double R0 = getYield0(T);
+  double R = R0;
+  double dR(0.), ddR(0.), intR(0.),dRdT(0.),ddRdTT(0.),ddRdT(0.);
+  if (ipvprev.isSaturated()){
+    R = ipvprev.getR();
+    dR = 0.;
+    ddR = 0.;
+    intR = ipvprev.getIntegR()+ R*(p-p0);
+  }
+  else {
+	double h0 = _h0*_temFunc_h0->getVal(T);
+    double h1 = _h1*_temFunc_h1->getVal(T);
+    double h2 = _h2*_temFunc_h2->getVal(T);
+    double n1 = _n1*_temFunc_n1->getVal(T);
+    double n2 = _n2*_temFunc_n2->getVal(T);
+    double dh0dT=_h0*_temFunc_h0->getDiff(T);
+    double ddh0dTT=_h0*_temFunc_h0->getDoubleDiff(T);
+    double dh1dT=_h1*_temFunc_h1->getDiff(T);
+    double ddh1dTT=_h1*_temFunc_h1->getDoubleDiff(T);
+    double dh2dT=_h2*_temFunc_h2->getDiff(T);
+    double ddh2dTT=_h2*_temFunc_h2->getDoubleDiff(T);
+    double dn1dT=_n1*_temFunc_n1->getDiff(T);
+    double ddn1dTT=_n1*_temFunc_n1->getDoubleDiff(T);
+    double dn2dT=_n2*_temFunc_n2->getDiff(T);
+    double ddn2dTT=_n2*_temFunc_n2->getDoubleDiff(T);
+    if(p < 1.e-16) // Elastic case
+    {
+      R = getYield0(T);
+      dR = h0;
+      ddR = 0.;
+      dRdT = getDYield0DT(T);
+      ddRdTT = getDDYield0DTT(T);
+    }
+    else if (p <= _p1) // Plastic case: linear part
+    {
+      R = R0 + h0*p;
+      dR = h0;
+      ddR = 0.;
+      intR = R0*p + 0.5*h0*p*p;
+
+      dRdT=getDYield0DT(T)+dh0dT*p;
+      ddRdTT=getDDYield0DTT(T)+ddh0dTT*p;
+    }
+    else if (_p1 < p and p <= _p2)// Plastic case: Swift1
+    {
+      // _n1 and _n2 are assumed to be independent of T
+      double temp0 = R0 + h0*p;
+      double pp = 1.+ h1*(p-_p1);
+      R = temp0*pow(pp,n1);
+      dR = h0*pow(pp,n1) + temp0*h1*n1*pow(pp,n1-1);
+      ddR = 2*h0*h1*n1*pow(pp,n1-1) + h1*h1*(n1-1)*n1*temp0*pow(pp,n1-2);
+      intR = ( pow(pp,n1+1) * (h1*(h0*((n1+1)*p+_p1)+R0*(n1+2))-h0) ) / (h1*h1*(n1+1)*(n1+2));
+
+      double Dtemp0DT = getDYield0DT(T) + dh0dT*p;
+      double DDtemp0DTT = getDDYield0DTT(T) + ddh0dTT*p;
+      double DppDT = dh1dT*(p-_p1);
+      double DDppDTT = ddh1dTT*(p-_p1);
+      dRdT = Dtemp0DT*pow(pp,n1) + temp0*DppDT*n1*pow(pp,n1-1);
+      ddRdTT = DDtemp0DTT*pow(pp,n1) + 2*Dtemp0DT*DppDT*n1*pow(pp,n1-1) + temp0*(DDppDTT*n1*pow(pp,n1-1)+DppDT*DppDT*n1*(n1-1)*pow(pp,n1-2));
+    }
+    else{
+        double temp0 = R0 + h0*p;
+        double temp1 = temp0*pow(1.+h1*(p-_p1), n1);
+        double pp0 = 1.+h1*(p-_p1);
+        double pp = 1.+h2*(p-_p2);
+        R = temp1*pow(pp,n2);
+
+        double Dtemp0 = h0;
+        double Dtemp1 = Dtemp0*pow(1.+h1*(p-_p1), n1) + temp0*h1*n1*pow(1.+h1*(p-_p1), n1-1);
+        double DDtemp1 = 2*Dtemp0*h1*n1*pow(1.+h1*(p-_p1), n1-1) + temp0*h1*h1*n1*(n1-1)*pow(1.+h1*(p-_p1), n1-2);
+        dR = Dtemp1*pow(pp,n2) + temp1*h2*n2*pow(pp, n2-1);
+        ddR = DDtemp1*pow(pp,n2) + 2*Dtemp1*h2*n2*pow(pp, n2-1) + temp1*h2*h2*n2*(n2-1)*pow(pp,n2-2);
+        intR = ipvprev.getIntegR()+ 0.5*(R+ipvprev.getR())*(p-p0); // approximation
+
+        double Dtemp0DT = getDYield0DT(T) + dh0dT*p;
+        double DDtemp0DTT = getDDYield0DTT(T) + ddh0dTT*p;
+        double Dpp0DT = dh1dT*(p-_p1);
+        double DDpp0DTT = ddh1dTT*(p-_p1);
+        double DppDT = dh2dT*(p-_p2);
+        double DDppDTT = ddh2dTT*(p-_p2);
+        double Dtemp1DT = Dtemp0DT*pow(pp0, n1) + temp0*Dpp0DT*n1*pow(pp0,n1-1);
+        double DDtemp1DTT = DDtemp0DTT*pow(pp0,n1) + 2*Dtemp0DT*Dpp0DT*n1*pow(pp0,n1-1) + temp0*(DDpp0DTT*n1*pow(pp0,n1-1)+Dpp0DT*Dpp0DT*n1*(n1-1)*pow(pp0,n1-2));
+        dRdT = Dtemp1DT*pow(pp,n2) + temp1*DppDT*n2*pow(pp,n2-1);
+        ddRdTT = DDtemp1DTT*pow(pp,n2) + 2*Dtemp1DT*DppDT*n2*pow(pp,n2-1) + temp1*(DDppDTT*n2*pow(pp,n2-1)+DppDT*DppDT*n2*(n2-1)*pow(pp,n2-2));
+    }
+  }
+  ipv.set(R0,R,dR,ddR,intR,dRdT,ddRdTT,ddRdT);
+}
+
+//----------------------------end
+J2IsotropicHardening* LinearFollowedByMultipleSwiftJ2IsotropicHardening::clone() const
+{
+  return new LinearFollowedByMultipleSwiftJ2IsotropicHardening(*this);
+}
 
 
 
diff --git a/NonLinearSolver/materialLaw/j2IsotropicHardening.h b/NonLinearSolver/materialLaw/j2IsotropicHardening.h
index 4448a1c24fb85230b4e51a2df454362b39aa8a02..b09afc3ccf896ad71920c817fa634a8deb649eba 100644
--- a/NonLinearSolver/materialLaw/j2IsotropicHardening.h
+++ b/NonLinearSolver/materialLaw/j2IsotropicHardening.h
@@ -26,7 +26,7 @@ class J2IsotropicHardening{
                      linearFollowedByExponentialJ2IsotropicHardening, linearFollowedByPowerLawJ2IsotropicHardening,
                      polynomialJ2IsotropicHardening,
                      twoExpJ2IsotropicHaderning, tanhJ2IsotropicHaderning,gursonJ2IsotropicHardening, multipleSwiftJ2IsotropicHardening,
-                     linearExponentialFollowedBySwiftLawJ2IsotropicHardening,LinearFollowedByExponentialFollowedByMultiplePowerLawJ2IsotropicHardening,
+                     linearExponentialFollowedBySwiftLawJ2IsotropicHardening,LinearFollowedByExponentialFollowedByMultiplePowerLawJ2IsotropicHardening,LinearFollowedByMultipleSwiftJ2IsotropicHardening,
                      UserIsoLaw};
  protected :
   int _num; // number of law (must be unique !)
@@ -559,4 +559,38 @@ class LinearFollowedByExponentialFollowedByMultiplePowerLawJ2IsotropicHardening:
     virtual void hardening(double p0, const IPJ2IsotropicHardening &ipvprev, double p, double T, IPJ2IsotropicHardening &ipv) const;
 		#endif //SWIG
 };
+
+class LinearFollowedByMultipleSwiftJ2IsotropicHardening: public J2IsotropicHardening{
+	// R = yield0 + h0*p if p < p1
+	// R = syp1*(1+h1*(p-p1))^n1 if p1 < p < p2
+	// R = syp2*(1+h2*(p-p2))^n2 p2 < p
+	protected:
+	  double _h0, _h1, _h2, _p1, _p2, _n1, _n2;
+        scalarFunction* _temFunc_h0;
+  		scalarFunction* _temFunc_h1;
+  		scalarFunction* _temFunc_h2;
+  		scalarFunction* _temFunc_n1;
+  		scalarFunction* _temFunc_n2;
+
+
+	public:
+  	  LinearFollowedByMultipleSwiftJ2IsotropicHardening(const int num,  double yield0, double h0, double p1, double h1, double n1, double p2, double h2, double n2, bool init=true);
+  	  void setTemperatureFunction_h0(const scalarFunction& Tfunc);
+      void setTemperatureFunction_h1(const scalarFunction& Tfunc);
+      void setTemperatureFunction_h2(const scalarFunction& Tfunc);
+      void setTemperatureFunction_n1(const scalarFunction& Tfunc);
+      void setTemperatureFunction_n2(const scalarFunction& Tfunc);
+		#ifndef SWIG
+    virtual ~LinearFollowedByMultipleSwiftJ2IsotropicHardening();
+    LinearFollowedByMultipleSwiftJ2IsotropicHardening(const LinearFollowedByMultipleSwiftJ2IsotropicHardening &source);
+    LinearFollowedByMultipleSwiftJ2IsotropicHardening& operator=(const J2IsotropicHardening &source);
+    virtual int getNum() const{return _num;}
+    virtual hardeningname getType() const{return J2IsotropicHardening::LinearFollowedByMultipleSwiftJ2IsotropicHardening; };
+    virtual void createIPVariable(IPJ2IsotropicHardening* &ipv) const;
+    virtual void initLaws(const std::map<int,J2IsotropicHardening*> &maplaw) {}; //nothing now, we will see if we use the mapping
+    virtual void hardening(double p0, const IPJ2IsotropicHardening &ipvprev, double p, IPJ2IsotropicHardening &ipv) const;
+    virtual J2IsotropicHardening * clone() const;
+    virtual void hardening(double p0, const IPJ2IsotropicHardening &ipvprev, double p, double T, IPJ2IsotropicHardening &ipv) const;
+		#endif //SWIG
+};
 #endif //J2ISOTROPICHARDENING_H_
diff --git a/NonLinearSolver/materialLaw/mlawHyperelastic.cpp b/NonLinearSolver/materialLaw/mlawHyperelastic.cpp
index 7b2aed65b54050d24c305eea06c3a23186d5ce78..048f868c610d773c3a88ce77c850fd155069a4a9 100644
--- a/NonLinearSolver/materialLaw/mlawHyperelastic.cpp
+++ b/NonLinearSolver/materialLaw/mlawHyperelastic.cpp
@@ -14,8 +14,9 @@ mlawHyperViscoElastic::mlawHyperViscoElastic(const int num,const double E,const
                           const bool matrixbyPerturbation, const double pert):
     materialLaw(num,true), _rho(rho),_tangentByPerturbation(matrixbyPerturbation),_perturbationfactor(pert),
     _viscoMethod(Maxwell),_N(0.),_order(1),_Ki(0),_ki(0),_Gi(0),_gi(0), _I4(1.,1.), _I(1.), 
-    _volCorrection(0.), _xivolCorrection(1.), _zetavolCorrection(1.), _devCorrection(0.), _thetadevCorrection(1.), _pidevCorrection(1.), 
-    _compCorrection(1.), _compCorrection_2(0.), _compCorrection_3(0.), _tensionCompressionRegularisation(5.), 
+    _volCorrection(1.), _xivolCorrection(1.), _zetavolCorrection(1.), _devCorrection(1.), _thetadevCorrection(1.), _pidevCorrection(1.), 
+    _compCorrection(1.), _compCorrection_2(0.), _compCorrection_3(0.), _tensionCompressionRegularisation(10.),
+	_volCorrection2(1.), _xivolCorrection2(1.), _zetavolCorrection2(1.), _devCorrection2(1.), _thetadevCorrection2(1.), _pidevCorrection2(1.),
     _extraBranchType(Bilogarithmic), _extraBranchNLType(tanhType){
         
    _Idev = _I4;
@@ -63,7 +64,9 @@ mlawHyperViscoElastic::mlawHyperViscoElastic(const mlawHyperViscoElastic& src):
       _I4(src._I4), _I(src._I), _Idev(src._Idev), _volCorrection(src._volCorrection), _xivolCorrection(src._xivolCorrection), 
       _zetavolCorrection(src._zetavolCorrection), _devCorrection(src._devCorrection), _thetadevCorrection(src._thetadevCorrection), 
       _pidevCorrection(src._pidevCorrection), _compCorrection(src._compCorrection), _compCorrection_2(src._compCorrection_2),  _compCorrection_3(src._compCorrection_3),  
-      _tensionCompressionRegularisation(src._tensionCompressionRegularisation), _extraBranchType(src._extraBranchType), _extraBranchNLType(src._extraBranchNLType)
+      _tensionCompressionRegularisation(src._tensionCompressionRegularisation), _extraBranchType(src._extraBranchType), _extraBranchNLType(src._extraBranchNLType),
+	  _volCorrection2(src._volCorrection2), _xivolCorrection2(src._xivolCorrection2),
+      _zetavolCorrection2(src._zetavolCorrection2), _devCorrection2(src._devCorrection2), _thetadevCorrection2(src._thetadevCorrection2)
 {
 
 };
@@ -79,14 +82,14 @@ mlawHyperViscoElastic& mlawHyperViscoElastic::operator=(const materialLaw &sourc
       _order = src->_order;
       _tangentByPerturbation = src->_tangentByPerturbation; _perturbationfactor = src->_perturbationfactor;
       _N = src->_N; _viscoMethod = src->_viscoMethod; _Ki = src->_Ki; _ki = src->_ki; _Gi = src->_Gi; _gi = src->_gi;
-      _zetavolCorrection=src->_zetavolCorrection; _devCorrection=src->_devCorrection;
-       _thetadevCorrection=src->_thetadevCorrection; _pidevCorrection=src->_pidevCorrection;
+      _volCorrection=src->_volCorrection; _xivolCorrection=src->_xivolCorrection;
+      _zetavolCorrection=src->_zetavolCorrection; _devCorrection=src->_devCorrection; _thetadevCorrection=src->_thetadevCorrection; _pidevCorrection=src->_pidevCorrection;
        _extraBranchType = src->_extraBranchType;
-       _compCorrection = src->_compCorrection;
-       _compCorrection_2 = src->_compCorrection_2;
-       _compCorrection_3 = src->_compCorrection_3;
+       _compCorrection = src->_compCorrection; _compCorrection_2 = src->_compCorrection_2; _compCorrection_3 = src->_compCorrection_3;
        _extraBranchNLType = src->_extraBranchNLType;
        _tensionCompressionRegularisation = src->_tensionCompressionRegularisation;
+       _volCorrection2=src->_volCorrection2; _xivolCorrection2=src->_xivolCorrection2;
+       _zetavolCorrection2=src->_zetavolCorrection2; _devCorrection2=src->_devCorrection2; _thetadevCorrection2=src->_thetadevCorrection2; _pidevCorrection2=src->_pidevCorrection2;
   }
   return *this;
 }
@@ -190,7 +193,7 @@ void mlawHyperViscoElastic::setViscoElasticData(const std::string filename){
 };
 
 void mlawHyperViscoElastic::evaluatePhiPCorrection(double tr, const STensor3 &dev, double &A_v, double &dA_vdE, double &intA, double &B_d, STensor3 &dB_vddev, double &intB, 
-                                                    double* dB_dTrEe) const{
+                                                    double* dB_dTrEe, double* psiInfCorrector) const{
   if(_extraBranchNLType == expType)
   {
     A_v = getVolumeCorrection()*pow(exp(getXiVolumeCorrection()/3.*tr*tr)-1.,getZetaVolumeCorrection());
@@ -278,7 +281,7 @@ void mlawHyperViscoElastic::evaluatePhiPCorrection(double tr, const STensor3 &de
         double x = getXiVolumeCorrection()*tr*tr + getZetaVolumeCorrection();
         A_v = -1. + getVolumeCorrection()* 1/sqrt(x) ;
         if (tr < 0.){
-             A_v = -1. + getVolumeCorrection()* 1/sqrt(x) * (1. + _compCorrection/getVolumeCorrection()) ;
+             A_v = -1. + getVolumeCorrection()* 1/sqrt(x); // * (1. + _compCorrection/getVolumeCorrection()) ;
             // A_v += (_compCorrection*tanh(_compCorrection_2*tr*tr+_compCorrection_3)) ;
         }
         if(A_v > -1.){    
@@ -287,9 +290,9 @@ void mlawHyperViscoElastic::evaluatePhiPCorrection(double tr, const STensor3 &de
             intA -= getVolumeCorrection()*sqrt(getZetaVolumeCorrection())/getXiVolumeCorrection(); // value at trEe = 0.
             
             if (tr < 0.){
-                dA_vdE = - getVolumeCorrection()*getXiVolumeCorrection()*tr/pow(x,1.5) * (1. + _compCorrection/getVolumeCorrection());
-                intA = - tr*tr/2. + getVolumeCorrection()*sqrt(x)/getXiVolumeCorrection() * (1. + _compCorrection/getVolumeCorrection()); // integral of A_v * trEe
-                intA -= getVolumeCorrection()*sqrt(getZetaVolumeCorrection())/getXiVolumeCorrection() * (1. + _compCorrection/getVolumeCorrection()); // value at trEe = 0.
+                dA_vdE = - getVolumeCorrection()*getXiVolumeCorrection()*tr/pow(x,1.5); // * (1. + _compCorrection/getVolumeCorrection());
+                intA = - tr*tr/2. + getVolumeCorrection()*sqrt(x)/getXiVolumeCorrection(); // * (1. + _compCorrection/getVolumeCorrection()); // integral of A_v * trEe
+                intA -= getVolumeCorrection()*sqrt(getZetaVolumeCorrection())/getXiVolumeCorrection(); // * (1. + _compCorrection/getVolumeCorrection()); // value at trEe = 0.
             }
         }
         else{
@@ -301,6 +304,7 @@ void mlawHyperViscoElastic::evaluatePhiPCorrection(double tr, const STensor3 &de
         double y = getThetaDevCorrection()*dev.dotprod() + getPiDevCorrection();
         B_d = -1. + getDevCorrection()*1/sqrt(y);
         if (tr < 0.){
+            B_d = -1. + getDevCorrection()*1/sqrt(y);
             // B_d += (_compCorrection*tanh(_compCorrection_2*tr*tr+_compCorrection_3)) ;
         }
         
@@ -316,51 +320,186 @@ void mlawHyperViscoElastic::evaluatePhiPCorrection(double tr, const STensor3 &de
             STensorOperation::zero(dB_vddev);
             intB = 0.;
         }
+        
+        if (psiInfCorrector != NULL){
+            *psiInfCorrector = getVolumeCorrection()/sqrt(getXiVolumeCorrection()) * asinh(sqrt(getXiVolumeCorrection()/getZetaVolumeCorrection())*tr);
+        }
 
     }
     else if(_extraBranchNLType == TensionCompressionRegularisedType){
         
         // Regularising function
         double m = _tensionCompressionRegularisation;
-        double expmtr(0.);
-        if (exp(-m*tr)<1.e+10){ expmtr = exp(-m*tr);}
+        double expmtr = exp(-m*tr);
+        // if (exp(-m*tr)<1.e+10){ expmtr = exp(-m*tr);}
         double sigmoid = 1/(1.+expmtr);
         
         double x = getXiVolumeCorrection()*tr*tr + getZetaVolumeCorrection();
-        A_v = -1. + sigmoid*1./sqrt(x) + (1.-sigmoid)*(_compCorrection/sqrt(x));
+        A_v = -1. + getVolumeCorrection()/sqrt(x)*(sigmoid + _compCorrection*(1.-sigmoid));
   
-        dA_vdE = - sigmoid*getXiVolumeCorrection()*tr/pow(x,1.5) - (1.-sigmoid)*(getXiVolumeCorrection()*_compCorrection*tr/pow(x,1.5)) 
-                   + (m*expmtr/pow((1.+expmtr),2.))*1./sqrt(x) - (_compCorrection*m*expmtr/pow((1.+expmtr),2.))*1./sqrt(x);
+        dA_vdE = - getXiVolumeCorrection()*tr/pow(x,1.5) *(sigmoid + _compCorrection*(1.-sigmoid)) 
+                   + 1./sqrt(x)* (m*expmtr/pow((1.+expmtr),2.)) *(1.-_compCorrection);
+        dA_vdE *= getVolumeCorrection();
             
         if(getXiVolumeCorrection()>0.){
             double integrand = 1./getXiVolumeCorrection()*sqrt(x); // integral of A_v * trEe
             integrand -= ( 1./getXiVolumeCorrection()*sqrt(getZetaVolumeCorrection()) ); // value at trEe = 0.
-            intA = - tr*tr/2. + sigmoid*integrand + (1.-sigmoid)*integrand;
+            intA = - tr*tr/2. + getVolumeCorrection()*integrand*(sigmoid + _compCorrection*(1.-sigmoid));
         }
         else{
             intA = - tr*tr/2.;
         }
             
         double y = getThetaDevCorrection()*dev.dotprod() + getPiDevCorrection();
-        B_d = -1. + sigmoid*1./sqrt(y) + (1.-sigmoid)*(_compCorrection/sqrt(y)); 
+        B_d = -1. + getDevCorrection()/sqrt(y)*(sigmoid + _compCorrection*(1.-sigmoid)); 
 
         STensorOperation::zero(dB_vddev);
         dB_vddev = dev;
-        dB_vddev *= (-sigmoid*getThetaDevCorrection()/pow(y,1.5) - (1.-sigmoid)*(getThetaDevCorrection()*_compCorrection/pow(y,1.5)));
+        dB_vddev *= -getThetaDevCorrection()/pow(y,1.5)*(sigmoid + _compCorrection*(1.-sigmoid));
+        dB_vddev *= getDevCorrection();
         
         if(dB_dTrEe!=NULL){
-            *dB_dTrEe = (m*expmtr/pow((1.+expmtr),2.))*1./sqrt(y) - (_compCorrection*m*expmtr/pow((1.+expmtr),2.))*1./sqrt(y);
+            *dB_dTrEe = getDevCorrection()/sqrt(y)* (m*expmtr/pow((1.+expmtr),2.)) *( 1.-_compCorrection);
         }    
         if(getThetaDevCorrection()>0.){
             double integrand = 1./getThetaDevCorrection()*sqrt(y);  // integral of B_d * devEe
             integrand -= (1./getThetaDevCorrection()*sqrt(getPiDevCorrection()) );  // value at devEe = 0.   
-            intB = -dev.dotprod()/2. + sigmoid*integrand + (1.-sigmoid)*integrand;
+            intB = -dev.dotprod()/2. + getDevCorrection()*integrand*(sigmoid + _compCorrection*(1.-sigmoid));
         }
         else{
             intB = -dev.dotprod()/2.;
         } 
-        
-        // Msg::Error(" Inside evaluatePhiPCorrection, A_v = %e, B_d = %e !!", A_v, B_d);
+    }
+    /*else if(_extraBranchNLType == hyper_exp_TCasymm_Type){
+
+            // Msg::Error(" Inside evaluatePhiPCorrection, A_v = %e, B_d = %e !!", A_v, B_d);
+            // Regularising function
+            double m = _tensionCompressionRegularisation;
+            double expmtr = exp(-m*tr);
+            // if (exp(-m*tr)<1.e+10){ expmtr = exp(-m*tr);}
+            double sigmoid = 1/(1.+expmtr);
+
+            double x1 = getXiVolumeCorrection()*tr*tr + getZetaVolumeCorrection();
+            double x2 = _xivolCorrection2*tr*tr + _zetavolCorrection2;
+
+            A_v = -1. + sigmoid*(getVolumeCorrection()/sqrt(x1)) + (1-sigmoid)*_compCorrection*(getVolumeCorrection()/sqrt(x1) + _volCorrection2*exp(x2));
+
+            dA_vdE = sigmoid*(-getVolumeCorrection()*getXiVolumeCorrection()*tr/pow(x1,1.5))
+             		   + (1.-sigmoid)*_compCorrection*( -getVolumeCorrection()*getXiVolumeCorrection()*tr/pow(x1,1.5) + 2*_volCorrection2*_xivolCorrection2*tr*exp(x2))
+                        + (m*expmtr/pow((1.+expmtr),2.))*getVolumeCorrection()*1./sqrt(x1) - (m*expmtr/pow((1.+expmtr),2.))*_compCorrection*(getVolumeCorrection()/sqrt(x1) + _volCorrection2*exp(x2)) ;
+
+             if(getXiVolumeCorrection()>0. && _xivolCorrection2>0.){
+                 double integrand1 = 1./getXiVolumeCorrection()*sqrt(x1); // integral of A_v * trEe
+                 integrand1 -= ( 1./getXiVolumeCorrection()*sqrt(getZetaVolumeCorrection()) ); // value at trEe = 0.
+                 integrand1 *= getVolumeCorrection();
+
+                 double integrand2 = exp(x2)/(2*_xivolCorrection2);
+                 integrand2 -= exp(_zetavolCorrection2)/(2*_xivolCorrection2);
+     			integrand2 *= _volCorrection2;
+
+                 intA = - tr*tr/2. + sigmoid*integrand1 + (1.-sigmoid)*_compCorrection*(integrand1 + integrand2);
+             }
+             else{
+                 intA = - tr*tr/2.;
+             }
+
+             double y1 = getThetaDevCorrection()*dev.dotprod() + getPiDevCorrection();
+             double y2 = _thetadevCorrection2*dev.dotprod() + _pidevCorrection2;
+             B_d = -1. + sigmoid*(getDevCorrection()/sqrt(y1)) + (1-sigmoid)*_compCorrection*(getDevCorrection()/sqrt(y1) + _devCorrection2*exp(y2));
+
+             STensorOperation::zero(dB_vddev);
+             dB_vddev = dev;
+             dB_vddev *= ( sigmoid*(-getDevCorrection()*getThetaDevCorrection()/pow(y1,1.5))
+             				+ (1.-sigmoid)*_compCorrection*( -getDevCorrection()*getThetaDevCorrection()/pow(y1,1.5) + 2*_devCorrection2*_thetadevCorrection2*exp(y2)) );
+             if(dB_dTrEe!=NULL){
+                  *dB_dTrEe = (m*expmtr/pow((1.+expmtr),2.))*getDevCorrection()*1./sqrt(y1) - (m*expmtr/pow((1.+expmtr),2.))*_compCorrection*(getDevCorrection()/sqrt(y1) + _devCorrection2*exp(y2));
+              }
+              if(getThetaDevCorrection()>0. && _thetadevCorrection2>0.){
+
+                  double integrand1 = 1./getThetaDevCorrection()*sqrt(y1);  // integral of B_d * devEe
+                  integrand1 -= (1./getThetaDevCorrection()*sqrt(getPiDevCorrection()) );  // value at devEe = 0.
+                  integrand1 *= getDevCorrection();
+
+                  double integrand2 = exp(y2)/(2*_thetadevCorrection2);
+                  integrand2 -= exp(_pidevCorrection2)/(2*_thetadevCorrection2);
+      			integrand2 *= _devCorrection2;
+
+      			intB = -dev.dotprod()/2. + sigmoid*integrand1 + (1.-sigmoid)*_compCorrection*(integrand1 + integrand2);
+              }
+              else{
+                  intB = -dev.dotprod()/2.;
+              }
+    }*/
+    else if(_extraBranchNLType == hyper_exp_TCasymm_Type){ // hyper_TCasymm_Type2
+
+    			// To make it simpler for the sake of it
+    			double V0 = getVolumeCorrection(); // This code doesnt use it
+    			double V1 = getXiVolumeCorrection();
+    			double V2 = getZetaVolumeCorrection();
+    			double V3 = _volCorrection2;
+    			double V4 = _xivolCorrection2;
+    			double V5 = _zetavolCorrection2;
+    			double D0 = getDevCorrection();   // This code doesnt use it
+    			double D1 = getThetaDevCorrection();
+    			double D2 = getPiDevCorrection();
+    			double D3 = _devCorrection2;
+    			double D4 = _thetadevCorrection2;
+    			double D5 = _pidevCorrection2;
+
+    	// Regularising function
+    	        double m = _tensionCompressionRegularisation;
+    	        double expmtr = exp(-m*tr);
+    	        // if (exp(-m*tr)<1.e+10){ expmtr = exp(-m*tr);}
+    	        double sigmoid = 1/(1.+expmtr);
+
+    	        double x1 = V1*tr*tr + V2;
+    	        double x2 = V4*tr*tr + V5;
+    	        A_v = -1. + sigmoid*( (1./sqrt(x1)+V3*(1+tanh(x2))) ) + (1-sigmoid)*_compCorrection*( 1./sqrt(x1)+V3 );
+
+    	        dA_vdE = -sigmoid*(V1*tr/pow(x1,1.5) - V3*(2*V4*tr*pow(1/cosh(x2),2))) - (1.-sigmoid)*(V1*_compCorrection*tr/pow(x1,1.5))
+                           + (m*expmtr/pow((1.+expmtr),2.))*(1./sqrt(x1)+ V3*(1+tanh(x2)))- (_compCorrection*m*expmtr/pow((1.+expmtr),2.))*(1./sqrt(x1) + V3);
+
+                if(V1>0.){
+                    double integrand1 = 1./V1*sqrt(x1) + V3*tr*tr/2.; // integral of A_v * trEe
+                    double integrand2 = 0.;
+                    if(V4 != 0.){
+                    	integrand2 = V3/(2.*V4)*log(cosh(x2));
+                    }
+                    integrand1 -= ( 1./V1*sqrt(V2) ); // value at trEe = 0.
+                    intA = - tr*tr/2. + sigmoid*(integrand1 + integrand2) + _compCorrection*(1.-sigmoid)*integrand1;
+                    // intA *= getVolumeCorrection();
+                }
+                else{
+                	intA = - tr*tr/2.;
+                }
+
+    	        double y1 = D1*dev.dotprod() + D2;
+    	        double y2 = D4*dev.dotprod() + D5;
+
+    	        B_d = -1. + sigmoid*(1./sqrt(y1) + D3*(1+tanh(y2))) + (1.-sigmoid)*(_compCorrection*(1./sqrt(y1) + D3)) ;
+
+    	        STensorOperation::zero(dB_vddev);
+    	        dB_vddev = dev;
+    	        dB_vddev *= (-sigmoid*(D1/pow(y1,1.5) - D3*(2*D4*pow(1/cosh(y2),2))) - (1.-sigmoid)*(D1*_compCorrection/pow(y1,1.5)));
+
+                if(dB_dTrEe!=NULL){
+                    *dB_dTrEe = (m*expmtr/pow((1.+expmtr),2.))*(1./sqrt(y1) + D3*(1+tanh(y2))) - (m*expmtr/pow((1.+expmtr),2.))*(_compCorrection*(1./sqrt(y1) + D3));
+                    // *dB_dTrEe *= getDevCorrection();
+                }
+
+                if(D1>0.){
+                    double integrand1 = 1./D1*sqrt(y1) + D3*dev.dotprod()/2.;  // integral of B_d * devEe
+                    double integrand2 = 0.;
+                    if(D4 != 0.){
+                    	integrand2 = D3/(2.*D4)*log(cosh(y2));
+                    }
+                    integrand1 -= (1./D1*sqrt(D2) );  // value at devEe = 0.
+                    intB = -dev.dotprod()/2. + sigmoid*(integrand1 + integrand2) + _compCorrection*(1.-sigmoid)*integrand1;
+                    // intB *= getDevCorrection();
+                }
+                else{
+                	intB = -dev.dotprod()/2.;
+                }
     }
     else{
       Msg::Error("_extraBranchNLType %d has not been defined",_extraBranchNLType);
diff --git a/NonLinearSolver/materialLaw/mlawHyperelastic.h b/NonLinearSolver/materialLaw/mlawHyperelastic.h
index c0fe1a8a337dd8a3c7b7ea74188c7ba3cd48eee0..853e17338dbd0c728adcd270f1b3cee4351159c5 100644
--- a/NonLinearSolver/materialLaw/mlawHyperelastic.h
+++ b/NonLinearSolver/materialLaw/mlawHyperelastic.h
@@ -22,7 +22,7 @@ class mlawHyperViscoElastic : public materialLaw{
   public:
     enum viscoelasticType{Maxwell=0,KelvinVoight=1};
     enum extraBranchType{Bilogarithmic=0};
-    enum extraBranchNLType{expType=0,tanhType=1,sigmoidType=2,hyperType=3,TensionCompressionRegularisedType=4};
+    enum extraBranchNLType{expType=0,tanhType=1,sigmoidType=2,hyperType=3,TensionCompressionRegularisedType=4,hyper_exp_TCasymm_Type=5,hyper_TCasymm_Type2=6};
   #ifndef SWIG
   protected:
     STensor43 _I4; // symetric 4th order unit tensor
@@ -61,6 +61,14 @@ class mlawHyperViscoElastic : public materialLaw{
     extraBranchType _extraBranchType;
     extraBranchNLType _extraBranchNLType;
 
+    double _volCorrection2; //Vc correction on volume potential
+    double _xivolCorrection2; //Xi correction on volume potential
+    double _zetavolCorrection2; //Zeta correction on volume potential
+    double _devCorrection2; //Dc correction on volume potential
+    double _thetadevCorrection2; //Theta correction on volume potential
+    double _pidevCorrection2; //pi correction on volume potential
+
+
   protected:
     virtual double deformationEnergy(const IPHyperViscoElastic& q) const ;
     virtual void dDeformationEnergydF(const IPHyperViscoElastic& q,  const STensor3 &P, STensor3 &dElasticEnergydF) const ;
@@ -80,7 +88,7 @@ class mlawHyperViscoElastic : public materialLaw{
                                   const bool stiff, STensor43& Tangent) const;
 
     void evaluatePhiPCorrection(double trEe, const STensor3 &devEpr,  double &A_v, double &dAprdEepr, double &intA, double &B_d, STensor3 &dB_vddevEe, double &intB, 
-                                double* dB_dTrEe = NULL) const;
+                                double* dB_dTrEe = NULL, double* psiInfCorrector = NULL) const;
     //void evaluateA_dA(double trEe, double &A_v, double &dAprdEepr) const;
     
   #endif // SWIG
@@ -104,8 +112,11 @@ class mlawHyperViscoElastic : public materialLaw{
     virtual double getDevCorrection() const {return _devCorrection;};
     virtual double getThetaDevCorrection() const {return _thetadevCorrection;};
     virtual double getPiDevCorrection() const {return _pidevCorrection;};
-    virtual void setExtraBranch_CompressionParameter(double compCorrection, double compCorrection_2, double compCorrection_3) {
+    virtual void setExtraBranch_CompressionParameter(const double compCorrection, const double compCorrection_2, const double compCorrection_3) {
                                     _compCorrection = compCorrection; _compCorrection_2 = compCorrection_2; _compCorrection_3 = compCorrection_3;};
+
+    virtual void setAdditionalVolumeCorrections(const double V3, const double V4, const double V5, const double D3, const double D4, const double D5) {
+    								_volCorrection2 = V3; _xivolCorrection2 = V4; _zetavolCorrection2 = V5; _devCorrection2 = D3; _thetadevCorrection2 = D4; _pidevCorrection2 = D5;};
     virtual void setTensionCompressionRegularisation(double tensionCompressionRegularisation) {_tensionCompressionRegularisation = tensionCompressionRegularisation;};
     virtual void setExtraBranchType(const int type);
     virtual void setExtraBranchNLType(const int type);
diff --git a/NonLinearSolver/materialLaw/mlawNonLinearTVENonLinearTVP.cpp b/NonLinearSolver/materialLaw/mlawNonLinearTVENonLinearTVP.cpp
index b94b227aba7ab73a8ff2bedd5cfc2ad9712c3ce0..d76a3995f44178fab8202dc165efbe061610dd29 100644
--- a/NonLinearSolver/materialLaw/mlawNonLinearTVENonLinearTVP.cpp
+++ b/NonLinearSolver/materialLaw/mlawNonLinearTVENonLinearTVP.cpp
@@ -34,6 +34,38 @@ mlawNonLinearTVENonLinearTVP& mlawNonLinearTVENonLinearTVP::operator=(const mate
 mlawNonLinearTVENonLinearTVP::~mlawNonLinearTVENonLinearTVP(){
 };
 
+double mlawNonLinearTVENonLinearTVP::freeEnergyPlasticity(const IPNonLinearTVP *q0, IPNonLinearTVP *q1, const double T0, const double T) const{
+
+	double Psy_TVP(0.);
+
+	// 1. Kinematic Hardening
+    double Hb(0.);
+    if (q1->_ipKinematic != NULL){
+       Hb = q1->_ipKinematic->getDR(); // kinematic hardening parameter
+   	}
+
+    double kk = 1./sqrt(1.+2.*q1->_nup*q1->_nup);
+    static STensor3 alpha;
+    alpha = q1->_backsig;
+    alpha *= 1/(pow(kk,2)*Hb);
+
+	STensorOperation::doubleContractionSTensor3(q1->_backsig,alpha,Psy_TVP);
+
+	// 2. Isotropic Hardening
+	double intR = q1->_ipCompression->getIntegR();
+	double sigc0 = q1->_ipCompression->getR0();
+	intR -= sigc0*q1->_epspbarre;
+
+	Psy_TVP += intR;
+
+    // If mullins, then calculate psi_VE derivatives
+    // if (_mullinsEffect != NULL && q._ipMullinsEffect != NULL){
+    //    *DpsiDT = 0.;
+    //    STensorOperation::zero(*DpsiDE);
+    // }
+    return Psy_TVP;
+}
+
 void mlawNonLinearTVENonLinearTVP::constitutive( // This function is just a placeholder, defined in the pure virtual class -> does nothing, its never called.
                             const STensor3& F0,         // previous deformation gradient (input @ time n)
                             const STensor3& F1,         // current deformation gradient (input @ time n+1)
@@ -334,7 +366,7 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL
 
   // Get hardening parameters
   this->mlawNonLinearTVP::hardening(q0,q1,T);
-  static fullVector<double> a(3), Da(3); // yield coefficients and derivatives in respect to plastic deformation
+  static fullVector<double> a(3), Da(3); // yield coefficients and derivatives with respect to plastic deformation
   this->mlawNonLinearTVP::getYieldCoefficients(q1,a);
   //a.print("a init");
   
@@ -342,7 +374,7 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL
   if (q1->_ipKinematic != NULL){
     Hb = q1->_ipKinematic->getDR(); // kinematic hardening parameter
     dHb = q1->_ipKinematic->getDDR(); // kinematic hardening parameter derivative (dHb/dgamma)
-    dHbdT = Hb * q1->_ipKinematic->getDRDT();  // make sure to normalise DRDT while defining in python file //NEW
+    dHbdT = Hb * q1->_ipKinematic->getDRDT();  // make sure to normalise DRDT while defining in python file
     ddHbddT = Hb * q1->_ipKinematic->getDDRDTT();
   }
   
@@ -371,28 +403,36 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL
   static STensor3 expGN, GammaN;
   static STensor43 dexpAdA; // estimation of dexpA/dA
   expGN = _I; // if Gamma = 0, expGN = _I
-  dexpAdA = _I4;
+  // dexpAdA = _I4;
+  STensorOperation::zero(dexpAdA); // CHECKERS
 
   STensor3& Ee = q1->_Ee;
-  STensorOperation::logSTensor3(Ce,_order,Ee,&DlnDCepr,&DDlnDDCe);
+  // STensorOperation::logSTensor3(Ce,_order,Ee,&DlnDCepr,&DDlnDDCe);
+  bool ok=STensorOperation::logSTensor3(Ce,_order,Ee,&DlnDCepr,&DDlnDDCe);
+  if(!ok)
+  {
+     P(0,0) = P(1,1) = P(2,2) = sqrt(-1.);
+     return;
+  }
   Ee *= 0.5;
   Eepr = Ee;
   DlnDCe = DlnDCepr;
   
   // update A, B -> ExtraBranch calculations are within
-  double Ke(0.), Ge(0.), Ke_pr(0.), Ge_pr(0.);
+  double Ke(0.), Ge(0.), Ke_pr(0.), Ge_pr(0.), DKDTsum(0.), DGDTsum(0.);
   static STensor43 Ge_Tensor_pr, Ge_Tensor, Bd_stiffnessTerm, Ge_TrEeTensor_pr, Ge_TrEeTensor;
   STensorOperation::zero(Ge_Tensor_pr); STensorOperation::zero(Ge_Tensor);
   STensorOperation::zero(Ge_TrEeTensor_pr); STensorOperation::zero(Ge_TrEeTensor);
   
-  if (_extraBranchNLType != TensionCompressionRegularisedType && _ExtraBranch_TVE_option != 3){
-    mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(Ee,q0->_Ee,q0,q1,Ke,Ge,T0,T,stiff,Bd_stiffnessTerm);
+  if (_extraBranchNLType == TensionCompressionRegularisedType  || _extraBranchNLType == hyper_exp_TCasymm_Type || _ExtraBranch_TVE_option == 3 || _ExtraBranch_TVE_option == 4 || _ExtraBranch_TVE_option == 5){
+      // TC asymmetry -> for either case of TensionCompressionRegularisedType and _ExtraBranch_TVE_option == 3,',(
+	  mlawNonLinearTVM::ThermoViscoElasticPredictor(Ee,q0->_Ee,q0,q1,Ke,Ge,DKDTsum,DGDTsum,T0,T,stiff,Bd_stiffnessTerm,&Ge_TrEeTensor);
+        Ge_TrEeTensor_pr = Ge_TrEeTensor;
   }
-  else{ // TC asymmetry -> for either case of TensionCompressionRegularisedType and _ExtraBranch_TVE_option == 3
-    mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(Ee,q0->_Ee,q0,q1,Ke,Ge,T0,T,stiff,Bd_stiffnessTerm,&Ge_TrEeTensor);
-    Ge_TrEeTensor_pr = Ge_TrEeTensor;
+  else{ 
+	  mlawNonLinearTVM::ThermoViscoElasticPredictor(Ee,q0->_Ee,q0,q1,Ke,Ge,DKDTsum,DGDTsum,T0,T,stiff,Bd_stiffnessTerm);
   }
-  
+    
   Ge_Tensor = _I4;
   Ge_Tensor *= Ge*2; // Because the function does not do it
   Ge_Tensor += Bd_stiffnessTerm;
@@ -406,10 +446,10 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL
   
   // get predictor - dKeprDT
   mlawNonLinearTVM::getTVEdCorKirDT(q0,q1,T0,T);
-  const STensor3& dKeprDT = q1->_DcorKirDT; 
+  const STensor3& dKeprDT = q1->_DcorKirDT; // This has all extrabranches now
   
   // Initialise Dho
-  static STensor43 Dho, Dho2inv, Dho2_u_inv;  // This will be the final important tensor.
+  static STensor43 Dho, Dho2inv, Dho2_u_inv;  // These will be important tensors.
   double Dho2_v_inv(0.);
 
   // Get Mepr
@@ -426,21 +466,20 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL
   pXn = 1./3.*trXn;  // 1st invariant of Xn
   eXn = sqrt(1.5*devXn.dotprod()); // J2 invariant of Xn
   
-    // Initialise Phipr
+  // Initialise Phipr
   static STensor3 PhiPr, Phi;
   PhiPr = q1->_ModMandel;
   PhiPr -= q1->_backsig;
   Phi = PhiPr;
 
   static STensor3 devPhipr, devPhi; // effective dev stress predictor
-  static double ptildepr, ptilde;
+  double ptildepr(0.), ptilde(0.);
   STensorOperation::decomposeDevTr(PhiPr,devPhipr,ptildepr);
   ptildepr/= 3.;
   
   // Initialise Normal
-  static STensor3 devN; // dev part of yield normal
+  static STensor3 devN, N; // dev part of yield normal
   double trN = 0.; // trace part of yield normal
-  static STensor3 N; // yield normal
   STensorOperation::zero(devN);
   STensorOperation::zero(N);
 
@@ -449,11 +488,10 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL
   double kk = (1./sqrt(1.+2.*q1->_nup*q1->_nup)); 
   
   // Initialise variables
-  // double Gamma = 0.;
   double& Gamma = q1->_Gamma;   // flow rule parameter
   Gamma = 0.;
   double dDgammaDGamma = 0.;
-  double Dgamma = 0.; // eqplastic strain
+  double Dgamma = 0.; // eqplastic strain increment
   static fullVector<double> m(2);
   mlawNonLinearTVP::getChabocheCoeffs(m,0,q1);
   
@@ -473,12 +511,13 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL
   devPhi = devPhipr;
   
   // Initialise the rest
-  if (_extraBranchNLType != TensionCompressionRegularisedType && _ExtraBranch_TVE_option != 3){
-    getDho(Gamma,Cepr,Ceinvpr,Kepr,Ke,Ge_Tensor,kk,Hb,Cxtr,Cxdev,expGN,dexpAdA,Dho,Dho2inv,Dho2_u_inv,Dho2_v_inv);
-  }
-  else{ // TC asymmetry -> for either case of TensionCompressionRegularisedType and _ExtraBranch_TVE_option == 3
+  if (_extraBranchNLType == TensionCompressionRegularisedType  || _extraBranchNLType == hyper_exp_TCasymm_Type || _ExtraBranch_TVE_option == 3 || _ExtraBranch_TVE_option == 4 || _ExtraBranch_TVE_option == 5){
+    // TC asymmetry -> for either case of TensionCompressionRegularisedType and _ExtraBranch_TVE_option == 3
     getDho(Gamma,Cepr,Ceinvpr,Kepr,Ke,Ge_Tensor,kk,Hb,Cxtr,Cxdev,expGN,dexpAdA,Dho,Dho2inv,Dho2_u_inv,Dho2_v_inv,&Ge_TrEeTensor);
   }
+  else{ 
+    getDho(Gamma,Cepr,Ceinvpr,Kepr,Ke,Ge_Tensor,kk,Hb,Cxtr,Cxdev,expGN,dexpAdA,Dho,Dho2inv,Dho2_u_inv,Dho2_v_inv);
+  }
 
   double PhiEqpr2 = 1.5*devPhi.dotprod();
   double PhiEqpr = sqrt(PhiEqpr2);      // -> second invariant
@@ -498,6 +537,7 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL
     }
     else{
         if (f>_tol){
+        	// Msg::Error("Plasticity");
             q1->getRefToDissipationActive() = true;
          
             // plasticity
@@ -521,7 +561,7 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL
                 dCxtrdDgamma += (2.*_b/3.)*m(1)*pow(kk,1)*dHb; // pow(kk,2) DEBUG
                 
                 // Get Hp = dPhiPdDgamma, dPhiPdGamma
-                double Hp =  2*_b*pow(kk,1)*Gamma/3.*ptilde*( Hb/pow(Cxtr,2)*dCxtrdDgamma - 1./Cxtr*dHb ) * Dho2_v_inv; // pow(kk,2) DEBUG
+                double Hp =  ( 2*_b*pow(kk,1)*Gamma/3.*ptilde*(Hb/pow(Cxtr,2)*dCxtrdDgamma-1./Cxtr*dHb) + 1./3.*trXn/pow(Cxtr,2)*dCxtrdDgamma ) * Dho2_v_inv; // pow(kk,2) DEBUG
                 double dPhiPdGamma = -2*_b*ptilde*(Ke + pow(kk,1)*Hb/(3.*Cxtr)) * Dho2_v_inv; // pow(kk,2) DEBUG
                 
                 // Get He = dPhiEdGamma
@@ -533,8 +573,10 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL
                 
                 for (int i=0; i<3; i++)
                     for (int j=0; j<3; j++){
-                        DdevPhidDgamma_RHS(i,j) += ( 0.5*2*_b*Gamma*Ke*Hp*_I(i,j) + 3*Gamma*pow(kk,1)*( Hb/pow(Cxdev,2.)*dCxdevdDgamma - dHb/Cxdev ) * devPhi(i,j) ); // pow(kk,2) DEBUG
-                        DdevPhidGamma_RHS(i,j) += ( -0.5*2*_b*Ke*(-ptilde-Gamma*dPhiPdGamma)*_I(i,j) - 3*pow(kk,1)*Hb/Cxdev*devPhi(i,j) ); // pow(kk,2) DEBUG
+                        DdevPhidDgamma_RHS(i,j) += ( 0.5*2*_b*Gamma*Ke*Hp*_I(i,j) 
+                                                    + 3*Gamma*pow(kk,1)*( Hb/pow(Cxdev,2.)*dCxdevdDgamma - dHb/Cxdev ) * devPhi(i,j) 
+                                                    + devXn(i,j)/pow(Cxdev,2.)*dCxdevdDgamma ); // pow(kk,2) DEBUG
+                        DdevPhidGamma_RHS(i,j) += ( 0.5*2*_b*Ke*(ptilde+Gamma*dPhiPdGamma)*_I(i,j) - 3*pow(kk,1)*Hb/Cxdev*devPhi(i,j) ); // pow(kk,2) DEBUG
                         for (int k=0; k<3; k++)
                             for (int l=0; l<3; l++){
                                 DdevPhidDgamma_RHS(i,j) += 0.5* 2.*_b/3.*Gamma*(-Ge_TrEeTensor(i,j,k,l) + Dho(i,j,k,l))*_I(k,l)*Hp; 
@@ -574,7 +616,7 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL
                 if (Gamma>0 and etaOverDt>0)
                     dfdGamma -= pow(etaOverDt,_p)*_p*pow(Gamma,(_p-1.));
 
-                DfDGamma = dfdDgamma*dDgammaDGamma + dfdGamma;
+                DfDGamma = dfdDgamma*dDgammaDGamma + dfdGamma; // unused
 
                 dgdDgamma = 1. - kk*Gamma*dAdDgamma;
                 dgdGamma = - dDgammaDGamma;
@@ -623,13 +665,14 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL
                 }
                 
                 // Update Phi
-                if (_extraBranchNLType != TensionCompressionRegularisedType && _ExtraBranch_TVE_option != 3){
+                if (_extraBranchNLType == TensionCompressionRegularisedType  || _extraBranchNLType == hyper_exp_TCasymm_Type || _ExtraBranch_TVE_option == 3 || _ExtraBranch_TVE_option == 4 || _ExtraBranch_TVE_option == 5){
+                    // TC asymmetry -> for either case of TensionCompressionRegularisedType and _ExtraBranch_TVE_option == 3
                     getIterated_DPhi(T0,T,q0,q1,Gamma,Cxtr,Cxdev,Cepr,Eepr,trXn,devXn,Ke,Ge,Ge_Tensor,ptilde,devPhi,Phi,N,expGN,dexpAdA,
-                                    Dho,Dho2inv,Dho2_u_inv,Dho2_v_inv);
+                                    Dho,Dho2inv,Dho2_u_inv,Dho2_v_inv,&Ge_TrEeTensor);
                 }
-                else{ // TC asymmetry -> for either case of TensionCompressionRegularisedType and _ExtraBranch_TVE_option == 3
+                else{
                     getIterated_DPhi(T0,T,q0,q1,Gamma,Cxtr,Cxdev,Cepr,Eepr,trXn,devXn,Ke,Ge,Ge_Tensor,ptilde,devPhi,Phi,N,expGN,dexpAdA,
-                                    Dho,Dho2inv,Dho2_u_inv,Dho2_v_inv,&Ge_TrEeTensor);
+                                    Dho,Dho2inv,Dho2_u_inv,Dho2_v_inv);
                 }
                                 
                 PhiEq = sqrt(1.5*devPhi.dotprod());
@@ -657,7 +700,7 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL
                 if (fabs(f) <_tol) break;
 
                 if(ite > maxite){
-                    Msg::Error("No convergence for plastic correction in mlawNonLinearTVP nonAssociatedFlow Maxwell iter = %d, f = %e!!",ite,f);
+                    Msg::Error("No convergence for plastic correction in mlawNonLinearTVENonLinearTVP nonAssociatedFlow iter = %d, f = %e!!",ite,f);
                     P(0,0) = P(1,1) = P(2,2) = sqrt(-1.);
                     return;
                 }
@@ -675,13 +718,14 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL
             }
 
             // Correct Phi
-            if (_extraBranchNLType != TensionCompressionRegularisedType && _ExtraBranch_TVE_option != 3){
+            if (_extraBranchNLType == TensionCompressionRegularisedType || _extraBranchNLType == hyper_exp_TCasymm_Type || _ExtraBranch_TVE_option == 3 || _ExtraBranch_TVE_option == 4 || _ExtraBranch_TVE_option == 5){
+                // TC asymmetry -> for either case of TensionCompressionRegularisedType and _ExtraBranch_TVE_option == 3
                 getIterated_DPhi(T0,T,q0,q1,Gamma,Cxtr,Cxdev,Cepr,Eepr,trXn,devXn,Ke,Ge,Ge_Tensor,ptilde,devPhi,Phi,N,expGN,dexpAdA,
-                    Dho,Dho2inv,Dho2_u_inv,Dho2_v_inv);
+                    Dho,Dho2inv,Dho2_u_inv,Dho2_v_inv,&Ge_TrEeTensor);
             }
-            else{ // TC asymmetry -> for either case of TensionCompressionRegularisedType and _ExtraBranch_TVE_option == 3
+            else{ 
                 getIterated_DPhi(T0,T,q0,q1,Gamma,Cxtr,Cxdev,Cepr,Eepr,trXn,devXn,Ke,Ge,Ge_Tensor,ptilde,devPhi,Phi,N,expGN,dexpAdA,
-                    Dho,Dho2inv,Dho2_u_inv,Dho2_v_inv,&Ge_TrEeTensor);
+                    Dho,Dho2inv,Dho2_u_inv,Dho2_v_inv);
             }
             PhiEq = sqrt(1.5*devPhi.dotprod());
     
@@ -705,7 +749,13 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL
             STensorOperation::inverseSTensor3(Fp1,Fpinv);
             STensorOperation::multSTensor3(F,Fpinv,Fe);
             STensorOperation::multSTensor3FirstTranspose(Fe,Fe,Ce);
-            STensorOperation::logSTensor3(Ce,_order,Ee,&DlnDCe,&DDlnDDCe);
+
+            bool ok=STensorOperation::logSTensor3(Ce,_order,Ee,&DlnDCe,&DDlnDDCe);
+            if(!ok)
+            {
+              P(0,0) = P(1,1) = P(2,2) = sqrt(-1.);
+              return;
+            }
             Ee *= 0.5;
             
             // Corrected corKir, mandel, backStress are already in the IP due to getIterated_DPhi
@@ -735,12 +785,13 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL
         } // 2nd if
         else{
             q1->getRefToDissipationActive() = false;
+        	// Msg::Error("Elasticity");
         }
     } // 1st if
     
     const STensor3& KS = q1->_kirchhoff;
+
     mlawNonLinearTVP::getModifiedMandel(Ce, q0, q1); // update Mandel
-    
     const STensor3& MS = q1->_ModMandel;
     Me = MS;
     // second Piola Kirchhoff stress
@@ -762,6 +813,10 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL
     STensor3& Dpsi_DE = q1->getRefTo_Dpsi_DE();
     q1->_elasticEnergy = mlawNonLinearTVM::freeEnergyMechanical(*q0,*q1,T0,T,&Dpsi_DT,&Dpsi_DE);
 
+    // TVP energy
+    double psi_TVP = freeEnergyPlasticity(q0,q1,T0,T);
+    // q1->_elasticEnergy += psi_TVP;
+
     // Mullins Effect
     if (_mullinsEffect != NULL && q1->_ipMullinsEffect != NULL){
         mlawNonLinearTVM::calculateMullinsEffectScaler(q0, q1, T, &Dpsi_DT);
@@ -1010,7 +1065,8 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL
             for (int i=0; i<3; i++)
               for (int j=0; j<3; j++){
                 DphiPDCepr(i,j) += ( - Ke* 2.*_b*ptilde*DGDCepr(i,j) 
-                                    - 2.*_b*pow(kk,1)/3. * ( (dHb/Cxtr - Hb/pow(Cxtr,2)*dCxtrdDgamma)*DgammaDCepr(i,j)*Gamma*ptilde + Hb/Cxtr*DGDCepr(i,j)*ptilde ) ); 
+                                    - 2.*_b*pow(kk,1)/3. * ( (dHb/Cxtr - Hb/pow(Cxtr,2)*dCxtrdDgamma)*DgammaDCepr(i,j)*Gamma*ptilde + Hb/Cxtr*DGDCepr(i,j)*ptilde ) 
+                                    + 1./3.*trXn/pow(Cxtr,2)*dCxtrdDgamma*DgammaDCepr(i,j)); 
                                     // DEBUG pow(kk,2)
               }
             DphiPDCepr *= Dho2_v_inv;
@@ -1039,7 +1095,8 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL
                   for (int l=0; l<3; l++){
                       
                     DdevphiDCepr_RHS(i,j,k,l) += ( 0.5*( G1(i,j,k,l) - _I(i,j)*DpDCepr(k,l) ) 
-                - 3.*pow(kk,1)*( ( dHb/Cxdev - Hb/pow(Cxdev,2)*dCxdevdDgamma )*Gamma*devPhi(i,j)*DgammaDCepr(k,l) + Hb/Cxdev*devPhi(i,j)*DGDCepr(k,l) ) ); // DEBUG pow(kk,2)
+                            - 3.*pow(kk,1)*( ( dHb/Cxdev - Hb/pow(Cxdev,2)*dCxdevdDgamma )*Gamma*devPhi(i,j)*DgammaDCepr(k,l) + Hb/Cxdev*devPhi(i,j)*DGDCepr(k,l) ) 
+                            + 1./pow(Cxdev,2)*dCxdevdDgamma*devXn(i,j)*DgammaDCepr(k,l)); // DEBUG pow(kk,2)
                 
                     for (int p=0; p<3; p++)
                       for (int q=0; q<3; q++){
@@ -1126,11 +1183,13 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL
             for (int i=0; i<3; i++)
               for (int j=0; j<3; j++){
                 dTrXdCepr(i,j) = pow(kk,1.)*( (dHb/Cxtr - Hb/pow(Cxtr,2)*dCxtrdDgamma)*Gamma*trN*DgammaDCepr(i,j) +
-                                    Hb/Cxtr*( trN*DGDCepr(i,j) + Gamma*DtrNDCepr(i,j) ) ); // pow(kk,2.) DEBUG
+                                        Hb/Cxtr*( trN*DGDCepr(i,j) + Gamma*DtrNDCepr(i,j) ) )
+                                        - trXn/pow(Cxtr,2)*dCxtrdDgamma*DgammaDCepr(i,j); // pow(kk,2.) DEBUG
                 for (int k=0; k<3; k++)
                   for (int l=0; l<3; l++){
-                    dDevXdCepr(i,j,k,l) = pow(kk,1.)*( (dHb/Cxdev - Hb/pow(Cxdev,2)*dCxtrdDgamma)*Gamma*devN(i,j)*DgammaDCepr(k,l) +
-                                    Hb/Cxdev*( devN(i,j)*DGDCepr(k,l) + Gamma*DdevNDCepr(i,j,k,l) ) ); // pow(kk,2.) DEBUG
+                    dDevXdCepr(i,j,k,l) = pow(kk,1.)*( (dHb/Cxdev - Hb/pow(Cxdev,2)*dCxdevdDgamma)*Gamma*devN(i,j)*DgammaDCepr(k,l) +
+                                                Hb/Cxdev*( devN(i,j)*DGDCepr(k,l) + Gamma*DdevNDCepr(i,j,k,l) ) )
+                                                - 1./pow(Cxdev,2)*dCxdevdDgamma*devXn(i,j)*DgammaDCepr(k,l); // pow(kk,2.) DEBUG
                   }
                 }
                 
@@ -1347,7 +1406,9 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL
             DpDT = DcorKirDT.trace()/3.;
             
             // 5.2 update dPhiPdT, dDevPhiDT to get dAdT, dfdT, dgdT
-            dPhiPdT = DpDT + Ke*(-2*_b*ptilde*dGammaDT) - 2.*_b*pow(kk,1)/3.*( (dHbdT/Cxtr - Hb/pow(Cxtr,2)*dCxtrdT ) *Gamma*ptilde + Hb/Cxtr*dGammaDT*ptilde ); // pow(kk,2.) DEBUG
+            dPhiPdT = DpDT + Ke*(-2*_b*ptilde*dGammaDT) 
+                        - 2.*_b*pow(kk,1)/3.*( (dHbdT/Cxtr - Hb/pow(Cxtr,2)*dCxtrdT ) *Gamma*ptilde + Hb/Cxtr*dGammaDT*ptilde )
+                        + 1./3.*trXn/pow(Cxtr,2)*dCxtrdT ; // pow(kk,2.) DEBUG
             dPhiPdT *= Dho2_v_inv;
             
             // 5.3 update DpDT
@@ -1358,7 +1419,8 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL
             for (int i=0; i<3; i++)
               for (int j=0; j<3; j++){
                 DdevphiDT_RHS(i,j) = 0.5*( dDevCorKirDT(i,j) - DpDT*_I(i,j)) 
-                    - 3*pow(kk,1)*( (dHbdT/Cxdev - Hb/pow(Cxdev,2)*dCxdevdT)*Gamma*devPhi(i,j) + Hb/Cxdev*dGammaDT*devPhi(i,j) ) ;// pow(kk,2.) DEBUG
+                                        - 3*pow(kk,1)*( (dHbdT/Cxdev - Hb/pow(Cxdev,2)*dCxdevdT)*Gamma*devPhi(i,j) + Hb/Cxdev*dGammaDT*devPhi(i,j) ) 
+                                        + 1./pow(Cxdev,2)*dCxdevdT*devXn(i,j);  // pow(kk,2.) DEBUG
                 for (int k=0; k<3; k++)
                   for (int l=0; l<3; l++){
                     DdevphiDT_RHS(i,j) += 0.5*( -3*dGammaDT*Ge_Tensor(i,j,k,l)*devPhi(k,l) 
@@ -1403,7 +1465,9 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL
             DpDT = DcorKirDT.trace()/3.;
             
             // 10. update dPhiPdT
-            dPhiPdT = DpDT + Ke*(-2*_b*ptilde*dGammaDT) - 2.*_b*pow(kk,1)/3.*( (dHbdT/Cxtr - Hb/pow(Cxtr,2)*dCxtrdT ) *Gamma*ptilde + Hb/Cxtr*dGammaDT*ptilde ); // pow(kk,2.) DEBUG
+            dPhiPdT = DpDT + Ke*(-2*_b*ptilde*dGammaDT) 
+                        - 2.*_b*pow(kk,1)/3.*( (dHbdT/Cxtr - Hb/pow(Cxtr,2)*dCxtrdT ) *Gamma*ptilde + Hb/Cxtr*dGammaDT*ptilde )
+                        + 1./3.*trXn/pow(Cxtr,2)*dCxtrdT ; // pow(kk,2.) DEBUG
             dPhiPdT *= Dho2_v_inv;
             
             // 10.1 update DpDT 2
@@ -1414,7 +1478,8 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL
             for (int i=0; i<3; i++)
               for (int j=0; j<3; j++){
                 DdevphiDT_RHS(i,j) = 0.5*( dDevCorKirDT(i,j) - DpDT*_I(i,j)) 
-                    - 3*pow(kk,1)*( (dHbdT/Cxdev - Hb/pow(Cxdev,2)*dCxdevdT)*Gamma*devPhi(i,j) + Hb/Cxdev*dGammaDT*devPhi(i,j) ) ;// pow(kk,2.) DEBUG
+                                    - 3*pow(kk,1)*( (dHbdT/Cxdev - Hb/pow(Cxdev,2)*dCxdevdT)*Gamma*devPhi(i,j) + Hb/Cxdev*dGammaDT*devPhi(i,j) ) 
+                                    + 1./pow(Cxdev,2)*dCxdevdT*devXn(i,j);   // pow(kk,2.) DEBUG
                 for (int k=0; k<3; k++)
                   for (int l=0; l<3; l++){
                     DdevphiDT_RHS(i,j) += 0.5*( -3*dGammaDT*Ge_Tensor(i,j,k,l)*devPhi(k,l) 
@@ -1459,10 +1524,11 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL
                 }
             
             // 14. dXdT - backstress temperature derivative -> correction - CHECK!!!
-            DtrXdT = pow(kk,1.)*( (dHbdT/Cxtr - Hb/pow(Cxtr,2)*dCxtrdT ) *Gamma*trN + Hb/Cxtr*(dGammaDT*trN + Gamma*DtrNdT) ); // pow(kk,2.) DEBUG
+            DtrXdT = pow(kk,1.)*( (dHbdT/Cxtr - Hb/pow(Cxtr,2)*dCxtrdT ) *Gamma*trN + Hb/Cxtr*(dGammaDT*trN + Gamma*DtrNdT) ) - trXn/pow(Cxtr,2)*dCxtrdT; // pow(kk,2.) DEBUG
             for (int i=0; i<3; i++)
               for (int j=0; j<3; j++)
-                DdevXdT(i,j) = pow(kk,1.)*( (dHbdT/Cxdev - Hb/pow(Cxdev,2)*dCxdevdT)*Gamma*devN(i,j) + Hb/Cxdev*( dGammaDT*devN(i,j) + Gamma*DdevNdT(i,j) ) ) ;  // pow(kk,2.) DEBUG
+                DdevXdT(i,j) = pow(kk,1.)*( (dHbdT/Cxdev - Hb/pow(Cxdev,2)*dCxdevdT)*Gamma*devN(i,j) + Hb/Cxdev*( dGammaDT*devN(i,j) + Gamma*DdevNdT(i,j) ) ) 
+                                - 1./pow(Cxdev,2)*dCxdevdT * devXn(i,j);  // pow(kk,2.) DEBUG
 
             STensorOperation::zero(dXdT);
             dXdT = DdevXdT;
@@ -1681,13 +1747,22 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL
     double& dWmdT_TVE = q1->getRefTodMechSrcTVEdT();
     STensor3& dWmdF_TVE = q1->getRefTodMechSrcTVEdF();
     static STensor3 dWmdE_TVE;
-    getMechSource_nonLinearTVE_term(q0,q1,T0,T,Wm_TVE,stiff,dWmdE_TVE,dWmdT_TVE);
+    mlawNonLinearTVM::getMechSource_nonLinearTVE_term(q0,q1,T0,T,Wm_TVE,stiff,dWmdE_TVE,dWmdT_TVE);
     mechanicalSource += Wm_TVE;
 
     // 3) Viscoplastic Contribution to mechSrc
     getMechSourceTVP(F0,F,q0,q1,T0,T,Fepr,Cepr,DphiPDF,&Wm_TVP);
     mechanicalSource += Wm_TVP;
 
+    // Compute mechanicalSource for Mullin's Effect
+    if (_mullinsEffect != NULL && q1->_ipMullinsEffect != NULL){
+
+        mechanicalSource *= q1->_ipMullinsEffect->getEta();
+        if (this->getTimeStep() > 0){
+            mechanicalSource -= q1->_ipMullinsEffect->getDpsiNew_DpsiMax()*(q1->_ipMullinsEffect->getpsiMax() - q0->_ipMullinsEffect->getpsiMax())/this->getTimeStep();
+        }
+    }
+
     // freeEnergy and elastic energy
     double& psiTVM = q1->getRefToFreeEnergyTVM();
     // getFreeEnergyTVM(q0,q1,T0,T,&psiTVM,NULL);
@@ -1866,9 +1941,8 @@ void mlawNonLinearTVENonLinearTVP::getDho(const double& Gamma, const STensor3& C
           for (int p=0; p<3; p++)
             for (int q=0; q<3; q++)
               for (int r=0; r<3; r++)
-                for (int s=0; s<3; s++)
-                    dDhoHdH(i,j,k,l) += 0.5*(dHinvHinvdH(i,p,k,l)*CeprKSCeinvpr(p,q)*expGN(r,s)*expGN(s,j) +
-                                               Hinv(i,p)*Hinv(p,q)*CeprKSCeinvpr(q,r)*dHHdH(s,j,k,l));
+                dDhoHdH(i,j,k,l) += (dHinvHinvdH(i,p,k,l)*CeprKSCeinvpr(p,q)*expGN(q,r)*expGN(r,j) +
+                                               Hinv(i,p)*Hinv(p,q)*CeprKSCeinvpr(q,r)*dHHdH(r,j,k,l)); // 0.5* - CHECKERS
          }
 
   // Dho -> 1st term
@@ -1963,7 +2037,7 @@ void mlawNonLinearTVENonLinearTVP::getDho(const double& Gamma, const STensor3& C
           Dho2_u(i,j,k,l) += 3*Gamma*pow(kk,1)*Hb/Cxdev * _I4(i,j,k,l); // DEBUG pow(kk,2)
           for (int p=0; p<3; p++)
             for (int q=0; q<3; q++){
-                Dho2_u(i,j,k,l) += 1.5*Gamma*(Ge_Tensor(i,j,p,q)*_I4(p,q,k,l) - Dho(i,j,p,q)*_I4(p,q,k,l));
+                Dho2_u(i,j,k,l) += 1.5*Gamma*(Ge_Tensor(i,j,p,q)*_Idev(p,q,k,l) - Dho(i,j,p,q)*_I4(p,q,k,l)); // Ge_Tensor(i,j,p,q)*_I4(p,q,k,l) - CHECKERS
         }
       }
   if (Ge_TrEeTensor!= NULL){
@@ -2015,18 +2089,29 @@ void mlawNonLinearTVENonLinearTVP::getIterated_DPhi(const double& T0, const doub
     
   // Initialise Ee
   static STensor3 Ee;
+  /*
   for (int i=0; i<3; i++)
     for (int j=0; j<3; j++)
-      Ee(i,j) = Eepr(i,j) - Gamma*N(i,j);
-  
+      Ee(i,j) = Eepr(i,j) - Gamma*N(i,j);*/
+  bool ok=STensorOperation::logSTensor3(Ce,_order,Ee);
+  if(!ok)
+  {
+    Phi(0,0) = Phi(1,1) = Phi(2,2) = sqrt(-1.);
+    return;
+  }
+  Ee *= 0.5;
+
   // Initialise corKir
   static STensor3 KS;
   static STensor43 Bd_stiffnessTerm;
+  double DKDTsum, DGDTsum;
   if (Ge_TrEeTensor == NULL){
-    mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(Ee,q0->_Ee,q0,q1,Ke,Ge,T0,T,true,Bd_stiffnessTerm);
+    // mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(Ee,q0->_Ee,q0,q1,Ke,Ge,T0,T,true,Bd_stiffnessTerm);
+    mlawNonLinearTVM::ThermoViscoElasticPredictor(Ee,q0->_Ee,q0,q1,Ke,Ge,DKDTsum,DGDTsum,T0,T,true,Bd_stiffnessTerm);
   }
   else{ // TC asymmetry
-    mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(Ee,q0->_Ee,q0,q1,Ke,Ge,T0,T,true,Bd_stiffnessTerm,Ge_TrEeTensor);
+    // mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(Ee,q0->_Ee,q0,q1,Ke,Ge,T0,T,true,Bd_stiffnessTerm,Ge_TrEeTensor);
+    mlawNonLinearTVM::ThermoViscoElasticPredictor(Ee,q0->_Ee,q0,q1,Ke,Ge,DKDTsum,DGDTsum,T0,T,true,Bd_stiffnessTerm,Ge_TrEeTensor);
   }
   Ge_Tensor = _I4;
   Ge_Tensor *= Ge*2; // *2 because the function doesnt do it
@@ -2065,11 +2150,11 @@ void mlawNonLinearTVENonLinearTVP::getIterated_DPhi(const double& T0, const doub
 
   // Initialise J_tol
   double J_tol = 0.;
-  for (int i=0; i<3; i++){
-    for (int j=0; j<3; j++){
-      J_tol += abs(J(i,j)) ;
-    }
-  }
+  J_tol = J.norm0();
+  J_tol/=(_K+_G);
+  for (int i=0; i<3; i++)
+    for (int j=0; j<3; j++)
+      // J_tol += abs(J(i,j)) ;
 
   // Initialise Dho, Dho2, Dho2inv
   if (Ge_TrEeTensor == NULL){
@@ -2083,17 +2168,81 @@ void mlawNonLinearTVENonLinearTVP::getIterated_DPhi(const double& T0, const doub
   static STensor3 DPhi;
 
   // Initialise numerical quantities
-  /*
-  static STensor3 Phi_plus, J_plus, devPhi_plus, N_plus, Ee_plus,sigExtra_plus;
-  double pPhi_plus, perturbation_factor;
-  static STensor43 dJdPhi_plus, dJdPhi_plus_inv;*/
+  static STensor3 Phi_plus, J_plus, devPhi_plus, N_plus, GammaN_plus, Ee_plus, Ce_plus, KS_plus, MS_plus, expGN_plus, Hinv_plus, devN_plus, devX_plus;
+  double pPhi_plus,Ke_plus,Ge_plus, trN_plus, trX_plus;
+  static STensor43 dJdPhi_plus, dJdPhi_plus_inv, dexpAdA_plus, Bd_stiffnessTerm_plus,Ge_Tensor_plus;
+  STensor43* Ge_TrEeTensor_plus = NULL;
+  static IPNonLinearTVP q1_plus(*q0);
 
   int ite = 0;
-  int maxite = 1000;
+  int maxite = 100;
 
   double tol = 1e-9;
   while (fabs(J_tol) > tol or ite <1){
 
+	  // numerical Dho4inv (Jacobian dJ/dPhi)
+	  	  // _perturbationfactor = DPhi_numerical
+	  /*
+	  for (int i=0; i<3; i++){
+	     for (int j=0; j<3; j++){
+	        Phi_plus = Phi;
+	        Phi_plus(i,j) += 0.5*_perturbationfactor;
+	        Phi_plus(j,i) += 0.5*_perturbationfactor;
+	        STensorOperation::decomposeDevTr(Phi_plus,devPhi_plus,pPhi_plus);
+	        pPhi_plus = Phi_plus.trace()/3;
+	        N_plus = _I;
+	        N_plus *= 2.*_b/3;
+	        N_plus += 3*devPhi_plus;
+	        GammaN_plus = N_plus;
+	        GammaN_plus *= Gamma;
+	        STensorOperation::expSTensor3(GammaN_plus,_order,expGN_plus,&dexpAdA_plus);
+	        STensorOperation::inverseSTensor3(expGN_plus,Hinv_plus);
+
+	        // update Ce, Ceinv
+	        for (int ii=0; ii<3; ii++)
+	          for (int jj=0; jj<3; jj++){
+	        	Ce_plus(ii,jj) = 0.;
+	            for (int kk=0; kk<3; kk++)
+	              for (int ll=0; ll<3; ll++)
+	            	Ce_plus(ii,jj) += Hinv_plus(ii,kk)*Hinv_plus(kk,ll)*Cepr(ll,jj);
+	          }
+
+	        Ee_plus = - Gamma*N_plus;
+	        Ee_plus += Eepr(i,j);
+	        if (Ge_TrEeTensor_plus == NULL){
+	          mlawNonLinearTVM::ThermoViscoElasticPredictor(Ee_plus,q0->_Ee,q0,&q1_plus,Ke_plus,Ge_plus,DKDTsum,DGDTsum,T0,T,true,Bd_stiffnessTerm_plus);
+	        }
+	        else{ // TC asymmetry
+	          mlawNonLinearTVM::ThermoViscoElasticPredictor(Ee_plus,q0->_Ee,q0,&q1_plus,Ke_plus,Ge_plus,DKDTsum,DGDTsum,T0,T,true,Bd_stiffnessTerm_plus,Ge_TrEeTensor_plus);
+	        }
+	        Ge_Tensor_plus = _I4;
+	        Ge_Tensor_plus *= Ge_plus*2; // *2 because the function doesnt do it
+	        Ge_Tensor_plus += Bd_stiffnessTerm_plus;
+	        KS_plus = q1_plus._kirchhoff;
+
+	        // update mandel
+	        mlawNonLinearTVP::getModifiedMandel(Ce_plus, q0, &q1_plus);
+	        MS_plus = q1_plus._ModMandel;
+
+	        STensorOperation::decomposeDevTr(N_plus,devN_plus,trN_plus);
+	        devX_plus = pow(kk,1)*Hb*Gamma*devN_plus + devXn;      // pow(kk,2) DEBUG
+	        devX_plus *= 1./Cxdev;
+	        trX_plus = (pow(kk,1)*Hb*Gamma*trN_plus + trXn)*1./Cxtr; // pow(kk,2) DEBUG
+	        q1_plus._backsig = devX_plus;
+	        q1_plus._backsig(0,0) += trX_plus/3.;
+	        q1_plus._backsig(1,1) += trX_plus/3.;
+	        q1_plus._backsig(2,2) += trX_plus/3.;
+
+	        for (int k=0; k<3; k++){
+	          for (int l=0; l<3; l++){
+	            J_plus(k,l) = Phi_plus(k,l) - MS_plus(k,l) + q1_plus._backsig(k,l);
+	            dJdPhi_plus(k,l,i,j) = (J_plus(k,l) - J(k,l))/(_perturbationfactor);
+	          }
+	        }
+	      }
+	    }
+	   STensorOperation::inverseSTensor43(dJdPhi_plus,dJdPhi_plus_inv);*/
+
      // update DPhi
      for (int i=0; i<3; i++)
        for (int j=0; j<3; j++){
@@ -2140,16 +2289,26 @@ void mlawNonLinearTVENonLinearTVP::getIterated_DPhi(const double& T0, const doub
         }
 
       // update Ee
+      /*
       for (int i=0; i<3; i++)
         for (int j=0; j<3; j++)
-          Ee(i,j) = Eepr(i,j) - Gamma*N(i,j);
+          Ee(i,j) = Eepr(i,j) - Gamma*N(i,j);*/
+      bool ok=STensorOperation::logSTensor3(Ce,_order,Ee);
+      if(!ok)
+      {
+        Phi(0,0) = Phi(1,1) = Phi(2,2) = sqrt(-1.);
+        return;
+      }
+      Ee *= 0.5;
   
       // update corKir
       if (Ge_TrEeTensor == NULL){
-        mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(Ee,q0->_Ee,q0,q1,Ke,Ge,T0,T,true,Bd_stiffnessTerm);
+        // mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(Ee,q0->_Ee,q0,q1,Ke,Ge,T0,T,true,Bd_stiffnessTerm);
+        mlawNonLinearTVM::ThermoViscoElasticPredictor(Ee,q0->_Ee,q0,q1,Ke,Ge,DKDTsum,DGDTsum,T0,T,true,Bd_stiffnessTerm);
       }
       else{ // TC asymmetry
-        mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(Ee,q0->_Ee,q0,q1,Ke,Ge,T0,T,true,Bd_stiffnessTerm,Ge_TrEeTensor);
+        // mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(Ee,q0->_Ee,q0,q1,Ke,Ge,T0,T,true,Bd_stiffnessTerm,Ge_TrEeTensor);
+        mlawNonLinearTVM::ThermoViscoElasticPredictor(Ee,q0->_Ee,q0,q1,Ke,Ge,DKDTsum,DGDTsum,T0,T,true,Bd_stiffnessTerm, Ge_TrEeTensor);
       }  
       Ge_Tensor = _I4;
       Ge_Tensor *= Ge*2; // *2 because the function doesnt do it
@@ -2195,16 +2354,17 @@ void mlawNonLinearTVENonLinearTVP::getIterated_DPhi(const double& T0, const doub
 
       J_tol = J.norm0();
       J_tol/=(_K+_G);
+      // J_tol/=(1.e+10);
 
       ite++;
 
-      //if (ite> maxite-5)
-      // Msg::Info("it = %d, tol %e, J_tol = %e, Gamma = %e",ite,tol,J_tol,Gamma);
+      // if (ite> maxite-5)
+      // Msg::Info("ite = %d, tol %e, J_tol = %e, Gamma = %e",ite,tol,J_tol,Gamma);
 
       if (fabs(J_tol) <_tol) break;
 
       if(ite > maxite){
-        Msg::Error("No convergence for iterated Phi mlawNonLinearTVENonLinearTVP nonAssociatedFlow Maxwell iter = %d, J_tol = %e!!",ite,J_tol);
+        Msg::Error("No convergence for iterated Phi mlawNonLinearTVENonLinearTVP nonAssociatedFlow iter = %d, J_tol = %e!!",ite,J_tol);
         Phi(0,0) = Phi(1,1) = Phi(2,2) = sqrt(-1.);
        return;
        }
@@ -2679,4 +2839,4 @@ void mlawNonLinearTVENonLinearTVP::TEST_predictorCorrector_TVP_nonAssociatedFlow
                 dHHdH_plus(k,l,i,j) = (HH_plus(k,l) - HH(k,l))/(_perturbationfactor);
                 dHinvHinvdH_plus(k,l,i,j) = (HinvHinv_plus(k,l) - HinvHinv(k,l))/(_perturbationfactor);
            }
-*/
\ No newline at end of file
+*/
diff --git a/NonLinearSolver/materialLaw/mlawNonLinearTVENonLinearTVP.h b/NonLinearSolver/materialLaw/mlawNonLinearTVENonLinearTVP.h
index 0b2fc4f1b25d887cb9f0beb8e7232f9b44c36473..981f958f0050801dd03f7826850831f351619b60 100644
--- a/NonLinearSolver/materialLaw/mlawNonLinearTVENonLinearTVP.h
+++ b/NonLinearSolver/materialLaw/mlawNonLinearTVENonLinearTVP.h
@@ -19,6 +19,7 @@ class mlawNonLinearTVENonLinearTVP : public mlawNonLinearTVP{
     protected:
 
     protected:
+		virtual double freeEnergyPlasticity(const IPNonLinearTVP *q0, IPNonLinearTVP *q1, const double T0, const double T) const;
 
         virtual void getIterated_DPhi(const double& T0, const double& T, const IPNonLinearTVP *q0, IPNonLinearTVP *q1,
                                             const double& Gamma, const double& Cxtr, const double& Cxdev,
diff --git a/NonLinearSolver/materialLaw/mlawNonLinearTVM.cpp b/NonLinearSolver/materialLaw/mlawNonLinearTVM.cpp
index 800287d6854a190e786bc69cdc71b2a18b336bfe..e235103549c8c13c2e9b3a05870bfc8ab9d4b9e4 100644
--- a/NonLinearSolver/materialLaw/mlawNonLinearTVM.cpp
+++ b/NonLinearSolver/materialLaw/mlawNonLinearTVM.cpp
@@ -21,7 +21,9 @@ mlawNonLinearTVM::mlawNonLinearTVM(const int num,const double E,const double nu,
      mlawPowerYieldHyper(num, E, nu, rho, tol, matrixbyPerturbation, pert),
      _Tinitial(Tinitial),_scalarAlpha(Alpha),_scalarK(KThCon),_Cp(Cp),
      _thermalEstimationPreviousConfig(thermalEstimationPreviousConfig), _mullinsEffect(NULL), _elasticPotential(NULL), 
-     _useExtraBranch(false), _useExtraBranch_TVE(false), _ExtraBranch_TVE_option(2){
+     _useExtraBranch(false), _useExtraBranch_TVE(false), _ExtraBranch_TVE_option(2), _V0(0.),_V1(0.),_V2(0.),_D0(0.),_D1(0.),_D2(0.),_Ci(0.),
+	 _V3(0.),_V4(0.),_V5(0.),_D3(0.),_D4(0.),_D5(0.){
+
 
   _G = _mu;
 
@@ -61,7 +63,9 @@ mlawNonLinearTVM::mlawNonLinearTVM(const mlawNonLinearTVM& src): mlawPowerYieldH
   _useExtraBranch = src._useExtraBranch;
   _useExtraBranch_TVE = src._useExtraBranch_TVE;
   _ExtraBranch_TVE_option = src._ExtraBranch_TVE_option;
-    
+  _V0 = src._V0; _V1 = src._V1; _V2 = src._V2; _D0 = src._D0; _D1 = src._D1; _D2 = src._D2; _Ci = src._Ci;
+  _V3 = src._V3; _V4 = src._V4; _V5 = src._V5; _D3 = src._D3; _D4 = src._D4; _D5 = src._D5;
+
   _temFunc_K = NULL;                                                                    // bulk modulus
   if (src._temFunc_K != NULL){ _temFunc_K = src._temFunc_K->clone();}
 
@@ -110,6 +114,9 @@ mlawNonLinearTVM& mlawNonLinearTVM::operator=(const materialLaw &source){
     _useExtraBranch = src->_useExtraBranch;
     _useExtraBranch_TVE = src->_useExtraBranch_TVE;
     _ExtraBranch_TVE_option = src->_ExtraBranch_TVE_option;
+    _V0 = src->_V0; _V1 = src->_V1; _V2 = src->_V2; _D0 = src->_D0; _D1 = src->_D1; _D2 = src->_D2; _Ci = src->_Ci;
+    _V3 = src->_V3; _V4 = src->_V4; _V5 = src->_V5; _D3 = src->_D3; _D4 = src->_D4; _D5 = src->_D5;
+
     
     if(_temFunc_K != NULL) delete _temFunc_K;                                                   // bulk modulus
     if (src->_temFunc_K != NULL){ _temFunc_K = src->_temFunc_K->clone();}
@@ -159,10 +166,11 @@ void mlawNonLinearTVM::setViscoElasticNumberOfElement(const int N){
   Msg::Info("Numer of Spring/Dashpot for viscoelastic model: %d",_N);
   _Ki.clear(); _ki.clear();
   _Gi.clear(); _gi.clear();
-  _Ki.resize(_N,0.);
-  _ki.resize(_N,0.);
-  _Gi.resize(_N,0.);
-  _gi.resize(_N,0.);
+  _Ki.resize(_N,0.); _ki.resize(_N,0.);
+  _Gi.resize(_N,0.); _gi.resize(_N,0.);
+  _V0.clear(); _V1.clear(); _V2.clear(); _D0.clear(); _D1.clear(); _D2.clear(); _Ci.clear(); _V3.clear(); _V4.clear(); _V5.clear(); _D3.clear(); _D4.clear(); _D5.clear();
+  _V0.resize(_N,0.); _V1.resize(_N,0.); _V2.resize(_N,0.); _D0.resize(_N,0.); _D1.resize(_N,0.); _D2.resize(_N,0.); _Ci.resize(_N,0.);
+  _V3.resize(_N,0.); _V4.resize(_N,0.); _V5.resize(_N,0.); _D3.resize(_N,0.); _D4.resize(_N,0.); _D5.resize(_N,0.);
 };
 
 void mlawNonLinearTVM::setViscoElasticData(const int i, const double Ei, const double taui){
@@ -182,6 +190,46 @@ void mlawNonLinearTVM::setViscoElasticData(const int i, const double Ei, const d
   }
 };
 
+void mlawNonLinearTVM::setCorrectionsAllBranchesTVE(const int i, const double V1, const double V2, const double D1, const double D2){
+  if (i> _N or i<1)
+    Msg::Error("This setting is invalid %d > %d",i,_N);
+  else{
+    _V1[i-1] = V1; _V2[i-1] = V2; _D1[i-1] = D1; _D2[i-1] = D2;
+
+    Msg::Info("setting: element=%d, V1 = %e, V2 = %e, D1 = %e, D2 = %e",i-1,V1,V2,D1,D2);
+  }
+};
+
+void mlawNonLinearTVM::setAdditionalCorrectionsAllBranchesTVE(const int i, const double V3, const double D3){
+  if (i> _N or i<1)
+    Msg::Error("This setting is invalid %d > %d",i,_N);
+  else{
+    _V3[i-1] = V3; _D3[i-1] = D3;
+
+    Msg::Info("setting: element=%d, V3 = %e, D3 = %e",i-1,V3,D3);
+  }
+};
+
+void mlawNonLinearTVM::setAdditionalCorrectionsAllBranchesTVE(const int i, const double V3, const double V4, const double V5, const double D3, const double D4, const double D5){
+  if (i> _N or i<1)
+    Msg::Error("This setting is invalid %d > %d",i,_N);
+  else{
+    _V3[i-1] = V3; _V4[i-1] = V4; _V5[i-1] = V5; _D3[i-1] = D3; _D4[i-1] = D4; _D5[i-1] = D5;
+
+    Msg::Info("setting: element=%d, V3 = %e, V4 = %e, V5 = %e, D3 = %e, D4 = %e, D5 = %e",i-1,V3,V4,V5,D3,D4,D5);
+  }
+};
+
+void mlawNonLinearTVM::setCompressionCorrectionsAllBranchesTVE(const int i, const double Ci){
+  if (i> _N or i<1)
+    Msg::Error("This setting is invalid %d > %d",i,_N);
+  else{
+    _Ci[i-1] = Ci;
+
+    Msg::Info("setting: element=%d, Ci = %e",i-1,Ci);
+  }
+};
+
 void mlawNonLinearTVM::setViscoElasticData_Bulk(const int i, const double Ki, const double ki){
   if (i> _N or i<1)
     Msg::Error("This setting is invalid %d > %d",i,_N);
@@ -354,8 +402,8 @@ double mlawNonLinearTVM::setTemp(const double T0, const double T1, const int par
 double mlawNonLinearTVM::freeEnergyMechanical(const IPNonLinearTVM& q0, IPNonLinearTVM& q, const double T0, const double T, double* DpsiDT, STensor3* DpsiDE) const{
 
     // Update the Properties to the current temperature (see below which ones are being used)
-    double KT, GT, AlphaT, dKdT, dGdT, dAlphaTdT; 
-    getK(&q,KT,T,&dKdT); getG(&q,GT,T,&dGdT); getAlpha(AlphaT,T,&dAlphaTdT);
+    double KT, GT, AlphaT0, AlphaT, dKdT, dGdT, dAlphaTdT; 
+    getK(&q,KT,T,&dKdT); getG(&q,GT,T,&dGdT); getAlpha(AlphaT,T,&dAlphaTdT); getAlpha(AlphaT0,T);
 
     double Psy_mech = 0.;
 
@@ -369,7 +417,9 @@ double mlawNonLinearTVM::freeEnergyMechanical(const IPNonLinearTVM& q0, IPNonLin
 
     // Get thermal strain
     double Eth = 3.*AlphaT*(T-_Tinitial);
-
+    double eff_trDE = q._trDE - 3.*(AlphaT*(T-_Tinitial) - AlphaT0*(T0-_Tinitial));
+    double Deff_trDE_DT = -3.*(dAlphaTdT*(T-_Tinitial) + AlphaT);
+        
     // Get Equilibrium freeEnergy_mech
     Psy_mech = KT*0.5*(trEe-Eth)*(trEe-Eth) + GT*STensorOperation::doubledot(devEe,devEe);
     
@@ -408,7 +458,7 @@ double mlawNonLinearTVM::freeEnergyMechanical(const IPNonLinearTVM& q0, IPNonLin
                     // Psy_mech += q._psi_branch[i];*/
                     Msg::Info("setting: _ExtraBranch_TVE_option=%d integrates the viscoelastic stress and currently has no definition for deformation energy. Don't use it with     mullin's effect",_ExtraBranch_TVE_option);
                 }
-                else if (_ExtraBranch_TVE_option == 2 || _ExtraBranch_TVE_option == 3){ 
+                else if (_ExtraBranch_TVE_option == 2 || _ExtraBranch_TVE_option == 3 || _ExtraBranch_TVE_option == 4 || _ExtraBranch_TVE_option == 5){
                     Psy_mech += _Ki[i]*q._intAv_TVE_vector[i] + 2*_Gi[i]*q._intBd_TVE_vector[i];
                 }
             }
@@ -428,25 +478,30 @@ double mlawNonLinearTVM::freeEnergyMechanical(const IPNonLinearTVM& q0, IPNonLin
                 
         // extraBranch terms
         if (_useExtraBranch){
-            if(_extraBranchNLType != TensionCompressionRegularisedType){
-                *DpsiDT += KT*q._intA*_temFunc_elasticCorrection_Bulk->getDiff(T) + dKdT*q._intA + 
-                            2.*GT*q._intB*_temFunc_elasticCorrection_Shear->getDiff(T) + 2.*dGdT*q._intB;
+            // q._elasticBulkPropertyScaleFactor = -1 + Av // Same applies to intA, etc
+            
+            if(_extraBranchNLType != TensionCompressionRegularisedType && _extraBranchNLType != hyper_exp_TCasymm_Type){
+                (*DpsiDT) += dKdT*q._intA + KT* (q._elasticBulkPropertyScaleFactor) *(trEe-Eth)* (-3*dAlphaTdT*(T-_Tinitial)-3*AlphaT) + 
+                            2.*dGdT*q._intB;
                 (*DpsiDE) += q._corKirExtra;
             }
             else{
+                // _intA, _intB have CTasymm
+    
                 // Regularising function
                 double m = _tensionCompressionRegularisation;
-                double expmtr(0.);
-                if (exp(-m*trEe)<1.e+10){ expmtr = exp(-m*trEe);}
+                double expmtr = exp(-m*(trEe-Eth));
                 double sigmoid = 1/(1.+expmtr);
                 double CTasymm = sigmoid + _compCorrection*(1.-sigmoid);
-                double dCTasymmDtrE = m*expmtr/pow((1.+expmtr),2.) - _compCorrection*m*expmtr/pow((1.+expmtr),2.);
+                double dCTasymmDtrE = m*expmtr/pow((1.+expmtr),2.)*(1.-_compCorrection);
+                double psy_inf = (KT*0.5*(trEe-Eth)*(trEe-Eth) + GT*STensorOperation::doubledot(devEe,devEe) + KT*q._intA + 2.*GT*q._intB)/CTasymm;
                 
-                *DpsiDT += (KT*q._intA*_temFunc_elasticCorrection_Bulk->getDiff(T) + dKdT*q._intA + 
-                            2.*GT*q._intB*_temFunc_elasticCorrection_Shear->getDiff(T) + 2.*dGdT*q._intB)*CTasymm;
-                (*DpsiDE) += q._corKirExtra;
+                (*DpsiDT) += dKdT*q._intA + (KT*(q._elasticBulkPropertyScaleFactor) *(trEe-Eth) * (-3*dAlphaTdT*(T-_Tinitial)-3*AlphaT)) + 
+                            2.*dGdT*q._intB;
+                            
+                (*DpsiDT) += psy_inf*dCTasymmDtrE*(-3*dAlphaTdT*(T-_Tinitial)-3*AlphaT);
                 
-                double psy_inf = (KT*0.5*(trEe-Eth)*(trEe-Eth) + GT*STensorOperation::doubledot(devEe,devEe) + KT*q._intA + 2.*GT*q._intB);
+                (*DpsiDE) += q._corKirExtra; // already has CTasymm
                 for (int j=0; j<3; j++)
                     for (int k=0; k<3; k++)
                         (*DpsiDE)(j,k) += psy_inf*dCTasymmDtrE*_I(j,k);
@@ -467,7 +522,7 @@ double mlawNonLinearTVM::freeEnergyMechanical(const IPNonLinearTVM& q0, IPNonLin
         double Dexp_rec_g_DT(0.), Dexp_mid_g_DT(0.);  
         double dtk(0.), dtk2(0.), exp_rec_k(0.), exp_mid_k(0.);
         double dtg(0.), dtg2(0.), exp_rec_g(0.), exp_mid_g(0.);
-    
+        
         static STensor43 temp;
         if ((_Ki.size() > 0) or (_Gi.size() > 0)){
                 
@@ -519,21 +574,19 @@ double mlawNonLinearTVM::freeEnergyMechanical(const IPNonLinearTVM& q0, IPNonLin
                                 }
                         }
                     }*/
-                    Msg::Info("setting: _ExtraBranch_TVE_option=%d integrates the viscoelastic stress and currently has no definition for deformation energy. Don't use it with     mullin's effect",_ExtraBranch_TVE_option);
-                    
+                    Msg::Info("setting: _ExtraBranch_TVE_option=%d integrates the viscoelastic stress and currently has no definition for deformation energy. Don't use it with mullin's effect",_ExtraBranch_TVE_option);
                 }
-                else if (_ExtraBranch_TVE_option == 2 || _ExtraBranch_TVE_option == 3){ 
+                else if (_ExtraBranch_TVE_option == 2 || _ExtraBranch_TVE_option == 3 || _ExtraBranch_TVE_option == 4 || _ExtraBranch_TVE_option == 5){
                     
                     double dTrEei_DT(0.); // branchElasticStrain trace
                     static STensor3 dDevEei_DT;
-                    dTrEei_DT = q0._B[i] * Dexp_rec_k_DT + Dexp_mid_k_DT*q._trDE;
+                    dTrEei_DT = q0._B[i] * Dexp_rec_k_DT + Dexp_mid_k_DT*eff_trDE + exp_mid_k*Deff_trDE_DT; // trDE; //NEW
                     for (int k=0; k<3; k++)
                         for (int l=0; l<3; l++)
                             dDevEei_DT(k,l) = q0._A[i](k,l) * Dexp_rec_g_DT + Dexp_mid_g_DT*q._devDE(k,l);
                     
                     if (_ExtraBranch_TVE_option == 2){
-                        *DpsiDT += _Ki[i]*q._Av_TVE_vector[i]*q._B[i]*dTrEei_DT + _Gi[i]*2.*q._Bd_TVE_vector[i]*STensorOperation::doubledot(q._A[i],dDevEei_DT);
-                        // STensorOperation::multSTensor43(q._DA_DdevE[i],_Idev,temp);
+                        *DpsiDT += _Ki[i]*q._Av_TVE_vector[i]*q._B[i]*dTrEei_DT + 2.*_Gi[i]*q._Bd_TVE_vector[i]*STensorOperation::doubledot(q._A[i],dDevEei_DT);
                         for (int j=0; j<3; j++)
                             for (int k=0; k<3; k++){
                                 (*DpsiDE)(j,k) += _Ki[i]*q._Av_TVE_vector[i]*q._B[i]*exp_mid_k*_I(j,k);
@@ -542,28 +595,30 @@ double mlawNonLinearTVM::freeEnergyMechanical(const IPNonLinearTVM& q0, IPNonLin
                                         (*DpsiDE)(j,k) += 2*_Gi[i]*q._Bd_TVE_vector[i]*q._A[i](p,r)*exp_mid_g*_Idev(p,r,j,k); 
                         }
                     }
-                    else { // _ExtraBranch_TVE_option == 3
+                    else { // _ExtraBranch_TVE_option == 3 || _ExtraBranch_TVE_option == 4 || _ExtraBranch_TVE_option == 5
+                    
+                        // NOTE : _Av_TVE_vector, _Bd_TVE_vector, _intAv_TVE_vector, _intBd_TVE_vector have CTasymm already
+                        //          Therefore, to derive CTasymm, first divide to remove it and then derive.
                             
                         // Regularising function
                         double m = _tensionCompressionRegularisation;
-                        double expmtr(0.);
-                        if (exp(-m*q._B[i])<1.e+10){ expmtr = exp(-m*q._B[i]);}
+                        double expmtr = exp(-m*q._B[i]);
                         double sigmoid = 1/(1.+expmtr);
                         double CTasymm = sigmoid + _compCorrection*(1.-sigmoid);
-                        double dCTasymmDtrE = m*expmtr/pow((1.+expmtr),2.) - _compCorrection*m*expmtr/pow((1.+expmtr),2.);
+                        double dCTasymmDtrE = m*expmtr/pow((1.+expmtr),2.)*(1.-_compCorrection);
                         
                         (*DpsiDT) += (_Ki[i]*q._Av_TVE_vector[i]*q._B[i]*dTrEei_DT + 
-                                    _Gi[i]*2.*q._Bd_TVE_vector[i]*STensorOperation::doubledot(q._A[i],dDevEei_DT)) * CTasymm;
+                                        2.*_Gi[i]*q._Bd_TVE_vector[i]*STensorOperation::doubledot(q._A[i],dDevEei_DT)); // * CTasymm;
                                     
-                        (*DpsiDT) += (_Ki[i]*q._intAv_TVE_vector[i] + 2*_Gi[i]*q._intBd_TVE_vector[i]) * dCTasymmDtrE * dTrEei_DT;
+                        (*DpsiDT) += (_Ki[i]*q._intAv_TVE_vector[i] + 2*_Gi[i]*q._intBd_TVE_vector[i])/CTasymm * dCTasymmDtrE * dTrEei_DT;
                                     
                         for (int j=0; j<3; j++)
                             for (int k=0; k<3; k++){
-                                (*DpsiDE)(j,k) += _Ki[i]*q._Av_TVE_vector[i]*q._B[i]*exp_mid_k*_I(j,k) * CTasymm;
-                                (*DpsiDE)(j,k) += (_Ki[i]*q._intAv_TVE_vector[i] + 2*_Gi[i]*q._intBd_TVE_vector[i]) * dCTasymmDtrE * exp_mid_k*_I(j,k);
+                                (*DpsiDE)(j,k) += _Ki[i]*q._Av_TVE_vector[i]*q._B[i]*exp_mid_k*_I(j,k); // * CTasymm;
+                                (*DpsiDE)(j,k) += (_Ki[i]*q._intAv_TVE_vector[i] + 2.*_Gi[i]*q._intBd_TVE_vector[i])/CTasymm * dCTasymmDtrE * exp_mid_k*_I(j,k);
                                 for (int p=0; p<3; p++)
                                     for (int r=0; r<3; r++)
-                                        (*DpsiDE)(j,k) += 2*_Gi[i]*q._Bd_TVE_vector[i]*q._A[i](p,r)*exp_mid_g*_Idev(p,r,j,k) * CTasymm; 
+                                        (*DpsiDE)(j,k) += 2.*_Gi[i]*q._Bd_TVE_vector[i]*q._A[i](p,r)*exp_mid_g*_Idev(p,r,j,k); // * CTasymm; 
                         }
                         
                     }
@@ -572,8 +627,12 @@ double mlawNonLinearTVM::freeEnergyMechanical(const IPNonLinearTVM& q0, IPNonLin
 
             }
         }
+
+        // *DpsiDE *= 1/_rho;
+        // *DpsiDT *= 1/_rho;
     }
-    
+
+    // Psy_mech *= 1/_rho;
     return Psy_mech;
 }
 
@@ -617,22 +676,27 @@ void mlawNonLinearTVM::evaluateElasticCorrection(const double trE, const STensor
                                                  double &A_v, double &dA_vdE, double &intA, double &dAdT,
                                                  double &B_d, STensor3 &dB_vddev, double &intB, double &dBdT,
                                                  double *ddAdTT, double *ddBdTT, double *ddA_vdTdE, STensor3 *ddB_vdTdevE,
-                                                 double *dB_dTrEe, double *dB_dTdTrEe) const{
+                                                 double *dB_dTrEe, double *dB_dTdTrEe, double* psiInfCorrector) const{
     
-    if (_extraBranchNLType != TensionCompressionRegularisedType){ 
-        mlawHyperViscoElastic::evaluatePhiPCorrection(trE,devE,A_v,dA_vdE,intA,B_d,dB_vddev,intB);
+    if (_extraBranchNLType != TensionCompressionRegularisedType && _extraBranchNLType != hyper_exp_TCasymm_Type){
+        mlawHyperViscoElastic::evaluatePhiPCorrection(trE,devE,A_v,dA_vdE,intA,B_d,dB_vddev,intB,NULL,psiInfCorrector);
     }
     else{
-        mlawHyperViscoElastic::evaluatePhiPCorrection(trE,devE,A_v,dA_vdE,intA,B_d,dB_vddev,intB,dB_dTrEe);
-        *dB_dTrEe *= _temFunc_elasticCorrection_Shear->getVal(T);
-        if(dB_dTdTrEe!=NULL){
-            *dB_dTdTrEe = (*dB_dTrEe)*_temFunc_elasticCorrection_Bulk->getDiff(T);
-        }
+        mlawHyperViscoElastic::evaluatePhiPCorrection(trE,devE,A_v,dA_vdE,intA,B_d,dB_vddev,intB,dB_dTrEe,psiInfCorrector);
+        // *dB_dTrEe *= _temFunc_elasticCorrection_Shear->getVal(T);
+        // if(dB_dTdTrEe!=NULL){
+            // *dB_dTdTrEe = (*dB_dTrEe)*_temFunc_elasticCorrection_Bulk->getDiff(T);
+        // }
     }
     
+    // TBD - tempfuncs for extraBranch
+    /*
     A_v *= _temFunc_elasticCorrection_Bulk->getVal(T);
     dA_vdE *= _temFunc_elasticCorrection_Bulk->getVal(T);
     intA *= _temFunc_elasticCorrection_Bulk->getVal(T);
+    if (psiInfCorrector != NULL){
+        (*psiInfCorrector) *= _temFunc_elasticCorrection_Bulk->getVal(T);
+    }
     
     dAdT = A_v*_temFunc_elasticCorrection_Bulk->getDiff(T);
     if(ddAdTT!=NULL){
@@ -653,6 +717,7 @@ void mlawNonLinearTVM::evaluateElasticCorrection(const double trE, const STensor
         *ddB_vdTdevE = dB_vddev*_temFunc_elasticCorrection_Shear->getDiff(T);
         *ddB_vdTdevE *= 1/_temFunc_elasticCorrection_Shear->getVal(T);
     }
+    */
 }
 
 void mlawNonLinearTVM::extraBranchLaw(const STensor3& Ee, const double& T, const IPNonLinearTVM *q0, IPNonLinearTVM *q1, 
@@ -665,6 +730,12 @@ void mlawNonLinearTVM::extraBranchLaw(const STensor3& Ee, const double& T, const
 {
     // DsigDEe = DcorKirDE
     
+    // NOTE: Ee = eff_trEe = trEe - 3*AlphaT*(T1-_Tinitial)
+    double AlphaT, DAlphaDT, DDAlphaDT;
+    getAlpha(AlphaT,T,&DAlphaDT,&DDAlphaDT);
+    double DtrEeDT = -3*(AlphaT + DAlphaDT*(T-_Tinitial));
+    double DDtrEeDTT = -3*(2*DAlphaDT + DDAlphaDT*(T-_Tinitial));
+    
   if (_extraBranchType == Bilogarithmic)
   {
     static STensor3 devEe;
@@ -672,15 +743,17 @@ void mlawNonLinearTVM::extraBranchLaw(const STensor3& Ee, const double& T, const
     STensorOperation::decomposeDevTr(Ee,devEe,trEe);
     
     double A(0.), B(0.);
-    double dA_dTrEe(0.), dA_dTdTrEe(0.), dB_dTrEe(0.), dB_dTdTrEe(0.);
+    double dA_dTrEe(0.), dA_dTdTrEe(0.), dB_dTrEe(0.), dB_dTdTrEe(0.), psiInfCorrector(0.);
     STensor3 dB_dDevEe, ddB_dTdDevEe;
     double intA(0.), intB(0.), dA_dT(0.), dB_dT(0.), ddA_dTT(0.), ddB_dTT(0.);
     
-    if (_extraBranchNLType != TensionCompressionRegularisedType){
-        evaluateElasticCorrection(trEe, devEe, T, A, dA_dTrEe, intA, dA_dT, B, dB_dDevEe, intB, dB_dT, &ddA_dTT, &ddB_dTT, &dA_dTdTrEe, &ddB_dTdDevEe);
+    if (_extraBranchNLType != TensionCompressionRegularisedType && _extraBranchNLType != hyper_exp_TCasymm_Type){
+        evaluateElasticCorrection(trEe, devEe, T, A, dA_dTrEe, intA, dA_dT, B, dB_dDevEe, intB, dB_dT, &ddA_dTT, &ddB_dTT, &dA_dTdTrEe, &ddB_dTdDevEe, 
+                                        NULL, NULL, &psiInfCorrector);
     }
     else {
-        evaluateElasticCorrection(trEe, devEe, T, A, dA_dTrEe, intA, dA_dT, B, dB_dDevEe, intB, dB_dT, &ddA_dTT, &ddB_dTT, &dA_dTdTrEe, &ddB_dTdDevEe, &dB_dTrEe, &dB_dTdTrEe);
+        evaluateElasticCorrection(trEe, devEe, T, A, dA_dTrEe, intA, dA_dT, B, dB_dDevEe, intB, dB_dT, &ddA_dTT, &ddB_dTT, &dA_dTdTrEe, &ddB_dTdDevEe, 
+                                        &dB_dTrEe, &dB_dTdTrEe, &psiInfCorrector);
     }
     
     if (A <= -1. + 1.e-5){ // saturated
@@ -699,6 +772,8 @@ void mlawNonLinearTVM::extraBranchLaw(const STensor3& Ee, const double& T, const
     }
     q1->_intB = intB;
     
+    q1->_psiInfCorrector = psiInfCorrector; // Additional term to correct thermal expansion term in free energy
+    
     // double check_1 = (1+A)*_K;
     // double check_2 = (1+B)*_G;
     // Msg::Error(" Inside extraBranchLaw, Kinf = %e, Ginf = %e !!", _K, _G);
@@ -729,7 +804,7 @@ void mlawNonLinearTVM::extraBranchLaw(const STensor3& Ee, const double& T, const
             STensorOperation::prodAdd(devEe, dB_dDevEe, 2.*Gextra,  *DsigDEe);            
             STensorOperation::prodAdd(_I,_I,Kextra*(A+trEe*dA_dTrEe),*DsigDEe);
             
-            if (_extraBranchNLType == TensionCompressionRegularisedType){
+            if (_extraBranchNLType == TensionCompressionRegularisedType || _extraBranchNLType == hyper_exp_TCasymm_Type){
                 STensorOperation::prodAdd(devEe, _I, 2.*Gextra*dB_dTrEe, *DsigDEe);
             }
         }
@@ -751,31 +826,46 @@ void mlawNonLinearTVM::extraBranchLaw(const STensor3& Ee, const double& T, const
         }
         
         if(DsigV_dT!=NULL){
-            *DsigV_dT = dKex_dT*A*trEe + Kextra*dA_dT*trEe;
+            dA_dT = dA_dTrEe*DtrEeDT;
+            *DsigV_dT = dKex_dT*A*trEe + Kextra*(dA_dT*trEe + A*DtrEeDT);
         }
         if(DsigD_dT!=NULL){
             STensorOperation::zero(*DsigD_dT);
+            double temp = 2*dGex_dT*B;
+            if (_extraBranchNLType == TensionCompressionRegularisedType || _extraBranchNLType == hyper_exp_TCasymm_Type){
+                temp += 2*Gextra*dB_dTrEe*DtrEeDT;
+            }
             *DsigD_dT = devEe;
-            *DsigD_dT *= (2*dGex_dT*B + 2*Gextra*dB_dT);
+            *DsigD_dT *= temp;
         }
         
         if(DDsigV_dTT!=NULL){
-            *DDsigV_dTT = ddKex_dTT*A*trEe + 2*dKex_dT*dA_dT*trEe + Kextra*ddA_dTT*trEe;
+            dA_dT = dA_dTrEe*DtrEeDT;
+            ddA_dTT = dA_dTdTrEe*DtrEeDT + dA_dTrEe*DDtrEeDTT;
+            *DDsigV_dTT = ddKex_dTT*A*trEe + 2*dKex_dT*(dA_dT*trEe + A*DtrEeDT) + Kextra*(ddA_dTT*trEe + dA_dT*DtrEeDT + A*DDtrEeDTT); // ddA_dTdTrEe = 0. 
         }
         if(DDsigD_dTT!=NULL){
             STensorOperation::zero(*DDsigD_dTT);
+            double temp = 2*ddGex_dTT*B;
+            if (_extraBranchNLType == TensionCompressionRegularisedType || _extraBranchNLType == hyper_exp_TCasymm_Type){
+                temp += 2*dGex_dT*(2*dB_dTrEe*DtrEeDT) + 2*Gextra*dB_dTrEe*DDtrEeDTT; // Assuming ddB_ddTrEe, ddB_dTdTrEe = 0.
+            }
             *DDsigD_dTT = devEe;
-            *DDsigD_dTT *= 2*(ddGex_dTT*B + 2*dGex_dT*dB_dT + Gextra*ddB_dTT);
+            *DDsigD_dTT *= temp;
         }
         if(DDsigV_dTdTrEe!=NULL){
-            *DDsigV_dTdTrEe = dKex_dT*(A + trEe*dA_dTrEe) + Kextra*(dA_dT + trEe*dA_dTdTrEe);
+            dA_dT = dA_dTrEe*DtrEeDT;
+            *DDsigV_dTdTrEe = dKex_dT*(A + trEe*dA_dTrEe) + Kextra*(dA_dT + dA_dTrEe*DtrEeDT); // ddA_dTrEedTrEe = 0.
         }
         if(DDsigD_dTdDevEe!=NULL){
             STensorOperation::zero(*DDsigD_dTdDevEe);
             *DDsigD_dTdDevEe = _I4;
-            *DDsigD_dTdDevEe *= (2.*dGex_dT*B);
+            double temp = (2.*dGex_dT*B);
+            if (_extraBranchNLType == TensionCompressionRegularisedType || _extraBranchNLType == hyper_exp_TCasymm_Type){
+                temp += 2*Gextra*dB_dTrEe*DtrEeDT;
+            }
+            *DDsigD_dTdDevEe *= temp;
             STensorOperation::prodAdd(devEe, dB_dDevEe, 2.*dGex_dT, *DDsigD_dTdDevEe);
-            STensorOperation::prodAdd(devEe, ddB_dTdDevEe, 2.*Gextra, *DDsigD_dTdDevEe);
         }
         if(DsigD_dTrEe!=NULL){
             STensorOperation::zero(*DsigD_dTrEe);
@@ -785,7 +875,7 @@ void mlawNonLinearTVM::extraBranchLaw(const STensor3& Ee, const double& T, const
         if(DsigD_dTdTrEe!=NULL){
             STensorOperation::zero(*DsigD_dTdTrEe);
             *DsigD_dTdTrEe = devEe;
-            *DsigD_dTdTrEe *= (2.*dGex_dT*dB_dTrEe + 2*Gextra*dB_dTdTrEe);
+            *DsigD_dTdTrEe *= (2.*dGex_dT*dB_dTrEe); // Assuming ddB_ddTrEe = 0.
         } 
     };
   }
@@ -795,7 +885,7 @@ void mlawNonLinearTVM::extraBranchLaw(const STensor3& Ee, const double& T, const
   }
 };
 
-void mlawNonLinearTVM::extraBranch_nonLinearTVE(const STensor3& Ee,  const double& T, 
+void mlawNonLinearTVM::extraBranch_nonLinearTVE(const int i, const STensor3& Ee,  const double& T,
                         double& Av, double& dA_dTrEe, double& intA, double& intA1, double& intA2, double& dA_dT, double& ddA_dTT, double& ddA_dTdTrEe,
                         double& Bd, STensor3& dB_dDevEe, double &intB, STensor3 &intB1, STensor3 &intB2, double &dB_dT, double &ddB_dTT, STensor3& ddB_dTdDevEe,
                         double* dB_dTrEe) const{
@@ -879,7 +969,7 @@ void mlawNonLinearTVM::extraBranch_nonLinearTVE(const STensor3& Ee,  const doubl
         double x = getXiVolumeCorrection()*tr*tr + getZetaVolumeCorrection();
         Av = getVolumeCorrection()* 1/sqrt(x) ;
         if (tr < 0.){
-            Av = getVolumeCorrection()* 1/sqrt(x) * (1. + _compCorrection/getVolumeCorrection());
+            Av = getVolumeCorrection()* 1/sqrt(x); // * (1. + _compCorrection/getVolumeCorrection());
             // Av += (_compCorrection*tanh(_compCorrection_2*tr*tr+_compCorrection_3)) ;
         }
         
@@ -892,10 +982,10 @@ void mlawNonLinearTVM::extraBranch_nonLinearTVE(const STensor3& Ee,  const doubl
             intA = 1.;
         }
         if (tr < 0.){
-            dA_dTrEe = - getVolumeCorrection()*getXiVolumeCorrection()*tr/pow(x,1.5) * (1. + _compCorrection/getVolumeCorrection());
+            dA_dTrEe = - getVolumeCorrection()*getXiVolumeCorrection()*tr/pow(x,1.5); //  * (1. + _compCorrection/getVolumeCorrection());
             if(getXiVolumeCorrection()>0.){
-                intA = getVolumeCorrection()/getXiVolumeCorrection()*sqrt(x) * (1. + _compCorrection/getVolumeCorrection()); 
-                intA -= ( getVolumeCorrection()/getXiVolumeCorrection()*sqrt(getZetaVolumeCorrection()) ) * (1. + _compCorrection/getVolumeCorrection()); 
+                intA = getVolumeCorrection()/getXiVolumeCorrection()*sqrt(x); //  * (1. + _compCorrection/getVolumeCorrection()); 
+                intA -= ( getVolumeCorrection()/getXiVolumeCorrection()*sqrt(getZetaVolumeCorrection()) ); // * (1. + _compCorrection/getVolumeCorrection()); 
             }
             else{
                 intA = 1.;
@@ -924,20 +1014,24 @@ void mlawNonLinearTVM::extraBranch_nonLinearTVE(const STensor3& Ee,  const doubl
         
         // Regularising function
         double m = _tensionCompressionRegularisation;
-        double expmtr(0.);
-        if (exp(-m*tr)<1.e+10){ expmtr = exp(-m*tr);}
+        double expmtr = exp(-m*tr);
+        // if (exp(-m*tr)<1.e+10){ expmtr = exp(-m*tr);}
         double sigmoid = 1/(1.+expmtr);
         
         // Av
         double x = getXiVolumeCorrection()*tr*tr + getZetaVolumeCorrection();
         Av = sigmoid*1./sqrt(x) + (1.-sigmoid)*(_compCorrection/sqrt(x));
+        Av *= getVolumeCorrection();
         
         dA_dTrEe = - sigmoid*getXiVolumeCorrection()*tr/pow(x,1.5) - (1.-sigmoid)*(getXiVolumeCorrection()*_compCorrection*tr/pow(x,1.5)) 
                    + (m*expmtr/pow((1.+expmtr),2.))*1./sqrt(x) - (_compCorrection*m*expmtr/pow((1.+expmtr),2.))*1./sqrt(x);
+        dA_dTrEe *= getVolumeCorrection();
+        
         if(getXiVolumeCorrection()>0.){
             double integrand = 1./getXiVolumeCorrection()*sqrt(x); // integral of A_v * trEe
             integrand -= ( 1./getXiVolumeCorrection()*sqrt(getZetaVolumeCorrection()) ); // value at trEe = 0.
-            intA = sigmoid*integrand + (1.-sigmoid)*integrand;
+            intA = sigmoid*integrand + _compCorrection*(1.-sigmoid)*integrand;
+            intA *= getVolumeCorrection();
         }
         else{
             intA = 1.;
@@ -946,61 +1040,222 @@ void mlawNonLinearTVM::extraBranch_nonLinearTVE(const STensor3& Ee,  const doubl
         // Bd    
         double y = getThetaDevCorrection()*dev.dotprod() + getPiDevCorrection();
         Bd = sigmoid*1./sqrt(y) + (1.-sigmoid)*(_compCorrection/sqrt(y)); 
-
+        Bd *= getDevCorrection();
+        
         STensorOperation::zero(dB_dDevEe);
         dB_dDevEe = dev;
         dB_dDevEe *= (-sigmoid*getThetaDevCorrection()/pow(y,1.5) - (1.-sigmoid)*(getThetaDevCorrection()*_compCorrection/pow(y,1.5)));
+        dB_dDevEe *= getDevCorrection();
         
         if(dB_dTrEe!=NULL){
             *dB_dTrEe = (m*expmtr/pow((1.+expmtr),2.))*1./sqrt(y) - (_compCorrection*m*expmtr/pow((1.+expmtr),2.))*1./sqrt(y);
+            *dB_dTrEe *= getDevCorrection();
         }    
         if(getThetaDevCorrection()>0.){
             double integrand = 1./getThetaDevCorrection()*sqrt(y);  // integral of B_d * devEe
             integrand -= (1./getThetaDevCorrection()*sqrt(getPiDevCorrection()) );  // value at devEe = 0.   
-            intB = sigmoid*integrand + (1.-sigmoid)*integrand;
+            intB = sigmoid*integrand + _compCorrection*(1.-sigmoid)*integrand;
+            intB *= getDevCorrection();
         }
         else{
             intB = 1.;
         }   
     }
-    else{ // Test
-        // Av = 1.;
-        // intA1 = tr;
-        double x = getXiVolumeCorrection()*tr*tr + getZetaVolumeCorrection();
-        Av = 1000*tr*tr + 1.;
-        if (tr < 0.){
-            Av += _compCorrection*(tr*tr+1.);
+    else if (_ExtraBranch_TVE_option == 4){
+
+            // Tension-Compression Asymmetry
+            // Standard form => A_v = a/(sqrt(b*tr*tr+c))
+
+            // Regularising function
+            double m = _tensionCompressionRegularisation;
+            double expmtr = exp(-m*tr);
+            // if (exp(-m*tr)<1.e+10){ expmtr = exp(-m*tr);}
+            double sigmoid = 1/(1.+expmtr);
+
+            // Av
+            double x = _V1[i]*tr*tr + _V2[i];
+            Av = sigmoid*1./sqrt(x) + (1.-sigmoid)*(_Ci[i]/sqrt(x));
+            Av *= getVolumeCorrection();
+
+            dA_dTrEe = - sigmoid*_V1[i]*tr/pow(x,1.5) - (1.-sigmoid)*(_V1[i]*_Ci[i]*tr/pow(x,1.5))
+                       + (m*expmtr/pow((1.+expmtr),2.))*1./sqrt(x) - (_Ci[i]*m*expmtr/pow((1.+expmtr),2.))*1./sqrt(x);
+            dA_dTrEe *= getVolumeCorrection();
+
+            if(_V1[i]>0.){
+                double integrand = 1./_V1[i]*sqrt(x); // integral of A_v * trEe
+                integrand -= ( 1./_V1[i]*sqrt(_V2[i]) ); // value at trEe = 0.
+                intA = sigmoid*integrand + _Ci[i]*(1.-sigmoid)*integrand;
+                intA *= getVolumeCorrection();
+            }
+            else{
+                intA = 1.;
+            }
+
+            // Bd
+            double y = _D1[i]*dev.dotprod() + _D2[i];
+            Bd = sigmoid*1./sqrt(y) + (1.-sigmoid)*(_Ci[i]/sqrt(y));
+            Bd *= getDevCorrection();
+
+            STensorOperation::zero(dB_dDevEe);
+            dB_dDevEe = dev;
+            dB_dDevEe *= (-sigmoid*_D1[i]/pow(y,1.5) - (1.-sigmoid)*(_D1[i]*_Ci[i]/pow(y,1.5)));
+            dB_dDevEe *= getDevCorrection();
+
+            if(dB_dTrEe!=NULL){
+                *dB_dTrEe = (m*expmtr/pow((1.+expmtr),2.))*1./sqrt(y) - (_Ci[i]*m*expmtr/pow((1.+expmtr),2.))*1./sqrt(y);
+                *dB_dTrEe *= getDevCorrection();
+            }
+            if(_D1[i]>0.){
+                double integrand = 1./_D1[i]*sqrt(y);  // integral of B_d * devEe
+                integrand -= (1./_D1[i]*sqrt(_D2[i]) );  // value at devEe = 0.
+                intB = sigmoid*integrand + _Ci[i]*(1.-sigmoid)*integrand;
+                intB *= getDevCorrection();
+            }
+            else{
+                intB = 1.;
+            }
         }
-        dA_dTrEe = 1000*2*tr; //- getVolumeCorrection()*getXiVolumeCorrection()*tr/pow(x,1.5);
-        intA = getVolumeCorrection()*sqrt(x)/getXiVolumeCorrection(); // integral of A_v * trEe
-        intA -= getVolumeCorrection()*sqrt(getZetaVolumeCorrection())/getXiVolumeCorrection(); // value at trEe = 0.
-            
-        intA1 = 1000*tr*tr*tr/3. + tr; // integral of A_v
-        intA2 = log(1000*tr*tr + 1);  // integral of 1/A_v*dA_dTrEe
-            
-        if (tr < 0.){
-                
-            dA_dTrEe = 2*tr*(1.+_compCorrection); //- getVolumeCorrection()*getXiVolumeCorrection()*tr/pow(x,1.5);
-            intA = getVolumeCorrection()*sqrt(x)/getXiVolumeCorrection(); // integral of A_v * trEe
-            intA -= getVolumeCorrection()*sqrt(getZetaVolumeCorrection())/getXiVolumeCorrection(); // value at trEe = 0.
-            
-            intA1 = (tr*tr*tr/3. + tr)*(1.+_compCorrection); // integral of A_v
-            intA2 = log(tr*tr + 1)*(1.+_compCorrection);     // integral of 1/A_v*dA_dTrEe
+    /*else if (_ExtraBranch_TVE_option == 5){
 
-       }
-        Bd = 1.;
-        double y = getThetaDevCorrection()*dev.dotprod() + getPiDevCorrection();
-        Bd = dev.dotprod() + 1.;
-        dB_dDevEe = 2*dev;
+                // Sigmoid + Exponential + Tension-Compression Asymmetry
+                // Standard form => A_v = sigmoid*a/(sqrt(b*tr*tr+c)) + (1-sigmoid)* Comp* (a/(sqrt(b*tr*tr+c)) + d*exp(f*tr*tr+g))
 
-        intB = getDevCorrection()*sqrt(y)/getThetaDevCorrection();  // integral of B_d * devEe
-        intB -= getDevCorrection()*sqrt(getPiDevCorrection())/getThetaDevCorrection();  // value at devEe = 0.
-            
-        intB1 = 0.; // integral of B_d -> cannot be done
-        intB2 = 0.; // integral of 1/B_d*dB_dDevEe -> cannot be done
-            
+                // Regularising function
+                double m = _tensionCompressionRegularisation;
+                double expmtr = exp(-m*tr);
+                // if (exp(-m*tr)<1.e+10){ expmtr = exp(-m*tr);}
+                double sigmoid = 1/(1.+expmtr);
+
+                // Av
+                double x1 = _V1[i]*tr*tr + _V2[i];
+                double x2 = _V4[i]*tr*tr + _V5[i];
+                Av = sigmoid*(getVolumeCorrection()/sqrt(x1)) + (1-sigmoid)*_Ci[i]*(getVolumeCorrection()/sqrt(x1) + _V3[i]*exp(x2));
+
+                dA_dTrEe = sigmoid*(-getVolumeCorrection()*_V1[i]*tr/pow(x1,1.5)) + (1.-sigmoid)*_Ci[i]*( -getVolumeCorrection()*_V1[i]*tr/pow(x1,1.5) + 2*_V3[i]*_V4[i]*tr*exp(x2))
+                           + (m*expmtr/pow((1.+expmtr),2.))*getVolumeCorrection()*1./sqrt(x1) - (m*expmtr/pow((1.+expmtr),2.))*_Ci[i]*(getVolumeCorrection()/sqrt(x1) + _V3[i]*exp(x2)) ;
+
+                if(_V1[i]>0. && _V4[i]>0.){
+                    double integrand1 = 1./_V1[i]*sqrt(x1); // integral of A_v * trEe
+                    integrand1 -= ( 1./_V1[i]*sqrt(_V2[i]) ); // value at trEe = 0.
+                    integrand1 *= getVolumeCorrection();
+
+                    double integrand2 = exp(x2)/(2*_V4[i]);
+                    integrand2 -= exp(_V5[i])/(2*_V4[i]);
+					integrand2 *= _V3[i];
+
+                    intA = sigmoid*integrand1 + (1.-sigmoid)*_Ci[i]*(integrand1 + integrand2);
+                }
+                else{
+                    intA = 1.;
+                }
+
+                // Bd
+                double y1 = _D1[i]*dev.dotprod() + _D2[i];
+                double y2 = _D4[i]*dev.dotprod() + _D5[i];
+                Bd = sigmoid*(getDevCorrection()/sqrt(y1)) + (1-sigmoid)*_Ci[i]*(getDevCorrection()/sqrt(y1) + _D3[i]*exp(y2));
+
+                STensorOperation::zero(dB_dDevEe);
+                dB_dDevEe = dev;
+                dB_dDevEe *= ( sigmoid*(-getDevCorrection()*_D1[i]/pow(y1,1.5)) + (1.-sigmoid)*_Ci[i]*( -getDevCorrection()*_D1[i]/pow(y1,1.5) + 2*_D3[i]*_D4[i]*exp(y2)) );
+
+                if(dB_dTrEe!=NULL){
+                    *dB_dTrEe = (m*expmtr/pow((1.+expmtr),2.))*getDevCorrection()*1./sqrt(y1) - (m*expmtr/pow((1.+expmtr),2.))*_Ci[i]*(getDevCorrection()/sqrt(y1) + _D3[i]*exp(y2));
+                }
+                if(_D1[i]>0. && _D4[i]>0.){
+                    double integrand1 = 1./_D1[i]*sqrt(y1);  // integral of B_d * devEe
+                    integrand1 -= (1./_D1[i]*sqrt(_D2[i]) );  // value at devEe = 0.
+                    integrand1 *= getDevCorrection();
+
+                    double integrand2 = exp(y2)/(2*_D4[i]);
+                    integrand2 -= exp(_D5[i])/(2*_D4[i]);
+					integrand2 *= _D3[i];
+
+					intB = sigmoid*integrand1 + (1.-sigmoid)*_Ci[i]*(integrand1 + integrand2);
+                }
+                else{
+                    intB = 1.;
+                }
+            }*/
+    else if (_ExtraBranch_TVE_option == 5){
+
+            // Tension-Compression Asymmetry
+            // Standard form => A_v = a/(sqrt(b*tr*tr+c)) + d
+
+    		// Msg::Error("_extraBran_ExtraBranch_TVE_optionchNLType = %d need a 3rd Parameter. Define _V3 and _D3",_extraBranchNLType);
+
+            // Regularising function
+            double m = _tensionCompressionRegularisation;
+            double expmtr = exp(-m*tr);
+            // if (exp(-m*tr)<1.e+10){ expmtr = exp(-m*tr);}
+            double sigmoid = 1/(1.+expmtr);
+
+            // Av
+            double x1 = _V1[i]*tr*tr + _V2[i];
+            double x2 = _V4[i]*tr*tr + _V5[i];
+            Av = sigmoid*(1./sqrt(x1)+ _V3[i]*(1+tanh(x2))) + (1.-sigmoid)*(_Ci[i]*(1./sqrt(x1) + _V3[i]));
+            // Av *= getVolumeCorrection();
+
+            dA_dTrEe = -sigmoid*(_V1[i]*tr/pow(x1,1.5) - _V3[i]*(2*_V4[i]*tr*pow(1/cosh(x2),2))) - (1.-sigmoid)*(_V1[i]*_Ci[i]*tr/pow(x1,1.5))
+                       + (m*expmtr/pow((1.+expmtr),2.))*(1./sqrt(x1) + _V3[i]*(1+tanh(x2)))- (_Ci[i]*m*expmtr/pow((1.+expmtr),2.))*(1./sqrt(x1) + _V3[i]);
+            // dA_dTrEe *= getVolumeCorrection();
+
+            if(_V1[i]>0.){
+                double integrand1 = 1./_V1[i]*sqrt(x1) + _V3[i]*tr*tr/2.; // integral of A_v * trEe
+                double integrand2 = 0.;
+                if(_V4[i] != 0.){
+                	integrand2 = _V3[i]/(2.*_V4[i])*log(cosh(x2));
+                }
+                integrand1 -= ( 1./_V1[i]*sqrt(_V2[i]) ); // value at trEe = 0.
+                intA = sigmoid*(integrand1 + integrand2) + _Ci[i]*(1.-sigmoid)*integrand1;
+                // intA *= getVolumeCorrection();
+            }
+            else{
+                intA = 1.;
+            }
+
+            // Bd
+            double y1 = _D1[i]*dev.dotprod() + _D2[i];
+            double y2 = _D4[i]*dev.dotprod() + _D5[i];
+            Bd = sigmoid* (1./sqrt(y1) + _D3[i]*(1+tanh(y2))) + (1.-sigmoid)*(_Ci[i]*(1./sqrt(y1) + _D3[i])) ;
+            // Bd *= getDevCorrection();
+
+            STensorOperation::zero(dB_dDevEe);
+            dB_dDevEe = dev;
+            dB_dDevEe *= (-sigmoid*(_D1[i]/pow(y1,1.5) - _D3[i]*(2*_D4[i]*pow(1/cosh(x2),2))) - (1.-sigmoid)*(_D1[i]*_Ci[i]/pow(y1,1.5)));
+            // dB_dDevEe *= getDevCorrection();
+
+            if(dB_dTrEe!=NULL){
+                *dB_dTrEe = (m*expmtr/pow((1.+expmtr),2.))*(1./sqrt(y1) + _D3[i]*(1+tanh(y2))) - (m*expmtr/pow((1.+expmtr),2.))*(_Ci[i]*(1./sqrt(y1) + _D3[i]));
+                // *dB_dTrEe *= getDevCorrection();
+            }
+            if(_D1[i]>0.){
+                double integrand1 = 1./_D1[i]*sqrt(y1) + _D3[i]*dev.dotprod()/2.;  // integral of B_d * devEe
+                double integrand2 = 0.;
+                if(_D4[i] != 0.){
+                	integrand2 = _D3[i]/(2.*_D4[i])*log(cosh(y2));
+                }
+                integrand1 -= (1./_D1[i]*sqrt(_D2[i]) );  // value at devEe = 0.
+                intB = sigmoid*(integrand1 + integrand2) + _Ci[i]*(1.-sigmoid)*integrand1;
+                // intB *= getDevCorrection();
+            }
+            else{
+                intB = 1.;
+            }
+        }
+    else{ // Test
+        double x = getXiVolumeCorrection()*tr*tr + getZetaVolumeCorrection();
+        Av = getVolumeCorrection()*(tanh(getXiVolumeCorrection()/3.*tr*tr-getZetaVolumeCorrection())+tanh(getZetaVolumeCorrection()));
+        dA_dTrEe = getVolumeCorrection()*getXiVolumeCorrection()*2./3.*(1.-tanh(getXiVolumeCorrection()/3.*tr*tr-getZetaVolumeCorrection())*tanh(getXiVolumeCorrection()/3.*tr*tr-getZetaVolumeCorrection()));
+        intA = 1.;
+
+        Bd = getDevCorrection()*(tanh(getThetaDevCorrection()*dev.dotprod()-getPiDevCorrection())+tanh(getPiDevCorrection()));
+        STensorOperation::zero(dB_dDevEe);
+        dB_dDevEe=dev;
+        dB_dDevEe*=2.*getPiDevCorrection()*getDevCorrection()*(1.-tanh(getThetaDevCorrection()*dev.dotprod()-getPiDevCorrection())*tanh(getThetaDevCorrection()*dev.dotprod()-getPiDevCorrection()) );
+        intB = 1.;
     }
-            
+    // TBD - tempfuncs
+    /*        
     Av *= (_temFunc_elasticCorrection_Bulk->getVal(T));
     dA_dTrEe *= (_temFunc_elasticCorrection_Bulk->getVal(T));
     intA *= (_temFunc_elasticCorrection_Bulk->getVal(T));
@@ -1018,7 +1273,7 @@ void mlawNonLinearTVM::extraBranch_nonLinearTVE(const STensor3& Ee,  const doubl
     dB_dT = (Bd*_temFunc_elasticCorrection_Shear->getDiff(T));
     ddB_dTT = (Bd*_temFunc_elasticCorrection_Shear->getDoubleDiff(T));
     ddB_dTdDevEe = (dB_dDevEe*_temFunc_elasticCorrection_Shear->getDiff(T));
-    ddB_dTdDevEe *= (1/_temFunc_elasticCorrection_Shear->getVal(T));
+    ddB_dTdDevEe *= (1/_temFunc_elasticCorrection_Shear->getVal(T));*/
         
     // Msg::Error(" Inside evaluatePhiPCorrection, A_v = %e, B_d = %e !!", A_v, B_d);
                             
@@ -1029,23 +1284,35 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor(const STensor3& Ee, const STe
           double& Ke, double& Ge, double& DKDTsum, double& DGDTsum,
           const double T0, const double T1, const bool stiff, STensor43& Bd_stiffnessTerm, STensor43* Bd_stiffnessTerm2) const{
 
+    // NEW
+    STensorOperation::zero(Bd_stiffnessTerm);
+    // if(_extraBranchNLType == TensionCompressionRegularisedType && Bd_stiffnessTerm2!= NULL){
+    if(Bd_stiffnessTerm2!= NULL){
+        STensorOperation::zero(*Bd_stiffnessTerm2);
+    }
+    
     // Set Temperature to calculate temperature updated properties
     double T_set = setTemp(T0,T1,1);  // 1->T1, 2->T_mid, 3->T_midshift
 
     // Update the Properties to the current temperature (see below which ones are being used)
-    double KT, GT, AlphaT_0, AlphaT, DKDT, DGDT, DAlphaDT;
-    getK(q1,KT,T_set,&DKDT); getG(q1,GT,T_set,&DGDT); getAlpha(AlphaT_0,T0); getAlpha(AlphaT,T_set,&DAlphaDT);
+    double KT, GT, AlphaT0, AlphaT, DKDT, DGDT, DAlpha0DT, DAlphaDT, DDAlphaDTT;
+    getK(q1,KT,T_set,&DKDT); getG(q1,GT,T_set,&DGDT); getAlpha(AlphaT,T_set,&DAlphaDT,&DDAlphaDTT); getAlpha(AlphaT0,T0);
 
-    // Get LogStrain (E) andput DEe in IP
+    // Get LogStrain (E) and put DEe in IP
     STensor3& DE = q1->getRefToDE();
     STensor3& devDE = q1->getRefToDevDE();
     double& trDE = q1->getRefToTrDE();
     static STensor3 devEe;
-    static double trEe;
+    double trEe(0.);
     DE =  Ee;
     DE -= Ee0;
     STensorOperation::decomposeDevTr(DE,devDE,trDE);
     STensorOperation::decomposeDevTr(Ee,devEe,trEe);
+    
+    // Initialise effective trEe - include thermal expansion
+    double eff_trEe(0.), eff_trDE(0.);
+    eff_trEe = trEe - 3*AlphaT*(T1-_Tinitial);
+    eff_trDE = trDE - 3*(AlphaT*(T1-_Tinitial) - AlphaT0*(T0-_Tinitial));
 
     // Initialise CorKirStress - Dev
     static STensor3 devK;
@@ -1053,13 +1320,64 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor(const STensor3& Ee, const STe
     devK = 2*GT*devEe;
     
     // Initialise CorKirStress - Tr
-    static double p;
-    p = KT*(trEe - 3*AlphaT*(T1-_Tinitial));
+    double p(0.);
+    p = KT*eff_trEe;
     
     // Initialise Moduli
     Ke = KT; Ge = GT;
     DKDTsum = DKDT; DGDTsum = DGDT;
     
+    if(_useExtraBranch){
+        
+        double A(0.), B(0.), dA_dTrEe(0.), psiInfCorrector(0.);
+        static STensor3 dB_dDevEe;
+        double intA(0.), intB(0.), dA_dT(0.), dB_dT(0.);
+        
+        // Here, A, B and related terms first calculated as (1+A) and (1+B)
+        if(_extraBranchNLType != TensionCompressionRegularisedType && _extraBranchNLType != hyper_exp_TCasymm_Type){
+            evaluateElasticCorrection(eff_trEe, devEe, T1, A, dA_dTrEe, intA, dA_dT, B, dB_dDevEe, intB, dB_dT, NULL ,NULL, NULL, NULL, NULL, &psiInfCorrector);
+        }
+        else{
+            double dB_dTrEe(0.);
+            evaluateElasticCorrection(eff_trEe, devEe, T1, A, dA_dTrEe, intA, dA_dT, B, dB_dDevEe, intB, dB_dT, NULL ,NULL, NULL, NULL, &dB_dTrEe, &psiInfCorrector);
+            q1->_dBd_dTrEe = dB_dTrEe;
+        }
+    
+        q1->_intA = intA;
+        q1->_intB = intB;
+        q1->_psiInfCorrector = psiInfCorrector; // Additional term to correct thermal expansion term in free energy
+        q1->_elasticBulkPropertyScaleFactor = A; 
+        q1->_elasticShearPropertyScaleFactor = B; 
+        q1->_dAv_dTrEe = dA_dTrEe;
+        q1->_dBd_dDevEe = dB_dDevEe;
+        
+        
+        // Add to stress
+        static STensor3 sigExtra;
+        sigExtra = devEe;
+        sigExtra *= 2.*GT*B;
+        devK += sigExtra;
+        sigExtra += _I*(eff_trEe*KT*A);
+        p += eff_trEe*KT*A;
+        q1->_corKirExtra = sigExtra; 
+        
+        // Add to Ke
+        Ke += KT*A + KT*dA_dTrEe*eff_trEe;
+        
+        // Add to Ge (1st term) and Bd_stiffnessTerm (2nd term)
+        Ge += GT*B; // don't multiply 2
+        for (int k=0; k<3; k++)
+            for (int l=0; l<3; l++)
+                for (int p=0; p<3; p++)
+                    for (int q=0; q<3; q++){
+                        Bd_stiffnessTerm(k,l,p,q) +=  2*GT*devEe(k,l)*dB_dDevEe(p,q);
+                        if(_extraBranchNLType == TensionCompressionRegularisedType || _extraBranchNLType == hyper_exp_TCasymm_Type){
+                            (*Bd_stiffnessTerm2)(k,l,p,q) +=  2*GT*devEe(k,l)*_I(p,q)*q1->_dBd_dTrEe;
+                        }
+                    }
+                        
+    }
+    
     // Main Loop for Maxwell Branches
     if ((_Ki.size() > 0) or (_Gi.size() > 0)){
 
@@ -1074,23 +1392,30 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor(const STensor3& Ee, const STe
         // Do non-linear TVE extraBranch here
         double Av(1.), Bd(1.);
         double dA_dTrEe(0.),intA(0.),intA1(0.),intA2(0.),dA_dT(0.),ddA_dTT(0.),ddA_dTdTrEe(0.),intB(0.),dB_dT(0.),ddB_dTT(0.);
-        static STensor3 intB1,intB2,dB_dDevEe,ddB_dTdDevEe,temp100;
+        static STensor3 intB1,intB2,dB_dDevEe,ddB_dTdDevEe;
         STensorOperation::zero(intB1);
         STensorOperation::zero(intB2);
         STensorOperation::zero(dB_dDevEe);
         STensorOperation::zero(ddB_dTdDevEe);
         
         if (_useExtraBranch_TVE){
-            STensorOperation::zero(Bd_stiffnessTerm); //This term is for the additional term in Ge that is a tensor
+            
+            // NEW
+            // STensorOperation::zero(Bd_stiffnessTerm); //This term is for the additional term in Ge that is a tensor
+            // NEW
+            
             if(_ExtraBranch_TVE_option == 1){
-                mlawNonLinearTVM::extraBranch_nonLinearTVE(Ee,T1,Av,dA_dTrEe,intA,intA1,intA2,dA_dT,ddA_dTT,ddA_dTdTrEe,Bd,dB_dDevEe,intB,intB1,intB2,dB_dT,ddB_dTT,ddB_dTdDevEe);
+                mlawNonLinearTVM::extraBranch_nonLinearTVE(0,Ee,T1,Av,dA_dTrEe,intA,intA1,intA2,dA_dT,ddA_dTT,ddA_dTdTrEe,Bd,dB_dDevEe,intB,intB1,intB2,dB_dT,ddB_dTT,ddB_dTdDevEe);
                 q1->_Av_TVE = Av; q1->_Bd_TVE = Bd; q1->_dAv_dTrEe_TVE = dA_dTrEe; q1->_dBd_dDevEe_TVE = dB_dDevEe;
                 q1->_intAv_TVE = intA; q1->_intBd_TVE = intB; q1->_intAv_1_TVE = intA1; q1->_intBd_1_TVE = intB1;  // this is zero
                 q1->_intAv_2_TVE = intA2; q1->_intBd_2_TVE = intB2;  // this is zero
             }
-            if(_ExtraBranch_TVE_option == 3){
+            
+            // NEW
+            /*if(_ExtraBranch_TVE_option == 3){
                 STensorOperation::zero(*Bd_stiffnessTerm2); //This term is for the additional term in Ge because Bd is a function of trEe
-            }
+            }*/
+            // NEW
         }
         
         for (int i=0; i<_Gi.size(); i++){
@@ -1122,7 +1447,7 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor(const STensor3& Ee, const STe
                         q1->_A[i](k,l) = exp_rec_g*q0->_A[i](k,l) + exp_mid_g*devDE(k,l);
                     }
             
-                q1->_B[i] = exp_rec_k*q0->_B[i] + exp_mid_k*trDE;
+                q1->_B[i] = exp_rec_k*q0->_B[i] + exp_mid_k*eff_trDE ; //*trDE; NEW
             
                 // Add to deviatoric stress
                 devK += 2*_Gi[i]*q1->_A[i];
@@ -1168,14 +1493,14 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor(const STensor3& Ee, const STe
                     p += ( _Ki[i]*q1->_B[i] );
                     
                 }
-                else if (_ExtraBranch_TVE_option == 2 || _ExtraBranch_TVE_option == 3){
+                else if (_ExtraBranch_TVE_option == 2 || _ExtraBranch_TVE_option == 3 || _ExtraBranch_TVE_option == 4 || _ExtraBranch_TVE_option == 5){
                     
                     // Single Convolution - get branchElasticStrain
                     for (int k=0; k<3; k++)
                         for (int l=0; l<3; l++)
                             q1->_A[i](k,l) = exp_rec_g*q0->_A[i](k,l) + exp_mid_g*devDE(k,l);
             
-                    q1->_B[i] = exp_rec_k*q0->_B[i] + exp_mid_k*trDE;
+                    q1->_B[i] = exp_rec_k*q0->_B[i] + exp_mid_k*eff_trDE; // trDE; // NEW
                     
                     static STensor3 branchElasticStrain;
                     branchElasticStrain = q1->_A[i];
@@ -1183,12 +1508,12 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor(const STensor3& Ee, const STe
                     branchElasticStrain(1,1) += 1./3.*q1->_B[i];
                     branchElasticStrain(2,2) += 1./3.*q1->_B[i];
                     if (_ExtraBranch_TVE_option == 2){
-                        mlawNonLinearTVM::extraBranch_nonLinearTVE(branchElasticStrain,T1,Av,dA_dTrEe,intA,intA1,intA2,dA_dT,ddA_dTT,ddA_dTdTrEe,
+                        mlawNonLinearTVM::extraBranch_nonLinearTVE(i,branchElasticStrain,T1,Av,dA_dTrEe,intA,intA1,intA2,dA_dT,ddA_dTT,ddA_dTdTrEe,
                                                                 Bd,dB_dDevEe,intB,intB1,intB2,dB_dT,ddB_dTT,ddB_dTdDevEe);
                     }
                     else{
                         double dB_dTrEe(0.);
-                        mlawNonLinearTVM::extraBranch_nonLinearTVE(branchElasticStrain,T1,Av,dA_dTrEe,intA,intA1,intA2,dA_dT,ddA_dTT,ddA_dTdTrEe,
+                        mlawNonLinearTVM::extraBranch_nonLinearTVE(i,branchElasticStrain,T1,Av,dA_dTrEe,intA,intA1,intA2,dA_dT,ddA_dTT,ddA_dTdTrEe,
                                                                 Bd,dB_dDevEe,intB,intB1,intB2,dB_dT,ddB_dTT,ddB_dTdDevEe,&dB_dTrEe);
                         q1->_dBd_dTrEe_TVE_vector[i] = dB_dTrEe;
                     }
@@ -1206,7 +1531,7 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor(const STensor3& Ee, const STe
                             for (int p=0; p<3; p++)
                                 for (int q=0; q<3; q++){
                                     Bd_stiffnessTerm(k,l,p,q) +=  2*_Gi[i]*q1->_A[i](k,l)*dB_dDevEe(p,q) * exp_mid_g; 
-                                    if (_ExtraBranch_TVE_option == 3){
+                                    if (_ExtraBranch_TVE_option == 3 || _ExtraBranch_TVE_option == 4 || _ExtraBranch_TVE_option == 5){
                                         (*Bd_stiffnessTerm2)(k,l,p,q) += 2*_Gi[i]*q1->_dBd_dTrEe_TVE_vector[i]*q1->_A[i](k,l)*_I(p,q) * exp_mid_k;
                                             // exp_mid_k = d(tr branchElasticStrain)_d(trEe)
                                     }
@@ -1248,6 +1573,11 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor(const STensor3& Ee, const STe
             double dtk(0.), dtk2(0.), exp_rec_k(0.), exp_mid_k(0.);
             double dtg(0.), dtg2(0.), exp_rec_g(0.), exp_mid_g(0.);
             
+            // NEW
+            double Deff_trDE_DT = -3.*(DAlphaDT*(T1-_Tinitial) + AlphaT);
+            double DDeff_trDE_DTT = -3.*(DDAlphaDTT*(T1-_Tinitial) + 2*DAlphaDT);
+            // NEW
+            
             for (int i=0; i<_Gi.size(); i++){   
                 
                 dtk = dt_shift_rec/(_ki[i]);
@@ -1272,8 +1602,8 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor(const STensor3& Ee, const STe
                 
                 if (!_useExtraBranch_TVE){
                     DB_DtrE[i] = exp_mid_k;
-                    DB_DT[i] = q0->_B[i] * Dexp_rec_k_DT + Dexp_mid_k_DT*trDE;
-                    DDB_DTT[i] = q0->_B[i] * DDexp_rec_k_DTT + DDexp_mid_k_DTT*trDE;
+                    DB_DT[i] = q0->_B[i] * Dexp_rec_k_DT + Dexp_mid_k_DT*eff_trDE + exp_rec_k*Deff_trDE_DT; // trDE; // NEW
+                    DDB_DTT[i] = q0->_B[i] * DDexp_rec_k_DTT + DDexp_mid_k_DTT*eff_trDE + 2*Dexp_mid_k_DT*Deff_trDE_DT + exp_mid_k*DDeff_trDE_DTT; // trDE; //NEW
                     DDB_DTDtrE[i] = Dexp_mid_k_DT;
                     for (int k=0; k<3; k++)
                         for (int l=0; l<3; l++){
@@ -1315,13 +1645,14 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor(const STensor3& Ee, const STe
                                 }
                         }
                  }
-                 else if (_ExtraBranch_TVE_option == 2 || _ExtraBranch_TVE_option == 3){
-                    // Here the derivative are made as: B[i] = Av[i]*B[i]; A[i] = Bd[i]*A[i]; Above, BranchElasticStrain = A[i] + 1/3*B[i]*_I
+                 else if (_ExtraBranch_TVE_option == 2 || _ExtraBranch_TVE_option == 3 || _ExtraBranch_TVE_option == 4 || _ExtraBranch_TVE_option == 5){
+                    // Here the derivatives are made as: B[i] = Av[i]*B[i]; A[i] = Bd[i]*A[i]; Above, BranchElasticStrain = A[i] + 1/3*B[i]*_I
+                    // 2nd order derivatives of _Av_TVE_vector and _Bd_TVE_vector are ignored
                     
                     double dTrEei_DT(0.), ddTrEei_DTT(0.); // branchElasticStrain trace
                     static STensor3 dDevEei_DT, ddDevEei_DTT; // branchElasticStrain deviator
-                    dTrEei_DT = q0->_B[i] * Dexp_rec_k_DT + Dexp_mid_k_DT*trDE;
-                    ddTrEei_DTT = q0->_B[i] * DDexp_rec_k_DTT + DDexp_mid_k_DTT*trDE;
+                    dTrEei_DT = q0->_B[i] * Dexp_rec_k_DT + Dexp_mid_k_DT*eff_trDE + exp_mid_k*Deff_trDE_DT; // trDE; //NEW
+                    ddTrEei_DTT = q0->_B[i] * DDexp_rec_k_DTT + DDexp_mid_k_DTT*eff_trDE + 2.*Dexp_mid_k_DT*Deff_trDE_DT + exp_mid_k*DDeff_trDE_DTT; // trDE; //NEW
                     for (int k=0; k<3; k++)
                         for (int l=0; l<3; l++){
                             dDevEei_DT(k,l) = q0->_A[i](k,l) * Dexp_rec_g_DT + Dexp_mid_g_DT*devDE(k,l);
@@ -1339,7 +1670,7 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor(const STensor3& Ee, const STe
                             DA_DT[i](k,l) = q1->_Bd_TVE_vector[i]*dDevEei_DT(k,l); 
                             DDA_DTT[i](k,l) = q1->_Bd_TVE_vector[i]*ddDevEei_DTT(k,l); 
                             
-                            if (_ExtraBranch_TVE_option == 3){
+                            if (_ExtraBranch_TVE_option == 3 || _ExtraBranch_TVE_option == 4 || _ExtraBranch_TVE_option == 5){
                                 DA_DT[i](k,l) += q1->_A[i](k,l)*q1->_dBd_dTrEe_TVE_vector[i]*dTrEei_DT;
                                 DDA_DTT[i](k,l) += q1->_A[i](k,l)*q1->_dBd_dTrEe_TVE_vector[i]*ddTrEei_DTT +
                                                     2*q1->_dBd_dTrEe_TVE_vector[i]*dTrEei_DT*dDevEei_DT(k,l);  
@@ -1358,7 +1689,11 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor(const STensor3& Ee, const STe
                                     // _Idev is not pre-multiplied !! 
                                     DA_DdevE[i](k,l,r,s) =  exp_mid_g * ( q1->_A[i](k,l)*q1->_dBd_dDevEe_TVE_vector[i](r,s) + q1->_Bd_TVE_vector[i] * _I4(k,l,r,s) );  
                                     DDA_DTDdevE[i](k,l,r,s) =  Dexp_mid_g_DT * ( q1->_A[i](k,l)*q1->_dBd_dDevEe_TVE_vector[i](r,s) + q1->_Bd_TVE_vector[i] * _I4(k,l,r,s) ) 
-                                                                + exp_mid_g * ( 2.* dDevEei_DT(k,l)* q1->_dBd_dDevEe_TVE_vector[i](r,s));  
+                                                                + exp_mid_g * ( dDevEei_DT(k,l)* q1->_dBd_dDevEe_TVE_vector[i](r,s));  
+                                    for (int p=0; p<3; p++)
+                                        for (int q=0; q<3; q++){
+                                            DDA_DTDdevE[i](k,l,r,s) += exp_mid_g * q1->_dBd_dDevEe_TVE_vector[i](p,q)*dDevEei_DT(p,q)*_I4(k,l,r,s);
+                                        }
                                 }
                         }
                  } // if - extraBranchTVE_option
@@ -1375,6 +1710,10 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor(const STensor3& Ee, const STe
             double dtk(0.), dtk2(0.), exp_rec_k(0.), exp_mid_k(0.);
             double dtg(0.), dtg2(0.), exp_rec_g(0.), exp_mid_g(0.);
             
+            // NEW
+            double Deff_trDE_DT = -3.*(DAlphaDT*(T1-_Tinitial) + AlphaT);
+            // NEW
+            
             for (int i=0; i<_Gi.size(); i++){   
                 
                 dtk = dt_shift_rec/(_ki[i]);
@@ -1393,7 +1732,7 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor(const STensor3& Ee, const STe
                 Dexp_mid_g_DT = -1/(_gi[i]) * Ddt_shiftDT_mid*exp_mid_g;
                 
                 if (!_useExtraBranch_TVE){
-                    DB_DT[i] = q0->_B[i] * Dexp_rec_k_DT + Dexp_mid_k_DT*trDE;
+                    DB_DT[i] = q0->_B[i] * Dexp_rec_k_DT + Dexp_mid_k_DT*eff_trDE + exp_rec_k*Deff_trDE_DT; // trDE; // NEW
                     for (int k=0; k<3; k++)
                         for (int l=0; l<3; l++){
                             DA_DT[i](k,l) = q0->_A[i](k,l) * Dexp_rec_g_DT + Dexp_mid_g_DT*devDE(k,l); 
@@ -1413,12 +1752,13 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor(const STensor3& Ee, const STe
                                                                                 q0->_A[i](k,l) * 1/q0->_Bd_TVE * temp2); 
                         }
                  }
-                 else if (_ExtraBranch_TVE_option == 2 || _ExtraBranch_TVE_option == 3){      
+                 else if (_ExtraBranch_TVE_option == 2 || _ExtraBranch_TVE_option == 3 || _ExtraBranch_TVE_option == 4 || _ExtraBranch_TVE_option == 5){
                     // Here the derivative are made as: B[i] = Av[i]*B[i]; A[i] = Bd[i]*A[i]; Above, BranchElasticStrain = A[i] + 1/3*B[i]*_I
-                     
+                    // 2nd order derivatives of _Av_TVE_vector and _Bd_TVE_vector are ignored
+                    
                     double dTrEei_DT(0.); // branchElasticStrain trace
                     static STensor3 dDevEei_DT;
-                    dTrEei_DT = q0->_B[i] * Dexp_rec_k_DT + Dexp_mid_k_DT*trDE;
+                    dTrEei_DT = q0->_B[i] * Dexp_rec_k_DT + Dexp_mid_k_DT*eff_trDE + exp_mid_k*Deff_trDE_DT; // trDE; //NEW
                     for (int k=0; k<3; k++)
                         for (int l=0; l<3; l++)
                             dDevEei_DT(k,l) = q0->_A[i](k,l) * Dexp_rec_g_DT + Dexp_mid_g_DT*devDE(k,l);
@@ -1428,7 +1768,7 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor(const STensor3& Ee, const STe
                         for (int l=0; l<3; l++){
                             DA_DT[i](k,l) = q1->_Bd_TVE_vector[i]*dDevEei_DT(k,l); 
                             
-                            if (_ExtraBranch_TVE_option == 3){
+                            if (_ExtraBranch_TVE_option == 3 || _ExtraBranch_TVE_option == 4 || _ExtraBranch_TVE_option == 5){
                                 DA_DT[i](k,l) += q1->_A[i](k,l)*q1->_dBd_dTrEe_TVE_vector[i]*dTrEei_DT;
                             }
                             
@@ -1608,6 +1948,14 @@ void mlawNonLinearTVM::getMechSource_nonLinearTVE_term(const IPNonLinearTVM *q0,
     const STensor3& devDE = q1->getConstRefToDevDE();
     const double& trDE = q1->getConstRefToTrDE();
     
+    // NEW
+    double T_set = setTemp(T0,T,1);  // 1->T1, 2->T_mid, 3->T_midshift
+    double AlphaT0, AlphaT, DAlphaDT;
+    getAlpha(AlphaT,T_set,&DAlphaDT); getAlpha(AlphaT0,T0);
+    double eff_trDE = q1->_trDE - 3.*(AlphaT*(T-_Tinitial) - AlphaT0*(T0-_Tinitial));
+    double Deff_trDE_DT = -3.*(DAlphaDT*(T-_Tinitial) + AlphaT);
+    // NEW
+            
     // Initialize if needed
     // Get ShiftFactor and shifted time increment
     double dt = this->getTimeStep();
@@ -1624,7 +1972,7 @@ void mlawNonLinearTVM::getMechSource_nonLinearTVE_term(const IPNonLinearTVM *q0,
     // Add visco terms
     if ((_Ki.size() > 0) or (_Gi.size() > 0)){
         
-        if (_ExtraBranch_TVE_option == 2){ 
+        if (_ExtraBranch_TVE_option != 1){
         
             // TVE Mechanical Source Term
             
@@ -1690,7 +2038,7 @@ void mlawNonLinearTVM::getMechSource_nonLinearTVE_term(const IPNonLinearTVM *q0,
             
                     double dTrEei_DT(0.); // branchElasticStrain
                     static STensor3 dDevEei_DT;
-                    dTrEei_DT = q0->_B[i] * Dexp_rec_k_DT + Dexp_mid_k_DT*trDE;
+                    dTrEei_DT = q0->_B[i] * Dexp_rec_k_DT + Dexp_mid_k_DT*eff_trDE + exp_mid_k*Deff_trDE_DT; // trDE; //NEW
                     for (int k=0; k<3; k++)
                         for (int l=0; l<3; l++)
                             dDevEei_DT(k,l) = q0->_A[i](k,l) * Dexp_rec_g_DT + Dexp_mid_g_DT*devDE(k,l);
@@ -1710,7 +2058,7 @@ void mlawNonLinearTVM::getMechSource_nonLinearTVE_term(const IPNonLinearTVM *q0,
                                     DDQiDTDEe[i](k,l,r,s) = _Ki[i]*q1->_DDB_DTDtrE[i]*_I(k,l)*_I(r,s);
                                     dot_DGammaiDEe[i](k,l,r,s) = 1/3*(1.- exp_mid_k)*_I(k,l)*_I(r,s)  + _Idev(k,l,r,s);
                                     
-                                    if (_ExtraBranch_TVE_option == 3){
+                                    if (_ExtraBranch_TVE_option == 3 || _ExtraBranch_TVE_option == 4 || _ExtraBranch_TVE_option == 5){
                                         DQiDEe[i](k,l,r,s) +=  2*_Gi[i]*q1->_DA_DtrE[i](k,l)*_I(r,s);
                                         DDQiDTDEe[i](k,l,r,s) +=  2*_Gi[i]*q1->_DDA_DTDtrE[i](k,l)*_I(r,s);
                                     }
@@ -1766,7 +2114,7 @@ void mlawNonLinearTVM::getTVEdCorKirDT(const IPNonLinearTVM *q0, IPNonLinearTVM
     
     // Ee
     static STensor3 devEe, devEe0;
-    static double trEe, trEe0;
+    double trEe, trEe0;
     STensorOperation::decomposeDevTr(q0->_Ee,devEe0,trEe0);
     STensorOperation::decomposeDevTr(q1->_Ee,devEe,trEe);
 
@@ -1779,22 +2127,62 @@ void mlawNonLinearTVM::getTVEdCorKirDT(const IPNonLinearTVM *q0, IPNonLinearTVM
     double KT, GT, AlphaT, DKDT, DGDT, DAlphaDT, DDKDT, DDGDT, DDAlphaDT;
     getK(q1,KT,T,&DKDT,&DDKDT); getG(q1,GT,T,&DGDT,&DDGDT); getAlpha(AlphaT,T,&DAlphaDT,&DDAlphaDT);
     
-    // Add corKirinf terms to DcorKirDT
-    STensor3 corKirDevInf;
-    double corKirTrInf;
-    STensorOperation::decomposeDevTr(q1->_Ee,devEe,trEe);
-    
     // Add Infinity terms
-    corKirInfinity(q1, devEe, trEe, T, corKirDevInf, corKirTrInf);
     for (int i=0; i<3; i++){
-        DcorKirDT(i,i) += corKirTrInf*DKDT/KT - 3*KT*(DAlphaDT*(T-_Tinitial) + AlphaT);
-        DDcorKirDT(i,i) += corKirTrInf*DDKDT/KT - 6*DKDT*(DAlphaDT*(T-_Tinitial) + AlphaT)- 3*KT*(DDAlphaDT*(T-_Tinitial) + 2*DAlphaDT);
+        DcorKirDT(i,i) += DKDT*(trEe - 3*AlphaT*(T-_Tinitial))- 3*KT*(DAlphaDT*(T-_Tinitial) + AlphaT);
+        DDcorKirDT(i,i) += DDKDT*(trEe - 3*AlphaT*(T-_Tinitial)) - 6*DKDT*(DAlphaDT*(T-_Tinitial) + AlphaT)- 3*KT*(DDAlphaDT*(T-_Tinitial) + 2*DAlphaDT);
         for (int j=0; j<3; j++){
-            DcorKirDT(i,j) += corKirDevInf(i,j)*DGDT/GT;
-            DDcorKirDT(i,j) += corKirDevInf(i,j)*DDGDT/GT;
+            DcorKirDT(i,j) += 2*DGDT*devEe(i,j);
+            DDcorKirDT(i,j) += 2*DDGDT*devEe(i,j);
+            for (int k=0; k<3; k++)
+                for (int l=0; l<3; l++)
+                    DDcorKirDTDEe(i,j,k,l) += DKDT*_I(i,j)*_I(k,l) + 2*DGDT*_Idev(i,j,k,l);
         }
     }
     
+    // Add hyperelastic extrabranch terms
+    if (_useExtraBranch){
+        double DsigV_dT(0.), DDsigV_dTT(0.), DDsigV_dTdTrEe(0.);
+        static STensor3 sigExtra, DsigD_dT, DDsigD_dTT, DDsigD_dTdTrEe;
+        static STensor43 DDsigD_dTdDevEe;
+        STensorOperation::zero(sigExtra); STensorOperation::zero(DsigD_dT); STensorOperation::zero(DDsigD_dTT); 
+        STensorOperation::zero(DDsigD_dTdDevEe);
+        STensorOperation::zero(DDsigD_dTdTrEe); 
+        
+        static STensor3 eff_Ee;
+        STensorOperation::zero(eff_Ee);
+        eff_Ee = -1.*_I;
+        eff_Ee *= 3.*AlphaT*(T-_Tinitial);
+        eff_Ee += q1->_Ee;
+        
+        if (_extraBranchNLType != TensionCompressionRegularisedType && _extraBranchNLType != hyper_exp_TCasymm_Type){
+            extraBranchLaw(eff_Ee,T,q0,q1,sigExtra,true,NULL,NULL,NULL,NULL,
+                                            &DsigV_dT, &DsigD_dT, &DDsigV_dTT, &DDsigD_dTT, &DDsigV_dTdTrEe, &DDsigD_dTdDevEe);
+        }
+        else{
+            extraBranchLaw(eff_Ee,T,q0,q1,sigExtra,true,NULL,NULL,NULL,NULL,
+                                            &DsigV_dT, &DsigD_dT, &DDsigV_dTT, &DDsigD_dTT, &DDsigV_dTdTrEe, &DDsigD_dTdDevEe, NULL, &DDsigD_dTdTrEe);
+        }
+        DcorKirDT += DsigV_dT*_I;
+        DcorKirDT += DsigD_dT;
+        DDcorKirDT += DDsigV_dTT*_I;
+        DDcorKirDT += DDsigD_dTT;
+        for (int i=0; i<3; i++)
+            for (int j=0; j<3; j++)
+                for (int k=0; k<3; k++)
+                    for (int l=0; l<3; l++){
+                        DDcorKirDTDEe(i,j,k,l) += DDsigV_dTdTrEe*_I(i,j)*_I(k,l);
+                        
+                        if (_extraBranchNLType == TensionCompressionRegularisedType || _extraBranchNLType == hyper_exp_TCasymm_Type){
+                            DDcorKirDTDEe(i,j,k,l) += DDsigD_dTdTrEe(i,j)*_I(k,l);
+                        }
+                        for (int r=0; r<3; r++)
+                            for (int s=0; s<3; s++){
+                                DDcorKirDTDEe(i,j,k,l) += DDsigD_dTdDevEe(i,j,r,s)*_Idev(r,s,k,l);
+                            }
+                    }
+    }
+    
     // Add visco terms
     if ((_Ki.size() > 0) or (_Gi.size() > 0)){
         for (int i=0; i<_Gi.size(); i++){
@@ -1809,9 +2197,11 @@ void mlawNonLinearTVM::getTVEdCorKirDT(const IPNonLinearTVM *q0, IPNonLinearTVM
                             }
                             else{ // all extraBranches, because _Idev was not multiplied to _DDA_DTDdevE in the predictorCorrector function
                                 DDcorKirDTDEe(j,k,r,s) += _Ki[i]*q1->_DDB_DTDtrE[i]*_I(j,k)*_I(r,s);
-                                if (_ExtraBranch_TVE_option == 3){
+                                
+                                if (_ExtraBranch_TVE_option == 3 || _ExtraBranch_TVE_option == 4 || _ExtraBranch_TVE_option == 5){
                                     DDcorKirDTDEe(j,k,r,s) += 2*_Gi[i]*q1->_DDA_DTDtrE[i](j,k)*_I(r,s);
                                 }
+                                
                                 for (int p=0; p<3; p++)
                                     for (int q=0; q<3; q++){
                                         DDcorKirDTDEe(j,k,r,s) += 2*_Gi[i]*q1->_DDA_DTDdevE[i](j,k,p,q)*_Idev(p,q,r,s);
@@ -1997,8 +2387,8 @@ void mlawNonLinearTVM::predictorCorrector_ThermoViscoElastic(
     double T_set = setTemp(T0,T,1);  // 1->T1, 2->T_mid, 3->T_midshift
 
     // Make Identity Tensors
-    static const STensor3 I3(1.);
-    static const STensor43 I4(1.,1.);
+    // static const STensor3 I3(1.);
+    // static const STensor43 I4(1.,1.);
 
     // Update the Properties to the current temperature (see below which ones are being used)         
     double KT, GT, AlphaT, KThConT, CpT, DKDT, DGDT, DAlphaDT, DKThConDT, DCpDT, DDKDT, DDGDT, DDAlphaDT;
@@ -2028,6 +2418,7 @@ void mlawNonLinearTVM::predictorCorrector_ThermoViscoElastic(
           return; 
         }
     }
+    // STensorOperation::logSTensor3(C,_order,E,&dlnCdC,&ddlnCddC);
     E *= 0.5; // strain
     
     // Stresses and Effective Moduli
@@ -2035,46 +2426,42 @@ void mlawNonLinearTVM::predictorCorrector_ThermoViscoElastic(
     static STensor43 Bd_stiffnessTerm, Bd_stiffnessTerm2;
     STensorOperation::zero(Bd_stiffnessTerm);
     STensorOperation::zero(Bd_stiffnessTerm2);
-    if(_ExtraBranch_TVE_option != 3){
-        ThermoViscoElasticPredictor(E,q0->_Ee,q0,q1,Ke,Ge,DKDTsum,DGDTsum,T0,T,stiff,Bd_stiffnessTerm); 
+    if(_extraBranchNLType == TensionCompressionRegularisedType || _extraBranchNLType == hyper_exp_TCasymm_Type || _ExtraBranch_TVE_option == 3 || _ExtraBranch_TVE_option == 4 || _ExtraBranch_TVE_option == 5){
+        ThermoViscoElasticPredictor(E,q0->_Ee,q0,q1,Ke,Ge,DKDTsum,DGDTsum,T0,T,stiff,Bd_stiffnessTerm,&Bd_stiffnessTerm2); 
                 // Updates the values of moduli to the current temperatures and calculate stresses.
     }
     else{
-        ThermoViscoElasticPredictor(E,q0->_Ee,q0,q1,Ke,Ge,DKDTsum,DGDTsum,T0,T,stiff,Bd_stiffnessTerm,&Bd_stiffnessTerm2); 
+        ThermoViscoElasticPredictor(E,q0->_Ee,q0,q1,Ke,Ge,DKDTsum,DGDTsum,T0,T,stiff,Bd_stiffnessTerm); 
     }
     
-    // additional hyperelastic branch
-    static double DsigV_dT(0.), DDsigV_dTT(0.), DDsigV_dTdTrEe(0.);
-    static STensor3 sigExtra, DsigExtraDT, DsigD_dT, DDsigD_dTT, DDsigD_dTdTrEe;
-    static STensor43 DsigExtraDE, DDsigD_dTdDevEe;
+    // additional hyperelastic branch - NOt necessary anymore
+    // NEW
+    /*
+    static STensor3 sigExtra;
+    static STensor43 DsigExtraDE;
     STensorOperation::zero(sigExtra);
     STensorOperation::zero(DsigExtraDE);
-    STensorOperation::zero(DsigExtraDT);
-    STensorOperation::zero(DsigD_dT);
-    STensorOperation::zero(DDsigD_dTT);
-    STensorOperation::zero(DDsigD_dTdDevEe);
-    STensorOperation::zero(DDsigD_dTdTrEe);
     if (_useExtraBranch){
-        if (_extraBranchNLType != TensionCompressionRegularisedType){
-            mlawNonLinearTVM::extraBranchLaw(E,T,q0,q1,sigExtra,stiff,&DsigExtraDE,&DsigExtraDT,NULL,NULL,
-                                            &DsigV_dT, &DsigD_dT, &DDsigV_dTT, &DDsigD_dTT, &DDsigV_dTdTrEe, &DDsigD_dTdDevEe);
-        }
-        else{
-            mlawNonLinearTVM::extraBranchLaw(E,T,q0,q1,sigExtra,stiff,&DsigExtraDE,&DsigExtraDT,NULL,NULL,
-                                            &DsigV_dT, &DsigD_dT, &DDsigV_dTT, &DDsigD_dTT, &DDsigV_dTdTrEe, &DDsigD_dTdDevEe, NULL, &DDsigD_dTdTrEe);
-        }
+        mlawNonLinearTVM::extraBranchLaw(E,T,q0,q1,sigExtra,stiff,&DsigExtraDE);
         q1->_corKirExtra = sigExtra;
     }
-    q1->_kirchhoff += sigExtra;
+    q1->_kirchhoff += sigExtra; */
     
     const STensor3& corKir = q1->getConstRefToCorotationalKirchhoffStress();
     static STensor3 devT;
-    double pT;  
+    double pT(0.);  
     STensorOperation::decomposeDevTr(corKir,devT,pT);
     q1->_pressure = pT/3.;
     
-    static STensor3 secondPK;
-    STensorOperation::multSTensor3STensor43(corKir,dlnCdC,secondPK);
+    static STensor3 secondPK; // , Ceinv, Me, temp1_Me, temp2_Me;
+    /*
+    STensorOperation::inverseSTensor3(C,Ceinv);
+    STensorOperation::multSTensor3(C, q1->_kirchhoff, temp1_Me);
+    STensorOperation::multSTensor3(temp1_Me, Ceinv, temp2_Me);
+    Me = 0.5*(q1->_kirchhoff + temp2_Me);
+    STensorOperation::multSTensor3(Ceinv,Me,secondPK);*/
+    
+    STensorOperation::multSTensor3STensor43(q1->_kirchhoff,dlnCdC,secondPK);
     STensorOperation::multSTensor3(F,secondPK,P);                  // 1st PK
     
     // elastic energy and derivatives
@@ -2127,28 +2514,14 @@ void mlawNonLinearTVM::predictorCorrector_ThermoViscoElastic(
     
     // CorKir derivatives wrt T    
     getTVEdCorKirDT(q0,q1,T0,T);
-    STensor3& DcorKirDT = q1->getRefToDcorKirDT();
-    STensor3& DDcorKirDT = q1->getRefToDDcorKirDTT(); // for mech source derivatives
-    STensor43& DDcorKirDTDEe = q1->getRefToDDcorKirDTDE();
-    if (_useExtraBranch){
-        DcorKirDT += DsigV_dT*_I;
-        DcorKirDT += DsigD_dT;
-        DDcorKirDT += DDsigV_dTT*_I;
-        DDcorKirDT += DDsigD_dTT;
-        for (int i=0; i<3; i++)
-            for (int j=0; j<3; j++)
-                for (int k=0; k<3; k++)
-                    for (int l=0; l<3; l++){
-                        DDcorKirDTDEe(i,j,k,l) += DDsigV_dTdTrEe*_I(i,j)*_I(k,l) + DDsigD_dTdDevEe(i,j,k,l);
-                        if (_extraBranchNLType == TensionCompressionRegularisedType){
-                            DDcorKirDTDEe(i,j,k,l) += DDsigD_dTdTrEe(i,j)*_I(k,l);
-                        }
-                    }
-    }
+    const STensor3& DcorKirDT = q1->getRefToDcorKirDT();
+    const STensor3& DDcorKirDT = q1->getRefToDDcorKirDTT(); // for mech source derivatives
+    const STensor43& DDcorKirDTDEe = q1->getRefToDDcorKirDTDE();
 
     // Add corKirinf terms in IP
+    /*
     static STensor3 corKirDevInf, devEe;
-    static double corKirTrInf, trEe;
+    double corKirTrInf, trEe;
     STensorOperation::decomposeDevTr(E,devEe,trEe);
 
     const STensor3& DEe = q1->getConstRefToDE();
@@ -2165,7 +2538,9 @@ void mlawNonLinearTVM::predictorCorrector_ThermoViscoElastic(
     corKirTrInf += 1/3*tr_sigExtra; // LHS is pressure
     
     // q1->_trCorKirinf_TVE = 3*corKirTrInf; //CHANGE
-    // q1->_devCorKirinf_TVE = corKirDevInf; //CHANGE
+    // q1->_devCorKirinf_TVE = corKirDevInf; //CHANGE 
+    */
+    const STensor3& DEe = q1->getConstRefToDE();
     
     // mechanicalSource
     mechanicalSource = 0.;
@@ -2209,8 +2584,8 @@ void mlawNonLinearTVM::predictorCorrector_ThermoViscoElastic(
     
         static STensor43 DcorKDE;
         isotropicHookTensor(Ke,Ge,DcorKDE);
-        DcorKDE += DsigExtraDE;
-        if (_useExtraBranch_TVE){
+        // DcorKDE += DsigExtraDE; // NEW
+        if (_useExtraBranch || _useExtraBranch_TVE){
             for (int i=0; i<3; i++)
                 for (int j=0; j<3; j++)
                     for (int k=0; k<3; k++)
@@ -2219,7 +2594,7 @@ void mlawNonLinearTVM::predictorCorrector_ThermoViscoElastic(
                                 for (int q=0; q<3; q++){
                                     DcorKDE(i,j,k,l) += Bd_stiffnessTerm(i,j,p,q)*_Idev(p,q,k,l);
                                 }
-           DcorKDE += Bd_stiffnessTerm2; // for _ExtraBranch_TVE_option == 3 
+           DcorKDE += Bd_stiffnessTerm2; // for _ExtraBranch_TVE_option == 3 || _extraBranchNLType = TensionCompression
         }
         
         
@@ -2239,21 +2614,6 @@ void mlawNonLinearTVM::predictorCorrector_ThermoViscoElastic(
           }
          }
         }
-        /*
-        for (int i=0; i<3; i++){
-            for (int j=0; j<3; j++){
-                for (int q=0; q<3; q++){ 
-                    DCeDFe(i,j,j,q) += F(i,q);
-                }
-            }
-        }
-        for (int q=0; q<3; q++){
-            for (int j=0; j<3; j++){
-                for (int p=0; p<3; p++){ 
-                    DCeDFe(q,j,p,j) += F(q,p);
-                }
-            }
-        }*/
         STensorOperation::multSTensor43(dlnCdC,DCeDFe,DEeDFe);
         DEeDFe *= 0.5;
         
@@ -2421,19 +2781,23 @@ void mlawNonLinearTVM::predictorCorrector_ThermoViscoElastic(
                                 Tangent(i,j,k,l) += q1->_P_cap(i,j) * Deta_mullins_DF(k,l);
                 }
                 
-            static STensor3 DDpsiNew_DpsiMaxDF;
+            static STensor3 DDpsiNew_DpsiMaxDF, DpsiMax_DF;
             STensorOperation::multSTensor3STensor43(q1->_DpsiDE,DEeDFe,DDpsiNew_DpsiMaxDF);
+            STensorOperation::multSTensor3STensor43(q1->_DpsiDE,DEeDFe,DpsiMax_DF);
             DDpsiNew_DpsiMaxDF *= q1->_ipMullinsEffect->getDDpsiNew_DpsiMaxDpsi();
+            DpsiMax_DF *= q1->_ipMullinsEffect->getDpsiMax_Dpsi();
             
             dmechanicalSourcedT += q1->_DmullinsDamage_DT*mechanicalSource; 
             if (this->getTimeStep() > 0){
-                dmechanicalSourcedT -= q1->_ipMullinsEffect->getDDpsiNew_DpsiMaxDT()*(q1->_ipMullinsEffect->getpsiMax() - q0->_ipMullinsEffect->getpsiMax())/this->getTimeStep();
+                dmechanicalSourcedT -= (q1->_ipMullinsEffect->getDDpsiNew_DpsiMaxDT()*(q1->_ipMullinsEffect->getpsiMax() - q0->_ipMullinsEffect->getpsiMax())/this->getTimeStep()
+                							+ q1->_ipMullinsEffect->getDpsiNew_DpsiMax()*q1->_ipMullinsEffect->getDpsiMax_Dpsi()*q1->_DpsiDT/this->getTimeStep());
                 for (int i=0; i<3; i++)
                     for (int j=0; j<3; j++){
                         dmechanicalSourceF(i,j) -= DDpsiNew_DpsiMaxDF(i,j)*(q1->_ipMullinsEffect->getpsiMax() - q0->_ipMullinsEffect->getpsiMax())/this->getTimeStep();
+                        dmechanicalSourceF(i,j) -= q1->_ipMullinsEffect->getDpsiNew_DpsiMax()*DpsiMax_DF(i,j)/this->getTimeStep();
                     }
             }
-            
+
         }
     }
 };
@@ -2445,7 +2809,8 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(const STensor3& Ee, co
 
     //
     STensorOperation::zero(Bd_stiffnessTerm);
-    if(_extraBranchNLType == TensionCompressionRegularisedType && Bd_stiffnessTerm2!= NULL){
+    // if(_extraBranchNLType == TensionCompressionRegularisedType && Bd_stiffnessTerm2!= NULL){
+    if(Bd_stiffnessTerm2!= NULL){
         STensorOperation::zero(*Bd_stiffnessTerm2);
     }
     
@@ -2453,62 +2818,55 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(const STensor3& Ee, co
     double T_set = setTemp(T0,T1,1);  // 1->T1, 2->T_mid, 3->T_midshift
 
     // Update the Properties to the current temperature (see below which ones are being used)
-    double KT, GT, AlphaT, DKDT, DGDT, DAlphaDT;
-    getK(q1,KT,T_set,&DKDT); getG(q1,GT,T_set,&DGDT); getAlpha(AlphaT,T_set,&DAlphaDT);
+    double KT, GT, AlphaT0, AlphaT, DKDT, DGDT, DAlpha0DT, DAlphaDT, DDAlphaDTT;
+    getK(q1,KT,T_set,&DKDT); getG(q1,GT,T_set,&DGDT); getAlpha(AlphaT,T_set,&DAlphaDT,&DDAlphaDTT); getAlpha(AlphaT0,T0);
 
     // Get LogStrain (E) andput DEe in IP
     STensor3& DE = q1->getRefToDE();
     STensor3& devDE = q1->getRefToDevDE();
     double& trDE = q1->getRefToTrDE();
     static STensor3 devEe;
-    static double trEe;
+    double trEe(0.);
     DE =  Ee;
     DE -= Ee0;
     STensorOperation::decomposeDevTr(DE,devDE,trDE);
     STensorOperation::decomposeDevTr(Ee,devEe,trEe);
 
+    // Initialise effective trEe - include thermal expansion
+    double eff_trEe(0.), eff_trDE(0.);
+    eff_trEe = trEe - 3*AlphaT*(T1-_Tinitial);
+    eff_trDE = trDE - 3.*(AlphaT*(T1-_Tinitial) - AlphaT0*(T0-_Tinitial));
+        
     // Initialise CorKirStress - Dev
     static STensor3 devK;
     STensorOperation::zero(devK);
     devK = 2*GT*devEe;
     
     // Initialise CorKirStress - Tr
-    static double p;
-    p = KT*(trEe - 3*AlphaT*(T1-_Tinitial));
+    double p(0.);
+    p = KT*eff_trEe;
     
     // Initialise Moduli
     Ke = KT; Ge = GT;
     
     if(_useExtraBranch){
         
-        double A(0.), B(0.), dA_dTrEe(0.);
-        STensor3 dB_dDevEe;
+        double A(0.), B(0.), dA_dTrEe(0.), psiInfCorrector(0.);
+        static STensor3 dB_dDevEe;
         double intA(0.), intB(0.), dA_dT(0.), dB_dT(0.);
-        if(_extraBranchNLType != TensionCompressionRegularisedType){
-            evaluateElasticCorrection(trEe, devEe, T1, A, dA_dTrEe, intA, dA_dT, B, dB_dDevEe, intB, dB_dT);
+        
+        if(_extraBranchNLType != TensionCompressionRegularisedType && _extraBranchNLType != hyper_exp_TCasymm_Type){
+            evaluateElasticCorrection(eff_trEe, devEe, T1, A, dA_dTrEe, intA, dA_dT, B, dB_dDevEe, intB, dB_dT, NULL ,NULL, NULL, NULL, NULL, &psiInfCorrector);
         }
         else{
             double dB_dTrEe(0.);
-            evaluateElasticCorrection(trEe, devEe, T1, A, dA_dTrEe, intA, dA_dT, B, dB_dDevEe, intB, dB_dT, NULL ,NULL, NULL, NULL, &dB_dTrEe);
+            evaluateElasticCorrection(eff_trEe, devEe, T1, A, dA_dTrEe, intA, dA_dT, B, dB_dDevEe, intB, dB_dT, NULL ,NULL, NULL, NULL, &dB_dTrEe, &psiInfCorrector);
             q1->_dBd_dTrEe = dB_dTrEe;
         }
     
-        if (A <= -1. + 1.e-5){ // saturated
-            double trEe_0 = q0->_Ee.trace();
-            intA = q0->_intA;
-            intA += A*0.5 *(trEe*trEe-trEe_0*trEe_0);
-        }
         q1->_intA = intA;
-    
-        if (B <= -1. + 1.e-5){ // saturated
-            static STensor3 devEe_0;
-            double trEe_0;
-            STensorOperation::decomposeDevTr(q0->_Ee,devEe_0,trEe_0);
-            intA = q0->_intB;
-            intA += B*0.5 *(devEe.dotprod()-devEe_0.dotprod());
-        }
         q1->_intB = intB;
-    
+        q1->_psiInfCorrector = psiInfCorrector; // Additional term to correct thermal expansion term in free energy
         q1->_elasticBulkPropertyScaleFactor = A; 
         q1->_elasticShearPropertyScaleFactor = B; 
         q1->_dAv_dTrEe = dA_dTrEe;
@@ -2516,15 +2874,16 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(const STensor3& Ee, co
         
         
         // Add to stress
-        static STensor3 temp;
-        temp = devEe;
-        temp *= 2.*GT*B;
-        devK += temp;
-        p += trEe*KT*A;
-        // p += (trEe - 3*AlphaT*(T1-_Tinitial))*KT*A; // CHECK
+        static STensor3 sigExtra;
+        sigExtra = devEe;
+        sigExtra *= 2.*GT*B;
+        devK += sigExtra;
+        sigExtra += _I*(eff_trEe*KT*A);
+        p += eff_trEe*KT*A;
+        q1->_corKirExtra = sigExtra; 
         
         // Add to Ke
-        Ke += KT*A + trEe*KT*dA_dTrEe;
+        Ke += KT*A + KT*dA_dTrEe*eff_trEe;
         
         // Add to Ge (1st term) and Bd_stiffnessTerm (2nd term)
         Ge += GT*B; // don't multiply 2
@@ -2533,7 +2892,7 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(const STensor3& Ee, co
                 for (int p=0; p<3; p++)
                     for (int q=0; q<3; q++){
                         Bd_stiffnessTerm(k,l,p,q) +=  2*GT*devEe(k,l)*dB_dDevEe(p,q);
-                        if(_extraBranchNLType == TensionCompressionRegularisedType){
+                        if(_extraBranchNLType == TensionCompressionRegularisedType || _extraBranchNLType == hyper_exp_TCasymm_Type){
                             (*Bd_stiffnessTerm2)(k,l,p,q) +=  2*GT*devEe(k,l)*_I(p,q)*q1->_dBd_dTrEe;
                         }
                     }
@@ -2562,7 +2921,7 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(const STensor3& Ee, co
         
         if (_useExtraBranch_TVE){                            
             if(_ExtraBranch_TVE_option == 1){
-                mlawNonLinearTVM::extraBranch_nonLinearTVE(Ee,T1,Av,dA_dTrEe,intA,intA1,intA2,dA_dT,ddA_dTT,ddA_dTdTrEe,Bd,dB_dDevEe,intB,intB1,intB2,dB_dT,ddB_dTT,ddB_dTdDevEe);
+                mlawNonLinearTVM::extraBranch_nonLinearTVE(0,Ee,T1,Av,dA_dTrEe,intA,intA1,intA2,dA_dT,ddA_dTT,ddA_dTdTrEe,Bd,dB_dDevEe,intB,intB1,intB2,dB_dT,ddB_dTT,ddB_dTdDevEe);
                 q1->_Av_TVE = Av; q1->_Bd_TVE = Bd; q1->_dAv_dTrEe_TVE = dA_dTrEe; q1->_dBd_dDevEe_TVE = dB_dDevEe;
                 q1->_intAv_TVE = intA; q1->_intBd_TVE = intB;
                 q1->_intAv_1_TVE = intA1; q1->_intBd_1_TVE = intB1;  // this is zero
@@ -2597,7 +2956,7 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(const STensor3& Ee, co
                         q1->_A[i](k,l) = exp_rec_g*q0->_A[i](k,l) + exp_mid_g*devDE(k,l);
                     }
             
-                q1->_B[i] = exp_rec_k*q0->_B[i] + exp_mid_k*trDE;
+                q1->_B[i] = exp_rec_k*q0->_B[i] + exp_mid_k*eff_trDE ; //*trDE; NEW
             
                 // Add to deviatoric stress
                 devK += 2*_Gi[i]*q1->_A[i];
@@ -2639,14 +2998,14 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(const STensor3& Ee, co
                 // Add to volumetric stress
                 p += ( _Ki[i]*q1->_B[i] );
              }
-             else if (_ExtraBranch_TVE_option == 2 || _ExtraBranch_TVE_option == 3){
+             else if (_ExtraBranch_TVE_option == 2 || _ExtraBranch_TVE_option == 3 || _ExtraBranch_TVE_option == 4 || _ExtraBranch_TVE_option == 5){
                     
                 // Single Convolution - get branchElasticStrain
                 for (int k=0; k<3; k++)
                     for (int l=0; l<3; l++)
                         q1->_A[i](k,l) = exp_rec_g*q0->_A[i](k,l) + exp_mid_g*devDE(k,l);
             
-                q1->_B[i] = exp_rec_k*q0->_B[i] + exp_mid_k*trDE;
+                q1->_B[i] = exp_rec_k*q0->_B[i] + exp_mid_k*eff_trDE; // trDE; // NEW
                     
                 static STensor3 branchElasticStrain;
                 branchElasticStrain = q1->_A[i];
@@ -2654,12 +3013,12 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(const STensor3& Ee, co
                 branchElasticStrain(1,1) += 1./3.*q1->_B[i];
                 branchElasticStrain(2,2) += 1./3.*q1->_B[i];
                 if (_ExtraBranch_TVE_option == 2){
-                    mlawNonLinearTVM::extraBranch_nonLinearTVE(branchElasticStrain,T1,Av,dA_dTrEe,intA,intA1,intA2,dA_dT,ddA_dTT,ddA_dTdTrEe,
+                    mlawNonLinearTVM::extraBranch_nonLinearTVE(i,branchElasticStrain,T1,Av,dA_dTrEe,intA,intA1,intA2,dA_dT,ddA_dTT,ddA_dTdTrEe,
                                                                 Bd,dB_dDevEe,intB,intB1,intB2,dB_dT,ddB_dTT,ddB_dTdDevEe);
                 }
                 else{
                     double dB_dTrEe(0.);
-                    mlawNonLinearTVM::extraBranch_nonLinearTVE(branchElasticStrain,T1,Av,dA_dTrEe,intA,intA1,intA2,dA_dT,ddA_dTT,ddA_dTdTrEe,
+                    mlawNonLinearTVM::extraBranch_nonLinearTVE(i,branchElasticStrain,T1,Av,dA_dTrEe,intA,intA1,intA2,dA_dT,ddA_dTT,ddA_dTdTrEe,
                                                                 Bd,dB_dDevEe,intB,intB1,intB2,dB_dT,ddB_dTT,ddB_dTdDevEe,&dB_dTrEe);
                     q1->_dBd_dTrEe_TVE_vector[i] = dB_dTrEe;
                 }
@@ -2677,7 +3036,7 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(const STensor3& Ee, co
                         for (int p=0; p<3; p++)
                             for (int q=0; q<3; q++){
                                 Bd_stiffnessTerm(k,l,p,q) += 2*_Gi[i]*q1->_A[i](k,l)*dB_dDevEe(p,q) * exp_mid_g;
-                                if (_ExtraBranch_TVE_option == 3){
+                                if (_ExtraBranch_TVE_option == 3 || _ExtraBranch_TVE_option == 4 || _ExtraBranch_TVE_option == 5){
                                     (*Bd_stiffnessTerm2)(k,l,p,q) += 2*_Gi[i]*q1->_dBd_dTrEe_TVE_vector[i]*q1->_A[i](k,l)*_I(p,q) * exp_mid_k;
                                 } 
                             }
@@ -2717,6 +3076,11 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(const STensor3& Ee, co
             double dtk(0.), dtk2(0.), exp_rec_k(0.), exp_mid_k(0.);
             double dtg(0.), dtg2(0.), exp_rec_g(0.), exp_mid_g(0.);
             
+            // NEW
+            double Deff_trDE_DT = -3.*(DAlphaDT*(T1-_Tinitial) + AlphaT);
+            double DDeff_trDE_DTT = -3.*(DDAlphaDTT*(T1-_Tinitial) + 2*DAlphaDT);
+            // NEW
+            
             for (int i=0; i<_Gi.size(); i++){   
                 
                 dtk = dt_shift_rec/(_ki[i]);
@@ -2741,8 +3105,8 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(const STensor3& Ee, co
                 
                 if (!_useExtraBranch_TVE){
                     DB_DtrE[i] = exp_mid_k;
-                    DB_DT[i] = q0->_B[i] * Dexp_rec_k_DT + Dexp_mid_k_DT*trDE;
-                    DDB_DTT[i] = q0->_B[i] * DDexp_rec_k_DTT + DDexp_mid_k_DTT*trDE;
+                    DB_DT[i] = q0->_B[i] * Dexp_rec_k_DT + Dexp_mid_k_DT*eff_trDE + exp_rec_k*Deff_trDE_DT; // trDE; // NEW
+                    DDB_DTT[i] = q0->_B[i] * DDexp_rec_k_DTT + DDexp_mid_k_DTT*eff_trDE + 2*Dexp_mid_k_DT*Deff_trDE_DT + exp_mid_k*DDeff_trDE_DTT; // trDE; //NEW
                     DDB_DTDtrE[i] = Dexp_mid_k_DT;
                     for (int k=0; k<3; k++)
                         for (int l=0; l<3; l++){
@@ -2782,13 +3146,13 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(const STensor3& Ee, co
                                 }
                         }
                  }
-                 else if (_ExtraBranch_TVE_option == 2 || _ExtraBranch_TVE_option == 3){
+                 else if (_ExtraBranch_TVE_option == 2 || _ExtraBranch_TVE_option == 3 || _ExtraBranch_TVE_option == 4 || _ExtraBranch_TVE_option == 5){
                     // Here the derivative are made as: B[i] = Av[i]*B[i]; A[i] = Bd[i]*A[i]; Above, BranchElasticStrain = A[i] + 1/3*B[i]*_I
                     
                     double dTrEei_DT(0.), ddTrEei_DTT(0.); // branchElasticStrain trace
                     static STensor3 dDevEei_DT, ddDevEei_DTT;
-                    dTrEei_DT = q0->_B[i] * Dexp_rec_k_DT + Dexp_mid_k_DT*trDE;
-                    ddTrEei_DTT = q0->_B[i] * DDexp_rec_k_DTT + DDexp_mid_k_DTT*trDE;
+                    dTrEei_DT = q0->_B[i] * Dexp_rec_k_DT + Dexp_mid_k_DT*eff_trDE + exp_mid_k*Deff_trDE_DT; // trDE; //NEW
+                    ddTrEei_DTT = q0->_B[i] * DDexp_rec_k_DTT + DDexp_mid_k_DTT*eff_trDE + 2.*Dexp_mid_k_DT*Deff_trDE_DT + exp_mid_k*DDeff_trDE_DTT; // trDE; //NEW
                     for (int k=0; k<3; k++)
                         for (int l=0; l<3; l++){
                             dDevEei_DT(k,l) = q0->_A[i](k,l) * Dexp_rec_g_DT + Dexp_mid_g_DT*devDE(k,l);
@@ -2806,7 +3170,7 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(const STensor3& Ee, co
                             DA_DT[i](k,l) = q1->_Bd_TVE_vector[i]*dDevEei_DT(k,l); 
                             DDA_DTT[i](k,l) = q1->_Bd_TVE_vector[i]*ddDevEei_DTT(k,l); 
                             
-                            if (_ExtraBranch_TVE_option == 3){
+                            if (_ExtraBranch_TVE_option == 3 || _ExtraBranch_TVE_option == 4 || _ExtraBranch_TVE_option == 5){
                                 DA_DT[i](k,l) += q1->_A[i](k,l)*q1->_dBd_dTrEe_TVE_vector[i]*dTrEei_DT;
                                 DDA_DTT[i](k,l) += q1->_A[i](k,l)*q1->_dBd_dTrEe_TVE_vector[i]*ddTrEei_DTT +
                                                     2*q1->_dBd_dTrEe_TVE_vector[i]*dTrEei_DT*dDevEei_DT(k,l);  
@@ -2825,7 +3189,11 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(const STensor3& Ee, co
                                     // _Idev is not pre-multiplied !! 
                                     DA_DdevE[i](k,l,r,s) =  exp_mid_g * ( q1->_A[i](k,l)*q1->_dBd_dDevEe_TVE_vector[i](r,s) + q1->_Bd_TVE_vector[i] * _I4(k,l,r,s) );  
                                     DDA_DTDdevE[i](k,l,r,s) =  Dexp_mid_g_DT * ( q1->_A[i](k,l)*q1->_dBd_dDevEe_TVE_vector[i](r,s) + q1->_Bd_TVE_vector[i] * _I4(k,l,r,s) ) 
-                                                                + exp_mid_g * ( 2.* dDevEei_DT(k,l)* q1->_dBd_dDevEe_TVE_vector[i](r,s));  
+                                                                + exp_mid_g * ( dDevEei_DT(k,l)* q1->_dBd_dDevEe_TVE_vector[i](r,s));  
+                                    for (int p=0; p<3; p++)
+                                        for (int q=0; q<3; q++){
+                                            DDA_DTDdevE[i](k,l,r,s) += exp_mid_g * q1->_dBd_dDevEe_TVE_vector[i](p,q)*dDevEei_DT(p,q)*_I4(k,l,r,s);
+                                        }
                                 }
                         }
                  } // if - extraBranchTVE_option
@@ -2842,6 +3210,10 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(const STensor3& Ee, co
             double dtk(0.), dtk2(0.), exp_rec_k(0.), exp_mid_k(0.);
             double dtg(0.), dtg2(0.), exp_rec_g(0.), exp_mid_g(0.);
             
+            // NEW
+            double Deff_trDE_DT = -3.*(DAlphaDT*(T1-_Tinitial) + AlphaT);
+            // NEW
+            
             for (int i=0; i<_Gi.size(); i++){   
                 
                 dtk = dt_shift_rec/(_ki[i]);
@@ -2860,7 +3232,7 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(const STensor3& Ee, co
                 Dexp_mid_g_DT = -1/(_gi[i]) * Ddt_shiftDT_mid*exp_mid_g;
                 
                 if (!_useExtraBranch_TVE){
-                    DB_DT[i] = q0->_B[i] * Dexp_rec_k_DT + Dexp_mid_k_DT*trDE;
+                    DB_DT[i] = q0->_B[i] * Dexp_rec_k_DT + Dexp_mid_k_DT*eff_trDE + exp_rec_k*Deff_trDE_DT; // trDE; // NEW
                     for (int k=0; k<3; k++)
                         for (int l=0; l<3; l++){
                             DA_DT[i](k,l) = q0->_A[i](k,l) * Dexp_rec_g_DT + Dexp_mid_g_DT*devDE(k,l); 
@@ -2880,12 +3252,12 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(const STensor3& Ee, co
                                                                                 q0->_A[i](k,l) * 1/q0->_Bd_TVE * temp2); 
                         }
                  }
-                 else if (_ExtraBranch_TVE_option == 2 || _ExtraBranch_TVE_option == 3){      
+                 else if (_ExtraBranch_TVE_option == 2 || _ExtraBranch_TVE_option == 3 || _ExtraBranch_TVE_option == 4 || _ExtraBranch_TVE_option == 5){
                     // Here the derivative are made as: B[i] = Av[i]*B[i]; A[i] = Bd[i]*A[i]; Above, BranchElasticStrain = A[i] + 1/3*B[i]*_I
                      
                     double dTrEei_DT(0.); // branchElasticStrain trace
                     static STensor3 dDevEei_DT;
-                    dTrEei_DT = q0->_B[i] * Dexp_rec_k_DT + Dexp_mid_k_DT*trDE;
+                    dTrEei_DT = q0->_B[i] * Dexp_rec_k_DT + Dexp_mid_k_DT*eff_trDE + exp_mid_k*Deff_trDE_DT; // trDE; //NEW
                     for (int k=0; k<3; k++)
                         for (int l=0; l<3; l++)
                             dDevEei_DT(k,l) = q0->_A[i](k,l) * Dexp_rec_g_DT + Dexp_mid_g_DT*devDE(k,l);
@@ -2895,7 +3267,7 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(const STensor3& Ee, co
                         for (int l=0; l<3; l++){
                             DA_DT[i](k,l) = q1->_Bd_TVE_vector[i]*dDevEei_DT(k,l); 
                             
-                            if (_ExtraBranch_TVE_option == 3){
+                            if (_ExtraBranch_TVE_option == 3 || _ExtraBranch_TVE_option == 4 || _ExtraBranch_TVE_option == 5){
                                 DA_DT[i](k,l) += q1->_A[i](k,l)*q1->_dBd_dTrEe_TVE_vector[i]*dTrEei_DT;
                             }
                             
@@ -3059,4 +3431,4 @@ void mlawNonLinearTVM::getMechSource_nonLinearTVE_term(const IPNonLinearTVM *q0,
         }
     }
                                           
-}; */
\ No newline at end of file
+}; */
diff --git a/NonLinearSolver/materialLaw/mlawNonLinearTVM.h b/NonLinearSolver/materialLaw/mlawNonLinearTVM.h
index 55e6bc3d7e5b3b7d93b52a3c11e4d2472ad0ff5c..75ab05a0bba921e48a93c3c33b59abbf9d176b3c 100644
--- a/NonLinearSolver/materialLaw/mlawNonLinearTVM.h
+++ b/NonLinearSolver/materialLaw/mlawNonLinearTVM.h
@@ -66,6 +66,22 @@ class mlawNonLinearTVM : public mlawPowerYieldHyper{
     scalarFunction* _temFunc_elasticCorrection_Bulk;
     scalarFunction* _temFunc_elasticCorrection_Shear;
     
+  // Extrabranch Corrector parameters
+    std::vector<double> _V0;
+    std::vector<double> _V1;
+    std::vector<double> _V2;
+    std::vector<double> _V3;
+    std::vector<double> _V4;
+    std::vector<double> _V5;
+    std::vector<double> _D0;
+    std::vector<double> _D1;
+    std::vector<double> _D2;
+    std::vector<double> _D3;
+    std::vector<double> _D4;
+    std::vector<double> _D5;
+    std::vector<double> _Ci;
+
+
   #ifndef SWIG  
   protected:
   // Const Functions for constitutive function - To update any variable, pass it as an argument by reference.
@@ -84,7 +100,7 @@ class mlawNonLinearTVM : public mlawPowerYieldHyper{
                                                  double &B_d, STensor3 &dB_vddev, double &intB, double &dBdT,
                                                  double *ddAdTT = NULL, double *ddBdTT = NULL,
                                                  double *ddA_vdTdE = NULL, STensor3 *ddB_vdTdevE = NULL,
-                                                 double *dB_dTrEe = NULL, double *dB_dTdTrEe = NULL) const;
+                                                 double *dB_dTrEe = NULL, double *dB_dTdTrEe = NULL, double *psiInfCorrector = NULL) const;
     
     virtual void extraBranchLaw(const STensor3& Ee,  const double& T, const IPNonLinearTVM *q0, IPNonLinearTVM *q1, 
                         STensor3& sig, const bool stiff = false, STensor43* DsigDEe = NULL, STensor3* DsigDT = NULL, 
@@ -94,7 +110,7 @@ class mlawNonLinearTVM : public mlawPowerYieldHyper{
                         double* DDsigV_dTdTrEe = NULL, STensor43* DDsigD_dTdDevEe = NULL,
                         STensor3* DsigD_dTrEe = NULL, STensor3* DsigD_dTdTrEe = NULL) const;
     
-    virtual void extraBranch_nonLinearTVE(const STensor3& Ee,  const double& T, 
+    virtual void extraBranch_nonLinearTVE(const int i, const STensor3& Ee,  const double& T,
                         double& Av, double& dA_dTrEe, double& intA, double& intA1, double& intA2, double& dA_dT, double& ddA_dTT, double& ddA_dTdTrEe,
                         double& Bd, STensor3& dB_dDevEe, double &intB, STensor3 &intB1, STensor3 &intB2, double &dB_dT, double &ddB_dTT, STensor3& ddB_dTdDevEe,
                         double* dB_dTrEe = NULL) const;
@@ -186,6 +202,10 @@ class mlawNonLinearTVM : public mlawPowerYieldHyper{
     virtual void setViscoElasticData(const int i, const double Ei, const double taui);
     virtual void setViscoElasticData_Bulk(const int i, const double Ki, const double ki);
     virtual void setViscoElasticData_Shear(const int i, const double Gi, const double gi);
+    virtual void setCorrectionsAllBranchesTVE(const int i, const double V1, const double V2, const double D1, const double D2);
+    virtual void setAdditionalCorrectionsAllBranchesTVE(const int i, const double V3, const double D3);
+    virtual void setAdditionalCorrectionsAllBranchesTVE(const int i, const double V3, const double V4, const double V5, const double D3, const double D4, const double D5);
+    virtual void setCompressionCorrectionsAllBranchesTVE(const int i, const double Ci);
     virtual void setViscoElasticData(const std::string filename);
     
   // Non-Const Functions for temp and temp_functions that are called from .py file.  ---- These WILL change the values of the variables defined in the class object.
@@ -339,4 +359,4 @@ class mlawNonLinearTVM : public mlawPowerYieldHyper{
     virtual void checkInternalState(IPVariable* ipv, const IPVariable* ipvprev) const{}; // do nothing
     #endif // SWIG
 };
-#endif //mlawNonLinearTVM
\ No newline at end of file
+#endif //mlawNonLinearTVM
diff --git a/NonLinearSolver/materialLaw/mlawNonLinearTVP.cpp b/NonLinearSolver/materialLaw/mlawNonLinearTVP.cpp
index c01fd8e62d4229a4936230545a4ec29703116016..e45d224a9fd182848c587a32018f2a3480410fba 100644
--- a/NonLinearSolver/materialLaw/mlawNonLinearTVP.cpp
+++ b/NonLinearSolver/materialLaw/mlawNonLinearTVP.cpp
@@ -1046,7 +1046,7 @@ void mlawNonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow(const STensor3&
   sigExtra = sigExtra_pr;
   DsigV_dTrEe = DsigV_dTrEe_pr;
   DsigD_dDevEe = DsigD_dDevEe_pr;
-  const STensor3& dKeprDT = q1->_DcorKirDT; // Get the predicted value - dont add extra branch here
+  const STensor3& dKeprDT = q1->_DcorKirDT; // Get the predicted value - Has extraBranch inside
 
   // Initialise Dho
   static STensor43 Dho3, Dho4inv, Dho4_u_inv;  // This will be the final important tensor.
@@ -1793,45 +1793,6 @@ void mlawNonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow(const STensor3&
         
         STensorOperation::multSTensor3STensor43(DphiEDdevPhi,DdevphiDCepr,DphiEDCepr);
 
-        
-    // Numerical Derivatives
-    /*
-    double Dgamma_plus(0.), Gamma_plus(0.), u_plus(0.), v_plus(0.), ptilde_plus(0.), ptildepr_plus(0.);
-    static STensor3 F_plus, Ee_plus, Kepr_plus, Mepr_plus, Ke_plus, Me_plus, N_plus, P_plus, DphiPDF_plus, sigExtra_plus, devPhipr_plus, devPhi_plus;
-    static STensor3 Cepr_plus, Eepr_plus;
-    static STensor43 DEeDCepr_plus, dlnCdC_pr_plus;
-
-    static IPNonLinearTVP q_Plus(*q0);
-
-    // Deformation Derivatives
-    for (int i=0; i<3; i++){
-      for (int j=0; j<3; j++){
-        F_plus = (F);
-        F_plus(i,j) += _perturbationfactor;
-        Cepr_plus = Cepr;
-        Cepr_plus(i,j) += 0.5*_perturbationfactor;
-        Cepr_plus(j,i) += 0.5*_perturbationfactor;
-        
-        bool ok1 = STensorOperation::logSTensor3(Cepr_plus,_order,Eepr_plus,&dlnCdC_pr_plus);
-        Ee_plus = -Gamma*N;
-        Ee_plus += Eepr_plus;
-        
-        
-         for (int k=0; k<3; k++){
-           for (int l=0; l<3; l++){
-             DEeDCepr_plus(k,l,i,j) = (Ee_plus(k,l) - Ee(k,l))/(_perturbationfactor);
-           }
-         }
-         
-        plasticCorrector_TVP(F0,F,q0,&q_Plus,T0,T,Kepr_plus,Mepr_plus,u_plus,v_plus,
-                            Ke_plus,Me_plus,N_plus,P_plus,
-                            Dgamma_plus, Gamma_plus,
-                            ptildepr_plus, ptilde_plus, devPhipr_plus, devPhi_plus,
-                            true, &DphiPDF_plus);
-                            
-      }
-    }*/
-    
         //9. get DtrNDCepr DdevNdCepr
         DtrNDCepr = DphiPDCepr;
         DtrNDCepr *= (2.*_b);
@@ -1839,7 +1800,6 @@ void mlawNonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow(const STensor3&
         DdevNDCepr = DdevphiDCepr;
         DdevNDCepr *= 3.;
 
-    // DEBUG
     for (int i=0; i<3; i++)
       for (int j=0; j<3; j++)
         for (int k=0; k<3; k++)
@@ -2117,7 +2077,9 @@ void mlawNonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow(const STensor3&
 
     DcorKirDT = dKeprDT; // update later
 
-    // 1.1 add extraBranch DsigV_DT, DsigD_DT (these do not need to be corrected)
+    // Not required anymore -> dKeprDT has extrabranch inside
+    // 1.1 add extraBranch DsigV_DT, DsigD_DT (these do not need to be corrected) 
+    /*
     if (_useExtraBranch){
 
         DcorKirDT += DsigD_dT;
@@ -2130,7 +2092,7 @@ void mlawNonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow(const STensor3&
         dDevMeprDT += DsigD_dT; // goes to dDevPhiprDT
 
         // dMedT, dSdT come from DcorKirDT directly
-    }
+    }*/ 
 
     // 2. get dPhipprDT and dDevPhiprDT
     static double dPhipprDT;
@@ -2558,26 +2520,6 @@ void mlawNonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow(const STensor3&
   STensor3& temp_DcorKirDT = q1->getRefToDcorKirDT();
   STensor3& DDcorKirDTT = q1->getRefToDDcorKirDTT();
   STensor43& DDcorKirDTDEe = q1->getRefToDDcorKirDTDE();
-  
-    // Recall extraBranch
-  double DDsigV_dTdTrEe(0.), DDsigV_dTT(0.);
-  static STensor3 sigExtra_Temp, DDsigD_dTT;
-  static STensor43 DDsigD_dTdDevEe;
-  STensorOperation::zero(sigExtra_Temp);
-  STensorOperation::zero(DDsigD_dTdDevEe);
-  STensorOperation::zero(DDsigD_dTT);
-  if (_useExtraBranch){
-    mlawNonLinearTVM::extraBranchLaw(Ee,T,q0,q1,sigExtra_Temp,stiff,NULL,NULL,NULL,NULL,NULL,NULL,&DDsigV_dTT,&DDsigD_dTT,&DDsigV_dTdTrEe,&DDsigD_dTdDevEe);
-    temp_DcorKirDT += DsigV_dT*_I;
-    temp_DcorKirDT += DsigD_dT;
-    DDcorKirDTT += DDsigV_dTT*_I;
-    DDcorKirDTT += DDsigD_dTT;
-    for (int i=0; i<3; i++)
-        for (int j=0; j<3; j++)
-            for (int k=0; k<3; k++)
-                for (int l=0; l<3; l++)
-                    DDcorKirDTDEe(i,j,k,l) += DDsigV_dTdTrEe*_I(i,j)*_I(k,l) + DDsigD_dTdDevEe(i,j,k,l);
-    }
     
     static STensor3 DcorKirDT_I;
     STensorOperation::multSTensor3STensor43(Correct_DcorKirDT,_I4,DcorKirDT_I);
diff --git a/NonLinearSolver/materialLaw/mullinsEffect.cpp b/NonLinearSolver/materialLaw/mullinsEffect.cpp
index 6d2182ca5ae3af335c326b46700a4c1da54f44a7..492a802249ea7e1f2653eb083b252ac57653f965 100644
--- a/NonLinearSolver/materialLaw/mullinsEffect.cpp
+++ b/NonLinearSolver/materialLaw/mullinsEffect.cpp
@@ -175,7 +175,7 @@ void negativeExponentialScaler::mullinsEffectScaling(double _psi0, double _psi,
   // Msg::Error(" Inside mullinsEffectScaling, _psi = %e, _psi_max = %e !!", _psi, _psi_max);
   
   double Dpsi_maxDpsi_cap = 1.; // Dpsi_maxDpsi_cap = 1. if _psi_max = _psi
-  double Term = sqrt(_m*(_psi_max-eta*psi_cap));  // Term = 0. if _psi_max = _psi
+  double Term = sqrt(m*(_psi_max-eta*psi_cap));  // Term = 0. if _psi_max = _psi
   
   if (Term!=0){
     
@@ -183,11 +183,11 @@ void negativeExponentialScaler::mullinsEffectScaling(double _psi0, double _psi,
     int maxite = 100; 
     double _tol = 1e-8;
     double DfDeta(0.), Deta(0.);
-    double f = eta + _r*(1-exp(-Term)) - 1.;
+    double f = eta + r*(1-exp(-Term)) - 1.;
     
     while (fabs(f) >_tol or ite <1){
       
-      DfDeta = 1 + _r*(-_m*psi_cap*exp(-Term)/(2*Term));
+      DfDeta = 1 + r*(-m*psi_cap*exp(-Term)/(2*Term));
       Deta = - f/DfDeta;
       
       if (eta + Deta > 1.){
@@ -199,8 +199,8 @@ void negativeExponentialScaler::mullinsEffectScaling(double _psi0, double _psi,
       // eta += Deta;
       // Msg::Error(" Inside iterator, ite = %d, f = %e, DfDeta = %e, Deta = %e, eta = %e !!", ite, f, DfDeta, Deta, eta);
   
-      Term = sqrt(_m*(_psi_max-eta*psi_cap));  
-      f = eta + _r*(1-exp(-Term)) - 1.;
+      Term = sqrt(m*(_psi_max-eta*psi_cap));
+      f = eta + r*(1-exp(-Term)) - 1.;
       
       ite++;
       if (fabs(f) <_tol) break;
@@ -214,7 +214,7 @@ void negativeExponentialScaler::mullinsEffectScaling(double _psi0, double _psi,
     
     Dpsi_maxDpsi_cap = 0.;
     
-    DetaDpsi_cap = (-_r*_m*exp(-Term)/(2*Term)) * (Dpsi_maxDpsi_cap - eta) / (1 - _r*_m*exp(-Term)/(2*Term)*psi_cap);
+    DetaDpsi_cap = (-r*m*exp(-Term)/(2*Term)) * (Dpsi_maxDpsi_cap - eta) / (1 - r*m*exp(-Term)/(2*Term)*psi_cap);
   }
   else{
     eta = 1.; 
@@ -301,6 +301,7 @@ void hyperbolicScaler::mullinsEffectScaling(double _psi0, double _psi, const IPM
   double psi_cap = _psi;
   double eta = 1., DetaDpsi_cap = 0., DDetaDpsipsi = 0., DetaDT = 0., DDetaDTT = 0.;
   double DpsiNew_DpsiMax(0.), DDpsiNew_DpsiMaxDpsi(0.), DDpsiNew_DpsiMaxDT(0.);
+  double Dpsi_max_Dpsi_cap(0.);
   
   double _psi_max = std::max(_psi,_psi_max0);
   // Msg::Error(" Inside mullinsEffectScaling, _psi = %e, _psi_max = %e !!", _psi, _psi_max);
@@ -310,13 +311,13 @@ void hyperbolicScaler::mullinsEffectScaling(double _psi0, double _psi, const IPM
     eta = (1-_r)/(1-_r*psi_cap/_psi_max);
 
     // derivatives
-    double Dpsi_max_Dpsi_cap(0.);
     if (psi_cap >= _psi_max) Dpsi_max_Dpsi_cap = 1.;
     DetaDpsi_cap = -pow(eta,2)/(1-_r) * (-_r/_psi_max + _r*psi_cap/pow(_psi_max,2)*Dpsi_max_Dpsi_cap);
   }
   
   ipv.set(eta,DetaDpsi_cap,DDetaDpsipsi,DetaDT,DDetaDTT,DpsiNew_DpsiMax, DDpsiNew_DpsiMaxDpsi, DDpsiNew_DpsiMaxDT);
   ipv.setPsiMax(_psi_max);
+  ipv.setDpsiMax_Dpsi(Dpsi_max_Dpsi_cap);
 }
 
 void hyperbolicScaler::mullinsEffectScaling(double _psi0, double _psi, const IPMullinsEffect &ipvprev, IPMullinsEffect &ipv, const double T, const double& dPsi_capDT) const{
@@ -329,16 +330,16 @@ void hyperbolicScaler::mullinsEffectScaling(double _psi0, double _psi, const IPM
   double psi_cap = _psi;
   double eta = 1., DetaDpsi_cap = 0., DDetaDpsipsi = 0., DetaDT = 0., DDetaDTT = 0.;
   double DpsiNew_DpsiMax(0.), DDpsiNew_DpsiMaxDpsi(0.), DDpsiNew_DpsiMaxDT(0.);
+  double Dpsi_max_Dpsi_cap(0.), Dpsi_max_DT(0.);
   
   double _psi_max = std::max(_psi,_psi_max0);
   // Msg::Error(" Inside mullinsEffectScaling, _psi = %e, _psi_max = %e !!", _psi, _psi_max);
   
   if (_psi_max>0.){
     // eta
-    eta = (1-_r)/(1-_r*psi_cap/_psi_max);
+    eta = (1-r)/(1-r*psi_cap/_psi_max);
    
     // derivatives 
-    double Dpsi_max_Dpsi_cap(0.), Dpsi_max_DT(0.);
     if (psi_cap >= _psi_max){
         Dpsi_max_Dpsi_cap = 1.;
         Dpsi_max_DT = dPsi_capDT;
@@ -349,6 +350,7 @@ void hyperbolicScaler::mullinsEffectScaling(double _psi0, double _psi, const IPM
   
   ipv.set(eta,DetaDpsi_cap,DDetaDpsipsi,DetaDT,DDetaDTT,DpsiNew_DpsiMax, DDpsiNew_DpsiMaxDpsi, DDpsiNew_DpsiMaxDT);
   ipv.setPsiMax(_psi_max);
+  ipv.setDpsiMax_Dpsi(Dpsi_max_Dpsi_cap);
 }
 
 mullinsEffect *hyperbolicScaler::clone() const
@@ -416,6 +418,7 @@ void linearScaler::mullinsEffectScaling(double _psi0, double _psi, const IPMulli
   double psi_cap = _psi;
   double eta = 1., DetaDpsi_cap = 0., DDetaDpsipsi = 0., DetaDT = 0., DDetaDTT = 0.;
   double DpsiNew_DpsiMax(0.), DDpsiNew_DpsiMaxDpsi(0.), DDpsiNew_DpsiMaxDT(0.);
+  double Dpsi_max_Dpsi_cap(0.);
   
   double _psi_max = std::max(_psi,_psi_max0);
   // Msg::Error(" Inside mullinsEffectScaling, _psi = %e, _psi_max = %e !!", _psi, _psi_max);
@@ -425,7 +428,6 @@ void linearScaler::mullinsEffectScaling(double _psi0, double _psi, const IPMulli
     eta = (1-_r*(1-psi_cap/_psi_max));
 
     // derivatives
-    double Dpsi_max_Dpsi_cap(0.);
     if (psi_cap >= _psi_max) Dpsi_max_Dpsi_cap = 1.;
     
     DetaDpsi_cap = _r/_psi_max + _r*psi_cap/pow(_psi_max,2) * (-Dpsi_max_Dpsi_cap);
@@ -437,6 +439,7 @@ void linearScaler::mullinsEffectScaling(double _psi0, double _psi, const IPMulli
   
   ipv.set(eta,DetaDpsi_cap,DDetaDpsipsi,DetaDT,DDetaDTT,DpsiNew_DpsiMax, DDpsiNew_DpsiMaxDpsi, DDpsiNew_DpsiMaxDT);
   ipv.setPsiMax(_psi_max);
+  ipv.setDpsiMax_Dpsi(Dpsi_max_Dpsi_cap);
 }
 
 void linearScaler::mullinsEffectScaling(double _psi0, double _psi, const IPMullinsEffect &ipvprev, IPMullinsEffect &ipv, const double T, const double& dPsi_capDT) const{
@@ -449,32 +452,33 @@ void linearScaler::mullinsEffectScaling(double _psi0, double _psi, const IPMulli
   double psi_cap = _psi;
   double eta = 1., DetaDpsi_cap = 0., DDetaDpsipsi = 0., DetaDT = 0., DDetaDTT = 0.;
   double DpsiNew_DpsiMax(0.), DDpsiNew_DpsiMaxDpsi(0.), DDpsiNew_DpsiMaxDT(0.);
+  double Dpsi_max_Dpsi_cap(0.), Dpsi_max_DT(0.);
   
   double _psi_max = std::max(_psi,_psi_max0);
   // Msg::Error(" Inside mullinsEffectScaling, _psi = %e, _psi_max = %e !!", _psi, _psi_max);
   
   if (_psi_max>0.){
     // eta
-    eta = (1-_r*(1-psi_cap/_psi_max));
+    eta = (1-r*(1-psi_cap/_psi_max));
 
     // derivatives 
-    double Dpsi_max_Dpsi_cap(0.), Dpsi_max_DT(0.);
     if (psi_cap >= _psi_max){
         Dpsi_max_Dpsi_cap = 1.;
         Dpsi_max_DT = dPsi_capDT;
     }
     
     DetaDpsi_cap = r/_psi_max + r*psi_cap/pow(_psi_max,2) * (-Dpsi_max_Dpsi_cap);
-    DetaDT = -drdT*(1.-psi_cap/_psi_max) + r*(dPsi_capDT*1/_psi_max - psi_cap/pow(_psi_max,2)*Dpsi_max_DT); 
+    DetaDT = -drdT*(1.-psi_cap/_psi_max) + r*(dPsi_capDT*1/_psi_max - psi_cap/pow(_psi_max,2)*Dpsi_max_DT);
     
     double DetaDpsi_max = -r*psi_cap/pow(_psi_max,2);
     DpsiNew_DpsiMax = -r*pow(psi_cap,2)/(2.*pow(_psi_max,2));
-    DDpsiNew_DpsiMaxDpsi = DetaDpsi_max;
-    DDpsiNew_DpsiMaxDT = -drdT*(pow(psi_cap,2)/(2.*pow(_psi_max,2))) - r*psi_cap/pow(_psi_max,2)*dPsi_capDT + r*pow(psi_cap,2)/pow(_psi_max,3)*Dpsi_max_DT;
+    DDpsiNew_DpsiMaxDpsi = DetaDpsi_max + r*pow(psi_cap,2)/pow(_psi_max,3)*Dpsi_max_Dpsi_cap;
+    DDpsiNew_DpsiMaxDT = DDpsiNew_DpsiMaxDpsi*dPsi_capDT - drdT*(pow(psi_cap,2)/(2.*pow(_psi_max,2)));
   }
   
   ipv.set(eta,DetaDpsi_cap,DDetaDpsipsi,DetaDT,DDetaDTT,DpsiNew_DpsiMax, DDpsiNew_DpsiMaxDpsi, DDpsiNew_DpsiMaxDT);
   ipv.setPsiMax(_psi_max);
+  ipv.setDpsiMax_Dpsi(Dpsi_max_Dpsi_cap);
 }
 
 mullinsEffect *linearScaler::clone() const
@@ -635,7 +639,7 @@ void positiveExponentialScaler::mullinsEffectScaling(double _psi0, double _psi,
   // Msg::Error(" Inside mullinsEffectScaling, _psi = %e, _psi_max = %e !!", _psi, _psi_max);
   
   double Dpsi_maxDpsi_cap = 1.; // Dpsi_maxDpsi_cap = 1. if _psi_max = _psi
-  double Term = sqrt(_m*(_psi_max-eta*psi_cap));  // Term = 0. if _psi_max = _psi
+  double Term = sqrt(m*(_psi_max-eta*psi_cap));  // Term = 0. if _psi_max = _psi
   
   if (Term!=0){
     
@@ -643,11 +647,11 @@ void positiveExponentialScaler::mullinsEffectScaling(double _psi0, double _psi,
     int maxite = 100; 
     double _tol = 1e-8;
     double DfDeta(0.), Deta(0.);
-    double f = eta + _r*(1-exp(-Term)) - 1.;
+    double f = eta + r*(1-exp(-Term)) - 1.;
 
     while (fabs(f) >_tol or ite <1){
       
-      DfDeta = 1 + _r*(-_m*psi_cap*exp(-Term)/(2*Term));
+      DfDeta = 1 + r*(-m*psi_cap*exp(-Term)/(2*Term));
       Deta = - f/DfDeta;
       
       if (eta + Deta > 1.){
@@ -658,8 +662,8 @@ void positiveExponentialScaler::mullinsEffectScaling(double _psi0, double _psi,
           
       // Msg::Error(" Inside iterator, ite = %d, f = %e, DfDeta = %e, Deta = %e, eta = %e !!", ite, f, DfDeta, Deta, eta);
   
-      Term = sqrt(_m*(_psi_max-eta*psi_cap));  
-      f = eta + _r*(1-exp(-Term)) - 1.;
+      Term = sqrt(m*(_psi_max-eta*psi_cap));
+      f = eta + r*(1-exp(-Term)) - 1.;
       
       ite++;
       if (fabs(f) <_tol) break;
@@ -673,7 +677,7 @@ void positiveExponentialScaler::mullinsEffectScaling(double _psi0, double _psi,
     // eta = 1+_r*(1-exp(_m*(1 - psi_cap/_psi_max)));
     Dpsi_maxDpsi_cap = 0.;
     
-    DetaDpsi_cap = (-_r*_m*exp(-Term)/(2*Term)) * (Dpsi_maxDpsi_cap - eta) / (1 - _r*_m*exp(-Term)/(2*Term)*psi_cap);
+    DetaDpsi_cap = (-r*m*exp(-Term)/(2*Term)) * (Dpsi_maxDpsi_cap - eta) / (1 - r*m*exp(-Term)/(2*Term)*psi_cap);
   }
   else{
     eta = 1.; 
@@ -689,4 +693,4 @@ mullinsEffect *positiveExponentialScaler::clone() const
   return new positiveExponentialScaler(*this);
 }
 
-// #############
\ No newline at end of file
+// #############
diff --git a/dG3D/benchmarks/hyperViscoElastic/cylinder.py b/dG3D/benchmarks/hyperViscoElastic/cylinder.py
index 6d1fccd8a7e6d81e17831a3cd632af3079520e7a..4e3857f76f3051b66878f79f5b1b92002bab09d8 100644
--- a/dG3D/benchmarks/hyperViscoElastic/cylinder.py
+++ b/dG3D/benchmarks/hyperViscoElastic/cylinder.py
@@ -18,11 +18,11 @@ rho = 7850e-9 # Bulk mass
 
 
 law1   = HyperViscoElasticDG3DMaterialLaw(lawnum,rho, E,nu)
-law1.setStrainOrder(11) # approx log exp opertor
-law1.setViscoelasticMethod(1) # 0- maxwell, 1- Kevin-voigt
+law1.setStrainOrder(-1) # approx log exp opertor
+law1.setViscoelasticMethod(0) # 0- maxwell, 1- Kevin-voigt
 
 N = 4; # number of branch
-law1.setViscoElasticNumberOfElement(N) # 
+law1.setViscoElasticNumberOfElement(N) #
 law1.setViscoElasticData(1,100,10)
 law1.setViscoElasticData(2,100,5)
 law1.setViscoElasticData(3,100,1)
@@ -43,9 +43,9 @@ myfield1.stabilityParameters(beta1)
 # solver
 sol = 2  # Gmm=0 (default) Taucs=1 PETsc=2
 soltype =1 # StaticLinear=0 (default) StaticNonLinear=1
-nstep = 50  # number of step (used only if soltype=1)
-ftime = 1.   # Final time (used only if soltype=1)
-tol=1.e-10  # relative tolerance for NR scheme (used only if soltype=1)
+nstep = 100  # number of step (used only if soltype=1)
+ftime = 12*2/1.e-2   # Final time (used only if soltype=1)
+tol=1.e-7  # relative tolerance for NR scheme (used only if soltype=1)
 nstepArch=1 # Number of step between 2 archiving (used only if soltype=1)
 
 
@@ -71,7 +71,11 @@ fu.put(0.4*ftime,umax)
 fu.put(0.7*ftime,-0.1*umax)
 fu.put(ftime,umax)
 
-mysolver.displacementBC('Face',2,2,fu)
+fu_L = PiecewiseLinearFunction()
+fu_L.put(0,0)
+fu_L.put(ftime,12*2)
+
+mysolver.displacementBC('Face',2,2,fu_L)
 
 # build view
 mysolver.internalPointBuildView("Strain_xx",IPField.STRAIN_XX, 1, 1);
@@ -110,4 +114,3 @@ mysolver.solve()
 
 check = TestCheck()
 check.equal(2.346497e+01,mysolver.getArchivedForceOnPhysicalGroup("Face", 1, 2),1.e-3)
-
diff --git a/dG3D/benchmarks/nonLinearTVP_allExtraBranches_cube/TPU_relaxationSpectrum_Et_N64_28_03_24_Trefm30.txt b/dG3D/benchmarks/nonLinearTVP_allExtraBranches_cube/TPU_relaxationSpectrum_Et_N64_28_03_24_Trefm30.txt
new file mode 100644
index 0000000000000000000000000000000000000000..d4accf6574d6d3d2dc931deb6eb7c1f1da212709
--- /dev/null
+++ b/dG3D/benchmarks/nonLinearTVP_allExtraBranches_cube/TPU_relaxationSpectrum_Et_N64_28_03_24_Trefm30.txt
@@ -0,0 +1,129 @@
+1.625007916375748813e+07
+1.000000000000000000e+09
+1.283978418874915987e+08
+1.223717869196788222e+08
+1.181005705711700767e+08
+1.089380579688416123e+08
+1.031232320638373345e+08
+9.922607590394645929e+07
+9.729797632821390033e+07
+9.665399292950335145e+07
+9.642740849198748171e+07
+9.564441566156442463e+07
+9.315953031193923950e+07
+8.833409580494977534e+07
+8.111496619828665257e+07
+7.296521446255537868e+07
+6.497025556169453263e+07
+5.764062135514917225e+07
+5.184229060733832419e+07
+4.753783082364760339e+07
+4.481067484846460819e+07
+4.416358270341629535e+07
+4.536899884176179767e+07
+5.064046090451937169e+07
+6.174407825567868352e+07
+8.147240035397948325e+07
+1.117819095519595891e+08
+1.438796963477450311e+08
+1.670027986239266098e+08
+1.742009136088265181e+08
+1.639430935898946822e+08
+1.434145951149095595e+08
+1.191703702685215026e+08
+9.520917302248769999e+07
+7.433779650344344974e+07
+5.728844982043570280e+07
+4.400571735897961259e+07
+3.399161600600884110e+07
+2.654683819484577700e+07
+2.110234496821391210e+07
+1.710013009479070827e+07
+1.414172178642180189e+07
+1.193027334877739102e+07
+1.016771323258111253e+07
+8.779543124922089279e+06
+7.745365369133623317e+06
+6.840953185689423233e+06
+5.994072543483622372e+06
+5.321047145454889163e+06
+4.731067289288544096e+06
+4.239008481816987507e+06
+3.858405493953337893e+06
+3.490876921252443455e+06
+3.200590970116929617e+06
+2.997600436458109878e+06
+2.813855739644110203e+06
+2.683142899888558779e+06
+2.590574290467962623e+06
+2.490485693044999614e+06
+2.380686491815341637e+06
+2.285846273252721876e+06
+2.218988508806935977e+06
+2.068374527020663023e+06
+1.940737277603511000e+06
+2.847223143023391720e+06
+1.000000000000000056e-32
+1.000000000000000083e-31
+1.000000000000000083e-30
+9.999999999999999432e-30
+9.999999999999999712e-29
+1.000000000000000038e-27
+1.000000000000000038e-26
+1.000000000000000038e-25
+9.999999999999999237e-25
+9.999999999999999604e-24
+1.000000000000000049e-22
+9.999999999999999075e-22
+9.999999999999999452e-21
+9.999999999999999752e-20
+1.000000000000000072e-18
+1.000000000000000072e-17
+9.999999999999999791e-17
+1.000000000000000078e-15
+9.999999999999999988e-15
+1.000000000000000030e-13
+9.999999999999999799e-13
+9.999999999999999395e-12
+1.000000000000000036e-10
+1.000000000000000062e-09
+1.000000000000000021e-08
+9.999999999999999547e-08
+9.999999999999999547e-07
+1.000000000000000082e-05
+1.000000000000000048e-04
+1.000000000000000021e-03
+1.000000000000000021e-02
+1.000000000000000056e-01
+1.000000000000000000e+00
+1.000000000000000000e+01
+1.000000000000000000e+02
+1.000000000000000000e+03
+1.000000000000000000e+04
+1.000000000000000000e+05
+1.000000000000000000e+06
+1.000000000000000000e+07
+1.000000000000000000e+08
+1.000000000000000000e+09
+1.000000000000000000e+10
+1.000000000000000000e+11
+1.000000000000000000e+12
+1.000000000000000000e+13
+1.000000000000000000e+14
+1.000000000000000000e+15
+1.000000000000000000e+16
+1.000000000000000000e+17
+1.000000000000000000e+18
+1.000000000000000000e+19
+1.000000000000000000e+20
+1.000000000000000000e+21
+1.000000000000000000e+22
+1.000000000000000084e+23
+9.999999999999999832e+23
+1.000000000000000091e+25
+1.000000000000000048e+26
+1.000000000000000013e+27
+9.999999999999999583e+27
+9.999999999999999143e+28
+1.000000000000000020e+30
+9.999999999999999636e+30
diff --git a/dG3D/benchmarks/nonLinearTVP_allExtraBranches_cube/cubeTVP.py b/dG3D/benchmarks/nonLinearTVP_allExtraBranches_cube/cubeTVP.py
index caf8ca522facba0151c80366d46a80b4b754d112..4dd43edd0d721ba0766191d0b4a42b1c0fa9e7f0 100644
--- a/dG3D/benchmarks/nonLinearTVP_allExtraBranches_cube/cubeTVP.py
+++ b/dG3D/benchmarks/nonLinearTVP_allExtraBranches_cube/cubeTVP.py
@@ -9,7 +9,8 @@ import numpy as np
 import os
 
 # Load the csv data for relaxation spectrum
-with open('relaxationSpectrum_Einf_N27_05_12_23_Tref20.csv', newline='') as csvfile:
+# with open('relaxationSpectrum_Einf_N27_05_12_23_Tref20.csv', newline='') as csvfile:
+with open('../TPU_relaxationSpectrum_Et_N64_28_03_24_Trefm30.txt', newline='') as csvfile:
     reader = csv.reader(csvfile, delimiter=';')
     relSpec = np.zeros((1,))
     i = 0
@@ -35,12 +36,13 @@ Cp = rho*1900e+6 # 1900 J/kg/K -> 1900e+6 Nmm/tonne/K
 KThCon = 0.14  # 0.14 W/m/K -> 0.14 Nmm/s/mm/K
 Alpha = 0.6e-6 # 1/K
 
-Tinitial = 273.15 - 10 # K
-C1 = 112.94742152
-C2 = 176.44294359
+Tinitial = 273.15 + 23 # - 10 # K
+C1 = 524.39721767 # 112.94742152
+C2 = 699.76815543 # 176.44294359
 
 # Temp Settings
-Tref = 273.15+20.
+Tref = 273.15-30.
+# Tref = 273.15+20.
 
 # Default tempfuncs
 Alpha_G = 0.2e-6
@@ -61,13 +63,22 @@ a = -0.9/(90.)
 x0 = 273.15-20
 linear_tempfunc = linearScalarFunction(x0,0.9,a)
 
+"""
 sy0c = 20./0.78 #MPa
 hc = 10.
 sy0t = sy0c*0.78
 ht = 10.
-
 hardenc = LinearExponentialJ2IsotropicHardening(1, sy0c, hc, 2., 10.)
 hardent = LinearExponentialJ2IsotropicHardening(2, sy0t, ht, 2., 10.)
+"""
+m = 1.0
+sy0c = 3.5/m #MPa
+hc = 0.
+sy0t = sy0c*m
+ht = 0.
+hardenc = LinearExponentialJ2IsotropicHardening(1, sy0c, hc, 5., 20.)
+hardent = LinearExponentialJ2IsotropicHardening(2, sy0t, ht, 5., 20.)
+
 # hardenc.setTemperatureFunction_h1(negExp_tempfunc)
 # hardenc.setTemperatureFunction_h2(negExp_tempfunc)
 # hardenc.setTemperatureFunction_hexp(ShiftFactor_tempfunc)
@@ -75,33 +86,47 @@ hardent = LinearExponentialJ2IsotropicHardening(2, sy0t, ht, 2., 10.)
 # hardent.setTemperatureFunction_h2(negExp_tempfunc)
 # hardent.setTemperatureFunction_hexp(ShiftFactor_tempfunc)
 
+hardenk = PolynomialKinematicHardening(3,3) # 1 -> PP
+hardenk.setCoefficients(1,0.5) # 300.)
+hardenk.setCoefficients(2,1.) # 200.)
+hardenk.setCoefficients(3,2.5)
+
 law1 = NonLinearTVENonLinearTVPDG3DMaterialLaw(lawnum,rho,E,nu,1e-6,Tinitial,Alpha,KThCon,Cp,False,1e-8)
 
 law1.setCompressionHardening(hardenc)
 law1.setTractionHardening(hardent)
+law1.setTractionHardening(hardenk)
 
-law1.setYieldPowerFactor(3.5)
+law1.setYieldPowerFactor(3) # 3.5)
 law1.setNonAssociatedFlow(True)
-law1.nonAssociatedFlowRuleFactor(0.5)
+law1.nonAssociatedFlowRuleFactor(0.64) # 0.5
 
 law1.setStrainOrder(11)
 law1.setViscoelasticMethod(0)
 law1.setShiftFactorConstantsWLF(C1,C2)
 law1.setReferenceTemperature(Tref)
 
-law1.setExtraBranchNLType(3)
+law1.setExtraBranchNLType(5) # 3
 law1.useExtraBranchBool(True)
-law1.useExtraBranchBool_TVE(True,2)
-law1.setVolumeCorrection(1.48385807e-02, 4.86512658e+00, 2.03662889e-04, 5.47347064e-02, 6.57278720e+00, 2.77066402e-03)
+law1.useExtraBranchBool_TVE(True,5) # 5
+# law1.setVolumeCorrection(1.48385807e-02, 4.86512658e+00, 2.03662889e-04, 5.47347064e-02, 6.57278720e+00, 2.77066402e-03)
+law1.setVolumeCorrection(1., 2000., 1.686, 1., 200., 1.686) # at 23°C -> TPU
+law1.setAdditionalVolumeCorrections(0.22,0.,0.,0.22,0.,0.)
+law1.setExtraBranch_CompressionParameter(1.,0.,0.) # 1.5
+law1.setTensionCompressionRegularisation(1000.)
+
 law1.setViscoElasticNumberOfElement(N)
 if N > 0:
     for i in range(1, N+1):
         law1.setViscoElasticData(i, relSpec[i], relSpec[i+N])
+        law1.setCorrectionsAllBranchesTVE(i, 2000., 1.686, 200., 1.686) # at 23°C -> TPU
+        law1.setAdditionalCorrectionsAllBranchesTVE(i,0.22,0.,0.,0.22,0.,0.)
+        law1.setCompressionCorrectionsAllBranchesTVE(i, 1.) # 1.5)
 law1.setTemperatureFunction_ThermalDilationCoefficient(Alpha_tempfunc)
 law1.setTemperatureFunction_ThermalConductivity(KThCon_tempfunc)
 
-eta = constantViscosityLaw(1,3e4) #(1,3e4)
-law1.setViscosityEffect(eta,0.21)
+eta = constantViscosityLaw(1,1000.) #(1,3e4)
+law1.setViscosityEffect(eta,0.1)
 # eta.setTemperatureFunction(negExp_tempfunc)
 law1.setIsotropicHardeningCoefficients(1.,1.,1.)
 
@@ -109,8 +134,8 @@ law1.setIsotropicHardeningCoefficients(1.,1.,1.)
 # solver
 sol = 2  # Gmm=0 (default) Taucs=1 PETsc=2
 soltype = 1 # StaticLinear=0 (default) StaticNonLinear=1
-nstep = 100   # number of step (used only if soltype=1)
-ftime = 4.   # Final time (used only if soltype=1)
+nstep = 1000 # 100   # number of step (used only if soltype=1)
+ftime = 0.65/2.78e-3 # 4.   # Final time (used only if soltype=1)
 tol=1.e-5  # relative tolerance for NR scheme (used only if soltype=1)
 nstepArch=1 # Number of step between 2 archiving (used only if soltype=1)
 fullDg = 0 #O = CG, 1 = DG
@@ -146,7 +171,7 @@ mysolver.stepBetweenArchiving(nstepArch)
 
 # BCs
 length = 1.e-3
-umax = 0.04*length
+umax = -0.65*length # 0.04*length
 fu_L = LinearFunctionTime(0,0,ftime,umax);    # Linear Displacement with time
 
 mysolver.displacementBC("Face",30,0,0.)		        # face x = 0   - Left Face fixed
@@ -192,4 +217,5 @@ mysolver.solve()
 
 # Check
 check = TestCheck()
-check.equal(-2.917493481719865e-05,mysolver.getArchivedForceOnPhysicalGroup("Face", 30, 0),1.e-4)
+# check.equal(-2.917493481719865e-05,mysolver.getArchivedForceOnPhysicalGroup("Face", 30, 0),1.e-4)
+check.equal(-2.911073148114768e-05,mysolver.getArchivedForceOnPhysicalGroup("Face", 30, 0),1.e-4)
diff --git a/dG3D/benchmarks/powerYieldViscoElastoPlastic/cylinder.msh b/dG3D/benchmarks/powerYieldViscoElastoPlastic/cylinder.msh
index 0f52bfc5a294857b8f304b1da6e258fb7505d374..915802d5a64acb84a2dad6e7d15e69c98b26c778 100644
--- a/dG3D/benchmarks/powerYieldViscoElastoPlastic/cylinder.msh
+++ b/dG3D/benchmarks/powerYieldViscoElastoPlastic/cylinder.msh
@@ -1,698 +1,762 @@
 $MeshFormat
-2.2 0 8
+3 0 8
 $EndMeshFormat
+$Entities
+6 9 5 1
+1 0 
+2 0 
+3 0 
+4 0 
+5 1 5 
+6 0 
+1 2 3 2 0 
+2 2 3 1 0 
+3 2 1 2 0 
+7 2 4 6 0 
+8 2 6 5 0 
+9 2 5 4 0 
+11 2 3 4 0 
+12 2 2 6 0 
+16 2 1 5 0 
+5 3 1 -3 -2 1 1 
+13 4 1 12 -7 -11 0 
+17 4 -3 16 -8 -12 1 3 
+21 4 -2 11 -9 -16 1 4 
+22 3 7 8 9 1 2 
+1 5 -5 22 13 -17 -21 1 11 
+$EndEntities
 $Nodes
-132
-1 0 0 0
-2 6 0 0
-3 0 6 0
-4 0 6 6
-5 0 0 6
-6 6 0 6
-7 1.552914270611066 5.795554957735497 0
-8 2.999999999993018 5.196152422710663 0
-9 4.242640687111061 4.242640687127508 0
-10 5.196152422702976 3.000000000006332 0
-11 5.795554957733712 1.552914270617726 0
-12 0 4.500000000005166 0
-13 0 3.000000000008336 0
-14 0 1.500000000004214 0
-15 1.499999999993832 0 0
-16 2.999999999988567 0 0
-17 4.499999999994237 0 0
-18 1.552914270611066 5.795554957735497 6
-19 2.999999999993018 5.196152422710663 6
-20 4.242640687111061 4.242640687127508 6
-21 5.196152422702976 3.000000000006332 6
-22 5.795554957733712 1.552914270617726 6
-23 4.499999999994237 0 6
-24 2.999999999988567 0 6
-25 1.499999999993832 0 6
-26 0 1.500000000004214 6
-27 0 3.000000000008336 6
-28 0 4.500000000005166 6
-29 0 6 1.2
-30 0 6 2.4
-31 0 6 3.6
-32 0 6 4.800000000000001
-33 6 0 1.2
-34 6 0 2.4
-35 6 0 3.6
-36 6 0 4.800000000000001
-37 0 0 1.2
-38 0 0 2.4
-39 0 0 3.6
-40 0 0 4.800000000000001
-41 2.527448697695314 2.575668272009054 0
-42 1.627841394027458 3.980250003805291 0
-43 3.914833052601809 1.621430334871464 0
-44 1.441200958338174 1.441200958338581 0
-45 3.760905731444732 3.080330269885938 0
-46 2.682328465952599 1.220004215439306 0
-47 1.220004215434672 2.682328465952725 0
-48 3.000820586356653 3.856980823767017 0
-49 1.552914270611066 5.795554957735497 1.2
-50 1.552914270611066 5.795554957735497 2.4
-51 1.552914270611066 5.795554957735497 3.6
-52 1.552914270611066 5.795554957735497 4.800000000000001
-53 2.999999999993018 5.196152422710663 1.2
-54 2.999999999993018 5.196152422710663 2.4
-55 2.999999999993018 5.196152422710663 3.6
-56 2.999999999993018 5.196152422710663 4.800000000000001
-57 4.242640687111061 4.242640687127508 1.2
-58 4.242640687111061 4.242640687127508 2.4
-59 4.242640687111061 4.242640687127508 3.6
-60 4.242640687111061 4.242640687127508 4.800000000000001
-61 5.196152422702976 3.000000000006332 1.2
-62 5.196152422702976 3.000000000006332 2.4
-63 5.196152422702976 3.000000000006332 3.6
-64 5.196152422702976 3.000000000006332 4.800000000000001
-65 5.795554957733712 1.552914270617726 1.2
-66 5.795554957733712 1.552914270617726 2.4
-67 5.795554957733712 1.552914270617726 3.6
-68 5.795554957733712 1.552914270617726 4.800000000000001
-69 1.499999999993832 0 1.2
-70 1.499999999993832 0 2.4
-71 1.499999999993832 0 3.6
-72 1.499999999993832 0 4.800000000000001
-73 2.999999999988567 0 1.2
-74 2.999999999988567 0 2.4
-75 2.999999999988567 0 3.6
-76 2.999999999988567 0 4.800000000000001
-77 4.499999999994237 0 1.2
-78 4.499999999994237 0 2.4
-79 4.499999999994237 0 3.6
-80 4.499999999994237 0 4.800000000000001
-81 0 4.500000000005166 1.2
-82 0 4.500000000005166 2.4
-83 0 4.500000000005166 3.6
-84 0 4.500000000005166 4.800000000000001
-85 0 3.000000000008336 1.2
-86 0 3.000000000008336 2.4
-87 0 3.000000000008336 3.6
-88 0 3.000000000008336 4.800000000000001
-89 0 1.500000000004214 1.2
-90 0 1.500000000004214 2.4
-91 0 1.500000000004214 3.6
-92 0 1.500000000004214 4.800000000000001
-93 2.527448697695314 2.575668272009054 6
-94 1.627841394027458 3.980250003805291 6
-95 3.914833052601809 1.621430334871464 6
-96 1.441200958338174 1.441200958338581 6
-97 3.760905731444732 3.080330269885938 6
-98 2.682328465952599 1.220004215439306 6
-99 1.220004215434672 2.682328465952725 6
-100 3.000820586356653 3.856980823767017 6
-101 2.527448697695314 2.575668272009054 1.2
-102 2.527448697695314 2.575668272009054 2.4
-103 2.527448697695314 2.575668272009054 3.6
-104 2.527448697695314 2.575668272009054 4.800000000000001
-105 1.627841394027458 3.980250003805291 1.2
-106 1.627841394027458 3.980250003805291 2.4
-107 1.627841394027458 3.980250003805291 3.6
-108 1.627841394027458 3.980250003805291 4.800000000000001
-109 3.914833052601809 1.621430334871464 1.2
-110 3.914833052601809 1.621430334871464 2.4
-111 3.914833052601809 1.621430334871464 3.6
-112 3.914833052601809 1.621430334871464 4.800000000000001
-113 1.441200958338174 1.441200958338581 1.2
-114 1.441200958338174 1.441200958338581 2.4
-115 1.441200958338174 1.441200958338581 3.6
-116 1.441200958338174 1.441200958338581 4.800000000000001
-117 3.760905731444732 3.080330269885938 1.2
-118 3.760905731444732 3.080330269885938 2.4
-119 3.760905731444732 3.080330269885938 3.6
-120 3.760905731444732 3.080330269885938 4.800000000000001
-121 2.682328465952599 1.220004215439306 1.2
-122 2.682328465952599 1.220004215439306 2.4
-123 2.682328465952599 1.220004215439306 3.6
-124 2.682328465952599 1.220004215439306 4.800000000000001
-125 1.220004215434672 2.682328465952725 1.2
-126 1.220004215434672 2.682328465952725 2.4
-127 1.220004215434672 2.682328465952725 3.6
-128 1.220004215434672 2.682328465952725 4.800000000000001
-129 3.000820586356653 3.856980823767017 1.2
-130 3.000820586356653 3.856980823767017 2.4
-131 3.000820586356653 3.856980823767017 3.6
-132 3.000820586356653 3.856980823767017 4.800000000000001
+138
+1 0 0 0 0
+2 6 0 0 0
+3 0 6 0 0
+4 0 6 6 0
+5 0 0 6 0
+6 6 0 6 0
+7 1.552914274817992 5.795554956608255 0 0
+8 3.000000007764873 5.19615241822358 0 0
+9 4.24264069709897 4.242640677139599 0 0
+10 5.196152427581315 2.999999991556801 0 0
+11 5.795554958944408 1.552914266099346 0 0
+12 0 4.500000000005166 0 0
+13 0 3.000000000008336 0 0
+14 0 1.500000000004214 0 0
+15 1.499999999993832 0 0 0
+16 2.999999999988567 0 0 0
+17 4.499999999994237 0 0 0
+18 1.552914274817992 5.795554956608255 6 0
+19 3.000000007764873 5.19615241822358 6 0
+20 4.24264069709897 4.242640677139599 6 0
+21 5.196152427581315 2.999999991556801 6 0
+22 5.795554958944408 1.552914266099346 6 0
+23 4.499999999994237 0 6 0
+24 2.999999999988567 0 6 0
+25 1.499999999993832 0 6 0
+26 0 1.500000000004214 6 0
+27 0 3.000000000008336 6 0
+28 0 4.500000000005166 6 0
+29 0 6 1.2 0
+30 0 6 2.4 0
+31 0 6 3.6 0
+32 0 6 4.800000000000001 0
+33 6 0 1.2 0
+34 6 0 2.4 0
+35 6 0 3.6 0
+36 6 0 4.800000000000001 0
+37 0 0 1.2 0
+38 0 0 2.4 0
+39 0 0 3.6 0
+40 0 0 4.800000000000001 0
+41 1.2751455569532 2.281385761327586 0 0
+42 3.662835601102697 2.682832773324031 0 0
+43 1.627029380077184 4.128240815140635 0 0
+44 3.638826376124202 1.177882403829226 0 0
+45 2.350310484823683 1.407389902703416 0 0
+46 2.352198961932545 3.033848287512865 0 0
+47 1.098076211355039 1.098076211357821 0 0
+48 3.002832333019222 3.89702302606582 0 0
+49 4.558673872749371 1.682725886961881 0 0
+50 1.552914274817992 5.795554956608255 1.2 0
+51 1.552914274817992 5.795554956608255 2.4 0
+52 1.552914274817992 5.795554956608255 3.6 0
+53 1.552914274817992 5.795554956608255 4.800000000000001 0
+54 3.000000007764873 5.19615241822358 1.2 0
+55 3.000000007764873 5.19615241822358 2.4 0
+56 3.000000007764873 5.19615241822358 3.6 0
+57 3.000000007764873 5.19615241822358 4.800000000000001 0
+58 4.24264069709897 4.242640677139599 1.2 0
+59 4.24264069709897 4.242640677139599 2.4 0
+60 4.24264069709897 4.242640677139599 3.6 0
+61 4.24264069709897 4.242640677139599 4.800000000000001 0
+62 5.196152427581315 2.999999991556801 1.2 0
+63 5.196152427581315 2.999999991556801 2.4 0
+64 5.196152427581315 2.999999991556801 3.6 0
+65 5.196152427581315 2.999999991556801 4.800000000000001 0
+66 5.795554958944408 1.552914266099346 1.2 0
+67 5.795554958944408 1.552914266099346 2.4 0
+68 5.795554958944408 1.552914266099346 3.6 0
+69 5.795554958944408 1.552914266099346 4.800000000000001 0
+70 1.499999999993832 0 1.2 0
+71 1.499999999993832 0 2.4 0
+72 1.499999999993832 0 3.6 0
+73 1.499999999993832 0 4.800000000000001 0
+74 2.999999999988567 0 1.2 0
+75 2.999999999988567 0 2.4 0
+76 2.999999999988567 0 3.6 0
+77 2.999999999988567 0 4.800000000000001 0
+78 4.499999999994237 0 1.2 0
+79 4.499999999994237 0 2.4 0
+80 4.499999999994237 0 3.6 0
+81 4.499999999994237 0 4.800000000000001 0
+82 0 4.500000000005166 1.2 0
+83 0 4.500000000005166 2.4 0
+84 0 4.500000000005166 3.6 0
+85 0 4.500000000005166 4.800000000000001 0
+86 0 3.000000000008336 1.2 0
+87 0 3.000000000008336 2.4 0
+88 0 3.000000000008336 3.6 0
+89 0 3.000000000008336 4.800000000000001 0
+90 0 1.500000000004214 1.2 0
+91 0 1.500000000004214 2.4 0
+92 0 1.500000000004214 3.6 0
+93 0 1.500000000004214 4.800000000000001 0
+94 1.2751455569532 2.281385761327586 6 0
+95 3.662835601102697 2.682832773324031 6 0
+96 1.627029380077184 4.128240815140635 6 0
+97 3.638826376124202 1.177882403829226 6 0
+98 2.350310484823683 1.407389902703416 6 0
+99 2.352198961932545 3.033848287512865 6 0
+100 1.098076211355039 1.098076211357821 6 0
+101 3.002832333019222 3.89702302606582 6 0
+102 4.558673872749371 1.682725886961881 6 0
+103 1.2751455569532 2.281385761327586 1.2 0
+104 1.2751455569532 2.281385761327586 2.4 0
+105 1.2751455569532 2.281385761327586 3.6 0
+106 1.2751455569532 2.281385761327586 4.800000000000001 0
+107 3.662835601102697 2.682832773324031 1.2 0
+108 3.662835601102697 2.682832773324031 2.4 0
+109 3.662835601102697 2.682832773324031 3.6 0
+110 3.662835601102697 2.682832773324031 4.800000000000001 0
+111 1.627029380077184 4.128240815140635 1.2 0
+112 1.627029380077184 4.128240815140635 2.4 0
+113 1.627029380077184 4.128240815140635 3.6 0
+114 1.627029380077184 4.128240815140635 4.800000000000001 0
+115 3.638826376124202 1.177882403829226 1.2 0
+116 3.638826376124202 1.177882403829226 2.4 0
+117 3.638826376124202 1.177882403829226 3.6 0
+118 3.638826376124202 1.177882403829226 4.800000000000001 0
+119 2.350310484823683 1.407389902703416 1.2 0
+120 2.350310484823683 1.407389902703416 2.4 0
+121 2.350310484823683 1.407389902703416 3.6 0
+122 2.350310484823683 1.407389902703416 4.800000000000001 0
+123 2.352198961932545 3.033848287512865 1.2 0
+124 2.352198961932545 3.033848287512865 2.4 0
+125 2.352198961932545 3.033848287512865 3.6 0
+126 2.352198961932545 3.033848287512865 4.800000000000001 0
+127 1.098076211355039 1.098076211357821 1.2 0
+128 1.098076211355039 1.098076211357821 2.4 0
+129 1.098076211355039 1.098076211357821 3.6 0
+130 1.098076211355039 1.098076211357821 4.800000000000001 0
+131 3.002832333019222 3.89702302606582 1.2 0
+132 3.002832333019222 3.89702302606582 2.4 0
+133 3.002832333019222 3.89702302606582 3.6 0
+134 3.002832333019222 3.89702302606582 4.800000000000001 0
+135 4.558673872749371 1.682725886961881 1.2 0
+136 4.558673872749371 1.682725886961881 2.4 0
+137 4.558673872749371 1.682725886961881 3.6 0
+138 4.558673872749371 1.682725886961881 4.800000000000001 0
 $EndNodes
 $Elements
-557
-1 15 2 5 5 5
-2 2 2 1 5 7 42 12
-3 2 2 1 5 11 17 43
-4 2 2 1 5 16 43 17
-5 2 2 1 5 12 42 13
-6 2 2 1 5 1 44 15
-7 2 2 1 5 1 14 44
-8 2 2 1 5 3 7 12
-9 2 2 1 5 11 2 17
-10 2 2 1 5 16 46 43
-11 2 2 1 5 13 42 47
-12 2 2 1 5 7 8 42
-13 2 2 1 5 10 11 43
-14 2 2 1 5 41 42 48
-15 2 2 1 5 10 43 45
-16 2 2 1 5 15 46 16
-17 2 2 1 5 13 47 14
-18 2 2 1 5 41 47 42
-19 2 2 1 5 41 43 46
-20 2 2 1 5 41 45 43
-21 2 2 1 5 15 44 46
-22 2 2 1 5 14 47 44
-23 2 2 1 5 8 48 42
-24 2 2 1 5 9 10 45
-25 2 2 1 5 41 48 45
-26 2 2 1 5 8 9 48
-27 2 2 1 5 41 46 44
-28 2 2 1 5 41 44 47
-29 2 2 1 5 9 45 48
-30 2 2 3 17 37 69 1
-31 2 2 3 17 1 69 15
-32 2 2 3 17 38 70 37
-33 2 2 3 17 37 70 69
-34 2 2 3 17 39 71 38
-35 2 2 3 17 38 71 70
-36 2 2 3 17 40 72 39
-37 2 2 3 17 39 72 71
-38 2 2 3 17 5 25 40
-39 2 2 3 17 40 25 72
-40 2 2 3 17 69 73 15
-41 2 2 3 17 15 73 16
-42 2 2 3 17 70 74 69
-43 2 2 3 17 69 74 73
-44 2 2 3 17 71 75 70
-45 2 2 3 17 70 75 74
-46 2 2 3 17 72 76 71
-47 2 2 3 17 71 76 75
-48 2 2 3 17 25 24 72
-49 2 2 3 17 72 24 76
-50 2 2 3 17 73 77 16
-51 2 2 3 17 16 77 17
-52 2 2 3 17 74 78 73
-53 2 2 3 17 73 78 77
-54 2 2 3 17 75 79 74
-55 2 2 3 17 74 79 78
-56 2 2 3 17 76 80 75
-57 2 2 3 17 75 80 79
-58 2 2 3 17 24 23 76
-59 2 2 3 17 76 23 80
-60 2 2 3 17 77 2 17
-61 2 2 3 17 77 33 2
-62 2 2 3 17 78 33 77
-63 2 2 3 17 78 34 33
-64 2 2 3 17 79 34 78
-65 2 2 3 17 79 35 34
-66 2 2 3 17 80 35 79
-67 2 2 3 17 80 36 35
-68 2 2 3 17 23 36 80
-69 2 2 3 17 23 6 36
-70 2 2 4 21 29 81 3
-71 2 2 4 21 3 81 12
-72 2 2 4 21 30 82 29
-73 2 2 4 21 29 82 81
-74 2 2 4 21 31 83 30
-75 2 2 4 21 30 83 82
-76 2 2 4 21 32 84 31
-77 2 2 4 21 31 84 83
-78 2 2 4 21 4 28 32
-79 2 2 4 21 32 28 84
-80 2 2 4 21 81 85 12
-81 2 2 4 21 12 85 13
-82 2 2 4 21 82 86 81
-83 2 2 4 21 81 86 85
-84 2 2 4 21 83 86 82
-85 2 2 4 21 83 87 86
-86 2 2 4 21 84 88 83
-87 2 2 4 21 83 88 87
-88 2 2 4 21 28 27 84
-89 2 2 4 21 84 27 88
-90 2 2 4 21 85 89 13
-91 2 2 4 21 13 89 14
-92 2 2 4 21 86 90 85
-93 2 2 4 21 85 90 89
-94 2 2 4 21 87 91 86
-95 2 2 4 21 86 91 90
-96 2 2 4 21 88 92 87
-97 2 2 4 21 87 92 91
-98 2 2 4 21 27 26 88
-99 2 2 4 21 88 26 92
-100 2 2 4 21 89 1 14
-101 2 2 4 21 89 37 1
-102 2 2 4 21 90 37 89
-103 2 2 4 21 90 38 37
-104 2 2 4 21 91 38 90
-105 2 2 4 21 91 39 38
-106 2 2 4 21 92 39 91
-107 2 2 4 21 92 40 39
-108 2 2 4 21 26 40 92
-109 2 2 4 21 26 5 40
-110 2 2 2 22 18 94 28
-111 2 2 2 22 22 23 95
-112 2 2 2 22 24 95 23
-113 2 2 2 22 28 94 27
-114 2 2 2 22 5 96 25
-115 2 2 2 22 5 26 96
-116 2 2 2 22 4 18 28
-117 2 2 2 22 22 6 23
-118 2 2 2 22 24 98 95
-119 2 2 2 22 27 94 99
-120 2 2 2 22 18 19 94
-121 2 2 2 22 21 22 95
-122 2 2 2 22 93 94 100
-123 2 2 2 22 21 95 97
-124 2 2 2 22 25 98 24
-125 2 2 2 22 27 99 26
-126 2 2 2 22 93 99 94
-127 2 2 2 22 93 95 98
-128 2 2 2 22 93 97 95
-129 2 2 2 22 25 96 98
-130 2 2 2 22 26 99 96
-131 2 2 2 22 19 100 94
-132 2 2 2 22 20 21 97
-133 2 2 2 22 93 100 97
-134 2 2 2 22 19 20 100
-135 2 2 2 22 93 98 96
-136 2 2 2 22 93 96 99
-137 2 2 2 22 20 97 100
-138 4 2 11 1 7 12 42 105
-139 4 2 11 1 81 49 105 12
-140 4 2 11 1 12 49 105 7
-141 4 2 11 1 49 81 105 106
-142 4 2 11 1 82 50 106 49
-143 4 2 11 1 81 49 82 106
-144 4 2 11 1 50 82 106 83
-145 4 2 11 1 83 51 107 50
-146 4 2 11 1 106 50 83 107
-147 4 2 11 1 51 83 107 84
-148 4 2 11 1 84 52 108 51
-149 4 2 11 1 107 51 84 108
-150 4 2 11 1 52 84 108 28
-151 4 2 11 1 28 18 94 52
-152 4 2 11 1 108 52 28 94
-153 4 2 11 1 11 43 17 109
-154 4 2 11 1 109 65 77 11
-155 4 2 11 1 17 11 109 77
-156 4 2 11 1 65 109 77 78
-157 4 2 11 1 110 66 78 65
-158 4 2 11 1 109 65 110 78
-159 4 2 11 1 66 110 78 79
-160 4 2 11 1 111 67 79 66
-161 4 2 11 1 110 66 111 79
-162 4 2 11 1 67 111 79 80
-163 4 2 11 1 112 68 80 67
-164 4 2 11 1 111 67 112 80
-165 4 2 11 1 68 112 80 23
-166 4 2 11 1 95 22 23 68
-167 4 2 11 1 112 68 95 23
-168 4 2 11 1 16 17 43 109
-169 4 2 11 1 77 73 109 16
-170 4 2 11 1 17 16 77 109
-171 4 2 11 1 73 77 109 78
-172 4 2 11 1 78 74 110 73
-173 4 2 11 1 109 73 78 110
-174 4 2 11 1 74 78 110 79
-175 4 2 11 1 79 75 111 74
-176 4 2 11 1 110 74 79 111
-177 4 2 11 1 75 79 111 80
-178 4 2 11 1 80 76 112 75
-179 4 2 11 1 111 75 80 112
-180 4 2 11 1 76 80 112 23
-181 4 2 11 1 23 24 95 76
-182 4 2 11 1 112 76 23 95
-183 4 2 11 1 12 13 42 105
-184 4 2 11 1 85 81 105 12
-185 4 2 11 1 13 12 85 105
-186 4 2 11 1 81 85 105 106
-187 4 2 11 1 86 82 106 81
-188 4 2 11 1 85 81 86 106
-189 4 2 11 1 82 86 106 83
-190 4 2 11 1 87 83 107 106
-191 4 2 11 1 86 83 87 106
-192 4 2 11 1 83 87 107 88
-193 4 2 11 1 88 84 108 107
-194 4 2 11 1 83 84 88 107
-195 4 2 11 1 84 88 108 27
-196 4 2 11 1 27 28 94 108
-197 4 2 11 1 84 28 27 108
-198 4 2 11 1 1 15 44 113
-199 4 2 11 1 69 37 113 1
-200 4 2 11 1 15 1 69 113
-201 4 2 11 1 37 69 113 114
-202 4 2 11 1 70 38 114 37
-203 4 2 11 1 69 37 70 114
-204 4 2 11 1 38 70 114 115
-205 4 2 11 1 71 39 115 38
-206 4 2 11 1 70 38 71 115
-207 4 2 11 1 39 71 115 116
-208 4 2 11 1 72 40 116 39
-209 4 2 11 1 71 39 72 116
-210 4 2 11 1 40 72 116 96
-211 4 2 11 1 25 5 96 40
-212 4 2 11 1 72 40 25 96
-213 4 2 11 1 1 44 14 113
-214 4 2 11 1 113 37 89 1
-215 4 2 11 1 14 1 113 89
-216 4 2 11 1 37 113 89 90
-217 4 2 11 1 114 38 90 37
-218 4 2 11 1 113 37 114 90
-219 4 2 11 1 38 114 90 91
-220 4 2 11 1 115 39 91 38
-221 4 2 11 1 114 38 115 91
-222 4 2 11 1 39 115 91 92
-223 4 2 11 1 116 40 92 39
-224 4 2 11 1 115 39 116 92
-225 4 2 11 1 40 116 92 26
-226 4 2 11 1 96 5 26 40
-227 4 2 11 1 116 40 96 26
-228 4 2 11 1 3 12 7 49
-229 4 2 11 1 81 29 49 3
-230 4 2 11 1 12 3 81 49
-231 4 2 11 1 29 81 49 82
-232 4 2 11 1 82 30 50 29
-233 4 2 11 1 49 29 82 50
-234 4 2 11 1 30 82 50 83
-235 4 2 11 1 83 31 51 30
-236 4 2 11 1 50 30 83 51
-237 4 2 11 1 31 83 51 84
-238 4 2 11 1 84 32 52 31
-239 4 2 11 1 51 31 84 52
-240 4 2 11 1 32 84 52 28
-241 4 2 11 1 28 4 18 32
-242 4 2 11 1 52 32 28 18
-243 4 2 11 1 11 17 2 77
-244 4 2 11 1 77 65 33 2
-245 4 2 11 1 11 65 77 2
-246 4 2 11 1 65 77 33 78
-247 4 2 11 1 78 66 34 33
-248 4 2 11 1 65 66 78 33
-249 4 2 11 1 66 78 34 79
-250 4 2 11 1 79 67 35 66
-251 4 2 11 1 34 66 79 35
-252 4 2 11 1 67 79 35 80
-253 4 2 11 1 80 68 36 35
-254 4 2 11 1 67 68 80 35
-255 4 2 11 1 68 80 36 23
-256 4 2 11 1 23 22 6 36
-257 4 2 11 1 68 22 23 36
-258 4 2 11 1 16 43 46 121
-259 4 2 11 1 109 73 121 16
-260 4 2 11 1 43 16 109 121
-261 4 2 11 1 73 109 121 122
-262 4 2 11 1 110 74 122 73
-263 4 2 11 1 109 73 110 122
-264 4 2 11 1 74 110 122 123
-265 4 2 11 1 111 75 123 74
-266 4 2 11 1 110 74 111 123
-267 4 2 11 1 75 111 123 124
-268 4 2 11 1 112 76 124 75
-269 4 2 11 1 111 75 112 124
-270 4 2 11 1 76 112 124 98
-271 4 2 11 1 95 24 98 76
-272 4 2 11 1 112 76 95 98
-273 4 2 11 1 13 47 42 105
-274 4 2 11 1 125 85 105 13
-275 4 2 11 1 47 13 125 105
-276 4 2 11 1 85 125 105 106
-277 4 2 11 1 126 86 106 125
-278 4 2 11 1 125 86 106 85
-279 4 2 11 1 86 126 106 87
-280 4 2 11 1 127 87 107 126
-281 4 2 11 1 126 87 107 106
-282 4 2 11 1 87 127 107 128
-283 4 2 11 1 128 88 108 107
-284 4 2 11 1 87 88 128 107
-285 4 2 11 1 88 128 108 99
-286 4 2 11 1 99 27 94 108
-287 4 2 11 1 88 27 99 108
-288 4 2 11 1 7 42 8 105
-289 4 2 11 1 105 49 53 8
-290 4 2 11 1 7 49 105 8
-291 4 2 11 1 49 105 53 106
-292 4 2 11 1 106 50 54 49
-293 4 2 11 1 53 49 106 54
-294 4 2 11 1 50 106 54 107
-295 4 2 11 1 107 51 55 50
-296 4 2 11 1 54 50 107 55
-297 4 2 11 1 51 107 55 108
-298 4 2 11 1 108 52 56 51
-299 4 2 11 1 55 51 108 56
-300 4 2 11 1 52 108 56 94
-301 4 2 11 1 94 18 19 52
-302 4 2 11 1 56 52 94 19
-303 4 2 11 1 10 43 11 109
-304 4 2 11 1 109 61 65 11
-305 4 2 11 1 10 61 109 11
-306 4 2 11 1 61 109 65 110
-307 4 2 11 1 110 62 66 65
-308 4 2 11 1 61 62 110 65
-309 4 2 11 1 62 110 66 111
-310 4 2 11 1 111 63 67 66
-311 4 2 11 1 62 63 111 66
-312 4 2 11 1 63 111 67 112
-313 4 2 11 1 112 64 68 63
-314 4 2 11 1 67 63 112 68
-315 4 2 11 1 64 112 68 95
-316 4 2 11 1 95 21 22 64
-317 4 2 11 1 68 64 95 22
-318 4 2 11 1 41 48 42 105
-319 4 2 11 1 129 101 105 48
-320 4 2 11 1 48 101 105 41
-321 4 2 11 1 101 129 105 102
-322 4 2 11 1 130 102 106 105
-323 4 2 11 1 129 102 130 105
-324 4 2 11 1 102 130 106 103
-325 4 2 11 1 131 103 107 130
-326 4 2 11 1 130 103 107 106
-327 4 2 11 1 103 131 107 104
-328 4 2 11 1 132 104 108 107
-329 4 2 11 1 131 104 132 107
-330 4 2 11 1 104 132 108 93
-331 4 2 11 1 100 93 94 108
-332 4 2 11 1 132 93 100 108
-333 4 2 11 1 10 45 43 117
-334 4 2 11 1 117 61 109 10
-335 4 2 11 1 43 10 117 109
-336 4 2 11 1 61 117 109 118
-337 4 2 11 1 118 62 110 61
-338 4 2 11 1 109 61 118 110
-339 4 2 11 1 62 118 110 119
-340 4 2 11 1 119 63 111 62
-341 4 2 11 1 110 62 119 111
-342 4 2 11 1 63 119 111 120
-343 4 2 11 1 120 64 112 63
-344 4 2 11 1 111 63 120 112
-345 4 2 11 1 64 120 112 97
-346 4 2 11 1 97 21 95 64
-347 4 2 11 1 112 64 97 95
-348 4 2 11 1 15 16 46 121
-349 4 2 11 1 73 69 121 15
-350 4 2 11 1 16 15 73 121
-351 4 2 11 1 69 73 121 122
-352 4 2 11 1 74 70 122 69
-353 4 2 11 1 73 69 74 122
-354 4 2 11 1 70 74 122 123
-355 4 2 11 1 75 71 123 70
-356 4 2 11 1 74 70 75 123
-357 4 2 11 1 71 75 123 124
-358 4 2 11 1 76 72 124 71
-359 4 2 11 1 75 71 76 124
-360 4 2 11 1 72 76 124 98
-361 4 2 11 1 24 25 98 72
-362 4 2 11 1 76 72 24 98
-363 4 2 11 1 13 14 47 125
-364 4 2 11 1 89 85 125 13
-365 4 2 11 1 14 13 89 125
-366 4 2 11 1 85 89 125 90
-367 4 2 11 1 90 86 126 125
-368 4 2 11 1 85 86 90 125
-369 4 2 11 1 86 90 126 91
-370 4 2 11 1 91 87 127 126
-371 4 2 11 1 86 87 91 126
-372 4 2 11 1 87 91 127 128
-373 4 2 11 1 92 88 128 87
-374 4 2 11 1 91 87 92 128
-375 4 2 11 1 88 92 128 99
-376 4 2 11 1 26 27 99 88
-377 4 2 11 1 92 88 26 99
-378 4 2 11 1 41 42 47 105
-379 4 2 11 1 105 101 125 47
-380 4 2 11 1 41 101 105 47
-381 4 2 11 1 101 105 125 102
-382 4 2 11 1 106 102 126 125
-383 4 2 11 1 105 102 106 125
-384 4 2 11 1 102 106 126 103
-385 4 2 11 1 107 103 127 126
-386 4 2 11 1 106 103 107 126
-387 4 2 11 1 103 107 127 128
-388 4 2 11 1 108 104 128 107
-389 4 2 11 1 107 104 128 103
-390 4 2 11 1 104 108 128 99
-391 4 2 11 1 94 93 99 108
-392 4 2 11 1 108 93 99 104
-393 4 2 11 1 41 46 43 101
-394 4 2 11 1 121 101 109 43
-395 4 2 11 1 46 101 121 43
-396 4 2 11 1 101 121 109 122
-397 4 2 11 1 122 102 110 109
-398 4 2 11 1 101 102 122 109
-399 4 2 11 1 102 122 110 103
-400 4 2 11 1 123 103 111 110
-401 4 2 11 1 122 103 123 110
-402 4 2 11 1 103 123 111 124
-403 4 2 11 1 124 104 112 111
-404 4 2 11 1 103 104 124 111
-405 4 2 11 1 104 124 112 93
-406 4 2 11 1 98 93 95 112
-407 4 2 11 1 124 93 98 112
-408 4 2 11 1 41 43 45 101
-409 4 2 11 1 109 101 117 43
-410 4 2 11 1 43 101 117 45
-411 4 2 11 1 101 109 117 102
-412 4 2 11 1 110 102 118 109
-413 4 2 11 1 109 102 118 117
-414 4 2 11 1 102 110 118 103
-415 4 2 11 1 111 103 119 110
-416 4 2 11 1 110 103 119 118
-417 4 2 11 1 103 111 119 120
-418 4 2 11 1 112 104 120 111
-419 4 2 11 1 111 104 120 103
-420 4 2 11 1 104 112 120 93
-421 4 2 11 1 95 93 97 112
-422 4 2 11 1 112 93 97 120
-423 4 2 11 1 15 46 44 113
-424 4 2 11 1 121 69 113 15
-425 4 2 11 1 46 15 121 113
-426 4 2 11 1 69 121 113 122
-427 4 2 11 1 122 70 114 69
-428 4 2 11 1 113 69 122 114
-429 4 2 11 1 70 122 114 123
-430 4 2 11 1 123 71 115 70
-431 4 2 11 1 114 70 123 115
-432 4 2 11 1 71 123 115 124
-433 4 2 11 1 124 72 116 71
-434 4 2 11 1 115 71 124 116
-435 4 2 11 1 72 124 116 98
-436 4 2 11 1 98 25 96 72
-437 4 2 11 1 116 72 98 96
-438 4 2 11 1 14 44 47 113
-439 4 2 11 1 113 89 125 14
-440 4 2 11 1 47 14 113 125
-441 4 2 11 1 89 113 125 90
-442 4 2 11 1 114 90 126 113
-443 4 2 11 1 113 90 126 125
-444 4 2 11 1 90 114 126 91
-445 4 2 11 1 115 91 127 114
-446 4 2 11 1 114 91 127 126
-447 4 2 11 1 91 115 127 128
-448 4 2 11 1 116 92 128 115
-449 4 2 11 1 115 92 128 91
-450 4 2 11 1 92 116 128 99
-451 4 2 11 1 96 26 99 116
-452 4 2 11 1 116 26 99 92
-453 4 2 11 1 8 42 48 105
-454 4 2 11 1 105 53 129 8
-455 4 2 11 1 48 8 105 129
-456 4 2 11 1 53 105 129 130
-457 4 2 11 1 106 54 130 53
-458 4 2 11 1 105 53 106 130
-459 4 2 11 1 54 106 130 107
-460 4 2 11 1 107 55 131 54
-461 4 2 11 1 130 54 107 131
-462 4 2 11 1 55 107 131 132
-463 4 2 11 1 108 56 132 55
-464 4 2 11 1 107 55 108 132
-465 4 2 11 1 56 108 132 100
-466 4 2 11 1 94 19 100 56
-467 4 2 11 1 108 56 94 100
-468 4 2 11 1 9 45 10 117
-469 4 2 11 1 117 57 61 9
-470 4 2 11 1 10 9 117 61
-471 4 2 11 1 57 117 61 118
-472 4 2 11 1 118 58 62 57
-473 4 2 11 1 61 57 118 62
-474 4 2 11 1 58 118 62 119
-475 4 2 11 1 119 59 63 58
-476 4 2 11 1 62 58 119 63
-477 4 2 11 1 59 119 63 120
-478 4 2 11 1 120 60 64 63
-479 4 2 11 1 59 60 120 63
-480 4 2 11 1 60 120 64 97
-481 4 2 11 1 97 20 21 64
-482 4 2 11 1 60 20 97 64
-483 4 2 11 1 41 45 48 101
-484 4 2 11 1 117 101 129 48
-485 4 2 11 1 45 101 117 48
-486 4 2 11 1 101 117 129 102
-487 4 2 11 1 118 102 130 117
-488 4 2 11 1 117 102 130 129
-489 4 2 11 1 102 118 130 103
-490 4 2 11 1 119 103 131 130
-491 4 2 11 1 118 103 119 130
-492 4 2 11 1 103 119 131 120
-493 4 2 11 1 120 104 132 131
-494 4 2 11 1 103 104 120 131
-495 4 2 11 1 104 120 132 93
-496 4 2 11 1 97 93 100 120
-497 4 2 11 1 120 93 100 132
-498 4 2 11 1 8 48 9 129
-499 4 2 11 1 129 53 57 8
-500 4 2 11 1 9 8 129 57
-501 4 2 11 1 53 129 57 130
-502 4 2 11 1 130 54 58 53
-503 4 2 11 1 57 53 130 58
-504 4 2 11 1 54 130 58 131
-505 4 2 11 1 131 55 59 54
-506 4 2 11 1 58 54 131 59
-507 4 2 11 1 55 131 59 132
-508 4 2 11 1 132 56 60 55
-509 4 2 11 1 59 55 132 60
-510 4 2 11 1 56 132 60 100
-511 4 2 11 1 100 19 20 56
-512 4 2 11 1 60 56 100 20
-513 4 2 11 1 41 44 46 113
-514 4 2 11 1 113 101 121 46
-515 4 2 11 1 41 101 113 46
-516 4 2 11 1 101 113 121 122
-517 4 2 11 1 114 102 122 113
-518 4 2 11 1 113 102 122 101
-519 4 2 11 1 102 114 122 103
-520 4 2 11 1 115 103 123 114
-521 4 2 11 1 114 103 123 122
-522 4 2 11 1 103 115 123 124
-523 4 2 11 1 116 104 124 115
-524 4 2 11 1 115 104 124 103
-525 4 2 11 1 104 116 124 93
-526 4 2 11 1 96 93 98 116
-527 4 2 11 1 116 93 98 124
-528 4 2 11 1 41 47 44 113
-529 4 2 11 1 125 101 113 47
-530 4 2 11 1 47 101 113 41
-531 4 2 11 1 101 125 113 102
-532 4 2 11 1 126 102 114 113
-533 4 2 11 1 125 102 126 113
-534 4 2 11 1 102 126 114 103
-535 4 2 11 1 127 103 115 114
-536 4 2 11 1 126 103 127 114
-537 4 2 11 1 103 127 115 128
-538 4 2 11 1 128 104 116 115
-539 4 2 11 1 103 104 128 115
-540 4 2 11 1 104 128 116 99
-541 4 2 11 1 99 93 96 116
-542 4 2 11 1 104 93 99 116
-543 4 2 11 1 9 48 45 117
-544 4 2 11 1 129 57 117 9
-545 4 2 11 1 48 9 129 117
-546 4 2 11 1 57 129 117 130
-547 4 2 11 1 130 58 118 57
-548 4 2 11 1 117 57 130 118
-549 4 2 11 1 58 130 118 119
-550 4 2 11 1 131 59 119 58
-551 4 2 11 1 130 58 131 119
-552 4 2 11 1 59 131 119 120
-553 4 2 11 1 132 60 120 59
-554 4 2 11 1 131 59 132 120
-555 4 2 11 1 60 132 120 100
-556 4 2 11 1 100 20 97 60
-557 4 2 11 1 120 60 100 97
+591
+142 4 1 4 13 41 43 111
+143 4 1 4 103 86 111 13
+144 4 1 4 103 13 111 41
+145 4 1 4 86 103 111 112
+146 4 1 4 104 87 112 86
+147 4 1 4 104 86 112 103
+148 4 1 4 87 104 112 113
+149 4 1 4 105 88 113 87
+150 4 1 4 105 87 113 104
+151 4 1 4 88 105 113 114
+152 4 1 4 106 89 114 88
+153 4 1 4 106 88 114 105
+154 4 1 4 89 106 114 96
+155 4 1 4 94 27 96 89
+156 4 1 4 94 89 96 106
+157 4 1 4 7 12 43 111
+158 4 1 4 82 50 111 7
+159 4 1 4 82 7 111 12
+160 4 1 4 50 82 111 112
+161 4 1 4 83 51 112 50
+162 4 1 4 83 50 112 82
+163 4 1 4 51 83 112 113
+164 4 1 4 84 52 113 51
+165 4 1 4 84 51 113 83
+166 4 1 4 52 84 113 114
+167 4 1 4 85 53 114 52
+168 4 1 4 85 52 114 84
+169 4 1 4 53 85 114 96
+170 4 1 4 28 18 96 53
+171 4 1 4 28 53 96 85
+172 4 1 4 17 11 49 135
+173 4 1 4 66 78 135 17
+174 4 1 4 66 17 135 11
+175 4 1 4 78 66 135 136
+176 4 1 4 67 79 136 78
+177 4 1 4 67 78 136 66
+178 4 1 4 79 67 136 137
+179 4 1 4 68 80 137 79
+180 4 1 4 68 79 137 67
+181 4 1 4 80 68 137 138
+182 4 1 4 69 81 138 80
+183 4 1 4 69 80 138 68
+184 4 1 4 81 69 138 102
+185 4 1 4 22 23 102 81
+186 4 1 4 22 81 102 69
+187 4 1 4 45 42 46 123
+188 4 1 4 107 119 123 45
+189 4 1 4 107 45 123 42
+190 4 1 4 119 107 123 124
+191 4 1 4 108 120 124 119
+192 4 1 4 108 119 124 107
+193 4 1 4 120 108 124 125
+194 4 1 4 109 121 125 120
+195 4 1 4 109 120 125 108
+196 4 1 4 121 109 125 126
+197 4 1 4 110 122 126 121
+198 4 1 4 110 121 126 109
+199 4 1 4 122 110 126 99
+200 4 1 4 95 98 99 122
+201 4 1 4 95 122 99 110
+202 4 1 4 12 13 43 111
+203 4 1 4 86 82 111 12
+204 4 1 4 86 12 111 13
+205 4 1 4 82 86 111 112
+206 4 1 4 87 83 112 82
+207 4 1 4 87 82 112 86
+208 4 1 4 83 87 112 113
+209 4 1 4 88 84 113 83
+210 4 1 4 88 83 113 87
+211 4 1 4 84 88 113 114
+212 4 1 4 89 85 114 84
+213 4 1 4 89 84 114 88
+214 4 1 4 85 89 114 96
+215 4 1 4 27 28 96 85
+216 4 1 4 27 85 96 89
+217 4 1 4 7 3 12 82
+218 4 1 4 29 50 82 7
+219 4 1 4 29 7 82 3
+220 4 1 4 50 29 82 83
+221 4 1 4 30 51 83 50
+222 4 1 4 30 50 83 29
+223 4 1 4 51 30 83 84
+224 4 1 4 31 52 84 51
+225 4 1 4 31 51 84 30
+226 4 1 4 52 31 84 85
+227 4 1 4 32 53 85 52
+228 4 1 4 32 52 85 31
+229 4 1 4 53 32 85 28
+230 4 1 4 4 18 28 53
+231 4 1 4 4 53 28 32
+232 4 1 4 2 11 17 66
+233 4 1 4 66 33 78 2
+234 4 1 4 66 2 78 17
+235 4 1 4 33 66 78 67
+236 4 1 4 67 34 79 33
+237 4 1 4 67 33 79 78
+238 4 1 4 34 67 79 68
+239 4 1 4 68 35 80 34
+240 4 1 4 68 34 80 79
+241 4 1 4 35 68 80 69
+242 4 1 4 69 36 81 35
+243 4 1 4 69 35 81 80
+244 4 1 4 36 69 81 22
+245 4 1 4 22 6 23 36
+246 4 1 4 22 36 23 81
+247 4 1 4 44 42 45 107
+248 4 1 4 107 115 119 44
+249 4 1 4 107 44 119 45
+250 4 1 4 115 107 119 108
+251 4 1 4 108 116 120 115
+252 4 1 4 108 115 120 119
+253 4 1 4 116 108 120 109
+254 4 1 4 109 117 121 116
+255 4 1 4 109 116 121 120
+256 4 1 4 117 109 121 110
+257 4 1 4 110 118 122 117
+258 4 1 4 110 117 122 121
+259 4 1 4 118 110 122 95
+260 4 1 4 95 97 98 118
+261 4 1 4 95 118 98 122
+262 4 1 4 44 17 49 135
+263 4 1 4 78 115 135 44
+264 4 1 4 78 44 135 17
+265 4 1 4 115 78 135 136
+266 4 1 4 79 116 136 115
+267 4 1 4 79 115 136 78
+268 4 1 4 116 79 136 137
+269 4 1 4 80 117 137 116
+270 4 1 4 80 116 137 79
+271 4 1 4 117 80 137 138
+272 4 1 4 81 118 138 117
+273 4 1 4 81 117 138 80
+274 4 1 4 118 81 138 102
+275 4 1 4 23 97 102 118
+276 4 1 4 23 118 102 81
+277 4 1 4 43 41 46 123
+278 4 1 4 103 111 123 41
+279 4 1 4 41 43 111 123
+280 4 1 4 111 103 123 124
+281 4 1 4 104 112 124 103
+282 4 1 4 103 111 112 124
+283 4 1 4 112 104 124 125
+284 4 1 4 105 113 125 104
+285 4 1 4 104 112 113 125
+286 4 1 4 113 105 125 126
+287 4 1 4 106 114 126 105
+288 4 1 4 105 113 114 126
+289 4 1 4 114 106 126 99
+290 4 1 4 94 96 99 106
+291 4 1 4 106 114 96 99
+292 4 1 4 8 7 43 111
+293 4 1 4 50 54 111 8
+294 4 1 4 50 8 111 7
+295 4 1 4 54 50 111 112
+296 4 1 4 51 55 112 54
+297 4 1 4 51 54 112 50
+298 4 1 4 55 51 112 113
+299 4 1 4 52 56 113 55
+300 4 1 4 52 55 113 51
+301 4 1 4 56 52 113 114
+302 4 1 4 53 57 114 56
+303 4 1 4 53 56 114 52
+304 4 1 4 57 53 114 96
+305 4 1 4 18 19 96 57
+306 4 1 4 18 57 96 53
+307 4 1 4 41 45 46 123
+308 4 1 4 119 103 123 41
+309 4 1 4 119 41 123 45
+310 4 1 4 103 119 123 124
+311 4 1 4 120 104 124 103
+312 4 1 4 120 103 124 119
+313 4 1 4 104 120 124 125
+314 4 1 4 121 105 125 104
+315 4 1 4 121 104 125 120
+316 4 1 4 105 121 125 126
+317 4 1 4 122 106 126 105
+318 4 1 4 122 105 126 121
+319 4 1 4 106 122 126 99
+320 4 1 4 98 94 99 106
+321 4 1 4 98 106 99 122
+322 4 1 4 10 9 42 107
+323 4 1 4 58 62 107 10
+324 4 1 4 58 10 107 9
+325 4 1 4 62 58 107 108
+326 4 1 4 59 63 108 62
+327 4 1 4 59 62 108 58
+328 4 1 4 63 59 108 109
+329 4 1 4 60 64 109 63
+330 4 1 4 60 63 109 59
+331 4 1 4 64 60 109 110
+332 4 1 4 61 65 110 64
+333 4 1 4 61 64 110 60
+334 4 1 4 65 61 110 95
+335 4 1 4 20 21 95 65
+336 4 1 4 20 65 95 61
+337 4 1 4 13 14 41 103
+338 4 1 4 90 86 103 13
+339 4 1 4 90 13 103 14
+340 4 1 4 86 90 103 104
+341 4 1 4 91 87 104 86
+342 4 1 4 91 86 104 90
+343 4 1 4 87 91 104 105
+344 4 1 4 92 88 105 87
+345 4 1 4 92 87 105 91
+346 4 1 4 88 92 105 106
+347 4 1 4 93 89 106 88
+348 4 1 4 93 88 106 92
+349 4 1 4 89 93 106 94
+350 4 1 4 26 27 94 89
+351 4 1 4 26 89 94 93
+352 4 1 4 16 17 44 78
+353 4 1 4 78 74 115 16
+354 4 1 4 78 16 115 44
+355 4 1 4 74 78 115 79
+356 4 1 4 79 75 116 74
+357 4 1 4 79 74 116 115
+358 4 1 4 75 79 116 80
+359 4 1 4 80 76 117 75
+360 4 1 4 80 75 117 116
+361 4 1 4 76 80 117 81
+362 4 1 4 81 77 118 76
+363 4 1 4 81 76 118 117
+364 4 1 4 77 81 118 23
+365 4 1 4 23 24 97 77
+366 4 1 4 23 77 97 118
+367 4 1 4 15 16 45 119
+368 4 1 4 74 70 119 15
+369 4 1 4 74 15 119 16
+370 4 1 4 70 74 119 120
+371 4 1 4 75 71 120 70
+372 4 1 4 75 70 120 74
+373 4 1 4 71 75 120 121
+374 4 1 4 76 72 121 71
+375 4 1 4 76 71 121 75
+376 4 1 4 72 76 121 122
+377 4 1 4 77 73 122 72
+378 4 1 4 77 72 122 76
+379 4 1 4 73 77 122 98
+380 4 1 4 24 25 98 73
+381 4 1 4 24 73 98 77
+382 4 1 4 8 43 48 131
+383 4 1 4 111 54 131 8
+384 4 1 4 111 8 131 43
+385 4 1 4 54 111 131 132
+386 4 1 4 112 55 132 54
+387 4 1 4 112 54 132 111
+388 4 1 4 55 112 132 133
+389 4 1 4 113 56 133 55
+390 4 1 4 113 55 133 112
+391 4 1 4 56 113 133 134
+392 4 1 4 114 57 134 56
+393 4 1 4 114 56 134 113
+394 4 1 4 57 114 134 101
+395 4 1 4 96 19 101 57
+396 4 1 4 96 57 101 114
+397 4 1 4 16 44 45 119
+398 4 1 4 115 74 119 16
+399 4 1 4 115 16 119 44
+400 4 1 4 74 115 119 120
+401 4 1 4 116 75 120 74
+402 4 1 4 116 74 120 115
+403 4 1 4 75 116 120 121
+404 4 1 4 117 76 121 75
+405 4 1 4 117 75 121 116
+406 4 1 4 76 117 121 122
+407 4 1 4 118 77 122 76
+408 4 1 4 118 76 122 117
+409 4 1 4 77 118 122 98
+410 4 1 4 97 24 98 77
+411 4 1 4 97 77 98 118
+412 4 1 4 14 1 47 127
+413 4 1 4 37 90 127 14
+414 4 1 4 37 14 127 1
+415 4 1 4 90 37 127 128
+416 4 1 4 38 91 128 90
+417 4 1 4 38 90 128 37
+418 4 1 4 91 38 128 129
+419 4 1 4 39 92 129 91
+420 4 1 4 39 91 129 38
+421 4 1 4 92 39 129 130
+422 4 1 4 40 93 130 92
+423 4 1 4 40 92 130 39
+424 4 1 4 93 40 130 100
+425 4 1 4 5 26 100 93
+426 4 1 4 5 93 100 40
+427 4 1 4 1 15 47 127
+428 4 1 4 70 37 127 1
+429 4 1 4 70 1 127 15
+430 4 1 4 37 70 127 128
+431 4 1 4 71 38 128 37
+432 4 1 4 71 37 128 70
+433 4 1 4 38 71 128 129
+434 4 1 4 72 39 129 38
+435 4 1 4 72 38 129 71
+436 4 1 4 39 72 129 130
+437 4 1 4 73 40 130 39
+438 4 1 4 73 39 130 72
+439 4 1 4 40 73 130 100
+440 4 1 4 25 5 100 40
+441 4 1 4 25 40 100 73
+442 4 1 4 42 9 48 131
+443 4 1 4 58 107 131 9
+444 4 1 4 9 42 107 131
+445 4 1 4 107 58 131 132
+446 4 1 4 59 108 132 58
+447 4 1 4 58 107 108 132
+448 4 1 4 108 59 132 133
+449 4 1 4 60 109 133 59
+450 4 1 4 59 108 109 133
+451 4 1 4 109 60 133 134
+452 4 1 4 61 110 134 60
+453 4 1 4 60 109 110 134
+454 4 1 4 110 61 134 101
+455 4 1 4 20 95 101 61
+456 4 1 4 61 110 95 101
+457 4 1 4 10 42 49 135
+458 4 1 4 107 62 135 10
+459 4 1 4 107 10 135 42
+460 4 1 4 62 107 135 136
+461 4 1 4 108 63 136 62
+462 4 1 4 108 62 136 107
+463 4 1 4 63 108 136 137
+464 4 1 4 109 64 137 63
+465 4 1 4 109 63 137 108
+466 4 1 4 64 109 137 138
+467 4 1 4 110 65 138 64
+468 4 1 4 110 64 138 109
+469 4 1 4 65 110 138 102
+470 4 1 4 95 21 102 65
+471 4 1 4 95 65 102 110
+472 4 1 4 15 45 47 127
+473 4 1 4 119 70 127 15
+474 4 1 4 119 15 127 45
+475 4 1 4 70 119 127 128
+476 4 1 4 120 71 128 70
+477 4 1 4 120 70 128 119
+478 4 1 4 71 120 128 129
+479 4 1 4 121 72 129 71
+480 4 1 4 121 71 129 120
+481 4 1 4 72 121 129 130
+482 4 1 4 122 73 130 72
+483 4 1 4 122 72 130 121
+484 4 1 4 73 122 130 100
+485 4 1 4 98 25 100 73
+486 4 1 4 98 73 100 122
+487 4 1 4 42 44 49 135
+488 4 1 4 115 107 135 44
+489 4 1 4 44 42 107 135
+490 4 1 4 107 115 135 136
+491 4 1 4 116 108 136 115
+492 4 1 4 115 107 108 136
+493 4 1 4 108 116 136 137
+494 4 1 4 117 109 137 116
+495 4 1 4 116 108 109 137
+496 4 1 4 109 117 137 138
+497 4 1 4 118 110 138 117
+498 4 1 4 117 109 110 138
+499 4 1 4 110 118 138 102
+500 4 1 4 97 95 102 118
+501 4 1 4 118 110 95 102
+502 4 1 4 9 8 48 131
+503 4 1 4 54 58 131 9
+504 4 1 4 54 9 131 8
+505 4 1 4 58 54 131 132
+506 4 1 4 55 59 132 58
+507 4 1 4 55 58 132 54
+508 4 1 4 59 55 132 133
+509 4 1 4 56 60 133 59
+510 4 1 4 56 59 133 55
+511 4 1 4 60 56 133 134
+512 4 1 4 57 61 134 60
+513 4 1 4 57 60 134 56
+514 4 1 4 61 57 134 101
+515 4 1 4 19 20 101 61
+516 4 1 4 19 61 101 57
+517 4 1 4 41 14 47 127
+518 4 1 4 90 103 127 14
+519 4 1 4 14 41 103 127
+520 4 1 4 103 90 127 128
+521 4 1 4 91 104 128 90
+522 4 1 4 90 103 104 128
+523 4 1 4 104 91 128 129
+524 4 1 4 92 105 129 91
+525 4 1 4 91 104 105 129
+526 4 1 4 105 92 129 130
+527 4 1 4 93 106 130 92
+528 4 1 4 92 105 106 130
+529 4 1 4 106 93 130 100
+530 4 1 4 26 94 100 93
+531 4 1 4 93 106 94 100
+532 4 1 4 11 10 49 135
+533 4 1 4 62 66 135 11
+534 4 1 4 62 11 135 10
+535 4 1 4 66 62 135 136
+536 4 1 4 63 67 136 66
+537 4 1 4 63 66 136 62
+538 4 1 4 67 63 136 137
+539 4 1 4 64 68 137 67
+540 4 1 4 64 67 137 63
+541 4 1 4 68 64 137 138
+542 4 1 4 65 69 138 68
+543 4 1 4 65 68 138 64
+544 4 1 4 69 65 138 102
+545 4 1 4 21 22 102 69
+546 4 1 4 21 69 102 65
+547 4 1 4 43 46 48 131
+548 4 1 4 123 111 131 43
+549 4 1 4 123 43 131 46
+550 4 1 4 111 123 131 132
+551 4 1 4 124 112 132 111
+552 4 1 4 124 111 132 123
+553 4 1 4 112 124 132 133
+554 4 1 4 125 113 133 112
+555 4 1 4 125 112 133 124
+556 4 1 4 113 125 133 134
+557 4 1 4 126 114 134 113
+558 4 1 4 126 113 134 125
+559 4 1 4 114 126 134 101
+560 4 1 4 99 96 101 114
+561 4 1 4 99 114 101 126
+562 4 1 4 45 41 47 127
+563 4 1 4 103 119 127 41
+564 4 1 4 41 45 119 127
+565 4 1 4 119 103 127 128
+566 4 1 4 104 120 128 103
+567 4 1 4 103 119 120 128
+568 4 1 4 120 104 128 129
+569 4 1 4 105 121 129 104
+570 4 1 4 104 120 121 129
+571 4 1 4 121 105 129 130
+572 4 1 4 106 122 130 105
+573 4 1 4 105 121 122 130
+574 4 1 4 122 106 130 100
+575 4 1 4 94 98 100 106
+576 4 1 4 106 122 98 100
+577 4 1 4 46 42 48 131
+578 4 1 4 107 123 131 42
+579 4 1 4 42 46 123 131
+580 4 1 4 123 107 131 132
+581 4 1 4 108 124 132 107
+582 4 1 4 107 123 124 132
+583 4 1 4 124 108 132 133
+584 4 1 4 109 125 133 108
+585 4 1 4 108 124 125 133
+586 4 1 4 125 109 133 134
+587 4 1 4 110 126 134 109
+588 4 1 4 109 125 126 134
+589 4 1 4 126 110 134 101
+590 4 1 4 95 99 101 110
+591 4 1 4 110 126 99 101
+2 2 5 3 41 13 43
+3 2 5 3 12 7 43
+4 2 5 3 11 17 49
+5 2 5 3 42 45 46
+6 2 5 3 13 12 43
+7 2 5 3 3 7 12
+8 2 5 3 11 2 17
+9 2 5 3 42 44 45
+10 2 5 3 17 44 49
+11 2 5 3 41 43 46
+12 2 5 3 7 8 43
+13 2 5 3 45 41 46
+14 2 5 3 9 10 42
+15 2 5 3 14 13 41
+16 2 5 3 17 16 44
+17 2 5 3 16 15 45
+18 2 5 3 43 8 48
+19 2 5 3 44 16 45
+20 2 5 3 1 14 47
+21 2 5 3 15 1 47
+22 2 5 3 9 42 48
+23 2 5 3 42 10 49
+24 2 5 3 45 15 47
+25 2 5 3 44 42 49
+26 2 5 3 8 9 48
+27 2 5 3 14 41 47
+28 2 5 3 10 11 49
+29 2 5 3 46 43 48
+30 2 5 3 41 45 47
+31 2 5 3 42 46 48
+32 2 17 3 37 70 1
+33 2 17 3 1 70 15
+34 2 17 3 38 71 37
+35 2 17 3 37 71 70
+36 2 17 3 39 72 38
+37 2 17 3 38 72 71
+38 2 17 3 40 73 39
+39 2 17 3 39 73 72
+40 2 17 3 5 25 40
+41 2 17 3 40 25 73
+42 2 17 3 70 74 15
+43 2 17 3 15 74 16
+44 2 17 3 71 75 70
+45 2 17 3 70 75 74
+46 2 17 3 72 76 71
+47 2 17 3 71 76 75
+48 2 17 3 73 77 72
+49 2 17 3 72 77 76
+50 2 17 3 25 24 73
+51 2 17 3 73 24 77
+52 2 17 3 74 78 16
+53 2 17 3 16 78 17
+54 2 17 3 75 79 74
+55 2 17 3 74 79 78
+56 2 17 3 76 80 75
+57 2 17 3 75 80 79
+58 2 17 3 77 81 76
+59 2 17 3 76 81 80
+60 2 17 3 24 23 77
+61 2 17 3 77 23 81
+62 2 17 3 78 2 17
+63 2 17 3 78 33 2
+64 2 17 3 79 33 78
+65 2 17 3 79 34 33
+66 2 17 3 80 34 79
+67 2 17 3 80 35 34
+68 2 17 3 81 35 80
+69 2 17 3 81 36 35
+70 2 17 3 23 36 81
+71 2 17 3 23 6 36
+72 2 21 3 29 82 3
+73 2 21 3 3 82 12
+74 2 21 3 30 83 29
+75 2 21 3 29 83 82
+76 2 21 3 31 84 30
+77 2 21 3 30 84 83
+78 2 21 3 32 85 31
+79 2 21 3 31 85 84
+80 2 21 3 4 28 32
+81 2 21 3 32 28 85
+82 2 21 3 82 86 12
+83 2 21 3 12 86 13
+84 2 21 3 83 87 82
+85 2 21 3 82 87 86
+86 2 21 3 84 88 83
+87 2 21 3 83 88 87
+88 2 21 3 85 89 84
+89 2 21 3 84 89 88
+90 2 21 3 28 27 85
+91 2 21 3 85 27 89
+92 2 21 3 86 90 13
+93 2 21 3 13 90 14
+94 2 21 3 87 91 86
+95 2 21 3 86 91 90
+96 2 21 3 88 92 87
+97 2 21 3 87 92 91
+98 2 21 3 89 93 88
+99 2 21 3 88 93 92
+100 2 21 3 27 26 89
+101 2 21 3 89 26 93
+102 2 21 3 90 37 14
+103 2 21 3 14 37 1
+104 2 21 3 91 38 90
+105 2 21 3 90 38 37
+106 2 21 3 92 39 91
+107 2 21 3 91 39 38
+108 2 21 3 93 40 92
+109 2 21 3 92 40 39
+110 2 21 3 26 5 93
+111 2 21 3 93 5 40
+112 2 22 3 94 27 96
+113 2 22 3 28 18 96
+114 2 22 3 22 23 102
+115 2 22 3 95 98 99
+116 2 22 3 27 28 96
+117 2 22 3 4 18 28
+118 2 22 3 22 6 23
+119 2 22 3 95 97 98
+120 2 22 3 23 97 102
+121 2 22 3 94 96 99
+122 2 22 3 18 19 96
+123 2 22 3 98 94 99
+124 2 22 3 20 21 95
+125 2 22 3 26 27 94
+126 2 22 3 23 24 97
+127 2 22 3 24 25 98
+128 2 22 3 96 19 101
+129 2 22 3 97 24 98
+130 2 22 3 5 26 100
+131 2 22 3 25 5 100
+132 2 22 3 20 95 101
+133 2 22 3 95 21 102
+134 2 22 3 98 25 100
+135 2 22 3 97 95 102
+136 2 22 3 19 20 101
+137 2 22 3 26 94 100
+138 2 22 3 21 22 102
+139 2 22 3 99 96 101
+140 2 22 3 94 98 100
+141 2 22 3 95 99 101
+1 15 5 1 5
 $EndElements
diff --git a/dG3D/benchmarks/powerYieldViscoElastoPlastic/cylinder.py b/dG3D/benchmarks/powerYieldViscoElastoPlastic/cylinder.py
index a1b15c2a5cd3f995d46b42b0b6064bee54012b56..9243e6743eeba01c9de19e2395996abd555bb92e 100644
--- a/dG3D/benchmarks/powerYieldViscoElastoPlastic/cylinder.py
+++ b/dG3D/benchmarks/powerYieldViscoElastoPlastic/cylinder.py
@@ -17,7 +17,7 @@ mu =E/2./(1.+nu)	  # Shear mudulus
 print(f"K={K} mu={mu}")
 rho = 7850e-9 # Bulk mass
 
-sy0c = 100. #MPa
+sy0c = 1. #MPa
 hc = 300.
 
 sy0t = sy0c*0.78
@@ -38,7 +38,7 @@ law1.setCompressionHardening(hardenc)
 law1.setTractionHardening(hardent)
 law1.setKinematicHardening(hardenk)
 
-law1.setStrainOrder(11)
+law1.setStrainOrder(-1)
 
 law1.setYieldPowerFactor(3.5)
 law1.setNonAssociatedFlow(True)
@@ -59,7 +59,8 @@ law1.setViscosityEffect(eta,0.21)
 
 
 # geometry
-meshfile="cylinder.msh" # name of mesh file
+geofile = "cylinder.geo" # "line.geo"
+meshfile= "cylinder.msh" # name of mesh file
 
 fullDg = 0 #O = CG, 1 = DG
 space1 = 0 # function space (Lagrange=0)
@@ -75,14 +76,15 @@ myfield1.stabilityParameters(beta1)
 sol = 2  # Gmm=0 (default) Taucs=1 PETsc=2
 soltype =1 # StaticLinear=0 (default) StaticNonLinear=1
 nstep = 100  # number of step (used only if soltype=1)
-ftime =1.   # Final time (used only if soltype=1)
-tol=1.e-8  # relative tolerance for NR scheme (used only if soltype=1)
+ftime = 1. # 2.4/1.e-0   # Final time (used only if soltype=1)
+tol=1.e-5  # relative tolerance for NR scheme (used only if soltype=1)
 nstepArch=1 # Number of step between 2 archiving (used only if soltype=1)
 
 
 
 # creation of Solver
 mysolver = nonLinearMechSolver(1000)
+mysolver.createModel(geofile,meshfile,3,1)
 mysolver.loadModel(meshfile)
 mysolver.addDomain(myfield1)
 mysolver.addMaterialLaw(law1)
diff --git a/dG3D/src/dG3DMaterialLaw.cpp b/dG3D/src/dG3DMaterialLaw.cpp
index 10a77500ac5584a65c94a828d098accc54e76135..aeef5633a43a274ae99c71afe1ac1fda546e72f3 100644
--- a/dG3D/src/dG3DMaterialLaw.cpp
+++ b/dG3D/src/dG3DMaterialLaw.cpp
@@ -247,7 +247,7 @@ void dG3DMaterialLawWithTangentByPerturbation::stress(IPVariable* ipv, const IPV
 
   _stressLaw->stress(ipvcur,ipvprev,false,checkfrac,dTangent);
   
-#if 0
+#if 1
   _stressLaw->stress(ipvcur,ipvprev,true,checkfrac,dTangent);
   ipvcur->getConstRefToDeformationGradient().print("F Analytique"); // FLE
   ipvcur->getConstRefToFirstPiolaKirchhoffStress().print("P Analytique"); // FLE
@@ -622,7 +622,7 @@ void dG3DMaterialLawWithTangentByPerturbation::stress(IPVariable* ipv, const IPV
         }
 
     }
-#if 0
+#if 1
     ipvcur->getConstRefToDeformationGradient().print("F Numerique"); // FLE
     ipvcur->getConstRefToFirstPiolaKirchhoffStress().print("P Numerique"); // FLE
     ipvcur->getConstRefToTangentModuli().print("dPdE Numerique");
@@ -3981,7 +3981,10 @@ void HyperViscoElasticDG3DMaterialLaw::setViscoElasticData(const std::string fil
 void HyperViscoElasticDG3DMaterialLaw::setVolumeCorrection(double _vc, double _xivc, double _zetavc ,double _dc, double _thetadc, double _pidc){
   _viscoLaw.setVolumeCorrection(_vc, _xivc, _zetavc, _dc, _thetadc, _pidc);
 };
-void HyperViscoElasticDG3DMaterialLaw::setExtraBranch_CompressionParameter(double compCorrection, double compCorrection_2, double compCorrection_3){
+void HyperViscoElasticDG3DMaterialLaw::setAdditionalVolumeCorrections(const double V3, const double V4, const double V5, const double D3, const double D4, const double D5){
+  _viscoLaw.setAdditionalVolumeCorrections(V3,V4,V5,D3,D4,D5);
+};
+void HyperViscoElasticDG3DMaterialLaw::setExtraBranch_CompressionParameter(const double compCorrection, const double compCorrection_2, const double compCorrection_3){
   _viscoLaw.setExtraBranch_CompressionParameter(compCorrection,compCorrection_2,compCorrection_3);
 };
 void HyperViscoElasticDG3DMaterialLaw::setTensionCompressionRegularisation(double tensionCompressionRegularisation){
@@ -4101,7 +4104,10 @@ void HyperViscoElastoPlasticPowerYieldDG3DMaterialLaw::setViscoElasticData(const
 void HyperViscoElastoPlasticPowerYieldDG3DMaterialLaw::setVolumeCorrection(double _vc, double _xivc, double _zetavc ,double _dc, double _thetadc, double _pidc){
   _viscoLaw.setVolumeCorrection(_vc, _xivc, _zetavc, _dc, _thetadc, _pidc);
 };
-void HyperViscoElastoPlasticPowerYieldDG3DMaterialLaw::setExtraBranch_CompressionParameter(double compCorrection, double compCorrection_2, double compCorrection_3){
+void HyperViscoElastoPlasticPowerYieldDG3DMaterialLaw::setAdditionalVolumeCorrections(const double V3, const double V4, const double V5, const double D3, const double D4, const double D5){
+  _viscoLaw.setAdditionalVolumeCorrections(V3,V4,V5,D3,D4,D5);
+};
+void HyperViscoElastoPlasticPowerYieldDG3DMaterialLaw::setExtraBranch_CompressionParameter(const double compCorrection, const double compCorrection_2, const double compCorrection_3){
   _viscoLaw.setExtraBranch_CompressionParameter(compCorrection,compCorrection_2,compCorrection_3);
 };
 void HyperViscoElastoPlasticPowerYieldDG3DMaterialLaw::setExtraBranchNLType(const int method){
@@ -10525,18 +10531,30 @@ void NonLinearTVMDG3DMaterialLaw::useExtraBranchBool(const bool useExtraBranch){
 void NonLinearTVMDG3DMaterialLaw::useExtraBranchBool_TVE(const bool useExtraBranch_TVE, const int ExtraBranch_TVE_option){
   _viscoLaw.useExtraBranchBool_TVE(useExtraBranch_TVE, ExtraBranch_TVE_option);
 };
-void NonLinearTVMDG3DMaterialLaw::setVolumeCorrection(double _vc, double _xivc, double _zetavc, double _dc, double _thetadc, double _pidc){
+void NonLinearTVMDG3DMaterialLaw::setVolumeCorrection(const double _vc, const double _xivc, const double _zetavc, const double _dc, const double _thetadc, const double _pidc){
   _viscoLaw.setVolumeCorrection(_vc,_xivc,_zetavc,_dc,_thetadc,_pidc);
 };
-void NonLinearTVMDG3DMaterialLaw::setExtraBranch_CompressionParameter(double compCorrection, double compCorrection_2, double compCorrection_3){
+void NonLinearTVMDG3DMaterialLaw::setAdditionalVolumeCorrections(const double V3, const double V4, const double V5, const double D3, const double D4, const double D5){
+  _viscoLaw.setAdditionalVolumeCorrections(V3,V4,V5,D3,D4,D5);
+};
+void NonLinearTVMDG3DMaterialLaw::setExtraBranch_CompressionParameter(const double compCorrection, const double compCorrection_2, const double compCorrection_3){
   _viscoLaw.setExtraBranch_CompressionParameter(compCorrection,compCorrection_2,compCorrection_3);
 };
-void NonLinearTVMDG3DMaterialLaw::setTensionCompressionRegularisation(double tensionCompressionRegularisation){
+void NonLinearTVMDG3DMaterialLaw::setTensionCompressionRegularisation(const double tensionCompressionRegularisation){
   _viscoLaw.setTensionCompressionRegularisation(tensionCompressionRegularisation); 
 };
 void NonLinearTVMDG3DMaterialLaw::setExtraBranchNLType(const int method){
   _viscoLaw.setExtraBranchNLType(method);
 };
+void NonLinearTVMDG3DMaterialLaw::setCorrectionsAllBranchesTVE(const int i, const double V1, const double V2, const double D1, const double D2){
+  _viscoLaw.setCorrectionsAllBranchesTVE(i,V1,V2,D1,D2);
+};
+void NonLinearTVMDG3DMaterialLaw::setAdditionalCorrectionsAllBranchesTVE(const int i, const double V3, const double V4, const double V5, const double D3, const double D4, const double D5){
+  _viscoLaw.setAdditionalCorrectionsAllBranchesTVE(i,V3,V4,V5,D3,D4,D5);
+};
+void NonLinearTVMDG3DMaterialLaw::setCompressionCorrectionsAllBranchesTVE(const int i, const double Ci){
+  _viscoLaw.setCompressionCorrectionsAllBranchesTVE(i,Ci);
+};
 void NonLinearTVMDG3DMaterialLaw::setMullinsEffect(const mullinsEffect& mullins){
   _viscoLaw.setMullinsEffect(mullins);
 };
@@ -10770,7 +10788,10 @@ void NonLinearTVEDG3DMaterialLaw::useExtraBranchBool(const bool useExtraBranch){
 void NonLinearTVEDG3DMaterialLaw::setVolumeCorrection(double _vc, double _xivc, double _zetavc, double _dc, double _thetadc, double _pidc){
   _viscoLaw.setVolumeCorrection(_vc,_xivc,_zetavc,_dc,_thetadc,_pidc);
 };
-void NonLinearTVEDG3DMaterialLaw::setExtraBranch_CompressionParameter(double compCorrection, double compCorrection_2, double compCorrection_3){
+void NonLinearTVEDG3DMaterialLaw::setAdditionalVolumeCorrections(const double V3, const double V4, const double V5, const double D3, const double D4, const double D5){
+  _viscoLaw.setAdditionalVolumeCorrections(V3,V4,V5,D3,D4,D5);
+};
+void NonLinearTVEDG3DMaterialLaw::setExtraBranch_CompressionParameter(const double compCorrection, const double compCorrection_2, const double compCorrection_3){
   _viscoLaw.setExtraBranch_CompressionParameter(compCorrection,compCorrection_2,compCorrection_3);
 };
 void NonLinearTVEDG3DMaterialLaw::setExtraBranchNLType(const int method){
@@ -11059,16 +11080,19 @@ void NonLinearTVPDG3DMaterialLaw::setTemperatureFunction_Viscosity(const scalarF
 void NonLinearTVPDG3DMaterialLaw::useExtraBranchBool(const bool useExtraBranch){
   _viscoLaw.useExtraBranchBool(useExtraBranch);
 };
-void NonLinearTVPDG3DMaterialLaw::setVolumeCorrection(double _vc, double _xivc, double _zetavc, double _dc, double _thetadc, double _pidc){
+void NonLinearTVPDG3DMaterialLaw::setVolumeCorrection(const double _vc, const double _xivc, const double _zetavc, const double _dc, const double _thetadc, const double _pidc){
   _viscoLaw.setVolumeCorrection(_vc,_xivc,_zetavc,_dc,_thetadc,_pidc);
 };
-void NonLinearTVPDG3DMaterialLaw::setExtraBranch_CompressionParameter(double compCorrection, double compCorrection_2, double compCorrection_3){
+void NonLinearTVPDG3DMaterialLaw::setAdditionalVolumeCorrections(const double V3, const double V4, const double V5, const double D3, const double D4, const double D5){
+  _viscoLaw.setAdditionalVolumeCorrections(V3,V4,V5,D3,D4,D5);
+};
+void NonLinearTVPDG3DMaterialLaw::setExtraBranch_CompressionParameter(const double compCorrection, const double compCorrection_2, const double compCorrection_3){
   _viscoLaw.setExtraBranch_CompressionParameter(compCorrection,compCorrection_2,compCorrection_3);
 };
 void NonLinearTVPDG3DMaterialLaw::setExtraBranchNLType(const int method){
   _viscoLaw.setExtraBranchNLType(method);
 };
-void NonLinearTVPDG3DMaterialLaw::setTensionCompressionRegularisation(double tensionCompressionRegularisation){
+void NonLinearTVPDG3DMaterialLaw::setTensionCompressionRegularisation(const double tensionCompressionRegularisation){
   _viscoLaw.setTensionCompressionRegularisation(tensionCompressionRegularisation); 
 };
 // Added extra argument in the NonLinearTVEDG3DIPVariable contructor - Tinitial   (added from LinearThermoMech)
@@ -11338,18 +11362,31 @@ void NonLinearTVENonLinearTVPDG3DMaterialLaw::useExtraBranchBool(const bool useE
 void NonLinearTVENonLinearTVPDG3DMaterialLaw::useExtraBranchBool_TVE(const bool useExtraBranch_TVE, const int ExtraBranch_TVE_option){
   _viscoLaw.useExtraBranchBool_TVE(useExtraBranch_TVE, ExtraBranch_TVE_option);
 };
-void NonLinearTVENonLinearTVPDG3DMaterialLaw::setVolumeCorrection(double _vc, double _xivc, double _zetavc, double _dc, double _thetadc, double _pidc){
+void NonLinearTVENonLinearTVPDG3DMaterialLaw::setVolumeCorrection(const double _vc, const double _xivc, const double _zetavc, const double _dc, const double _thetadc, const double _pidc){
   _viscoLaw.setVolumeCorrection(_vc,_xivc,_zetavc,_dc,_thetadc,_pidc);
 };
-void NonLinearTVENonLinearTVPDG3DMaterialLaw::setExtraBranch_CompressionParameter(double compCorrection, double compCorrection_2, double compCorrection_3){
+void NonLinearTVENonLinearTVPDG3DMaterialLaw::setAdditionalVolumeCorrections(const double V3, const double V4, const double V5, const double D3, const double D4, const double D5){
+  _viscoLaw.setAdditionalVolumeCorrections(V3,V4,V5,D3,D4,D5);
+};
+void NonLinearTVENonLinearTVPDG3DMaterialLaw::setExtraBranch_CompressionParameter(const double compCorrection, const double compCorrection_2, const double compCorrection_3){
   _viscoLaw.setExtraBranch_CompressionParameter(compCorrection,compCorrection_2,compCorrection_3);
 };
 void NonLinearTVENonLinearTVPDG3DMaterialLaw::setExtraBranchNLType(const int method){
   _viscoLaw.setExtraBranchNLType(method);
 };
-void NonLinearTVENonLinearTVPDG3DMaterialLaw::setTensionCompressionRegularisation(double tensionCompressionRegularisation){
+void NonLinearTVENonLinearTVPDG3DMaterialLaw::setTensionCompressionRegularisation(const double tensionCompressionRegularisation){
   _viscoLaw.setTensionCompressionRegularisation(tensionCompressionRegularisation); 
 };
+void NonLinearTVENonLinearTVPDG3DMaterialLaw::setCorrectionsAllBranchesTVE(const int i, const double V1, const double V2, const double D1, const double D2){
+  _viscoLaw.setCorrectionsAllBranchesTVE(i,V1,V2,D1,D2);
+};
+void NonLinearTVENonLinearTVPDG3DMaterialLaw::setAdditionalCorrectionsAllBranchesTVE(const int i, const double V3, const double V4, const double V5, const double D3, const double D4, const double D5){
+  _viscoLaw.setAdditionalCorrectionsAllBranchesTVE(i,V3,V4,V5,D3,D4,D5);
+};
+void NonLinearTVENonLinearTVPDG3DMaterialLaw::setCompressionCorrectionsAllBranchesTVE(const int i, const double Ci){
+  _viscoLaw.setCompressionCorrectionsAllBranchesTVE(i,Ci);
+};
+
 // Added extra argument in the NonLinearTVEDG3DIPVariable contructor - Tinitial   (added from LinearThermoMech)
 void NonLinearTVENonLinearTVPDG3DMaterialLaw::createIPState(IPStateBase* &ips, bool hasBodyForce, const bool* state_,const MElement *ele, const int nbFF_, const IntPt *GP, const int gpt) const
 {
diff --git a/dG3D/src/dG3DMaterialLaw.h b/dG3D/src/dG3DMaterialLaw.h
index e92e79bdd724fd4ce93d9e490079a8b1afdc3fe7..14fd1b5e6f126aff95cdb3e02837b7318d1ae121 100644
--- a/dG3D/src/dG3DMaterialLaw.h
+++ b/dG3D/src/dG3DMaterialLaw.h
@@ -936,7 +936,8 @@ class HyperViscoElasticDG3DMaterialLaw : public dG3DMaterialLaw{
     void setViscoElasticData_Shear(const int i, const double Gi, const double gi);
     void setViscoElasticData(const std::string filename);
     void setVolumeCorrection(double _vc, double _xivc, double _zetavc, double _dc, double _thetadc, double _pidc);
-    void setExtraBranch_CompressionParameter(double compCorrection, double compCorrection_2, double compCorrection_3);
+    void setAdditionalVolumeCorrections(const double V3, const double V4, const double V5, const double D3, const double D4, const double D5);
+    void setExtraBranch_CompressionParameter(const double compCorrection, const double compCorrection_2, const double compCorrection_3);
     void setExtraBranchNLType(int type);
     void setTensionCompressionRegularisation(double tensionCompressionRegularisation);
     #ifndef SWIG
@@ -990,7 +991,8 @@ class HyperViscoElastoPlasticPowerYieldDG3DMaterialLaw  : public dG3DMaterialLaw
     void setViscoElasticData_Shear(const int i, const double Gi, const double gi);
     void setViscoElasticData(const std::string filename);
     void setVolumeCorrection(double _vc, double _xivc, double _zetavc, double _dc, double _thetadc, double _pidc);
-    void setExtraBranch_CompressionParameter(double compCorrection, double compCorrection_2, double compCorrection_3);
+    void setAdditionalVolumeCorrections(const double V3, const double V4, const double V5, const double D3, const double D4, const double D5);
+    void setExtraBranch_CompressionParameter(const double compCorrection, const double compCorrection_2, const double compCorrection_3);
     void setExtraBranchNLType(int type);
     void setTensionCompressionRegularisation(double tensionCompressionRegularisation);
     
@@ -3319,10 +3321,14 @@ class NonLinearTVMDG3DMaterialLaw : public dG3DMaterialLaw{   // public Material
     void setViscoElasticData_Bulk(const int i, const double Ki, const double ki);
     void setViscoElasticData_Shear(const int i, const double Gi, const double gi);
     void setViscoElasticData(const std::string filename);
-    void setVolumeCorrection(double _vc, double _xivc, double _zetavc, double _dc, double _thetadc, double _pidc);
-    void setExtraBranch_CompressionParameter(double compCorrection, double compCorrection_2, double compCorrection_3);
-    void setExtraBranchNLType(int type);
-    void setTensionCompressionRegularisation(double tensionCompressionRegularisation);
+    void setVolumeCorrection(const double _vc, const double _xivc, const double _zetavc, const double _dc, const double _thetadc, const double _pidc);
+    void setAdditionalVolumeCorrections(const double V3, const double V4, const double V5, const double D3, const double D4, const double D5);
+    void setExtraBranch_CompressionParameter(const double compCorrection, const double compCorrection_2, const double compCorrection_3);
+    void setExtraBranchNLType(const int type);
+    void setTensionCompressionRegularisation(const double tensionCompressionRegularisation);
+    void setCorrectionsAllBranchesTVE(const int i, const double V1, const double V2, const double D1, const double D2);
+    void setAdditionalCorrectionsAllBranchesTVE(const int i, const double V3, const double V4, const double V5, const double D3, const double D4, const double D5);
+    void setCompressionCorrectionsAllBranchesTVE(const int i, const double Ci);
     
     void setReferenceTemperature(const double Tref);
     void setShiftFactorConstantsWLF(const double C1, const double C2);
@@ -3400,10 +3406,11 @@ class NonLinearTVEDG3DMaterialLaw : public dG3DMaterialLaw{   // public Material
     void setViscoElasticData_Shear(const int i, const double Gi, const double gi);
     void setViscoElasticData_Alpha(const int i, const double Alphai);
     void setViscoElasticData(const std::string filename);
-    void setVolumeCorrection(double _vc, double _xivc, double _zetavc, double _dc, double _thetadc, double _pidc);
-    void setExtraBranch_CompressionParameter(double compCorrection, double compCorrection_2, double compCorrection_3);
-    void setExtraBranchNLType(int type);
-    void setTensionCompressionRegularisation(double tensionCompressionRegularisation);
+    void setVolumeCorrection(const double _vc, const double _xivc, const double _zetavc, const double _dc, const double _thetadc, const double _pidc);
+    void setAdditionalVolumeCorrections(const double V3, const double V4, const double V5, const double D3, const double D4, const double D5);
+    void setExtraBranch_CompressionParameter(const double compCorrection, const double compCorrection_2, const double compCorrection_3);
+    void setExtraBranchNLType(const int type);
+    void setTensionCompressionRegularisation(const double tensionCompressionRegularisation);
     
     void setReferenceTemperature(const double Tref);
     void setTempFuncOption(const double TemFuncOpt);
@@ -3516,10 +3523,11 @@ class NonLinearTVPDG3DMaterialLaw : public dG3DMaterialLaw{   // public Material
     // void setTemperatureFunction_BranchShearModuli(const scalarFunction& Tfunc,int i);
     // void setTemperatureFunction_BranchThermalDilationCoefficient(const scalarFunction& Tfunc,int i);
     void useExtraBranchBool(const bool useExtraBranch);
-    void setVolumeCorrection(double _vc, double _xivc, double _zetavc, double _dc, double _thetadc, double _pidc);
-    void setExtraBranch_CompressionParameter(double compCorrection, double compCorrection_2, double compCorrection_3);
-    void setExtraBranchNLType(int type);
-    void setTensionCompressionRegularisation(double tensionCompressionRegularisation);
+    void setVolumeCorrection(const double _vc, const double _xivc, const double _zetavc, const double _dc, const double _thetadc, const double _pidc);
+    void setAdditionalVolumeCorrections(const double V3, const double V4, const double V5, const double D3, const double D4, const double D5);
+    void setExtraBranch_CompressionParameter(const double compCorrection, const double compCorrection_2, const double compCorrection_3);
+    void setExtraBranchNLType(const int type);
+    void setTensionCompressionRegularisation(const double tensionCompressionRegularisation);
     
     void setCompressionHardening(const J2IsotropicHardening& comp);
     void setTractionHardening(const J2IsotropicHardening& trac);
@@ -3623,10 +3631,14 @@ class NonLinearTVENonLinearTVPDG3DMaterialLaw : public dG3DMaterialLaw{   // pub
     // void setTemperatureFunction_BranchThermalDilationCoefficient(const scalarFunction& Tfunc,int i);
     void useExtraBranchBool(const bool useExtraBranch);
     void useExtraBranchBool_TVE(const bool useExtraBranch_TVE, const int ExtraBranch_TVE_option);
-    void setVolumeCorrection(double _vc, double _xivc, double _zetavc, double _dc, double _thetadc, double _pidc);
-    void setExtraBranch_CompressionParameter(double compCorrection, double compCorrection_2, double compCorrection_3);
-    void setExtraBranchNLType(int type);
-    void setTensionCompressionRegularisation(double tensionCompressionRegularisation);
+    void setVolumeCorrection(const double _vc, const double _xivc, const double _zetavc, const double _dc, const double _thetadc, const double _pidc);
+    void setAdditionalVolumeCorrections(const double V3, const double V4, const double V5, const double D3, const double D4, const double D5);
+    void setExtraBranch_CompressionParameter(const double compCorrection, const double compCorrection_2, const double compCorrection_3);
+    void setExtraBranchNLType(const int type);
+    void setTensionCompressionRegularisation(const double tensionCompressionRegularisation);
+    void setCorrectionsAllBranchesTVE(const int i, const double V1, const double V2, const double D1, const double D2);
+    void setAdditionalCorrectionsAllBranchesTVE(const int i, const double V3, const double V4, const double V5, const double D3, const double D4, const double D5);
+    void setCompressionCorrectionsAllBranchesTVE(const int i, const double Ci);
     
     void setCompressionHardening(const J2IsotropicHardening& comp);
     void setTractionHardening(const J2IsotropicHardening& trac);