diff --git a/src/amdis/ProblemInstatBase.hpp b/src/amdis/ProblemInstatBase.hpp
index 84b644e82e257a6fc57b17b3a6f9a150148ba589..37aa8cb9081254af702fc115c614e05e77deef1c 100644
--- a/src/amdis/ProblemInstatBase.hpp
+++ b/src/amdis/ProblemInstatBase.hpp
@@ -58,6 +58,18 @@ namespace AMDiS
       return 0;
     }
 
+    /// Implementation of \ref ProblemStatBase::globalCoarsen().
+    virtual Flag globalCoarsen(int n) override
+    {
+      return 0;
+    }
+
+    /// Implementation of \ref ProblemStatBase::globalRefine().
+    virtual Flag globalRefine(int n) override
+    {
+      return 0;
+    }
+
     /// Implementation of \ref ProblemTimeInterface::closeTimestep().
     virtual void closeTimestep(AdaptInfo&) override { /* do nothing */ }
 
diff --git a/src/amdis/ProblemStat.hpp b/src/amdis/ProblemStat.hpp
index 7d028f8256e8c6ca1b20c7029b86fd9421e31bd9..b1fa1d754f0954ef125b53aaf62ec84afa422219 100644
--- a/src/amdis/ProblemStat.hpp
+++ b/src/amdis/ProblemStat.hpp
@@ -429,6 +429,11 @@ namespace AMDiS
     /// Implementation of \ref ProblemStatBase::markElements.
     virtual Flag markElements(AdaptInfo& adaptInfo) override;
 
+    /// Uniform global grid coarsening by up to n level
+    virtual Flag globalCoarsen(int n) override;
+
+    /// Uniform global refinement by n level
+    virtual Flag globalRefine(int n) override;
 
   private:
     /// Name of this problem.
diff --git a/src/amdis/ProblemStat.inc.hpp b/src/amdis/ProblemStat.inc.hpp
index f1ff89b05ec1e286bf1b8e07ecdc36af386c3547..b53c41027721628c81c9c3125beccdf472be69ff 100644
--- a/src/amdis/ProblemStat.inc.hpp
+++ b/src/amdis/ProblemStat.inc.hpp
@@ -354,6 +354,57 @@ markElements(AdaptInfo& adaptInfo)
 }
 
 
+template <class Traits>
+Flag ProblemStat<Traits>::
+globalCoarsen(int n)
+{
+  Dune::Timer t;
+  bool adapted = false;
+  for (int i = 0; i < n; ++i) {
+    // mark all entities for grid refinement
+    for (const auto& element : elements(grid_->leafGridView()))
+      grid_->mark(-1, element);
+
+    adapted |= GridTransferManager::adapt(*grid_);
+    globalBasis_->update(gridView());
+  }
+
+  msg("globalCoarsen needed {} seconds", t.elapsed());
+  return adapted ? MESH_ADAPTED : Flag(0);
+}
+
+
+// grid has globalRefine(int, AdaptDataHandleInterface&)
+template <class G>
+using HasGlobalRefineADHI = decltype(std::declval<G>().globalRefine(1,std::declval<GridTransfer<G>&>()));
+
+template <class Traits>
+Flag ProblemStat<Traits>::
+globalRefine(int refCount)
+{
+  Dune::Timer t;
+  bool adapted = false;
+  Dune::Hybrid::ifElse(Dune::Std::is_detected<HasGlobalRefineADHI, Grid>{},
+  /*then*/ [&](auto id) {
+    id(grid_)->globalRefine(refCount, GridTransferManager::gridTransfer(*grid_));
+    globalBasis_->update(this->gridView());
+  },
+  /*else*/ [&](auto id) {
+    for (int i = 0; i < refCount; ++i) {
+      // mark all entities for grid refinement
+      for (const auto& element : elements(grid_->leafGridView()))
+        grid_->mark(1, element);
+
+      adapted |= GridTransferManager::adapt(*id(grid_));
+      globalBasis_->update(this->gridView());
+    }
+  });
+
+  msg("globalRefine needed {} seconds", t.elapsed());
+  return adapted ? MESH_ADAPTED : Flag(0);
+}
+
+
 template <class Traits>
 Flag ProblemStat<Traits>::
 adaptGrid(AdaptInfo& adaptInfo)
diff --git a/src/amdis/ProblemStatBase.hpp b/src/amdis/ProblemStatBase.hpp
index 7c44f1bf7b0b8627f9af91d15af780a5b2bcf70b..81f4a7cf827aefb800396906e0c1ec161321d39f 100644
--- a/src/amdis/ProblemStatBase.hpp
+++ b/src/amdis/ProblemStatBase.hpp
@@ -74,6 +74,14 @@ namespace AMDiS
     /// Refinement/coarsening of the grid.
     virtual Flag adaptGrid(AdaptInfo& adaptInfo) = 0;
 
+    /// Uniform global grid coarsening by up to n level.
+    /// Returns MESH_ADAPTED if grid was changed
+    virtual Flag globalCoarsen(int n) = 0;
+
+    /// Uniform global refinement by n level
+    /// Returns MESH_ADAPTED if grid was changed
+    virtual Flag globalRefine(int n) = 0;
+
     /** \brief
      * Solves the assembled system. The result is an approximative solution.
      * The last two boolean arguments can be used to controll successive