diff --git a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.cpp b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.cpp
index b5c85f29cb9e11fdc735b04b9299de4b7a11c5c7..66f52c756fc5f59aee90d744163bbbe86c8ef961 100644
--- a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.cpp
+++ b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.cpp
@@ -104,6 +104,7 @@ namespace VirtualRobot {
 
         // create new CoinVisualizationNode if no error occurred
         visualizationNode.reset(new CoinVisualizationNode(coinVisualization));
+        visualizationNode->primitives = primitives;
 
         coinVisualization->unref();
 
diff --git a/VirtualRobot/Visualization/VisualizationFactory.h b/VirtualRobot/Visualization/VisualizationFactory.h
index 72728fd79ad2606d1550cb0c7ca3cf170c835f94..95e12b9cb85a2604c0c9b9b984957274513681f0 100644
--- a/VirtualRobot/Visualization/VisualizationFactory.h
+++ b/VirtualRobot/Visualization/VisualizationFactory.h
@@ -101,7 +101,7 @@ public:
 
     virtual VisualizationNodePtr getVisualizationFromPrimitives(const std::vector<PrimitivePtr> &primitives, bool boundingBox = false){return VisualizationNodePtr();}
 	virtual VisualizationNodePtr getVisualizationFromFile(const std::string& filename, bool boundingBox = false){return VisualizationNodePtr();}
-	virtual VisualizationNodePtr getVisualizationFromFile(const std::ifstream& ifs, bool boundingBox = false){return VisualizationNodePtr();};
+    virtual VisualizationNodePtr getVisualizationFromFile(const std::ifstream& ifs, bool boundingBox = false){return VisualizationNodePtr();}
     /*!
         A box, dimensions are given in mm.
     */
diff --git a/VirtualRobot/XML/BaseIO.cpp b/VirtualRobot/XML/BaseIO.cpp
index d5a558f8bc1d8a08f0c746cf4b8327b73e6a317a..15d9bbbb8e2effba20a1776f7841c86924cdd6c1 100644
--- a/VirtualRobot/XML/BaseIO.cpp
+++ b/VirtualRobot/XML/BaseIO.cpp
@@ -751,57 +751,8 @@ VisualizationNodePtr BaseIO::processVisualizationTag(rapidxml::xml_node<char> *v
 			//makeAbsolutePath(basePath,visuFile);
 		}
 
-        rapidxml::xml_node<> *visuPrimitivesXMLNode = visuXMLNode->first_node("primitives",0,false);
-        if (visuPrimitivesXMLNode)
-        {
-            THROW_VR_EXCEPTION_IF(visuFileXMLNode, "Multiple visualization sources defined (file and primitives)" << endl)
-            rapidxml::xml_node<> *primitiveXMLNode = visuPrimitivesXMLNode->first_node();
-
-            while (primitiveXMLNode)
-            {
-                //extract info
-                std::string pName = primitiveXMLNode->name();
-                getLowerCase(pName);
-                VisualizationFactory::PrimitivePtr primitive;
-
-                float lenFactor = 1.f;
-                if (hasUnitsAttribute(primitiveXMLNode))
-                {
-                    Units u = getUnitsAttribute(primitiveXMLNode,Units::eLength);
-                    if (u.isMeter())
-                    {
-                        lenFactor = 1000.f;
-                    }
-                }
-
-                if (pName == "box")
-                {
-                    VisualizationFactory::Box *box = new VisualizationFactory::Box;
-                    box->width = convertToFloat(primitiveXMLNode->first_attribute("width",0,false)->value()) * lenFactor;
-                    box->height = convertToFloat(primitiveXMLNode->first_attribute("height",0,false)->value()) * lenFactor;
-                    box->depth = convertToFloat(primitiveXMLNode->first_attribute("depth",0,false)->value()) * lenFactor;
-                    primitive.reset(box);
-                } else if (pName == "sphere")
-                {
-                    VisualizationFactory::Sphere *sphere = new VisualizationFactory::Sphere;
-                    sphere->radius = convertToFloat(primitiveXMLNode->first_attribute("radius",0,false)->value()) * lenFactor;
-                    primitive.reset(sphere);
-                } else
-                {
-                    VR_ERROR << "Unknown primitive type \"" << pName << "\"; skipping";
-                }
-
-                if (primitive)
-                {
-                    Eigen::Matrix4f transform;
-                    processTransformNode(primitiveXMLNode->first_node("transform",0,false), "transform", transform);
-                    primitive->transform = transform;
-                    primitives.push_back(primitive);
-                }
-
-                primitiveXMLNode = primitiveXMLNode->next_sibling();
-            }
-        }
+        primitives = processPrimitives(visuXMLNode);
+        THROW_VR_EXCEPTION_IF(primitives.size() != 0 && visuFileXMLNode, "Multiple visualization sources defined (file and primitives)" << endl);
 
         if (visuFile!="")
 		{
@@ -815,7 +766,6 @@ VisualizationNodePtr BaseIO::processVisualizationTag(rapidxml::xml_node<char> *v
         {
             VisualizationFactoryPtr visualizationFactory = VisualizationFactory::first(NULL);
             visualizationNode = visualizationFactory->getVisualizationFromPrimitives(primitives);
-            visualizationNode->primitives = primitives;
         }
 
 
@@ -884,13 +834,14 @@ VisualizationNodePtr BaseIO::processVisualizationTag(rapidxml::xml_node<char> *v
 	return visualizationNode;
 }
 
-
 CollisionModelPtr BaseIO::processCollisionTag(rapidxml::xml_node<char> *colXMLNode, const std::string &tagName, const std::string &basePath)
 {
 	rapidxml::xml_attribute<> *attr;
 	std::string collisionFile = "";
 	std::string collisionFileType = "";
+    VisualizationNodePtr visualizationNode;
 	CollisionModelPtr collisionModel;
+    std::vector<VisualizationFactory::PrimitivePtr> primitives;
 	bool enableCol = true;
 	bool bbox = false;
 
@@ -925,26 +876,98 @@ CollisionModelPtr BaseIO::processCollisionTag(rapidxml::xml_node<char> *colXMLNo
 			}
 		}
 
+        primitives = processPrimitives(colXMLNode);
+        THROW_VR_EXCEPTION_IF(primitives.size() != 0 && colFileXMLNode, "Multiple collision model sources defined (file and primitives)" << endl);
+
 		if (collisionFile!="")
 		{
 			VisualizationFactoryPtr visualizationFactory = VisualizationFactory::fromName(collisionFileType, NULL);
-			VisualizationNodePtr visualizationNode;
 			if (visualizationFactory)
 				visualizationNode = visualizationFactory->getVisualizationFromFile(collisionFile, bbox);
 			else
 				VR_WARNING << "VisualizationFactory of type '" << collisionFileType << "' not present. Ignoring Visualization data in Robot Node <" << tagName << ">" << endl;
-			if (visualizationNode)
-			{
-				std::string colModelName = tagName;
-				colModelName += "_ColModel";
-				// todo: ID?
-				collisionModel.reset(new CollisionModel(visualizationNode,colModelName,CollisionCheckerPtr()));
-			}
-		}
+
+        } else if (primitives.size() != 0)
+        {
+            VisualizationFactoryPtr visualizationFactory = VisualizationFactory::first(NULL);
+            visualizationNode = visualizationFactory->getVisualizationFromPrimitives(primitives);
+        }
+
+        if (visualizationNode)
+        {
+            std::string colModelName = tagName;
+            colModelName += "_ColModel";
+            // todo: ID?
+            collisionModel.reset(new CollisionModel(visualizationNode,colModelName,CollisionCheckerPtr()));
+        }
 	}
 	return collisionModel;
 }
 
+std::vector<VisualizationFactory::PrimitivePtr> BaseIO::processPrimitives(rapidxml::xml_node<char> *primitivesXMLNode)
+{
+    std::vector<VisualizationFactory::PrimitivePtr> result;
+    rapidxml::xml_node<> *node;
+
+    if (!primitivesXMLNode)
+        return result;
+
+    if (primitivesXMLNode->name() == "primitives")
+        node = primitivesXMLNode;
+    else
+        node = primitivesXMLNode->first_node("primitives",0,false);
+
+    if (!node)
+        return result;
+
+    rapidxml::xml_node<> *primitiveXMLNode = node->first_node();
+
+    while (primitiveXMLNode)
+    {
+        std::string pName = primitiveXMLNode->name();
+        getLowerCase(pName);
+        VisualizationFactory::PrimitivePtr primitive;
+
+        float lenFactor = 1.f;
+        if (hasUnitsAttribute(primitiveXMLNode))
+        {
+            Units u = getUnitsAttribute(primitiveXMLNode,Units::eLength);
+            if (u.isMeter())
+            {
+                lenFactor = 1000.f;
+            }
+        }
+
+        if (pName == "box")
+        {
+            VisualizationFactory::Box *box = new VisualizationFactory::Box;
+            box->width = convertToFloat(primitiveXMLNode->first_attribute("width",0,false)->value()) * lenFactor;
+            box->height = convertToFloat(primitiveXMLNode->first_attribute("height",0,false)->value()) * lenFactor;
+            box->depth = convertToFloat(primitiveXMLNode->first_attribute("depth",0,false)->value()) * lenFactor;
+            primitive.reset(box);
+        } else if (pName == "sphere")
+        {
+            VisualizationFactory::Sphere *sphere = new VisualizationFactory::Sphere;
+            sphere->radius = convertToFloat(primitiveXMLNode->first_attribute("radius",0,false)->value()) * lenFactor;
+            primitive.reset(sphere);
+        } else
+        {
+            VR_ERROR << "Unknown primitive type \"" << pName << "\"; skipping";
+        }
+
+        if (primitive)
+        {
+            Eigen::Matrix4f transform;
+            processTransformNode(primitiveXMLNode->first_node("transform",0,false), "transform", transform);
+            primitive->transform = transform;
+            result.push_back(primitive);
+        }
+
+        primitiveXMLNode = primitiveXMLNode->next_sibling();
+    }
+
+    return result;
+}
 
 void BaseIO::processPhysicsTag(rapidxml::xml_node<char> *physicsXMLNode, const std::string &nodeName, SceneObject::Physics &physics)
 {
diff --git a/VirtualRobot/XML/BaseIO.h b/VirtualRobot/XML/BaseIO.h
index fcf1bdc8ba7dfcd89ef04db9f803936428950cd7..cdbd551a7b0ea53a78638d81745bfdfbbcdc8738 100644
--- a/VirtualRobot/XML/BaseIO.h
+++ b/VirtualRobot/XML/BaseIO.h
@@ -89,6 +89,7 @@ public:
 
 	static VisualizationNodePtr processVisualizationTag(rapidxml::xml_node<char> *visuXMLNode, const std::string &tagName, const std::string &basePath, bool &useAsColModel);
 	static CollisionModelPtr processCollisionTag(rapidxml::xml_node<char> *colXMLNode, const std::string &tagName, const std::string &basePath);
+        static std::vector<VisualizationFactory::PrimitivePtr> processPrimitives(rapidxml::xml_node<char> *primitivesXMLNode);
 	static void processPhysicsTag(rapidxml::xml_node<char> *physicsXMLNode, const std::string &nodeName, SceneObject::Physics &physics);
 	static RobotNodeSetPtr processRobotNodeSet(rapidxml::xml_node<char>* setXMLNode, RobotPtr robo, const std::string& robotRootNode, int& robotNodeSetCounter );
 	static TrajectoryPtr processTrajectory(rapidxml::xml_node<char> *trajectoryXMLNode,std::vector<RobotPtr> &robots);