diff --git a/dune/tectonic/localnonlinearity.hh b/dune/tectonic/localnonlinearity.hh
index 195dbe7d00c3347a7859bd98ea1266db99d2332f..fbdd63257359a3df461d7396b48a6c8841be9f1e 100644
--- a/dune/tectonic/localnonlinearity.hh
+++ b/dune/tectonic/localnonlinearity.hh
@@ -18,7 +18,7 @@ template <int dimension> class LocalNonlinearity {
   typedef FieldVector<double, dimension> VectorType;
   typedef FieldMatrix<double, dimension, dimension> MatrixType;
 
-  LocalNonlinearity(NiceFunction const *func) : func_(func) {}
+  LocalNonlinearity(Dune::shared_ptr<NiceFunction> &func) : func_(func) {}
 
   double operator()(VectorType const x) const {
     double ret;
@@ -63,7 +63,7 @@ template <int dimension> class LocalNonlinearity {
   }
 
 private:
-  NiceFunction const *func_;
+  Dune::shared_ptr<NiceFunction> &func_;
 };
 }
 #endif
diff --git a/dune/tectonic/myblockproblem.hh b/dune/tectonic/myblockproblem.hh
index 3b4a8ff507e7f4bd7571d54beb38626322d35f86..ed34b4f850be7beeda7f8fd1acc0e41971c752d1 100644
--- a/dune/tectonic/myblockproblem.hh
+++ b/dune/tectonic/myblockproblem.hh
@@ -113,14 +113,13 @@ class MyBlockProblem<MyConvexProblemTypeTEMPLATE>::IterateObject {
       }
       assert(localA != NULL);
 
-      auto const f = problem.phi.restriction(m);
+      Dune::shared_ptr<Dune::NiceFunction> f(problem.phi.restriction(m));
       Dune::LocalNonlinearity<block_size> const phi(f);
       Dune::SampleFunctional<block_size> localJ(*localA, localb, phi,
                                                 ignore_component);
 
       LocalVectorType correction;
       Dune::minimise(localJ, ui, 5, bisection); // FIXME: hardcoded value
-      free(f);
     }
   }