diff --git a/dumux/freeflow/higherorderapproximation.hh b/dumux/freeflow/higherorderapproximation.hh
index b6f35e5d1bb25f0b3e73cbeff5b2ebdbbe6dd41e..601bf115d219eec1d22c79af9b71e02e387feee5 100644
--- a/dumux/freeflow/higherorderapproximation.hh
+++ b/dumux/freeflow/higherorderapproximation.hh
@@ -242,12 +242,55 @@ public:
     }
 
     /**
-      * \brief Tvd Scheme: Total Variation Diminuishing
-      */
+     * \brief Tvd Scheme: Total Variation Diminishing
+     *
+     */
     Scalar tvd(const Scalar downstreamVelocity,
                const Scalar upstreamVelocity,
                const Scalar upUpstreamVelocity,
-               const Scalar density) const
+               const Scalar upstreamToDownstreamDistance,
+               const Scalar upUpstreamToUpstreamDistance,
+               const Scalar downstreamStaggeredCellSize,
+               const bool selfIsUpstream,
+               const Scalar density,
+               const TvdApproach tvdApproach) const
+    {
+        Scalar momentum = 0.0;
+        switch(tvdApproach)
+        {
+            case TvdApproach::uniform :
+            {
+                momentum += tvdUniform(downstreamVelocity, upstreamVelocity, upUpstreamVelocity, density);
+                break;
+            }
+            case TvdApproach::li :
+            {
+                momentum += tvdLi(downstreamVelocity, upstreamVelocity, upUpstreamVelocity, upstreamToDownstreamDistance, upUpstreamToUpstreamDistance, selfIsUpstream, density);
+                break;
+            }
+            case TvdApproach::hou :
+            {
+                momentum += tvdHou(downstreamVelocity, upstreamVelocity, upUpstreamVelocity, upstreamToDownstreamDistance, upUpstreamToUpstreamDistance, downstreamStaggeredCellSize, density);
+                break;
+            }
+            default:
+            {
+                DUNE_THROW(ParameterException, "\nThis Tvd Approach is not implemented.\n");
+                break;
+            }
+        }
+        return momentum;
+    }
+
+    /**
+     * \brief Tvd Scheme: Total Variation Diminishing
+     *
+     * This function assumes the cell size distribution to be uniform.
+     */
+    Scalar tvdUniform(const Scalar downstreamVelocity,
+                      const Scalar upstreamVelocity,
+                      const Scalar upUpstreamVelocity,
+                      const Scalar density) const
     {
         using std::isfinite;
         const Scalar ratio = (upstreamVelocity - upUpstreamVelocity) / (downstreamVelocity - upstreamVelocity);
@@ -265,17 +308,17 @@ public:
     /**
       * \brief Tvd Scheme: Total Variation Diminishing
       *
-      * This functions manages the non uniformities of the grid according to [Li, Liao 2007].
+      * This function manages the non uniformities of the grid according to [Li, Liao 2007].
       * It tries to reconstruct the value for the velocity at the upstream-upstream point
       * if the grid was uniform.
       */
-    Scalar tvd(const Scalar downstreamVelocity,
-               const Scalar upstreamVelocity,
-               const Scalar upUpstreamVelocity,
-               const Scalar upstreamToDownstreamDistance,
-               const Scalar upUpstreamToUpstreamDistance,
-               const bool selfIsUpstream,
-               const Scalar density) const
+    Scalar tvdLi(const Scalar downstreamVelocity,
+                 const Scalar upstreamVelocity,
+                 const Scalar upUpstreamVelocity,
+                 const Scalar upstreamToDownstreamDistance,
+                 const Scalar upUpstreamToUpstreamDistance,
+                 const bool selfIsUpstream,
+                 const Scalar density) const
     {
         using std::isfinite;
         // I need the information of selfIsUpstream to get the correct sign because upUpstreamToUpstreamDistance is always positive
@@ -299,16 +342,16 @@ public:
     /**
      * \brief Tvd Scheme: Total Variation Diminishing
      *
-     * This functions manages the non uniformities of the grid according to [Hou, Simons, Hinkelmann 2007].
+     * This function manages the non uniformities of the grid according to [Hou, Simons, Hinkelmann 2007].
      * It should behave better then the Li's version in very stretched grids.
      */
-    Scalar tvd(const Scalar downstreamVelocity,
-               const Scalar upstreamVelocity,
-               const Scalar upUpstreamVelocity,
-               const Scalar upstreamToDownstreamDistance,
-               const Scalar upUpstreamToUpstreamDistance,
-               const Scalar downstreamStaggeredCellSize,
-               const Scalar density) const
+    Scalar tvdHou(const Scalar downstreamVelocity,
+                  const Scalar upstreamVelocity,
+                  const Scalar upUpstreamVelocity,
+                  const Scalar upstreamToDownstreamDistance,
+                  const Scalar upUpstreamToUpstreamDistance,
+                  const Scalar downstreamStaggeredCellSize,
+                  const Scalar density) const
     {
         using std::isfinite;
         const Scalar ratio = (upstreamVelocity - upUpstreamVelocity) / (downstreamVelocity - upstreamVelocity)
diff --git a/dumux/freeflow/navierstokes/staggered/fluxvariables.hh b/dumux/freeflow/navierstokes/staggered/fluxvariables.hh
index 67fe4c4103e3a1e8026efb0ad3d3384b1d6761d7..448b046e25576b86f8a3b98daaebee8636e2b385 100644
--- a/dumux/freeflow/navierstokes/staggered/fluxvariables.hh
+++ b/dumux/freeflow/navierstokes/staggered/fluxvariables.hh
@@ -235,32 +235,7 @@ public:
             {
                 if (canFrontalSecondOrder_(scvf, selfIsUpstream, velocities, distances, elemFaceVars[scvf]))
                 {
-                    switch (highOrder.tvdApproach())
-                    {
-                        case TvdApproach::uniform :
-                        {
-                            momentum = highOrder.tvd(velocities[0], velocities[1], velocities[2], insideVolVars.density());
-                            break;
-                        }
-                        case TvdApproach::li :
-                        {
-                            momentum = highOrder.tvd(velocities[0], velocities[1], velocities[2], distances[0], distances[1], selfIsUpstream, insideVolVars.density());
-                            break;
-                        }
-                        case TvdApproach::hou :
-                        {
-                            momentum = highOrder.tvd(velocities[0], velocities[1], velocities[2], distances[0], distances[1], distances[2], insideVolVars.density());
-                            break;
-                        }
-                        default:
-                        {
-                            DUNE_THROW(ParameterException, "\nTvd approach " << static_cast<int>(highOrder.tvdApproach()) << " is not implemented.\n" <<
-                                        static_cast<int>(TvdApproach::uniform) << ": Uniform Tvd\n" <<
-                                        static_cast<int>(TvdApproach::li) << ": Li's approach\n" <<
-                                        static_cast<int>(TvdApproach::hou) << ": Hou's approach");
-                            break;
-                        }
-                    }
+                    momentum = highOrder.tvd(velocities[0], velocities[1], velocities[2], distances[0], distances[1], distances[2], selfIsUpstream, insideVolVars.density(), highOrder.tvdApproach());
                 }
                 else
                     momentum = highOrder.upwind(velocities[0], velocities[1], insideVolVars.density(), upwindWeight);
@@ -464,32 +439,7 @@ private:
         {
             if (canLateralSecondOrder_(scvf, fvGeometry, selfIsUpstream, localSubFaceIdx, velocities, distances, problem, element, faceVars, lateralFaceHasDirichletPressure, lateralFaceHasBJS))
             {
-                switch (highOrder.tvdApproach())
-                {
-                    case TvdApproach::uniform :
-                    {
-                        momentum = highOrder.tvd(velocities[0], velocities[1], velocities[2], selfIsUpstream ? insideVolVars.density() : outsideVolVars.density());
-                        break;
-                    }
-                    case TvdApproach::li :
-                    {
-                        momentum = highOrder.tvd(velocities[0], velocities[1], velocities[2], distances[0], distances[1], selfIsUpstream, selfIsUpstream ? insideVolVars.density() : outsideVolVars.density());
-                        break;
-                    }
-                    case TvdApproach::hou :
-                    {
-                        momentum = highOrder.tvd(velocities[0], velocities[1], velocities[2], distances[0], distances[1], distances[2], selfIsUpstream ? insideVolVars.density() : outsideVolVars.density());
-                        break;
-                    }
-                    default:
-                    {
-                        DUNE_THROW(ParameterException, "\nTvd approach " << static_cast<int>(highOrder.tvdApproach()) << " is not implemented.\n" <<
-                                    static_cast<int>(TvdApproach::uniform) << ": Uniform Tvd\n" <<
-                                    static_cast<int>(TvdApproach::li) << ": Li's approach\n" <<
-                                    static_cast<int>(TvdApproach::hou) << ": Hou's approach");
-                        break;
-                    }
-                }
+                momentum = highOrder.tvd(velocities[0], velocities[1], velocities[2], distances[0], distances[1], distances[2], selfIsUpstream, selfIsUpstream ? insideVolVars.density() : outsideVolVars.density(), highOrder.tvdApproach());
             }
             else
                 momentum = highOrder.upwind(velocities[0], velocities[1], selfIsUpstream ? insideVolVars.density() : outsideVolVars.density(), upwindWeight);