diff --git a/src/test-gradient-method.cc b/src/test-gradient-method.cc
index de1f363ba3e8666a28c65f40a2ec3dbd49d99c44..1df4e6fb32bf01810110adbb75dbceafb865bb66 100644
--- a/src/test-gradient-method.cc
+++ b/src/test-gradient-method.cc
@@ -35,8 +35,10 @@ void testIdentity() {
   b[0] = 1;
   b[1] = 2;
 
-  Dune::shared_ptr<Dune::NiceFunction> f(new Dune::LinearFunction(1));
-  Functional J(A, b, Dune::LocalNonlinearity<dim>(f));
+  Dune::shared_ptr<Dune::NiceFunction const> f(new Dune::LinearFunction(1));
+  Dune::shared_ptr<Functional::NonlinearityType const> phi(
+      new Functional::NonlinearityType(f));
+  Functional J(A, b, phi);
 
   Functional::SmallVector start = b;
   start *= 17;
@@ -70,8 +72,10 @@ void testSampleFunction() {
   b[0] = 1;
   b[1] = 2;
 
-  Dune::shared_ptr<Dune::NiceFunction> f(new Dune::SampleFunction<2>());
-  Functional J(A, b, Dune::LocalNonlinearity<dim>(f));
+  Dune::shared_ptr<Dune::NiceFunction const> f(new Dune::SampleFunction<2>());
+  Dune::shared_ptr<Functional::NonlinearityType const> phi(
+      new Functional::NonlinearityType(f));
+  Functional J(A, b, phi);
 
   Functional::SmallVector start = b;
   start *= 17;
@@ -119,8 +123,10 @@ void testSampleFunctionNonsmooth() {
   b[0] = 1;
   b[1] = 2;
 
-  Dune::shared_ptr<Dune::NiceFunction> f(new Dune::SampleFunction<2>());
-  Functional J(A, b, Dune::LocalNonlinearity<dim>(f));
+  Dune::shared_ptr<Dune::NiceFunction const> f(new Dune::SampleFunction<2>());
+  Dune::shared_ptr<Functional::NonlinearityType const> phi(
+      new Functional::NonlinearityType(f));
+  Functional J(A, b, phi);
 
   Functional::SmallVector start;
   Functional::SmallVector error;
@@ -181,8 +187,10 @@ void testTrivialFunction() {
   b[0] = 1;
   b[1] = 2;
 
-  Dune::shared_ptr<Dune::NiceFunction> f(new Dune::TrivialFunction());
-  Functional J(A, b, Dune::LocalNonlinearity<dim>(f));
+  Dune::shared_ptr<Dune::NiceFunction const> f(new Dune::TrivialFunction());
+  Dune::shared_ptr<Functional::NonlinearityType const> phi(
+      new Functional::NonlinearityType(f));
+  Functional J(A, b, phi);
 
   Functional::SmallVector start = b;
   start *= 17;
@@ -225,8 +233,10 @@ void testHorribleFunction() {
   b[0] = 1;
   b[1] = 2;
 
-  Dune::shared_ptr<Dune::NiceFunction> f(new Dune::HorribleFunction());
-  Functional J(A, b, Dune::LocalNonlinearity<dim>(f));
+  Dune::shared_ptr<Dune::NiceFunction const> f(new Dune::HorribleFunction());
+  Dune::shared_ptr<Functional::NonlinearityType const> phi(
+      new Functional::NonlinearityType(f));
+  Functional J(A, b, phi);
 
   Functional::SmallVector start = b;
   start *= 17;
@@ -260,9 +270,11 @@ void testHorribleFunctionLogarithmic() {
   b[0] = 1;
   b[1] = 2;
 
-  Dune::shared_ptr<Dune::NiceFunction> f(
+  Dune::shared_ptr<Dune::NiceFunction const> f(
       new Dune::HorribleFunctionLogarithmic());
-  Functional J(A, b, Dune::LocalNonlinearity<dim>(f));
+  Dune::shared_ptr<Functional::NonlinearityType const> phi(
+      new Functional::NonlinearityType(f));
+  Functional J(A, b, phi);
 
   Functional::SmallVector start = b;
   start *= 17;
@@ -300,8 +312,10 @@ void testSampleFunction3D() {
   b[1] = 2;
   b[2] = 3;
 
-  Dune::shared_ptr<Dune::NiceFunction> f(new Dune::SampleFunction<2>());
-  Functional J(A, b, Dune::LocalNonlinearity<dim>(f));
+  Dune::shared_ptr<Dune::NiceFunction const> f(new Dune::SampleFunction<2>());
+  Dune::shared_ptr<Functional::NonlinearityType const> phi(
+      new Functional::NonlinearityType(f));
+  Functional J(A, b, phi);
 
   Functional::SmallVector start = b;
   start *= 17;
@@ -338,8 +352,10 @@ void testSampleFunction2() {
   b[0] = 1;
   b[1] = 1;
 
-  Dune::shared_ptr<Dune::NiceFunction> f(new Dune::SampleFunction<2>());
-  Functional J(A, b, Dune::LocalNonlinearity<dim>(f));
+  Dune::shared_ptr<Dune::NiceFunction const> f(new Dune::SampleFunction<2>());
+  Dune::shared_ptr<Functional::NonlinearityType const> phi(
+      new Functional::NonlinearityType(f));
+  Functional J(A, b, phi);
 
   Functional::SmallVector start = b;
 
@@ -372,8 +388,10 @@ void testSampleFunctionSteep1() {
   b[0] = 1;
   b[1] = 2;
 
-  Dune::shared_ptr<Dune::NiceFunction> f(new Dune::SampleFunction<2>());
-  Functional J(A, b, Dune::LocalNonlinearity<dim>(f));
+  Dune::shared_ptr<Dune::NiceFunction const> f(new Dune::SampleFunction<2>());
+  Dune::shared_ptr<Functional::NonlinearityType const> phi(
+      new Functional::NonlinearityType(f));
+  Functional J(A, b, phi);
 
   Functional::SmallVector start;
 
@@ -409,8 +427,10 @@ void testSampleFunctionSteep2() {
   b[0] = 1;
   b[1] = 2.5;
 
-  Dune::shared_ptr<Dune::NiceFunction> f(new Dune::SampleFunction<2>());
-  Functional J(A, b, Dune::LocalNonlinearity<dim>(f));
+  Dune::shared_ptr<Dune::NiceFunction const> f(new Dune::SampleFunction<2>());
+  Dune::shared_ptr<Functional::NonlinearityType const> phi(
+      new Functional::NonlinearityType(f));
+  Functional J(A, b, phi);
 
   Functional::SmallVector start;
 
@@ -446,8 +466,10 @@ void testSteepFunction() {
   b[0] = 1;
   b[1] = 2.5;
 
-  Dune::shared_ptr<Dune::NiceFunction> f(new Dune::SampleFunction<100>());
-  Functional J(A, b, Dune::LocalNonlinearity<dim>(f));
+  Dune::shared_ptr<Dune::NiceFunction const> f(new Dune::SampleFunction<100>());
+  Dune::shared_ptr<Functional::NonlinearityType const> phi(
+      new Functional::NonlinearityType(f));
+  Functional J(A, b, phi);
 
   Functional::SmallVector start;