diff --git a/source/RobotAPI/libraries/aron_component_config/RemoteGuiVisitors.cpp b/source/RobotAPI/libraries/aron_component_config/RemoteGuiVisitors.cpp
index e3f10aa5d809f7f0c46f4c34f8eecf98ae77d7df..49feb11a71e1a084e30f12adab9fbc41f9c36c12 100644
--- a/source/RobotAPI/libraries/aron_component_config/RemoteGuiVisitors.cpp
+++ b/source/RobotAPI/libraries/aron_component_config/RemoteGuiVisitors.cpp
@@ -25,6 +25,7 @@
 #include <ArmarXGui/libraries/RemoteGui/RemoteGui.h>
 #include <RobotAPI/libraries/aron/core/data/variant/All.h>
 #include <ArmarXCore/util/CPPUtility/Iterator.h>
+#include <RobotAPI/libraries/aron_component_config/TypeDescriptorFactories/PropertyHelper.h>
 #include "Util.h"
 
 #define INPUT_GUARD(i) \
@@ -130,24 +131,18 @@ namespace armarx::aron::component_config
     void
     MakeConfigGuiVisitor::visitListOnEnter(DataInput& o, TypeInput& t)
     {
+        in_list_ = true;
         auto group = RemoteGui::makeSimpleGridLayout(pathToName(o) + "_grid").cols(20);
         auto data = data::List::DynamicCastAndCheck(o);
-        auto type = type::List::DynamicCast(t);
+        auto type = type::List::DynamicCast(t)->getAcceptedType()->getDescriptor();
+        if (type == type::Descriptor::OBJECT)
+        {
+            return;
+        }
         for (const auto& el: data->getElements())
         {
-            switch (type->getAcceptedType()->getDescriptor())
-            {
-                case type::Descriptor::STRING:
-                    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);
-                    break;
-                default:
-                    throw armarx::NotImplementedYetException();
-            }
+            group.addChild(RemoteGui::makeLineEdit(pathToName(el)).value(factories::PropertyHelper::make(type)->to_string(
+                    el)), 10);
             group.addHSpacer(8);
             group.addChild(RemoteGui::makeButton(pathToName(el) + "_button").label("-").toolTip("Remove List Element"),
                            2);
@@ -161,7 +156,6 @@ namespace armarx::aron::component_config
                                                                                           "_add").label("+")
                                                                                                  .toolTip(
                                                                                                          "Add new list entry.")));
-        in_list_ = true;
     }
 
     void
@@ -185,26 +179,20 @@ namespace armarx::aron::component_config
     MakeConfigGuiVisitor::visitDictOnEnter(const std::shared_ptr<data::Variant>& o,
                                            const std::shared_ptr<type::Variant>& t)
     {
+        in_list_ = true;
         auto group = RemoteGui::makeSimpleGridLayout(pathToName(o) + "_grid").cols(20);
         auto data = data::Dict::DynamicCastAndCheck(o);
-        auto type = type::Dict::DynamicCast(t);
+        auto type = type::Dict::DynamicCast(t)->getAcceptedType()->getDescriptor();
+        if (type == type::Descriptor::OBJECT)
+        {
+            return;
+        }
         for (const auto& el: data->getElements())
         {
             group.addChild(RemoteGui::makeLineEdit(pathToName(el.second) + "_lbl").value(el.first), 5);
             group.addHSpacer(2);
-            switch (type->getAcceptedType()->getDescriptor())
-            {
-                case type::Descriptor::STRING:
-                    group.addChild(RemoteGui::makeLineEdit(pathToName(el.second)).value(data::String::DynamicCast(el.second)
-                                                                                                ->getValue()), 5);
-                    break;
-                case type::Descriptor::INT:
-                    group.addChild(RemoteGui::makeLineEdit(pathToName(el.second)).value(std::to_string(data::Int::DynamicCast(
-                            el.second)->getValue())), 5);
-                    break;
-                default:
-                    throw armarx::NotImplementedYetException();
-            }
+            group.addChild(RemoteGui::makeLineEdit(pathToName(el.second)).value(factories::PropertyHelper::make(type)->to_string(
+                    el.second)), 5);
             group.addHSpacer(6);
             group.addChild(RemoteGui::makeButton(pathToName(el.second) + "_button").label("-")
                                                                                    .toolTip("Remove List Element"), 2);
@@ -218,7 +206,6 @@ namespace armarx::aron::component_config
                                                                                           "_add").label("+")
                                                                                                  .toolTip(
                                                                                                          "Add new dict entry.")));
-        in_list_ = true;
     }
 
     void
@@ -395,8 +382,13 @@ namespace armarx::aron::component_config
     void
     GetValueFromMapVisitor::visitListOnEnter(DataInput& o, TypeInput& t)
     {
+        in_list_ = true;
         auto data = data::List::DynamicCastAndCheck(o);
-        auto type = type::List::DynamicCast(t);
+        auto type = type::List::DynamicCast(t)->getAcceptedType()->getDescriptor();
+        if (type == type::Descriptor::OBJECT)
+        {
+            return;
+        }
         const auto& elements = data->getElements();
         for (const auto& [idx, el]: armarx::MakeIndexedContainer(elements))
         {
@@ -405,41 +397,16 @@ namespace armarx::aron::component_config
                 data->removeElement(idx);
                 tab_rebuild_required_ = true;
             }
-
-            switch (type->getAcceptedType()->getDescriptor())
-            {
-                case type::Descriptor::STRING:
-                {
-                    proxy_->getValue(data::String::DynamicCast(el)->getValue(), pathToName(el));
-                    break;
-                }
-                case type::Descriptor::INT:
-                {
-                    std::string str;
-                    proxy_->getValue(str, pathToName(el));
-                    data::Int::DynamicCast(el)->getValue() = std::stoi(str);
-                    break;
-                }
-                default:
-                    throw armarx::NotImplementedYetException();
-            }
+            auto gui_value = proxy_->getValue<std::string>(pathToName(el)).get();
+            factories::PropertyHelper::make(type)->set_value_from_string(el, gui_value);
         }
         if (proxy_->getButtonClicked(pathToName(o) + "_add"))
         {
-            switch (type->getAcceptedType()->getDescriptor())
-            {
-                case type::Descriptor::STRING:
-                    data->addElement(make_string("", o->getPath().withIndex(data->childrenSize())));
-                    break;
-                case type::Descriptor::INT:
-                    data->addElement(make_int(0, o->getPath().withIndex(data->childrenSize())));
-                    break;
-                default:
-                    throw armarx::NotImplementedYetException();
-            }
+            data->addElement(factories::PropertyHelper::make(type)->from_string("",
+                                                                                o->getPath()
+                                                                                 .withIndex(data->childrenSize())));
             tab_rebuild_required_ = true;
         }
-        in_list_ = true;
     }
 
     void
@@ -457,8 +424,13 @@ namespace armarx::aron::component_config
     void
     GetValueFromMapVisitor::visitDictOnEnter(std::shared_ptr<data::Variant>& o, const std::shared_ptr<type::Variant>& t)
     {
+        in_list_ = true;
         auto data = data::Dict::DynamicCastAndCheck(o);
-        auto type = type::Dict::DynamicCast(t);
+        auto type = type::Dict::DynamicCast(t)->getAcceptedType()->getDescriptor();
+        if (type == type::Descriptor::OBJECT)
+        {
+            return;
+        }
         const auto& elements = data->getElements();
         std::map<std::string, std::string> changed_labels;
         for (const auto& [idx, el]: elements)
@@ -469,63 +441,28 @@ namespace armarx::aron::component_config
                 data->removeElement(idx);
                 tab_rebuild_required_ = true;
             }
-
-            switch (type->getAcceptedType()->getDescriptor())
+            auto gui_value = proxy_->getValue<std::string>(name).get();
+            auto gui_key = proxy_->getValue<std::string>(name + "_lbl").get();
+            auto config_value = factories::PropertyHelper::make(type)->to_string(el);
+            if (gui_value != config_value)
             {
-                case type::Descriptor::STRING:
+                if (proxy_->hasValueChanged(name))
+                {
+                    factories::PropertyHelper::make(type)->set_value_from_string(el, gui_value);
+                } else
                 {
-                    auto gui_value = proxy_->getValue<std::string>(name).get();
-                    auto gui_key = proxy_->getValue<std::string>(name + "_lbl").get();
-                    if (gui_value != data::String::DynamicCast(el)->getValue())
-                    {
-                        if (proxy_->hasValueChanged(name))
-                        {
-                            data::String::DynamicCast(el)->getValue() = gui_value;
-                        } else
-                        {
-                            proxy_->setValue(data::String::DynamicCast(el)->getValue(), name);
-                        }
-                    }
-                    if (gui_key != idx)
-                    {
-                        if (proxy_->hasValueChanged(name + "_lbl"))
-                        {
-                            changed_labels.emplace(idx, gui_key);
-                        } else
-                        {
-                            proxy_->setValue(idx, name + "_lbl");
-                        }
-                    }
-                    break;
+                    proxy_->setValue(config_value, name);
                 }
-                case type::Descriptor::INT:
+            }
+            if (gui_key != idx)
+            {
+                if (proxy_->hasValueChanged(name + "_lbl"))
+                {
+                    changed_labels.emplace(idx, gui_key);
+                } else
                 {
-                    auto gui_value = std::stoi(proxy_->getValue<std::string>(name).get());
-                    auto gui_key = proxy_->getValue<std::string>(name + "_lbl").get();
-                    if (gui_value != data::Int::DynamicCast(el)->getValue())
-                    {
-                        if (proxy_->hasValueChanged(name))
-                        {
-                            data::Int::DynamicCast(el)->getValue() = gui_value;
-                        } else
-                        {
-                            proxy_->setValue(std::to_string(data::Int::DynamicCast(el)->getValue()), name);
-                        }
-                    }
-                    if (gui_key != idx)
-                    {
-                        if (proxy_->hasValueChanged(name + "_lbl"))
-                        {
-                            changed_labels.emplace(idx, gui_key);
-                        } else
-                        {
-                            proxy_->setValue(idx, name + "_lbl");
-                        }
-                    }
-                    break;
+                    proxy_->setValue(idx, name + "_lbl");
                 }
-                default:
-                    throw armarx::NotImplementedYetException();
             }
         }
         // replace changed keys in map
@@ -533,40 +470,22 @@ namespace armarx::aron::component_config
         {
             auto element = data->getElement(old_label);
             data->removeElement(old_label);
-            switch (type->getAcceptedType()->getDescriptor())
-            {
-                case type::Descriptor::STRING:
-                    data->addElement(new_label,
-                                     make_string(data::String::DynamicCast(element)->getValue(),
-                                                 o->getPath().withDetachedLastElement().withElement(new_label)));
-                    break;
-                case type::Descriptor::INT:
-                    data->addElement(new_label,
-                                     make_int(data::Int::DynamicCast(element)->getValue(),
-                                              o->getPath().withDetachedLastElement().withElement(new_label)));
-                    break;
-                default:
-                    throw armarx::NotImplementedYetException();
-            }
+            auto variantHelper = factories::PropertyHelper::make(type);
+            data->addElement(new_label,
+                             variantHelper->from_string(variantHelper->to_string(element),
+                                                        o->getPath().withDetachedLastElement().withElement(new_label)));
             tab_rebuild_required_ = true;
         }
 
         if (proxy_->getButtonClicked(pathToName(o) + "_add"))
         {
-            switch (type->getAcceptedType()->getDescriptor())
-            {
-                case type::Descriptor::STRING:
-                    data->addElement("defaultKey", make_string("", o->getPath().withElement("defaultKey")));
-                    break;
-                case type::Descriptor::INT:
-                    data->addElement("defaultKey", make_int(0, o->getPath().withElement("defaultKey")));
-                    break;
-                default:
-                    throw armarx::NotImplementedYetException();
-            }
+            data->addElement("defaultKey",
+                             factories::PropertyHelper::make(type)->from_string("",
+                                                                                o->getPath()
+                                                                                 .withElement("defaultKey")));
             tab_rebuild_required_ = true;
         }
-        in_list_ = true;
+
     }
 
     void
diff --git a/source/RobotAPI/libraries/aron_component_config/TypeDescriptorFactories/PropertyHelper.cpp b/source/RobotAPI/libraries/aron_component_config/TypeDescriptorFactories/PropertyHelper.cpp
index 14771c28242f75b81e99a37e941464f44ffadbdf..e0306e37b0fbe27ce475492987bf3364f97b7b49 100644
--- a/source/RobotAPI/libraries/aron_component_config/TypeDescriptorFactories/PropertyHelper.cpp
+++ b/source/RobotAPI/libraries/aron_component_config/TypeDescriptorFactories/PropertyHelper.cpp
@@ -126,6 +126,48 @@ namespace armarx::aron::component_config::products
         return make_string(string, path);
     }
 
+    template <>
+    void
+    products::PropertyHelper<type::Descriptor::INT>::set_value_from_string(const armarx::aron::data::VariantPtr& variant,
+                                                                              const std::string& string) const
+    {
+        data::Int::DynamicCast(variant)->getValue() = std::stoi(string);
+    }
+    template <>
+    void
+    products::PropertyHelper<type::Descriptor::FLOAT>::set_value_from_string(const armarx::aron::data::VariantPtr& variant,
+                                                                           const std::string& string) const
+    {
+        data::Float::DynamicCast(variant)->getValue() = std::stof(string);
+    }
+    template <>
+    void
+    products::PropertyHelper<type::Descriptor::DOUBLE>::set_value_from_string(const armarx::aron::data::VariantPtr& variant,
+                                                                           const std::string& string) const
+    {
+        data::Double::DynamicCast(variant)->getValue() = std::stod(string);
+    }
+    template <>
+    void
+    products::PropertyHelper<type::Descriptor::BOOL>::set_value_from_string(const armarx::aron::data::VariantPtr& variant,
+                                                                           const std::string& string) const
+    {
+        data::Bool::DynamicCast(variant)->getValue() = string == "true";
+    }
+    template <>
+    void
+    products::PropertyHelper<type::Descriptor::STRING>::set_value_from_string(const armarx::aron::data::VariantPtr& variant,
+                                                                           const std::string& string) const
+    {
+        data::String::DynamicCast(variant)->getValue() = string;
+    }
+    template <>
+    void
+    products::PropertyHelper<type::Descriptor::INT_ENUM>::set_value_from_string(const armarx::aron::data::VariantPtr& variant,
+                                                                           const std::string& string) const
+    {
+        data::Int::DynamicCast(variant)->getValue() = std::stoi(string);
+    }
 
 
     template struct products::PropertyHelper<type::Descriptor::INT>;
diff --git a/source/RobotAPI/libraries/aron_component_config/TypeDescriptorFactories/PropertyHelper.h b/source/RobotAPI/libraries/aron_component_config/TypeDescriptorFactories/PropertyHelper.h
index cfb5ef2baa0b696cc221c8cd34be965072548ea9..cc7152d41c6ea2a667864ca4985f41efd7d46fa8 100644
--- a/source/RobotAPI/libraries/aron_component_config/TypeDescriptorFactories/PropertyHelper.h
+++ b/source/RobotAPI/libraries/aron_component_config/TypeDescriptorFactories/PropertyHelper.h
@@ -40,6 +40,10 @@ namespace armarx::aron::component_config
             virtual ~PropertyHelper() = default;
 
             virtual std::string to_string(const armarx::aron::data::VariantPtr&) const = 0;
+
+            virtual void
+            set_value_from_string(const armarx::aron::data::VariantPtr&, const std::string& string) const = 0;
+
             virtual aron::data::VariantPtr from_string(const std::string&, const armarx::aron::Path& path) const = 0;
         };
     }
@@ -56,7 +60,12 @@ namespace armarx::aron::component_config
             };
 
             [[nodiscard]] std::string to_string(const data::VariantPtr& ptr) const override;
-            [[nodiscard]] aron::data::VariantPtr from_string(const std::string&, const armarx::aron::Path& path) const override;
+
+            void set_value_from_string(const armarx::aron::data::VariantPtr& variant,
+                                       const std::string& string) const override;
+
+            [[nodiscard]] aron::data::VariantPtr
+            from_string(const std::string&, const armarx::aron::Path& path) const override;
         };
 
 
@@ -65,39 +74,86 @@ namespace armarx::aron::component_config
     template <>
     std::string
     products::PropertyHelper<type::Descriptor::INT>::to_string(const data::VariantPtr& ptr) const;
+
     template <>
     aron::data::VariantPtr
-    products::PropertyHelper<type::Descriptor::INT>::from_string(const std::string&, const armarx::aron::Path& path) const;
+    products::PropertyHelper<type::Descriptor::INT>::from_string(const std::string&,
+                                                                 const armarx::aron::Path& path) const;
+
+    template <>
+    void
+    products::PropertyHelper<type::Descriptor::INT>::set_value_from_string(const armarx::aron::data::VariantPtr&,
+                                                                           const std::string&) const;
+
     template <>
     std::string
     products::PropertyHelper<type::Descriptor::FLOAT>::to_string(const data::VariantPtr& ptr) const;
+
     template <>
     aron::data::VariantPtr
-    products::PropertyHelper<type::Descriptor::FLOAT>::from_string(const std::string&, const armarx::aron::Path& path) const;
+    products::PropertyHelper<type::Descriptor::FLOAT>::from_string(const std::string&,
+                                                                   const armarx::aron::Path& path) const;
+
+    template <>
+    void
+    products::PropertyHelper<type::Descriptor::FLOAT>::set_value_from_string(const armarx::aron::data::VariantPtr&,
+                                                                             const std::string&) const;
+
     template <>
     std::string
     products::PropertyHelper<type::Descriptor::BOOL>::to_string(const data::VariantPtr& ptr) const;
+
     template <>
     aron::data::VariantPtr
-    products::PropertyHelper<type::Descriptor::BOOL>::from_string(const std::string&, const armarx::aron::Path& path) const;
+    products::PropertyHelper<type::Descriptor::BOOL>::from_string(const std::string&,
+                                                                  const armarx::aron::Path& path) const;
+
+    template <>
+    void
+    products::PropertyHelper<type::Descriptor::BOOL>::set_value_from_string(const armarx::aron::data::VariantPtr&,
+                                                                            const std::string&) const;
+
     template <>
     std::string
     products::PropertyHelper<type::Descriptor::STRING>::to_string(const data::VariantPtr& ptr) const;
+
     template <>
     aron::data::VariantPtr
-    products::PropertyHelper<type::Descriptor::STRING>::from_string(const std::string&, const armarx::aron::Path& path) const;
+    products::PropertyHelper<type::Descriptor::STRING>::from_string(const std::string&,
+                                                                    const armarx::aron::Path& path) const;
+
+    template <>
+    void
+    products::PropertyHelper<type::Descriptor::STRING>::set_value_from_string(const armarx::aron::data::VariantPtr&,
+                                                                              const std::string&) const;
+
     template <>
     std::string
     products::PropertyHelper<type::Descriptor::DOUBLE>::to_string(const data::VariantPtr& ptr) const;
+
     template <>
     aron::data::VariantPtr
-    products::PropertyHelper<type::Descriptor::DOUBLE>::from_string(const std::string&, const armarx::aron::Path& path) const;
+    products::PropertyHelper<type::Descriptor::DOUBLE>::from_string(const std::string&,
+                                                                    const armarx::aron::Path& path) const;
+
+    template <>
+    void
+    products::PropertyHelper<type::Descriptor::DOUBLE>::set_value_from_string(const armarx::aron::data::VariantPtr&,
+                                                                              const std::string&) const;
+
     template <>
     std::string
     products::PropertyHelper<type::Descriptor::INT_ENUM>::to_string(const data::VariantPtr& ptr) const;
+
     template <>
     aron::data::VariantPtr
-    products::PropertyHelper<type::Descriptor::INT_ENUM>::from_string(const std::string&, const armarx::aron::Path& path) const;
+    products::PropertyHelper<type::Descriptor::INT_ENUM>::from_string(const std::string&,
+                                                                      const armarx::aron::Path& path) const;
+
+    template <>
+    void
+    products::PropertyHelper<type::Descriptor::INT_ENUM>::set_value_from_string(const armarx::aron::data::VariantPtr&,
+                                                                                const std::string&) const;
 
 
     extern template struct products::PropertyHelper<type::Descriptor::INT>;