diff --git a/SimDynamics/DynamicsEngine/BulletEngine/BulletObject.cpp b/SimDynamics/DynamicsEngine/BulletEngine/BulletObject.cpp
index 41cd623299606278356805e5933c4afc57fc7d4c..a15a8d64e906dd9027cd91ab460992f914b3ac89 100644
--- a/SimDynamics/DynamicsEngine/BulletEngine/BulletObject.cpp
+++ b/SimDynamics/DynamicsEngine/BulletEngine/BulletObject.cpp
@@ -51,15 +51,14 @@ BulletObject::BulletObject(VirtualRobot::SceneObjectPtr o)
 
 		if (o->getName() != "Floor")
 		{
-
-            std::vector<VisualizationNode::PrimitivePtr> primitives = colModel->getVisualization()->primitives;
+            std::vector<VisualizationFactory::PrimitivePtr> primitives = colModel->getVisualization()->primitives;
             if (primitives.size() == 1)
             {
                 collisionShape.reset(getShapeFromPrimitive(primitives[0]));
             }
             else if (primitives.size() > 1)
             {
-                std::vector<VisualizationNode::PrimitivePtr>::iterator it;
+                std::vector<VisualizationFactory::PrimitivePtr>::iterator it;
                 btCompoundShape *compoundShape = new btCompoundShape();
                 for (it = primitives.begin(); it != primitives.end(); it++) {
                     compoundShape->addChildShape(BulletEngine::getPoseBullet((*it)->transform), getShapeFromPrimitive(*it));
@@ -151,18 +150,18 @@ BulletObject::~BulletObject()
 }
 
 
-btCollisionShape* BulletObject::getShapeFromPrimitive(VirtualRobot::VisualizationNode::PrimitivePtr primitive)
+btCollisionShape* BulletObject::getShapeFromPrimitive(VirtualRobot::VisualizationFactory::PrimitivePtr primitive)
 {
     btCollisionShape* result;
-    if (primitive->type == VisualizationNode::Box::TYPE)
+    if (primitive->type == VisualizationFactory::Box::TYPE)
     {
-        VisualizationNode::Box* box = boost::dynamic_pointer_cast<VisualizationNode::Box>(primitive).get();
+        VisualizationFactory::Box* box = boost::dynamic_pointer_cast<VisualizationFactory::Box>(primitive).get();
         btBoxShape *boxShape = new btBoxShape(btVector3(box->width / 1000.f, box->height / 1000.f, box->depth / 1000.f));
         result = boxShape;
     }
-    else if (primitive->type == VisualizationNode::Sphere::TYPE)
+    else if (primitive->type == VisualizationFactory::Sphere::TYPE)
     {
-        VisualizationNode::Sphere* sphere = boost::dynamic_pointer_cast<VisualizationNode::Sphere>(primitive).get();
+        VisualizationFactory::Sphere* sphere = boost::dynamic_pointer_cast<VisualizationFactory::Sphere>(primitive).get();
         btSphereShape *sphereShape = new btSphereShape(btScalar(sphere->radius / 1000.f));
         result = sphereShape;
     }
diff --git a/SimDynamics/DynamicsEngine/BulletEngine/BulletObject.h b/SimDynamics/DynamicsEngine/BulletEngine/BulletObject.h
index 79a70048c652f6c3ca527b8c7564f61892f13056..972cdab553be244d0f1934fd64ef3aee46fd6873 100644
--- a/SimDynamics/DynamicsEngine/BulletEngine/BulletObject.h
+++ b/SimDynamics/DynamicsEngine/BulletEngine/BulletObject.h
@@ -84,7 +84,7 @@ public:
 protected:
 
     void setPoseIntern(const Eigen::Matrix4f &pose);
-    btCollisionShape* getShapeFromPrimitive(VirtualRobot::VisualizationNode::PrimitivePtr primitive);
+    btCollisionShape* getShapeFromPrimitive(VirtualRobot::VisualizationFactory::PrimitivePtr primitive);
 
 	btConvexHullShape* createConvexHullShape(VirtualRobot::TriMeshModelPtr trimesh);
 
diff --git a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.cpp b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.cpp
index db98a6c24178cc407e6ffea1d251f5ce726c16e5..b423324baa7197c81acdcc2d5ee59015b668d292 100644
--- a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.cpp
+++ b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.cpp
@@ -68,6 +68,77 @@ namespace VirtualRobot {
 	{
 	}
 
+    /**
+    * This method creates a VirtualRobot::CoinVisualizationNode from a given vector of \p primitives.
+    * An instance of VirtualRobot::VisualizationNode is returned in case of an occured error.
+    *
+    * \param primitives vector of primitives to create the visualization from.
+    * \param boundingBox Use bounding box instead of full model.
+    * \return instance of VirtualRobot::CoinVisualizationNode upon success and VirtualRobot::VisualizationNode on error.
+    */
+    VisualizationNodePtr CoinVisualizationFactory::getVisualizationFromPrimitives(std::vector<PrimitivePtr> primitives, bool boundingBox)
+    {
+        VisualizationNodePtr visualizationNode = VisualizationNodePtr(new VisualizationNode());
+        SoSeparator *coinVisualization = new SoSeparator();
+        coinVisualization->ref();
+
+        Eigen::Matrix4f currentTransform = Eigen::Matrix4f::Identity();
+        for (std::vector<PrimitivePtr>::iterator it = primitives.begin(); it != primitives.end(); it++)
+        {
+            PrimitivePtr p = *it;
+            currentTransform *= p->transform;
+            SoSeparator *soSep = new SoSeparator();
+            SoNode *pNode = GetNodeFromPrimitive(p, boundingBox);
+            soSep->addChild(getMatrixTransformScaleMM2M(currentTransform));
+            soSep->addChild(pNode);
+            coinVisualization->addChild(soSep);
+        }
+
+        if (boundingBox)
+        {
+            SoSeparator* bboxVisu = CreateBoundingBox(coinVisualization, false);
+            bboxVisu->ref();
+            coinVisualization->unref();
+            coinVisualization = bboxVisu;
+        }
+
+        // create new CoinVisualizationNode if no error occurred
+        visualizationNode.reset(new CoinVisualizationNode(coinVisualization));
+
+        coinVisualization->unref();
+
+        return visualizationNode;
+    }
+
+    SoNode* CoinVisualizationFactory::GetNodeFromPrimitive(PrimitivePtr primitive, bool boundingBox)
+    {
+        SoNode *coinVisualization;
+        if (primitive->type == Box::TYPE)
+        {
+            Box *box = boost::dynamic_pointer_cast<Box>(primitive).get();
+            SoCube *soBox = new SoCube;
+            soBox->width = box->width / 1000.f;
+            soBox->height = box->height / 1000.f;
+            soBox->depth = box->depth / 1000.f;
+            coinVisualization = soBox;
+        } else if (primitive->type == Sphere::TYPE)
+        {
+            Sphere *sphere = boost::dynamic_pointer_cast<Sphere>(primitive).get();
+            SoSphere *soSphere = new SoSphere;
+            soSphere->radius = sphere->radius / 1000.f;
+            coinVisualization = soSphere;
+        }
+
+        if (boundingBox && coinVisualization)
+        {
+            SoSeparator* bboxVisu = CreateBoundingBox(coinVisualization, false);
+            bboxVisu->ref();
+            coinVisualization->unref();
+            coinVisualization = bboxVisu;
+        }
+
+        return coinVisualization;
+    }
 
 	/**
 	* This method creates a VirtualRobot::CoinVisualizationNode from a given \p filename.
diff --git a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.h b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.h
index 0dc8f0a5266242c7c352ac05166af81eaf0d73bf..5ccefbc82f352214c33b89b28e7e1c708107e938 100644
--- a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.h
+++ b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.h
@@ -59,10 +59,11 @@ public:
 	CoinVisualizationFactory();
 	virtual ~CoinVisualizationFactory();
 
+    virtual VisualizationNodePtr getVisualizationFromPrimitives(std::vector<PrimitivePtr> primitives, bool boundingBox = false);
 	virtual VisualizationNodePtr getVisualizationFromFile(const std::string& filename, bool boundingBox = false);
     virtual VisualizationNodePtr getVisualizationFromFile(const std::ifstream& ifs, bool boundingBox = false);
 	virtual VisualizationNodePtr getVisualizationFromString(const std::string& modelString, bool boundingBox = false);
-	virtual VisualizationNodePtr createBox(float width, float height, float depth, float colorR, float colorG, float colorB);
+    virtual VisualizationNodePtr createBox(float width, float height, float depth, float colorR = 0.5f, float colorG = 0.5f, float colorB = 0.5f);
 	virtual VisualizationNodePtr createLine(const Eigen::Vector3f &from, const Eigen::Vector3f &to, float width = 1.0f, float colorR = 0.5f, float colorG = 0.5f, float colorB = 0.5f);
 	virtual VisualizationNodePtr createLine(const Eigen::Matrix4f &from, const Eigen::Matrix4f &to, float width = 1.0f, float colorR = 0.5f, float colorG = 0.5f, float colorB = 0.5f);
 	virtual VisualizationNodePtr createSphere(float radius, float colorR = 0.5f, float colorG = 0.5f, float colorB = 0.5f);
@@ -299,6 +300,7 @@ public:
 	*/
 	virtual void cleanup();
 protected:
+    static SoNode* GetNodeFromPrimitive(PrimitivePtr primitive, bool boundingBox);
     static void GetVisualizationFromSoInput(SoInput& soInput, VisualizationNodePtr& visualizationNode, bool bbox = false);
 
 	static inline char IVToolsHelper_ReplaceSpaceWithUnderscore(char input) { if ( ' ' == input ) return '_'; else return input; }
diff --git a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationNode.cpp b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationNode.cpp
index 4e93095f217c58d05d3afa6962190bbb385b8e04..a1b619bc6826519abae30c6d570d4e5e2c790547 100644
--- a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationNode.cpp
+++ b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationNode.cpp
@@ -6,6 +6,7 @@
 
 #include "CoinVisualizationNode.h"
 #include "CoinVisualizationFactory.h"
+#include "../../MathTools.h"
 #include "../TriMeshModel.h"
 #include "../../VirtualRobotException.h"
 #include "../../XML/BaseIO.h"
@@ -22,6 +23,7 @@
 #include <Inventor/actions/SoWriteAction.h>
 
 #include <boost/filesystem.hpp>
+#include <boost/foreach.hpp>
 
 namespace VirtualRobot {
 
@@ -131,15 +133,91 @@ TriMeshModelPtr CoinVisualizationNode::getTriMeshModel()
  */
 void CoinVisualizationNode::createTriMeshModel()
 {
-	THROW_VR_EXCEPTION_IF(!visualization, "CoinVisualizationNode::createTriMeshModel(): no Coin model present!");
+    THROW_VR_EXCEPTION_IF(!visualization, "CoinVisualizationNode::createTriMeshModel(): no Coin model present!");
 
 	if (triMeshModel)
 		triMeshModel->clear();
 	else
 		triMeshModel.reset(new TriMeshModel());
-	SoCallbackAction ca;
-	ca.addTriangleCallback(SoShape::getClassTypeId(), &CoinVisualizationNode::InventorTriangleCB, triMeshModel.get());
-	ca.apply(visualization);
+
+//    if (primitives.size() != 0 && !visualization)
+//    {
+//        std::vector<PrimitivePtr>::iterator it;
+//        Eigen::Matrix4f currentTransform = Eigen::Matrix4f::Identity();
+//        SoNode* newVis = new SoSeparator;
+//        newVis->ref();
+//        for (it = primitives.begin(); it != primitives.end(); it++) {
+//            PrimitivePtr p = *it;
+//            VisualizationNodePtr visNode;
+//            CoinVisualizationFactory vf;
+
+//            if (p->type == Box::TYPE)
+//            {
+//                Box* box = boost::dynamic_pointer_cast<Box>(p).get();
+//                visNode = vf.createBox(box->width, box->height, box->depth);
+////                triMesh = visNode->getTriMeshModel();
+//            } else if (p->type == Sphere::TYPE)
+//            {
+//                Sphere* sphere = boost::dynamic_pointer_cast<Sphere>(p).get();
+//                visNode = vf.createSphere(sphere->radius);
+////                triMesh = visNode->getTriMeshModel();
+//            } else
+//            {
+//                VR_ERROR << "Unknown primitive" << std::endl;
+//            }
+
+//            if (visNode)
+//                newVis->addChild(vf.getCoinVisualization(visNode));
+//        }
+//        visualization = newVis;
+//        std::vector<PrimitivePtr>::iterator it;
+//        Eigen::Matrix4f currentTransform = Eigen::Matrix4f::Identity();
+//        for (it = primitives.begin(); it != primitives.end(); it++) {
+//            PrimitivePtr p = *it;
+//            currentTransform *= p->transform;
+//            VisualizationNodePtr visNode;
+//            TriMeshModelPtr triMesh;
+
+//            CoinVisualizationFactory vf;
+//            if (p->type == Box::TYPE)
+//            {
+//                Box* box = boost::dynamic_pointer_cast<Box>(p).get();
+//                visNode = vf.createBox(box->width, box->height, box->depth);
+//                triMesh = visNode->getTriMeshModel();
+//            } else if (p->type == Sphere::TYPE)
+//            {
+//                Sphere* sphere = boost::dynamic_pointer_cast<Sphere>(p).get();
+//                visNode = vf.createSphere(sphere->radius);
+//                triMesh = visNode->getTriMeshModel();
+//            }
+
+//            if (visNode)
+//            {
+//                std::vector<MathTools::TriangleFace> faces = triMesh->faces;
+//                std::vector<Eigen::Vector3f> vertices = triMesh->vertices;
+
+//                for (std::vector<Eigen::Vector3f>::iterator it = vertices.begin(); it != vertices.end(); it++)
+//                {
+//                    Eigen::Vector4f v;
+//                    v << (*it).x(), (*it).y(), (*it).z(), 1.f;
+//                    v = currentTransform * v;
+//                    (*it) = v.head(3);
+//                }
+
+//                for (std::vector<MathTools::TriangleFace>::iterator it = faces.begin(); it != faces.end(); it++)
+//                {
+//                    triMeshModel->addTriangleWithFace(vertices[it->id1], vertices[it->id2], vertices[it->id3]);
+//                }
+//            }
+//        }
+//    }
+
+//    if (visualization)
+//    {
+        SoCallbackAction ca;
+        ca.addTriangleCallback(SoShape::getClassTypeId(), &CoinVisualizationNode::InventorTriangleCB, triMeshModel.get());
+        ca.apply(visualization);
+//    }
 }
 
 
@@ -300,6 +378,7 @@ VirtualRobot::VisualizationNodePtr CoinVisualizationNode::clone(bool deepCopy, f
 		p->attachVisualization(i->first, attachedClone);
 		i++;
 	}
+    p->primitives = primitives;
 
 	return p;
 }
diff --git a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationNode.h b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationNode.h
index c23984fe0b7d6b0443fd2239d8d119ebcbc15b1e..faddb9acd39603c5b8377d748978f0f189926851 100644
--- a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationNode.h
+++ b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationNode.h
@@ -44,7 +44,7 @@ class VIRTUAL_ROBOT_IMPORT_EXPORT CoinVisualizationNode : virtual public Visuali
 {
 	friend class CoinVisualizationFactory;
 public:
-	CoinVisualizationNode(SoNode* visualizationNode);
+    CoinVisualizationNode(SoNode* visualizationNode);
 	~CoinVisualizationNode();
 	virtual TriMeshModelPtr getTriMeshModel();
 
diff --git a/VirtualRobot/Visualization/VisualizationFactory.h b/VirtualRobot/Visualization/VisualizationFactory.h
index 4835a5ac7de20894d4bf739e2e708d165a820a9a..909dfbfda1f2614a27905ea6b51c6fd211bf8e83 100644
--- a/VirtualRobot/Visualization/VisualizationFactory.h
+++ b/VirtualRobot/Visualization/VisualizationFactory.h
@@ -57,7 +57,7 @@ public:
 
     struct PhongMaterial
     {
-        PhongMaterial(){};
+        PhongMaterial(){}
         Color emission;
         Color ambient;
         Color diffuse;
@@ -70,15 +70,42 @@ public:
         float refractionIndex;
     };
 
+    struct Primitive {
+        static const int TYPE = 0;
+        Primitive() : type(TYPE), transform(Eigen::Matrix4f::Identity()) {}
+        virtual ~Primitive() {} //needed for dynamic cast to work
+        Eigen::Matrix4f transform;
+        const int type;
+    protected:
+        Primitive(int type) : type(type) {}
+    };
+
+    struct Box : public Primitive {
+        static const int TYPE = 1;
+        Box() : Primitive(TYPE) {}
+        float width;
+        float height;
+        float depth;
+    };
+
+    struct Sphere : public Primitive {
+        static const int TYPE = 2;
+        Sphere() : Primitive(TYPE) {}
+        float radius;
+    };
+
+    typedef boost::shared_ptr<Primitive> PrimitivePtr;
+
 	VisualizationFactory() {;}
 	virtual ~VisualizationFactory() {;}
 
+    virtual VisualizationNodePtr getVisualizationFromPrimitives(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();};
     /*!
         A box, dimensions are given in mm.
     */
-	virtual VisualizationNodePtr createBox(float length, float height, float width, float colorR, float colorG, float colorB){return VisualizationNodePtr();}
+    virtual VisualizationNodePtr createBox(float width, float height, float depth, float colorR = 0.5f, float colorG = 0.5f, float colorB = 0.5f){return VisualizationNodePtr();}
 	virtual VisualizationNodePtr createLine(const Eigen::Vector3f &from, const Eigen::Vector3f &to, float width = 1.0f, float colorR = 0.5f, float colorG = 0.5f, float colorB = 0.5f){return VisualizationNodePtr();}
 	virtual VisualizationNodePtr createLine(const Eigen::Matrix4f &from, const Eigen::Matrix4f &to, float width = 1.0f, float colorR = 0.5f, float colorG = 0.5f, float colorB = 0.5f){return VisualizationNodePtr();}
 	virtual VisualizationNodePtr createSphere(float radius, float colorR = 0.5f, float colorG = 0.5f, float colorB = 0.5f){return VisualizationNodePtr();}
diff --git a/VirtualRobot/Visualization/VisualizationNode.h b/VirtualRobot/Visualization/VisualizationNode.h
index 5bd62722c5670eb0f60ac1cd04c81ce8bf551d33..7fb5ec71484dbf9d769ae7d5385d972cf4db75fc 100644
--- a/VirtualRobot/Visualization/VisualizationNode.h
+++ b/VirtualRobot/Visualization/VisualizationNode.h
@@ -39,33 +39,7 @@ class VIRTUAL_ROBOT_IMPORT_EXPORT VisualizationNode
 public:
 	EIGEN_MAKE_ALIGNED_OPERATOR_NEW
 
-    struct Primitive {
-        static const int TYPE = 0;
-        Primitive() : type(TYPE), transform(Eigen::Matrix4f::Identity()) {}
-        virtual ~Primitive() {} //needed for dynamic cast to work
-        Eigen::Matrix4f transform;
-        const int type;
-    protected:
-        Primitive(int type) : type(type) {}
-    };
-
-    struct Box : public Primitive {
-        static const int TYPE = 1;
-        Box() : Primitive(TYPE) {}
-        float width;
-        float height;
-        float depth;
-    };
-
-    struct Sphere : public Primitive {
-        static const int TYPE = 2;
-        Sphere() : Primitive(TYPE) {}
-        float radius;
-    };
-
-    typedef boost::shared_ptr<Primitive> PrimitivePtr;
-
-    std::vector<PrimitivePtr> primitives;
+    std::vector<VisualizationFactory::PrimitivePtr> primitives;
 
 	/*!
 	Constructor
diff --git a/VirtualRobot/XML/BaseIO.cpp b/VirtualRobot/XML/BaseIO.cpp
index 37025ac1802f61b09e1aa1159404de2b5ba0a8a0..937d19edb9cf02d5c8f6cca89b69d45a65c44467 100644
--- a/VirtualRobot/XML/BaseIO.cpp
+++ b/VirtualRobot/XML/BaseIO.cpp
@@ -712,7 +712,7 @@ VisualizationNodePtr BaseIO::processVisualizationTag(rapidxml::xml_node<char> *v
 	std::string visuFileType = "";
 	std::string visuFile = "";
 	rapidxml::xml_attribute<> *attr;
-    std::vector<VisualizationNode::PrimitivePtr> primitives;
+    std::vector<VisualizationFactory::PrimitivePtr> primitives;
 	VisualizationNodePtr visualizationNode;
 
 	if (!visuXMLNode)
@@ -741,7 +741,7 @@ VisualizationNodePtr BaseIO::processVisualizationTag(rapidxml::xml_node<char> *v
 				if (VisualizationFactory::first(NULL))
 					visuFileType = VisualizationFactory::first(NULL)->getDescription();
 				else
-					VR_WARNING << "No visualization present..." << endl;
+                    VR_WARNING << "No visualization present..." << endl;
 			} else
 				visuFileType = attr->value();
 
@@ -754,13 +754,14 @@ VisualizationNodePtr BaseIO::processVisualizationTag(rapidxml::xml_node<char> *v
         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();
-                VisualizationNode::PrimitivePtr primitive;
+                VisualizationFactory::PrimitivePtr primitive;
 
                 float lenFactor = 1.f;
                 if (hasUnitsAttribute(primitiveXMLNode))
@@ -774,14 +775,14 @@ VisualizationNodePtr BaseIO::processVisualizationTag(rapidxml::xml_node<char> *v
 
                 if (pName == "Box")
                 {
-                    VisualizationNode::Box *box = new VisualizationNode::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")
                 {
-                    VisualizationNode::Sphere *sphere = new VisualizationNode::Sphere;
+                    VisualizationFactory::Sphere *sphere = new VisualizationFactory::Sphere;
                     sphere->radius = convertToFloat(primitiveXMLNode->first_attribute("radius",0,false)->value()) * lenFactor;
                     primitive.reset(sphere);
                 } else
@@ -807,9 +808,13 @@ VisualizationNodePtr BaseIO::processVisualizationTag(rapidxml::xml_node<char> *v
             if (visualizationFactory)
             {
                 visualizationNode = visualizationFactory->getVisualizationFromFile(visuFile);
-                visualizationNode->primitives = primitives;
             } else
 				VR_WARNING << "VisualizationFactory of type '" << visuFileType << "' not present. Ignoring Visualization data in Node <" << tagName << ">" << endl;
+        } else if (primitives.size() != 0)
+        {
+            VisualizationFactoryPtr visualizationFactory = VisualizationFactory::first(NULL);
+            visualizationNode = visualizationFactory->getVisualizationFromPrimitives(primitives);
+            visualizationNode->primitives = primitives;
         }
 
 
diff --git a/VirtualRobot/data/objects/PrimitivesExample.xml b/VirtualRobot/data/objects/PrimitivesExample.xml
index a30b44492564b6ac24ca384d73117a752856befb..aa94cecf51234a2cee57d1fafa522d5eb767df48 100644
--- a/VirtualRobot/data/objects/PrimitivesExample.xml
+++ b/VirtualRobot/data/objects/PrimitivesExample.xml
@@ -1,15 +1,22 @@
 <ManipulationObject name='Vitalis'>
 	<Visualization>
+		<!-- only file OR primitives is allowed -->
 		<Primitives>
 			<Box width="136" height="190" depth="40"/> <!-- primitive-specific parameters, default unit is mm -->
-			<Sphere radius="0.2" unitslength="m">
+			<Sphere radius="0.15" unitslength="m">
 				<Transform> <!-- transform is relative to previous primitive -->
-					<Translation x="0" y="20" z="0"/>
+					<Translation x="0" y="170" z="0"/>
 				</Transform>
 			</Sphere>
+			<Box width="136" height="190" depth="40">
+				<Transform> <!-- transform is relative to previous primitive -->
+					<Translation x="0" y="-355" z="0"/>
+					<rpy roll="0" pitch="1.41" yaw="0" unitsAngle="radian"/>
+				</Transform>
+			</Box>
 			<!-- other primitives -->
 		</Primitives>
-		<File type='inventor'>iv/vitalis.iv</File>
+		<!--File type='inventor'>iv/vitalis.iv</File-->
 		<UseAsCollisionModel/>
 	</Visualization>
 </ManipulationObject>
diff --git a/VirtualRobot/data/objects/VitalisWithPrimitives.xml b/VirtualRobot/data/objects/VitalisWithPrimitives.xml
index 4a816cf3b0d81ca4db34dd4677e46a6b951c4b76..a240b945bd37e307b7245fea47593862e82b6b14 100644
--- a/VirtualRobot/data/objects/VitalisWithPrimitives.xml
+++ b/VirtualRobot/data/objects/VitalisWithPrimitives.xml
@@ -3,7 +3,7 @@
 		<Primitives>
 			<Box width="136" height="190" depth="40"/>
 		</Primitives>
-		<File type='inventor'>iv/vitalis.iv</File>
+		<!--File type='inventor'>iv/vitalis.iv</File-->
 		<UseAsCollisionModel/>
 	</Visualization>
 </ManipulationObject>