diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 90932a5f76575f4a9dece9f1aacde73e7883ee2a..3416b0daabb146d90da9358502f134023b410a09 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -98,6 +98,7 @@ add_executable (unit_tests
   test_LineTransformation.cpp
   test_ListAffectationProcessor.cpp
   test_MathModule.cpp
+  test_MedianDualConnectivityBuilder.cpp
   test_NameProcessor.cpp
   test_NaNHelper.cpp
   test_OStream.cpp
diff --git a/tests/test_MedianDualConnectivityBuilder.cpp b/tests/test_MedianDualConnectivityBuilder.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..a95e6ad22f8a9b2605dec5c28e7c7704d40aed6f
--- /dev/null
+++ b/tests/test_MedianDualConnectivityBuilder.cpp
@@ -0,0 +1,142 @@
+#include <catch2/catch_test_macros.hpp>
+#include <catch2/matchers/catch_matchers_all.hpp>
+
+#include <MeshDataBaseForTests.hpp>
+#include <mesh/DualConnectivityManager.hpp>
+
+#include <mesh/Connectivity.hpp>
+#include <mesh/ItemValueUtils.hpp>
+#include <mesh/Mesh.hpp>
+
+template <ItemType item_type, typename ConnectivityType>
+inline auto
+get_item_ref_ids(const ConnectivityType& connectivity)
+{
+  std::map<std::string, size_t> ref_id_set;
+  for (size_t i = 0; i < connectivity.template numberOfRefItemList<item_type>(); ++i) {
+    const auto& ref_id_list = connectivity.template refItemList<item_type>(i);
+    std::ostringstream os;
+    os << ref_id_list.refId();
+    ItemValue<size_t, item_type> item_tag{connectivity};
+    item_tag.fill(0);
+    for (size_t i_item = 0; i_item < ref_id_list.list().size(); ++i_item) {
+      item_tag[ref_id_list.list()[i_item]] = 1;
+    }
+
+    ref_id_set[os.str()] = sum(item_tag);
+  }
+  return ref_id_set;
+}
+
+// clazy:excludeall=non-pod-global-static
+
+TEST_CASE("MedianDualConnectivityBuilder", "[mesh]")
+{
+  SECTION("2D")
+  {
+    constexpr static size_t Dimension = 2;
+
+    using ConnectivityType = Connectivity<Dimension>;
+    using MeshType         = Mesh<ConnectivityType>;
+
+    std::shared_ptr<const MeshType> mesh        = MeshDataBaseForTests::get().hybrid2DMesh();
+    const ConnectivityType& primal_connectivity = mesh->connectivity();
+
+    REQUIRE(primal_connectivity.numberOfNodes() == 53);
+    REQUIRE(primal_connectivity.numberOfFaces() == 110);
+    REQUIRE(primal_connectivity.numberOfCells() == 58);
+
+    std::shared_ptr p_median_dual_connectivity =
+      DualConnectivityManager::instance().getMedianDualConnectivity(primal_connectivity);
+    const ConnectivityType& dual_connectivity = *p_median_dual_connectivity;
+
+    REQUIRE(dual_connectivity.numberOfNodes() == 192);
+    REQUIRE(dual_connectivity.numberOfFaces() == 244);
+    REQUIRE(dual_connectivity.numberOfCells() == 53);
+
+    SECTION("ref node list")
+    {
+      REQUIRE(primal_connectivity.numberOfRefItemList<ItemType::node>() == 4);
+      REQUIRE(dual_connectivity.numberOfRefItemList<ItemType::node>() == 4);
+
+      const auto primal_ref_node_list = get_item_ref_ids<ItemType::node>(primal_connectivity);
+      REQUIRE(primal_ref_node_list.size() == 4);
+
+      REQUIRE(primal_ref_node_list.count("XMAXYMAX(11)") == 1);
+      REQUIRE(primal_ref_node_list.count("XMAXYMIN(10)") == 1);
+      REQUIRE(primal_ref_node_list.count("XMINYMAX(9)") == 1);
+      REQUIRE(primal_ref_node_list.count("XMINYMIN(8)") == 1);
+
+      REQUIRE(primal_ref_node_list.at("XMAXYMAX(11)") == 1);
+      REQUIRE(primal_ref_node_list.at("XMAXYMIN(10)") == 1);
+      REQUIRE(primal_ref_node_list.at("XMINYMAX(9)") == 1);
+      REQUIRE(primal_ref_node_list.at("XMINYMIN(8)") == 1);
+
+      const auto dual_ref_node_list = get_item_ref_ids<ItemType::node>(dual_connectivity);
+      REQUIRE(dual_ref_node_list.size() == 4);
+
+      REQUIRE(dual_ref_node_list.count("XMAXYMAX(11)") == 1);
+      REQUIRE(dual_ref_node_list.count("XMAXYMIN(10)") == 1);
+      REQUIRE(dual_ref_node_list.count("XMINYMAX(9)") == 1);
+      REQUIRE(dual_ref_node_list.count("XMINYMIN(8)") == 1);
+
+      REQUIRE(dual_ref_node_list.at("XMAXYMAX(11)") == 1);
+      REQUIRE(dual_ref_node_list.at("XMAXYMIN(10)") == 1);
+      REQUIRE(dual_ref_node_list.at("XMINYMAX(9)") == 1);
+      REQUIRE(dual_ref_node_list.at("XMINYMIN(8)") == 1);
+    }
+
+    SECTION("ref face list")
+    {
+      REQUIRE(primal_connectivity.numberOfRefItemList<ItemType::face>() == 5);
+      REQUIRE(dual_connectivity.numberOfRefItemList<ItemType::face>() == 4);
+
+      const auto primal_ref_face_list = get_item_ref_ids<ItemType::face>(primal_connectivity);
+      REQUIRE(primal_ref_face_list.size() == 5);
+
+      REQUIRE(primal_ref_face_list.count("INTERFACE(5)") == 1);
+      REQUIRE(primal_ref_face_list.count("XMAX(2)") == 1);
+      REQUIRE(primal_ref_face_list.count("XMIN(1)") == 1);
+      REQUIRE(primal_ref_face_list.count("YMAX(3)") == 1);
+      REQUIRE(primal_ref_face_list.count("YMIN(4)") == 1);
+
+      REQUIRE(primal_ref_face_list.at("INTERFACE(5)") == 4);
+      REQUIRE(primal_ref_face_list.at("XMAX(2)") == 4);
+      REQUIRE(primal_ref_face_list.at("XMIN(1)") == 4);
+      REQUIRE(primal_ref_face_list.at("YMAX(3)") == 8);
+      REQUIRE(primal_ref_face_list.at("YMIN(4)") == 8);
+
+      const auto dual_ref_face_list = get_item_ref_ids<ItemType::face>(dual_connectivity);
+      REQUIRE(dual_ref_face_list.size() == 4);
+
+      REQUIRE(dual_ref_face_list.count("XMAX(2)") == 1);
+      REQUIRE(dual_ref_face_list.count("XMIN(1)") == 1);
+      REQUIRE(dual_ref_face_list.count("YMAX(3)") == 1);
+      REQUIRE(dual_ref_face_list.count("YMIN(4)") == 1);
+
+      REQUIRE(dual_ref_face_list.at("XMAX(2)") == 8);
+      REQUIRE(dual_ref_face_list.at("XMIN(1)") == 8);
+      REQUIRE(dual_ref_face_list.at("YMAX(3)") == 16);
+      REQUIRE(dual_ref_face_list.at("YMIN(4)") == 16);
+    }
+
+    SECTION("ref cell list")
+    {
+      REQUIRE(primal_connectivity.numberOfRefItemList<ItemType::cell>() == 2);
+      // Median dual cell references are not computed
+      REQUIRE(dual_connectivity.numberOfRefItemList<ItemType::cell>() == 0);
+
+      const auto primal_ref_cell_list = get_item_ref_ids<ItemType::cell>(primal_connectivity);
+      REQUIRE(primal_ref_cell_list.size() == 2);
+
+      REQUIRE(primal_ref_cell_list.count("LEFT(6)") == 1);
+      REQUIRE(primal_ref_cell_list.count("RIGHT(7)") == 1);
+
+      REQUIRE(primal_ref_cell_list.at("LEFT(6)") == 22);
+      REQUIRE(primal_ref_cell_list.at("RIGHT(7)") == 36);
+
+      const auto dual_ref_cell_list = get_item_ref_ids<ItemType::cell>(dual_connectivity);
+      REQUIRE(dual_ref_cell_list.size() == 0);
+    }
+  }
+}