diff --git a/NonLinearSolver/Domain/partDomain.h b/NonLinearSolver/Domain/partDomain.h
index 49b6877986e51ef226e9c084f37f8997008e6e3e..75762d54e671e66c432c9f20d2f2c536348987e6 100644
--- a/NonLinearSolver/Domain/partDomain.h
+++ b/NonLinearSolver/Domain/partDomain.h
@@ -229,12 +229,12 @@ class partDomain
 
     virtual void createIPState(AllIPState::ipstateContainer& map, const bool *state) const;
 
-    virtual void computeIPVariable(AllIPState *aips,const unknownField *ufield,const IPStateBase::whichState ws, bool stiff)=0;
+    virtual bool computeIPVariable(AllIPState *aips,const unknownField *ufield,const IPStateBase::whichState ws, bool stiff)=0;
     virtual void setDeformationGradientGradient(AllIPState *aips, const STensor33 &GM, const IPStateBase::whichState ws)=0;
     virtual void setdFmdFM(AllIPState *aips, std::map<Dof, STensor3> &dUdF,const IPStateBase::whichState ws)=0;  
     virtual void setdFmdGM(AllIPState *aips, std::map<Dof, STensor33> &dUdG,const IPStateBase::whichState ws)=0;
     virtual void setValuesForBodyForce(AllIPState *aips, const IPStateBase::whichState ws)=0;
-    virtual void computeIpv(AllIPState *aips,MElement *e, IPStateBase::whichState ws,
+    virtual bool computeIpv(AllIPState *aips,MElement *e, IPStateBase::whichState ws,
                              materialLaw *mlaw,fullVector<double> &disp, bool stiff)=0;
     virtual void setGaussIntegrationRule()=0;
     virtual bool getFormulation() const{return _fullDg;}
@@ -382,13 +382,13 @@ class dgPartDomain : public partDomain
     ScalarTermBase<double>* getScalarTermPFBound() const {return scalarTermPFBound;};
     LinearTermBase<double>* getLinearTermPFBound() const {return linearTermPFBound;};
 
-    virtual void computeIPVariable(AllIPState *aips,const unknownField *ufield,const IPStateBase::whichState ws, bool stiff)=0;
-    virtual void computeIpv(AllIPState *aips,MInterfaceElement *ie, IntPt *GP,const IPStateBase::whichState ws,
+    virtual bool computeIPVariable(AllIPState *aips,const unknownField *ufield,const IPStateBase::whichState ws, bool stiff)=0;
+    virtual bool computeIpv(AllIPState *aips,MInterfaceElement *ie, IntPt *GP,const IPStateBase::whichState ws,
                               partDomain* efMinus, partDomain *efPlus,materialLaw *mlawminus,
                               materialLaw *mlawplus,fullVector<double> &dispm,
                               fullVector<double> &dispp,
                               const bool virt, bool stiff,const bool checkfrac=true)=0;
-    virtual void computeIpv(AllIPState *aips,MElement *e, IPStateBase::whichState ws,
+    virtual bool computeIpv(AllIPState *aips,MElement *e, IPStateBase::whichState ws,
                               materialLaw *mlaw,fullVector<double> &disp, bool stiff)=0;
     
     virtual void initiallyBreakAllInterfaceIP(AllIPState *aips) const;
diff --git a/NonLinearSolver/internalPoints/ipField.cpp b/NonLinearSolver/internalPoints/ipField.cpp
index 34b6c99cbf7a35bf9aea3dd550ce749fa0fea620..cad06a1bdb708f3a9e133d133d7ee0a5286b3dd7 100644
--- a/NonLinearSolver/internalPoints/ipField.cpp
+++ b/NonLinearSolver/internalPoints/ipField.cpp
@@ -1093,13 +1093,15 @@ std::string IPField::ToString(const int i){
   }
 };
 
-void IPField::compute1state(IPStateBase::whichState ws, bool stiff){
+bool IPField::compute1state(IPStateBase::whichState ws, bool stiff){
 	std::vector<partDomain*>* domainVector = _solver->getDomainVector();
 	unknownField* ufield = _solver->getUnknownField();
   for(std::vector<partDomain*>::iterator itdom=domainVector->begin(); itdom!=domainVector->end(); ++itdom){
     partDomain *dom = *itdom;
-    dom->computeIPVariable(_AIPS,ufield,ws,stiff);
+    bool ok = dom->computeIPVariable(_AIPS,ufield,ws,stiff);
+    if (!ok) return false;
   }
+  return true;
 }
 
 
diff --git a/NonLinearSolver/internalPoints/ipField.h b/NonLinearSolver/internalPoints/ipField.h
index 9ef8b3b46042298a7c260003c73cd44a98419a4c..9804de242a5b0f85fc8ddbf05bd849c3b8512d69 100644
--- a/NonLinearSolver/internalPoints/ipField.h
+++ b/NonLinearSolver/internalPoints/ipField.h
@@ -582,7 +582,7 @@ class IPField : public elementsField {
   const std::vector<partDomain*>& getDomainVector() const;
 
 
-  void compute1state(IPStateBase::whichState ws, bool stiff);
+  bool compute1state(IPStateBase::whichState ws, bool stiff);
   void setDeformationGradientGradient(const STensor33 &GM,const IPStateBase::whichState ws);
   void setdFmdFM(std::map<Dof, STensor3> &dUdF, const IPStateBase::whichState ws);
   void setdFmdGM(std::map<Dof, STensor33> &dUdG, const IPStateBase::whichState ws);
diff --git a/NonLinearSolver/internalPoints/ipHyperelastic.cpp b/NonLinearSolver/internalPoints/ipHyperelastic.cpp
index 75bbe43292600553a3e779d55ba4ea0820c99b4d..80e933732a4f4bbb42238953287a40a25a6707fd 100644
--- a/NonLinearSolver/internalPoints/ipHyperelastic.cpp
+++ b/NonLinearSolver/internalPoints/ipHyperelastic.cpp
@@ -14,7 +14,8 @@
 #include "STensorOperations.h"
 
 IPHyperViscoElastic::IPHyperViscoElastic(const int N):IPVariableMechanics(),_N(N),_elasticEnergy(0.),_Ee(0.),_kirchhoff(0.),
-      _irreversibleEnergy(0.),_DirreversibleEnergyDF(0.), _viscousEnergyPart(0.), _dElasticEnergyPartdF(0.), _dViscousEnergyPartdF(0.), _elasticBulkPropertyScaleFactor(1.), _elasticShearPropertyScaleFactor(1.), _intA(0.), _intB(0.)
+      _irreversibleEnergy(0.),_DirreversibleEnergyDF(0.), _viscousEnergyPart(0.), _dElasticEnergyPartdF(0.), _dViscousEnergyPartdF(0.), _elasticBulkPropertyScaleFactor(1.), _elasticShearPropertyScaleFactor(1.),
+	  _intA(0.), _intB(0.), _DintA(0.), _DintB(0.)
 {
   _A.clear();
   _B.clear();
@@ -30,7 +31,8 @@ IPHyperViscoElastic::IPHyperViscoElastic(const IPHyperViscoElastic& src): IPVari
     _N(src._N),_A(src._A),_B(src._B),_elasticEnergy(src._elasticEnergy), _kirchhoff(src._kirchhoff),
     _irreversibleEnergy(src._irreversibleEnergy),_DirreversibleEnergyDF(src._DirreversibleEnergyDF),
     _viscousEnergyPart(src._viscousEnergyPart), _dElasticEnergyPartdF(src._dElasticEnergyPartdF), 
-    _dViscousEnergyPartdF(src._dViscousEnergyPartdF), _elasticBulkPropertyScaleFactor(src._elasticBulkPropertyScaleFactor), _elasticShearPropertyScaleFactor(src._elasticShearPropertyScaleFactor),_intA(src._intA),_intB(src._intB), _psi_branch(src._psi_branch)
+    _dViscousEnergyPartdF(src._dViscousEnergyPartdF), _elasticBulkPropertyScaleFactor(src._elasticBulkPropertyScaleFactor), _elasticShearPropertyScaleFactor(src._elasticShearPropertyScaleFactor),
+	_intA(src._intA),_intB(src._intB), _psi_branch(src._psi_branch), _DintA(src._DintA),_DintB(src._DintB)
 
 {
 
@@ -55,6 +57,8 @@ IPHyperViscoElastic& IPHyperViscoElastic::operator =(const IPVariable& src){
     _elasticShearPropertyScaleFactor= psrc->_elasticShearPropertyScaleFactor;
     _intA= psrc->_intA;
     _intB= psrc->_intB;
+    _DintA= psrc->_DintA;
+    _DintB= psrc->_DintB;
     _psi_branch= psrc->_psi_branch;
   }
   return *this;
@@ -77,6 +81,8 @@ void IPHyperViscoElastic::restart() {
   restartManager::restart(_elasticShearPropertyScaleFactor);
   restartManager::restart(_intA);
   restartManager::restart(_intB);
+  restartManager::restart(_DintA);
+  restartManager::restart(_DintB);
   restartManager::restart(_psi_branch);
 };
 
diff --git a/NonLinearSolver/internalPoints/ipHyperelastic.h b/NonLinearSolver/internalPoints/ipHyperelastic.h
index 40a02848b706e865ec745005191b7f29be4b685b..e1ccba37b8d58702163381fc7aaf4aa286c91424 100644
--- a/NonLinearSolver/internalPoints/ipHyperelastic.h
+++ b/NonLinearSolver/internalPoints/ipHyperelastic.h
@@ -33,6 +33,8 @@ class IPHyperViscoElastic : public IPVariableMechanics{
     double _elasticShearPropertyScaleFactor;
     double _intA; // intA = psi_ExtraBranch/Kinf
     double _intB; // intB = psi_ExtraBranch/Ginf
+    double _DintA; // derivative of _intA
+    double _DintB; // derivative of _intB
 
     std::vector<double> _psi_branch; // N elements
     
diff --git a/NonLinearSolver/internalPoints/ipNonLinearTVM.cpp b/NonLinearSolver/internalPoints/ipNonLinearTVM.cpp
index cd70e403b1808d18a74c9a01e4e2b51df52b7586..be3d6fa710da72276bb524fffa4f80dee755e31a 100644
--- a/NonLinearSolver/internalPoints/ipNonLinearTVM.cpp
+++ b/NonLinearSolver/internalPoints/ipNonLinearTVM.cpp
@@ -31,6 +31,7 @@ IPNonLinearTVM::IPNonLinearTVM(const J2IsotropicHardening* comp,
     _Av_TVE_vector.clear(); _dAv_dTrEe_TVE_vector.clear();
     _Bd_TVE_vector.clear(); _dBd_dTrEe_TVE_vector.clear(); _dBd_dDevEe_TVE_vector.clear();
     _intAv_TVE_vector.clear(); _intBd_TVE_vector.clear();
+    _DintAv_TVE_vector.clear(); _DintBd_TVE_vector.clear();
         
     for (int i=0; i < N; i++){
         STensor3 el(0.);
@@ -50,6 +51,8 @@ IPNonLinearTVM::IPNonLinearTVM(const J2IsotropicHardening* comp,
         _dBd_dTrEe_TVE_vector.push_back(0.);
         _intAv_TVE_vector.push_back(0.);
         _intBd_TVE_vector.push_back(0.);
+        _DintAv_TVE_vector.push_back(0.);
+        _DintBd_TVE_vector.push_back(0.);
         _DA_DdevE.push_back(el43);
         _DDA_DTDdevE.push_back(el43);
     }
@@ -75,7 +78,8 @@ IPNonLinearTVM::IPNonLinearTVM(const IPNonLinearTVM& src): IPHyperViscoElastoPla
             _intAv_1_TVE(src._intAv_1_TVE), _intBd_1_TVE(src._intBd_1_TVE), _intAv_2_TVE(src._intAv_2_TVE), _intBd_2_TVE(src._intBd_2_TVE),
             _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),
+            _intAv_TVE_vector(src._intAv_TVE_vector), _intBd_TVE_vector(src._intBd_TVE_vector),_DintAv_TVE_vector(src._DintAv_TVE_vector), _DintBd_TVE_vector(src._DintBd_TVE_vector),
+			_dBd_dDevEe_TVE_vector(src._dBd_dDevEe_TVE_vector),
             _viscousDissipatedEnergy(src._viscousDissipatedEnergy), _mullinsDissipatedEnergy(src._mullinsDissipatedEnergy), _psiInfCorrector(src._psiInfCorrector){
                 
     if (src._ipMullinsEffect != NULL)
@@ -143,6 +147,8 @@ IPNonLinearTVM& IPNonLinearTVM::operator=(const IPVariable& src)
     _dBd_dTrEe_TVE_vector = psrc->_dBd_dTrEe_TVE_vector;
     _intAv_TVE_vector = psrc->_intAv_TVE_vector;
     _intBd_TVE_vector = psrc->_intBd_TVE_vector;
+    _DintAv_TVE_vector = psrc->_DintAv_TVE_vector;
+    _DintBd_TVE_vector = psrc->_DintBd_TVE_vector;
     _dBd_dDevEe_TVE_vector = psrc->_dBd_dDevEe_TVE_vector;
     _viscousDissipatedEnergy = psrc->_viscousDissipatedEnergy;
     _mullinsDissipatedEnergy = psrc->_mullinsDissipatedEnergy;
@@ -227,6 +233,8 @@ void IPNonLinearTVM::restart(){
   restartManager::restart(_dBd_dTrEe_TVE_vector);
   restartManager::restart(_intAv_TVE_vector);
   restartManager::restart(_intBd_TVE_vector);
+  restartManager::restart(_DintAv_TVE_vector);
+  restartManager::restart(_DintBd_TVE_vector);
   restartManager::restart(_dBd_dDevEe_TVE_vector);
   restartManager::restart(_viscousDissipatedEnergy);
   restartManager::restart(_mullinsDissipatedEnergy);
@@ -245,4 +253,4 @@ IPMullinsEffect& IPNonLinearTVM::getRefToIPMullinsEffect(){
   if(_ipMullinsEffect==NULL)
       Msg::Error("IPNonLinearTVM: _ipMullinsEffect not initialized");
   return *_ipMullinsEffect;
-};
\ No newline at end of file
+};
diff --git a/NonLinearSolver/internalPoints/ipNonLinearTVM.h b/NonLinearSolver/internalPoints/ipNonLinearTVM.h
index 9b7ada89f44c0d0f634509549357e0531b1899e5..755f0cdd36d5d89c68c2e58fa3701882acad9aa9 100644
--- a/NonLinearSolver/internalPoints/ipNonLinearTVM.h
+++ b/NonLinearSolver/internalPoints/ipNonLinearTVM.h
@@ -42,7 +42,7 @@ class IPNonLinearTVM : public IPHyperViscoElastoPlastic{
         double _intAv_1_TVE, _intAv_2_TVE;
         STensor3 _dBd_dDevEe;
         STensor3 _dBd_dDevEe_TVE, _intBd_1_TVE, _intBd_2_TVE;
-        std::vector<double> _Av_TVE_vector, _Bd_TVE_vector, _dAv_dTrEe_TVE_vector, _dBd_dTrEe_TVE_vector, _intAv_TVE_vector, _intBd_TVE_vector;
+        std::vector<double> _Av_TVE_vector, _Bd_TVE_vector, _dAv_dTrEe_TVE_vector, _dBd_dTrEe_TVE_vector, _intAv_TVE_vector, _intBd_TVE_vector,  _DintAv_TVE_vector, _DintBd_TVE_vector;
         std::vector<STensor3> _dBd_dDevEe_TVE_vector; 
         
         // DcorKirDT
@@ -119,4 +119,4 @@ class IPNonLinearTVM : public IPHyperViscoElastoPlastic{
         virtual IPVariable* clone() const{return new IPNonLinearTVM(*this);};
         virtual void restart();
 };
-#endif // IPNonLinearTVM.h
\ No newline at end of file
+#endif // IPNonLinearTVM.h
diff --git a/NonLinearSolver/internalPoints/ipNonLinearTVP.cpp b/NonLinearSolver/internalPoints/ipNonLinearTVP.cpp
index 891478f1a8298feb168f23613399c65b88c1c1e6..aec94de8f42fb64858adc4c1ded5468450f67901 100644
--- a/NonLinearSolver/internalPoints/ipNonLinearTVP.cpp
+++ b/NonLinearSolver/internalPoints/ipNonLinearTVP.cpp
@@ -18,7 +18,7 @@ IPNonLinearTVP::IPNonLinearTVP(const J2IsotropicHardening* comp, const J2Isotrop
                                 _ModMandel(0.),_DModMandelDT(0.), _DbackSigDT(0.), _DModMandelDF(0.), _DbackSigDF(0.), _DphiPDF(0.), _GammaN(0.), _dGammaNdT(0.), _dGammaNdF(0.),
                                 _mechSrcTVP(0.),_DmechSrcTVPdT(0.),_DmechSrcTVPdF(0.),
                                 _dPlasticEnergyPartdT(0.),_dElasticEnergyPartdT(0.),_dViscousEnergyPartdT(0.),
-                                _IsoHardForce_simple(0.), _dIsoHardForcedT_simple(0.), _dIsoHardForcedF_simple(0.)
+                                _IsoHardForce_simple(0.), _dIsoHardForcedT_simple(0.), _dIsoHardForcedF_simple(0.), _DphiDF(0.),_DphiDT(0.)
 {
     
     _IsoHardForce.clear(); _dIsoHardForcedT.clear(); _dIsoHardForcedF.clear();
@@ -44,7 +44,7 @@ IPNonLinearTVP::IPNonLinearTVP(const IPNonLinearTVP& src):IPNonLinearTVM(src),
                                 _dPlasticEnergyPartdT(src._dPlasticEnergyPartdT),_dElasticEnergyPartdT(src._dElasticEnergyPartdT),
                                 _dViscousEnergyPartdT(src._dViscousEnergyPartdT), 
                                 _IsoHardForce_simple(src._IsoHardForce_simple), 
-                                _dIsoHardForcedT_simple(src._dIsoHardForcedT_simple), _dIsoHardForcedF_simple(src._dIsoHardForcedF_simple)      
+                                _dIsoHardForcedT_simple(src._dIsoHardForcedT_simple), _dIsoHardForcedF_simple(src._dIsoHardForcedF_simple), _DphiDF(src._DphiDF),_DphiDT(src._DphiDT)
 {
     
 };
@@ -84,7 +84,8 @@ IPNonLinearTVP& IPNonLinearTVP::operator =(const IPVariable &source){
     _IsoHardForce_simple = ps->_IsoHardForce_simple;
     _dIsoHardForcedT_simple = ps->_dIsoHardForcedT_simple;
     _dIsoHardForcedF_simple = ps->_dIsoHardForcedF_simple;
-
+    _DphiDF = ps->_DphiDF;
+    _DphiDT = ps->_DphiDT;
   }
   return *this;
 };
@@ -125,5 +126,7 @@ void IPNonLinearTVP::restart() {
   restartManager::restart(_IsoHardForce_simple);
   restartManager::restart(_dIsoHardForcedT_simple);
   restartManager::restart(_dIsoHardForcedF_simple);
+  restartManager::restart(_DphiDF);
+  restartManager::restart(_DphiDT);
   return;
 }
diff --git a/NonLinearSolver/internalPoints/ipNonLinearTVP.h b/NonLinearSolver/internalPoints/ipNonLinearTVP.h
index eeef7ca85d602a773c54d36f8b0f36fdc5361bd8..8cc1e9aed6195f5003e2f9345e44321baec0b579 100644
--- a/NonLinearSolver/internalPoints/ipNonLinearTVP.h
+++ b/NonLinearSolver/internalPoints/ipNonLinearTVP.h
@@ -42,12 +42,14 @@ class IPNonLinearTVP : public IPNonLinearTVM{
         STensor3 _ModMandel;
         STensor3 _DModMandelDT;
         STensor3 _DbackSigDT;
+        STensor3 _DphiDT;
         STensor3 _DmechSrcTVPdF;
         STensor3 _dIsoHardForcedF_simple;
         std::vector<STensor3> _dIsoHardForcedF;
         
         STensor43 _DbackSigDF;
         STensor43 _DModMandelDF;
+        STensor43 _DphiDF;
         STensor3 _DphiPDF; // need this for mechSrc
         
         STensor3 _GammaN;
@@ -98,6 +100,9 @@ class IPNonLinearTVP : public IPNonLinearTVM{
         virtual STensor3& getRefToDphiPDF() {return _DphiPDF;}
         virtual const STensor3& getConstRefToDphiPDF() const {return _DphiPDF;}
         
+        virtual STensor3& getRefToGammaN() {return _GammaN;}
+        virtual const STensor3& getConstRefToGammaN() const {return _GammaN;}
+
         virtual double &getRefToDElasticEnergyPartdT() {return _dElasticEnergyPartdT;}
         virtual const double &getConstRefToDElasticEnergyPartdT() const {return _dElasticEnergyPartdT;}
         virtual double &getRefToDViscousEnergyPartdT() {return _dViscousEnergyPartdT;}
@@ -114,4 +119,4 @@ class IPNonLinearTVP : public IPNonLinearTVM{
     
 };
 
-#endif // IPNonLinearTVP.h
\ No newline at end of file
+#endif // IPNonLinearTVP.h
diff --git a/NonLinearSolver/internalPoints/ipNonLocalPorosity.cpp b/NonLinearSolver/internalPoints/ipNonLocalPorosity.cpp
index bcb9c6f034d462da122dfb2253667a926597a4c0..612b94ca8306e3c6ecda88945f492f0645846a98 100644
--- a/NonLinearSolver/internalPoints/ipNonLocalPorosity.cpp
+++ b/NonLinearSolver/internalPoints/ipNonLocalPorosity.cpp
@@ -21,7 +21,8 @@ IPNonLocalPorosity::IPNonLocalPorosity() : IPVariableMechanics(),  _elasticEnerg
                                                     _currentOutwardNormal(NULL),_referenceOutwardNormal(NULL),_corKir(0.), _yieldStress(0.),
                                                   _failed(false), _hatq(0.),_nonlocalEplmatrix(0.),_nonlocalHatQ(0.), _fVinitial(0.),
                                                   _eplMacro(0.), _eplMacroNonLocal(0.), _lnfV(0.),_lnfVtilde(0.), _T(288.), _dissipationActive(false),
-                                                  _thermalEnergy(0.),_ThermoElasticCoupling(0.), _DplasticEnergyDEplmatrix(0.)
+                                                  _thermalEnergy(0.),_ThermoElasticCoupling(0.), _DplasticEnergyDEplmatrix(0.),
+                                                  _successFlag(true)
 {
   // Default constructor without arguments is forbiden as it is incorrect and incomplete
   ipvJ2IsotropicHardening=NULL;
@@ -48,7 +49,8 @@ IPNonLocalPorosity::IPNonLocalPorosity(double fVinitial, const J2IsotropicHarden
        _currentOutwardNormal(NULL), _referenceOutwardNormal(NULL),_deformationGradient(NULL),
        _corKir(0.),_failed(false),_hatq(0.),_nonlocalEplmatrix(0.),_nonlocalHatQ(0.), _fVinitial(fVinitial),
        _eplMacro(0.),_eplMacroNonLocal(0.),  _lnfV(0.),_lnfVtilde(0.),_T(288.), _dissipationActive(false),
-       _thermalEnergy(0.),_ThermoElasticCoupling(0.), _DplasticEnergyDEplmatrix(0.)
+       _thermalEnergy(0.),_ThermoElasticCoupling(0.), _DplasticEnergyDEplmatrix(0.),
+       _successFlag(true)
 {
   // Real constructor
   // Initialisation of pointers for internal laws Ipvs and other related variables
@@ -158,7 +160,8 @@ IPNonLocalPorosity::IPNonLocalPorosity(const IPNonLocalPorosity &source) :
       _eplMacro(source._eplMacro), _eplMacroNonLocal(source._eplMacroNonLocal),
       _lnfV(source._lnfV),_lnfVtilde(source._lnfVtilde),_T(source._T), _dissipationActive(source._dissipationActive),
       _thermalEnergy(source._thermalEnergy),_ThermoElasticCoupling(source._ThermoElasticCoupling),
-      _DplasticEnergyDEplmatrix(source._DplasticEnergyDEplmatrix)
+      _DplasticEnergyDEplmatrix(source._DplasticEnergyDEplmatrix),
+      _successFlag(source._successFlag)
 {
 
   // Copy all pointers for internal laws Ipvs
@@ -342,6 +345,7 @@ IPNonLocalPorosity& IPNonLocalPorosity::operator=(const IPVariable &source)
     _thermalEnergy = src->_thermalEnergy;
     _ThermoElasticCoupling = src->_ThermoElasticCoupling;
     _DplasticEnergyDEplmatrix = src->_DplasticEnergyDEplmatrix;
+    _successFlag = src->_successFlag;
   }
   return *this;
 };
@@ -417,6 +421,7 @@ void IPNonLocalPorosity::restart()
   restartManager::restart(_thermalEnergy);
   restartManager::restart(_ThermoElasticCoupling);
   restartManager::restart(_DplasticEnergyDEplmatrix);
+  restartManager::restart(_successFlag);
   // Pointer to variables store somewhere else
   _currentOutwardNormal = NULL;
   _referenceOutwardNormal = NULL;
diff --git a/NonLinearSolver/internalPoints/ipNonLocalPorosity.h b/NonLinearSolver/internalPoints/ipNonLocalPorosity.h
index 2406081b20ac3b098fc9faa9fc3e316743fdd4d8..acbde87d7fa796337c2b96f18a02045bfb3f34c8 100644
--- a/NonLinearSolver/internalPoints/ipNonLocalPorosity.h
+++ b/NonLinearSolver/internalPoints/ipNonLocalPorosity.h
@@ -95,6 +95,8 @@ protected:
   double _T; // temperature
   double _thermalEnergy; // thermal energy
   double _ThermoElasticCoupling; //
+  
+  bool _successFlag; // true if contitutive law is successfully passed in GP 
 
  public:
   // Constructor & destructor
@@ -341,7 +343,8 @@ protected:
   };
 
 
-
+  virtual bool constitutiveSuccessFlag() const {return _successFlag;};
+  virtual bool& getRefToConstitutiveSuccessFlag()  {return _successFlag;};
 
   // - Coalesncence and void state ipv
   virtual const IPCoalescence& getConstRefToIPCoalescence() const{
diff --git a/NonLinearSolver/internalPoints/ipvariable.h b/NonLinearSolver/internalPoints/ipvariable.h
index 744401d56ef7093f8992816865ea46db9f2044d2..adb7cf7ec4bfa149b83f21dc122197ebaf09b768 100644
--- a/NonLinearSolver/internalPoints/ipvariable.h
+++ b/NonLinearSolver/internalPoints/ipvariable.h
@@ -67,6 +67,8 @@ class IPVariable
   virtual void setValueForBodyForce(const STensor43& K, const int ModuliType)=0;
   virtual void computeBodyForce(const STensor33& G, SVector3& B) const=0;
   virtual const STensor43 &getConstRefToTangentModuli() const=0;
+  
+  virtual bool getConstitutiveSuccessFlag() const {return true;}; // true if contitutive law is successfully passed in GP 
 
    #if defined(HAVE_MPI)
    // using in multiscale analysis with MPI
@@ -120,6 +122,8 @@ class IPVariableMechanics : public IPVariable{
   virtual void computeBodyForce(const STensor33& G, SVector3& B) const { Msg::Error("ComputeBodyForce is not defined in IPVariableMechanics"); }
   virtual const STensor43 &getConstRefToTangentModuli() const {Msg::Error("getConstRefToTangentModuli IPVariableMechanics"); static STensor43 dummy; return dummy;};
   
+  
+  
   virtual void restart(){
     IPVariable::restart();
   }
@@ -231,6 +235,26 @@ template<class Tbulk,class Tfrac> class IPVariable2Enhanced : public Tbulk{
 		}
     return;
   }
+  
+  virtual bool getConstitutiveSuccessFlag() const
+  {
+    if (_ipvbulk!=NULL &&  _ipvfrac!=NULL)
+    {
+      return _ipvbulk->getConstitutiveSuccessFlag() and _ipvfrac->getConstitutiveSuccessFlag();
+    } 
+    else if (_ipvbulk!=NULL)
+    {
+      return _ipvbulk->getConstitutiveSuccessFlag();
+    }
+    else if (_ipvfrac!= NULL)
+    {
+      return _ipvfrac->getConstitutiveSuccessFlag();
+    }
+    else
+    {
+      return true;
+    }
+  }
   virtual IPVariable* clone() const =0;
 
 	#if defined(HAVE_MPI)
diff --git a/NonLinearSolver/materialLaw/kinematicHardening.cpp b/NonLinearSolver/materialLaw/kinematicHardening.cpp
index ec2a7b7c2121eeba524895ff8dc89bf377a5f707..5cc01f665d5ad65c0f9b52c919e19afbe33fdf7e 100644
--- a/NonLinearSolver/materialLaw/kinematicHardening.cpp
+++ b/NonLinearSolver/materialLaw/kinematicHardening.cpp
@@ -189,12 +189,13 @@ void PolynomialKinematicHardening::hardening(double p0, const IPKinematicHardeni
       Msg::Error("order %d is not implemented PolynomialJ2IsotropicHaderning::hardening",_order);
   }
   
-  R *= _temFunc_K->getVal(T);
-  dR *= _temFunc_K->getVal(T);
-  ddR *= _temFunc_K->getVal(T);
-  dRdT = R*_temFunc_K->getDiff(T);
-  ddRdTT = R*_temFunc_K->getDoubleDiff(T);
-  
+  R *= _temFunc_K->getVal(T); // Hb
+  dR *= _temFunc_K->getVal(T); // dHb
+  ddR *= _temFunc_K->getVal(T); // ddHb
+  dRdT = R*_temFunc_K->getDiff(T)/_temFunc_K->getVal(T); // dHbdT
+  ddRdTT = R*_temFunc_K->getDoubleDiff(T)/_temFunc_K->getVal(T); // ddHbddT
+  ddRdT = dR*_temFunc_K->getDiff(T)/_temFunc_K->getVal(T); // ddHbdT = ddHbdTdgamma
+
   ipv.set(R,dR,ddR,dRdT,ddRdTT,ddRdT);
 }
 
@@ -405,7 +406,6 @@ void exponentialKinematicHardeningLaw::hardening(double p0, const IPKinematicHar
   ipv.set(R,dR,ddR,dRdT,ddRdTT,ddRdT); 
 }
 
-// added
 void exponentialKinematicHardeningLaw::hardening(double p0, const IPKinematicHardening &ipvprev, double p, double T, IPKinematicHardening &ipv) const
 {
   double R(0.), dR(0.), ddR(0.), dRdT(0.), ddRdTT(0.), ddRdT(0.); 
@@ -430,7 +430,7 @@ void exponentialKinematicHardeningLaw::hardening(double p0, const IPKinematicHar
   }
 
   ipv.set(R,dR,ddR,dRdT,ddRdTT,ddRdT); //added dRdT
-} // 
+}
 
 kinematicHardening * exponentialKinematicHardeningLaw::clone() const
 {
diff --git a/NonLinearSolver/materialLaw/mlawHyperelastic.cpp b/NonLinearSolver/materialLaw/mlawHyperelastic.cpp
index 048f868c610d773c3a88ce77c850fd155069a4a9..e15627afd345e1775f0abda078bd5edca516a235 100644
--- a/NonLinearSolver/materialLaw/mlawHyperelastic.cpp
+++ b/NonLinearSolver/materialLaw/mlawHyperelastic.cpp
@@ -193,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, double* psiInfCorrector) const{
+                                                    double* dB_dTrEe, double* psiInfCorrector, double* DintA, double* DintB) const{
   if(_extraBranchNLType == expType)
   {
     A_v = getVolumeCorrection()*pow(exp(getXiVolumeCorrection()/3.*tr*tr)-1.,getZetaVolumeCorrection());
@@ -327,47 +327,78 @@ void mlawHyperViscoElastic::evaluatePhiPCorrection(double tr, const STensor3 &de
 
     }
     else if(_extraBranchNLType == TensionCompressionRegularisedType){
+
+		// 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;
+		double Ci = _compCorrection;
         
         // 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 x = getXiVolumeCorrection()*tr*tr + getZetaVolumeCorrection();
-        A_v = -1. + getVolumeCorrection()/sqrt(x)*(sigmoid + _compCorrection*(1.-sigmoid));
+
+        // A_v
+        double x1 = V1*tr*tr + V2;
+        double x2 = V4*tr*tr + V5;
+        A_v = -1. + sigmoid*(1./sqrt(x1)+V0) + (1.-sigmoid)*Ci*(1/sqrt(x2)+V3);
+
+        dA_vdE = - sigmoid*V1*tr/pow(x1,1.5) - (1.-sigmoid)*(V4*Ci*tr/pow(x2,1.5))
+                   + (m*expmtr/pow((1.+expmtr),2.))*(1./sqrt(x1)+V0) - (Ci*m*expmtr/pow((1.+expmtr),2.))*(1/sqrt(x2)+V3);
   
-        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. + getVolumeCorrection()*integrand*(sigmoid + _compCorrection*(1.-sigmoid));
+        if(V1>0. && V4>0.){
+            double integrand1 = 1./V1*sqrt(x1) + V0*tr*tr/2.; // integral of A_v * trEe
+            double integrand2 = 1./V4*sqrt(x2) + V3*tr*tr/2.;
+            integrand1 -= ( 1./V1*sqrt(V2) ); // value at trEe = 0.
+            integrand2 -= ( 1./V4*sqrt(V5) ); // value at trEe = 0.
+            intA = - tr*tr/2. + sigmoid*integrand1 + Ci*(1.-sigmoid)*integrand2;
+
+            if(DintA!=NULL){
+            	*DintA = (m*expmtr/pow((1.+expmtr),2.))*integrand1 - (Ci*m*expmtr/pow((1.+expmtr),2.))*integrand2;
+            }
         }
         else{
             intA = - tr*tr/2.;
+            // Msg::Error(" Inside extraBranch_Hyper Type = TensionCompressionRegularisedType, V1 = 0. or V4 = 0., incompatibility with Mullin's effect");
         }
-            
-        double y = getThetaDevCorrection()*dev.dotprod() + getPiDevCorrection();
-        B_d = -1. + getDevCorrection()/sqrt(y)*(sigmoid + _compCorrection*(1.-sigmoid)); 
+
+        // B_d
+        double y1 = D1*dev.dotprod() + D2;
+        double y2 = D4*dev.dotprod() + D5;
+        B_d = -1. + sigmoid*(1./sqrt(y1)+D0) + (1.-sigmoid)*Ci*(1/sqrt(y2)+D3);
 
         STensorOperation::zero(dB_vddev);
         dB_vddev = dev;
-        dB_vddev *= -getThetaDevCorrection()/pow(y,1.5)*(sigmoid + _compCorrection*(1.-sigmoid));
-        dB_vddev *= getDevCorrection();
-        
+        dB_vddev *= (-sigmoid*D1/pow(y1,1.5) - (1.-sigmoid)*(D4*Ci/pow(y2,1.5)));
+
         if(dB_dTrEe!=NULL){
-            *dB_dTrEe = getDevCorrection()/sqrt(y)* (m*expmtr/pow((1.+expmtr),2.)) *( 1.-_compCorrection);
+            *dB_dTrEe = (m*expmtr/pow((1.+expmtr),2.))*(1./sqrt(y1)+D0) - (Ci*m*expmtr/pow((1.+expmtr),2.))*(1/sqrt(y2)+D3);
         }    
-        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. + getDevCorrection()*integrand*(sigmoid + _compCorrection*(1.-sigmoid));
+        if(D1>0. && D4>0.){
+            double integrand1 = 1./D1*sqrt(y1) + D0*dev.dotprod()/2.;  // integral of B_d * devEe
+            double integrand2 = 1./D4*sqrt(y2) + D3*dev.dotprod()/2.;
+            integrand1 -= ( 1./D1*sqrt(D2) );  // value at devEe = 0.
+            integrand2 -= ( 1./D4*sqrt(D5) );  // value at devEe = 0.
+            intB = -dev.dotprod()/2. + sigmoid*integrand1 + Ci*(1.-sigmoid)*integrand2;
+
+            if(DintB!=NULL){
+            	*DintB = (m*expmtr/pow((1.+expmtr),2.))*integrand1 - (Ci*m*expmtr/pow((1.+expmtr),2.))*integrand2;
+            }
         }
         else{
             intB = -dev.dotprod()/2.;
+            // Msg::Error(" Inside extraBranch_Hyper Type = TensionCompressionRegularisedType, D1 = 0. or D4 = 0., incompatibility with Mullin's effect");
         } 
     }
     /*else if(_extraBranchNLType == hyper_exp_TCasymm_Type){
@@ -445,6 +476,7 @@ void mlawHyperViscoElastic::evaluatePhiPCorrection(double tr, const STensor3 &de
     			double D3 = _devCorrection2;
     			double D4 = _thetadevCorrection2;
     			double D5 = _pidevCorrection2;
+    			double Ci = _compCorrection;
 
     	// Regularising function
     	        double m = _tensionCompressionRegularisation;
@@ -468,6 +500,10 @@ void mlawHyperViscoElastic::evaluatePhiPCorrection(double tr, const STensor3 &de
                     integrand1 -= ( 1./V1*sqrt(V2) ); // value at trEe = 0.
                     intA = - tr*tr/2. + sigmoid*(integrand1 + integrand2) + _compCorrection*(1.-sigmoid)*integrand1;
                     // intA *= getVolumeCorrection();
+
+                    if(DintA!=NULL){
+                    	*DintA = (m*expmtr/pow((1.+expmtr),2.))*integrand1 - (Ci*m*expmtr/pow((1.+expmtr),2.))*integrand2;
+                    }
                 }
                 else{
                 	intA = - tr*tr/2.;
@@ -496,6 +532,10 @@ void mlawHyperViscoElastic::evaluatePhiPCorrection(double tr, const STensor3 &de
                     integrand1 -= (1./D1*sqrt(D2) );  // value at devEe = 0.
                     intB = -dev.dotprod()/2. + sigmoid*(integrand1 + integrand2) + _compCorrection*(1.-sigmoid)*integrand1;
                     // intB *= getDevCorrection();
+
+                    if(DintB!=NULL){
+                    	*DintB = (m*expmtr/pow((1.+expmtr),2.))*integrand1 - (Ci*m*expmtr/pow((1.+expmtr),2.))*integrand2;
+                    }
                 }
                 else{
                 	intB = -dev.dotprod()/2.;
diff --git a/NonLinearSolver/materialLaw/mlawHyperelastic.h b/NonLinearSolver/materialLaw/mlawHyperelastic.h
index 853e17338dbd0c728adcd270f1b3cee4351159c5..78a2656834578f4ed2c167a2a79d7556b4c81bdc 100644
--- a/NonLinearSolver/materialLaw/mlawHyperelastic.h
+++ b/NonLinearSolver/materialLaw/mlawHyperelastic.h
@@ -88,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, double* psiInfCorrector = NULL) const;
+                                double* dB_dTrEe = NULL, double* psiInfCorrector = NULL, double* DintA = NULL, double* DintB = NULL) const;
     //void evaluateA_dA(double trEe, double &A_v, double &dAprdEepr) const;
     
   #endif // SWIG
diff --git a/NonLinearSolver/materialLaw/mlawNonLinearTVENonLinearTVP.cpp b/NonLinearSolver/materialLaw/mlawNonLinearTVENonLinearTVP.cpp
index d76a3995f44178fab8202dc165efbe061610dd29..7db46ba61b9be195ea518d152d4eb08fc27de70f 100644
--- a/NonLinearSolver/materialLaw/mlawNonLinearTVENonLinearTVP.cpp
+++ b/NonLinearSolver/materialLaw/mlawNonLinearTVENonLinearTVP.cpp
@@ -15,11 +15,11 @@
 
 mlawNonLinearTVENonLinearTVP::mlawNonLinearTVENonLinearTVP(const int num,const double E,const double nu, const double rho, const double tol,
                                    const double Tinitial, const double Alpha, const double KThCon, const double Cp,
-                                   const bool matrixbyPerturbation, const double pert, const bool thermalEstimationPreviousConfig):
-                                   mlawNonLinearTVP(num, E, nu, rho, tol, Tinitial, Alpha, KThCon, Cp, matrixbyPerturbation, pert, thermalEstimationPreviousConfig){
+                                   const bool matrixbyPerturbation, const double pert, const double stressIteratorTol, const bool thermalEstimationPreviousConfig):
+                                   mlawNonLinearTVP(num, E, nu, rho, tol, Tinitial, Alpha, KThCon, Cp, matrixbyPerturbation, pert, thermalEstimationPreviousConfig), _stressIteratorTol(stressIteratorTol) {
 };
 
-mlawNonLinearTVENonLinearTVP::mlawNonLinearTVENonLinearTVP(const mlawNonLinearTVENonLinearTVP& src): mlawNonLinearTVP(src) {
+mlawNonLinearTVENonLinearTVP::mlawNonLinearTVENonLinearTVP(const mlawNonLinearTVENonLinearTVP& src): mlawNonLinearTVP(src), _stressIteratorTol(src._stressIteratorTol) {
 };
 
 mlawNonLinearTVENonLinearTVP& mlawNonLinearTVENonLinearTVP::operator=(const materialLaw& source){
@@ -27,6 +27,7 @@ mlawNonLinearTVENonLinearTVP& mlawNonLinearTVENonLinearTVP::operator=(const mate
     mlawNonLinearTVP::operator=(source);
     const mlawNonLinearTVENonLinearTVP* src =dynamic_cast<const mlawNonLinearTVENonLinearTVP*>(&source);
     if(src != NULL){
+    	_stressIteratorTol = src->_stressIteratorTol;
     }
     return *this;
 };
@@ -34,21 +35,23 @@ mlawNonLinearTVENonLinearTVP& mlawNonLinearTVENonLinearTVP::operator=(const mate
 mlawNonLinearTVENonLinearTVP::~mlawNonLinearTVENonLinearTVP(){
 };
 
-double mlawNonLinearTVENonLinearTVP::freeEnergyPlasticity(const IPNonLinearTVP *q0, IPNonLinearTVP *q1, const double T0, const double T) const{
+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
+       Hb = q1->_ipKinematic->getR(); // 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::zero(alpha);
+    if(Hb>0.){
+    	alpha = q1->_backsig;
+    	alpha *= 1/(pow(kk,1)*Hb); //pow(kk,2) debug
+    }
 	STensorOperation::doubleContractionSTensor3(q1->_backsig,alpha,Psy_TVP);
 
 	// 2. Isotropic Hardening
@@ -58,7 +61,7 @@ double mlawNonLinearTVENonLinearTVP::freeEnergyPlasticity(const IPNonLinearTVP *
 
 	Psy_TVP += intR;
 
-    // If mullins, then calculate psi_VE derivatives
+    // If mullins, then calculate psi_VP derivatives
     // if (_mullinsEffect != NULL && q._ipMullinsEffect != NULL){
     //    *DpsiDT = 0.;
     //    STensorOperation::zero(*DpsiDE);
@@ -66,6 +69,57 @@ double mlawNonLinearTVENonLinearTVP::freeEnergyPlasticity(const IPNonLinearTVP *
     return Psy_TVP;
 }
 
+void mlawNonLinearTVENonLinearTVP::freeEnergyPlasticityDerivatives(const IPNonLinearTVP *q0, IPNonLinearTVP *q1, const double& T0, const double& T, STensor3& dPsy_TVPdF, double& dPsy_TVPdT) const{
+
+	STensorOperation::zero(dPsy_TVPdF);
+	dPsy_TVPdT = 0.;
+
+	// 1. Kinematic Hardening
+	double Hb(0.), dHb(0.), dHbdT(0.);
+	if (q1->_ipKinematic != NULL){
+	  Hb = q1->_ipKinematic->getR(); // kinematic hardening parameter
+	  dHb = q1->_ipKinematic->getDR(); // kinematic hardening parameter derivative (dHb/dgamma)
+	  dHbdT = q1->_ipKinematic->getDRDT();  // make sure to normalise DRDT while defining in python file
+	}
+
+    double kk = 1./sqrt(1.+2.*q1->_nup*q1->_nup);
+    if(Hb>0.){
+
+    	static STensor3 term1, term2;
+    	STensorOperation::multSTensor3STensor43(q1->_backsig,q1->_DbackSigDF,term1);
+    	term2 = q1->_DgammaDF;
+    	term2 *= (-1./(2*Hb)*dHb*q1->_backsig.dotprod());
+
+    	dPsy_TVPdF = term1;
+    	dPsy_TVPdF += term2;
+    	dPsy_TVPdF *= 1./(pow(kk,1)*Hb); //pow(kk,2) debug
+
+    	double term3, term4;
+    	STensorOperation::doubleContractionSTensor3(q1->_backsig,q1->_DbackSigDT,term3);
+    	term4 = -(dHbdT + dHb*q1->_DgammaDT)/(2*Hb)*q1->_backsig.dotprod();
+    	dPsy_TVPdT = (term3+term4)/(pow(kk,1)*Hb); //pow(kk,2) debug
+
+    }
+
+
+	// 2. Isotropic Hardening
+
+    // Get Hc, etc.
+	double intR = q1->_ipCompression->getIntegR();
+	double sigc0 = q1->_ipCompression->getR0();  // Initial yield stress
+	intR -= sigc0*q1->_epspbarre;
+
+    double R(0.), dsigc0dT(0.), sigc(0.);
+    dsigc0dT = sigc0*_temFunc_Sy0->getDiff(T);
+    sigc = q1->_ipCompression->getR();
+
+    // Get R
+    R = sigc - sigc0;
+
+    dPsy_TVPdF += R*q1->_DgammaDF;
+    dPsy_TVPdT += (R*q1->_DgammaDT + _temFunc_Sy0->getDiff(T)/ _temFunc_Sy0->getVal(T)*intR - dsigc0dT*q1->_epspbarre);
+}
+
 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)
@@ -372,10 +426,11 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL
   
   double Hb(0.), dHb(0.), ddHb(0.), dHbdT(0.), ddHbdgammadT(0.), ddHbddT(0.);
   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
-    ddHbddT = Hb * q1->_ipKinematic->getDDRDTT();
+    Hb = q1->_ipKinematic->getR(); // kinematic hardening parameter
+    dHb = q1->_ipKinematic->getDR(); // kinematic hardening parameter derivative (dHb/dgamma)
+    dHbdT = q1->_ipKinematic->getDRDT();  // make sure to normalise DRDT while defining in python file
+    ddHbddT = q1->_ipKinematic->getDDRDTT();
+    ddHbdgammadT = q1->_ipKinematic->getDDRDT();
   }
   
   double eta(0.),Deta(0.),DetaDT(0.);
@@ -648,10 +703,11 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL
                 mlawNonLinearTVP::hardening(q0,q1,T);
                 mlawNonLinearTVP::getYieldCoefficients(q1,a);
                 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
-                    ddHbddT = Hb * q1->_ipKinematic->getDDRDTT();
+                    Hb = q1->_ipKinematic->getR(); // kinematic hardening parameter
+                    dHb = q1->_ipKinematic->getDR(); // kinematic hardening parameter derivative (dHb/dgamma ??)
+                    dHbdT = q1->_ipKinematic->getDRDT();  // make sure to normalise DRDT while defining in python file //NEW
+                    ddHbddT = q1->_ipKinematic->getDDRDTT();
+                    ddHbdgammadT = q1->_ipKinematic->getDDRDT();
                 }
                 //a.print("a update");
 
@@ -732,11 +788,12 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL
             // Correct Normal, H = expGN
             STensorOperation::decomposeDevTr(N,devN,trN);
 
-            // Get GammaN for mechSrcTVP
+            // Get GammaN for mechSrcTVP -> done within the loop already
+            /*
             STensorOperation::zero(GammaN);
             GammaN = N;
             GammaN *= Gamma;
-            q1->_GammaN = GammaN;
+            q1->_GammaN = GammaN;*/
             
             // Correct plastic deformation tensor
             STensorOperation::multSTensor3(expGN,Fp0,Fp1);
@@ -765,7 +822,7 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL
             Ge_Tensor = _I4;
             Ge_Tensor *= Ge*2; // *2 because the function doesnt do it
             Ge_Tensor += Bd_stiffnessTerm;
-            
+
             // Correct backstress;
             devX = (pow(kk,1)*Hb*Gamma*devN + devXn);  // pow(kk,2) DEBUG
             devX *= 1./Cxdev;
@@ -774,14 +831,14 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL
             q1->_backsig(0,0) += trX/3.;
             q1->_backsig(1,1) += trX/3.;
             q1->_backsig(2,2) += trX/3.;
-            
+
             // Correct Mandel
             q1->_ModMandel = devPhi;
             q1->_ModMandel += q1->_backsig;
             q1->_ModMandel(0,0) += (ptilde);
             q1->_ModMandel(1,1) += (ptilde);
             q1->_ModMandel(2,2) += (ptilde); */
-    
+
         } // 2nd if
         else{
             q1->getRefToDissipationActive() = false;
@@ -808,32 +865,6 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL
                     P(i,j) += Fe(i,k)*S(k,l)*Fpinv(j,l);
         }
 
-    // Elastic energy and Mullin's effect
-    double& Dpsi_DT = q1->getRefTo_Dpsi_DT();
-    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);
-    }
-    double eta_mullins = 1.;
-    
-    if (q1->_ipMullinsEffect != NULL){
-
-        // Put Stress in IP
-        q1->_P_cap = P;
-
-        // Modify Stress for mullins
-        eta_mullins = q1->_ipMullinsEffect->getEta();
-        P *= eta_mullins;
-        q1->_elasticEnergy *= eta_mullins;
-    }
-
     // Msg::Error(" Inside TVP, after correction, after updating q1->_elasticEnergy = %e, eta = %e !!",q1->_elasticEnergy, eta_mullins);
 
     // q1->getRefToElasticEnergy()=deformationEnergy(*q1);
@@ -865,8 +896,13 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL
 
     // ThermSrc and MechSrc after dPdF and dPdT - But need the following tensors for the mechSrcTVP function call
     static STensor3 DphiPDF;
+    STensorOperation::zero(DphiPDF);
     STensorOperation::zero(dFpdF); //dFpdT
-    static STensor43 DEeDCepr, DEeDF;
+    static STensor43 CeprToF, DEeDCepr, DEeDF, dGammaNdCepr; // conversion tensors
+    STensorOperation::zero(CeprToF);
+    STensorOperation::zero(DEeDCepr);
+    STensorOperation::zero(DEeDF);
+    STensorOperation::zero(dGammaNdCepr);
 
     // I didnt make this
     if (this->getMacroSolver()->getPathFollowingLocalIncrementType() == pathFollowingManager::DEFO_ENERGY){
@@ -974,7 +1010,7 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL
                 
         //4. get DdevphiDCepr and DphiPprDCepr; and DphiEprDCepr
         static STensor3 DphiPDCepr, DphiEDCepr, DphiEDdevPhi;
-        static STensor43 DdevphiDCepr;
+        static STensor43 DdevphiDCepr, DphiDCepr;
 
         DphiPDCepr = Dp_pr_DCepr;
         DdevphiDCepr = DdevMeprDCepr;
@@ -986,9 +1022,16 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL
 
         STensorOperation::multSTensor3STensor43(DphiEDdevPhi,DdevphiDCepr,DphiEDCepr);
         
+        DphiDCepr = DdevphiDCepr;
+        for (int i=0; i<3; i++)
+          for (int s=0; s<3; s++)
+            for (int k=0; k<3; k++)
+              for (int l=0; l<3; l++)
+            	  DphiDCepr(i,s,k,l) += _I(i,s)*DphiPDCepr(k,l);
+
         // 6. to 11. (inside if loop-> Gamma > 0.)
         static STensor3 dAdCepr, dfDCepr, dgDCepr, DGDCepr, DgammaDCepr, DtrNDCepr, dTrXdCepr;
-        static STensor43 DdevNDCepr, dFpDCepr, dDevXdCepr, dXdCepr, dGammaNdCepr;
+        static STensor43 DdevNDCepr, dFpDCepr, dDevXdCepr, dXdCepr;
           
         if (Gamma >0.){
             
@@ -1117,6 +1160,13 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL
             STensorOperation::multSTensor43(Dho2_u_inv,DdevphiDCepr_RHS,DdevphiDCepr);
             STensorOperation::multSTensor3STensor43(DphiEDdevPhi,DdevphiDCepr,DphiEDCepr);
            
+            DphiDCepr = DdevphiDCepr;
+            for (int i=0; i<3; i++)
+              for (int s=0; s<3; s++)
+                for (int k=0; k<3; k++)
+                  for (int l=0; l<3; l++)
+                	  DphiDCepr(i,s,k,l) += _I(i,s)*DphiPDCepr(k,l);
+
             //9. get DtrNDCepr DdevNdCepr
             DtrNDCepr = DphiPDCepr;
             DtrNDCepr *= (2.*_b);
@@ -1218,7 +1268,6 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL
         }
         
         // 12. get  CeprToF conversion tensor
-        static STensor43 CeprToF;
         for (int i=0; i<3; i++)
           for (int j=0; j<3; j++)
             for (int k=0; k<3; k++)
@@ -1249,13 +1298,16 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL
         // 15. get DgammaDF
         STensor3& DgammaDF = q1->_DgammaDF;
         STensor3& DGammaDF = q1->_DGammaDF;
+        STensor43& DphiDF = q1->_DphiDF;
         STensorOperation::zero(DgammaDF);
         STensorOperation::zero(DGammaDF);
+        STensorOperation::zero(DphiDF);
         if (Gamma > 0){
           STensorOperation::multSTensor3STensor43(DgammaDCepr,CeprToF,DgammaDF);
           STensorOperation::multSTensor3STensor43(DGDCepr,CeprToF,DGammaDF);
           STensorOperation::multSTensor43(dFpDCepr,CeprToF,dFpdF);
         }
+        STensorOperation::multSTensor43(DphiDCepr,CeprToF,DphiDF);
         
         // 16. Everything else - Conversion Tensors
         static STensor43 DinvFpDF, dCedF, dCeinvDF; 
@@ -1366,16 +1418,26 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL
         // 3. get dPhipprDT and dDevPhiprDT
         double dPhiPdT(0.);
         static STensor3 dDevPhiDT;
+        STensor3& DphiDT = q1->_DphiDT;
 
         dPhiPdT = dpMeprDT;
         dDevPhiDT = dDevMeprDT;
 
+        DphiDT = dDevPhiDT;
+        for (int i=0; i<3; i++)
+          for (int j=0; j<3; j++)
+        	  DphiDT(i,j) +=  dPhiPdT*_I(i,j);
+
         // 4. get dPhiEdT
         double dPhiEdT(0.);
         STensorOperation::doubleContractionSTensor3(DphiEDdevPhi,dDevPhiDT,dPhiEdT);
     
         // 5. to 11. (inside if loop-> Gamma > 0.)
-        double dAdT(0.), dfdT(0.), dgdT(0.), dGammaDT(0.), DgammaDT(0.), DtrNdT(0.), DtrXdT(0.);
+        double& dGammaDT = q1->_DGammaDT;
+        double& DgammaDT = q1->_DgammaDT;
+        dGammaDT = 0.; DgammaDT =0.;
+
+        double dAdT(0.), dfdT(0.), dgdT(0.), DtrNdT(0.), DtrXdT(0.);
         static STensor3 DdevNdT, dFpDT, DdevXdT;
 
         double eta(0.), Deta(0.), DetaDT(0.);
@@ -1489,7 +1551,12 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL
               }
               
             STensorOperation::multSTensor3STensor43(DdevphiDT_RHS,Dho2_u_inv,dDevPhiDT);
-              
+
+            DphiDT = dDevPhiDT;
+            for (int i=0; i<3; i++)
+              for (int j=0; j<3; j++)
+            	  DphiDT(i,j) +=  dPhiPdT*_I(i,j);
+
             // =============================== ROUND 2 - END ========================================================================= // 
             
             // 12. get DtrNdT, DdevNdT
@@ -1616,53 +1683,6 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL
               }
           }
         
-        
-        // Important conversion tensors
-        STensorOperation::zero(DEeDCepr);
-        STensorOperation::zero(DEeDF);
-            
-        // DEeDCepr to DEeDF
-        // STensorOperation::multSTensor43(_I4, DlnDCepr, DEeDCepr);
-        DEeDCepr = DlnDCepr;
-        DEeDCepr *= 0.5;
-        DEeDCepr -= dGammaNdCepr;
-        STensorOperation::multSTensor43(DEeDCepr, CeprToF, DEeDF);
-        
-        // Note: DEeDT = - dGammaNdT
-        
-        // Check DEeDF
-        
-        // Compute Tangents for Mullin's Effect
-        if (_mullinsEffect != NULL && q1->_ipMullinsEffect != NULL){
-            
-
-            // 1st Term
-            Tangent *= q1->_ipMullinsEffect->getEta();
-            dPdT *= q1->_ipMullinsEffect->getEta();
-            
-            // 2nd Term
-            static double Deta_mullins_DT(0.);
-            static STensor3 Deta_mullins_DF, Deta_mullins_DEe;
-            
-                // Deta_mullins_DF
-            STensorOperation::multSTensor3STensor43(q1->_DpsiDE,DEeDF,Deta_mullins_DF);
-            Deta_mullins_DF *= q1->_DmullinsDamage_Dpsi_cap;
-            
-                // Deta_mullins_DT
-            STensorOperation::doubleContractionSTensor3(q1->_DpsiDE,dGammaNdT,Deta_mullins_DT);
-            Deta_mullins_DT *= -q1->_DmullinsDamage_Dpsi_cap;
-            Deta_mullins_DT += q1->_DmullinsDamage_DT;
-            
-            for (int i=0; i<3; i++)
-                for (int j=0; j<3; j++){
-                    dPdT(i,j) += q1->_P_cap(i,j) * Deta_mullins_DT;
-                        for (int k=0; k<3; k++)
-                            for (int l=0; l<3; l++)
-                                Tangent(i,j,k,l) += q1->_P_cap(i,j) * Deta_mullins_DF(k,l);
-                }
-            
-        }
-        
         // TVP - flux derivatives
         // fluxT
         dfluxTdT = fluxT;
@@ -1733,14 +1753,14 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL
     double& Wm_TVE = q1->getRefToMechSrcTVE(); // TVE
 
     mechanicalSource = 0.;
-    // mlawNonLinearTVM::getTVEdCorKirDT(q0,q1,T0,T); // update dCorKirdT
+    double mechanicalSource_cap = 0.; // in case of mullins, undamaged mechanicalSource
     
-    // 1) ThermoElastic Heat -> _DcorKirDT needs to corrected for plasticity ( DcorKirDT = dcorKir_dT + dCorKirDEe * dEeDT 
+    // 1) ThermoElastic Heat -> _DcorKirDT needs to corrected for plasticity ( DcorKirDT = dcorKir_dT + dCorKirDEe * dEeDT )
     static STensor3 DEe;
     DEe = q1->_Ee;
     DEe -= q0->_Ee;
     if (this->getTimeStep() > 0){
-        mechanicalSource += (STensorOperation::doubledot(q1->_DcorKirDT,DEe)*T/this->getTimeStep());
+        // mechanicalSource += (STensorOperation::doubledot(q1->_DcorKirDT,DEe)*T/this->getTimeStep());
     }
 
     // 2) Viscoelastic Contribution to mechSrc
@@ -1748,27 +1768,70 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL
     STensor3& dWmdF_TVE = q1->getRefTodMechSrcTVEdF();
     static STensor3 dWmdE_TVE;
     mlawNonLinearTVM::getMechSource_nonLinearTVE_term(q0,q1,T0,T,Wm_TVE,stiff,dWmdE_TVE,dWmdT_TVE);
-    mechanicalSource += Wm_TVE;
+    // mechanicalSource += Wm_TVE;
 
     // 3) Viscoplastic Contribution to mechSrc
-    getMechSourceTVP(F0,F,q0,q1,T0,T,Fepr,Cepr,DphiPDF,&Wm_TVP);
+    double& dWmdT_TVP = q1->getRefTodMechSrcTVPdT();
+    STensor3& dWmdF_TVP = q1->getRefTodMechSrcTVPdF();
+    mlawNonLinearTVP::getMechSourceTVP(F0,F,q0,q1,T0,T,Fepr,Cepr,DphiPDF,Wm_TVP,dWmdF_TVP,dWmdT_TVP);
     mechanicalSource += Wm_TVP;
 
-    // Compute mechanicalSource for Mullin's Effect
+    // --------------------------------------------------------------------------------------------
+    // TVE energy and derivatives
+    double& Dpsi_DT = q1->getRefTo_Dpsi_DT();
+    STensor3& Dpsi_TVEdE = q1->getRefTo_Dpsi_DE();
+    q1->_elasticEnergy = mlawNonLinearTVM::freeEnergyMechanical(*q0,*q1,T0,T,&Dpsi_DT,&Dpsi_TVEdE);
+
+    // TVP energy and derivatives
+    double psi_TVP = freeEnergyPlasticity(q0,q1,T0,T);
+    double Dpsi_TVPdT(0.);
+    static STensor3 Dpsi_TVPdF;
+    freeEnergyPlasticityDerivatives(q0,q1,T0,T,Dpsi_TVPdF,Dpsi_TVPdT);
+    // q1->_elasticEnergy += psi_TVP; // Mullins TVP
+    // Dpsi_DT += Dpsi_TVPdT;  // add plastic part // Mullins TVP
+    Dpsi_DT -= dot(Dpsi_TVEdE,q1->_dGammaNdT); // add plastic dependency of elastic strain // Mullins TVP
+
+    // Mullins Effect
     if (_mullinsEffect != NULL && q1->_ipMullinsEffect != NULL){
+        mlawNonLinearTVM::calculateMullinsEffectScaler(q0, q1, T, &Dpsi_DT);
+    }
+    double eta_mullins = 1.;
 
+    if (q1->_ipMullinsEffect != NULL){
+
+        // Put Stress in IP
+        q1->_P_cap = P;
+
+        // Modify Stress for mullins
+        eta_mullins = q1->_ipMullinsEffect->getEta();
+        P *= eta_mullins;
+        // q1->_elasticEnergy *= eta_mullins;
+
+    	mechanicalSource_cap = mechanicalSource;
         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);
     
     if(stiff){
         
+    	// --------------------------------------------------------------------------------------------
+        // Important conversion tensors
+        STensorOperation::zero(DEeDCepr);
+        STensorOperation::zero(DEeDF);
+
+        // DEeDCepr to DEeDF
+        // STensorOperation::multSTensor43(_I4, DlnDCepr, DEeDCepr);
+        DEeDCepr = DlnDCepr;
+        DEeDCepr *= 0.5;
+        DEeDCepr -= dGammaNdCepr;
+        STensorOperation::multSTensor43(DEeDCepr, CeprToF, DEeDF);
+
+        // Note: DEeDT = - dGammaNdT
+        // --------------------------------------------------------------------------------------------
+
         // thermSrc and MechSrc Derivatives
         
         // thermal source derivatives
@@ -1814,27 +1877,88 @@ void mlawNonLinearTVENonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow_nonL
                         }
                 }
             }
-            STensorOperation::multSTensor3STensor43(dmechanicalSourceE,DEeDF,dmechanicalSourceF);
+            // STensorOperation::multSTensor3STensor43(dmechanicalSourceE,DEeDF,dmechanicalSourceF);
         
-            dmechanicalSourcedT += (STensorOperation::doubledot(q1->_DcorKirDT,DEe)/this->getTimeStep());
-            dmechanicalSourcedT += T*(STensorOperation::doubledot(DDcorKirDTT,DEe)/this->getTimeStep());      
+            // dmechanicalSourcedT += (STensorOperation::doubledot(q1->_DcorKirDT,DEe)/this->getTimeStep());
+            // dmechanicalSourcedT += T*(STensorOperation::doubledot(DDcorKirDTT,DEe)/this->getTimeStep());
+            // dmechanicalSourcedT -= T*(STensorOperation::doubledot(q1->_DcorKirDT,q1->_dGammaNdT)/this->getTimeStep());
         }
   
         // TVE Term
         STensorOperation::multSTensor3STensor43(dWmdE_TVE, DEeDF, dWmdF_TVE);
         for (int i=0; i<3; i++)
             for (int j=0; j<3; j++)
-                dWmdT_TVE += - dWmdE_TVE(i,j) *  q1->_dGammaNdT(i,j); // the first term in dWmdT_TVE from pure TVE temperature dependency is obtained above.
+                dWmdT_TVE += - dWmdE_TVE(i,j) *  q1->_dGammaNdT(i,j); // the second term in dWmdT_TVE from dependency of Ee on plasticity
+
+        // dmechanicalSourceF += dWmdF_TVE;
+        // dmechanicalSourcedT += dWmdT_TVE;
+
 
         // TVP Term
-        double& dWmdT_TVP = q1->getRefTodMechSrcTVPdT();
-        STensor3& dWmdF_TVP = q1->getRefTodMechSrcTVPdF();
-        getMechSourceTVP(F0,F,q0,q1,T0,T,Fepr,Cepr,DphiPDF,NULL,&dWmdF_TVP,&dWmdT_TVP);
-
-        dmechanicalSourceF += dWmdF_TVE;
-        dmechanicalSourcedT += dWmdT_TVE;
-        dmechanicalSourceF += dWmdF_TVP; 
-        dmechanicalSourcedT += dWmdT_TVP; 
+        dmechanicalSourceF += dWmdF_TVP;
+        dmechanicalSourcedT += dWmdT_TVP;
+
+    	// Mullins Effect Derivatives
+
+        // Compute Tangents for Mullin's Effect
+        if (_mullinsEffect != NULL && q1->_ipMullinsEffect != NULL){
+
+            // 1st Term
+            Tangent *= q1->_ipMullinsEffect->getEta();
+            dPdT *= q1->_ipMullinsEffect->getEta();
+            dmechanicalSourceF *= q1->_ipMullinsEffect->getEta();
+            dmechanicalSourcedT *= q1->_ipMullinsEffect->getEta();
+
+
+            // 2nd Term
+            double Deta_mullins_DT(0.);
+            static STensor3 Deta_mullins_DF, Deta_mullins_DEe;
+
+                // Deta_mullins_DF
+            STensorOperation::multSTensor3STensor43(q1->_DpsiDE,DEeDF,Deta_mullins_DF);
+            Deta_mullins_DF *= q1->_DmullinsDamage_Dpsi_cap; // elastic part
+            // Deta_mullins_DF += Dpsi_TVPdF*q1->_DmullinsDamage_Dpsi_cap; // plastic part // Mullins TVP
+
+                // Deta_mullins_DT
+            // STensorOperation::doubleContractionSTensor3(q1->_DpsiDE,q1->_dGammaNdT,Deta_mullins_DT); // Remove - Mullins TVP
+            // Deta_mullins_DT *= -q1->_DmullinsDamage_Dpsi_cap; // Remove - Mullins TVP
+            // Deta_mullins_DT += q1->_DmullinsDamage_DT; // Remove - Mullins TVP
+            Deta_mullins_DT = q1->_DmullinsDamage_DT; // + q1->_DmullinsDamage_Dpsi_cap*q1->_DpsiDT; // Mullins TVP
+
+            // 2nd Term - 1st PK
+            for (int i=0; i<3; i++)
+                for (int j=0; j<3; j++){
+                    dPdT(i,j) += q1->_P_cap(i,j) * Deta_mullins_DT;
+                        for (int k=0; k<3; k++)
+                            for (int l=0; l<3; l++)
+                                Tangent(i,j,k,l) += q1->_P_cap(i,j) * Deta_mullins_DF(k,l);
+                }
+
+
+            // 2nd Term - MechSrc
+            dmechanicalSourcedT += mechanicalSource_cap*Deta_mullins_DT;
+            for (int i=0; i<3; i++)
+                for (int j=0; j<3; j++){
+                    dmechanicalSourceF(i,j) += mechanicalSource_cap*Deta_mullins_DF(i,j);
+                }
+
+            static STensor3 DDpsiNew_DpsiMaxDF, DpsiMax_DF;
+            STensorOperation::multSTensor3STensor43(q1->_DpsiDE,DEeDF,DDpsiNew_DpsiMaxDF);
+            STensorOperation::multSTensor3STensor43(q1->_DpsiDE,DEeDF,DpsiMax_DF);
+            DDpsiNew_DpsiMaxDF *= q1->_ipMullinsEffect->getDDpsiNew_DpsiMaxDpsi();
+            DpsiMax_DF *= q1->_ipMullinsEffect->getDpsiMax_Dpsi();
+
+            if (this->getTimeStep() > 0){
+                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();
+                    }
+            }
+
+        } // mullin's
     }
 
 }
@@ -2068,9 +2192,11 @@ void mlawNonLinearTVENonLinearTVP::getIterated_DPhi(const double& T0, const doub
     // At every iteration it will calculate Ee, corKir and N
     
 
+  // Initialise GammaN in IP -> for mechSrc later
+  STensor3& GammaN = q1->getRefToGammaN();
+
   // Initialise Hinv  
-  static STensor3 Hinv, GammaN;
-  static STensor3 Ceinvpr;
+  static STensor3 Hinv, Ceinvpr;
   STensorOperation::inverseSTensor3(expGN,Hinv);
   STensorOperation::inverseSTensor3(Cepr,Ceinvpr);
 
@@ -2126,7 +2252,7 @@ void mlawNonLinearTVENonLinearTVP::getIterated_DPhi(const double& T0, const doub
   // Get Hb
   double Hb(0.);
   if (q1->_ipKinematic != NULL)
-        Hb = q1->_ipKinematic->getDR(); // kinematic hardening parameter
+        Hb = q1->_ipKinematic->getR(); // kinematic hardening parameter
   double kk = (1./sqrt(1.+2.*q1->_nup*q1->_nup));
   
   // Initialise backStress
@@ -2148,6 +2274,9 @@ void mlawNonLinearTVENonLinearTVP::getIterated_DPhi(const double& T0, const doub
     for (int j=0; j<3; j++)
       J(i,j) += Phi(i,j) - MS(i,j) + q1->_backsig(i,j);
 
+  static STensor3 J0; //debug
+  J0 = J; //debug
+
   // Initialise J_tol
   double J_tol = 0.;
   J_tol = J.norm0();
@@ -2177,7 +2306,8 @@ void mlawNonLinearTVENonLinearTVP::getIterated_DPhi(const double& T0, const doub
   int ite = 0;
   int maxite = 100;
 
-  double tol = 1e-9;
+  double tol = _stressIteratorTol; // 1e-6;
+
   while (fabs(J_tol) > tol or ite <1){
 
 	  // numerical Dho4inv (Jacobian dJ/dPhi)
@@ -2318,7 +2448,7 @@ void mlawNonLinearTVENonLinearTVP::getIterated_DPhi(const double& T0, const doub
       // update mandel 
       getModifiedMandel(Ce, q0, q1);
       MS = q1->_ModMandel;
-  
+
       // update backStress
       STensorOperation::decomposeDevTr(N,devN,trN);
       devX = pow(kk,1)*Hb*Gamma*devN + devXn;           // pow(kk,2) DEBUG
@@ -2352,6 +2482,25 @@ void mlawNonLinearTVENonLinearTVP::getIterated_DPhi(const double& T0, const doub
         }
       }*/
 
+      // debug
+      /*
+	  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++)
+	            dJdPhi_plus(k,l,i,j) = (J(k,l) - J0(k,l))/(_perturbationfactor);
+
+	   STensorOperation::inverseSTensor43(dJdPhi_plus,dJdPhi_plus_inv);
+	   J0 = J;*/
+
+	   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++){
+		        	// Msg::Error(" Dho2inv(%d,%d,%d,%d)=%d",i,j,k,l,Dho2inv(i,j,k,l));
+		        	// Msg::Error(" dJdPhi_plus_inv(%d,%d,%d,%d)=%d",i,j,k,l,dJdPhi_plus_inv(i,j,k,l));
+		        }
+
       J_tol = J.norm0();
       J_tol/=(_K+_G);
       // J_tol/=(1.e+10);
@@ -2364,8 +2513,9 @@ void mlawNonLinearTVENonLinearTVP::getIterated_DPhi(const double& T0, const doub
       if (fabs(J_tol) <_tol) break;
 
       if(ite > maxite){
-        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.);
+    	  Msg::Error("No convergence for iterated Phi mlawNonLinearTVENonLinearTVP nonAssociatedFlow iter = %d, J_tol = %e!!",ite,J_tol);
+    	  // Msg::Error("Exiting the function Iterated Phi!!");
+    	  // Phi(0,0) = Phi(1,1) = Phi(2,2) = sqrt(-1.);
        return;
        }
      } // while
@@ -2398,10 +2548,11 @@ void mlawNonLinearTVENonLinearTVP::TEST_predictorCorrector_TVP_nonAssociatedFlow
 
   double Hb(0.), dHb(0.), ddHb(0.), dHbdT(0.), ddHbdgammadT(0.), ddHbddT(0.);
   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
-    ddHbddT = Hb * q1->_ipKinematic->getDDRDTT();
+    Hb = q1->_ipKinematic->getR(); // kinematic hardening parameter
+    dHb = q1->_ipKinematic->getDR(); // kinematic hardening parameter derivative (dHb/dgamma)
+    dHbdT = q1->_ipKinematic->getDRDT();  // make sure to normalise DRDT while defining in python file //NEW
+    ddHbddT = q1->_ipKinematic->getDDRDTT();
+    ddHbdgammadT = q1->_ipKinematic->getDDRDT();
   }
 
   double eta(0.),Deta(0.),DetaDT(0.);
@@ -2639,10 +2790,11 @@ void mlawNonLinearTVENonLinearTVP::TEST_predictorCorrector_TVP_nonAssociatedFlow
                 mlawNonLinearTVP::hardening(q0,q1,T);
                 mlawNonLinearTVP::getYieldCoefficients(q1,a);
                 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
-                    ddHbddT = Hb * q1->_ipKinematic->getDDRDTT();
+                    Hb = q1->_ipKinematic->getR(); // kinematic hardening parameter
+                    dHb = q1->_ipKinematic->getDR(); // kinematic hardening parameter derivative (dHb/dgamma ??)
+                    dHbdT = q1->_ipKinematic->getDRDT();  // make sure to normalise DRDT while defining in python file //NEW
+                    ddHbddT = q1->_ipKinematic->getDDRDTT();
+                    ddHbdgammadT = q1->_ipKinematic->getDDRDT();
                 }
                 //a.print("a update");
 
diff --git a/NonLinearSolver/materialLaw/mlawNonLinearTVENonLinearTVP.h b/NonLinearSolver/materialLaw/mlawNonLinearTVENonLinearTVP.h
index 981f958f0050801dd03f7826850831f351619b60..35e26d4bedf3070726ad9676bba1cae7b2b2f600 100644
--- a/NonLinearSolver/materialLaw/mlawNonLinearTVENonLinearTVP.h
+++ b/NonLinearSolver/materialLaw/mlawNonLinearTVENonLinearTVP.h
@@ -17,9 +17,12 @@
 class mlawNonLinearTVENonLinearTVP : public mlawNonLinearTVP{
 
     protected:
+		double _stressIteratorTol;
 
     protected:
-		virtual double freeEnergyPlasticity(const IPNonLinearTVP *q0, IPNonLinearTVP *q1, const double T0, const double T) const;
+		virtual double freeEnergyPlasticity(const IPNonLinearTVP *q0, IPNonLinearTVP *q1, const double& T0, const double& T) const;
+
+		virtual void freeEnergyPlasticityDerivatives(const IPNonLinearTVP *q0, IPNonLinearTVP *q1, const double& T0, const double& T, STensor3& dPsy_TVPdF, double& dPsy_TVPdT) 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,
@@ -137,7 +140,7 @@ class mlawNonLinearTVENonLinearTVP : public mlawNonLinearTVP{
     public:
         mlawNonLinearTVENonLinearTVP(const int num, const double E, const double nu, const double rho, const double tol,
                          const double Tinitial, const double Alpha, const double KThCon, const double Cp,
-                         const bool matrixbyPerturbation = false, const double pert = 1e-8, const bool thermalEstimationPreviousConfig = true);
+                         const bool matrixbyPerturbation = false, const double pert = 1e-8, const double stressIteratorTol = 1.e-9, const bool thermalEstimationPreviousConfig = true);
 
         #ifndef SWIG
         mlawNonLinearTVENonLinearTVP(const mlawNonLinearTVENonLinearTVP& src);
diff --git a/NonLinearSolver/materialLaw/mlawNonLinearTVM.cpp b/NonLinearSolver/materialLaw/mlawNonLinearTVM.cpp
index e235103549c8c13c2e9b3a05870bfc8ab9d4b9e4..412ae54f97fa561f9c56149936fd8b353f0a2a95 100644
--- a/NonLinearSolver/materialLaw/mlawNonLinearTVM.cpp
+++ b/NonLinearSolver/materialLaw/mlawNonLinearTVM.cpp
@@ -190,13 +190,13 @@ 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){
+void mlawNonLinearTVM::setCorrectionsAllBranchesTVE(const int i, const double V0, const double V1, const double V2, const double D0, 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;
+	  _V0[i-1] = V0; _V1[i-1] = V1; _V2[i-1] = V2; _D0[i-1] = D0; _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);
+    Msg::Info("setting: element=%d, V0 = %e, V1 = %e, V2 = %e, D0 = %e, D1 = %e, D2 = %e",i-1,V0,V1,V2,D0,D1,D2);
   }
 };
 
@@ -489,22 +489,23 @@ double mlawNonLinearTVM::freeEnergyMechanical(const IPNonLinearTVM& q0, IPNonLin
                 // _intA, _intB have CTasymm
     
                 // Regularising function
-                double m = _tensionCompressionRegularisation;
-                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.)*(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;
+                // double m = _tensionCompressionRegularisation;
+                // 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.)*(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;
+                // retains only the A and B integrands assuming integrands1 = integrands2 -> cant divide by CTasymm if integrands1 != integrands2
                 
                 (*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);
+                (*DpsiDT) += (KT*q._DintA + 2*GT*q._DintB)*(-3*dAlphaTdT*(T-_Tinitial)-3*AlphaT); // psy_inf*dCTasymmDtrE*(-3*dAlphaTdT*(T-_Tinitial)-3*AlphaT);
                 
                 (*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);
+                        (*DpsiDE)(j,k) += (KT*q._DintA + 2*GT*q._DintB)*_I(j,k); //psy_inf*dCTasymmDtrE*_I(j,k);
             }
         }
         
@@ -610,12 +611,14 @@ double mlawNonLinearTVM::freeEnergyMechanical(const IPNonLinearTVM& q0, IPNonLin
                         (*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)); // * CTasymm;
                                     
-                        (*DpsiDT) += (_Ki[i]*q._intAv_TVE_vector[i] + 2*_Gi[i]*q._intBd_TVE_vector[i])/CTasymm * dCTasymmDtrE * dTrEei_DT;
+                        // (*DpsiDT) += (_Ki[i]*q._intAv_TVE_vector[i] + 2*_Gi[i]*q._intBd_TVE_vector[i])/CTasymm * dCTasymmDtrE * dTrEei_DT;
+                        (*DpsiDT) += (_Ki[i]*q._DintAv_TVE_vector[i] + 2*_Gi[i]*q._DintBd_TVE_vector[i]) * 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])/CTasymm * dCTasymmDtrE * exp_mid_k*_I(j,k);
+                                // (*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);
+                                (*DpsiDE)(j,k) += (_Ki[i]*q._DintAv_TVE_vector[i] + 2.*_Gi[i]*q._DintBd_TVE_vector[i])* 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; 
@@ -676,13 +679,13 @@ 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, double* psiInfCorrector) const{
+                                                 double *dB_dTrEe, double *dB_dTdTrEe, double* psiInfCorrector, double* DintA, double* DintB) const{
     
     if (_extraBranchNLType != TensionCompressionRegularisedType && _extraBranchNLType != hyper_exp_TCasymm_Type){
-        mlawHyperViscoElastic::evaluatePhiPCorrection(trE,devE,A_v,dA_vdE,intA,B_d,dB_vddev,intB,NULL,psiInfCorrector);
+        mlawHyperViscoElastic::evaluatePhiPCorrection(trE,devE,A_v,dA_vdE,intA,B_d,dB_vddev,intB,NULL,psiInfCorrector,DintA,DintB);
     }
     else{
-        mlawHyperViscoElastic::evaluatePhiPCorrection(trE,devE,A_v,dA_vdE,intA,B_d,dB_vddev,intB,dB_dTrEe,psiInfCorrector);
+        mlawHyperViscoElastic::evaluatePhiPCorrection(trE,devE,A_v,dA_vdE,intA,B_d,dB_vddev,intB,dB_dTrEe,psiInfCorrector,DintA,DintB);
         // *dB_dTrEe *= _temFunc_elasticCorrection_Shear->getVal(T);
         // if(dB_dTdTrEe!=NULL){
             // *dB_dTdTrEe = (*dB_dTrEe)*_temFunc_elasticCorrection_Bulk->getDiff(T);
@@ -745,15 +748,15 @@ void mlawNonLinearTVM::extraBranchLaw(const STensor3& Ee, const double& T, const
     double A(0.), B(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.);
+    double intA(0.), intB(0.), dA_dT(0.), dB_dT(0.), ddA_dTT(0.), ddB_dTT(0.), DintA(0.), DintB(0.);
     
     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);
+                                        NULL, NULL, &psiInfCorrector, &DintA, &DintB);
     }
     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, &psiInfCorrector);
+                                        &dB_dTrEe, &dB_dTdTrEe, &psiInfCorrector, &DintA, &DintB);
     }
     
     if (A <= -1. + 1.e-5){ // saturated
@@ -762,6 +765,7 @@ void mlawNonLinearTVM::extraBranchLaw(const STensor3& Ee, const double& T, const
         intA += A*0.5 *(trEe*trEe-trEe_0*trEe_0);
     }
     q1->_intA = intA;
+    q1->_DintA = DintA;
     
     if (B <= -1. + 1.e-5){ // saturated
         static STensor3 devEe_0;
@@ -771,6 +775,7 @@ void mlawNonLinearTVM::extraBranchLaw(const STensor3& Ee, const double& T, const
         intA += B*0.5 *(devEe.dotprod()-devEe_0.dotprod());
     }
     q1->_intB = intB;
+    q1->_DintB = DintB;
     
     q1->_psiInfCorrector = psiInfCorrector; // Additional term to correct thermal expansion term in free energy
     
@@ -888,7 +893,7 @@ void mlawNonLinearTVM::extraBranchLaw(const STensor3& Ee, const double& T, const
 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{
+						double& DintA, double& DintB, double* dB_dTrEe) const{
 
     // Similar code to previous implementations of extraBranch except we dont do -1 + Av, have to make this a unique implementation.
     
@@ -904,6 +909,7 @@ void mlawNonLinearTVM::extraBranch_nonLinearTVE(const int i, const STensor3& Ee,
     // int(1/Bd*dB_dDevEe dDevEe) = Gi*intB2     // For 2nd convolution integral and stiffness  --> actually it is, int(1/Gi * dGi/dDevEe dDevEe)
     // ddA_dTdTrEe - mechSrc??
     // ddB_dTdDevEe - mechSrc??
+	// DintA, DintB - the additional derivatives of the sigmoid in the free energy approximation associated with tension-compression assymmetry
     
     static STensor3 dev;
     double tr;
@@ -1032,6 +1038,9 @@ void mlawNonLinearTVM::extraBranch_nonLinearTVE(const int i, const STensor3& Ee,
             integrand -= ( 1./getXiVolumeCorrection()*sqrt(getZetaVolumeCorrection()) ); // value at trEe = 0.
             intA = sigmoid*integrand + _compCorrection*(1.-sigmoid)*integrand;
             intA *= getVolumeCorrection();
+
+            DintA = (m*expmtr/pow((1.+expmtr),2.))*integrand - _compCorrection*(m*expmtr/pow((1.+expmtr),2.))*integrand;
+            DintA *= getVolumeCorrection();
         }
         else{
             intA = 1.;
@@ -1056,6 +1065,9 @@ void mlawNonLinearTVM::extraBranch_nonLinearTVE(const int i, const STensor3& Ee,
             integrand -= (1./getThetaDevCorrection()*sqrt(getPiDevCorrection()) );  // value at devEe = 0.   
             intB = sigmoid*integrand + _compCorrection*(1.-sigmoid)*integrand;
             intB *= getDevCorrection();
+
+            DintB = (m*expmtr/pow((1.+expmtr),2.))*integrand - _compCorrection*(m*expmtr/pow((1.+expmtr),2.))*integrand;
+            DintB *= getDevCorrection();
         }
         else{
             intB = 1.;
@@ -1073,46 +1085,51 @@ void mlawNonLinearTVM::extraBranch_nonLinearTVE(const int i, const STensor3& Ee,
             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();
+            double x1 = _V1[i]*tr*tr + _V2[i];
+            double x2 = _V4[i]*tr*tr + _V5[i];
+            Av = sigmoid*(1./sqrt(x1)+_V0[i]) + (1.-sigmoid)*_Ci[i]*(1/sqrt(x2)+_V3[i]);
 
-            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();
+            dA_dTrEe = - sigmoid*_V1[i]*tr/pow(x1,1.5) - (1.-sigmoid)*(_V4[i]*_Ci[i]*tr/pow(x2,1.5))
+                       + (m*expmtr/pow((1.+expmtr),2.))*(1./sqrt(x1)+_V0[i]) - (_Ci[i]*m*expmtr/pow((1.+expmtr),2.))*(1/sqrt(x2)+_V3[i]);
 
-            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();
+            if(_V1[i]>0. && _V4[i]>0.){
+                double integrand1 = 1./_V1[i]*sqrt(x1) + _V0[i]*tr*tr/2.; // integral of A_v * trEe
+                double integrand2 = 1./_V4[i]*sqrt(x2) + _V3[i]*tr*tr/2.;
+                integrand1 -= ( 1./_V1[i]*sqrt(_V2[i]) ); // value at trEe = 0.
+                integrand2 -= ( 1./_V4[i]*sqrt(_V5[i]) ); // value at trEe = 0.
+                intA = sigmoid*integrand1 + _Ci[i]*(1.-sigmoid)*integrand2;
+
+                DintA = (m*expmtr/pow((1.+expmtr),2.))*integrand1 - _Ci[i]*(m*expmtr/pow((1.+expmtr),2.))*integrand2;
             }
             else{
                 intA = 1.;
+                // Msg::Error(" Inside extraBranch_nonLinearTVE Type 4, _V1 = 0. or _V4 = 0., incompatibility with Mullin's effect");
             }
 
             // Bd
-            double y = _D1[i]*dev.dotprod() + _D2[i];
-            Bd = sigmoid*1./sqrt(y) + (1.-sigmoid)*(_Ci[i]/sqrt(y));
-            Bd *= getDevCorrection();
+            double y1 = _D1[i]*dev.dotprod() + _D2[i];
+            double y2 = _D4[i]*dev.dotprod() + _D5[i];
+            Bd = sigmoid*(1./sqrt(y1)+_D0[i]) + (1.-sigmoid)*_Ci[i]*(1/sqrt(y2)+_D3[i]);
 
             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();
+            dB_dDevEe *= (-sigmoid*_D1[i]/pow(y1,1.5) - (1.-sigmoid)*(_D4[i]*_Ci[i]/pow(y2,1.5)));
 
             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();
+                *dB_dTrEe = ( (m*expmtr/pow((1.+expmtr),2.))*(1./sqrt(y1)+_D0[i]) - (_Ci[i]*m*expmtr/pow((1.+expmtr),2.))*(1/sqrt(y2)+_D3[i]) );
             }
-            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();
+            if(_D1[i]>0. && _D4[i]>0.){
+                double integrand1 = 1./_D1[i]*sqrt(y1) + _D0[i]*dev.dotprod()/2.;  // integral of B_d * devEe
+                double integrand2 = 1./_D4[i]*sqrt(y2) + _D3[i]*dev.dotprod()/2.;
+                integrand1 -= ( 1./_D1[i]*sqrt(_D2[i]) );  // value at devEe = 0.
+                integrand2 -= ( 1./_D4[i]*sqrt(_D5[i]) );  // value at devEe = 0.
+                intB = sigmoid*integrand1 + _Ci[i]*(1.-sigmoid)*integrand2;
+
+                DintB = (m*expmtr/pow((1.+expmtr),2.))*integrand1 - _Ci[i]*(m*expmtr/pow((1.+expmtr),2.))*integrand2;
             }
             else{
                 intB = 1.;
+                // Msg::Error(" Inside extraBranch_nonLinearTVE Type 4, _D1 = 0. or _D4 = 0., incompatibility with Mullin's effect");
             }
         }
     /*else if (_ExtraBranch_TVE_option == 5){
@@ -1186,7 +1203,6 @@ void mlawNonLinearTVM::extraBranch_nonLinearTVE(const int i, const STensor3& Ee,
             // 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
@@ -1208,6 +1224,8 @@ void mlawNonLinearTVM::extraBranch_nonLinearTVE(const int i, const STensor3& Ee,
                 integrand1 -= ( 1./_V1[i]*sqrt(_V2[i]) ); // value at trEe = 0.
                 intA = sigmoid*(integrand1 + integrand2) + _Ci[i]*(1.-sigmoid)*integrand1;
                 // intA *= getVolumeCorrection();
+
+                DintA = (m*expmtr/pow((1.+expmtr),2.))*integrand1 - _Ci[i]*(m*expmtr/pow((1.+expmtr),2.))*integrand2;
             }
             else{
                 intA = 1.;
@@ -1237,6 +1255,8 @@ void mlawNonLinearTVM::extraBranch_nonLinearTVE(const int i, const STensor3& Ee,
                 integrand1 -= (1./_D1[i]*sqrt(_D2[i]) );  // value at devEe = 0.
                 intB = sigmoid*(integrand1 + integrand2) + _Ci[i]*(1.-sigmoid)*integrand1;
                 // intB *= getDevCorrection();
+
+                DintB = (m*expmtr/pow((1.+expmtr),2.))*integrand1 - _Ci[i]*(m*expmtr/pow((1.+expmtr),2.))*integrand2;
             }
             else{
                 intB = 1.;
@@ -1331,20 +1351,22 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor(const STensor3& Ee, const STe
         
         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.);
+        double intA(0.), intB(0.), dA_dT(0.), dB_dT(0.), DintA(0.), DintB(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);
+            evaluateElasticCorrection(eff_trEe, devEe, T1, A, dA_dTrEe, intA, dA_dT, B, dB_dDevEe, intB, dB_dT, NULL ,NULL, NULL, NULL, NULL, &psiInfCorrector, &DintA, &DintB);
         }
         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);
+            evaluateElasticCorrection(eff_trEe, devEe, T1, A, dA_dTrEe, intA, dA_dT, B, dB_dDevEe, intB, dB_dT, NULL ,NULL, NULL, NULL, &dB_dTrEe, &psiInfCorrector, &DintA, &DintB);
             q1->_dBd_dTrEe = dB_dTrEe;
         }
     
         q1->_intA = intA;
         q1->_intB = intB;
+        q1->_DintA = DintA;
+        q1->_DintB = DintB;
         q1->_psiInfCorrector = psiInfCorrector; // Additional term to correct thermal expansion term in free energy
         q1->_elasticBulkPropertyScaleFactor = A; 
         q1->_elasticShearPropertyScaleFactor = B; 
@@ -1391,7 +1413,7 @@ 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.);
+        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.),DintA(0.),DintB(0.);
         static STensor3 intB1,intB2,dB_dDevEe,ddB_dTdDevEe;
         STensorOperation::zero(intB1);
         STensorOperation::zero(intB2);
@@ -1405,7 +1427,7 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor(const STensor3& Ee, const STe
             // NEW
             
             if(_ExtraBranch_TVE_option == 1){
-                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);
+                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,DintA,DintB);
                 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
@@ -1509,12 +1531,12 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor(const STensor3& Ee, const STe
                     branchElasticStrain(2,2) += 1./3.*q1->_B[i];
                     if (_ExtraBranch_TVE_option == 2){
                         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);
+                                                                Bd,dB_dDevEe,intB,intB1,intB2,dB_dT,ddB_dTT,ddB_dTdDevEe,DintA,DintB);
                     }
                     else{
                         double dB_dTrEe(0.);
                         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);
+                                                                Bd,dB_dDevEe,intB,intB1,intB2,dB_dT,ddB_dTT,ddB_dTdDevEe,DintA,DintB,&dB_dTrEe);
                         q1->_dBd_dTrEe_TVE_vector[i] = dB_dTrEe;
                     }
                     
@@ -1524,6 +1546,8 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor(const STensor3& Ee, const STe
                     q1->_dBd_dDevEe_TVE_vector[i] = dB_dDevEe;
                     q1->_intAv_TVE_vector[i] = intA;
                     q1->_intBd_TVE_vector[i] = intB;
+                    q1->_DintAv_TVE_vector[i] = DintA;
+                    q1->_DintBd_TVE_vector[i] = DintB;
                     
                     // Evaluate Bd_stiffnessTerm and/or Bd_stiffnessTerm2
                     for (int k=0; k<3; k++)
@@ -1694,6 +1718,11 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor(const STensor3& Ee, const STe
                                         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 (_ExtraBranch_TVE_option == 3 || _ExtraBranch_TVE_option == 4 || _ExtraBranch_TVE_option == 5){
+                                    	 DDA_DTDdevE[i](k,l,r,s) += exp_mid_g*q1->_dBd_dTrEe_TVE_vector[i]*dTrEei_DT*_I4(k,l,r,s);
+                                    }
+
                                 }
                         }
                  } // if - extraBranchTVE_option
@@ -1952,6 +1981,9 @@ void mlawNonLinearTVM::getMechSource_nonLinearTVE_term(const IPNonLinearTVM *q0,
     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_trEe = trEe - 3.*(AlphaT*(T-_Tinitial));
+    double eff_trEe0 = trEe0 - 3.*(AlphaT0*(T0-_Tinitial));
+    double Deff_trEe_DT = -3.*(DAlphaDT*(T-_Tinitial) + AlphaT);
     double eff_trDE = q1->_trDE - 3.*(AlphaT*(T-_Tinitial) - AlphaT0*(T0-_Tinitial));
     double Deff_trDE_DT = -3.*(DAlphaDT*(T-_Tinitial) + AlphaT);
     // NEW
@@ -2010,12 +2042,12 @@ void mlawNonLinearTVM::getMechSource_nonLinearTVE_term(const IPNonLinearTVM *q0,
                     for (int l=0; l<3; l++){
                         Qi[i](k,l) = _Ki[i]*q1->_Av_TVE_vector[i]*q1->_B[i]*_I(k,l) + 2*_Gi[i]*q1->_Bd_TVE_vector[i]*q1->_A[i](k,l); 
                         DQiDT[i](k,l) = _Ki[i]*q1->_DB_DT[i]*_I(k,l) + 2*_Gi[i]*q1->_DA_DT[i](k,l); 
-                        dot_Gammai[i](k,l) = 1/3*(trEe-q1->_B[i] - trEe0 + q0->_B[i])*_I(k,l) + (devEe(k,l)-q1->_A[i](k,l) - devEe0(k,l) + q0->_A[i](k,l) );
+                        dot_Gammai[i](k,l) = 1/3*(eff_trEe - q1->_B[i] - eff_trEe0 + q0->_B[i])*_I(k,l) + (devEe(k,l)-q1->_A[i](k,l) - devEe0(k,l) + q0->_A[i](k,l) ); // NEW
                     }
                 }
                 if (this->getTimeStep() > 0){
                     dot_Gammai[i] *= 1/this->getTimeStep();
-                    Wm += STensorOperation::doubledot(Qi[i],dot_Gammai[i]); //  - T*STensorOperation::doubledot(DQiDT[i],dot_Gammai[i]);
+                    Wm += STensorOperation::doubledot(Qi[i],dot_Gammai[i]); //  - T*STensorOperation::doubledot(DQiDT[i],dot_Gammai[i]); // OLD
                 }
         
                 // TVE Mechanical Source Term derivatives
@@ -2051,7 +2083,7 @@ void mlawNonLinearTVM::getMechSource_nonLinearTVE_term(const IPNonLinearTVM *q0,
                     for (int k=0; k<3; k++){
                         for (int l=0; l<3; l++){
                             DDQiDTT[i](k,l) = _Ki[i]*q1->_DDB_DTT[i]*_I(k,l) + 2*_Gi[i]*q1->_DDA_DTT[i](k,l); 
-                            dot_DGammaiDT[i](k,l) = - 1/3*dTrEei_DT*_I(k,l) - dDevEei_DT(k,l);
+                            dot_DGammaiDT[i](k,l) = 1/3*(Deff_trEe_DT-dTrEei_DT)*_I(k,l) - dDevEei_DT(k,l); // NEW
                             for (int r=0; r<3; r++){
                                 for (int s=0; s<3; s++){
                                     DQiDEe[i](k,l,r,s) = _Ki[i]*q1->_DB_DtrE[i]*_I(k,l)*_I(r,s);
@@ -2080,15 +2112,15 @@ void mlawNonLinearTVM::getMechSource_nonLinearTVE_term(const IPNonLinearTVM *q0,
                         
                         
                         // dWmdT += (STensorOperation::doubledot(Qi[i],dot_DGammaiDT[i]) - T*STensorOperation::doubledot(DQiDT[i],dot_DGammaiDT[i]) 
-                        //        -  T*STensorOperation::doubledot(DDQiDTT[i],dot_Gammai[i]));
+                        //        -  T*STensorOperation::doubledot(DDQiDTT[i],dot_Gammai[i])); // OLD
                         
-                        dWmdT += (STensorOperation::doubledot(DQiDT[i][i],dot_Gammai[i]) + STensorOperation::doubledot(Qi[i],dot_DGammaiDT[i]));
+                        dWmdT += (STensorOperation::doubledot(DQiDT[i],dot_Gammai[i]) + STensorOperation::doubledot(Qi[i],dot_DGammaiDT[i]));
                         
                         for (int k=0; k<3; k++)
                             for (int l=0; l<3; l++)
                                 for (int r=0; r<3; r++)
                                     for (int s=0; s<3; s++){
-                                    // dWmdE(r,s) += ((DQiDEe[i](k,l,r,s) - T*DDQiDTDEe[i](k,l,r,s))*dot_Gammai[i](k,l) + (Qi[i](k,l) - T*DQiDT[i](k,l))*dot_DGammaiDEe[i](k,l,r,s));
+                                    // dWmdE(r,s) += ((DQiDEe[i](k,l,r,s) - T*DDQiDTDEe[i](k,l,r,s))*dot_Gammai[i](k,l) + (Qi[i](k,l) - T*DQiDT[i](k,l))*dot_DGammaiDEe[i](k,l,r,s)); // OLD
                                         dWmdE(r,s) += (DQiDEe[i](k,l,r,s)*dot_Gammai[i](k,l) + Qi[i](k,l)*dot_DGammaiDEe[i](k,l,r,s));
                                     }
                     }
@@ -2482,7 +2514,7 @@ void mlawNonLinearTVM::predictorCorrector_ThermoViscoElastic(
         // Modify Stress for mullins
         eta_mullins = q1->_ipMullinsEffect->getEta(); 
         P *= eta_mullins;
-        q1->_elasticEnergy *= eta_mullins;
+        // q1->_elasticEnergy *= eta_mullins;
     }
     // Msg::Error(" Inside TVE predCorr, after updating q1->_elasticEnergy = %e!!",q1->_elasticEnergy);
     
@@ -2544,6 +2576,7 @@ void mlawNonLinearTVM::predictorCorrector_ThermoViscoElastic(
     
     // mechanicalSource
     mechanicalSource = 0.;
+    double mechanicalSource_cap = 0.; // in case of mullins, undamaged mechanicalSource
 
     // 1) ThermoElastic Heat
     if (this->getTimeStep() > 0){
@@ -2564,11 +2597,11 @@ void mlawNonLinearTVM::predictorCorrector_ThermoViscoElastic(
         dWmdT_TVE *= 1.;
         q1->_mechSrcTVE = Wm_TVE;
     }
-    mechanicalSource += Wm_TVE;
+    // mechanicalSource += Wm_TVE; // TVE term
     
     // Compute mechanicalSource for Mullin's Effect
     if (_mullinsEffect != NULL && q1->_ipMullinsEffect != NULL){
-            
+    	mechanicalSource_cap = mechanicalSource;
         mechanicalSource *= q1->_ipMullinsEffect->getEta();
         if (this->getTimeStep() > 0){
             mechanicalSource -= q1->_ipMullinsEffect->getDpsiNew_DpsiMax()*(q1->_ipMullinsEffect->getpsiMax() - q0->_ipMullinsEffect->getpsiMax())/this->getTimeStep();
@@ -2740,7 +2773,7 @@ void mlawNonLinearTVM::predictorCorrector_ThermoViscoElastic(
         static const STensor43 I4_2(1.,1.);
         static STensor3 DcorKirDT_I;
         STensorOperation::multSTensor3STensor43(DcorKirDT,I4_2,DcorKirDT_I);
-        
+
         if (this->getTimeStep() > 0){
             for (int i=0; i<3; i++){
                 for (int j=0; j<3; j++){
@@ -2751,12 +2784,12 @@ void mlawNonLinearTVM::predictorCorrector_ThermoViscoElastic(
                         }
                 }
             }
-            dmechanicalSourceE += dWmdE_TVE;
+            // dmechanicalSourceE += dWmdE_TVE; // TVE term
             STensorOperation::multSTensor3STensor43(dmechanicalSourceE,DEeDFe,dmechanicalSourceF);
         
             dmechanicalSourcedT += (STensorOperation::doubledot(DcorKirDT,DEe)/this->getTimeStep());
             dmechanicalSourcedT += T*(STensorOperation::doubledot(DDcorKirDT,DEe)/this->getTimeStep());
-            dmechanicalSourcedT += dWmdT_TVE;     
+            // dmechanicalSourcedT += dWmdT_TVE; // TVE term
         }
         
         // Compute Tangents for Mullin's Effect
@@ -2772,10 +2805,14 @@ void mlawNonLinearTVM::predictorCorrector_ThermoViscoElastic(
             static STensor3 Deta_mullins_DF;
             STensorOperation::multSTensor3STensor43(q1->_DpsiDE,DEeDFe,Deta_mullins_DF);
             Deta_mullins_DF *= q1->_DmullinsDamage_Dpsi_cap;
+
+            double Deta_mullins_DT(0.);
+            Deta_mullins_DT = q1->_DmullinsDamage_DT; // + q1->_DmullinsDamage_Dpsi_cap*q1->_DpsiDT;
+
             for (int i=0; i<3; i++)
                 for (int j=0; j<3; j++){
-                    dPdT(i,j) += q1->_P_cap(i,j) * q1->_DmullinsDamage_DT;
-                    dmechanicalSourceF(i,j) += mechanicalSource*Deta_mullins_DF(i,j);
+                    dPdT(i,j) += q1->_P_cap(i,j) * Deta_mullins_DT;
+                    dmechanicalSourceF(i,j) += mechanicalSource_cap*Deta_mullins_DF(i,j);
                         for (int k=0; k<3; k++)
                             for (int l=0; l<3; l++)
                                 Tangent(i,j,k,l) += q1->_P_cap(i,j) * Deta_mullins_DF(k,l);
@@ -2787,7 +2824,7 @@ void mlawNonLinearTVM::predictorCorrector_ThermoViscoElastic(
             DDpsiNew_DpsiMaxDF *= q1->_ipMullinsEffect->getDDpsiNew_DpsiMaxDpsi();
             DpsiMax_DF *= q1->_ipMullinsEffect->getDpsiMax_Dpsi();
             
-            dmechanicalSourcedT += q1->_DmullinsDamage_DT*mechanicalSource; 
+            dmechanicalSourcedT += mechanicalSource_cap*Deta_mullins_DT; // q1->_DmullinsDamage_DT;
             if (this->getTimeStep() > 0){
                 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());
@@ -2853,19 +2890,21 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(const STensor3& Ee, co
         
         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.);
+        double intA(0.), intB(0.), dA_dT(0.), dB_dT(0.), DintA(0.), DintB(0.);
         
         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);
+            evaluateElasticCorrection(eff_trEe, devEe, T1, A, dA_dTrEe, intA, dA_dT, B, dB_dDevEe, intB, dB_dT, NULL ,NULL, NULL, NULL, NULL, &psiInfCorrector, &DintA, &DintB);
         }
         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);
+            evaluateElasticCorrection(eff_trEe, devEe, T1, A, dA_dTrEe, intA, dA_dT, B, dB_dDevEe, intB, dB_dT, NULL ,NULL, NULL, NULL, &dB_dTrEe, &psiInfCorrector, &DintA, &DintB);
             q1->_dBd_dTrEe = dB_dTrEe;
         }
     
         q1->_intA = intA;
         q1->_intB = intB;
+        q1->_DintA = DintA;
+        q1->_DintB = DintB;
         q1->_psiInfCorrector = psiInfCorrector; // Additional term to correct thermal expansion term in free energy
         q1->_elasticBulkPropertyScaleFactor = A; 
         q1->_elasticShearPropertyScaleFactor = B; 
@@ -2912,7 +2951,7 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(const STensor3& Ee, co
                     
         // 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.);
+        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.),DintA(0.),DintB(0.);
         static STensor3 intB1,intB2,dB_dDevEe,ddB_dTdDevEe;
         STensorOperation::zero(intB1);
         STensorOperation::zero(intB2);
@@ -2921,7 +2960,7 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(const STensor3& Ee, co
         
         if (_useExtraBranch_TVE){                            
             if(_ExtraBranch_TVE_option == 1){
-                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);
+                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,DintA,DintB);
                 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
@@ -3014,12 +3053,12 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(const STensor3& Ee, co
                 branchElasticStrain(2,2) += 1./3.*q1->_B[i];
                 if (_ExtraBranch_TVE_option == 2){
                     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);
+                                                                Bd,dB_dDevEe,intB,intB1,intB2,dB_dT,ddB_dTT,ddB_dTdDevEe,DintA,DintB);
                 }
                 else{
                     double dB_dTrEe(0.);
                     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);
+                                                                Bd,dB_dDevEe,intB,intB1,intB2,dB_dT,ddB_dTT,ddB_dTdDevEe,DintA,DintB,&dB_dTrEe);
                     q1->_dBd_dTrEe_TVE_vector[i] = dB_dTrEe;
                 }
                     
@@ -3029,7 +3068,9 @@ void mlawNonLinearTVM::ThermoViscoElasticPredictor_forTVP(const STensor3& Ee, co
                 q1->_dBd_dDevEe_TVE_vector[i] = dB_dDevEe;
                 q1->_intAv_TVE_vector[i] = intA;
                 q1->_intBd_TVE_vector[i] = intB;
-                    
+                q1->_DintAv_TVE_vector[i] = DintA;
+                q1->_DintBd_TVE_vector[i] = DintB;
+
                 // Evaluate Bd_stiffnessTerm
                 for (int k=0; k<3; k++)
                     for (int l=0; l<3; l++)
diff --git a/NonLinearSolver/materialLaw/mlawNonLinearTVM.h b/NonLinearSolver/materialLaw/mlawNonLinearTVM.h
index 75ab05a0bba921e48a93c3c33b59abbf9d176b3c..245bf095e0800c64167a3399bab7340f385fc247 100644
--- a/NonLinearSolver/materialLaw/mlawNonLinearTVM.h
+++ b/NonLinearSolver/materialLaw/mlawNonLinearTVM.h
@@ -100,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, double *psiInfCorrector = NULL) const;
+                                                 double *dB_dTrEe = NULL, double *dB_dTdTrEe = NULL, double *psiInfCorrector = NULL, double* DintA = NULL, double* DintB = 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, 
@@ -113,8 +113,8 @@ class mlawNonLinearTVM : public mlawPowerYieldHyper{
     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;
-                        
+						double& DintA, double& DintB, double* dB_dTrEe = NULL) const;
+
     void corKirInfinity(const IPNonLinearTVM *q1, const STensor3& devEe, const double& trEe, const double T, STensor3& CorKirDevInf, double& CorKirTrInf) const;
     
     void ThermoViscoElasticPredictor(const STensor3& Ee, const STensor3& Ee0,
@@ -202,7 +202,7 @@ 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 setCorrectionsAllBranchesTVE(const int i, const double V0, const double V1, const double V2, const double D0, 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);
diff --git a/NonLinearSolver/materialLaw/mlawNonLinearTVP.cpp b/NonLinearSolver/materialLaw/mlawNonLinearTVP.cpp
index e45d224a9fd182848c587a32018f2a3480410fba..8c38474fb3228fbdaa1fe44c6cb93371ab87fa3e 100644
--- a/NonLinearSolver/materialLaw/mlawNonLinearTVP.cpp
+++ b/NonLinearSolver/materialLaw/mlawNonLinearTVP.cpp
@@ -298,7 +298,7 @@ void mlawNonLinearTVP::getFreeEnergyTVM(const IPNonLinearTVP *q0, IPNonLinearTVP
      // get Kinematic Hardening stuff
     double Hb(0.), dHbdT(0.), ddHbddT(0.);
     if (q1->_ipKinematic != NULL){
-        Hb = q1->_ipKinematic->getDR(); // kinematic hardening parameter
+        Hb = q1->_ipKinematic->getR(); // kinematic hardening parameter
         dHbdT = q1->_ipKinematic->getDRDT();
         ddHbddT = q1->_ipKinematic->getDDRDTT();
     }
@@ -435,6 +435,7 @@ void mlawNonLinearTVP::getIsotropicHardeningForce(const IPNonLinearTVP *q0, IPNo
 
     // dRdT
     dRdT = dsigcdT - dsigc0dT;
+    dRdT += Hc*q1->_DgammaDT;
 
     // dRdF
     STensorOperation::zero(dRdF);
@@ -445,12 +446,12 @@ void mlawNonLinearTVP::getIsotropicHardeningForce(const IPNonLinearTVP *q0, IPNo
 
     // ddRdTT
     if(ddRdTT!=NULL){
-       *ddRdTT =  ddsigcdTT - ddsigc0dTT;
+       *ddRdTT =  (ddsigcdTT - ddsigc0dTT) + dHcdT*DgammaDT; // DDgammaDTT = 0.
     }
 
     // ddRdTF
     if(ddRdFdT!=NULL){
-        STensor3 _ddRdFdT;
+        static STensor3 _ddRdFdT;
         STensorOperation::zero(_ddRdFdT);
 
         for (int i=0; i<3; i++)
@@ -463,7 +464,7 @@ void mlawNonLinearTVP::getIsotropicHardeningForce(const IPNonLinearTVP *q0, IPNo
 
 void mlawNonLinearTVP::getMechSourceTVP(const STensor3& F0, const STensor3& F,
                                         const IPNonLinearTVP *q0, IPNonLinearTVP *q1, const double T0, const double& T, const STensor3& Fepr,  const STensor3& Cepr,
-                                        const STensor3& DphiPDF, double *Wm, STensor3 *dWmdF, double *dWmdT) const{
+                                        const STensor3& DphiPDF, double& mechSourceTVP, STensor3& dmechSourceTVPdF, double& dmechSourceTVPdT) const{
 
     const double& DgammaDT = q1->_DgammaDT;
     const STensor3& DgammaDF = q1->_DgammaDF;
@@ -471,105 +472,51 @@ void mlawNonLinearTVP::getMechSourceTVP(const STensor3& F0, const STensor3& F,
     const double& gamma1 = q1->_epspbarre;
     const STensor3& Fp1 = q1->_Fp;
     const STensor3& Me = q1->_ModMandel;
-    const STensor3& X1 = q1->_backsig;
-    const STensor3& X0 = q0->_backsig;
-    const STensor3& dXdT = q1->_DbackSigDT; // For debugging = 0. //DEBUGGING
-    const STensor3& dXdT_0  = q0->_DbackSigDT;
-    const STensor43& dXdF_0  = q0->_DbackSigDF;
+    const STensor3& X = q1->_backsig;
+    const STensor3& dXdT = q1->_DbackSigDT;
     const STensor43& dXdF  =  q1->_DbackSigDF;
     const STensor3& dMeDT  = q1->_DModMandelDT;
     const STensor43& dMedF  = q1->_DModMandelDF;
     const STensor43& dGammaNdF = q1->_dGammaNdF;
     const STensor3& dGammaNdT = q1->_dGammaNdT;
+    const STensor43& DphiDF = q1->_DphiDF;
+    const STensor3& DphiDT = q1->_DphiDT;
 
     // get Dgamma
     double Dgamma = gamma1 - gamma0;
 
-    // get Hb - Kinematic hardening parameter
-    double Hb(0.), dHb(0), dHbdT(0.), ddHbddT(0.);
-    if (q1->_ipKinematic != NULL){
-        Hb = q1->_ipKinematic->getDR();
-        dHb = q1->_ipKinematic->getDDR();
-        dHbdT = q1->_ipKinematic->getDRDT();
-        ddHbddT = q1->_ipKinematic->getDDRDTT();
-    }
-
     // get Dp - dont use Dp = Fp_dot*Fpinv, USE Dp = Gamma*N/this->getTimeStep()
-    static STensor3 Dp;
-    STensorOperation::zero(Dp);
-    if (this->getTimeStep() > 0){
-        Dp = q1->_GammaN;
-        Dp *= 1/this->getTimeStep();
-    }
-
-    // get alpha
-    double kk = 1./sqrt(1.+2.*q1->_nup*q1->_nup);
-    static STensor3 alpha0, alpha1;
-    alpha0 = X0; alpha1 = X1;
-    if (Hb>0.){
-        alpha0 *= 1/(pow(kk,2)* (q0->_ipKinematic->getDR())) ; // using previous Hb for alpha0
-        alpha1 *= 1/(pow(kk,2)*Hb);
-    }
-    alpha1 -= alpha0;
+    const STensor3& Dp = q1->_GammaN;
 
     // get TempX - convenient backStress tensor
-    STensor3 tempX;
-    tempX = X1;
-    tempX -= T*dXdT;
+    static STensor3 tempX;
+    tempX = X;
+    // tempX -= T*dXdT;
 
     // get R, dRdT, dRdF
     double R(0.), dRdT(0.), ddRdTT(0.);
-    STensor3 dRdF, ddRdFdT; STensorOperation::zero(dRdF); STensorOperation::zero(ddRdFdT);
-
-    // Old Formulation
-    /*
-    std::vector<double> ddIsoHardForcedTT; ddIsoHardForcedTT.resize(3,0.);
-    std::vector<STensor3> ddIsoHardForcedFdT; ddIsoHardForcedFdT.resize(3,0.);
-
-    getIsotropicHardeningForce(q0,q1,T0,T,DphiPDF,&ddIsoHardForcedTT,&ddIsoHardForcedFdT); // For analytical derivatives; for numerical, put the last 2 args as NULL
-    const std::vector<double>& IsoHardForce =  q1->_IsoHardForce;
-    const std::vector<double>& dIsoHardForcedT =  q1->_dIsoHardForcedT;
-    const std::vector<STensor3>& dIsoHardForcedF =  q1->_dIsoHardForcedF;
-
-    for (int i=0; i<3; i++){
-      R += IsoHardForce[i]
-      dRdT += dIsoHardForcedT[i];
-      ddRdTT += ddIsoHardForcedTT[i]; // 0.;
-      dRdF += dIsoHardForcedF[i];
-      ddRdFdT += ddIsoHardForcedFdT[i]; // 0.;
-    }*/
+    static STensor3 dRdF, ddRdFdT;
+    STensorOperation::zero(dRdF); STensorOperation::zero(ddRdFdT);
 
     // New Formulation
-
-    double ddIsoHardForcedTT(0.);
-    STensor3 ddIsoHardForcedFdT;
-    STensorOperation::zero(ddIsoHardForcedFdT);
-
-    getIsotropicHardeningForce(q0,q1,T0,T,&ddIsoHardForcedTT,&ddIsoHardForcedFdT);
+    getIsotropicHardeningForce(q0,q1,T0,T,&ddRdTT,&ddRdFdT);
     R = q1->_IsoHardForce_simple;
     dRdT = q1->_dIsoHardForcedT_simple;
     dRdF = q1->_dIsoHardForcedF_simple;
 
     // for convenience
-    R -= T*dRdT;
+    // R -= T*dRdT;
 
     // mechSourceTVP
-    if(Wm!=NULL){
-        double mechSourceTVP = 0.;
-
-        mechSourceTVP += STensorOperation::doubledot(Me,Dp);
-        if (!_TaylorQuineyFlag){
-            if (this->getTimeStep() > 0){
-                alpha1 *= 1/this->getTimeStep();
-                mechSourceTVP -= STensorOperation::doubledot(tempX,alpha1);
-                mechSourceTVP -= (R*Dgamma)/this->getTimeStep();
-            }
-        else{
-            mechSourceTVP *= _TaylorQuineyFactor;
-        }
+    mechSourceTVP = 0.;
+    if (this->getTimeStep() > 0){
+      mechSourceTVP += STensorOperation::doubledot(Me,Dp);
+      mechSourceTVP -= STensorOperation::doubledot(X,Dp); // dot_alpha = Dp
+      mechSourceTVP *= 1/this->getTimeStep();
 
-        *Wm = mechSourceTVP;
-        }
+      if (!_TaylorQuineyFlag){
+          mechSourceTVP -= (R*Dgamma)/this->getTimeStep();
+      }
     }
 
     // dDpdF and dDpdT
@@ -577,98 +524,45 @@ void mlawNonLinearTVP::getMechSourceTVP(const STensor3& F0, const STensor3& F,
     // dDpdT = dGammaNdT/this->getTimeStep();
 
 
-   // dAlphadF - from dXdF
-   static STensor43 dAlphadF;
-   STensorOperation::zero(dAlphadF);
-   if (Hb>0.){
-    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++){
-            dAlphadF(i,j,k,l) += dXdF(i,j,k,l)*1/(pow(kk,2)*Hb) - X1(i,j)*DgammaDF(k,l)*1/(pow(kk*Hb,2))*dHb;
-    }
-   }
-
-   // dAlphadT - from dXdT
-   static STensor3 dAlphadT;
-   if (Hb>0.){
-    for (int i=0; i<3; i++)
-      for (int j=0; j<3; j++){
-        dAlphadT(i,j) = dXdT(i,j)*1/(pow(kk,2)*Hb) - X1(i,j)*DgammaDT*1/(pow(kk*Hb,2))*dHbdT;
-        }
-   }
-
-   // ddXdTF -> make it -- CHANGE!!
-   static STensor43 ddXdTdF; // ddGammaDTF and ddQDTF are very difficult to estimate
-   static STensor3 ddXdTT; // ddGammaDTT and ddQDTT are very difficult to estimate
-   STensorOperation::zero(ddXdTdF);
-   STensorOperation::zero(ddXdTT);
-   double delT = T-T0;
-   if (delT>1e-10){
-    for (int i=0; i<3; i++)
-      for (int j=0; j<3; j++){
-        // ddXdTT(i,j) += 2*dXdT(i,j)/(T-T0) - 2*(X1(i,j)-X0(i,j))/pow((T-T0),2); //DEBUGGING
-        for (int k=0; k<3; k++)
-          for (int l=0; l<3; l++){
-           // ddXdTdF(i,j,k,l) += (dXdF(i,j,k,l)-dXdF_0(i,j,k,l))/(T-T0); //DEBUGGING
-          }
-        }
-      }
-
-    if(dWmdF!=NULL){
-        STensor3 dmechSourceTVPdF(0.);
-        if (this->getTimeStep() > 0){
+    STensorOperation::zero(dmechSourceTVPdF);
+    dmechSourceTVPdT = 0.;
+    if (this->getTimeStep() > 0){
+     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++){
+          	 dmechSourceTVPdF(k,l) += DphiDF(i,j,k,l)*Dp(i,j) + (Me(i,j)-X(i,j))*dGammaNdF(i,j,k,l)/this->getTimeStep();
+          	 // dmechSourceTVPdF(k,l) += dMedF(i,j,k,l)*Dp(i,j) + Me(i,j)*dGammaNdF(i,j,k,l)/this->getTimeStep();
+             // dmechSourceTVPdF(k,l) += - (dXdF(i,j,k,l) - T*ddXdTdF(i,j,k,l))*Dp(i,j) - tempX(i,j)*dGammaNdF(i,j,k,l)/this->getTimeStep();
+             // dmechSourceTVPdF(k,l) += - (dXdF(i,j,k,l))*Dp(i,j) - tempX(i,j)*dGammaNdF(i,j,k,l)/this->getTimeStep();
+           }
 
-            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++){
-                    dmechSourceTVPdF(i,j) += dMedF(i,j,k,l)*Dp(i,j) + Me(i,j)*dGammaNdF(i,j,k,l)/this->getTimeStep();
-                  }
-              }
+     for (int i=0; i<3; i++)
+       for (int j=0; j<3; j++){
+          	dmechSourceTVPdT += DphiDT(i,j)*Dp(i,j) + (Me(i,j)-X(i,j))*dGammaNdT(i,j)/this->getTimeStep();
+         // dmechSourceTVPdT += dMeDT(i,j)*Dp(i,j) + Me(i,j)*dGammaNdT(i,j)/this->getTimeStep();
+         // dmechSourceTVPdT += T*ddXdTT(i,j)*Dp(i,j) - tempX(i,j)*dGammaNdT(i,j)/this->getTimeStep();// old
+         // dmechSourceTVPdT -= dXdT(i,j)*Dp(i,j) - tempX(i,j)*dGammaNdT(i,j)/this->getTimeStep();
 
-          if (!_TaylorQuineyFlag){
-            for (int i=0; i<3; i++)
-              for (int j=0; j<3; j++){
-                dmechSourceTVPdF(i,j) = - (dRdF(i,j) - T*ddRdFdT(i,j))*Dgamma/this->getTimeStep() - R*DgammaDF(i,j)/this->getTimeStep();
-                for (int k=0; k<3; k++)
-                  for (int l=0; l<3; l++){
-                    dmechSourceTVPdF(i,j) += - (dXdF(i,j,k,l) - T*ddXdTdF(i,j,k,l))*alpha1(i,j) - tempX(i,j)*dAlphadF(i,j,k,l)/this->getTimeStep();
-                  }
-              }
-          }
-          else{
-              dmechSourceTVPdF *= _TaylorQuineyFactor;
-          }
+       }
 
+     if (!_TaylorQuineyFlag){
+      for (int i=0; i<3; i++)
+        for (int j=0; j<3; j++){
+        	// dmechSourceTVPdF(i,j) += - (dRdF(i,j) - T*ddRdFdT(i,j))*Dgamma/this->getTimeStep() - R*DgammaDF(i,j)/this->getTimeStep(); // old
+        	dmechSourceTVPdF(i,j) += - dRdF(i,j)*Dgamma/this->getTimeStep() - R*DgammaDF(i,j)/this->getTimeStep(); // new
         }
-        *dWmdF = dmechSourceTVPdF;
-    }
-
-    if(dWmdT!=NULL){
-        double dmechSourceTVPdT(0.);
-        if (this->getTimeStep() > 0){
-
-          for (int i=0; i<3; i++)
-            for (int j=0; j<3; j++){
-              dmechSourceTVPdT += dMeDT(i,j)*Dp(i,j) + Me(i,j)*dGammaNdT(i,j)/this->getTimeStep();
-            }
-
-          if (!_TaylorQuineyFlag){
-
-            dmechSourceTVPdT += T*ddRdTT*Dgamma/this->getTimeStep() - R*DgammaDT/this->getTimeStep();
-            for (int i=0; i<3; i++)
-              for (int j=0; j<3; j++){
-                dmechSourceTVPdT += T*ddXdTT(i,j)*alpha1(i,j) - tempX(i,j)*dAlphadT(i,j)/this->getTimeStep();
-              }
-          }
-          else{
-              dmechSourceTVPdT *= _TaylorQuineyFactor;
-          }
 
-        }
-        *dWmdT = dmechSourceTVPdT;
+      // dmechSourceTVPdT += T*ddRdTT*Dgamma/this->getTimeStep() - R*DgammaDT/this->getTimeStep(); // old
+      dmechSourceTVPdT += - dRdT*Dgamma/this->getTimeStep() - R*DgammaDT/this->getTimeStep(); // new
+     }
+     else{
+      dmechSourceTVPdF *= _TaylorQuineyFactor;
+      dmechSourceTVPdT *= _TaylorQuineyFactor;
+     }
     }
+
+    double debug_CHECKER = 0.;
 };
 
 
@@ -982,10 +876,10 @@ void mlawNonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow(const STensor3&
 
   double Hb(0.), dHb(0.), ddHb(0.), dHbdT(0.), ddHbdgammadT(0.), ddHbddT(0.);
   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
-    ddHbddT = Hb * q1->_ipKinematic->getDDRDTT();
+    Hb = q1->_ipKinematic->getR(); // kinematic hardening parameter
+    dHb = q1->_ipKinematic->getDR(); // kinematic hardening parameter derivative (dHb/dgamma)
+    dHbdT = q1->_ipKinematic->getDRDT();  // make sure to normalise DRDT while defining in python file //NEW
+    ddHbddT = q1->_ipKinematic->getDDRDTT();
   }
 
   double eta(0.),Deta(0.),DetaDT(0.);
@@ -1266,10 +1160,10 @@ void mlawNonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow(const STensor3&
         hardening(q0,q1,T);
         getYieldCoefficients(q1,a);
         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
-            ddHbddT = Hb * q1->_ipKinematic->getDDRDTT();
+            Hb = q1->_ipKinematic->getR(); // kinematic hardening parameter
+            dHb = q1->_ipKinematic->getDR(); // kinematic hardening parameter derivative (dHb/dgamma ??)
+            dHbdT = q1->_ipKinematic->getDRDT();  // make sure to normalise DRDT while defining in python file //NEW
+            ddHbddT = q1->_ipKinematic->getDDRDTT();
         }
         //a.print("a update");
 
@@ -1509,6 +1403,8 @@ void mlawNonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow(const STensor3&
   // mechanical Source
   double& Wm_TVP = q1->getRefToMechSrcTVP(); // TVP
   double& Wm_TVE = q1->getRefToMechSrcTVE(); // TVE
+  double& dWmdT_TVP = q1->getRefTodMechSrcTVPdT();
+  STensor3& dWmdF_TVP = q1->getRefTodMechSrcTVPdF();
 
   mechanicalSource = 0.;
   
@@ -1517,7 +1413,7 @@ void mlawNonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow(const STensor3&
   DEe = q1->_Ee;
   DEe -= q0->_Ee;
   if (this->getTimeStep() > 0){
-    mechanicalSource += (STensorOperation::doubledot(q1->_DcorKirDT,DEe)*T/this->getTimeStep()); 
+    mechanicalSource += (STensorOperation::doubledot(q1->_DcorKirDT,DEe)*T/this->getTimeStep());
   }
   
   // 2) Viscoelastic Contribution to mechSrc
@@ -1529,7 +1425,7 @@ void mlawNonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow(const STensor3&
   mechanicalSource += Wm_TVE;
 
   // 3) Viscoplastic Contribution to mechSrc
-  getMechSourceTVP(F0,F,q0,q1,T0,T,Fepr,Cepr,DphiPDF,&Wm_TVP);
+  getMechSourceTVP(F0,F,q0,q1,T0,T,Fepr,Cepr,DphiPDF,Wm_TVP,dWmdF_TVP,dWmdT_TVP);
   mechanicalSource += Wm_TVP;
 
   // freeEnergy and elastic energy
@@ -2547,10 +2443,6 @@ void mlawNonLinearTVP::predictorCorrector_TVP_nonAssociatedFlow(const STensor3&
       dWmdT_TVE += - dWmdE_TVE(i,j) * dGammaNdT(i,j); // the first term in dWmdT_TVE from pure TVE temperature dependency is obtained above.
 
   // TVP Term
-  double& dWmdT_TVP = q1->getRefTodMechSrcTVPdT();
-  STensor3& dWmdF_TVP = q1->getRefTodMechSrcTVPdF();
-  getMechSourceTVP(F0,F,q0,q1,T0,T,Fepr,Cepr,DphiPDF,NULL,&dWmdF_TVP,&dWmdT_TVP);
-
   dmechanicalSourceF += dWmdF_TVE;
   dmechanicalSourcedT += dWmdT_TVE;
   dmechanicalSourceF += dWmdF_TVP; // dWmdF_TVP;
diff --git a/NonLinearSolver/materialLaw/mlawNonLinearTVP.h b/NonLinearSolver/materialLaw/mlawNonLinearTVP.h
index 0c86d67d788c77f9f65a3903d13f655620886d11..5ec7f1f49ef1b0a3baeabe24558ed46c2b5a1455 100644
--- a/NonLinearSolver/materialLaw/mlawNonLinearTVP.h
+++ b/NonLinearSolver/materialLaw/mlawNonLinearTVP.h
@@ -48,7 +48,7 @@ class mlawNonLinearTVP : public mlawNonLinearTVM{
         
         virtual void getMechSourceTVP(const STensor3& F0, const STensor3& F, const IPNonLinearTVP *q0, IPNonLinearTVP *q1,
                                       const double T0, const double& T, const STensor3& Fepr, const STensor3& Cepr,
-                                      const STensor3& DphiPDF, double *Wm = NULL, STensor3 *dWmdF = NULL, double *dWmdT = NULL) const;
+                                      const STensor3& DphiPDF, double& mechSourceTVP, STensor3& dmechSourceTVPdF, double& dmechSourceTVPdT) const;
                                       
         virtual void getFreeEnergyTVM(const IPNonLinearTVP *q0, IPNonLinearTVP *q1, const double& T0, const double& T,
                                       double *psiTVM = NULL, double *DpsiTVMdT = NULL, double *DDpsiTVMdTT = NULL) const;
@@ -1373,4 +1373,4 @@ if (stiff){
   } // stiff
 
 };
-*/
\ No newline at end of file
+*/
diff --git a/NonLinearSolver/materialLaw/mlawNonLocalPorous.cpp b/NonLinearSolver/materialLaw/mlawNonLocalPorous.cpp
index deb62d95705e968f4fe4d667cd4f735b96b85d65..af333371280f9d2e3307ac501c4939d3eb4d33f1 100644
--- a/NonLinearSolver/materialLaw/mlawNonLocalPorous.cpp
+++ b/NonLinearSolver/materialLaw/mlawNonLocalPorous.cpp
@@ -1192,7 +1192,8 @@ void mlawNonLocalPorosity::predictorCorrector_NonLocalPorosity(
   static STensor3 DFpDT;
   static double dpprDT;
 
-
+  
+  ipvcur->getRefToConstitutiveSuccessFlag() = true;
   // Compute kcor, Fp and fv with an elastic predictor and eventually a plastic corrector
   // Elastic predictor
   bool okElast = elasticPredictor(F1,*Fp0,corKirpr,kcorprDev,ppr,DcorKirprDEpr,DkcorprDevDEpr,DpprDEpr,Fepr,Cepr,Epr,Lepr,dLepr,stiff,
@@ -1200,6 +1201,7 @@ void mlawNonLocalPorosity::predictorCorrector_NonLocalPorosity(
   if (!okElast)
   {
     P(0,0) = P(1,1) = P(2,2)= sqrt(-1.); // to exist NR and performed next step with a smaller incremenet
+    ipvcur->getRefToConstitutiveSuccessFlag() = false;
     return;
   }
   double kCorPrEq = sqrt(1.5*kcorprDev.dotprod());
@@ -1310,6 +1312,7 @@ void mlawNonLocalPorosity::predictorCorrector_NonLocalPorosity(
             if (!okElast)
             {
               P(0,0) = P(1,1) = P(2,2)= sqrt(-1.); // to exist NR and performed next step with a smaller incremenet
+              ipvcur->getRefToConstitutiveSuccessFlag() = false;
               return;
             }
             //check yield condition
@@ -1496,6 +1499,7 @@ void mlawNonLocalPorosity::predictorCorrector_NonLocalPorosity(
                               &Tcur,&DcorKirprDT,&DkcorprDevDT,&dpprDT);
               if (!okElast)
               {
+                ipvcur->getRefToConstitutiveSuccessFlag() = false;
                 P(0,0) = P(1,1) = P(2,2)= sqrt(-1.); // to exist NR and performed next step with a smaller incremenet
                 return;
               }
@@ -1586,6 +1590,7 @@ void mlawNonLocalPorosity::predictorCorrector_NonLocalPorosity(
 
   if (plastic and !correctorOK){
     // In case of failed plastic correction
+    ipvcur->getRefToConstitutiveSuccessFlag() = false;
     P(0,0) = sqrt(-1.); // to exist NR and performed next step with a smaller incremenet
     return;
   }
@@ -2102,11 +2107,13 @@ void mlawNonLocalPorosity::predictorCorrectorLocal(
 
   bool correctorOK = false;
   bool plastic = false;
+  ipvcur->getRefToConstitutiveSuccessFlag() = true;
 
   // elastic predictor
   bool okElast = this->elasticPredictor(F1,*Fp0,corKirpr,kcorprDev,ppr,DcorKirprDEpr,DkcorprDevDEpr,DpprDEpr,Fepr,Cepr,Epr,Lepr,dLepr,stiff);
   if (!okElast)
   {
+    ipvcur->getRefToConstitutiveSuccessFlag() = false;
     P(0,0) = P(1,1) = P(2,2)= sqrt(-1.); // to exist NR and performed next step with a smaller incremenet
     return;
   }
@@ -2197,6 +2204,7 @@ void mlawNonLocalPorosity::predictorCorrectorLocal(
             okElast =  elasticPredictor(Fcur,*Fp0,corKirpr,kcorprDev,ppr,DcorKirprDEpr,DkcorprDevDEpr,DpprDEpr,Fepr,Cepr,Epr,Lepr,dLepr,estimateStiff);
             if (!okElast)
             {
+              ipvcur->getRefToConstitutiveSuccessFlag() = false;
               P(0,0) = P(1,1) = P(2,2)= sqrt(-1.); // to exist NR and performed next step with a smaller incremenet
               return;
             }
@@ -2265,6 +2273,7 @@ void mlawNonLocalPorosity::predictorCorrectorLocal(
       }
     }
     if (plastic and !correctorOK){
+      ipvcur->getRefToConstitutiveSuccessFlag() = false;
       P(0,0) = sqrt(-1.); // to exist NR and performed next step with a smaller incremenet
       return;
     }
@@ -5580,12 +5589,14 @@ void mlawNonLocalPorosity::predictorCorrector_multipleNonLocalVariables(const ST
     DFpDNonLocalVar.resize(_numNonLocalVar);
     DLocalVarDEpr.resize(_numNonLocalVar);
   };
-
+  
+  ipvcur->getRefToConstitutiveSuccessFlag() = true;
   // elastic predictor
   bool okElast = elasticPredictor(F1,*Fp0,corKirpr,kcorprDev,ppr,DcorKirprDEpr,DkcorprDevDEpr,DpprDEpr,Fepr,Cepr,Epr,Lepr,dLepr,stiff,
                   &T,&DcorKirprDT,&DkcorprDevDT,&dpprDT);
   if (!okElast)
   {
+    ipvcur->getRefToConstitutiveSuccessFlag() = false;
     P(0,0) = P(1,1) = P(2,2)= sqrt(-1.); // to exist NR and performed next step with a smaller incremenet
     return;
   }
@@ -5703,6 +5714,7 @@ void mlawNonLocalPorosity::predictorCorrector_multipleNonLocalVariables(const ST
             if (!okElast)
             {
               P(0,0) = P(1,1) = P(2,2)= sqrt(-1.); // to exist NR and performed next step with a smaller incremenet
+              ipvcur->getRefToConstitutiveSuccessFlag() = false;
               return;
             }
             //check yield condition
@@ -5873,6 +5885,7 @@ void mlawNonLocalPorosity::predictorCorrector_multipleNonLocalVariables(const ST
                               &Tcur,&DcorKirprDT,&DkcorprDevDT,&dpprDT);
               if (!okElast)
               {
+                ipvcur->getRefToConstitutiveSuccessFlag() = false;
                 P(0,0) = P(1,1) = P(2,2)= sqrt(-1.); // to exist NR and performed next step with a smaller incremenet
                 return;
               }
@@ -5950,6 +5963,7 @@ void mlawNonLocalPorosity::predictorCorrector_multipleNonLocalVariables(const ST
 
   if (plastic and !correctorOK){
     P(0,0) = sqrt(-1.); // to exist NR and performed next step with a smaller incremenet
+    ipvcur->getRefToConstitutiveSuccessFlag() = false;
     return;
   }
 
@@ -7797,6 +7811,8 @@ void mlawNonLocalPorosity::I1J2J3_predictorCorrector_NonLocal(const STensor3& F0
     DFpDNonLocalVar.resize(_numNonLocalVar);
     DLocalVarDEpr.resize(_numNonLocalVar);
   };
+  
+  ipvcur->getRefToConstitutiveSuccessFlag() = true;
 
   // elastic predictor
   bool okElast = elasticPredictor(F1,*Fp0,corKirpr,kcorprDev,ppr,DcorKirprDEpr,DkcorprDevDEpr,DpprDEpr,Fepr,Cepr,Epr,Lepr,dLepr,true,
@@ -7804,6 +7820,7 @@ void mlawNonLocalPorosity::I1J2J3_predictorCorrector_NonLocal(const STensor3& F0
   if (!okElast)
   {
     P(0,0) = P(1,1) = P(2,2)= sqrt(-1.); // to exist NR and performed next step with a smaller incremenet
+    ipvcur->getRefToConstitutiveSuccessFlag() = false;
     return;
   }
   // elastic only
@@ -7896,6 +7913,7 @@ void mlawNonLocalPorosity::I1J2J3_predictorCorrector_NonLocal(const STensor3& F0
                             &Tcur,&DcorKirprDT,&DkcorprDevDT,&dpprDT);
             if (!okElast)
             {
+              ipvcur->getRefToConstitutiveSuccessFlag() = false;
               P(0,0) = P(1,1) = P(2,2)= sqrt(-1.); // to exist NR and performed next step with a smaller incremenet
               return;
             }
@@ -8029,6 +8047,7 @@ void mlawNonLocalPorosity::I1J2J3_predictorCorrector_NonLocal(const STensor3& F0
                               &Tcur,&DcorKirprDT,&DkcorprDevDT,&dpprDT);
               if (!okElast)
               {
+                ipvcur->getRefToConstitutiveSuccessFlag() = false;
                 P(0,0) = P(1,1) = P(2,2)= sqrt(-1.); // to exist NR and performed next step with a smaller incremenet
                 return;
               }
@@ -8088,6 +8107,7 @@ void mlawNonLocalPorosity::I1J2J3_predictorCorrector_NonLocal(const STensor3& F0
 
   if (plastic and !correctorOK){
     P(0,0) = sqrt(-1.); // to exist NR and performed next step with a smaller incremenet
+    ipvcur->getRefToConstitutiveSuccessFlag() = false;
     return;
   }
 
@@ -8273,12 +8293,14 @@ void mlawNonLocalPorosity::I1J2J3_predictorCorrectorLocal(
 
   bool correctorOK = false;
   bool plastic = false;
+  ipvcur->getRefToConstitutiveSuccessFlag() = true;
 
   // elastic predictor
   bool okElast = this->elasticPredictor(F1,*Fp0,corKirpr,kcorprDev,ppr,DcorKirprDEpr,DkcorprDevDEpr,DpprDEpr,Fepr,Cepr,Epr,Lepr,dLepr,true);
   if (!okElast)
   {
     P(0,0) = P(1,1) = P(2,2)= sqrt(-1.); // to exist NR and performed next step with a smaller incremenet
+    ipvcur->getRefToConstitutiveSuccessFlag() = false;
     return;
   }
   // elastic only
@@ -8348,6 +8370,7 @@ void mlawNonLocalPorosity::I1J2J3_predictorCorrectorLocal(
             okElast =  elasticPredictor(Fcur,*Fp0,corKirpr,kcorprDev,ppr,DcorKirprDEpr,DkcorprDevDEpr,DpprDEpr,Fepr,Cepr,Epr,Lepr,dLepr,estimateStiff);
             if (!okElast)
             {
+              ipvcur->getRefToConstitutiveSuccessFlag() = false;
               P(0,0) = P(1,1) = P(2,2)= sqrt(-1.); // to exist NR and performed next step with a smaller incremenet
               return;
             }
@@ -8399,6 +8422,7 @@ void mlawNonLocalPorosity::I1J2J3_predictorCorrectorLocal(
     }
     if (plastic and !correctorOK){
       P(0,0) = sqrt(-1.); // to exist NR and performed next step with a smaller incremenet
+      ipvcur->getRefToConstitutiveSuccessFlag() = false;
       return;
     }
   }
diff --git a/NonLinearSolver/materialLaw/mlawNonLocalPorousCoupled.cpp b/NonLinearSolver/materialLaw/mlawNonLocalPorousCoupled.cpp
index e5e99c20b488206ddd17104e22d3fa224338493b..dc35d65bf5c5a9eb8975e27b8649acf567e9a634 100644
--- a/NonLinearSolver/materialLaw/mlawNonLocalPorousCoupled.cpp
+++ b/NonLinearSolver/materialLaw/mlawNonLocalPorousCoupled.cpp
@@ -2369,4 +2369,294 @@ void mlawNonLocalPorousCoupledHill48LawWithMPSAndMSS::I1J2J3_getYieldNormal(STen
       STensorOperation::multSTensor3STensor43(DNpEffDT, _aniM, *DNpDT);
     }
   }
-};
\ No newline at end of file
+};
+
+
+void mlawNonLocalPorousCoupledHill48LawWithMPSAndMSS::checkCoalescence(IPNonLocalPorosity* q1, const IPNonLocalPorosity *q0, const double* T) const
+{
+  // check condition if check coalescence is carried out
+  if (getNumOfYieldSurfaces() > 1)
+  {
+    Msg::Error("check coalescenece has not implemented for num yield surface >1");
+    return;
+  }
+    
+  // Get ipvs
+  const IPCoalescence* q0Thom = &q0->getConstRefToIPCoalescence();
+  IPCoalescence* q1Thom = &q1->getRefToIPCoalescence();
+
+  // check active
+  if (q0Thom->getCoalescenceOnsetFlag() and q1->dissipationIsActive())
+  {
+    q1Thom->getRefToCoalescenceActiveFlag() = true;
+  }
+  else
+  {
+    q1Thom->getRefToCoalescenceActiveFlag() = false;
+  }
+  
+  bool willUseNormalToCheck = false;
+  if (_checkCoalescenceWithNormal)
+  {
+    if (q1->getLocation() == IPVariable::INTERFACE_MINUS or q1->getLocation() == IPVariable::INTERFACE_PLUS)
+    {
+      
+      willUseNormalToCheck = true;
+      const SVector3& normal = q1->getConstRefToCurrentOutwardNormal();
+      if (normal.norm() <=0.)
+      {
+        Msg::Error("coalescence cannot check with zero normal!!!");
+        return;
+      };
+    }
+    else
+    {
+      willUseNormalToCheck = false;
+      if (!_withBothYieldSurfacesInBulk)
+      {
+        return;
+      }
+    }  
+  }
+  
+  
+  if (q0Thom->getCoalescenceOnsetFlag())
+  {
+    // if onset already occurs
+    q1Thom->getRefToCoalescenceOnsetFlag() = q0Thom->getCoalescenceOnsetFlag();
+    q1Thom->getRefToCoalescenceMode() = q0Thom->getCoalescenceMode();
+    // copy data
+    q1Thom->setIPvAtCoalescenceOnset(*q0Thom->getIPvAtCoalescenceOnset());
+
+    q1Thom->getRefToCrackOffsetOnCft() = q0Thom->getCrackOffsetOnCft();
+    q1Thom->getRefToLodeParameterOffset() = q0Thom->getLodeParameterOffset();
+    q1Thom->getRefToYieldOffset() = q0Thom->getYieldOffset();
+  }
+  else if (q1->dissipationIsActive())
+  {
+    const STensor3& kCor = q1->getConstRefToCorotationalKirchhoffStress();
+    const STensor3& F = q1->getConstRefToDeformationGradient();
+    const double R = q1->getCurrentViscoplasticYieldStress();    
+    double J = STensorOperation::determinantSTensor3(F);
+    static STensor3 corSig;
+    corSig = kCor;
+    if (_stressFormulation == CORO_CAUCHY)
+    {
+      corSig *= (1./J);
+    }
+
+    // check at interface 
+    bool interfaceNeckActive = true;
+    bool interfaceShearActive = true;
+    if (willUseNormalToCheck)
+    {
+       double CftThomason;
+      _mlawCoales->getCoalescenceLaw()->computeConcentrationFactor(q0,q1,CftThomason);
+      double CftShear;
+      _mlawShear->getCoalescenceLaw()->computeConcentrationFactor(q0,q1,CftShear);
+      
+      SVector3 normal = q1->getConstRefToCurrentOutwardNormal();
+      normal.normalize();
+
+      // Compute Sig from Kcor following: Sig = invFeT * sigCor * FeT = Fe*sigCor*invFe
+      static STensor3 invFep, FeSigCor , Fe, Sig;
+      STensorOperation::inverseSTensor3(q1->getConstRefToFp(), invFep);
+      STensorOperation::multSTensor3(F, invFep, Fe);
+      STensorOperation::inverseSTensor3(Fe, invFep);
+      STensorOperation::multSTensor3(Fe, corSig, FeSigCor);
+      STensorOperation::multSTensor3SecondTranspose(FeSigCor, invFep, Sig);
+      
+      // traction vector
+      static SVector3 tractionForce;
+      STensorOperation::multSTensor3SVector3(Sig,normal,tractionForce);
+      double tauN = STensorOperation::dot(tractionForce,normal);
+      // Deduce tangent part
+      double tauTanSq = 0.;
+      for (int i=0; i<3; i++)
+      {
+        double temp = tractionForce(i)-tauN*normal(i);
+        tauTanSq += temp*temp;
+      }
+      // Compute effective stress
+      double tauEff = 0.; 
+      if (tauN > 0.)
+      {
+        tauEff = sqrt(tauN*tauN + _beta*tauTanSq);
+      }
+      else
+      {
+        tauEff = sqrt(_beta*tauTanSq);
+      }
+      
+      if (tauEff - CftThomason*R >0)
+      {
+        interfaceNeckActive = true;
+      } 
+      else
+      {
+        interfaceNeckActive = false;
+      }
+      if (sqrt(3.*tauTanSq) - CftShear*R >0)
+      {
+        interfaceShearActive = true;
+      }
+      else
+      {
+        interfaceShearActive = false;
+      }
+    }
+    
+    static STensor3 sigEff;
+    STensorOperation::multSTensor43STensor3(_aniM, corSig, sigEff);
+    double Gurson = _mlawGrowth->I1J2J3_yieldFunction(sigEff,R,q0,q1,T);
+    double Thomason = _mlawCoales->I1J2J3_yieldFunction(sigEff,R,q0,q1,T);
+    double Shear = _mlawShear->I1J2J3_yieldFunction(sigEff,R,q0,q1,T);
+    
+    // active plasticity
+    // check coalescence is active
+    bool& CoalesFlag = q1Thom->getRefToCoalescenceOnsetFlag();
+    int& CoalesMode = q1Thom->getRefToCoalescenceMode();
+    CoalesFlag = false;
+    CoalesMode = 0;
+    
+    if (_useTwoYieldRegularization)
+    {
+      double FG = Gurson +1.;
+      double FT = Thomason +1.;
+      double FS = Shear +1.;
+      if (FG < 0. or FT < 0. or FS < 0)
+      {
+        Msg::Error("FT,FS FG must be all positive but FT=%e, FS = %e, FG=%e",FT,FS,FG);
+      }
+      // check necking
+      if (std::max(FT,FS)> FG)
+      {
+        double ratio = FG/FT;
+        if (pow(ratio,_yieldRegExponent) < _coalesTol  && interfaceNeckActive)
+        {
+          CoalesFlag = true;
+          CoalesMode = 1;
+          printf("Necking coalescence at Gurson = %e, Thomason =%e, Shear = %e\n",
+                        Gurson,Thomason,Shear);
+        }
+        else
+        {
+          ratio = FG/FS;
+          if (pow(ratio,_yieldRegExponent) < _coalesTol  && interfaceShearActive)
+          {
+            CoalesFlag = true; 
+            CoalesMode = 2;
+            printf("Shear coalescence at Gurson = %e, Thomason =%e, Shear = %e\n",
+                                  Gurson,Thomason,Shear);
+          }
+          else
+          {
+            CoalesFlag = false;
+            CoalesMode = 0;
+          }
+        }
+      }
+    }
+    else
+    {
+      if (Thomason > std::max(Gurson,Shear) && interfaceNeckActive)
+      {
+        CoalesFlag = true;
+        CoalesMode = 1;
+        printf("Necking coalescence at Gurson = %e, Thomason =%e, Shear = %e\n",
+                        Gurson,Thomason,Shear);
+      }
+      else if (Shear > std::max(Gurson,Thomason) && interfaceShearActive)
+      {
+        CoalesFlag = true;
+        CoalesMode = 2;
+        printf("Shear coalescence at Gurson = %e, Thomason =%e, Shear = %e\n",
+                                Gurson,Thomason,Shear);
+      }
+      else
+      {
+        CoalesFlag = false;
+        CoalesMode = 0;
+      }
+    }
+       
+   // if coalesnce occurs
+    if (CoalesFlag)
+    {
+      q1Thom->setIPvAtCoalescenceOnset(*q1);
+      // if offset is used to satisfy Thomason yield surface at the onset of coalescence
+      if (_useTwoYieldRegularization)
+      {
+        // never offset with yield regulation
+        q1Thom->getRefToCrackOffsetOnCft() = 1.;
+        q1Thom->getRefToLodeParameterOffset() = 1.;
+        q1Thom->getRefToYieldOffset() = 0.;
+      }
+      else
+      {
+        if (_withCftOffset)
+        {
+          if (CoalesMode==1)
+          {
+            q1Thom->getRefToCrackOffsetOnCft() = 1. + Thomason;
+          }
+          else if (CoalesMode==2)
+          {
+            q1Thom->getRefToCrackOffsetOnCft() = 1. + Shear;
+          }
+          q1Thom->getRefToLodeParameterOffset() = 1.;
+          q1Thom->getRefToYieldOffset() = 0.;
+          #ifdef _DEBUG
+          printf("coalescence ocurrs using Cft offset = %e\n",q1Thom->getCrackOffsetOnCft());
+          #endif //_DEBUG
+        }
+        else if (_withLodeOffset)
+        {
+          // Lode offset is not used for material law, because law already accounts for Lode variable
+          q1Thom->getRefToCrackOffsetOnCft() = 1.;
+          q1Thom->getRefToLodeParameterOffset()=  1.;
+          q1Thom->getRefToYieldOffset() = 0.;
+        }
+        else if (_withYieldOffset)
+        {
+          q1Thom->getRefToCrackOffsetOnCft() = 1.;
+          q1Thom->getRefToLodeParameterOffset() = 1.;
+          if (CoalesMode==1)
+          {
+            q1Thom->getRefToYieldOffset() = Thomason;
+          }
+          else if (CoalesMode==2)
+          {
+            q1Thom->getRefToYieldOffset() = Shear;
+          }
+          #ifdef _DEBUG
+          printf("coalescence ocurrs using yield offset = %e\n",q1Thom->getYieldOffset());
+          #endif //_DEBUG
+        }
+        else
+        {
+          q1Thom->getRefToCrackOffsetOnCft() = 1.;
+          q1Thom->getRefToLodeParameterOffset() = 1.;
+          q1Thom->getRefToYieldOffset() = 0.;
+          #ifdef _DEBUG
+          printf("coalescence ocurrs, not offset is used\n");
+          #endif //_DEBUG
+        }
+      }
+    }
+    else
+    {
+      q1Thom->getRefToCrackOffsetOnCft() = 1.;
+      q1Thom->getRefToLodeParameterOffset() = 1.;
+      q1Thom->getRefToYieldOffset() = 0.;
+    }
+  }
+};
+void mlawNonLocalPorousCoupledHill48LawWithMPSAndMSS::forceCoalescence(IPNonLocalPorosity* q1, const IPNonLocalPorosity *q0, const double* T) const
+{
+  Msg::Error("mlawNonLocalPorousCoupledHill48LawWithMPSAndMSS::forceCoalescence is not implemented!!!");
+};
+bool mlawNonLocalPorousCoupledHill48LawWithMPSAndMSS::checkCrackCriterion(IPNonLocalPorosity* q1, const IPNonLocalPorosity *q0, const STensor3& Fcur, const SVector3& normal, double delayFactor, const double* T) const
+{
+  Msg::Error("mlawNonLocalPorousCoupledHill48LawWithMPSAndMSS::checkCrackCriterion is not implemented!!!");
+}
\ No newline at end of file
diff --git a/NonLinearSolver/materialLaw/mlawNonLocalPorousCoupled.h b/NonLinearSolver/materialLaw/mlawNonLocalPorousCoupled.h
index 16ba5b8ee1a1d3359f529d938b6fd4fb1e38e31a..0cee29a52174713e9847ef78a02c9540e4fbee7b 100644
--- a/NonLinearSolver/materialLaw/mlawNonLocalPorousCoupled.h
+++ b/NonLinearSolver/materialLaw/mlawNonLocalPorousCoupled.h
@@ -311,6 +311,9 @@ class mlawNonLocalPorousCoupledHill48LawWithMPSAndMSS : public mlawNonLocalPorou
                                         bool diff=false, STensor43* DNpDkcor=NULL, STensor3* DNpDR=NULL, std::vector<STensor3>* DNpDY=NULL,
                                         bool withThermic=false, STensor3* DNpDT=NULL  
                                         ) const;
+    virtual void checkCoalescence(IPNonLocalPorosity* q1, const IPNonLocalPorosity *q0, const double* T) const;
+    virtual void forceCoalescence(IPNonLocalPorosity* q1, const IPNonLocalPorosity *q0, const double* T) const;
+    virtual bool checkCrackCriterion(IPNonLocalPorosity* q1, const IPNonLocalPorosity *q0, const STensor3& Fcur, const SVector3& normal, double delayFactor, const double* T) const;
 };
 
 #endif // MLAWNONLOCALPOROUSCOALESCENCE_H_
diff --git a/NonLinearSolver/materialLaw/mullinsEffect.cpp b/NonLinearSolver/materialLaw/mullinsEffect.cpp
index 492a802249ea7e1f2653eb083b252ac57653f965..50ec2a4da39a0777d63dcd795314f19fe9937c33 100644
--- a/NonLinearSolver/materialLaw/mullinsEffect.cpp
+++ b/NonLinearSolver/materialLaw/mullinsEffect.cpp
@@ -469,9 +469,11 @@ void linearScaler::mullinsEffectScaling(double _psi0, double _psi, const IPMulli
     
     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*(- psi_cap/pow(_psi_max,2)*Dpsi_max_Dpsi_cap*dPsi_capDT); // NEW - In paper
     
     double DetaDpsi_max = -r*psi_cap/pow(_psi_max,2);
-    DpsiNew_DpsiMax = -r*pow(psi_cap,2)/(2.*pow(_psi_max,2));
+    DpsiNew_DpsiMax = -r*pow(psi_cap,2)/(2.*pow(_psi_max,2)); // definition
     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)));
   }
diff --git a/NonLinearSolver/nlsolver/dofManagerMultiSystems.cpp b/NonLinearSolver/nlsolver/dofManagerMultiSystems.cpp
index 54b9cd12fbab09cb0189bf99735d20f72841dbdc..fbe8dcb2075b4929b1a776065f15ba7f716a740c 100644
--- a/NonLinearSolver/nlsolver/dofManagerMultiSystems.cpp
+++ b/NonLinearSolver/nlsolver/dofManagerMultiSystems.cpp
@@ -412,6 +412,15 @@ void dofManagerMultiSystems::clearRHSfixed()
     _vmanager[i]->clearRHSfixed();
   }
 }
+
+double dofManagerMultiSystems::getNorm1ReactionForce() const
+{
+  double val = 0;
+  for(int i=0;i<_vmanager.size();i++){
+      val += _vmanager[i]->getNorm1ReactionForce();
+  }
+  return val;
+}
 void dofManagerMultiSystems::getReactionForceOnFixedPhysical(archiveForce& af) const
 {
   double forceallsys = 0;
diff --git a/NonLinearSolver/nlsolver/dofManagerMultiSystems.h b/NonLinearSolver/nlsolver/dofManagerMultiSystems.h
index 4d4dd3c4fff690b358952741d44ea15899d42e60..de71fbfc26102f4e05731372222f8ae342095655 100644
--- a/NonLinearSolver/nlsolver/dofManagerMultiSystems.h
+++ b/NonLinearSolver/nlsolver/dofManagerMultiSystems.h
@@ -158,6 +158,7 @@ class dofManagerMultiSystems : public nlsDofManager
     virtual void preAllocateEntries();
     // operations
     virtual void clearRHSfixed();
+    virtual double getNorm1ReactionForce() const;
     virtual void getReactionForceOnFixedPhysical(archiveForce& af) const;
     virtual void getForces(std::vector<archiveForce> &vaf) const;
     virtual double getKineticEnergy(const int systemSizeWithoutRigidContact,FilterDofSet &fildofcontact) const;
diff --git a/NonLinearSolver/nlsolver/nonLinearMechSolver.cpp b/NonLinearSolver/nlsolver/nonLinearMechSolver.cpp
index 1e7677b7a94ecbb0284a199b0f1e2f5a2b5681f2..08b3fb3184966c60a6ba96a2a68083ec56af32ef 100644
--- a/NonLinearSolver/nlsolver/nonLinearMechSolver.cpp
+++ b/NonLinearSolver/nlsolver/nonLinearMechSolver.cpp
@@ -9851,7 +9851,21 @@ double nonLinearMechSolver::computeRightHandSide()
 	if (_pathFollowing and _pfManager._pathFollowingMethod == pathFollowingManager::LOCAL_BASED){
 		this->computePathFollowingConstraint();
 	}
-
+  
+  double ffixNorm = pAssembler->getNorm1ReactionForce();
+  int ok = (std::isnan(ffixNorm) or std::isinf(ffixNorm))?1:0;  
+  #if defined(HAVE_MPI)
+  if (this->getNumRanks() > 1)
+  {
+     MPI_Allreduce(MPI_IN_PLACE,&ok, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD);
+  }
+  #endif //HAVE_MPI
+  if (ok>0)
+  {
+    Msg::Error("reaction force is nan or inf: rank = %d, val = %e", Msg::GetCommRank(),ffixNorm);
+    return sqrt(-1.);
+  }
+  
   // save Fint component to archive ( write in file when Fint = Fext)
 //  return lsys->normInfRightHandSide();
   return pAssembler->normInfRightHandSide();
@@ -10094,7 +10108,20 @@ int nonLinearMechSolver::NewtonRaphson(const int numstep){
   if(computedUdF()){
        _ipf->setDeformationGradientGradient(this->getMicroBC()->getSecondOrderKinematicalVariable(), IPStateBase::current);
   }
-  _ipf->compute1state(IPStateBase::current, true);
+  bool ok = _ipf->compute1state(IPStateBase::current, true);
+  #if defined(HAVE_MPI)
+  if (this->getNumRanks() > 1)
+  {
+    int val = (ok)? 0: 1;
+    MPI_Allreduce(MPI_IN_PLACE,&val, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD);      
+    ok = (val==0);
+  }
+  #endif //HAVE_MPI
+  if (!ok)
+  {
+    Msg::Warning("The evaluation of constutitive laws is failed at some GPs");
+    return _timeManager->getMaxNbIterations(); // for isnan case
+  }
   // Compute Right Hand Side (Fext-Fint)
   double normFinf = this->computeRightHandSide();
   // norm0 = norm(Fext) + norm(Fint) to have a relative convergence
@@ -10130,7 +10157,20 @@ int nonLinearMechSolver::NewtonRaphson(const int numstep){
       return _timeManager->getMaxNbIterations();
     }
     // update ipvariable
-    _ipf->compute1state(IPStateBase::current,true);
+    ok = _ipf->compute1state(IPStateBase::current,true);
+    #if defined(HAVE_MPI)
+    if (this->getNumRanks() > 1)
+    {
+      int val = (ok)? 0: 1;
+      MPI_Allreduce(MPI_IN_PLACE,&val, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD);      
+      ok = (val==0);  
+    }
+    #endif //HAVE_MPI
+    if (!ok)
+    {
+      Msg::Warning("The evaluation of constutitive laws is failed at some GPs");
+      return _timeManager->getMaxNbIterations(); // for isnan case
+    }
 
     if (!_iterativeNR) break;
     // new forces
@@ -10160,7 +10200,20 @@ int nonLinearMechSolver::NewtonRaphson(const int numstep){
         }
         if(ls == 1) break; // processus is converged or failed
         // update ipvariable
-        _ipf->compute1state(IPStateBase::current,true);
+        ok = _ipf->compute1state(IPStateBase::current,true);
+        #if defined(HAVE_MPI)
+        if (this->getNumRanks() > 1)
+        {
+          int val = (ok)? 0: 1;
+          MPI_Allreduce(MPI_IN_PLACE,&val, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD);      
+          ok = (val==0);    
+        }
+        #endif //HAVE_MPI
+        if (!ok)
+        {
+          Msg::Warning("The evaluation of constutitive laws is failed at some GPs");
+          return _timeManager->getMaxNbIterations(); // for isnan case
+        }
         // new RightHandSide
         this->computeRightHandSide();
       }
@@ -10565,7 +10618,20 @@ int nonLinearMechSolver::NewtonRaphsonPathFollowing(const int numstep)
       break;
     }
     // update ipvariable
-    _ipf->compute1state(IPStateBase::current,true);
+    bool ok = _ipf->compute1state(IPStateBase::current,true);
+    #if defined(HAVE_MPI)
+    if (this->getNumRanks() > 1)
+    {
+      int val = (ok)? 0: 1;
+      MPI_Allreduce(MPI_IN_PLACE,&val, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD);      
+      ok = (val==0);    
+    }
+    #endif //HAVE_MPI
+    if (!ok)
+    {
+      Msg::Warning("The evaluation of constutitive laws is failed at some GPs");
+      return _timeManager->getMaxNbIterations(); // for isnan case
+    }
 		// update load
 		double loadParam = pathsys->getControlParameter();
 		double dloadParam = fabs(pathsys->getControlParameterStep());
diff --git a/NonLinearSolver/nlsolver/staticDofManager.cpp b/NonLinearSolver/nlsolver/staticDofManager.cpp
index db51d8a0edafa302d6261b4c43d9108b37c1bda8..e021c3d83e28768a19d41619a4171c3e8e74b7b7 100644
--- a/NonLinearSolver/nlsolver/staticDofManager.cpp
+++ b/NonLinearSolver/nlsolver/staticDofManager.cpp
@@ -1405,6 +1405,16 @@ void staticDofManager::clearRHSfixed()
     itR->second = 0.;
 };
 
+double staticDofManager::getNorm1ReactionForce() const
+{
+  double maxVal = 0;
+  for(std::map<Dof,double>::const_iterator itR = RHSfixed.begin();itR != RHSfixed.end(); ++itR)
+  {
+    maxVal += fabs(itR->second);
+  }
+  return maxVal;
+};
+
 void staticDofManager::getReactionForceOnFixedPhysical(archiveForce& af) const
 {
   af.fval =0.;
diff --git a/NonLinearSolver/nlsolver/staticDofManager.h b/NonLinearSolver/nlsolver/staticDofManager.h
index 9089df1148c76a5f86939de401a8525671ff358f..e71fea8286f16c789229b1d00bf421f3480833dd 100644
--- a/NonLinearSolver/nlsolver/staticDofManager.h
+++ b/NonLinearSolver/nlsolver/staticDofManager.h
@@ -124,6 +124,7 @@ class nlsDofManager
     virtual void preAllocateEntries() = 0;
     // operations
     virtual void clearRHSfixed() = 0;
+    virtual double getNorm1ReactionForce() const = 0;
     virtual void getReactionForceOnFixedPhysical(archiveForce& af) const = 0;
     virtual void getForces(std::vector<archiveForce> &vaf) const = 0;
     virtual double getKineticEnergy(const int systemSizeWithoutRigidContact,FilterDofSet &fildofcontact) const = 0;
@@ -265,7 +266,7 @@ class staticDofManager : public nlsDofManager
     
     // zero for RHSfixed
     virtual void clearRHSfixed();    
-
+    virtual double getNorm1ReactionForce() const;
     virtual void getReactionForceOnFixedPhysical(archiveForce& af) const;
     virtual void getForces(std::vector<archiveForce> &vaf) const;
     virtual double getKineticEnergy(const int systemSizeWithoutRigidContact,FilterDofSet &fildofcontact) const;
diff --git a/README.md b/README.md
index 0a546b2d5824accf6726f7d456d7efc042047255..a1bf7cc7a3ad4a8b3619d938abb1abe8a496820b 100644
--- a/README.md
+++ b/README.md
@@ -176,8 +176,9 @@ To use torch you can follow the instructions either [2.1. Without GPU capability
 ```bash
 cd && cd local 
 ```
+Here below to update with the last stable version from ```https://pytorch.org/```
 ```bash
-wget https://download.pytorch.org/libtorch/cpu/libtorch-shared-with-deps-2.1.1%2Bcpu.zip 
+wget https://download.pytorch.org/libtorch/cpu/libtorch-shared-with-deps-2.3.0%2Bcpu.zip 
 ```
  2. Unzip the archive, this will be extracted in ```$HOME/local/libtorch``` by default so make sure that directory does not exist: 
 ```bash
diff --git a/dG3D/benchmarks/CMakeLists.txt b/dG3D/benchmarks/CMakeLists.txt
index c1aa55d376a128f263e4431660c207cdde3bcd57..586558b5567154cd8f0eca3f1e50d639ccdd954a 100644
--- a/dG3D/benchmarks/CMakeLists.txt
+++ b/dG3D/benchmarks/CMakeLists.txt
@@ -224,6 +224,7 @@ add_subdirectory(defoDefoContactSlaveEdge2DQuadPert)
 add_subdirectory(defoDefoContactSlaveEdge2D2ndOrderTri)
 add_subdirectory(defoDefoContactSlaveVolume3DLinear)
 add_subdirectory(defoDefoContactSlaveFace3DLinear)
+add_subdirectory(impactSphere)
 add_subdirectory(Gurson_Cube_I1J2J3)
 add_subdirectory(GursonMultipleNonlocal_PathFollowing)
 add_subdirectory(Thomason_cube_I1J2J3)
diff --git a/dG3D/benchmarks/impactSphere/CMakeLists.txt b/dG3D/benchmarks/impactSphere/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..b4c79a585554fd46d4d54148676cfefad1997936
--- /dev/null
+++ b/dG3D/benchmarks/impactSphere/CMakeLists.txt
@@ -0,0 +1,10 @@
+# test file
+
+set(PYFILE impact.py)
+
+set(FILES2DELETE 
+  *.msh
+  *.csv
+)
+
+add_cm3python_test(${PYFILE} "${FILES2DELETE}")
diff --git a/dG3D/benchmarks/impactSphere/VEVP.py b/dG3D/benchmarks/impactSphere/VEVP.py
new file mode 100755
index 0000000000000000000000000000000000000000..cb6af3a13bec6a3b123190e68abf8c2e874b8b4e
--- /dev/null
+++ b/dG3D/benchmarks/impactSphere/VEVP.py
@@ -0,0 +1,200 @@
+#coding-Utf-8-*-
+from gmshpy import *	
+from dG3Dpy import *			
+						
+import pickle
+import numpy as np
+
+
+def FillMatPara(x_E,x_P,VEVP):    #x = [E0,nu0,K1,G1,....,tk,tg, aP]
+  tk = np.power(10.0, x_E[int(len(x_E)-3)])
+  tg = np.power(10.0, x_E[int(len(x_E)-2)])
+  MatPara = []
+  MatPara.append([x_E[0], x_E[1]])
+  Ki = []
+  Gi = []
+  N = int((len(x_E)-5)/2)
+  for i in range(N):
+    a = 1.0/np.power(10.0, i)
+    Ki.append([np.power(10.0,x_E[2+2*i]), a*tk])
+    Gi.append([np.power(10.0,x_E[2+2*i+1]), a*tg])
+  MatPara.append(Ki)
+  MatPara.append(Gi)
+ 
+  
+  if(VEVP):
+    Compression = []
+    Tension = []
+    ViscoPlastic = []
+    
+    Compression.append(x_P[0])
+    Tension.append(x_P[4])
+    for i in range(1,3):
+      Compression.append(np.power(10.0, x_P[i]))
+      Tension.append(np.power(10.0, x_P[4+i]))
+    Compression.append(x_P[3])
+    Tension.append(x_P[7])  
+      
+    for i in range(4):  
+      ViscoPlastic.append(x_P[8+i])       
+      
+    MatPara.append(Compression)
+    MatPara.append(Tension) 
+    MatPara.append(ViscoPlastic) 
+  return MatPara
+############################################################################  
+
+
+
+
+def RunCase(LoadCase,MatPara, VEVP):
+  
+  nstep = 800 # number of step (used only if soltype=1)
+  # === Problem parameters ============================================================================ 
+  E0 = MatPara[0][0]
+  nu0 = MatPara[0][1]
+  Nt = len(MatPara[1])    #the number of branches in the generalized Maxwell model 
+  aP = 1.0 
+
+  if(VEVP):
+    indxplastic = 3 
+    sy0c = MatPara[indxplastic][0]  #MPa, compressive yield stress
+    hc = MatPara[indxplastic][1]
+    hc2 = MatPara[indxplastic][2]
+    kc = MatPara[indxplastic][3]
+  
+    sy0t = MatPara[indxplastic+1][0]*sy0c   #MPa, compressive yield stress
+    ht = MatPara[indxplastic+1][1]
+    ht2 = MatPara[indxplastic+1][2]
+    kt = MatPara[indxplastic+1][3]
+   
+    alpha = MatPara[indxplastic+2][0]
+    beta = MatPara[indxplastic+2][1]
+    eta = MatPara[indxplastic+2][2]
+    p = MatPara[indxplastic+2][3]
+    
+  #=============================================    
+  lawnum = 11
+  rho = 7850e-9
+  
+  if(VEVP):
+    law1 = HyperViscoElastoPlasticPowerYieldDG3DMaterialLaw(lawnum,rho,E0,nu0)
+  else:
+    law1 = HyperViscoElasticDG3DMaterialLaw(lawnum,rho,E0,nu0)
+      
+  law1.setViscoelasticMethod(0)
+  law1.setViscoElasticNumberOfElement(Nt)
+  for i in range(Nt):
+    law1.setViscoElasticData_Bulk(i+1, MatPara[1][i][0], aP*MatPara[1][i][1])
+    law1.setViscoElasticData_Shear(i+1, MatPara[2][i][0], aP*MatPara[2][i][1])
+  law1.setStrainOrder(5) 
+  #-----------------------------------------------------------------------------
+  if(VEVP):  
+    hardenc = LinearExponentialJ2IsotropicHardening(1, sy0c, hc, hc2, kc)
+    hardent = LinearExponentialJ2IsotropicHardening(2, sy0t, ht, ht2, kt)
+  
+    law1.setCompressionHardening(hardenc)
+    law1.setTractionHardening(hardent)
+  
+    law1.setYieldPowerFactor(alpha)
+    law1.setNonAssociatedFlow(True)
+    law1.nonAssociatedFlowRuleFactor(beta)
+    etac = constantViscosityLaw(1,eta)
+    law1.setViscosityEffect(etac,p)
+
+  
+  if(LoadCase[0] == 0):
+    ft1 = 5.732	
+    eps = -0.0157 
+    if(VEVP):
+      ft1 = 106.5
+      eps = -0.296	
+    ftime = LoadCase[2]
+  else:
+    strainrate = LoadCase[1]
+    strain_end = LoadCase[2]
+    ftime = strain_end/strainrate	# Final time (used only if soltype=1)  
+ # print("######################",strain_end,strainrate,ftime)
+  # ===Solver parameters=============================================================================
+  sol = 2  # Gmm=0 (default) Taucs=1 PETsc=2
+  soltype = 1 # StaticLinear=0 (default) StaticNonLinear=1
+  tol=1.e-5  # relative tolerance for NR scheme (used only if soltype=1)
+  nstepArch=10 # Number of step between 2 archiving (used only if soltype=1)
+  fullDg = 0 #O = CG, 1 = DG
+  space1 = 0 # function space (Lagrange=0)
+  beta1  = 100						
+
+  # ===Domain creation===============================================================================
+  # creation of ElasticField
+  myfield1 = dG3D1DDomain(11,11,space1,lawnum, False) #for non local
+  myfield1.setState(1) #UniaxialStrain=0, UniaxialStress =1,ConstantTriaxiality=2
+  L = 5.
+  
+  # ===Solver creation===============================================================================
+  # geometry & mesh
+  geofile = "line.geo"
+  meshfile = "line.msh"
+  
+  # creation of Solver
+  mysolver = nonLinearMechSolver(1000)
+  #mysolver.createModel(geofile,meshfile,1,1)
+  mysolver.loadModel(meshfile)
+  mysolver.addDomain(myfield1)
+  mysolver.addMaterialLaw(law1)
+  mysolver.Scheme(soltype)
+  mysolver.Solver(sol)
+  mysolver.snlData(nstep,ftime,tol)
+  mysolver.stepBetweenArchiving(nstepArch)
+
+  mysolver.snlManageTimeStep(15,5,2.,20) # maximal 20 times
+
+# ===Boundary conditions===========================================================================
+  mysolver.displacementBC("Edge",11,1,0.)
+  mysolver.displacementBC("Edge",11,2,0.)
+  mysolver.displacementBC("Node",1,0,0.)
+  
+  disp = PiecewiseLinearFunction()
+  disp.put(0.,0.) 
+  if(LoadCase[0] != 0):
+    disp.put(ftime, LoadCase[0]*strain_end*L)
+  else:  
+    disp.put(ft1,eps*L)  
+    disp.put(ftime,eps*L) 
+    
+  mysolver.displacementBC("Node",2,0,disp)	
+  mysolver.archivingAverageValue(IPField.F_XX)
+  mysolver.archivingAverageValue(IPField.P_XX)
+
+  # ===Solving=======================================================================================
+  mysolver.SetVerbosity(0)
+  mysolver.solve()   
+  return  
+
+
+#def test():
+#  print("It works!!")
+
+
+#MatPara=   
+#RunCase(L_Case,MatPara,VEVP)    	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dG3D/benchmarks/impactSphere/impact.py b/dG3D/benchmarks/impactSphere/impact.py
new file mode 100755
index 0000000000000000000000000000000000000000..c31e3a8c47ac4e05214232cbf6be3f7ce37edf9d
--- /dev/null
+++ b/dG3D/benchmarks/impactSphere/impact.py
@@ -0,0 +1,245 @@
+#coding-Utf-8-*-
+from gmshpy import *
+from dG3Dpy import*
+# import functions from VEVP.py
+from VEVP import *
+import math
+
+
+# geometry ===================================================================
+# Input .msh
+#meshfile = "square.msh" # name of mesh file
+
+meshfile = 'impactSphere.msh'
+geofile = 'impactSphere.geo' # name of mesh file
+order = 1  #order of elements, better use one with contact
+rigidContact = False #True to use a contact below, False to clamp the plate
+
+
+#parameters
+nstep = 400   # number of step
+ftime = 1e-3  # Final time v0 = 0.1mm/s, pour la demi structure v = v0/2
+nstepArch = 4 # Number of step between 2 archiving (used only if soltype=1)
+tol = 1e-4
+
+penalty= 1.e3
+
+# material law for impactor
+EImpactor = 2e5
+nuImpactor = 0.3
+mm=1.
+RextImpactor = 60.*mm
+RintImpactor = 50.*mm
+lawnum3      = 3
+VolImpactor    = math.pi*(RextImpactor**3-RintImpactor**3)*4./3./8.
+MassImpactor = 5.*(1e-3/mm)/4. #in tonnes if mm=1
+rhoImpactor  = MassImpactor/VolImpactor
+velocity     = -1.*(2.*9.81*1.8)**0.5*(mm/1.e-3)
+print("Density Impactor = ", rhoImpactor, "; Velocity Impactor = ", velocity)
+
+law3 = J2LinearDG3DMaterialLaw(lawnum3,rhoImpactor,EImpactor,nuImpactor,1000.*EImpactor,10.)
+
+#VEVP Law for plates as to generate the sve: line 70 000 of the MCMC
+x=[1374.2643289981168, 0.2826036623239532, 4.220196044260534, -0.06622730551411246, -0.2361729746734328, 1.0658488572731906, 2.955587774357835, 0.8846323146785388, 2.1134546059887156, 0.3900795755310005, -0.07807917229891632, 1.3340258222804844, 3.8978259552106973, 0.8147820955100668, 1.7082119337043935, 3.1818481562348735, 3.1460140132039993, 0.952562223405303, 1.0351529596236166, 0.8971311953490693, 0.04770622785629489, 29.696376534920287, -2.5325714558968597, 1.1573320881902116, 299.0940006076202, 0.7771046411287497, 2.1446624378399077, -3.183873130566032, 9648.947729066591, 3.7047493821391746, 0.2175363944799915, 5.182554847703984, 0.17938765700173523]
+
+	
+numVE = 21
+number_of_parametrs = len(x)
+x_E = list(x)[0:numVE]
+x_P = list(x)[numVE:number_of_parametrs] 
+VEVP = True # "Compression"
+MatPara=FillMatPara(x_E,x_P,VEVP)
+
+E0 = MatPara[0][0]
+nu0 = MatPara[0][1]
+Nt = len(MatPara[1])    #the number of branches in the generalized Maxwell model 
+aP = 1.0 
+
+indxplastic = 3 
+sy0c = MatPara[indxplastic][0]  #MPa, compressive yield stress
+hc = MatPara[indxplastic][1]
+hc2 = MatPara[indxplastic][2]
+kc = MatPara[indxplastic][3]
+  
+sy0t = MatPara[indxplastic+1][0]*sy0c   #MPa, compressive yield stress
+ht = MatPara[indxplastic+1][1]
+ht2 = MatPara[indxplastic+1][2]
+kt = MatPara[indxplastic+1][3]
+   
+alpha = MatPara[indxplastic+2][0]
+beta = 1.5*MatPara[indxplastic+2][1]
+eta = MatPara[indxplastic+2][2]
+p = MatPara[indxplastic+2][3]
+    
+lawnum1 = 11
+rho = 1200e-12
+  
+law1 = HyperViscoElastoPlasticPowerYieldDG3DMaterialLaw(lawnum1,rho,E0,nu0)
+law1.setViscoelasticMethod(0)
+law1.setViscoElasticNumberOfElement(Nt)
+for i in range(Nt):
+  law1.setViscoElasticData_Bulk(i+1, MatPara[1][i][0], aP*MatPara[1][i][1])
+  law1.setViscoElasticData_Shear(i+1, MatPara[2][i][0], aP*MatPara[2][i][1])
+law1.setStrainOrder(5) 
+
+hardenc = LinearExponentialJ2IsotropicHardening(1, sy0c, hc, hc2, kc)
+hardent = LinearExponentialJ2IsotropicHardening(2, sy0t, ht, ht2, kt)
+  
+law1.setCompressionHardening(hardenc)
+law1.setTractionHardening(hardent)
+  
+law1.setYieldPowerFactor(alpha)
+law1.setNonAssociatedFlow(True)
+law1.nonAssociatedFlowRuleFactor(beta)
+etac = constantViscosityLaw(1,eta)
+law1.setViscosityEffect(etac,p)
+if (order==1):
+  law1.setUseBarF(True)
+
+# lattice  here to change
+lawnum2=2
+law2 = HyperViscoElastoPlasticPowerYieldDG3DMaterialLaw(lawnum2,rho*0.02,E0*0.02,nu0)
+law2.setViscoelasticMethod(0)
+law2.setViscoElasticNumberOfElement(Nt)
+for i in range(Nt):
+  law2.setViscoElasticData_Bulk(i+1, MatPara[1][i][0]*0.02, aP*MatPara[1][i][1])
+  law2.setViscoElasticData_Shear(i+1, MatPara[2][i][0]*0.02, aP*MatPara[2][i][1])
+law2.setStrainOrder(5) 
+
+hardenc2 = LinearExponentialJ2IsotropicHardening(3, sy0c*0.02, hc*0.02, hc2*0.02, kc)
+hardent2 = LinearExponentialJ2IsotropicHardening(4, sy0t*0.02, ht*0.02, ht2*0.02, kt)
+  
+law2.setCompressionHardening(hardenc2)
+law2.setTractionHardening(hardent2)
+  
+law2.setYieldPowerFactor(alpha)
+law2.setNonAssociatedFlow(True)
+law2.nonAssociatedFlowRuleFactor(beta)
+eta2 = constantViscosityLaw(2,eta)
+law2.setViscosityEffect(eta2,p)
+
+if (order==1):
+  law2.setUseBarF(True)  #maybe no need if no locking
+
+
+# data law def ============================================================
+
+# solver info ============================================================
+sol = 2  # Gmm=0 (default) Taucs=1 PETsc=2
+soltype = 4 # StaticLinear=0 (default) StaticNonLinear=1
+fullDg = 0 #O = CG, 1 = DG
+space1 = 0 # function space (Lagrange=0)
+# solver info ============================================================
+
+# creation of Domain
+#Impactor
+nfield3 = 1001 # number of the field (physical number of volume in 3D)
+myfield3 = dG3DDomain(1000,nfield3,space1,lawnum3,fullDg)
+
+#Plates
+nfield1_1 = 51 # number of the field (physical number of volume in 3D)
+myfield1_1 = dG3DDomain(1001,nfield1_1,space1,lawnum1,fullDg)
+myfield1_1.strainSubstep(2,10)
+
+nfield1_2 = 52 # number of the field (physical number of volume in 3D)
+myfield1_2 = dG3DDomain(1001,nfield1_2,space1,lawnum1,fullDg)
+myfield1_2.strainSubstep(2,10)
+
+#lattice
+nfield2 = 53 # number of the field (physical number of volume in 3D)
+myfield2 = dG3DDomain(1001,nfield2,space1,lawnum2,fullDg)
+myfield2.strainSubstep(2,10)
+
+
+
+
+# creation of ElasticField ==============================================================
+
+# Solver ==============================================================
+mysolver = nonLinearMechSolver(1002)
+mysolver.createModel(geofile,meshfile,3,order)
+#mysolver.loadModel(meshfile)
+mysolver.addDomain(myfield1_1)
+mysolver.addDomain(myfield1_2)
+mysolver.addDomain(myfield2)
+mysolver.addDomain(myfield3)
+mysolver.addMaterialLaw(law1)
+mysolver.addMaterialLaw(law2)
+mysolver.addMaterialLaw(law3)
+mysolver.Scheme(soltype)
+mysolver.Solver(sol)
+mysolver.snlData(nstep,ftime,tol,tol/100.)
+mysolver.stepBetweenArchiving(nstepArch)
+mysolver.implicitSpectralRadius(0.05)
+mysolver.snlManageTimeStep(50, 3, 2, 10)
+#mysolver.options("-ksp_type preonly -pc_type lu -pc_factor_mat_solver_type mumps")
+
+# Solver ==============================================================
+
+# BC ==============================================================
+# blocked in z bottom if no rigid contact with plane
+if rigidContact==False:
+  mysolver.displacementBC("Face",200,2,0.)
+
+# blocked in y side
+mysolver.displacementBC("Face",101,1,0.)
+mysolver.displacementBC("Face",1001,1,0.)
+# blocked in x side
+mysolver.displacementBC("Face",100,0,0.)
+mysolver.displacementBC("Face",1000,0,0.)
+
+mysolver.initialBC("Volume","Velocity",1001,2,velocity)
+
+# BC ==============================================================
+
+# Contact
+
+
+defoDefoContact1=dG3DNodeOnSurfaceContactDomain(1002, 2, 2000, 2,201, 10.*penalty, 3.*mm)
+mysolver.defoDefoContactInteraction(defoDefoContact1)
+defoDefoContact2=dG3DNodeOnSurfaceContactDomain(1003, 2, 201, 2,2000, penalty, 3.*mm)
+mysolver.defoDefoContactInteraction(defoDefoContact2)
+
+
+
+if rigidContact==True:
+  flaw1 = CoulombFrictionLaw(1,0.,0.0,penalty,penalty/1000.)
+  contact1 = dG3DRigidPlaneContactDomain(1004,2,10001,3,nfield1_1,11001,0.,0.,1.,penalty,3.*mm,1e3)
+  contact1.setFriction(False)
+  contact1.addFrictionLaw(flaw1)
+  mysolver.contactInteraction(contact1)
+
+  #mysolver.displacementRigidContactBC(10001,2,0.)
+
+  #mysolver.archivingForceOnPhysicalGroup("Face", 10001, 2,1)  
+  #mysolver.archivingRigidContact(10001,2,0, 1)
+  #mysolver.archivingRigidContactForce(11001, 2, 1)
+#Contact
+
+
+# save
+mysolver.internalPointBuildView("svm",IPField.SVM, 1, nstepArch)
+# save stress tensor
+mysolver.internalPointBuildView("sig_xx",IPField.SIG_XX, 1, nstepArch)
+mysolver.internalPointBuildView("sig_yy",IPField.SIG_YY, 1, nstepArch)
+mysolver.internalPointBuildView("sig_zz",IPField.SIG_ZZ, 1, nstepArch)
+mysolver.internalPointBuildView("sig_xy",IPField.SIG_XY, 1, nstepArch)
+mysolver.internalPointBuildView("sig_yz",IPField.SIG_YZ, 1, nstepArch)
+mysolver.internalPointBuildView("sig_xz",IPField.SIG_XZ, 1, nstepArch)
+# save platic strain
+mysolver.internalPointBuildView("epl",IPField.PLASTICSTRAIN, 1, nstepArch)
+# save bottom force
+mysolver.archivingForceOnPhysicalGroup("Face", 100, 2,1)
+
+#save impactor displacement, velocity etc ...
+mysolver.archivingNodeDisplacement(1002, 2,1)
+mysolver.archivingNodeVelocity(1002, 2,1);
+mysolver.archivingNodeAcceleration(1002, 2, 1);
+
+
+mysolver.solve()
+
+check = TestCheck()
+check.equal(4.059531e+02,mysolver.getArchivedForceOnPhysicalGroup("Face", 100, 2),1.e-6)
+
+
diff --git a/dG3D/benchmarks/impactSphere/impactSphere.geo b/dG3D/benchmarks/impactSphere/impactSphere.geo
new file mode 100644
index 0000000000000000000000000000000000000000..1f35bd3568a18e44717a47bc6df53acd61ae086e
--- /dev/null
+++ b/dG3D/benchmarks/impactSphere/impactSphere.geo
@@ -0,0 +1,133 @@
+SetFactory("OpenCASCADE");
+
+Mesh.Optimize = 1;
+Mesh.SecondOrderLinear = 1;
+mm = 1.; // Unit
+//Geometry.AutoCoherence = 0.000000001*mm;
+//Geometry.Tolerance = 0.000000001*mm; // adjust value here for correct merge result
+Mesh.CharacteristicLengthMin = 1.*mm;
+Mesh.CharacteristicLengthMax = 25.*mm;
+
+
+
+
+
+
+RextLattice = 100*mm;
+HLattice    = 4.*7.5*mm;
+LLattice    = 7.5*mm; //mesh size
+
+
+LowerPlate  = 2.*mm;
+UpperPlate  = 2.*mm;
+LPlate      = 7.5*mm; //mesh size
+
+RextImpactor = 60*mm;
+RintImpactor = 50.*mm;
+LImpactor    = 10*mm; //mesh size
+
+
+// lower plate
+plate()+=newv;  Cylinder(newv) = {0,0,0, 0,0,LowerPlate, RextLattice, Pi/2.};
+// upper plate
+plate()+=newv;  Cylinder(newv) = {0,0,LowerPlate+HLattice, 0,0,UpperPlate, RextLattice, Pi/2.};
+
+Characteristic Length { PointsOf{ Volume{ plate[] };  } } = LPlate;
+
+// lattice part
+lattice()+=newv;  Cylinder(newv) = {0,0,LowerPlate, 0,0,HLattice, RextLattice, Pi/2.};
+Characteristic Length { PointsOf{ Volume{ lattice[] };  } } = LLattice;
+
+
+
+
+//impactor
+//+
+impactortmp()+=newv; Sphere(newv) = {0.-0.0001*mm, 0.-0.0001*mm, LowerPlate+HLattice+UpperPlate+RextImpactor+0.000001*mm, RextImpactor, -Pi/2, 0., Pi/2.};
+//+
+impactortmp()+=newv; Sphere(newv) = {0.-0.0001*mm, 0.-0.0001*mm, LowerPlate+HLattice+UpperPlate+RextImpactor+0.000001*mm, RintImpactor, -Pi/2, 0., Pi/2.};
+
+impactor()+=newv; BooleanDifference(newv) = { Volume{impactortmp(0)}; Delete; }{ Volume{impactortmp(1)}; Delete; };
+Characteristic Length { PointsOf{ Volume{ impactor[] };  } } = LImpactor;
+
+
+Coherence;
+
+surflowerplate[] = Abs(Boundary{ Volume{plate(0)}; });
+Printf("surf lower plate ",surflowerplate());
+surfupperplate[] = Abs(Boundary{ Volume{plate(1)}; });
+Printf("surf upper plate ",surfupperplate());
+surflattice[]    = Abs(Boundary{ Volume{lattice(0)}; });
+Printf("surf lattice ",surflattice());
+surfimpactor[]    = Abs(Boundary{ Volume{impactor(0)}; });
+
+Printf("surf impactor ",surfimpactor());
+
+ptimpactor[] = PointsOf{ Surface{surfimpactor(1)}; };
+Printf("pts impactor ",ptimpactor());
+
+
+
+
+
+OXZ=101;
+Physical Surface(OXZ) = {surflowerplate(3), surflattice(3),surfupperplate(3)};
+OYZ=100;
+Physical Surface(OYZ) = {surflowerplate(4), surflattice(4),surfupperplate(4)};
+
+OXYLOW=200;
+Physical Surface(OXYLOW) = {surflowerplate(2)};
+OXYUP=201;
+Physical Surface(OXYUP) = {surfupperplate(1)};
+
+LOWERPLATE=51;
+Physical Volume(LOWERPLATE) = {plate(0)};
+UPPERPLATE=52;
+Physical Volume(UPPERPLATE) = {plate(1)};
+
+LATTICE=53;
+Physical Volume(LATTICE) = {lattice(0)};
+
+
+OXZIMPACTOR=1001;
+Physical Surface(OXZIMPACTOR) = {surfimpactor(3)};
+OYZIMPACTOR=1000;
+Physical Surface(OYZIMPACTOR) = {surfimpactor(2)};
+
+OXYIMPACTORLOW=2000;
+Physical Surface(OXYIMPACTORLOW) ={surfimpactor(0)};
+OXYIMPACTORUP=2001;
+Physical Surface(OXYIMPACTORUP) = {surfimpactor(1)};
+
+IMPACTOR=1001;
+Physical Volume(IMPACTOR) = {impactor(0)};
+
+PTIMPACTOR = 1002;
+Physical Point(PTIMPACTOR) = {ptimpactor(2)};
+
+
+//rigid contact
+X_contact=-0.1*mm;
+Y_contact=-0.1*mm;
+Z_contact=-0.0000001*mm;
+L_contact=RextLattice+2.*mm;
+Point(11001) = {X_contact,Y_contact,Z_contact};
+Point(11002) = {X_contact,Y_contact+L_contact,Z_contact};
+Point(11003) = {X_contact+L_contact,Y_contact+L_contact,Z_contact};
+Point(11004) = {X_contact+L_contact,Y_contact,Z_contact};
+Line(10001) = {11001, 11002};
+Line(10002) = {11002, 11003};
+Line(10003) = {11003, 11004};
+Line(10004) = {11004, 11001};
+Line Loop(10001) = {10004, 10001, 10002, 10003};
+Physical Point(11001) = {11001};
+Plane Surface(10001) = {10001};
+Transfinite Line {10001,10002,10003,10004} = 2 Using Progression 1;
+Transfinite Surface {10001};
+Recombine Surface {10001};
+RIGIDCONTACT=10001;
+Physical Surface(RIGIDCONTACT) = {10001};
+
+Coherence;
+
+
diff --git a/dG3D/benchmarks/nonLinearTVP_allExtraBranches_cube/cube.geo b/dG3D/benchmarks/nonLinearTVP_allExtraBranches_cube/cube.geo
index e322959204440d14a93a5e085dce5e6ab743d194..7b69582119311ad0f199829d872fc7eb4f36c967 100644
--- a/dG3D/benchmarks/nonLinearTVP_allExtraBranches_cube/cube.geo
+++ b/dG3D/benchmarks/nonLinearTVP_allExtraBranches_cube/cube.geo
@@ -1,5 +1,5 @@
 // Cube.geo
-mm=1.0e-3;	// Units
+mm=1.0;	// Units
 n=1;		// Number of layers (in thickness / along z)
 m = 1;		// Number of element + 1 along y
 p = 1; 		// Number of element + 1 along x
diff --git a/dG3D/benchmarks/nonLinearTVP_allExtraBranches_cube/cubeTVP.py b/dG3D/benchmarks/nonLinearTVP_allExtraBranches_cube/cubeTVP.py
index b9de9ab09a709683bfe6b7b5b5194dfe25eb2843..f6b4f958964f031502eb52dc8f688ea8392b7a68 100644
--- a/dG3D/benchmarks/nonLinearTVP_allExtraBranches_cube/cubeTVP.py
+++ b/dG3D/benchmarks/nonLinearTVP_allExtraBranches_cube/cubeTVP.py
@@ -91,7 +91,7 @@ hardenk.setCoefficients(1,1.) # 300.)
 hardenk.setCoefficients(2,2.) # 200.)
 hardenk.setCoefficients(3,5.)
 
-law1 = NonLinearTVENonLinearTVPDG3DMaterialLaw(lawnum,rho,E,nu,1e-6,Tinitial,Alpha,KThCon,Cp,False,1e-8)
+law1 = NonLinearTVENonLinearTVPDG3DMaterialLaw(lawnum,rho,E,nu,1e-6,Tinitial,Alpha,KThCon,Cp,False,1e-8,1e-8)
 
 law1.setCompressionHardening(hardenc)
 law1.setTractionHardening(hardent)
@@ -119,22 +119,29 @@ 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.setCorrectionsAllBranchesTVE(i, 1., 2000., 1.686, 1., 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)
 
+mullins = linearScaler(4, 0.55)
+a = -0.9/(90.)
+x0 = 273.15-20
+linear_tempfunc = linearScalarFunction(x0,0.9,a)
+# mullins.setTemperatureFunction_r(linear_tempfunc)
+# law1.setMullinsEffect(mullins)
+
 eta = constantViscosityLaw(1,1000.) #(1,3e4)
 law1.setViscosityEffect(eta,0.1)
 # eta.setTemperatureFunction(negExp_tempfunc)
-law1.setIsotropicHardeningCoefficients(1.,1.,1.)
+# law1.setIsotropicHardeningCoefficients(1.,1.,1.)
 
 
 # solver
 sol = 2  # Gmm=0 (default) Taucs=1 PETsc=2
 soltype = 1 # StaticLinear=0 (default) StaticNonLinear=1
-nstep = 1000 # 100   # number of step (used only if soltype=1)
+nstep = 100 # 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)
@@ -157,10 +164,11 @@ myfield1 = ThermoMechanicsDG3DDomain(1000,nfield,space1,lawnum,fullDg,ThermoMech
 myfield1.setConstitutiveExtraDofDiffusionAccountSource(thermalSource,mecaSource)
 myfield1.stabilityParameters(beta1)
 myfield1.ThermoMechanicsStabilityParameters(beta1,bool(1))
+# myfield1.strainSubstep(2, 10)
 
 # creation of Solver
 mysolver = nonLinearMechSolver(1000)
-mysolver.createModel(geofile,meshfile,3,1)
+mysolver.createModel(geofile,meshfile,3,2)
 mysolver.loadModel(meshfile)
 mysolver.addDomain(myfield1)
 mysolver.addMaterialLaw(law1)
@@ -168,9 +176,10 @@ mysolver.Scheme(soltype)
 mysolver.Solver(sol)
 mysolver.snlData(nstep,ftime,tol)
 mysolver.stepBetweenArchiving(nstepArch)
+mysolver.snlManageTimeStep(15,5,2.,20) # maximal 20 times
 
 # BCs
-length = 1.e-3
+length = 1.
 umax = -0.65*length # 0.04*length
 fu_L = LinearFunctionTime(0,0,ftime,umax);    # Linear Displacement with time
 
@@ -218,4 +227,4 @@ mysolver.solve()
 # Check
 check = TestCheck()
 # 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)
+check.equal(2.911073148114768e+01,mysolver.getArchivedForceOnPhysicalGroup("Face", 30, 0),1.e-4)
diff --git a/dG3D/src/dG3D1DDomain.cpp b/dG3D/src/dG3D1DDomain.cpp
index 2bdc1ddc9e676efeee714ede54184692952ec854..386f8bbd0c96426aa0bd8855650307727cd06aeb 100644
--- a/dG3D/src/dG3D1DDomain.cpp
+++ b/dG3D/src/dG3D1DDomain.cpp
@@ -201,10 +201,10 @@ void dG3D1DDomain::createTerms(unknownField *uf,IPField*ip)
 }
 
 
-void dG3D1DDomain::computeIpv(AllIPState *aips,MElement *e, IPStateBase::whichState ws,
+bool dG3D1DDomain::computeIpv(AllIPState *aips,MElement *e, IPStateBase::whichState ws,
                                         materialLaw *mlaw__,fullVector<double> &disp, bool stiff)
 {
-	if (!getElementErosionFilter()(e)) return;
+	if (!getElementErosionFilter()(e)) return true;
 
   dG3DMaterialLaw *mlaw;
   if(mlaw__->getType() == materialLaw::fracture)
@@ -237,5 +237,10 @@ void dG3D1DDomain::computeIpv(AllIPState *aips,MElement *e, IPStateBase::whichSt
     else {
       Msg::Error("state must be set via dG3D1DDomain::setState");
     }
+    if (!(ipv->getConstitutiveSuccessFlag()))
+    {
+      return false;
+    }
   }
+  return true;
 };
diff --git a/dG3D/src/dG3D1DDomain.h b/dG3D/src/dG3D1DDomain.h
index ab5836607e4ac456988e20922de7043bb2715518..516a6a8595a59ec540fa0208aa2fa0c54d88b60d 100644
--- a/dG3D/src/dG3D1DDomain.h
+++ b/dG3D/src/dG3D1DDomain.h
@@ -46,13 +46,14 @@ class dG3D1DDomain : public dG3DDomain{
     virtual void createTerms(unknownField *uf,IPField*ip);
     virtual partDomain* clone() const {return new dG3D1DDomain(*this);};
 
-    virtual void computeIpv(AllIPState *aips,MElement *e, IPStateBase::whichState ws,
+    virtual bool computeIpv(AllIPState *aips,MElement *e, IPStateBase::whichState ws,
                                   materialLaw *mlaw,fullVector<double> &disp, bool stiff);
-    virtual void computeIpv(AllIPState *aips,MInterfaceElement *ie, IntPt *GP,const IPStateBase::whichState ws,
+    virtual bool computeIpv(AllIPState *aips,MInterfaceElement *ie, IntPt *GP,const IPStateBase::whichState ws,
                                   partDomain* efMinus, partDomain *efPlus,materialLaw *mlawminus,
                                   materialLaw *mlawplus,fullVector<double> &dispm,
                                   fullVector<double> &dispp, const bool virt, bool stiff,const bool checkfrac=true){
       Msg::Error("dG3D1DDomain::computeIpv has not been implemented");
+      return false;
     };
 
     #endif //SWIG
diff --git a/dG3D/src/dG3DDomain.cpp b/dG3D/src/dG3DDomain.cpp
index 4e9a31c6422d043b7fd4519c602e83b2f5a6f690..2d71a3ce558b98081ce9e14036bedb31214c00f7 100644
--- a/dG3D/src/dG3DDomain.cpp
+++ b/dG3D/src/dG3DDomain.cpp
@@ -1923,7 +1923,7 @@ void dG3DDomain::setdFmdFM(AllIPState *aips, std::map<Dof, STensor3> &dUdF,const
     else
       mlawbulkp= static_cast<dG3DMaterialLaw*>(mlawPlus);
     if (mlawbulkm->getUseBarF()!=mlawbulkp->getUseBarF()) //check with the bulk law
-      Msg::Error("dG3DDomain::computeIpv All the constitutive laws need to use Fbar or not");
+      Msg::Error("dG3DDomain::setdFmdFM All the constitutive laws need to use Fbar or not");
     bool useBarF=mlawbulkm->getUseBarF();
     
     for(elementGroup::elementContainer::const_iterator it=gi->begin(); it!=gi->end();++it)
@@ -1981,7 +1981,7 @@ void dG3DDomain::setdFmdGM(AllIPState *aips, std::map<Dof, STensor33> &dUdG,cons
     else
       mlawbulkp= static_cast<dG3DMaterialLaw*>(mlawPlus);
     if (mlawbulkm->getUseBarF()!=mlawbulkp->getUseBarF()) //check with the bulk law
-      Msg::Error("dG3DDomain::computeIpv All the constitutive laws need to use Fbar or not");
+      Msg::Error("dG3DDomain::setdFmdGM All the constitutive laws need to use Fbar or not");
     bool useBarF=mlawbulkm->getUseBarF();
     
     for(elementGroup::elementContainer::const_iterator it=gi->begin(); it!=gi->end();++it)
@@ -2041,7 +2041,7 @@ void dG3DDomain::computeAllIPStrain(AllIPState *aips,const unknownField *ufield,
     else
       mlawbulkp= static_cast<dG3DMaterialLaw*>(mlawPlus);
     if (mlawbulkm->getUseBarF()!=mlawbulkp->getUseBarF()) //check with the bulk law
-      Msg::Error("dG3DDomain::computeIpv All the constitutive laws need to use Fbar or not");
+      Msg::Error("dG3DDomain::computeAllIPStrain All the constitutive laws need to use Fbar or not");
     bool useBarF=mlawbulkm->getUseBarF();
     //
     for(elementGroup::elementContainer::const_iterator it=gi->begin(); it!=gi->end();++it)
@@ -2274,7 +2274,7 @@ void dG3DDomain::computeAllIPStrain(AllIPState *aips,const unknownField *ufield,
 };
 
 
-void dG3DDomain::computeIPVariable(AllIPState *aips,const unknownField *ufield, const IPStateBase::whichState ws, bool stiff)
+bool dG3DDomain::computeIPVariable(AllIPState *aips,const unknownField *ufield, const IPStateBase::whichState ws, bool stiff)
 {
   _evalStiff = false; // directly access to computeIPv is for matrix by perturbation otherwise compute ipvarible thanks to this function
   if (ws == IPStateBase::initial)
@@ -2286,7 +2286,8 @@ void dG3DDomain::computeIPVariable(AllIPState *aips,const unknownField *ufield,
     #if defined(HAVE_MPI)
     if ((this->getMaterialLawMinus()->isNumeric() or this->getMaterialLawPlus()->isNumeric()) and this->_otherRanks.size()>0)
     {
-      this->computeIPVariableMPI(aips,ufield,ws,stiff);
+      bool ok = this->computeIPVariableMPI(aips,ufield,ws,stiff);
+      return ok;
     }
     else
     #endif //HAVE_MPI
@@ -2311,7 +2312,11 @@ void dG3DDomain::computeIPVariable(AllIPState *aips,const unknownField *ufield,
         dispp.resize(R.size());
         ufield->get(R,dispp);
         int npts = integBound->getIntPoints(it->second,&GP);
-        this->computeIpv(aips,ie, GP,ws,getMinusDomain(),getPlusDomain(),getMaterialLawMinus(),getMaterialLawPlus(),dispm,dispp,false,stiff);
+        bool success = this->computeIpv(aips,ie, GP,ws,getMinusDomain(),getPlusDomain(),getMaterialLawMinus(),getMaterialLawPlus(),dispm,dispp,false,stiff);
+        if (!success)
+        {
+          return false;
+        }
       }
       // bulk
       for (elementGroup::elementContainer::const_iterator it = g->begin(); it != g->end(); ++it)
@@ -2321,13 +2326,18 @@ void dG3DDomain::computeIPVariable(AllIPState *aips,const unknownField *ufield,
         getFunctionSpace()->getKeys(e,R);
         dispm.resize(R.size());
         ufield->get(R,dispm);
-        this->computeIpv(aips,e,ws,getMaterialLaw(),dispm,stiff);
+        bool success = this->computeIpv(aips,e,ws,getMaterialLaw(),dispm,stiff);
+        if (!success)
+        {
+          return false;
+        }
       }
 
     }
   }
   _evalStiff = true;
-}
+  return true;
+};
 
 void dG3DDomain::computeStrain(MElement *e, const int npts_bulk, IntPt *GP,
                                AllIPState::ipstateElementContainer *vips,
@@ -2588,10 +2598,10 @@ void dG3DDomain::computeStrain(MElement *e, const int npts_bulk, IntPt *GP,
     }
   }
 }
-void dG3DDomain::computeIpv(AllIPState *aips,MElement *e, IPStateBase::whichState ws,
+bool dG3DDomain::computeIpv(AllIPState *aips,MElement *e, IPStateBase::whichState ws,
                                         materialLaw *mlaw__,fullVector<double> &disp, bool stiff)
 {
-  if (!getElementErosionFilter()(e)) return;
+  if (!getElementErosionFilter()(e)) return true;
 
   dG3DMaterialLaw *mlaw;
   AllIPState::ipstateElementContainer *vips = aips->getIPstate(e->getNum());
@@ -2716,7 +2726,14 @@ void dG3DDomain::computeIpv(AllIPState *aips,MElement *e, IPStateBase::whichStat
     {
       Msg::Error("This substepping method %d has not been implemented",_subSteppingMethod);
     }
+    
+    if (!ipv->getConstitutiveSuccessFlag())
+    {
+      Msg::Error("constitive estimation is failed at ele %d GP %d",e->getNum(), j);
+      return false;
+    }
   }
+  return true;
 }
 
 void dG3DDomain::setValuesForBodyForce(AllIPState *aips, const IPStateBase::whichState ws){
@@ -3710,14 +3727,14 @@ void dG3DDomain::computeStrain(AllIPState *aips,MInterfaceElement *ie, IntPt *GP
      Msg::Error("No virtual interface for 3D");
   }
 }
-void dG3DDomain::computeIpv(AllIPState *aips,MInterfaceElement *ie, IntPt *GP,const IPStateBase::whichState ws,
+bool dG3DDomain::computeIpv(AllIPState *aips,MInterfaceElement *ie, IntPt *GP,const IPStateBase::whichState ws,
                                         partDomain* efMinus, partDomain *efPlus,materialLaw *mlawmi,
                                         materialLaw *mlawp,fullVector<double> &dispm,
                                         fullVector<double> &dispp,
                                         const bool virt, bool stiff,const bool checkfrac)
 {
 	MElement *ele = dynamic_cast<MElement*>(ie);
-	if (!getElementErosionFilter()(ele)) return;
+	if (!getElementErosionFilter()(ele)) return true;
 
   if(!virt)
   {
@@ -3736,7 +3753,10 @@ void dG3DDomain::computeIpv(AllIPState *aips,MInterfaceElement *ie, IntPt *GP,co
     else
       mlawbulkp= static_cast<dG3DMaterialLaw*>(mlawplus);
     if (mlawbulkm->getUseBarF()!=mlawbulkp->getUseBarF()) //check with the bulk law
+    {
       Msg::Error("dG3DDomain::computeIpv All the constitutive laws need to use Fbar or not");
+      return false;
+    }
     bool useBarF=mlawbulkm->getUseBarF();
 
     if(_evalStiff){ this->computeStrain(aips,ie, GP,ws,efMinus,efPlus,dispm,dispp,virt, useBarF);}
@@ -3762,34 +3782,35 @@ void dG3DDomain::computeIpv(AllIPState *aips,MInterfaceElement *ie, IntPt *GP,co
 
       if (_subSteppingMethod == 0){
         // no substepting
-        if (mlawminus->getNum() != mlawplus->getNum()){
-        // if minus and plus material are different
-	    if (_planeStressState){
-		mlawminus->stress3DTo2D(ipvm,ipvmprev, stiff, checkfrac,needDTangent);
-          	mlawplus->stress3DTo2D(ipvp,ipvpprev, stiff, checkfrac,needDTangent);
-	    }
-	   else{
-          	mlawminus->stress(ipvm,ipvmprev, stiff, checkfrac,needDTangent);
-          	mlawplus->stress(ipvp,ipvpprev, stiff, checkfrac,needDTangent);
-	   }
+        if (mlawminus->getNum() != mlawplus->getNum())
+        {
+          // if minus and plus material are different
+          if (_planeStressState){
+              mlawminus->stress3DTo2D(ipvm,ipvmprev, stiff, checkfrac,needDTangent);
+              mlawplus->stress3DTo2D(ipvp,ipvpprev, stiff, checkfrac,needDTangent);
+          }
+          else{
+              mlawminus->stress(ipvm,ipvmprev, stiff, checkfrac,needDTangent);
+              mlawplus->stress(ipvp,ipvpprev, stiff, checkfrac,needDTangent);
+          }
         }
         else{
           // if both part are the same
-	if (_planeStressState)
-		mlawminus->stress3DTo2D(ipvm,ipvmprev,stiff,checkfrac,needDTangent);
-	else
+          if (_planeStressState)
+            mlawminus->stress3DTo2D(ipvm,ipvmprev,stiff,checkfrac,needDTangent);
+          else
           	mlawminus->stress(ipvm,ipvmprev,stiff,checkfrac,needDTangent);
-        if (_averageStrainBased){
-           // if the computation is performed based on the average strain
-          // positive IP is equal to minus IP
+          if (_averageStrainBased){
+            // if the computation is performed based on the average strain
+            // positive IP is equal to minus IP
             ipvp->operator=(*(dynamic_cast<const IPVariable*>(ipvm)));
 
-        }
-        else{
-	if (_planeStressState)
-	   mlawplus->stress3DTo2D(ipvp,ipvpprev,stiff,checkfrac,needDTangent);
-	else
-          mlawplus->stress(ipvp,ipvpprev,stiff,checkfrac,needDTangent);
+          }
+          else{
+            if (_planeStressState)
+              mlawplus->stress3DTo2D(ipvp,ipvpprev,stiff,checkfrac,needDTangent);
+            else
+              mlawplus->stress(ipvp,ipvpprev,stiff,checkfrac,needDTangent);
           }
         }
       }
@@ -3834,17 +3855,17 @@ void dG3DDomain::computeIpv(AllIPState *aips,MInterfaceElement *ie, IntPt *GP,co
 
           if (iter == _subStepNumber){
             // in last substep
-	    if (_planeStressState)
-              	mlawminus->stress3DTo2D(ipvm,ipvTemp,stiff,checkfrac,needDTangent);
-	    else
-		mlawminus->stress(ipvm,ipvTemp,stiff,checkfrac,needDTangent);
+            if (_planeStressState)
+              mlawminus->stress3DTo2D(ipvm,ipvTemp,stiff,checkfrac,needDTangent);
+            else
+              mlawminus->stress(ipvm,ipvTemp,stiff,checkfrac,needDTangent);
             break;
           }
           else{
-	    if (_planeStressState)
+            if (_planeStressState)
             	mlawminus->stress3DTo2D(ipvm,ipvTemp,false,checkfrac,needDTangent);
-	    else
-		mlawminus->stress(ipvm,ipvTemp,false,checkfrac,needDTangent);
+            else
+              mlawminus->stress(ipvm,ipvTemp,false,checkfrac,needDTangent);
             dgipvTemp->operator=(*(dynamic_cast<const IPVariable*>(ipvm)));
           }
           // next step
@@ -3897,18 +3918,18 @@ void dG3DDomain::computeIpv(AllIPState *aips,MInterfaceElement *ie, IntPt *GP,co
 
             if (iter == _subStepNumber){
             // in last substep
-		if (_planeStressState)
-              	 mlawplus->stress3DTo2D(ipvp,ipvTemp,stiff,checkfrac,needDTangent);
-		else
-		 mlawplus->stress(ipvp,ipvTemp,stiff,checkfrac,needDTangent);
+              if (_planeStressState)
+                mlawplus->stress3DTo2D(ipvp,ipvTemp,stiff,checkfrac,needDTangent);
+              else
+                mlawplus->stress(ipvp,ipvTemp,stiff,checkfrac,needDTangent);
               break;
             }
             else{
-		if (_planeStressState)
+              if (_planeStressState)
                  mlawplus->stress3DTo2D(ipvp,ipvTemp,false,checkfrac,needDTangent);
-		else
-		 mlawplus->stress(ipvp,ipvTemp,false,checkfrac,needDTangent);
-             dgipvTemp->operator=(*(dynamic_cast<const IPVariable*>(ipvp)));
+              else
+                mlawplus->stress(ipvp,ipvTemp,false,checkfrac,needDTangent);
+              dgipvTemp->operator=(*(dynamic_cast<const IPVariable*>(ipvp)));
             }
             // next step
             iter++;
@@ -3935,6 +3956,12 @@ void dG3DDomain::computeIpv(AllIPState *aips,MInterfaceElement *ie, IntPt *GP,co
         }
         else{ Msg::Error("Moduli used to compute body force is not defined");}        
       }
+      
+      if (!(ipvm->getConstitutiveSuccessFlag()) or !(ipvp->getConstitutiveSuccessFlag()))
+      {
+        Msg::Error("Constitutive evaluation is failed at interface ele %d, GP %d %d",ele->getNum(), j, j+npts);
+        return false;
+      }
     }  
   }
   else
@@ -3942,6 +3969,7 @@ void dG3DDomain::computeIpv(AllIPState *aips,MInterfaceElement *ie, IntPt *GP,co
      Msg::Error("No virtual interface for 3D");
 
   }
+  return true;
 }
 
 int dG3DDomain::getStressDimension() const{
@@ -5443,7 +5471,7 @@ MElement* dG3DDomain::createInterface(IElement *ie1, IElement *ie2) const
 
 
 #if defined(HAVE_MPI)
-void dG3DDomain::computeIPVariableMPI(AllIPState *aips,const unknownField *ufield,const IPStateBase::whichState ws, bool stiff){
+bool dG3DDomain::computeIPVariableMPI(AllIPState *aips,const unknownField *ufield,const IPStateBase::whichState ws, bool stiff){
   IntPt *GP;
   MPI_Status status;
   if (Msg::GetCommRank() == _rootRank){
@@ -5765,6 +5793,7 @@ void dG3DDomain::computeIPVariableMPI(AllIPState *aips,const unknownField *ufiel
       }
     }
   };
+  return true;
 };
 #endif
 
diff --git a/dG3D/src/dG3DDomain.h b/dG3D/src/dG3DDomain.h
index 9a155091da846f32a3493d53bc5010a05332ae93..84a883ac31c1cff6f55da32c0a2e1a0df80280fd 100644
--- a/dG3D/src/dG3DDomain.h
+++ b/dG3D/src/dG3DDomain.h
@@ -177,13 +177,13 @@ class dG3DDomain : public dgPartDomain{
   virtual void computeStrain(MElement *e,  const int npts, IntPt *GP,
                              AllIPState::ipstateElementContainer *vips,
                              IPStateBase::whichState ws, fullVector<double> &disp, bool useBarF) const;
-  virtual void computeIpv(AllIPState *aips,MElement *e, IPStateBase::whichState ws,
+  virtual bool computeIpv(AllIPState *aips,MElement *e, IPStateBase::whichState ws,
                                   materialLaw *mlaw,fullVector<double> &disp, bool stiff);
   virtual void computeStrain(AllIPState *aips,MInterfaceElement *ie, IntPt *GP,const IPStateBase::whichState ws,
                                         partDomain* efMinus, partDomain *efPlus, fullVector<double> &dispm,
                                         fullVector<double> &dispp, const bool virt,
                                         bool useBarF);
-  virtual void computeIpv(AllIPState *aips,MInterfaceElement *ie, IntPt *GP,const IPStateBase::whichState ws,
+  virtual bool computeIpv(AllIPState *aips,MInterfaceElement *ie, IntPt *GP,const IPStateBase::whichState ws,
                                   partDomain* efMinus, partDomain *efPlus,materialLaw *mlawminus,
                                   materialLaw *mlawplus,fullVector<double> &dispm,
                                   fullVector<double> &dispp, const bool virt, bool stiff,const bool checkfrac=true);
@@ -200,7 +200,7 @@ class dG3DDomain : public dgPartDomain{
   virtual void setdFmdGM(AllIPState *aips, std::map<Dof, STensor33> &dUdG,const IPStateBase::whichState ws);  
   virtual void setValuesForBodyForce(AllIPState *aips, const IPStateBase::whichState ws);                           
   virtual void computeAllIPStrain(AllIPState *aips,const unknownField *ufield,const IPStateBase::whichState ws, const bool virt);
-  virtual void computeIPVariable(AllIPState *aips,const unknownField *ufield,const IPStateBase::whichState ws, bool stiff);
+  virtual bool computeIPVariable(AllIPState *aips,const unknownField *ufield,const IPStateBase::whichState ws, bool stiff);
   virtual void setMaterialLaw(const std::map<int,materialLaw*> &maplaw);
   virtual materialLaw* getMaterialLaw(){return _mlaw;}
   virtual const materialLaw* getMaterialLaw() const{return _mlaw;}
@@ -257,7 +257,7 @@ class dG3DDomain : public dgPartDomain{
   virtual QuadratureBase* getQuadratureRulesForNeumannBC(nonLinearNeumannBC &neu) const;
   virtual partDomain* clone() const {return new dG3DDomain(*this);};
   #if defined(HAVE_MPI)
-  virtual void computeIPVariableMPI(AllIPState *aips,const unknownField *ufield,const IPStateBase::whichState ws, bool stiff);
+  virtual bool computeIPVariableMPI(AllIPState *aips,const unknownField *ufield,const IPStateBase::whichState ws, bool stiff);
   #endif
   virtual double getNonLocalStabilityParameter() const { return _nonLocalBeta;}
   virtual bool   getNonLocalContinuity() const { return _nonLocalContinuity;}
diff --git a/dG3D/src/dG3DMaterialLaw.cpp b/dG3D/src/dG3DMaterialLaw.cpp
index 19d1a3d283f99a7df6d5e0fb7849dbfa208bee3a..2df4b80e90cca1781bdf87293f8707daad8b3da0 100644
--- a/dG3D/src/dG3DMaterialLaw.cpp
+++ b/dG3D/src/dG3DMaterialLaw.cpp
@@ -10573,8 +10573,8 @@ void NonLinearTVMDG3DMaterialLaw::setTensionCompressionRegularisation(const doub
 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::setCorrectionsAllBranchesTVE(const int i, const double V0,const double V1, const double V2, const double D0,const double D1, const double D2){
+  _viscoLaw.setCorrectionsAllBranchesTVE(i,V0,V1,V2,D0,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);
@@ -11243,8 +11243,8 @@ void NonLinearTVPDG3DMaterialLaw::stress(IPVariable* ipv, const IPVariable* ipvp
 
 NonLinearTVENonLinearTVPDG3DMaterialLaw::NonLinearTVENonLinearTVPDG3DMaterialLaw(const int num, const double rho, const double E, const double nu, const double tol,
                         const double Tinitial, const double Alpha, const double KThCon, const double Cp,
-                        const bool matrixbyPerturbation, const double pert, const bool thermalEstimationPreviousConfig):
-                        dG3DMaterialLaw(num,rho), _viscoLaw(num,E,nu,rho,tol,Tinitial,Alpha, KThCon, Cp, matrixbyPerturbation,pert, thermalEstimationPreviousConfig)
+                        const bool matrixbyPerturbation, const double pert, const double stressIteratorTol, const bool thermalEstimationPreviousConfig):
+                        dG3DMaterialLaw(num,rho), _viscoLaw(num,E,nu,rho,tol,Tinitial,Alpha, KThCon, Cp, matrixbyPerturbation,pert, stressIteratorTol, thermalEstimationPreviousConfig)
 {
   fillElasticStiffness(E, nu, elasticStiffness);   // Why are some of the variables defined in this constructor?  --- WHAT??
 };
@@ -11404,8 +11404,8 @@ void NonLinearTVENonLinearTVPDG3DMaterialLaw::setExtraBranchNLType(const int met
 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::setCorrectionsAllBranchesTVE(const int i, const double V0,const double V1, const double V2, const double D0,const double D1, const double D2){
+  _viscoLaw.setCorrectionsAllBranchesTVE(i,V0,V1,V2,D0,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);
diff --git a/dG3D/src/dG3DMaterialLaw.h b/dG3D/src/dG3DMaterialLaw.h
index 1a598d0735df5a45b4be6dc37bd910eb2c33085c..fbc79e13836c29ba1a4b7439c81e4d8b09015dc8 100644
--- a/dG3D/src/dG3DMaterialLaw.h
+++ b/dG3D/src/dG3DMaterialLaw.h
@@ -3329,7 +3329,7 @@ class NonLinearTVMDG3DMaterialLaw : public dG3DMaterialLaw{   // public Material
     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 setCorrectionsAllBranchesTVE(const int i, const double V0,const double V1, const double V2, const double D0, 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);
     
@@ -3602,7 +3602,7 @@ class NonLinearTVENonLinearTVPDG3DMaterialLaw : public dG3DMaterialLaw{   // pub
   public:
     NonLinearTVENonLinearTVPDG3DMaterialLaw(const int num, const double rho, const double E, const double nu, const double tol,
                         const double Tinitial, const double Alpha, const double KThCon, const double Cp,
-                        const bool matrixbyPerturbation = false, const double pert = 1e-8, const bool thermalEstimationPreviousConfig = false);
+                        const bool matrixbyPerturbation = false, const double pert = 1e-8, const double stressIteratorTol = 1e-9, const bool thermalEstimationPreviousConfig = false);
 
     void setStrainOrder(const int order);
     void setViscoelasticMethod(const int method);
@@ -3639,7 +3639,7 @@ class NonLinearTVENonLinearTVPDG3DMaterialLaw : public dG3DMaterialLaw{   // pub
     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 setCorrectionsAllBranchesTVE(const int i, const double V0,const double V1, const double V2, const double D0, 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);
     
diff --git a/dG3D/src/nonLocalDamageDG3DIPVariable.h b/dG3D/src/nonLocalDamageDG3DIPVariable.h
index a8ceb589db42d43a352c52a118df2de93768cdc4..fb78db048e1d0a6166c97caa3d2f8c16755bb870 100644
--- a/dG3D/src/nonLocalDamageDG3DIPVariable.h
+++ b/dG3D/src/nonLocalDamageDG3DIPVariable.h
@@ -1942,7 +1942,10 @@ class nonLocalPorosityDG3DIPVariable : public dG3DIPVariable
     return _nldPorousipv->getRefToDIrreversibleEnergyDNonLocalVariable(index);
 	};
 
-
+  virtual bool getConstitutiveSuccessFlag() const
+  {
+    return _nldPorousipv->getConstitutiveSuccessFlag();
+  }
   virtual void restart();
   virtual void setRefToLinearConductivity(const STensor3 &eT) {setConstRefToLinearK(eT,0,0);}
   virtual void setRefToStiff_alphaDilatation(const STensor3 &eT) {setConstRefToLinearSymmetrizationCoupling(eT,0);}
diff --git a/dG3D/src/nonLocalDamageDG3DMaterialLaw.cpp b/dG3D/src/nonLocalDamageDG3DMaterialLaw.cpp
index ae1a7e3e1d283653c484c185bf3bec2d8f4bbaf6..3ed76344f3eeb66231db3d496213a3c839f08df4 100644
--- a/dG3D/src/nonLocalDamageDG3DMaterialLaw.cpp
+++ b/dG3D/src/nonLocalDamageDG3DMaterialLaw.cpp
@@ -1449,6 +1449,15 @@ void NonLocalDamageGursonHill48DG3DMaterialLaw::setYieldParameters(const std::ve
 {
   static_cast<mlawNonLocalDamageGursonHill48*>(_nldPorous)->setYieldParameters(params);
 }
+void NonLocalDamageGursonHill48DG3DMaterialLaw::setYieldParameters(const fullVector<double>& params)
+{
+  std::vector<double> params_vec(params.size());
+  for (int i=0; i< params.size(); i++)
+  {
+    params_vec[i] = params(i);
+  }
+  static_cast<mlawNonLocalDamageGursonHill48*>(_nldPorous)->setYieldParameters(params_vec);
+};
 
 void NonLocalDamageGursonHill48DG3DMaterialLaw::setTemperatureFunction_q1(const scalarFunction& Tfunc)
 {
diff --git a/dG3D/src/nonLocalDamageDG3DMaterialLaw.h b/dG3D/src/nonLocalDamageDG3DMaterialLaw.h
index 8f927536996bbcd22c12b619fb9f7485280adb41..2dd6ef67368e84db72cdcfd7ee7373bc2be8b541 100644
--- a/dG3D/src/nonLocalDamageDG3DMaterialLaw.h
+++ b/dG3D/src/nonLocalDamageDG3DMaterialLaw.h
@@ -508,6 +508,7 @@ public:
     void setTemperatureFunction_q3(const scalarFunction& Tfunc);
     
     void setYieldParameters(const std::vector<double>& params);
+    void setYieldParameters(const fullVector<double>& params);
 
     #ifndef SWIG
     NonLocalDamageGursonHill48DG3DMaterialLaw(const NonLocalDamageGursonHill48DG3DMaterialLaw &source);
diff --git a/dgshell/src/dgShellDomain.cpp b/dgshell/src/dgShellDomain.cpp
index 7155664f71642cf47fb004d1e7ee19689649951a..b9bc07a895d3b034109002e04c639d9feab02f44 100644
--- a/dgshell/src/dgShellDomain.cpp
+++ b/dgshell/src/dgShellDomain.cpp
@@ -369,7 +369,7 @@ void dgLinearShellDomain::ensureSameValuesBothSideIPvariable(IPField *ip)
   }
 }
 
-void dgLinearShellDomain::computeIPVariable(AllIPState *aips,const unknownField *ufield, const IPStateBase::whichState ws, bool stiff)
+bool dgLinearShellDomain::computeIPVariable(AllIPState *aips,const unknownField *ufield, const IPStateBase::whichState ws, bool stiff)
 {
   IntPt *GP;
   fullVector<double> dispm;
@@ -388,7 +388,8 @@ void dgLinearShellDomain::computeIPVariable(AllIPState *aips,const unknownField
     dispp.resize(R.size());
     ufield->get(R,dispp);
     int npts = integBound->getIntPoints(ie,&GP);
-    this->computeIpv(aips,ie, GP,ws,dom,dom,_mlaw,_mlaw,dispm,dispp,false, stiff);
+    bool ok = this->computeIpv(aips,ie, GP,ws,dom,dom,_mlaw,_mlaw,dispm,dispp,false, stiff);
+    if (!ok) return false;
   }
   // Virtual interface element
   for(elementGroup::elementContainer::const_iterator it=gib->begin(); it!=gib->end();++it){
@@ -397,7 +398,8 @@ void dgLinearShellDomain::computeIPVariable(AllIPState *aips,const unknownField
     _spaceMinus->getKeys(ie->getElem(0),R);
     dispm.resize(R.size());
     ufield->get(R,dispm);
-    this->computeIpv(aips,ie, GP,ws,dom,dom,_mlaw,_mlaw,dispm,dispm,true, stiff);
+    bool ok = this->computeIpv(aips,ie, GP,ws,dom,dom,_mlaw,_mlaw,dispm,dispm,true, stiff);
+    if (!ok) return false;
   }
 
   // bulk
@@ -407,11 +409,14 @@ void dgLinearShellDomain::computeIPVariable(AllIPState *aips,const unknownField
     _space->getKeys(e,R);
     dispm.resize(R.size());
     ufield->get(R,dispm);
-    this->computeIpv(aips,e,ws,_mlaw,dispm, stiff);
+    bool ok = this->computeIpv(aips,e,ws,_mlaw,dispm, stiff);
+    if (!ok) return false;
   }
+  
+  return true;
 }
 
-void dgLinearShellDomain::computeIpv(AllIPState *aips,MInterfaceElement *ie, IntPt *GP,
+bool dgLinearShellDomain::computeIpv(AllIPState *aips,MInterfaceElement *ie, IntPt *GP,
                                   const IPStateBase::whichState ws,partDomain* efMinus, partDomain *efPlus,
                                   materialLaw *mlawmi, materialLaw *mlawp,
                                   fullVector<double> &dispm,
@@ -622,9 +627,10 @@ void dgLinearShellDomain::computeIpv(AllIPState *aips,MInterfaceElement *ie, Int
         mbulk->stress(ips, stiff);
     }
   }
+  return true;
 }
 
-void dgLinearShellDomain::computeIpv(AllIPState *aips,MElement *e, IPStateBase::whichState ws,materialLaw *mlaw__,
+bool dgLinearShellDomain::computeIpv(AllIPState *aips,MElement *e, IPStateBase::whichState ws,materialLaw *mlaw__,
                                               fullVector<double> &disp, bool stiff)
 {
   shellMaterialLaw *mlaw = static_cast<shellMaterialLaw*>(mlaw__);
@@ -649,6 +655,7 @@ void dgLinearShellDomain::computeIpv(AllIPState *aips,MElement *e, IPStateBase::
     if(ws != IPStateBase::initial)
     mlaw->stress(ips, stiff);
   }
+  return true;
 }
 
 FilterDof* dgLinearShellDomain::createFilterDof(const int comp) const
@@ -867,7 +874,7 @@ dgNonLinearShellDomain::dgNonLinearShellDomain(const dgNonLinearShellDomain &sou
                                                                                        _evalStiff(source._evalStiff){}
 
 
-void dgNonLinearShellDomain::computeIPVariable(AllIPState *aips,const unknownField *ufield, const IPStateBase::whichState ws, bool stiff)
+bool dgNonLinearShellDomain::computeIPVariable(AllIPState *aips,const unknownField *ufield, const IPStateBase::whichState ws, bool stiff)
 {
   _evalStiff = false; // directly access to computeIPv is for matrix by perturbation otherwise compute ipvarible thanks to this function
   if(ws == IPStateBase::initial){
@@ -891,7 +898,8 @@ void dgNonLinearShellDomain::computeIPVariable(AllIPState *aips,const unknownFie
       dispp.resize(R.size());
       ufield->get(R,dispp);
       int npts = integBound->getIntPoints(ie,&GP);
-      this->computeIpv(aips,ie, GP,ws,dom,dom,_mlaw,_mlaw,dispm,dispp,false, stiff);
+      bool ok = this->computeIpv(aips,ie, GP,ws,dom,dom,_mlaw,_mlaw,dispm,dispp,false, stiff);
+      if (!ok) return false;
     }
     // Virtual interface element
     for(elementGroup::elementContainer::const_iterator it=gib->begin(); it!=gib->end();++it){
@@ -900,7 +908,8 @@ void dgNonLinearShellDomain::computeIPVariable(AllIPState *aips,const unknownFie
       _spaceMinus->getKeys(ie->getElem(0),R);
       dispm.resize(R.size());
       ufield->get(R,dispm);
-      this->computeIpv(aips,ie, GP,ws,dom,dom,_mlaw,_mlaw,dispm,dispm,true, stiff);
+      bool ok = this->computeIpv(aips,ie, GP,ws,dom,dom,_mlaw,_mlaw,dispm,dispm,true, stiff);
+      if (!ok) return false;
     }
 
     // bulk
@@ -910,13 +919,15 @@ void dgNonLinearShellDomain::computeIPVariable(AllIPState *aips,const unknownFie
       _space->getKeys(e,R);
       dispm.resize(R.size());
       ufield->get(R,dispm);
-      this->computeIpv(aips,e,ws,_mlaw,dispm, stiff);
+      bool ok = this->computeIpv(aips,e,ws,_mlaw,dispm, stiff);
+      if (!ok) return false;
     }
   }
   _evalStiff = true;
+  return true;
 }
 
-void dgNonLinearShellDomain::computeIpv(AllIPState *aips,MElement *e, IPStateBase::whichState ws,
+bool dgNonLinearShellDomain::computeIpv(AllIPState *aips,MElement *e, IPStateBase::whichState ws,
                                         materialLaw *mlaw__,fullVector<double> &disp, bool stiff)
 {
   dgNonLinearShellMaterialLaw *mlaw;
@@ -945,8 +956,9 @@ void dgNonLinearShellDomain::computeIpv(AllIPState *aips,MElement *e, IPStateBas
     mlaw->ensurePlaneStress(ips,_evalStiff);
     mlaw->stress(ips, stiff);
   }
+  return true;
 }
-void dgNonLinearShellDomain::computeIpv(AllIPState *aips,MInterfaceElement *ie, IntPt *GP,const IPStateBase::whichState ws,
+bool dgNonLinearShellDomain::computeIpv(AllIPState *aips,MInterfaceElement *ie, IntPt *GP,const IPStateBase::whichState ws,
                                         partDomain* efMinus, partDomain *efPlus,materialLaw *mlawmi,
                                         materialLaw *mlawp,fullVector<double> &dispm,
                                         fullVector<double> &dispp,
@@ -1207,6 +1219,7 @@ void dgNonLinearShellDomain::computeIpv(AllIPState *aips,MInterfaceElement *ie,
       mbulk->stress(ips,stiff, false); // no fracture at extremities for now
     }
   }
+  return true;
 }
 
 void dgNonLinearShellDomain::initialIPVariable(AllIPState *aips,const unknownField *ufield,
@@ -1687,7 +1700,7 @@ void interDomainBetweenShell::setGaussIntegrationRule()
   integBulk = NULL; // no element
 }
 
-void interDomainBetweenShell::computeIPVariable(AllIPState *aips,const unknownField *ufield,
+bool interDomainBetweenShell::computeIPVariable(AllIPState *aips,const unknownField *ufield,
                                                 const IPStateBase::whichState ws, bool stiff)
 {
   IntPt *GP;
@@ -1709,8 +1722,10 @@ void interDomainBetweenShell::computeIPVariable(AllIPState *aips,const unknownFi
     ufield->get(R,dispp);
 //    shellMaterialLaw* smlawminus = dynamic_cast<shellMaterialLaw*>(_mlawMinus);
 //    shellMaterialLaw* smlawplus = dynamic_cast<shellMaterialLaw*>(_mlawPlus);
-    this->computeIpv(aips,iele,GP,ws,_domMinus,_domPlus,mlawMinus,mlawPlus,dispm,dispp,false, stiff);
+    bool ok = this->computeIpv(aips,iele,GP,ws,_domMinus,_domPlus,mlawMinus,mlawPlus,dispm,dispp,false, stiff);
+    if (!ok) return false;
   }
+  return true;
 }
 
 void interDomainBetweenShell::setMaterialLaw(const std::map<int,materialLaw*>& maplaw)
diff --git a/dgshell/src/dgShellDomain.h b/dgshell/src/dgShellDomain.h
index 31f14b23b5f3eb35f89384ebe2d1b4d5305841e9..2e05e568cf41dc5fd138cf90a89d6f5ce2874d0b 100644
--- a/dgshell/src/dgShellDomain.h
+++ b/dgshell/src/dgShellDomain.h
@@ -52,14 +52,14 @@ class dgLinearShellDomain : public dgPartDomain{
   virtual void setdFmdGM(AllIPState *aips, std::map<Dof, STensor33> &dUdG,const IPStateBase::whichState ws){};
 
   virtual void setValuesForBodyForce(AllIPState *aips, const IPStateBase::whichState ws){};
-  virtual void computeIpv(AllIPState *aips,MElement *e, IPStateBase::whichState ws,
+  virtual bool computeIpv(AllIPState *aips,MElement *e, IPStateBase::whichState ws,
                                   materialLaw *mlaw,fullVector<double> &disp, bool stiff);
-  virtual void computeIpv(AllIPState *aips,MInterfaceElement *ie, IntPt *GP,const IPStateBase::whichState ws,
+  virtual bool computeIpv(AllIPState *aips,MInterfaceElement *ie, IntPt *GP,const IPStateBase::whichState ws,
                                   partDomain* efMinus, partDomain *efPlus,materialLaw *mlawminus,
                                   materialLaw *mlawplus,fullVector<double> &dispm,
                                   fullVector<double> &dispp,
                                   const bool virt, bool stiff, const bool checkfrac=true);
-  virtual void computeIPVariable(AllIPState *aips,const unknownField *ufield,const IPStateBase::whichState ws, bool stiff);
+  virtual bool computeIPVariable(AllIPState *aips,const unknownField *ufield,const IPStateBase::whichState ws, bool stiff);
   virtual void checkFailure(IPField* ipf) const{
     // Msg::Warning("This function checkFailure is not defined ");
   }
@@ -120,14 +120,14 @@ class dgNonLinearShellDomain : public dgLinearShellDomain{
   dgNonLinearShellDomain(const dgNonLinearShellDomain &source);
   ~dgNonLinearShellDomain(){}
 #ifndef SWIG
-  virtual void computeIPVariable(AllIPState *aips,const unknownField *ufield,const IPStateBase::whichState ws, bool stiff);
+  virtual bool computeIPVariable(AllIPState *aips,const unknownField *ufield,const IPStateBase::whichState ws, bool stiff);
   virtual void setDeformationGradientGradient(AllIPState *aips, const STensor33 &GM,const IPStateBase::whichState ws){};      
   virtual void setdFmdFM(AllIPState *aips, std::map<Dof, STensor3> &dUdF,const IPStateBase::whichState ws){};    
   virtual void setdFmdGM(AllIPState *aips, std::map<Dof, STensor33> &dUdG,const IPStateBase::whichState ws){};
 
-  virtual void computeIpv(AllIPState *aips,MElement *e, IPStateBase::whichState ws,
+  virtual bool computeIpv(AllIPState *aips,MElement *e, IPStateBase::whichState ws,
                                   materialLaw *mlaw,fullVector<double> &disp, bool stiff);
-  virtual void computeIpv(AllIPState *aips,MInterfaceElement *ie, IntPt *GP,const IPStateBase::whichState ws,
+  virtual bool computeIpv(AllIPState *aips,MInterfaceElement *ie, IntPt *GP,const IPStateBase::whichState ws,
                                   partDomain* efMinus, partDomain *efPlus,materialLaw *mlawminus,
                                   materialLaw *mlawplus,fullVector<double> &dispm,
                                   fullVector<double> &dispp,
@@ -155,7 +155,7 @@ class interDomainBetweenShell : public dgLinearShellDomain{
 #ifndef SWIG
 //  void initializeTerms(FunctionSpaceBase* space1_,FunctionSpaceBase* space2_,unknownField *uf,IPField*ip);
   virtual void setGaussIntegrationRule();
-  virtual void computeIPVariable(AllIPState *aips,const unknownField *ufield,const IPStateBase::whichState ws, bool stiff);
+  virtual bool computeIPVariable(AllIPState *aips,const unknownField *ufield,const IPStateBase::whichState ws, bool stiff);
   virtual void setMaterialLaw(const std::map<int,materialLaw*>& maplaw);
   virtual materialLaw* getMaterialLaw(){return _mlaw;}
   virtual const materialLaw* getMaterialLaw() const{return _mlaw;}
diff --git a/dgshell/src/nonLinearInterDomainShell.cpp b/dgshell/src/nonLinearInterDomainShell.cpp
index 6a0a961e6fb42bfd7f92b1fb64058c05e87dca0c..0f8b73d796711f8bba8a2b2e9340be576b9c2c35 100644
--- a/dgshell/src/nonLinearInterDomainShell.cpp
+++ b/dgshell/src/nonLinearInterDomainShell.cpp
@@ -138,7 +138,7 @@ void nonLinearInterDomainShell::setGaussIntegrationRule()
 
 }
 
-void nonLinearInterDomainShell::computeIPVariable(AllIPState *aips,const unknownField *ufield,
+bool nonLinearInterDomainShell::computeIPVariable(AllIPState *aips,const unknownField *ufield,
                                                 const IPStateBase::whichState ws, bool stiff)
 {
   IntPt *GP;
@@ -158,7 +158,8 @@ void nonLinearInterDomainShell::computeIPVariable(AllIPState *aips,const unknown
     _spacePlus->getKeys(iele->getElem(1),R);
     dispp.resize(R.size());
     ufield->get(R,dispp);
-    this->computeIpv(aips,iele,GP,ws,_domMinus,_domPlus,mlawMinus,mlawPlus,dispm,dispp,false, stiff);
+    bool ok = this->computeIpv(aips,iele,GP,ws,_domMinus,_domPlus,mlawMinus,mlawPlus,dispm,dispp,false, stiff);
+    if (!ok) return false;
     // set initial value change this
     if(ws == IPStateBase::initial)
     {
diff --git a/dgshell/src/nonLinearInterDomainShell.h b/dgshell/src/nonLinearInterDomainShell.h
index 91604a34fba5237b41aabe8411d06534d1c06471..06ce826bb06c02a656903275ee32fcb41d9a9d5c 100644
--- a/dgshell/src/nonLinearInterDomainShell.h
+++ b/dgshell/src/nonLinearInterDomainShell.h
@@ -31,7 +31,7 @@ class nonLinearInterDomainShell : public dgNonLinearShellDomain{
   ~nonLinearInterDomainShell(){}
 //  void initializeTerms(FunctionSpaceBase* space1_,FunctionSpaceBase* space2_,unknownField *uf,IPField*ip);
   virtual void setGaussIntegrationRule();
-  virtual void computeIPVariable(AllIPState *aips,const unknownField *ufield,const IPStateBase::whichState ws, bool stiff);
+  virtual bool computeIPVariable(AllIPState *aips,const unknownField *ufield,const IPStateBase::whichState ws, bool stiff);
   virtual void setMaterialLaw(const std::map<int,materialLaw*>& maplaw);
   virtual materialLaw* getMaterialLaw(){return _mlaw;}
   virtual const materialLaw* getMaterialLaw() const{return _mlaw;}