diff --git a/VirtualRobot/SceneObject.cpp b/VirtualRobot/SceneObject.cpp
index 1466ed3e9d7bc6c6538f2783ddd5352d1f483840..969a508970ab0a34b2273477313a62ebdd73a4ef 100644
--- a/VirtualRobot/SceneObject.cpp
+++ b/VirtualRobot/SceneObject.cpp
@@ -317,45 +317,30 @@ namespace VirtualRobot
 
         if (enableCoM && visualizationFactory)
         {
+            Eigen::Isometry3f localPose = Eigen::Isometry3f::Identity();
+            localPose.translation() = getCoMLocal() / 1000;
+
             // create visu
             if (!comModel)
             {
                 VisualizationNodePtr comModel1 = visualizationFactory->createSphere(7.05f, VisualizationFactory::Color(1.0f, 0.2f, 0.2f));
+                comModel1->setLocalPose(localPose.matrix());
+                
                 VisualizationNodePtr comModel2 = visualizationFactory->createBox(10.0f, 10.0f, 10.0f, VisualizationFactory::Color(0.2f, 0.2f, 1.0f));
-                std::vector<VisualizationNodePtr> v;
-                v.push_back(comModel1);
-                v.push_back(comModel2);
-                comModel = visualizationFactory->createUnitedVisualization(v);
-            }
-
-            if (comModel)
-            {
-                std::stringstream ss;
-                ss << "COM:" << getName();
-                std::string t = ss.str();
+                comModel2->setLocalPose(localPose.matrix());
+                
+                const std::string t = "COM: " + getName();
                 VisualizationNodePtr vText = visualizationFactory->createText(t, true, 1.0f, VisualizationFactory::Color::Blue(), 0, 10.0f, 0);
-                std::vector<VisualizationNodePtr> v;
-                v.push_back(comModel);
-                v.push_back(vText);
+                vText->setLocalPose(localPose.matrix());
+                
+                const std::vector<VisualizationNodePtr> v{comModel1, comModel2, vText};
+
                 comModel = visualizationFactory->createUnitedVisualization(v);
             }
 
-            VisualizationNodePtr comModelClone = comModel->clone();
-            Eigen::Vector3f l = getCoMLocal();
-            //cout << "COM:" << l << std::endl;
-            Eigen::Matrix4f m = Eigen::Matrix4f::Identity();
-            m.block(0, 3, 3, 1) = l;
-
-            // now we have transformation in RobotNode (end) coordsystem
-            // we need to transform to RobotNode's visualization system
-            // -> not needed here, since we don't use postr joint transformations any more
-            //m = getGlobalPoseVisualization().inverse() * getGlobalPose() * m;
-
-            // convert mm to m
-            //m.block(0, 3, 3, 1) *= 0.001f;
-
-            visualizationFactory->applyDisplacement(comModelClone, m);
+            VR_ASSERT(comModel != nullptr);
 
+            VisualizationNodePtr comModelClone = comModel->clone();
             visualizationModel->attachVisualization("__CoMLocation", comModelClone);
         }
 
@@ -456,23 +441,18 @@ namespace VirtualRobot
 
                 VisualizationNodePtr inertiaVisu = visualizationFactory->createEllipse(xl, yl, zl, true, axesSize, axesSize * 2.0f);
 
-                Eigen::Vector3f l = getCoMLocal();
-                //cout << "COM:" << l << std::endl;
-                Eigen::Matrix4f m = Eigen::Matrix4f::Identity();
-                m.block(0, 3, 3, 1) = l;
-                m.block(0, 0, 3, 3) = eigensolver.eigenvectors().block(0, 0, 3, 3); // rotate according to EV
-
-                // now we have transformation in RobotNode (end) coordsystem
-                // we need to transform to RobotNode's visualization system
-                // not needed, we don't have post joint transformations any more
-                //m = getGlobalPoseVisualization().inverse() * getGlobalPose() * m;
+                Eigen::Isometry3f localPose = Eigen::Isometry3f::Identity();
+                localPose.linear().col(0) = eigensolver.eigenvectors().col(0);
+                localPose.linear().col(1) = eigensolver.eigenvectors().col(1);
+                localPose.linear().col(2) = eigensolver.eigenvectors().col(0).cross(eigensolver.eigenvectors().col(1));
+                localPose.translation() = getCoMLocal() / 1000;
 
-                // convert mm to m
-                //m.block(0, 3, 3, 1) *= 0.001f;
+                inertiaVisu->setLocalPose(localPose.matrix());
 
-                visualizationFactory->applyDisplacement(inertiaVisu, m);
+                // using intermediate visu model to make local transformation (last line) work
+                const auto visu = visualizationFactory->createUnitedVisualization({inertiaVisu});
 
-                visualizationModel->attachVisualization("__InertiaMatrix", inertiaVisu);
+                visualizationModel->attachVisualization("__InertiaMatrix", visu);
 
             }
             else