diff --git a/src/mesh/Connectivity.cpp b/src/mesh/Connectivity.cpp
index f53b5857441250188d910e84b7acfcbfae927a29..5ce0c5aabfaa8a13533c2a3a0da459d9161a163f 100644
--- a/src/mesh/Connectivity.cpp
+++ b/src/mesh/Connectivity.cpp
@@ -249,12 +249,6 @@ Connectivity(const std::vector<std::vector<unsigned int>>& cell_by_node_vector)
   m_connectivity_computer.computeInverseConnectivityMatrix(cell_to_node_matrix,
                                                            node_to_cell_matrix);
 
-  m_node_local_numbers_in_their_cells
-      = m_connectivity_computer.computeLocalItemNumberInChildItem<ItemType::node, ItemType::cell>(*this);
-
-  m_cell_local_numbers_in_their_nodes
-      = m_connectivity_computer.computeLocalItemNumberInChildItem<ItemType::cell, ItemType::node>(*this);
-
   if constexpr (Dimension>1) {
     this->_computeFaceCellConnectivities();
   }
diff --git a/src/mesh/Connectivity.hpp b/src/mesh/Connectivity.hpp
index 0c2a52fba635e00810573b00eaffd5d0ecd80c7d..420dbb8d0bce68a4aada4178bf78c3599e51c74c 100644
--- a/src/mesh/Connectivity.hpp
+++ b/src/mesh/Connectivity.hpp
@@ -230,6 +230,51 @@ class Connectivity final
  public:
   static constexpr size_t dimension = Dimension;
 
+ private:
+  ConnectivityMatrix m_item_to_item_matrix[Dimension+1][Dimension+1];
+
+  FaceValuePerCell<const bool> m_cell_face_is_reversed;
+
+  NodeValuePerCell<const unsigned short> m_cell_local_numbers_in_their_nodes;
+
+  CellValuePerFace<const unsigned short> m_face_local_numbers_in_their_cells;
+
+  CellValuePerNode<const unsigned short> m_node_local_numbers_in_their_cells;
+
+  // not plugged ...
+#warning remaining def
+  NodeValuePerFace<unsigned short> m_node_local_numbers_in_their_faces;
+  FaceValuePerNode<unsigned short> m_face_local_numbers_in_their_nodes;
+  // ... not plugged
+
+  ConnectivityComputer m_connectivity_computer;
+
+  std::vector<RefFaceList> m_ref_face_list;
+  std::vector<RefNodeList> m_ref_node_list;
+
+  Kokkos::View<double*> m_inv_cell_nb_nodes;
+
+  using Face = ConnectivityFace<Dimension>;
+
+  std::unordered_map<Face, unsigned int, typename Face::Hash> m_face_number_map;
+
+  void _computeFaceCellConnectivities();
+
+  template <typename SubItemValuePerItemType>
+  KOKKOS_INLINE_FUNCTION
+  const SubItemValuePerItemType&
+  _lazzyBuildItemNumberInTheirChild(const SubItemValuePerItemType& sub_item_value_per_item) const
+  {
+    if (not sub_item_value_per_item.isBuilt()) {
+      const_cast<SubItemValuePerItemType&>(sub_item_value_per_item)
+          = m_connectivity_computer
+          . computeLocalItemNumberInChildItem<SubItemValuePerItemType::item_t,
+                                              SubItemValuePerItemType::sub_item_t>(*this);
+    }
+    return sub_item_value_per_item;
+  }
+
+ public:
   template <ItemType item_type_0, ItemType item_type_1>
   const ConnectivityMatrix& itemToItemMatrix() const
   {
@@ -250,60 +295,29 @@ class Connectivity final
 
   const auto& cellLocalNumbersInTheirNodes() const
   {
-    return m_cell_local_numbers_in_their_nodes;
+    return _lazzyBuildItemNumberInTheirChild(m_cell_local_numbers_in_their_nodes);
   }
 
   const auto& nodeLocalNumbersInTheirCells() const
   {
-    return m_node_local_numbers_in_their_cells;
+    return _lazzyBuildItemNumberInTheirChild(m_node_local_numbers_in_their_cells);
   }
 
   const auto& faceLocalNumbersInTheirCells() const
   {
     if constexpr(dimension>1) {
-      return m_face_local_numbers_in_their_cells;
+      return _lazzyBuildItemNumberInTheirChild(m_face_local_numbers_in_their_cells);
     } else {
-      return m_node_local_numbers_in_their_cells;
+      return _lazzyBuildItemNumberInTheirChild(m_node_local_numbers_in_their_cells);
     }
   }
 
-  const auto& nodeToFaceLocalNode() const
+  const auto& nodeLocalNumbersInTheirFaces() const
   {
     static_assert(Dimension==1,"this function has no meaning in 1d");
-    return m_node_local_numbers_in_their_faces;
+    return _lazzyBuildItemNumberInTheirChild(m_node_local_numbers_in_their_faces);
   }
 
-private:
-  ConnectivityMatrix m_item_to_item_matrix[Dimension+1][Dimension+1];
-
-  FaceValuePerCell<const bool> m_cell_face_is_reversed;
-
-  NodeValuePerCell<const unsigned short> m_cell_local_numbers_in_their_nodes;
-
-  CellValuePerFace<const unsigned short> m_face_local_numbers_in_their_cells;
-
-  CellValuePerNode<const unsigned short> m_node_local_numbers_in_their_cells;
-
-  // not plugged ...
-#warning remaining def
-  NodeValuePerFace<unsigned short> m_node_local_numbers_in_their_faces;
-  FaceValuePerNode<unsigned short> m_face_local_numbers_in_their_nodes;
-  // ... not plugged
-
-  ConnectivityComputer m_connectivity_computer;
-
-  std::vector<RefFaceList> m_ref_face_list;
-  std::vector<RefNodeList> m_ref_node_list;
-
-  Kokkos::View<double*> m_inv_cell_nb_nodes;
-
-  using Face = ConnectivityFace<Dimension>;
-
-  std::unordered_map<Face, unsigned int, typename Face::Hash> m_face_number_map;
-
-  void _computeFaceCellConnectivities();
-
- public:
   void addRefFaceList(const RefFaceList& ref_face_list)
   {
     m_ref_face_list.push_back(ref_face_list);
diff --git a/src/mesh/SubItemValuePerItem.hpp b/src/mesh/SubItemValuePerItem.hpp
index 7b1cddd143fcb85876007650080473a5aeee2d30..c6e98dcf6cebe539f008038051ce52a9927ef6a8 100644
--- a/src/mesh/SubItemValuePerItem.hpp
+++ b/src/mesh/SubItemValuePerItem.hpp
@@ -23,7 +23,12 @@ class SubItemValuePerItem<DataType,
                           item_type,
                           std::enable_if_t<sub_item_type != item_type>>
 {
+ public:
+  static const ItemType item_t{item_type};
+  static const ItemType sub_item_t{sub_item_type};
  private:
+  bool m_is_built{false};
+
   ConnectivityMatrix::HostRowType m_host_row_map;
   Kokkos::View<DataType*> m_values;
 
@@ -76,9 +81,16 @@ class SubItemValuePerItem<DataType,
     }
   };
 
+  KOKKOS_FORCEINLINE_FUNCTION
+  const bool& isBuilt() const
+  {
+    return m_is_built;
+  }
+
   KOKKOS_FORCEINLINE_FUNCTION
   DataType& operator()(const size_t& j, const size_t& r)
   {
+    Assert(m_is_built);
     return m_values[m_host_row_map(j)+r];
   }
 
@@ -87,18 +99,21 @@ class SubItemValuePerItem<DataType,
   KOKKOS_FORCEINLINE_FUNCTION
   DataType& operator()(const size_t& j, const size_t& r) const
   {
+    Assert(m_is_built);
     return m_values[m_host_row_map(j)+r];
   }
 
   KOKKOS_INLINE_FUNCTION
   size_t numberOfValues() const
   {
+    Assert(m_is_built);
     return m_values.extent(0);
   }
 
   KOKKOS_FORCEINLINE_FUNCTION
   DataType& operator[](const size_t& i)
   {
+    Assert(m_is_built);
     return m_values[i];
   }
 
@@ -107,12 +122,14 @@ class SubItemValuePerItem<DataType,
   KOKKOS_FORCEINLINE_FUNCTION
   DataType& operator[](const size_t & i) const
   {
+    Assert(m_is_built);
     return m_values[i];
   }
 
   KOKKOS_INLINE_FUNCTION
   size_t numberOfItems() const
   {
+    Assert(m_is_built);
     Assert(m_host_row_map.extent(0) != 0);
     return m_host_row_map.extent(0);
   }
@@ -120,12 +137,14 @@ class SubItemValuePerItem<DataType,
   KOKKOS_INLINE_FUNCTION
   size_t numberOfSubValues(const size_t& i_cell) const
   {
+    Assert(m_is_built);
     return m_host_row_map(i_cell+1)-m_host_row_map(i_cell);
   }
 
   KOKKOS_INLINE_FUNCTION
   SubView itemValues(const size_t& i_cell)
   {
+    Assert(m_is_built);
     const auto& cell_begin = m_host_row_map(i_cell);
     const auto& cell_end = m_host_row_map(i_cell+1);
     return SubView(m_values, cell_begin, cell_end);
@@ -136,6 +155,7 @@ class SubItemValuePerItem<DataType,
   KOKKOS_INLINE_FUNCTION
   SubView itemValues(const size_t& i_cell) const
   {
+    Assert(m_is_built);
     const auto& cell_begin = m_host_row_map(i_cell);
     const auto& cell_end = m_host_row_map(i_cell+1);
     return SubView(m_values, cell_begin, cell_end);
@@ -155,6 +175,9 @@ class SubItemValuePerItem<DataType,
                   "Cannot assign const  SubItemValuePerItem to a non const SubItemValuePerItem");
     m_host_row_map = sub_item_value_per_item.m_host_row_map;
     m_values = sub_item_value_per_item.m_values;
+
+    m_is_built = sub_item_value_per_item.m_is_built;
+
     return *this;
   }
 
@@ -168,6 +191,7 @@ class SubItemValuePerItem<DataType,
   SubItemValuePerItem() = default;
 
   SubItemValuePerItem(const IConnectivity& connectivity)
+      : m_is_built{true}
   {
     ConnectivityMatrix connectivity_matrix
         = connectivity.getMatrix(item_type, sub_item_type);