diff --git a/VirtualRobot/XML/BaseIO.cpp b/VirtualRobot/XML/BaseIO.cpp
index b87a6074e962bc055439abfa05f9acbec8956d96..f768718881714d5a8bbeca3137681d823600e246 100644
--- a/VirtualRobot/XML/BaseIO.cpp
+++ b/VirtualRobot/XML/BaseIO.cpp
@@ -840,10 +840,10 @@ namespace VirtualRobot
         std::string visuCoordType = "";
         useAsColModel = false;
         std::string visuFileType = "";
-        std::string visuFile = "";
         rapidxml::xml_attribute<>* attr;
         std::vector<Primitive::PrimitivePtr> primitives;
         VisualizationNodePtr visualizationNode;
+        std::vector<VisualizationNodePtr> visualizationNodes;
 
         if (!visuXMLNode)
         {
@@ -866,51 +866,16 @@ namespace VirtualRobot
 
         if (enableVisu)
         {
-            rapidxml::xml_node<>* visuFileXMLNode = visuXMLNode->first_node("file", 0, false);
-
-            if (visuFileXMLNode)
-            {
-                attr = visuFileXMLNode->first_attribute("type", 0, false);
-
-                //THROW_VR_EXCEPTION_IF(!attr, "Missing 'type' attribute in <Visualization> tag of node " << tagName << "." << endl)
-                if (!attr)
-                {
-                    if (VisualizationFactory::first(NULL))
-                    {
-                        visuFileType = VisualizationFactory::first(NULL)->getDescription();
-                    }
-                    else
-                    {
-                        VR_WARNING << "No visualization present..." << endl;
-                    }
-                }
-                else
-                {
-                    visuFileType = attr->value();
-                }
-
-                getLowerCase(visuFileType);
-                visuFile = processFileNode(visuFileXMLNode, basePath);
-                //visuFile = visuFileXMLNode->value();
-                //makeAbsolutePath(basePath,visuFile);
-            }
-
+            visualizationNodes = processVisuFiles(visuXMLNode, basePath, visuFileType);
             primitives = processPrimitives(visuXMLNode);
-            THROW_VR_EXCEPTION_IF(primitives.size() != 0 && visuFileXMLNode, "Multiple visualization sources defined (file and primitives)" << endl);
+            THROW_VR_EXCEPTION_IF(primitives.size() != 0 && visualizationNodes.size() != 0, "Multiple visualization sources defined (file and primitives)" << endl);
 
-            if (visuFile != "")
+            if (visualizationNodes.size() != 0)
             {
-                VisualizationFactoryPtr visualizationFactory = VisualizationFactory::fromName(visuFileType, NULL);
-
-                if (visualizationFactory)
-                {
-                    visualizationNode = visualizationFactory->getVisualizationFromFile(visuFile);
-                }
-                else
-                {
-                    VR_WARNING << "VisualizationFactory of type '" << visuFileType << "' not present. Ignoring Visualization data in Node <" << tagName << ">" << endl;
-                }
+                VisualizationFactoryPtr visualizationFactory = VisualizationFactory::first(NULL);
+                visualizationNode = visualizationFactory->createUnitedVisualization(visualizationNodes);
             }
+
             else if (primitives.size() != 0)
             {
                 VisualizationFactoryPtr visualizationFactory = VisualizationFactory::first(NULL);
@@ -1101,6 +1066,61 @@ namespace VirtualRobot
         return collisionModel;
     }
 
+    std::vector<VisualizationNodePtr> BaseIO::processVisuFiles(rapidxml::xml_node<char>* visualizationXMLNode, const std::string& basePath, std::string& fileType)
+    {
+        rapidxml::xml_node<>* node = visualizationXMLNode;
+        std::vector<VisualizationNodePtr> result;
+
+        if (!node)
+        {
+            return result;
+        }
+
+        rapidxml::xml_node<>* visuFileXMLNode = node->first_node("file", 0, false);
+
+        while (visuFileXMLNode)
+        {
+            std::string visuFile = "";
+
+            rapidxml::xml_attribute<>* attr = visuFileXMLNode->first_attribute("type", 0, false);
+            if (!attr)
+            {
+                if (VisualizationFactory::first(NULL))
+                {
+                    fileType = VisualizationFactory::first(NULL)->getDescription();
+                }
+                else
+                {
+                    VR_WARNING << "No visualization present..." << endl;
+                }
+            }
+            else
+            {
+                fileType = attr->value();
+            }
+
+            getLowerCase(fileType);
+            visuFile = processFileNode(visuFileXMLNode, basePath);
+
+            if (visuFile != "") {
+                VisualizationFactoryPtr visualizationFactory = VisualizationFactory::fromName(fileType, NULL);
+
+                if (visualizationFactory)
+                {
+                    result.push_back(visualizationFactory->getVisualizationFromFile(visuFile));
+                }
+                else
+                {
+                    VR_WARNING << "VisualizationFactory of type '" << fileType << "' not present. Ignoring Visualization data from " << visuFileXMLNode->value() << endl;
+                }
+            }
+
+            visuFileXMLNode = visuFileXMLNode->next_sibling("file", 0, false);
+        }
+
+        return result;
+    }
+
     std::vector<Primitive::PrimitivePtr> BaseIO::processPrimitives(rapidxml::xml_node<char>* primitivesXMLNode)
     {
         std::vector<Primitive::PrimitivePtr> result;
diff --git a/VirtualRobot/XML/BaseIO.h b/VirtualRobot/XML/BaseIO.h
index 9282f8c3812dabef83e281c6d5428c2598992678..5a179d5ff57bf515af88bf59317fd70a9f6b1731 100644
--- a/VirtualRobot/XML/BaseIO.h
+++ b/VirtualRobot/XML/BaseIO.h
@@ -102,6 +102,7 @@ namespace VirtualRobot
 
         static std::string toXML(const Eigen::Matrix4f& m, std::string ident = "\t");
 
+        static std::vector<VisualizationNodePtr> processVisuFiles(rapidxml::xml_node<char> *visualizationXMLNode, const std::string &basePath, std::string &fileType);
     protected:
         // instantiation not allowed
         BaseIO();