diff --git a/NonLinearSolver/materialLaw/mlawNonLinearTVE.cpp b/NonLinearSolver/materialLaw/mlawNonLinearTVE.cpp
index 0df08f388cb7828ddb739681823d4a16761a5f9b..a814172f69a60454e4fd5a0d20b2e3abf379045f 100644
--- a/NonLinearSolver/materialLaw/mlawNonLinearTVE.cpp
+++ b/NonLinearSolver/materialLaw/mlawNonLinearTVE.cpp
@@ -582,6 +582,28 @@ double mlawNonLinearTVE::freeEnergyMechanical(const IPNonLinearTVE& q, const dou
     return Psy_mech;
 }
 
+void mlawNonLinearTVE::calculateMullinsEffectScaler(const IPNonLinearTVE* q0, IPNonLinearTVE *q1, const double T) const{
+    
+    // update eta - Mullins Effect Scalar
+    if (_mullinsEffect != NULL && q1->_ipMullinsEffect != NULL){
+    _mullinsEffect->mullinsEffectScaling(q0->_elasticEnergy, *q0->_ipMullinsEffect, q1->_elasticEnergy,*q1->_ipMullinsEffect);
+    }
+
+    // get eta - Mullins Effect Scalar (at unloading intitiation-> eta = 1.; unloading end-> eta = eta_min; reloading -> eta = eta_min;)
+    double eta = 1., DetaDpsi = 0., DDetaDpsipsi = 0., DetaDT = 0., DDetaDTT = 0.;
+    if (q1->_ipMullinsEffect != NULL){
+        eta = q1->_ipMullinsEffect->getEta(); 
+        DetaDpsi = q1->_ipMullinsEffect->getDetaDpsi();
+        DetaDT = q1->_ipMullinsEffect->getDetaDT();
+        DDetaDTT = q1->_ipMullinsEffect->getDDetaDTT();
+    }
+    
+    // update Bulk/Shear PropertyScaleFactor
+    q1->getRefToElasticBulkPropertyScaleFactor() = eta;
+    q1->getRefToElasticShearPropertyScaleFactor() = eta;
+  
+};
+
 void mlawNonLinearTVE::corKirInfinity(const IPNonLinearTVE *q1, const STensor3& devEe,  const double& trEe, const double T1, STensor3& CorKirDevInf, double& CorKirTrInf) const{
     double KT, GT, AlphaT;
     getK(q1,KT,T1); getG(q1,GT,T1); getAlpha(AlphaT,T1);
@@ -685,10 +707,10 @@ void mlawNonLinearTVE::getTVEdCorKirDT(const IPNonLinearTVE *q0, IPNonLinearTVE
 
             if (_TemFuncOpt == 0){ // Use Shift Factor
                 getKi(q1,KiT,T); getGi(q1,GiT,T);
-                DKiDT[i] = -_Ki[i]/(_ki[i]) * Ddt_shiftDT*expdtkby2;  // Removed _ki/2 and _gi/2
-                DDKiDT[i] = -_Ki[i]/(_ki[i]) * (DDdt_shiftDT - 1/(_ki[i])*pow(Ddt_shiftDT,2))*expdtkby2;
-                DGiDT[i] = -_Gi[i]/(_gi[i]) * Ddt_shiftDT*expdtgby2;
-                DDGiDT[i] = -_Gi[i]/(_gi[i]) * (DDdt_shiftDT - 1/(_gi[i])*pow(Ddt_shiftDT,2))*expdtgby2;
+                DKiDT[i] = -KiT[i]/(_ki[i]) * Ddt_shiftDT*expdtkby2;  // Removed _ki/2 and _gi/2
+                DDKiDT[i] = -KiT[i]/(_ki[i]) * (DDdt_shiftDT - 1/(_ki[i])*pow(Ddt_shiftDT,2))*expdtkby2;
+                DGiDT[i] = -GiT[i]/(_gi[i]) * Ddt_shiftDT*expdtgby2;
+                DDGiDT[i] = -GiT[i]/(_gi[i]) * (DDdt_shiftDT - 1/(_gi[i])*pow(Ddt_shiftDT,2))*expdtgby2;
             }
 
             for (int j=0; j<3; j++){
@@ -838,10 +860,10 @@ void mlawNonLinearTVE::getMechSourceTVE(const IPNonLinearTVE *q0, IPNonLinearTVE
 
             if (_TemFuncOpt == 0){ // Use Shift Factor
                 getKi(q1,KiT,T); getGi(q1,GiT,T);
-                DKiDT[i] = -_Ki[i]/(_ki[i]) * Ddt_shiftDT*expdtkby2;  // Removed _ki/2 and _gi/2
-                DDKiDT[i] = -_Ki[i]/(_ki[i]) * (DDdt_shiftDT - 1/(_ki[i])*pow(Ddt_shiftDT,2))*expdtkby2;
-                DGiDT[i] = -_Gi[i]/(_gi[i]) * Ddt_shiftDT*expdtgby2;
-                DDGiDT[i] = -_Gi[i]/(_gi[i]) * (DDdt_shiftDT - 1/(_gi[i])*pow(Ddt_shiftDT,2))*expdtgby2;
+                DKiDT[i] = -KiT[i]/(_ki[i]) * Ddt_shiftDT*expdtkby2;  // Removed _ki/2 and _gi/2
+                DDKiDT[i] = -KiT[i]/(_ki[i]) * (DDdt_shiftDT - 1/(_ki[i])*pow(Ddt_shiftDT,2))*expdtkby2;
+                DGiDT[i] = -GiT[i]/(_gi[i]) * Ddt_shiftDT*expdtgby2;
+                DDGiDT[i] = -GiT[i]/(_gi[i]) * (DDdt_shiftDT - 1/(_gi[i])*pow(Ddt_shiftDT,2))*expdtgby2;
             }
 
             for (int j=0; j<3; j++){
@@ -891,9 +913,9 @@ void mlawNonLinearTVE::getMechSourceTVE(const IPNonLinearTVE *q0, IPNonLinearTVE
             STensorOperation::zero(DGammai); STensorOperation::zero(DDGammaiDT);
             DQiDT -= DOiDT; DDQiDT -= DDOiDT; DDGammaiDT -= DDOGammaiDT;
             for (int j=0; j<3; j++){
-                Qi(j,j) += (_Ki[i]*trEe - trOi[i]);
+                Qi(j,j) += (KiT[i]*trEe - trOi[i]);
                 for (int k=0; k<3; k++){
-                    Qi(j,k) += (2*_Gi[i]*devEe(j,k) - devOi[i](j,k));
+                    Qi(j,k) += (2*GiT[i]*devEe(j,k) - devOi[i](j,k));
                 }
             }
             DGammai += DEe;
@@ -906,8 +928,8 @@ void mlawNonLinearTVE::getMechSourceTVE(const IPNonLinearTVE *q0, IPNonLinearTVE
             static STensor43 temp_DDQiDTDE;
             static STensor43 temp_DDgammiDtDE;
 
-            double Ki_term = (_Ki[i]*(1-expdtkby2)+T*DKiDT[i]);
-            double Gi_term = (_Gi[i]*(1-expdtgby2)+T*DGiDT[i]);
+            double Ki_term = (KiT[i]*(1-expdtkby2)+T*DKiDT[i]);
+            double Gi_term = (GiT[i]*(1-expdtgby2)+T*DGiDT[i]);
             isotropicHookTensor( Ki_term, Gi_term , temp_DDQiDTDE );
 
             double Ki_term_2 = 1/3*expdtkby2;
@@ -1007,6 +1029,11 @@ void mlawNonLinearTVE::ThermoViscoElasticPredictor(const STensor3& Ee, const STe
           double& DKe, double& DGe, double& DKde, double& DGde,
           double& KTsum, double& GTsum, double& DKDTsum, double& DGDTsum,
           const double T0, const double T1, const bool calculateStress) const{
+              
+    // Mullins Effect Scaler -> should be before any calls to get functions
+    if (_mullinsEffect != NULL && q1->_ipMullinsEffect != NULL){
+       mlawNonLinearTVE::calculateMullinsEffectScaler(q0, q1, T1);
+    }
 
     // Set Temperature to calculate temperature updated properties
     double T_set = setTemp(T0,T1,1);  // 1->T1, 2->T_mid, 3->T_midshift
@@ -1078,8 +1105,8 @@ void mlawNonLinearTVE::ThermoViscoElasticPredictor(const STensor3& Ee, const STe
             // Maxwell
             if (_TemFuncOpt == 0){ // Use Shift Factor
                 getGi(q1,GiT,T_set);  // Removed 2*_gi[i]
-                DGiDT[i] = -_Gi[i]/(_gi[i]) * Ddt_shiftDT*expdtgby2;
-                DDGiDT[i] = -_Gi[i]/(_gi[i]) * (DDdt_shiftDT - 1/(_gi[i])*pow(Ddt_shiftDT,2))*expdtgby2;
+                DGiDT[i] = -GiT[i]/(_gi[i]) * Ddt_shiftDT*expdtgby2;
+                DDGiDT[i] = -GiT[i]/(_gi[i]) * (DDdt_shiftDT - 1/(_gi[i])*pow(Ddt_shiftDT,2))*expdtgby2;
             }
 
             // For Single Convolution
@@ -1165,8 +1192,8 @@ void mlawNonLinearTVE::ThermoViscoElasticPredictor(const STensor3& Ee, const STe
             // Maxwell 
             if (_TemFuncOpt == 0){ // Use Shift Factor
                 getKi(q1,KiT,T_set); getAlphai(AlphaiT,T_set);  // Removed 2*_ki[i]
-                DKiDT[i] = -_Ki[i]/(_ki[i]) * Ddt_shiftDT *expdtkby2;
-                DDKiDT[i] = -_Ki[i]/(_ki[i]) * (DDdt_shiftDT - 1/(_ki[i])*pow(Ddt_shiftDT,2)) *expdtkby2;
+                DKiDT[i] = -KiT[i]/(_ki[i]) * Ddt_shiftDT *expdtkby2;
+                DDKiDT[i] = -KiT[i]/(_ki[i]) * (DDdt_shiftDT - 1/(_ki[i])*pow(Ddt_shiftDT,2)) *expdtkby2;
             }
 
             // Single Convolution
@@ -1614,10 +1641,10 @@ void mlawNonLinearTVE::predictorCorrector_ThermoViscoElastic(
 
             if (_TemFuncOpt == 0){ // Use Shift Factor
                 getKi(q1,KiT,T_set); getGi(q1,GiT,T_set); getAlphai(AlphaiT,T_set);
-                DKiDT[i] = -_Ki[i]/(_ki[i]) * Ddt_shiftDT*expdtkby2;  // Removed _ki/2 and _gi/2
-                DDKiDT[i] = -_Ki[i]/(_ki[i]) * (DDdt_shiftDT - 1/(_ki[i])*pow(Ddt_shiftDT,2))*expdtkby2;
-                DGiDT[i] = -_Gi[i]/(_gi[i]) * Ddt_shiftDT*expdtgby2;
-                DDGiDT[i] = -_Gi[i]/(_gi[i]) * (DDdt_shiftDT - 1/(_gi[i])*pow(Ddt_shiftDT,2))*expdtgby2;
+                DKiDT[i] = -KiT[i]/(_ki[i]) * Ddt_shiftDT*expdtkby2;  // Removed _ki/2 and _gi/2
+                DDKiDT[i] = -KiT[i]/(_ki[i]) * (DDdt_shiftDT - 1/(_ki[i])*pow(Ddt_shiftDT,2))*expdtkby2;
+                DGiDT[i] = -GiT[i]/(_gi[i]) * Ddt_shiftDT*expdtgby2;
+                DDGiDT[i] = -GiT[i]/(_gi[i]) * (DDdt_shiftDT - 1/(_gi[i])*pow(Ddt_shiftDT,2))*expdtgby2;
             }
 
             for (int j=0; j<3; j++){
@@ -1673,9 +1700,9 @@ void mlawNonLinearTVE::predictorCorrector_ThermoViscoElastic(
             STensorOperation::zero(DGammai); STensorOperation::zero(DDGammaiDT);
             DQiDT -= DOiDT; DDQiDT -= DDOiDT; DDGammaiDT -= DDOGammaiDT;
             for (int j=0; j<3; j++){
-                Qi(j,j) += (_Ki[i]*trEe - trOi[i]);
+                Qi(j,j) += (KiT[i]*trEe - trOi[i]);
                 for (int k=0; k<3; k++){
-                    Qi(j,k) += (2*_Gi[i]*devEe(j,k) - devOi[i](j,k));
+                    Qi(j,k) += (2*GiT[i]*devEe(j,k) - devOi[i](j,k));
                 }
             }
             DGammai += DEe;
@@ -1691,8 +1718,8 @@ void mlawNonLinearTVE::predictorCorrector_ThermoViscoElastic(
             static STensor43 temp_DDQiDTDE;
             static STensor43 temp_DDgammiDtDE;
 
-            double Ki_term = (_Ki[i]*(1-expdtkby2)+T*DKiDT[i]);
-            double Gi_term = (_Gi[i]*(1-expdtgby2)+T*DGiDT[i]);
+            double Ki_term = (KiT[i]*(1-expdtkby2)+T*DKiDT[i]);
+            double Gi_term = (GiT[i]*(1-expdtgby2)+T*DGiDT[i]);
             isotropicHookTensor( Ki_term, Gi_term , temp_DDQiDTDE );
 
             double Ki_term_2 = 1/3*expdtkby2;
diff --git a/NonLinearSolver/materialLaw/mlawNonLinearTVE.h b/NonLinearSolver/materialLaw/mlawNonLinearTVE.h
index 0e9b11cca833ccf6686443f0cee1372adcac2bde..90ae75b93e749f22388e8b8fce874349673cd7a4 100644
--- a/NonLinearSolver/materialLaw/mlawNonLinearTVE.h
+++ b/NonLinearSolver/materialLaw/mlawNonLinearTVE.h
@@ -79,6 +79,8 @@ class mlawNonLinearTVE : public mlawPowerYieldHyper{
     virtual double linearInterpTemp(const double t_interp, const double t0, const double t1, const double T0, const double T1) const;
     virtual double freeEnergyMechanical(const IPNonLinearTVE& q, const double Tc) const ;
     virtual double setTemp(const double T0, const double T1, const int para) const ;
+    
+    virtual void calculateMullinsEffectScaler(const IPNonLinearTVE* q0, IPNonLinearTVE *q1, const double T) const;
 
     void corKirInfinity(const IPNonLinearTVE *q1, const STensor3& devEe, const double& trEe, const double T, STensor3& CorKirDevInf, double& CorKirTrInf) const;
     void ThermoViscoElasticPredictor(const STensor3& Ee, const STensor3& Ee0,
@@ -226,21 +228,23 @@ class mlawNonLinearTVE : public mlawPowerYieldHyper{
     }
 
     virtual void getK(const IPNonLinearTVE *q1, double& KT, const double Tc, double *dK = NULL, double *ddK = NULL) const{
-        KT = _K*_temFunc_K->getVal(Tc);
+        double K = _K*q1->getConstRefToElasticBulkPropertyScaleFactor();
+        KT = K*_temFunc_K->getVal(Tc);
         if(dK!=NULL){
-            *dK=_K*_temFunc_K->getDiff(Tc);  // Here, *dK can be imagined as *(dK+0) or dK[0] if dK were a vector. See dKi below.
+            *dK = K*_temFunc_K->getDiff(Tc);  // Here, *dK can be imagined as *(dK+0) or dK[0] if dK were a vector. See dKi below.
         }
         if(ddK!=NULL){
-            *ddK = _K*_temFunc_K->getDoubleDiff(Tc);
+            *ddK = K*_temFunc_K->getDoubleDiff(Tc);
         }
     }
     virtual void getG(const IPNonLinearTVE *q1, double& GT, const double Tc, double *dG = NULL, double *ddG = NULL) const{
-        GT = _G*_temFunc_G->getVal(Tc);
+        double G = _G*q1->getConstRefToElasticShearPropertyScaleFactor();
+        GT = G*_temFunc_G->getVal(Tc);
         if(dG!=NULL){
-            *dG = _G*_temFunc_G->getDiff(Tc);
+            *dG = G*_temFunc_G->getDiff(Tc);
         }
         if(ddG!=NULL){
-            *ddG = _G*_temFunc_G->getDoubleDiff(Tc);
+            *ddG = G*_temFunc_G->getDoubleDiff(Tc);
         }
     }
      virtual void getAlpha(double& alphaT, const double Tc, double *dAlpha = NULL, double *ddAlpha = NULL) const{
@@ -270,28 +274,42 @@ class mlawNonLinearTVE : public mlawPowerYieldHyper{
 
     // The 3rd argument is a pointer to a vector.
     virtual void getKi(const IPNonLinearTVE *q1, std::vector<double>& Ki_T, const double Tc, std::vector<double>* dKi=NULL, std::vector<double>* ddKi=NULL) const{
+        
+        std::vector<double> Ki;
+        Ki.clear(); Ki.resize(_N,0.);
+        for (int i=0; i<_Ki.size();i++){
+          Ki[i] = _Ki[i]*q1->getConstRefToElasticBulkPropertyScaleFactor();  
+        }
+        
         Ki_T.resize(_N,0.);
         for (int i=0; i<_Ki.size();i++){
-            Ki_T[i] = _Ki[i]*_temFunc_Ki[i]->getVal(Tc);
+            Ki_T[i] = Ki[i]*_temFunc_Ki[i]->getVal(Tc);
             if(dKi!=NULL){
-                dKi->at(i) = _Ki[i]*_temFunc_Ki[i]->getDiff(Tc);
+                dKi->at(i) = Ki[i]*_temFunc_Ki[i]->getDiff(Tc);
             }
             if(ddKi!=NULL){
-                ddKi->at(i) = _Ki[i]*_temFunc_Ki[i]->getDoubleDiff(Tc);
+                ddKi->at(i) = Ki[i]*_temFunc_Ki[i]->getDoubleDiff(Tc);
             }
         }
     }
 
     // The 3rd argument is a pointer to a vector.
     virtual void getGi(const IPNonLinearTVE *q1, std::vector<double>& Gi_T, const double Tc, std::vector<double>* dGi=NULL, std::vector<double>* ddGi=NULL) const{
+        
+        std::vector<double> Gi;
+        Gi.clear(); Gi.resize(_N,0.);
+        for (int i=0; i<_Gi.size();i++){
+          Gi[i] = _Gi[i]*q1->getConstRefToElasticShearPropertyScaleFactor();  
+        }
+        
         Gi_T.resize(_N,0.);
         for (int i=0; i<_Gi.size();i++){
-            Gi_T[i] = _Gi[i]*_temFunc_Gi[i]->getVal(Tc);
+            Gi_T[i] = Gi[i]*_temFunc_Gi[i]->getVal(Tc);
             if(dGi!=NULL){
-                dGi->at(i) = _Gi[i]*_temFunc_Gi[i]->getDiff(Tc); // *(dGi+i) is equivalent to dGi[i]
+                dGi->at(i) = Gi[i]*_temFunc_Gi[i]->getDiff(Tc); // *(dGi+i) is equivalent to dGi[i]
             }
             if(ddGi!=NULL){
-                ddGi->at(i) = _Gi[i]*_temFunc_Gi[i]->getDoubleDiff(Tc);
+                ddGi->at(i) = Gi[i]*_temFunc_Gi[i]->getDoubleDiff(Tc);
             }
         }
     }
diff --git a/NonLinearSolver/materialLaw/mlawNonLinearTVP.cpp b/NonLinearSolver/materialLaw/mlawNonLinearTVP.cpp
index 8469054b8af14fabf738d25d917a1e5c2909ca2f..873300d9660130da66ba4632e51691ed142aaf97 100644
--- a/NonLinearSolver/materialLaw/mlawNonLinearTVP.cpp
+++ b/NonLinearSolver/materialLaw/mlawNonLinearTVP.cpp
@@ -380,12 +380,12 @@ void mlawNonLinearTVP::getFreeEnergyTVM(const IPNonLinearTVP *q0, IPNonLinearTVP
       std::vector<double> KiT, GiT; KiT.resize(_N,0.); GiT.resize(_N,0.); 
       getKi(q1,KiT,T); getGi(q1,GiT,T);
       for (int k=0; k<_Gi.size(); k++){
-        DpsiVEdT += 1/9 * 1/_Ki[k] * trOi[k] * trDOiDT[k];
-        DDpsiVEdTT += 1/9 * 1/_Ki[k] * (trOi[k]*trDDOiDTT[k] + pow(trDOiDT[k],2));
+        DpsiVEdT += 1/9 * 1/KiT[k] * trOi[k] * trDOiDT[k];
+        DDpsiVEdTT += 1/9 * 1/KiT[k] * (trOi[k]*trDDOiDTT[k] + pow(trDOiDT[k],2));
         for (int i=0; i<3; i++)
           for (int j=0; j<3; j++){
-            DpsiVEdT += 2/_Gi[k] * devOi[k](i,j) * devDOiDT[k](i,j);
-            DDpsiVEdTT += 2/_Gi[k] * (devOi[k](i,j) * devDDOiDTT[k](i,j) + pow(devDOiDT[k](i,j),2));
+            DpsiVEdT += 2/GiT[k] * devOi[k](i,j) * devDOiDT[k](i,j);
+            DDpsiVEdTT += 2/GiT[k] * (devOi[k](i,j) * devDDOiDTT[k](i,j) + pow(devDOiDT[k](i,j),2));
           }    
         }
     }
diff --git a/NonLinearSolver/materialLaw/mullinsEffect.cpp b/NonLinearSolver/materialLaw/mullinsEffect.cpp
index 022b622a808ce228e9b79149ce1691940ad1238d..47f32a8b9178899e13a5d6e790d7eb1cd15432a7 100644
--- a/NonLinearSolver/materialLaw/mullinsEffect.cpp
+++ b/NonLinearSolver/materialLaw/mullinsEffect.cpp
@@ -91,24 +91,30 @@ void negativeExponentialScaler::createIPVariable(IPMullinsEffect* &ipv) const
   ipv = new IPMullinsEffect();
 }
 
-void negativeExponentialScaler::mullinsEffectScaling(double psi0, double _psi, IPMullinsEffect &ipv) const{
+void negativeExponentialScaler::mullinsEffectScaling(double psi0,  const IPMullinsEffect &ipvprev, double _psi, IPMullinsEffect &ipv) const{
     
+  // at unloading intitiation-> eta = 1.; unloading end-> eta = eta_min; reloading -> eta = eta_min;  
+    
+  double eta0 = ipvprev.getEta();
+  
   double psi = _psi;
   
-  double eta = 0., DetaDpsi = 0., DDetaDpsipsi = 0., DetaDT = 0., DDetaDTT = 0.;
+  double eta = 1., DetaDpsi = 0., DDetaDpsipsi = 0., DetaDT = 0., DDetaDTT = 0.;
   
   if (psi<psi0){
     eta = 1. - _r*( 1. - exp( - sqrt(_m*(psi0-psi)) ) );
   }
   else{
-    eta = 1.;
+    eta = eta0;
   }
    
   ipv.set(eta,DetaDpsi,DDetaDpsipsi,DetaDT,DDetaDTT);
 }
 
-void negativeExponentialScaler::mullinsEffectScaling(double psi0, double _psi, double T, IPMullinsEffect &ipv) const{
+void negativeExponentialScaler::mullinsEffectScaling(double psi0, const IPMullinsEffect &ipvprev, double _psi, double T, IPMullinsEffect &ipv) const{
     
+  double eta0 = ipvprev.getEta();
+   
   double psi = _psi;
   double r = _r*_temFunc_r->getVal(T);
   double m = _m*_temFunc_m->getVal(T);
@@ -119,7 +125,7 @@ void negativeExponentialScaler::mullinsEffectScaling(double psi0, double _psi, d
     eta = 1. - r*( 1. - exp( - sqrt(m*(psi0-psi)) ) );
   }
   else{
-    eta = 1.;
+    eta = eta0;
   }
    
   ipv.set(eta,DetaDpsi,DDetaDpsipsi,DetaDT,DDetaDTT);
diff --git a/NonLinearSolver/materialLaw/mullinsEffect.h b/NonLinearSolver/materialLaw/mullinsEffect.h
index bbca308bc5dda7e811531773d623c4fae7ddffe3..9e06ee651f89844e61f4e9ad7a13eed49e76e590 100644
--- a/NonLinearSolver/materialLaw/mullinsEffect.h
+++ b/NonLinearSolver/materialLaw/mullinsEffect.h
@@ -33,8 +33,8 @@ class mullinsEffect {
     virtual void createIPVariable(IPMullinsEffect* &ipv) const=0;
     virtual void initLaws(const std::map<int,mullinsEffect*> &maplaw)=0;
     virtual const bool isInitialized() {return _initialized;}
-    virtual void mullinsEffectScaling(double psi0, double _psi, IPMullinsEffect &ipv) const=0;
-    virtual void mullinsEffectScaling(double psi0, double _psi, double T, IPMullinsEffect &ipv) const=0;
+    virtual void mullinsEffectScaling(double psi0, const IPMullinsEffect &ipvprev, double _psi, IPMullinsEffect &ipv) const=0;
+    virtual void mullinsEffectScaling(double psi0, const IPMullinsEffect &ipvprev, double _psi, double T, IPMullinsEffect &ipv) const=0;
     virtual mullinsEffect * clone() const=0;
   #endif
 
@@ -61,8 +61,8 @@ class negativeExponentialScaler : public mullinsEffect{
     virtual scalingFunction getType() const{return mullinsEffect::negativeExponentialScaler; };
     virtual void createIPVariable(IPMullinsEffect* &ipv) const;
     virtual void initLaws(const std::map<int,mullinsEffect*> &maplaw) {}; //nothing now, we will see if we use the mapping
-    virtual void mullinsEffectScaling(double psi0, double _psi, IPMullinsEffect &ipv) const;
-    virtual void mullinsEffectScaling(double psi0, double _psi, double T, IPMullinsEffect &ipv) const;
+    virtual void mullinsEffectScaling(double psi0, const IPMullinsEffect &ipvprev, double _psi, IPMullinsEffect &ipv) const;
+    virtual void mullinsEffectScaling(double psi0, const IPMullinsEffect &ipvprev, double _psi, double T, IPMullinsEffect &ipv) const;
     virtual mullinsEffect * clone() const;
     #endif // SWIG
 };
diff --git a/NonLinearSolver/nlmechsolpy.i b/NonLinearSolver/nlmechsolpy.i
index f030bdaa3e77ba0604619e63e6b81eaef0123e25..c929327301d993acaf92445f2ebcd5371481d0e2 100644
--- a/NonLinearSolver/nlmechsolpy.i
+++ b/NonLinearSolver/nlmechsolpy.i
@@ -15,6 +15,7 @@
   #include "j2IsotropicHardening.h"
   #include "kinematicHardening.h"
   #include "viscosityLaw.h"
+  #include "mullinsEffect.h"
   #include "CLengthLaw.h"
   #include "NucleationLaw.h"
   #include "nucleationCriterionLaw.h"
@@ -81,6 +82,7 @@
 %nodefaultctor J2IsotropicHardening;
 %nodefaultctor kinematicHardening;
 %nodefaultctor viscosityLaw;
+%nodefaultctor mullinsEffect;
 %nodefaultctor RateFailureLaw;
 %nodefaultctor CLengthLaw;
 %nodefaultctor DamageLaw;
@@ -160,6 +162,7 @@
 %include "j2IsotropicHardening.h"
 %include "kinematicHardening.h"
 %include "viscosityLaw.h"
+%include "mullinsEffect.h"
 %include "CLengthLaw.h"
 %include "NucleationLaw.h"
 %include "nucleationCriterionLaw.h"
diff --git a/dG3D/benchmarks/nonLinearTVP_cube/cubeTVP.py b/dG3D/benchmarks/nonLinearTVP_cube/cubeTVP.py
index c38ec3d627645b798615c7d9526e4b6e3abd32eb..d4acb99e9ca9ae13a1e20a824c9b37337fc0e19a 100644
--- a/dG3D/benchmarks/nonLinearTVP_cube/cubeTVP.py
+++ b/dG3D/benchmarks/nonLinearTVP_cube/cubeTVP.py
@@ -30,7 +30,7 @@ E = relSpec[0] #MPa # 2700
 nu = 0.33 #0.33
 K = E/3./(1.-2.*nu)	# Bulk mudulus
 mu = E/2./(1.+nu)	  # Shear mudulus
-rho = 7850e-9 #905e-12 # Bulk mass   905 kg/m3 -> 905e-12 tonne/mm3
+rho = 7850e-12 #905e-12 # Bulk mass   905 kg/m3 -> 905e-12 tonne/mm3
 Cp = rho*1900e+6 # 1900 J/kg/K -> 1900e+6 Nmm/tonne/K
 KThCon = 0.14  # 0.14 W/m/K -> 0.14 Nmm/s/mm/K
 Alpha = 0.6e-6 # 1/K
diff --git a/dG3D/src/dG3DMaterialLaw.h b/dG3D/src/dG3DMaterialLaw.h
index 7248a08d22c735ad97653c8722c0303774a8d83a..3d1f07b6536fff28d4fa7839c5e44bb96a31ccc4 100644
--- a/dG3D/src/dG3DMaterialLaw.h
+++ b/dG3D/src/dG3DMaterialLaw.h
@@ -52,6 +52,7 @@
 #include "mlawNonLinearTVM.h"
 #include "mlawNonLinearTVE.h"
 #include "mlawNonLinearTVP.h"
+#include "mullinsEffect.h"
 #endif
 #if defined(HAVE_TORCH)
 #include <torch/torch.h>