diff --git a/source/RobotAPI/libraries/armem_gui/instance/InstanceView.cpp b/source/RobotAPI/libraries/armem_gui/instance/InstanceView.cpp
index 3bbb2ee55a87be3216386a0f847b40829b4bb785..708ba87395db5d8e696cf9dbaa4ee174eb23c61b 100644
--- a/source/RobotAPI/libraries/armem_gui/instance/InstanceView.cpp
+++ b/source/RobotAPI/libraries/armem_gui/instance/InstanceView.cpp
@@ -446,7 +446,7 @@ namespace armarx::armem::gui::instance
 
     std::vector<QAction*> InstanceView::makeActionsCopyDataToClipboard()
     {
-        return makeCopyActions(currentInstance->data());
+        return makeCopyActions(currentInstance->data(), currentAronType);
     }
 
     std::vector<QAction*> InstanceView::makeActionsCopyDataToClipboard(const aron::Path& path)
@@ -454,7 +454,21 @@ namespace armarx::armem::gui::instance
         try
         {
             aron::data::VariantPtr element = currentInstance->data()->navigateAbsolute(path);
-            return makeCopyActions(element);
+            aron::type::VariantPtr elementType = nullptr;
+            if (currentAronType)
+            {
+                // There doesn't seem to be a way to check whether the path exists
+                // without potentially throwing an exception.
+                try
+                {
+                    elementType = currentAronType->navigateAbsolute(path);
+                }
+                catch (const aron::error::AronException& e)
+                {
+                    // No type available, elementType remains nullptr.
+                }
+            }
+            return makeCopyActions(element, elementType);
         }
         catch (const aron::error::AronException& e)
         {
@@ -463,18 +477,17 @@ namespace armarx::armem::gui::instance
         return {};
     }
 
-    std::vector<QAction*> InstanceView::makeCopyActions(const aron::data::VariantPtr& element)
+    std::vector<QAction*> InstanceView::makeCopyActions(
+            const aron::data::VariantPtr& element,
+            const aron::type::VariantPtr& elementType)
     {
         QAction* easyJsonAction = new QAction("Copy data to clipboard as easy JSON");
-        connect(easyJsonAction, &QAction::triggered, [this, element]()
+        connect(easyJsonAction, &QAction::triggered, [this, element, elementType]()
         {
             try
             {
                 TreeTypedJSONConverter conv;
-                // TODO(phesch): Type hierarchy doesn't match data hierarchy
-                armarx::aron::data::visitRecursive(conv, currentInstance->data(), currentAronType);
-                //nlohmann::json json =
-                //   aron::converter::AronNlohmannJSONConverter::ConvertToNlohmannJSON(element);
+                armarx::aron::data::visitRecursive(conv, element, elementType);
                 QClipboard* clipboard = QApplication::clipboard();
                 clipboard->setText(QString::fromStdString(conv.getJSON().dump(2)));
                 QApplication::processEvents();
diff --git a/source/RobotAPI/libraries/armem_gui/instance/InstanceView.h b/source/RobotAPI/libraries/armem_gui/instance/InstanceView.h
index 982d277db1febb68070290d3c86a3f06c602b990..970af2b6e45698cd342950a1ffe4f6612877d000 100644
--- a/source/RobotAPI/libraries/armem_gui/instance/InstanceView.h
+++ b/source/RobotAPI/libraries/armem_gui/instance/InstanceView.h
@@ -84,7 +84,9 @@ namespace armarx::armem::gui::instance
         QAction* makeActionCopyMemoryID(const MemoryID& id);
         std::vector<QAction*> makeActionsCopyDataToClipboard();
         std::vector<QAction*> makeActionsCopyDataToClipboard(const aron::Path& path);
-        std::vector<QAction*> makeCopyActions(const aron::data::VariantPtr& element);
+        std::vector<QAction*> makeCopyActions(
+                const aron::data::VariantPtr& element,
+                const aron::type::VariantPtr& elementType);
 
 
     private:
diff --git a/source/RobotAPI/libraries/armem_gui/instance/tree_builders/TypedDataTreeBuilder.cpp b/source/RobotAPI/libraries/armem_gui/instance/tree_builders/TypedDataTreeBuilder.cpp
index e2537e0c5f94b382ea00920eb79f168e50b73331..de85c11c08080c88c5f5d72f5b00900547a66fbc 100644
--- a/source/RobotAPI/libraries/armem_gui/instance/tree_builders/TypedDataTreeBuilder.cpp
+++ b/source/RobotAPI/libraries/armem_gui/instance/tree_builders/TypedDataTreeBuilder.cpp
@@ -249,6 +249,9 @@ namespace armarx::armem::gui::instance
         {
             this->setRowTexts(item, key, data);
 
+            item->setData(columnKey, Qt::UserRole,
+                    data ? instance::serializePath(data->getPath()) : QStringList());
+
             if (auto cast = aron::data::Dict::DynamicCast(data))
             {
                 DataTreeBuilder builder;
diff --git a/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedJSONConverter.cpp b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedJSONConverter.cpp
index d0f2f4c77863e680bc644a219370a41aac8f4a79..f80717342b3bc98dc1ebf9b7a72a4b274ede768a 100644
--- a/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedJSONConverter.cpp
+++ b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedJSONConverter.cpp
@@ -4,10 +4,10 @@
 
 #include <ArmarXCore/core/logging/Logging.h>
 
-#include <RobotAPI/libraries/aron/core/data/variant/All.h>
-#include <RobotAPI/libraries/aron/core/Exception.h>
 #include <RobotAPI/libraries/armem/core/Time.h>
 #include <RobotAPI/libraries/aron/converter/eigen/EigenConverter.h>
+#include <RobotAPI/libraries/aron/core/Exception.h>
+#include <RobotAPI/libraries/aron/core/data/variant/All.h>
 
 namespace armarx::armem::gui::instance
 {
@@ -27,6 +27,34 @@ namespace armarx::armem::gui::instance
         return obj;
     }
 
+    /* We override this method because we need to handle untyped members in the hierarchy.
+     * The other get*Elements() methods will either not be called with a null type or can handle it.
+     */
+    TreeTypedJSONConverter::MapElements
+    TreeTypedJSONConverter::getObjectElements(DataInput& elementData, TypeInput& elementType)
+    {
+        std::map<std::string, std::pair<aron::data::VariantPtr, aron::type::VariantPtr>> ret;
+        auto data = aron::data::Dict::DynamicCastAndCheck(elementData);
+        auto type = aron::type::Object::DynamicCastAndCheck(elementType);
+
+        if (data)
+        {
+            for (const auto& [key, e] : data->getElements())
+            {
+                if (type && type->hasMemberType(key))
+                {
+                    auto memberType = type->getMemberType(key);
+                    ret.insert({key, {e, memberType}});
+                }
+                else
+                {
+                    ret.insert({key, {e, nullptr}});
+                }
+            }
+        }
+        return ret;
+    }
+
     void
     TreeTypedJSONConverter::visitObjectOnEnter(DataInput& elementData, TypeInput& /*elementType*/)
     {
diff --git a/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedJSONConverter.h b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedJSONConverter.h
index 7a112979e7baa9e01460cc98d00c3d74a0d846e5..901021de0b67a556cf5adcc62635ebee8704d9d9 100644
--- a/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedJSONConverter.h
+++ b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedJSONConverter.h
@@ -17,6 +17,8 @@ namespace armarx::armem::gui::instance
 
         const nlohmann::json& getJSON();
 
+        MapElements getObjectElements(DataInput& elementData, TypeInput& elementType) override;
+
         void visitObjectOnEnter(DataInput& elementData, TypeInput& elementType) override;
         void visitObjectOnExit(DataInput& elementData, TypeInput& elementType) override;
         void visitDictOnEnter(DataInput& elementData, TypeInput& elementType) override;