diff --git a/cosserat-continuum.cc b/cosserat-continuum.cc
index 74892cafadcc808bd9d2098e7ed234715f4e98bf..8607c1e9f4bb3ecbe19b6e4d6d146a4c7c60926d 100644
--- a/cosserat-continuum.cc
+++ b/cosserat-continuum.cc
@@ -142,7 +142,7 @@ int main (int argc, char *argv[]) try
 #if 0
     BitSetVector<1> allNodes(grid.size(dim));
     allNodes.setAll();
-    LeafBoundaryPatch<GridType> dirichletBoundary(grid, allNodes);
+    BoundaryPatch<GridType::LeafGridView> dirichletBoundary(grid.leafView(), allNodes);
 
     BitSetVector<blocksize> dirichletNodes(grid.size(dim), false);
     for (int i=0; i<dirichletNodes.size(); i++) {
diff --git a/dirneucoupling.cc b/dirneucoupling.cc
index a397abed46b714fc62c4a72be09de3a255f2c66f..4cdcb90a3604af97665feeb5e1e240e1d27f1348 100644
--- a/dirneucoupling.cc
+++ b/dirneucoupling.cc
@@ -22,7 +22,7 @@
 #include <dune/fufem/readbitfield.hh>
 #include <dune/solvers/norms/energynorm.hh>
 #include <dune/fufem/boundarypatch.hh>
-#include <dune/fufem/prolongboundarypatch.hh>
+#include <dune/fufem/boundarypatchprolongator.hh>
 #include <dune/fufem/sampleonbitfield.hh>
 #include <dune/fufem/computestress.hh>
 
@@ -128,6 +128,9 @@ int main (int argc, char *argv[]) try
     typedef OneDGrid RodGridType;
     typedef UGGrid<dim> GridType;
 
+    typedef BoundaryPatch<GridType::LevelGridView> LevelBoundaryPatch;
+    typedef BoundaryPatch<GridType::LeafGridView> LeafBoundaryPatch;
+
     RodContinuumComplex<RodGridType,GridType> complex;
     
     complex.rods_["rod"].grid_ = shared_ptr<RodGridType>
@@ -207,14 +210,14 @@ int main (int argc, char *argv[]) try
     //   Determine the continuum Dirichlet nodes
     // /////////////////////////////////////////////////////
     VectorType coarseDirichletValues(complex.continua_["continuum"].grid_->size(0, dim));
-    AmiraMeshReader<int>::readFunction(coarseDirichletValues, path + dirichletValuesFile);
+    AmiraMeshReader<GridType>::readFunction(coarseDirichletValues, path + dirichletValuesFile);
 
-    LevelBoundaryPatch<GridType> coarseDirichletBoundary;
-    coarseDirichletBoundary.setup(*complex.continua_["continuum"].grid_, 0);
-    readBoundaryPatch(coarseDirichletBoundary, path + dirichletNodesFile);
+    LevelBoundaryPatch coarseDirichletBoundary;
+    coarseDirichletBoundary.setup(complex.continua_["continuum"].grid_->levelView(0));
+    readBoundaryPatch<GridType>(coarseDirichletBoundary, path + dirichletNodesFile);
     
-    LeafBoundaryPatch<GridType> dirichletBoundary(*complex.continua_["continuum"].grid_);
-    PatchProlongator<GridType>::prolong(coarseDirichletBoundary, dirichletBoundary);
+    LeafBoundaryPatch dirichletBoundary(complex.continua_["continuum"].grid_->leafView());
+    BoundaryPatchProlongator<GridType>::prolong(coarseDirichletBoundary, dirichletBoundary);
     complex.continua_["continuum"].dirichletBoundary_ = dirichletBoundary;
 
     BitSetVector<dim> dirichletNodes( complex.continua_["continuum"].grid_->size(dim) );
@@ -244,10 +247,10 @@ int main (int argc, char *argv[]) try
     complex.couplings_[interfaceName].rodInterfaceBoundary_.setup(*complex.rods_["rod"].grid_, rodCouplingBitfield);
 
     // then for the continuum
-    LevelBoundaryPatch<GridType> coarseInterfaceBoundary(*complex.continua_["continuum"].grid_, 0);
-    readBoundaryPatch(coarseInterfaceBoundary, path + interfaceNodesFile);
+    LevelBoundaryPatch coarseInterfaceBoundary(complex.continua_["continuum"].grid_->levelView(0));
+    readBoundaryPatch<GridType>(coarseInterfaceBoundary, path + interfaceNodesFile);
     
-    PatchProlongator<GridType>::prolong(coarseInterfaceBoundary, complex.couplings_[interfaceName].continuumInterfaceBoundary_);
+    BoundaryPatchProlongator<GridType>::prolong(coarseInterfaceBoundary, complex.couplings_[interfaceName].continuumInterfaceBoundary_);
 
     // ////////////////////////////////////////// 
     //   Assemble 3d linear elasticity problem
@@ -559,7 +562,7 @@ int main (int argc, char *argv[]) try
         iAsAscii << i;
         std::string iSolFilename = tmpPath + "intermediate3dSolution_" + iAsAscii.str();
       
-        AmiraMeshReader<int>::readFunction(intermediateSol3d, iSolFilename);
+        AmiraMeshReader<GridType>::readFunction(intermediateSol3d, iSolFilename);
 
         // Read rod solution from file
         iSolFilename = tmpPath + "intermediateRodSolution_" + iAsAscii.str();
diff --git a/harmonicmaps-eoc.cc b/harmonicmaps-eoc.cc
index 78e4ccd5c8228ff2691a3e108794471fb0b4f8d8..7fab78c788432814cd572d7554f2c17bf24235fc 100644
--- a/harmonicmaps-eoc.cc
+++ b/harmonicmaps-eoc.cc
@@ -57,7 +57,7 @@ void solve (const shared_ptr<GridType>& grid,
 
     BitSetVector<1> allNodes(grid->size(dim));
     allNodes.setAll();
-    LeafBoundaryPatch<GridType> dirichletBoundary(*grid, allNodes);
+    BoundaryPatch<GridType::LeafGridView> dirichletBoundary(grid->leafView(), allNodes);
 
     BitSetVector<blocksize> dirichletNodes(grid->size(dim));
     for (int i=0; i<dirichletNodes.size(); i++)
diff --git a/harmonicmaps.cc b/harmonicmaps.cc
index 9765983728bf946234d872ef803ce7c3ef87ef2c..eacb9927fb3657c1b237c20ce7154b911bd187d8 100644
--- a/harmonicmaps.cc
+++ b/harmonicmaps.cc
@@ -130,7 +130,7 @@ int main (int argc, char *argv[]) try
 
     BitSetVector<1> allNodes(grid.size(dim));
     allNodes.setAll();
-    LeafBoundaryPatch<GridType> dirichletBoundary(grid, allNodes);
+    BoundaryPatch<GridType::LeafGridView> dirichletBoundary(grid.leafView(), allNodes);
 
     BitSetVector<blocksize> dirichletNodes(grid.size(dim));
     for (int i=0; i<dirichletNodes.size(); i++)