diff --git a/VirtualRobot/BoundingBox.cpp b/VirtualRobot/BoundingBox.cpp
index 6102408f982a95de75a29a5bc06f7377fbeebb67..f2d8a7338fcd1a9e20c97fa6669967b00d9828d3 100644
--- a/VirtualRobot/BoundingBox.cpp
+++ b/VirtualRobot/BoundingBox.cpp
@@ -144,5 +144,14 @@ void BoundingBox::transform( Eigen::Matrix4f &pose )
 	}
 }
 
+void BoundingBox::scale( Eigen::Vector3f &scaleFactor )
+{
+    for (int i=0;i<3;i++)
+    {
+        min(i) *= scaleFactor(i);
+        max(i) *= scaleFactor(i);
+    }
+}
+
 
 }
diff --git a/VirtualRobot/BoundingBox.h b/VirtualRobot/BoundingBox.h
index 692a76cd4d18e57f9064aede0aa8b467f06ec457..c5d644e0a3083c45324b15f183692f633f1cfcd1 100644
--- a/VirtualRobot/BoundingBox.h
+++ b/VirtualRobot/BoundingBox.h
@@ -88,6 +88,8 @@ public:
 	*/
 	void transform(Eigen::Matrix4f &pose);
 
+    void scale (Eigen::Vector3f &scaleFactor);
+
 protected:
 	Eigen::Vector3f min;
 	Eigen::Vector3f max;
diff --git a/VirtualRobot/CollisionDetection/CollisionModel.cpp b/VirtualRobot/CollisionDetection/CollisionModel.cpp
index 0a8bde0d5ca45621cf458d7eb18c0ec7d4178c5a..f59be1f33d23918ff78490bd78fd681fb67e3f91 100644
--- a/VirtualRobot/CollisionDetection/CollisionModel.cpp
+++ b/VirtualRobot/CollisionDetection/CollisionModel.cpp
@@ -26,7 +26,6 @@ CollisionModel::CollisionModel(VisualizationNodePtr visu, const std::string &nam
 		VR_WARNING << "no col checker..." << endl;
 	}
 
-	TriMeshModelPtr model;
 	visualization = visu;
 	updateVisualization = true;
 	if (visualization)
@@ -250,6 +249,22 @@ bool CollisionModel::saveModel( const std::string &modelPath, const std::string
     return true; // no model given
 }
 
+void CollisionModel::scale( Eigen::Vector3f &scaleFactor )
+{
+    if (model)
+    {
+        TriMeshModelPtr modelScaled = model->clone(scaleFactor);
+        bbox = modelScaled->boundingBox;
+#if defined(VR_COLLISION_DETECTION_PQP)
+        collisionModelImplementation.reset(new CollisionModelPQP(modelScaled, colChecker,id));
+#else
+        collisionModelImplementation.reset(new CollisionModelDummy(modelScaled, colChecker,id));
+#endif
+    }
+    if (visualization)
+        visualization->scale(scaleFactor);
+}
+
 /*
 void CollisionModel::GetAABB( SbBox3f& store_aabb )
 {
diff --git a/VirtualRobot/CollisionDetection/CollisionModel.h b/VirtualRobot/CollisionDetection/CollisionModel.h
index c94433de87667a5168dc7a41f972b335be8bf626..f0cbff97a8926a3878a10ae8c42a526140d30ff0 100644
--- a/VirtualRobot/CollisionDetection/CollisionModel.h
+++ b/VirtualRobot/CollisionDetection/CollisionModel.h
@@ -138,6 +138,7 @@ public:
     */
     virtual bool saveModel(const std::string &modelPath, const std::string &filename);
 
+    virtual void scale(Eigen::Vector3f &scaleFactor);
 
 protected:
 
@@ -146,6 +147,7 @@ protected:
 	VisualizationNodePtr visualization;			// this is the original visualization
 	VisualizationNodePtr modelVisualization;	// this is the visualization of the trimeshmodel
 	bool updateVisualization;
+    TriMeshModelPtr model;
 
 	BoundingBox bbox;
 
diff --git a/VirtualRobot/CollisionDetection/CollisionModelImplementation.h b/VirtualRobot/CollisionDetection/CollisionModelImplementation.h
index 1816aac9ae352037108ef09b557e253f58e469e3..3b2083f4a2de0aa428db012634492b6b179825a6 100644
--- a/VirtualRobot/CollisionDetection/CollisionModelImplementation.h
+++ b/VirtualRobot/CollisionDetection/CollisionModelImplementation.h
@@ -69,6 +69,7 @@ public:
 	virtual void print() {cout << "Dummy Collision Model Implementation..." << endl;};
 
 	TriMeshModelPtr getTriMeshModel(){return modelData;}
+
 protected:
 
 	//! delete all data
diff --git a/VirtualRobot/CollisionDetection/PQP/CollisionModelPQP.cpp b/VirtualRobot/CollisionDetection/PQP/CollisionModelPQP.cpp
index 6da416fb4c7f243cc2a1fb6082b163189b69c93b..3af35178583e5b76be6e00b7817cd3cd226d6760 100644
--- a/VirtualRobot/CollisionDetection/PQP/CollisionModelPQP.cpp
+++ b/VirtualRobot/CollisionDetection/PQP/CollisionModelPQP.cpp
@@ -99,4 +99,5 @@ void CollisionModelPQP::print()
 	cout << endl;
 }
 
+
 } // namespace
diff --git a/VirtualRobot/CollisionDetection/PQP/CollisionModelPQP.h b/VirtualRobot/CollisionDetection/PQP/CollisionModelPQP.h
index bf8623f9ef0bee88d4efdd8f069bd3327359d806..318d0adc031495319bc836f1a96b12ce5c2a527f 100644
--- a/VirtualRobot/CollisionDetection/PQP/CollisionModelPQP.h
+++ b/VirtualRobot/CollisionDetection/PQP/CollisionModelPQP.h
@@ -42,7 +42,7 @@ class CollisionChecker;
 class CollisionCheckerPQP;
 
 /*!
-	A PQP related implementaion of a collision model.
+	A PQP related implementation of a collision model.
 */
 class VIRTUAL_ROBOT_IMPORT_EXPORT CollisionModelPQP : public CollisionModelImplementation
 {
diff --git a/VirtualRobot/Nodes/RobotNodePrismatic.cpp b/VirtualRobot/Nodes/RobotNodePrismatic.cpp
index 82d94669cd31822ed34ef4df375e45d45782b0ce..1c9f5867af22c7fb2069bb4fb2d5944de3667d8b 100644
--- a/VirtualRobot/Nodes/RobotNodePrismatic.cpp
+++ b/VirtualRobot/Nodes/RobotNodePrismatic.cpp
@@ -24,6 +24,8 @@ RobotNodePrismatic::RobotNodePrismatic(RobotWeakPtr rob,
 	) : RobotNode(rob,name,jointLimitLo,jointLimitHi,visualization,collisionModel,jointValueOffset,p,colChecker,type)
 {
 	initialized = false;
+    visuScaling = false;
+    visuScaleFactor << 1.0f,1.0f,1.0f;
 	optionalDHParameter.isSet = false;
 	this->localTransformation = preJointTransform;
 	this->jointTranslationDirection = translationDirection;
@@ -80,13 +82,32 @@ RobotNodePrismatic::~RobotNodePrismatic()
 
 bool RobotNodePrismatic::initialize(SceneObjectPtr parent, const std::vector<SceneObjectPtr> &children)
 {
-	return RobotNode::initialize(parent,children);
+	bool res = RobotNode::initialize(parent,children);
+    unscaledLocalCoM = physics.localCoM;
+    return res;
 }
 
 void RobotNodePrismatic::updateTransformationMatrices(const Eigen::Matrix4f &parentPose)
 {
 	Eigen::Affine3f tmpT(Eigen::Translation3f((this->getJointValue()+jointValueOffset)*jointTranslationDirection));
 	globalPose = parentPose * getLocalTransformation() * tmpT.matrix();
+    if (visuScaling)
+    {
+        float scValue = 0;
+        if (jointValueOffset==0)
+            scValue = jointValue;
+        else
+            scValue = (jointValue) / jointValueOffset;
+        Eigen::Vector3f scVec;
+        for (int i=0;i<3;i++)
+            scVec(i) = 1.0f + visuScaleFactor(i) * scValue;
+        if (visualizationModel)
+            visualizationModel->scale(scVec);
+        if (collisionModel)
+            collisionModel->scale(scVec);
+        for (int i=0;i<3;i++)
+            physics.localCoM(i) = unscaledLocalCoM(i) * scVec(i);
+    }
 }
 
 void RobotNodePrismatic::print( bool printChildren, bool printDecoration ) const
@@ -98,7 +119,12 @@ void RobotNodePrismatic::print( bool printChildren, bool printDecoration ) const
 
 	RobotNode::print(false,false);
 
-	cout << "* jointTranslationDirection: " << jointTranslationDirection[0] << ", " << jointTranslationDirection[1] << "," << jointTranslationDirection[2] << endl;
+    cout << "* jointTranslationDirection: " << jointTranslationDirection[0] << ", " << jointTranslationDirection[1] << "," << jointTranslationDirection[2] << endl;
+    cout << "* VisuScaling: ";
+    if (visuScaling)
+        cout << visuScaleFactor[0] << ", " << visuScaleFactor[1] << "," << visuScaleFactor[2] << endl;
+    else
+        cout << "disabled" << endl;
 
 	if (printDecoration)
 		cout << "******** End RobotNodePrismatic ********" << endl;
@@ -111,7 +137,7 @@ void RobotNodePrismatic::print( bool printChildren, bool printDecoration ) const
 
 RobotNodePtr RobotNodePrismatic::_clone(const RobotPtr newRobot, const VisualizationNodePtr visualizationModel, const CollisionModelPtr collisionModel, CollisionCheckerPtr colChecker, float scaling)
 {
-	RobotNodePtr result;
+	boost::shared_ptr<RobotNodePrismatic> result;
 	ReadLockPtr lock = getRobot()->getReadLock();
 	Physics p = physics.scale(scaling);
 	if (optionalDHParameter.isSet)
@@ -123,6 +149,10 @@ RobotNodePtr RobotNodePrismatic::_clone(const RobotPtr newRobot, const Visualiza
 		lt.block(0,3,3,1) *= scaling;
 		result.reset(new RobotNodePrismatic(newRobot,name,jointLimitLo,jointLimitHi,lt,jointTranslationDirection,visualizationModel,collisionModel,jointValueOffset,p,colChecker,nodeType));
 	}
+    if (result && visuScaling)
+    {
+        result->setVisuScaleFactor(visuScaleFactor);
+    }
 	return result;
 }
 
@@ -211,6 +241,17 @@ std::string RobotNodePrismatic::_toXML( const std::string &modelPath )
     return ss.str();
 }
 
+void RobotNodePrismatic::setVisuScaleFactor( Eigen::Vector3f &scaleFactor )
+{
+    if (scaleFactor.norm()==0.0f)
+        visuScaling = false;
+    else
+    {
+        visuScaling = true;
+        visuScaleFactor = scaleFactor;
+    }
+}
+
 
 
 } // namespace
diff --git a/VirtualRobot/Nodes/RobotNodePrismatic.h b/VirtualRobot/Nodes/RobotNodePrismatic.h
index 2bcddca7721e92d8cbe45e2563b10534790b9743..eabf9b034198a749934cea184637ccfe7f542eba 100644
--- a/VirtualRobot/Nodes/RobotNodePrismatic.h
+++ b/VirtualRobot/Nodes/RobotNodePrismatic.h
@@ -97,6 +97,15 @@ public:
 	*/
 	Eigen::Vector3f getJointTranslationDirectionJointCoordSystem() const;
 
+    /*!
+        Enables scaling of visualization and collision model according to joint value.
+        The jointOffset is used to determine the unscaled value.
+        Be careful, the scaling triggers a computation of the collision model, which may be time consuming.
+        \param scaleFactor If (0,0,0), the scaling is disabled, otherwise the value indicates the scale factors for each dimension.
+
+    */
+    void setVisuScaleFactor(Eigen::Vector3f &scaleFactor);
+
 protected:
 	/*!
 		Can be called by a RobotNodeActuator in order to set the pose of this node.
@@ -120,6 +129,10 @@ protected:
     */
     virtual std::string _toXML(const std::string &modelPath);
 
+    bool visuScaling;
+    Eigen::Vector3f visuScaleFactor;
+    Eigen::Vector3f unscaledLocalCoM;
+
 };
 
 } // namespace VirtualRobot
diff --git a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationNode.cpp b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationNode.cpp
index e8e1f6c4c16ac84c81a22cedbb02fa134a2e076c..c6d9ba7236a0f692abd9bda912ab9d92c550e91d 100644
--- a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationNode.cpp
+++ b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationNode.cpp
@@ -48,7 +48,13 @@ CoinVisualizationNode::CoinVisualizationNode(SoNode* visualizationNode) :
 		visualization = new SoSeparator(); // create dummy node
 
 	visualization->ref();
-	visualizationAtGlobalPose->addChild(visualization);
+    scaledVisualization = new SoSeparator;
+    scaledVisualization->ref();
+    scaling = new SoScale;
+    scaling->scaleFactor.setValue(1.0f,1.0f,1.0f);
+    scaledVisualization->addChild(scaling);
+    scaledVisualization->addChild(visualization);
+	visualizationAtGlobalPose->addChild(scaledVisualization);
 
 }
 
@@ -65,6 +71,8 @@ CoinVisualizationNode::~CoinVisualizationNode()
 		attachedVisualizationsSeparator->unref();
 	if (visualizationAtGlobalPose)
 		visualizationAtGlobalPose->unref();
+    if (scaledVisualization)
+        scaledVisualization->unref();
 }
 
 /*
@@ -116,7 +124,7 @@ TriMeshModelPtr CoinVisualizationNode::getTriMeshModel()
  * CoinVisualizationNode::triMeshModel.
  * If CoinVisualizationMode::visualization is invalid VirtualRobotException
  * is thrown.
- * Otherwise CoinVisualizationNode::InentorTriangleCB() is called on the
+ * Otherwise CoinVisualizationNode::InventorTriangleCB() is called on the
  * Inventor graph stored in CoinVisualizationNode::visualization.
  */
 void CoinVisualizationNode::createTriMeshModel()
@@ -306,10 +314,10 @@ void CoinVisualizationNode::setupVisualization( bool showVisualization, bool sho
 		visualizationAtGlobalPose->removeChild(attachedVisualizationsSeparator);
 
 
-	if (showVisualization && visualizationAtGlobalPose->findChild(visualization)<0)
-		visualizationAtGlobalPose->addChild(visualization);
-	if (!showVisualization && visualizationAtGlobalPose->findChild(visualization)>=0)
-		visualizationAtGlobalPose->removeChild(visualization);
+	if (showVisualization && visualizationAtGlobalPose->findChild(scaledVisualization)<0)
+		visualizationAtGlobalPose->addChild(scaledVisualization);
+	if (!showVisualization && visualizationAtGlobalPose->findChild(scaledVisualization)>=0)
+		visualizationAtGlobalPose->removeChild(scaledVisualization);
 }
 
 void CoinVisualizationNode::setVisualization( SoNode* newVisu )
@@ -375,4 +383,10 @@ bool CoinVisualizationNode::saveModel(const std::string &modelPath, const std::s
     return true;
 }
 
+void CoinVisualizationNode::scale( Eigen::Vector3f &scaleFactor )
+{
+    scaling->scaleFactor.setValue(scaleFactor(0),scaleFactor(1),scaleFactor(2));
+    triMeshModel.reset();
+}
+
 } // namespace VirtualRobot
diff --git a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationNode.h b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationNode.h
index f35d5b40b6ab8af3b4cca3dae9a40c0312a46d46..c23984fe0b7d6b0443fd2239d8d119ebcbc15b1e 100644
--- a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationNode.h
+++ b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationNode.h
@@ -31,6 +31,7 @@
 
 class SoNode;
 class SoSeparator;
+class SoScale;
 class SoCallbackAction;
 class SoPrimitiveVertex;
 class SoMatrixTransform;
@@ -53,6 +54,8 @@ public:
 
 	virtual void print();
 
+    virtual void scale(Eigen::Vector3f &scaleFactor);
+
 	/*!
 		Attach an optional visualization to this VisualizationNode. The attached visualizations will not show up in the TriMeshModel.
 		If there is already a visualization attached with the given name, it is quietly replaced.
@@ -101,10 +104,12 @@ protected:
 	SoNode* visualization;
 	SoSeparator* visualizationAtGlobalPose;
 	SoSeparator* attachedVisualizationsSeparator;
+    SoSeparator* scaledVisualization;
 	std::map< std::string, SoNode* > attachedCoinVisualizations;	//< These optional visualizations will not show up in the TriMeshModel
 
 	SoMatrixTransform *globalPoseTransform;
-	TriMeshModelPtr triMeshModel;
+    TriMeshModelPtr triMeshModel;
+    SoScale* scaling;
 
 	static void InventorTriangleCB(void* data, SoCallbackAction* action,
 	                               const SoPrimitiveVertex* v1,
diff --git a/VirtualRobot/Visualization/TriMeshModel.cpp b/VirtualRobot/Visualization/TriMeshModel.cpp
index ec3498c56ae58e413d856e73ec9ec51c1206c68e..6afc7881f8883d538e8b50d248d403c99c2e5252 100644
--- a/VirtualRobot/Visualization/TriMeshModel.cpp
+++ b/VirtualRobot/Visualization/TriMeshModel.cpp
@@ -286,5 +286,36 @@ void TriMeshModel::print()
 	cout.precision(pr);
 }
 
+void TriMeshModel::scale( Eigen::Vector3f &scaleFactor )
+{
+    if (scaleFactor(0) == 1.0f && scaleFactor(1) == 1.0f && scaleFactor(2) == 1.0f)
+        return;
+    for (size_t i=0; i < vertices.size(); i++)
+    {
+        for (int j=0;j<3;j++)
+        {
+            vertices[i][j] *= scaleFactor(j);
+        }
+    }
+    boundingBox.scale(scaleFactor);
+}
+
+VirtualRobot::TriMeshModelPtr TriMeshModel::clone()
+{
+    Eigen::Vector3f scaleFactor;
+    scaleFactor << 1.0f,1.0f,1.0f;
+    return clone(scaleFactor);
+}
+
+VirtualRobot::TriMeshModelPtr TriMeshModel::clone( Eigen::Vector3f &scaleFactor )
+{
+    TriMeshModelPtr r(new TriMeshModel());
+    r->vertices = vertices;
+    r->faces = faces;
+    r->boundingBox = boundingBox;
+    r->scale(scaleFactor);
+    return r;
+}
+
 
 } // namespace VirtualRobot
diff --git a/VirtualRobot/Visualization/TriMeshModel.h b/VirtualRobot/Visualization/TriMeshModel.h
index 00b4937fd4bc0c8a66f92763dc599cee5dc47026..e6cb80afe037cd89ce3aecd1f1c65757e1f7a53e 100644
--- a/VirtualRobot/Visualization/TriMeshModel.h
+++ b/VirtualRobot/Visualization/TriMeshModel.h
@@ -51,6 +51,10 @@ public:
 	bool checkFacesHaveSameEdge(const MathTools::TriangleFace& face1, const MathTools::TriangleFace& face2, std::vector<std::pair<int, int> >& commonVertexIds) const;
 	unsigned int checkAndCorrectNormals(bool inverted);
 
+    virtual void scale(Eigen::Vector3f &scaleFactor);
+    TriMeshModelPtr clone ();
+    TriMeshModelPtr clone (Eigen::Vector3f &scaleFactor);
+
 	std::vector<Eigen::Vector3f> vertices;
 	std::vector<MathTools::TriangleFace> faces;
 	BoundingBox boundingBox;
diff --git a/VirtualRobot/Visualization/VisualizationNode.cpp b/VirtualRobot/Visualization/VisualizationNode.cpp
index a8e0a16acb326de756fc99636ffea9c3632da8e7..dc9f441cdfe4d5b34f9bf80534054f2fd1c3e58e 100644
--- a/VirtualRobot/Visualization/VisualizationNode.cpp
+++ b/VirtualRobot/Visualization/VisualizationNode.cpp
@@ -205,5 +205,10 @@ bool VisualizationNode::saveModel(const std::string &modelPath, const std::strin
 	return false;
 }
 
+void VisualizationNode::scale( Eigen::Vector3f &scaleFactor )
+{
+    VR_WARNING << "not implemented..." << endl;
+}
+
 
 } // namespace VirtualRobot
diff --git a/VirtualRobot/Visualization/VisualizationNode.h b/VirtualRobot/Visualization/VisualizationNode.h
index 7f9c0e43e988c08df168d39c02b590af2ea9c748..57608b8a8a58496ebc624d7836e7bda7f9eccb1b 100644
--- a/VirtualRobot/Visualization/VisualizationNode.h
+++ b/VirtualRobot/Visualization/VisualizationNode.h
@@ -143,6 +143,8 @@ public:
     */
 	virtual bool saveModel(const std::string &modelPath, const std::string &filename);
 
+    virtual void scale(Eigen::Vector3f &scaleFactor);
+
 protected:
 	bool boundingBox; //!< Indicates, if the bounding box model was used
 	std::string filename; //!< if the visualization was build from a file, the filename is stored here
diff --git a/VirtualRobot/XML/RobotIO.cpp b/VirtualRobot/XML/RobotIO.cpp
index d663b93b75ce2c6c05a38a6feec87fc5cf937a89..0c7a69ce5b16f2e5b95b39b4962f5bb67dc60983 100644
--- a/VirtualRobot/XML/RobotIO.cpp
+++ b/VirtualRobot/XML/RobotIO.cpp
@@ -8,6 +8,7 @@
 #include "../Nodes/RobotNodeFactory.h"
 #include "../Nodes/SensorFactory.h"
 #include "../Nodes/RobotNodeFixedFactory.h"
+#include "../Nodes/RobotNodePrismatic.h"
 #include "../Transformation/DHParameter.h"
 #include "../Visualization/VisualizationFactory.h"
 #include "../Visualization/TriMeshModel.h"
@@ -196,6 +197,7 @@ RobotNodePtr RobotIO::processJointNode(rapidxml::xml_node<char> *jointXMLNode, c
 
 	rapidxml::xml_attribute<> *attr;
 	float jointOffset = 0.0f;
+    float initialvalue = 0.0f;
 	std::string jointType;
 
 	RobotNodePtr robotNode;
@@ -219,11 +221,17 @@ RobotNodePtr RobotIO::processJointNode(rapidxml::xml_node<char> *jointXMLNode, c
 		jointType = RobotNodeFixedFactory::getName();
 	}
 
-	attr = jointXMLNode->first_attribute("offset", 0, false);
-	if (attr)
-	{
-		jointOffset = convertToFloat(attr->value());
-	}
+    attr = jointXMLNode->first_attribute("offset", 0, false);
+    if (attr)
+    {
+        jointOffset = convertToFloat(attr->value());
+    }
+
+    attr = jointXMLNode->first_attribute("initialvalue", 0, false);
+    if (attr)
+    {
+        initialvalue = convertToFloat(attr->value());
+    }
 
 	rapidxml::xml_node<>* node = jointXMLNode->first_node();
 		rapidxml::xml_node<> *tmpXMLNodeAxis = NULL;
@@ -233,6 +241,8 @@ RobotNodePtr RobotIO::processJointNode(rapidxml::xml_node<char> *jointXMLNode, c
 	float maxVelocity = 1.0f; // m/s
 	float maxAcceleration = 1.0f; // m/s^2
 	float maxTorque = 1.0f; // Nm
+    float scaleVisu = false;
+    Eigen::Vector3f scaleVisuFactor = Eigen::Vector3f::Zero();
 
 	while (node)
 	{
@@ -345,7 +355,13 @@ RobotNodePtr RobotIO::processJointNode(rapidxml::xml_node<char> *jointXMLNode, c
 			if (attrPropa)
 				f = convertToFloat(attrPropa->value());
 			propagateJVFactor.push_back(f);
-		}
+		}else if (nodeName == "scalevisualization")
+		{
+            scaleVisu = true;
+            scaleVisuFactor[0] = getFloatByAttributeName(node, "x");
+            scaleVisuFactor[1] = getFloatByAttributeName(node, "y");
+            scaleVisuFactor[2] = getFloatByAttributeName(node, "z");
+        }
 		else
 		{
 			THROW_VR_EXCEPTION("XML definition <" << nodeName << "> not supported in <Joint> tag of RobotNode <" << robotNodeName << ">." << endl);
@@ -368,6 +384,11 @@ RobotNodePtr RobotIO::processJointNode(rapidxml::xml_node<char> *jointXMLNode, c
 		*/
 		if (jointType=="revolute")
 		{
+            if (scaleVisu)
+            {
+                VR_WARNING << "Ignoring ScaleVisualization in Revolute joint." << endl;
+                scaleVisu = false;
+            }
 			if (tmpXMLNodeAxis)
 			{
 				axis[0] = getFloatByAttributeName(tmpXMLNodeAxis, "x");
@@ -391,6 +412,11 @@ RobotNodePtr RobotIO::processJointNode(rapidxml::xml_node<char> *jointXMLNode, c
 			{
 				THROW_VR_EXCEPTION("Prismatic joint '" << robotNodeName << "' wrongly defined, expecting 'TranslationDirection' tag." << endl);
 			}
+            if (scaleVisu)
+            {
+                THROW_VR_EXCEPTION_IF(scaleVisuFactor.norm() == 0.0f,"Zero scale factor");
+
+            }
 		}
 	//}
 
@@ -413,6 +439,8 @@ RobotNodePtr RobotIO::processJointNode(rapidxml::xml_node<char> *jointXMLNode, c
 	robotNode->setMaxAcceleration(maxAcceleration);
 	robotNode->setMaxTorque(maxTorque);
 
+    robotNode->jointValue = initialvalue;
+
 	if (robotNode->isRotationalJoint() || robotNode->isTranslationalJoint()) 
 	{
 		if (robotNode->jointValue < robotNode->jointLimitLo)
@@ -420,6 +448,12 @@ RobotNodePtr RobotIO::processJointNode(rapidxml::xml_node<char> *jointXMLNode, c
 		else if (robotNode->jointValue > robotNode->jointLimitHi)
 			robotNode->jointValue =robotNode->jointLimitHi;
 	}
+    if (scaleVisu)
+    {
+        boost::shared_ptr<RobotNodePrismatic> rnPM = boost::dynamic_pointer_cast<RobotNodePrismatic>(robotNode);
+        if (rnPM)
+            rnPM->setVisuScaleFactor(scaleVisuFactor);
+    }
 
 	VR_ASSERT (propagateJVName.size() == propagateJVFactor.size());
 	for (size_t i=0;i<propagateJVName.size();i++)
diff --git a/VirtualRobot/data/robots/examples/SimpleRobot/JointTranslation.xml b/VirtualRobot/data/robots/examples/SimpleRobot/JointTranslation.xml
new file mode 100644
index 0000000000000000000000000000000000000000..67b34f62784b89610825fcd11b31bdd6bde1ec59
--- /dev/null
+++ b/VirtualRobot/data/robots/examples/SimpleRobot/JointTranslation.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Robot Type="Simple3DoFRobot" RootNode="Joint1">
+
+	<RobotNode name="Joint1">
+		<Visualization enable="true">
+			 <File type="inventor">box.iv</File>
+			 <UseAsCollisionModel/>
+		</Visualization>
+		<Physics>
+            <CoM location="VisualizationBBoxCenter"/>
+            <Mass value="1" units="kg" />
+        </Physics>
+		<Child name="Joint2"/>
+	</RobotNode>
+	
+	<!--RobotNode name="Joint2a">
+        <Child name="Joint2b"/>
+	</RobotNode-->
+
+	<RobotNode name="Joint2">
+		<Transform>
+            		<translation x="0" y="0" z="3000"/>
+			<rollpitchyaw roll="0" pitch="90" yaw="0" unitsAngle="degree"/>
+		</Transform>
+	    	<Joint type="revolute">
+		    <axis x="1" y="0" z="0"/>
+		    <Limits unit="degree" lo="-90" hi="90"/>
+		</Joint>		
+        	<Child name="Joint3"/>
+	</RobotNode>
+
+
+	<RobotNode name="Joint3">
+	    	<Joint type="prismatic" offset="3000">
+		    	<TranslationDirection x="0" y="0" z="1"/>
+		    	<Limits unit="mm" lo="-1000" hi="4000"/>
+			<ScaleVisualization x="0.1" y="0.1" z="1"/>
+		</Joint>
+		<Visualization enable="true">
+			 <File type="inventor">box2.iv</File>
+			 <UseAsCollisionModel/>
+		</Visualization>
+		<Physics>
+            		<CoM location="VisualizationBBoxCenter"/>
+           	 	<Mass value="1" units="kg" />
+        	</Physics>
+        	<Child name="Joint4"/>
+	</RobotNode>
+
+
+	<RobotNode name="Joint4">
+		<Visualization enable="true">
+			 <File type="inventor">sphere.iv</File>
+			 <UseAsCollisionModel/>
+		</Visualization>
+		<Physics>
+            <CoM location="VisualizationBBoxCenter"/>
+            <Mass value="1" units="kg" />
+        </Physics>
+	</RobotNode>
+
+</Robot>
diff --git a/VirtualRobot/data/robots/examples/SimpleRobot/box2.iv b/VirtualRobot/data/robots/examples/SimpleRobot/box2.iv
new file mode 100644
index 0000000000000000000000000000000000000000..b431e7f53fc00f4e148f3581b643db7e24400d14
--- /dev/null
+++ b/VirtualRobot/data/robots/examples/SimpleRobot/box2.iv
@@ -0,0 +1,19 @@
+#Inventor V2.0 ascii
+
+Separator {
+    
+    Units {
+            units MILLIMETERS
+    }
+    Material {
+        diffuseColor    1 1 1
+    }
+    Translation {
+        translation 0 0 -1500
+    }
+    Cube {
+        width 500
+        height 500
+        depth 3000
+    }
+}
\ No newline at end of file