diff --git a/src/rodassembler.cc b/src/rodassembler.cc
index aac12b13ab71cd0dc2fc9413fac7ff691fabd19a..2deeaefa3190c2dfdfcce02e36949ba7a237f891 100644
--- a/src/rodassembler.cc
+++ b/src/rodassembler.cc
@@ -516,10 +516,8 @@ assembleGradient(const std::vector<Configuration>& sol,
 
             // Get the derivative of the rotation at the quadrature point by interpolating in $H$
             Quaternion<double> hatq_s;
-            hatq_s[0] = localSolution[0].q[0]*shapeGrad[0] + localSolution[1].q[0]*shapeGrad[1];
-            hatq_s[1] = localSolution[0].q[1]*shapeGrad[0] + localSolution[1].q[1]*shapeGrad[1];
-            hatq_s[2] = localSolution[0].q[2]*shapeGrad[0] + localSolution[1].q[2]*shapeGrad[1];
-            hatq_s[3] = localSolution[0].q[3]*shapeGrad[0] + localSolution[1].q[3]*shapeGrad[1];
+            for (int i=0; i<4; i++)
+                hatq_s[i] = localSolution[0].q[i]*shapeGrad[0] + localSolution[1].q[i]*shapeGrad[1];
 
             // The current strain
             FieldVector<double,blocksize> strain = getStrain(sol, it, quadPos);
@@ -530,19 +528,19 @@ assembleGradient(const std::vector<Configuration>& sol,
             // Contains \partial q / \partial v^i_j  at v = 0
             FixedArray<Quaternion<double>,3> dq_dvj;
 
-            Quaternion<double> dq_dvij_ds[2][3];
-            for (int i=0; i<2; i++)
-                for (int j=0; j<3; j++) {
+            FixedArray<Quaternion<double>,3> dq_dvj_ds;
 
-                    for (int m=0; m<3; m++) {
-                        dq_dvj[j][m]    = (j==m) * 0.5;
-                        dq_dvij_ds[i][j][m] = (j==m) * 0.5 * shapeGrad[i];
-                    }
-
-                    dq_dvj[j][3]    = 0;
-                    dq_dvij_ds[i][j][3] = 0;
+            for (int j=0; j<3; j++) {
+                    
+                for (int m=0; m<3; m++) {
+                    dq_dvj[j][m]     = (j==m) * 0.5;
+                    dq_dvj_ds[j][m] = (j==m) * 0.5;
                 }
 
+                dq_dvj[j][3]    = 0;
+                dq_dvj_ds[j][3] = 0;
+            }
+
             // dd_dvij[k][i][j] = \parder {d_k} {v^i_j}
             FixedArray<FixedArray<FieldVector<double,3>, 3>, 3> dd_dvj;
             getFirstDerivativesOfDirectors(hatq, dd_dvj, dq_dvj);
@@ -563,20 +561,18 @@ assembleGradient(const std::vector<Configuration>& sol,
                 // \partial \bar{W} / \partial r^i_j
                 for (int j=0; j<3; j++) {
 
-                    grad[globalDof][j] += weight 
-                        * ((  A_[0] * (strain[0] - referenceStrain[0]) * shapeGrad[i] * hatq.director(0)[j])
-                           + (A_[1] * (strain[1] - referenceStrain[1]) * shapeGrad[i] * hatq.director(1)[j])
-                           + (A_[2] * (strain[2] - referenceStrain[2]) * shapeGrad[i] * hatq.director(2)[j]));
+                    for (int m=0; m<3; m++) 
+                        grad[globalDof][j] += weight 
+                            * (  A_[m] * (strain[m] - referenceStrain[m]) * shapeGrad[i] * hatq.director(m)[j]);
 
                 }
 
                 // \partial \bar{W}_v / \partial v^i_j
                 for (int j=0; j<3; j++) {
 
-                    grad[globalDof][3+j] += weight 
-                        * (  (A_[0] * (strain[0] - referenceStrain[0]) * (r_s*dd_dvj[0][j]*shapeFunction[i]))
-                           + (A_[1] * (strain[1] - referenceStrain[1]) * (r_s*dd_dvj[1][j]*shapeFunction[i]))
-                           + (A_[2] * (strain[2] - referenceStrain[2]) * (r_s*dd_dvj[2][j]*shapeFunction[i])));
+                    for (int m=0; m<3; m++) 
+                        grad[globalDof][3+j] += weight 
+                            * (A_[m] * (strain[m] - referenceStrain[m]) * (r_s*dd_dvj[m][j]*shapeFunction[i]));
 
                 }
 
@@ -587,24 +583,30 @@ assembleGradient(const std::vector<Configuration>& sol,
                 // \partial \bar{W}_v / \partial v^i_j
                 for (int j=0; j<3; j++) {
 
-                    FieldVector<double,3> du_dvij;
                     for (int m=0; m<3; m++) {
-                        du_dvij[m] = (dq_dvj[j].mult(hatq)).B(m) * hatq_s;
-                        du_dvij[m] *= shapeFunction[i];
-                        Quaternion<double> tmp = dq_dvj[j];
-                        tmp *= shapeFunction[i];
-                        du_dvij[m] += hatq.B(m) * (dq_dvij_ds[i][j].mult(hatq) + tmp.mult(hatq_s));
-                    }
-                    du_dvij *= 2;
 
-                    FieldVector<double,3> darbouxCan = darbouxCanonical(hatq, hatq_s);
-                    for (int m=0; m<3; m++) {
+                        double du_dvij_m;
+
+                        for (int t=0; t<3; t++) {
 
-                        double addend1 = du_dvij * hatq.director(m);
-                        double addend2 = darbouxCan * dd_dvj[m][j] * shapeFunction[i];
+                            du_dvij_m = (hatq.mult(dq_dvj[j])).B(t) * hatq_s;
+                            du_dvij_m *= shapeFunction[i] * hatq.director(m)[t];
+                            
+                            Quaternion<double> tmp = dq_dvj[j];
+                            tmp *= shapeFunction[i];
+                            Quaternion<double> tmp_ds = dq_dvj_ds[j];
+                            tmp_ds *= shapeGrad[i];
+                            
+                            du_dvij_m += hatq.B(t) * (hatq.mult(tmp_ds) + hatq_s.mult(tmp)) * hatq.director(m)[t];
+                            
+                            du_dvij_m += (hatq.B(t) * hatq_s) * dd_dvj[m][j] * shapeFunction[i];
+                            
+                            du_dvij_m *= 2;
+
+                        }
 
                         grad[globalDof][3+j] += weight * K_[m] 
-                            * (strain[m+3]-referenceStrain[m+3]) * (addend1 + addend2);
+                            * (strain[m+3]-referenceStrain[m+3]) * du_dvij_m;
 
                     }