diff --git a/VirtualRobot/CollisionDetection/CollisionModel.cpp b/VirtualRobot/CollisionDetection/CollisionModel.cpp
index aff0975520eb74c9e79602efa0ffd0f3d9d4bfa0..d1b7ae4e1b50346ff1a79161568f555cf7d78fd3 100644
--- a/VirtualRobot/CollisionDetection/CollisionModel.cpp
+++ b/VirtualRobot/CollisionDetection/CollisionModel.cpp
@@ -20,6 +20,7 @@ namespace VirtualRobot
         this->name = name;
         this->margin = margin;
         this->colChecker = colChecker;
+        this->localPose = visu->getLocalPose();
 
         if (!this->colChecker)
         {
@@ -450,4 +451,3 @@ namespace VirtualRobot
 
 
 } // namespace VirtualRobot
-
diff --git a/VirtualRobot/CollisionDetection/CollisionModel.h b/VirtualRobot/CollisionDetection/CollisionModel.h
index 7547e65075c125b0e1e47ee851453c9b9590d981..b1b6e77fb3d4d8ed477f908c85e5080a5bbcbfcd 100644
--- a/VirtualRobot/CollisionDetection/CollisionModel.h
+++ b/VirtualRobot/CollisionDetection/CollisionModel.h
@@ -94,6 +94,15 @@ namespace VirtualRobot
             return getBoundingBox();
         }
 
+        void setGlobalParentPose(const Eigen::Matrix4f& globalParentPose)
+        {
+            setGlobalPose(globalParentPose * localPose);
+        }
+
+        void setLocalPose(const Eigen::Matrix4f& localPose)
+        {
+            this->localPose = localPose;
+        }
 
         /*!
         The global pose defines the position of the joint in the world. This value is used for visualization.
@@ -224,6 +233,7 @@ namespace VirtualRobot
 
         Eigen::Matrix4f globalPose;     //< The transformation that is used for visualization and for updating the col model
 
+        Eigen::Matrix4f localPose = Eigen::Matrix4f::Identity();
 
 #if defined(VR_COLLISION_DETECTION_PQP)
         std::shared_ptr< CollisionModelPQP > collisionModelImplementation;
@@ -233,4 +243,3 @@ namespace VirtualRobot
     };
 
 } // namespace VirtualRobot
-
diff --git a/VirtualRobot/Import/URDF/SimoxURDFFactory.cpp b/VirtualRobot/Import/URDF/SimoxURDFFactory.cpp
index 23efb76b65d999b29a5dc636cd4932cc83ac736b..27dce262f2444dfcfe3a73c526d0c6ddc929bee8 100644
--- a/VirtualRobot/Import/URDF/SimoxURDFFactory.cpp
+++ b/VirtualRobot/Import/URDF/SimoxURDFFactory.cpp
@@ -4,6 +4,8 @@
 #include <iostream>
 #include <map>
 
+#include <Eigen/Geometry>
+
 #include <urdf_model/model.h>
 #include <urdf_parser/urdf_parser.h>
 
@@ -144,7 +146,7 @@ namespace VirtualRobot
         return robo;
     }
 
-    Eigen::Matrix4f SimoxURDFFactory::convertPose(urdf::Pose& p)
+    Eigen::Matrix4f SimoxURDFFactory::convertPose(const urdf::Pose& p)
     {
         const float scale = 1000.0f; // mm
         Eigen::Matrix4f res;
@@ -272,20 +274,20 @@ namespace VirtualRobot
         return res;
     }
 
-    VisualizationNodePtr SimoxURDFFactory::convertVisuArray(std::vector<std::shared_ptr<urdf::Collision> > visu_array, const string& basePath)
+    VisualizationNodePtr SimoxURDFFactory::convertVisuArray(std::vector<std::shared_ptr<urdf::Collision> > col_array, const string& basePath)
     {
         VirtualRobot::VisualizationNodePtr res;
         std::shared_ptr<VisualizationFactory> factory = CoinVisualizationFactory::createInstance(NULL);
 
-        if (visu_array.size() == 0)
+        if (col_array.empty())
         {
             return res;
         }
 
         std::vector< VisualizationNodePtr > visus;
-        for (size_t i = 0; i < visu_array.size(); i++)
+        for (auto & visu : col_array)
         {
-            VirtualRobot::VisualizationNodePtr v = convertVisu(visu_array[i]->geometry, visu_array[i]->origin, basePath);
+            VirtualRobot::VisualizationNodePtr v = convertVisu(visu->geometry, visu->origin, basePath);
             if (v)
             {
                 visus.push_back(v);
diff --git a/VirtualRobot/Import/URDF/SimoxURDFFactory.h b/VirtualRobot/Import/URDF/SimoxURDFFactory.h
index 4bafec64fca8fb605851f9e78e9fe962dd2ac5f8..6be93aaacdd36f78796a480df531d18416f24a91 100644
--- a/VirtualRobot/Import/URDF/SimoxURDFFactory.h
+++ b/VirtualRobot/Import/URDF/SimoxURDFFactory.h
@@ -77,7 +77,7 @@ namespace VirtualRobot
     protected:
         RobotNodePtr createBodyNode(const std::string& name, RobotPtr robot, std::shared_ptr<urdf::Link> urdfBody, const std::string& basePath, bool useColModelsIfNoVisuModel = true);
         RobotNodePtr createJointNode(RobotPtr robot, std::shared_ptr<urdf::Joint> urdfJoint);
-        Eigen::Matrix4f convertPose(urdf::Pose& p);
+        Eigen::Matrix4f convertPose(const urdf::Pose& p);
         VirtualRobot::VisualizationNodePtr convertVisu(std::shared_ptr<urdf::Geometry> g, urdf::Pose& pose, const std::string& basePath);
         VirtualRobot::VisualizationNodePtr convertVisuArray(std::vector<std::shared_ptr<urdf::Visual> > visu_array, const std::string& basePath);
         VirtualRobot::VisualizationNodePtr convertVisuArray(std::vector<std::shared_ptr<urdf::Collision> > visu_array, const std::string& basePath);
@@ -87,4 +87,3 @@ namespace VirtualRobot
     };
 
 } // namespace VirtualRobot
-
diff --git a/VirtualRobot/Nodes/RobotNode.cpp b/VirtualRobot/Nodes/RobotNode.cpp
index 2107a7b3d1de25b922ca77ce3296f05e1ef3b467..a0ecdac424969910a4b2ef8b7318be28314a23e2 100644
--- a/VirtualRobot/Nodes/RobotNode.cpp
+++ b/VirtualRobot/Nodes/RobotNode.cpp
@@ -319,7 +319,7 @@ namespace VirtualRobot
         }
         if (collisionModel && updateCollisionModel)
         {
-            collisionModel->setGlobalPose(globalPose);
+            collisionModel->setGlobalParentPose(globalPose);
         }
     }
 
diff --git a/VirtualRobot/SceneObject.cpp b/VirtualRobot/SceneObject.cpp
index c512b5b35cab0470886689b7dba423bd63e542d3..3e62d88805693bc740d5ffb565c1d0b8c94c914b 100644
--- a/VirtualRobot/SceneObject.cpp
+++ b/VirtualRobot/SceneObject.cpp
@@ -133,7 +133,7 @@ namespace VirtualRobot
 
         if (collisionModel && updateCollisionModel)
         {
-            collisionModel->setGlobalPose(globalPose);
+            collisionModel->setGlobalParentPose(globalPose);
         }
 
         if (updateChildren)
@@ -157,7 +157,7 @@ namespace VirtualRobot
         }
         if (collisionModel && updateCollisionModel)
         {
-            collisionModel->setGlobalPose(globalPose);
+            collisionModel->setGlobalParentPose(globalPose);
         }
     }
 
@@ -545,7 +545,7 @@ namespace VirtualRobot
         if (collisionModel)
         {
             collisionModel->setUpdateVisualization(updateCollisionModel);
-            collisionModel->setGlobalPose(globalPose);
+            collisionModel->setGlobalParentPose(globalPose);
         }
     }
 
diff --git a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.cpp b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.cpp
index 5c8f40d91d39e746aa57c1dc7f64e2113e90e554..9b528ad5b60f987bc3d0c85375e1a97784867159 100644
--- a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.cpp
+++ b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.cpp
@@ -26,9 +26,11 @@
 #include "../../Workspace/WorkspaceGrid.h"
 #include "../../XML/BaseIO.h"
 #include "../../Import/MeshImport/AssimpReader.h"
+#include "SimoxUtility/math/convert/mat3f_to_quat.h"
 #include <Inventor/SoDB.h>
 #include <Inventor/nodes/SoFile.h>
 #include <Inventor/nodes/SoNode.h>
+#include <Inventor/nodes/SoTransformation.h>
 #include <Inventor/nodes/SoUnits.h>
 #include <Inventor/nodes/SoSeparator.h>
 #include <Inventor/nodes/SoCube.h>
@@ -4087,7 +4089,24 @@ namespace VirtualRobot
 
                 if (n)
                 {
-                    s->addChild(n->copy(FALSE));
+                    SoSeparator* ss = new SoSeparator();
+
+                    SoUnits* u = new SoUnits();
+                    u->units = SoUnits::MILLIMETERS;
+
+                    const Eigen::Isometry3f localPose(visualizations[i]->getLocalPose());
+                    const Eigen::Vector3f& translation = localPose.translation();
+
+                    SoTransform* t = new SoTransform;
+                    t->translation.setValue(translation.x(), translation.y(), translation.z());
+                    const Eigen::Quaternionf q = simox::math::mat3f_to_quat(localPose.linear());
+                    t->rotation.setValue(q.x(), q.y(), q.z(), q.w());
+
+                    ss->addChild(u);
+                    ss->addChild(t);
+                    ss->addChild(n->copy(FALSE));
+
+                    s->addChild(ss);
                 }
             }
             else