diff --git a/src/mesh/MeshData.hpp b/src/mesh/MeshData.hpp
index 4086090a27f7c6b21b69e8f65e66ad7ee8c77630..79c8cbba1662f325a43e4f2afe13d14ee766d31a 100644
--- a/src/mesh/MeshData.hpp
+++ b/src/mesh/MeshData.hpp
@@ -24,8 +24,8 @@ public:
 private:
   const MeshType& m_mesh;
   NodeByCellData<Rd> m_Cjr;
-  Kokkos::View<double**>  m_ljr;
-  Kokkos::View<Rd**> m_njr;
+  NodeByCellData<double> m_ljr;
+  NodeByCellData<Rd> m_njr;
   Kokkos::View<Rd*>  m_xj;
   Kokkos::View<double*>   m_Vj;
 
@@ -88,22 +88,16 @@ private:
           }
         });
 
-      Kokkos::parallel_for(m_mesh.numberOfCells(), KOKKOS_LAMBDA(const int& j){
-          const auto& cell_nodes = m_mesh.connectivity().m_cell_to_node_matrix.rowConst(j);
-          for (size_t R=0; R<cell_nodes.length; ++R) {
-            const Rd& Cjr = m_Cjr(j,R);
-            m_ljr(j,R) = l2Norm(Cjr);
-          }
+      const NodeByCellData<Rd>& Cjr = m_Cjr;
+      Kokkos::parallel_for(m_Cjr.numberOfValues(), KOKKOS_LAMBDA(const int& j){
+          m_ljr.value(j) = l2Norm(Cjr.value(j));
         });
 
-      Kokkos::parallel_for(m_mesh.numberOfCells(), KOKKOS_LAMBDA(const int& j){
-          const auto& cell_nodes = m_mesh.connectivity().m_cell_to_node_matrix.rowConst(j);
-          for (size_t R=0; R<cell_nodes.length; ++R) {
-            const Rd& Cjr = m_Cjr(j,R);
-            const double inv_ljr = 1./m_ljr(j,R);
-            m_njr(j,R) = inv_ljr*Cjr;
-          }
+      const NodeByCellData<double>& ljr = m_ljr;
+      Kokkos::parallel_for(m_Cjr.numberOfValues(), KOKKOS_LAMBDA(const int& j){
+          m_njr.value(j) = (1./ljr.value(j))*Cjr.value(j);
         });
+
     } else if (dimension ==3) {
       const Kokkos::View<const Rd*> xr = m_mesh.xr();
 
@@ -155,21 +149,14 @@ private:
           }
         });
 
-      Kokkos::parallel_for(m_mesh.numberOfCells(), KOKKOS_LAMBDA(const int& j) {
-          const auto& cell_nodes = m_mesh.connectivity().m_cell_to_node_matrix.rowConst(j);
-          for (size_t R=0; R<cell_nodes.length; ++R) {
-            const Rd& Cjr = m_Cjr(j,R);
-            m_ljr(j,R) = l2Norm(Cjr);
-          }
+      const NodeByCellData<Rd>& Cjr = m_Cjr;
+      Kokkos::parallel_for(m_Cjr.numberOfValues(), KOKKOS_LAMBDA(const int& j){
+          m_ljr.value(j) = l2Norm(Cjr.value(j));
         });
 
-      Kokkos::parallel_for(m_mesh.numberOfCells(), KOKKOS_LAMBDA(const int& j) {
-          const auto& cell_nodes = m_mesh.connectivity().m_cell_to_node_matrix.rowConst(j);
-          for (size_t R=0; R<cell_nodes.length; ++R) {
-            const Rd& Cjr = m_Cjr(j,R);
-            const double inv_ljr = 1./m_ljr(j,R);
-            m_njr(j,R) = inv_ljr*Cjr;
-          }
+      const NodeByCellData<double>& ljr = m_ljr;
+      Kokkos::parallel_for(m_Cjr.numberOfValues(), KOKKOS_LAMBDA(const int& j){
+          m_njr.value(j) = (1./ljr.value(j))*Cjr.value(j);
         });
     }
     static_assert((dimension<=3), "only 1d, 2d and 3d are implemented");
@@ -186,12 +173,12 @@ public:
     return m_Cjr;
   }
 
-  const Kokkos::View<const double**> ljr() const
+  const NodeByCellData<double>& ljr() const
   {
     return m_ljr;
   }
 
-  const Kokkos::View<const Rd**> njr() const
+  const NodeByCellData<Rd>& njr() const
   {
     return m_njr;
   }
@@ -216,8 +203,8 @@ public:
   MeshData(const MeshType& mesh)
     : m_mesh(mesh),
       m_Cjr(mesh.connectivity().m_node_id_per_cell_matrix),
-      m_ljr("ljr", mesh.numberOfCells(), mesh.connectivity().maxNbNodePerCell()),
-      m_njr("njr", mesh.numberOfCells(), mesh.connectivity().maxNbNodePerCell()),
+      m_ljr(mesh.connectivity().m_node_id_per_cell_matrix),
+      m_njr(mesh.connectivity().m_node_id_per_cell_matrix),
       m_xj("xj", mesh.numberOfCells()),
       m_Vj("Vj", mesh.numberOfCells())
   {
@@ -228,6 +215,7 @@ public:
           m_Cjr(j,1)= 1;
         });
       // in 1d njr=Cjr
+#warning set equality between njr and Cjr
       Kokkos::parallel_for(m_mesh.numberOfCells(), KOKKOS_LAMBDA(const int& j) {
           m_njr(j,0)=-1;
           m_njr(j,1)= 1;
diff --git a/src/scheme/AcousticSolver.hpp b/src/scheme/AcousticSolver.hpp
index e814a1434ffbcab623abe69aac02ed8b1a41503b..b0037cb511a068f909a158f4590be7a73b40ef5e 100644
--- a/src/scheme/AcousticSolver.hpp
+++ b/src/scheme/AcousticSolver.hpp
@@ -82,10 +82,10 @@ private:
 
   KOKKOS_INLINE_FUNCTION
   void computeAjr(const Kokkos::View<const double*>& rhocj,
-                  const Kokkos::View<const double**>& ljr,
-                  const Kokkos::View<const Rd**>& njr)
+                  const NodeByCellData<Rd>& Cjr,
+                  const NodeByCellData<double>& ljr,
+                  const NodeByCellData<Rd>& njr)
   {
-    const NodeByCellData<Rd>& Cjr = m_mesh_data.Cjr();
     Kokkos::parallel_for("new nested Ajr", m_mesh.numberOfCells(), KOKKOS_LAMBDA(const int& j) {
         const size_t& nb_nodes =m_Ajr.numberOfSubValues(j);
         const double& rho_c = rhocj(j);
@@ -222,11 +222,10 @@ private:
                              const Kokkos::View<const double*>& cj,
                              const Kokkos::View<const double*>& Vj,
                              const NodeByCellData<Rd>& Cjr,
-                             const Kokkos::View<const double**>& ljr,
-                             const Kokkos::View<const Rd**>& njr) {
+                             const NodeByCellData<double>& ljr,
+                             const NodeByCellData<Rd>& njr) {
     const Kokkos::View<const double*> rhocj  = computeRhoCj(rhoj, cj);
-    // const Kokkos::View<const Rdd**> Ajr =
-    computeAjr(rhocj, ljr, njr);
+    computeAjr(rhocj, Cjr, ljr, njr);
 
     const Kokkos::View<const Rdd*> Ar = computeAr(m_Ajr);
     const Kokkos::View<const Rd*> br = computeBr(m_Ajr, Cjr, uj, pj);
@@ -271,7 +270,7 @@ public:
   double acoustic_dt(const Kokkos::View<const double*>& Vj,
                      const Kokkos::View<const double*>& cj) const
   {
-    const Kokkos::View<const double**> ljr = m_mesh_data.ljr();
+    const NodeByCellData<double>& ljr = m_mesh_data.ljr();
 
     Kokkos::parallel_for(m_mesh.numberOfCells(), KOKKOS_LAMBDA(const int& j){
         const auto& cell_nodes = m_mesh.connectivity().m_cell_to_node_matrix.rowConst(j);
@@ -305,8 +304,8 @@ public:
     const Kokkos::View<const Rd*> xj = m_mesh_data.xj();
     const Kokkos::View<const double*> Vj = m_mesh_data.Vj();
     const NodeByCellData<Rd>& Cjr = m_mesh_data.Cjr();
-    const Kokkos::View<const double**> ljr = m_mesh_data.ljr();
-    const Kokkos::View<const Rd**> njr = m_mesh_data.njr();
+    const NodeByCellData<double>& ljr = m_mesh_data.ljr();
+    const NodeByCellData<Rd>& njr = m_mesh_data.njr();
     Kokkos::View<Rd*> xr = m_mesh.xr();
 
     computeExplicitFluxes(xr, xj, rhoj, uj, pj, cj, Vj, Cjr, ljr, njr);