diff --git a/dune/faultnetworks/levelinterfacenetworkproblem.hh b/dune/faultnetworks/levelinterfacenetworkproblem.hh
index 2cc53f7088394423587b422edb34e987d65a234f..23b161912454e78c87162e19b213f535572e7ea6 100644
--- a/dune/faultnetworks/levelinterfacenetworkproblem.hh
+++ b/dune/faultnetworks/levelinterfacenetworkproblem.hh
@@ -30,6 +30,8 @@ class LevelInterfaceNetworkProblem
         VectorType rhs_;
         VectorType x_;
 
+        Dune::BitSetVector<1> boundaryDofs_;
+
         bool requireAssemble_;
 
     public:
@@ -55,12 +57,11 @@ class LevelInterfaceNetworkProblem
                 const GridView& gridView = levelInterfaceNetwork_.levelGridView();
 
                 // set boundary conditions
-                Dune::BitSetVector<1> boundaryDofs;
                 BoundaryPatch<GridView> boundaryPatch(gridView, true);
-                constructBoundaryDofs(boundaryPatch, *basis_, boundaryDofs);
+                constructBoundaryDofs(boundaryPatch, *basis_, boundaryDofs_);
 
-                for(size_t i=0; i<boundaryDofs.size(); i++) {
-                    if(!boundaryDofs[i][0])
+                for(size_t i=0; i<boundaryDofs_.size(); i++) {
+                    if(!boundaryDofs_[i][0])
                         continue;
 
                     RowType& row = matrix_[i];
@@ -132,6 +133,10 @@ class LevelInterfaceNetworkProblem
         const LevelInterfaceNetwork<GridView>& levelInterfaceNetwork() const {
             return levelInterfaceNetwork_;
         }
+
+        const auto& boundaryNodes() const {
+            return boundaryDofs_;
+        }
 };
 
 #endif
diff --git a/dune/faultnetworks/preconditioners/cellpatchpreconditioner.hh b/dune/faultnetworks/preconditioners/cellpatchpreconditioner.hh
index c4c2b04fa72c2ee04a0c0e48140516f913575d7c..a14f005352084a4c1dd86aa6a47c6fa60e08b2c0 100644
--- a/dune/faultnetworks/preconditioners/cellpatchpreconditioner.hh
+++ b/dune/faultnetworks/preconditioners/cellpatchpreconditioner.hh
@@ -21,14 +21,14 @@ public:
                              const Mode mode = Mode::additive) :
           Base(levelInterfaceNetwork, patchLevelBasis, localAssembler, localInterfaceAssemblers, mode) {}
 
-    void build() {
+    void preprocess() {
         const int patchLevel = this->patchLevelBasis_.faultNetwork().level();
         CellPatchFactory<BasisType> patchFactory(this->patchLevelBasis_, this->basis_, patchLevel, this->level_);
         const auto& localToGlobal = patchFactory.getLocalToGlobal();
         const auto& boundaryDofs = patchFactory.getBoundaryDofs();
 
         VectorType rhs;
-        rhs.resize(this->matrix_.N());
+        rhs.resize(this->mat_->N());
         rhs = 0;
 
         std::cout << "CellPatchPreconditioner::build() level: " << this->level_ << std::endl;
@@ -38,7 +38,7 @@ public:
 
         for (size_t i=0; i<cellCount; i++) {
             using LocalProblemType = typename std::remove_reference<decltype(*(this->localProblems_[i]))>::type;
-            this->localProblems_[i] = std::make_shared<LocalProblemType>(this->matrix_, rhs, localToGlobal[i], boundaryDofs[i]);
+            this->localProblems_[i] = std::make_shared<LocalProblemType>(*this->mat_, rhs, localToGlobal[i], boundaryDofs[i]);
         }
     }
 };
diff --git a/dune/faultnetworks/preconditioners/levelglobalpreconditioner.hh b/dune/faultnetworks/preconditioners/levelglobalpreconditioner.hh
index 2b7b4e2bb80f6ad5ec302097654dbb5bc320deb4..af27254f0dfacbe4d9d86da136a43f9b1570fdfc 100644
--- a/dune/faultnetworks/preconditioners/levelglobalpreconditioner.hh
+++ b/dune/faultnetworks/preconditioners/levelglobalpreconditioner.hh
@@ -57,7 +57,7 @@ public:
         assert(localInterfaceAssemblers_.size() == levelInterfaceNetwork_.size());
     }
 
-    void build() {
+    void setup() {
         //printBasisDofLocation(basis_);
 
         GlobalFaultAssembler<BasisType, BasisType> globalFaultAssembler(basis_, basis_, levelInterfaceNetwork_);
@@ -94,9 +94,10 @@ public:
 
 
     virtual void setProblem(const MatrixType& mat, VectorType& x, const VectorType& rhs) {
+        //LinearIterationStep<MatrixType, VectorType>::setProblem(mat, x, rhs);
         this->x_ = &x;
-        updateRhs(rhs);
         this->mat_ = Dune::stackobject_to_shared_ptr(mat); // mat will be set but not used
+        updateRhs(rhs);
     }
 
     virtual void iterate() {      
@@ -105,21 +106,21 @@ public:
 
         // compute solution directly
 
-        if (requireBuild_)
-            DUNE_THROW(Dune::Exception, "LevelGlobalPreconditioner::iterate() Call build() before solving the global problem!");
+       /* if (requireBuild_)
+            DUNE_THROW(Dune::Exception, "LevelGlobalPreconditioner::iterate() Call build() before solving the global problem!");*/
 
         Dune::Timer timer;
         timer.reset();
         timer.start();
 
-        this->x_->resize(matrix_.M());
+        this->x_->resize(this->mat_->M());
         *(this->x_) = 0;
 
         #if HAVE_UMFPACK
         Dune::InverseOperatorResult res;
         VectorType rhsCopy(rhs_);
 
-        Dune::UMFPack<MatrixType> solver(matrix_);
+        Dune::UMFPack<MatrixType> solver(*this->mat_);
         solver.apply(*(this->x_), rhsCopy, res);
 
         #else
@@ -144,11 +145,11 @@ public:
 
 private:
     void updateRhs(const VectorType& rhs){
-        rhs_.resize(matrix_.M());
+        rhs_.resize(this->mat_->M());
         rhs_ = 0;
 
         for (size_t i=0; i<rhs.size(); i++) {
-            if (!boundaryDofs_[i][0])
+            if (!(*this->ignoreNodes_)[i][0])
                 rhs_[i] = rhs[i];
         }
     }
diff --git a/dune/faultnetworks/preconditioners/levelpatchpreconditioner.hh b/dune/faultnetworks/preconditioners/levelpatchpreconditioner.hh
index 1b672a5d8eca192dba959e2e56d03d018dca2219..9d1fc409ab4653639682344b8ac870afa9f2f9ca 100644
--- a/dune/faultnetworks/preconditioners/levelpatchpreconditioner.hh
+++ b/dune/faultnetworks/preconditioners/levelpatchpreconditioner.hh
@@ -66,11 +66,11 @@ public:
         setPatchDepth();
         setBoundaryMode();
         setDirection();
-        setup();
+     //   setup();
     }
 
     // has to setup localProblems_
-    virtual void build() = 0;
+    virtual void preprocess() = 0;
 
     void setPatchDepth(const size_t patchDepth = 0) {
         patchDepth_ = patchDepth;
@@ -182,13 +182,18 @@ private:
 
         auto& localProblem = *localProblems_[i];
 
-        VectorType localR;
-        VectorType r = *(this->rhs_);
-        Dune::MatrixVector::subtractProduct(r, matrix_, *(this->x_));
-        localProblem.restrict(r, localR);
+        // compute residual
+        VectorType residual = *this->rhs_;
+        this->mat_->mmv(*this->x_, residual);
 
-        localProblem.updateLocalRhs(localR);
+        // restrict residual
+        VectorType localResidual;
+        localProblem.restrict(residual, localResidual);
 
+        // solve local problem
+        localProblem.updateLocalRhs(localResidual);
+
+        // prolong
         VectorType x, v;
         localProblem.solve(x);
         localProblem.prolong(x, v);
diff --git a/dune/faultnetworks/preconditioners/multilevelpatchpreconditioner.hh b/dune/faultnetworks/preconditioners/multilevelpatchpreconditioner.hh
index e4bf038e631ba11dc8f103e985b782ead0f786b6..8b7115c196c548110739557a458bb52e8505dd7e 100644
--- a/dune/faultnetworks/preconditioners/multilevelpatchpreconditioner.hh
+++ b/dune/faultnetworks/preconditioners/multilevelpatchpreconditioner.hh
@@ -10,6 +10,9 @@
 
 #include <dune/solvers/iterationsteps/lineariterationstep.hh>
 
+#include <dune/matrix-vector/genericvectortools.hh>
+#include <dune/matrix-vector/resize.hh>
+
 #include <dune/faultnetworks/preconditioners/levelglobalpreconditioner.hh>
 #include <dune/faultnetworks/preconditioners/levelpatchpreconditioner.hh>
 #include <dune/faultnetworks/preconditioners/cellpatchpreconditioner.hh>
@@ -45,19 +48,23 @@ private:
     using MultDirection = typename LevelPatchPreconditionerType::Direction;
     MultDirection multDirection_;
 
-
     int itCounter_;
 
     std::shared_ptr<LevelGlobalPreconditionerType> coarseGlobalPreconditioner_;
     std::vector<std::shared_ptr<LevelPatchPreconditionerType>> levelPatchPreconditioners_;
-    std::vector<VectorType> levelX_;
-    std::vector<VectorType> levelRhs_;
 
     std::shared_ptr<LevelInterfaceNetwork<GridView>> allFaultLevelInterfaceNetwork_;
     std::shared_ptr<BasisType> allFaultBasis_;
 
+    // data hierarchy
+    std::vector<std::shared_ptr<const MatrixType> > matrixHierarchy_;
+    std::vector<std::shared_ptr<VectorType> > xHierarchy_;
+    std::vector<VectorType> rhsHierarchy_;
+    std::vector<BitVector*> ignoreNodesHierarchy_;
+
     std::vector<std::shared_ptr<DGMGTransfer<BasisType>>> mgTransfer_;
 
+    bool preprocessCalled_;
 public:
     MultilevelPatchPreconditioner(const InterfaceNetwork<GridType>& interfaceNetwork,
                                   const BitVector& activeLevels,
@@ -68,7 +75,8 @@ public:
           activeLevels_(activeLevels),
           localAssemblers_(localAssemblers),
           localInterfaceAssemblers_(localInterfaceAssemblers),
-          parset_(parset)
+          parset_(parset),
+          preprocessCalled_(false)
     {
         parseSettings();
 
@@ -92,54 +100,109 @@ public:
         }
 
         auto maxLevel = setupLevelPreconditioners();
-
-        levelX_.resize(levelPatchPreconditioners_.size()+1);
-        levelRhs_.resize(levelPatchPreconditioners_.size()+1);
-
         allFaultBasis_ = std::make_shared<BasisType>(interfaceNetwork_.levelInterfaceNetwork(maxLevel));
 
-        // init multigrid transfer
-        for (size_t i=0; i<levelPatchPreconditioners_.size(); i++) {
-            mgTransfer_.push_back(std::make_shared<DGMGTransfer<BasisType>>(levelPatchPreconditioners_[i]->basis(), *allFaultBasis_));
-        }
-        mgTransfer_.push_back(std::make_shared<DGMGTransfer<BasisType>>(coarseGlobalPreconditioner_->basis(), *allFaultBasis_));
-
         itCounter_ = 0;
     }
 
+    virtual ~MultilevelPatchPreconditioner()
+    {
+        for (int i=0; i<int(ignoreNodesHierarchy_.size()-1); i++)
+        {
+            if (ignoreNodesHierarchy_[i])
+                delete(ignoreNodesHierarchy_[i]);
+        }
+    }
 
    virtual void setProblem(const MatrixType& mat, VectorType& x, const VectorType& rhs) {
-        this->x_ = &x;
-        this->rhs_ = &rhs;
-        this->mat_ = Dune::stackobject_to_shared_ptr(mat);
-
-        for (size_t i=0; i<levelPatchPreconditioners_.size(); i++) {
-            mgTransfer_[i]->restrict(x, levelX_[i]);
-            mgTransfer_[i]->restrict(rhs, levelRhs_[i]);
-
-            levelPatchPreconditioners_[i]->setProblem(mat, levelX_[i], levelRhs_[i]);
-        }
+        LinearIterationStep<MatrixType, VectorType>::setProblem(mat, x, rhs);
 
-        size_t j = levelPatchPreconditioners_.size();
-        mgTransfer_[j]->restrict(x, levelX_[j]);
-        mgTransfer_[j]->restrict(rhs, levelRhs_[j]);
+        preprocessCalled_ = false;
+    }
 
-        coarseGlobalPreconditioner_->setProblem(mat, levelX_[j], levelRhs_[j]);
+    void setRhs(const VectorType& rhs) {
+        this->rhs_ = &rhs;
+        rhsHierarchy_.back() = rhs;
     }
 
     virtual void iterate() {
+        *(this->x_) = 0;
+
         if (mode_ == Mode::ADDITIVE)
             iterateAdd();
         else
             iterateMult();
     }
 
-    void build() {
-        coarseGlobalPreconditioner_->build();
+    virtual void preprocess() {
+        if (preprocessCalled_)
+            std::cout << "Warning: Preprocess has already been called without calling iterate afterwards!" << std::endl;
+
+        preprocessCalled_ = true;
+
+        const int numLevels = levelPatchPreconditioners_.size()+1;
+
+        // init transfer operators
+        mgTransfer_.resize(numLevels-1);
+        mgTransfer_[0] = std::make_shared<DGMGTransfer<BasisType>>(coarseGlobalPreconditioner_->basis(), levelPatchPreconditioners_[0]->basis());
+        for (size_t i=1; i<mgTransfer_.size(); i++) {
+            mgTransfer_[i] = std::make_shared<DGMGTransfer<BasisType>>(levelPatchPreconditioners_[i-1]->basis(), levelPatchPreconditioners_[i]->basis());
+        }
+
+        // resize hierarchy containers to number of levels
+        xHierarchy_.resize(numLevels);
+        rhsHierarchy_.resize(numLevels);
+        matrixHierarchy_.resize(numLevels);
+        ignoreNodesHierarchy_.resize(numLevels);
+
+        for (int i=0; i<numLevels-1; i++) {
+            matrixHierarchy_[i].reset();
+            xHierarchy_[i].reset();
+        }
+
+        matrixHierarchy_.back() = this->mat_;
+        xHierarchy_.back()      = Dune::stackobject_to_shared_ptr(*(this->x_));
+        rhsHierarchy_.back()    = *(this->rhs_);
+
+        // assemble hierarchy of matrices
+        for (int i=numLevels-2; i>=0; i--) {
+            matrixHierarchy_[i] = std::shared_ptr<MatrixType>(new MatrixType);
+            xHierarchy_[i] = std::shared_ptr<VectorType>(new VectorType);
+
+            mgTransfer_[i]->galerkinRestrictSetOccupation(*matrixHierarchy_[i+1], *std::const_pointer_cast<MatrixType>(matrixHierarchy_[i]));
+            mgTransfer_[i]->galerkinRestrict(*matrixHierarchy_[i+1], *std::const_pointer_cast<MatrixType>(matrixHierarchy_[i]));
+
+            // Set solution vector sizes for the lower levels
+            Dune::MatrixVector::resize(*xHierarchy_[i], *matrixHierarchy_[i]);
+            Dune::MatrixVector::resize(rhsHierarchy_[i], *matrixHierarchy_[i]);
+        }
+
+        // setup dirichlet bitfields
+        if (this->ignoreNodes_!=0)
+        {
+            ignoreNodesHierarchy_.back() = const_cast<BitVector*>(this->ignoreNodes_);
+            for (int i=numLevels-2; i>=0; --i)
+            {
+                ignoreNodesHierarchy_[i] = new BitVector();
+                mgTransfer_[i]->restrictToFathers(*ignoreNodesHierarchy_[i+1], *ignoreNodesHierarchy_[i]);
+            }
+        } else
+            DUNE_THROW(SolverError, "We need a set of nodes to ignore");
+
+        setDirichlet(*std::const_pointer_cast<MatrixType>(matrixHierarchy_[0]), *ignoreNodesHierarchy_[0]);
+        coarseGlobalPreconditioner_->setIgnore(*ignoreNodesHierarchy_[0]);
+        coarseGlobalPreconditioner_->setProblem(*matrixHierarchy_[0], *xHierarchy_[0], rhsHierarchy_[0]);
+        coarseGlobalPreconditioner_->preprocess();
 
         for (size_t i=0; i<levelPatchPreconditioners_.size(); i++) {
-            levelPatchPreconditioners_[i]->build();
+            setDirichlet(*std::const_pointer_cast<MatrixType>(matrixHierarchy_[i+1]), *ignoreNodesHierarchy_[i+1]);
+            levelPatchPreconditioners_[i]->setIgnore(*ignoreNodesHierarchy_[i+1]);
+            levelPatchPreconditioners_[i]->setProblem(*matrixHierarchy_[i+1], *xHierarchy_[i+1], rhsHierarchy_[i+1]);
+            levelPatchPreconditioners_[i]->preprocess();
         }
+
+        //levelPatchPreconditioners_.back()->setProblem(*matrixHierarchy_.back(), *xHierarchy_.back(), rhsHierarchy_.back());
+        //levelPatchPreconditioners_.back()->preprocess();
     }
 
     std::shared_ptr<LevelPatchPreconditionerType> levelPatchPreconditioner(const int level) {
@@ -155,6 +218,20 @@ public:
     }
 
 private:
+    void setDirichlet(MatrixType& matrix, const BitVector& dirichletNodes) {
+        for(size_t i=0; i<dirichletNodes.size(); i++) {
+            if(!dirichletNodes[i][0])
+                continue;
+
+            auto& row = matrix[i];
+
+            for (auto& entry : row) {
+                entry = 0;
+            }
+            row[i] = 1;
+        }
+    }
+
     void parseSettings() {
         const auto mode = parset_.get<std::string>("mode");
         if (mode == "ADDITIVE") {
@@ -178,7 +255,7 @@ private:
     }
 
     void iterateAdd() {
-        VectorType x;
+        /*VectorType x;
 
         for (size_t i=0; i<levelPatchPreconditioners_.size(); i++) {
             levelPatchPreconditioners_[i]->iterate();
@@ -195,12 +272,33 @@ private:
         const VectorType& it = coarseGlobalPreconditioner_->getSol();
 
         mgTransfer_[levelPatchPreconditioners_.size()]->prolong(it, x);
-        *(this->x_) += x;
+        *(this->x_) += x; */
+
+
+        for (int i=mgTransfer_.size()-1; i>=0; i--) {
+            *xHierarchy_[i] = 0;
+            mgTransfer_[i]->restrict(rhsHierarchy_[i+1], rhsHierarchy_[i]);
+        }
+
+        coarseGlobalPreconditioner_->setProblem(*matrixHierarchy_[0], *xHierarchy_[0], rhsHierarchy_[0]);
+        coarseGlobalPreconditioner_->iterate();
+
+        for (size_t i=0; i<levelPatchPreconditioners_.size(); i++) {
+            levelPatchPreconditioners_[i]->setProblem(*matrixHierarchy_[i+1], *xHierarchy_[i+1], rhsHierarchy_[i+1]);
+            levelPatchPreconditioners_[i]->iterate();
+
+            VectorType x(xHierarchy_[i+1]->size());
+            mgTransfer_[i]->prolong(*xHierarchy_[i], x);
+
+            *xHierarchy_[i+1] += x;
+        }
+
+        *(this->x_) = *xHierarchy_.back();
     }
 
 
     void iterateMult() {
-
+/*
         if (multDirection_ != MultDirection::FORWARD)
             for (size_t i=levelPatchPreconditioners_.size()-1; i>=0 && i<levelPatchPreconditioners_.size(); i--)
                 iterateStep(i, MultDirection::BACKWARD);
@@ -231,13 +329,13 @@ private:
                 iterateStep(i, MultDirection::FORWARD);
         }
 
-        itCounter_++;
+        itCounter_++;*/
     }
 
     void iterateStep(const size_t i, const MultDirection dir) {
         //mgTransfer_[i]->restrict(*(this->x_), levelX_[i]);
 
-        VectorType residual = *(this->rhs_);
+     /*   VectorType residual = *(this->rhs_);
         Dune::MatrixVector::subtractProduct(residual, *(this->mat_), *(this->x_));
 
         VectorType localResidual;
@@ -254,7 +352,7 @@ private:
 
         VectorType x;
         mgTransfer_[i]->prolong(it, x);
-        *(this->x_) += x;
+        *(this->x_) += x; */
 
         //writeToVTK(*allFaultBasis_, x, "/storage/mi/podlesny/data/faultnetworks/fineIterates/multilevel", "exactvertexdata_step_"+std::to_string(itCounter_));
     }
diff --git a/dune/faultnetworks/preconditioners/supportpatchpreconditioner.hh b/dune/faultnetworks/preconditioners/supportpatchpreconditioner.hh
index 68f544cabfcd176529da1164c9b1749f4a74389e..dc4064e81981890575975847ab157993829b3c0f 100644
--- a/dune/faultnetworks/preconditioners/supportpatchpreconditioner.hh
+++ b/dune/faultnetworks/preconditioners/supportpatchpreconditioner.hh
@@ -26,7 +26,7 @@ public:
           Base(levelInterfaceNetwork, patchLevelBasis, localAssembler, localInterfaceAssemblers, mode)
     {}
 
-    void build() {
+    void preprocess() {
         // init vertexInElements
         const int dim = GridType::dimension;
         using Element = typename GridType::template Codim<0>::Entity;
@@ -60,11 +60,11 @@ public:
             const auto& boundaryDofs = patchFactory.getBoundaryDofs();
 
             VectorType rhs;
-            rhs.resize(this->matrix_.N());
+            rhs.resize(this->mat_->N());
             rhs = 0;
 
             using LocalProblemType = typename std::remove_reference<decltype(*(this->localProblems_[i]))>::type;
-            this->localProblems_[i] = std::make_shared<LocalProblemType>(this->matrix_, rhs, localToGlobal, boundaryDofs);
+            this->localProblems_[i] = std::make_shared<LocalProblemType>(*this->mat_, rhs, localToGlobal, boundaryDofs);
         }
     }
 };
diff --git a/src/cantorfaultnetworks/sparsecantorfaultnetwork.cc b/src/cantorfaultnetworks/sparsecantorfaultnetwork.cc
index 1849acf971fe97b4645faf214eef44998b340aa7..2f768eacf936043433aa69a2f6b76ab5b0ec5a42 100644
--- a/src/cantorfaultnetworks/sparsecantorfaultnetwork.cc
+++ b/src/cantorfaultnetworks/sparsecantorfaultnetwork.cc
@@ -272,6 +272,7 @@ int main(int argc, char** argv) { try
     fineGlobalAssembler.assemble(fineLocalAssembler, fineLocalInterfaceAssemblers, l2FunctionalAssembler);
     fineGlobalAssembler.solve();
 
+    const auto& fineBoundaryNodes = fineGlobalAssembler.boundaryNodes();
     const VectorType& fineSol = fineGlobalAssembler.getSol();
     const VectorType& fineRhs = fineGlobalAssembler.rhs();
     std::shared_ptr<DGBasis> fineBasis = fineGlobalAssembler.basis();
@@ -304,6 +305,13 @@ int main(int argc, char** argv) { try
         }
     }
 
+    // set initial iterate
+    VectorType initialX;
+    DGMGTransfer<DGBasis> coarseFineTransfer(*coarseBasis, *fineBasis);
+    coarseFineTransfer.prolong(coarseSol, initialX);
+
+    VectorType rhs(fineRhs);
+
     const auto& preconditionerParset = parameterSet.sub("preconditioner");
     using MultilevelPatchPreconditioner = MultilevelPatchPreconditioner<DGBasis, LocalOscAssembler, LocalInterfaceAssembler, MatrixType, VectorType>;
 
@@ -314,18 +322,12 @@ int main(int argc, char** argv) { try
         levelFaultPreconditioner.setPatchDepth(patchDepth);
         levelFaultPreconditioner.setBoundaryMode(LevelPatchPreconditioner::BoundaryMode::homogeneous);
     }*/
-    preconditioner.build();
+    preconditioner.setIgnore(fineBoundaryNodes);
+    preconditioner.setProblem(fineGlobalAssembler.matrix(), initialX, rhs);
 
     std::cout << "Setup complete, starting preconditioned cg iteration!" << std::endl;
     std::cout << std::endl << std::endl;
 
-    // set initial iterate
-    VectorType initialX;
-    DGMGTransfer<DGBasis> coarseFineTransfer(*coarseBasis, *fineBasis);
-    coarseFineTransfer.prolong(coarseSol, initialX);
-
-    VectorType rhs(fineRhs);
-
     DGMGTransfer<DGBasis> discMGTransfer(*fineBasis, *exactBasis);
 
     // solve
diff --git a/src/cantorfaultnetworks/sparsecantorfaultnetwork.parset b/src/cantorfaultnetworks/sparsecantorfaultnetwork.parset
index a5a180cfe892ec041aeb8fa0f176b5ecf3af0c5b..e8b5b26094f0e2cd91b3ae1d2adc76768ad0a8a3 100644
--- a/src/cantorfaultnetworks/sparsecantorfaultnetwork.parset
+++ b/src/cantorfaultnetworks/sparsecantorfaultnetwork.parset
@@ -39,18 +39,3 @@ nestedIteration = 0
 tol = 1e-12
 maxIterations = 8
 
-
-[problem2]
-oscDataFile         = oscDataLaplace4.mat
-
-# level resolution in 2^(-...)
-coarseCantorLevel = 1
-fineCantorLevel = 4
-maxCantorLevel = 5
-
-penaltyFactor = 1
-
-# cg solver
-nestedIteration = 0
-tol = 1e-12
-maxIterations = 8
diff --git a/src/geofaultnetworks/rockfaultnetwork.parset b/src/geofaultnetworks/rockfaultnetwork.parset
index 283eb84f104b80f3808d9bcd3da76e838eb4cd9a..92d9c3884d2fc20a20d8089958612b0a7c9111a4 100644
--- a/src/geofaultnetworks/rockfaultnetwork.parset
+++ b/src/geofaultnetworks/rockfaultnetwork.parset
@@ -7,7 +7,7 @@ maxAngle = 2.0
 
 [preconditioner]
 patch = SUPPORT            # CELL , SUPPORT
-mode = ADDITIVE         # ADDITIVE , MULTIPLICATIVE
+mode = MULTIPLICATIVE         # ADDITIVE , MULTIPLICATIVE
 multDirection = SYMMETRIC    # SYMMETRIC , FORWARD , BACKWARD
 patchDepth = 1
 
@@ -17,75 +17,7 @@ patchDepth = 1
 oscDataFile         = oscDataLaplace4.mat
 
 # level resolution in 2^(-...)
-coarseResolution = 4
-fineResolution = 9
-exactResolution = 10
-
-penaltyFactor = 1
-
-# cg solver
-nestedIteration = 0
-tol = 1e-12
-maxIterations = 8
-
-###########################################
-
-[problem1]
-oscDataFile         = oscDataLaplace4.mat
-
-# level resolution in 2^(-...)
-coarseResolution = 4
-fineResolution = 8
-exactResolution = 9
-
-penaltyFactor = 1
-
-# cg solver
-nestedIteration = 0
-tol = 1e-12
-maxIterations = 8
-
-###########################################
-
-[problem2]
-oscDataFile         = oscDataLaplace4.mat
-
-# level resolution in 2^(-...)
-coarseResolution = 4
-fineResolution = 7
-exactResolution = 8
-
-penaltyFactor = 1
-
-# cg solver
-nestedIteration = 0
-tol = 1e-12
-maxIterations = 8
-
-###########################################
-
-[problem3]
-oscDataFile         = oscDataLaplace4.mat
-
-# level resolution in 2^(-...)
-coarseResolution = 4
-fineResolution = 6
-exactResolution = 7
-
-penaltyFactor = 1
-
-# cg solver
-nestedIteration = 0
-tol = 1e-12
-maxIterations = 8
-
-###########################################
-
-[problem4]
-oscDataFile         = oscDataLaplace4.mat
-
-# level resolution in 2^(-...)
-coarseResolution = 4
+coarseResolution = 3
 fineResolution = 5
 exactResolution = 6
 
@@ -95,5 +27,3 @@ penaltyFactor = 1
 nestedIteration = 0
 tol = 1e-12
 maxIterations = 8
-
-###########################################