diff --git a/dune/solvers/test/gssteptest.cc b/dune/solvers/test/gssteptest.cc
index ebe7fc662cd6b21923de3b642073ba817bcd6678..763e11d0b30142927df04ed9e032e906949a56ed 100644
--- a/dune/solvers/test/gssteptest.cc
+++ b/dune/solvers/test/gssteptest.cc
@@ -51,9 +51,8 @@ struct GSTestSuite {
     using LoopSolver = ::LoopSolver<Vector>;
     using Step = LinearIterationStep<Matrix, Vector>;
 
-    auto solve = [&](Step* step, double stepTol, size_t maxIterations) {
-      Vector u_copy = p.u;
-      step->setProblem(p.A, u_copy, p.rhs);
+    auto solve = [&](Step* step, Vector u_init, double stepTol, size_t maxIterations) {
+      step->setProblem(p.A, u_init, p.rhs);
       step->setIgnore(p.ignore);
 
       LoopSolver solver(step, maxIterations, stepTol, &p.energyNorm, verbosity,
@@ -62,7 +61,7 @@ struct GSTestSuite {
       solver.preprocess();
       solver.solve();
 
-      return u_copy;
+      return u_init;
     };
 
     auto analyse =
@@ -80,20 +79,20 @@ struct GSTestSuite {
     };
 
     auto test = [&](Step* step, std::string name) {
-      auto result = solve(step, 1e-12, 2000);
+      auto result = solve(step, p.u_ex, 1e-12, 2000);
       passed &= analyse(result, name, 1e-7);
     };
 
     auto diffTest = [&](Step* step1, std::string name1, Step* step2,
                         std::string name2, double maxDiff = 0.0) {
-      auto result1 = solve(step1, 0.0, 5);
-      auto result2 = solve(step2, 0.0, 5);
+      auto result1 = solve(step1, p.u_ex, 0.0, 5);
+      auto result2 = solve(step2, p.u_ex, 0.0, 5);
 
-      result1 -= result2;
-      if (result1.two_norm() > maxDiff) {
+      auto normDiff = p.energyNorm.diff(result1, result2);
+      if (normDiff > maxDiff) {
         passed = false;
         std::cerr << name1 << " and " << name2 << " differ with norm "
-                  << result1.two_norm() << "." << std::endl;
+                  << normDiff << "." << std::endl;
         return;
       }
       std::cout << Dune::formatString("%*s", -60, name1.c_str()) << " and "
@@ -167,13 +166,7 @@ struct GSTestSuite {
           if (p.ignore[i][j])
             u_copy[i][j] += 1.0;
 
-      gsStep.setProblem(p.A, u_copy, p.rhs);
-      gsStep.setIgnore(p.ignore);
-      LoopSolver solver(&gsStep, 2000, 1e-8, &p.energyNorm, Solver::QUIET,
-                        relativeErrors);
-      solver.check();
-      solver.preprocess();
-      solver.solve();
+      solve(&gsStep, u_copy, 1e-12, 2000);
 
       for (size_t i = 0; i < p.u.size(); ++i)
         for (size_t j = 0; j < blocksize; ++j)