diff --git a/NonLinearSolver/internalPoints/ipTVEMullins.cpp b/NonLinearSolver/internalPoints/ipTVEMullins.cpp
index ade8c119bb09e2105e7826ca2639407a1b6da206..921b46c650f7146b5600f229c670738b6bd79be7 100644
--- a/NonLinearSolver/internalPoints/ipTVEMullins.cpp
+++ b/NonLinearSolver/internalPoints/ipTVEMullins.cpp
@@ -17,9 +17,35 @@ IPTVEMullins::IPTVEMullins(const J2IsotropicHardening* comp,
                                         _T(298.15),_devDE(0.),_trDE(0.),_DE(0.),_DcorKirDT(0.),_DDcorKirDTT(0.),
                                         _mechSrcTVE(0.),_DmechSrcTVEdT(0.),_DmechSrcTVEdF(0.),
                                         _thermalEnergy(0.),_dtShift(0.),_DdtShiftDT(0.),_DDdtShiftDDT(0.){
+                                            
+    _devOGammai.clear();
+    _trOGammai.clear();
+    _devDOGammaiDT.clear();
+    _trDOGammaiDT.clear();
+    _devOi.clear();
+    _trOi.clear();
+    _devDOiDT.clear();
+    _trDOiDT.clear();
+    _devDDOiDTT.clear();
+    _trDDOiDTT.clear();
+    for (int i=0; i < N; i++){
+        STensor3 el(0.);
+        _devOGammai.push_back(el);
+        _trOGammai.push_back(0.);
+        _devDOGammaiDT.push_back(el);
+        _trDOGammaiDT.push_back(0.);
+        _devOi.push_back(el);
+        _trOi.push_back(0.);
+        _devDOiDT.push_back(el);
+        _trDOiDT.push_back(0.);
+        _devDDOiDTT.push_back(el);
+        _trDDOiDTT.push_back(0.);
 };
 
 IPTVEMullins::IPTVEMullins(const IPTVEMullins& src): IPHyperViscoElastoPlastic(src),
+            _devOGammai(src._devOGammai), _trOGammai(src._trOGammai), 
+            _devDOGammaiDT(src._devDOGammaiDT), _trDOGammaiDT(src._trDOGammaiDT),
+            _devOi(src._devOi), _trOi(src._trOi), _devDOiDT(src._devDOiDT), _trDOiDT(src._trDOiDT), _devDDOiDTT(src._devDDOiDTT), _trDDOiDTT(src._trDDOiDTT),
             _T(src._T),_devDE(src._devDE), _trDE(src._trDE), _DE(src._DE), _DcorKirDT(src._DcorKirDT), _DDcorKirDTT(src._DDcorKirDTT),
             _mechSrcTVE(src._mechSrcTVE),_DmechSrcTVEdT(src._DmechSrcTVEdT),_DmechSrcTVEdF(src._DmechSrcTVEdF),
             _thermalEnergy(src._thermalEnergy),
@@ -44,6 +70,16 @@ IPTVEMullins& IPTVEMullins::operator=(const IPVariable& src)
     _dtShift = psrc->_dtShift;
     _DdtShiftDT = psrc->_DdtShiftDT;
     _DDdtShiftDDT = psrc->_DDdtShiftDDT;
+    _devOGammai = psrc->_devOGammai; 
+    _trOGammai = psrc->_trOGammai; 
+    _devDOGammaiDT = psrc->_devDOGammaiDT; 
+    _trDOGammaiDT = psrc->_trDOGammaiDT; 
+    _devOi = psrc->_devOi; 
+    _trOi = psrc->_trOi;
+    _devDOiDT = psrc->_devDOiDT; 
+    _trDOiDT = psrc->_trDOiDT;
+    _devDDOiDTT = psrc->_devDDOiDTT; 
+    _trDDOiDTT = psrc->_trDDOiDTT; 
   }
   return *this;
 }
@@ -68,4 +104,14 @@ void IPTVEMullins::restart(){
   restartManager::restart(_dtShift);
   restartManager::restart(_DdtShiftDT);
   restartManager::restart(_DDdtShiftDDT);
+  restartManager::restart(_devOGammai);
+  restartManager::restart(_trOGammai);
+  restartManager::restart(_devDOGammaiDT);
+  restartManager::restart(_trDOGammaiDT);
+  restartManager::restart(_devOi);
+  restartManager::restart(_trOi);
+  restartManager::restart(_devDOiDT);
+  restartManager::restart(_trDOiDT);
+  restartManager::restart(_devDDOiDTT);
+  restartManager::restart(_trDDOiDTT);
 }
diff --git a/NonLinearSolver/internalPoints/ipTVEMullins.h b/NonLinearSolver/internalPoints/ipTVEMullins.h
index f8c8dc019b09ad19ed0f55bc9615482c46b0471d..e5d0f6b1bb874df17a9a2134d23ef3e1184f6dd8 100644
--- a/NonLinearSolver/internalPoints/ipTVEMullins.h
+++ b/NonLinearSolver/internalPoints/ipTVEMullins.h
@@ -30,6 +30,20 @@ class IPTVEMullins : public IPHyperViscoElastoPlastic{
         double _mechSrcTVE;
         double _DmechSrcTVEdT;
         STensor3 _DmechSrcTVEdF;
+        
+        // Viscoelastic Strain
+        std::vector<STensor3> _devOGammai;   // dev viscoelastic strain for each branch
+        std::vector<double> _trOGammai;      // tr viscoelastic strain for each branch
+        std::vector<STensor3> _devDOGammaiDT;  
+        std::vector<double> _trDOGammaiDT;     
+        
+        // Viscoelastic Stress
+        std::vector<STensor3> _devOi;   // dev viscoelastic stress for each branch
+        std::vector<double> _trOi;      // tr viscoelastic stress for each branch
+        std::vector<STensor3> _devDOiDT;  
+        std::vector<double> _trDOiDT; 
+        std::vector<STensor3> _devDDOiDTT;  
+        std::vector<double> _trDDOiDTT; 
 
         // DcorKirDT
         STensor3 _DcorKirDT;
@@ -50,6 +64,36 @@ class IPTVEMullins : public IPHyperViscoElastoPlastic{
         virtual IPTVEMullins& operator=(const IPVariable& src);
         virtual ~IPTVEMullins(){};
 
+        virtual std::vector<STensor3>& getRefToDevViscoElasticOverStrain() {return _devOGammai;};
+        virtual const std::vector<STensor3>& getConstRefToDevViscoElasticOverStrain() const {return _devOGammai;};
+        
+        virtual std::vector<double>& getRefToTrViscoElasticOverStrain() {return _trOGammai;};
+        virtual const std::vector<double>& getConstRefToTrViscoElasticOverStrain() const {return _trOGammai;};
+        
+        virtual std::vector<STensor3>& getRefToDevDOGammaiDT() {return _devDOGammaiDT;};
+        virtual const std::vector<STensor3>& getConstRefToDevDOGammaiDT() const {return _devDOGammaiDT;};
+        
+        virtual std::vector<double>& getRefToTrDOGammaiDT() {return _trDOGammaiDT;};
+        virtual const std::vector<double>& getConstRefToTrDOGammaiDT() const {return _trDOGammaiDT;};
+        
+        virtual std::vector<STensor3>& getRefToDevViscoElasticOverStress() {return _devOi;};
+        virtual const std::vector<STensor3>& getConstRefToDevViscoElasticOverStress() const {return _devOi;};
+        
+        virtual std::vector<double>& getRefToTrViscoElasticOverStress() {return _trOi;};
+        virtual const std::vector<double>& getConstRefToTrViscoElasticOverStress() const {return _trOi;};
+        
+        virtual std::vector<STensor3>& getRefToDevDOiDT() {return _devDOiDT;};
+        virtual const std::vector<STensor3>& getConstRefToDevDOiDT() const {return _devDOiDT;};
+        
+        virtual std::vector<double>& getRefToTrDOiDT() {return _trDOiDT;};
+        virtual const std::vector<double>& getConstRefToTrDOiDT() const {return _trDOiDT;};
+        
+        virtual std::vector<STensor3>& getRefToDevDDOiDTT() {return _devDDOiDTT;};
+        virtual const std::vector<STensor3>& getConstRefToDevDDOiDTT() const {return _devDDOiDTT;};
+        
+        virtual std::vector<double>& getRefToTrDDOiDTT() {return _trDDOiDTT;};
+        virtual const std::vector<double>& getConstRefToTrDDOiDTT() const {return _trDDOiDTT;};
+        
         virtual STensor3& getRefToDcorKirDT() {return _DcorKirDT;};
         virtual const STensor3& getConstRefToDcorKirDT() const {return _DcorKirDT;};
 
diff --git a/NonLinearSolver/materialLaw/mlawTVEMullins.cpp b/NonLinearSolver/materialLaw/mlawTVEMullins.cpp
index 80902fcaaed42063be57fa78d2ee7fb2066d66be..6e85a546c5c43c0639e6244b82464345410eafb4 100644
--- a/NonLinearSolver/materialLaw/mlawTVEMullins.cpp
+++ b/NonLinearSolver/materialLaw/mlawTVEMullins.cpp
@@ -121,11 +121,15 @@ void mlawTVEMullins::setViscoElasticNumberOfElement(const int N){
   Msg::Info("Numer of Spring/Dashpot for viscoelastic model: %d",_N);
   _Ki.clear(); _ki.clear();
   _Gi.clear(); _gi.clear();
+  
+  _nKi.clear(); _nGi.clear();
 
   _Ki.resize(_N,0.);
   _ki.resize(_N,0.);
   _Gi.resize(_N,0.);
   _gi.resize(_N,0.);
+  _nKi.resize(_N,0.);
+  _nGi.resize(_N,0.);
 };
 
 void mlawTVEMullins::setViscoElasticData(const int i, const double Ei, const double taui){
@@ -139,6 +143,9 @@ void mlawTVEMullins::setViscoElasticData(const int i, const double Ei, const dou
     _ki[i-1] = taui; // /(3.*(1.-2.*_nu));
     _Gi[i-1] = GG;
     _gi[i-1] = taui; // /(2.*(1.+_nu));
+    
+    _nKi[i-1] = KK/_K;
+    _nGi[i-1] = GG/_G;
 
     Msg::Info("setting: element=%d Ki= %e ki= %e, Gi= %e, gi= %e",i-1,KK,taui,GG,taui);
   }
@@ -150,6 +157,7 @@ void mlawTVEMullins::setViscoElasticData_Bulk(const int i, const double Ki, cons
   else{
     _Ki[i-1] = Ki;
     _ki[i-1] = ki;
+    _nKi[i-1] = KK/_K;
     // Msg::Info("setting: element=%d Ki = %e ki = %e, ",i-1,Ki,ki);
   }
 };
@@ -160,6 +168,7 @@ void mlawTVEMullins::setViscoElasticData_Shear(const int i, const double Gi, con
   else{
     _Gi[i-1] = Gi;
     _gi[i-1] = gi;
+    _nGi[i-1] = GG/_G;
     // Msg::Info("setting: element=%d Gi = %e gi = %e, ",i-1,Gi,gi);
   }
 };
@@ -169,6 +178,7 @@ void mlawTVEMullins::setViscoElasticData(const std::string filename){
   if (file == NULL) Msg::Error("file: %s does not exist",filename.c_str());
   _Ki.clear(); _ki.clear();
   _Gi.clear(); _gi.clear();
+  _nKi.clear(); _nGi.clear();
   _N = 0;
   Msg::Info("reading viscoelastic input data");
 
@@ -176,13 +186,18 @@ void mlawTVEMullins::setViscoElasticData(const std::string filename){
     int ok = fscanf(file,"%d",&_N);
     Msg::Info("Numer of Maxwell elements: %d",_N);
     double KK, k, GG, g;
+    double tempK, tempG = 0.;
 
     for (int i=0; i<_N; i++){
       ok = fscanf(file,"%lf %lf %lf %lf",&KK,&k,&GG,&g);
+      tempK = KK/_K;
+      tempG = GG/_G;
       _Ki.push_back(KK);
       _ki.push_back(k);
       _Gi.push_back(GG);
       _gi.push_back(g);
+      _nKi.push_back(tempK);
+      _nGi.push_back(tempG);
       Msg::Info("Maxwell element %d: K[%d] = %e, k[%d] = %e, G[%d] = %e, g[%d] = %e",
                 i,i,KK,i,k,i,GG,i,g);
     }
@@ -203,10 +218,157 @@ double mlawTVEMullins::ShiftFactorWLF(const double T, double *DaDT, double *DDaD
     return a_WLF;
 }
 
-double mlawTVEMullins::freeEnergyMechanical(const IPTVEMullins& q, const double Tc) const{
+void mlawTVEMullins::shiftedTime(const double t, const double T0, const double T1, double *t_shift, double *Ddt_shiftDT, double *DDdt_shiftDT,
+                                    const int opt_time, const int opt_order) const{
+
+// Shift t -> t is either delta_t or t (final time).  This function returns either t^* or delta_t^*.
+
+// opt_time -> 0 or 1 (default), depending on full-step or mid-step integration approximation for shifted time step
+// opt_order -> 1 or 2 (default) or 4, order of Guassian quadrature  (1 doesnt work, 4 probably works)
+
+    double dt = this->getTimeStep();
+    double t1 = this->getTime();
+    double t0 = t1 - dt;
+
+    // Linearly Interpolate Temperture -> This means dT/dt is constant between tn and tn+1
+    double ts, t_x0, t_x1, t_x2 = 0.;
+    double t_x6, t_x7, t_x8, t_x9 = 0.;
+    if (opt_time == 0){
+        ts = 2;
+
+        t_x0 = (t1+t0)/2;
+
+        t_x1 = (t1+t0)/2 - dt/2 * (1/sqrt(3));
+        t_x2 = (t1+t0)/2 + dt/2 * (1/sqrt(3));
+
+        t_x6 = (t1+t0)/2 - dt/2 * sqrt(3/7 - 2/7*sqrt(6/5));
+        t_x7 = (t1+t0)/2 + dt/2 * sqrt(3/7 - 2/7*sqrt(6/5));
+        t_x8 = (t1+t0)/2 - dt/2 * sqrt(3/7 + 2/7*sqrt(6/5));
+        t_x9 = (t1+t0)/2 + dt/2 * sqrt(3/7 + 2/7*sqrt(6/5));
+    } else {
+        ts = 4;
+
+        t_x0 = (3*t1+t0)/4;
+
+        t_x1 = (3*t1+t0)/4 - dt/4 * (1/sqrt(3));
+        t_x2 = (3*t1+t0)/4 + dt/4 * (1/sqrt(3));
+
+        t_x6 = (3*t1+t0)/4 - dt/4 * sqrt(3/7 - 2/7*sqrt(6/5));
+        t_x7 = (3*t1+t0)/4 + dt/4 * sqrt(3/7 - 2/7*sqrt(6/5));
+        t_x8 = (3*t1+t0)/4 - dt/4 * sqrt(3/7 + 2/7*sqrt(6/5));
+        t_x9 = (3*t1+t0)/4 + dt/4 * sqrt(3/7 + 2/7*sqrt(6/5));
+    }
+
+    double T_x0 = linearInterpTemp(t_x0, t0, t1, T0, T1);
+    double T_x1 = linearInterpTemp(t_x1, t0, t1, T0, T1);
+    double T_x2 = linearInterpTemp(t_x2, t0, t1, T0, T1);
+    double T_x6 = linearInterpTemp(t_x6, t0, t1, T0, T1);
+    double T_x7 = linearInterpTemp(t_x7, t0, t1, T0, T1);
+    double T_x8 = linearInterpTemp(t_x8, t0, t1, T0, T1);
+    double T_x9 = linearInterpTemp(t_x9, t0, t1, T0, T1);
+    // double T_x1 = 1/dt*( (t_1 - t_x1) )*T_0 + 1/dt*( (t_x1 - t_0) )*T_1 ;
+    // double T_x2 = 1/dt*( (t_1 - t_x2) )*T_0 + 1/dt*( (t_x2 - t_0) )*T_1 ;
+
+    if (t_shift!=NULL){
+
+        // double a_T1 = ShiftFactorWLF(T1);
+
+        if (opt_order == 1){
+            // 1 point Gauss rule
+            double a_x0 = ShiftFactorWLF(T_x0);
+            *t_shift = t/ts * (1/a_x0);
+        } else if (opt_order == 2){
+            // 2 point Gauss rule
+            double a_x1 = ShiftFactorWLF(T_x1);
+            double a_x2 = ShiftFactorWLF(T_x2);
+            *t_shift = t/ts * (1/a_x1 + 1/a_x2);
+        } else {
+            // 4 point Gauss rule
+            double a_x6 = ShiftFactorWLF(T_x6);
+            double a_x7 = ShiftFactorWLF(T_x7);
+            double a_x8 = ShiftFactorWLF(T_x8);
+            double a_x9 = ShiftFactorWLF(T_x9);
+            *t_shift = t/ts * (((18+sqrt(30))/36)*(1/a_x6 + 1/a_x7) + ((18-sqrt(30))/36)*(1/a_x8 + 1/a_x9));
+        }
+    }
+
+    if (Ddt_shiftDT!=NULL){
+
+        // double DaDT_T1 = 0.; double a_T1 = ShiftFactorWLF(T1,&DaDT_T1);
+
+        if (dt > 0.){
+            if (opt_order == 1){
+                // 1 point Gauss rule
+                double DaDT_x0 = 0.;
+                double a_x0 = ShiftFactorWLF(T_x0,&DaDT_x0);
+                *Ddt_shiftDT = t/ts * (DaDT_x0 * (t_x0-t0)/dt );
+            } else if (opt_order == 2){
+                // 2 point Gauss rule
+                double DaDT_x1, DaDT_x2 = 0.;
+                double a_x1 = ShiftFactorWLF(T_x1,&DaDT_x1);
+                double a_x2 = ShiftFactorWLF(T_x2,&DaDT_x2);
+                *Ddt_shiftDT = t/ts * (DaDT_x1 * (t_x1-t0)/dt + DaDT_x2 * (t_x2-t0)/dt);
+             } else {
+                // 4 point Gauss rule
+                double DaDT_x6, DaDT_x7, DaDT_x8, DaDT_x9 = 0.;
+                double a_x6 = ShiftFactorWLF(T_x6,&DaDT_x6);
+                double a_x7 = ShiftFactorWLF(T_x7,&DaDT_x7);
+                double a_x8 = ShiftFactorWLF(T_x8,&DaDT_x8);
+                double a_x9 = ShiftFactorWLF(T_x9,&DaDT_x9);
+                *Ddt_shiftDT = t/ts * ( ((18+sqrt(30))/36)*(DaDT_x6 * (t_x6-t0)/dt  + DaDT_x7 * (t_x7-t0)/dt ) +
+                                        ((18-sqrt(30))/36)*(DaDT_x8 * (t_x8-t0)/dt  + DaDT_x9 * (t_x9-t0)/dt ) );
+             }
+        } else { *Ddt_shiftDT = 0.;}
+    }
+
+    if (DDdt_shiftDT!=NULL){
+
+        // double DDaDT_T1 = 0.; double a_T1 = ShiftFactorWLF(T1,NULL,&DDaDT_T1);
+
+        if (dt > 0.){
+            if (opt_order == 1){
+                // 1 point Gauss rule
+                double DDaDT_x0 = 0.;
+                double a_x0 = ShiftFactorWLF(T_x0,NULL,&DDaDT_x0);
+                *DDdt_shiftDT = t/ts * ( DDaDT_x0 * pow( ((t_x0-t0)/dt) ,2 ) );
+            } else if (opt_order == 2){
+                // 2 point Gauss rule
+                double DDaDT_x1, DDaDT_x2 = 0.;
+                double a_x1 = ShiftFactorWLF(T_x1,NULL,&DDaDT_x1);
+                double a_x2 = ShiftFactorWLF(T_x2,NULL,&DDaDT_x2);
+                *DDdt_shiftDT = t/ts * ( DDaDT_x1 * pow( ((t_x1-t0)/dt) ,2 ) + DDaDT_x2 * pow( ((t_x2-t0)/dt) ,2 ) );
+            } else {
+                // 4 point Gauss rule
+                double DDaDT_x6, DDaDT_x7, DDaDT_x8, DDaDT_x9 = 0.;
+                double a_x6 = ShiftFactorWLF(T_x6,NULL,&DDaDT_x6);
+                double a_x7 = ShiftFactorWLF(T_x7,NULL,&DDaDT_x7);
+                double a_x8 = ShiftFactorWLF(T_x8,NULL,&DDaDT_x8);
+                double a_x9 = ShiftFactorWLF(T_x9,NULL,&DDaDT_x9);
+                *Ddt_shiftDT = t/ts * ( ((18+sqrt(30))/36)*( DDaDT_x6 * pow( (t_x6-t0)/dt, 2 ) + DDaDT_x7 * pow( (t_x7-t0)/dt, 2 )) +
+                                        ((18-sqrt(30))/36)*( DDaDT_x8 * pow( (t_x8-t0)/dt, 2 ) + DDaDT_x9 * pow( (t_x9-t0)/dt, 2 )) );
+            }
+        } else { *DDdt_shiftDT = 0.;}
+    }
+}
+
+
+double mlawTVEMullins::linearInterpTemp(const double t_interp, const double t0, const double t1, const double T0, const double T1) const{
 
-    // Update the Properties to the current temperature (see below which ones are being used)
-    double KT, GT, AlphaT; getK(KT,Tc); getG(GT,Tc); getAlpha(AlphaT,Tc);
+    // This function linearly interpolates temperature for the given intermediate time -> t_interp is tn + fraction of step (i.e., midstep = tn + 0.5*dt)
+        // Also, linear interp -> constant gradients
+    double dt = t1 - t0;
+    double T_interp;
+    if (dt > 0.){
+        T_interp = 1/dt*( (t1 - t_interp) )*T0 + 1/dt*( (t_interp - t0) )*T1;
+    }
+    else { T_interp = T0;}
+    return T_interp;
+}
+
+double mlawTVEMullins::freeEnergyMechanical(const IPTVEMullins& q, const double T) const{
+
+    // Update the Properties to the current temperature
+    double KT, GT, AlphaT; getK(KT,T); getG(GT,T); getAlpha(AlphaT,T);
 
     double Psy_mech = 0.;
 
@@ -216,7 +378,7 @@ double mlawTVEMullins::freeEnergyMechanical(const IPTVEMullins& q, const double
     STensorOperation::decomposeDevTr(q._Ee,devEe,trEe);
 
     // Get thermal strain
-    double Eth = 3.*AlphaT*(Tc-_Tinitial);
+    double Eth = 3.*AlphaT*(T-_Tinitial);
 
     // Get Equilibrium freeEnergy_mech
     Psy_mech = KT*0.5*(trEe-Eth)*(trEe-Eth) + GT*STensorOperation::doubledot(devEe,devEe);
@@ -247,7 +409,10 @@ double mlawTVEMullins::freeEnergyMechanical(const IPTVEMullins& q, const double
 }
 
 void mlawTVEMullins::corKirInfinity(const STensor3& devEe,  const double& trEe, const double T0, const double T, STensor3& CorKirDevInf, double& CorKirTrInf) const{
-
+    double KT, GT, AlphaT;
+    getK(KT,T); getG(GT,T); getAlpha(AlphaT,T);
+    CorKirDevInf = 2*GT*devEe;
+    CorKirTrInf = KT*(trEe - 3*AlphaT*(T-_Tinitial));
 }
 
 void mlawTVEMullins::getTVEdCorKirDT(const IPTVEMullins *q0, IPTVEMullins *q1, const double& T0, const double& T) const{
@@ -263,7 +428,7 @@ void mlawTVEMullins::getMechSourceTVE(const IPTVEMullins *q0, IPTVEMullins *q1,
 void mlawTVEMullins::ThermoViscoElasticPredictor(const STensor3& Ee, const STensor3& Ee0,
           const IPTVEMullins *q0, IPTVEMullins *q1,
           double& Ke, double& Ge,
-          const double T0, const double T1, const bool calculateStress) const{
+          const double T0, const double T, const bool calculateStress) const{
 
 
     // Get LogStrain
@@ -277,7 +442,7 @@ void mlawTVEMullins::ThermoViscoElasticPredictor(const STensor3& Ee, const STens
     // Get corKirInfinity
     static double CorKirTrInf;
     static STensor3 CorKirDevInf;
-    corKirInfinity(devEe,trEe,T0,T1,CorKirDevInf,CorKirTrInf);
+    corKirInfinity(devEe,trEe,T0,T,CorKirDevInf,CorKirTrInf);
 
     // Initialise CorKirStress - Dev
     static STensor3 devK;
@@ -295,9 +460,9 @@ void mlawTVEMullins::ThermoViscoElasticPredictor(const STensor3& Ee, const STens
         double dt_shift_1, dt_shift_2 = 0.;
         double Ddt_shiftDT, DDdt_shiftDT = 0.;
         // dt_shift = dt;
-        shiftedTime(dt, T0, T1, &dt_shift_1,NULL,NULL,0);
-        shiftedTime(dt, T0, T1, &dt_shift_2,&Ddt_shiftDT,&DDdt_shiftDT);
-            // double aT_1 = ShiftFactorWLF(T1);
+        shiftedTime(dt, T0, T, &dt_shift_1,NULL,NULL,0);
+        shiftedTime(dt, T0, T, &dt_shift_2,&Ddt_shiftDT,&DDdt_shiftDT);
+            // double aT_1 = ShiftFactorWLF(T);
 
         std::vector<double> KiT, GiT, DKiDT, DGiDT, DDKiDT, DDGiDT;
         KiT.resize(_N,0.); GiT.resize(_N,0.);
diff --git a/NonLinearSolver/materialLaw/mlawTVEMullins.h b/NonLinearSolver/materialLaw/mlawTVEMullins.h
index 195b9c7dd20b96ce21d7161ef234e775bd1b3682..65ada9227b82d5512381cfc48d1f23629737aed1 100644
--- a/NonLinearSolver/materialLaw/mlawTVEMullins.h
+++ b/NonLinearSolver/materialLaw/mlawTVEMullins.h
@@ -49,8 +49,8 @@ class mlawTVEMullins : public mlawPowerYieldHyper{
     scalarFunction* _temFunc_Cp;                    // specific heat temperature function
 
     // Scalars - Additional constants
-    std::vector<double> nKi;            // branch free energy scalars
-    std::vector<double> nGi;            // branch free energy scalars
+    std::vector<double> _nKi;            // normalized branch Bulk Moduli
+    std::vector<double> _nGi;            // normalized branch Shear Moduli
 
     // Shift factor - Everything related to it
     double _C1;                                     // WLF Universal Constant 1 - set in .py file
@@ -61,7 +61,11 @@ class mlawTVEMullins : public mlawPowerYieldHyper{
   protected:
     // Const Functions for constitutive function - To update any variable, pass it as an argument by reference.
     virtual double ShiftFactorWLF(const double T, double *DaDT = NULL, double *DDaDDT = NULL) const ;
-    virtual double freeEnergyMechanical(const IPTVEMullins& q, const double Tc) const ;
+    virtual void shiftedTime(const double t, const double T0, const double T1,
+                             double *t_shift = NULL, double *Ddt_shiftDT = NULL, double *DDdt_shiftDT = NULL,
+                             const int opt_time = 1, const int opt_order = 2) const;
+    virtual double linearInterpTemp(const double t_interp, const double t0, const double t1, const double T0, const double T1) const;
+    virtual double freeEnergyMechanical(const IPTVEMullins& q, const double T) const ;
 
     void corKirInfinity(const STensor3& devEe, const double& trEe, const double T0, const double T, STensor3& CorKirDevInf, double& CorKirTrInf) const;