diff --git a/source/RobotAPI/libraries/armem_gui/MemoryViewer.cpp b/source/RobotAPI/libraries/armem_gui/MemoryViewer.cpp
index b7aa4b68ccbcca14dab48f014da975a3f089e3df..3f4f2cf444028946646e433dae5d85a1b80144d0 100644
--- a/source/RobotAPI/libraries/armem_gui/MemoryViewer.cpp
+++ b/source/RobotAPI/libraries/armem_gui/MemoryViewer.cpp
@@ -140,6 +140,7 @@ namespace armarx::armem::gui
 
             const bool update = true;
             memoryReaders = mns.getAllReaders(update);
+            memoryWriters = mns.getAllWriters(update);
         }
         // DebugObserver is optional (check for null on every call)
         if (not debugObserverName.empty())
@@ -213,13 +214,17 @@ namespace armarx::armem::gui
     void MemoryViewer::loadFromDisk(QString directory)
     {
         std::string status;
-        std::map<std::string, wm::Memory> data =
-            diskControl->loadFromDisk(directory, memoryGroup->queryWidget()->queryInput(), &status);
+        std::map<std::string, wm::Memory> data = diskControl->loadFromDisk(directory, memoryGroup->queryWidget()->queryInput(), &status);
 
         for (auto& [name, memory] : data)
         {
-            this->memoryData[name] = std::move(memory);
+            if (memoryWriters.count(name) > 0)
+            {
+                auto commit = armem::toCommit(memory);
+                memoryWriters.at(name).commit(commit);
+            }
         }
+
         statusLabel->setText(QString::fromStdString(status));
 
         emit memoryDataChanged();
@@ -228,7 +233,7 @@ namespace armarx::armem::gui
 
     void MemoryViewer::startQueries()
     {
-        memoryReaders = mns.getAllReaders(true);
+        //memoryReaders = mns.getAllReaders(true);
         startDueQueries(runningQueries, memoryReaders);
     }
 
@@ -353,6 +358,7 @@ namespace armarx::armem::gui
         // Drop all entries in memoryData which are not in memoryReaders anymore.
         for (auto it = memoryData.begin(); it != memoryData.end();)
         {
+            auto name = it->second.name();
             if (memoryReaders.count(it->first) == 0)
             {
                 it = memoryData.erase(it);
@@ -500,8 +506,6 @@ namespace armarx::armem::gui
             convMap[name] = &data;
         }
 
-        // if convMap.empty(), we still need to update to remove existing entries.
-
         TIMING_START(GuiUpdate)
         memoryGroup->tree()->update(convMap);
         TIMING_END_STREAM(GuiUpdate, ARMARX_VERBOSE)
diff --git a/source/RobotAPI/libraries/armem_gui/MemoryViewer.h b/source/RobotAPI/libraries/armem_gui/MemoryViewer.h
index e29a2352014cebaf1a700097f7409f7f32cb5229..3a1fb2a1c89d05f6c36c92e76514a6dcf2dd4cc4 100644
--- a/source/RobotAPI/libraries/armem_gui/MemoryViewer.h
+++ b/source/RobotAPI/libraries/armem_gui/MemoryViewer.h
@@ -10,6 +10,7 @@
 #include <RobotAPI/interface/armem/mns/MemoryNameSystemInterface.h>
 #include <RobotAPI/libraries/armem/client/MemoryNameSystem.h>
 #include <RobotAPI/libraries/armem/client/Reader.h>
+#include <RobotAPI/libraries/armem/client/Writer.h>
 #include <RobotAPI/libraries/armem_gui/PeriodicUpdateWidget.h>
 #include <RobotAPI/libraries/armem_gui/lifecycle.h>
 #include <RobotAPI/libraries/armem_gui/instance/GroupBox.h>
@@ -135,6 +136,7 @@ namespace armarx::armem::gui
         armem::client::MemoryNameSystem mns;
 
         std::map<std::string, armem::client::Reader> memoryReaders;
+        std::map<std::string, armem::client::Writer> memoryWriters;
         std::map<std::string, armem::wm::Memory> memoryData;
 
         std::map<std::string, Ice::AsyncResultPtr> runningQueries;
diff --git a/source/RobotAPI/libraries/armem_gui/disk/ControlWidget.cpp b/source/RobotAPI/libraries/armem_gui/disk/ControlWidget.cpp
index 5d4542d2fb99984504843fdd050f10492dcd3831..4965ff7235ea012cbfff730777d5063bb910aa1a 100644
--- a/source/RobotAPI/libraries/armem_gui/disk/ControlWidget.cpp
+++ b/source/RobotAPI/libraries/armem_gui/disk/ControlWidget.cpp
@@ -22,9 +22,9 @@ namespace armarx::armem::gui::disk
     {
         _latestDirectory = QString::fromStdString("/tmp/MemoryExport");
 
-        _loadFromDiskButton = new QPushButton(" Load from Disk", this);
+        _loadFromDiskButton = new QPushButton(" Load Query from Disk into WM", this);
         _loadFromDiskButton->setIcon(QIcon(":/icons/document-open.svg"));
-        _storeOnDiskButton = new QPushButton(" Store on Disk", this);
+        _storeOnDiskButton = new QPushButton(" Store Query from WM on Disk", this);
         _storeOnDiskButton->setIcon(QIcon(":/icons/document-save.svg"));
 
         // Allow horizontal shrinking of buttons
@@ -149,7 +149,8 @@ namespace armarx::armem::gui::disk
                     armem::server::ltm::disk::Memory ltm(dir.path());
 
                     armem::wm::Memory memory;
-                    ltm.loadAll(memory);
+                    ltm.loadAll(memory); // load list of references
+                    ltm.load(memory); // resolve a list of references
 
                     memoryData[memory.name()] = std::move(memory);
 
diff --git a/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitor.h b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitor.h
index a34459ee1d2eed5598888fe21067c33735f660db..0bab97220aeecf9897ac0f4a8dde786c97315fed 100644
--- a/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitor.h
+++ b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeDataVisitor.h
@@ -21,59 +21,68 @@ namespace armarx::armem::gui::instance
         using TreeDataVisitorBase::TreeDataVisitorBase;
 
 
-        void visitDictOnEnter(const std::string& key, const aron::data::VariantPtr&, const aron::data::VariantPtr& n) override
+        void visitDictOnEnter(const aron::data::VariantPtr& n) override
         {
+            const std::string key = n->getPath().getLastElement();
             _visitEnter(key, "Dict", n->childrenSize());
         }
-        void visitDictOnExit(const std::string&, const aron::data::VariantPtr&, const aron::data::VariantPtr&) override
+        void visitDictOnExit(const aron::data::VariantPtr&) override
         {
             _visitExit();
         }
 
-        void visitListOnEnter(const std::string& key, const aron::data::VariantPtr&, const aron::data::VariantPtr& n) override
+        void visitListOnEnter(const aron::data::VariantPtr& n) override
         {
+            const std::string key = n->getPath().getLastElement();
             _visitEnter(key, "List", n->childrenSize());
         }
-        void visitListOnExit(const std::string&, const aron::data::VariantPtr&, const aron::data::VariantPtr&) override
+        void visitListOnExit(const aron::data::VariantPtr&) override
         {
             _visitExit();
         }
 
 
-        void visitBool(const std::string& key, const aron::data::VariantPtr&, const aron::data::VariantPtr& b) override
+        void visitBool(const aron::data::VariantPtr& b) override
         {
             const auto x = *aron::data::Bool::DynamicCastAndCheck(b);
+            const std::string key = b->getPath().getLastElement();
             this->addValueRow(key, x, "Bool");
         }
-        void visitDouble(const std::string& key, const aron::data::VariantPtr&, const aron::data::VariantPtr& d) override
+        void visitDouble(const aron::data::VariantPtr& d) override
         {
             const auto x = *aron::data::Double::DynamicCastAndCheck(d);
+            const std::string key = d->getPath().getLastElement();
             this->addValueRow(key, x, "Double");
         }
-        void visitFloat(const std::string& key, const aron::data::VariantPtr&, const aron::data::VariantPtr& f) override
+        void visitFloat(const aron::data::VariantPtr& f) override
         {
             const auto x = *aron::data::Float::DynamicCastAndCheck(f);
+            const std::string key = f->getPath().getLastElement();
             this->addValueRow(key, x, "Float");
         }
-        void visitInt(const std::string& key, const aron::data::VariantPtr&, const aron::data::VariantPtr& i) override
+        void visitInt(const aron::data::VariantPtr& i) override
         {
             const auto x = *aron::data::Int::DynamicCastAndCheck(i);
+            const std::string key = i->getPath().getLastElement();
             this->addValueRow(key, x, "Int");
         }
-        void visitLong(const std::string& key, const aron::data::VariantPtr&, const aron::data::VariantPtr& l) override
+        void visitLong(const aron::data::VariantPtr& l) override
         {
             const auto x = *aron::data::Long::DynamicCastAndCheck(l);
+            const std::string key = l->getPath().getLastElement();
             this->addValueRow(key, x, "Long");
         }
-        void visitString(const std::string& key, const aron::data::VariantPtr&, const aron::data::VariantPtr& string) override
+        void visitString(const aron::data::VariantPtr& string) override
         {
             const auto x = *aron::data::String::DynamicCastAndCheck(string);
+            const std::string key = string->getPath().getLastElement();
             this->addValueRow(key, x, "String");
         }
 
-        void visitNDArray(const std::string& key, const aron::data::VariantPtr&, const aron::data::VariantPtr& array) override
+        void visitNDArray(const aron::data::VariantPtr& array) override
         {
             const auto x = *aron::data::NDArray::DynamicCastAndCheck(array);
+            const std::string key = array->getPath().getLastElement();
             this->addValueRow(key, x, "ND Array");
         }
 
diff --git a/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedDataVisitor.h b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedDataVisitor.h
index 72848d6ead11b304b61954f95e443822bb6c8ce2..558057cc067b5c4c5525ebe3ec3701350da68729 100644
--- a/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedDataVisitor.h
+++ b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedDataVisitor.h
@@ -28,126 +28,194 @@ namespace armarx::armem::gui::instance
         using TreeDataVisitorBase::TreeDataVisitorBase;
 
 
-        void visitDictOnEnter(const std::string& key, const aron::data::VariantPtr&, const aron::type::VariantPtr&, const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override
+        void visitDictOnEnter(const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override
         {
+            ARMARX_CHECK_NOT_NULL(data);
+            ARMARX_CHECK_NOT_NULL(type);
+            const std::string key = data->getPath().getLastElement();
             _visitEnter(key, sanitizeTypeName(type->getFullName()), data->childrenSize());
         }
-        void visitDictOnExit(const std::string& key, const aron::data::VariantPtr&, const aron::type::VariantPtr&, const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override
+        void visitDictOnExit(const aron::data::VariantPtr&, const aron::type::VariantPtr&) override
         {
             _visitExit();
         }
 
-        void visitObjectOnEnter(const std::string& key, const aron::data::VariantPtr&, const aron::type::VariantPtr&, const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override
+        void visitObjectOnEnter(const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override
         {
+            ARMARX_CHECK_NOT_NULL(data);
+            ARMARX_CHECK_NOT_NULL(type);
+            const std::string key = data->getPath().getLastElement();
             _visitEnter(key, sanitizeTypeName(type->getFullName()), data->childrenSize());
         }
-        void visitObjectOnExit(const std::string& key, const aron::data::VariantPtr&, const aron::type::VariantPtr&, const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override
+        void visitObjectOnExit(const aron::data::VariantPtr&, const aron::type::VariantPtr&) override
         {
             _visitExit();
         }
 
-        void visitListOnEnter(const std::string& key, const aron::data::VariantPtr&, const aron::type::VariantPtr&, const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override
+        void visitListOnEnter(const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override
         {
+            ARMARX_CHECK_NOT_NULL(data);
+            ARMARX_CHECK_NOT_NULL(type);
+            const std::string key = data->getPath().getLastElement();
             _visitEnter(key, sanitizeTypeName(type->getFullName()), data->childrenSize());
         }
-        void visitListOnExit(const std::string& key, const aron::data::VariantPtr&, const aron::type::VariantPtr&, const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override
+        void visitListOnExit(const aron::data::VariantPtr&, const aron::type::VariantPtr&) override
         {
             _visitExit();
         }
 
-        void visitTupleOnEnter(const std::string& key, const aron::data::VariantPtr&, const aron::type::VariantPtr&, const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override
+        void visitTupleOnEnter(const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override
         {
+            ARMARX_CHECK_NOT_NULL(data);
+            ARMARX_CHECK_NOT_NULL(type);
+            const std::string key = data->getPath().getLastElement();
             _visitEnter(key, sanitizeTypeName(type->getFullName()), data->childrenSize());
         }
-        void visitTupleOnExit(const std::string& key, const aron::data::VariantPtr&, const aron::type::VariantPtr&, const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override
+        void visitTupleOnExit(const aron::data::VariantPtr&, const aron::type::VariantPtr&) override
         {
             _visitExit();
         }
         // What about Pair??
 
 
-        void visitBool(const std::string& key, const aron::data::VariantPtr&, const aron::type::VariantPtr&, const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override
+        void visitBool(const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override
         {
+            ARMARX_CHECK_NOT_NULL(data);
+            ARMARX_CHECK_NOT_NULL(type);
+            const std::string key = data->getPath().getLastElement();
+
             auto d = *aron::data::Bool::DynamicCastAndCheck(data);
             auto t = *aron::type::Bool::DynamicCastAndCheck(type);
             this->addValueRow(key, d, t);
         }
-        void visitDouble(const std::string& key, const aron::data::VariantPtr&, const aron::type::VariantPtr&, const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override
+        void visitDouble(const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override
         {
+            ARMARX_CHECK_NOT_NULL(data);
+            ARMARX_CHECK_NOT_NULL(type);
+            const std::string key = data->getPath().getLastElement();
+
             auto d = *aron::data::Double::DynamicCastAndCheck(data);
             auto t = *aron::type::Double::DynamicCastAndCheck(type);
             this->addValueRow(key, d, t);
         }
-        void visitFloat(const std::string& key, const aron::data::VariantPtr&, const aron::type::VariantPtr&, const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override
+        void visitFloat(const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override
         {
+            ARMARX_CHECK_NOT_NULL(data);
+            ARMARX_CHECK_NOT_NULL(type);
+            const std::string key = data->getPath().getLastElement();
+
             auto d = *aron::data::Float::DynamicCastAndCheck(data);
             auto t = *aron::type::Float::DynamicCastAndCheck(type);
             this->addValueRow(key, d, t);
         }
-        void visitInt(const std::string& key, const aron::data::VariantPtr&, const aron::type::VariantPtr&, const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override
+        void visitInt(const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override
         {
+            ARMARX_CHECK_NOT_NULL(data);
+            ARMARX_CHECK_NOT_NULL(type);
+            const std::string key = data->getPath().getLastElement();
+
             auto d = *aron::data::Int::DynamicCastAndCheck(data);
             auto t = *aron::type::Int::DynamicCastAndCheck(type);
             this->addValueRow(key, d, t);
         }
-        void visitLong(const std::string& key, const aron::data::VariantPtr&, const aron::type::VariantPtr&, const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override
+        void visitLong(const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override
         {
+            ARMARX_CHECK_NOT_NULL(data);
+            ARMARX_CHECK_NOT_NULL(type);
+            const std::string key = data->getPath().getLastElement();
+
             auto d = *aron::data::Long::DynamicCastAndCheck(data);
             auto t = *aron::type::Long::DynamicCastAndCheck(type);
             this->addValueRow(key, d, t);
         }
-        void visitString(const std::string& key, const aron::data::VariantPtr&, const aron::type::VariantPtr&, const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override
+        void visitString(const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override
         {
+            ARMARX_CHECK_NOT_NULL(data);
+            ARMARX_CHECK_NOT_NULL(type);
+            const std::string key = data->getPath().getLastElement();
+
             auto d = *aron::data::String::DynamicCastAndCheck(data);
             auto t = *aron::type::String::DynamicCastAndCheck(type);
             this->addValueRow(key, d, t);
         }
-        void visitTime(const std::string& key, const aron::data::VariantPtr&, const aron::type::VariantPtr&, const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override
+        void visitTime(const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override
         {
+            ARMARX_CHECK_NOT_NULL(data);
+            ARMARX_CHECK_NOT_NULL(type);
+            const std::string key = data->getPath().getLastElement();
+
             auto d = *aron::data::Long::DynamicCastAndCheck(data);
             auto t = *aron::type::Time::DynamicCastAndCheck(type);
             this->addValueRow(key, d, t);
         }
 
 
-        void visitMatrix(const std::string& key, const aron::data::VariantPtr&, const aron::type::VariantPtr&, const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override
+        void visitMatrix(const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override
         {
+            ARMARX_CHECK_NOT_NULL(data);
+            ARMARX_CHECK_NOT_NULL(type);
+            const std::string key = data->getPath().getLastElement();
+
             auto d = *aron::data::NDArray::DynamicCastAndCheck(data);
             auto t = *aron::type::Matrix::DynamicCastAndCheck(type);
             this->addValueRow(key, d, t);
         }
-        void visitQuaternion(const std::string& key, const aron::data::VariantPtr&, const aron::type::VariantPtr&, const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override
+        void visitQuaternion(const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override
         {
+            ARMARX_CHECK_NOT_NULL(data);
+            ARMARX_CHECK_NOT_NULL(type);
+            const std::string key = data->getPath().getLastElement();
+
             auto d = *aron::data::NDArray::DynamicCastAndCheck(data);
             auto t = *aron::type::Quaternion::DynamicCastAndCheck(type);
             this->addValueRow(key, d, t);
         }
-        void visitPointCloud(const std::string& key, const aron::data::VariantPtr&, const aron::type::VariantPtr&, const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override
+        void visitPointCloud(const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override
         {
+            ARMARX_CHECK_NOT_NULL(data);
+            ARMARX_CHECK_NOT_NULL(type);
+            const std::string key = data->getPath().getLastElement();
+
             auto d = *aron::data::NDArray::DynamicCastAndCheck(data);
             auto t = *aron::type::PointCloud::DynamicCastAndCheck(type);
             this->addValueRow(key, d, t);
         }
-        void visitPose(const std::string& key, const aron::data::VariantPtr&, const aron::type::VariantPtr&, const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override
+        void visitPose(const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override
         {
+            ARMARX_CHECK_NOT_NULL(data);
+            ARMARX_CHECK_NOT_NULL(type);
+            const std::string key = data->getPath().getLastElement();
+
             auto d = *aron::data::NDArray::DynamicCastAndCheck(data);
             auto t = *aron::type::Pose::DynamicCastAndCheck(type);
             this->addValueRow(key, d, t);
         }
-        void visitPosition(const std::string& key, const aron::data::VariantPtr&, const aron::type::VariantPtr&, const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override
+        void visitPosition(const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override
         {
+            ARMARX_CHECK_NOT_NULL(data);
+            ARMARX_CHECK_NOT_NULL(type);
+            const std::string key = data->getPath().getLastElement();
+
             auto d = *aron::data::NDArray::DynamicCastAndCheck(data);
             auto t = *aron::type::Position::DynamicCastAndCheck(type);
             this->addValueRow(key, d, t);
         }
-        void visitImage(const std::string& key, const aron::data::VariantPtr&, const aron::type::VariantPtr&, const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override
+        void visitImage(const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override
         {
+            ARMARX_CHECK_NOT_NULL(data);
+            ARMARX_CHECK_NOT_NULL(type);
+            const std::string key = data->getPath().getLastElement();
+
             auto d = *aron::data::NDArray::DynamicCastAndCheck(data);
             auto t = *aron::type::Image::DynamicCastAndCheck(type);
             this->addValueRow(key, d, t);
         }
-        void visitOrientation(const std::string& key, const aron::data::VariantPtr&, const aron::type::VariantPtr&, const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override
+        void visitOrientation(const aron::data::VariantPtr& data, const aron::type::VariantPtr& type) override
         {
+            ARMARX_CHECK_NOT_NULL(data);
+            ARMARX_CHECK_NOT_NULL(type);
+            const std::string key = data->getPath().getLastElement();
+
             auto d = *aron::data::NDArray::DynamicCastAndCheck(data);
             auto t = *aron::type::Orientation::DynamicCastAndCheck(type);
             this->addValueRow(key, d, t);