diff --git a/src/amdis/GridTransferManager.hpp b/src/amdis/GridTransferManager.hpp
index 55c95550a92f282866dbcaee4c6050fda1277ff3..554d9e778f18dddbf4dc56ab25a99e1d9011a5a6 100644
--- a/src/amdis/GridTransferManager.hpp
+++ b/src/amdis/GridTransferManager.hpp
@@ -36,12 +36,14 @@ namespace AMDiS
      * Takes a grid as argument. Marking of the grid needs to be performed prior to calling this.
      * Returns true if the grid changed during adaptation.
      **/
-    template <class Grid>
-    static bool adapt(Grid& grid)
+    template <class Grid, class ...Bases>
+    static bool adapt(Grid& grid, Bases&... bases)
     {
       auto gridTransfer = GridTransferManager::gridTransfer(grid);
       bool adapted = gridTransfer.preAdapt();
       adapted |= gridTransfer.adapt();
+      // call basis.update(basis.gridView()) on all bases
+      (void)std::initializer_list<int>({0, (bases.update(bases.gridView()),0)...});
       gridTransfer.postAdapt();
       return adapted;
     }
diff --git a/src/amdis/ProblemStat.inc.hpp b/src/amdis/ProblemStat.inc.hpp
index b53c41027721628c81c9c3125beccdf472be69ff..50058ccfaf357d662aee26391e6c204ee6643809 100644
--- a/src/amdis/ProblemStat.inc.hpp
+++ b/src/amdis/ProblemStat.inc.hpp
@@ -365,8 +365,7 @@ globalCoarsen(int n)
     for (const auto& element : elements(grid_->leafGridView()))
       grid_->mark(-1, element);
 
-    adapted |= GridTransferManager::adapt(*grid_);
-    globalBasis_->update(gridView());
+    adapted |= GridTransferManager::adapt(*grid_, *globalBasis_);
   }
 
   msg("globalCoarsen needed {} seconds", t.elapsed());
@@ -386,6 +385,7 @@ globalRefine(int refCount)
   bool adapted = false;
   Dune::Hybrid::ifElse(Dune::Std::is_detected<HasGlobalRefineADHI, Grid>{},
   /*then*/ [&](auto id) {
+    // TODO(FM): Add a way to pass a GridTransfer as ADH with *globalBasis_ argument
     id(grid_)->globalRefine(refCount, GridTransferManager::gridTransfer(*grid_));
     globalBasis_->update(this->gridView());
   },
@@ -395,8 +395,7 @@ globalRefine(int refCount)
       for (const auto& element : elements(grid_->leafGridView()))
         grid_->mark(1, element);
 
-      adapted |= GridTransferManager::adapt(*id(grid_));
-      globalBasis_->update(this->gridView());
+      adapted |= GridTransferManager::adapt(*id(grid_), *id(globalBasis_));
     }
   });
 
@@ -411,8 +410,7 @@ adaptGrid(AdaptInfo& adaptInfo)
 {
   Dune::Timer t;
 
-  bool adapted = GridTransferManager::adapt(*grid_);
-  globalBasis_->update(gridView());
+  bool adapted = GridTransferManager::adapt(*grid_, *globalBasis_);
 
   msg("adaptGrid needed {} seconds", t.elapsed());
   return adapted ? MESH_ADAPTED : Flag(0);
diff --git a/test/DOFVectorTest.cpp b/test/DOFVectorTest.cpp
index 288981fcb3b66658c686a8893bd532e8710b4050..2f883436d854db6ecce3ba64af3706064542b831 100644
--- a/test/DOFVectorTest.cpp
+++ b/test/DOFVectorTest.cpp
@@ -74,7 +74,7 @@ int main(int argc, char** argv)
     test_dofvector(basis, vec1);
     for (auto const& e : elements(gridView))
       grid.mark(1, e);
-    GridTransferManager::adapt(grid);
+    GridTransferManager::adapt(grid, basis);
     AMDIS_TEST_EQ(vec1.size(), basis.dimension());
   }