diff --git a/src/scheme/EulerKineticSolverMultiDOrder2.cpp b/src/scheme/EulerKineticSolverMultiDOrder2.cpp
index 02c995fdd75728747366ba4c1afb2563af28340d..8651c43999c61cb380933657cb1db271a9055ef1 100644
--- a/src/scheme/EulerKineticSolverMultiDOrder2.cpp
+++ b/src/scheme/EulerKineticSolverMultiDOrder2.cpp
@@ -452,7 +452,9 @@ class EulerKineticSolverMultiDOrder2
 
   template <typename T>
   FaceArray<T>
-  compute_Flux_face(const DiscreteFunctionDPkVector<Dimension, const T> DPk_Fn)
+  compute_Flux_face(const DiscreteFunctionDPkVector<Dimension, const T>& DPk_Fn,
+                    const CellArray<const T>& Fn,
+                    CellValue<bool>& is_wall_boundary_cell)
   {
     const size_t nb_waves = m_lambda_vector.size();
     FaceArray<T> Fl(m_mesh.connectivity(), nb_waves);
@@ -482,7 +484,11 @@ class EulerKineticSolverMultiDOrder2
             double li_nl = sign * dot(m_lambda_vector[i_wave], n_face);
 
             if (li_nl > 0) {
-              Fl[face_id][i_wave] += DPk_Fn(cell_id, i_wave)(m_xl[face_id]);
+              if (not is_wall_boundary_cell[cell_id]) {
+                Fl[face_id][i_wave] += DPk_Fn(cell_id, i_wave)(m_xl[face_id]);
+              } else {
+                Fl[face_id][i_wave] += Fn[cell_id][i_wave];
+              }
             }
           }
         }
@@ -609,6 +615,9 @@ class EulerKineticSolverMultiDOrder2
                 DiscreteFunctionDPkVector<Dimension, double> Fn_rho,
                 DiscreteFunctionDPkVector<Dimension, TinyVector<Dimension>> Fn_rho_u,
                 DiscreteFunctionDPkVector<Dimension, double> Fn_rho_E,
+                const CellArray<const double> Fj_rho,
+                const CellArray<const TinyVector<Dimension>> Fj_rho_u,
+                const CellArray<const double> Fj_rho_E,
                 const BoundaryConditionList& bc_list)
   {
     const size_t nb_waves                         = m_lambda_vector.size();
@@ -711,9 +720,9 @@ class EulerKineticSolverMultiDOrder2
                   double rho_El                = 0;
 
                   for (size_t k_wave = 0; k_wave < nb_waves; ++k_wave) {
-                    rhol += Fn_rho(cell_id, k_wave)(m_xl[face_id]);
-                    rho_ul += Fn_rho_u(cell_id, k_wave)(m_xl[face_id]);
-                    rho_El += Fn_rho_E(cell_id, k_wave)(m_xl[face_id]);
+                    rhol += Fj_rho[cell_id][k_wave];
+                    rho_ul += Fj_rho_u[cell_id][k_wave];
+                    rho_El += Fj_rho_E[cell_id][k_wave];
                   }
 
                   const double sign       = face_cell_is_reversed(cell_id, i_face_cell) ? -1 : 1;
@@ -1667,6 +1676,31 @@ class EulerKineticSolverMultiDOrder2
         bc_v);
     }
 
+    CellValue<bool> is_wall_boundary_cell{p_mesh->connectivity()};
+    is_wall_boundary_cell.fill(false);
+    for (auto&& bc_v : bc_list) {
+      std::visit(
+        [=](auto&& bc) {
+          using BCType = std::decay_t<decltype(bc)>;
+          if constexpr (std::is_same_v<BCType, WallBoundaryCondition>) {
+            auto node_list = bc.nodeList();
+
+            is_wall_boundary_cell.fill(0);
+
+            auto node_to_cell_matrix = m_mesh.connectivity().nodeToCellMatrix();
+
+            for (size_t i_node = 0; i_node < node_list.size(); ++i_node) {
+              auto cell_list = node_to_cell_matrix[node_list[i_node]];
+              for (size_t i_cell = 0; i_cell < cell_list.size(); ++i_cell) {
+                const CellId cell_id           = cell_list[i_cell];
+                is_wall_boundary_cell[cell_id] = 1;
+              }
+            }
+          }
+        },
+        bc_v);
+    }
+
     const CellValue<const TinyVector<Dimension>> A_rho_ex   = getA_rho(rho_u_ex);
     const CellValue<const TinyMatrix<Dimension>> A_rho_u_ex = getA_rho_u(rho_ex, rho_u_ex, rho_E_ex);
     const CellValue<const TinyVector<Dimension>> A_rho_E_ex = getA_rho_E(rho_ex, rho_u_ex, rho_E_ex);
@@ -1728,11 +1762,13 @@ class EulerKineticSolverMultiDOrder2
     CellArray<double> deltaLFn_rho_E{p_mesh->connectivity(), nb_waves};
 
     if (m_scheme == 1) {
-      FaceArray<double> Fl_rho                  = compute_Flux_face<double>(Fn_rho_lim);
-      FaceArray<TinyVector<Dimension>> Fl_rho_u = compute_Flux_face<TinyVector<Dimension>>(Fn_rho_u_lim);
-      FaceArray<double> Fl_rho_E                = compute_Flux_face<double>(Fn_rho_E_lim);
+      FaceArray<double> Fl_rho = compute_Flux_face<double>(Fn_rho_lim, Fn_rho, is_wall_boundary_cell);
+      FaceArray<TinyVector<Dimension>> Fl_rho_u =
+        compute_Flux_face<TinyVector<Dimension>>(Fn_rho_u_lim, Fn_rho_u, is_wall_boundary_cell);
+      FaceArray<double> Fl_rho_E = compute_Flux_face<double>(Fn_rho_E_lim, Fn_rho_E, is_wall_boundary_cell);
 
-      apply_face_bc(Fl_rho, Fl_rho_u, Fl_rho_E, Fn_rho_lim, Fn_rho_u_lim, Fn_rho_E_lim, bc_list);
+      apply_face_bc(Fl_rho, Fl_rho_u, Fl_rho_E, Fn_rho_lim, Fn_rho_u_lim, Fn_rho_E_lim, Fn_rho, Fn_rho_u, Fn_rho_E,
+                    bc_list);
 
       synchronize(Fl_rho);
       synchronize(Fl_rho_u);
@@ -1808,11 +1844,13 @@ class EulerKineticSolverMultiDOrder2
       CellArray<double> deltaLFnp1_rho_E{p_mesh->connectivity(), nb_waves};
 
       if (m_scheme == 1) {
-        FaceArray<double> Fl_rho_np1                  = compute_Flux_face<double>(Fnp1_rho_lim);
-        FaceArray<TinyVector<Dimension>> Fl_rho_u_np1 = compute_Flux_face<TinyVector<Dimension>>(Fnp1_rho_u_lim);
-        FaceArray<double> Fl_rho_E_np1                = compute_Flux_face<double>(Fnp1_rho_E_lim);
+        FaceArray<double> Fl_rho_np1 = compute_Flux_face<double>(Fnp1_rho_lim, Fn_rho, is_wall_boundary_cell);
+        FaceArray<TinyVector<Dimension>> Fl_rho_u_np1 =
+          compute_Flux_face<TinyVector<Dimension>>(Fnp1_rho_u_lim, Fn_rho_u, is_wall_boundary_cell);
+        FaceArray<double> Fl_rho_E_np1 = compute_Flux_face<double>(Fnp1_rho_E_lim, Fn_rho_E, is_wall_boundary_cell);
 
-        apply_face_bc(Fl_rho_np1, Fl_rho_u_np1, Fl_rho_E_np1, Fnp1_rho_lim, Fnp1_rho_u_lim, Fnp1_rho_E_lim, bc_list);
+        apply_face_bc(Fl_rho_np1, Fl_rho_u_np1, Fl_rho_E_np1, Fnp1_rho_lim, Fnp1_rho_u_lim, Fnp1_rho_E_lim, Fn_rho,
+                      Fn_rho_u, Fn_rho_E, bc_list);
 
         synchronize(Fl_rho_np1);
         synchronize(Fl_rho_u_np1);