diff --git a/src/planarrodassembler.cc b/src/planarrodassembler.cc
index f1b57829f391286e0c3971f2de0d830e0e1f23f1..a3ee6a92377eff6e1af14e5d18e38fd199ff2483 100644
--- a/src/planarrodassembler.cc
+++ b/src/planarrodassembler.cc
@@ -5,7 +5,7 @@
 
 #include <dune/grid/common/quadraturerules.hh>
 
-#include <dune/disc/shapefunctions/lagrangeshapefunctions.hh>
+#include <dune/localfunctions/lagrange/p1.hh>
 
 template <class GridType, int polOrd>
 void Dune::PlanarRodAssembler<GridType, polOrd>::
@@ -60,10 +60,7 @@ assembleMatrix(const std::vector<RigidBodyMotion<2> >& sol,
     
     for( ; it != endit; ++it ) {
         
-        //const BaseFunctionSetType & baseSet = functionSpace_.getBaseFunctionSet( *it );
-        const LagrangeShapeFunctionSet<double, double, gridDim> & baseSet 
-            = Dune::LagrangeShapeFunctions<double, double, gridDim>::general(it->geometry().type(), elementOrder);
-        const int numOfBaseFct = baseSet.size();  
+        const int numOfBaseFct = 2;  
         
         mat.setSize(numOfBaseFct, numOfBaseFct);
 
@@ -114,12 +111,10 @@ getLocalMatrix( EntityType &entity,
         for (int j=0; j<matSize; j++)
             localMat[i][j] = 0;
     
-    //const BaseFunctionSetType & baseSet = this->functionSpace_.getBaseFunctionSet( entity );
-    const LagrangeShapeFunctionSet<double, double, gridDim> & baseSet 
-        = Dune::LagrangeShapeFunctions<double, double, gridDim>::general(entity.geometry().type(), elementOrder);
+    P1LocalFiniteElement<double,double,gridDim> localFiniteElement;
 
     // Get quadrature rule
-    const QuadratureRule<double, gridDim>& quad = QuadratureRules<double, gridDim>::rule(entity.geometry().type(), polOrd);
+    const QuadratureRule<double, gridDim>& quad = QuadratureRules<double, gridDim>::rule(entity.type(), polOrd);
     
     /* Loop over all integration points */
     for (int ip=0; ip<quad.size(); ip++) {
@@ -137,26 +132,18 @@ getLocalMatrix( EntityType &entity,
         /**********************************************/
         /* compute gradients of the shape functions   */
         /**********************************************/
+        std::vector<FieldMatrix<double,1,gridDim> > referenceElementGradients(ndof);
+        localFiniteElement.localBasis().evaluateJacobian(quadPos,referenceElementGradients);
+
         std::vector<FieldVector<double,gridDim> > shapeGrad(ndof);
         
-        for (int dof=0; dof<ndof; dof++) {
-            
-            //baseSet.jacobian(dof, quadPos, shapeGrad[dof]);
-            for (int i=0; i<gridDim; i++)
-                shapeGrad[dof][i] = baseSet[dof].evaluateDerivative(0,i,quadPos);
-            
-            // multiply with jacobian inverse 
-            FieldVector<double,gridDim> tmp(0);
-            inv.umv(shapeGrad[dof], tmp);
-            shapeGrad[dof] = tmp;
-
-        }
+        // multiply with jacobian inverse 
+        for (int dof=0; dof<ndof; dof++)
+            inv.mv(referenceElementGradients[dof][0], shapeGrad[dof]);
         
         
-        double shapeFunction[matSize];
-        for(int i=0; i<matSize; i++) 
-            //baseSet.eval(i,quadPos,shapeFunction[i]);
-            shapeFunction[i] = baseSet[i].evaluateFunction(0,quadPos);
+        std::vector<FieldVector<double,1> > shapeFunction;
+        localFiniteElement.localBasis().evaluateFunction(quadPos,shapeFunction);
 
         // //////////////////////////////////
         //   Interpolate
@@ -281,9 +268,8 @@ assembleGradient(const std::vector<RigidBodyMotion<2> >& sol,
     for (; it!=endIt; ++it) {
 
         // Extract local solution on this element
-        const LagrangeShapeFunctionSet<double, double, gridDim> & baseSet 
-            = Dune::LagrangeShapeFunctions<double, double, gridDim>::general(it->geometry().type(), elementOrder);
-        const int numOfBaseFct = baseSet.size();  
+        P1LocalFiniteElement<double,double,gridDim> localFiniteElement;
+        const int numOfBaseFct = localFiniteElement.localBasis().size();  
         
         RigidBodyMotion<2> localSolution[numOfBaseFct];
         
@@ -291,7 +277,7 @@ assembleGradient(const std::vector<RigidBodyMotion<2> >& sol,
             localSolution[i] = sol[indexSet.subIndex(*it,i,gridDim)];
 
         // Get quadrature rule
-        const QuadratureRule<double, gridDim>& quad = QuadratureRules<double, gridDim>::rule(it->geometry().type(), polOrd);
+        const QuadratureRule<double, gridDim>& quad = QuadratureRules<double, gridDim>::rule(it->type(), polOrd);
 
         for (int pt=0; pt<quad.size(); pt++) {
 
@@ -303,27 +289,21 @@ assembleGradient(const std::vector<RigidBodyMotion<2> >& sol,
         
             double weight = quad[pt].weight() * integrationElement;
             
-            // ///////////////////////////////////////
-            //   Compute deformation gradient
-            // ///////////////////////////////////////
+            /**********************************************/
+            /* compute gradients of the shape functions   */
+            /**********************************************/
+            std::vector<FieldMatrix<double,1,gridDim> > referenceElementGradients(numOfBaseFct);
+            localFiniteElement.localBasis().evaluateJacobian(quadPos,referenceElementGradients);
+            
             std::vector<FieldVector<double,gridDim> > shapeGrad(numOfBaseFct);
             
-            for (int dof=0; dof<numOfBaseFct; dof++) {
-                
-                for (int i=0; i<gridDim; i++)
-                    shapeGrad[dof][i] = baseSet[dof].evaluateDerivative(0,i,quadPos);
-
-                // multiply with jacobian inverse 
-                FieldVector<double,gridDim> tmp(0);
-                inv.umv(shapeGrad[dof], tmp);
-                shapeGrad[dof] = tmp;
-                
-            }
+            // multiply with jacobian inverse 
+            for (int dof=0; dof<numOfBaseFct; dof++)
+                inv.mv(referenceElementGradients[dof][0], shapeGrad[dof]);
 
-            // Get the value of the shape functions
-            double shapeFunction[2];
-            for(int i=0; i<2; i++) 
-                shapeFunction[i] = baseSet[i].evaluateFunction(0,quadPos);
+            // Get the values of the shape functions
+            std::vector<FieldVector<double,1> > shapeFunction;
+            localFiniteElement.localBasis().evaluateFunction(quadPos,shapeFunction);
 
             // //////////////////////////////////
             //   Interpolate
@@ -388,9 +368,9 @@ computeEnergy(const std::vector<RigidBodyMotion<2> >& sol) const
     for (; it!=endIt; ++it) {
 
         // Extract local solution on this element
-        const LagrangeShapeFunctionSet<double, double, gridDim> & baseSet 
-            = Dune::LagrangeShapeFunctions<double, double, gridDim>::general(it->geometry().type(), elementOrder);
-        int numOfBaseFct = baseSet.size();
+        P1LocalFiniteElement<double,double,gridDim> localFiniteElement;
+
+        int numOfBaseFct = localFiniteElement.localBasis().size();
 
         RigidBodyMotion<2> localSolution[numOfBaseFct];
         
@@ -398,7 +378,7 @@ computeEnergy(const std::vector<RigidBodyMotion<2> >& sol) const
             localSolution[i] = sol[indexSet.subIndex(*it,i,gridDim)];
 
         // Get quadrature rule
-        const QuadratureRule<double, gridDim>& quad = QuadratureRules<double, gridDim>::rule(it->geometry().type(), polOrd);
+        const QuadratureRule<double, gridDim>& quad = QuadratureRules<double, gridDim>::rule(it->type(), polOrd);
 
         for (int pt=0; pt<quad.size(); pt++) {
 
@@ -410,31 +390,21 @@ computeEnergy(const std::vector<RigidBodyMotion<2> >& sol) const
         
             double weight = quad[pt].weight() * integrationElement;
             
-            // ///////////////////////////////////////
-            //   Compute deformation gradient
-            // ///////////////////////////////////////
+            /**********************************************/
+            /* compute gradients of the shape functions   */
+            /**********************************************/
+            std::vector<FieldMatrix<double,1,gridDim> > referenceElementGradients(numOfBaseFct);
+            localFiniteElement.localBasis().evaluateJacobian(quadPos,referenceElementGradients);
+            
             std::vector<FieldVector<double,gridDim> > shapeGrad(numOfBaseFct);
             
-            for (int dof=0; dof<numOfBaseFct; dof++) {
-                
-                for (int i=0; i<gridDim; i++)
-                    shapeGrad[dof][i] = baseSet[dof].evaluateDerivative(0,i,quadPos);
-                //std::cout << "Gradient " << dof << ": " << shape_grads[dof] << std::endl;
-                
-                // multiply with jacobian inverse 
-                FieldVector<double,gridDim> tmp(0);
-                inv.umv(shapeGrad[dof], tmp);
-                shapeGrad[dof] = tmp;
-                //std::cout << "Gradient " << dof << ": " << shape_grads[dof] << std::endl;
-
-                
-                
-            }
+            // multiply with jacobian inverse 
+            for (int dof=0; dof<numOfBaseFct; dof++)
+                inv.mv(referenceElementGradients[dof][0], shapeGrad[dof]);
 
             // Get the value of the shape functions
-            double shapeFunction[2];
-            for(int i=0; i<2; i++) 
-                shapeFunction[i] = baseSet[i].evaluateFunction(0,quadPos);
+            std::vector<FieldVector<double,1> > shapeFunction;
+            localFiniteElement.localBasis().evaluateFunction(quadPos,shapeFunction);
 
             // //////////////////////////////////
             //   Interpolate