diff --git a/VirtualRobot/Nodes/RobotNode.cpp b/VirtualRobot/Nodes/RobotNode.cpp
index ae727a7fdca48eaa8501e2070679b9f73a3e9ce2..575095e4bb22a4fda58f37524e1cab73583f37b9 100644
--- a/VirtualRobot/Nodes/RobotNode.cpp
+++ b/VirtualRobot/Nodes/RobotNode.cpp
@@ -511,10 +511,19 @@ void RobotNode::showStructure( bool enable, const std::string &visualizationType
 
 	if (!ensureVisualization(visualizationType))
 		return;
-	std::string attachName1("RobotNodeStructurePre");
+	std::stringstream ss;
+	ss << getName() << "_RobotNodeStructurePre";
+	std::string attachName1 = ss.str();
 	std::string attachName2("RobotNodeStructureJoint");
 	std::string attachName3("RobotNodeStructurePost");
-	visualizationModel->detachVisualization(attachName1);
+	SceneObjectPtr par = getParent();
+	RobotNodePtr parRN = dynamic_pointer_cast<RobotNode>(par);
+
+	// need to add "pre" visualization to parent node!
+	if (parRN && parRN->getVisualization())
+		parRN->getVisualization()->detachVisualization(attachName1);
+	else
+		visualizationModel->detachVisualization(attachName1);
 	visualizationModel->detachVisualization(attachName2);
 	visualizationModel->detachVisualization(attachName3);
 	if (enable)
@@ -535,9 +544,19 @@ void RobotNode::showStructure( bool enable, const std::string &visualizationType
 
 		if (!preJointTransformation.isIdentity())
 		{
-			VisualizationNodePtr visualizationNode1 = visualizationFactory->createLine(preJointTransformation.inverse(),i);
-			if (visualizationNode1)
-				visualizationModel->attachVisualization(attachName1,visualizationNode1);
+			VisualizationNodePtr visualizationNode1;
+			if (parRN && parRN->getVisualization())
+			{
+				// add to parent node (pre joint trafo moves with parent!)
+				visualizationNode1 = visualizationFactory->createLine(parRN->postJointTransformation, parRN->postJointTransformation*preJointTransformation);
+				if (visualizationNode1)
+					parRN->getVisualization()->attachVisualization(attachName1,visualizationNode1);
+			} else
+			{
+				visualizationNode1 = visualizationFactory->createLine(preJointTransformation.inverse(),i);
+				if (visualizationNode1)
+					visualizationModel->attachVisualization(attachName1,visualizationNode1);
+			}
 		}
 		VisualizationNodePtr visualizationNode2 = visualizationFactory->createSphere(5.0f);
 		if (visualizationNode2)
diff --git a/VirtualRobot/SceneObject.cpp b/VirtualRobot/SceneObject.cpp
index 821047795ec4f7a90b82edb85de2c8e3c531a3b1..ee76471a775e8ce6928535c038bb8a63718c3455 100644
--- a/VirtualRobot/SceneObject.cpp
+++ b/VirtualRobot/SceneObject.cpp
@@ -224,14 +224,10 @@ void SceneObject::showPhysicsInformation( bool enableCoM, bool enableInertial, V
 	{
 		visualizationModel->detachVisualization("__InertiaMatrix");
 	}
-	if (enableCoM)
+	VisualizationFactoryPtr visualizationFactory = VisualizationFactory::first(NULL);
+
+	if (enableCoM && visualizationFactory)
 	{
-		VisualizationFactoryPtr visualizationFactory = VisualizationFactory::first(NULL);
-		if (!visualizationFactory)
-		{
-			VR_ERROR << " Could not determine a valid VisualizationFactory!!" << endl;
-			return;
-		}
 		// create visu
 		if (!comModel)
 		{
@@ -242,6 +238,18 @@ void SceneObject::showPhysicsInformation( bool enableCoM, bool enableInertial, V
 			v.push_back(comModel2);
 			comModel = visualizationFactory->createUnitedVisualization(v);
 		}
+
+		if (comModel)
+		{
+			std::stringstream ss;
+			ss << "COM:" << getName();
+			std::string t = ss.str();
+			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);
+			comModel = visualizationFactory->createUnitedVisualization(v);
+		}
 		VisualizationNodePtr comModelClone = comModel->clone();
 		Eigen::Vector3f l = getCoMLocal() * 0.001f;
 		cout << "COM:" << l << endl;
@@ -251,7 +259,7 @@ void SceneObject::showPhysicsInformation( bool enableCoM, bool enableInertial, V
 
 		visualizationModel->attachVisualization("__CoMLocation",comModelClone);
 	}
-	/*if (enableInertial)
+	if (enableInertial && visualizationFactory)
 	{
 		VisualizationFactoryPtr visualizationFactory = VisualizationFactory::first(NULL);
 		if (!visualizationFactory)
@@ -260,41 +268,43 @@ void SceneObject::showPhysicsInformation( bool enableCoM, bool enableInertial, V
 			return;
 		}
 		// create inertia visu
-
+		cout << "INERTIA MATRIX:" << endl << physics.intertiaMatrix << endl;
 		Eigen::SelfAdjointEigenSolver<Eigen::Matrix3f> eigensolver(physics.intertiaMatrix);
 		if (eigensolver.info() == Eigen::Success) 
 		{
-			cout << "The eigenvalues of A are:\n" << eigensolver.eigenvalues() << endl;
+			/*cout << "The eigenvalues of A are:\n" << eigensolver.eigenvalues() << endl;
 			cout << "Here's a matrix whose columns are eigenvectors of A \n"
 				<< "corresponding to these eigenvalues:\n"
-				<< eigensolver.eigenvectors() << endl;
-			Eigen::Vector3f v1 = eigensolver.eigenvectors().block(0,0,1,3);
-			Eigen::Vector3f v2 = eigensolver.eigenvectors().block(0,1,1,3);
-			Eigen::Vector3f v3 = eigensolver.eigenvectors().block(0,2,1,3);
+				<< eigensolver.eigenvectors() << endl;*/
+			Eigen::Vector3f v1 = eigensolver.eigenvectors().block(0,0,3,1);
+			Eigen::Vector3f v2 = eigensolver.eigenvectors().block(0,1,3,1);
+			Eigen::Vector3f v3 = eigensolver.eigenvectors().block(0,2,3,1);
+			/*cout << "v1:" << v1 << endl;
+			cout << "v2:" << v2 << endl;
+			cout << "v3:" << v3 << endl;*/
+
+			float xl = (float)(eigensolver.eigenvalues().rows()>0?eigensolver.eigenvalues()(0):1e-6);
+			float yl = (float)(eigensolver.eigenvalues().rows()>1?eigensolver.eigenvalues()(1):1e-6);
+			float zl = (float)(eigensolver.eigenvalues().rows()>2?eigensolver.eigenvalues()(2):1e-6);
+			float le = sqrtf(xl*xl + yl*yl + zl*zl);
+			float maxSize = le>1e-8?50.0f/le:5000.0f;
+
+			VisualizationNodePtr inertiaVisu = visualizationFactory->createEllipse(xl*maxSize,yl*maxSize,zl*maxSize,true);
+
+			Eigen::Vector3f l = getCoMLocal() * 0.001f;
+			//cout << "COM:" << l << 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
+			visualizationFactory->applyDisplacement(inertiaVisu, m);
+
+			visualizationModel->attachVisualization("__InertiaMatrix",inertiaVisu);
+
 		} else
 		{
 			VR_INFO << " Could not determine eigenvectors of inertia matrix" << endl;
 		}
-
-		VisualizationNodePtr inertiaVisu = visualizationFactory->CreateEllipse
-		if (!comModel)
-		{
-			VisualizationNodePtr comModel1 = visualizationFactory->createSphere(7.05f,1.0f,0.2f,0.2f);
-			VisualizationNodePtr comModel2 = visualizationFactory->createBox(10.0f,10.0f,10.0f,0.2f,0.2f,1.0f);
-			std::vector<VisualizationNodePtr> v;
-			v.push_back(comModel1);
-			v.push_back(comModel2);
-			comModel = visualizationFactory->createUnitedVisualization(v);
-		}
-		VisualizationNodePtr comModelClone = comModel->clone();
-		Eigen::Vector3f l = getCoMLocal() * 0.001f;
-		cout << "COM:" << l << endl;
-		Eigen::Matrix4f m = Eigen::Matrix4f::Identity();
-		m.block(0,3,3,1) = l;
-		visualizationFactory->applyDisplacement(comModelClone, m);
-
-		visualizationModel->attachVisualization("__InertiaMatrix",inertiaVisu);
-	}*/
+	}
 }
 
 bool SceneObject::showCoordinateSystemState()
diff --git a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.cpp b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.cpp
index 9e1cef675eca936bd0b1215a9e715bbe6bcafa4c..e324467da0cf32b17cd0ad83c5c711480f01f161 100644
--- a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.cpp
+++ b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.cpp
@@ -499,39 +499,89 @@ namespace VirtualRobot {
         return result;
     }
 
-    SoSeparator* CoinVisualizationFactory::CreateText(const std::string &s)
+	VisualizationNodePtr CoinVisualizationFactory::createText(const std::string &text, bool billboard, float scaling, Color c, float offsetX, float offsetY, float offsetZ)
+	{
+		SoSeparator* res = new SoSeparator();
+		res->ref();
+		SoUnits *u = new SoUnits();
+		u->units = SoUnits::MILLIMETERS;
+		res->addChild(u);
+		SoScale *sc = new SoScale();
+		sc->scaleFactor.setValue(scaling,scaling,scaling);
+		res->addChild(sc);
+		SoMaterial *m = new SoMaterial();
+		res->addChild(m);
+		m->diffuseColor.setValue(c.r,c.g,c.b);
+		m->transparency.setValue(c.transparency);
+
+		if (billboard)
+			res->addChild(CreateBillboardText(text,offsetX*1000.0f,offsetY*1000.0f,offsetZ*1000.0f));
+		else
+			res->addChild(CreateText(text,offsetX*1000.0f,offsetY*1000.0f,offsetZ*1000.0f));
+
+		VisualizationNodePtr visualizationNode(new CoinVisualizationNode(res));
+		res->unref();
+		return visualizationNode;
+	}
+
+
+	VisualizationNodePtr CoinVisualizationFactory::createEllipse(float x, float y, float z, bool showAxes, float axesHeight, float axesWidth)
+	{
+		SoSeparator* res = new SoSeparator();
+		res->ref();
+		SoUnits *u = new SoUnits();
+		u->units = SoUnits::MILLIMETERS;
+		res->addChild(u);
+		res->addChild(CreateEllipse(x,y,z,NULL,showAxes,axesHeight,axesWidth));
+		VisualizationNodePtr visualizationNode(new CoinVisualizationNode(res));
+		res->unref();
+		return visualizationNode;
+	}
+
+    SoSeparator* CoinVisualizationFactory::CreateText(const std::string &s, float offsetX, float offsetY, float offsetZ)
     {
         SoSeparator *textSep = new SoSeparator();
+		textSep->ref();
+
         SoTranslation *moveT = new SoTranslation();
-        moveT->translation.setValue(0.0020f,0.0020f,0.0f);
-        textSep->addChild(moveT);
-        SoAsciiText *textNode = new SoAsciiText();
+		textSep->addChild(moveT);
+        moveT->translation.setValue(offsetX*0.001f,offsetY*0.001f,offsetZ*0.001f);
+
+		SoAsciiText *textNode = new SoAsciiText();
+		textSep->addChild(textNode);
         /*std::string text2(*text);
         text2.replace( ' ', "_" );*/
         SbString text2(s.c_str());
         text2.apply( &IVToolsHelper_ReplaceSpaceWithUnderscore );
         textNode->string.set(text2.getString());
-        textSep->addChild(textNode);
+        
+		textSep->unrefNoDelete();
         return textSep;
     }
 
-    SoSeparator* CoinVisualizationFactory::CreateBillboardText(const std::string &s)
+    SoSeparator* CoinVisualizationFactory::CreateBillboardText(const std::string &s, float offsetX, float offsetY, float offsetZ)
     {
         SoSeparator *textSep = new SoSeparator();
+		textSep->ref();
+
+        SoTranslation *moveT = new SoTranslation();
+		textSep->addChild(moveT);
+        moveT->translation.setValue(offsetX*0.001f,offsetY*0.001f,offsetZ*0.001f);
+
         SoVRMLBillboard *bb = new SoVRMLBillboard();
         textSep->addChild(bb);
-        SoTranslation *moveT = new SoTranslation();
-        moveT->translation.setValue(0.0020f,0.0020f,0.0f);
-        textSep->addChild(moveT);
         SoAsciiText *textNode = new SoAsciiText();
+		bb->addChild(textNode);
         /*std::string text2(*text);
         text2.replace( ' ', "_" );*/
         SbString text2(s.c_str());
         text2.apply( &IVToolsHelper_ReplaceSpaceWithUnderscore );
         textNode->string.set(text2.getString());
-        bb->addChild(textNode);
-        return textSep;
+
+		textSep->unrefNoDelete();
+		return textSep;
     }
+
     SoSeparator* CoinVisualizationFactory::CreateVertexVisualization( const Eigen::Vector3f &position, float radius, float transparency, float colorR /*= 0.5f*/, float colorG /*= 0.5f*/, float colorB /*= 0.5f*/ )
     {
         SoSeparator *res = new SoSeparator;
diff --git a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.h b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.h
index 9ef6e7643e811d1734a376e5669fba0e5d4c1d4f..da95991bdafb318eedf2b893602a4f73354f3b45 100644
--- a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.h
+++ b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.h
@@ -73,7 +73,18 @@ public:
 	virtual VisualizationNodePtr createPlane(const Eigen::Vector3f &position, const Eigen::Vector3f &normal, float extend, float transparency,  float colorR = 0.5f, float colorG = 0.5f, float colorB = 0.5f);
 	virtual VisualizationNodePtr createArrow(const Eigen::Vector3f &n, float length = 50.0f, float width = 2.0f, const Color &color = Color::Gray());
 	virtual VisualizationNodePtr createTrajectory(TrajectoryPtr t, Color colorNode = Color::Blue(), Color colorLine = Color::Gray(), float nodeSize = 15.0f, float lineSize = 4.0f);
-
+	virtual VisualizationNodePtr createText(const std::string &text, bool billboard = false, float scaling = 1.0f, Color c = Color::Black(), float offsetX = 20.0f, float offsetY = 20.0f, float offsetZ = 0.0f);
+	/*! 
+		Creates an coordinate axis aligned ellipse
+		\param x The extend in x direction must be >= 1e-6
+		\param y The extend in y direction must be >= 1e-6
+		\param z The extend in z direction must be >= 1e-6
+		\param showAxes If true, the axes are visualized
+		\param axesHeight The height of the axes (measured from the body surface)
+		\param axesWidth The width of the axes.
+		\return A VisualizationNode containing the visualization.
+	*/
+	virtual VisualizationNodePtr createEllipse(float x, float y, float z, bool showAxes = true, float axesHeight = 4.0f, float axesWidth = 8.0f);
 	/*!
 		Move local visualization by homogeneous matrix m.
 	*/
@@ -158,8 +169,14 @@ public:
 	*/
 	static SoSeparator* CreateEndEffectorVisualization(EndEffectorPtr eef, SceneObject::VisualizationType = SceneObject::Full);
 
-	static SoSeparator* CreateText(const std::string &s);
-	static SoSeparator* CreateBillboardText(const std::string &s);
+	/*!
+		Text visu. Offsets in mm.
+	*/
+	static SoSeparator* CreateText(const std::string &s, float offsetX = 20.0f, float offsetY = 20.0f, float offsetZ = 0.0f);
+	/*!
+		Billboard Text visu. Offsets in mm.
+	*/
+	static SoSeparator* CreateBillboardText(const std::string &s, float offsetX = 20.0f, float offsetY = 20.0f, float offsetZ = 0.0f);
 
 	/*!
 		Convenient method to retrieve a coin visualization for a robot
diff --git a/VirtualRobot/Visualization/VisualizationFactory.h b/VirtualRobot/Visualization/VisualizationFactory.h
index 90d3302e5bcda2a2fe154805011eb1e71e3e1027..faa612448b1bbf44d2eee4cdc7e684ecd446a2eb 100644
--- a/VirtualRobot/Visualization/VisualizationFactory.h
+++ b/VirtualRobot/Visualization/VisualizationFactory.h
@@ -75,7 +75,18 @@ public:
 	virtual VisualizationNodePtr createPlane(const MathTools::Plane &plane, float extend, float transparency,  float colorR = 0.5f, float colorG = 0.5f, float colorB = 0.5f){return createPlane(plane.p, plane.n,extend,transparency,colorR,colorG,colorB);}
 	virtual VisualizationNodePtr createArrow(const Eigen::Vector3f &n, float length = 50.0f, float width = 2.0f, const Color &color = Color::Gray()){return VisualizationNodePtr();}
 	virtual VisualizationNodePtr createTrajectory(TrajectoryPtr t, Color colorNode = Color::Blue(), Color colorLine = Color::Gray(), float nodeSize = 15.0f, float lineSize = 4.0f){return VisualizationNodePtr();}
-
+	virtual VisualizationNodePtr createText(const std::string &text, bool billboard = false, float scaling = 1.0f, Color c = Color::Black(), float offsetX = 20.0f, float offsetY = 20.0f, float offsetZ = 0.0f){return VisualizationNodePtr();}
+	/*! 
+		Creates an coordinate axis aligned ellipse
+		\param x The extend in x direction must be >= 1e-6
+		\param y The extend in y direction must be >= 1e-6
+		\param z The extend in z direction must be >= 1e-6
+		\param showAxes If true, the axes are visualized
+		\param axesHeight The height of the axes (measured from the body surface)
+		\param axesWidth The width of the axes.
+		\return A VisualizationNode containing the visualization.
+	*/
+	virtual VisualizationNodePtr createEllipse(float x, float y, float z, bool showAxes = true, float axesHeight = 4.0f, float axesWidth = 8.0f){return VisualizationNodePtr();}
 	/*!
 		Move local visualization by homogeneous matrix m.
 	*/
diff --git a/VirtualRobot/XML/BaseIO.cpp b/VirtualRobot/XML/BaseIO.cpp
index fe0393569f5aac2fb1f70ee2bd75fb027f2120f0..ba36ae2b21294f30e354a21e60362130f528b293 100644
--- a/VirtualRobot/XML/BaseIO.cpp
+++ b/VirtualRobot/XML/BaseIO.cpp
@@ -900,7 +900,7 @@ void BaseIO::processPhysicsTag(rapidxml::xml_node<char> *physicsXMLNode, const s
 		}
 		
 	} 
-	rapidxml::xml_node<> *inMatXMLNode = physicsXMLNode->first_node("intertiamatrix",0,false);
+	rapidxml::xml_node<> *inMatXMLNode = physicsXMLNode->first_node("inertiamatrix",0,false);
 	if (inMatXMLNode)
 	{
 		physics.intertiaMatrix = process3x3Matrix(inMatXMLNode);
diff --git a/VirtualRobot/examples/RobotViewer/showRobotWindow.cpp b/VirtualRobot/examples/RobotViewer/showRobotWindow.cpp
index b9ea4a03cca7cc7c73e5b2d07961f7a3863dd8ba..dbc6f8bca18e0ff2c516c0afd7d0c940a9b2389e 100644
--- a/VirtualRobot/examples/RobotViewer/showRobotWindow.cpp
+++ b/VirtualRobot/examples/RobotViewer/showRobotWindow.cpp
@@ -440,6 +440,12 @@ void showRobotWindow::loadRobot()
 		cout << " ERROR while creating robot" << endl;
 		return;
 	}
+	UI.checkBoxColModel->setChecked(false);
+	UI.checkBoxFullModel->setChecked(true);
+	UI.checkBoxPhysics->setChecked(false);
+	UI.checkBoxRobotCoordSystems->setChecked(false);
+	UI.checkBoxShowCoordSystem->setChecked(false);
+	UI.checkBoxStructure->setChecked(false);
 
 	// get nodes
 	robot->getRobotNodes(allRobotNodes);