diff --git a/dune/gdt/discretefunction/default.hh b/dune/gdt/discretefunction/default.hh
index c9c0c56b959d6e2a0ca2de976525f493befb0b5a..8aa4ebe290e48290016967e0d8cc4e28aa9a5a71 100644
--- a/dune/gdt/discretefunction/default.hh
+++ b/dune/gdt/discretefunction/default.hh
@@ -110,6 +110,11 @@ struct static_for_loop<last_factor_index, last_factor_index>
   }
 };
 
+template <bool /*is_product_space*/>
+struct ChooseVisualize
+{
+};
+
 
 } // namespace internal
 
@@ -196,8 +201,7 @@ public:
    * \brief Visualizes the function using Dune::Stuff::LocalizableFunctionInterface::visualize on the grid view
    *        associated with the space.
    * \sa    Dune::Stuff::LocalizableFunctionInterface::visualize
-   * \note  Subsampling is disabled for Finite Volume functions and enabled by default for functions of order higher
-   *        than one.
+   * \note  Subsampling is enabled by default for functions of order greater than one.
    */
   void visualize(const std::string filename, const bool subsampling = (SpaceType::polOrder > 1),
                  const VTK::OutputType vtk_output_type = VTK::appendedraw) const
@@ -209,7 +213,12 @@ public:
                  const bool subsampling                = (SpaceType::polOrder > 1),
                  const VTK::OutputType vtk_output_type = VTK::appendedraw) const
   {
-    redirect_visualize(space(), filename_prefix, filename_suffix, subsampling, vtk_output_type);
+    redirect_visualize(space(),
+                       filename_prefix,
+                       filename_suffix,
+                       subsampling,
+                       vtk_output_type,
+                       internal::ChooseVisualize<is_product_space<SpaceType>::value>());
   }
 
   template <size_t ii>
@@ -230,16 +239,16 @@ protected:
   template <class S, size_t d, size_t r, size_t rC>
   void redirect_visualize(const SpaceInterface<S, d, r, rC>& space, const std::string filename_prefix,
                           const std::string filename_suffix, const bool subsampling,
-                          const VTK::OutputType vtk_output_type) const
+                          const VTK::OutputType vtk_output_type, const internal::ChooseVisualize<false>&) const
   {
     BaseType::template visualize<typename SpaceType::GridViewType>(
         space.grid_view(), filename_prefix + filename_suffix, subsampling, vtk_output_type);
   } // ... redirect_visualize(...)
 
   template <class S, size_t d, size_t r, size_t rC>
-  void redirect_visualize(const ProductSpaceInterface<S, d, r, rC>& /*space*/, const std::string filename_prefix,
+  void redirect_visualize(const SpaceInterface<S, d, r, rC>& /*space*/, const std::string filename_prefix,
                           const std::string filename_suffix, const bool subsampling,
-                          const VTK::OutputType vtk_output_type) const
+                          const VTK::OutputType vtk_output_type, const internal::ChooseVisualize<true>&) const
   {
     internal::static_for_loop<0, ProductSpaceInterface<S, d, r, rC>::num_factors>::visualize(
         filename_prefix, filename_suffix, subsampling, vtk_output_type, *this);
diff --git a/dune/gdt/playground/spaces/dg/pdelabproduct.hh b/dune/gdt/playground/spaces/dg/pdelabproduct.hh
index 0388c4cb010876e60f4723a38297076511dd1ee1..2be6ebb2995a8c9335f75a58dc45bdb8500bfb5e 100644
--- a/dune/gdt/playground/spaces/dg/pdelabproduct.hh
+++ b/dune/gdt/playground/spaces/dg/pdelabproduct.hh
@@ -66,17 +66,20 @@ public:
 
 template <class GridViewImp, int polynomialOrder, class RangeFieldImp, size_t rangeDim>
 class PdelabBasedProduct<GridViewImp, polynomialOrder, RangeFieldImp, rangeDim, 1>
-    : public Dune::GDT::ProductSpaceInterface<internal::PdelabBasedProductTraits<GridViewImp, polynomialOrder,
+    : public Dune::GDT::SpaceInterface<internal::PdelabBasedProductTraits<GridViewImp, polynomialOrder, RangeFieldImp,
+                                                                          rangeDim, 1>,
+                                       GridViewImp::dimension, rangeDim, 1>,
+      public Dune::GDT::ProductSpaceInterface<internal::PdelabBasedProductTraits<GridViewImp, polynomialOrder,
                                                                                  RangeFieldImp, rangeDim, 1>,
                                               GridViewImp::dimension, rangeDim, 1>
 {
   typedef PdelabBasedProduct<GridViewImp, polynomialOrder, RangeFieldImp, rangeDim, 1> ThisType;
-  typedef typename Dune::GDT::ProductSpaceInterface<internal::PdelabBasedProductTraits<GridViewImp, polynomialOrder,
-                                                                                       RangeFieldImp, rangeDim, 1>,
-                                                    GridViewImp::dimension, rangeDim, 1> BaseType;
+  typedef typename Dune::GDT::SpaceInterface<internal::PdelabBasedProductTraits<GridViewImp, polynomialOrder,
+                                                                                RangeFieldImp, rangeDim, 1>,
+                                             GridViewImp::dimension, rangeDim, 1> BaseType;
 
 public:
-  using typename BaseType::Traits;
+  typedef typename internal::PdelabBasedProductTraits<GridViewImp, polynomialOrder, RangeFieldImp, rangeDim, 1> Traits;
   using typename BaseType::GridViewType;
   using typename BaseType::EntityType;
   using typename BaseType::BaseFunctionSetType;
diff --git a/dune/gdt/spaces/fv/defaultproduct.hh b/dune/gdt/spaces/fv/defaultproduct.hh
index 82e78da761b3002de11b0d06f716fd74ecb86264..c3cb7cdc67c21eac225dade1bae6cad2def90a0f 100644
--- a/dune/gdt/spaces/fv/defaultproduct.hh
+++ b/dune/gdt/spaces/fv/defaultproduct.hh
@@ -53,13 +53,15 @@ public:
 
 template <class GridViewImp, class RangeFieldImp, size_t rangeDim>
 class DefaultProduct<GridViewImp, RangeFieldImp, rangeDim, 1>
-    : public Dune::GDT::Spaces::ProductFVInterface<internal::DefaultProductTraits<GridViewImp, RangeFieldImp, rangeDim,
+    : public Dune::GDT::Spaces::FVInterface<internal::DefaultProductTraits<GridViewImp, RangeFieldImp, rangeDim, 1>,
+                                            GridViewImp::dimension, rangeDim, 1>,
+      public Dune::GDT::Spaces::ProductFVInterface<internal::DefaultProductTraits<GridViewImp, RangeFieldImp, rangeDim,
                                                                                   1>,
                                                    GridViewImp::dimension, rangeDim, 1>
 {
   typedef DefaultProduct<GridViewImp, RangeFieldImp, rangeDim, 1> ThisType;
-  typedef Dune::GDT::Spaces::ProductFVInterface<internal::DefaultProductTraits<GridViewImp, RangeFieldImp, rangeDim, 1>,
-                                                GridViewImp::dimension, rangeDim, 1> BaseType;
+  typedef Dune::GDT::Spaces::FVInterface<internal::DefaultProductTraits<GridViewImp, RangeFieldImp, rangeDim, 1>,
+                                         GridViewImp::dimension, rangeDim, 1> BaseType;
   typedef Default<GridViewImp, RangeFieldImp, rangeDim, 1> DefaultFVSpaceType;
 
 public:
@@ -88,7 +90,7 @@ public:
 
   // These methods are required by ProductSpaceInterface
   template <size_t ii>
-  const FactorSpaceType factor() const
+  const FactorSpaceType& factor() const
   {
     return factor_space_;
   }
diff --git a/dune/gdt/spaces/fv/interface.hh b/dune/gdt/spaces/fv/interface.hh
index d5d654680f1b66f5d4ede4df7b93345d55e26635..f85417b0173e0af50b7499d5239073245560c34e 100644
--- a/dune/gdt/spaces/fv/interface.hh
+++ b/dune/gdt/spaces/fv/interface.hh
@@ -47,12 +47,6 @@ public:
 template <class ImpTraits, size_t domainDim, size_t rangeDim, size_t rangeDimCols = 1>
 class ProductFVInterface : public ProductSpaceInterface<ImpTraits, domainDim, rangeDim, rangeDimCols>
 {
-  typedef ProductSpaceInterface<ImpTraits, domainDim, rangeDim, rangeDimCols> BaseType;
-
-public:
-  using typename BaseType::RangeFieldType;
-  using BaseType::compute_pattern;
-  using BaseType::local_constraints;
 }; // class ProductFVInterface