diff --git a/src/scheme/VariationalSolver.cpp b/src/scheme/VariationalSolver.cpp
index cbd857dddb3ba467ce4675194865fe70ef4f64f0..34f946900ae14ceafb9fdc4720cbd492c3157d98 100644
--- a/src/scheme/VariationalSolver.cpp
+++ b/src/scheme/VariationalSolver.cpp
@@ -166,7 +166,7 @@ variational_acoustic_dt(const std::shared_ptr<const DiscreteFunctionVariant>& c_
     c.meshVariant()->variant());
 }
 
-template <MeshConcept MeshTypeT, size_t mesh_edges_degree>
+template <MeshConcept MeshTypeT, size_t mesh_degree>
 class VariationalSolverHandler::VariationalSolver final : public VariationalSolverHandler::IVariationalSolver
 {
  private:
@@ -281,7 +281,7 @@ class VariationalSolverHandler::VariationalSolver final : public VariationalSolv
 
           Table<TinyVector<Dimension>> quadrature_points(mesh_face_boundary.faceList().size(), qf.numberOfPoints());
 
-          LineTransformationAccessor<MeshType, mesh_edges_degree> transformation{mesh};
+          LineTransformationAccessor<MeshType, mesh_degree> transformation{mesh};
 
           for (size_t i_face = 0; i_face < face_list.size(); ++i_face) {
             const FaceId face_id = face_list[i_face];
@@ -353,7 +353,7 @@ class VariationalSolverHandler::VariationalSolver final : public VariationalSolv
   }
 
   std::tuple<NodeValue<const Rd>, FaceArray<const Rd>, CellValue<const Rd>, CellValue<const double>>
-  _computeFluxes(const size_t& degree,
+  _computeFluxes(const size_t& polynomial_degree,
                  const VelocityBCTreatment& velocity_bc_treatment,
                  const std::shared_ptr<const DiscreteFunctionVariant>& rho_v,
                  const std::shared_ptr<const DiscreteFunctionVariant>& u_v,
@@ -379,7 +379,7 @@ class VariationalSolverHandler::VariationalSolver final : public VariationalSolv
       }
     }
 
-    PolynomialReconstructionDescriptor reconstruction_descriptor(IntegrationMethodType::boundary, degree,
+    PolynomialReconstructionDescriptor reconstruction_descriptor(IntegrationMethodType::boundary, polynomial_degree,
                                                                  symmetry_boundary_descriptor_list);
     auto reconstructions = PolynomialReconstruction{reconstruction_descriptor}.build(rho, rho * u, rho * E);
 
@@ -404,17 +404,17 @@ class VariationalSolverHandler::VariationalSolver final : public VariationalSolv
     auto face_to_node_matrix = p_mesh->connectivity().faceToNodeMatrix();
 
     m_face_indices = [&]() {
-      FaceArray<size_t> face_indices{p_mesh->connectivity(), mesh_edges_degree + 1};
+      FaceArray<size_t> face_indices{p_mesh->connectivity(), mesh_degree + 1};
       {
         for (FaceId face_id = 0; face_id < p_mesh->numberOfFaces(); ++face_id) {
           auto face_nodes = face_to_node_matrix[face_id];
 
-          face_indices[face_id][0]                 = face_nodes[0];
-          face_indices[face_id][mesh_edges_degree] = face_nodes[1];
+          face_indices[face_id][0]           = face_nodes[0];
+          face_indices[face_id][mesh_degree] = face_nodes[1];
         }
         size_t cpt = p_mesh->numberOfNodes();
         for (FaceId face_id = 0; face_id < p_mesh->numberOfFaces(); ++face_id) {
-          for (size_t i_face_node = 1; i_face_node < mesh_edges_degree; ++i_face_node) {
+          for (size_t i_face_node = 1; i_face_node < mesh_degree; ++i_face_node) {
             face_indices[face_id][i_face_node] = cpt++;
           }
         }
@@ -429,18 +429,18 @@ class VariationalSolverHandler::VariationalSolver final : public VariationalSolv
           auto face_nodes = face_to_node_matrix[face_id];
 
           node_index[face_nodes[0]] = m_face_indices[face_id][0];
-          node_index[face_nodes[1]] = m_face_indices[face_id][mesh_edges_degree];
+          node_index[face_nodes[1]] = m_face_indices[face_id][mesh_degree];
         }
       }
       return node_index;
     }();
 
-    Array<int> non_zero(Dimension * (p_mesh->numberOfNodes() + p_mesh->numberOfEdges() * (mesh_edges_degree - 1)));
+    Array<int> non_zero(Dimension * (p_mesh->numberOfNodes() + p_mesh->numberOfEdges() * (mesh_degree - 1)));
 
     parallel_for(
       p_mesh->numberOfNodes(), PUGS_LAMBDA(const NodeId node_id) {
         const size_t node_idx      = m_node_index[node_id];
-        const size_t node_non_zero = (node_to_face_matrix[node_id].size() * mesh_edges_degree + 1) * 2;
+        const size_t node_non_zero = (node_to_face_matrix[node_id].size() * mesh_degree + 1) * 2;
 
         non_zero[2 * node_idx]     = node_non_zero;
         non_zero[2 * node_idx + 1] = node_non_zero;
@@ -448,10 +448,10 @@ class VariationalSolverHandler::VariationalSolver final : public VariationalSolv
 
     parallel_for(
       p_mesh->numberOfFaces(), PUGS_LAMBDA(const FaceId face_id) {
-        for (size_t i = 1; i < mesh_edges_degree; ++i) {
+        for (size_t i = 1; i < mesh_degree; ++i) {
           const size_t face_node_idx = m_face_indices[face_id][i];
 
-          const size_t face_node_non_zero = 2 * (mesh_edges_degree + 1);
+          const size_t face_node_non_zero = 2 * (mesh_degree + 1);
 
           non_zero[2 * face_node_idx]     = face_node_non_zero;
           non_zero[2 * face_node_idx + 1] = face_node_non_zero;
@@ -459,9 +459,9 @@ class VariationalSolverHandler::VariationalSolver final : public VariationalSolv
       });
 
     CRSMatrixDescriptor A_descriptor(Dimension *
-                                       (p_mesh->numberOfNodes() + p_mesh->numberOfEdges() * (mesh_edges_degree - 1)),
+                                       (p_mesh->numberOfNodes() + p_mesh->numberOfEdges() * (mesh_degree - 1)),
                                      Dimension *
-                                       (p_mesh->numberOfNodes() + p_mesh->numberOfEdges() * (mesh_edges_degree - 1)),
+                                       (p_mesh->numberOfNodes() + p_mesh->numberOfEdges() * (mesh_degree - 1)),
                                      non_zero);
 
     auto face_to_cell_matrix = p_mesh->connectivity().faceToCellMatrix();
@@ -488,11 +488,11 @@ class VariationalSolverHandler::VariationalSolver final : public VariationalSolv
        [](R1 x) -> double { return 9. / 16 * (x[0] + 1. / 3) * (x[0] - 1. / 3) * (x[0] + 1); }};
 
     std::vector<std::function<double(R1)>> w_hat_set;
-    if constexpr (mesh_edges_degree == 1) {
+    if constexpr (mesh_degree == 1) {
       w_hat_set = w_hat_set_P1;
-    } else if constexpr (mesh_edges_degree == 2) {
+    } else if constexpr (mesh_degree == 2) {
       w_hat_set = w_hat_set_P2;
-    } else if constexpr (mesh_edges_degree == 3) {
+    } else if constexpr (mesh_degree == 3) {
       w_hat_set = w_hat_set_P3;
     } else {
       throw NotImplementedError("degree > 3");
@@ -501,7 +501,7 @@ class VariationalSolverHandler::VariationalSolver final : public VariationalSolv
     const QuadratureFormula<1> qf =
       QuadratureManager::instance().getLineFormula(GaussQuadratureDescriptor(m_quadrature_degree));
 
-    LineTransformationAccessor<MeshType, mesh_edges_degree> transformation{*p_mesh};
+    LineTransformationAccessor<MeshType, mesh_degree> transformation{*p_mesh};
 
     for (FaceId face_id = 0; face_id < p_mesh->numberOfFaces(); ++face_id) {
       auto cell_list = face_to_cell_matrix[face_id];
@@ -546,7 +546,7 @@ class VariationalSolverHandler::VariationalSolver final : public VariationalSolv
     const auto& face_local_numbers_in_their_cells = p_mesh->connectivity().faceLocalNumbersInTheirCells();
     const auto& face_cell_is_reversed             = p_mesh->connectivity().cellFaceIsReversed();
 
-    Vector<double> b(Dimension * (p_mesh->numberOfNodes() + p_mesh->numberOfEdges() * (mesh_edges_degree - 1)));
+    Vector<double> b(Dimension * (p_mesh->numberOfNodes() + p_mesh->numberOfEdges() * (mesh_degree - 1)));
     b.fill(0);
 
     for (FaceId face_id = 0; face_id < p_mesh->numberOfFaces(); ++face_id) {
@@ -674,19 +674,19 @@ class VariationalSolverHandler::VariationalSolver final : public VariationalSolv
     }
 
     NodeValue<Rd> ur(p_mesh->connectivity());
-    FaceArray<Rd> ul(p_mesh->connectivity(), mesh_edges_degree - 1);
+    FaceArray<Rd> ul(p_mesh->connectivity(), mesh_degree - 1);
 
     for (FaceId face_id = 0; face_id < p_mesh->numberOfFaces(); ++face_id) {
       for (size_t i = 0; i < Dimension; ++i) {
         ur[face_to_node_matrix[face_id][0]][i] = U[Dimension * m_face_indices[face_id][0] + i];
       }
       for (size_t i = 0; i < Dimension; ++i) {
-        for (size_t il = 0; il < mesh_edges_degree - 1; ++il) {
+        for (size_t il = 0; il < mesh_degree - 1; ++il) {
           ul[face_id][il][i] = U[Dimension * m_face_indices[face_id][il + 1] + i];
         }
       }
       for (size_t i = 0; i < Dimension; ++i) {
-        ur[face_to_node_matrix[face_id][1]][i] = U[Dimension * m_face_indices[face_id][mesh_edges_degree] + i];
+        ur[face_to_node_matrix[face_id][1]][i] = U[Dimension * m_face_indices[face_id][mesh_degree] + i];
       }
     }
 
@@ -740,7 +740,7 @@ class VariationalSolverHandler::VariationalSolver final : public VariationalSolv
       FaceArray<Rd> new_xl = copy(mesh->xl());
       parallel_for(
         mesh->numberOfFaces(), PUGS_LAMBDA(FaceId face_id) {
-          for (size_t i = 0; i < mesh_edges_degree - 1; ++i) {
+          for (size_t i = 0; i < mesh_degree - 1; ++i) {
             new_xl[face_id][i] += dt * ul[face_id][i];
           }
         });
@@ -764,7 +764,7 @@ class VariationalSolverHandler::VariationalSolver final : public VariationalSolv
              std::shared_ptr<const DiscreteFunctionVariant>,
              std::shared_ptr<const DiscreteFunctionVariant>,
              std::shared_ptr<const DiscreteFunctionVariant>>
-  apply(const size_t& degree,
+  apply(const size_t& polynomial_degree,
         const double& dt,
         const VelocityBCTreatment& velocity_bc_treatment,
         const std::shared_ptr<const DiscreteFunctionVariant>& rho_v,
@@ -781,22 +781,78 @@ class VariationalSolverHandler::VariationalSolver final : public VariationalSolv
     const CellValue<const double> rhoc =
       (rho_v->get<DiscreteFunctionP0<const double>>() * c_v->get<DiscreteFunctionP0<const double>>()).cellValues();
 
-#if 0
+#if 1
+    // k1
+    auto [ur1, ul1, momentum_fluxes1, energy_fluxes1] =
+      _computeFluxes(polynomial_degree, velocity_bc_treatment, rho_v, u_v, E_v, rhoc, a, bc_descriptor_list,
+                     function_id);
+
+    // y1
+    auto [mesh1, rho1, u1, E1] = _applyFluxes(0.5 * dt, rho_v, u_v, E_v, ur1, ul1, momentum_fluxes1, energy_fluxes1);
+
+    // k2
+    auto [ur2, ul2, momentum_fluxes2, energy_fluxes2] =
+      _computeFluxes(polynomial_degree, velocity_bc_treatment, rho1, u1, E1, rhoc, a, bc_descriptor_list, function_id);
+
+    // y2
+    auto [mesh2, rho2, u2, E2] = _applyFluxes(0.5 * dt, rho_v, u_v, E_v, ur2, ul2, momentum_fluxes2, energy_fluxes2);
+
+    // k3
+    auto [ur3, ul3, momentum_fluxes3, energy_fluxes3] =
+      _computeFluxes(polynomial_degree, velocity_bc_treatment, rho2, u2, E2, rhoc, a, bc_descriptor_list, function_id);
+
+    // y3
+    auto [mesh3, rho3, u3, E3] = _applyFluxes(dt, rho_v, u_v, E_v, ur3, ul3, momentum_fluxes3, energy_fluxes3);
+
+    // k4
+    auto [ur4, ul4, momentum_fluxes4, energy_fluxes4] =
+      _computeFluxes(polynomial_degree, velocity_bc_treatment, rho3, u3, E3, rhoc, a, bc_descriptor_list, function_id);
+
+    NodeValue<Rd> ur{mesh->connectivity()};
+    FaceArray<Rd> ul{mesh->connectivity(), ul1.sizeOfArrays()};
+    CellValue<Rd> momentum_fluxes{mesh->connectivity()};
+    CellValue<double> energy_fluxes{mesh->connectivity()};
+
+    for (NodeId node_id = 0; node_id < mesh->numberOfNodes(); ++node_id) {
+      ur[node_id] = (1. / 6.) * ur1[node_id] + (1. / 3.) * ur2[node_id] +   //
+                    (1. / 3.) * ur3[node_id] + (1. / 6.) * ur4[node_id];
+    }
+    for (FaceId face_id = 0; face_id < mesh->numberOfFaces(); ++face_id) {
+      for (size_t i = 0; i < ul.sizeOfArrays(); ++i) {
+        ul[face_id][i] = (1. / 6.) * ul1[face_id][i] + (1. / 3.) * ul2[face_id][i] +   //
+                         (1. / 3.) * ul3[face_id][i] + (1. / 6.) * ul4[face_id][i];
+      }
+    }
+    for (CellId cell_id = 0; cell_id < mesh->numberOfCells(); ++cell_id) {
+      momentum_fluxes[cell_id] = (1. / 6.) * momentum_fluxes1[cell_id] + (1. / 3.) * momentum_fluxes2[cell_id] +
+                                 (1. / 3.) * momentum_fluxes3[cell_id] + (1. / 6.) * momentum_fluxes4[cell_id];
+    }
+    for (CellId cell_id = 0; cell_id < mesh->numberOfCells(); ++cell_id) {
+      energy_fluxes[cell_id] = (1. / 6.) * energy_fluxes1[cell_id] + (1. / 3.) * energy_fluxes2[cell_id] +
+                               (1. / 3.) * energy_fluxes3[cell_id] + (1. / 6.) * energy_fluxes4[cell_id];
+    }
+
+    auto [mesh4, rho4, u4, E4] = _applyFluxes(dt, rho_v, u_v, E_v, ur, ul, momentum_fluxes, energy_fluxes);
+
+    return {mesh4, rho4, u4, E4};
+
+#elif 0
     // Heun's RK3 method
 
     auto [ur1, ul1, momentum_fluxes1, energy_fluxes1] =
-      _computeFluxes(degree, velocity_bc_treatment, rho_v, u_v, E_v, rhoc, a, bc_descriptor_list, function_id);
+      _computeFluxes(polynomial_degree, velocity_bc_treatment, rho_v, u_v, E_v, rhoc, a, bc_descriptor_list,
+                     function_id);
 
     auto [mesh1, rho1, u1, E1] = _applyFluxes(dt / 3., rho_v, u_v, E_v, ur1, ul1, momentum_fluxes1, energy_fluxes1);
 
     auto [ur2, ul2, momentum_fluxes2, energy_fluxes2] =
-      _computeFluxes(degree, velocity_bc_treatment, rho1, u1, E1, rhoc, a, bc_descriptor_list, function_id);
+      _computeFluxes(polynomial_degree, velocity_bc_treatment, rho1, u1, E1, rhoc, a, bc_descriptor_list, function_id);
 
     auto [mesh2, rho2, u2, E2] =
       _applyFluxes(2. / 3. * dt, rho_v, u_v, E_v, ur2, ul2, momentum_fluxes2, energy_fluxes2);
 
     auto [ur3, ul3, momentum_fluxes3, energy_fluxes3] =
-      _computeFluxes(degree, velocity_bc_treatment, rho2, u2, E2, rhoc, a, bc_descriptor_list, function_id);
+      _computeFluxes(polynomial_degree, velocity_bc_treatment, rho2, u2, E2, rhoc, a, bc_descriptor_list, function_id);
 
     NodeValue<Rd> ur{mesh->connectivity()};
     FaceArray<Rd> ul{mesh->connectivity(), ul1.sizeOfArrays()};
@@ -826,18 +882,19 @@ class VariationalSolverHandler::VariationalSolver final : public VariationalSolv
     // Ralston's RK3 method
 
     auto [ur1, ul1, momentum_fluxes1, energy_fluxes1] =
-      _computeFluxes(degree, velocity_bc_treatment, rho_v, u_v, E_v, rhoc, a, bc_descriptor_list, function_id);
+      _computeFluxes(polynomial_degree, velocity_bc_treatment, rho_v, u_v, E_v, rhoc, a, bc_descriptor_list,
+                     function_id);
 
     auto [mesh1, rho1, u1, E1] = _applyFluxes(dt / 2., rho_v, u_v, E_v, ur1, ul1, momentum_fluxes1, energy_fluxes1);
 
     auto [ur2, ul2, momentum_fluxes2, energy_fluxes2] =
-      _computeFluxes(degree, velocity_bc_treatment, rho1, u1, E1, rhoc, a, bc_descriptor_list, function_id);
+      _computeFluxes(polynomial_degree, velocity_bc_treatment, rho1, u1, E1, rhoc, a, bc_descriptor_list, function_id);
 
     auto [mesh2, rho2, u2, E2] =
       _applyFluxes(3. / 4. * dt, rho_v, u_v, E_v, ur2, ul2, momentum_fluxes2, energy_fluxes2);
 
     auto [ur3, ul3, momentum_fluxes3, energy_fluxes3] =
-      _computeFluxes(degree, velocity_bc_treatment, rho2, u2, E2, rhoc, a, bc_descriptor_list, function_id);
+      _computeFluxes(polynomial_degree, velocity_bc_treatment, rho2, u2, E2, rhoc, a, bc_descriptor_list, function_id);
 
     NodeValue<Rd> ur{mesh->connectivity()};
     FaceArray<Rd> ul{mesh->connectivity(), ul1.sizeOfArrays()};
@@ -864,24 +921,39 @@ class VariationalSolverHandler::VariationalSolver final : public VariationalSolv
     auto [mesh3, rho3, u3, E3] = _applyFluxes(dt, rho_v, u_v, E_v, ur, ul, momentum_fluxes, energy_fluxes);
 
     return {mesh3, rho3, u3, E3};
+#elif 0
+    // RK2
+    // k1
+    auto [ur1, ul1, momentum_fluxes1, energy_fluxes1] =
+      _computeFluxes(polynomial_degree, velocity_bc_treatment, rho_v, u_v, E_v, rhoc, a, bc_descriptor_list,
+                     function_id);
+
+    // y1
+    auto [mesh1, rho1, u1, E1] = _applyFluxes(dt / 2., rho_v, u_v, E_v, ur1, ul1, momentum_fluxes1, energy_fluxes1);
 
+    // k2
+    auto [ur2, ul2, momentum_fluxes2, energy_fluxes2] =
+      _computeFluxes(polynomial_degree, velocity_bc_treatment, rho1, u1, E1, rhoc, a, bc_descriptor_list, function_id);
+
+    return _applyFluxes(dt, rho_v, u_v, E_v, ur2, ul2, momentum_fluxes2, energy_fluxes2);
 #else
     auto [ur1, ul1, momentum_fluxes1, energy_fluxes1] =
-      _computeFluxes(degree, velocity_bc_treatment, rho_v, u_v, E_v, rhoc, a, bc_descriptor_list, function_id);
+      _computeFluxes(polynomial_degree, velocity_bc_treatment, rho_v, u_v, E_v, rhoc, a, bc_descriptor_list,
+                     function_id);
 
     return _applyFluxes(dt, rho_v, u_v, E_v, ur1, ul1, momentum_fluxes1, energy_fluxes1);
 #endif
   }
 
-  VariationalSolver() : m_quadrature_degree(8) {}
+  VariationalSolver() : m_quadrature_degree(15) {}
 
   VariationalSolver(VariationalSolver&&) = default;
   ~VariationalSolver()                   = default;
 };
 
-template <MeshConcept MeshType, size_t mesh_edges_degree>
+template <MeshConcept MeshType, size_t mesh_degree>
 void
-VariationalSolverHandler::VariationalSolver<MeshType, mesh_edges_degree>::_applyPressureBC(
+VariationalSolverHandler::VariationalSolver<MeshType, mesh_degree>::_applyPressureBC(
   const BoundaryConditionList& bc_list,
   const MeshType& mesh,
   Vector<double>& b) const
@@ -912,11 +984,11 @@ VariationalSolverHandler::VariationalSolver<MeshType, mesh_edges_degree>::_apply
                [](R1 x) -> double { return 9. / 16 * (x[0] + 1. / 3) * (x[0] - 1. / 3) * (x[0] + 1); }};
 
             std::vector<std::function<double(R1)>> w_hat_set;
-            if constexpr (mesh_edges_degree == 1) {
+            if constexpr (mesh_degree == 1) {
               w_hat_set = w_hat_set_P1;
-            } else if constexpr (mesh_edges_degree == 2) {
+            } else if constexpr (mesh_degree == 2) {
               w_hat_set = w_hat_set_P2;
-            } else if constexpr (mesh_edges_degree == 3) {
+            } else if constexpr (mesh_degree == 3) {
               w_hat_set = w_hat_set_P3;
             } else {
               throw NotImplementedError("degree > 3");
@@ -931,7 +1003,7 @@ VariationalSolverHandler::VariationalSolver<MeshType, mesh_edges_degree>::_apply
 
             const auto& face_cell_is_reversed = mesh.connectivity().cellFaceIsReversed();
 
-            LineTransformationAccessor<MeshType, mesh_edges_degree> transformation{mesh};
+            LineTransformationAccessor<MeshType, mesh_degree> transformation{mesh};
 
             for (size_t i_face = 0; i_face < face_list.size(); ++i_face) {
               FaceId face_id = face_list[i_face];
@@ -974,9 +1046,9 @@ VariationalSolverHandler::VariationalSolver<MeshType, mesh_edges_degree>::_apply
   }
 }
 
-template <MeshConcept MeshType, size_t mesh_edges_degree>
+template <MeshConcept MeshType, size_t mesh_degree>
 void
-VariationalSolverHandler::VariationalSolver<MeshType, mesh_edges_degree>::_forcebcSymmetryBC(
+VariationalSolverHandler::VariationalSolver<MeshType, mesh_degree>::_forcebcSymmetryBC(
   const BoundaryConditionList& bc_list,
   Vector<double>& U) const
 {
@@ -1015,7 +1087,7 @@ VariationalSolverHandler::VariationalSolver<MeshType, mesh_edges_degree>::_force
           for (size_t i_face = 0; i_face < face_list.size(); ++i_face) {
             const FaceId face_id = face_list[i_face];
 
-            for (size_t r_hat = 1; r_hat < mesh_edges_degree; ++r_hat) {
+            for (size_t r_hat = 1; r_hat < mesh_degree; ++r_hat) {
               const size_t r = m_face_indices[face_id][r_hat];
 
               TinyVector<Dimension> ur;
@@ -1037,9 +1109,9 @@ VariationalSolverHandler::VariationalSolver<MeshType, mesh_edges_degree>::_force
   }
 }
 
-template <MeshConcept MeshType, size_t mesh_edges_degree>
+template <MeshConcept MeshType, size_t mesh_degree>
 void
-VariationalSolverHandler::VariationalSolver<MeshType, mesh_edges_degree>::_forcebcVelocityBC(
+VariationalSolverHandler::VariationalSolver<MeshType, mesh_degree>::_forcebcVelocityBC(
   const BoundaryConditionList& bc_list,
   Vector<double>& U) const
 {
@@ -1068,7 +1140,7 @@ VariationalSolverHandler::VariationalSolver<MeshType, mesh_edges_degree>::_force
           for (size_t i_face = 0; i_face < face_list.size(); ++i_face) {
             const FaceId face_id = face_list[i_face];
 
-            for (size_t r_hat = 1; r_hat < mesh_edges_degree; ++r_hat) {
+            for (size_t r_hat = 1; r_hat < mesh_degree; ++r_hat) {
               const size_t r = m_face_indices[face_id][r_hat];
 
               for (size_t i = 0; i < Dimension; ++i) {
@@ -1095,7 +1167,7 @@ VariationalSolverHandler::VariationalSolver<MeshType, mesh_edges_degree>::_force
           for (size_t i_face = 0; i_face < face_list.size(); ++i_face) {
             const FaceId face_id = face_list[i_face];
 
-            for (size_t r_hat = 1; r_hat < mesh_edges_degree; ++r_hat) {
+            for (size_t r_hat = 1; r_hat < mesh_degree; ++r_hat) {
               const size_t r = m_face_indices[face_id][r_hat];
 
               for (size_t i = 0; i < Dimension; ++i) {
@@ -1109,9 +1181,9 @@ VariationalSolverHandler::VariationalSolver<MeshType, mesh_edges_degree>::_force
   }
 }
 
-template <MeshConcept MeshType, size_t mesh_edges_degree>
+template <MeshConcept MeshType, size_t mesh_degree>
 void
-VariationalSolverHandler::VariationalSolver<MeshType, mesh_edges_degree>::_applySymmetryBC(
+VariationalSolverHandler::VariationalSolver<MeshType, mesh_degree>::_applySymmetryBC(
   const BoundaryConditionList& bc_list,
   const MeshType& mesh,
   CRSMatrixDescriptor<double>& A_descriptor,
@@ -1167,7 +1239,7 @@ VariationalSolverHandler::VariationalSolver<MeshType, mesh_edges_degree>::_apply
           for (size_t i_face = 0; i_face < face_list.size(); ++i_face) {
             const FaceId face_id = face_list[i_face];
 
-            for (size_t i_hat = 1; i_hat < mesh_edges_degree; ++i_hat) {
+            for (size_t i_hat = 1; i_hat < mesh_degree; ++i_hat) {
               const size_t r = m_face_indices[face_id][i_hat];
 
               TinyMatrix<Dimension> Arr;
@@ -1210,7 +1282,7 @@ VariationalSolverHandler::VariationalSolver<MeshType, mesh_edges_degree>::_apply
               const FaceId face_id = node_face_list[i_face];
               auto face_node_list  = face_to_node_matrix[face_id];
 
-              for (size_t i_hat = 0; i_hat <= mesh_edges_degree; ++i_hat) {
+              for (size_t i_hat = 0; i_hat <= mesh_degree; ++i_hat) {
                 const size_t s = m_face_indices[face_id][i_hat];
 
                 if (s != r) {
@@ -1235,10 +1307,10 @@ VariationalSolverHandler::VariationalSolver<MeshType, mesh_edges_degree>::_apply
           for (size_t i_face = 0; i_face < face_list.size(); ++i_face) {
             const FaceId face_id = face_list[i_face];
 
-            for (size_t i_hat = 1; i_hat < mesh_edges_degree; ++i_hat) {
+            for (size_t i_hat = 1; i_hat < mesh_degree; ++i_hat) {
               const size_t r = m_face_indices[face_id][i_hat];
 
-              for (size_t j_hat = 0; j_hat <= mesh_edges_degree; ++j_hat) {
+              for (size_t j_hat = 0; j_hat <= mesh_degree; ++j_hat) {
                 const size_t s = m_face_indices[face_id][j_hat];
 
                 if (s != r) {
@@ -1265,9 +1337,9 @@ VariationalSolverHandler::VariationalSolver<MeshType, mesh_edges_degree>::_apply
   }
 }
 
-template <MeshConcept MeshType, size_t mesh_edges_degree>
+template <MeshConcept MeshType, size_t mesh_degree>
 void
-VariationalSolverHandler::VariationalSolver<MeshType, mesh_edges_degree>::_applyVelocityBC(
+VariationalSolverHandler::VariationalSolver<MeshType, mesh_degree>::_applyVelocityBC(
   const BoundaryConditionList& bc_list,
   const MeshType& mesh,
   const VariationalSolverHandler::VelocityBCTreatment& velocity_bc_treatment,
@@ -1299,7 +1371,7 @@ VariationalSolverHandler::VariationalSolver<MeshType, mesh_edges_degree>::_apply
               for (size_t i_face = 0; i_face < node_face_list.size(); ++i_face) {
                 const FaceId face_id = node_face_list[i_face];
 
-                for (size_t s_hat = 0; s_hat <= mesh_edges_degree; ++s_hat) {
+                for (size_t s_hat = 0; s_hat <= mesh_degree; ++s_hat) {
                   const size_t s = m_face_indices[face_id][s_hat];
 
                   if (r != s) {
@@ -1323,9 +1395,9 @@ VariationalSolverHandler::VariationalSolver<MeshType, mesh_edges_degree>::_apply
             for (size_t i_face = 0; i_face < face_list.size(); ++i_face) {
               const FaceId face_id = face_list[i_face];
 
-              for (size_t r_hat = 1; r_hat < mesh_edges_degree; ++r_hat) {
+              for (size_t r_hat = 1; r_hat < mesh_degree; ++r_hat) {
                 const size_t r = m_face_indices[face_id][r_hat];
-                for (size_t s_hat = 0; s_hat <= mesh_edges_degree; ++s_hat) {
+                for (size_t s_hat = 0; s_hat <= mesh_degree; ++s_hat) {
                   const size_t s = m_face_indices[face_id][s_hat];
 
                   if (r != s) {
@@ -1355,7 +1427,7 @@ VariationalSolverHandler::VariationalSolver<MeshType, mesh_edges_degree>::_apply
               for (size_t i_face = 0; i_face < node_face_list.size(); ++i_face) {
                 const FaceId face_id = node_face_list[i_face];
 
-                for (size_t s_hat = 0; s_hat <= mesh_edges_degree; ++s_hat) {
+                for (size_t s_hat = 0; s_hat <= mesh_degree; ++s_hat) {
                   const size_t s = m_face_indices[face_id][s_hat];
 
                   if (r == s) {
@@ -1381,9 +1453,9 @@ VariationalSolverHandler::VariationalSolver<MeshType, mesh_edges_degree>::_apply
             for (size_t i_face = 0; i_face < face_list.size(); ++i_face) {
               const FaceId face_id = face_list[i_face];
 
-              for (size_t r_hat = 1; r_hat < mesh_edges_degree; ++r_hat) {
+              for (size_t r_hat = 1; r_hat < mesh_degree; ++r_hat) {
                 const size_t r = m_face_indices[face_id][r_hat];
-                for (size_t s_hat = 0; s_hat <= mesh_edges_degree; ++s_hat) {
+                for (size_t s_hat = 0; s_hat <= mesh_degree; ++s_hat) {
                   const size_t s = m_face_indices[face_id][s_hat];
 
                   if (r == s) {
@@ -1420,7 +1492,7 @@ VariationalSolverHandler::VariationalSolver<MeshType, mesh_edges_degree>::_apply
 
               for (size_t i_face = 0; i_face < node_faces.size(); ++i_face) {
                 const FaceId face_id = node_faces[i_face];
-                for (size_t s_hat = 0; s_hat <= mesh_edges_degree; ++s_hat) {
+                for (size_t s_hat = 0; s_hat <= mesh_degree; ++s_hat) {
                   const size_t s = m_face_indices[face_id][s_hat];
 
                   if (r == s) {
@@ -1446,9 +1518,9 @@ VariationalSolverHandler::VariationalSolver<MeshType, mesh_edges_degree>::_apply
             for (size_t i_face = 0; i_face < face_list.size(); ++i_face) {
               const FaceId face_id = face_list[i_face];
 
-              for (size_t r_hat = 1; r_hat < mesh_edges_degree; ++r_hat) {
+              for (size_t r_hat = 1; r_hat < mesh_degree; ++r_hat) {
                 const size_t r = m_face_indices[face_id][r_hat];
-                for (size_t s_hat = 0; s_hat <= mesh_edges_degree; ++s_hat) {
+                for (size_t s_hat = 0; s_hat <= mesh_degree; ++s_hat) {
                   const size_t s = m_face_indices[face_id][s_hat];
 
                   if (r == s) {
@@ -1493,7 +1565,7 @@ VariationalSolverHandler::VariationalSolver<MeshType, mesh_edges_degree>::_apply
             const Array<const FaceId>& face_list = bc.faceList();
             for (size_t i_face = 0; i_face < face_list.size(); ++i_face) {
               const FaceId face_id = face_list[i_face];
-              for (size_t r_hat = 1; r_hat < mesh_edges_degree; ++r_hat) {
+              for (size_t r_hat = 1; r_hat < mesh_degree; ++r_hat) {
                 const size_t r = m_face_indices[face_id][r_hat];
                 A_descriptor(Dimension * r, Dimension * r) += 1.e30;
                 A_descriptor(Dimension * r + 1, Dimension * r + 1) += 1.e30;
@@ -1512,7 +1584,7 @@ VariationalSolverHandler::VariationalSolver<MeshType, mesh_edges_degree>::_apply
 
             for (size_t i_face = 0; i_face < face_list.size(); ++i_face) {
               const FaceId face_id = face_list[i_face];
-              for (size_t r_hat = 1; r_hat < mesh_edges_degree; ++r_hat) {
+              for (size_t r_hat = 1; r_hat < mesh_degree; ++r_hat) {
                 const size_t value_index = r_hat - 1;   // nodal values on the face are not stored in this array
 
                 const size_t r = m_face_indices[face_id][r_hat];
@@ -1533,7 +1605,7 @@ VariationalSolverHandler::VariationalSolver<MeshType, mesh_edges_degree>::_apply
             const Array<const FaceId>& face_list = bc.faceList();
             for (size_t i_face = 0; i_face < face_list.size(); ++i_face) {
               const FaceId face_id = face_list[i_face];
-              for (size_t r_hat = 1; r_hat < mesh_edges_degree; ++r_hat) {
+              for (size_t r_hat = 1; r_hat < mesh_degree; ++r_hat) {
                 const size_t r = m_face_indices[face_id][r_hat];
                 A_descriptor(Dimension * r, Dimension * r) += 1.e30;
                 A_descriptor(Dimension * r + 1, Dimension * r + 1) += 1.e30;
@@ -1549,8 +1621,8 @@ VariationalSolverHandler::VariationalSolver<MeshType, mesh_edges_degree>::_apply
   }
 }
 
-template <MeshConcept MeshType, size_t mesh_edges_degree>
-class VariationalSolverHandler::VariationalSolver<MeshType, mesh_edges_degree>::FixedBoundaryCondition
+template <MeshConcept MeshType, size_t mesh_degree>
+class VariationalSolverHandler::VariationalSolver<MeshType, mesh_degree>::FixedBoundaryCondition
 {
  private:
   const MeshNodeBoundary m_mesh_node_boundary;
@@ -1580,8 +1652,8 @@ class VariationalSolverHandler::VariationalSolver<MeshType, mesh_edges_degree>::
   ~FixedBoundaryCondition() = default;
 };
 
-template <MeshConcept MeshType, size_t mesh_edges_degree>
-class VariationalSolverHandler::VariationalSolver<MeshType, mesh_edges_degree>::PressureBoundaryCondition
+template <MeshConcept MeshType, size_t mesh_degree>
+class VariationalSolverHandler::VariationalSolver<MeshType, mesh_degree>::PressureBoundaryCondition
 {
  private:
   const MeshFaceBoundary m_mesh_face_boundary;
@@ -1607,8 +1679,8 @@ class VariationalSolverHandler::VariationalSolver<MeshType, mesh_edges_degree>::
   ~PressureBoundaryCondition() = default;
 };
 
-template <MeshConcept MeshType, size_t mesh_edges_degree>
-class VariationalSolverHandler::VariationalSolver<MeshType, mesh_edges_degree>::VelocityBoundaryCondition
+template <MeshConcept MeshType, size_t mesh_degree>
+class VariationalSolverHandler::VariationalSolver<MeshType, mesh_degree>::VelocityBoundaryCondition
 {
  private:
   const MeshNodeBoundary m_mesh_node_boundary;
@@ -1663,8 +1735,8 @@ class VariationalSolverHandler::VariationalSolver<MeshType, mesh_edges_degree>::
   ~VelocityBoundaryCondition() = default;
 };
 
-template <MeshConcept MeshType, size_t mesh_edges_degree>
-class VariationalSolverHandler::VariationalSolver<MeshType, mesh_edges_degree>::SymmetryBoundaryCondition
+template <MeshConcept MeshType, size_t mesh_degree>
+class VariationalSolverHandler::VariationalSolver<MeshType, mesh_degree>::SymmetryBoundaryCondition
 {
  public:
   using Rd = TinyVector<Dimension, double>;