diff --git a/test/rotationtest.cc b/test/rotationtest.cc
index 055be5e76fd373edcd4a12524641069dda3671e5..2ecbb3d8ca449fd5e8e1010197480c7fc5f2b9d7 100644
--- a/test/rotationtest.cc
+++ b/test/rotationtest.cc
@@ -35,14 +35,17 @@ void testDDExp()
             for (int k=0; k<3; k++) {
 
                 if (j==k) {
-
-                    Quaternion<double> forwardQ  = Quaternion<double>::exp(v[i][0] + (j==0)*eps,
-                                                                           v[i][1] + (j==1)*eps,
-                                                                           v[i][2] + (j==2)*eps);
-                    Quaternion<double> centerQ   = Quaternion<double>::exp(v[i][0],v[i][1],v[i][2]);
-                    Quaternion<double> backwardQ = Quaternion<double>::exp(v[i][0] - (j==0)*eps,
-                                                                           v[i][1] - (j==1)*eps,
-                                                                           v[i][2] - (j==2)*eps);
+                    
+                    SkewMatrix<double,3> forward(v[i]);
+                    forward.axial()[j] += eps;
+                    Rotation<double,3> forwardQ  = Rotation<double,3>::exp(forward);
+                    
+                    SkewMatrix<double,3> center(v[i]);
+                    Rotation<double,3> centerQ   = Rotation<double,3>::exp(center);
+                    
+                    SkewMatrix<double,3> backward(v[i]);
+                    backward.axial()[j] -= eps;
+                    Rotation<double,3> backwardQ = Rotation<double,3>::exp(backward);
 
                     for (int l=0; l<4; l++)
                         fdDDExp[l][j][j] = (forwardQ[l] - 2*centerQ[l] + backwardQ[l]) / (eps*eps);
@@ -55,10 +58,10 @@ void testDDExp()
                     SkewMatrix<double,3> bfV(v[i]);      bfV.axial()[j] -= eps;     bfV.axial()[k] += eps;
                     SkewMatrix<double,3> bbV(v[i]);      bbV.axial()[j] -= eps;     bbV.axial()[k] -= eps;
 
-                    Quaternion<double> forwardForwardQ = Quaternion<double>::exp(ffV);
-                    Quaternion<double> forwardBackwardQ = Quaternion<double>::exp(fbV);
-                    Quaternion<double> backwardForwardQ = Quaternion<double>::exp(bfV);
-                    Quaternion<double> backwardBackwardQ = Quaternion<double>::exp(bbV);
+                    Rotation<double,3> forwardForwardQ = Rotation<double,3>::exp(ffV);
+                    Rotation<double,3> forwardBackwardQ = Rotation<double,3>::exp(fbV);
+                    Rotation<double,3> backwardForwardQ = Rotation<double,3>::exp(bfV);
+                    Rotation<double,3> backwardBackwardQ = Rotation<double,3>::exp(bbV);
 
                     for (int l=0; l<4; l++)
                         fdDDExp[l][j][k] = (forwardForwardQ[l] + backwardBackwardQ[l]
@@ -88,18 +91,18 @@ void testDDExp()
 
 void testDerivativeOfInterpolatedPosition()
 {
-    array<Quaternion<double>, 6> q;
+    array<Rotation<double,3>, 6> q;
 
     FieldVector<double,3>  xAxis(0);    xAxis[0] = 1;
     FieldVector<double,3>  yAxis(0);    yAxis[1] = 1;
     FieldVector<double,3>  zAxis(0);    zAxis[2] = 1;
 
-    q[0] = Quaternion<double>(xAxis, 0);
-    q[1] = Quaternion<double>(xAxis, M_PI/2);
-    q[2] = Quaternion<double>(yAxis, 0);
-    q[3] = Quaternion<double>(yAxis, M_PI/2);
-    q[4] = Quaternion<double>(zAxis, 0);
-    q[5] = Quaternion<double>(zAxis, M_PI/2);
+    q[0] = Rotation<double,3>(xAxis, 0);
+    q[1] = Rotation<double,3>(xAxis, M_PI/2);
+    q[2] = Rotation<double,3>(yAxis, 0);
+    q[3] = Rotation<double,3>(yAxis, M_PI/2);
+    q[4] = Rotation<double,3>(zAxis, 0);
+    q[5] = Rotation<double,3>(zAxis, M_PI/2);
 
     double eps = 1e-7;
 
@@ -111,41 +114,31 @@ void testDerivativeOfInterpolatedPosition()
 
                 double s = k/6.0;
 
-                array<Quaternion<double>,6> fdGrad;
+                array<Rotation<double,3>,6> fdGrad;
 
                 // ///////////////////////////////////////////////////////////
                 //   First: test the interpolated position
                 // ///////////////////////////////////////////////////////////
-                fdGrad[0] =  Rotation<double,3>::interpolate(q[i].mult(Quaternion<double>::exp(eps,0,0)), q[j], s);
-                fdGrad[0] -= Rotation<double,3>::interpolate(q[i].mult(Quaternion<double>::exp(-eps,0,0)), q[j], s);
-                fdGrad[0] /= 2*eps;
-
-                fdGrad[1] =  Rotation<double,3>::interpolate(q[i].mult(Quaternion<double>::exp(0,eps,0)), q[j], s);
-                fdGrad[1] -= Rotation<double,3>::interpolate(q[i].mult(Quaternion<double>::exp(0,-eps,0)), q[j], s);
-                fdGrad[1] /= 2*eps;
-
-                fdGrad[2] =  Rotation<double,3>::interpolate(q[i].mult(Quaternion<double>::exp(0,0,eps)), q[j], s);
-                fdGrad[2] -= Rotation<double,3>::interpolate(q[i].mult(Quaternion<double>::exp(0,0,-eps)), q[j], s);
-                fdGrad[2] /= 2*eps;
-
-                fdGrad[3] =  Rotation<double,3>::interpolate(q[i], q[j].mult(Quaternion<double>::exp(eps,0,0)), s);
-                fdGrad[3] -= Rotation<double,3>::interpolate(q[i], q[j].mult(Quaternion<double>::exp(-eps,0,0)), s);
-                fdGrad[3] /= 2*eps;
-
-                fdGrad[4] =  Rotation<double,3>::interpolate(q[i], q[j].mult(Quaternion<double>::exp(0,eps,0)), s);
-                fdGrad[4] -= Rotation<double,3>::interpolate(q[i], q[j].mult(Quaternion<double>::exp(0,-eps,0)), s);
-                fdGrad[4] /= 2*eps;
-
-                fdGrad[5] =  Rotation<double,3>::interpolate(q[i], q[j].mult(Quaternion<double>::exp(0,0,eps)), s);
-                fdGrad[5] -= Rotation<double,3>::interpolate(q[i], q[j].mult(Quaternion<double>::exp(0,0,-eps)), s);
-                fdGrad[5] /= 2*eps;
+                for (int l=0; l<3; l++) {
+                    SkewMatrix<double,3> forward(FieldVector<double,3>(0));
+                    SkewMatrix<double,3> backward(FieldVector<double,3>(0));
+                    forward.axial()[l] += eps;
+                    backward.axial()[l] -= eps;
+                    fdGrad[l] =  Rotation<double,3>::interpolate(q[i].mult(Rotation<double,3>::exp(forward)), q[j], s);
+                    fdGrad[l] -= Rotation<double,3>::interpolate(q[i].mult(Rotation<double,3>::exp(backward)), q[j], s);
+                    fdGrad[l] /= 2*eps;
+
+                    fdGrad[3+l] =  Rotation<double,3>::interpolate(q[i], q[j].mult(Rotation<double,3>::exp(forward)), s);
+                    fdGrad[3+l] -= Rotation<double,3>::interpolate(q[i], q[j].mult(Rotation<double,3>::exp(backward)), s);
+                    fdGrad[3+l] /= 2*eps;
+                }
 
                 // Compute analytical gradient
-                array<Quaternion<double>,6> grad;
+                array<Rotation<double,3>,6> grad;
                 RodLocalStiffness<OneDGrid,double>::interpolationDerivative(q[i], q[j], s, grad);
 
                 for (int l=0; l<6; l++) {
-                    Quaternion<double> diff = fdGrad[l];
+                    Rotation<double,3> diff = fdGrad[l];
                     diff -= grad[l];
                     if (diff.two_norm() > 1e-6) {
                         std::cout << "Error in position " << l << ":  fd: " << fdGrad[l] 
@@ -162,41 +155,41 @@ void testDerivativeOfInterpolatedPosition()
 
                     double intervalLength = l/(double(3));
                     
-                    fdGrad[0] =  Rotation<double,3>::interpolateDerivative(q[i].mult(Quaternion<double>::exp(eps,0,0)), 
+                    fdGrad[0] =  Rotation<double,3>::interpolateDerivative(q[i].mult(Rotation<double,3>::exp(eps,0,0)), 
                                                                            q[j], s, intervalLength);
-                    fdGrad[0] -= Rotation<double,3>::interpolateDerivative(q[i].mult(Quaternion<double>::exp(-eps,0,0)), 
+                    fdGrad[0] -= Rotation<double,3>::interpolateDerivative(q[i].mult(Rotation<double,3>::exp(-eps,0,0)), 
                                                                            q[j], s, intervalLength);
                     fdGrad[0] /= 2*eps;
                     
-                    fdGrad[1] =  Rotation<double,3>::interpolateDerivative(q[i].mult(Quaternion<double>::exp(0,eps,0)), 
+                    fdGrad[1] =  Rotation<double,3>::interpolateDerivative(q[i].mult(Rotation<double,3>::exp(0,eps,0)), 
                                                                            q[j], s, intervalLength);
-                    fdGrad[1] -= Rotation<double,3>::interpolateDerivative(q[i].mult(Quaternion<double>::exp(0,-eps,0)), 
+                    fdGrad[1] -= Rotation<double,3>::interpolateDerivative(q[i].mult(Rotation<double,3>::exp(0,-eps,0)), 
                                                                            q[j], s, intervalLength);
                     fdGrad[1] /= 2*eps;
                     
-                    fdGrad[2] =  Rotation<double,3>::interpolateDerivative(q[i].mult(Quaternion<double>::exp(0,0,eps)), 
+                    fdGrad[2] =  Rotation<double,3>::interpolateDerivative(q[i].mult(Rotation<double,3>::exp(0,0,eps)), 
                                                                            q[j], s, intervalLength);
-                    fdGrad[2] -= Rotation<double,3>::interpolateDerivative(q[i].mult(Quaternion<double>::exp(0,0,-eps)), 
+                    fdGrad[2] -= Rotation<double,3>::interpolateDerivative(q[i].mult(Rotation<double,3>::exp(0,0,-eps)), 
                                                                            q[j], s, intervalLength);
                     fdGrad[2] /= 2*eps;
                     
-                    fdGrad[3] =  Rotation<double,3>::interpolateDerivative(q[i], q[j].mult(Quaternion<double>::exp(eps,0,0)), s, intervalLength);
-                    fdGrad[3] -= Rotation<double,3>::interpolateDerivative(q[i], q[j].mult(Quaternion<double>::exp(-eps,0,0)), s, intervalLength);
+                    fdGrad[3] =  Rotation<double,3>::interpolateDerivative(q[i], q[j].mult(Rotation<double,3>::exp(eps,0,0)), s, intervalLength);
+                    fdGrad[3] -= Rotation<double,3>::interpolateDerivative(q[i], q[j].mult(Rotation<double,3>::exp(-eps,0,0)), s, intervalLength);
                     fdGrad[3] /= 2*eps;
                     
-                    fdGrad[4] =  Rotation<double,3>::interpolateDerivative(q[i], q[j].mult(Quaternion<double>::exp(0,eps,0)), s, intervalLength);
-                    fdGrad[4] -= Rotation<double,3>::interpolateDerivative(q[i], q[j].mult(Quaternion<double>::exp(0,-eps,0)), s, intervalLength);
+                    fdGrad[4] =  Rotation<double,3>::interpolateDerivative(q[i], q[j].mult(Rotation<double,3>::exp(0,eps,0)), s, intervalLength);
+                    fdGrad[4] -= Rotation<double,3>::interpolateDerivative(q[i], q[j].mult(Rotation<double,3>::exp(0,-eps,0)), s, intervalLength);
                     fdGrad[4] /= 2*eps;
                     
-                    fdGrad[5] =  Rotation<double,3>::interpolateDerivative(q[i], q[j].mult(Quaternion<double>::exp(0,0,eps)), s, intervalLength);
-                    fdGrad[5] -= Rotation<double,3>::interpolateDerivative(q[i], q[j].mult(Quaternion<double>::exp(0,0,-eps)), s, intervalLength);
+                    fdGrad[5] =  Rotation<double,3>::interpolateDerivative(q[i], q[j].mult(Rotation<double,3>::exp(0,0,eps)), s, intervalLength);
+                    fdGrad[5] -= Rotation<double,3>::interpolateDerivative(q[i], q[j].mult(Rotation<double,3>::exp(0,0,-eps)), s, intervalLength);
                     fdGrad[5] /= 2*eps;
                     
                     // Compute analytical velocity vector gradient
                     RodLocalStiffness<OneDGrid,double>::interpolationVelocityDerivative(q[i], q[j], s, intervalLength, grad);
                     
                     for (int m=0; m<6; m++) {
-                        Quaternion<double> diff = fdGrad[m];
+                        Rotation<double,3> diff = fdGrad[m];
                         diff -= grad[m];
                         if (diff.two_norm() > 1e-6) {
                             std::cout << "Error in velocity " << m 
@@ -243,10 +236,10 @@ void testRotation(Rotation<double,3> q)
     Rotation<double,3> newQ;
     newQ.set(matrix);
 
-    Quaternion<double> diff = newQ;
+    Rotation<double,3> diff = newQ;
     diff -= q;
 
-    Quaternion<double> sum  = newQ;
+    Rotation<double,3> sum  = newQ;
     sum += q;
 
     if (diff.infinity_norm() > 1e-12 && sum.infinity_norm() > 1e-12)
@@ -270,7 +263,7 @@ void testRotation(Rotation<double,3> q)
                 for (int l=-2; l<2; l++)
                     if (i!=0 || j!=0 || k!=0 || l!=0) {
 
-                        Rotation<double,3> q2(Quaternion<double>(i,j,k,l));
+                        Rotation<double,3> q2(Rotation<double,3>(i,j,k,l));
                         q2.normalize();
 
                         // set up corresponding rotation matrix
@@ -296,7 +289,7 @@ void testRotation(Rotation<double,3> q)
     //   Check the operators 'B' that create an orthonormal basis of H
     // ////////////////////////////////////////////////////////////////
 
-    Quaternion<double> Bq[4];
+    Rotation<double,3> Bq[4];
     Bq[0] = q;
     Bq[1] = q.B(0);
     Bq[2] = q.B(1);