diff --git a/examples/boundary.cc b/examples/boundary.cc
index 2c53d45af2aa3658cf43cab2307f78ebadf35871..91ef916e3f0d74ba23754bc80c3d23324cb8e62c 100644
--- a/examples/boundary.cc
+++ b/examples/boundary.cc
@@ -95,7 +95,7 @@ void run_periodic()
 
 int main(int argc, char** argv)
 {
-  AMDiS::init(argc, argv);
+  Environment env(argc, argv);
 
   auto b = [](auto const& x){ return x[0] < 1.e-8 || x[1] < 1.e-8 || x[0] > 1.0-1.e-8 || x[1] > 1.0-1.e-8; };
 
@@ -119,6 +119,5 @@ int main(int argc, char** argv)
 
   run_periodic();
 
-  AMDiS::finalize();
   return 0;
 }
diff --git a/examples/cahn_hilliard.cc b/examples/cahn_hilliard.cc
index 9f68a576a434bfa2d74fe927d4031c46803af96f..a26e9ccf229ace431993e1284318162341a0eb57 100644
--- a/examples/cahn_hilliard.cc
+++ b/examples/cahn_hilliard.cc
@@ -13,7 +13,7 @@ using Param = LagrangeBasis<Grid, 1, 1>;
 
 int main(int argc, char** argv)
 {
-  AMDiS::init(argc, argv);
+  Environment env(argc, argv);
 
   ProblemStat<Param> prob("ch");
   prob.initialize(INIT_ALL);
@@ -68,6 +68,5 @@ int main(int argc, char** argv)
   AdaptInstationary adapt("adapt", prob, adaptInfo, probInstat, adaptInfo);
   adapt.adapt();
 
-  AMDiS::finalize();
   return 0;
 }
diff --git a/examples/convection_diffusion.cc b/examples/convection_diffusion.cc
index 188b6f128296344180ab261d3f8f131918654469..b0af5d2287d55590c7e8c9f7be78e7577585e734 100644
--- a/examples/convection_diffusion.cc
+++ b/examples/convection_diffusion.cc
@@ -17,7 +17,7 @@ using ElliptProblem = ProblemStat<ElliptParam>;
 
 int main(int argc, char** argv)
 {
-  AMDiS::init(argc, argv);
+  Environment env(argc, argv);
 
   using namespace Dune::Indices;
 
@@ -39,6 +39,5 @@ int main(int argc, char** argv)
   prob.solve(adaptInfo);
   prob.writeFiles(adaptInfo, true);
 
-  AMDiS::finalize();
   return 0;
 }
diff --git a/examples/ellipt.cc b/examples/ellipt.cc
index 885da9cadfa8f07c9461f8ba40b97a1918847a7d..411ef19500b5343088b9b71053dd7c6ad66b6784 100644
--- a/examples/ellipt.cc
+++ b/examples/ellipt.cc
@@ -18,7 +18,7 @@ using ElliptProblem = ProblemStat<Param>;
 
 int main(int argc, char** argv)
 {
-  AMDiS::init(argc, argv);
+  Environment env(argc, argv);
 
   int numLevels = GRIDDIM == 2 ? 8 : 5;
   if (argc > 2)
@@ -92,6 +92,5 @@ int main(int argc, char** argv)
     msg("{:<5} | {:<12} | {:<12} | {:<12} | {:<12} | {:<12}",
         i+1, widths[i], errL2[i], errH1[i], eocL2[i], eocH1[i]);
 
-  AMDiS::finalize();
   return 0;
 }
diff --git a/examples/heat.cc b/examples/heat.cc
index 95d06ab6d2307f2ec144ec232f8eaf92db32437a..9fe769a479bf6c8b75a8fc7dd9b7d34de6cbfd1c 100644
--- a/examples/heat.cc
+++ b/examples/heat.cc
@@ -21,7 +21,7 @@ using HeatProblemInstat = ProblemInstat<HeatParam>;
 
 int main(int argc, char** argv)
 {
-  AMDiS::init(argc, argv);
+  Environment env(argc, argv);
 
   HeatProblem prob("heat");
   prob.initialize(INIT_ALL);
@@ -55,6 +55,5 @@ int main(int argc, char** argv)
   AdaptInstationary adapt("adapt", prob, adaptInfo, probInstat, adaptInfo);
   adapt.adapt();
 
-  AMDiS::finalize();
   return 0;
 }
diff --git a/examples/navier_stokes.cc b/examples/navier_stokes.cc
index 4735e5f3fcbb2b495341be394463c56677db9ad6..2d2677b773a13208d44dfbcc207d469ddcdbfb47 100644
--- a/examples/navier_stokes.cc
+++ b/examples/navier_stokes.cc
@@ -12,7 +12,7 @@ using Basis = TaylorHoodBasis<Grid>;
 
 int main(int argc, char** argv)
 {
-  AMDiS::init(argc, argv);
+  Environment env(argc, argv);
 
   ProblemStat<Basis> prob("stokes");
   prob.initialize(INIT_ALL);
@@ -89,6 +89,5 @@ int main(int argc, char** argv)
   // output solution
   prob.writeFiles(adaptInfo);
 
-  AMDiS::finalize();
   return 0;
 }
diff --git a/examples/neumann.cc b/examples/neumann.cc
index eb423465080163ec6c75a3567c55c6ff40e78680..20f0710630dd54d9b7c57d35dbc9d1d2d6cd446a 100644
--- a/examples/neumann.cc
+++ b/examples/neumann.cc
@@ -51,7 +51,7 @@ void run(Grid& grid)
 
 int main(int argc, char** argv)
 {
-  AMDiS::init(argc, argv);
+  Environment env(argc, argv);
 
   // 2d grids
 
@@ -85,6 +85,5 @@ int main(int argc, char** argv)
   Dune::YaspGrid<3> grid4({1.0,1.0,1.0},{2,2,2});
   run(grid4);
 
-  AMDiS::finalize();
   return 0;
 }
diff --git a/examples/periodic.cc b/examples/periodic.cc
index 2e61afb4a8e16c258d6c6b906342bb6a670fa4cf..02218df1a8db3d8c677f8ac94d56eb9287bab05b 100644
--- a/examples/periodic.cc
+++ b/examples/periodic.cc
@@ -79,7 +79,7 @@ void run(Grid& grid)
 
 int main(int argc, char** argv)
 {
-  AMDiS::init(argc, argv);
+  Environment env(argc, argv);
 
 #if HAVE_DUNE_SPGRID
   Dune::SPCube<double,2> cube({0.0,0.0},{1.0,1.0});
@@ -92,6 +92,5 @@ int main(int argc, char** argv)
   Dune::YaspGrid<2> grid2({1.0,1.0}, {2,2});
   run(grid2);
 
-  AMDiS::finalize();
   return 0;
 }
diff --git a/examples/stokes0.cc b/examples/stokes0.cc
index 6c0bd639e7cd8be16ee7a07ed584e35f54e76dcd..979182b5db666e4d487cc2fb168cd05c82717020 100644
--- a/examples/stokes0.cc
+++ b/examples/stokes0.cc
@@ -10,7 +10,7 @@ using StokesProblem = ProblemStat<StokesParam>;
 
 int main(int argc, char** argv)
 {
-  AMDiS::init(argc, argv);
+  Environment env(argc, argv);
 
   StokesProblem prob("stokes");
   prob.initialize(INIT_ALL);
@@ -58,6 +58,5 @@ int main(int argc, char** argv)
   // output solution
   prob.writeFiles(adaptInfo);
 
-  AMDiS::finalize();
   return 0;
 }
diff --git a/examples/stokes1.cc b/examples/stokes1.cc
index 13279763961f232d32e8e046cff549ce6cc12689..50581ed63e4adcdbf27fb604a30dc41184e2a6a3 100644
--- a/examples/stokes1.cc
+++ b/examples/stokes1.cc
@@ -10,7 +10,7 @@ using StokesProblem = ProblemStat<StokesParam>;
 
 int main(int argc, char** argv)
 {
-  AMDiS::init(argc, argv);
+  Environment env(argc, argv);
 
   StokesProblem prob("stokes");
   prob.initialize(INIT_ALL);
@@ -58,6 +58,5 @@ int main(int argc, char** argv)
   // output solution
   prob.writeFiles(adaptInfo);
 
-  AMDiS::finalize();
   return 0;
 }
diff --git a/examples/stokes3.cc b/examples/stokes3.cc
index 2358e900aa68e8f0e7b3be10275a7ae494f06267..80937e8b551e03bd722569bdd6648bf6fc38bc9d 100644
--- a/examples/stokes3.cc
+++ b/examples/stokes3.cc
@@ -11,7 +11,7 @@ using StokesProblem = ProblemStat<StokesParam>;
 
 int main(int argc, char** argv)
 {
-  AMDiS::init(argc, argv);
+  Environment env(argc, argv);
 
   StokesProblem prob("stokes");
   prob.initialize(INIT_ALL);
@@ -48,6 +48,5 @@ int main(int argc, char** argv)
   // output solution
   prob.writeFiles(adaptInfo);
 
-  AMDiS::finalize();
   return 0;
 }
diff --git a/examples/vecellipt.cc b/examples/vecellipt.cc
index ec3d4356f6549f07b89032a30a3727eecc2c8bf7..2cb3a4148be3f847d3e977373cdffe48da175823 100644
--- a/examples/vecellipt.cc
+++ b/examples/vecellipt.cc
@@ -15,7 +15,7 @@ using ElliptProblem = ProblemStat<ElliptParam>;
 
 int main(int argc, char** argv)
 {
-  AMDiS::init(argc, argv);
+  Environment env(argc, argv);
 
   ElliptProblem prob("ellipt");
   prob.initialize(INIT_ALL);
@@ -53,6 +53,5 @@ int main(int argc, char** argv)
   prob.solve(adaptInfo);
   prob.writeFiles(adaptInfo, true);
 
-  AMDiS::finalize();
   return 0;
 }
diff --git a/src/amdis/AMDiS.cpp b/src/amdis/AMDiS.cpp
deleted file mode 100644
index 5965d68b8f4e871b47bf4b9a8e32c0c2e0e2810e..0000000000000000000000000000000000000000
--- a/src/amdis/AMDiS.cpp
+++ /dev/null
@@ -1,31 +0,0 @@
-#include "AMDiS.hpp"
-
-// AMDiS includes
-#include <amdis/Initfile.hpp>
-#include <amdis/Output.hpp>
-
-namespace AMDiS
-{
-  Dune::MPIHelper& init(int& argc, char**& argv, std::string const& initFileName)
-  {
-    // Maybe initialize MPI
-    static Dune::MPIHelper& mpiHelper = Dune::MPIHelper::instance(argc, argv);
-
-    Parameters::clearData();
-
-    if (initFileName.empty() && argc > 1) {
-      Parameters::init(argv[1]);
-    } else if (!initFileName.empty()) {
-      Parameters::init(initFileName);
-    } else {
-      warning("No initfile specified. Using default values for all parameters.");
-    }
-
-    return mpiHelper;
-  }
-
-
-  void finalize()
-  {}
-
-} // end namespace AMDiS
diff --git a/src/amdis/AMDiS.hpp b/src/amdis/AMDiS.hpp
index 30149d545efdc53a6780c024d4fd34d40dce324b..274ff818048b9ba09065422816761d14934f8e73 100644
--- a/src/amdis/AMDiS.hpp
+++ b/src/amdis/AMDiS.hpp
@@ -4,16 +4,11 @@
 # include "config.h"
 #endif
 
-// std c++ headers
-#include <string>
-
-#include <dune/common/exceptions.hh> // We use exceptions
-#include <dune/common/parallel/mpihelper.hh>
-
-namespace AMDiS
-{
-  Dune::MPIHelper& init(int& argc, char**& argv, std::string const& initFileName = "");
-
-  void finalize();
-
-} // end namespace AMDiS
+#include <amdis/AdaptInfo.hpp>
+#include <amdis/Environment.hpp>
+#include <amdis/Initfile.hpp>
+#include <amdis/LinearAlgebra.hpp>
+#include <amdis/Output.hpp>
+#include <amdis/ProblemStat.hpp>
+
+namespace AMDiS {} // end namespace AMDiS
diff --git a/src/amdis/AdaptInfo.cpp b/src/amdis/AdaptInfo.cpp
index e71e6a6687e44642146ee2eaa6aced8b482d504a..eabe3bfe36a8810782ab1c3a6a587cd9b8b39a7a 100644
--- a/src/amdis/AdaptInfo.cpp
+++ b/src/amdis/AdaptInfo.cpp
@@ -1,3 +1,7 @@
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
 #include "AdaptInfo.hpp"
 
 // std c++ headers
diff --git a/src/amdis/AdaptInstationary.cpp b/src/amdis/AdaptInstationary.cpp
index add28e1de18789f05bfad69ac5dcbddc214c33a6..f5c4074e3b387621beb61d720e18667d0d1c5973 100644
--- a/src/amdis/AdaptInstationary.cpp
+++ b/src/amdis/AdaptInstationary.cpp
@@ -1,3 +1,7 @@
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
 #include "AdaptInstationary.hpp"
 
 // AMDiS includes
diff --git a/src/amdis/AdaptStationary.cpp b/src/amdis/AdaptStationary.cpp
index eb721da0c6cdd675420c68a6cd8bc4b5c043f0f1..fb596bdc5958f3896f7adda763d3a645ec4cae78 100644
--- a/src/amdis/AdaptStationary.cpp
+++ b/src/amdis/AdaptStationary.cpp
@@ -1,3 +1,7 @@
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
 #include "AdaptStationary.hpp"
 
 // AMDiS includes
diff --git a/src/amdis/CMakeLists.txt b/src/amdis/CMakeLists.txt
index d13f729273157a36b29e8265059b81940b22935d..4e00d254a12e8b1e8bf8752b3c160ca8ce163ea6 100644
--- a/src/amdis/CMakeLists.txt
+++ b/src/amdis/CMakeLists.txt
@@ -4,7 +4,7 @@ dune_library_add_sources(amdis SOURCES
     AdaptInfo.cpp
     AdaptInstationary.cpp
     AdaptStationary.cpp
-    AMDiS.cpp
+    Environment.cpp
     Initfile.cpp
     InitfileParser.cpp
     ProblemInstatBase.cpp
@@ -31,6 +31,7 @@ install(FILES
     DataTransfer.inc.hpp
     DirichletBC.hpp
     DirichletBC.inc.hpp
+    Environment.hpp
     FileWriter.hpp
     FileWriterInterface.hpp
     Flag.hpp
diff --git a/src/amdis/DataTransfer.inc.hpp b/src/amdis/DataTransfer.inc.hpp
index b6f01e9377ea03d15b7f68806fd13ff409db6e21..7376c961132aa6c6118d2df4f1b350eb35a4f90a 100644
--- a/src/amdis/DataTransfer.inc.hpp
+++ b/src/amdis/DataTransfer.inc.hpp
@@ -14,6 +14,7 @@
 #include <dune/common/fvector.hh>
 #include <dune/common/hash.hh>
 
+#include <dune/grid/common/geometry.hh>
 #include <dune/grid/common/mcmgmapper.hh>
 #include <dune/grid/common/rangegenerators.hh>
 
diff --git a/src/amdis/Environment.cpp b/src/amdis/Environment.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..08cd067c7e43f7df65e394af5dbf79588cf7683e
--- /dev/null
+++ b/src/amdis/Environment.cpp
@@ -0,0 +1,37 @@
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "Environment.hpp"
+
+// AMDiS includes
+#include <amdis/Initfile.hpp>
+#include <amdis/Output.hpp>
+
+namespace AMDiS
+{
+  Environment::Environment(std::string const& initFileName)
+  {
+    Parameters::clearData();
+    if (!initFileName.empty())
+      Parameters::init(initFileName);
+  }
+
+  Environment::Environment(int& argc, char**& argv, std::string const& initFileName)
+    : Environment(initFileName)
+  {
+    auto& helper = Dune::MPIHelper::instance(argc, argv);
+
+    auto& mpi = Mpi::instance();
+    mpi.registerMpiHelper(helper);
+
+    Parameters::clearData();
+    if (initFileName.empty()) {
+      if (argc > 1)
+        Parameters::init(argv[1]);
+      else
+        warning("No initfile specified. Using default values for all parameters.");
+    }
+  }
+
+} // end namespace AMDiS
diff --git a/src/amdis/Environment.hpp b/src/amdis/Environment.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..28ebeef5f86ad057c61a0837865300603ac3a5bf
--- /dev/null
+++ b/src/amdis/Environment.hpp
@@ -0,0 +1,72 @@
+#pragma once
+
+// std c++ headers
+#include <cassert>
+#include <string>
+
+#include <dune/common/parallel/mpihelper.hh>
+
+namespace AMDiS
+{
+  /// Establishes an environemnt for sequential and parallel AMDiS programs
+  /**
+   * This object initializes the MPI environement, parses initfiles and may
+   * initialize other external libraries. It is constructed with the program
+   * commandline arguments. In its destruction, the MPI environemnt is finalized.
+   * In the vast majority of AMDiS programs, an instance of Environemnt should
+   * be desclared at the very beginning of the main function.
+   **/
+  class Environment
+  {
+    // insternal static container holding a pointer to the Dune::MPIHelper.
+    struct Mpi
+    {
+      static Mpi& instance()
+      {
+        static Mpi mpi;
+        return mpi;
+      }
+
+      void registerMpiHelper(Dune::MPIHelper& mpiHelper)
+      {
+        mpiHelper_ = &mpiHelper;
+      }
+
+      int rank()
+      {
+        assert(mpiHelper_ != nullptr);
+        return mpiHelper_->rank();
+      }
+
+      int size()
+      {
+        assert(mpiHelper_ != nullptr);
+        return mpiHelper_->size();
+      }
+
+    private:
+      Dune::MPIHelper* mpiHelper_ = nullptr;
+    };
+
+  public:
+    /// Create an environment without mpi initialization, with a fixed initfile given as string
+    Environment(std::string const& initFileName = "");
+
+    /// Create an environemtn with initialization of MPI and initifiles from commandline arguments
+    /// or the provided initfile filename.
+    Environment(int& argc, char**& argv, std::string const& initFileName = "");
+
+    /// Return the MPI_Rank of the current processor.
+    static int mpiRank()
+    {
+      return Mpi::instance().rank();
+    }
+
+    /// Return the MPI_Size if the group created by Dune::MPIHelper.
+    static int mpiSize()
+    {
+      return Mpi::instance().size();
+    }
+  };
+
+} // end namespace AMDiS
diff --git a/src/amdis/Initfile.cpp b/src/amdis/Initfile.cpp
index 7dfb219c3c9faa134007bf603fe747034c0d5d4f..1bae7e2aa0d17ea14fd1aaed1f8d9737dd3222f8 100644
--- a/src/amdis/Initfile.cpp
+++ b/src/amdis/Initfile.cpp
@@ -1,4 +1,8 @@
-#include <amdis/Initfile.hpp>
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "Initfile.hpp"
 
 #include <amdis/InitfileParser.hpp>
 
diff --git a/src/amdis/InitfileParser.cpp b/src/amdis/InitfileParser.cpp
index 53d91095034f444383aaa77fe20ea623481dede8..39e6ab63469ad429fc13c6150b7177bda921e59e 100644
--- a/src/amdis/InitfileParser.cpp
+++ b/src/amdis/InitfileParser.cpp
@@ -1,4 +1,8 @@
-#include <amdis/InitfileParser.hpp>
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "InitfileParser.hpp"
 
 #include <amdis/Output.hpp>
 #include <amdis/common/Filesystem.hpp>
diff --git a/src/amdis/ProblemInstat.cpp b/src/amdis/ProblemInstat.cpp
index afbf06e06377ed0241700ceefbdf0e16c03aa03d..b98790c083e632b13dc0441649ad62326e5b145f 100644
--- a/src/amdis/ProblemInstat.cpp
+++ b/src/amdis/ProblemInstat.cpp
@@ -1,4 +1,7 @@
-#include "config.h"
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
 #include "ProblemInstat.hpp"
 
 namespace AMDiS
diff --git a/src/amdis/ProblemInstatBase.cpp b/src/amdis/ProblemInstatBase.cpp
index b29242de380707835dbe7833ef9b07136b68d335..cea43009a34e8fe04b493c48944877c4209de9d3 100644
--- a/src/amdis/ProblemInstatBase.cpp
+++ b/src/amdis/ProblemInstatBase.cpp
@@ -1,3 +1,7 @@
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
 #include "ProblemInstatBase.hpp"
 
 #include "AdaptInfo.hpp"
diff --git a/src/amdis/ProblemStat.cpp b/src/amdis/ProblemStat.cpp
index fabf702f1661afeacaedd0a3bdc654148f836d0f..d0397978204f5be854d4538fdd6330782e7695c2 100644
--- a/src/amdis/ProblemStat.cpp
+++ b/src/amdis/ProblemStat.cpp
@@ -1,4 +1,7 @@
-#include "config.h"
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
 #include "ProblemStat.hpp"
 
 namespace AMDiS
diff --git a/src/amdis/StandardProblemIteration.cpp b/src/amdis/StandardProblemIteration.cpp
index 0c6b5c661854a342a33779710ce7d3ef501b9fd2..5ab580f6f7351dec0730966b04c1ad01436cd45f 100644
--- a/src/amdis/StandardProblemIteration.cpp
+++ b/src/amdis/StandardProblemIteration.cpp
@@ -1,3 +1,7 @@
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
 #include "StandardProblemIteration.hpp"
 
 #include <amdis/AdaptInfo.hpp>
diff --git a/src/amdis/common/Filesystem.cpp b/src/amdis/common/Filesystem.cpp
index 77fddde1ff17a698900c76b3ea2a08cae41aa3b4..6889d955281bb60c335c57167095f0036b5583ff 100644
--- a/src/amdis/common/Filesystem.cpp
+++ b/src/amdis/common/Filesystem.cpp
@@ -1,3 +1,7 @@
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
 #include "Filesystem.hpp"
 
 #ifdef _WIN32
diff --git a/src/amdis/common/String.cpp b/src/amdis/common/String.cpp
index 6a5b28f959390cdc482b3a60f580cee6701a27a1..7b70d1d88d17d2e33a4548894a62729566a82747 100644
--- a/src/amdis/common/String.cpp
+++ b/src/amdis/common/String.cpp
@@ -1,3 +1,7 @@
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
 #include "String.hpp"
 
 namespace AMDiS
diff --git a/test/DOFVectorTest.cpp b/test/DOFVectorTest.cpp
index 61721ef05a6c2e1fd3bf95b396b4c35090a5a5db..36e7c0eb27789bac26ac90c8d7fed709c8a931cc 100644
--- a/test/DOFVectorTest.cpp
+++ b/test/DOFVectorTest.cpp
@@ -7,6 +7,7 @@
 #include <dune/functions/functionspacebases/powerbasis.hh>
 #include <dune/functions/functionspacebases/lagrangebasis.hh>
 
+#include <amdis/AMDiS.hpp>
 #include <amdis/GridTransferManager.hpp>
 #include <amdis/LinearAlgebra.hpp>
 
@@ -36,7 +37,7 @@ void test_dofvector(B const& basis, DOFVector<B,T>& vec)
 
 int main(int argc, char** argv)
 {
-  Dune::MPIHelper::instance(argc, argv);
+  Environment env(argc, argv);
 
   // create grid
   Dune::FieldVector<double, 2> L; L = 1.0;
diff --git a/test/DataTransferTest2d.cpp b/test/DataTransferTest2d.cpp
index 2f4e92b2f8393fb63a4f46610ff8f68d6fb773e3..a308cf8a9699e3e52ffa185cee7dedf56ed7ffd1 100644
--- a/test/DataTransferTest2d.cpp
+++ b/test/DataTransferTest2d.cpp
@@ -1,16 +1,17 @@
 
+#include <amdis/AMDiS.hpp>
 #include "DataTransferTest.hpp"
 
 int main(int argc, char** argv)
 {
+  Environment env(argc, argv);
+
 #ifdef HAVE_DUNE_UGGRID
   using Grid = Dune::UGGrid<2>;
 #else
   using Grid = Dune::YaspGrid<2>;
 #endif
 
-  Dune::MPIHelper::instance(argc, argv);
-
   using Domain = typename Dune::FieldVector<double, 2>;
 
   // polynomial of order 1
diff --git a/test/DataTransferTest3d.cpp b/test/DataTransferTest3d.cpp
index e1b818c7e6d20564419f6a6e81b27c724ee121ba..043fd66c6e4389af09793d6b72b3ade14eed4ac3 100644
--- a/test/DataTransferTest3d.cpp
+++ b/test/DataTransferTest3d.cpp
@@ -1,16 +1,17 @@
 
+#include <amdis/AMDiS.hpp>
 #include "DataTransferTest.hpp"
 
 int main(int argc, char** argv)
 {
+  Environment env(argc, argv);
+
 #ifdef HAVE_DUNE_UGGRID
   using Grid = Dune::UGGrid<3>;
 #else
   using Grid = Dune::YaspGrid<3>;
 #endif
 
-  Dune::MPIHelper::instance(argc, argv);
-
   using Domain = typename Dune::FieldVector<double, 3>;
 
   // polynomial of order 1
diff --git a/test/DiscreteFunctionTest.cpp b/test/DiscreteFunctionTest.cpp
index 93b6d39e7add91c4792d1ae5dfa882b03f32d2d1..e330eaaf96ed75ec1ea94920a5a93b10aacba8c0 100644
--- a/test/DiscreteFunctionTest.cpp
+++ b/test/DiscreteFunctionTest.cpp
@@ -33,7 +33,7 @@ bool comp(DOFVector<GB,T> const& U, DOFVector<GB,T> const& V)
 
 int main(int argc, char** argv)
 {
-  AMDiS::init(argc, argv);
+  Environment env(argc, argv);
 
   using namespace Dune::Indices;
 
@@ -129,6 +129,5 @@ int main(int argc, char** argv)
   AMDIS_TEST( comp(W3, W5) );
   AMDIS_TEST( comp(W3, W6) );
 
-  AMDiS::finalize();
   return 0;
 }
diff --git a/test/ExpressionsTest.cpp b/test/ExpressionsTest.cpp
index 7c2924ab7bb63ecfedfe09522dd585b0a3a66ae4..aa1ecae2532ef3811b80c5e3009d3d5b70470f6f 100644
--- a/test/ExpressionsTest.cpp
+++ b/test/ExpressionsTest.cpp
@@ -18,7 +18,7 @@ using ElliptProblem = ProblemStat<ElliptParam>;
 
 int main(int argc, char** argv)
 {
-  AMDiS::init(argc, argv);
+  Environment env(argc, argv);
 
   using namespace Dune::Indices;
 
@@ -103,6 +103,5 @@ int main(int argc, char** argv)
   DUNE_UNUSED auto int5 = integrate(op5, gv, 5);
   DUNE_UNUSED auto int6 = integrate(op6, gv, 5);
 
-  AMDiS::finalize();
   return 0;
 }
diff --git a/test/IntegrateTest.cpp b/test/IntegrateTest.cpp
index 539d870fce5a3ef28bb17b5d4d417138a84bf93f..76fe1570d9c89e4054752f362edb586ce99903e6 100644
--- a/test/IntegrateTest.cpp
+++ b/test/IntegrateTest.cpp
@@ -18,7 +18,7 @@ using ElliptProblem = ProblemStat<ElliptParam>;
 
 int main(int argc, char** argv)
 {
-  AMDiS::init(argc, argv);
+  Environment env(argc, argv);
 
   ElliptProblem prob("ellipt");
   prob.initialize(INIT_ALL);
@@ -40,6 +40,5 @@ int main(int argc, char** argv)
 
   AMDIS_TEST(i4 == 1.0);
 
-  AMDiS::finalize();
   return 0;
 }
diff --git a/test/MarkerTest.cpp b/test/MarkerTest.cpp
index 8448ef9cf4b9b4ab58c1d7d89357eddfd50ed6c3..10dd49289c3f150ec3603ae65dbc570c5f37ab3d 100644
--- a/test/MarkerTest.cpp
+++ b/test/MarkerTest.cpp
@@ -14,7 +14,7 @@ using DomainType = typename Dune::FieldVector<double,d>;
 
 int main(int argc, char** argv)
 {
-  AMDiS::init(argc, argv);
+  Environment env(argc, argv);
 
   DomainType lowerLeft; lowerLeft = 0.0;    // lower left grid corner
   DomainType upperRight; upperRight = 1.0;  // upper right grid corner
@@ -53,7 +53,5 @@ int main(int argc, char** argv)
   prob.solution().interpolate(markerFunc);
   prob.writeFiles(adaptInfo);
 
-  AMDiS::finalize();
-
   return report_errors();
 }
diff --git a/test/OperationsTest.cpp b/test/OperationsTest.cpp
index dfea8c331c8501204e51fc45e59d2f43653d5ac2..e64b46aa795204633ce0e2bd8a08f74384065cc4 100644
--- a/test/OperationsTest.cpp
+++ b/test/OperationsTest.cpp
@@ -11,7 +11,7 @@ using namespace AMDiS;
 
 int main(int argc, char** argv)
 {
-  AMDiS::init(argc, argv);
+  Environment env(argc, argv);
 
   constexpr Operation::StaticConstant<int,0> op0a;
   constexpr Operation::Zero op0b;
@@ -77,6 +77,5 @@ int main(int argc, char** argv)
   AMDIS_TEST_EQ(erg8, 2);
   // constexpr int order8 = order(op8,2,3); // no order() for divides
 
-  AMDiS::finalize();
   return report_errors();
 }
diff --git a/test/OperatorsTest.cpp b/test/OperatorsTest.cpp
index b52fb9728e28af961a986034162dff6d5486d9ce..da142e9ac42b80d528d63a25e685960a25b077a6 100644
--- a/test/OperatorsTest.cpp
+++ b/test/OperatorsTest.cpp
@@ -15,7 +15,7 @@ using Problem = ProblemStat<Param>;
 
 int main(int argc, char** argv)
 {
-  AMDiS::init(argc, argv);
+  Environment env(argc, argv);
 
   using namespace Dune::Indices;
 
@@ -109,6 +109,5 @@ int main(int argc, char** argv)
   prob.addMatrixOperator(opCDb, _p, _p);
   prob.addVectorOperator(opCDb, _p);
 
-  AMDiS::finalize();
   return 0;
 }