diff --git a/src/mesh/DiamondDualMeshBuilder.cpp b/src/mesh/DiamondDualMeshBuilder.cpp
index 6554cb512f0ff2d9e556575b4b1ac23bdd047e8f..b7cc33e444dce3698aa7244f7c5edd9c8ffc6cad 100644
--- a/src/mesh/DiamondDualMeshBuilder.cpp
+++ b/src/mesh/DiamondDualMeshBuilder.cpp
@@ -102,13 +102,19 @@ class MeshToDualDataMapper
 
 template <size_t Dimension>
 void
-DiamondDualMeshBuilder::_buildDualDiamondMeshFrom(
-  const Mesh<Connectivity<Dimension>>& primal_mesh,
-  const std::shared_ptr<const Connectivity<Dimension>>& p_diamond_connectivity)
+DiamondDualMeshBuilder::_buildDualDiamondMeshFrom(const std::shared_ptr<const IMesh>& p_i_mesh)
 {
   using ConnectivityType = Connectivity<Dimension>;
   using MeshType         = Mesh<Connectivity<Dimension>>;
 
+  std::shared_ptr p_primal_mesh = std::dynamic_pointer_cast<const MeshType>(p_i_mesh);
+  const MeshType& primal_mesh   = *p_primal_mesh;
+
+  DiamondDualConnectivityManager& manager = DiamondDualConnectivityManager::instance();
+
+  std::shared_ptr<const ConnectivityType> p_diamond_connectivity =
+    manager.getDiamondDualConnectivity(primal_mesh.connectivity());
+
   const ConnectivityType& diamond_connectivity = *p_diamond_connectivity;
 
   const NodeValue<const TinyVector<Dimension>> primal_xr = primal_mesh.xr();
@@ -124,74 +130,21 @@ DiamondDualMeshBuilder::_buildDualDiamondMeshFrom(
   m_mesh = std::make_shared<MeshType>(p_diamond_connectivity, diamond_xr);
 }
 
-// template <>
-// void
-// DiamondDualMeshBuilder::_buildDualDiamondMeshFrom(const Mesh<Connectivity<1>>& primal_mesh,
-//                                                   const std::shared_ptr<const Connectivity<1>>&
-//                                                   p_diamond_connectivity)
-// {
-//   using ConnectivityType = Connectivity<1>;
-//   using MeshType         = Mesh<Connectivity<1>>;
-
-//   const ConnectivityType& diamond_connectivity = *p_diamond_connectivity;
-
-//   const NodeValue<const TinyVector<1>> primal_xr = primal_mesh.xr();
-//   MeshData<1>& primal_mesh_data                  = MeshDataManager::instance().getMeshData(primal_mesh);
-//   const CellValue<const TinyVector<1>> primal_xj = primal_mesh_data.xj();
-
-//   MeshToDualDataMapper<1> mesh_to_dual_data_mapper{primal_mesh.connectivity(), diamond_connectivity};
-
-//   NodeValue<TinyVector<1>> diamond_xr{diamond_connectivity};
-//   mesh_to_dual_data_mapper.toDualNode(primal_xr, primal_xj, diamond_xr);
-
-//   m_mesh = std::make_shared<MeshType>(p_diamond_connectivity, diamond_xr);
-// }
-
 DiamondDualMeshBuilder::DiamondDualMeshBuilder(const std::shared_ptr<const IMesh>& p_mesh)
 {
   std::cout << "building DiamondDualMesh\n";
 
   switch (p_mesh->dimension()) {
   case 1: {
-    using ConnectivityType = Connectivity<1>;
-    using MeshType         = Mesh<ConnectivityType>;
-
-    std::shared_ptr mesh = std::dynamic_pointer_cast<const MeshType>(p_mesh);
-
-    DiamondDualConnectivityManager& manager = DiamondDualConnectivityManager::instance();
-
-    std::shared_ptr<const ConnectivityType> p_diamond_connectivity =
-      manager.getDiamondDualConnectivity(mesh->connectivity());
-
-    this->_buildDualDiamondMeshFrom(*mesh, p_diamond_connectivity);
+    this->_buildDualDiamondMeshFrom<1>(p_mesh);
     break;
   }
   case 2: {
-    using ConnectivityType = Connectivity<2>;
-    using MeshType         = Mesh<ConnectivityType>;
-
-    std::shared_ptr mesh = std::dynamic_pointer_cast<const MeshType>(p_mesh);
-
-    DiamondDualConnectivityManager& manager = DiamondDualConnectivityManager::instance();
-
-    std::shared_ptr<const ConnectivityType> p_diamond_connectivity =
-      manager.getDiamondDualConnectivity(mesh->connectivity());
-
-    this->_buildDualDiamondMeshFrom(*mesh, p_diamond_connectivity);
+    this->_buildDualDiamondMeshFrom<2>(p_mesh);
     break;
   }
   case 3: {
-    using ConnectivityType = Connectivity<3>;
-    using MeshType         = Mesh<ConnectivityType>;
-
-    std::shared_ptr mesh = std::dynamic_pointer_cast<const MeshType>(p_mesh);
-
-    DiamondDualConnectivityManager& manager = DiamondDualConnectivityManager::instance();
-
-    std::shared_ptr<const ConnectivityType> p_diamond_connectivity =
-      manager.getDiamondDualConnectivity(mesh->connectivity());
-
-    this->_buildDualDiamondMeshFrom(*mesh, p_diamond_connectivity);
+    this->_buildDualDiamondMeshFrom<3>(p_mesh);
     break;
   }
   default: {
diff --git a/src/mesh/DiamondDualMeshBuilder.hpp b/src/mesh/DiamondDualMeshBuilder.hpp
index cdb0d7a1c5433692fe3e66de6aa925bf6a36f16f..2e47cfe21b4790a63e0e4aeba2fcfb9c59699286 100644
--- a/src/mesh/DiamondDualMeshBuilder.hpp
+++ b/src/mesh/DiamondDualMeshBuilder.hpp
@@ -5,18 +5,11 @@
 
 #include <memory>
 
-template <size_t>
-class Connectivity;
-
-template <typename ConnectivityType>
-class Mesh;
-
 class DiamondDualMeshBuilder : public MeshBuilderBase
 {
  private:
   template <size_t Dimension>
-  void _buildDualDiamondMeshFrom(const Mesh<Connectivity<Dimension>>&,
-                                 const std::shared_ptr<const Connectivity<Dimension>>&);
+  void _buildDualDiamondMeshFrom(const std::shared_ptr<const IMesh>&);
 
   friend class DiamondDualMeshManager;
   DiamondDualMeshBuilder(const std::shared_ptr<const IMesh>&);