diff --git a/dumux/io/grid/gridmanager_yasp.hh b/dumux/io/grid/gridmanager_yasp.hh
index 532e17bc5ecfbb043b3a20a931e2fc3b0cb72765..3b7f8a9517682f3f353ad787278e15b79cbe8d97 100644
--- a/dumux/io/grid/gridmanager_yasp.hh
+++ b/dumux/io/grid/gridmanager_yasp.hh
@@ -50,12 +50,14 @@ namespace Dumux {
  * - Refinement : the number of global refines to apply initially.
  *
  */
-template<class ct, int dim>
-class GridManager<Dune::YaspGrid<dim, Dune::EquidistantCoordinates<ct, dim> >>
-: public GridManagerBase<Dune::YaspGrid<dim, Dune::EquidistantCoordinates<ct, dim> > >
+template<class Coordinates, int dim>
+class GridManager<Dune::YaspGrid<dim, Coordinates>>
+: public GridManagerBase<Dune::YaspGrid<dim, Coordinates>>
 {
+    using ct = typename Dune::YaspGrid<dim, Coordinates>::ctype;
+    using GlobalPosition = Dune::FieldVector<ct, dim>;
 public:
-    using Grid = typename Dune::YaspGrid<dim, Dune::EquidistantCoordinates<ct, dim> >;
+    using Grid = typename Dune::YaspGrid<dim, Coordinates>;
     using ParentType = GridManagerBase<Grid>;
 
     /*!
@@ -74,9 +76,8 @@ public:
         // Then look for the necessary keys to construct from the input file
         else if (hasParamInGroup(modelParamGroup, "Grid.UpperRight"))
         {
-
             // get the upper right corner coordinates
-            const auto upperRight = getParamFromGroup<Dune::FieldVector<ct, dim>>(modelParamGroup, "Grid.UpperRight");
+            const auto upperRight = getParamFromGroup<GlobalPosition>(modelParamGroup, "Grid.UpperRight");
 
             // number of cells in each direction
             std::array<int, dim> cells; cells.fill(1);
@@ -90,18 +91,8 @@ public:
             const int overlap =  getParamFromGroup<int>(modelParamGroup, "Grid.Overlap", 1);
 
             // make the grid
-            if (!hasParamInGroup(modelParamGroup, "Grid.Partitioning"))
-            {
-                // construct using default load balancing
-                ParentType::gridPtr() = std::make_shared<Grid>(upperRight, cells, periodic, overlap);
-            }
-            else
-            {
-                // construct using user defined partitioning
-                const auto partitioning = getParamFromGroup<std::array<int, dim>>(modelParamGroup, "Grid.Partitioning");
-                Dune::YaspFixedSizePartitioner<dim> lb(partitioning);
-                ParentType::gridPtr() = std::make_shared<Grid>(upperRight, cells, periodic, overlap, typename Grid::CollectiveCommunicationType(), &lb);
-            }
+            ParentType::gridPtr() = createGrid_(modelParamGroup, upperRight, cells, periodic, overlap, Coordinates{});
+
             postProcessing_(modelParamGroup);
         }
 
@@ -118,102 +109,55 @@ public:
 
 private:
     /*!
-     * \brief Postprocessing for YaspGrid
+     * \brief Create a grid with zero offset
      */
-    void postProcessing_(const std::string& modelParamGroup)
+    std::unique_ptr<Grid> createGrid_(const std::string& modelParamGroup,
+                                      const GlobalPosition& upperRight,
+                                      const std::array<int, dim>& cells,
+                                      const std::bitset<dim>& periodic,
+                                      const int overlap,
+                                      Dune::EquidistantCoordinates<ct, dim>) const
     {
-        // Check if should refine the grid
-        bool keepPhysicalOverlap = getParamFromGroup<bool>(modelParamGroup, "Grid.KeepPhysicalOverlap", true);
-        ParentType::grid().refineOptions(keepPhysicalOverlap);
-        ParentType::maybeRefineGrid(modelParamGroup);
-        ParentType::loadBalance();
+        if (!hasParamInGroup(modelParamGroup, "Grid.Partitioning"))
+        {
+            // construct using default load balancing
+            return std::make_unique<Grid>(upperRight, cells, periodic, overlap);
+        }
+        else
+        {
+            // construct using user defined partitioning
+            const auto partitioning = getParamFromGroup<std::array<int, dim>>(modelParamGroup, "Grid.Partitioning");
+            Dune::YaspFixedSizePartitioner<dim> lb(partitioning);
+            return std::make_unique<Grid>(upperRight, cells, periodic, overlap, typename Grid::CollectiveCommunicationType(), &lb);
+        }
     }
-};
-
-/*!
- * \brief Provides a grid manager for YaspGrids with non-zero offset
- *        from information in the input file
- *
- * All keys are expected to be in group GridParameterGroup.
- * The following keys are recognized:
- * - LowerLeft : lower left corner coordinates
- * - UpperRight : upper right corner coordinates
- * - Cells : the number of cells in each direction
- * - Periodic : true or false for each direction
- * - Overlap : overlap size in cells
- * - Partitioning : a non-standard load-balancing, number of processors per direction
- * - KeepPyhsicalOverlap : whether to keep the physical overlap
- *     in physical size or in number of cells upon refinement
- * - Refinement : the number of global refines to apply initially.
- *
- */
-template<class ct, int dim>
-class GridManager<Dune::YaspGrid<dim, Dune::EquidistantOffsetCoordinates<ct, dim>>>
-: public GridManagerBase<Dune::YaspGrid<dim, Dune::EquidistantOffsetCoordinates<ct, dim>>>
-{
-public:
-    using Grid = typename Dune::YaspGrid<dim, Dune::EquidistantOffsetCoordinates<ct, dim>>;
-    using ParentType = GridManagerBase<Grid>;
 
     /*!
-     * \brief Make the grid. This is implemented by specializations of this method.
+     * \brief Create a grid with non-zero offset
      */
-    void init(const std::string& modelParamGroup = "")
+    std::unique_ptr<Grid> createGrid_(const std::string& modelParamGroup,
+                                      const GlobalPosition& upperRight,
+                                      const std::array<int, dim>& cells,
+                                      const std::bitset<dim>& periodic,
+                                      const int overlap,
+                                      Dune::EquidistantOffsetCoordinates<ct, dim>) const
     {
-        // First try to create it from a DGF file in GridParameterGroup.File
-        if (hasParamInGroup(modelParamGroup, "Grid.File"))
-        {
-            ParentType::makeGridFromDgfFile(getParamFromGroup<std::string>(modelParamGroup, "Grid.File"));
-            postProcessing_(modelParamGroup);
-            return;
-        }
+        const auto lowerLeft = getParamFromGroup<GlobalPosition>(modelParamGroup, "Grid.LowerLeft", GlobalPosition(0.0));
 
-        // Then look for the necessary keys to construct from the input file
-        else if (hasParamInGroup(modelParamGroup, "Grid.UpperRight"))
+        if (!hasParamInGroup(modelParamGroup, "Grid.Partitioning"))
         {
-            using GlobalPosition = Dune::FieldVector<ct, dim>;
-            const auto upperRight = getParamFromGroup<GlobalPosition>(modelParamGroup, "Grid.UpperRight");
-            const auto lowerLeft = getParamFromGroup<GlobalPosition>(modelParamGroup, "Grid.LowerLeft", GlobalPosition(0.0));
-
-            // number of cells in each direction
-            std::array<int, dim> cells; cells.fill(1);
-            cells = getParamFromGroup<std::array<int, dim>>(modelParamGroup, "Grid.Cells", cells);
-
-            // \todo TODO periodic boundaries with yasp (the periodicity concept of yasp grid is currently not supported, use dune-spgrid)
-            // const auto periodic = getParamFromGroup<std::bitset<dim>>(modelParamGroup, "Grid.Periodic", std::bitset<dim>());
-            const std::bitset<dim> periodic;
-
-            // get the overlap dependent on some template parameters
-            const int overlap = getParamFromGroup<int>(modelParamGroup, "Grid.Overlap", 1);
-
-            // make the grid
-            if (!hasParamInGroup(modelParamGroup, "Grid.Partitioning"))
-            {
-                // construct using default load balancing
-                ParentType::gridPtr() = std::make_shared<Grid>(lowerLeft, upperRight, cells, periodic, overlap);
-            }
-            else
-            {
-                // construct using user defined partitioning
-                const auto partitioning = getParamFromGroup<std::array<int, dim>>(modelParamGroup, "Grid.Partitioning");
-                Dune::YaspFixedSizePartitioner<dim> lb(partitioning);
-                ParentType::gridPtr() = std::make_shared<Grid>(lowerLeft, upperRight, cells, periodic, overlap, typename Grid::CollectiveCommunicationType(), &lb);
-            }
-            postProcessing_(modelParamGroup);
+            // construct using default load balancing
+            return std::make_unique<Grid>(lowerLeft, upperRight, cells, periodic, overlap);
         }
-
-        // Didn't find a way to construct the grid
         else
         {
-            const auto prefix = modelParamGroup == "" ? modelParamGroup : modelParamGroup + ".";
-            DUNE_THROW(ParameterException, "Please supply one of the parameters "
-                                           << prefix + "Grid.UpperRight"
-                                           << ", or a grid file in " << prefix + "Grid.File");
-
+            // construct using user defined partitioning
+            const auto partitioning = getParamFromGroup<std::array<int, dim>>(modelParamGroup, "Grid.Partitioning");
+            Dune::YaspFixedSizePartitioner<dim> lb(partitioning);
+            return std::make_unique<Grid>(lowerLeft, upperRight, cells, periodic, overlap, typename Grid::CollectiveCommunicationType(), &lb);
         }
     }
 
-private:
     /*!
      * \brief Postprocessing for YaspGrid
      */