diff --git a/source/RobotAPI/libraries/ArmarXEtherCAT/AbstractFunctionalDevice.cpp b/source/RobotAPI/libraries/ArmarXEtherCAT/AbstractFunctionalDevice.cpp
index 878b2c4da9eaebe2a1ad8216209557296de4a113..7d5db2ec6d4fdf8af417d6ad56fe07adc38fcb7d 100644
--- a/source/RobotAPI/libraries/ArmarXEtherCAT/AbstractFunctionalDevice.cpp
+++ b/source/RobotAPI/libraries/ArmarXEtherCAT/AbstractFunctionalDevice.cpp
@@ -28,6 +28,11 @@ bool armarx::AbstractFunctionalDevice::isInitialized() const
     return initialized;
 }
 
+std::string armarx::AbstractFunctionalDevice::getClassName() const
+{
+    return className;
+}
+
 const armarx::DefaultRapidXmlReaderNode armarx::AbstractFunctionalDevice::getNode() const
 {
     return node;
diff --git a/source/RobotAPI/libraries/ArmarXEtherCAT/AbstractFunctionalDevice.h b/source/RobotAPI/libraries/ArmarXEtherCAT/AbstractFunctionalDevice.h
index 8d03ff8387a6a4c43e8ce0add837249e53be4301..1c1c3b18fab8bf7d37f02252fd8e2693f2e32263 100644
--- a/source/RobotAPI/libraries/ArmarXEtherCAT/AbstractFunctionalDevice.h
+++ b/source/RobotAPI/libraries/ArmarXEtherCAT/AbstractFunctionalDevice.h
@@ -34,7 +34,12 @@ namespace armarx
         virtual void execute() {}
 
 
+        std::string getClassName() const;
+
     protected:
+        template <typename Base, typename constructorArg, typename SharedPointer>
+        friend class AbstractFactoryMethod;
+        std::string className;
         DefaultRapidXmlReaderNode node;
         bool initialized = false;
     };
diff --git a/source/RobotAPI/libraries/ArmarXEtherCAT/DeviceContainer.cpp b/source/RobotAPI/libraries/ArmarXEtherCAT/DeviceContainer.cpp
index 9631e1bbc568421b78223318d1c9901e4b746c62..beb75ddf2593ac4162ca9bb2d9244eb414c2f805 100644
--- a/source/RobotAPI/libraries/ArmarXEtherCAT/DeviceContainer.cpp
+++ b/source/RobotAPI/libraries/ArmarXEtherCAT/DeviceContainer.cpp
@@ -31,50 +31,59 @@
 namespace armarx
 {
 
-size_t DeviceContainer::load(const MultiNodeRapidXMLReader &rootNodeConfigs, const VirtualRobot::RobotPtr &robot)
-{
-    size_t addedDevices = 0;
-    auto children = robot->getChildren();
-    auto getSceneObject = [&](const std::string & name)
+    size_t DeviceContainer::load(const MultiNodeRapidXMLReader& rootNodeConfigs, const VirtualRobot::RobotPtr& robot)
     {
-        for (auto& obj : children)
+        size_t addedDevices = 0;
+        auto children = robot->getRobotNodes();
+        auto getSceneObject = [&](const std::string & name)
         {
-            if (obj->getName() == name)
+            for (auto& obj : children)
             {
-                return obj;
+                if (obj->getName() == name)
+                {
+                    return VirtualRobot::SceneObjectPtr(obj);
+                }
             }
-        }
-        return VirtualRobot::SceneObjectPtr();
-    };
-    //rootNode = rootNodeConfig;
-
-    auto defaultNode = DefaultRapidXmlReaderNode(rootNodeConfigs.nodes("DefaultConfiguration"));
-    for(auto& node : rootNodeConfigs.nodes(nullptr))
-    {
-        if(node.name()=="DefaultConfiguration")
-        {
-            continue;
-        }
-        auto name = node.attribute_value("name");
-        auto obj = getSceneObject(name);
-        ARMARX_CHECK_EXPRESSION_W_HINT(obj, name);
-        auto tuple = std::make_tuple(node, defaultNode, obj);
-        auto instance = VirtualDeviceFactory::fromName(node.name(),tuple);
-        if(instance)
-        {
-            ARMARX_WARNING << "No factory found for virtual device " << node.name();
-        }
-        else
+            for (auto& s : robot->getSensors())
+            {
+                if (s->getName() == name)
+                {
+                    return  VirtualRobot::SceneObjectPtr(s);
+                }
+            }
+            return VirtualRobot::SceneObjectPtr();
+        };
+        //rootNode = rootNodeConfig;
+        ARMARX_DEBUG << "Device factories: " << VirtualDeviceFactory::getAvailableClasses();
+        auto defaultNode = DefaultRapidXmlReaderNode(rootNodeConfigs.nodes("DefaultConfiguration"));
+        for (auto& node : rootNodeConfigs.nodes(nullptr))
         {
-            devices.push_back(instance);
-            addedDevices++;
+            if (node.name() == "DefaultConfiguration" || node.name() == "include" || node.name().empty())
+            {
+                continue;
+            }
+            auto name = node.attribute_value("name");
+            ARMARX_DEBUG << "Handling: " << node.name() << " name: " << name;
+            auto obj = getSceneObject(name);
+            //            ARMARX_CHECK_EXPRESSION_W_HINT(obj, name);
+            auto tuple = std::make_tuple(node, defaultNode, obj);
+            auto instance = VirtualDeviceFactory::fromName(node.name(), tuple);
+            if (!instance)
+            {
+                ARMARX_WARNING << "No factory found for virtual device " << node.name();
+            }
+            else
+            {
+                ARMARX_VERBOSE << "Created instance of type " << node.name();
+                devices.push_back(instance);
+                addedDevices++;
+            }
         }
-    }
-    return addedDevices;
+        return addedDevices;
 
-}
+    }
 
-std::vector<AbstractFunctionalDevicePtr> DeviceContainer::getAllInitializedFunctionalDevices() const
+    std::vector<AbstractFunctionalDevicePtr> DeviceContainer::getAllInitializedFunctionalDevices() const
     {
         std::vector<AbstractFunctionalDevicePtr> returnList;
         for (AbstractFunctionalDevicePtr& device : getAllFunctionalDevices())