diff --git a/test/navier-stokes/CMakeLists.txt b/test/navier-stokes/CMakeLists.txt
index d1a15522e4e019321f666441b7c0016c4431fb17..0395a5849226d0311743b9d16553f69a5bf2b064 100644
--- a/test/navier-stokes/CMakeLists.txt
+++ b/test/navier-stokes/CMakeLists.txt
@@ -1,4 +1,4 @@
-add_subdirectory(howto)
+add_subdirectory(reference_program)
 
 dune_add_formcompiler_system_test(UFLFILE navierstokes_3d_dg_quadrilateral.ufl
                                   BASENAME navierstokes_3d_dg_quadrilateral
diff --git a/test/navier-stokes/howto/CMakeLists.txt b/test/navier-stokes/howto/CMakeLists.txt
deleted file mode 100644
index 27fd5d441df271aee459d1a62401458e3b4dd258..0000000000000000000000000000000000000000
--- a/test/navier-stokes/howto/CMakeLists.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-add_executable(dgstokes dgstokes.cc)
-add_executable(taylor-green taylor-green.cc)
-
-dune_symlink_to_source_files(FILES dgstokes.ini taylor-green.ini)
diff --git a/test/navier-stokes/howto/dgstokes.cc b/test/navier-stokes/howto/dgstokes.cc
deleted file mode 100644
index 6b5605030feb331d071fb7059c9d148f51d6e1d1..0000000000000000000000000000000000000000
--- a/test/navier-stokes/howto/dgstokes.cc
+++ /dev/null
@@ -1,329 +0,0 @@
-// -*- tab-width: 2; indent-tabs-mode: nil -*-
-/** \file
-    \brief Solve Stokes with DG method (stationary case).
-*/
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#include <iostream>
-#include <vector>
-#include <map>
-#include <string>
-#include <random>
-#include <dune/common/parallel/mpihelper.hh>
-#include <dune/common/exceptions.hh>
-#include <dune/common/fvector.hh>
-#include <dune/grid/yaspgrid.hh>
-#include <dune/grid/io/file/vtk/subsamplingvtkwriter.hh>
-#include <dune/istl/bvector.hh>
-#include <dune/istl/operators.hh>
-#include <dune/istl/solvers.hh>
-#include <dune/istl/preconditioners.hh>
-#include <dune/istl/io.hh>
-
-#include "dune/pdelab/finiteelementmap/qkdg.hh"
-#include <dune/pdelab/gridfunctionspace/gridfunctionspaceutilities.hh>
-#include<dune/pdelab/gridfunctionspace/subspace.hh>
-#include <dune/pdelab/gridfunctionspace/vectorgridfunctionspace.hh>
-#include <dune/pdelab/gridfunctionspace/vtk.hh>
-#include <dune/pdelab/gridoperator/gridoperator.hh>
-#include <dune/pdelab/gridfunctionspace/interpolate.hh>
-#include <dune/pdelab/localoperator/dgnavierstokes.hh>
-#include <dune/pdelab/backend/istl.hh>
-#include <dune/pdelab/finiteelementmap/monomfem.hh>
-#include <dune/pdelab/common/function.hh>
-#include <dune/pdelab/common/vtkexport.hh>
-
-#include "navierstokes_initial.hh"
-
-#define USE_SUPER_LU
-#define MAKE_VTK_OUTPUT
-
-//===============================================================
-// Problem setup and solution
-//===============================================================
-
-// generate a composite P2/P1 function and output it
-template<typename GV, typename RF, int vOrder, int pOrder>
-void stokes (const GV& gv, const Dune::ParameterTree& configuration, std::string filename)
-{
-  // <<<1>>> constants and types
-  using ES = Dune::PDELab::AllEntitySet<GV>;
-  ES es(gv);
-  typedef typename ES::Grid::ctype DF;
-  static const unsigned int dim = ES::dimension;
-  Dune::Timer watch;
-  std::cout << "=== Initialize" << std::endl;
-
-  // <<<2>>> Make grid function space
-  watch.reset();
-  // typedef Dune::PDELab::MonomLocalFiniteElementMap<DF,RF,dim,vOrder> vFEM;
-  // typedef Dune::PDELab::MonomLocalFiniteElementMap<DF,RF,dim,pOrder> pFEM;
-  // vFEM vFem(Dune::GeometryType(Dune::GeometryType::cube,dim));
-  // pFEM pFem(Dune::GeometryType(Dune::GeometryType::cube,dim));
-  typedef Dune::PDELab::QkDGLocalFiniteElementMap<DF, RF, 2, 2> vFEM;
-  typedef Dune::PDELab::QkDGLocalFiniteElementMap<DF, RF, 1, 2> pFEM;
-  vFEM vFem;
-  pFEM pFem;
-  // DOFs per cell
-  static const unsigned int vBlockSize = Dune::MonomImp::Size<dim,vOrder>::val;
-  static const unsigned int pBlockSize = Dune::MonomImp::Size<dim,pOrder>::val;
-
-
-  // typedef Dune::PDELab::istl::VectorBackend<Dune::PDELab::istl::Blocking::none,vBlockSize> VVectorBackend;
-  // typedef Dune::PDELab::istl::VectorBackend<Dune::PDELab::istl::Blocking::none,pBlockSize> PVectorBacken
-  typedef Dune::PDELab::istl::VectorBackend<Dune::PDELab::istl::Blocking::none> VVectorBackend;
-  typedef Dune::PDELab::istl::VectorBackend<Dune::PDELab::istl::Blocking::none> PVectorBackend;
-  typedef Dune::PDELab::istl::VectorBackend<> VelocityVectorBackend;
-
-
-#if 1
-  // this creates a flat backend (i.e. blocksize == 1)
-  typedef Dune::PDELab::istl::VectorBackend<Dune::PDELab::istl::Blocking::none> VectorBackend;
-#else
-  // this creates a backend with static blocks matching the size of the LFS
-  typedef Dune::PDELab::istl::VectorBackend<Dune::PDELab::istl::Blocking::fixed> VectorBackend;
-#endif
-  // velocity
-  Dune::dinfo << "--- v^dim" << std::endl;
-
-
-  // typedef Dune::PDELab::EntityBlockedOrderingTag VelocityOrderingTag;
-  typedef Dune::PDELab::LexicographicOrderingTag VelocityOrderingTag;
-
-
-  typedef Dune::PDELab::VectorGridFunctionSpace<
-    ES,vFEM,dim,
-    VelocityVectorBackend,
-    VVectorBackend,
-    Dune::PDELab::NoConstraints,
-    VelocityOrderingTag
-    > velocityGFS;
-  velocityGFS velocityGfs(es,vFem);
-  velocityGfs.name("v");
-  // p
-  Dune::dinfo << "--- p" << std::endl;
-  typedef Dune::PDELab::GridFunctionSpace<ES,pFEM,
-                                          Dune::PDELab::NoConstraints, PVectorBackend> pGFS;
-  pGFS pGfs(es,pFem);
-  pGfs.name("p");
-  // GFS
-  Dune::dinfo << "--- v^dim,p" << std::endl;
-
-
-  // typedef Dune::PDELab::EntityBlockedOrderingTag StokesOrderingTag;
-  typedef Dune::PDELab::LexicographicOrderingTag StokesOrderingTag;
-
-
-  typedef Dune::PDELab::CompositeGridFunctionSpace<
-    VectorBackend, StokesOrderingTag,
-    velocityGFS, pGFS> GFS;
-  GFS gfs(velocityGfs, pGfs);
-  using namespace Dune::Indices;
-  velocityGfs.child(_0).name("velocity_0");
-  velocityGfs.child(_1).name("velocity_1");
-  pGfs.name("pressure");
-  gfs.name("test");
-  gfs.update();
-  std::cout << "gfs with " << gfs.size() << " dofs generated  "<< std::endl;
-  std::cout << "=== function space setup " <<  watch.elapsed() << " s" << std::endl;
-
-  // <<<3>>> Make coefficient Vector and initialize it from a function
-  using V = Dune::PDELab::Backend::Vector<GFS,RF>;
-  V x(gfs);
-
-  typedef ZeroVectorFunction<ES,RF,dim> FType;
-  FType f(es);
-  typedef BCTypeParamGlobalDirichlet BType;
-  BType b;
-  typedef HagenPoiseuilleVelocityBox<ES,RF,dim> VType;
-  VType v(es);
-  typedef ZeroScalarFunction<ES,RF> PType;
-  PType p(es);
-
-  // <<<4>>> Make grid Function operator
-  watch.reset();
-  typedef Dune::PDELab::DefaultInteriorPenalty<RF> PenaltyTerm;
-
-  typedef Dune::PDELab::DGNavierStokesParameters<ES,RF,FType,BType,VType,PType,true,false,PenaltyTerm>
-    LocalDGOperatorParameters;
-  LocalDGOperatorParameters lop_params(configuration.sub("parameters"),f,b,v,p);
-  typedef Dune::PDELab::DGNavierStokes<LocalDGOperatorParameters> LocalDGOperator;
-  const int superintegration_order = 0;
-  LocalDGOperator lop(lop_params,superintegration_order);
-
-  typedef Dune::PDELab::EmptyTransformation C;
-  typedef Dune::PDELab::istl::BCRSMatrixBackend<> MBE;
-  MBE mbe(75); // Maximal number of nonzeroes per row can be cross-checked by patternStatistics().
-  typedef Dune::PDELab::GridOperator
-    <GFS,GFS,LocalDGOperator,MBE,RF,RF,RF,C,C> GOS;
-  GOS gos(gfs,gfs,lop,mbe);
-
-  std::cout << "=== grid operator space setup " <<  watch.elapsed() << " s" << std::endl;
-
-  typedef typename GOS::Jacobian M;
-  watch.reset();
-  M m(gos);
-  std::cout << m.patternStatistics() << std::endl;
-  std::cout << "=== matrix setup " <<  watch.elapsed() << " s" << std::endl;
-  m = 0.0;
-  watch.reset();
-  gos.jacobian(x,m);
-  std::cout << "=== jacobian assembly " <<  watch.elapsed() << " s" << std::endl;
-
-  // std::ofstream matrix("Matrix");
-  // Dune::printmatrix(matrix, m.base(), "M", "r", 6, 3);
-
-  // evaluate residual w.r.t initial guess
-  V r(gfs);
-  r = 0.0;
-  watch.reset();
-  x = 0.0;
-  gos.residual(x,r);
-  std::cout << "=== residual evaluation " <<  watch.elapsed() << " s" << std::endl;
-
-  bool verbose = true;
-
-  using Dune::PDELab::Backend::native;
-  typedef Dune::PDELab::Backend::Native<M> ISTLM;
-  typedef Dune::PDELab::Backend::Native<V> ISTLV;
-#ifdef USE_SUPER_LU // use lu decomposition as solver
-#if HAVE_SUPERLU
-  // make ISTL solver
-  Dune::MatrixAdapter<ISTLM,ISTLV,ISTLV> opa(native(m));
-  Dune::SuperLU<ISTLM> solver(native(m), verbose?1:0);
-  Dune::InverseOperatorResult stat;
-#else
-#error No superLU support, please install and configure it.
-#endif
-#else // Use iterative solver
-  // make ISTL solver
-  Dune::MatrixAdapter<ISTLM,ISTLV,ISTLV> opa(native(m));
-  Dune::SeqILU0<ISTLM,ISTLV,ISTLV> ilu0(native(m),1.0);
-  Dune::BiCGSTABSolver<ISTLV> solver(opa,ilu0,1E-10,20000, verbose?2:1);
-  Dune::InverseOperatorResult stat;
-#endif
-
-  // solve the jacobian system
-  r *= -1.0; // need -residual
-  x = r;
-  solver.apply(native(x),native(r),stat);
-
-
-
-  if (false) {
-    using Dune::PDELab::Backend::native;
-    V r(x);
-    // Setup random input
-    std::size_t seed = 0;
-    auto rng = std::mt19937_64(seed);
-    auto dist = std::uniform_real_distribution<>(-1., 1.);
-    for (auto& v : x)
-      v = dist(rng);
-    r=0.0;
-    gos.residual(x, r);
-    Dune::printvector(std::cout, native(r), "residual vector", "row");
-  }
-  if (true) {
-    // Setup random input
-    std::size_t seed = 0;
-    auto rng = std::mt19937_64(seed);
-    auto dist = std::uniform_real_distribution<>(1., 10.);
-    for (auto& v : x)
-      v = dist(rng);
-    //using M = typename GO::Traits::Jacobian;
-    M m(gos);
-    gos.jacobian(x, m);
-    using Dune::PDELab::Backend::native;
-    Dune::printmatrix(std::cout, native(m),"global stiffness matrix","row",9,1);
-  }
-
-
-
-  //    #ifdef MAKE_VTK_OUTPUT
-  // output grid function with SubsamplingVTKWriter
-  Dune::SubsamplingVTKWriter<GV> vtkwriter(gv,2);
-  Dune::PDELab::addSolutionToVTKWriter(vtkwriter, gfs, x);
-  vtkwriter.write(filename,Dune::VTK::appendedraw);
-  //    #endif
-}
-
-//===============================================================
-// Main program with grid setup
-//===============================================================
-
-int main(int argc, char** argv)
-{
-  try{
-    //Maybe initialize Mpi
-    Dune::MPIHelper::instance(argc, argv);
-
-    int x=2;
-    int y=2;
-    int z=2;
-    if (argc > 1)
-      x = atoi(argv[1]);
-    if (argc > 2)
-      y = atoi(argv[2]);
-    if (argc > 3)
-      z = atoi(argv[3]);
-
-    Dune::ParameterTree configuration;
-    const std::string config_filename("dgstokes.ini");
-    std::cout << "Reading ini-file \""<< config_filename
-              << "\"" << std::endl;
-
-    Dune::ParameterTreeParser::readINITree(config_filename, configuration);
-
-    // YaspGrid P2/P1 2D test
-    if(1){
-      // make grid
-      const int dim = 2;
-      Dune::FieldVector<double,dim> L(1.0);
-      Dune::array<int,dim> N;
-      N[0] = x; N[1] = y;
-      std::bitset<dim> B(false);
-      Dune::YaspGrid<dim> grid(L,N,B,0);
-
-      // get view
-      typedef Dune::YaspGrid<dim>::LeafGridView GV;
-      const GV gv=grid.leafGridView();
-
-      // solve problem
-      Dune::dinfo.push(false);
-      stokes<GV,double,2,1>(gv,configuration,"dgstokes-2D-2-1");
-    }
-
-
-    // YaspGrid P2/P1 3D test
-#if 0
-    {
-      // make grid
-      const int dim = 3;
-      Dune::FieldVector<double,dim> L(1.0);
-      Dune::array<int,dim> N;
-      N[0] = x; N[1] = y; N[2] = z;
-      std::bitset<dim> B(false);
-      Dune::YaspGrid<dim> grid(L,N,B,0);
-
-      // get view
-      typedef Dune::YaspGrid<dim>::LeafGridView GV;
-      const GV gv=grid.leafGridView();
-
-      // solve problem
-      stokes<GV,double,2,1>(gv,configuration,"dgstokes-3D-2-1");
-    }
-#endif
-
-    // test passed
-    return 0;
-  }
-  catch (Dune::Exception &e){
-    std::cerr << "Dune reported error: " << e << std::endl;
-    return 1;
-  }
-  catch (...){
-    std::cerr << "Unknown exception thrown!" << std::endl;
-    return 1;
-  }
-}
diff --git a/test/navier-stokes/howto/dgstokes.ini b/test/navier-stokes/howto/dgstokes.ini
deleted file mode 100644
index e88e6a0674b0d79d03afcbb1c807fcf5bafb1655..0000000000000000000000000000000000000000
--- a/test/navier-stokes/howto/dgstokes.ini
+++ /dev/null
@@ -1,9 +0,0 @@
-# Configuration file for the example programs - dgstokes, dgnavierstokesvelvecfem -
-
-[parameters]
-rho = 1.0
-mu = 1.0
-[parameters.dg]
-epsilon = -1
-sigma = 1.0
-beta = 1.0
diff --git a/test/navier-stokes/howto/navierstokes_initial.hh b/test/navier-stokes/howto/navierstokes_initial.hh
deleted file mode 100644
index 2ffe2d9c4cf284abb45afba012dd5f6e7e42cb30..0000000000000000000000000000000000000000
--- a/test/navier-stokes/howto/navierstokes_initial.hh
+++ /dev/null
@@ -1,484 +0,0 @@
-#ifndef CG_STOKES_INITIAL_HH
-#define CG_STOKES_INITIAL_HH
-
-//===============================================================
-// Define parameter functions f,g,j and \partial\Omega_D/N
-//===============================================================
-
-/** \brief Global Dirichlet boundary conditions
-
- */
-
-// constraints parameter class for selecting boundary condition type
-class BCTypeParamGlobalDirichlet
-{
-public :
-  typedef Dune::PDELab::StokesBoundaryCondition BC;
-
-  struct Traits
-  {
-    typedef BC::Type RangeType;
-  };
-
-  BCTypeParamGlobalDirichlet() {}
-
-  template<typename I>
-  inline void evaluate (const I & intersection,   /*@\label{bcp:name}@*/
-                        const Dune::FieldVector<typename I::ctype, I::dimension-1> & coord,
-                        BC::Type& y) const
-  {
-    y = BC::VelocityDirichlet;
-  }
-
-};
-
-/** \brief Boundary conditions for Hagen-Poiseuille flow.
-
- */
-
-// constraints parameter class for selecting boundary condition type
-class BCTypeParamHagenPoiseuille
-{
-public:
-  typedef Dune::PDELab::StokesBoundaryCondition BC;
-
-  struct Traits
-  {
-    typedef BC::Type RangeType;
-  };
-
-  BCTypeParamHagenPoiseuille() {}
-
-  template<typename I>
-  inline void evaluate (const I & intersection,   /*@\label{bcp:name}@*/
-                        const Dune::FieldVector<typename I::ctype, I::dimension-1> & coord,
-                        BC::Type& y) const
-  {
-    Dune::FieldVector<typename I::ctype, I::dimension>
-      xg = intersection.geometry().global( coord );
-    if( xg[0] > 1.0-1e-6 )
-      y = BC::DoNothing;
-    else
-      y = BC::VelocityDirichlet;
-  }
-};
-
-/** \brief Boundary conditions for two dimensional flow around a cylinder obstacle.
-
- * The settings come from the two dimensional Turek benchmark channel.
- * Compare with the Article: "Benchmark Computations of Laminar Flow Around a Cylinder"
- * by M. Schaefer and S. Turek.
-
- */
-
-// constraints parameter class for selecting boundary condition type
-class BCTypeParamTU
-{
-public:
-  typedef Dune::PDELab::StokesBoundaryCondition BC;
-
-  struct Traits
-  {
-    typedef BC::Type RangeType;
-  };
-
-  BCTypeParamTU() {}
-
-  template<typename I>
-  inline void evaluate (const I & intersection,   /*@\label{bcp:name}@*/
-                        const Dune::FieldVector<typename I::ctype, I::dimension-1> & coord,
-                        BC::Type& y) const
-  {
-    Dune::FieldVector<typename I::ctype, I::dimension>
-      xg = intersection.geometry().global( coord );
-    if( xg[0] > 2.2-1e-6 )
-      y = BC::DoNothing;
-    else
-      y = BC::VelocityDirichlet;
-  }
-
-  template<typename Time>
-  void setTime(Time)
-  {}
-};
-
-/** \brief Boundary conditions for three dimensional flow around a cylinder obstacle
-
- * The settings come from the three dimensional Turek benchmark channel.
- * Compare with the Article: "Benchmark Computations of 3D Laminar Flow Around a Cylinder with CFX, OpenFOAM and FEATFLOW"
- * by E. Bayraktar, O. Mierka and S. Turek.
-
- */
-
-// constraints parameter class for selecting boundary condition type
-class BCTypeParamTU3D
-{
-public:
-  typedef Dune::PDELab::StokesBoundaryCondition BC;
-
-  struct Traits
-  {
-    typedef BC::Type RangeType;
-  };
-
-  BCTypeParamTU3D() {}
-
-  template<typename I>
-  inline void evaluate (const I & intersection,   /*@\label{bcp:name}@*/
-                        const Dune::FieldVector<typename I::ctype, I::dimension-1> & coord,
-                        BC::Type& y) const
-  {
-    Dune::FieldVector<typename I::ctype, I::dimension>
-      xg = intersection.geometry().global( coord );
-    if( xg[0] > 2.5-1e-6 )
-      y = BC::DoNothing;
-    else
-      y = BC::VelocityDirichlet;
-  }
-};
-
-/** \brief Boundary conditions for Backward-Facing Step.
-
- */
-
-// constraints parameter class for selecting boundary condition type
-class BCTypeParamLU
-{
-public:
-  typedef Dune::PDELab::StokesBoundaryCondition BC;
-
-  struct Traits
-  {
-    typedef BC::Type RangeType;
-  };
-
-  BCTypeParamLU() {}
-
-  template<typename I>
-  inline void evaluate (const I & intersection,   /*@\label{bcp:name}@*/
-                        const Dune::FieldVector<typename I::ctype, I::dimension-1> & coord,
-                        BC::Type& y) const
-  {
-    Dune::FieldVector<typename I::ctype, I::dimension>
-      xg = intersection.geometry().global( coord );
-    if( xg[0] > 5.0-1e-6 )
-      y = BC::DoNothing;
-    else
-      y = BC::VelocityDirichlet;
-  }
-
-  template<typename Time>
-  void setTime(Time)
-  {}
-};
-
-/** \brief Dirichlet velocity function for Hagen-Poiseuille flow in a box.
-
-    \tparam GV The underlying grid view.
-    \tparam RF The type of the range field.
-    \tparam dim Dimension of the problem.
-
-    * The Hagen-Poiseuille flow is solved on the dim-dimensional unitcube.
-    * The maximum inflow velocity is normalized to 1.
-    * In three dimensions, the two dimensional flow is trivially extended
-    * to the z-direction.
-
-    */
-
-template<typename GV, typename RF, int dim>
-class HagenPoiseuilleVelocityBox :
-  public Dune::PDELab::AnalyticGridFunctionBase<
-  Dune::PDELab::AnalyticGridFunctionTraits<GV,RF,dim>,
-  HagenPoiseuilleVelocityBox<GV,RF,dim> >
-{
-public:
-  typedef Dune::PDELab::AnalyticGridFunctionTraits<GV,RF,dim> Traits;
-  typedef Dune::PDELab::AnalyticGridFunctionBase<Traits, HagenPoiseuilleVelocityBox<GV,RF,dim> > BaseT;
-
-  typedef typename Traits::DomainType DomainType;
-  typedef typename Traits::RangeType RangeType;
-
-  HagenPoiseuilleVelocityBox(const GV & gv) : BaseT(gv) {}
-
-  inline void evaluateGlobal(const DomainType & x, RangeType & y) const
-  {
-    y = 0;
-    y[0] = x[1]*(1.0-x[1]);
-    y[0] *= 4.0;
-  }
-
-};
-
-/** \brief Dirichlet velocity function for the flow around a cylinder obstacle.
-
-    \tparam GV The underlying grid view.
-    \tparam RF The type of the range field.
-    \tparam dim The dimension of the problem.
-    \param[in] meanflow Maximum inflow velocity.
-
-    * This function is used to model the inflow.
-    * It works both in two and three dimensions.
-
-    */
-
-template<typename GV, typename RF, int dim>
-class TUVelocity :
-  public Dune::PDELab::AnalyticGridFunctionBase<
-  Dune::PDELab::AnalyticGridFunctionTraits<GV,RF,dim>,
-  TUVelocity<GV,RF,dim> >
-{
-  RF time;
-  const RF meanflow_;
-
-public:
-  typedef Dune::PDELab::AnalyticGridFunctionTraits<GV,RF,dim> Traits;
-  typedef Dune::PDELab::AnalyticGridFunctionBase<Traits,TUVelocity<GV,RF,dim> > BaseT;
-
-  typedef typename Traits::DomainType DomainType;
-  typedef typename Traits::RangeType RangeType;
-
-  TUVelocity(const GV & gv, const RF& meanflow) :
-    BaseT(gv)
-    , meanflow_(meanflow)
-  {
-    time = 0.0;
-  }
-
-  inline void evaluateGlobal(const DomainType & x, RangeType & y) const
-  {
-    y = 0.0;
-    RF r = 1.0;
-
-    for(int i=1; i<dim; i++)
-      r *= 4.0*x[i]*(0.41-x[i])/(0.41*0.41);
-
-    if(x[0] < 1e-6) {
-      y[0] = r*meanflow_;
-      if(time <= 4.0)
-        y[0] *= sin(M_PI*time/8.0);
-    }
-  }
-
-  template <typename T>
-  void setTime(T t){
-    time = t;
-  }
-
-};
-
-/** \brief Dirichlet velocity function for the Backward-Facing Step.
-
-    \tparam GV The underlying grid view.
-    \tparam RF The type of the range field.
-    \tparam dim The dimension of the problem.
-
-    * The inflow velocity is normalized to 1.
-
-    */
-
-template<typename GV, typename RF, int dim>
-class LUVelocity :
-  public Dune::PDELab::AnalyticGridFunctionBase<
-  Dune::PDELab::AnalyticGridFunctionTraits<GV,RF,dim>,
-  LUVelocity<GV,RF,dim> >
-{
-private:
-  RF time;
-
-public:
-  typedef Dune::PDELab::AnalyticGridFunctionTraits<GV,RF,dim> Traits;
-  typedef Dune::PDELab::AnalyticGridFunctionBase<Traits,LUVelocity<GV,RF,dim> > BaseT;
-
-  typedef typename Traits::DomainType DomainType;
-  typedef typename Traits::RangeType RangeType;
-
-  LUVelocity(const GV & gv) : BaseT(gv) {
-    time = 0.0;
-  }
-
-  inline void evaluateGlobal(const DomainType & x, RangeType & y) const
-  {
-    RF r = 0;
-
-    y = 0.0;
-    r += x[1]*(1.0-x[1]);
-
-    if(x[0] < -1.0+1e-6) {
-      y[0] = 4*r;
-      if(time <= 2.0)
-        y[0] *= sin(M_PI/4*time);
-    }
-  }
-
-  template <typename T>
-  void setTime(T t){
-    time = t;
-  }
-
-};
-
-/** \brief Dirichlet velocity function for three dimensional Hagen-Poiseuille flow.
-
-    \tparam GV The underlying grid view.
-    \tparam RF The type of the range field.
-
-    * The Hagen-Poiseuille flow is solved in a pipe pointing in x-direction.
-    * The cross section in the yz-plane is a circle with midpoint at the origin
-    * and with radius 0.5.
-    * The inflow velocity is normalized to 1.
-
-    */
-
-template<typename GV, typename RF>
-class HagenPoiseuilleVelocityCylindrical :
-  public Dune::PDELab::AnalyticGridFunctionBase<
-  Dune::PDELab::AnalyticGridFunctionTraits<GV,RF,3>,
-  HagenPoiseuilleVelocityCylindrical<GV,RF> >
-{
-public:
-  enum {dim = 3};
-  typedef Dune::PDELab::AnalyticGridFunctionTraits<GV,RF,dim> Traits;
-  typedef Dune::PDELab::AnalyticGridFunctionBase<Traits, HagenPoiseuilleVelocityCylindrical<GV,RF> > BaseT;
-
-  typedef typename Traits::DomainType DomainType;
-  typedef typename Traits::RangeType RangeType;
-
-  HagenPoiseuilleVelocityCylindrical(const GV & gv) : BaseT(gv)
-  {
-    assert(GV::dimension == dim);
-  }
-
-  inline void evaluateGlobal(const DomainType & x, RangeType & y) const
-  {
-
-    RF r = 0;
-    for(int i=1; i<dim; ++i){
-      r += (x[i])*(x[i]);
-      y[i] = 0;
-    }
-    r = sqrt(r);
-    y[0] = 0.25 - r*r;
-    y[0] *= 4;
-
-    if(y[0]<0)
-      y[0] = 0;
-  }
-
-};
-
-
-template<typename GV, typename RF, std::size_t dim_range>
-class ZeroVectorFunction :
-  public Dune::PDELab::AnalyticGridFunctionBase<
-  Dune::PDELab::AnalyticGridFunctionTraits<GV,RF,dim_range>,
-  ZeroVectorFunction<GV,RF,dim_range> >,
-  public Dune::PDELab::InstationaryFunctionDefaults
-{
-public:
-  typedef Dune::PDELab::AnalyticGridFunctionTraits<GV,RF,dim_range> Traits;
-  typedef Dune::PDELab::AnalyticGridFunctionBase<Traits, ZeroVectorFunction> BaseT;
-
-  typedef typename Traits::DomainType DomainType;
-  typedef typename Traits::RangeType RangeType;
-
-  ZeroVectorFunction(const GV & gv) : BaseT(gv) {}
-
-  inline void evaluateGlobal(const DomainType & x, RangeType & y) const
-  {
-    y=0;
-  }
-};
-
-template<typename GV, typename RF>
-class ZeroScalarFunction
-  : public ZeroVectorFunction<GV,RF,1>
-{
-public:
-
-  ZeroScalarFunction(const GV & gv) : ZeroVectorFunction<GV,RF,1>(gv) {}
-
-};
-
-/** \brief Do-nothing boundary function for the Hagen-Poiseuille flow
-
-    \tparam GV The underlying grid view.
-    \tparam RF The type of the range field.
-
-*/
-
-// function for defining the flux boundary condition
-template<typename GV, typename RF>
-class HagenPoiseuilleZeroFlux
-  : public Dune::PDELab::AnalyticGridFunctionBase<
-  Dune::PDELab::AnalyticGridFunctionTraits<GV,RF,1>,
-  HagenPoiseuilleZeroFlux<GV,RF> >
-{
-public:
-  typedef Dune::PDELab::AnalyticGridFunctionTraits<GV,RF,1> Traits;
-  typedef Dune::PDELab::AnalyticGridFunctionBase<Traits,HagenPoiseuilleZeroFlux<GV,RF> > BaseT;
-
-  HagenPoiseuilleZeroFlux (const GV& gv) : BaseT(gv) {}
-
-  inline void evaluateGlobal (const typename Traits::DomainType& x,
-                              typename Traits::RangeType& y) const
-  {
-    y = 0;
-  }
-};
-
-/** \brief Do-nothing boundary function for the Backward-Facing Step and the flow around a cylinder
-
-    \tparam GV The underlying grid view.
-    \tparam RF The type of the range field.
-    \param[in] p_ The pressure at the inflow.
-    \param[in] l_ The length of the tube.
-    \param[in] o_ The coordinate referring to the beginning of the tube.
-    \param[in] d_ The canonical direction the tube is oriented.
-
-*/
-
-// function for defining the flux boundary condition
-template<typename GV, typename RF>
-class PressureDropFlux
-  : public Dune::PDELab::AnalyticGridFunctionBase<
-  Dune::PDELab::AnalyticGridFunctionTraits<GV,RF,1>,
-  PressureDropFlux<GV,RF> >
-{
-public:
-  typedef Dune::PDELab::AnalyticGridFunctionTraits<GV,RF,1> Traits;
-  typedef Dune::PDELab::AnalyticGridFunctionBase<Traits,PressureDropFlux<GV,RF> > BaseT;
-
-private:
-  typedef typename Traits::DomainFieldType DFT;
-
-  const DFT pressure;
-  const DFT length;
-  const DFT origin;
-  const int direction;
-
-public:
-  PressureDropFlux (const GV& gv, const RF p_, const RF l_, const RF o_, const int d_)
-    : BaseT(gv), pressure(p_), length(l_), origin(o_), direction(d_)
-  {
-#ifndef NDEBUG
-    const int dim = GV::dimension;
-    assert(direction >=0 && direction <dim);
-#endif
-  }
-
-  inline void evaluateGlobal (const typename Traits::DomainType& x,
-                              typename Traits::RangeType& y) const
-  {
-    if(x[direction]-origin < 1e-6)
-      y = pressure;
-    else if(x[direction]-origin > length-1e-6)
-      y = 0.;
-  }
-
-  template<typename Time>
-  void setTime(Time)
-  {}
-};
-
-
-#endif
diff --git a/test/navier-stokes/reference_program/CMakeLists.txt b/test/navier-stokes/reference_program/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..228faae3912c8bc0c1dd0b98cb6492bbaa790911
--- /dev/null
+++ b/test/navier-stokes/reference_program/CMakeLists.txt
@@ -0,0 +1,3 @@
+add_executable(taylor-green taylor-green.cc)
+
+dune_symlink_to_source_files(FILES taylor-green.ini)
diff --git a/test/navier-stokes/howto/taylor-green.cc b/test/navier-stokes/reference_program/taylor-green.cc
similarity index 100%
rename from test/navier-stokes/howto/taylor-green.cc
rename to test/navier-stokes/reference_program/taylor-green.cc
diff --git a/test/navier-stokes/howto/taylor-green.hh b/test/navier-stokes/reference_program/taylor-green.hh
similarity index 100%
rename from test/navier-stokes/howto/taylor-green.hh
rename to test/navier-stokes/reference_program/taylor-green.hh
diff --git a/test/navier-stokes/howto/taylor-green.ini b/test/navier-stokes/reference_program/taylor-green.ini
similarity index 100%
rename from test/navier-stokes/howto/taylor-green.ini
rename to test/navier-stokes/reference_program/taylor-green.ini
diff --git a/test/navier-stokes/howto/taylor_green_solution.py b/test/navier-stokes/reference_program/taylor_green_solution.py
similarity index 100%
rename from test/navier-stokes/howto/taylor_green_solution.py
rename to test/navier-stokes/reference_program/taylor_green_solution.py