diff --git a/dune/solvers/iterationsteps/obstacletnnmgstep.hh b/dune/solvers/iterationsteps/obstacletnnmgstep.hh
index 09e2db71ede931b1b27d5314f01c2bf6a00bb6b9..009ffcf32d8eb1dba487645cf42c419baf2b697f 100644
--- a/dune/solvers/iterationsteps/obstacletnnmgstep.hh
+++ b/dune/solvers/iterationsteps/obstacletnnmgstep.hh
@@ -67,7 +67,7 @@ class ObstacleTNNMGStep
         typedef typename Dune::BitSetVector<VectorType::block_type::dimension> BitVector;
 
         typedef MultigridTransfer<Vector, BitVector, Matrix> Transfer;
-        typedef typename std::vector<Transfer*> TransferPointerVector;
+        typedef typename std::vector<std::shared_ptr<Transfer>> TransferPointerVector;
 
     protected:
 
diff --git a/dune/solvers/test/multigridtest.cc b/dune/solvers/test/multigridtest.cc
index d387649ef0b828b09dacb934eb5595ae7475bbde..ea5fa69b75d1fd9ee298f36de27747ee70ea6373 100644
--- a/dune/solvers/test/multigridtest.cc
+++ b/dune/solvers/test/multigridtest.cc
@@ -55,10 +55,13 @@ struct MultigridTestSuite
         typedef MultigridTransfer<Vector, BitVector, Matrix> Transfer;
         typedef CompressedMultigridTransfer<Vector, BitVector, Matrix> TransferImplementation;
 
-        // create transfer operators from level i to i+1 (note that this will only work for either uniformly refined grids or adaptive grids with RefinementType=COPY)
-        std::vector<Transfer> transfer(grid.maxLevel());
-        for (size_t i = 0; i < transfer.size(); ++i) {
-            transfer[i].setup(grid, i, i+1);
+        std::vector<std::shared_ptr<Transfer>> transfer(grid.maxLevel());
+        for (size_t i = 0; i < transfer.size(); ++i)
+        {
+            // create transfer operators from level i to i+1 (note that this will only work for either uniformly refined grids or adaptive grids with RefinementType=COPY)
+            auto t = std::make_shared<TransferImplementation>();
+            t->setup(grid, i, i+1);
+            transfer[i] = t;
         }
 
         // set up smoothers and basesolver
diff --git a/dune/solvers/test/obstacletnnmgtest.cc b/dune/solvers/test/obstacletnnmgtest.cc
index d7a55e48f0244f9a92d5d227269b4b96050482e9..23858a85b5d310297d36d13fc1a9a1d043c7d16c 100644
--- a/dune/solvers/test/obstacletnnmgtest.cc
+++ b/dune/solvers/test/obstacletnnmgtest.cc
@@ -53,12 +53,11 @@ void solveObstacleProblemByTNNMG(const GridType& grid, const MatrixType& mat, Ve
 
     const int blockSize = VectorType::block_type::dimension;
 
-    // we need a vector of pointers to the transfer operator base class
-    std::vector<Transfer*> transfer(grid.maxLevel());
+    std::vector<std::shared_ptr<Transfer>> transfer(grid.maxLevel());
     for (size_t i = 0; i < transfer.size(); ++i)
     {
-        // create transfer operator from level i to i+1
-        TransferImplementation* t = new TransferImplementation;
+        // create transfer operators from level i to i+1
+        auto t = std::make_shared<TransferImplementation>();
         t->setup(grid, i, i+1);
         transfer[i] = t;
     }