diff --git a/src/foam/foam.cc b/src/foam/foam.cc
index 02e51281ecb240edbe844c50cce6f6a877f46ad1..e55f6deeb2db42f8ac013c77fc6a25e27c49a93b 100644
--- a/src/foam/foam.cc
+++ b/src/foam/foam.cc
@@ -115,6 +115,14 @@ static std::atomic<bool> terminationRequested(false);
 void handleSignal(int signum) { terminationRequested = true; }
 
 int main(int argc, char *argv[]) {
+  using BlocksFactory = TwoBlocksFactory<Grid, Vector>;
+  using ContactNetwork = typename BlocksFactory::ContactNetwork;
+  using MyProgramState = ProgramState<Vector, ScalarVector>;
+  using Assembler = MyAssembler<DefLeafGridView, dims>;
+
+  using IOHandler = IOHandler<Assembler, ContactNetwork, MyProgramState>;
+  std::unique_ptr<IOHandler> ioHandler;
+
   try {
     Dune::MPIHelper::instance(argc, argv);
 
@@ -141,15 +149,13 @@ int main(int argc, char *argv[]) {
     std::streambuf *coutbuf = std::cout.rdbuf(); //save old buffer
     std::cout.rdbuf(out.rdbuf()); //redirect std::cout to log.txt
 
-    using Assembler = MyAssembler<DefLeafGridView, dims>;
+
     using field_type = Matrix::field_type;
 
     // ----------------------
     // set up contact network
     // ----------------------
-    using BlocksFactory = TwoBlocksFactory<Grid, Vector>;
     BlocksFactory blocksFactory(parset);
-    using ContactNetwork = typename BlocksFactory::ContactNetwork;
     blocksFactory.build();
 
     ContactNetwork& contactNetwork = blocksFactory.contactNetwork();
@@ -165,14 +171,14 @@ int main(int argc, char *argv[]) {
 
         const auto& level = *contactNetwork.level(i);
 
-        for (size_t j=0; j<level.nBodies(); j++) {
+        //for (size_t j=0; j<level.nBodies(); j++) {
             //writeToVTK(level.body(j)->gridView(), "../debug_print/bodies/", "body_" + std::to_string(j) + "_level_" + std::to_string(i));
-        }
+        //}
     }
 
-    for (size_t i=0; i<bodyCount; i++) {
+    //for (size_t i=0; i<bodyCount; i++) {
         //writeToVTK(contactNetwork.body(i)->gridView(), "../debug_print/bodies/", "body_" + std::to_string(i) + "_leaf");
-    }
+    //}
 
     // ----------------------------
     // assemble contactNetwork
@@ -189,12 +195,12 @@ int main(int argc, char *argv[]) {
         nVertices[i] = contactNetwork.body(i)->nVertices();
     }
 
-    using MyProgramState = ProgramState<Vector, ScalarVector>;
+
     MyProgramState programState(nVertices);
 
-    IOHandler<Assembler, ContactNetwork> ioHandler(parset.sub("io"), contactNetwork);
+    ioHandler = std::make_unique<IOHandler>(parset.sub("io"), contactNetwork);
 
-    bool restartRead = ioHandler.read(programState);
+    bool restartRead = ioHandler->read(programState);
     if (!restartRead) {
       programState.setupInitialConditions(parset, contactNetwork);
     }
@@ -384,7 +390,7 @@ int main(int argc, char *argv[]) {
 
     IterationRegister iterationCount;
 
-    ioHandler.write(programState, contactNetwork, globalFriction, iterationCount, true);
+    ioHandler->write(programState, contactNetwork, globalFriction, iterationCount, true);
 
     // -------------------
     // Set up TNNMG solver
@@ -494,7 +500,7 @@ int main(int argc, char *argv[]) {
 
       contactNetwork.setDeformation(programState.u);
 
-      ioHandler.write(programState, contactNetwork, globalFriction, iterationCount, false);
+      ioHandler->write(programState, contactNetwork, globalFriction, iterationCount, false);
 
       if (programState.timeStep==timeSteps) {
         std::cout << "limit of timeSteps reached!" << std::endl;
@@ -516,5 +522,9 @@ int main(int argc, char *argv[]) {
     Dune::derr << "Dune reported error: " << e << std::endl;
   } catch (std::exception &e) {
     std::cerr << "Standard exception: " << e.what() << std::endl;
+  } catch (...) {
+
   }
+
+  ioHandler.reset();
 }