diff --git a/src/octave/duneevaluate.cc b/src/octave/duneevaluate.cc
index caf566894b162d8923691b9b2279d21dd94a4e3d..d1f4830d582025b329026e6483e31820485550c0 100644
--- a/src/octave/duneevaluate.cc
+++ b/src/octave/duneevaluate.cc
@@ -4,6 +4,8 @@
 #include "config.h"
 #endif
 
+#include <dune/common/shared_ptr.hh>
+
 #include <dune/tectonic/octave/duneoctave.hh>
 #include <dune/tectonic/samplefunctional.hh>
 
@@ -25,22 +27,25 @@ Evaluate x -> 1/2<Ax,x> - <b,x> + H(|x|) at each point y that is a column vector
   Functional::SmallVector b;
   Dune::octaveToDune<dim>(args(1).vector_value(), b);
 
-  Dune::SampleFunction<100> f_steep;
-  Dune::SampleFunction<2> f_sample;
+  Dune::shared_ptr<Functional::NonlinearityType const> phi;
 
   charNDArray bar = args(2).char_array_value();
-  Dune::NiceFunction *foo;
   switch (bar(0)) {
-    case 'S':
-      foo = &f_steep;
+    case 'S': {
+      Dune::NiceFunction const *pre_f = new Dune::SampleFunction<100>();
+      Dune::shared_ptr<Dune::NiceFunction const> f(pre_f);
+      phi = Dune::make_shared<Functional::NonlinearityType const>(f);
       break;
-    case 's':
-      foo = &f_sample;
+    }
+    case 's': {
+      Dune::NiceFunction const *pre_f = new Dune::SampleFunction<2>();
+      Dune::shared_ptr<Dune::NiceFunction const> f(pre_f);
+      phi = Dune::make_shared<Functional::NonlinearityType const>(f);
       break;
+    }
     default:
       assert(false);
   }
-  Dune::LocalNonlinearity<dim> phi(*foo);
   Functional J(A, b, phi);
 
   Matrix points(args(3).matrix_value());
diff --git a/src/octave/duneminimise.cc b/src/octave/duneminimise.cc
index 0370664f81d9b6dc2475d7a44981e7bc5692029f..17da877e47b5e91c266dee554b0945e8dadb6631 100644
--- a/src/octave/duneminimise.cc
+++ b/src/octave/duneminimise.cc
@@ -4,6 +4,8 @@
 #include "config.h"
 #endif
 
+#include <dune/common/shared_ptr.hh>
+
 #include <dune/tectonic/octave/duneoctave.hh>
 #include <dune/tectonic/samplefunctional.hh>
 
@@ -25,22 +27,25 @@ Make a minimisation step of x -> 1/2<Ax,x> - <b,x> + H(|x|) using DUNE starting
   Functional::SmallVector b;
   Dune::octaveToDune<dim>(args(1).vector_value(), b);
 
-  Dune::SampleFunction<100> f_steep;
-  Dune::SampleFunction<2> f_sample;
+  Dune::shared_ptr<Functional::NonlinearityType const> phi;
 
   charNDArray bar = args(2).char_array_value();
-  Dune::NiceFunction *foo;
   switch (bar(0)) {
-    case 'S':
-      foo = &f_steep;
+    case 'S': {
+      Dune::NiceFunction const *pre_f = new Dune::SampleFunction<100>();
+      Dune::shared_ptr<Dune::NiceFunction const> f(pre_f);
+      phi = Dune::make_shared<Functional::NonlinearityType const>(f);
       break;
-    case 's':
-      foo = &f_sample;
+    }
+    case 's': {
+      Dune::NiceFunction const *pre_f = new Dune::SampleFunction<2>();
+      Dune::shared_ptr<Dune::NiceFunction const> f(pre_f);
+      phi = Dune::make_shared<Functional::NonlinearityType const>(f);
       break;
+    }
     default:
       assert(false);
   }
-  Dune::LocalNonlinearity<dim> phi(*foo);
   Functional J(A, b, phi);
 
   ColumnVector start_octave(args(3).vector_value());