diff --git a/src/mesh/Connectivity.cpp b/src/mesh/Connectivity.cpp
index 28c6ef57b27ffb534f3f4e322699bc306f9ca293..5c9d598367f05330deef627f62af1f519c0d8794 100644
--- a/src/mesh/Connectivity.cpp
+++ b/src/mesh/Connectivity.cpp
@@ -134,7 +134,10 @@ _buildFrom(const ConnectivityDescriptor& descriptor)
       m_face_is_owned = face_is_owned;
     }
 
+    m_ref_node_list_vector = descriptor.template refItemListVector<ItemType::node>();
+    m_ref_edge_list_vector = descriptor.template refItemListVector<ItemType::edge>();
     m_ref_face_list_vector = descriptor.template refItemListVector<ItemType::face>();
+    m_ref_cell_list_vector = descriptor.template refItemListVector<ItemType::cell>();
   }
 }
 
diff --git a/src/mesh/ConnectivityDispatcher.cpp b/src/mesh/ConnectivityDispatcher.cpp
index 17e1839cc6a78ba3f56a43533c8bade1ac69a6de..5b9fcdd4e580af0039f35e5add0e229cf6e31e49 100644
--- a/src/mesh/ConnectivityDispatcher.cpp
+++ b/src/mesh/ConnectivityDispatcher.cpp
@@ -639,8 +639,12 @@ ConnectivityDispatcher<Dimension>::ConnectivityDispatcher(const ConnectivityType
 
   this->_buildItemToSubItemDescriptor<NodeOfCell>();
 
+  this->_buildItemReferenceList<ItemType::cell>();
+
   this->_dispatchFaces();
 
+  this->_buildItemReferenceList<ItemType::node>();
+
   m_dispatched_connectivity = ConnectivityType::build(m_new_descriptor);
 }
 
diff --git a/src/mesh/GmshReader.cpp b/src/mesh/GmshReader.cpp
index 8516b48f04b5839ad8ea8a52376000cb62b013a9..d1e4e54122105c26b4f86661b169a57ba743b727 100644
--- a/src/mesh/GmshReader.cpp
+++ b/src/mesh/GmshReader.cpp
@@ -1285,6 +1285,29 @@ GmshReader::__proceedData()
       descriptor.cell_number_vector[jh] = __hexahedra_number[j];
     }
 
+    std::map<unsigned int, std::vector<unsigned int>> ref_cells_map;
+    for (unsigned int r=0; r<__tetrahedra_ref.size(); ++r) {
+      const unsigned int elem_number = __tetrahedra_ref[r];
+      const unsigned int& ref = __tetrahedra_ref[r];
+      ref_cells_map[ref].push_back(elem_number);
+    }
+
+    for (unsigned int j=0; j<__hexahedra_ref.size(); ++j) {
+      const size_t elem_number = nb_tetrahedra+j;
+      const unsigned int& ref = __hexahedra_ref[j];
+      ref_cells_map[ref].push_back(elem_number);
+    }
+
+
+    for (const auto& ref_cell_list : ref_cells_map) {
+      Array<CellId> cell_list(ref_cell_list.second.size());
+      for (size_t j=0; j<ref_cell_list.second.size(); ++j) {
+        cell_list[j]=ref_cell_list.second[j];
+      }
+      const PhysicalRefId& physical_ref_id = m_physical_ref_map.at(ref_cell_list.first);
+      descriptor.addRefItemList(RefCellList(physical_ref_id.refId(), cell_list));
+    }
+
     __computeCellFaceAndFaceNodeConnectivities<3>(descriptor);
 
     descriptor.cell_owner_vector.resize(nb_cells);
@@ -1450,6 +1473,28 @@ GmshReader::__proceedData()
       descriptor.cell_number_vector[jq] = __quadrangles_number[j];
     }
 
+    std::map<unsigned int, std::vector<unsigned int>> ref_cells_map;
+    for (unsigned int r=0; r<__triangles_ref.size(); ++r) {
+      const unsigned int elem_number = __triangles_ref[r];
+      const unsigned int& ref = __triangles_ref[r];
+      ref_cells_map[ref].push_back(elem_number);
+    }
+
+    for (unsigned int j=0; j<__quadrangles_ref.size(); ++j) {
+      const size_t elem_number = nb_triangles+j;
+      const unsigned int& ref = __quadrangles_ref[j];
+      ref_cells_map[ref].push_back(elem_number);
+    }
+
+    for (const auto& ref_cell_list : ref_cells_map) {
+      Array<CellId> cell_list(ref_cell_list.second.size());
+      for (size_t j=0; j<ref_cell_list.second.size(); ++j) {
+        cell_list[j]=ref_cell_list.second[j];
+      }
+      const PhysicalRefId& physical_ref_id = m_physical_ref_map.at(ref_cell_list.first);
+      descriptor.addRefItemList(RefCellList(physical_ref_id.refId(), cell_list));
+    }
+
     this->__computeCellFaceAndFaceNodeConnectivities<2>(descriptor);
 
     descriptor.cell_owner_vector.resize(nb_cells);
@@ -1532,9 +1577,6 @@ GmshReader::__proceedData()
       descriptor.addRefItemList(RefFaceList{physical_ref_id.refId(), face_list});
     }
 
-    std::shared_ptr p_connectivity = Connectivity2D::build(descriptor);
-    Connectivity2D& connectivity = *p_connectivity;
-
     std::map<unsigned int, std::vector<unsigned int>> ref_points_map;
     for (unsigned int r=0; r<__points.size(); ++r) {
       const unsigned int point_number = __points[r];
@@ -1548,9 +1590,13 @@ GmshReader::__proceedData()
         point_list[j]=ref_point_list.second[j];
       }
       const PhysicalRefId& physical_ref_id = m_physical_ref_map.at(ref_point_list.first);
-      connectivity.addRefItemList(RefNodeList(physical_ref_id.refId(), point_list));
+      descriptor.addRefItemList(RefNodeList(physical_ref_id.refId(), point_list));
     }
 
+
+    std::shared_ptr p_connectivity = Connectivity2D::build(descriptor);
+    Connectivity2D& connectivity = *p_connectivity;
+
     using MeshType = Mesh<Connectivity2D>;
     using Rd = TinyVector<2, double>;
 
@@ -1590,10 +1636,6 @@ GmshReader::__proceedData()
               descriptor.node_owner_vector.end(),
               parallel::rank());
 
-
-    std::shared_ptr p_connectivity = Connectivity1D::build(descriptor);
-    Connectivity1D& connectivity = *p_connectivity;
-
     std::map<unsigned int, std::vector<unsigned int>> ref_points_map;
     for (unsigned int r=0; r<__points.size(); ++r) {
       const unsigned int point_number = __points[r];
@@ -1607,9 +1649,12 @@ GmshReader::__proceedData()
         point_list[j]=ref_point_list.second[j];
       }
       const PhysicalRefId& physical_ref_id = m_physical_ref_map.at(ref_point_list.first);
-      connectivity.addRefItemList(RefNodeList(physical_ref_id.refId(), point_list));
+      descriptor.addRefItemList(RefNodeList(physical_ref_id.refId(), point_list));
     }
 
+    std::shared_ptr p_connectivity = Connectivity1D::build(descriptor);
+    Connectivity1D& connectivity = *p_connectivity;
+
     using MeshType = Mesh<Connectivity1D>;
     using Rd = TinyVector<1, double>;