diff --git a/CMakeModules/SimoxProject.cmake b/CMakeModules/SimoxProject.cmake
index 7bc78b214f1a0294441635d6f654f79f9730fea7..9bc364d02161fc9da5d807952246fc76192eb4e4 100644
--- a/CMakeModules/SimoxProject.cmake
+++ b/CMakeModules/SimoxProject.cmake
@@ -1,5 +1,10 @@
 # Macros for Simox executables
 
+function(simox_add_example PROJECT_NAME SOURCES HEADERS GUI_MOC_HDRS GUI_UIS)
+simox_add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS} ${GUI_MOC_HDRS} ${GUI_UIS})
+SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES FOLDER "Examples")
+endfunction()
+
 function(simox_add_executable PROJECT_NAME SOURCES HEADERS GUI_MOC_HDRS GUI_UIS)
 
     LINK_DIRECTORIES(${SIMOX_LIB_DIR})
@@ -12,12 +17,14 @@ function(simox_add_executable PROJECT_NAME SOURCES HEADERS GUI_MOC_HDRS GUI_UIS)
     include_directories(${UI_HEADER_DIR})
 
     # setup target
+    
     ADD_EXECUTABLE(${PROJECT_NAME} ${SOURCES} ${HEADERS})
     SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${SIMOX_BIN_DIR})
     TARGET_LINK_LIBRARIES(${PROJECT_NAME} VirtualRobot Saba GraspStudio ${SIMOX_VISUALIZATION_LIBS})
     INCLUDE_DIRECTORIES(${SIMOX_VISUALIZATION_INCLUDE_PATHS})
     INCLUDE(${QT_USE_FILE})
     ADD_DEFINITIONS(${SIMOX_VISUALIZATION_COMPILE_FLAGS})
+    SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES FOLDER "Applications")
 
     MESSAGE( STATUS ${PROJECT_NAME} " will be placed into " ${SIMOX_BIN_DIR})
 endfunction()
diff --git a/GraspPlanning/examples/CMakeLists.txt b/GraspPlanning/examples/CMakeLists.txt
index fecde0b4b7b9ff6c7613ba7aa4dcf19b0ce1dcf5..c1abfa61c9d36102f80624fa21538aeba9557af7 100644
--- a/GraspPlanning/examples/CMakeLists.txt
+++ b/GraspPlanning/examples/CMakeLists.txt
@@ -1,5 +1,5 @@
 
-if (SOQT_FOUND)
-	ADD_SUBDIRECTORY(GraspQuality)
-	ADD_SUBDIRECTORY(GraspPlanner)
-endif()	
+
+ADD_SUBDIRECTORY(GraspQuality)
+ADD_SUBDIRECTORY(GraspPlanner)
+
diff --git a/GraspPlanning/examples/GraspPlanner/CMakeLists.txt b/GraspPlanning/examples/GraspPlanner/CMakeLists.txt
index 14c9c5847e7868a49c791ba391d0cf147ffd8be3..9e8773cdb0cea959010681101273b712b0887da2 100644
--- a/GraspPlanning/examples/GraspPlanner/CMakeLists.txt
+++ b/GraspPlanning/examples/GraspPlanner/CMakeLists.txt
@@ -3,12 +3,8 @@ PROJECT ( GraspPlanner )
 CMAKE_MINIMUM_REQUIRED(VERSION 2.6.4)
 
 CMAKE_POLICY(VERSION 2.6)
-
-IF(NOT DEFINED SIMOX_CONFIGURED)
-	INCLUDE(../../config.cmake)
-ENDIF()
 	
-IF(SIMOX_VISUALIZATION)
+IF(SIMOX_VISUALIZATION AND SIMOX_USE_COIN_VISUALIZATION)
 
 	# the variable "demo_SRCS" contains all .cpp files of this project
 	FILE(GLOB demo_SRCS ${PROJECT_SOURCE_DIR}/GraspPlanner.cpp ${PROJECT_SOURCE_DIR}/GraspPlannerWindow.cpp)
@@ -22,8 +18,8 @@ IF(SIMOX_VISUALIZATION)
     )
     
     # create the executable
-    simox_add_executable(${PROJECT_NAME} "${demo_SRCS}" "${demo_INCS}" "${GUI_MOC_HDRS}" "${GUI_UIS}")
+    simox_add_example(${PROJECT_NAME} "${demo_SRCS}" "${demo_INCS}" "${GUI_MOC_HDRS}" "${GUI_UIS}")
     
     # we need the GraspStudio lib
     TARGET_LINK_LIBRARIES(${PROJECT_NAME} GraspStudio)    
-ENDIF(SIMOX_VISUALIZATION)
+ENDIF()
diff --git a/GraspPlanning/examples/GraspQuality/CMakeLists.txt b/GraspPlanning/examples/GraspQuality/CMakeLists.txt
index 6a0b2e47a88d82cdf4bb91b677944ddd9e92517f..6099821406c567d2980c5a32711fd3726759b2e2 100644
--- a/GraspPlanning/examples/GraspQuality/CMakeLists.txt
+++ b/GraspPlanning/examples/GraspQuality/CMakeLists.txt
@@ -4,11 +4,7 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.6.4)
 
 CMAKE_POLICY(VERSION 2.6)
 
-IF(NOT DEFINED SIMOX_CONFIGURED)
-	INCLUDE(../../config.cmake)
-ENDIF()
-	
-IF(SIMOX_VISUALIZATION)
+IF(SIMOX_VISUALIZATION AND SIMOX_USE_COIN_VISUALIZATION)
      
 	# the variable "demo_SRCS" contains all .cpp files of this project
 	FILE(GLOB demo_SRCS ${PROJECT_SOURCE_DIR}/GraspQualityDemo.cpp ${PROJECT_SOURCE_DIR}/GraspQualityWindow.cpp)
@@ -23,8 +19,8 @@ IF(SIMOX_VISUALIZATION)
 
 
     # create the executable
-    simox_add_executable(${PROJECT_NAME} "${demo_SRCS}" "${demo_INCS}" "${GUI_MOC_HDRS}" "${GUI_UIS}")
+    simox_add_example(${PROJECT_NAME} "${demo_SRCS}" "${demo_INCS}" "${GUI_MOC_HDRS}" "${GUI_UIS}")
     
     # we need the GraspStudio lib
     TARGET_LINK_LIBRARIES(${PROJECT_NAME} GraspStudio)    
-ENDIF(SIMOX_VISUALIZATION)
+ENDIF()
diff --git a/MotionPlanning/config.cmake b/MotionPlanning/config.cmake
index 75fa883227f3f511c2ac0f1d373201953a306203..a58132d7127439c67b8b023e579deba0c9fde68c 100644
--- a/MotionPlanning/config.cmake
+++ b/MotionPlanning/config.cmake
@@ -44,5 +44,6 @@ MACRO(ADD_SABA_TEST TEST_NAME)
 	IF(NOT UNIX)
 	   SET_TARGET_PROPERTIES(${TEST_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${SIMOX_BIN_DIR})
 	ENDIF(NOT UNIX)
+	SET_TARGET_PROPERTIES(${TEST_NAME} PROPERTIES FOLDER "Saba Tests")
 	ADD_TEST( Saba_${TEST_NAME} ${TEST_NAME} --output_format=XML --log_level=all --report_level=no)
 ENDMACRO(ADD_SABA_TEST)
diff --git a/MotionPlanning/examples/CMakeLists.txt b/MotionPlanning/examples/CMakeLists.txt
index 8f7c8c78a21670f2def7cb55d1c60ae3ccb66fbe..dd147f58abf64f466b1bff867b1ff902052e9982 100644
--- a/MotionPlanning/examples/CMakeLists.txt
+++ b/MotionPlanning/examples/CMakeLists.txt
@@ -1,6 +1,4 @@
 
-if (SOQT_FOUND)
-	ADD_SUBDIRECTORY(RRT)
-	ADD_SUBDIRECTORY(RrtGui)
-	ADD_SUBDIRECTORY(IKRRT)
-endif()	
+ADD_SUBDIRECTORY(RRT)
+ADD_SUBDIRECTORY(RrtGui)
+ADD_SUBDIRECTORY(IKRRT)
diff --git a/MotionPlanning/examples/IKRRT/CMakeLists.txt b/MotionPlanning/examples/IKRRT/CMakeLists.txt
index 425325df85aed4bb2e58cbcefebb2d2339120b5e..ae6268a23377b3ce094fde97e40fa07381365c14 100644
--- a/MotionPlanning/examples/IKRRT/CMakeLists.txt
+++ b/MotionPlanning/examples/IKRRT/CMakeLists.txt
@@ -4,11 +4,7 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.6.4)
 
 CMAKE_POLICY(VERSION 2.6)
 
-IF(NOT DEFINED VR_CONFIGURED)
-	INCLUDE(../../config.cmake)
-ENDIF()
-
-IF(SIMOX_VISUALIZATION)
+IF(SIMOX_VISUALIZATION AND SIMOX_USE_COIN_VISUALIZATION)
     LINK_DIRECTORIES(${SIMOX_LIB_DIR})
     
 	    
@@ -35,6 +31,7 @@ IF(SIMOX_VISUALIZATION)
 
 
     ADD_EXECUTABLE(${PROJECT_NAME} ${demo_SRCS} ${demo_INCS})
+    SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES FOLDER "Examples")
     SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${SIMOX_BIN_DIR})
 
     TARGET_LINK_LIBRARIES(${PROJECT_NAME} VirtualRobot Saba ${SIMOX_VISUALIZATION_LIBS})
@@ -43,4 +40,4 @@ IF(SIMOX_VISUALIZATION)
     ADD_DEFINITIONS(${SIMOX_VISUALIZATION_COMPILE_FLAGS})
 
     MESSAGE( STATUS ${PROJECT_NAME} " will be placed into " ${SIMOX_BIN_DIR})
-ENDIF(SIMOX_VISUALIZATION)
+ENDIF()
diff --git a/MotionPlanning/examples/RRT/CMakeLists.txt b/MotionPlanning/examples/RRT/CMakeLists.txt
index 4c42747001bcf40dd75dd432fb8472355037a087..ab364f01ea9ff24e4376d344c0f22b5f5c23d4bc 100644
--- a/MotionPlanning/examples/RRT/CMakeLists.txt
+++ b/MotionPlanning/examples/RRT/CMakeLists.txt
@@ -4,17 +4,17 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.6.4)
 
 CMAKE_POLICY(VERSION 2.6)
 
-INCLUDE(${SABA_DIR}/config.cmake)
-
 INCLUDE_DIRECTORIES(${SABA_DIR})
 
-IF(SIMOX_USE_COIN_VISUALIZATION)
+IF(SIMOX_VISUALIZATION AND SIMOX_USE_COIN_VISUALIZATION)
+
     LINK_DIRECTORIES(${SIMOX_LIB_DIR})
 
     # the variable "demo_SRCS" contains all .cpp files of this project
 	FILE(GLOB demo_SRCS ${PROJECT_SOURCE_DIR}/RRTdemo.cpp)
-
+    
     ADD_EXECUTABLE(${PROJECT_NAME} ${demo_SRCS})
+    SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES FOLDER "Examples")
     SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${SIMOX_BIN_DIR})
 
     TARGET_LINK_LIBRARIES(${PROJECT_NAME} VirtualRobot Saba ${SIMOX_VISUALIZATION_LIBS})
@@ -23,4 +23,4 @@ IF(SIMOX_USE_COIN_VISUALIZATION)
     ADD_DEFINITIONS(${SIMOX_VISUALIZATION_COMPILE_FLAGS})
 
     MESSAGE( STATUS ${PROJECT_NAME} " will be placed into " ${SIMOX_BIN_DIR})
-ENDIF(SIMOX_USE_COIN_VISUALIZATION)
+ENDIF()
diff --git a/MotionPlanning/examples/RrtGui/CMakeLists.txt b/MotionPlanning/examples/RrtGui/CMakeLists.txt
index 9df6e818255ad212bf6a47408ee837d6a41c695c..9a3a06786f586a458ced6b44abd2cd074b81cb39 100644
--- a/MotionPlanning/examples/RrtGui/CMakeLists.txt
+++ b/MotionPlanning/examples/RrtGui/CMakeLists.txt
@@ -4,13 +4,10 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.6.4)
 
 CMAKE_POLICY(VERSION 2.6)
 
-IF(NOT DEFINED VR_CONFIGURED)
-	INCLUDE(../../config.cmake)
-ENDIF()
 
 INCLUDE(${SABA_SimoxDir}/CMakeModules/SimoxProject.cmake)
 
-IF(SIMOX_USE_COIN_VISUALIZATION)
+IF(SIMOX_VISUALIZATION AND SIMOX_USE_COIN_VISUALIZATION)
      
 	# the variable "demo_SRCS" contains all .cpp files of this project
 	FILE(GLOB demo_SRCS ${PROJECT_SOURCE_DIR}/RrtGui.cpp ${PROJECT_SOURCE_DIR}/RrtGuiWindow.cpp)
@@ -25,8 +22,8 @@ IF(SIMOX_USE_COIN_VISUALIZATION)
 
 
     # create the executable
-    simox_add_executable(${PROJECT_NAME} "${demo_SRCS}" "${demo_INCS}" "${GUI_MOC_HDRS}" "${GUI_UIS}")
+    simox_add_example(${PROJECT_NAME} "${demo_SRCS}" "${demo_INCS}" "${GUI_MOC_HDRS}" "${GUI_UIS}")
     
     # we need the GraspStudio lib
     TARGET_LINK_LIBRARIES(${PROJECT_NAME} GraspStudio)    
-ENDIF(SIMOX_USE_COIN_VISUALIZATION)
+ENDIF()
diff --git a/VirtualRobot/CMakeLists.txt b/VirtualRobot/CMakeLists.txt
index e2a37f456d2c5cebece0fb8e773ac047e563cdbb..b521a8518bb84917c0fa785c57ac2ae846c6f287 100644
--- a/VirtualRobot/CMakeLists.txt
+++ b/VirtualRobot/CMakeLists.txt
@@ -118,7 +118,8 @@ CompressionRLE.h
 
 ADD_SUBDIRECTORY(Visualization/tests)
 
-if (SIMOX_USE_COIN_VISUALIZATION)
+if (SIMOX_VISUALIZATION AND SIMOX_USE_COIN_VISUALIZATION)
+
 	SET(SOURCES
 	${SOURCES}
 	Visualization/CoinVisualization/CoinVisualizationFactory.cpp
@@ -133,7 +134,25 @@ if (SIMOX_USE_COIN_VISUALIZATION)
     Visualization/CoinVisualization/CoinVisualization.h
 	)
 	ADD_SUBDIRECTORY(Visualization/CoinVisualization/tests)
-endif (SIMOX_USE_COIN_VISUALIZATION)
+	
+elseif (SIMOX_VISUALIZATION AND SIMOX_USE_OPENSCENEGRAPH_VISUALIZATION)
+
+	SET(SOURCES
+	${SOURCES}
+	Visualization/OSGVisualization/OSGVisualizationFactory.cpp
+	Visualization/OSGVisualization/OSGVisualizationNode.cpp
+    Visualization/OSGVisualization/OSGVisualization.cpp
+	)
+
+	SET(INCLUDES
+	${INCLUDES}
+	Visualization/OSGVisualization/OSGVisualizationFactory.h
+	Visualization/OSGVisualization/OSGVisualizationNode.h
+    Visualization/OSGVisualization/OSGVisualization.h
+	)
+	ADD_SUBDIRECTORY(Visualization/OSGVisualization/tests)
+
+endif ()
 
 INCLUDE_DIRECTORIES(${SIMOX_VISUALIZATION_INCLUDE_PATHS})
 ADD_DEFINITIONS(${SIMOX_VISUALIZATION_COMPILE_FLAGS})
diff --git a/VirtualRobot/CollisionDetection/CollisionChecker.h b/VirtualRobot/CollisionDetection/CollisionChecker.h
index 7907ac5b6036c219014495af2502a8e9ff94d9f1..afe5b27b75e0ad7f7d2bcf8d98a684590e03f09f 100644
--- a/VirtualRobot/CollisionDetection/CollisionChecker.h
+++ b/VirtualRobot/CollisionDetection/CollisionChecker.h
@@ -82,7 +82,7 @@ public:
 
 	/*! 
 	Activates / Deactivates the automatic size check on col model creation.
-	The size check can be useful when the UNITS definitions in the inventor files result in different scalings of the 3D models.
+	The size check can be useful when the UNITS definitions in inventor files result in different scalings of the 3D models.
 	(Standard: true)
 	*/
 	void setAutomaticSizeCheck(bool checkSizeOnColModelCreation);
diff --git a/VirtualRobot/Nodes/RobotNode.cpp b/VirtualRobot/Nodes/RobotNode.cpp
index 5002c97a4372d0f47815f91e90e25556806f93ff..4daec13dce35f28287f8e0b79daea243390e9954 100644
--- a/VirtualRobot/Nodes/RobotNode.cpp
+++ b/VirtualRobot/Nodes/RobotNode.cpp
@@ -415,14 +415,26 @@ void RobotNode::showCoordinateSystem( bool enable, float scaling, std::string *t
 	}
 	if (enable)
 	{
-		VisualizationFactoryPtr visualizationFactory = VisualizationFactory::fromName(visualizationType, NULL);
+		VisualizationFactoryPtr visualizationFactory;
+		if (visualizationType.empty())
+			visualizationFactory = VisualizationFactory::first(NULL);
+		else
+			visualizationFactory = VisualizationFactory::fromName(visualizationType, NULL);
+		if (!visualizationFactory)
+		{
+			VR_WARNING << "No visualization factory for name " << visualizationType << endl;
+			return;
+		}
 		// create coord visu
 		VisualizationNodePtr visualizationNode = visualizationFactory->createCoordSystem(scaling,&coordName);
 		// this is a little hack: The globalPose is used to set the "local" position of the attached Visualization:
 		// Since the attached visualizations are already positioned at the global pose of the visualizationModel, 
 		// we just need the local postJointTransform
-		visualizationNode->setGlobalPose(postJointTransformation);
-		visualizationModel->attachVisualization("CoordinateSystem",visualizationNode);
+		if (visualizationNode)
+		{
+			visualizationNode->setGlobalPose(postJointTransformation);
+			visualizationModel->attachVisualization("CoordinateSystem",visualizationNode);
+		}
 	}
 }
 
@@ -441,7 +453,16 @@ void RobotNode::showStructure( bool enable, const std::string &visualizationType
 	visualizationModel->detachVisualization(attachName3);
 	if (enable)
 	{
-		VisualizationFactoryPtr visualizationFactory = VisualizationFactory::fromName(visualizationType, NULL);
+		VisualizationFactoryPtr visualizationFactory;
+		if (visualizationType.empty())
+			visualizationFactory = VisualizationFactory::first(NULL);
+		else
+			visualizationFactory = VisualizationFactory::fromName(visualizationType, NULL);
+		if (!visualizationFactory)
+		{
+			VR_WARNING << "No visualization factory for name " << visualizationType << endl;
+			return;
+		}
 
 		// create visu
 		Eigen::Matrix4f i = Eigen::Matrix4f::Identity();
@@ -449,14 +470,17 @@ void RobotNode::showStructure( bool enable, const std::string &visualizationType
 		if (!preJointTransformation.isIdentity())
 		{
 			VisualizationNodePtr visualizationNode1 = visualizationFactory->createLine(preJointTransformation.inverse(),i);
-			visualizationModel->attachVisualization(attachName1,visualizationNode1);
+			if (visualizationNode1)
+				visualizationModel->attachVisualization(attachName1,visualizationNode1);
 		}
 		VisualizationNodePtr visualizationNode2 = visualizationFactory->createSphere(5.0f);
-		visualizationModel->attachVisualization(attachName2,visualizationNode2);
+		if (visualizationNode2)
+			visualizationModel->attachVisualization(attachName2,visualizationNode2);
 		if (!postJointTransformation.isIdentity())
 		{
 			VisualizationNodePtr visualizationNode3 = visualizationFactory->createLine(i,postJointTransformation,3);
-			visualizationModel->attachVisualization(attachName3,visualizationNode3);
+			if (visualizationNode3)
+				visualizationModel->attachVisualization(attachName3,visualizationNode3);
 		}
 	}
 }
diff --git a/VirtualRobot/Nodes/RobotNode.h b/VirtualRobot/Nodes/RobotNode.h
index 763d1bc62beaaef68f5d1167ee4005bca5fff6be..293aa7d2176c608184424efe979b5482997b0c50 100644
--- a/VirtualRobot/Nodes/RobotNode.h
+++ b/VirtualRobot/Nodes/RobotNode.h
@@ -168,8 +168,9 @@ public:
 		\p text Text to display at coordinate system. If not given, the name of this robot node will be displayed.
 		\p visualizationType	This option is only needed when the current robot node does not yet own a visualization. 
 								Then a visualziationNode has to be built and the \p visualizationType specifies which type of visualization should be used.
+								If not given, the first registered visaulizationfactory is used.
 	*/
-	virtual void showCoordinateSystem( bool enable, float scaling = 1.0f, std::string *text = NULL, const std::string &visualizationType="inventor");
+	virtual void showCoordinateSystem( bool enable, float scaling = 1.0f, std::string *text = NULL, const std::string &visualizationType="");
 
 
 	/*!
@@ -205,9 +206,10 @@ public:
 		Visualize the structure of this RobotNode.
 		\p enable Show or hide the structure visualization
 		\p visualizationType	This option is only needed when the current robot node does not yet own a visualization. 
-		Then a visualziationNode has to be build and the \p visualizationType specifies which type of visualization should be used.
+								Then a visualziationNode has to be build and the \p visualizationType specifies which type of visualization should be used.
+								If not given, the first registered visaulizationfactory is used.
 	*/
-	virtual void showStructure( bool enable, const std::string &visualizationType="inventor");
+	virtual void showStructure( bool enable, const std::string &visualizationType="");
 
 
 	/*!
diff --git a/VirtualRobot/Obstacle.cpp b/VirtualRobot/Obstacle.cpp
index 54c99431cc85c8c20df069f61143e594256d037e..8aaf9dff2e9a7ca4680e17ec7d17f71e44fd47e8 100644
--- a/VirtualRobot/Obstacle.cpp
+++ b/VirtualRobot/Obstacle.cpp
@@ -45,11 +45,14 @@ int Obstacle::getID()
 	return id;
 }
 
-VirtualRobot::ObstaclePtr Obstacle::createBox( float width, float height, float depth, float colorR /*= 1.0f*/, float colorG /*= 0.0f*/, float colorB/*=0.0f*/, std::string visualizationType /*="inventor"*/, CollisionCheckerPtr colChecker )
+VirtualRobot::ObstaclePtr Obstacle::createBox( float width, float height, float depth, float colorR /*= 1.0f*/, float colorG /*= 0.0f*/, float colorB/*=0.0f*/, std::string visualizationType , CollisionCheckerPtr colChecker )
 {
 	ObstaclePtr result;
-
-	VisualizationFactoryPtr visualizationFactory = VisualizationFactory::fromName(visualizationType, NULL);
+	VisualizationFactoryPtr visualizationFactory;
+	if (visualizationType.empty())
+		visualizationFactory=VisualizationFactory::first(NULL);
+	else
+		visualizationFactory = VisualizationFactory::fromName(visualizationType, NULL);
 	if (!visualizationFactory)
 	{
 		VR_ERROR << "Could not create factory for visu type " << visualizationType << endl;
diff --git a/VirtualRobot/Obstacle.h b/VirtualRobot/Obstacle.h
index df1d454e610c89bf826b32c83702bd83e7b59309..90a9b1bbac78ca050ad8d653213144abd862c814 100644
--- a/VirtualRobot/Obstacle.h
+++ b/VirtualRobot/Obstacle.h
@@ -59,7 +59,7 @@ public:
 		Create a standard obstacle. 
 
 	*/
-	static ObstaclePtr createBox(float width, float height, float depth, float colorR = 1.0f, float colorG = 0.0f, float colorB=0.0f, std::string visualizationType = "inventor", CollisionCheckerPtr colChecker = CollisionCheckerPtr());
+	static ObstaclePtr createBox(float width, float height, float depth, float colorR = 1.0f, float colorG = 0.0f, float colorB=0.0f, std::string visualizationType = "", CollisionCheckerPtr colChecker = CollisionCheckerPtr());
 
 protected:
 
diff --git a/VirtualRobot/Robot.cpp b/VirtualRobot/Robot.cpp
index a9bfa5bad573437cf044a7e98c77c37f831afb08..cc512a015f0ce3de67992c229746adb31a06b153 100644
--- a/VirtualRobot/Robot.cpp
+++ b/VirtualRobot/Robot.cpp
@@ -401,7 +401,7 @@ void Robot::highlight (VisualizationPtr visualization, bool enable)
 	}
 }
 
-void Robot::showStructure( bool enable, const std::string &type/*="inventor"*/ )
+void Robot::showStructure( bool enable, const std::string &type )
 {
 	std::map< std::string, RobotNodePtr>::const_iterator iterator = robotNodeMap.begin();
 	while(robotNodeMap.end() != iterator)
@@ -412,7 +412,7 @@ void Robot::showStructure( bool enable, const std::string &type/*="inventor"*/ )
 
 }
 
-void Robot::showCoordinateSystems( bool enable, const std::string &type/*="inventor"*/ )
+void Robot::showCoordinateSystems( bool enable, const std::string &type )
 {
 	std::map< std::string, RobotNodePtr>::const_iterator iterator = robotNodeMap.begin();
 	while(robotNodeMap.end() != iterator)
diff --git a/VirtualRobot/Robot.h b/VirtualRobot/Robot.h
index 85bd3e1284f8af1a3ebb6a3dfe2306de2af523f0..77c60c81f1c826bd243605cf7a08c6d7d34a3a70 100644
--- a/VirtualRobot/Robot.h
+++ b/VirtualRobot/Robot.h
@@ -87,11 +87,11 @@ public:
 	/*! 
 		Shows the structure of the robot
 	*/
-	void showStructure(bool enable, const std::string &type="inventor");
+	void showStructure(bool enable, const std::string &type="");
 	/*! 
 		Shows the coordinate systems of the robot nodes
 	*/
-	void showCoordinateSystems(bool enable, const std::string &type="inventor");
+	void showCoordinateSystems(bool enable, const std::string &type="");
 
 	/*!
 		Setup the full model visualization.
diff --git a/VirtualRobot/SceneObjectSet.h b/VirtualRobot/SceneObjectSet.h
index 5e94b30d4feec8f7108fedf39bc724a258b391d1..f3f7fde29f016f4dbce5587c3042924968ddeb2b 100644
--- a/VirtualRobot/SceneObjectSet.h
+++ b/VirtualRobot/SceneObjectSet.h
@@ -58,11 +58,6 @@ public:
 	*/
 	std::string getName();
 
-	//! Creates an Inventor separator with all collision models of this Set
-	//void GetIVCollisionModels (SoSeparator *storeResult);
-
-
-
 	//! store axis aligned bounding box covering all CollisionModels to store_aabb
 	//virtual void GetAABB(SbBox3f& store_aabb);
 
diff --git a/VirtualRobot/Visualization/OSGVisualization/OSGVisualization.cpp b/VirtualRobot/Visualization/OSGVisualization/OSGVisualization.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..5e654ecf66a591f3cafc625b367b43429b8b0929
--- /dev/null
+++ b/VirtualRobot/Visualization/OSGVisualization/OSGVisualization.cpp
@@ -0,0 +1,122 @@
+/**
+* @package    VirtualRobot
+* @author     Nikolaus Vahrenkamp
+* @copyright  2011 Nikolaus Vahrenkamp
+*/
+
+
+#include "OSGVisualization.h"
+#include "OSGVisualizationNode.h"
+
+#include <boost/foreach.hpp>
+#include <algorithm>
+
+namespace VirtualRobot {
+
+OSGVisualization::OSGVisualization(const VisualizationNodePtr visualizationNode) :
+Visualization(visualizationNode)
+{
+	visu = NULL;
+}
+
+OSGVisualization::OSGVisualization(const std::vector<VisualizationNodePtr>& visualizationNodes) :
+Visualization(visualizationNodes)
+{
+	visu = NULL;
+}
+	
+OSGVisualization::~OSGVisualization()
+{
+	if (visu)
+		visu->unref();
+}
+
+bool OSGVisualization::buildVisualization()
+{
+	if (visu)
+		return true;
+	visu = new osg::Group;
+	visu->ref();
+
+    BOOST_FOREACH(VisualizationNodePtr visualizationNode, visualizationNodes)
+    {
+            boost::shared_ptr<OSGVisualizationNode> osgNode = boost::dynamic_pointer_cast<OSGVisualizationNode>(visualizationNode);
+            if (osgNode && osgNode->getOSGVisualization())
+                    visu->addChild(osgNode->getOSGVisualization());
+    }
+    return true;
+}
+
+bool OSGVisualization::highlight(unsigned int which, bool enable)
+{
+    if (which >= visualizationNodes.size())
+    {
+        VR_WARNING << "Could not find visualizationNode..." << endl;
+        return false;
+    }
+    return highlight(visualizationNodes[which],enable);
+}
+
+
+bool OSGVisualization::highlight(osg::Node* visu, bool enable)
+{
+	if (!visu)
+		return false;
+	/*if (enable)
+		selection->select(visu);
+	else
+		selection->deselect(visu);
+
+	selection->touch();*/
+	VR_WARNING << "NYI..." << endl;
+	return true;
+}
+
+bool OSGVisualization::highlight(VisualizationNodePtr visualizationNode, bool enable)
+{
+    if (!isVisualizationNodeRegistered(visualizationNode))
+    {
+        VR_WARNING << "Could not find visualizationNode..." << endl;
+        return false;
+    }
+
+    boost::shared_ptr<OSGVisualizationNode> osgNode = boost::dynamic_pointer_cast<OSGVisualizationNode>(visualizationNode);
+
+	if (osgNode)
+	{
+		return highlight(osgNode->getOSGVisualization(),enable);
+	}
+
+    return false;
+}
+
+bool OSGVisualization::highlight( bool enable )
+{
+	for (size_t i = 0;i<visualizationNodes.size();i++)
+		highlight(i,enable);
+	return true;
+}
+
+/**
+ * This method iterates over the entries in member
+ * OSGVisualization::visualizationNodes and stores the return value of
+ * OSGVisualizationNode::getOSGVisualization() in an SoSeparator if the
+ * processed node is of type OSGVisualizationNode.
+ * Afterwards the SoSeparator is returned.
+ */
+osg::Node* OSGVisualization::getOSGVisualization()
+{
+    buildVisualization();
+    return visu;
+}
+
+/**
+ * \return new instance of VirtualRobot::OSGVisualization with the same set of robot nodes.
+ */
+VirtualRobot::VisualizationPtr OSGVisualization::clone()
+{
+	return VisualizationPtr(new OSGVisualization(visualizationNodes));
+}
+
+
+} // namespace VirtualRobot
diff --git a/VirtualRobot/Visualization/OSGVisualization/OSGVisualization.h b/VirtualRobot/Visualization/OSGVisualization/OSGVisualization.h
new file mode 100644
index 0000000000000000000000000000000000000000..8f89bd2acdf91101515a7750f08ae755bd237b35
--- /dev/null
+++ b/VirtualRobot/Visualization/OSGVisualization/OSGVisualization.h
@@ -0,0 +1,62 @@
+/**
+* This file is part of Simox.
+*
+* Simox is free software; you can redistribute it and/or modify
+* it under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2 of
+* the License, or (at your option) any later version.
+*
+* Simox is distributed in the hope that it will be useful, but
+* WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public License
+* along with this program. If not, see <http://www.gnu.org/licenses/>.
+*
+* @package    VirtualRobot
+* @author     Nikolaus Vahrenkamp
+* @copyright  2011 Nikolaus Vahrenkamp
+*             GNU Lesser General Public License
+*
+*/
+#ifndef _VirtualRobot_OSGVisualization_h_
+#define _VirtualRobot_OSGVisualization_h_
+
+#include "../../VirtualRobotImportExport.h"
+#include "../Visualization.h"
+
+#include <osg/Node>
+#include <osg/Group>
+namespace VirtualRobot
+{
+
+class VIRTUAL_ROBOT_IMPORT_EXPORT OSGVisualization : public Visualization
+{
+public:
+
+	OSGVisualization(const VisualizationNodePtr visualizationNode);
+	OSGVisualization(const std::vector<VisualizationNodePtr>& visualizationNodes);
+	virtual ~OSGVisualization();
+
+	virtual bool highlight(VisualizationNodePtr visualizationNode, bool enable);
+	virtual bool highlight(unsigned int which, bool enable);
+	virtual bool highlight(bool enable);	
+	virtual bool highlight(osg::Node* visu, bool enable);
+
+	virtual VisualizationPtr clone();
+
+	osg::Node* getOSGVisualization();
+
+	static std::string getFactoryName(){return "osg";}
+
+	//virtual void setGlobalPose(const Eigen::Matrix4f &p);
+
+protected:
+        bool buildVisualization();
+		osg::Group* visu;
+};
+
+} // namespace VirtualRobot
+
+#endif // _VirtualRobot_OSGVisualization_h_
diff --git a/VirtualRobot/Visualization/OSGVisualization/OSGVisualizationFactory.cpp b/VirtualRobot/Visualization/OSGVisualization/OSGVisualizationFactory.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..b2613380f72ddb45ba56f034a429108b065104da
--- /dev/null
+++ b/VirtualRobot/Visualization/OSGVisualization/OSGVisualizationFactory.cpp
@@ -0,0 +1,195 @@
+/**
+* @package    VirtualRobot
+* @author     Nikolaus Vahrenkamp
+* @copyright  2011 Nikolaus Vahrenkamp
+*/
+
+#include "OSGVisualizationFactory.h"
+#include "../VisualizationNode.h"
+#include "OSGVisualizationNode.h"
+#include "../../VirtualRobotException.h"
+#include "OSGVisualization.h"
+#include "../../Robot.h"
+#include "../../Grasp.h"
+#include "../../GraspSet.h"
+#include "../../SceneObject.h"
+#include "../TriMeshModel.h"
+#include "../../ReachabilitySpace.h"
+#include <iostream>
+#include <algorithm>
+#include <boost/pointer_cast.hpp>
+
+#include <osgDB/ReadFile> 
+#include <osg/ShapeDrawable>
+
+namespace VirtualRobot {
+
+OSGVisualizationFactory::OSGVisualizationFactory()
+{
+}
+
+
+OSGVisualizationFactory::~OSGVisualizationFactory()
+{
+}
+
+
+/**
+ * This method creates a VirtualRobot::OSGVisualizationNode from a given \p filename.
+ * An instance of VirtualRobot::VisualizationNode is returned in case of an occured error.
+ *
+ * \param filename file to load the OSG3D visualization from.
+ * \param boundingBox Use bounding box instead of full model.
+ * \return instance of VirtualRobot::OSGVisualizationNode upon success and VirtualRobot::VisualizationNode on error.
+ */
+VisualizationNodePtr OSGVisualizationFactory::getVisualizationFromFile(const std::string& filename, bool boundingBox)
+{
+	VisualizationNodePtr visualizationNode(new VisualizationNode);
+
+	osg::Node* n = osgDB::readNodeFile(filename.c_str());
+
+
+	if (n)
+	{
+		n->ref();
+		if (boundingBox)
+		{
+			VR_INFO << "BoundingBox nyi..." << endl;
+		}
+		visualizationNode.reset(new OSGVisualizationNode(n));
+		visualizationNode->setFilename(filename, boundingBox);
+		n->unref();
+	} else
+		VR_WARNING << "Could not read file:" << filename << endl;
+
+	
+	return visualizationNode;
+}
+
+
+/**
+ * register this class in the super class factory
+ */
+VisualizationFactory::SubClassRegistry OSGVisualizationFactory::registry(OSGVisualizationFactory::getName(), &OSGVisualizationFactory::createInstance);
+
+
+/**
+ * \return "osg"
+ */
+std::string OSGVisualizationFactory::getName() {return "osg";}
+
+
+/**
+ * \return new instance of OSGVisualizationFactory
+ */
+boost::shared_ptr<VisualizationFactory> OSGVisualizationFactory::createInstance(void*)
+{    
+    boost::shared_ptr<OSGVisualizationFactory> OSGFactory(new OSGVisualizationFactory());
+    return OSGFactory;
+}
+
+VirtualRobot::VisualizationNodePtr OSGVisualizationFactory::createBox( float width, float height, float depth, float colorR, float colorG, float colorB, CollisionCheckerPtr colChecker )
+{
+	osg::Box* b = new osg::Box(osg::Vec3(0,0,0),width,height,depth);
+	osg::ShapeDrawable* bd = new osg::ShapeDrawable(b);
+	osg::Geode* bg = new osg::Geode();
+	bg->addDrawable(bd);
+	osg::Group* s = new osg::Group;
+	s->addChild(bg);
+
+    VisualizationNodePtr visualizationNode(new OSGVisualizationNode(s));
+	return visualizationNode;
+}
+
+
+VisualizationNodePtr OSGVisualizationFactory::createLine(const Eigen::Matrix4f &from, const Eigen::Matrix4f &to, float width, float colorR, float colorG, float colorB)
+{
+	osg::Vec3 sp(from(0,3),from(1,3),from(2,3)); 
+	osg::Vec3 ep(to(0,3),to(1,3),to(2,3)); 
+	osg::ref_ptr<osg::Geometry> beam( new osg::Geometry); 
+	osg::ref_ptr<osg::Vec3Array> points = new osg::Vec3Array; 
+	points->push_back(sp); 
+	points->push_back(ep); 
+	osg::ref_ptr<osg::Vec4Array> color = new osg::Vec4Array; 
+	color->push_back(osg::Vec4(colorR,colorG,colorB,1.0)); 
+	beam->setVertexArray(points.get()); 
+	beam->setColorArray(color.get()); 
+	beam->setColorBinding(osg::Geometry::BIND_PER_PRIMITIVE); 
+	beam->addPrimitiveSet(new osg::DrawArrays(GL_LINES,0,2));
+
+
+	osg::Geode* bg = new osg::Geode();
+	bg->addDrawable(beam);
+	osg::Group* s = new osg::Group;
+	s->addChild(bg);
+
+	VisualizationNodePtr visualizationNode(new OSGVisualizationNode(s));
+	return visualizationNode;
+}
+
+VisualizationNodePtr OSGVisualizationFactory::createSphere(float radius, float colorR, float colorG, float colorB, CollisionCheckerPtr colChecker)
+{
+	osg::Sphere* b = new osg::Sphere(osg::Vec3(0,0,0),radius);
+	osg::ShapeDrawable* bd = new osg::ShapeDrawable(b);
+	osg::Geode* bg = new osg::Geode();
+	bg->addDrawable(bd);
+	osg::Group* s = new osg::Group;
+	s->addChild(bg);
+
+	VisualizationNodePtr visualizationNode(new OSGVisualizationNode(s));
+	return visualizationNode;
+}
+
+VisualizationNodePtr OSGVisualizationFactory::createCoordSystem(float scaling, std::string *text, float axisLength, float axisSize, int nrOfBlocks)
+{
+    VR_INFO << "init nyi..." << endl;
+	return VisualizationNodePtr();
+}
+
+/*VisualizationNodePtr OSGVisualizationFactory::createVisualization(CollisionCheckerPtr colChecker)
+{
+    VR_INFO << "init nyi..." << endl;
+	return VisualizationNodePtr();
+}*/
+
+
+
+VirtualRobot::VisualizationNodePtr OSGVisualizationFactory::createVertexVisualization( const Eigen::Vector3f &position, float radius, float transparency, float colorR /*= 0.5f*/, float colorG /*= 0.5f*/, float colorB /*= 0.5f*/ )
+{
+    VR_INFO << "init nyi..." << endl;
+	return VisualizationNodePtr();
+}
+
+VirtualRobot::VisualizationNodePtr OSGVisualizationFactory::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*/ )
+{
+    VR_INFO << "init nyi..." << endl;
+	return VisualizationNodePtr();
+}
+
+VirtualRobot::VisualizationNodePtr OSGVisualizationFactory::createBoundingBox( const BoundingBox &bbox )
+{
+    VR_INFO << "init nyi..." << endl;
+	return VisualizationNodePtr();
+}
+
+
+VirtualRobot::VisualizationNodePtr OSGVisualizationFactory::createTriMeshModelVisualization( TriMeshModelPtr model, bool showNormals, Eigen::Matrix4f &pose )
+{
+    VR_INFO << "init nyi..." << endl;
+	return VisualizationNodePtr();
+}
+
+VirtualRobot::VisualizationNodePtr OSGVisualizationFactory::createArrow( const Eigen::Vector3f &n, float length /*= 50.0f*/, float width /*= 2.0f*/, const Color &color /*= Color::Gray()*/ )
+{
+    VR_INFO << "init nyi..." << endl;
+	return VisualizationNodePtr();
+}
+
+VirtualRobot::VisualizationNodePtr OSGVisualizationFactory::createVisualization( CollisionCheckerPtr colChecker /*= CollisionCheckerPtr()*/ )
+{
+	osg::Group* s = new osg::Group;
+	VisualizationNodePtr visualizationNode(new OSGVisualizationNode(s));
+	return visualizationNode;
+}
+
+} // namespace VirtualRobot
diff --git a/VirtualRobot/Visualization/OSGVisualization/OSGVisualizationFactory.h b/VirtualRobot/Visualization/OSGVisualization/OSGVisualizationFactory.h
new file mode 100644
index 0000000000000000000000000000000000000000..e6a4d8c6bbdf53a89a71cf325efda016517a5314
--- /dev/null
+++ b/VirtualRobot/Visualization/OSGVisualization/OSGVisualizationFactory.h
@@ -0,0 +1,78 @@
+/**
+* This file is part of Simox.
+*
+* Simox is free software; you can redistribute it and/or modify
+* it under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2 of
+* the License, or (at your option) any later version.
+*
+* Simox is distributed in the hope that it will be useful, but
+* WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public License
+* along with this program. If not, see <http://www.gnu.org/licenses/>.
+*
+* @package    VirtualRobot
+* @author     Nikolaus Vahrenkamp
+* @copyright  2011 Nikolaus Vahrenkamp
+*             GNU Lesser General Public License
+*
+*/
+#ifndef _VirtualRobot_OSGVisualizationFactory_h_
+#define _VirtualRobot_OSGVisualizationFactory_h_
+
+
+#include "../../VirtualRobotImportExport.h"
+#include "../VisualizationFactory.h"
+#include "../../BoundingBox.h"
+#include "../../SceneObject.h"
+#include "../../EndEffector/EndEffector.h"
+#include "../ColorMap.h"
+
+#include <boost/shared_ptr.hpp>
+
+#include <string>
+
+#include <osg/Node>
+#include <osg/Group>
+
+namespace VirtualRobot
+{
+class VisualizationNode;
+
+class VIRTUAL_ROBOT_IMPORT_EXPORT OSGVisualizationFactory  : public VisualizationFactory
+{
+public:
+	EIGEN_MAKE_ALIGNED_OPERATOR_NEW
+
+	OSGVisualizationFactory();
+	virtual ~OSGVisualizationFactory();
+
+	virtual VisualizationNodePtr getVisualizationFromFile(const std::string& filename, bool boundingBox = false);
+	virtual VisualizationNodePtr createBox(float width, float height, float depth, float colorR, float colorG, float colorB, CollisionCheckerPtr colChecker = CollisionCheckerPtr());
+	virtual VisualizationNodePtr createLine(const Eigen::Matrix4f &from, const Eigen::Matrix4f &to, float width = 1.0f, float colorR = 0.5f, float colorG = 0.5f, float colorB = 0.5f);
+	virtual VisualizationNodePtr createSphere(float radius, float colorR = 0.5f, float colorG = 0.5f, float colorB = 0.5f, CollisionCheckerPtr colChecker = CollisionCheckerPtr());
+	virtual VisualizationNodePtr createCoordSystem(float scaling = 1.0f, std::string *text = NULL, float axisLength = 100.0f, float axisSize = 3.0f, int nrOfBlocks = 10);
+	virtual VisualizationNodePtr createBoundingBox(const BoundingBox &bbox);
+	virtual VisualizationNodePtr createVertexVisualization(const Eigen::Vector3f &position, float radius, float transparency,  float colorR = 0.5f, float colorG = 0.5f, float colorB = 0.5f);
+	virtual VisualizationNodePtr createTriMeshModelVisualization(TriMeshModelPtr model, bool showNormals, Eigen::Matrix4f &pose);
+	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());
+
+	/*!
+		Create an empty VisualizationNode.
+	*/
+	virtual VisualizationNodePtr createVisualization(CollisionCheckerPtr colChecker = CollisionCheckerPtr());
+// AbstractFactoryMethod
+public:
+	static std::string getName();
+	static boost::shared_ptr<VisualizationFactory> createInstance(void*);
+private:
+	static SubClassRegistry registry;
+};
+
+} // namespace VirtualRobot
+
+#endif // _VirtualRobot_OSGVisualizationFactory_h_
diff --git a/VirtualRobot/Visualization/OSGVisualization/OSGVisualizationNode.cpp b/VirtualRobot/Visualization/OSGVisualization/OSGVisualizationNode.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..4f05679168813a2af21603cb0da987ac79fc34a6
--- /dev/null
+++ b/VirtualRobot/Visualization/OSGVisualization/OSGVisualizationNode.cpp
@@ -0,0 +1,253 @@
+/**
+* @package    VirtualRobot
+* @author     Nikolaus Vahrenkamp
+* @copyright  2011 Nikolaus Vahrenkamp
+*/
+
+#include "OSGVisualizationNode.h"
+#include "OSGVisualizationFactory.h"
+#include "../TriMeshModel.h"
+#include "../../VirtualRobotException.h"
+
+#include <osg/TriangleFunctor>
+#include <osg/Geode>
+#include <osg/Node>
+#include <osg/Group>
+
+namespace VirtualRobot {
+
+/**
+ * Store a reference to \p visualizationNode in the member
+ * OSGVisualizationNode::visualization.
+ */
+OSGVisualizationNode::OSGVisualizationNode(osg::Node* visualizationNode) 
+{
+	visualization = visualizationNode;
+	visualization->ref();
+
+	visualizationAtGlobalPose = new osg::Group;
+	visualizationAtGlobalPose->ref();
+	
+	globalPoseTransform = new osg::MatrixTransform;
+	visualizationAtGlobalPose->addChild(globalPoseTransform);
+	
+	attachedVisualizationsSeparator = new osg::Group;
+	attachedVisualizationsSeparator->ref();
+	globalPoseTransform->addChild(attachedVisualizationsSeparator);
+
+	if (!visualization)
+		visualization = new osg::Node; // create dummy node
+
+	globalPoseTransform->addChild(visualization);
+}
+
+
+/**
+ */
+OSGVisualizationNode::~OSGVisualizationNode()
+{
+	if (visualization)
+		visualization->unref();
+	if (visualizationAtGlobalPose)
+		visualizationAtGlobalPose->unref();
+	if (attachedVisualizationsSeparator)
+		attachedVisualizationsSeparator->unref();
+}
+
+/**
+ * This method returns OSGVisualizationNode::triMeshModel.
+ * If the model doesn't exist construct it by calling
+ * OSGVisualizationNode::createTriMeshModel().
+ */
+TriMeshModelPtr OSGVisualizationNode::getTriMeshModel()
+{
+	if (!triMeshModel)
+		createTriMeshModel();
+	return triMeshModel;
+}
+
+
+/**
+ * This method constructs an instance of TriMeshModel and stores it in
+ * OSGVisualizationNode::triMeshModel.
+ * If OSGVisualizationMode::visualization is invalid VirtualRobotException
+ * is thrown.
+ * Otherwise OSGVisualizationNode::InentorTriangleCB() is called on the
+ * OSG graph stored in OSGVisualizationNode::visualization.
+ */
+void OSGVisualizationNode::createTriMeshModel()
+{
+	THROW_VR_EXCEPTION_IF(!visualization, "OSGVisualizationNode::createTriMeshModel(): no OSG model present!");
+
+	if (triMeshModel)
+		triMeshModel->clear();
+	else
+		triMeshModel.reset(new TriMeshModel());
+
+	// check if node is a geode
+	osg::Geode* visuGeode = visualization->asGeode();
+	if (visuGeode)
+	{
+		osg::TriangleFunctor<osgTriangleConverter> tf;
+		tf.triMeshModel = triMeshModel;
+		addGeodeTriData(visuGeode,triMeshModel);
+	} else
+	{
+		// check if node is a group
+		osg::Group* visuGroup = visualization->asGroup();
+		if (visuGroup)
+		{
+			addGroupTriData(visuGroup,triMeshModel);
+		}
+	}
+}
+void OSGVisualizationNode::addGeodeTriData(osg::Geode* geode, TriMeshModelPtr mesh)
+{
+	if (!geode || !mesh)
+		return;
+	for ( unsigned int i = 0; i < geode->getNumDrawables(); ++i ) 
+	{
+		osg::TriangleFunctor<osgTriangleConverter> tf;
+		tf.triMeshModel = mesh;
+		geode->getDrawable( i )->accept( tf );
+	}
+}
+
+void OSGVisualizationNode::addGroupTriData(osg::Group* visuGroup, TriMeshModelPtr mesh)
+{
+	for ( unsigned int i = 0; i < visuGroup->getNumChildren(); ++i ) 
+	{
+		osg::Geode* geode = visuGroup->getChild(i)->asGeode();
+		if (geode)
+			addGeodeTriData(geode,triMeshModel);
+		else
+		{
+			osg::Group* group = visuGroup->getChild(i)->asGroup();
+			if (group)
+				addGroupTriData(group,triMeshModel);
+		}
+	}
+}
+
+
+/**
+ * This mehtod returns the internal OSGVisualizationNode::visualization.
+ */
+osg::Node* OSGVisualizationNode::getOSGVisualization()
+{
+	return visualizationAtGlobalPose;
+}
+
+void OSGVisualizationNode::setGlobalPose( const Eigen::Matrix4f &m )
+{
+	globalPose = m;
+	if (globalPoseTransform && updateVisualization)
+	{
+		osg::Matrix mat(globalPose.data());
+			/*m(0,0),m(0,1),m(0,2),0,
+			m(1,0),m(1,1),m(1,2),0,
+			m(2,0),m(2,1),m(2,2),0,
+			m(0,3),m(1,3),m(2,3),1
+			);*/
+		globalPoseTransform->setMatrix(mat);
+		//m(reinterpret_cast<SbMat*>(globalPose.data()));
+		//globalPoseTransform->matrix.setValue(m);
+	}
+}
+
+void OSGVisualizationNode::print()
+{
+	cout << "  OSGVisualization: ";
+	if (!triMeshModel)
+		createTriMeshModel();
+	if (triMeshModel)
+	{
+		Eigen::Vector3f mi;
+		Eigen::Vector3f ma;
+		triMeshModel->getSize(mi,ma);
+		cout << triMeshModel->faces.size() << " triangles" << endl;// Extend: " << ma[0]-mi[0] << ", " << ma[1] - mi[1] << ", " << ma[2] - mi[2] << endl;
+		cout << "    Min point: (" << mi[0] << "," << mi[1] << "," << mi[2] << ")" << endl;
+		cout << "    Max point: (" << ma[0] << "," << ma[1] << "," << ma[2] << ")" << endl;
+
+	} else
+		cout << "No model" << endl;
+}
+
+void OSGVisualizationNode::attachVisualization(const std::string &name, VisualizationNodePtr v)
+{
+	VisualizationNode::attachVisualization(name,v);
+
+	boost::shared_ptr<OSGVisualizationNode> osgNode = boost::dynamic_pointer_cast<OSGVisualizationNode>(v);
+	if (osgNode && osgNode->getOSGVisualization())
+	{
+		attachedOSGVisualizations[name] = osgNode->getOSGVisualization();
+		attachedVisualizationsSeparator->addChild(osgNode->getOSGVisualization());
+	}
+}
+
+void OSGVisualizationNode::detachVisualization(const std::string &name)
+{
+	VisualizationNode::detachVisualization(name);
+	std::map< std::string, osg::Node* >::const_iterator i = attachedOSGVisualizations.begin();
+	while (i!=attachedOSGVisualizations.end())
+	{
+		if (i->first == name)
+		{
+			attachedVisualizationsSeparator->removeChild(i->second);
+			attachedOSGVisualizations.erase(name);
+			return;
+		}
+		i++;
+	}
+}
+
+
+VirtualRobot::VisualizationNodePtr OSGVisualizationNode::clone(bool deepCopy)
+{
+	osg::Node* newModel = NULL;
+	if (visualization)
+	{
+		if (deepCopy)
+		{
+			newModel =  static_cast<osg::Node*>(visualization->clone(osg::CopyOp::DEEP_COPY_ALL));
+		} else
+			newModel = visualization;
+	}
+	VisualizationNodePtr p(new OSGVisualizationNode(newModel));
+
+	p->setUpdateVisualization(updateVisualization);
+	p->setGlobalPose(getGlobalPose());
+	p->setFilename(filename,boundingBox);
+
+	// clone attached visualizations
+	std::map< std::string, VisualizationNodePtr >::const_iterator i = attachedVisualizations.begin();
+	while (i!=attachedVisualizations.end())
+	{
+		VisualizationNodePtr attachedClone = i->second->clone();
+		p->attachVisualization(i->first, attachedClone);
+		i++;
+	}
+
+	return p;
+}
+
+void OSGVisualizationNode::setupVisualization( bool showVisualization, bool showAttachedVisualizations )
+{
+	VisualizationNode::setupVisualization(showVisualization,showAttachedVisualizations);
+	if (!visualizationAtGlobalPose || !attachedVisualizationsSeparator || !visualization)
+		return;
+	
+	if (showAttachedVisualizations && !visualizationAtGlobalPose->containsNode(attachedVisualizationsSeparator))
+		visualizationAtGlobalPose->addChild(attachedVisualizationsSeparator);
+	if (!showAttachedVisualizations && visualizationAtGlobalPose->containsNode(attachedVisualizationsSeparator))
+		visualizationAtGlobalPose->removeChild(attachedVisualizationsSeparator);
+
+
+	if (showVisualization && !visualizationAtGlobalPose->containsNode(visualization))
+		visualizationAtGlobalPose->addChild(visualization);
+	if (!showVisualization && visualizationAtGlobalPose->containsNode(visualization))
+		visualizationAtGlobalPose->removeChild(visualization);
+}
+
+
+} // namespace VirtualRobot
diff --git a/VirtualRobot/Visualization/OSGVisualization/OSGVisualizationNode.h b/VirtualRobot/Visualization/OSGVisualization/OSGVisualizationNode.h
new file mode 100644
index 0000000000000000000000000000000000000000..118c903f439f5c414fc0fa76d43b8bf582bff088
--- /dev/null
+++ b/VirtualRobot/Visualization/OSGVisualization/OSGVisualizationNode.h
@@ -0,0 +1,135 @@
+/**
+* This file is part of Simox.
+*
+* Simox is free software; you can redistribute it and/or modify
+* it under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2 of
+* the License, or (at your option) any later version.
+*
+* Simox is distributed in the hope that it will be useful, but
+* WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public License
+* along with this program. If not, see <http://www.gnu.org/licenses/>.
+*
+* @package    VirtualRobot
+* @author     Nikolaus Vahrenkamp
+* @copyright  2011 Nikolaus Vahrenkamp
+*             GNU Lesser General Public License
+*
+*/
+#ifndef _VirtualRobot_OSGVisualizationNode_h_
+#define _VirtualRobot_OSGVisualizationNode_h_
+
+#include "../../VirtualRobotImportExport.h"
+#include "../VisualizationNode.h"
+#include "OSGVisualizationFactory.h"
+
+#include "../TriMeshModel.h"
+
+#include <boost/shared_ptr.hpp>
+
+#include <osg/Node>
+#include <osg/Group>
+#include <osg/MatrixTransform>
+
+namespace VirtualRobot
+{
+class TriMeshModel;
+
+class VIRTUAL_ROBOT_IMPORT_EXPORT OSGVisualizationNode : virtual public VisualizationNode
+{
+public:
+	OSGVisualizationNode();
+	OSGVisualizationNode(osg::Node* visualizationNode);
+	~OSGVisualizationNode();
+	virtual TriMeshModelPtr getTriMeshModel();
+
+	osg::Node* getOSGVisualization();
+
+	virtual void setGlobalPose (const Eigen::Matrix4f &m);
+
+	virtual void print();
+
+	/*!
+		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.
+	*/
+	virtual void attachVisualization(const std::string &name, VisualizationNodePtr v);
+
+	/*!
+		Remove an attached visualization.
+	*/
+	virtual void detachVisualization(const std::string &name);
+
+	/*!
+		Setup the visualization of this object.
+		\param showVisualization If false, the visualization is disabled.
+		\param showAttachedVisualizations If false, the visualization of any attached optional visualizations is disabled.
+	*/
+	virtual void setupVisualization(bool showVisualization, bool showAttachedVisualizations);
+
+
+/*!
+		Clone this visualization.
+		\param deepCopy When true, the underlying visualization is copied, otherwise a reference to the existing visualization is passed. 
+		Since the underlying implementation may be able to re-use the visualization data, a deep copy may not be necessary in some cases.
+	*/
+	virtual VisualizationNodePtr clone(bool deepCopy = true);
+
+	virtual std::string getType(){return OSGVisualizationFactory::getName();}
+
+protected:
+	void createTriMeshModel();
+	void addGeodeTriData(osg::Geode* geode, TriMeshModelPtr mesh);
+	void addGroupTriData(osg::Group* visuGroup, TriMeshModelPtr mesh);
+	osg::Node* visualization;
+	osg::Group* visualizationAtGlobalPose;
+	osg::Group* attachedVisualizationsSeparator;
+	std::map< std::string, osg::Node* > attachedOSGVisualizations;	//< These optional visualizations will not show up in the TriMeshModel
+
+	//SoNode* visualization;
+	//SoSeparator* visualizationAtGlobalPose;
+	//SoSeparator* attachedVisualizationsSeparator;
+	//std::map< std::string, SoNode* > attachedOSGVisualizations;	//< These optional visualizations will not show up in the TriMeshModel
+
+	osg::MatrixTransform *globalPoseTransform;
+	TriMeshModelPtr triMeshModel;
+
+	struct osgTriangleConverter {
+		inline void operator () ( const osg::Vec3& _v1, const osg::Vec3& _v2, const osg::Vec3& _v3, bool treatVertexDataAsTemporary ) {
+			osg::Vec3 v1 = _v1;// * m_mat;
+			osg::Vec3 v2 = _v2;// * m_mat;
+			osg::Vec3 v3 = _v3;// * m_mat;
+			osg::Vec3 vV1V2 = v2-v1;
+			osg::Vec3 vV1V3 = v3-v1;
+			osg::Vec3 vNormal = vV1V2.operator ^(vV1V3);
+			/**m_stream << "facet normal " << vNormal[0] << " " << vNormal[1] << " " << vNormal[2] << std::endl;
+			*m_stream << "outer loop" << std::endl;
+			*m_stream << "vertex " << v1[0] << " " << v1[1] << " " << v1[2] << std::endl;
+			*m_stream << "vertex " << v2[0] << " " << v2[1] << " " << v2[2] << std::endl;
+			*m_stream << "vertex " << v3[0] << " " << v3[1] << " " << v3[2] << std::endl;
+			*m_stream << "endloop" << std::endl;
+			*m_stream << "endfacet " << std::endl;*/
+
+			// read out vertices
+			Eigen::Vector3f a, b, c, n;
+			a << _v1.x(), _v1.y(), _v1.z();
+			b << _v2.x(), _v2.y(), _v2.z();
+			c << _v3.x(), _v3.y(), _v3.z();
+			n << vNormal.x(), vNormal.y(), vNormal.z();
+			// add new triangle to the model
+			triMeshModel->addTriangleWithFace(a, b, c, n);
+		}
+
+		TriMeshModelPtr triMeshModel;
+
+	};
+
+};
+
+} // namespace VirtualRobot
+
+#endif // _VirtualRobot_OSGVisualizationNode_h_
diff --git a/VirtualRobot/Visualization/OSGVisualization/tests/CMakeLists.txt b/VirtualRobot/Visualization/OSGVisualization/tests/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..03142953f0150dbba7668ee7d37173902da18140
--- /dev/null
+++ b/VirtualRobot/Visualization/OSGVisualization/tests/CMakeLists.txt
@@ -0,0 +1 @@
+ADD_VR_TEST(OSGVisualizationFactoryTest)
diff --git a/VirtualRobot/Visualization/OSGVisualization/tests/OSGVisualizationFactoryTest.cpp b/VirtualRobot/Visualization/OSGVisualization/tests/OSGVisualizationFactoryTest.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..fb29a958f79da013fd4ffc14b4273642d415c34d
--- /dev/null
+++ b/VirtualRobot/Visualization/OSGVisualization/tests/OSGVisualizationFactoryTest.cpp
@@ -0,0 +1,15 @@
+/**
+* @package    VirtualRobot
+* @author     nv
+* @copyright  2011 Nikolaus Vahrenkamp
+*/
+
+#define BOOST_TEST_MODULE VirtualRobot_OSGVisualizationFactoryTest
+
+#include <VirtualRobot/VirtualRobotTest.h>
+#include <VirtualRobot/Visualization/OSGVisualization/OSGVisualizationFactory.h>
+#include <string>
+
+BOOST_AUTO_TEST_CASE(testVirtualRobotOSGVisualizationFactory)
+{
+}
diff --git a/VirtualRobot/Visualization/VisualizationFactory.h b/VirtualRobot/Visualization/VisualizationFactory.h
index 060a750e89bf6844470d7bee74c0883295e54531..b8b10a9eccde2071ba754654df74bd76a969be8a 100644
--- a/VirtualRobot/Visualization/VisualizationFactory.h
+++ b/VirtualRobot/Visualization/VisualizationFactory.h
@@ -59,7 +59,6 @@ public:
 	virtual ~VisualizationFactory() {;}
 
 	virtual VisualizationNodePtr getVisualizationFromFile(const std::string& filename, bool boundingBox = false){return VisualizationNodePtr();}
-	virtual VisualizationNodePtr getVisualizationFromString(const std::string& modelString, bool boundingBox = false){return VisualizationNodePtr();}
 	virtual VisualizationNodePtr createBox(float length, float height, float width, float colorR, float colorG, float colorB, CollisionCheckerPtr colChecker = CollisionCheckerPtr()){return VisualizationNodePtr();}
 	virtual VisualizationNodePtr createLine(const Eigen::Matrix4f &from, const Eigen::Matrix4f &to, float width = 1.0f, float colorR = 0.5f, float colorG = 0.5f, float colorB = 0.5f){return VisualizationNodePtr();}
 	virtual VisualizationNodePtr createSphere(float radius, float colorR = 0.5f, float colorG = 0.5f, float colorB = 0.5f, CollisionCheckerPtr colChecker = CollisionCheckerPtr()){return VisualizationNodePtr();}
diff --git a/VirtualRobot/config.cmake b/VirtualRobot/config.cmake
index 8b623cb310f322412af1a0bdbea2bf5d129cb9e4..21968eba7de91615b17b1d4528c6b769089062a0 100644
--- a/VirtualRobot/config.cmake
+++ b/VirtualRobot/config.cmake
@@ -182,11 +182,13 @@ INCLUDE(CTest)
 MESSAGE(STATUS "** Test output directory: ${VR_TEST_DIR}")
 
 MACRO(ADD_VR_TEST TEST_NAME)
+    
     INCLUDE_DIRECTORIES(${SIMOX_VISUALIZATION_INCLUDE_PATHS})
     ADD_DEFINITIONS(${SIMOX_VISUALIZATION_COMPILE_FLAGS})
 	ADD_EXECUTABLE(${TEST_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/${TEST_NAME}.cpp)
 	TARGET_LINK_LIBRARIES(${TEST_NAME} VirtualRobot ${VIRTUAL_ROBOT_LINK_LIBRARIES})
 	SET_TARGET_PROPERTIES(${TEST_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${VR_TEST_DIR})
+	SET_TARGET_PROPERTIES(${TEST_NAME} PROPERTIES FOLDER "VirtualRobot Tests")
 	ADD_TEST(NAME VirtualRobot_${TEST_NAME}
 	         COMMAND ${VR_TEST_DIR}/${TEST_NAME} --output_format=XML --log_level=all --report_level=no)
 ENDMACRO(ADD_VR_TEST)
diff --git a/VirtualRobot/examples/CMakeLists.txt b/VirtualRobot/examples/CMakeLists.txt
index 71eb4c66e865e47b19778b00b3e8bf144963ebca..0dbb2d816db7e0b0f84553f02be930a4de195f9b 100644
--- a/VirtualRobot/examples/CMakeLists.txt
+++ b/VirtualRobot/examples/CMakeLists.txt
@@ -1,10 +1,11 @@
 
 ADD_SUBDIRECTORY(loadRobot)
-if (SOQT_FOUND)
-	ADD_SUBDIRECTORY(RobotViewer)
-	ADD_SUBDIRECTORY(SceneViewer)
-	ADD_SUBDIRECTORY(Jacobi)
-	ADD_SUBDIRECTORY(reachability)
-	ADD_SUBDIRECTORY(stability)
-    ADD_SUBDIRECTORY(GraspEditor)
-endif()	
+
+ADD_SUBDIRECTORY(RobotViewer)
+ADD_SUBDIRECTORY(RobotViewerOSG)
+ADD_SUBDIRECTORY(SceneViewer)
+ADD_SUBDIRECTORY(Jacobi)
+ADD_SUBDIRECTORY(reachability)
+ADD_SUBDIRECTORY(stability)
+ADD_SUBDIRECTORY(GraspEditor)
+
diff --git a/VirtualRobot/examples/GraspEditor/CMakeLists.txt b/VirtualRobot/examples/GraspEditor/CMakeLists.txt
index 7c6751288d07bab4b71823d5cec86aa9fc8fe51b..1a22b0c989f5e84bf9fb0ccded5b5f4aed7b7412 100644
--- a/VirtualRobot/examples/GraspEditor/CMakeLists.txt
+++ b/VirtualRobot/examples/GraspEditor/CMakeLists.txt
@@ -4,10 +4,6 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.6.4)
 
 CMAKE_POLICY(VERSION 2.6)
 
-IF(NOT DEFINED VR_CONFIGURED)
-	INCLUDE(../../config.cmake)
-ENDIF()
-
 IF(SIMOX_USE_COIN_VISUALIZATION)
     LINK_DIRECTORIES(${SIMOX_LIB_DIR})
     
@@ -35,6 +31,7 @@ IF(SIMOX_USE_COIN_VISUALIZATION)
 
 
     ADD_EXECUTABLE(${PROJECT_NAME} ${demo_SRCS} ${demo_INCS})
+    SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES FOLDER "Examples")
     SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${SIMOX_BIN_DIR})
 
     TARGET_LINK_LIBRARIES(${PROJECT_NAME} VirtualRobot ${SIMOX_VISUALIZATION_LIBS})
diff --git a/VirtualRobot/examples/Jacobi/CMakeLists.txt b/VirtualRobot/examples/Jacobi/CMakeLists.txt
index 7f58a48dda17596da816dd3b7e4bc75a6d1b124a..82b54516833989f602e0cffb485b05ab0127bb2c 100644
--- a/VirtualRobot/examples/Jacobi/CMakeLists.txt
+++ b/VirtualRobot/examples/Jacobi/CMakeLists.txt
@@ -4,9 +4,6 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.6.4)
 
 CMAKE_POLICY(VERSION 2.6)
 
-IF(NOT DEFINED VR_CONFIGURED)
-	INCLUDE(../../config.cmake)
-ENDIF()
 
 IF(SIMOX_USE_COIN_VISUALIZATION)
     LINK_DIRECTORIES(${SIMOX_LIB_DIR})
@@ -38,6 +35,7 @@ IF(SIMOX_USE_COIN_VISUALIZATION)
 
 
     ADD_EXECUTABLE(${PROJECT_NAME} ${demo_SRCS} ${demo_INCS})
+    SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES FOLDER "Examples")
     SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${SIMOX_BIN_DIR})
 
 #MESSAGE("QT_LIBRARIES :" ${QT_LIBRARIES})
diff --git a/VirtualRobot/examples/RobotViewer/CMakeLists.txt b/VirtualRobot/examples/RobotViewer/CMakeLists.txt
index e1a58761d06d67a3495163cd0b1224bb508f5b52..e29dd0b16370c2ff780996aae595e5c9f9cca4ea 100644
--- a/VirtualRobot/examples/RobotViewer/CMakeLists.txt
+++ b/VirtualRobot/examples/RobotViewer/CMakeLists.txt
@@ -4,13 +4,7 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.6.4)
 
 CMAKE_POLICY(VERSION 2.6)
 
-IF(NOT DEFINED VR_CONFIGURED)
-	INCLUDE(../../config.cmake)
-ENDIF()
-
-
-
-IF(SIMOX_VISUALIZATION)
+IF(SIMOX_VISUALIZATION AND SIMOX_USE_COIN_VISUALIZATION)
     
     LINK_DIRECTORIES(${SIMOX_LIB_DIR})
     
@@ -36,8 +30,8 @@ IF(SIMOX_VISUALIZATION)
 
     include_directories(${UI_HEADER_DIR})
 
-
     ADD_EXECUTABLE(${PROJECT_NAME} ${demo_SRCS} ${demo_INCS})
+    SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES FOLDER "Examples")
     SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${SIMOX_BIN_DIR})
 
     TARGET_LINK_LIBRARIES(${PROJECT_NAME} VirtualRobot ${SIMOX_VISUALIZATION_LIBS})
@@ -46,4 +40,4 @@ IF(SIMOX_VISUALIZATION)
     ADD_DEFINITIONS(${SIMOX_VISUALIZATION_COMPILE_FLAGS})
 
     MESSAGE( STATUS ${PROJECT_NAME} " will be placed into " ${SIMOX_BIN_DIR})
-ENDIF(SIMOX_VISUALIZATION)
+ENDIF()
diff --git a/VirtualRobot/examples/RobotViewerOSG/CMakeLists.txt b/VirtualRobot/examples/RobotViewerOSG/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..40219f52085ac153bc472822878646dffc8763a6
--- /dev/null
+++ b/VirtualRobot/examples/RobotViewerOSG/CMakeLists.txt
@@ -0,0 +1,44 @@
+PROJECT ( RobotViewerOSG )
+
+CMAKE_MINIMUM_REQUIRED(VERSION 2.6.4)
+
+CMAKE_POLICY(VERSION 2.6)
+
+IF(SIMOX_VISUALIZATION AND SIMOX_USE_OPENSCENEGRAPH_VISUALIZATION)
+    
+    LINK_DIRECTORIES(${SIMOX_LIB_DIR})
+    
+	    
+	# the variable "demo_SRCS" contains all .cpp files of this project
+	FILE(GLOB demo_SRCS ${PROJECT_SOURCE_DIR}/RobotViewer.cpp ${PROJECT_SOURCE_DIR}/showRobotWindow.cpp osgViewerWidget.cpp)
+	FILE(GLOB demo_INCS ${PROJECT_SOURCE_DIR}/showRobotWindow.h osgViewerWidget.h)
+
+  
+    ################################## moc'ing ##############################
+    set(GUI_MOC_HDRS
+        ${PROJECT_SOURCE_DIR}/showRobotWindow.h
+        ${PROJECT_SOURCE_DIR}/osgViewerWidget.h
+    )
+
+    set(GUI_UIS
+        ${PROJECT_SOURCE_DIR}/RobotViewer.ui
+    )
+
+    qt4_wrap_cpp(demo_SRCS ${GUI_MOC_HDRS})
+    qt4_wrap_ui(UI_HEADER ${GUI_UIS})
+    get_filename_component(UI_HEADER_DIR ${UI_HEADER} PATH)
+    list(APPEND demo_INCS ${UI_HEADER})
+
+    include_directories(${UI_HEADER_DIR})
+
+    ADD_EXECUTABLE(${PROJECT_NAME} ${demo_SRCS} ${demo_INCS})
+    SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES FOLDER "Examples")
+    SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${SIMOX_BIN_DIR})
+
+    TARGET_LINK_LIBRARIES(${PROJECT_NAME} VirtualRobot ${SIMOX_VISUALIZATION_LIBS})
+    INCLUDE_DIRECTORIES(${SIMOX_VISUALIZATION_INCLUDE_PATHS})
+    INCLUDE(${QT_USE_FILE})
+    ADD_DEFINITIONS(${SIMOX_VISUALIZATION_COMPILE_FLAGS})
+
+    MESSAGE( STATUS ${PROJECT_NAME} " will be placed into " ${SIMOX_BIN_DIR})
+ENDIF()
diff --git a/VirtualRobot/examples/RobotViewerOSG/RobotViewer.cpp b/VirtualRobot/examples/RobotViewerOSG/RobotViewer.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..a866b1794c292cbbb942cf04494e1e883fefa038
--- /dev/null
+++ b/VirtualRobot/examples/RobotViewerOSG/RobotViewer.cpp
@@ -0,0 +1,46 @@
+#include <VirtualRobot/Robot.h>
+#include <VirtualRobot/VirtualRobotException.h>
+#include <VirtualRobot/RuntimeEnvironment.h>
+
+
+#include <boost/shared_ptr.hpp>
+#include <string>
+#include <iostream>
+
+using std::cout;
+using std::endl;
+using namespace VirtualRobot;
+
+#include <Eigen/Core>
+#include <Eigen/Geometry>
+
+#include "showRobotWindow.h"
+
+bool useColModel = false;
+
+
+int main(int argc, char *argv[])
+{
+	VirtualRobot::RuntimeEnvironment::considerKey("robot");
+	VirtualRobot::RuntimeEnvironment::processCommandLine(argc,argv);
+	VirtualRobot::RuntimeEnvironment::print();
+	
+	cout << " --- START --- " << endl;
+	std::string filename(VR_BASE_DIR "/examples/RobotViewerOSG/modelsOSG/Joint3DH.xml");
+
+	if (VirtualRobot::RuntimeEnvironment::hasValue("robot"))
+	{
+		std::string robFile = VirtualRobot::RuntimeEnvironment::getValue("robot");
+		if (VirtualRobot::RuntimeEnvironment::getDataFileAbsolute(robFile))
+		{
+			filename = robFile;
+		}
+	}
+	cout << "Using robot at " << filename << endl;
+	
+	QApplication app(argc, argv);
+
+	showRobotWindow rw(filename);
+	rw.show();
+	return app.exec();
+}
diff --git a/VirtualRobot/examples/RobotViewerOSG/RobotViewer.ui b/VirtualRobot/examples/RobotViewerOSG/RobotViewer.ui
new file mode 100644
index 0000000000000000000000000000000000000000..8b42ca8822d7c8b28b81513046f9beaa33d1052c
--- /dev/null
+++ b/VirtualRobot/examples/RobotViewerOSG/RobotViewer.ui
@@ -0,0 +1,429 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>MainWindowShowRobot</class>
+ <widget class="QMainWindow" name="MainWindowShowRobot">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>866</width>
+    <height>677</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Simox - VirtualRobot - Show Robot</string>
+  </property>
+  <widget class="QWidget" name="centralwidget">
+   <layout class="QGridLayout" name="gridLayout">
+    <item row="0" column="1">
+     <widget class="QGroupBox" name="groupBox">
+      <property name="sizePolicy">
+       <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+        <horstretch>0</horstretch>
+        <verstretch>0</verstretch>
+       </sizepolicy>
+      </property>
+      <property name="maximumSize">
+       <size>
+        <width>200</width>
+        <height>16777215</height>
+       </size>
+      </property>
+      <property name="title">
+       <string/>
+      </property>
+      <widget class="QPushButton" name="pushButtonReset">
+       <property name="geometry">
+        <rect>
+         <x>20</x>
+         <y>20</y>
+         <width>171</width>
+         <height>28</height>
+        </rect>
+       </property>
+       <property name="text">
+        <string>Reset</string>
+       </property>
+      </widget>
+      <widget class="QGroupBox" name="groupBox_2">
+       <property name="geometry">
+        <rect>
+         <x>0</x>
+         <y>470</y>
+         <width>201</width>
+         <height>171</height>
+        </rect>
+       </property>
+       <property name="title">
+        <string>Display options</string>
+       </property>
+       <widget class="QCheckBox" name="checkBoxColModel">
+        <property name="geometry">
+         <rect>
+          <x>10</x>
+          <y>30</y>
+          <width>131</width>
+          <height>20</height>
+         </rect>
+        </property>
+        <property name="text">
+         <string>Collision model</string>
+        </property>
+       </widget>
+       <widget class="QCheckBox" name="checkBoxStructure">
+        <property name="geometry">
+         <rect>
+          <x>30</x>
+          <y>110</y>
+          <width>131</width>
+          <height>20</height>
+         </rect>
+        </property>
+        <property name="text">
+         <string>Robot structure</string>
+        </property>
+       </widget>
+       <widget class="QCheckBox" name="checkBoxRobotCoordSystems">
+        <property name="geometry">
+         <rect>
+          <x>30</x>
+          <y>140</y>
+          <width>131</width>
+          <height>20</height>
+         </rect>
+        </property>
+        <property name="text">
+         <string>Coordinate systems</string>
+        </property>
+       </widget>
+       <widget class="QCheckBox" name="checkBoxFullModel">
+        <property name="geometry">
+         <rect>
+          <x>30</x>
+          <y>80</y>
+          <width>131</width>
+          <height>20</height>
+         </rect>
+        </property>
+        <property name="text">
+         <string>IV Model</string>
+        </property>
+       </widget>
+       <widget class="QLabel" name="label">
+        <property name="geometry">
+         <rect>
+          <x>10</x>
+          <y>60</y>
+          <width>131</width>
+          <height>16</height>
+         </rect>
+        </property>
+        <property name="text">
+         <string>Full model options</string>
+        </property>
+       </widget>
+      </widget>
+      <widget class="QPushButton" name="pushButtonLoad">
+       <property name="geometry">
+        <rect>
+         <x>20</x>
+         <y>60</y>
+         <width>171</width>
+         <height>28</height>
+        </rect>
+       </property>
+       <property name="text">
+        <string>Select Robot File</string>
+       </property>
+      </widget>
+      <widget class="QGroupBox" name="groupBox_3">
+       <property name="geometry">
+        <rect>
+         <x>0</x>
+         <y>100</y>
+         <width>201</width>
+         <height>241</height>
+        </rect>
+       </property>
+       <property name="title">
+        <string>Joints</string>
+       </property>
+       <property name="flat">
+        <bool>false</bool>
+       </property>
+       <property name="checkable">
+        <bool>false</bool>
+       </property>
+       <widget class="QLabel" name="label_2">
+        <property name="geometry">
+         <rect>
+          <x>20</x>
+          <y>130</y>
+          <width>81</width>
+          <height>16</height>
+         </rect>
+        </property>
+        <property name="text">
+         <string>Joint Value</string>
+        </property>
+       </widget>
+       <widget class="QLCDNumber" name="lcdNumberJointValue">
+        <property name="geometry">
+         <rect>
+          <x>90</x>
+          <y>120</y>
+          <width>101</width>
+          <height>31</height>
+         </rect>
+        </property>
+        <property name="smallDecimalPoint">
+         <bool>true</bool>
+        </property>
+        <property name="numDigits">
+         <number>5</number>
+        </property>
+        <property name="digitCount">
+         <number>5</number>
+        </property>
+        <property name="value" stdset="0">
+         <double>0.000000000000000</double>
+        </property>
+       </widget>
+       <widget class="QSlider" name="horizontalSliderPos">
+        <property name="geometry">
+         <rect>
+          <x>10</x>
+          <y>160</y>
+          <width>181</width>
+          <height>20</height>
+         </rect>
+        </property>
+        <property name="maximum">
+         <number>1000</number>
+        </property>
+        <property name="pageStep">
+         <number>50</number>
+        </property>
+        <property name="orientation">
+         <enum>Qt::Horizontal</enum>
+        </property>
+       </widget>
+       <widget class="QLabel" name="labelMinPos">
+        <property name="geometry">
+         <rect>
+          <x>10</x>
+          <y>180</y>
+          <width>91</width>
+          <height>21</height>
+         </rect>
+        </property>
+        <property name="text">
+         <string>-1.57</string>
+        </property>
+       </widget>
+       <widget class="QLabel" name="labelMaxPos">
+        <property name="geometry">
+         <rect>
+          <x>110</x>
+          <y>180</y>
+          <width>81</width>
+          <height>20</height>
+         </rect>
+        </property>
+        <property name="layoutDirection">
+         <enum>Qt::RightToLeft</enum>
+        </property>
+        <property name="text">
+         <string>1.57</string>
+        </property>
+       </widget>
+       <widget class="QComboBox" name="comboBoxJoint">
+        <property name="geometry">
+         <rect>
+          <x>10</x>
+          <y>90</y>
+          <width>181</width>
+          <height>22</height>
+         </rect>
+        </property>
+       </widget>
+       <widget class="QCheckBox" name="checkBoxShowCoordSystem">
+        <property name="geometry">
+         <rect>
+          <x>20</x>
+          <y>210</y>
+          <width>161</width>
+          <height>20</height>
+         </rect>
+        </property>
+        <property name="text">
+         <string>Joint's Coord System</string>
+        </property>
+       </widget>
+       <widget class="QComboBox" name="comboBoxRobotNodeSet">
+        <property name="geometry">
+         <rect>
+          <x>10</x>
+          <y>40</y>
+          <width>181</width>
+          <height>22</height>
+         </rect>
+        </property>
+       </widget>
+       <widget class="QLabel" name="label_3">
+        <property name="geometry">
+         <rect>
+          <x>10</x>
+          <y>20</y>
+          <width>131</width>
+          <height>16</height>
+         </rect>
+        </property>
+        <property name="text">
+         <string>Select RobotNodeSet</string>
+        </property>
+       </widget>
+       <widget class="QLabel" name="label_4">
+        <property name="geometry">
+         <rect>
+          <x>10</x>
+          <y>70</y>
+          <width>131</width>
+          <height>16</height>
+         </rect>
+        </property>
+        <property name="text">
+         <string>Select Joint</string>
+        </property>
+       </widget>
+      </widget>
+      <widget class="QGroupBox" name="groupBox_4">
+       <property name="geometry">
+        <rect>
+         <x>0</x>
+         <y>350</y>
+         <width>201</width>
+         <height>111</height>
+        </rect>
+       </property>
+       <property name="title">
+        <string>End Effector</string>
+       </property>
+       <widget class="QComboBox" name="comboBoxEndEffector">
+        <property name="geometry">
+         <rect>
+          <x>10</x>
+          <y>30</y>
+          <width>181</width>
+          <height>22</height>
+         </rect>
+        </property>
+       </widget>
+       <widget class="QPushButton" name="pushButtonClose">
+        <property name="geometry">
+         <rect>
+          <x>20</x>
+          <y>70</y>
+          <width>75</width>
+          <height>23</height>
+         </rect>
+        </property>
+        <property name="text">
+         <string>Close</string>
+        </property>
+       </widget>
+       <widget class="QPushButton" name="pushButtonOpen">
+        <property name="geometry">
+         <rect>
+          <x>110</x>
+          <y>70</y>
+          <width>75</width>
+          <height>23</height>
+         </rect>
+        </property>
+        <property name="text">
+         <string>Open</string>
+        </property>
+       </widget>
+      </widget>
+      <widget class="QGroupBox" name="groupBox_5">
+       <property name="geometry">
+        <rect>
+         <x>0</x>
+         <y>649</y>
+         <width>201</width>
+         <height>101</height>
+        </rect>
+       </property>
+       <property name="title">
+        <string>Triangles</string>
+       </property>
+       <widget class="QLabel" name="labelInfo1">
+        <property name="geometry">
+         <rect>
+          <x>10</x>
+          <y>20</y>
+          <width>181</width>
+          <height>16</height>
+         </rect>
+        </property>
+        <property name="text">
+         <string>TextLabel</string>
+        </property>
+       </widget>
+       <widget class="QLabel" name="labelInfo2">
+        <property name="geometry">
+         <rect>
+          <x>10</x>
+          <y>40</y>
+          <width>191</width>
+          <height>16</height>
+         </rect>
+        </property>
+        <property name="text">
+         <string>TextLabel</string>
+        </property>
+       </widget>
+       <widget class="QLabel" name="labelInfo3">
+        <property name="geometry">
+         <rect>
+          <x>10</x>
+          <y>60</y>
+          <width>191</width>
+          <height>16</height>
+         </rect>
+        </property>
+        <property name="text">
+         <string>TextLabel</string>
+        </property>
+       </widget>
+      </widget>
+     </widget>
+    </item>
+    <item row="0" column="0">
+     <widget class="QFrame" name="frameViewer">
+      <property name="frameShape">
+       <enum>QFrame::StyledPanel</enum>
+      </property>
+      <property name="frameShadow">
+       <enum>QFrame::Raised</enum>
+      </property>
+     </widget>
+    </item>
+   </layout>
+  </widget>
+  <widget class="QMenuBar" name="menubar">
+   <property name="geometry">
+    <rect>
+     <x>0</x>
+     <y>0</y>
+     <width>866</width>
+     <height>21</height>
+    </rect>
+   </property>
+  </widget>
+  <widget class="QStatusBar" name="statusbar"/>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/VirtualRobot/examples/RobotViewerOSG/modelsOSG/Joint3DH.xml b/VirtualRobot/examples/RobotViewerOSG/modelsOSG/Joint3DH.xml
new file mode 100644
index 0000000000000000000000000000000000000000..8cd76e1630cf9a472f696ceca3a003d5a6d8476f
--- /dev/null
+++ b/VirtualRobot/examples/RobotViewerOSG/modelsOSG/Joint3DH.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Robot Type="Simple3DoFRobot" StandardName="Simple3DoFRobot" RootNode="Start">
+	
+	<RobotNode name="Start">
+		<Visualization enable="false">
+			<CoordinateAxis enable="true" scaling="1" text="Root"/>
+		</Visualization>
+		<Child name="Joint1"/>
+	</RobotNode>
+
+	<RobotNode name="Joint1">
+		<Joint type="revolute">
+			<Limits unit="degree" lo="-90" hi="90"/>
+      <DH a="300" d="0" theta="0" alpha="90" units="degree"/>
+    </Joint>
+		<Visualization enable="true">
+			 <File type="osg">joint_rot_sphere.iv</File>
+			 <UseAsCollisionModel/>
+		</Visualization>
+		<Child name="Joint2"/>
+	</RobotNode>
+
+	<RobotNode name="Joint2">
+		<Joint type="revolute">
+			<Limits unit="degree" lo="0" hi="360"/>
+      <DH a="300" d="0" theta="0" alpha="0" units="degree"/>
+    </Joint>
+		<Visualization enable="true">
+			 <File type="osg">joint_rot_sphere.iv</File>
+			 <UseAsCollisionModel/>
+		</Visualization>
+		<Child name="Joint3"/>
+	</RobotNode>
+
+	<RobotNode name="Joint3">
+		<Joint type="revolute">
+			<Limits unit="degree" lo="-90" hi="90"/>
+      <DH a="300" d="0" theta="0" alpha="0" units="degree"/>
+    </Joint>
+		<Visualization enable="true">
+			 <File type="osg">joint_rot_sphere.iv</File>
+			 <UseAsCollisionModel/>
+		</Visualization>
+		<Child name="EndPoint"/>
+	</RobotNode>
+
+	<RobotNode name="EndPoint">
+	  <Joint type="fixed">
+    </Joint>
+		<Visualization enable="true">
+			 <File type="osg">sphere.iv</File>
+			 <UseAsCollisionModel/>
+		</Visualization>
+	</RobotNode>
+
+	<RobotNodeSet name="AllJoints" kinematicRoot="Joint1">
+		<Node name="Joint1"/>
+		<Node name="Joint2"/>
+		<Node name="Joint3"/>
+	</RobotNodeSet>
+
+	<RobotNodeSet name="CollisionModel">
+		<Node name="Joint1"/>
+		<Node name="Joint2"/>
+		<Node name="Joint3"/>
+  	<Node name="EndPoint"/>
+	</RobotNodeSet>
+
+</Robot>
diff --git a/VirtualRobot/examples/RobotViewerOSG/modelsOSG/joint.iv b/VirtualRobot/examples/RobotViewerOSG/modelsOSG/joint.iv
new file mode 100644
index 0000000000000000000000000000000000000000..86d4dea31266f7b9d9224df559d00c33b10fd9df
--- /dev/null
+++ b/VirtualRobot/examples/RobotViewerOSG/modelsOSG/joint.iv
@@ -0,0 +1,22 @@
+#Inventor V2.0 ascii
+
+Separator {
+    
+    #Units {
+     #       units MILLIMETERS
+    #}
+    Material {
+        diffuseColor    1 1 1
+    }
+    Rotation {
+        rotation 1 0 0  1.57
+    }
+    Translation {
+        translation 0 150 0
+    }
+    Cylinder {
+        radius 50
+        height 300
+        parts (SIDES | TOP | BOTTOM)
+    }
+}
\ No newline at end of file
diff --git a/VirtualRobot/examples/RobotViewerOSG/modelsOSG/joint_rot.iv b/VirtualRobot/examples/RobotViewerOSG/modelsOSG/joint_rot.iv
new file mode 100644
index 0000000000000000000000000000000000000000..6b1e0c5c0e58c7388912b77e9ca9386a0db4cb4f
--- /dev/null
+++ b/VirtualRobot/examples/RobotViewerOSG/modelsOSG/joint_rot.iv
@@ -0,0 +1,22 @@
+#Inventor V2.0 ascii
+
+Separator {
+    
+    #Units {
+     #       units MILLIMETERS
+    #}
+    Material {
+        diffuseColor    1 1 1
+    }
+    Rotation {
+        rotation 0 0 1  -1.57
+    }
+    Translation {
+        translation 0 150 0
+    }
+    Cylinder {
+        radius 50
+        height 300
+        parts (SIDES | TOP | BOTTOM)
+    }
+}
\ No newline at end of file
diff --git a/VirtualRobot/examples/RobotViewerOSG/modelsOSG/joint_rot_sphere.iv b/VirtualRobot/examples/RobotViewerOSG/modelsOSG/joint_rot_sphere.iv
new file mode 100644
index 0000000000000000000000000000000000000000..520133ba86de69a0f2997dbb4fb95494ad5ca3c1
--- /dev/null
+++ b/VirtualRobot/examples/RobotViewerOSG/modelsOSG/joint_rot_sphere.iv
@@ -0,0 +1,25 @@
+#Inventor V2.0 ascii
+
+Separator {
+    
+    #Units {
+     #       units MILLIMETERS
+    #}
+    Material {
+        diffuseColor    1 1 1
+    }
+    Rotation {
+        rotation 0 0 1  -1.57
+    }
+    Sphere {
+        radius 70
+    }
+     Translation {
+        translation 0 150 0
+    }
+    Cylinder {
+        radius 50
+        height 300
+        parts (SIDES | TOP | BOTTOM)
+    }
+}
\ No newline at end of file
diff --git a/VirtualRobot/examples/RobotViewerOSG/modelsOSG/joint_sphere.iv b/VirtualRobot/examples/RobotViewerOSG/modelsOSG/joint_sphere.iv
new file mode 100644
index 0000000000000000000000000000000000000000..ac0b0895da75a8497e9f7dbe717b00907ccb588e
--- /dev/null
+++ b/VirtualRobot/examples/RobotViewerOSG/modelsOSG/joint_sphere.iv
@@ -0,0 +1,25 @@
+#Inventor V2.0 ascii
+
+Separator {
+    
+    #Units {
+     #       units MILLIMETERS
+    #}
+    Material {
+        diffuseColor    1 1 1
+    }
+    Rotation {
+        rotation 1 0 0  1.57
+    }
+    Sphere {
+        radius 70
+    }
+     Translation {
+        translation 0 150 0
+    }
+    Cylinder {
+        radius 50
+        height 300
+        parts (SIDES | TOP | BOTTOM)
+    }
+}
\ No newline at end of file
diff --git a/VirtualRobot/examples/RobotViewerOSG/modelsOSG/sphere.iv b/VirtualRobot/examples/RobotViewerOSG/modelsOSG/sphere.iv
new file mode 100644
index 0000000000000000000000000000000000000000..8584430130f7ebaf65ab9e431b1301bd62236563
--- /dev/null
+++ b/VirtualRobot/examples/RobotViewerOSG/modelsOSG/sphere.iv
@@ -0,0 +1,17 @@
+#Inventor V2.0 ascii
+
+Separator {
+    
+    #Units {
+    #        units MILLIMETERS
+    #}
+    Material {
+        diffuseColor    1 1 1
+    }
+
+
+    Sphere {
+        radius 70
+
+    }
+}
\ No newline at end of file
diff --git a/VirtualRobot/examples/RobotViewerOSG/osgViewerWidget.cpp b/VirtualRobot/examples/RobotViewerOSG/osgViewerWidget.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..89132460639d1c2e6f3083650d3636551baa1923
--- /dev/null
+++ b/VirtualRobot/examples/RobotViewerOSG/osgViewerWidget.cpp
@@ -0,0 +1,297 @@
+#include "osgViewerWidget.h"
+
+#include <osgGA/TrackballManipulator>
+#include <osgGA/StateSetManipulator>
+
+osgViewerWidget::osgViewerWidget(osg::Node* scene, QWidget *parent) : QGLWidget(parent)
+{
+	viewer = new osgViewer::Viewer;
+	transformation = new osg::MatrixTransform;
+	if (scene)
+		transformation->addChild(scene);
+
+	paintTimer.setInterval(20);
+	canvasSize.setWidth(200);
+	canvasSize.setHeight(200);
+	if (parent)
+		canvasSize = parent->size();
+}
+
+void osgViewerWidget::initializeGL()
+{
+	window = viewer->setUpViewerAsEmbeddedInWindow(0, 0, canvasSize.width(), canvasSize.height());
+	viewer->addEventHandler(new osgGA::StateSetManipulator(transformation->getOrCreateStateSet()));
+	viewer->addEventHandler(new osgViewer::StatsHandler);
+	viewer->addEventHandler(new osgViewer::WindowSizeHandler);
+	viewer->setCameraManipulator(new osgGA::TrackballManipulator);
+	viewer->setSceneData(transformation.get());
+
+	connect(&paintTimer, SIGNAL(timeout()), this, SLOT(timerCB()));
+	paintTimer.start();
+}
+
+void osgViewerWidget::resizeGL(int width, int height)
+{
+	// this method is not invoked on when resizing the window?!
+	std::cout << "resizeGL " << width << "," << height << std::endl;
+	resizeOSG(width,height);
+}
+
+void osgViewerWidget::resizeOSG(int width, int height)
+{
+	if (window.valid() && parentWidget())
+	{
+		//std::cout << "Resizing " << width << "," << height << std::endl;
+		window->resized(window->getTraits()->x, window->getTraits()->y, width, height);
+		window->getEventQueue()->windowResize(window->getTraits()->x, window->getTraits()->y, width, height);
+		// the qt GLwidget must also be resized
+		resize(width,height);
+		//window = viewer->setUpViewerAsEmbeddedInWindow(0, 0, width, height);
+	}
+}
+
+void osgViewerWidget::timerCB()
+{
+	if (parentWidget())
+	{
+		// since resizeGL is not called we need this little hack to ensure correct resizing of our widget
+		if (canvasSize != parentWidget()->size() &&
+			QApplication::mouseButtons() == Qt::NoButton)
+		{
+			//std::cout << "Resizing..." << std::endl;
+			resizeOSG(parentWidget()->size().width(),parentWidget()->size().height());
+			canvasSize = parentWidget()->size();
+		}
+	}
+	paintOSG();
+
+}
+void osgViewerWidget::paintOSG()
+{
+	if (viewer.valid())
+	{
+		makeCurrent();
+		viewer->frame();
+		swapBuffers();
+	}
+}
+
+void osgViewerWidget::paintGL()
+{
+	paintOSG();
+
+}
+
+//////////////////////////////////////////////////////////////////////////////////
+void osgViewerWidget::keyPressEvent( QKeyEvent* event )
+{
+	if (window.valid())
+	{
+		//int value = STATIC_KEY_MAP.remapKey(event);
+		//window->getEventQueue()->keyPress( value );
+	}
+}
+
+//////////////////////////////////////////////////////////////////////////////////
+void osgViewerWidget::keyReleaseEvent( QKeyEvent* event )
+{
+	if (window.valid())
+	{
+		//int value = STATIC_KEY_MAP.remapKey(event);
+		//window->getEventQueue()->keyRelease( value );
+	}
+}
+
+//////////////////////////////////////////////////////////////////////////////////
+void osgViewerWidget::mousePressEvent( QMouseEvent* event )
+{
+	int button = 0;
+	switch(event->button())
+	{
+		case(Qt::LeftButton): 
+			button = 1; 
+			break;
+		case(Qt::MidButton): 
+			button = 2; 
+			break;
+		case(Qt::RightButton): 
+			button = 3; 
+			break;
+		case(Qt::NoButton):
+			button = 0; 
+			break;
+		default: 
+			button = 0; 
+			break;
+	}
+	if (window.valid())
+		window->getEventQueue()->mouseButtonPress(event->x(), event->y(), button);
+
+}
+
+//////////////////////////////////////////////////////////////////////////////////
+void osgViewerWidget::mouseReleaseEvent( QMouseEvent* event )
+{
+	int button = 0;
+	switch(event->button())
+	{
+	case(Qt::LeftButton):
+		button = 1; 
+		break;
+	case(Qt::MidButton): 
+		button = 2; 
+		break;
+	case (Qt::RightButton): 
+		button = 3; 
+		break;
+	case(Qt::NoButton): 
+		button = 0; 
+		break;
+	default: 
+		button = 0; 
+		break;
+	}
+	if (window.valid())
+		window->getEventQueue()->mouseButtonRelease(event->x(), event->y(), button);
+}
+
+//////////////////////////////////////////////////////////////////////////////////
+void osgViewerWidget::mouseMoveEvent( QMouseEvent* event )
+{
+	if (window.valid())
+		window->getEventQueue()->mouseMotion(event->x(), event->y());
+}
+
+//////////////////////////////////////////////////////////////////////////
+void osgViewerWidget::mouseDoubleClickEvent( QMouseEvent* event )
+{
+	int button = 0;
+	switch(event->button())
+	{
+		case(Qt::LeftButton): 
+			button = 1; 
+			break;
+		case(Qt::MidButton): 
+			button = 2; 
+			break;
+		case(Qt::RightButton): 
+			button = 3; 
+			break;
+		case(Qt::NoButton): 
+			button = 0; 
+			break;
+		default: 
+			button = 0; 
+			break;
+	}
+
+	if (window.valid())
+		window->getEventQueue()->mouseDoubleButtonPress(event->x(), event->y(), button);
+}
+
+//////////////////////////////////////////////////////////////////////////////////
+void osgViewerWidget::wheelEvent(QWheelEvent* event)
+{
+	if (window.valid())
+	{
+		if (event->orientation() == Qt::Horizontal)
+		{
+			if (event->delta() > 0)
+			{
+				window->getEventQueue()->mouseScroll(osgGA::GUIEventAdapter::SCROLL_LEFT);
+			}
+			else
+			{
+				window->getEventQueue()->mouseScroll(osgGA::GUIEventAdapter::SCROLL_RIGHT);
+			}
+		}
+		else
+		{
+			if (event->delta() > 0)
+			{
+				window->getEventQueue()->mouseScroll(osgGA::GUIEventAdapter::SCROLL_UP);
+			}
+			else
+			{
+				window->getEventQueue()->mouseScroll(osgGA::GUIEventAdapter::SCROLL_DOWN);
+			}
+		}
+	}
+}
+
+void osgViewerWidget::resizeEvent( QResizeEvent *event )
+{
+	QSize widgetSize = event->size();
+	std::cout << "w:" << widgetSize.width() << ", h:" << widgetSize.height() << std::endl;
+
+	QWidget::resizeEvent(event);
+}
+
+
+/*
+
+osgViewerWidget::osgViewerWidget(osg::Node* scene, QWidget* parent, osgViewer::ViewerBase::ThreadingModel threadingModel) : QWidget(parent)
+{
+    setThreadingModel(threadingModel);
+	
+	//camera = createCamera(0,0,200,200,"OSGViewer");    
+    view = new osgViewer::View;
+	//view->setCamera( camera );
+	camera = view->getCamera();
+
+    addView( view ); 
+    view->setSceneData( scene );
+    view->addEventHandler( new osgViewer::StatsHandler );
+    view->setCameraManipulator( new osgGA::TrackballManipulator );
+	view->setUpViewerAsEmbeddedInWindow(50, 50, 1024, 768);
+	view->getEventQueue()->windowResize(0, 0, 1024, 768);
+
+	QVBoxLayout *vbox = new QVBoxLayout(this);
+	vbox->addWidget(getQWidget());
+	setLayout( vbox );
+
+	this->show();
+
+    connect( &_timer, SIGNAL(timeout()), this, SLOT(update()) );
+    _timer.start( 10 );
+}
+  
+QWidget* osgViewerWidget::getQWidget()
+{
+	if (!camera)
+		return NULL;
+	osgQt::GraphicsWindowQt* gw = dynamic_cast<osgQt::GraphicsWindowQt*>( camera->getGraphicsContext() );
+	return gw ? gw->getGLWidget() : NULL;
+}
+    
+osg::Camera* osgViewerWidget::createCamera( int x, int y, int w, int h, const std::string& name, bool windowDecoration )
+{
+    osg::DisplaySettings* ds = osg::DisplaySettings::instance().get();
+    osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
+    traits->windowName = name;
+    traits->windowDecoration = windowDecoration;
+    traits->x = x;
+    traits->y = y;
+    traits->width = w;
+    traits->height = h;
+    traits->doubleBuffer = true;
+    traits->alpha = ds->getMinimumNumAlphaBits();
+    traits->stencil = ds->getMinimumNumStencilBits();
+    traits->sampleBuffers = ds->getMultiSamples();
+    traits->samples = ds->getNumMultiSamples();
+        
+    osg::ref_ptr<osg::Camera> camera = new osg::Camera;
+    camera->setGraphicsContext( new osgQt::GraphicsWindowQt(traits.get()) );
+        
+    camera->setClearColor( osg::Vec4(0.2, 0.2, 0.6, 1.0) );
+    camera->setViewport( new osg::Viewport(0, 0, traits->width, traits->height) );
+    camera->setProjectionMatrixAsPerspective(
+        30.0f, static_cast<double>(traits->width)/static_cast<double>(traits->height), 1.0f, 10000.0f );
+    return camera.release();
+}
+    
+void osgViewerWidget::paintEvent( QPaintEvent* event )
+{
+	frame();
+}
+*/
\ No newline at end of file
diff --git a/VirtualRobot/examples/RobotViewerOSG/osgViewerWidget.h b/VirtualRobot/examples/RobotViewerOSG/osgViewerWidget.h
new file mode 100644
index 0000000000000000000000000000000000000000..2076c3b7c4e72e8fe8015e99f9c0405f2addeecc
--- /dev/null
+++ b/VirtualRobot/examples/RobotViewerOSG/osgViewerWidget.h
@@ -0,0 +1,85 @@
+#include <QtCore/QTimer>
+#include <QtGui/QApplication>
+#include <QtGui/QGridLayout>
+#include <QtGui/QKeyEvent>
+
+#include <osgViewer/CompositeViewer>
+#include <osgViewer/ViewerEventHandlers>
+
+#include <osgGA/TrackballManipulator>
+
+#include <osgDB/ReadFile>
+
+#include <osgQt/GraphicsWindowQt>
+
+#include <iostream>
+
+#include <QGLWidget>
+#include <osgViewer/Viewer>
+#include <osgDB/ReadFile>
+#include <osgGA/TrackballManipulator>
+#include <osg/MatrixTransform>
+
+class osgViewerWidget: public QGLWidget
+{
+	Q_OBJECT
+
+	public:
+		explicit osgViewerWidget(osg::Node* scene, QWidget *parent = 0);
+
+	public slots:
+
+		void timerCB();
+	
+	protected:
+		virtual void initializeGL();
+		virtual void resizeGL( int width, int height );
+
+		virtual void paintGL();
+
+		void resizeEvent(QResizeEvent *event);
+
+		virtual void keyPressEvent( QKeyEvent* event );
+		virtual void keyReleaseEvent( QKeyEvent* event );
+		virtual void mousePressEvent( QMouseEvent* event );
+		virtual void mouseReleaseEvent( QMouseEvent* event );
+		virtual void mouseMoveEvent( QMouseEvent* event );
+		virtual void mouseDoubleClickEvent(QMouseEvent* event);
+		virtual void wheelEvent(QWheelEvent* event);
+
+		void paintOSG();
+		void resizeOSG(int width, int height);
+protected:
+
+		osg::ref_ptr<osgViewer::Viewer> viewer;
+		osg::observer_ptr<osgViewer::GraphicsWindowEmbedded> window;
+		osg::ref_ptr<osg::Node> loadedModel;
+		osg::ref_ptr<osg::MatrixTransform> transformation;
+
+		//osgQt::GraphicsWindowQt* m_qt_win;
+
+		QTimer paintTimer;
+		QSize canvasSize;
+};
+
+/*
+class osgViewerWidget : public QWidget, public osgViewer::CompositeViewer
+{
+public:
+	osgViewerWidget(osg::Node* scene, QWidget* parent = NULL, osgViewer::ViewerBase::ThreadingModel threadingModel=osgViewer::CompositeViewer::SingleThreaded);
+
+
+
+	osg::Camera* createCamera( int x, int y, int w, int h, const std::string& name="", bool windowDecoration=false );
+
+
+	virtual void paintEvent( QPaintEvent* event );
+	QWidget* getQWidget();
+
+protected:
+	osgViewer::View* view;
+	osg::Camera* camera;
+	QTimer _timer;
+};*/
+
+
diff --git a/VirtualRobot/examples/RobotViewerOSG/showRobotWindow.cpp b/VirtualRobot/examples/RobotViewerOSG/showRobotWindow.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..5fc254e0308e74019f7c2e067ca53e6ddaa9c6ec
--- /dev/null
+++ b/VirtualRobot/examples/RobotViewerOSG/showRobotWindow.cpp
@@ -0,0 +1,506 @@
+
+#include "showRobotWindow.h"
+#include "VirtualRobot/EndEffector/EndEffector.h"
+#include "VirtualRobot/ReachabilitySpace.h"
+
+ #include <QFileDialog>
+#include <Eigen/Geometry>
+
+#include <time.h>
+#include <vector>
+#include <iostream>
+#include <cmath>
+
+#include <osg/Shape>
+#include <osg/ShapeDrawable>
+#include <sstream>
+using namespace std;
+using namespace VirtualRobot;
+
+float TIMER_MS = 30.0f;
+
+showRobotWindow::showRobotWindow(std::string &sRobotFilename, Qt::WFlags flags)
+:QMainWindow(NULL)
+{
+	VR_INFO << " start " << endl;
+	//this->setCaption(QString("ShowRobot - KIT - Humanoids Group"));
+	resize(1100, 768);
+
+	useColModel = false;
+	m_sRobotFilename = sRobotFilename;
+
+	osgRoot = new osg::Group();
+	osgRobot = new osg::Group();
+	osgRoot->addChild(osgRobot);
+	/*sceneSep = new SoSeparator;
+	sceneSep->ref();
+	robotSep = new SoSeparator;*/
+
+	//sceneSep->addChild(robotSep);
+
+	setupUI();
+	
+	loadRobot();
+
+	 //m_pExViewer->viewAll();
+}
+
+
+showRobotWindow::~showRobotWindow()
+{
+	//sceneSep->unref();
+}
+
+/*
+void CShowRobotWindow::saveScreenshot()
+{
+	static int counter = 0;
+	SbString framefile;
+
+	framefile.sprintf("MPL_Render_Frame%06d.png", counter);
+	counter++;
+
+	 //m_pExViewer->getSceneManager()->render();
+	 //m_pExViewer->getSceneManager()->scheduleRedraw();
+	QGLWidget* w = (QGLWidget*) //m_pExViewer->getGLWidget();
+
+	QImage i = w->grabFrameBuffer();
+	bool bRes = i.save(framefile.getString(), "PNG");
+	if (bRes)
+		cout << "wrote image " << counter << endl;
+	else
+		cout << "failed writing image " << counter << endl;
+
+}*/
+
+void showRobotWindow::setupUI()
+{
+	 UI.setupUi(this);
+	 //centralWidget()->setLayout(UI.gridLayoutViewer);
+	 //m_pExViewer = new SoQtExaminerViewer(UI.frameViewer,"",TRUE,SoQtExaminerViewer::BUILD_POPUP);
+
+	// setup
+	 //m_pExViewer->setBackgroundColor(SbColor(1.0f, 1.0f, 1.0f));
+	 //m_pExViewer->setAccumulationBuffer(true);
+#ifdef WIN32
+//#ifndef _DEBUG
+	 //m_pExViewer->setAntialiasing(true, 4);
+//#endif
+#endif
+	 //m_pExViewer->setGLRenderAction(new SoLineHighlightRenderAction);
+	 //m_pExViewer->setTransparencyType(SoGLRenderAction::BLEND);
+	 //m_pExViewer->setFeedbackVisibility(true);
+	 //m_pExViewer->setSceneGraph(sceneSep);
+	 //m_pExViewer->viewAll();
+	 this->show();
+
+	 /*osg::Box *box = new osg::Box(osg::Vec3(0,0,0),1.0f);
+	 osg::ShapeDrawable* unitCubeDrawable = new osg::ShapeDrawable(box);
+
+	 // Declare a instance of the geode class: 
+	 osg::Geode* basicShapesGeode = new osg::Geode();
+
+	 // Add the unit cube drawable to the geode:
+	 basicShapesGeode->addDrawable(unitCubeDrawable);
+	 osgRoot->addChild(basicShapesGeode);*/
+
+	 osgWidget = new osgViewerWidget(osgRoot,UI.frameViewer);
+	 osgWidget->show();
+
+	connect(UI.pushButtonReset, SIGNAL(clicked()), this, SLOT(resetSceneryAll()));
+	connect(UI.pushButtonLoad, SIGNAL(clicked()), this, SLOT(selectRobot()));
+
+	connect(UI.pushButtonClose, SIGNAL(clicked()), this, SLOT(closeHand()));
+	connect(UI.pushButtonOpen, SIGNAL(clicked()), this, SLOT(openHand()));
+	connect(UI.comboBoxEndEffector, SIGNAL(activated(int)), this, SLOT(selectEEF(int)));
+
+
+	connect(UI.checkBoxColModel, SIGNAL(clicked()), this, SLOT(collisionModel()));
+	connect(UI.checkBoxStructure, SIGNAL(clicked()), this, SLOT(robotStructure()));
+	UI.checkBoxFullModel->setChecked(true);
+	connect(UI.checkBoxFullModel, SIGNAL(clicked()), this, SLOT(robotFullModel()));
+	connect(UI.checkBoxRobotCoordSystems, SIGNAL(clicked()), this, SLOT(robotCoordSystems()));
+	connect(UI.checkBoxShowCoordSystem, SIGNAL(clicked()), this, SLOT(showCoordSystem()));
+	connect(UI.comboBoxRobotNodeSet, SIGNAL(activated(int)), this, SLOT(selectRNS(int)));
+	connect(UI.comboBoxJoint, SIGNAL(activated(int)), this, SLOT(selectJoint(int)));
+	connect(UI.horizontalSliderPos, SIGNAL(valueChanged(int)), this, SLOT(jointValueChanged(int)));
+
+}
+
+QString showRobotWindow::formatString(const char *s, float f)
+{
+	QString str1(s);
+	if (f>=0)
+		str1 += " ";
+	if (fabs(f)<1000)
+		str1 += " ";
+	if (fabs(f)<100)
+		str1 += " ";
+	if (fabs(f)<10)
+		str1 += " ";
+	QString str1n;
+	str1n.setNum(f,'f',3);
+	str1 = str1 + str1n;
+	return str1;
+}
+
+
+void showRobotWindow::resetSceneryAll()
+{
+	if (!robot)
+		return;
+
+	for (unsigned int i=0;i<allRobotNodes.size();i++)
+	{
+		allRobotNodes[i]->setJointValue(0);
+	}
+
+	selectJoint(UI.comboBoxJoint->currentIndex());
+}
+
+
+
+void showRobotWindow::displayTriangles()
+{
+	QString text1,text2,text3;
+	int trisAllFull, trisRNSFull, trisJointFull;
+	trisAllFull = trisRNSFull = trisJointFull = 0;
+	int trisAllCol,trisRNSCol,trisJointCol;
+	trisAllCol = trisRNSCol = trisJointCol = 0;
+	if (robot)
+	{
+		trisAllFull = robot->getNumFaces(false);
+		trisAllCol = robot->getNumFaces(true);
+		trisRNSFull = trisAllFull;
+		trisRNSCol = trisAllCol;
+	}
+	if (currentRobotNodeSet)
+	{
+		trisRNSFull = currentRobotNodeSet->getNumFaces(false);
+		trisRNSCol = currentRobotNodeSet->getNumFaces(true);
+	}
+	if (currentRobotNode)
+	{
+		trisJointFull = currentRobotNode->getNumFaces(false);
+		trisJointCol = currentRobotNode->getNumFaces(true);
+	}
+	if (UI.checkBoxColModel->checkState() == Qt::Checked)
+	{
+		text1 = tr("Total\t:") + QString::number(trisAllCol);
+		text2 = tr("RobotNodeSet:\t") + QString::number(trisRNSCol);
+		text3 = tr("Joint:\t") + QString::number(trisJointCol);
+	} else
+	{		
+		text1 = tr("Total:\t") + QString::number(trisAllFull);
+		text2 = tr("RobotNodeSet:\t") + QString::number(trisRNSFull);
+		text3 = tr("Joint:\t") + QString::number(trisJointFull);
+	}
+	UI.labelInfo1->setText(text1);
+	UI.labelInfo2->setText(text2);
+	UI.labelInfo3->setText(text3);
+}
+
+void showRobotWindow::robotFullModel()
+{
+	if (!robot)
+		return;
+
+	bool showFullModel = UI.checkBoxFullModel->checkState() == Qt::Checked;
+
+	robot->setupVisualization(showFullModel, true);
+
+}
+
+void showRobotWindow::collisionModel()
+{
+	if (!robot)
+		return;
+
+	if (osgRobot->getNumChildren()>0)
+		osgRobot->removeChildren(0,osgRobot->getNumChildren());
+
+	//setRobotModelShape(UI.checkBoxColModel->state() == QCheckBox::On);
+	useColModel = UI.checkBoxColModel->checkState() == Qt::Checked;
+	SceneObject::VisualizationType colModel = (UI.checkBoxColModel->isChecked())?SceneObject::Collision:SceneObject::Full;
+
+    visualization = robot->getVisualization<OSGVisualization>(colModel);
+	osg::Node* visualisationNode = NULL;
+	if (visualization)
+		visualisationNode = visualization->getOSGVisualization();
+
+	if (visualisationNode)
+		osgRobot->addChild(visualisationNode);
+
+	selectJoint(UI.comboBoxJoint->currentIndex());
+
+	UI.checkBoxStructure->setEnabled(!useColModel);
+	UI.checkBoxFullModel->setEnabled(!useColModel);
+	UI.checkBoxRobotCoordSystems->setEnabled(!useColModel);
+
+}
+
+
+void showRobotWindow::showRobot()
+{
+	//m_pGraspScenery->showRobot(m_pShowRobot->state() == QCheckBox::On);
+}
+
+void showRobotWindow::closeEvent(QCloseEvent *event)
+{
+	quit();
+	QMainWindow::closeEvent(event);
+}
+
+
+
+
+int showRobotWindow::main()
+{
+	/*SoQt::show(this);
+	SoQt::mainLoop();*/
+	return 0;
+}
+
+
+void showRobotWindow::quit()
+{
+	std::cout << "CShowRobotWindow: Closing" << std::endl;
+	this->close();
+	//SoQt::exitMainLoop();
+}
+
+void showRobotWindow::updateJointBox()
+{
+	UI.comboBoxJoint->clear();
+
+	for (unsigned int i=0;i<currentRobotNodes.size();i++)
+	{
+		UI.comboBoxJoint->addItem(QString(currentRobotNodes[i]->getName().c_str()));
+	}
+}
+
+void showRobotWindow::updateRNSBox()
+{
+	UI.comboBoxRobotNodeSet->clear();
+	UI.comboBoxRobotNodeSet->addItem(QString("<All>"));
+
+	for (unsigned int i=0;i<robotNodeSets.size();i++)
+	{
+		UI.comboBoxRobotNodeSet->addItem(QString(robotNodeSets[i]->getName().c_str()));
+	}
+}
+
+void showRobotWindow::selectRNS(int nr)
+{
+	currentRobotNodeSet.reset();
+	cout << "Selecting RNS nr " << nr << endl;
+	if (nr<=0)
+	{
+		// all joints
+		currentRobotNodes = allRobotNodes;
+	} else
+	{
+		nr--;
+		if (nr>=(int)robotNodeSets.size())
+			return;
+		currentRobotNodeSet = robotNodeSets[nr];
+		currentRobotNodes = currentRobotNodeSet->getAllRobotNodes();
+		cout << "HIGHLIGHTING rns " << currentRobotNodeSet->getName() << endl;
+		/*if (visualization)
+		{
+			
+			robot->highlight(visualization,false);
+			currentRobotNodeSet->highlight(visualization,true);
+		}*/
+ 
+	}
+	updateJointBox();
+	selectJoint(0);
+	displayTriangles();
+}
+
+void showRobotWindow::selectJoint(int nr)
+{
+	currentRobotNode.reset();
+	cout << "Selecting Joint nr " << nr << endl;
+	if (nr<0 || nr>=(int)currentRobotNodes.size())
+		return;
+	currentRobotNode = currentRobotNodes[nr];
+	currentRobotNode->print();
+	float mi = currentRobotNode->getJointLimitLo();
+	float ma = currentRobotNode->getJointLimitHi();
+	QString qMin = QString::number(mi);
+	QString qMax = QString::number(ma);
+	UI.labelMinPos->setText(qMin);
+	UI.labelMaxPos->setText(qMax);
+	float j = currentRobotNode->getJointValue();
+	UI.lcdNumberJointValue->display((double)j);
+	if (fabs(ma-mi)>0 && (currentRobotNode->isTranslationalJoint() || currentRobotNode->isRotationalJoint()) )
+	{
+		UI.horizontalSliderPos->setEnabled(true);
+		int pos = (int)((j-mi)/(ma-mi) * 1000.0f);
+		UI.horizontalSliderPos->setValue(pos);
+	} else
+	{
+		UI.horizontalSliderPos->setValue(500);
+		UI.horizontalSliderPos->setEnabled(false);
+	}
+	if (currentRobotNodes[nr]->showCoordinateSystemState())
+		UI.checkBoxShowCoordSystem->setCheckState(Qt::Checked);
+	else
+		UI.checkBoxShowCoordSystem->setCheckState(Qt::Unchecked);
+
+    /*cout << "HIGHLIGHTING node " << currentRobotNodes[nr]->getName() << endl;
+
+    if (visualization)
+    {
+        robot->highlight(visualization,false);
+        currentRobotNode->highlight(visualization,true);
+    }*/
+	displayTriangles();
+}
+
+void showRobotWindow::jointValueChanged(int pos)
+{	
+	int nr = UI.comboBoxJoint->currentIndex();
+	if (nr<0 || nr>=(int)currentRobotNodes.size())
+		return;
+	float fPos = currentRobotNodes[nr]->getJointLimitLo() + (float)pos / 1000.0f * (currentRobotNodes[nr]->getJointLimitHi() - currentRobotNodes[nr]->getJointLimitLo());
+	currentRobotNodes[nr]->setJointValue(fPos);
+	UI.lcdNumberJointValue->display((double)fPos);
+
+}
+
+void showRobotWindow::showCoordSystem()
+{	
+	float size = 0.75f;
+	int nr = UI.comboBoxJoint->currentIndex();
+	if (nr<0 || nr>=(int)currentRobotNodes.size())
+		return;
+
+	// first check if robot node has a visualization 
+	/*VisualizationNodePtr visu = robotNodes[nr]->getVisualization();
+	if (!visu)
+	{
+		// create dummy visu
+		SoSeparator *s = new SoSeparator();
+		VisualizationNodePtr visualizationNode(new CoinVisualizationNode(s));
+		robotNodes[nr]->setVisualization(visualizationNode);
+		//visualizationNode->showCoordinateSystem(UI.checkBoxShowCoordSystem->checkState() == Qt::Checked, size);
+
+	}*/
+
+	currentRobotNodes[nr]->showCoordinateSystem(UI.checkBoxShowCoordSystem->checkState() == Qt::Checked, size);
+	// rebuild visualization
+	collisionModel();
+}
+
+
+
+void showRobotWindow::selectRobot()
+{
+	QString fi = QFileDialog::getOpenFileName(this, tr("Open Robot File"), QString(), tr("XML Files (*.xml)"));
+	m_sRobotFilename = std::string(fi.toAscii());
+	loadRobot();
+}
+
+void showRobotWindow::loadRobot()
+{
+	if (osgRobot->getNumChildren()>0)
+		osgRobot->removeChildren(0,osgRobot->getNumChildren());
+
+	cout << "Loading Robot from " << m_sRobotFilename << endl;
+
+	try
+	{
+		robot = RobotIO::loadRobot(m_sRobotFilename,RobotIO::eFull);
+	}
+	catch (VirtualRobotException &e)
+	{
+		cout << " ERROR while creating robot" << endl;
+		cout << e.what();
+		return;
+	}
+	
+	if (!robot)
+	{
+		cout << " ERROR while creating robot" << endl;
+		return;
+	}
+
+	// get nodes
+	robot->getRobotNodes(allRobotNodes);
+	robot->getRobotNodeSets(robotNodeSets);
+	robot->getEndEffectors(eefs);
+	updateEEFBox();
+	updateRNSBox();
+	selectRNS(0);
+	if (allRobotNodes.size()==0)
+		selectJoint(-1);
+	else
+		selectJoint(0);
+
+	if (eefs.size()==0)
+		selectEEF(-1);
+	else
+		selectEEF(0);
+
+	displayTriangles();
+
+	// build visualization
+	collisionModel();
+	robotStructure();
+	 //m_pExViewer->viewAll();
+}
+
+void showRobotWindow::robotStructure()
+{
+	if (!robot)
+		return;
+
+	structureEnabled = UI.checkBoxStructure->checkState() == Qt::Checked;
+	robot->showStructure(structureEnabled);
+	// rebuild visualization
+	collisionModel();
+}
+
+void showRobotWindow::robotCoordSystems()
+{
+	if (!robot)
+		return;
+
+	bool robtoAllCoordsEnabled = UI.checkBoxRobotCoordSystems->checkState() == Qt::Checked;
+	robot->showCoordinateSystems(robtoAllCoordsEnabled);
+	// rebuild visualization
+	collisionModel();
+}
+
+void showRobotWindow::closeHand()
+{
+	if (currentEEF)
+		currentEEF->closeActors();
+}
+
+void showRobotWindow::openHand()
+{
+	if (currentEEF)
+		currentEEF->openActors();
+}
+
+void showRobotWindow::selectEEF( int nr )
+{
+	cout << "Selecting EEF nr " << nr << endl;
+	if (nr<0 || nr>=(int)eefs.size())
+		return;
+	currentEEF = eefs[nr];
+}
+
+void showRobotWindow::updateEEFBox()
+{
+	UI.comboBoxEndEffector->clear();
+
+	for (unsigned int i=0;i<eefs.size();i++)
+	{
+		UI.comboBoxEndEffector->addItem(QString(eefs[i]->getName().c_str()));
+	}
+}
diff --git a/VirtualRobot/examples/RobotViewerOSG/showRobotWindow.h b/VirtualRobot/examples/RobotViewerOSG/showRobotWindow.h
new file mode 100644
index 0000000000000000000000000000000000000000..def822624f2c83399441cb4a23cca2e805ee8b08
--- /dev/null
+++ b/VirtualRobot/examples/RobotViewerOSG/showRobotWindow.h
@@ -0,0 +1,101 @@
+
+#ifndef __ShowRobot_WINDOW_H_
+#define __ShowRobot_WINDOW_H_
+
+#include <VirtualRobot/VirtualRobot.h>
+#include <VirtualRobot/Robot.h>
+#include <VirtualRobot/VirtualRobotException.h>
+#include <VirtualRobot/Nodes/RobotNode.h>
+#include <VirtualRobot/XML/RobotIO.h>
+#include <VirtualRobot/Visualization/VisualizationFactory.h>
+#include <VirtualRobot/Obstacle.h>
+#include "VirtualRobot/Visualization/OSGVisualization/OSGVisualizationNode.h"
+#include "VirtualRobot/Visualization/OSGVisualization/OSGVisualization.h"
+
+#include <string.h>
+#include <QtCore/QtGlobal>
+#include <QtGui/QtGui>
+#include <QtCore/QtCore>
+
+#include <osgViewer/CompositeViewer>
+#include <osgViewer/ViewerEventHandlers>
+#include <osgGA/TrackballManipulator>
+#include <osgDB/ReadFile>
+#include <osgQt/GraphicsWindowQt>
+
+
+#include <vector>
+
+#include "ui_RobotViewer.h"
+
+#include "osgViewerWidget.h"
+
+class showRobotWindow : public QMainWindow
+{
+	Q_OBJECT
+public:
+	showRobotWindow(std::string &sRobotFilename, Qt::WFlags flags = 0);
+	~showRobotWindow();
+
+	/*!< Executes the mainLoop. You need to call this in order to execute the application. */
+	int main();
+
+public slots:
+	/*! Closes the window and exits SoQt runloop. */
+	void quit();
+
+	/*!< Overriding the close event, so we know when the window was closed by the user. */
+	void closeEvent(QCloseEvent *event);
+
+	void resetSceneryAll();
+	void collisionModel();
+	void showRobot();
+	void loadRobot();
+	void selectJoint(int nr);
+	void selectRNS(int nr);
+	void jointValueChanged(int pos);
+	void showCoordSystem();
+	void robotStructure();
+	void robotCoordSystems();
+	void robotFullModel();
+	void closeHand();
+	void openHand();
+	void selectEEF(int nr);
+	void selectRobot();
+
+protected:
+	void setupUI();
+	QString formatString(const char *s, float f);
+	void updateJointBox();
+	void updateRNSBox();
+	void updateEEFBox();
+	void displayTriangles();
+	Ui::MainWindowShowRobot UI;
+	//SoQtExaminerViewer *m_pExViewer; /*!< Viewer to display the 3D model of the robot and the environment. */
+		
+	//SoSeparator *sceneSep;
+	//SoSeparator *robotSep;
+
+	VirtualRobot::RobotPtr robot;
+	std::string m_sRobotFilename;
+	std::vector < VirtualRobot::RobotNodePtr > allRobotNodes;
+	std::vector < VirtualRobot::RobotNodePtr > currentRobotNodes;
+	std::vector < VirtualRobot::RobotNodeSetPtr > robotNodeSets;
+	std::vector < VirtualRobot::EndEffectorPtr > eefs;
+	VirtualRobot::EndEffectorPtr currentEEF;
+	VirtualRobot::RobotNodeSetPtr currentRobotNodeSet;
+	VirtualRobot::RobotNodePtr currentRobotNode;
+
+
+	bool useColModel;
+	bool structureEnabled;
+
+
+	osgViewerWidget* osgWidget;
+	osg::Group* osgRoot;	 
+	osg::Group* osgRobot;
+	boost::shared_ptr<VirtualRobot::OSGVisualization> visualization;
+
+};
+
+#endif // __ShowRobot_WINDOW_H_
diff --git a/VirtualRobot/examples/SceneViewer/CMakeLists.txt b/VirtualRobot/examples/SceneViewer/CMakeLists.txt
index 5f8bafec4fc54a6b8a367df674be5494eb92f4f7..8f4b894c70094589a2e3fb7507630d0b2ff51719 100644
--- a/VirtualRobot/examples/SceneViewer/CMakeLists.txt
+++ b/VirtualRobot/examples/SceneViewer/CMakeLists.txt
@@ -4,10 +4,6 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.6.4)
 
 CMAKE_POLICY(VERSION 2.6)
 
-IF(NOT DEFINED VR_CONFIGURED)
-	INCLUDE(../../config.cmake)
-ENDIF()
-
 IF(SIMOX_USE_COIN_VISUALIZATION)
     LINK_DIRECTORIES(${SIMOX_LIB_DIR})
     
@@ -33,8 +29,9 @@ IF(SIMOX_USE_COIN_VISUALIZATION)
 
     include_directories(${UI_HEADER_DIR})
 
-
+    
     ADD_EXECUTABLE(${PROJECT_NAME} ${demo_SRCS} ${demo_INCS})
+    SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES FOLDER "Examples")
     SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${SIMOX_BIN_DIR})
 
     TARGET_LINK_LIBRARIES(${PROJECT_NAME} VirtualRobot ${SIMOX_VISUALIZATION_LIBS})
diff --git a/VirtualRobot/examples/loadRobot/CMakeLists.txt b/VirtualRobot/examples/loadRobot/CMakeLists.txt
index 4365368643f6664ffe5a4a906a45b30b68ddfd2e..ccaf7198111bb8923c9a87c7641cf294f4fee939 100644
--- a/VirtualRobot/examples/loadRobot/CMakeLists.txt
+++ b/VirtualRobot/examples/loadRobot/CMakeLists.txt
@@ -4,14 +4,11 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.6.4)
 
 CMAKE_POLICY(VERSION 2.6)
 
-IF(NOT DEFINED VR_CONFIGURED)
-	INCLUDE(../../config.cmake)
-ENDIF()
-
 LINK_DIRECTORIES(${VR_LIB_DIR})
 
 ADD_EXECUTABLE(${PROJECT_NAME} loadRobot.cpp)
 SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${VR_BIN_DIR})
+SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES FOLDER "Examples")
 MESSAGE( STATUS "VR LIB  DIR " ${VR_LIB_DIR})
 
 TARGET_LINK_LIBRARIES(${PROJECT_NAME} VirtualRobot)
diff --git a/VirtualRobot/examples/reachability/CMakeLists.txt b/VirtualRobot/examples/reachability/CMakeLists.txt
index c173308fc9ac5da775491c3e419d85ca8cde76ed..b6d7a1b67e56e51921ea202015aabe8197dfc6fa 100644
--- a/VirtualRobot/examples/reachability/CMakeLists.txt
+++ b/VirtualRobot/examples/reachability/CMakeLists.txt
@@ -4,10 +4,6 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.6.4)
 
 CMAKE_POLICY(VERSION 2.6)
 
-IF(NOT DEFINED VR_CONFIGURED)
-	INCLUDE(../../config.cmake)
-ENDIF()
-
 IF(SIMOX_USE_COIN_VISUALIZATION)
     LINK_DIRECTORIES(${SIMOX_LIB_DIR})
     
@@ -37,8 +33,8 @@ IF(SIMOX_USE_COIN_VISUALIZATION)
 
     include_directories(${UI_HEADER_DIR1})
 
-
     ADD_EXECUTABLE(${PROJECT_NAME} ${demo_SRCS} ${demo_INCS})
+    SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES FOLDER "Examples")
     SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${SIMOX_BIN_DIR})
 
     TARGET_LINK_LIBRARIES(${PROJECT_NAME} VirtualRobot ${SIMOX_VISUALIZATION_LIBS})
diff --git a/VirtualRobot/examples/stability/CMakeLists.txt b/VirtualRobot/examples/stability/CMakeLists.txt
index 54d326e9bc76d5db1bbdf8ee3d1251a57179c2a8..2bdcfa7df9723c0d21c0acd7010814fced9f8b07 100644
--- a/VirtualRobot/examples/stability/CMakeLists.txt
+++ b/VirtualRobot/examples/stability/CMakeLists.txt
@@ -4,10 +4,6 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.6.4)
 
 CMAKE_POLICY(VERSION 2.6)
 
-IF(NOT DEFINED VR_CONFIGURED)
-	INCLUDE(../../config.cmake)
-ENDIF()
-
 IF(SIMOX_USE_COIN_VISUALIZATION)
     LINK_DIRECTORIES(${SIMOX_LIB_DIR})
     
@@ -34,8 +30,9 @@ IF(SIMOX_USE_COIN_VISUALIZATION)
 
     include_directories(${UI_HEADER_DIR1})
 
-
+    
     ADD_EXECUTABLE(${PROJECT_NAME} ${demo_SRCS} ${demo_INCS})
+    SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES FOLDER "Examples")
     SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${SIMOX_BIN_DIR})
 
     TARGET_LINK_LIBRARIES(${PROJECT_NAME} VirtualRobot ${SIMOX_VISUALIZATION_LIBS})
diff --git a/VirtualRobot/tests/VirtualRobotRobotTest.cpp b/VirtualRobot/tests/VirtualRobotRobotTest.cpp
index a56896a4641aa797b7e556ab4341292872cd79e1..3a2230bae65d1813033b41b7893200cbbf5a5ec8 100644
--- a/VirtualRobot/tests/VirtualRobotRobotTest.cpp
+++ b/VirtualRobot/tests/VirtualRobotRobotTest.cpp
@@ -57,7 +57,6 @@ BOOST_AUTO_TEST_CASE(testVirtualRobotRobotMacro)
 		"<Robot Type='MyDemoRobotType' StandardName='ExampleRobo' RootNode='Joint1'>"
 		" <RobotNode name='Joint1'>"
 		"  <Visualization enable='true'>"
-		"   <CoordinateAxis Type='Inventor' enable='true' scaling='1' text='Axis1'/>"
 		"  </Visualization>"
 		" </RobotNode>"
 		"</Robot>";
@@ -88,25 +87,21 @@ BOOST_AUTO_TEST_CASE(testVirtualRobotValidEndeffector)
 		"<Robot Type='DemoRobotType' StandardName='TestRobot' RootNode='Joint1'>"
 		" <RobotNode name='Joint1'>"
 		"  <Visualization enable='true'>"
-		"   <CoordinateAxis Type='Inventor' enable='true' scaling='1' text='Axis1'/>"
 		"  </Visualization>"
 		"  <Child name='Joint2'/>"
 		" </RobotNode>"
 		" <RobotNode name='Joint2'>"
 		"  <Visualization enable='true'>"
-		"   <CoordinateAxis type='Inventor' enable='true' scaling='1' text='Axis2'/>"
 		"  </Visualization>"
 		"  <Child name='Joint3'/>"
 		" </RobotNode>"
 		" <RobotNode name='Joint3'>"
 		"  <Visualization enable='true'>"
-		"   <CoordinateAxis type='Inventor' enable='true' scaling='1' text='Axis3'/>"
 		"  </Visualization>"
 		"  <Child name='Joint4'/>"
 		" </RobotNode>"
 		" <RobotNode name='Joint4'>"
 		"  <Visualization enable='true'>"
-		"   <CoordinateAxis type='Inventor' enable='true' scaling='1' text='Axis4'/>"
 		"  </Visualization>"
 		" </RobotNode>"
 		" <Endeffector name='endeffector1' base='Joint1' tcp='Joint1'>"
@@ -133,13 +128,11 @@ BOOST_AUTO_TEST_CASE(testVirtualRobotInvariantTagPosition)
 		"<Robot Type='DemoRobotType' StandardName='TestRobot' RootNode='Joint1'>"
 		" <RobotNode name='Joint3'>"
 		"  <Visualization enable='true'>"
-		"   <CoordinateAxis type='Inventor' enable='true' scaling='1' text='Axis3'/>"
 		"  </Visualization>"
 		"  <Child name='Joint4'/>"
 		" </RobotNode>"
 		" <RobotNode name='Joint4'>"
 		"  <Visualization enable='true'>"
-		"   <CoordinateAxis type='Inventor' enable='true' scaling='1' text='Axis4'/>"
 		"  </Visualization>"
 		" </RobotNode>"
 		" <Endeffector name='endeffector1' base='Joint1' tcp='Joint1'>"
@@ -154,13 +147,11 @@ BOOST_AUTO_TEST_CASE(testVirtualRobotInvariantTagPosition)
 		" </Endeffector>"
 		" <RobotNode name='Joint1'>"
 		"  <Visualization enable='true'>"
-		"   <CoordinateAxis Type='Inventor' enable='true' scaling='1' text='Axis1'/>"
 		"  </Visualization>"
 		"  <Child name='Joint2'/>"
 		" </RobotNode>"
 		" <RobotNode name='Joint2'>"
 		"  <Visualization enable='true'>"
-		"   <CoordinateAxis type='Inventor' enable='true' scaling='1' text='Axis2'/>"
 		"  </Visualization>"
 		"  <Child name='Joint3'/>"
 		" </RobotNode>"
diff --git a/config.cmake b/config.cmake
index 0eebdb21565745b0c1e7f896c0c065ba21c1adc6..998fd9a4ceef5b535269ebfac68d298d0e12d5a2 100644
--- a/config.cmake
+++ b/config.cmake
@@ -4,6 +4,9 @@ IF (NOT SIMOX_CONFIGURED)
 	# defines SIMOX_CONFIGURED variable which indicates that this config file has already been included
 	SET(SIMOX_CONFIGURED TRUE)
 	
+	# use virtual folders for grouping projects in IDEs 
+	set_property(GLOBAL PROPERTY USE_FOLDERS ON)
+	
 	# Set up for debug build
 	IF(NOT CMAKE_BUILD_TYPE)
 	  SET(CMAKE_BUILD_TYPE Debug CACHE STRING
@@ -90,6 +93,7 @@ IF (NOT SIMOX_CONFIGURED)
 		endif ( QT_FOUND )
 		
 		if (QT_FOUND AND SOQT_FOUND AND COIN3D_FOUND)
+		    MESSAGE (STATUS "Enabling Coin3D/Qt/SoQt support")
 		    MESSAGE (STATUS "By using the Con3D library, the license of Simox is not LGPL any more. The license must be GPL, since Con3D is a GPL library. If you want to use Simox under LGPL you must disable Coin3D support!") 
 			SET (SIMOX_VISUALIZATION TRUE)
         	SET (SIMOX_VISUALIZATION_LIBS ${QT_LIBRARIES} ${COIN3D_LIBRARIES} ${SoQt_LIBRARIES} )
@@ -101,7 +105,7 @@ IF (NOT SIMOX_CONFIGURED)
 	
 	    MESSAGE(STATUS "Searching OSG and Qt...")
 	
-	    FIND_PACKAGE(OpenSceneGraph REQUIRED)
+	    FIND_PACKAGE(OpenSceneGraph REQUIRED osgViewer osgUtil osgDB osgGA)
 
 		if (OPENSCENEGRAPH_FOUND)
 		    MESSAGE (STATUS "Found OpenSceneGraph:" ${OPENSCENEGRAPH_INCLUDE_DIRS})
@@ -112,12 +116,23 @@ IF (NOT SIMOX_CONFIGURED)
 			MESSAGE (STATUS "Found Qt4: " ${QT_INCLUDE_DIR})
 			include(${QT_USE_FILE})
 			#MESSAGE(STATUS "QT_LIBRARIES: " ${QT_LIBRARIES})
-	
 		else ( QT_FOUND )
 			MESSAGE (STATUS "Did not found Qt. Disabling Qt/OSG support.")
 		endif ( QT_FOUND )
 		
 		if (QT_FOUND AND OPENSCENEGRAPH_FOUND)
+		    MESSAGE (STATUS "Enabling OSG/Qt support")
+		    ### a little hack is needed here since osgQt is not supported in the FindOSG script
+		    MESSAGE("OPENSCENEGRAPH_LIBRARIES: ${OPENSCENEGRAPH_LIBRARIES}")
+		    LIST(GET OPENSCENEGRAPH_LIBRARIES 1 firstOsgLib)
+		    MESSAGE("firstOsgLib: ${firstOsgLib}")
+		    GET_FILENAME_COMPONENT(osgLibPath ${firstOsgLib} PATH)
+		    MESSAGE("osgLibPath: ${osgLibPath}")
+		    list(APPEND OPENSCENEGRAPH_LIBRARIES optimized)
+		    list(APPEND OPENSCENEGRAPH_LIBRARIES ${osgLibPath}/osgQt.lib)
+		    list(APPEND OPENSCENEGRAPH_LIBRARIES debug)
+		    list(APPEND OPENSCENEGRAPH_LIBRARIES ${osgLibPath}/osgQtd.lib)
+		    MESSAGE("OPENSCENEGRAPH_LIBRARIES: ${OPENSCENEGRAPH_LIBRARIES}")
 			SET (SIMOX_VISUALIZATION TRUE)
         	SET (SIMOX_VISUALIZATION_LIBS ${QT_LIBRARIES} ${OPENSCENEGRAPH_LIBRARIES} )
         	SET (SIMOX_VISUALIZATION_INCLUDE_PATHS ${OPENSCENEGRAPH_INCLUDE_DIRS} )