diff --git a/dune/tectonic/curvedfunction.hh b/dune/tectonic/curvedfunction.hh
index 4c8a0350465fd62af26100fe4509b015f9d6c82f..5d8ed7281b196b607856fdf27b61acf678d9e6e8 100644
--- a/dune/tectonic/curvedfunction.hh
+++ b/dune/tectonic/curvedfunction.hh
@@ -1,6 +1,7 @@
 #ifndef CURVED_FUNCTION_HH
 #define CURVED_FUNCTION_HH
 
+#include <cmath>
 #include <dune/fufem/interval.hh>
 
 namespace Dune {
@@ -35,16 +36,14 @@ template <class NonlinearityType> class CurvedFunction {
   }
 
   void domain(Interval<double> &domain) const {
-    // TODO
-    domain[0] = 0;
-    domain[1] = 1;
+    domain[0] = -M_PI;
+    domain[1] = M_PI;
   }
 
   void cartesian(double m, VectorType &y) const {
     y = 0;
-    y.axpy(1 - m, x);
-    y.axpy(m, dir);
-    y /= y.two_norm();
+    y.axpy(std::cos(m), x);
+    y.axpy(std::sin(m), dir);
   }
 
 private:
@@ -54,17 +53,18 @@ template <class NonlinearityType> class CurvedFunction {
   VectorType const &x;
   VectorType const &dir;
 
-  /*
-    Tangential vector within the plane, with positive direction.
+  /* If x and d were normalised, we would have
 
-    < (1-m)x + m*y,-m*|y|^2*x+(1-m)*|x|^2*y>
-    = -m(1-m)|y|^2<x,x> + m(1-m)|x|^2<y,y> (because <x,y> = 0)
-    = 0
+       cartesian(a) =  cos(a) * x + sin(a) * d and
+       tangent(a)   = -sin(a) * x + cos(a) * d.
+
+     Since we x and d are not normalised and the return of
+     cartesian() is fixed, we scale the tangent.
   */
   void tangentialDirection(double m, VectorType &y) const {
     y = 0;
-    y.axpy(-m * dir.two_norm2(), x);
-    y.axpy((1 - m) * x.two_norm2(), dir);
+    y.axpy(-std::sin(m) * dir.two_norm2(), x);
+    y.axpy(std::cos(m) * x.two_norm2(), dir);
   }
 };
 }
diff --git a/src/test-gradient-sample-steep.cc b/src/test-gradient-sample-steep.cc
index dfe498f2c018d50237f24afaaa9c5b02dc09e79b..1f07afd8990e6ec11045fef190d31ae56bd90285 100644
--- a/src/test-gradient-sample-steep.cc
+++ b/src/test-gradient-sample-steep.cc
@@ -35,18 +35,18 @@ int main() {
   start[0] = 0;
   start[1] = 1;
 
-  double const ret1 = functionTester(J, start, 3);
+  double const ret1 = functionTester(J, start, 5);
 
   // Something random
   start[0] = 279;
   start[1] = -96;
 
-  double const ret2 = functionTester(J, start, 3);
-  assert(std::abs(ret1 - ret2) < 1e-5);
+  double const ret2 = functionTester(J, start, 5);
+  assert(std::abs(ret1 - ret2) < 1e-7);
 
   start[0] = 0;
   start[1] = 0;
 
   double const ret3 = functionTester(J, start, 1);
-  assert(std::abs(ret1 - ret3) < 1e-5);
+  assert(std::abs(ret1 - ret3) < 1e-7);
 }
diff --git a/src/test-gradient-sample-steep2.cc b/src/test-gradient-sample-steep2.cc
index f5892cd5f848438a27a04f9449a396ce20137736..4ea0244c9e53db73ffeffd63c81563201a051d89 100644
--- a/src/test-gradient-sample-steep2.cc
+++ b/src/test-gradient-sample-steep2.cc
@@ -41,12 +41,12 @@ int main() {
   start[0] = 279;
   start[1] = -96;
 
-  double const ret2 = functionTester(J, start, 3);
-  assert(std::abs(ret1 - ret2) < 1e-5);
+  double const ret2 = functionTester(J, start, 5);
+  assert(std::abs(ret1 - ret2) < 1e-7);
 
   start[0] = 0;
   start[1] = 0;
 
-  double const ret3 = functionTester(J, start, 1);
-  assert(std::abs(ret1 - ret3) < 1e-5);
+  double const ret3 = functionTester(J, start, 2);
+  assert(std::abs(ret1 - ret3) < 1e-7);
 }
diff --git a/src/test-gradient-sample-verysteep.cc b/src/test-gradient-sample-verysteep.cc
index 0cc230e6ab02431e069d6487e1b13b6c0431e467..8d10a8fd5526959fe99b45b0d98d64adba3b17e0 100644
--- a/src/test-gradient-sample-verysteep.cc
+++ b/src/test-gradient-sample-verysteep.cc
@@ -41,12 +41,12 @@ int main() {
   start[0] = 279;
   start[1] = -96;
 
-  double const ret2 = functionTester(J, start, 4);
-  assert(std::abs(ret1 - ret2) < 1e-8);
+  double const ret2 = functionTester(J, start, 5);
+  assert(std::abs(ret1 - ret2) < 1e-7);
 
   start[0] = 0;
   start[1] = 0;
 
-  double const ret3 = functionTester(J, start, 1);
-  assert(std::abs(ret2 - ret3) < 1e-5);
+  double const ret3 = functionTester(J, start, 2);
+  assert(std::abs(ret1 - ret3) < 1e-7);
 }