diff --git a/src/localgeodesicfestiffness.hh b/src/localgeodesicfestiffness.hh
index 1c0ed0758a8162e40f02029e0d0d64fb635c56e5..cb7b3d9efa08e1e18d7c6a7cecc19f4122922e54 100644
--- a/src/localgeodesicfestiffness.hh
+++ b/src/localgeodesicfestiffness.hh
@@ -21,9 +21,7 @@ class LocalGeodesicFEStiffness
     // some other sizes
     enum {gridDim=GridView::dimension};
 
-public:
     /** \brief For the fd approximations 
-        \todo This is public because RodAssembler uses it
     */
     static void infinitesimalVariation(RigidBodyMotion<3>& c, double eps, int i)
     {
@@ -35,10 +33,17 @@ public:
                                                    (i==5)*eps));
     }
 
+    static void infinitesimalVariation(Rotation<3,double>& c, double eps, int i)
+    {
+        c = c.mult(Rotation<3,double>::exp((i==0)*eps, 
+                                           (i==1)*eps, 
+                                           (i==2)*eps));
+    }
+
 public:
     
     //! Each block is x, y, theta in 2d, T (R^3 \times SO(3)) in 3d
-    enum { blocksize = 6 };
+    enum { blocksize = TargetSpace::TangentVector::size };
 
     // define the number of components of your system, this is used outside
     // to allocate the correct size of (dense) blocks with a FieldMatrix
@@ -59,7 +64,7 @@ public:
     /** \brief assemble local stiffness matrix for given element and order
     */
     void assemble (const Entity& e, 
-                   const Dune::BlockVector<Dune::FieldVector<double, 6> >& localSolution,
+                   const Dune::BlockVector<Dune::FieldVector<double, blocksize> >& localSolution,
                    int k=1)
     {
         DUNE_THROW(Dune::NotImplemented, "!");
@@ -83,7 +88,7 @@ public:
     /** \brief Assemble the element gradient of the energy functional */
     virtual void assembleGradient(const Entity& element,
                           const std::vector<TargetSpace>& solution,
-                          Dune::array<Dune::FieldVector<double,6>, 2>& gradient) const;
+                          Dune::array<Dune::FieldVector<double,blocksize>, 2>& gradient) const;
     
 };
 
@@ -91,7 +96,7 @@ template <class GridView, class TargetSpace>
 void LocalGeodesicFEStiffness<GridView, TargetSpace>::
 assembleGradient(const Entity& element,
                  const std::vector<TargetSpace>& localSolution,
-                 Dune::array<Dune::FieldVector<double,6>, 2>& localGradient) const
+                 Dune::array<Dune::FieldVector<double,blocksize>, 2>& localGradient) const
 {
     // ///////////////////////////////////////////////////////////
     //   Compute gradient by finite-difference approximation
@@ -104,7 +109,7 @@ assembleGradient(const Entity& element,
 
     for (size_t i=0; i<localSolution.size(); i++) {
         
-        for (int j=0; j<6; j++) {
+        for (int j=0; j<blocksize; j++) {
             
             infinitesimalVariation(forwardSolution[i],   eps, j);
             infinitesimalVariation(backwardSolution[i], -eps, j);
@@ -142,18 +147,18 @@ assemble(const Entity& element,
 
     double eps = 1e-4;
 
-    typedef typename Dune::Matrix<Dune::FieldMatrix<double,6,6> >::row_type::iterator ColumnIterator;
+    typedef typename Dune::Matrix<Dune::FieldMatrix<double,blocksize,blocksize> >::row_type::iterator ColumnIterator;
 
     // ///////////////////////////////////////////////////////////
     //   Compute gradient by finite-difference approximation
     // ///////////////////////////////////////////////////////////
-    std::vector<RigidBodyMotion<3> > forwardSolution  = localSolution;
-    std::vector<RigidBodyMotion<3> > backwardSolution = localSolution;
+    std::vector<TargetSpace> forwardSolution  = localSolution;
+    std::vector<TargetSpace> backwardSolution = localSolution;
 
-    std::vector<RigidBodyMotion<3> > forwardForwardSolution   = localSolution;
-    std::vector<RigidBodyMotion<3> > forwardBackwardSolution  = localSolution;
-    std::vector<RigidBodyMotion<3> > backwardForwardSolution  = localSolution;
-    std::vector<RigidBodyMotion<3> > backwardBackwardSolution = localSolution;
+    std::vector<TargetSpace> forwardForwardSolution   = localSolution;
+    std::vector<TargetSpace> forwardBackwardSolution  = localSolution;
+    std::vector<TargetSpace> backwardForwardSolution  = localSolution;
+    std::vector<TargetSpace> backwardBackwardSolution = localSolution;
 
     // ///////////////////////////////////////////////////////////////
     //   Loop over all blocks of the element matrix
@@ -173,9 +178,9 @@ assemble(const Entity& element,
             //   Compute a finite-difference approximation of this hessian matrix block
             // ////////////////////////////////////////////////////////////////////////////
 
-            for (int j=0; j<6; j++) {
+            for (int j=0; j<blocksize; j++) {
 
-                for (int k=0; k<6; k++) {
+                for (int k=0; k<blocksize; k++) {
 
                     // compute only the upper right triangular matrix
                     if (i==cIt.index() && k<j)
@@ -259,16 +264,16 @@ assemble(const Entity& element,
 
             if (cIt.index()==i) {
 
-                for (int j=1; j<6; j++)
+                for (int j=1; j<blocksize; j++)
                     for (int k=0; k<j; k++)
                         (*cIt)[j][k] = (*cIt)[k][j];
 
             } else {
 
-                const Dune::FieldMatrix<double,6,6>& other = this->A[cIt.index()][i];
+                const Dune::FieldMatrix<double,blocksize,blocksize>& other = this->A[cIt.index()][i];
 
-                for (int j=0; j<6; j++)
-                    for (int k=0; k<6; k++)
+                for (int j=0; j<blocksize; j++)
+                    for (int k=0; k<blocksize; k++)
                         (*cIt)[j][k] = other[k][j];