diff --git a/source/RobotAPI/libraries/aron_component_config/RemoteGuiVisitors.cpp b/source/RobotAPI/libraries/aron_component_config/RemoteGuiVisitors.cpp
index 056c77c1817154dbd594f15a7b52bcb19244c3ae..c4dfcbb17a0f5b280807ad7f3ec536c8d4879d48 100644
--- a/source/RobotAPI/libraries/aron_component_config/RemoteGuiVisitors.cpp
+++ b/source/RobotAPI/libraries/aron_component_config/RemoteGuiVisitors.cpp
@@ -35,7 +35,8 @@ if (in_list_) return;
 namespace armarx::aron::component_config
 {
 
-    void MakeConfigGuiVisitor::visitObjectOnEnter(DataInput& dict, TypeInput&)
+    void
+    MakeConfigGuiVisitor::visitObjectOnEnter(DataInput& dict, TypeInput&)
     {
         ARMARX_TRACE;
         ARMARX_CHECK_NOT_NULL(dict);
@@ -43,8 +44,8 @@ namespace armarx::aron::component_config
         if (dict->getPath().hasElement())
         {
             std::string name = pathToName(dict);
-            group_hierarchy_
-                    .emplace_back(std::make_shared<RemoteGui::detail::GroupBoxBuilder>(RemoteGui::makeGroupBox(name)));
+            group_hierarchy_.emplace_back(std::make_shared<RemoteGui::detail::GroupBoxBuilder>(RemoteGui::makeGroupBox(
+                    name)));
         } else
         {
             group_hierarchy_.push_back(builder_);
@@ -52,7 +53,8 @@ namespace armarx::aron::component_config
 
     }
 
-    void MakeConfigGuiVisitor::visitObjectOnExit(DataInput& dict, TypeInput&)
+    void
+    MakeConfigGuiVisitor::visitObjectOnExit(DataInput& dict, TypeInput&)
     {
         ARMARX_TRACE;
         auto builder = *group_hierarchy_.back();
@@ -63,39 +65,51 @@ namespace armarx::aron::component_config
         }
     }
 
-    void MakeConfigGuiVisitor::visitInt(DataInput& i, TypeInput&)
+    void
+    MakeConfigGuiVisitor::visitInt(DataInput& i, TypeInput&)
     {
         INPUT_GUARD(i);
         auto value = data::Int::DynamicCastAndCheck(i);
-        group_hierarchy_.back()->addChild(
-                RemoteGui::makeIntSpinBox(pathToName(i)).value(value->getValue()).min(-1000).max(1000));
+        group_hierarchy_.back()
+                        ->addChild(RemoteGui::makeIntSpinBox(pathToName(i)).value(value->getValue())
+                                                                           .min(-1000)
+                                                                           .max(1000));
     }
 
-    void MakeConfigGuiVisitor::visitFloat(DataInput& f, TypeInput&)
+    void
+    MakeConfigGuiVisitor::visitFloat(DataInput& f, TypeInput&)
     {
         INPUT_GUARD(f);
         auto value = data::Float::DynamicCastAndCheck(f);
-        group_hierarchy_.back()->addChild(
-                RemoteGui::makeFloatSpinBox(pathToName(f)).value(value->getValue()).min(-1000).max(1000));
+        group_hierarchy_.back()
+                        ->addChild(RemoteGui::makeFloatSpinBox(pathToName(f)).value(value->getValue())
+                                                                             .min(-1000)
+                                                                             .max(1000));
     }
 
-    void MakeConfigGuiVisitor::visitDouble(DataInput& d, TypeInput&)
+    void
+    MakeConfigGuiVisitor::visitDouble(DataInput& d, TypeInput&)
     {
         INPUT_GUARD(d);
         auto value = data::Double::DynamicCastAndCheck(d);
-        group_hierarchy_.back()->addChild(
-                RemoteGui::makeFloatSpinBox(pathToName(d)).value(value->getValue()).min(-1000).max(1000));
+        group_hierarchy_.back()
+                        ->addChild(RemoteGui::makeFloatSpinBox(pathToName(d)).value(value->getValue())
+                                                                             .min(-1000)
+                                                                             .max(1000));
     }
 
-    void MakeConfigGuiVisitor::visitBool(DataInput& b, TypeInput&)
+    void
+    MakeConfigGuiVisitor::visitBool(DataInput& b, TypeInput&)
     {
         INPUT_GUARD(b);
         auto value = data::Bool::DynamicCastAndCheck(b);
-        group_hierarchy_.back()->addChild(
-                RemoteGui::makeCheckBox(pathToName(b)).value(value->getValue()).label(b->getPath().getLastElement()));
+        group_hierarchy_.back()
+                        ->addChild(RemoteGui::makeCheckBox(pathToName(b)).value(value->getValue())
+                                                                         .label(b->getPath().getLastElement()));
     }
 
-    void MakeConfigGuiVisitor::visitString(DataInput& string, TypeInput&)
+    void
+    MakeConfigGuiVisitor::visitString(DataInput& string, TypeInput&)
     {
         INPUT_GUARD(string);
         auto value = data::String::DynamicCastAndCheck(string);
@@ -107,12 +121,14 @@ namespace armarx::aron::component_config
     {
     }
 
-    RemoteGui::detail::GroupBoxBuilder MakeConfigGuiVisitor::getGroupBoxBuilder() const
+    RemoteGui::detail::GroupBoxBuilder
+    MakeConfigGuiVisitor::getGroupBoxBuilder() const
     {
         return *builder_;
     }
 
-    void MakeConfigGuiVisitor::visitListOnEnter(DataInput& o, TypeInput& t)
+    void
+    MakeConfigGuiVisitor::visitListOnEnter(DataInput& o, TypeInput& t)
     {
         auto group = RemoteGui::makeSimpleGridLayout(pathToName(o) + "_grid").cols(20);
         auto data = data::List::DynamicCastAndCheck(o);
@@ -122,13 +138,12 @@ namespace armarx::aron::component_config
             switch (type->getAcceptedType()->getDescriptor())
             {
                 case type::Descriptor::STRING:
-                    group.addChild(
-                            RemoteGui::makeLineEdit(pathToName(el)).value(data::String::DynamicCast(el)->getValue()),
-                            10);
+                    group.addChild(RemoteGui::makeLineEdit(pathToName(el)).value(data::String::DynamicCast(el)->getValue()),
+                                   10);
                     break;
                 case type::Descriptor::INT:
-                    group.addChild(RemoteGui::makeLineEdit(pathToName(el))
-                                           .value(std::to_string(data::Int::DynamicCast(el)->getValue())), 10);
+                    group.addChild(RemoteGui::makeLineEdit(pathToName(el)).value(std::to_string(data::Int::DynamicCast(
+                            el)->getValue())), 10);
                     break;
                 default:
                     throw armarx::NotImplementedYetException();
@@ -137,32 +152,38 @@ namespace armarx::aron::component_config
             group.addChild(RemoteGui::makeButton(pathToName(el) + "_button").label("-").toolTip("Remove List Element"),
                            2);
         }
-        group_hierarchy_.back()->addChild(
-                RemoteGui::makeGroupBox(pathToName(o) + "_grp").label(o->getPath().getLastElement()).collapsed(true)
-                                                               .addChild(group).addChild(
-                                                                       RemoteGui::makeButton(pathToName(o) + "_add")
-                                                                               .label("+")
-                                                                               .toolTip("Add new list entry.")));
+        group_hierarchy_.back()
+                        ->addChild(RemoteGui::makeGroupBox(pathToName(o) + "_grp").label(o->getPath().getLastElement())
+                                                                                  .collapsed(true)
+                                                                                  .addChild(group)
+                                                                                  .addChild(RemoteGui::makeButton(
+                                                                                          pathToName(o) +
+                                                                                          "_add").label("+")
+                                                                                                 .toolTip(
+                                                                                                         "Add new list entry.")));
         in_list_ = true;
     }
 
-    void MakeConfigGuiVisitor::visitListOnExit(DataInput&, TypeInput&)
+    void
+    MakeConfigGuiVisitor::visitListOnExit(DataInput&, TypeInput&)
     {
         in_list_ = false;
     }
 
-    void MakeConfigGuiVisitor::visitIntEnum(DataInput& o, TypeInput& t)
+    void
+    MakeConfigGuiVisitor::visitIntEnum(DataInput& o, TypeInput& t)
     {
         INPUT_GUARD(o);
         auto data = data::Int::DynamicCastAndCheck(o);
         auto type = type::IntEnum::DynamicCast(t);
-        group_hierarchy_.back()->addChild(RemoteGui::makeComboBox(pathToName(o)).options(type->getAcceptedValueNames())
-                                                                                .value(type->getValueName(
-                                                                                        data->getValue())));
+        group_hierarchy_.back()
+                        ->addChild(RemoteGui::makeComboBox(pathToName(o)).options(type->getAcceptedValueNames())
+                                                                         .value(type->getValueName(data->getValue())));
     }
 
     void
-    MakeConfigGuiVisitor::visitDictOnEnter(const std::shared_ptr<data::Variant>&, const std::shared_ptr<type::Variant>&)
+    MakeConfigGuiVisitor::visitDictOnEnter(const std::shared_ptr<data::Variant>& o,
+                                           const std::shared_ptr<type::Variant>& t)
     {
         in_list_ = true;
     }
@@ -179,90 +200,167 @@ namespace armarx::aron::component_config
     {
     }
 
-    void GetValueFromMapVisitor::visitInt(DataInput& i, TypeInput&)
+    void
+    GetValueFromMapVisitor::visitInt(DataInput& i, TypeInput&)
     {
         INPUT_GUARD(i);
         auto value = data::Int::DynamicCastAndCheck(i);
-        proxy_->getValue(value->getValue(), pathToName(i));
-        i = value;
+        const std::string name = pathToName(i);
+        auto gui_value = proxy_->getValue<int>(name);
+        if (value->getValue() != gui_value.get())
+        {
+            if (proxy_->hasValueChanged(name))
+            {
+                value->setValue(gui_value.get());
+                i = value;
+            } else
+            {
+                proxy_->setValue(value->getValue(), name);
+            }
+        }
     }
 
-    void GetValueFromMapVisitor::visitFloat(DataInput& f, TypeInput&)
+    void
+    GetValueFromMapVisitor::visitFloat(DataInput& f, TypeInput&)
     {
         INPUT_GUARD(f);
         auto value = data::Float::DynamicCastAndCheck(f);
-        proxy_->getValue(value->getValue(), pathToName(f));
-        f = value;
+        const std::string name = pathToName(f);
+        auto gui_value = proxy_->getValue<float>(name);
+        if (value->getValue() != gui_value.get())
+        {
+            if (proxy_->hasValueChanged(name))
+            {
+                value->setValue(gui_value.get());
+                f = value;
+            } else
+            {
+                proxy_->setValue(value->getValue(), name);
+            }
+        }
     }
 
-    void GetValueFromMapVisitor::visitDouble(DataInput& d, TypeInput&)
+    void
+    GetValueFromMapVisitor::visitDouble(DataInput& d, TypeInput&)
     {
         INPUT_GUARD(d);
         auto value = data::Double::DynamicCastAndCheck(d);
-        float val_f;
-        proxy_->getValue(val_f, pathToName(d));
-        value->getValue() = val_f;
-        d = value;
+        const std::string name = pathToName(d);
+        // TODO: does double work here?
+        auto gui_value = proxy_->getValue<float>(name);
+        if (value->getValue() != gui_value.get())
+        {
+            if (proxy_->hasValueChanged(name))
+            {
+                value->setValue(gui_value.get());
+                d = value;
+            } else
+            {
+                proxy_->setValue(static_cast<float>(value->getValue()), name);
+            }
+        }
     }
 
-    void GetValueFromMapVisitor::visitBool(DataInput& b, TypeInput&)
+    void
+    GetValueFromMapVisitor::visitBool(DataInput& b, TypeInput&)
     {
         INPUT_GUARD(b);
         auto value = data::Bool::DynamicCastAndCheck(b);
-        proxy_->getValue(value->getValue(), pathToName(b));
-        b = value;
+        const std::string name = pathToName(b);
+        auto gui_value = proxy_->getValue<bool>(name);
+        if (value->getValue() != gui_value.get())
+        {
+            if (proxy_->hasValueChanged(name))
+            {
+                value->setValue(gui_value.get());
+                b = value;
+            } else
+            {
+                proxy_->setValue(value->getValue(), name);
+            }
+        }
     }
 
-    void GetValueFromMapVisitor::visitString(DataInput& string, TypeInput&)
+    void
+    GetValueFromMapVisitor::visitString(DataInput& string, TypeInput&)
     {
         INPUT_GUARD(string);
         auto value = data::String::DynamicCastAndCheck(string);
-        proxy_->getValue(value->getValue(), pathToName(string));
-        string = value;
+        const std::string name = pathToName(string);
+        auto gui_value = proxy_->getValue<std::string>(name);
+        if (value->getValue() != gui_value.get())
+        {
+            if (proxy_->hasValueChanged(name))
+            {
+                value->setValue(gui_value.get());
+                string = value;
+            } else
+            {
+                proxy_->setValue(value->getValue(), name);
+            }
+        }
     }
 
-    type::Descriptor GetValueFromMapVisitor::getDescriptor(DataInput& o, TypeInput& t)
+    type::Descriptor
+    GetValueFromMapVisitor::getDescriptor(DataInput& o, TypeInput& t)
     {
         return data::ConstTypedVariantVisitor::GetDescriptor(o, t);
     }
 
-    GetValueFromMapVisitor::MapElements GetValueFromMapVisitor::getObjectElements(DataInput& o, TypeInput& t)
+    GetValueFromMapVisitor::MapElements
+    GetValueFromMapVisitor::getObjectElements(DataInput& o, TypeInput& t)
     {
         return component_config::getObjectElements(o, t);
     }
 
-    GetValueFromMapVisitor::MapElements GetValueFromMapVisitor::getDictElements(DataInput& o, TypeInput& t)
+    GetValueFromMapVisitor::MapElements
+    GetValueFromMapVisitor::getDictElements(DataInput& o, TypeInput& t)
     {
         return component_config::getDictElements(o, t);
     }
 
-    GetValueFromMapVisitor::ListElements GetValueFromMapVisitor::getListElements(DataInput& o, TypeInput& t)
+    GetValueFromMapVisitor::ListElements
+    GetValueFromMapVisitor::getListElements(DataInput& o, TypeInput& t)
     {
         return component_config::getListElements(o, t);
     }
 
-    GetValueFromMapVisitor::PairElements GetValueFromMapVisitor::getPairElements(DataInput& o, TypeInput& t)
+    GetValueFromMapVisitor::PairElements
+    GetValueFromMapVisitor::getPairElements(DataInput& o, TypeInput& t)
     {
         return component_config::getPairElements(o, t);
     }
 
-    GetValueFromMapVisitor::TupleElements GetValueFromMapVisitor::getTupleElements(DataInput& o, TypeInput& t)
+    GetValueFromMapVisitor::TupleElements
+    GetValueFromMapVisitor::getTupleElements(DataInput& o, TypeInput& t)
     {
         return component_config::getTupleElements(o, t);
     }
 
-    void GetValueFromMapVisitor::visitIntEnum(DataInput& o, TypeInput& t)
+    void
+    GetValueFromMapVisitor::visitIntEnum(DataInput& o, TypeInput& t)
     {
         INPUT_GUARD(o);
         auto data = data::Int::DynamicCastAndCheck(o);
         auto type = type::IntEnum::DynamicCastAndCheck(t);
         std::string str;
+        const std::string name = pathToName(o);
         proxy_->getValue(str, pathToName(o));
-        data->getValue() = type->getValue(str);
-        o = data;
+        if (data->getValue() != type->getValue(str))
+        {
+            if (proxy_->hasValueChanged(name))
+            {
+                data->getValue() = type->getValue(str);
+                o = data;
+            } else
+            {
+                proxy_->setValue(type->getValueName(data->getValue()), name);
+            }
+        }
     }
 
-    void GetValueFromMapVisitor::visitListOnEnter(DataInput& o, TypeInput& t)
+    void
+    GetValueFromMapVisitor::visitListOnEnter(DataInput& o, TypeInput& t)
     {
         auto data = data::List::DynamicCastAndCheck(o);
         auto type = type::List::DynamicCast(t);
@@ -311,12 +409,14 @@ namespace armarx::aron::component_config
         in_list_ = true;
     }
 
-    void GetValueFromMapVisitor::visitListOnExit(DataInput&, TypeInput&)
+    void
+    GetValueFromMapVisitor::visitListOnExit(DataInput&, TypeInput&)
     {
         in_list_ = false;
     }
 
-    bool GetValueFromMapVisitor::tabRebuildRequired() const
+    bool
+    GetValueFromMapVisitor::tabRebuildRequired() const
     {
         return tab_rebuild_required_;
     }