diff --git a/dG3D/src/dG3DMaterialLaw.cpp b/dG3D/src/dG3DMaterialLaw.cpp
index dd64c2a427de4710f32cdc0752d877c3a5d605e5..6b0ed3fbddcbcc351c12a6fa8d6bac4925d07bf7 100644
--- a/dG3D/src/dG3DMaterialLaw.cpp
+++ b/dG3D/src/dG3DMaterialLaw.cpp
@@ -4333,6 +4333,9 @@ void StochDMNDG3DMaterialLaw::stress(IPVariable*ipv, const IPVariable*ipvprev, c
   const StochDMNDG3DIPVariable* ipv_prev = static_cast<const StochDMNDG3DIPVariable*>(ipvprev);
   const STensor3& F_unrot = ipvcur->getConstRefToDeformationGradient();
   
+  static STensor3 U, R_def; // R_def is the Rotation in F = R_def . U
+  STensorOperation::RUDecomposition(F_unrot,U,R_def);
+  
   static STensor3 F; STensorOperation::zero(F); F = F_unrot;
   if (_flag_rotation){
 
@@ -4346,8 +4349,10 @@ void StochDMNDG3DMaterialLaw::stress(IPVariable*ipv, const IPVariable*ipvprev, c
     }
     static STensor3 RT; STensorOperation::zero(RT);
     STensorOperation::transposeSTensor3(R,RT);
-    
-    STensorOperation::multSTensor3InPlace2nd(RT,F);
+
+    STensorOperation::multSTensor3InPlace2nd(R,U);
+    STensorOperation::multSTensor3InPlace1st(U,RT);
+    F = U; // R_def in the rotated frame = I;
   }
 
   STensor3& P = ipvcur->getRefToFirstPiolaKirchhoffStress();
@@ -4490,39 +4495,68 @@ void StochDMNDG3DMaterialLaw::stress(IPVariable*ipv, const IPVariable*ipvprev, c
       }
 
       if (_flag_rotation){
-        const STensor3& R = ipvcur->getConstReftoRotationMatrix();
-        static STensor3 RT; STensorOperation::zero(RT); STensorOperation::transposeSTensor3(R,RT);
 
-        static STensor3 I2; STensorOperation::zero(I2); I2(0,0) = I2(1,1) = I2(2,2) = 1.;
-        static STensor43 I4_first_type; STensorOperation::zero(I4_first_type); // first type of fourth order unit tensor
-        for(int m=0; m<3; m++)
-          for(int n=0; n<3; n++)
-            for(int k=0; k<3; k++)
-              for(int l=0; l<3; l++)
-                I4_first_type(m,n,k,l) = I2(m,k)*I2(n,l); // = dFrotdFrot
-
-        static STensor43 dFdF_rot; STensorOperation::zero(dFdF_rot);
+        const STensor3& R = ipvcur->getConstReftoRotationMatrix();
+        static STensor3 RT; STensorOperation::zero(RT); STensorOperation::transposeSTensor3(R, RT);
+        static STensor3 Finvrot, Prot;
+  
+        Prot = P;
+        STensorOperation::zero(P);
         for(int m=0; m<3; m++)
           for(int n=0; n<3; n++)
-            for(int k=0; k<3; k++)
-              for(int l=0; l<3; l++){
-                dFdF_rot(m,n,k,l) = 0.;
-                for(int p=0; p<3; p++)
-                  dFdF_rot(m,n,k,l) += RT(m,p)*I4_first_type(p,n,k,l);
-              }
-        
-        static STensor43 L_rot;
-        STensorOperation::multSTensor43InPlace(L,dFdF_rot);
-        for(int i=0; i<3; i++)
-          for(int k=0; k<3; k++)
-            for(int o=0; o<3; o++)
-              for(int p=0; p<3; p++){
-                L_rot(i,k,o,p) = 0.;
-                for(int j=0; j<3; j++)
-                  L_rot(i,k,o,p) += R(i,j)*L(j,k,o,p);
+            for(int p=0; p<3; p++)
+              for(int q=0; q<3; q++)
+                for(int r=0; r<3; r++)
+                  P(m,n) += R_def(m,p)*RT(p,q)*Prot(q,r)*R(r,n);
+  
+        if(stiff){
+          static STensor43 dFinvrot_dFrot; STensorOperation::zero(dFinvrot_dFrot);
+          STensorOperation::inverseSTensor3(F,Finvrot,&dFinvrot_dFrot,false);
+          
+          static STensor3 I2; STensorOperation::zero(I2); I2(0,0) = I2(1,1) = I2(2,2) = 1.;
+          static STensor43 I4_first_type; STensorOperation::zero(I4_first_type); // first type of fourth order unit tensor
+          for(int m=0; m<3; m++)
+            for(int n=0; n<3; n++)
+              for(int k=0; k<3; k++)
+                for(int l=0; l<3; l++)
+                  I4_first_type(m,n,k,l) = I2(m,k)*I2(n,l);
+
+          static STensor43 dFrot_dF, dFinvrot_dF; STensorOperation::zero(dFrot_dF); STensorOperation::zero(dFinvrot_dF);
+  
+          for(int m=0; m<3; m++)
+            for(int n=0; n<3; n++)
+              for(int k=0; k<3; k++){
+                for(int l=0; l<3; l++)
+                  for(int p=0; p<3; p++)
+                    for(int q=0; q<3; q++)
+                      for(int r=0; r<3; r++)
+                        dFrot_dF(m,n,k,l) += R(m,p)*R_def(q,p)*I4_first_type(q,r,k,l)*RT(r,n); // R_def_T is used here
               }
-
-        L = L_rot; 
+          
+          for(int m=0; m<3; m++)
+            for(int n=0; n<3; n++)
+              for(int k=0; k<3; k++)
+                for(int l=0; l<3; l++)
+                  for(int p=0; p<3; p++)
+                    for(int q=0; q<3; q++)
+                      dFinvrot_dF(m,n,k,l) += dFinvrot_dFrot(m,n,p,q)*dFrot_dF(p,q,k,l);
+                  
+          
+          // dPdF
+          static STensor43 L_rot; STensorOperation::zero(L_rot);
+          STensorOperation::multSTensor43InPlace(L,dFrot_dF); // L = dProt_dFrot and becomes dProt_dF
+          for(int m=0; m<3; m++)
+            for(int n=0; n<3; n++)
+              for(int k=0; k<3; k++)
+                for(int l=0; l<3; l++)
+                  for(int p=0; p<3; p++)
+                    for(int q=0; q<3; q++)
+                      for(int r=0; r<3; r++)
+                        L_rot(m,n,k,l) += R_def(m,p)*RT(p,q)*L(q,r,k,l)*R(r,n);
+            
+          // Reassign
+          L = L_rot;
+        }
       }
 
     }
@@ -5753,10 +5787,8 @@ void StochTMDMNDG3DMaterialLaw::stress(IPVariable*ipv, const IPVariable*ipvprev,
 
     STensorOperation::multSTensor3InPlace2nd(R,U);
     STensorOperation::multSTensor3InPlace1st(U,RT);
-    // STensorOperation::multSTensor3(R_def,U,F);
     F = U; // R_def in the rotated frame = I;
 
-    // STensorOperation::multSTensor3InPlace1st(F,RT);
     STensorOperation::multSTensor3SVector3InPlace2nd(R,H);
   }
 
@@ -6154,27 +6186,36 @@ void StochTMDMNDG3DMaterialLaw::stress(IPVariable*ipv, const IPVariable*ipvprev,
 
       const STensor3& R = ipvcur->getConstReftoRotationMatrix();
       static STensor3 RT; STensorOperation::zero(RT); STensorOperation::transposeSTensor3(R, RT);
-      static STensor3 Finvrot, S, Srot, Prot, dSdT;
+      static STensor3 Finvrot, Prot;
 
       Prot = P;
-      STensorOperation::inverseSTensor3(F,Finvrot); // Note that F is Frot here
+      STensorOperation::zero(P);
+      for(int m=0; m<3; m++)
+        for(int n=0; n<3; n++)
+          for(int p=0; p<3; p++)
+            for(int q=0; q<3; q++)
+              for(int r=0; r<3; r++)
+                P(m,n) += R_def(m,p)*RT(p,q)*Prot(q,r)*R(r,n);
 
-      STensorOperation::multSTensor3(Finvrot,Prot,Srot);
-      STensorOperation::multSTensor3InPlace2nd(RT,Srot);
-      STensorOperation::multSTensor3(Srot,R,S);
+      STensorOperation::multSTensor3SVector3InPlace2nd(RT,Q);
 
       if(stiff){
         static STensor43 dFinvrot_dFrot; STensorOperation::zero(dFinvrot_dFrot);
         STensorOperation::inverseSTensor3(F,Finvrot,&dFinvrot_dFrot,false);
-        STensorOperation::multSTensor3(Finvrot,dPdT,dSdT); // Since dPdT is dProt_dT initially, dSdT is dSrot_dT is initially
-        STensorOperation::multSTensor3InPlace2nd(RT,dSdT);
-        STensorOperation::multSTensor3InPlace1st(dSdT,R); // Here dSrot_dT becomes dSdT
-        STensorOperation::multSTensor3(F_unrot,dSdT,dPdT);
-  
+        
+        static STensor3 dProt_dT; 
+        dProt_dT = dPdT;
+        STensorOperation::zero(dPdT);
+        for(int m=0; m<3; m++)
+          for(int n=0; n<3; n++)
+            for(int p=0; p<3; p++)
+              for(int q=0; q<3; q++)
+                for(int r=0; r<3; r++)
+                  dPdT(m,n) += R_def(m,p)*RT(p,q)*dProt_dT(q,r)*R(r,n);
+
         STensorOperation::multSTensor3SVector3InPlace2nd(RT,dqdT);
 
         static STensor3 I2; STensorOperation::zero(I2); I2(0,0) = I2(1,1) = I2(2,2) = 1.;
-        const STensor43 I4_symm(1.,1.); // symmetric type of fourth order unit tensor
         static STensor43 I4_first_type; STensorOperation::zero(I4_first_type); // first type of fourth order unit tensor
         for(int m=0; m<3; m++)
           for(int n=0; n<3; n++)
@@ -6183,40 +6224,18 @@ void StochTMDMNDG3DMaterialLaw::stress(IPVariable*ipv, const IPVariable*ipvprev,
                 I4_first_type(m,n,k,l) = I2(m,k)*I2(n,l);
 
         static STensor3 dHrot_dH; STensorOperation::zero(dHrot_dH);
-        static STensor43 dUdF, dUrot_dU, dUrot_dF, dFrot_dF, dFinvrot_dF; 
-        STensorOperation::zero(dUdF);
-        STensorOperation::zero(dUrot_dU);
-        STensorOperation::zero(dUrot_dF);
-        STensorOperation::zero(dFrot_dF);
-        STensorOperation::zero(dFinvrot_dF);
-
-        for(int m=0; m<3; m++)
-          for(int n=0; n<3; n++)
-            for(int k=0; k<3; k++)
-              for(int l=0; l<3; l++)
-                for(int p=0; p<3; p++){
-                  dUdF(m,n,k,l) += R_def(p,m)*I4_first_type(p,n,k,l); // R_def_T is used here
-                  for(int q=0; q<3; q++)
-                    dUrot_dU(m,n,k,l) += R(m,p)*I4_symm(p,q,k,l)*RT(q,n);
-                }
+        static STensor43 dFrot_dF, dFinvrot_dF; STensorOperation::zero(dFrot_dF); STensorOperation::zero(dFinvrot_dF);
 
         for(int m=0; m<3; m++)
           for(int n=0; n<3; n++)
             for(int k=0; k<3; k++){
               dHrot_dH(m,n) += R(m,k)*I2(k,n);
-              for(int l=0; l<3; l++)
-                for(int r=0; r<3; r++)
-                  for(int s=0; s<3; s++)
-                    dUrot_dF(m,n,k,l) += dUrot_dU(m,n,r,s)*dUdF(r,s,k,l);
-            }
-        /*
-        for(int m=0; m<3; m++)
-          for(int n=0; n<3; n++)
-            for(int k=0; k<3; k++)
               for(int l=0; l<3; l++)
                 for(int p=0; p<3; p++)
-                  dFrot_dF(m,n,k,l) += R_def(m,p)*dUrot_dF(p,n,k,l);*/
-        dFrot_dF = dUrot_dF; // R_def_rot = I;
+                  for(int q=0; q<3; q++)
+                    for(int r=0; r<3; r++)
+                      dFrot_dF(m,n,k,l) += R(m,p)*R_def(q,p)*I4_first_type(q,r,k,l)*RT(r,n); // R_def_T is used here
+            }
         
         for(int m=0; m<3; m++)
           for(int n=0; n<3; n++)
@@ -6228,39 +6247,19 @@ void StochTMDMNDG3DMaterialLaw::stress(IPVariable*ipv, const IPVariable*ipvprev,
                 
         
         // dPdF
-        static STensor43 dSdF, dSrot_dF, L_rot;
-        static STensor33 dqdF_rot;
-        static STensor3 dwdf_rot, dmechSourcedf_rot;
-        
-        STensorOperation::zero(L_rot);
-        STensorOperation::zero(dqdF_rot);
-        STensorOperation::zero(dSdF);
-        STensorOperation::zero(dSrot_dF);
-        
+        static STensor43 L_rot; STensorOperation::zero(L_rot);
         STensorOperation::multSTensor43InPlace(L,dFrot_dF); // L = dProt_dFrot and becomes dProt_dF
-        for(int m=0; m<3; m++)
-          for(int n=0; n<3; n++)
-            for(int k=0; k<3; k++)
-              for(int l=0; l<3; l++)
-                for(int p=0; p<3; p++)
-                  dSrot_dF(m,n,k,l) += dFinvrot_dF(m,p,k,l)*Prot(p,n) + Finvrot(m,p)*L(p,n,k,l);
-        
         for(int m=0; m<3; m++)
           for(int n=0; n<3; n++)
             for(int k=0; k<3; k++)
               for(int l=0; l<3; l++)
                 for(int p=0; p<3; p++)
                   for(int q=0; q<3; q++)
-                    dSdF(m,n,k,l) += RT(m,p)*dSrot_dF(p,q,k,l)*R(q,n);
-        
-        for(int m=0; m<3; m++)
-          for(int n=0; n<3; n++)
-            for(int k=0; k<3; k++)
-              for(int l=0; l<3; l++)
-                for(int p=0; p<3; p++)
-                  L_rot(m,n,k,l) += I4_first_type(m,p,k,l)*S(p,n) + F_unrot(m,p)*dSdF(p,n,k,l);
+                    for(int r=0; r<3; r++)
+                      L_rot(m,n,k,l) += R_def(m,p)*RT(p,q)*L(q,r,k,l)*R(r,n);
         
         // dqdF  
+        static STensor33 dqdF_rot; STensorOperation::zero(dqdF_rot);
         for(int m=0; m<3; m++)
           for(int n=0; n<3; n++)
             for(int k=0; k<3; k++)
@@ -6274,18 +6273,13 @@ void StochTMDMNDG3DMaterialLaw::stress(IPVariable*ipv, const IPVariable*ipvprev,
         STensorOperation::multSTensor3InPlace2nd(RT,dqdgradT);
 
         // thermSrc, mechSrc
+        static STensor3 dwdf_rot, dmechSourcedf_rot;
         STensorOperation::multSTensor3STensor43(dwdf,dFrot_dF,dwdf_rot);
         STensorOperation::multSTensor3STensor43(dmechSourcedf,dFrot_dF,dmechSourcedf_rot);
           
         // Reassign
         L = L_rot; dqdF = dqdF_rot; dwdf = dwdf_rot; dmechSourcedf = dmechSourcedf_rot; 
       }
-    
-      STensorOperation::multSTensor3(F_unrot,S,P);
-
-      // STensorOperation::multSTensor3(Prot,R,P);
-      STensorOperation::multSTensor3SVector3InPlace2nd(RT,Q);
-
     }
     ipvcur->setRefToDGElasticTangentModuli(this->elasticStiffness);
   }