diff --git a/src/factories/stackedblocksfactory.cc b/src/factories/stackedblocksfactory.cc
index 648518f353bd00ef354978f9c47ed9ae66a91a24..051afa4623f3fe9e13bb398bbd124b2a363a9402 100644
--- a/src/factories/stackedblocksfactory.cc
+++ b/src/factories/stackedblocksfactory.cc
@@ -202,11 +202,6 @@ void StackedBlocksFactory<HostGridType, VectorType>::setBoundaryConditions() {
             for (int j=0; j<leafVertexCount; j++) {
                 if (leafFaces_[i]->upper.containsVertex(j))
                     (*velocityDirichletNodes)[j][0] = true;
-
-                #if MY_DIM == 3 //TODO: wrong, needs revision
-                if (leafFaces_[i]->front.containsVertex(j) || leafFaces_[i]->back.containsVertex(j))
-                    zeroDirichletNodes->at(j)[2] = true;
-                #endif
             }
 
             std::shared_ptr<LeafBoundaryCondition> velocityDirichletBoundary = std::make_shared<LeafBoundaryCondition>("dirichlet");
@@ -229,6 +224,11 @@ void StackedBlocksFactory<HostGridType, VectorType>::setBoundaryConditions() {
               (*zeroDirichletNodes)[j][d] = true;
             }
         }
+
+        #if MY_DIM == 3 //TODO: wrong, needs revision
+        if (leafFaces_[0]->front.containsVertex(j) || leafFaces_[0]->back.containsVertex(j))
+            (*zeroDirichletNodes)[j][2] = true;
+        #endif
     }
 
     std::shared_ptr<LeafBoundaryCondition> zeroDirichletBoundary = std::make_shared<LeafBoundaryCondition>("dirichlet");
diff --git a/src/multi-body-problem.cfg b/src/multi-body-problem.cfg
index 8df2a20d9042b057aea7798bbb123dd1ffc9ebd6..b3a4ff9e8e63ef272ea4b23aec19d19924eca809 100644
--- a/src/multi-body-problem.cfg
+++ b/src/multi-body-problem.cfg
@@ -77,7 +77,7 @@ maximumIterations = 10000
 verbosity         = quiet
 
 [solver.tnnmg.main]
-pre   = 10
+pre   = 1
 multi = 5 # number of multigrid steps
 post  = 0
 
diff --git a/src/solverfactorytest.cc b/src/solverfactorytest.cc
index 9ae2798e41838ba5d2398ddb648141861eaf1e0e..5365726f355ae523c07b73edd03510f123fcd0dc 100644
--- a/src/solverfactorytest.cc
+++ b/src/solverfactorytest.cc
@@ -177,10 +177,10 @@ void solveProblem(const ContactNetwork& contactNetwork,
     refSolver.solve();
     std::cout << correctionNorms.size() << std::endl;
 
-    if (initial) {
+    /*if (initial) {
         x = refX;
         return;
-    }
+    }*/
     // set up solver factory solver
 
     // set up functional
diff --git a/src/spatial-solving/solverfactory.cc b/src/spatial-solving/solverfactory.cc
index 0650c522e86f12f4a4f62b0b61d38ab9e40fb601..7084672a0f4cc0d28318ed8a0c160504cc9541a6 100644
--- a/src/spatial-solving/solverfactory.cc
+++ b/src/spatial-solving/solverfactory.cc
@@ -19,10 +19,10 @@ SolverFactory<Functional, BitVector>::SolverFactory(
     const BitVector& ignoreNodes) :
         J_(Dune::Solvers::wrap_own_share<const Functional>(std::forward<Functional>(J))) {
 
-    auto localSolver = Dune::TNNMG::gaussSeidelLocalSolver(LocalSolver());
-    nonlinearSmoother_ = std::make_shared<NonlinearSmoother>(*J_, dummyIterate_, localSolver);
+    //auto localSolver = Dune::TNNMG::gaussSeidelLocalSolver(LocalSolver());
+    //nonlinearSmoother_ = std::make_shared<NonlinearSmoother>(*J_, dummyIterate_, localSolver);
 
-    //nonlinearSmoother_ = std::make_shared<NonlinearSmoother>(*J_, dummyIterate_, LocalSolver());
+    nonlinearSmoother_ = std::make_shared<NonlinearSmoother>(*J_, dummyIterate_, LocalSolver());
 
     auto linearSolver_ptr = Dune::Solvers::wrap_own_share<std::decay_t<LinearSolver>>(std::forward<LinearSolver>(linearSolver));
 
diff --git a/src/spatial-solving/solverfactory.hh b/src/spatial-solving/solverfactory.hh
index 203bd9558af161de74aab81f3989a703b203a39c..a68755ec85c85cd0e8171684406781f92f58b373 100644
--- a/src/spatial-solving/solverfactory.hh
+++ b/src/spatial-solving/solverfactory.hh
@@ -28,8 +28,8 @@ class SolverFactory {
     using Vector = typename Functional::Vector;
     using BitVector = BitVectorType;
 
-    using LocalSolver = Dune::TNNMG::ScalarObstacleSolver;//LocalBisectionSolver;
-    using NonlinearSmoother = Dune::TNNMG::NonlinearGSStep<Functional, Dune::TNNMG::GaussSeidelLocalSolver<LocalSolver>, BitVector>;
+    using LocalSolver = LocalBisectionSolver;//Dune::TNNMG::ScalarObstacleSolver;//LocalBisectionSolver;
+    using NonlinearSmoother = Dune::TNNMG::NonlinearGSStep<Functional, LocalBisectionSolver, BitVector>;//Dune::TNNMG::NonlinearGSStep<Functional, Dune::TNNMG::GaussSeidelLocalSolver<LocalSolver>, BitVector>;
     using Linearization = Linearization<Functional, BitVector>;
     using DefectProjection = typename Dune::TNNMG::ObstacleDefectProjection;
 
diff --git a/src/spatial-solving/tnnmg/functional.hh b/src/spatial-solving/tnnmg/functional.hh
index 098c7208d7466b8a3bd32012b400167d002c4902..8305b04bd1026692cf03392e58ab53a5a326c0b5 100644
--- a/src/spatial-solving/tnnmg/functional.hh
+++ b/src/spatial-solving/tnnmg/functional.hh
@@ -352,13 +352,13 @@ auto coordinateRestriction(const ShiftedFunctional<M, V, Nonlinearity, R>& f, co
 
   auto&& phii = f.phi().restriction(i);
 
-  /*auto v = ri;
+  auto v = ri;
   double const vnorm = v.two_norm();
   if (vnorm > 1.0)
-        v /= vnorm;*/
+        v /= vnorm;
 
-  //return FirstOrderModelFunctional<LocalVector, decltype(phii), LocalLowerObstacle, LocalUpperObstacle, LocalVector, LocalVector, Range>(*Aii_p, std::move(ri), std::move(phii), std::move(dli), std::move(dui), std::move(f.origin()[i]), std::move(v));
-  return Functional<LocalMatrix&, LocalVector, decltype(phii), LocalLowerObstacle, LocalUpperObstacle, Range>(*Aii_p, std::move(ri), std::move(phii), std::move(dli), std::move(dui));
+  return FirstOrderModelFunctional<LocalVector, decltype(phii), LocalLowerObstacle, LocalUpperObstacle, LocalVector, LocalVector, Range>(*Aii_p, std::move(ri), std::move(phii), std::move(dli), std::move(dui), std::move(f.origin()[i]), std::move(v));
+  //return Functional<LocalMatrix&, LocalVector, decltype(phii), LocalLowerObstacle, LocalUpperObstacle, Range>(*Aii_p, std::move(ri), std::move(phii), std::move(dli), std::move(dui));
 }