diff --git a/scenarios/ArMemObjectMemory/config/ArVizStorage.cfg b/scenarios/ArMemObjectMemory/config/ArVizStorage.cfg
index 0dcbd8d5775b8c0f562bba62b5f2fe282e2da6d0..302ac28c37dd28de3e68fb4fe4c2174faa4ec3bf 100644
--- a/scenarios/ArMemObjectMemory/config/ArVizStorage.cfg
+++ b/scenarios/ArMemObjectMemory/config/ArVizStorage.cfg
@@ -27,7 +27,7 @@
 # ArmarX.ArVizStorage.EnableProfiling = false
 
 
-# ArmarX.ArVizStorage.HistoryPath:  Destination path where the history are serialized to
+# ArmarX.ArVizStorage.HistoryPath:  Destination path where the history is serialized to
 #  Attributes:
 #  - Default:            RobotAPI/ArVizStorage
 #  - Case sensitivity:   yes
@@ -68,7 +68,7 @@
 # ArmarX.ArVizStorage.TopicName = ArVizTopic
 
 
-# ArmarX.CachePath:  Path for cache files. If relative path AND env. variable ARMARX_USER_CONFIG_DIR is set, the cache path will be made relative to ARMARX_USER_CONFIG_DIR. Otherwise if relative it will be relative to the default ArmarX config dir (${HOME}/.armarx)
+# ArmarX.CachePath:  Path for cache files. If relative path AND env. variable ARMARX_CONFIG_DIR is set, the cache path will be made relative to ARMARX_CONFIG_DIR. Otherwise if relative it will be relative to the default ArmarX config dir (${ARMARX_WORKSPACE}/armarx_config)
 #  Attributes:
 #  - Default:            mongo/.cache
 #  - Case sensitivity:   yes
diff --git a/scenarios/ArMemObjectMemory/config/ArticulatedObjectLocalizerExample.cfg b/scenarios/ArMemObjectMemory/config/ArticulatedObjectLocalizerExample.cfg
index 9d225df2f4efadbb731a79fd45dbf852189ec80b..ce2498f12be6b0ce2cd02bfab3ebdc4140a797ca 100644
--- a/scenarios/ArMemObjectMemory/config/ArticulatedObjectLocalizerExample.cfg
+++ b/scenarios/ArMemObjectMemory/config/ArticulatedObjectLocalizerExample.cfg
@@ -60,12 +60,19 @@
 # ArmarX.ArticulatedObjectLocalizerExample.mem.obj.articulated.MemoryName = Object
 
 
-# ArmarX.ArticulatedObjectLocalizerExample.mem.obj.articulated.ProviderName:  
+# ArmarX.ArticulatedObjectLocalizerExample.mem.obj.articulated.read.ProviderName:  
 #  Attributes:
 #  - Default:            PriorKnowledgeData
 #  - Case sensitivity:   yes
 #  - Required:           no
-# ArmarX.ArticulatedObjectLocalizerExample.mem.obj.articulated.ProviderName = PriorKnowledgeData
+# ArmarX.ArticulatedObjectLocalizerExample.mem.obj.articulated.read.ProviderName = PriorKnowledgeData
+
+
+# ArmarX.ArticulatedObjectLocalizerExample.mem.obj.articulated.write.ProviderName:  Name of this provider
+#  Attributes:
+#  - Case sensitivity:   yes
+#  - Required:           yes
+ArmarX.ArticulatedObjectLocalizerExample.mem.obj.articulated.write.ProviderName = sim_track
 
 
 # ArmarX.ArticulatedObjectLocalizerExample.mns.MemoryNameSystemEnabled:  Whether to use (and depend on) the Memory Name System (MNS).
@@ -94,14 +101,6 @@
 # ArmarX.ArticulatedObjectLocalizerExample.tpc.pub.DebugObserver = DebugObserver
 
 
-# ArmarX.ArticulatedObjectLocalizerExample.tpc.sub.MemoryListener:  Name of the `MemoryListener` topic to subscribe to.
-#  Attributes:
-#  - Default:            MemoryUpdates
-#  - Case sensitivity:   yes
-#  - Required:           no
-# ArmarX.ArticulatedObjectLocalizerExample.tpc.sub.MemoryListener = MemoryUpdates
-
-
 # ArmarX.ArticulatedObjectLocalizerExample.updateFrequency:  Memory update frequency (write).
 #  Attributes:
 #  - Default:            25
@@ -110,7 +109,7 @@
 # ArmarX.ArticulatedObjectLocalizerExample.updateFrequency = 25
 
 
-# ArmarX.CachePath:  Path for cache files. If relative path AND env. variable ARMARX_USER_CONFIG_DIR is set, the cache path will be made relative to ARMARX_USER_CONFIG_DIR. Otherwise if relative it will be relative to the default ArmarX config dir (${HOME}/.armarx)
+# ArmarX.CachePath:  Path for cache files. If relative path AND env. variable ARMARX_CONFIG_DIR is set, the cache path will be made relative to ARMARX_CONFIG_DIR. Otherwise if relative it will be relative to the default ArmarX config dir (${ARMARX_WORKSPACE}/armarx_config)
 #  Attributes:
 #  - Default:            mongo/.cache
 #  - Case sensitivity:   yes
diff --git a/scenarios/ArMemObjectMemory/config/DebugObserver.cfg b/scenarios/ArMemObjectMemory/config/DebugObserver.cfg
index 4a0b9dac036cd4d103efd7d1b718d508f285d85a..8dc7ead26b3bd2f7678b3b3e7a1b00c01213225d 100644
--- a/scenarios/ArMemObjectMemory/config/DebugObserver.cfg
+++ b/scenarios/ArMemObjectMemory/config/DebugObserver.cfg
@@ -18,7 +18,7 @@
 # ArmarX.ApplicationName = ""
 
 
-# ArmarX.CachePath:  Path for cache files. If relative path AND env. variable ARMARX_USER_CONFIG_DIR is set, the cache path will be made relative to ARMARX_USER_CONFIG_DIR. Otherwise if relative it will be relative to the default ArmarX config dir (${HOME}/.armarx)
+# ArmarX.CachePath:  Path for cache files. If relative path AND env. variable ARMARX_CONFIG_DIR is set, the cache path will be made relative to ARMARX_CONFIG_DIR. Otherwise if relative it will be relative to the default ArmarX config dir (${ARMARX_WORKSPACE}/armarx_config)
 #  Attributes:
 #  - Default:            mongo/.cache
 #  - Case sensitivity:   yes
diff --git a/scenarios/ArMemObjectMemory/config/MemoryNameSystem.cfg b/scenarios/ArMemObjectMemory/config/MemoryNameSystem.cfg
index 7dd22218243ca4f9e67e843da8b42916f3b8568a..b8bc70a66ca7f32a628886ad1bf13e373f9750d3 100644
--- a/scenarios/ArMemObjectMemory/config/MemoryNameSystem.cfg
+++ b/scenarios/ArMemObjectMemory/config/MemoryNameSystem.cfg
@@ -18,7 +18,7 @@
 # ArmarX.ApplicationName = ""
 
 
-# ArmarX.CachePath:  Path for cache files. If relative path AND env. variable ARMARX_USER_CONFIG_DIR is set, the cache path will be made relative to ARMARX_USER_CONFIG_DIR. Otherwise if relative it will be relative to the default ArmarX config dir (${HOME}/.armarx)
+# ArmarX.CachePath:  Path for cache files. If relative path AND env. variable ARMARX_CONFIG_DIR is set, the cache path will be made relative to ARMARX_CONFIG_DIR. Otherwise if relative it will be relative to the default ArmarX config dir (${ARMARX_WORKSPACE}/armarx_config)
 #  Attributes:
 #  - Default:            mongo/.cache
 #  - Case sensitivity:   yes
diff --git a/scenarios/ArMemObjectMemory/config/ObjectMemory.cfg b/scenarios/ArMemObjectMemory/config/ObjectMemory.cfg
index e67a4c41162632026046dc8402466d2deb7ee233..5e0858b92c6caa5e2aba4453dac7bacef8367318 100644
--- a/scenarios/ArMemObjectMemory/config/ObjectMemory.cfg
+++ b/scenarios/ArMemObjectMemory/config/ObjectMemory.cfg
@@ -18,7 +18,7 @@
 # ArmarX.ApplicationName = ""
 
 
-# ArmarX.CachePath:  Path for cache files. If relative path AND env. variable ARMARX_USER_CONFIG_DIR is set, the cache path will be made relative to ARMARX_USER_CONFIG_DIR. Otherwise if relative it will be relative to the default ArmarX config dir (${HOME}/.armarx)
+# ArmarX.CachePath:  Path for cache files. If relative path AND env. variable ARMARX_CONFIG_DIR is set, the cache path will be made relative to ARMARX_CONFIG_DIR. Otherwise if relative it will be relative to the default ArmarX config dir (${ARMARX_WORKSPACE}/armarx_config)
 #  Attributes:
 #  - Default:            mongo/.cache
 #  - Case sensitivity:   yes
@@ -92,6 +92,14 @@
 # ArmarX.LoggingGroup = ""
 
 
+# ArmarX.ObjectMemory.ArVizStorageName:  Name of the ArViz storage
+#  Attributes:
+#  - Default:            ArVizStorage
+#  - Case sensitivity:   yes
+#  - Required:           no
+# ArmarX.ObjectMemory.ArVizStorageName = ArVizStorage
+
+
 # ArmarX.ObjectMemory.ArVizTopicName:  Name of the ArViz topic
 #  Attributes:
 #  - Default:            ArVizTopic
@@ -134,14 +142,6 @@
 # ArmarX.ObjectMemory.RemoteGuiName = RemoteGuiProvider
 
 
-# ArmarX.ObjectMemory.RemoteStateComponentName:  Name of the robot state component
-#  Attributes:
-#  - Default:            RobotStateComponent
-#  - Case sensitivity:   yes
-#  - Required:           no
-# ArmarX.ObjectMemory.RemoteStateComponentName = RobotStateComponent
-
-
 # ArmarX.ObjectMemory.cmp.KinematicUnitObserverName:  Name of the kinematic unit observer.
 #  Attributes:
 #  - Default:            KinematicUnitObserver
@@ -150,55 +150,6 @@
 # ArmarX.ObjectMemory.cmp.KinematicUnitObserverName = KinematicUnitObserver
 
 
-# ArmarX.ObjectMemory.ltm.00_enabled:  
-#  Attributes:
-#  - Default:            true
-#  - Case sensitivity:   yes
-#  - Required:           no
-#  - Possible values: {0, 1, false, no, true, yes}
-# ArmarX.ObjectMemory.ltm.00_enabled = true
-
-
-# ArmarX.ObjectMemory.ltm.10_host:  
-#  Attributes:
-#  - Default:            localhost
-#  - Case sensitivity:   yes
-#  - Required:           no
-# ArmarX.ObjectMemory.ltm.10_host = localhost
-
-
-# ArmarX.ObjectMemory.ltm.11_port:  
-#  Attributes:
-#  - Default:            25270
-#  - Case sensitivity:   yes
-#  - Required:           no
-# ArmarX.ObjectMemory.ltm.11_port = 25270
-
-
-# ArmarX.ObjectMemory.ltm.20_user:  
-#  Attributes:
-#  - Default:            ""
-#  - Case sensitivity:   yes
-#  - Required:           no
-# ArmarX.ObjectMemory.ltm.20_user = ""
-
-
-# ArmarX.ObjectMemory.ltm.21_password:  
-#  Attributes:
-#  - Default:            ""
-#  - Case sensitivity:   yes
-#  - Required:           no
-# ArmarX.ObjectMemory.ltm.21_password = ""
-
-
-# ArmarX.ObjectMemory.ltm.22_database:  
-#  Attributes:
-#  - Default:            Test
-#  - Case sensitivity:   yes
-#  - Required:           no
-# ArmarX.ObjectMemory.ltm.22_database = Test
-
-
 # ArmarX.ObjectMemory.mem.MemoryName:  Name of this memory server.
 #  Attributes:
 #  - Default:            Object
@@ -207,55 +158,6 @@
 # ArmarX.ObjectMemory.mem.MemoryName = Object
 
 
-# ArmarX.ObjectMemory.mem.articulated.cls.CoreSegmentName:  Name of the object instance core segment.
-#  Attributes:
-#  - Default:            ArticulatedObjectClass
-#  - Case sensitivity:   yes
-#  - Required:           no
-# ArmarX.ObjectMemory.mem.articulated.cls.CoreSegmentName = ArticulatedObjectClass
-
-
-# ArmarX.ObjectMemory.mem.articulated.cls.LoadFromObjectsPackage:  If true, load the objects from the objects package on startup.
-#  Attributes:
-#  - Default:            true
-#  - Case sensitivity:   yes
-#  - Required:           no
-#  - Possible values: {0, 1, false, no, true, yes}
-# ArmarX.ObjectMemory.mem.articulated.cls.LoadFromObjectsPackage = true
-
-
-# ArmarX.ObjectMemory.mem.articulated.cls.MaxHistorySize:  Maximal size of object poses history (-1 for infinite).
-#  Attributes:
-#  - Default:            -1
-#  - Case sensitivity:   yes
-#  - Required:           no
-# ArmarX.ObjectMemory.mem.articulated.cls.MaxHistorySize = -1
-
-
-# ArmarX.ObjectMemory.mem.articulated.cls.ObjectsPackage:  Name of the objects package to load from.
-#  Attributes:
-#  - Default:            PriorKnowledgeData
-#  - Case sensitivity:   yes
-#  - Required:           no
-# ArmarX.ObjectMemory.mem.articulated.cls.ObjectsPackage = PriorKnowledgeData
-
-
-# ArmarX.ObjectMemory.mem.articulated.inst.CoreSegmentName:  Name of the object instance core segment.
-#  Attributes:
-#  - Default:            ArticulatedObjectInstance
-#  - Case sensitivity:   yes
-#  - Required:           no
-# ArmarX.ObjectMemory.mem.articulated.inst.CoreSegmentName = ArticulatedObjectInstance
-
-
-# ArmarX.ObjectMemory.mem.articulated.inst.MaxHistorySize:  Maximal size of object poses history (-1 for infinite).
-#  Attributes:
-#  - Default:            -1
-#  - Case sensitivity:   yes
-#  - Required:           no
-# ArmarX.ObjectMemory.mem.articulated.inst.MaxHistorySize = -1
-
-
 # ArmarX.ObjectMemory.mem.attachments.CoreSegmentName:  Name of the object instance core segment.
 #  Attributes:
 #  - Default:            Attachments
@@ -272,14 +174,6 @@
 # ArmarX.ObjectMemory.mem.attachments.MaxHistorySize = -1
 
 
-# ArmarX.ObjectMemory.mem.cls.CoreSegmentName:  Name of the object clazz core segment.
-#  Attributes:
-#  - Default:            Class
-#  - Case sensitivity:   yes
-#  - Required:           no
-# ArmarX.ObjectMemory.mem.cls.CoreSegmentName = Class
-
-
 # ArmarX.ObjectMemory.mem.cls.Floor.EntityName:  Object class entity of the floor.
 #  Attributes:
 #  - Default:            Building/floor-20x20
@@ -323,28 +217,28 @@
 # ArmarX.ObjectMemory.mem.cls.LoadFromObjectsPackage = true
 
 
-# ArmarX.ObjectMemory.mem.cls.MaxHistorySize:  Maximal size of object poses history (-1 for infinite).
+# ArmarX.ObjectMemory.mem.cls.ObjectsPackage:  Name of the objects package to load from.
 #  Attributes:
-#  - Default:            -1
+#  - Default:            PriorKnowledgeData
 #  - Case sensitivity:   yes
 #  - Required:           no
-# ArmarX.ObjectMemory.mem.cls.MaxHistorySize = -1
+# ArmarX.ObjectMemory.mem.cls.ObjectsPackage = PriorKnowledgeData
 
 
-# ArmarX.ObjectMemory.mem.cls.ObjectsPackage:  Name of the objects package to load from.
+# ArmarX.ObjectMemory.mem.cls.seg.CoreMaxHistorySize:  Maximal size of the Class entity histories (-1 for infinite).
 #  Attributes:
-#  - Default:            PriorKnowledgeData
+#  - Default:            -1
 #  - Case sensitivity:   yes
 #  - Required:           no
-# ArmarX.ObjectMemory.mem.cls.ObjectsPackage = PriorKnowledgeData
+# ArmarX.ObjectMemory.mem.cls.seg.CoreMaxHistorySize = -1
 
 
-# ArmarX.ObjectMemory.mem.inst.CoreSegmentName:  Name of the object instance core segment.
+# ArmarX.ObjectMemory.mem.cls.seg.CoreSegmentName:  Name of the Class core segment.
 #  Attributes:
-#  - Default:            Instance
+#  - Default:            Class
 #  - Case sensitivity:   yes
 #  - Required:           no
-# ArmarX.ObjectMemory.mem.inst.CoreSegmentName = Instance
+# ArmarX.ObjectMemory.mem.cls.seg.CoreSegmentName = Class
 
 
 # ArmarX.ObjectMemory.mem.inst.DiscardSnapshotsWhileAttached:  If true, no new snapshots are stored while an object is attached to a robot node.
@@ -357,14 +251,6 @@
 # ArmarX.ObjectMemory.mem.inst.DiscardSnapshotsWhileAttached = true
 
 
-# ArmarX.ObjectMemory.mem.inst.MaxHistorySize:  Maximal size of object poses history (-1 for infinite).
-#  Attributes:
-#  - Default:            25
-#  - Case sensitivity:   yes
-#  - Required:           no
-# ArmarX.ObjectMemory.mem.inst.MaxHistorySize = 25
-
-
 # ArmarX.ObjectMemory.mem.inst.calibration.offset:  Offset for the node to be calibrated.
 #  Attributes:
 #  - Default:            0
@@ -472,8 +358,9 @@
 # ArmarX.ObjectMemory.mem.inst.scene.11_Directory = scenes
 
 
-# ArmarX.ObjectMemory.mem.inst.scene.12_SnapshotToLoad:  Scene snapshot to load on startup (e.g. 'Scene_2021-06-24_20-20-03').
-# You can also specify paths relative to 'Package/scenes/'.
+# ArmarX.ObjectMemory.mem.inst.scene.12_SnapshotToLoad:  Scene to load on startup (e.g. 'Scene_2021-06-24_20-20-03').
+# You can also specify paths relative to 'Package/scenes/'. 
+# You can also specify a ; separated list of scenes.
 #  Attributes:
 #  - Default:            ""
 #  - Case sensitivity:   yes
@@ -481,6 +368,22 @@
 # ArmarX.ObjectMemory.mem.inst.scene.12_SnapshotToLoad = ""
 
 
+# ArmarX.ObjectMemory.mem.inst.seg.CoreMaxHistorySize:  Maximal size of the Instance entity histories (-1 for infinite).
+#  Attributes:
+#  - Default:            64
+#  - Case sensitivity:   yes
+#  - Required:           no
+# ArmarX.ObjectMemory.mem.inst.seg.CoreMaxHistorySize = 64
+
+
+# ArmarX.ObjectMemory.mem.inst.seg.CoreSegmentName:  Name of the Instance core segment.
+#  Attributes:
+#  - Default:            Instance
+#  - Case sensitivity:   yes
+#  - Required:           no
+# ArmarX.ObjectMemory.mem.inst.seg.CoreSegmentName = Instance
+
+
 # ArmarX.ObjectMemory.mem.inst.visu.alpha:  Alpha of objects (1 = solid, 0 = transparent).
 #  Attributes:
 #  - Default:            1
@@ -515,6 +418,32 @@
 # ArmarX.ObjectMemory.mem.inst.visu.frequenzyHz = 25
 
 
+# ArmarX.ObjectMemory.mem.inst.visu.gaussians.position:  Enable showing pose gaussians (orientation part).
+#  Attributes:
+#  - Default:            false
+#  - Case sensitivity:   yes
+#  - Required:           no
+#  - Possible values: {0, 1, false, no, true, yes}
+# ArmarX.ObjectMemory.mem.inst.visu.gaussians.position = false
+
+
+# ArmarX.ObjectMemory.mem.inst.visu.gaussians.positionDisplaced:  Displace center orientation (co)variance circle arrows along their rotation axis.
+#  Attributes:
+#  - Default:            false
+#  - Case sensitivity:   yes
+#  - Required:           no
+#  - Possible values: {0, 1, false, no, true, yes}
+# ArmarX.ObjectMemory.mem.inst.visu.gaussians.positionDisplaced = false
+
+
+# ArmarX.ObjectMemory.mem.inst.visu.gaussians.positionScale:  Scaling of pose gaussians (orientation part).
+#  Attributes:
+#  - Default:            100
+#  - Case sensitivity:   yes
+#  - Required:           no
+# ArmarX.ObjectMemory.mem.inst.visu.gaussians.positionScale = 100
+
+
 # ArmarX.ObjectMemory.mem.inst.visu.inGlobalFrame:  If true, show global poses. If false, show poses in robot frame.
 #  Attributes:
 #  - Default:            true
@@ -550,6 +479,31 @@
 # ArmarX.ObjectMemory.mem.inst.visu.oobbs = false
 
 
+# ArmarX.ObjectMemory.mem.inst.visu.predictions.linear.show:  Show arrows linearly predicting object positions.
+#  Attributes:
+#  - Default:            false
+#  - Case sensitivity:   yes
+#  - Required:           no
+#  - Possible values: {0, 1, false, no, true, yes}
+# ArmarX.ObjectMemory.mem.inst.visu.predictions.linear.show = false
+
+
+# ArmarX.ObjectMemory.mem.inst.visu.predictions.linear.timeOffset:  The offset (in seconds) to the current time to make predictions for.
+#  Attributes:
+#  - Default:            1
+#  - Case sensitivity:   yes
+#  - Required:           no
+# ArmarX.ObjectMemory.mem.inst.visu.predictions.linear.timeOffset = 1
+
+
+# ArmarX.ObjectMemory.mem.inst.visu.predictions.linear.timeWindow:  The time window (in seconds) into the past to perform the regression on.
+#  Attributes:
+#  - Default:            2
+#  - Case sensitivity:   yes
+#  - Required:           no
+# ArmarX.ObjectMemory.mem.inst.visu.predictions.linear.timeWindow = 2
+
+
 # ArmarX.ObjectMemory.mem.inst.visu.useArticulatedModels:  Prefer articulated object models if available.
 #  Attributes:
 #  - Default:            true
@@ -559,6 +513,158 @@
 # ArmarX.ObjectMemory.mem.inst.visu.useArticulatedModels = true
 
 
+# ArmarX.ObjectMemory.mem.ltm..buffer.storeFreq:  Frequency to store the buffer to the LTM in Hz.
+#  Attributes:
+#  - Default:            10
+#  - Case sensitivity:   yes
+#  - Required:           no
+# ArmarX.ObjectMemory.mem.ltm..buffer.storeFreq = 10
+
+
+# ArmarX.ObjectMemory.mem.ltm.depthImageExtractor.Enabled:  
+#  Attributes:
+#  - Default:            true
+#  - Case sensitivity:   yes
+#  - Required:           no
+#  - Possible values: {0, 1, false, no, true, yes}
+# ArmarX.ObjectMemory.mem.ltm.depthImageExtractor.Enabled = true
+
+
+# ArmarX.ObjectMemory.mem.ltm.enabled:  
+#  Attributes:
+#  - Default:            false
+#  - Case sensitivity:   yes
+#  - Required:           no
+#  - Possible values: {0, 1, false, no, true, yes}
+# ArmarX.ObjectMemory.mem.ltm.enabled = false
+
+
+# ArmarX.ObjectMemory.mem.ltm.exrConverter.Enabled:  
+#  Attributes:
+#  - Default:            true
+#  - Case sensitivity:   yes
+#  - Required:           no
+#  - Possible values: {0, 1, false, no, true, yes}
+# ArmarX.ObjectMemory.mem.ltm.exrConverter.Enabled = true
+
+
+# ArmarX.ObjectMemory.mem.ltm.imageExtractor.Enabled:  
+#  Attributes:
+#  - Default:            true
+#  - Case sensitivity:   yes
+#  - Required:           no
+#  - Possible values: {0, 1, false, no, true, yes}
+# ArmarX.ObjectMemory.mem.ltm.imageExtractor.Enabled = true
+
+
+# ArmarX.ObjectMemory.mem.ltm.memFreqFilter.Enabled:  
+#  Attributes:
+#  - Default:            false
+#  - Case sensitivity:   yes
+#  - Required:           no
+#  - Possible values: {0, 1, false, no, true, yes}
+# ArmarX.ObjectMemory.mem.ltm.memFreqFilter.Enabled = false
+
+
+# ArmarX.ObjectMemory.mem.ltm.memFreqFilter.WaitingTime:  Waiting time in MS after each LTM update.
+#  Attributes:
+#  - Default:            -1
+#  - Case sensitivity:   yes
+#  - Required:           no
+# ArmarX.ObjectMemory.mem.ltm.memFreqFilter.WaitingTime = -1
+
+
+# ArmarX.ObjectMemory.mem.ltm.pngConverter.Enabled:  
+#  Attributes:
+#  - Default:            true
+#  - Case sensitivity:   yes
+#  - Required:           no
+#  - Possible values: {0, 1, false, no, true, yes}
+# ArmarX.ObjectMemory.mem.ltm.pngConverter.Enabled = true
+
+
+# ArmarX.ObjectMemory.mem.ltm.sizeToCompressDataInMegaBytes:  The size in MB to compress away the current export. Exports are numbered (lower number means newer).
+#  Attributes:
+#  - Default:            1024
+#  - Case sensitivity:   yes
+#  - Required:           no
+# ArmarX.ObjectMemory.mem.ltm.sizeToCompressDataInMegaBytes = 1024
+
+
+# ArmarX.ObjectMemory.mem.ltm.snapEqFilter.Enabled:  
+#  Attributes:
+#  - Default:            false
+#  - Case sensitivity:   yes
+#  - Required:           no
+#  - Possible values: {0, 1, false, no, true, yes}
+# ArmarX.ObjectMemory.mem.ltm.snapEqFilter.Enabled = false
+
+
+# ArmarX.ObjectMemory.mem.ltm.snapEqFilter.MaxWaitingTime:  Max Waiting time in MS after each Entity update.
+#  Attributes:
+#  - Default:            -1
+#  - Case sensitivity:   yes
+#  - Required:           no
+# ArmarX.ObjectMemory.mem.ltm.snapEqFilter.MaxWaitingTime = -1
+
+
+# ArmarX.ObjectMemory.mem.ltm.snapFreqFilter.Enabled:  
+#  Attributes:
+#  - Default:            false
+#  - Case sensitivity:   yes
+#  - Required:           no
+#  - Possible values: {0, 1, false, no, true, yes}
+# ArmarX.ObjectMemory.mem.ltm.snapFreqFilter.Enabled = false
+
+
+# ArmarX.ObjectMemory.mem.ltm.snapFreqFilter.WaitingTime:  Waiting time in MS after each Entity update.
+#  Attributes:
+#  - Default:            -1
+#  - Case sensitivity:   yes
+#  - Required:           no
+# ArmarX.ObjectMemory.mem.ltm.snapFreqFilter.WaitingTime = -1
+
+
+# ArmarX.ObjectMemory.mem.ltm.storagepath:  The path to the memory storage (the memory will be stored in a seperate subfolder).
+#  Attributes:
+#  - Default:            Default value not mapped.
+#  - Case sensitivity:   yes
+#  - Required:           no
+# ArmarX.ObjectMemory.mem.ltm.storagepath = Default value not mapped.
+
+
+# ArmarX.ObjectMemory.mem.robot_state.Memory:  
+#  Attributes:
+#  - Default:            RobotState
+#  - Case sensitivity:   yes
+#  - Required:           no
+# ArmarX.ObjectMemory.mem.robot_state.Memory = RobotState
+
+
+# ArmarX.ObjectMemory.mem.robot_state.descriptionSegment:  
+#  Attributes:
+#  - Default:            Description
+#  - Case sensitivity:   yes
+#  - Required:           no
+# ArmarX.ObjectMemory.mem.robot_state.descriptionSegment = Description
+
+
+# ArmarX.ObjectMemory.mem.robot_state.localizationSegment:  
+#  Attributes:
+#  - Default:            Localization
+#  - Case sensitivity:   yes
+#  - Required:           no
+# ArmarX.ObjectMemory.mem.robot_state.localizationSegment = Localization
+
+
+# ArmarX.ObjectMemory.mem.robot_state.proprioceptionSegment:  
+#  Attributes:
+#  - Default:            Proprioception
+#  - Case sensitivity:   yes
+#  - Required:           no
+# ArmarX.ObjectMemory.mem.robot_state.proprioceptionSegment = Proprioception
+
+
 # ArmarX.ObjectMemory.mns.MemoryNameSystemEnabled:  Whether to use (and depend on) the Memory Name System (MNS).
 # Set to false to use this memory as a stand-alone.
 #  Attributes:
@@ -577,28 +683,28 @@
 # ArmarX.ObjectMemory.mns.MemoryNameSystemName = MemoryNameSystem
 
 
-# ArmarX.ObjectMemory.tpc.pub.DebugObserver:  Name of the `DebugObserver` topic to publish data to.
+# ArmarX.ObjectMemory.prediction.TimeWindow:  Duration of time window into the past to use for predictions when requested via the PredictingMemoryInterface (in seconds).
 #  Attributes:
-#  - Default:            DebugObserver
+#  - Default:            2
 #  - Case sensitivity:   yes
 #  - Required:           no
-# ArmarX.ObjectMemory.tpc.pub.DebugObserver = DebugObserver
+# ArmarX.ObjectMemory.prediction.TimeWindow = 2
 
 
-# ArmarX.ObjectMemory.tpc.pub.MemoryListener:  Name of the `MemoryListener` topic to publish data to.
+# ArmarX.ObjectMemory.robotName:  
 #  Attributes:
-#  - Default:            MemoryUpdates
+#  - Default:            Armar6
 #  - Case sensitivity:   yes
 #  - Required:           no
-# ArmarX.ObjectMemory.tpc.pub.MemoryListener = MemoryUpdates
+# ArmarX.ObjectMemory.robotName = Armar6
 
 
-# ArmarX.ObjectMemory.tpc.sub.MemoryListener:  Name of the `MemoryListener` topic to subscribe to.
+# ArmarX.ObjectMemory.tpc.pub.DebugObserver:  Name of the `DebugObserver` topic to publish data to.
 #  Attributes:
-#  - Default:            MemoryUpdates
+#  - Default:            DebugObserver
 #  - Case sensitivity:   yes
 #  - Required:           no
-# ArmarX.ObjectMemory.tpc.sub.MemoryListener = MemoryUpdates
+# ArmarX.ObjectMemory.tpc.pub.DebugObserver = DebugObserver
 
 
 # ArmarX.ObjectMemory.tpc.sub.ObjectPoseTopic:  Name of the `ObjectPoseTopic` topic to subscribe to.
diff --git a/scenarios/ArMemObjectMemory/config/ObjectPoseClientExample.cfg b/scenarios/ArMemObjectMemory/config/ObjectPoseClientExample.cfg
index f75bad15e903fd399e990eb38dce28887c537d98..e64f75326949fb3263f378a19067aa2b8f85c00d 100644
--- a/scenarios/ArMemObjectMemory/config/ObjectPoseClientExample.cfg
+++ b/scenarios/ArMemObjectMemory/config/ObjectPoseClientExample.cfg
@@ -18,7 +18,7 @@
 # ArmarX.ApplicationName = ""
 
 
-# ArmarX.CachePath:  Path for cache files. If relative path AND env. variable ARMARX_USER_CONFIG_DIR is set, the cache path will be made relative to ARMARX_USER_CONFIG_DIR. Otherwise if relative it will be relative to the default ArmarX config dir (${HOME}/.armarx)
+# ArmarX.CachePath:  Path for cache files. If relative path AND env. variable ARMARX_CONFIG_DIR is set, the cache path will be made relative to ARMARX_CONFIG_DIR. Otherwise if relative it will be relative to the default ArmarX config dir (${ARMARX_WORKSPACE}/armarx_config)
 #  Attributes:
 #  - Default:            mongo/.cache
 #  - Case sensitivity:   yes
@@ -92,6 +92,14 @@
 # ArmarX.LoggingGroup = ""
 
 
+# ArmarX.ObjectPoseClientExample.ArVizStorageName:  Name of the ArViz storage
+#  Attributes:
+#  - Default:            ArVizStorage
+#  - Case sensitivity:   yes
+#  - Required:           no
+# ArmarX.ObjectPoseClientExample.ArVizStorageName = ArVizStorage
+
+
 # ArmarX.ObjectPoseClientExample.ArVizTopicName:  Name of the ArViz topic
 #  Attributes:
 #  - Default:            ArVizTopic
@@ -142,6 +150,22 @@
 # ArmarX.ObjectPoseClientExample.ObjectName = ""
 
 
+# ArmarX.ObjectPoseClientExample.predictions.NumberPerObject:  How many predictions with increasing time offsets to make per object.
+#  Attributes:
+#  - Default:            5
+#  - Case sensitivity:   yes
+#  - Required:           no
+# ArmarX.ObjectPoseClientExample.predictions.NumberPerObject = 5
+
+
+# ArmarX.ObjectPoseClientExample.predictions.TimeIncrement:  The size of the prediction time offset increment in milliseconds.
+#  Attributes:
+#  - Default:            200
+#  - Case sensitivity:   yes
+#  - Required:           no
+# ArmarX.ObjectPoseClientExample.predictions.TimeIncrement = 200
+
+
 # ArmarX.RedirectStdout:  Redirect std::cout and std::cerr to ArmarXLog
 #  Attributes:
 #  - Default:            true
diff --git a/scenarios/ArMemObjectMemory/config/ObjectPoseProviderExample.cfg b/scenarios/ArMemObjectMemory/config/ObjectPoseProviderExample.cfg
index 76fbf317102eb56ab01bfd0037544c69f85c6c27..5cb44d32cf1e0a1d8fea853e5b8c07603c4a0c6f 100644
--- a/scenarios/ArMemObjectMemory/config/ObjectPoseProviderExample.cfg
+++ b/scenarios/ArMemObjectMemory/config/ObjectPoseProviderExample.cfg
@@ -18,7 +18,7 @@
 # ArmarX.ApplicationName = ""
 
 
-# ArmarX.CachePath:  Path for cache files. If relative path AND env. variable ARMARX_USER_CONFIG_DIR is set, the cache path will be made relative to ARMARX_USER_CONFIG_DIR. Otherwise if relative it will be relative to the default ArmarX config dir (${HOME}/.armarx)
+# ArmarX.CachePath:  Path for cache files. If relative path AND env. variable ARMARX_CONFIG_DIR is set, the cache path will be made relative to ARMARX_CONFIG_DIR. Otherwise if relative it will be relative to the default ArmarX config dir (${ARMARX_WORKSPACE}/armarx_config)
 #  Attributes:
 #  - Default:            mongo/.cache
 #  - Case sensitivity:   yes
diff --git a/scenarios/ArMemObjectMemory/config/RemoteGuiProviderApp.cfg b/scenarios/ArMemObjectMemory/config/RemoteGuiProviderApp.cfg
index 4fd690cefd94559b207493cf40e346a3e47f3b12..4b6abea40d72afd7d313ee47a9b191f3b26de30d 100644
--- a/scenarios/ArMemObjectMemory/config/RemoteGuiProviderApp.cfg
+++ b/scenarios/ArMemObjectMemory/config/RemoteGuiProviderApp.cfg
@@ -18,7 +18,7 @@
 # ArmarX.ApplicationName = ""
 
 
-# ArmarX.CachePath:  Path for cache files. If relative path AND env. variable ARMARX_USER_CONFIG_DIR is set, the cache path will be made relative to ARMARX_USER_CONFIG_DIR. Otherwise if relative it will be relative to the default ArmarX config dir (${HOME}/.armarx)
+# ArmarX.CachePath:  Path for cache files. If relative path AND env. variable ARMARX_CONFIG_DIR is set, the cache path will be made relative to ARMARX_CONFIG_DIR. Otherwise if relative it will be relative to the default ArmarX config dir (${ARMARX_WORKSPACE}/armarx_config)
 #  Attributes:
 #  - Default:            mongo/.cache
 #  - Case sensitivity:   yes
diff --git a/scenarios/ArViz/config/ArVizStorage.cfg b/scenarios/ArViz/config/ArVizStorage.cfg
index 30b8ea5904d318cf689370e81d3d3a7c47d07a68..302ac28c37dd28de3e68fb4fe4c2174faa4ec3bf 100644
--- a/scenarios/ArViz/config/ArVizStorage.cfg
+++ b/scenarios/ArViz/config/ArVizStorage.cfg
@@ -27,7 +27,7 @@
 # ArmarX.ArVizStorage.EnableProfiling = false
 
 
-# ArmarX.ArVizStorage.HistoryPath:  Destination path where the history are serialized to
+# ArmarX.ArVizStorage.HistoryPath:  Destination path where the history is serialized to
 #  Attributes:
 #  - Default:            RobotAPI/ArVizStorage
 #  - Case sensitivity:   yes
diff --git a/source/RobotAPI/gui-plugins/HandUnitPlugin/HandUnitConfigDialog.cpp b/source/RobotAPI/gui-plugins/HandUnitPlugin/HandUnitConfigDialog.cpp
index 0a4d7031aad04aaf9cf42a044b1d1667b3c02ce3..2e4c5851c2417c67158785cb31226b03fff7c269 100644
--- a/source/RobotAPI/gui-plugins/HandUnitPlugin/HandUnitConfigDialog.cpp
+++ b/source/RobotAPI/gui-plugins/HandUnitPlugin/HandUnitConfigDialog.cpp
@@ -35,9 +35,13 @@ armarx::HandUnitConfigDialog::HandUnitConfigDialog(QWidget* parent) :
     setName(getDefaultName()); // @@@ This is necessary for more than 1 widget or even reopening the widget.
 
 
-    proxyFinder = new IceProxyFinder<HandUnitInterfacePrx>(this);
-    proxyFinder->setSearchMask("*Unit");
-    ui->proxyFinderContainer->addWidget(proxyFinder, 0, 0, 1, 1);
+    proxyFinderLeftHand = new IceProxyFinder<HandUnitInterfacePrx>(this);
+    proxyFinderLeftHand->setSearchMask("*Unit");
+    ui->proxyFinderContainerLeftHand->addWidget(proxyFinderLeftHand, 0, 0, 1, 1);
+
+    proxyFinderRightHand = new IceProxyFinder<HandUnitInterfacePrx>(this);
+    proxyFinderRightHand->setSearchMask("*Unit");
+    ui->proxyFinderContainerRightHand->addWidget(proxyFinderRightHand, 0, 0, 1, 1);
 }
 
 armarx::HandUnitConfigDialog::~HandUnitConfigDialog()
@@ -49,7 +53,8 @@ armarx::HandUnitConfigDialog::~HandUnitConfigDialog()
 
 void armarx::HandUnitConfigDialog::onInitComponent()
 {
-    proxyFinder->setIceManager(getIceManager());
+    proxyFinderLeftHand->setIceManager(getIceManager());
+    proxyFinderRightHand->setIceManager(getIceManager());
 }
 
 void armarx::HandUnitConfigDialog::onConnectComponent()
diff --git a/source/RobotAPI/gui-plugins/HandUnitPlugin/HandUnitConfigDialog.h b/source/RobotAPI/gui-plugins/HandUnitPlugin/HandUnitConfigDialog.h
index 1ed61c68cc05ded112d6a0515acae2008ab17602..149d8ce6101c2484d2a40e45d903d0faf45ed491 100644
--- a/source/RobotAPI/gui-plugins/HandUnitPlugin/HandUnitConfigDialog.h
+++ b/source/RobotAPI/gui-plugins/HandUnitPlugin/HandUnitConfigDialog.h
@@ -58,7 +58,8 @@ namespace armarx
     private:
         Ui::HandUnitConfigDialog* ui;
 
-        IceProxyFinderBase* proxyFinder;
+        IceProxyFinderBase* proxyFinderLeftHand;
+        IceProxyFinderBase* proxyFinderRightHand;
         std::string uuid;
 
         friend class HandUnitWidget;
diff --git a/source/RobotAPI/gui-plugins/HandUnitPlugin/HandUnitConfigDialog.ui b/source/RobotAPI/gui-plugins/HandUnitPlugin/HandUnitConfigDialog.ui
index 844cc1788efaa923a720bc1e08c8e00cab82de32..3197505fadbb74544a4c3e4ad14e01c521357226 100644
--- a/source/RobotAPI/gui-plugins/HandUnitPlugin/HandUnitConfigDialog.ui
+++ b/source/RobotAPI/gui-plugins/HandUnitPlugin/HandUnitConfigDialog.ui
@@ -7,48 +7,116 @@
     <x>0</x>
     <y>0</y>
     <width>527</width>
-    <height>113</height>
+    <height>179</height>
    </rect>
   </property>
   <property name="windowTitle">
    <string>Dialog</string>
   </property>
-  <layout class="QGridLayout" name="gridLayout_2">
-   <item row="3" column="0">
-    <widget class="QDialogButtonBox" name="buttonBox">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="standardButtons">
-      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
-     </property>
-    </widget>
-   </item>
-   <item row="0" column="0">
-    <layout class="QGridLayout" name="gridLayout">
-     <item row="1" column="1">
-      <widget class="QLineEdit" name="editHandName">
-       <property name="readOnly">
-        <bool>true</bool>
-       </property>
-       <property name="placeholderText">
-        <string>will be retrieved from HandUnit</string>
-       </property>
-      </widget>
-     </item>
-     <item row="1" column="0">
-      <widget class="QLabel" name="labelHandName">
-       <property name="text">
-        <string>Hand Name</string>
-       </property>
-      </widget>
-     </item>
-     <item row="0" column="0" colspan="2">
-      <layout class="QGridLayout" name="proxyFinderContainer"/>
-     </item>
-    </layout>
-   </item>
-  </layout>
+  <widget class="QDialogButtonBox" name="buttonBox">
+   <property name="geometry">
+    <rect>
+     <x>350</x>
+     <y>150</y>
+     <width>166</width>
+     <height>25</height>
+    </rect>
+   </property>
+   <property name="orientation">
+    <enum>Qt::Horizontal</enum>
+   </property>
+   <property name="standardButtons">
+    <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+   </property>
+  </widget>
+  <widget class="QLabel" name="labelLeftHandName">
+   <property name="geometry">
+    <rect>
+     <x>20</x>
+     <y>50</y>
+     <width>111</width>
+     <height>25</height>
+    </rect>
+   </property>
+   <property name="text">
+    <string>Left Hand Name</string>
+   </property>
+  </widget>
+  <widget class="QLineEdit" name="editLeftHandName">
+   <property name="geometry">
+    <rect>
+     <x>166</x>
+     <y>50</y>
+     <width>351</width>
+     <height>25</height>
+    </rect>
+   </property>
+   <property name="readOnly">
+    <bool>true</bool>
+   </property>
+   <property name="placeholderText">
+    <string>will be retrieved from HandUnit</string>
+   </property>
+  </widget>
+  <widget class="QLineEdit" name="editRightHandName">
+   <property name="geometry">
+    <rect>
+     <x>166</x>
+     <y>120</y>
+     <width>351</width>
+     <height>25</height>
+    </rect>
+   </property>
+   <property name="readOnly">
+    <bool>true</bool>
+   </property>
+   <property name="placeholderText">
+    <string>will be retrieved from HandUnit</string>
+   </property>
+  </widget>
+  <widget class="QLabel" name="labelRightHandName">
+   <property name="geometry">
+    <rect>
+     <x>20</x>
+     <y>120</y>
+     <width>121</width>
+     <height>25</height>
+    </rect>
+   </property>
+   <property name="text">
+    <string>Right Hand Name</string>
+   </property>
+  </widget>
+  <widget class="QWidget" name="layoutWidget">
+   <property name="geometry">
+    <rect>
+     <x>10</x>
+     <y>80</y>
+     <width>511</width>
+     <height>35</height>
+    </rect>
+   </property>
+   <layout class="QGridLayout" name="gridLayoutRightHand">
+    <item row="0" column="0">
+     <layout class="QGridLayout" name="proxyFinderContainerRightHand"/>
+    </item>
+   </layout>
+  </widget>
+  <widget class="QWidget" name="">
+   <property name="geometry">
+    <rect>
+     <x>9</x>
+     <y>9</y>
+     <width>511</width>
+     <height>35</height>
+    </rect>
+   </property>
+   <layout class="QGridLayout" name="gridLayoutLeftHand">
+    <item row="0" column="0" colspan="2">
+     <layout class="QGridLayout" name="proxyFinderContainerLeftHand"/>
+    </item>
+   </layout>
+  </widget>
  </widget>
  <tabstops>
   <tabstop>buttonBox</tabstop>
diff --git a/source/RobotAPI/gui-plugins/HandUnitPlugin/HandUnitGuiPlugin.cpp b/source/RobotAPI/gui-plugins/HandUnitPlugin/HandUnitGuiPlugin.cpp
index 5c86b2dda49248a4148b5f3c83785272a94789f9..ea3190228596e928bc349b9fd1a063c88025cc63 100644
--- a/source/RobotAPI/gui-plugins/HandUnitPlugin/HandUnitGuiPlugin.cpp
+++ b/source/RobotAPI/gui-plugins/HandUnitPlugin/HandUnitGuiPlugin.cpp
@@ -35,6 +35,9 @@
 #include <QLineEdit>
 #include <QMessageBox>
 #include <QTimer>
+#include <QtWidgets/QSlider>
+#include <QtWidgets/QTableWidgetItem>
+#include <QString>
 
 #include <cmath>
 
@@ -46,60 +49,107 @@ namespace armarx
     }
 
     HandUnitWidget::HandUnitWidget() :
-        handName("NOT SET YET"),
-        handUnitProxyName(""),
-        setJointAnglesFlag(false)
+        leftHandName("NOT SET YET"),
+        rightHandName("NOT SET YET"),
+        leftHandUnitProxyName(""),
+        rightHandUnitProxyName(""),
+        setLeftHandJointAnglesFlag(false),
+        setRightHandJointAnglesFlag(false)
     {
         // init gui
         ui.setupUi(getWidget());
 
-        jointAngleUpdateTask = new PeriodicTask<HandUnitWidget>(this, &HandUnitWidget::setJointAngles, 50);
+        setLeftHandJointAngleUpdateTask = new PeriodicTask<HandUnitWidget>(this, &HandUnitWidget::setLeftHandJointAngles, 50);
+        setRightHandJointAngleUpdateTask = new PeriodicTask<HandUnitWidget>(this, &HandUnitWidget::setRightHandJointAngles, 50);
         updateInfoTimer = new QTimer(this);
     }
 
 
     void HandUnitWidget::onInitComponent()
     {
-        usingProxy(handUnitProxyName);
+        usingProxy(leftHandUnitProxyName);
+        usingProxy(rightHandUnitProxyName);
         //usingTopic(handName + "State");
         //ARMARX_WARNING << "Listening on Topic: " << handName + "State";
     }
 
     void HandUnitWidget::onConnectComponent()
     {
-        connectSlots();
-        jointAngleUpdateTask->start();
         updateInfoTimer->start(50);
 
-        handUnitProxy = getProxy<HandUnitInterfacePrx>(handUnitProxyName);
-        handName = handUnitProxy->getHandName();
 
-        // @@@ In simulation hand is called 'Hand L'/'Hand R'. On 3b Hand is called 'TCP R'
-        if (handName != "Hand L" && handName != "Hand R" && handName != "TCP L" && handName != "TCP R")
+
+        setLeftHandJointAngleUpdateTask->start();
+
+        leftHandUnitProxy = getProxy<HandUnitInterfacePrx>(leftHandUnitProxyName);
+        leftHandName = leftHandUnitProxy->getHandName();
+
+        if (leftHandName == "Hand L" || leftHandName == "TCP L")
         {
-            //QMessageBox::warning(NULL, "Hand not supported", QString("Hand with name \"") + QString::fromStdString(handName) + " \" is not suppored.");
-            ARMARX_WARNING << "Hand with name \"" << handName << "\" is not supported.";
+            leftHandConversionFactor *= M_PI / 2;
+        }
+        else if (leftHandName != "Hand_L_EEF")
+        {
+            ARMARX_WARNING << "Left hand with name \"" << leftHandName << "\" is not supported.";
         }
 
-        //ui.labelInfo->setText(QString::fromStdString(handUnitProxyName + " :: " + handName));
+        SingleTypeVariantListPtr leftHandPreshapeStrings = SingleTypeVariantListPtr::dynamicCast(leftHandUnitProxy->getShapeNames());
+        QStringList leftHandList;
+        int leftHandPreshapeCount = leftHandPreshapeStrings->getSize();
 
-        SingleTypeVariantListPtr preshapeStrings = SingleTypeVariantListPtr::dynamicCast(handUnitProxy->getShapeNames());
-        QStringList list;
-        int preshapeCount = preshapeStrings->getSize();
+        for (int i = 0; i < leftHandPreshapeCount; ++i)
+        {
+            std::string shape = ((leftHandPreshapeStrings->getVariant(i))->get<std::string>());
+//            ARMARX_INFO << VAROUT(shape);
+            leftHandList << QString::fromStdString(shape);
+        }
 
-        for (int i = 0; i < preshapeCount; ++i)
+        ui.comboLeftHandPreshapes->clear();
+        ui.comboLeftHandPreshapes->addItems(leftHandList);
+
+
+
+        setRightHandJointAngleUpdateTask->start();
+
+        rightHandUnitProxy = getProxy<HandUnitInterfacePrx>(rightHandUnitProxyName);
+        rightHandName = rightHandUnitProxy->getHandName();
+
+        if (rightHandName == "Hand R" || rightHandName == "TCP R")
         {
-            std::string shape = ((preshapeStrings->getVariant(i))->get<std::string>());
-            list << QString::fromStdString(shape);
+            rightHandConversionFactor *= M_PI / 2;
         }
+        else if (rightHandName != "Hand_R_EEF")
+        {
+            ARMARX_WARNING << "Right hand with name \"" << rightHandName << "\" is not supported.";
+        }
+
+        SingleTypeVariantListPtr rightHandPreshapeStrings = SingleTypeVariantListPtr::dynamicCast(rightHandUnitProxy->getShapeNames());
+        QStringList rightHandList;
+        int rightHandPreshapeCount = rightHandPreshapeStrings->getSize();
+
+        for (int i = 0; i < rightHandPreshapeCount; ++i)
+        {
+            std::string shape = ((rightHandPreshapeStrings->getVariant(i))->get<std::string>());
+//            ARMARX_INFO << VAROUT(shape);
+            rightHandList << QString::fromStdString(shape);
+        }
+
+        ui.comboRightHandPreshapes->clear();
+        ui.comboRightHandPreshapes->addItems(rightHandList);
 
-        ui.comboPreshapes->clear();
-        ui.comboPreshapes->addItems(list);
+
+
+//        ARMARX_INFO << "initGUIJointFrames";
+        initGUIJointFrames();
+        displayJointAngleUpdateTask = new PeriodicTask<HandUnitWidget>(this, &HandUnitWidget::updateJointValueTable, 50);
+        displayJointAngleUpdateTask->start();
     }
 
     void HandUnitWidget::onDisconnectComponent()
     {
-        jointAngleUpdateTask->stop();
+        setLeftHandJointAngleUpdateTask->stop();
+        setRightHandJointAngleUpdateTask->stop();
+        displayJointAngleUpdateTask->stop();
         updateInfoTimer->stop();
     }
 
@@ -121,136 +171,323 @@ namespace armarx
 
     void HandUnitWidget::configured()
     {
-        handUnitProxyName = dialog->proxyFinder->getSelectedProxyName().toStdString();
+        leftHandUnitProxyName = dialog->proxyFinderLeftHand->getSelectedProxyName().toStdString();
+        rightHandUnitProxyName = dialog->proxyFinderRightHand->getSelectedProxyName().toStdString();
     }
 
-    void HandUnitWidget::preshapeHand()
+    void HandUnitWidget::preshapeLeftHand()
     {
-        setPreshape(ui.comboPreshapes->currentText().toUtf8().data());
+        setLeftHandPreshape(ui.comboLeftHandPreshapes->currentText().toUtf8().data());
     }
 
-    void HandUnitWidget::setJointAngles()
+    void HandUnitWidget::preshapeRightHand()
     {
-        if (!handUnitProxy)
+        setRightHandPreshape(ui.comboRightHandPreshapes->currentText().toUtf8().data());
+    }
+
+    void HandUnitWidget::setLeftHandJointAngles()
+    {    
+//        ARMARX_INFO << "setLeftHandJointAngles";
+        if (!leftHandUnitProxy)
         {
             ARMARX_WARNING << "invalid proxy";
             return;
         }
 
-        if (!setJointAnglesFlag)
+        if (!setLeftHandJointAnglesFlag)
+        {
+            return;
+        }
+
+        setLeftHandJointAnglesFlag = false;
+
+        NameValueMap leftHandJa;
+        NameValueMap currentLeftHandJointValues = leftHandUnitProxy->getCurrentJointValues();
+        float value = 0;
+        if (leftHandName == "Hand L" || leftHandName == "TCP L")
         {
+            leftHandConversionFactor *= M_PI / 2;
+        }
+        else if (leftHandName != "Hand_L_EEF")
+        {
+            ARMARX_WARNING << "Left hand with name \"" << leftHandName << "\" is not supported.";
             return;
         }
 
-        setJointAnglesFlag = false;
+        for (const auto& pair : currentLeftHandJointValues)
+        {
+            if (pair.first == currentLeftHandJoint)
+            {
+                value = static_cast<float>(ui.horizontalSliderLeftHandJointPos->value() * leftHandConversionFactor);
+//                ARMARX_INFO << VAROUT(value);
+                leftHandJa[pair.first] = value;
+                break;
+            }
+        }
 
-        NameValueMap ja;
+//        ARMARX_INFO << VAROUT(value / leftHandConversionFactor);
+        ui.lcdNumberLeftHandJointValue->display(value / leftHandConversionFactor);
+        leftHandUnitProxy->setJointAngles(leftHandJa);
+    }
 
-        if (handName == "Hand L" || handName == "TCP L")
+    void HandUnitWidget::setRightHandJointAngles()
+    {
+//        ARMARX_INFO << "setRightHandJointAngles";
+        if (!rightHandUnitProxy)
         {
-            ja["Hand Palm 2 L"] = ui.horizontalSliderPalm->value() * M_PI / 180;
-            ja["Index L J0"] = ui.horizontalSliderIndexJ0->value() * M_PI / 180;
-            ja["Index L J1"] = ui.horizontalSliderIndexJ1->value() * M_PI / 180;
-            ja["Middle L J0"] = ui.horizontalSliderMiddleJ0->value() * M_PI / 180;
-            ja["Middle L J1"] = ui.horizontalSliderMiddleJ1->value() * M_PI / 180;
-            ja["Thumb L J0"] = ui.horizontalSliderThumbJ0->value() * M_PI / 180;
-            ja["Thumb L J1"] = ui.horizontalSliderThumbJ1->value() * M_PI / 180;
-            float rinkyValue = ui.horizontalSliderRinky->value() * M_PI / 180;
-            ja["Ring L J0"] = rinkyValue;
-            ja["Ring L J1"] = rinkyValue;
-            ja["Pinky L J0"] = rinkyValue;
-            ja["Pinky L J1"] = rinkyValue;
+            ARMARX_WARNING << "invalid proxy";
+            return;
         }
-        else if (handName == "Hand R" || handName == "TCP R")
+
+        if (!setRightHandJointAnglesFlag)
         {
-            ja["Hand Palm 2 R"] = ui.horizontalSliderPalm->value() * M_PI / 180;
-            ja["Index R J0"] = ui.horizontalSliderIndexJ0->value() * M_PI / 180;
-            ja["Index R J1"] = ui.horizontalSliderIndexJ1->value() * M_PI / 180;
-            ja["Middle R J0"] = ui.horizontalSliderMiddleJ0->value() * M_PI / 180;
-            ja["Middle R J1"] = ui.horizontalSliderMiddleJ1->value() * M_PI / 180;
-            ja["Thumb R J0"] = ui.horizontalSliderThumbJ0->value() * M_PI / 180;
-            ja["Thumb R J1"] = ui.horizontalSliderThumbJ1->value() * M_PI / 180;
-            float rinkyValue = ui.horizontalSliderRinky->value() * M_PI / 180;
-            ja["Ring R J0"] = rinkyValue;
-            ja["Ring R J1"] = rinkyValue;
-            ja["Pinky R J0"] = rinkyValue;
-            ja["Pinky R J1"] = rinkyValue;
+            return;
         }
-        else
+
+        setRightHandJointAnglesFlag = false;
+
+        NameValueMap rightHandJa;
+        NameValueMap currentRightHandJointValues = rightHandUnitProxy->getCurrentJointValues();
+        float value = 0;
+        if (rightHandName == "Hand R" || rightHandName == "TCP R")
+        {
+            rightHandConversionFactor *= M_PI / 2;
+        }
+        else if (rightHandName != "Hand_R_EEF")
+        {
+            ARMARX_WARNING << "Right hand with name \"" << rightHandName << "\" is not supported.";
+            return;
+        }
+
+        for (const auto& pair : currentRightHandJointValues)
         {
-            ARMARX_WARNING << "Hand with name \"" << handName << "\" is not supported.";
+            if (pair.first == currentRightHandJoint)
+            {
+                value = static_cast<float>(ui.horizontalSliderRightHandJointPos->value() * rightHandConversionFactor);
+//                ARMARX_INFO << VAROUT(value);
+                rightHandJa[pair.first] = value;
+                break;
+            }
         }
 
-        handUnitProxy->setJointAngles(ja);
+//        ARMARX_INFO << VAROUT(value / rightHandConversionFactor);
+        ui.lcdNumberRightHandJointValue->display(value / rightHandConversionFactor);
+        rightHandUnitProxy->setJointAngles(rightHandJa);
+    }
+
+    void HandUnitWidget::requestSetLeftHandJointAngles()
+    {
+        setLeftHandJointAnglesFlag = true;
     }
 
-    void HandUnitWidget::requestSetJointAngles()
+    void HandUnitWidget::requestSetRightHandJointAngles()
     {
-        setJointAnglesFlag = true;
+        setRightHandJointAnglesFlag = true;
     }
 
-    void HandUnitWidget::openHand()
+    void HandUnitWidget::openLeftHand()
     {
-        setPreshape("Open");
+        setLeftHandPreshape("Open");
     }
 
-    void HandUnitWidget::closeHand()
+    void HandUnitWidget::openRightHand()
     {
-        setPreshape("Close");
+        setRightHandPreshape("Open");
     }
 
-    void HandUnitWidget::closeThumb()
+    void HandUnitWidget::closeLeftHand()
     {
-        setPreshape("Thumb");
+        setLeftHandPreshape("Close");
     }
 
-    void HandUnitWidget::relaxHand()
+    void HandUnitWidget::closeRightHand()
     {
-        setPreshape("Relax");
+        setRightHandPreshape("Close");
+    }
+
+    void HandUnitWidget::relaxLeftHand()
+    {
+        setLeftHandPreshape("Relax");
+    }
+
+    void HandUnitWidget::relaxRightHand()
+    {
+        setRightHandPreshape("Relax");
     }
 
     void HandUnitWidget::updateInfoLabel()
     {
-        ui.labelInfo->setText(QString::fromStdString(handUnitProxyName + " :: " + handName + " State: " + handUnitProxy->describeHandState()));
+        ui.labelInfoLeftHand->setText(QString::fromStdString(leftHandUnitProxyName + " :: " + leftHandName + " State: " + leftHandUnitProxy->describeHandState()));
+        ui.labelInfoRightHand->setText(QString::fromStdString(rightHandUnitProxyName + " :: " + rightHandName + " State: " + rightHandUnitProxy->describeHandState()));
     }
 
-    void HandUnitWidget::setPreshape(std::string preshape)
+    void HandUnitWidget::updateJointValueTable()
     {
-        ARMARX_INFO << "Setting new hand shape: " << preshape;
-        handUnitProxy->setShape(preshape);
+        NameValueMap currentLeftHandJointValues = leftHandUnitProxy->getCurrentJointValues();
+//        ARMARX_INFO << VAROUT(leftHandUnitProxy->getCurrentJointValues());
+        int frameLeftHandRowIdx = 0;
+
+        for (const auto& pair : currentLeftHandJointValues)
+        {
+//            ARMARX_INFO << VAROUT(pair.first);
+            QString name(pair.first.c_str());
+            QTableWidgetItem* newItem = new QTableWidgetItem(QString::number(pair.second));
+            ui.tableWidgetLeftHand->setItem(frameLeftHandRowIdx, 1, newItem);
+            frameLeftHandRowIdx++;
+        }
+
+
+
+        NameValueMap currentRightHandJointValues = rightHandUnitProxy->getCurrentJointValues();
+//        ARMARX_INFO << VAROUT(rightHandUnitProxy->getCurrentJointValues());
+        int frameRightHandRowIdx = 0;
+
+        for (const auto& pair : currentRightHandJointValues)
+        {
+//            ARMARX_INFO << VAROUT(pair.first);
+            QString name(pair.first.c_str());
+            QTableWidgetItem* newItem = new QTableWidgetItem(QString::number(pair.second));
+            ui.tableWidgetRightHand->setItem(frameRightHandRowIdx, 1, newItem);
+            frameRightHandRowIdx++;
+        }
+    }
+
+    void HandUnitWidget::selectLeftHandJoint(int i)
+    {
+//        ARMARX_INFO << "selectLeftHandJoint " << i;
+        NameValueMap currentLeftHandJointValues = leftHandUnitProxy->getCurrentJointValues();
+        int idx = 0;
+
+        for (const auto& pair: currentLeftHandJointValues)
+        {
+            if (idx == i)
+            {
+                currentLeftHandJoint = pair.first;
+                int convertedValue = static_cast<int>(pair.second / leftHandConversionFactor);
+                ui.horizontalSliderLeftHandJointPos->setSliderPosition(convertedValue);
+                ui.lcdNumberLeftHandJointValue->display(convertedValue);
+//                ARMARX_INFO << "Found joint";
+                break;
+            }
+            idx++;
+        }
+    }
+
+    void HandUnitWidget::selectRightHandJoint(int i)
+    {
+//        ARMARX_INFO << "selectRightHandJoint " << i;
+        NameValueMap currentRightHandJointValues = rightHandUnitProxy->getCurrentJointValues();
+        int idx = 0;
+
+        for (const auto& pair: currentRightHandJointValues)
+        {
+            if (idx == i)
+            {
+                currentRightHandJoint = pair.first;
+                int convertedValue = static_cast<int>(pair.second / rightHandConversionFactor);
+                ui.horizontalSliderRightHandJointPos->setSliderPosition(convertedValue);
+                ui.lcdNumberRightHandJointValue->display(convertedValue);
+//                ARMARX_INFO << "Found joint";
+                break;
+            }
+            idx++;
+        }
+    }
+
+    void HandUnitWidget::setLeftHandPreshape(std::string preshape)
+    {
+//        ARMARX_INFO << "Setting new left hand shape: " << preshape;
+        leftHandUnitProxy->setShape(preshape);
+    }
+
+    void HandUnitWidget::setRightHandPreshape(std::string preshape)
+    {
+//        ARMARX_INFO << "Setting new right hand shape: " << preshape;
+        rightHandUnitProxy->setShape(preshape);
     }
 
     void HandUnitWidget::loadSettings(QSettings* settings)
     {
-        handUnitProxyName = settings->value("handUnitProxyName", QString::fromStdString(handUnitProxyName)).toString().toStdString();
-        handName = settings->value("handName", QString::fromStdString(handName)).toString().toStdString();
+        leftHandUnitProxyName = settings->value("leftHandUnitProxyName", QString::fromStdString(leftHandUnitProxyName)).toString().toStdString();
+        leftHandName = settings->value("leftHandName", QString::fromStdString(leftHandName)).toString().toStdString();
+        rightHandUnitProxyName = settings->value("rightHandUnitProxyName", QString::fromStdString(rightHandUnitProxyName)).toString().toStdString();
+        rightHandName = settings->value("rightHandName", QString::fromStdString(rightHandName)).toString().toStdString();
     }
 
     void HandUnitWidget::saveSettings(QSettings* settings)
     {
-        settings->setValue("handUnitProxyName", QString::fromStdString(handUnitProxyName));
-        settings->setValue("handName", QString::fromStdString(handName));
-    }
-
-
-    void HandUnitWidget::connectSlots()
-    {
-        connect(ui.buttonPreshape, SIGNAL(clicked()), this, SLOT(preshapeHand()), Qt::UniqueConnection);
-        connect(ui.buttonOpenHand, SIGNAL(clicked()), this, SLOT(openHand()), Qt::UniqueConnection);
-        connect(ui.buttonCloseHand, SIGNAL(clicked()), this, SLOT(closeHand()), Qt::UniqueConnection);
-        connect(ui.buttonCloseThumb, SIGNAL(clicked()), this, SLOT(closeThumb()), Qt::UniqueConnection);
-        connect(ui.buttonRelaxHand, SIGNAL(clicked()), this, SLOT(relaxHand()), Qt::UniqueConnection);
-        //connect(ui.comboPreshapes, SIGNAL(currentIndexChanged(const QString&)), this, SLOT(selectPreshape(const QString&)), Qt::UniqueConnection);
-        connect(ui.buttonSetJointAngles, SIGNAL(clicked()), this, SLOT(requestSetJointAngles()), Qt::UniqueConnection);
-        connect(ui.horizontalSliderIndexJ0, SIGNAL(sliderMoved(int)), this, SLOT(requestSetJointAngles()), Qt::UniqueConnection);
-        connect(ui.horizontalSliderIndexJ1, SIGNAL(sliderMoved(int)), this, SLOT(requestSetJointAngles()), Qt::UniqueConnection);
-        connect(ui.horizontalSliderMiddleJ0, SIGNAL(sliderMoved(int)), this, SLOT(requestSetJointAngles()), Qt::UniqueConnection);
-        connect(ui.horizontalSliderMiddleJ1, SIGNAL(sliderMoved(int)), this, SLOT(requestSetJointAngles()), Qt::UniqueConnection);
-        connect(ui.horizontalSliderRinky, SIGNAL(sliderMoved(int)), this, SLOT(requestSetJointAngles()), Qt::UniqueConnection);
-        connect(ui.horizontalSliderPalm, SIGNAL(sliderMoved(int)), this, SLOT(requestSetJointAngles()), Qt::UniqueConnection);
-        connect(ui.horizontalSliderThumbJ0, SIGNAL(sliderMoved(int)), this, SLOT(requestSetJointAngles()), Qt::UniqueConnection);
-        connect(ui.horizontalSliderThumbJ1, SIGNAL(sliderMoved(int)), this, SLOT(requestSetJointAngles()), Qt::UniqueConnection);
-        connect(updateInfoTimer, SIGNAL(timeout()), this, SLOT(updateInfoLabel()));
+        settings->setValue("leftHandUnitProxyName", QString::fromStdString(leftHandUnitProxyName));
+        settings->setValue("leftHandName", QString::fromStdString(leftHandName));
+        settings->setValue("rightHandUnitProxyName", QString::fromStdString(rightHandUnitProxyName));
+        settings->setValue("rightHandName", QString::fromStdString(rightHandName));
+    }
+
+
+    void HandUnitWidget::initGUIJointFrames()
+    {
+        NameValueMap currentLeftHandJointValues = leftHandUnitProxy->getCurrentJointValues();
+//        ARMARX_INFO << VAROUT(leftHandUnitProxy->getCurrentJointValues());
+        int frameLeftHandRowIdx = 0;
+
+        connect(ui.buttonPreshapeLeftHand, SIGNAL(clicked()), this, SLOT(preshapeLeftHand()), Qt::UniqueConnection);
+        connect(ui.buttonOpenLeftHand, SIGNAL(clicked()), this, SLOT(openLeftHand()), Qt::UniqueConnection);
+        connect(ui.buttonCloseLeftHand, SIGNAL(clicked()), this, SLOT(closeLeftHand()), Qt::UniqueConnection);
+        connect(ui.buttonRelaxLeftHand, SIGNAL(clicked()), this, SLOT(relaxLeftHand()), Qt::UniqueConnection);
+        ui.horizontalSliderLeftHandJointPos->setMaximum(100);
+        ui.horizontalSliderLeftHandJointPos->setMinimum(0);
+        connect(ui.horizontalSliderLeftHandJointPos, SIGNAL(sliderMoved(int)), this, SLOT(requestSetLeftHandJointAngles()), Qt::UniqueConnection);
+        connect(ui.comboLeftHandJoints, SIGNAL(currentIndexChanged(int)), this, SLOT(selectLeftHandJoint(int)), Qt::UniqueConnection);
+
+        ui.tableWidgetLeftHand->setRowCount(currentLeftHandJointValues.size());
+        ui.tableWidgetLeftHand->setColumnCount(2);
+
+        ui.comboLeftHandJoints->clear();
+
+        qRegisterMetaType<QVector<int> >("QVector<int>");
+        for (const auto& pair : currentLeftHandJointValues)
+        {
+//            ARMARX_INFO << VAROUT(pair.first);
+            QString name(pair.first.c_str());
+            QTableWidgetItem* newItem = new QTableWidgetItem(name);
+            ui.tableWidgetLeftHand->setItem(frameLeftHandRowIdx, 0, newItem);
+            ui.comboLeftHandJoints->addItem(name);
+            frameLeftHandRowIdx++;
+        }
+
+        ui.comboLeftHandJoints->setCurrentIndex(-1);
+
+
+
+        NameValueMap currentRightHandJointValues = rightHandUnitProxy->getCurrentJointValues();
+//        ARMARX_INFO << VAROUT(rightHandUnitProxy->getCurrentJointValues());
+        int frameRightHandRowIdx = 0;
+
+        connect(ui.buttonPreshapeRightHand, SIGNAL(clicked()), this, SLOT(preshapeRightHand()), Qt::UniqueConnection);
+        connect(ui.buttonOpenRightHand, SIGNAL(clicked()), this, SLOT(openRightHand()), Qt::UniqueConnection);
+        connect(ui.buttonCloseRightHand, SIGNAL(clicked()), this, SLOT(closeRightHand()), Qt::UniqueConnection);
+        connect(ui.buttonRelaxRightHand, SIGNAL(clicked()), this, SLOT(relaxRightHand()), Qt::UniqueConnection);
+        ui.horizontalSliderRightHandJointPos->setMaximum(100);
+        ui.horizontalSliderRightHandJointPos->setMinimum(0);
+        connect(ui.horizontalSliderRightHandJointPos, SIGNAL(sliderMoved(int)), this, SLOT(requestSetRightHandJointAngles()), Qt::UniqueConnection);
+        connect(ui.comboRightHandJoints, SIGNAL(currentIndexChanged(int)), this, SLOT(selectRightHandJoint(int)), Qt::UniqueConnection);
+
+        ui.tableWidgetRightHand->setRowCount(currentRightHandJointValues.size());
+        ui.tableWidgetRightHand->setColumnCount(2);
+
+        ui.comboRightHandJoints->clear();
+
+        qRegisterMetaType<QVector<int> >("QVector<int>");
+        for (const auto& pair : currentRightHandJointValues)
+        {
+//            ARMARX_INFO << VAROUT(pair.first);
+            QString name(pair.first.c_str());
+            QTableWidgetItem* newItem = new QTableWidgetItem(name);
+            ui.tableWidgetRightHand->setItem(frameRightHandRowIdx, 0, newItem);
+            ui.comboRightHandJoints->addItem(name);
+            frameRightHandRowIdx++;
+        }
+
+        ui.comboRightHandJoints->setCurrentIndex(-1);
     }
 
 
diff --git a/source/RobotAPI/gui-plugins/HandUnitPlugin/HandUnitGuiPlugin.h b/source/RobotAPI/gui-plugins/HandUnitPlugin/HandUnitGuiPlugin.h
index 2e7968738f29b200a0b5bf14f2f5358024762943..24d7900cedbff8c64539a33f6bc8b251af88fc26 100644
--- a/source/RobotAPI/gui-plugins/HandUnitPlugin/HandUnitGuiPlugin.h
+++ b/source/RobotAPI/gui-plugins/HandUnitPlugin/HandUnitGuiPlugin.h
@@ -112,36 +112,55 @@ namespace armarx
 
     public slots:
 
-        void preshapeHand();
-        void setJointAngles();
-        void requestSetJointAngles();
-        void openHand();
-        void closeHand();
-        void closeThumb();
-        void relaxHand();
+        void preshapeLeftHand();
+        void preshapeRightHand();
+        void setLeftHandJointAngles();
+        void setRightHandJointAngles();
+        void requestSetLeftHandJointAngles();
+        void requestSetRightHandJointAngles();
+        void openLeftHand();
+        void openRightHand();
+        void closeLeftHand();
+        void closeRightHand();
+        void relaxLeftHand();
+        void relaxRightHand();
         void updateInfoLabel();
+        void updateJointValueTable();
+        void selectLeftHandJoint(int i);
+        void selectRightHandJoint(int i);
 
     private:
-        void setPreshape(std::string preshape);
+        void setLeftHandPreshape(std::string preshape);
+        void setRightHandPreshape(std::string preshape);
 
     protected:
-        void connectSlots();
+        void initGUIJointFrames();
 
         Ui::HandUnitGuiPlugin ui;
 
     private:
-        std::string handName;
+        std::string leftHandName;
+        std::string rightHandName;
         //std::string preshapeName;
 
-        std::string handUnitProxyName;
-        HandUnitInterfacePrx handUnitProxy;
+        std::string leftHandUnitProxyName;
+        std::string rightHandUnitProxyName;
+        HandUnitInterfacePrx leftHandUnitProxy;
+        HandUnitInterfacePrx rightHandUnitProxy;
 
         //QPointer<QWidget> __widget;
         QPointer<HandUnitConfigDialog> dialog;
 
-        PeriodicTask<HandUnitWidget>::pointer_type jointAngleUpdateTask;
+        PeriodicTask<HandUnitWidget>::pointer_type setLeftHandJointAngleUpdateTask;
+        PeriodicTask<HandUnitWidget>::pointer_type setRightHandJointAngleUpdateTask;
+        PeriodicTask<HandUnitWidget>::pointer_type displayJointAngleUpdateTask;
         QTimer* updateInfoTimer;
-        bool setJointAnglesFlag;
+        bool setLeftHandJointAnglesFlag;
+        bool setRightHandJointAnglesFlag;
+        std::basic_string<char> currentLeftHandJoint;
+        std::basic_string<char> currentRightHandJoint;
+        double leftHandConversionFactor= 1.0 / 100.0;
+        double rightHandConversionFactor = 1.0 / 100.0;
 
 
         // HandUnitListener interface
diff --git a/source/RobotAPI/gui-plugins/HandUnitPlugin/HandUnitGuiPlugin.ui b/source/RobotAPI/gui-plugins/HandUnitPlugin/HandUnitGuiPlugin.ui
index bda4f4ae305f68c0b8b31a63850f6b8e79e07fdd..cec1e1ea724f251927d10b8a2c167579198b3726 100644
--- a/source/RobotAPI/gui-plugins/HandUnitPlugin/HandUnitGuiPlugin.ui
+++ b/source/RobotAPI/gui-plugins/HandUnitPlugin/HandUnitGuiPlugin.ui
@@ -19,239 +19,401 @@
   <property name="windowTitle">
    <string>Form</string>
   </property>
-  <layout class="QGridLayout" name="gridLayout">
-   <item row="1" column="3">
-    <widget class="Line" name="line">
-     <property name="orientation">
-      <enum>Qt::Vertical</enum>
-     </property>
-    </widget>
-   </item>
-   <item row="2" column="1" colspan="7">
-    <widget class="QFrame" name="frame">
-     <property name="frameShape">
-      <enum>QFrame::StyledPanel</enum>
-     </property>
-     <property name="frameShadow">
-      <enum>QFrame::Raised</enum>
-     </property>
-     <layout class="QGridLayout" name="gridLayout_2">
-      <item row="7" column="0">
-       <widget class="QLabel" name="label_8">
-        <property name="text">
-         <string>Rinky</string>
-        </property>
-       </widget>
-      </item>
-      <item row="2" column="0">
-       <widget class="QLabel" name="label_3">
-        <property name="text">
-         <string>Thumb J1</string>
-        </property>
-       </widget>
-      </item>
-      <item row="2" column="1">
-       <widget class="QSlider" name="horizontalSliderThumbJ1">
-        <property name="maximum">
-         <number>90</number>
-        </property>
-        <property name="orientation">
-         <enum>Qt::Horizontal</enum>
-        </property>
-       </widget>
-      </item>
-      <item row="7" column="1">
-       <widget class="QSlider" name="horizontalSliderRinky">
-        <property name="maximum">
-         <number>90</number>
-        </property>
-        <property name="orientation">
-         <enum>Qt::Horizontal</enum>
-        </property>
-       </widget>
-      </item>
-      <item row="6" column="0">
-       <widget class="QLabel" name="label_7">
-        <property name="text">
-         <string>Middle J1</string>
-        </property>
-       </widget>
-      </item>
-      <item row="5" column="0">
-       <widget class="QLabel" name="label_6">
-        <property name="text">
-         <string>Middle J0</string>
-        </property>
-       </widget>
-      </item>
-      <item row="4" column="0">
-       <widget class="QLabel" name="label_5">
-        <property name="text">
-         <string>Index J1</string>
-        </property>
-       </widget>
-      </item>
-      <item row="6" column="1">
-       <widget class="QSlider" name="horizontalSliderMiddleJ1">
-        <property name="maximum">
-         <number>90</number>
-        </property>
-        <property name="orientation">
-         <enum>Qt::Horizontal</enum>
-        </property>
-       </widget>
-      </item>
-      <item row="5" column="1">
-       <widget class="QSlider" name="horizontalSliderMiddleJ0">
-        <property name="maximum">
-         <number>90</number>
-        </property>
-        <property name="orientation">
-         <enum>Qt::Horizontal</enum>
-        </property>
-       </widget>
-      </item>
-      <item row="1" column="1">
-       <widget class="QSlider" name="horizontalSliderThumbJ0">
-        <property name="maximum">
-         <number>90</number>
-        </property>
-        <property name="orientation">
-         <enum>Qt::Horizontal</enum>
-        </property>
-       </widget>
-      </item>
-      <item row="1" column="0">
-       <widget class="QLabel" name="label_2">
-        <property name="text">
-         <string>Thumb J0</string>
-        </property>
-       </widget>
-      </item>
-      <item row="3" column="0">
-       <widget class="QLabel" name="label_4">
-        <property name="text">
-         <string>Index J0</string>
-        </property>
-       </widget>
-      </item>
-      <item row="0" column="1">
-       <widget class="QSlider" name="horizontalSliderPalm">
-        <property name="maximum">
-         <number>90</number>
-        </property>
-        <property name="orientation">
-         <enum>Qt::Horizontal</enum>
-        </property>
-       </widget>
-      </item>
-      <item row="3" column="1">
-       <widget class="QSlider" name="horizontalSliderIndexJ0">
-        <property name="maximum">
-         <number>90</number>
-        </property>
-        <property name="orientation">
-         <enum>Qt::Horizontal</enum>
-        </property>
-       </widget>
-      </item>
-      <item row="4" column="1">
-       <widget class="QSlider" name="horizontalSliderIndexJ1">
-        <property name="maximum">
-         <number>90</number>
-        </property>
-        <property name="orientation">
-         <enum>Qt::Horizontal</enum>
-        </property>
-       </widget>
-      </item>
-      <item row="3" column="2" rowspan="2">
-       <widget class="QPushButton" name="buttonSetJointAngles">
-        <property name="maximumSize">
-         <size>
-          <width>50</width>
-          <height>16777215</height>
-         </size>
-        </property>
-        <property name="text">
-         <string>Set</string>
-        </property>
-       </widget>
-      </item>
-      <item row="0" column="0">
-       <widget class="QLabel" name="label">
-        <property name="text">
-         <string>Palm</string>
-        </property>
-       </widget>
-      </item>
-     </layout>
-    </widget>
-   </item>
-   <item row="1" column="7">
-    <widget class="QPushButton" name="buttonRelaxHand">
-     <property name="text">
-      <string>Relax</string>
-     </property>
-    </widget>
-   </item>
-   <item row="1" column="5">
-    <widget class="QPushButton" name="buttonCloseThumb">
-     <property name="text">
-      <string>Thumb</string>
-     </property>
-    </widget>
-   </item>
-   <item row="1" column="1">
-    <widget class="QComboBox" name="comboPreshapes"/>
-   </item>
-   <item row="1" column="2">
-    <widget class="QPushButton" name="buttonPreshape">
-     <property name="maximumSize">
-      <size>
-       <width>100</width>
-       <height>16777215</height>
-      </size>
-     </property>
-     <property name="text">
-      <string>Preshape</string>
-     </property>
-    </widget>
-   </item>
-   <item row="1" column="6">
-    <widget class="QPushButton" name="buttonCloseHand">
-     <property name="text">
-      <string>Close</string>
-     </property>
-    </widget>
-   </item>
-   <item row="1" column="4">
-    <widget class="QPushButton" name="buttonOpenHand">
-     <property name="text">
-      <string>Open</string>
-     </property>
-    </widget>
-   </item>
-   <item row="0" column="1" colspan="7">
-    <widget class="QLabel" name="labelInfo">
-     <property name="maximumSize">
-      <size>
-       <width>16777215</width>
-       <height>20</height>
-      </size>
-     </property>
-     <property name="font">
-      <font>
-       <weight>75</weight>
-       <bold>true</bold>
-      </font>
-     </property>
-     <property name="text">
-      <string>&lt;Info Here&gt;</string>
-     </property>
-    </widget>
-   </item>
-  </layout>
+  <widget class="Line" name="lineLeftHand">
+   <property name="geometry">
+    <rect>
+     <x>146</x>
+     <y>35</y>
+     <width>16</width>
+     <height>25</height>
+    </rect>
+   </property>
+   <property name="orientation">
+    <enum>Qt::Vertical</enum>
+   </property>
+  </widget>
+  <widget class="QFrame" name="frameLeftHand">
+   <property name="geometry">
+    <rect>
+     <x>9</x>
+     <y>156</y>
+     <width>301</width>
+     <height>231</height>
+    </rect>
+   </property>
+   <property name="frameShape">
+    <enum>QFrame::StyledPanel</enum>
+   </property>
+   <property name="frameShadow">
+    <enum>QFrame::Raised</enum>
+   </property>
+   <layout class="QGridLayout" name="gridLayout_2">
+    <item row="0" column="0">
+     <widget class="QTableWidget" name="tableWidgetLeftHand"/>
+    </item>
+   </layout>
+  </widget>
+  <widget class="QComboBox" name="comboLeftHandPreshapes">
+   <property name="geometry">
+    <rect>
+     <x>9</x>
+     <y>35</y>
+     <width>60</width>
+     <height>25</height>
+    </rect>
+   </property>
+  </widget>
+  <widget class="QPushButton" name="buttonPreshapeLeftHand">
+   <property name="geometry">
+    <rect>
+     <x>71</x>
+     <y>35</y>
+     <width>80</width>
+     <height>25</height>
+    </rect>
+   </property>
+   <property name="maximumSize">
+    <size>
+     <width>100</width>
+     <height>16777215</height>
+    </size>
+   </property>
+   <property name="text">
+    <string>Preshape</string>
+   </property>
+  </widget>
+  <widget class="QPushButton" name="buttonOpenLeftHand">
+   <property name="geometry">
+    <rect>
+     <x>157</x>
+     <y>35</y>
+     <width>50</width>
+     <height>25</height>
+    </rect>
+   </property>
+   <property name="text">
+    <string>Open</string>
+   </property>
+  </widget>
+  <widget class="QLabel" name="labelInfoLeftHand">
+   <property name="geometry">
+    <rect>
+     <x>9</x>
+     <y>9</y>
+     <width>85</width>
+     <height>17</height>
+    </rect>
+   </property>
+   <property name="maximumSize">
+    <size>
+     <width>16777215</width>
+     <height>20</height>
+    </size>
+   </property>
+   <property name="font">
+    <font>
+     <weight>75</weight>
+     <bold>true</bold>
+    </font>
+   </property>
+   <property name="text">
+    <string>&lt;Info Here&gt;</string>
+   </property>
+  </widget>
+  <widget class="Line" name="line">
+   <property name="geometry">
+    <rect>
+     <x>310</x>
+     <y>0</y>
+     <width>20</width>
+     <height>401</height>
+    </rect>
+   </property>
+   <property name="orientation">
+    <enum>Qt::Vertical</enum>
+   </property>
+  </widget>
+  <widget class="QPushButton" name="buttonCloseLeftHand">
+   <property name="geometry">
+    <rect>
+     <x>209</x>
+     <y>35</y>
+     <width>50</width>
+     <height>25</height>
+    </rect>
+   </property>
+   <property name="text">
+    <string>Close</string>
+   </property>
+  </widget>
+  <widget class="QPushButton" name="buttonRelaxLeftHand">
+   <property name="geometry">
+    <rect>
+     <x>261</x>
+     <y>35</y>
+     <width>50</width>
+     <height>25</height>
+    </rect>
+   </property>
+   <property name="text">
+    <string>Relax</string>
+   </property>
+  </widget>
+  <widget class="QComboBox" name="comboRightHandPreshapes">
+   <property name="geometry">
+    <rect>
+     <x>330</x>
+     <y>35</y>
+     <width>60</width>
+     <height>25</height>
+    </rect>
+   </property>
+  </widget>
+  <widget class="QPushButton" name="buttonOpenRightHand">
+   <property name="geometry">
+    <rect>
+     <x>478</x>
+     <y>35</y>
+     <width>50</width>
+     <height>25</height>
+    </rect>
+   </property>
+   <property name="text">
+    <string>Open</string>
+   </property>
+  </widget>
+  <widget class="QPushButton" name="buttonPreshapeRightHand">
+   <property name="geometry">
+    <rect>
+     <x>392</x>
+     <y>35</y>
+     <width>80</width>
+     <height>25</height>
+    </rect>
+   </property>
+   <property name="maximumSize">
+    <size>
+     <width>100</width>
+     <height>16777215</height>
+    </size>
+   </property>
+   <property name="text">
+    <string>Preshape</string>
+   </property>
+  </widget>
+  <widget class="QPushButton" name="buttonCloseRightHand">
+   <property name="geometry">
+    <rect>
+     <x>530</x>
+     <y>35</y>
+     <width>50</width>
+     <height>25</height>
+    </rect>
+   </property>
+   <property name="text">
+    <string>Close</string>
+   </property>
+  </widget>
+  <widget class="QPushButton" name="buttonRelaxRightHand">
+   <property name="geometry">
+    <rect>
+     <x>582</x>
+     <y>35</y>
+     <width>50</width>
+     <height>25</height>
+    </rect>
+   </property>
+   <property name="text">
+    <string>Relax</string>
+   </property>
+  </widget>
+  <widget class="QLabel" name="labelInfoRightHand">
+   <property name="geometry">
+    <rect>
+     <x>330</x>
+     <y>9</y>
+     <width>85</width>
+     <height>17</height>
+    </rect>
+   </property>
+   <property name="maximumSize">
+    <size>
+     <width>16777215</width>
+     <height>20</height>
+    </size>
+   </property>
+   <property name="font">
+    <font>
+     <weight>75</weight>
+     <bold>true</bold>
+    </font>
+   </property>
+   <property name="text">
+    <string>&lt;Info Here&gt;</string>
+   </property>
+  </widget>
+  <widget class="Line" name="lineRightHand">
+   <property name="geometry">
+    <rect>
+     <x>467</x>
+     <y>35</y>
+     <width>16</width>
+     <height>25</height>
+    </rect>
+   </property>
+   <property name="orientation">
+    <enum>Qt::Vertical</enum>
+   </property>
+  </widget>
+  <widget class="QLabel" name="labelSelectLeftHandJoint">
+   <property name="geometry">
+    <rect>
+     <x>10</x>
+     <y>80</y>
+     <width>81</width>
+     <height>17</height>
+    </rect>
+   </property>
+   <property name="text">
+    <string>Select Joint</string>
+   </property>
+  </widget>
+  <widget class="QComboBox" name="comboLeftHandJoints">
+   <property name="geometry">
+    <rect>
+     <x>100</x>
+     <y>75</y>
+     <width>150</width>
+     <height>25</height>
+    </rect>
+   </property>
+  </widget>
+  <widget class="QLCDNumber" name="lcdNumberLeftHandJointValue">
+   <property name="enabled">
+    <bool>true</bool>
+   </property>
+   <property name="geometry">
+    <rect>
+     <x>10</x>
+     <y>117</y>
+     <width>64</width>
+     <height>26</height>
+    </rect>
+   </property>
+   <property name="maximumSize">
+    <size>
+     <width>80</width>
+     <height>100</height>
+    </size>
+   </property>
+   <property name="toolTip">
+    <string/>
+   </property>
+   <property name="smallDecimalPoint">
+    <bool>false</bool>
+   </property>
+  </widget>
+  <widget class="QSlider" name="horizontalSliderLeftHandJointPos">
+   <property name="geometry">
+    <rect>
+     <x>90</x>
+     <y>120</y>
+     <width>221</width>
+     <height>16</height>
+    </rect>
+   </property>
+   <property name="maximum">
+    <number>100</number>
+   </property>
+   <property name="orientation">
+    <enum>Qt::Horizontal</enum>
+   </property>
+  </widget>
+  <widget class="QLCDNumber" name="lcdNumberRightHandJointValue">
+   <property name="enabled">
+    <bool>true</bool>
+   </property>
+   <property name="geometry">
+    <rect>
+     <x>330</x>
+     <y>117</y>
+     <width>64</width>
+     <height>26</height>
+    </rect>
+   </property>
+   <property name="maximumSize">
+    <size>
+     <width>80</width>
+     <height>100</height>
+    </size>
+   </property>
+   <property name="toolTip">
+    <string/>
+   </property>
+   <property name="smallDecimalPoint">
+    <bool>false</bool>
+   </property>
+  </widget>
+  <widget class="QLabel" name="labelSelectRightHandJoint">
+   <property name="geometry">
+    <rect>
+     <x>330</x>
+     <y>80</y>
+     <width>81</width>
+     <height>17</height>
+    </rect>
+   </property>
+   <property name="text">
+    <string>Select Joint</string>
+   </property>
+  </widget>
+  <widget class="QFrame" name="frameRightHand">
+   <property name="geometry">
+    <rect>
+     <x>329</x>
+     <y>156</y>
+     <width>301</width>
+     <height>231</height>
+    </rect>
+   </property>
+   <property name="frameShape">
+    <enum>QFrame::StyledPanel</enum>
+   </property>
+   <property name="frameShadow">
+    <enum>QFrame::Raised</enum>
+   </property>
+   <layout class="QGridLayout" name="gridLayout_4">
+    <item row="0" column="0">
+     <widget class="QTableWidget" name="tableWidgetRightHand"/>
+    </item>
+   </layout>
+  </widget>
+  <widget class="QComboBox" name="comboRightHandJoints">
+   <property name="geometry">
+    <rect>
+     <x>420</x>
+     <y>75</y>
+     <width>150</width>
+     <height>25</height>
+    </rect>
+   </property>
+  </widget>
+  <widget class="QSlider" name="horizontalSliderRightHandJointPos">
+   <property name="geometry">
+    <rect>
+     <x>410</x>
+     <y>120</y>
+     <width>221</width>
+     <height>16</height>
+    </rect>
+   </property>
+   <property name="maximum">
+    <number>100</number>
+   </property>
+   <property name="orientation">
+    <enum>Qt::Horizontal</enum>
+   </property>
+  </widget>
  </widget>
  <resources/>
  <connections/>