diff --git a/src/mesh/DiamondDualConnectivityBuilder.cpp b/src/mesh/DiamondDualConnectivityBuilder.cpp
index 93a559b725fa2633bf5aa208dfbb0383aa0c3224..44606bc0edca1e6dfe70a979fa86b4595d1db52f 100644
--- a/src/mesh/DiamondDualConnectivityBuilder.cpp
+++ b/src/mesh/DiamondDualConnectivityBuilder.cpp
@@ -3,6 +3,7 @@
 #include <mesh/Connectivity.hpp>
 #include <mesh/ConnectivityDescriptor.hpp>
 #include <mesh/ConnectivityDispatcher.hpp>
+#include <mesh/ConnectivityToDiamondDualConnectivityDataMapper.hpp>
 #include <mesh/ItemValueUtils.hpp>
 #include <mesh/Mesh.hpp>
 #include <mesh/RefId.hpp>
@@ -481,6 +482,11 @@ DiamondDualConnectivityBuilder::_buildDiamondConnectivityFrom(const IConnectivit
   }
 
   m_connectivity = ConnectivityType::build(diamond_descriptor);
+
+  m_mapper =
+    std::make_shared<ConnectivityToDiamondDualConnectivityDataMapper<Dimension>>(primal_connectivity,
+                                                                                 dynamic_cast<const ConnectivityType&>(
+                                                                                   *m_connectivity));
 }
 
 DiamondDualConnectivityBuilder::DiamondDualConnectivityBuilder(const IConnectivity& connectivity)
diff --git a/src/mesh/DiamondDualConnectivityBuilder.hpp b/src/mesh/DiamondDualConnectivityBuilder.hpp
index e0c18457a20f5317a8e775535a2b5ee4f44bce60..bed1e9daff01e46e38908b1268f298c1045a6d73 100644
--- a/src/mesh/DiamondDualConnectivityBuilder.hpp
+++ b/src/mesh/DiamondDualConnectivityBuilder.hpp
@@ -9,9 +9,13 @@ template <size_t>
 class Connectivity;
 class ConnectivityDescriptor;
 
+class IConnectivityToDiamondDualConnectivityDataMapper;
+
 class DiamondDualConnectivityBuilder : public ConnectivityBuilderBase
 {
  private:
+  std::shared_ptr<IConnectivityToDiamondDualConnectivityDataMapper> m_mapper;
+
   template <size_t Dimension>
   void _buildDiamondConnectivityDescriptor(const Connectivity<Dimension>&, ConnectivityDescriptor&);
 
@@ -22,6 +26,12 @@ class DiamondDualConnectivityBuilder : public ConnectivityBuilderBase
   DiamondDualConnectivityBuilder(const IConnectivity&);
 
  public:
+  std::shared_ptr<IConnectivityToDiamondDualConnectivityDataMapper>
+  mapper() const
+  {
+    return m_mapper;
+  }
+
   ~DiamondDualConnectivityBuilder() = default;
 };
 
diff --git a/src/mesh/DiamondDualConnectivityManager.cpp b/src/mesh/DiamondDualConnectivityManager.cpp
index aed409bdaf6fb6e0f60b71f9d77f1a94ec238fc1..9459010b69e89acaf3f247866d2f6e81ef00cd81 100644
--- a/src/mesh/DiamondDualConnectivityManager.cpp
+++ b/src/mesh/DiamondDualConnectivityManager.cpp
@@ -41,57 +41,40 @@ DiamondDualConnectivityManager::deleteConnectivity(const IConnectivity* p_connec
   m_connectivity_to_diamond_dual_connectivity_info_map.erase(p_connectivity);
 }
 
-template <size_t Dimension>
-std::shared_ptr<const Connectivity<Dimension>>
-DiamondDualConnectivityManager::getDiamondDualConnectivity(const Connectivity<Dimension>& connectivity)
+DiamondDualConnectivityManager::DiamondDualConnectivityInfo
+DiamondDualConnectivityManager::_getDiamondDualConnectivityInfo(const IConnectivity& connectivity)
 {
   const IConnectivity* p_connectivity = &connectivity;
 
   if (auto i_connectivity = m_connectivity_to_diamond_dual_connectivity_info_map.find(p_connectivity);
       i_connectivity != m_connectivity_to_diamond_dual_connectivity_info_map.end()) {
-    auto& [connectivity, diamond_dual_connectivity_info] = *i_connectivity;
-    return std::dynamic_pointer_cast<const Connectivity<Dimension>>(
-      diamond_dual_connectivity_info.diamondDualConnectivity());
+    return i_connectivity->second;
   } else {
     DiamondDualConnectivityBuilder builder{connectivity};
 
-    std::shared_ptr diamond_connectivity =
-      std::dynamic_pointer_cast<const Connectivity<Dimension>>(builder.connectivity());
-    std::shared_ptr<IConnectivityToDiamondDualConnectivityDataMapper> mapper =
-      std::make_shared<ConnectivityToDiamondDualConnectivityDataMapper<Dimension>>(connectivity, *diamond_connectivity);
+    DiamondDualConnectivityInfo connectivity_info{builder.connectivity(), builder.mapper()};
 
-    m_connectivity_to_diamond_dual_connectivity_info_map[p_connectivity] =
-      DiamondDualConnectivityInfo{diamond_connectivity, mapper};
+    m_connectivity_to_diamond_dual_connectivity_info_map[p_connectivity] = connectivity_info;
 
-    return diamond_connectivity;
+    return connectivity_info;
   }
 }
 
+template <size_t Dimension>
+std::shared_ptr<const Connectivity<Dimension>>
+DiamondDualConnectivityManager::getDiamondDualConnectivity(const Connectivity<Dimension>& connectivity)
+{
+  return std::dynamic_pointer_cast<const Connectivity<Dimension>>(
+    this->_getDiamondDualConnectivityInfo(connectivity).diamondDualConnectivity());
+}
+
 template <size_t Dimension>
 std::shared_ptr<const ConnectivityToDiamondDualConnectivityDataMapper<Dimension>>
 DiamondDualConnectivityManager::getConnectivityToDiamondDualConnectivityDataMapper(
   const Connectivity<Dimension>& connectivity)
 {
-  const IConnectivity* p_connectivity = &connectivity;
-
-  if (auto i_connectivity = m_connectivity_to_diamond_dual_connectivity_info_map.find(p_connectivity);
-      i_connectivity != m_connectivity_to_diamond_dual_connectivity_info_map.end()) {
-    auto& [connectivity, diamond_dual_connectivity_info] = *i_connectivity;
-    return std::dynamic_pointer_cast<const ConnectivityToDiamondDualConnectivityDataMapper<Dimension>>(
-      diamond_dual_connectivity_info.connectivityToDiamondDualConnectivityDataMapper());
-  } else {
-    DiamondDualConnectivityBuilder builder{connectivity};
-
-    std::shared_ptr diamond_connectivity =
-      std::dynamic_pointer_cast<const Connectivity<Dimension>>(builder.connectivity());
-    std::shared_ptr<IConnectivityToDiamondDualConnectivityDataMapper> mapper =
-      std::make_shared<ConnectivityToDiamondDualConnectivityDataMapper<Dimension>>(connectivity, *diamond_connectivity);
-
-    m_connectivity_to_diamond_dual_connectivity_info_map[p_connectivity] =
-      DiamondDualConnectivityInfo{diamond_connectivity, mapper};
-
-    return std::dynamic_pointer_cast<const ConnectivityToDiamondDualConnectivityDataMapper<Dimension>>(mapper);
-  }
+  return std::dynamic_pointer_cast<const ConnectivityToDiamondDualConnectivityDataMapper<Dimension>>(
+    this->_getDiamondDualConnectivityInfo(connectivity).connectivityToDiamondDualConnectivityDataMapper());
 }
 
 template std::shared_ptr<const Connectivity<1>> DiamondDualConnectivityManager::getDiamondDualConnectivity(
diff --git a/src/mesh/DiamondDualConnectivityManager.hpp b/src/mesh/DiamondDualConnectivityManager.hpp
index 3b7eb2ceaff5c1cacfa26f0bb4194af457e209a2..33dfbaf4cf7cc8e59eebfc095624d43c5bf038b3 100644
--- a/src/mesh/DiamondDualConnectivityManager.hpp
+++ b/src/mesh/DiamondDualConnectivityManager.hpp
@@ -56,6 +56,8 @@ class DiamondDualConnectivityManager
     ~DiamondDualConnectivityInfo() = default;
   };
 
+  DiamondDualConnectivityInfo _getDiamondDualConnectivityInfo(const IConnectivity& connectivity);
+
   std::unordered_map<const IConnectivity*, DiamondDualConnectivityInfo>
     m_connectivity_to_diamond_dual_connectivity_info_map;