diff --git a/src/language/modules/MeshModule.cpp b/src/language/modules/MeshModule.cpp
index d898b658bfe1960707a0dc341c854203cd901cfc..0803f1420724fefa167bc51ed2b8e7bb101a9a73 100644
--- a/src/language/modules/MeshModule.cpp
+++ b/src/language/modules/MeshModule.cpp
@@ -9,6 +9,7 @@
 #include <language/utils/TypeDescriptor.hpp>
 #include <mesh/CartesianMeshBuilder.hpp>
 #include <mesh/Connectivity.hpp>
+#include <mesh/DiamondDualMeshBuilder.hpp>
 #include <mesh/GmshReader.hpp>
 #include <mesh/Mesh.hpp>
 #include <utils/Exceptions.hpp>
@@ -177,5 +178,16 @@ MeshModule::MeshModule()
                                 return builder.mesh();
                               }
 
+                              ));
+
+  this->_addBuiltinFunction("diamondDual",
+                            std::make_shared<BuiltinFunctionEmbedder<std::shared_ptr<const IMesh>(
+                              const std::shared_ptr<const IMesh>&)>>(
+
+                              [](const std::shared_ptr<const IMesh>& p_mesh) -> std::shared_ptr<const IMesh> {
+                                DiamondDualMeshBuilder builder{p_mesh};
+                                return builder.mesh();
+                              }
+
                               ));
 }
diff --git a/src/mesh/DiamondDualMeshBuilder.cpp b/src/mesh/DiamondDualMeshBuilder.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..2c5108775b3d9d0bc0d956da6958dec3018fbb0f
--- /dev/null
+++ b/src/mesh/DiamondDualMeshBuilder.cpp
@@ -0,0 +1,38 @@
+#include <mesh/DiamondDualMeshBuilder.hpp>
+
+#include <mesh/Connectivity.hpp>
+#include <mesh/ConnectivityDescriptor.hpp>
+#include <mesh/ConnectivityDispatcher.hpp>
+#include <mesh/RefId.hpp>
+#include <utils/Array.hpp>
+#include <utils/Messenger.hpp>
+
+template <size_t Dimension>
+void
+DiamondDualMeshBuilder::_buildDiamondMeshFrom(const std::shared_ptr<const IMesh>& p_mesh)
+{
+  static_assert(Dimension <= 3, "invalid dimension");
+
+  m_mesh = p_mesh;
+}
+
+DiamondDualMeshBuilder::DiamondDualMeshBuilder(const std::shared_ptr<const IMesh>& p_mesh)
+{
+  switch (p_mesh->dimension()) {
+  case 1: {
+    this->_buildDiamondMeshFrom<1>(p_mesh);
+    break;
+  }
+  case 2: {
+    this->_buildDiamondMeshFrom<2>(p_mesh);
+    break;
+  }
+  case 3: {
+    this->_buildDiamondMeshFrom<3>(p_mesh);
+    break;
+  }
+  default: {
+    throw UnexpectedError("invalid mesh dimension: " + std::to_string(p_mesh->dimension()));
+  }
+  }
+}
diff --git a/src/mesh/DiamondDualMeshBuilder.hpp b/src/mesh/DiamondDualMeshBuilder.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..16b2a107dc4be921746ff0b1fe5e94a63c276fc5
--- /dev/null
+++ b/src/mesh/DiamondDualMeshBuilder.hpp
@@ -0,0 +1,20 @@
+#ifndef DIAMOND_DUAL_MESH_BUILDER_HPP
+#define DIAMOND_DUAL_MESH_BUILDER_HPP
+
+#include <mesh/IMesh.hpp>
+#include <mesh/MeshBuilderBase.hpp>
+
+#include <memory>
+
+class DiamondDualMeshBuilder : public MeshBuilderBase
+{
+ private:
+  template <size_t Dimension>
+  void _buildDiamondMeshFrom(const std::shared_ptr<const IMesh>& mesh);
+
+ public:
+  DiamondDualMeshBuilder(const std::shared_ptr<const IMesh>& mesh);
+  ~DiamondDualMeshBuilder() = default;
+};
+
+#endif   // DIAMOND_DUAL_MESH_BUILDER_HPP