diff --git a/MeshToolsLib/MeshEditing/MeshRevision.cpp b/MeshToolsLib/MeshEditing/MeshRevision.cpp
index 23dfe232eda0f3e7f49281483356934e36523b80..c2079ce5e587eb4380f71b8ad344148fc0bafa0c 100644
--- a/MeshToolsLib/MeshEditing/MeshRevision.cpp
+++ b/MeshToolsLib/MeshEditing/MeshRevision.cpp
@@ -156,6 +156,25 @@ std::unique_ptr<MeshLib::Element> createPrism(
     return std::make_unique<MeshLib::Prism>(prism_nodes);
 }
 
+std::unique_ptr<MeshLib::Element> createPyramid(
+    std::span<MeshLib::Node* const> const element_nodes,
+    std::vector<MeshLib::Node*> const& nodes,
+    std::array<std::size_t, 5> const local_ids)
+{
+    using namespace MeshLib::views;
+    auto lookup_in = [](auto const& values)
+    {
+        return ranges::views::transform([&values](std::size_t const n)
+                                        { return values[n]; });
+    };
+
+    std::array<MeshLib::Node*, std::size(local_ids)> prism_nodes;
+    ranges::copy(local_ids | lookup_in(element_nodes) | ids | lookup_in(nodes),
+                 begin(prism_nodes));
+
+    return std::make_unique<MeshLib::Pyramid>(prism_nodes);
+}
+
 /// Subdivides a prism with nonplanar quad faces into two tets.
 unsigned subdividePrism(MeshLib::Element const* const prism,
                         std::vector<MeshLib::Node*> const& nodes,
@@ -650,13 +669,12 @@ unsigned reduceHex(MeshLib::Element const* const org_elem,
                 {
                     const std::array<unsigned, 4> base_nodes(
                         lutHexCuttingQuadNodes(i, j));
-                    std::array const pyr_nodes{
-                        nodes[org_elem->getNode(base_nodes[0])->getID()],
-                        nodes[org_elem->getNode(base_nodes[1])->getID()],
-                        nodes[org_elem->getNode(base_nodes[2])->getID()],
-                        nodes[org_elem->getNode(base_nodes[3])->getID()],
-                        nodes[org_elem->getNode(i)->getID()]};
-                    new_elements.push_back(new MeshLib::Pyramid(pyr_nodes));
+                    std::array<std::size_t, 5> const pyr_nodes = {
+                        base_nodes[0], base_nodes[1], base_nodes[2],
+                        base_nodes[3], i};
+                    new_elements.push_back(
+                        createPyramid(org_elem->nodes(), nodes, pyr_nodes)
+                            .release());
 
                     if (i < 4 && j >= 4)
                     {