diff --git a/source/RobotAPI/components/DebugDrawer/DebugDrawerComponent.cpp b/source/RobotAPI/components/DebugDrawer/DebugDrawerComponent.cpp
index e75b9614da16d4ca9deeb42b556107ca7c9001a4..9176c4481965c7e5f9ab6e3944b0c3e1927dcd08 100644
--- a/source/RobotAPI/components/DebugDrawer/DebugDrawerComponent.cpp
+++ b/source/RobotAPI/components/DebugDrawer/DebugDrawerComponent.cpp
@@ -248,7 +248,7 @@ namespace armarx
         removeSelectionCallbacks();
         selectionNode->deselectAll();
 
-        for (auto& e : selectedElements)
+        for (auto & e : selectedElements)
         {
             SoNode* n = SoSelection::getByName(SELECTION_NAME(e.layerName, e.elementName));
             if (n)
@@ -288,7 +288,7 @@ namespace armarx
                     name = name.substr(index + strlen(SELECTION_NAME_SPLITTER));
 
                     // Check if selected element is 'selectable'
-                    for (auto& l : layers)
+                    for (auto & l : layers)
                     {
                         std::string layer = l.first;
                         if (layers[layer].addedBoxVisualizations.find(name) != layers[layer].addedBoxVisualizations.end()
@@ -443,17 +443,29 @@ namespace armarx
 
     void DebugDrawerComponent::exportScene(const std::string& filename, const Ice::Current&)
     {
+        ScopedRecursiveLockPtr l = getScopedVisuLock();
+
         ARMARX_INFO << "Exporting scene to '" << filename << "'";
 
+        SoSeparator* sep = new SoSeparator;
+        SoUnits* u = new SoUnits;
+        u->units = SoUnits::MILLIMETERS;
+        sep->addChild(u);
+        sep->addChild(layerMainNode);
+
         SoWriteAction writeAction;
         writeAction.getOutput()->openFile(filename.c_str());
         writeAction.getOutput()->setBinary(false);
-        writeAction.apply(layerMainNode);
+        writeAction.apply(sep);
         writeAction.getOutput()->closeFile();
+
+        sep->unref();
     }
 
     void DebugDrawerComponent::exportLayer(const std::string& filename, const std::string& layerName, const Ice::Current&)
     {
+        ScopedRecursiveLockPtr l = getScopedVisuLock();
+
         ARMARX_INFO << "Exporting layer '" << layerName << "' to '" << filename << "'";
 
         if (!hasLayer(layerName))
@@ -462,11 +474,19 @@ namespace armarx
             return;
         }
 
+        SoSeparator* sep = new SoSeparator;
+        SoUnits* u = new SoUnits;
+        u->units = SoUnits::MILLIMETERS;
+        sep->addChild(u);
+        sep->addChild(layers[layerName].mainNode);
+
         SoWriteAction writeAction;
         writeAction.getOutput()->openFile(filename.c_str());
         writeAction.getOutput()->setBinary(false);
-        writeAction.apply(layers[layerName].mainNode);
+        writeAction.apply(sep);
         writeAction.getOutput()->closeFile();
+
+        sep->unref();
     }
 
     void DebugDrawerComponent::drawCoordSystem(const CoordData& d)
@@ -1063,11 +1083,21 @@ namespace armarx
         // load robot
         std::string filename = d.robotFile;
         ArmarXDataPath::getAbsolutePath(filename, filename);
+
+        VirtualRobot::SceneObject::VisualizationType visuType = VirtualRobot::SceneObject::Full;
+        VirtualRobot::RobotIO::RobotDescription loadMode = VirtualRobot::RobotIO::eFull;
+
+        if (d.drawStyle == DrawStyle::CollisionModel)
+        {
+            visuType = VirtualRobot::SceneObject::Collision;
+            loadMode = VirtualRobot::RobotIO::eCollisionModel;
+        }
+
         ARMARX_INFO << "Loading robot from " << filename;
 
         try
         {
-            result = RobotIO::loadRobot(filename);
+            result = RobotIO::loadRobot(filename, loadMode);
         }
         catch (...)
         {
@@ -1087,15 +1117,6 @@ namespace armarx
         m->setOverride(false);
         sep->addChild(m);
 
-
-
-        VirtualRobot::SceneObject::VisualizationType visuType = VirtualRobot::SceneObject::Full;
-
-        if (d.drawStyle == DrawStyle::CollisionModel)
-        {
-            visuType = VirtualRobot::SceneObject::Collision;
-        }
-
         boost::shared_ptr<CoinVisualization> robVisu = result->getVisualization<CoinVisualization>(visuType);
 
         if (robVisu)
@@ -1927,7 +1948,7 @@ namespace armarx
         d.layerName = layerName;
         d.name = robotName;
 
-        for (auto& it : configuration)
+        for (auto & it : configuration)
         {
             d.configuration[it.first] = it.second;
         }
@@ -1974,7 +1995,7 @@ namespace armarx
 
     void DebugDrawerComponent::clearAll(const Ice::Current&)
     {
-        for (auto& i : layers)
+        for (auto & i : layers)
         {
             clearLayer(i.first);
         }
@@ -2017,72 +2038,72 @@ namespace armarx
 
         Layer& layer = layers.at(layerName);
 
-        for (const auto& i : layer.addedCoordVisualizations)
+        for (const auto & i : layer.addedCoordVisualizations)
         {
             removePoseVisu(layerName, i.first);
         }
 
-        for (const auto& i : layer.addedLineVisualizations)
+        for (const auto & i : layer.addedLineVisualizations)
         {
             removeLineVisu(layerName, i.first);
         }
 
-        for (const auto& i : layer.addedLineSetVisualizations)
+        for (const auto & i : layer.addedLineSetVisualizations)
         {
             removeLineSetVisu(layerName, i.first);
         }
 
-        for (const auto& i : layer.addedBoxVisualizations)
+        for (const auto & i : layer.addedBoxVisualizations)
         {
             removeBoxVisu(layerName, i.first);
         }
 
-        for (const auto& i : layer.addedTextVisualizations)
+        for (const auto & i : layer.addedTextVisualizations)
         {
             removeTextVisu(layerName, i.first);
         }
 
-        for (const auto& i : layer.addedSphereVisualizations)
+        for (const auto & i : layer.addedSphereVisualizations)
         {
             removeSphereVisu(layerName, i.first);
         }
 
-        for (const auto& i : layer.addedCylinderVisualizations)
+        for (const auto & i : layer.addedCylinderVisualizations)
         {
             removeCylinderVisu(layerName, i.first);
         }
 
-        for (const auto& i : layer.addedPointCloudVisualizations)
+        for (const auto & i : layer.addedPointCloudVisualizations)
         {
             removePointCloudVisu(layerName, i.first);
         }
 
-        for (const auto& i : layer.addedPolygonVisualizations)
+        for (const auto & i : layer.addedPolygonVisualizations)
         {
             removePolygonVisu(layerName, i.first);
         }
 
-        for (const auto& i : layer.addedTriMeshVisualizations)
+        for (const auto & i : layer.addedTriMeshVisualizations)
         {
             removeTriMeshVisu(layerName, i.first);
         }
 
-        for (const auto& i : layer.added24BitColoredPointCloudVisualizations)
+        for (const auto & i : layer.added24BitColoredPointCloudVisualizations)
         {
             remove24BitColoredPointCloudVisu(layerName, i.first);
         }
 
-        for (const auto& i : layer.addedArrowVisualizations)
+        for (const auto & i : layer.addedArrowVisualizations)
         {
             removeArrowVisu(layerName, i.first);
         }
 
-        for (const auto& i : layer.addedRobotVisualizations)
+        for (const auto & i : layer.addedRobotVisualizations)
         {
             removeRobotVisu(layerName, i.first);
         }
 
-        for (const auto& i : layer.addedCustomVisualizations)
+        for (const auto & i : layer.addedCustomVisualizations)
         {
             removeCustomVisu(layerName, i.first);
         }
@@ -2155,74 +2176,74 @@ namespace armarx
         // check for clear&remove
         //(updates only contain elements to add for each layer after the last clear for this layer was executed)
         //this prevents a sequence add,clear,add to result in an empty layer
-        for (const auto& layer : accumulatedUpdateData.clearLayers)
+        for (const auto & layer : accumulatedUpdateData.clearLayers)
         {
             clearLayerQt(layer);
         }
         accumulatedUpdateData.clearLayers.clear();
 
-        for (const auto& layer : accumulatedUpdateData.removeLayers)
+        for (const auto & layer : accumulatedUpdateData.removeLayers)
         {
             removeLayerQt(layer);
         }
         accumulatedUpdateData.removeLayers.clear();
 
         //add elements
-        for (auto& e : accumulatedUpdateData.coord)
+        for (auto & e : accumulatedUpdateData.coord)
         {
             drawCoordSystem(e.second);
         }
         accumulatedUpdateData.coord.clear();
 
-        for (auto& e : accumulatedUpdateData.box)
+        for (auto & e : accumulatedUpdateData.box)
         {
             drawBox(e.second);
         }
         accumulatedUpdateData.box.clear();
 
-        for (auto& e : accumulatedUpdateData.line)
+        for (auto & e : accumulatedUpdateData.line)
         {
             drawLine(e.second);
         }
         accumulatedUpdateData.line.clear();
 
-        for (auto& e : accumulatedUpdateData.lineSet)
+        for (auto & e : accumulatedUpdateData.lineSet)
         {
             drawLineSet(e.second);
         }
         accumulatedUpdateData.lineSet.clear();
 
-        for (auto& e : accumulatedUpdateData.sphere)
+        for (auto & e : accumulatedUpdateData.sphere)
         {
             drawSphere(e.second);
         }
         accumulatedUpdateData.sphere.clear();
 
-        for (auto& e : accumulatedUpdateData.cylinder)
+        for (auto & e : accumulatedUpdateData.cylinder)
         {
             drawCylinder(e.second);
         }
         accumulatedUpdateData.cylinder.clear();
 
-        for (auto& e : accumulatedUpdateData.text)
+        for (auto & e : accumulatedUpdateData.text)
         {
             drawText(e.second);
         }
         accumulatedUpdateData.text.clear();
 
-        for (auto& e : accumulatedUpdateData.pointcloud)
+        for (auto & e : accumulatedUpdateData.pointcloud)
         {
             drawPointCloud(e.second);
         }
         accumulatedUpdateData.pointcloud.clear();
 
-        for (auto& e : accumulatedUpdateData.polygons)
+        for (auto & e : accumulatedUpdateData.polygons)
         {
             drawPolygon(e.second);
         }
         accumulatedUpdateData.polygons.clear();
 
-        for (auto& e : accumulatedUpdateData.arrows)
+        for (auto & e : accumulatedUpdateData.arrows)
         {
             drawArrow(e.second);
         }
@@ -2234,7 +2255,7 @@ namespace armarx
         }
         accumulatedUpdateData.triMeshes.clear();
 
-        for (auto& e : accumulatedUpdateData.robots)
+        for (auto & e : accumulatedUpdateData.robots)
         {
             ARMARX_DEBUG << "update visu / drawRobot for robot " << e.first;
             ensureExistingRobotNodes(e.second);
@@ -2243,13 +2264,13 @@ namespace armarx
         }
         accumulatedUpdateData.robots.clear();
 
-        for (auto& e : accumulatedUpdateData.coloredpointcloud)
+        for (auto & e : accumulatedUpdateData.coloredpointcloud)
         {
             drawColoredPointCloud(e.second);
         }
         accumulatedUpdateData.coloredpointcloud.clear();
 
-        for (auto& e : accumulatedUpdateData.colored24Bitpointcloud)
+        for (auto & e : accumulatedUpdateData.colored24Bitpointcloud)
         {
             draw24BitColoredPointCloud(e.second);
         }
@@ -2354,7 +2375,7 @@ namespace armarx
         ScopedRecursiveLockPtr l = getScopedVisuLock();
         Ice::StringSeq seq {};
 
-        for (const auto& layer : layers)
+        for (const auto & layer : layers)
         {
             seq.push_back(layer.first);
         }
@@ -2367,7 +2388,7 @@ namespace armarx
         ::armarx::LayerInformationSequence seq {};
         ScopedRecursiveLockPtr l = getScopedVisuLock();
 
-        for (const auto& layer : layers)
+        for (const auto & layer : layers)
         {
             int count = layer.second.addedCoordVisualizations.size() +
                         layer.second.addedLineVisualizations.size() +
diff --git a/source/RobotAPI/components/RobotState/SharedRobotServants.cpp b/source/RobotAPI/components/RobotState/SharedRobotServants.cpp
index 3f78deea41d9139c9248fc10024d6b73ed38c5d2..94d35b724d947e9c1cfd7e2351e1c5fdd18aa943 100644
--- a/source/RobotAPI/components/RobotState/SharedRobotServants.cpp
+++ b/source/RobotAPI/components/RobotState/SharedRobotServants.cpp
@@ -277,6 +277,32 @@ namespace armarx
         return _node->getJointLimitLow();
     }
 
+    Vector3BasePtr SharedRobotNodeServant::getCoM(const Current& current) const
+    {
+        ReadLockPtr lock = _node->getRobot()->getReadLock();
+        return new Vector3(_node->getCoMLocal());
+    }
+
+    FloatSeq SharedRobotNodeServant::getInertia(const Current& current) const
+    {
+        ReadLockPtr lock = _node->getRobot()->getReadLock();
+        FloatSeq result;
+
+        for (int i = 0; i < 3; i++)
+            for (int j = 0; j < 3; j++)
+            {
+                result.push_back(_node->getInertiaMatrix()(i, j));
+            }
+
+        return result;
+    }
+
+    float SharedRobotNodeServant::getMass(const Current& current) const
+    {
+        ReadLockPtr lock = _node->getRobot()->getReadLock();
+        return _node->getMass();
+    }
+
 
     ///////////////////////////////
     // SharedRobotServant
diff --git a/source/RobotAPI/components/RobotState/SharedRobotServants.h b/source/RobotAPI/components/RobotState/SharedRobotServants.h
index ffb43145a0476a69e7969fd716311413f95f0365..bf48eef8e2da125b9d4495bc10fe0ce343308b04 100644
--- a/source/RobotAPI/components/RobotState/SharedRobotServants.h
+++ b/source/RobotAPI/components/RobotState/SharedRobotServants.h
@@ -72,7 +72,7 @@ namespace armarx
      */
     class SharedRobotNodeServant :
         virtual public SharedRobotNodeInterface,
-        public SharedObjectBase
+    public SharedObjectBase
     {
     public:
         SharedRobotNodeServant(VirtualRobot::RobotNodePtr node /*,const Ice::Current & current = Ice::Current()*/);
@@ -98,6 +98,10 @@ namespace armarx
         virtual float getJointLimitHigh(const Ice::Current& current = Ice::Current()) const;
         virtual float getJointLimitLow(const Ice::Current& current = Ice::Current()) const;
 
+        virtual Vector3BasePtr getCoM(const Ice::Current& current = Ice::Current()) const;
+        virtual Ice::FloatSeq getInertia(const Ice::Current& current = Ice::Current()) const;
+        virtual float getMass(const Ice::Current& current = Ice::Current()) const;
+
 
 
     protected:
diff --git a/source/RobotAPI/interface/core/RobotState.ice b/source/RobotAPI/interface/core/RobotState.ice
index 8db9ea88f97194426603e449fe9f149bf3e82f33..056ef0c53f99599b49bf7b8ed7d7f6d846cbf504 100644
--- a/source/RobotAPI/interface/core/RobotState.ice
+++ b/source/RobotAPI/interface/core/RobotState.ice
@@ -28,6 +28,8 @@
 #include <RobotAPI/interface/units/PlatformUnitInterface.ice>
 #include <RobotAPI/interface/core/FramedPoseBase.ice>
 #include <ArmarXCore/interface/observers/Timestamp.ice>
+#include <ArmarXCore/interface/core/BasicTypes.ice>
+#include <Ice/BuiltinSequences.ice>
 
 module armarx
 {
@@ -115,6 +117,15 @@ module armarx
         ["cpp:const"] idempotent
         float getJointLimitLow();
 
+        ["cpp:const"] idempotent
+        Vector3Base getCoM();
+
+        ["cpp:const"] idempotent
+        Ice::FloatSeq getInertia();
+
+        ["cpp:const"] idempotent
+        float getMass();
+
     };
 
 
diff --git a/source/RobotAPI/libraries/core/remoterobot/RemoteRobot.cpp b/source/RobotAPI/libraries/core/remoterobot/RemoteRobot.cpp
index a75392014800b19193af241b99232e4ef240b2d9..3cb73dba296fc23c108ab0d74f929323af6b8b13 100644
--- a/source/RobotAPI/libraries/core/remoterobot/RemoteRobot.cpp
+++ b/source/RobotAPI/libraries/core/remoterobot/RemoteRobot.cpp
@@ -234,6 +234,16 @@ namespace armarx
 
         JointType jt = remoteNode->getType();
 
+        SceneObject::Physics physics;
+        physics.localCoM = Vector3Ptr::dynamicCast(remoteNode->getCoM())->toEigen();
+        std::vector<float> inertia = remoteNode->getInertia();
+        for (int i = 0; i < 3; i++)
+            for (int j = 0; j < 3; j++)
+            {
+                physics.inertiaMatrix(i, j) = inertia.at(i * 3 + j);
+            }
+        physics.massKg = remoteNode->getMass();
+
         switch (jt)
         {
             case ePrismatic:
@@ -248,13 +258,13 @@ namespace armarx
                 axis = result4f.block(0, 0, 3, 1);
 
                 result = prismaticNodeFactory->createRobotNode(robo, name, VirtualRobot::VisualizationNodePtr(), VirtualRobot::CollisionModelPtr(),
-                         jvLo, jvHi, jointOffset, idMatrix, idVec3, axis);
+                         jvLo, jvHi, jointOffset, idMatrix, idVec3, axis, physics);
             }
             break;
 
             case eFixed:
                 result = fixedNodeFactory->createRobotNode(robo, name, VirtualRobot::VisualizationNodePtr(), VirtualRobot::CollisionModelPtr(), 0,
-                         0, 0, localTransform, idVec3, idVec3);
+                         0, 0, localTransform, idVec3, idVec3, physics);
                 break;
 
             case eRevolute:
@@ -269,7 +279,7 @@ namespace armarx
                 axis = result4f.block(0, 0, 3, 1);
 
                 result = revoluteNodeFactory->createRobotNode(robo, name, VirtualRobot::VisualizationNodePtr(), VirtualRobot::CollisionModelPtr(),
-                         jvLo, jvHi, jointOffset, localTransform, axis, idVec3);
+                         jvLo, jvHi, jointOffset, localTransform, axis, idVec3, physics);
             }
             break;