diff --git a/src/mesh/Connectivity1D.hpp b/src/mesh/Connectivity1D.hpp
index cc05b3f8ea3608dd753960d3e3cfcfae325417dc..51ca51a760feb20cdd72d5aa02b8fbde541d46de 100644
--- a/src/mesh/Connectivity1D.hpp
+++ b/src/mesh/Connectivity1D.hpp
@@ -7,6 +7,7 @@
 #include <TinyVector.hpp>
 #include <ConnectivityUtils.hpp>
 
+#include <TypeOfItem.hpp>
 #include <RefId.hpp>
 #include <RefNodeList.hpp>
 
@@ -26,7 +27,12 @@ public:
   // a local node in a cell
   ConnectivityMatrix m_node_id_per_cell_matrix;
 
-private:
+  ConnectivityMatrix subItemIdPerItemMatrix() const
+  {
+    return m_node_id_per_cell_matrix;
+  }
+
+ private:
   std::vector<RefNodeList> m_ref_node_list;
 
   Kokkos::View<double*> m_inv_cell_nb_nodes;
diff --git a/src/mesh/Connectivity2D.hpp b/src/mesh/Connectivity2D.hpp
index 2714379f57b65521ce778b8d44fabbefe4e66084..b7f2412ffd87dba5f78ca2338f4ec6cf8a14963c 100644
--- a/src/mesh/Connectivity2D.hpp
+++ b/src/mesh/Connectivity2D.hpp
@@ -10,6 +10,7 @@
 #include <map>
 #include <algorithm>
 
+#include <TypeOfItem.hpp>
 #include <RefId.hpp>
 #include <RefNodeList.hpp>
 #include <RefFaceList.hpp>
@@ -33,6 +34,11 @@ class Connectivity2D
   // a local node in a cell
   ConnectivityMatrix m_node_id_per_cell_matrix;
 
+  inline ConnectivityMatrix subItemIdPerItemMatrix() const
+  {
+    return m_node_id_per_cell_matrix;
+  }
+
  private:
   std::vector<RefFaceList> m_ref_face_list;
   std::vector<RefNodeList> m_ref_node_list;
diff --git a/src/mesh/Connectivity3D.hpp b/src/mesh/Connectivity3D.hpp
index e57d9234a77f9a75e1e580ca672cc1a3946ddcf7..0eb1c631898a37582d44e4634f7df6739fba0f7c 100644
--- a/src/mesh/Connectivity3D.hpp
+++ b/src/mesh/Connectivity3D.hpp
@@ -12,6 +12,7 @@
 #include <algorithm>
 
 #include <RefId.hpp>
+#include <TypeOfItem.hpp>
 #include <RefNodeList.hpp>
 #include <RefFaceList.hpp>
 
@@ -41,6 +42,11 @@ public:
   // a local node in a cell
   ConnectivityMatrix m_node_id_per_cell_matrix;
 
+  inline ConnectivityMatrix subItemIdPerItemMatrix() const
+  {
+    return m_node_id_per_cell_matrix;
+  }
+
 private:
   std::vector<RefFaceList> m_ref_face_list;
   std::vector<RefNodeList> m_ref_node_list;
diff --git a/src/mesh/MeshData.hpp b/src/mesh/MeshData.hpp
index c8cef0b7a7af3a27c93ca2e43f27c5a30b7e3843..09278a77fcd2eb9e30bde67e7a202db0181cb1cc 100644
--- a/src/mesh/MeshData.hpp
+++ b/src/mesh/MeshData.hpp
@@ -203,9 +203,9 @@ class MeshData
 
   MeshData(const MeshType& mesh)
       : m_mesh(mesh),
-        m_Cjr(mesh.connectivity().m_node_id_per_cell_matrix),
-        m_ljr(mesh.connectivity().m_node_id_per_cell_matrix),
-        m_njr(mesh.connectivity().m_node_id_per_cell_matrix),
+        m_Cjr(mesh.connectivity()),
+        m_ljr(mesh.connectivity()),
+        m_njr(mesh.connectivity()),
         m_xj("xj", mesh.numberOfCells()),
         m_Vj("Vj", mesh.numberOfCells())
   {
diff --git a/src/mesh/TypeOfItem.hpp b/src/mesh/TypeOfItem.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..4b1b7d6a05b18c2b4fd933144469d7a9b24aa31d
--- /dev/null
+++ b/src/mesh/TypeOfItem.hpp
@@ -0,0 +1,11 @@
+#ifndef TYPE_OF_ITEM_HPP
+#define TYPE_OF_ITEM_HPP
+
+enum class TypeOfItem {
+  node = 0,
+  edge = 1,
+  face = 2,
+  cell = 3
+};
+
+#endif // TYPE_OF_ITEM_HPP
diff --git a/src/scheme/AcousticSolver.hpp b/src/scheme/AcousticSolver.hpp
index f23dce1c6ee53ac26cb0ebf65dcb7bd37d8ca950..6f1b9256a157d43d8e7e62c60820b1f9888ac702 100644
--- a/src/scheme/AcousticSolver.hpp
+++ b/src/scheme/AcousticSolver.hpp
@@ -255,10 +255,10 @@ class AcousticSolver
         m_connectivity(m_mesh.connectivity()),
         m_boundary_condition_list(bc_list),
         m_br("br", m_mesh.numberOfNodes()),
-        m_Ajr(m_connectivity.m_node_id_per_cell_matrix),
+        m_Ajr(m_connectivity),
         m_Ar("Ar", m_mesh.numberOfNodes()),
         m_inv_Ar("inv_Ar", m_mesh.numberOfNodes()),
-        m_Fjr(m_connectivity.m_node_id_per_cell_matrix),
+        m_Fjr(m_connectivity),
         m_ur("ur", m_mesh.numberOfNodes()),
         m_rhocj("rho_c", m_mesh.numberOfCells()),
         m_Vj_over_cj("Vj_over_cj", m_mesh.numberOfCells())
diff --git a/src/scheme/SubItemValuePerItem.hpp b/src/scheme/SubItemValuePerItem.hpp
index f185b519ae4fdd810b6ceb5c2fe9d54b59500286..225001939c8e3a40507d34e6d12efa5a35a2d13c 100644
--- a/src/scheme/SubItemValuePerItem.hpp
+++ b/src/scheme/SubItemValuePerItem.hpp
@@ -2,18 +2,12 @@
 #define SUBITEM_VALUE_PER_ITEM_HPP
 
 #include <Kokkos_StaticCrsGraph.hpp>
+#include <TypeOfItem.hpp>
 
 #warning should not stand in the scheme directory
 
 typedef Kokkos::StaticCrsGraph<unsigned int, Kokkos::HostSpace> ConnectivityMatrix;
 
-enum class TypeOfItem {
-  node,
-  edge,
-  face,
-  cell
-};
-
 template <typename DataType,
           TypeOfItem SubItemType,
           TypeOfItem ItemType>
@@ -166,8 +160,10 @@ class SubItemValuePerItem
   }
 
   SubItemValuePerItem() = default;
-  SubItemValuePerItem(const ConnectivityMatrix& subitem_id_per_item_matrix)
-      : m_subitem_id_per_item_matrix(subitem_id_per_item_matrix),
+
+  template <typename ConnectivityType>
+  SubItemValuePerItem(const ConnectivityType& connectivity)
+      : m_subitem_id_per_item_matrix(connectivity.subItemIdPerItemMatrix()),
         m_values("values", m_subitem_id_per_item_matrix.entries.extent(0))
   {
     ;
@@ -176,7 +172,6 @@ class SubItemValuePerItem
   ~SubItemValuePerItem() = default;
 };
 
-
 template <typename DataType>
 using NodeValuePerCell = SubItemValuePerItem<DataType, TypeOfItem::node, TypeOfItem::cell>;