diff --git a/dune/fufem/assemblers/dunefunctionsoperatorassembler.hh b/dune/fufem/assemblers/dunefunctionsoperatorassembler.hh
index e647be692b62f6778c3715837c624c8ba514f6dd..bc79370de85c00974c38f9d40b7835d6e613c3bb 100644
--- a/dune/fufem/assemblers/dunefunctionsoperatorassembler.hh
+++ b/dune/fufem/assemblers/dunefunctionsoperatorassembler.hh
@@ -178,8 +178,8 @@ public:
    * Note that this was written (and tested) having discontinuous Galerkin bases in mind.
    * There may be cases where things do not work as expected for standard (continuous) Galerkin spaces.
    */
-  template <class MatrixBackend, class LocalAssembler>
-  void assembleSkeleton(MatrixBackend&& matrixBackend, const LocalAssembler& localAssembler) const
+  template <class MatrixBackend, class LocalAssembler, class LocalBoundaryAssembler>
+  void assembleSkeleton(MatrixBackend&& matrixBackend, LocalAssembler&& localAssembler, LocalBoundaryAssembler&& localBoundaryAssembler) const
   {
     Dune::MultipleCodimMultipleGeomTypeMapper<GridView,Dune::MCMGElementLayout> faceMapper(trialBasis_.gridView());
 
@@ -221,7 +221,7 @@ public:
         if (is.boundary())
         {
           auto& localMatrix = matrixContrainer[0][0];
-          localAssembler.assemble(is, localMatrix, insideTrialLocalView.tree().finiteElement(), insideAnsatzLocalView.tree().finiteElement());
+          localBoundaryAssembler(is, localMatrix, insideTrialLocalView, insideAnsatzLocalView);
 
           for (size_t i=0; i< insideTrialLocalIndexSet.size(); i++) {
             for (size_t j=0; j< insideAnsatzLocalIndexSet.size(); j++)
@@ -245,7 +245,7 @@ public:
           outsideAnsatzLocalView.bind(outsideElement);
           outsideAnsatzLocalIndexSet.bind(outsideAnsatzLocalView);
 
-          localAssembler.assembleBlockwise(is, matrixContrainer, insideTrialLocalView.tree().finiteElement(), insideAnsatzLocalView.tree().finiteElement(), outsideTrialLocalView.tree().finiteElement(), outsideAnsatzLocalView.tree().finiteElement());
+          localAssembler(is, matrixContrainer, insideTrialLocalView, insideAnsatzLocalView, outsideTrialLocalView, outsideAnsatzLocalView);
 
           for (size_t i=0; i < insideTrialLocalIndexSet.size(); i++)
           {
diff --git a/dune/fufem/test/dunefunctionsipdgassemblertest.cc b/dune/fufem/test/dunefunctionsipdgassemblertest.cc
index f0863a05adf07a86fb5a18ab6f35dbb870b67b0b..ad26a015cc26a2fb93930fd9c3d8dc7b49884238 100644
--- a/dune/fufem/test/dunefunctionsipdgassemblertest.cc
+++ b/dune/fufem/test/dunefunctionsipdgassemblertest.cc
@@ -83,7 +83,20 @@ int main (int argc, char *argv[])
   using FiniteElement = std::decay_t<decltype(basis.localView().tree().finiteElement())>;
 
   auto vintageIPDGAssembler = InteriorPenaltyDGAssembler<GridType, FiniteElement, FiniteElement>();
-  assembler.assembleSkeleton(matrixBackend, vintageIPDGAssembler); // IPDG terms
+  auto localBlockAssembler = [&](const auto& edge, auto& matrixContainer,
+      auto&& insideTrialLocalView, auto&& insideAnsatzLocalView, auto&& outsideTrialLocalView, auto&& outsideAnsatzLocalView)
+  {
+      vintageIPDGAssembler.assembleBlockwise(edge, matrixContainer, insideTrialLocalView.tree().finiteElement(),
+                                             insideAnsatzLocalView.tree().finiteElement(),
+                                             outsideTrialLocalView.tree().finiteElement(),
+                                             outsideAnsatzLocalView.tree().finiteElement());
+  };
+  auto localBoundaryAssembler = [&](const auto& edge, auto& localMatrix, auto&& insideTrialLocalView, auto&& insideAnsatzLocalView)
+  {
+      vintageIPDGAssembler.assemble(edge, localMatrix, insideTrialLocalView.tree().finiteElement(), insideAnsatzLocalView.tree().finiteElement());
+  };
+
+  assembler.assembleSkeleton(matrixBackend, localBlockAssembler, localBoundaryAssembler); // IPDG terms
 
   /* Now assemble in the classical fufem way and compare */
   auto fufemMatrix = Matrix{};