diff --git a/dune/vtk/datacollectors/yaspdatacollector.hh b/dune/vtk/datacollectors/yaspdatacollector.hh
index fbfe881d07181081871e80613313e553893d2757..d1dfa07039764d03cc868b89e459191564cd2f2f 100644
--- a/dune/vtk/datacollectors/yaspdatacollector.hh
+++ b/dune/vtk/datacollectors/yaspdatacollector.hh
@@ -26,7 +26,7 @@ public:
     , extent_(filledArray<6,int>(0))
     , origin_(0.0)
     , spacing_(0.0)
-    , level_(gridView.template begin<0,All_Partition>()->level())
+    , level_(0)
   {}
 
   std::array<int, 6> const& wholeExtentImpl () const
@@ -53,12 +53,13 @@ public:
   {
     Super::updateImpl();
 
+    level_ = gridView_.template begin<0,All_Partition>()->level();
     for (int i = 0; i < dim; ++i) {
       wholeExtent_[2*i] = 0;
-      wholeExtent_[2*i+1] = grid(gridView_).levelSize(level_,i);
+      wholeExtent_[2*i+1] = grid(gridView_.grid()).levelSize(level_,i);
     }
 
-    auto const& gl = *grid(gridView_).begin(level_);
+    auto const& gl = *grid(gridView_.grid()).begin(level_);
     auto const& g = gl.interior[0];
     auto const& gc = *g.dataBegin();
     for (int i = 0; i < dim; ++i) {
@@ -66,7 +67,7 @@ public:
       extent_[2*i+1] = gc.max(i)+1;
     }
 
-    auto it = grid(gridView_).begin(level_);
+    auto it = grid(gridView_.grid()).begin(level_);
     initGeometry(it->coords);
   }
 
@@ -99,7 +100,7 @@ public:
   template <class T>
   std::array<std::vector<T>, 3> coordinatesImpl () const
   {
-    auto it = grid(gridView_).begin(level_);
+    auto it = grid(gridView_.grid()).begin(level_);
     auto const& coords = it->coords;
 
     std::array<std::vector<T>, 3> ordinates{};
@@ -122,18 +123,18 @@ private:
   template <class G>
   using HostGrid = decltype(std::declval<G>().hostGrid());
 
-  template <class GV,
-    std::enable_if_t<Std::is_detected<HostGrid, typename GV::Grid>::value, int> = 0>
-  auto const& grid (GV const& gridView) const
+  template <class G,
+    std::enable_if_t<not Std::is_detected<HostGrid, G>::value, int> = 0>
+  auto const& grid (G const& g) const
   {
-    return gridView.grid().hostGrid();
+    return g;
   }
 
-  template <class GV,
-    std::enable_if_t<not Std::is_detected<HostGrid, typename GV::Grid>::value, int> = 0>
-  auto const& grid (GV const& gridView) const
+  template <class G,
+    std::enable_if_t<Std::is_detected<HostGrid, G>::value, int> = 0>
+  auto const& grid (G const& g) const
   {
-    return gridView.grid();
+    return grid(g.hostGrid());
   }
 
 protected:
diff --git a/dune/vtk/vtkwriter.hh b/dune/vtk/vtkwriter.hh
index 52f5eb910d6dbaf78540327e0857291f135c0ce0..99e299cb5304abf308965d89f9dbf84d7c89a79e 100644
--- a/dune/vtk/vtkwriter.hh
+++ b/dune/vtk/vtkwriter.hh
@@ -41,19 +41,19 @@ namespace Dune
 
   namespace Impl
   {
-    // A structured grid with constant spacing in x, y, and z direction.
+    // A structured grid with coordinates in x, y, and z direction with arbitrary spacing
     template <class GridView, int dim, class Coordinates>
     struct VtkWriterImpl<GridView, YaspGrid<dim,Coordinates>>
     {
-      using type = VtkImageDataWriter<GridView, YaspDataCollector<GridView>>;
+      using type = VtkRectilinearGridWriter<GridView, YaspDataCollector<GridView>>;
     };
 
 #if HAVE_DUNE_SPGRID
-    // A structured grid with constant spacing in x, y, and z direction.
+    // A structured grid with coordinates in x, y, and z direction with arbitrary spacing
     template <class GridView, class ct, int dim, template <int> class Ref, class Comm>
     struct VtkWriterImpl<GridView, SPGrid<ct,dim,Ref,Comm>>
     {
-      using type = VtkImageDataWriter<GridView, SPDataCollector<GridView>>;
+      using type = VtkRectilinearGridWriter<GridView, SPDataCollector<GridView>>;
     };
 #endif