diff --git a/src/assemblers.cc b/src/assemblers.cc
index 3b5d298bb4d22dda6d63dc282d113a2a53a68a82..005ec2ed8406352bf79f9e736efdba29471d0bfa 100644
--- a/src/assemblers.cc
+++ b/src/assemblers.cc
@@ -5,15 +5,15 @@
 #include <dune/fufem/boundarypatch.hh>
 #include <dune/fufem/functions/constantfunction.hh>
 #include <dune/fufem/assemblers/localassemblers/neumannboundaryassembler.hh>
-#include <dune/fufem/assemblers/boundaryfunctionalassembler.hh>
 
 #include <dune/tectonic/globalruinanonlinearity.hh>
 
 #include "assemblers.hh"
 
 // Assembles Neumann boundary term in f
-template <class GridType, class GridView, class LocalVectorType, class FEBasis>
-void assemble_neumann(GridView const &gridView, FEBasis const &feBasis,
+template <class GridType, class GridView, class LocalVectorType,
+          class AssemblerType>
+void assemble_neumann(GridView const &gridView, AssemblerType const &assembler,
                       Dune::BitSetVector<1> const &neumannNodes,
                       Dune::BlockVector<LocalVectorType> &f,
                       Dune::VirtualFunction<double, double> const &neumann,
@@ -27,14 +27,15 @@ void assemble_neumann(GridView const &gridView, FEBasis const &feBasis,
       SampleVector);
   NeumannBoundaryAssembler<GridType, LocalVectorType> neumannBoundaryAssembler(
       fNeumann);
-  BoundaryFunctionalAssembler<FEBasis>(feBasis, neumannBoundary)
-      .assemble(neumannBoundaryAssembler, f, true);
+  assembler.assembleBoundaryFunctional(neumannBoundaryAssembler, f,
+                                       neumannBoundary);
 }
 
 // Assembles constant 1-function on frictional boundary in nodalIntegrals
-template <class GridType, class GridView, class LocalVectorType, class FEBasis>
+template <class GridType, class GridView, class LocalVectorType,
+          class AssemblerType>
 Dune::shared_ptr<Dune::BlockVector<Dune::FieldVector<double, 1>>>
-assemble_frictional(GridView const &gridView, FEBasis const &feBasis,
+assemble_frictional(GridView const &gridView, AssemblerType const &assembler,
                     Dune::BitSetVector<1> const &frictionalNodes) {
   typedef Dune::FieldVector<double, 1> Singleton;
   BoundaryPatch<GridView> const frictionalBoundary(gridView, frictionalNodes);
@@ -43,8 +44,8 @@ assemble_frictional(GridView const &gridView, FEBasis const &feBasis,
       constantOneFunction);
 
   auto const nodalIntegrals = Dune::make_shared<Dune::BlockVector<Singleton>>();
-  BoundaryFunctionalAssembler<FEBasis>(feBasis, frictionalBoundary)
-      .assemble(frictionalBoundaryAssembler, *nodalIntegrals, true);
+  assembler.assembleBoundaryFunctional(frictionalBoundaryAssembler,
+                                       *nodalIntegrals, frictionalBoundary);
   return nodalIntegrals;
 }
 
diff --git a/src/assemblers.hh b/src/assemblers.hh
index dd2a1cf25197ffd4cdc47b328de75a5ddc131103..d37caf16a4edd58028b776cb93f37c6685dd42ad 100644
--- a/src/assemblers.hh
+++ b/src/assemblers.hh
@@ -8,18 +8,22 @@
 #include <dune/common/shared_ptr.hh>
 #include <dune/istl/bvector.hh>
 
+#include <dune/fufem/assemblers/assembler.hh>
+
 #include <dune/tectonic/globalnonlinearity.hh>
 
-template <class GridType, class GridView, class LocalVectorType, class FEBasis>
-void assemble_neumann(GridView const &gridView, FEBasis const &feBasis,
+template <class GridType, class GridView, class LocalVectorType,
+          class AssemblerType>
+void assemble_neumann(GridView const &gridView, AssemblerType const &assembler,
                       Dune::BitSetVector<1> const &neumannNodes,
                       Dune::BlockVector<LocalVectorType> &f,
                       Dune::VirtualFunction<double, double> const &neumann,
                       double time);
 
-template <class GridType, class GridView, class LocalVectorType, class FEBasis>
+template <class GridType, class GridView, class LocalVectorType,
+          class AssemblerType>
 Dune::shared_ptr<Dune::BlockVector<Dune::FieldVector<double, 1>>>
-assemble_frictional(GridView const &gridView, FEBasis const &feBasis,
+assemble_frictional(GridView const &gridView, AssemblerType const &assembler,
                     Dune::BitSetVector<1> const &frictionalNodes);
 
 template <class MatrixType, class VectorType>
diff --git a/src/assemblers_tmpl.cc b/src/assemblers_tmpl.cc
index 9418d1ba30dbf0388f7c4766e78028bd9c7b1b85..e7f06cdd452e4b4c343a9792243189dafd088d34 100644
--- a/src/assemblers_tmpl.cc
+++ b/src/assemblers_tmpl.cc
@@ -18,15 +18,17 @@ typedef Dune::BlockVector<SmallVector> VectorType;
 typedef Dune::ALUGrid<DIM, DIM, Dune::simplex, Dune::nonconforming> GridType;
 typedef GridType::LeafGridView GridView;
 typedef P1NodalBasis<GridView, double> P1Basis;
+typedef Assembler<P1Basis, P1Basis> AssemblerType;
 
-template void assemble_neumann<GridType, GridView, SmallVector, P1Basis>(
-    GridView const &gridView, P1Basis const &feBasis,
+template void assemble_neumann<GridType, GridView, SmallVector, AssemblerType>(
+    GridView const &gridView, AssemblerType const &assembler,
     Dune::BitSetVector<1> const &neumannNodes,
     Dune::BlockVector<SmallVector> &f,
     Dune::VirtualFunction<double, double> const &neumann, double time);
+
 template Dune::shared_ptr<Dune::BlockVector<Dune::FieldVector<double, 1>>>
-assemble_frictional<GridType, GridView, SmallVector, P1Basis>(
-    GridView const &gridView, P1Basis const &feBasis,
+assemble_frictional<GridType, GridView, SmallVector, AssemblerType>(
+    GridView const &gridView, AssemblerType const &assembler,
     Dune::BitSetVector<1> const &frictionalNodes);
 
 template Dune::shared_ptr<
diff --git a/src/one-body-sample.cc b/src/one-body-sample.cc
index b7e2a0fa9a3f613d9d30ec1b99103014773b2d66..76b6424bb6d90bf65cddadf4d5031b1232e8f601 100644
--- a/src/one-body-sample.cc
+++ b/src/one-body-sample.cc
@@ -321,8 +321,8 @@ int main(int argc, char *argv[]) {
                                                  massMatrixNorm);
 
     auto const nodalIntegrals =
-        assemble_frictional<GridType, GridView, SmallVector, P1Basis>(
-            leafView, p1Basis, frictionalNodes);
+        assemble_frictional<GridType, GridView, SmallVector>(
+            leafView, p1Assembler, frictionalNodes);
 
     // {{{ Initial conditions
     VectorType u_initial(finestSize);
@@ -376,8 +376,8 @@ int main(int argc, char *argv[]) {
     auto const timesteps = parset.get<size_t>("timeSteps");
     auto const tau = parset.get<double>("endOfTime") / timesteps;
     auto const createRHS = [&](double _time, VectorType &_ell) {
-      assemble_neumann<GridType, GridView, SmallVector, P1Basis>(
-          leafView, p1Basis, neumannNodes, _ell, neumannFunction, _time);
+      assemble_neumann<GridType, GridView, SmallVector>(
+          leafView, p1Assembler, neumannNodes, _ell, neumannFunction, _time);
       _ell += gravityFunctional;
     };