diff --git a/src/mesh/Connectivity.hpp b/src/mesh/Connectivity.hpp
index 23a13a78d4ddba33c173a7e4188955373da86dd8..9c304864d89c5f494238ca71b318ee7b674777a6 100644
--- a/src/mesh/Connectivity.hpp
+++ b/src/mesh/Connectivity.hpp
@@ -30,8 +30,7 @@
 
 #include <RefId.hpp>
 #include <ItemType.hpp>
-#include <RefNodeList.hpp>
-#include <RefFaceList.hpp>
+#include <RefItemList.hpp>
 
 #include <SynchronizerManager.hpp>
 
diff --git a/src/mesh/ConnectivityDispatcher.cpp b/src/mesh/ConnectivityDispatcher.cpp
index 08fea56bfd2d023b0defffa79a0ed3aeb34d3723..6dcf3177c0d1d477e41ca85c66e7c6f71d0ec334 100644
--- a/src/mesh/ConnectivityDispatcher.cpp
+++ b/src/mesh/ConnectivityDispatcher.cpp
@@ -516,7 +516,7 @@ ConnectivityDispatcher<Dimension>::_buildItemReferenceList()
             block_type ref_bit{1<<i};
             auto item_ref_list = m_connectivity.refFaceList(i_ref);
 
-            const auto& item_list = item_ref_list.faceList();
+            const auto& item_list = item_ref_list.list();
             for (size_t i_item=0; i_item<item_list.size(); ++i_item) {
               const ItemId& item_id = item_list[i_item];
               item_references[item_id] |= ref_bit;
diff --git a/src/mesh/GmshReader.cpp b/src/mesh/GmshReader.cpp
index 662507e905e1958cbfb97ec77d85ff50d1534db8..35743518cc1d8add53d3f2b0f8850a4e3dd0e8b1 100644
--- a/src/mesh/GmshReader.cpp
+++ b/src/mesh/GmshReader.cpp
@@ -12,7 +12,7 @@
 #include <Mesh.hpp>
 #include <MeshData.hpp>
 
-#include <RefFaceList.hpp>
+#include <RefItemList.hpp>
 #include <Messenger.hpp>
 
 #include <ArrayUtils.hpp>
diff --git a/src/mesh/MeshNodeBoundary.hpp b/src/mesh/MeshNodeBoundary.hpp
index 2f83c82dc3a1c5451d51bcd0b293e7d6090a7d4a..ae31e3240384b9d5d0cc28160cc557603c55b784 100644
--- a/src/mesh/MeshNodeBoundary.hpp
+++ b/src/mesh/MeshNodeBoundary.hpp
@@ -7,8 +7,7 @@
 #include <Kokkos_Vector.hpp>
 #include <TinyVector.hpp>
 
-#include <RefNodeList.hpp>
-#include <RefFaceList.hpp>
+#include <RefItemList.hpp>
 
 #include <ConnectivityMatrix.hpp>
 #include <IConnectivity.hpp>
@@ -38,7 +37,7 @@ class MeshNodeBoundary
     const auto& face_to_cell_matrix
         = mesh.connectivity().faceToCellMatrix();
 
-    const Array<const FaceId>& face_list = ref_face_list.faceList();
+    const Array<const FaceId>& face_list = ref_face_list.list();
     parallel_for(face_list.size(), PASTIS_LAMBDA(const int& l){
         const auto& face_cells = face_to_cell_matrix[face_list[l]];
         if (face_cells.size()>1) {
@@ -74,7 +73,7 @@ class MeshNodeBoundary
 
   template <typename MeshType>
   MeshNodeBoundary(const MeshType&, const RefNodeList& ref_node_list)
-      : m_node_list(ref_node_list.nodeList())
+      : m_node_list(ref_node_list.list())
   {
     static_assert(Dimension == MeshType::Dimension);
   }
diff --git a/src/mesh/RefFaceList.hpp b/src/mesh/RefFaceList.hpp
deleted file mode 100644
index cbc7d3b997983c0bdc03d9513684cde8bd669873..0000000000000000000000000000000000000000
--- a/src/mesh/RefFaceList.hpp
+++ /dev/null
@@ -1,40 +0,0 @@
-#ifndef REF_FACE_LIST_HPP
-#define REF_FACE_LIST_HPP
-
-#include <Array.hpp>
-#include <RefId.hpp>
-
-class RefFaceList
-{
- private:
-  RefId m_ref_id;
-  Array<const FaceId> m_face_id_list;
-
- public:
-  const RefId& refId() const
-  {
-    return m_ref_id;
-  }
-
-  const Array<const FaceId>& faceList() const
-  {
-    return m_face_id_list;
-  }
-
-  RefFaceList(const RefId& ref_id,
-              const Array<const FaceId>& face_id_list)
-      : m_ref_id(ref_id),
-        m_face_id_list(face_id_list)
-  {
-    ;
-  }
-
-  RefFaceList& operator=(const RefFaceList&) = default;
-  RefFaceList& operator=(RefFaceList&&) = default;
-
-  RefFaceList() = default;
-  RefFaceList(const RefFaceList&) = default;
-  ~RefFaceList() = default;
-};
-
-#endif // REF_FACE_LIST_HPP
diff --git a/src/mesh/RefItemList.hpp b/src/mesh/RefItemList.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..dea69f7ec79e2ca139eeb9f01600e687f6bea3d4
--- /dev/null
+++ b/src/mesh/RefItemList.hpp
@@ -0,0 +1,50 @@
+#ifndef REF_ITEM_LIST_HPP
+#define REF_ITEM_LIST_HPP
+
+#include <Array.hpp>
+#include <RefId.hpp>
+#include <ItemId.hpp>
+
+template <ItemType item_type>
+class RefItemList
+{
+ public:
+  using ItemId = ItemIdT<item_type>;
+
+ private:
+  RefId m_ref_id;
+  Array<const ItemId> m_item_id_list;
+
+ public:
+  const RefId& refId() const
+  {
+    return m_ref_id;
+  }
+
+  const Array<const ItemId>& list() const
+  {
+    return m_item_id_list;
+  }
+
+  RefItemList(const RefId& ref_id,
+              const Array<const ItemId>& item_id_list)
+      : m_ref_id(ref_id),
+        m_item_id_list(item_id_list)
+  {
+    ;
+  }
+
+  RefItemList& operator=(const RefItemList&) = default;
+  RefItemList& operator=(RefItemList&&) = default;
+
+  RefItemList() = default;
+  RefItemList(const RefItemList&) = default;
+  ~RefItemList() = default;
+};
+
+using RefNodeList = RefItemList<ItemType::node>;
+using RefEdgeList = RefItemList<ItemType::edge>;
+using RefFaceList = RefItemList<ItemType::face>;
+using RefCellList = RefItemList<ItemType::cell>;
+
+#endif // REF_ITEM_LIST_HPP
diff --git a/src/mesh/RefNodeList.hpp b/src/mesh/RefNodeList.hpp
deleted file mode 100644
index 462d23bb3d35a6384fcd5176d0584419a586abc3..0000000000000000000000000000000000000000
--- a/src/mesh/RefNodeList.hpp
+++ /dev/null
@@ -1,40 +0,0 @@
-#ifndef REF_NODE_LIST_HPP
-#define REF_NODE_LIST_HPP
-
-#include <Array.hpp>
-#include <RefId.hpp>
-
-class RefNodeList
-{
- private:
-  RefId m_ref_id;
-  Array<const NodeId> m_node_id_list;
-
- public:
-  const RefId& refId() const
-  {
-    return m_ref_id;
-  }
-
-  const Array<const NodeId>& nodeList() const
-  {
-    return m_node_id_list;
-  }
-
-  RefNodeList(const RefId& ref_id,
-              const Array<const NodeId>& node_id_list)
-      : m_ref_id(ref_id),
-        m_node_id_list(node_id_list)
-  {
-    ;
-  }
-
-  RefNodeList& operator=(const RefNodeList&) = default;
-  RefNodeList& operator=(RefNodeList&&) = default;
-
-  RefNodeList() = default;
-  RefNodeList(const RefNodeList&) = default;
-  ~RefNodeList() = default;
-};
-
-#endif // REF_NODE_LIST_HPP
diff --git a/src/scheme/BoundaryCondition.hpp b/src/scheme/BoundaryCondition.hpp
index 0380f97c021b637a623146cd1be7f18524913e2d..669f546c19faf2e0cf059acef0f90ee2083682a4 100644
--- a/src/scheme/BoundaryCondition.hpp
+++ b/src/scheme/BoundaryCondition.hpp
@@ -6,7 +6,7 @@
 
 #include <Array.hpp>
 
-#include <RefNodeList.hpp>
+#include <RefItemList.hpp>
 #include <MeshNodeBoundary.hpp>
 
 class BoundaryCondition