diff --git a/source/RobotAPI/gui-plugins/ArMemMemoryViewer/ArMemMemoryViewerWidgetController.cpp b/source/RobotAPI/gui-plugins/ArMemMemoryViewer/ArMemMemoryViewerWidgetController.cpp
index 82d56c7cd50e3171452fdab80d1c7da1e76ee30f..ddef1da66e7c6cd6195b8437d2c932a26250f9cc 100644
--- a/source/RobotAPI/gui-plugins/ArMemMemoryViewer/ArMemMemoryViewerWidgetController.cpp
+++ b/source/RobotAPI/gui-plugins/ArMemMemoryViewer/ArMemMemoryViewerWidgetController.cpp
@@ -134,7 +134,7 @@ namespace armarx
 
         connect(memoryTree, &armem::gui::MemoryTreeWidget::updated, this, &This::memoryTreeUpdated);
         connect(memoryTree, &armem::gui::MemoryTreeWidget::updated, this, &This::updateInstanceTree);
-        connect(memoryTree, &armem::gui::MemoryTreeWidget::instanceSelected, this, &This::updateInstanceTree);
+        connect(memoryTree, &armem::gui::MemoryTreeWidget::itemSelected, this, &This::updateInstanceTree);
 
         connect(widget.instanceUseTypeInfoCheckBox, &QCheckBox::toggled, instanceTree, &armem::gui::InstanceTreeWidget::setUseTypeInfo);
         connect(instanceTree, &armem::gui::InstanceTreeWidget::updated, this, &This::instanceTreeUpdated);
@@ -245,7 +245,33 @@ namespace armarx
     {
         if (memoryData && memoryTree->selectedID())
         {
-            instanceTree->update(*memoryTree->selectedID(), *memoryData);
+            armem::MemoryID id = *memoryTree->selectedID();
+
+            if (!id.hasEntityName())
+            {
+                return;
+            }
+            const armem::EntitySnapshot* snapshot = nullptr;
+            if (!id.hasTimestamp())
+            {
+                snapshot = &memoryData->getEntity(id).getLatestSnapshot();
+                id.timestamp = snapshot->time();
+            }
+            if (!id.hasInstanceIndex())
+            {
+                if (!snapshot)
+                {
+                    snapshot = &memoryData->getEntitySnapshot(id);
+                }
+                if (snapshot->size() > 0)
+                {
+                    id.instanceIndex = 0;
+                }
+            }
+            if (id.hasInstanceIndex())
+            {
+                instanceTree->update(id, *memoryData);
+            }
         }
     }
 
diff --git a/source/RobotAPI/libraries/armem_gui/InstanceTreeWidget.cpp b/source/RobotAPI/libraries/armem_gui/InstanceTreeWidget.cpp
index 6fe37aa374c7d07d8b15df868231a33c5880058c..f8c5ed61a3ee104c5463d7f17ef53064474fea0a 100644
--- a/source/RobotAPI/libraries/armem_gui/InstanceTreeWidget.cpp
+++ b/source/RobotAPI/libraries/armem_gui/InstanceTreeWidget.cpp
@@ -118,6 +118,7 @@ namespace armarx::armem::gui
         }
     }
 
+
     void InstanceTreeWidget::updateInstanceID(const MemoryID& id)
     {
         const std::vector<std::string> items = id.getAllItems();
diff --git a/source/RobotAPI/libraries/armem_gui/MemoryTreeWidget.cpp b/source/RobotAPI/libraries/armem_gui/MemoryTreeWidget.cpp
index 4e7de7b6bc20880dcef739f9faca08617a644bd7..f17ff107046cbe7bc304bada3368c05bae7e406a 100644
--- a/source/RobotAPI/libraries/armem_gui/MemoryTreeWidget.cpp
+++ b/source/RobotAPI/libraries/armem_gui/MemoryTreeWidget.cpp
@@ -36,7 +36,14 @@ namespace armarx::armem::gui
         header()->setTextElideMode(Qt::TextElideMode::ElideRight);
 
 
-        connect(this, &QTreeWidget::currentItemChanged, this, &MemoryTreeWidget::handleSelection);
+        connect(this, &QTreeWidget::currentItemChanged, this, &This::handleSelection);
+
+        connect(this, &This::memorySelected, this, &This::itemSelected);
+        connect(this, &This::coreSegmentSelected, this, &This::itemSelected);
+        connect(this, &This::providerSegmentSelected, this, &This::itemSelected);
+        connect(this, &This::entitySelected, this, &This::itemSelected);
+        connect(this, &This::snapshotSelected, this, &This::itemSelected);
+        connect(this, &This::instanceSelected, this, &This::itemSelected);
     }
 
     void MemoryTreeWidget::initBuilders()
@@ -115,7 +122,6 @@ namespace armarx::armem::gui
         instanceBuilder.setMakeItemFn([this](const EntityInstance & instance)
         {
             QTreeWidgetItem* item = makeItem("", instance);
-            item->setData(int(Columns::ID), Qt::UserRole, QString::fromStdString(instance.id().str()));
             return item;
         });
         instanceBuilder.setCompareFn([](const EntityInstance & lhs, QTreeWidgetItem * rhsItem)
@@ -152,16 +158,38 @@ namespace armarx::armem::gui
     void MemoryTreeWidget::handleSelection()
     {
         QTreeWidgetItem* item = this->currentItem();
-        if (!item
-            || item->data(int(Columns::LEVEL), Qt::UserRole).toString().toStdString() != EntityInstance().getLevelName())
+        if (!item)
         {
             return;
         }
 
-        QString itemData = item->data(int(Columns::ID), Qt::UserRole).toString();
-        _selectedID = MemoryID(itemData.toStdString());
+        const std::string levelName = item->data(int(Columns::LEVEL), Qt::UserRole).toString().toStdString();
+        _selectedID = MemoryID(item->data(int(Columns::ID), Qt::UserRole).toString().toStdString());
 
-        emit instanceSelected(*_selectedID);
+        if (levelName == Memory().getLevelName())
+        {
+            emit memorySelected(*_selectedID);
+        }
+        else if (levelName == CoreSegment().getLevelName())
+        {
+            emit coreSegmentSelected(*_selectedID);
+        }
+        else if (levelName == ProviderSegment().getLevelName())
+        {
+            emit providerSegmentSelected(*_selectedID);
+        }
+        else if (levelName == Entity().getLevelName())
+        {
+            emit entitySelected(*_selectedID);
+        }
+        else if (levelName == EntitySnapshot().getLevelName())
+        {
+            emit snapshotSelected(*_selectedID);
+        }
+        else if (levelName == EntityInstance().getLevelName())
+        {
+            emit instanceSelected(*_selectedID);
+        }
     }
 
 
@@ -218,6 +246,7 @@ namespace armarx::armem::gui
 
         QTreeWidgetItem* item = new QTreeWidgetItem(columns);
         item->setData(int(Columns::LEVEL), Qt::UserRole, QString::fromStdString(memoryItem.getLevelName()));
+        item->setData(int(Columns::ID), Qt::UserRole, QString::fromStdString(memoryItem.id().str()));
         item->setTextAlignment(int(Columns::SIZE), Qt::AlignRight);
         return item;
     }
diff --git a/source/RobotAPI/libraries/armem_gui/MemoryTreeWidget.h b/source/RobotAPI/libraries/armem_gui/MemoryTreeWidget.h
index 8eeea921169e9635fb3f9ccdd982666fde73b918..4310f3e30cbf79b7b257d3a060c30e0b135a028c 100644
--- a/source/RobotAPI/libraries/armem_gui/MemoryTreeWidget.h
+++ b/source/RobotAPI/libraries/armem_gui/MemoryTreeWidget.h
@@ -17,6 +17,8 @@ namespace armarx::armem::gui
     class MemoryTreeWidget : public QTreeWidget
     {
         Q_OBJECT
+        using This = MemoryTreeWidget;
+
     public:
 
         MemoryTreeWidget();
@@ -30,6 +32,14 @@ namespace armarx::armem::gui
     signals:
 
         void updated();
+
+        void itemSelected(const MemoryID& id);
+
+        void memorySelected(const MemoryID& id);
+        void coreSegmentSelected(const MemoryID& id);
+        void providerSegmentSelected(const MemoryID& id);
+        void entitySelected(const MemoryID& id);
+        void snapshotSelected(const MemoryID& id);
         void instanceSelected(const MemoryID& id);