diff --git a/CMakeLists.txt b/CMakeLists.txt
index 10d2e5c1d6b63b8f943d9f6d4496841f2c04dcd4..b2bb71f72ace504cbb4d7b05ab94a7e847a1b1b8 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -33,6 +33,9 @@ add_subdirectory(doc)
 MESSAGE (STATUS "\n ***** Simox: Generating CMake files for build and install setup")
 
 set(Simox_LIBRARIES VirtualRobot Saba GraspStudio)
+if (Simox_BUILD_SimDynamics)
+	set(Simox_LIBRARIES "Simox_LIBRARIES" "SimDynamics")
+endif()
 set(Simox_EXECUTABLES "")
 
 # Export the package for use from the build-tree
@@ -48,10 +51,22 @@ include ("${VirtualRobot_CONFIG_INBUILD}")
 
 # Create an SimoxConfig.cmake file for the use from the build tree
 SET(Simox_LIBRARIES_ALL "${VirtualRobot_LIBRARIES}" "Saba" "GraspStudio")
+if (Simox_BUILD_SimDynamics)
+	SET(Simox_LIBRARIES_ALL "${Simox_LIBRARIES_ALL}" "SimDynamics" "${SimDynamics_EXTERNAL_LIBRARIES}")
+	#MESSAGE ("Simox_LIBRARIES_ALL: ${Simox_LIBRARIES_ALL}")
+	#MESSAGE ("SimDynamics_PHYSICS_LIBRARIES: ${SimDynamics_PHYSICS_LIBRARIES}")
+	#MESSAGE ("SABA_INCLUDE_DIRS: ${SABA_INCLUDE_DIRS}")
+
+endif()
 SET(Simox_BASE_DIR "${PROJECT_SOURCE_DIR}")
-SET(Simox_INCLUDE_DIRS "${VirtualRobot_INCLUDE_DIRS}" "${GRASP_STUDIO_INCLUDE_DIRS}" "${SABA_INCLUDE_DIRS}")
-SET(Simox_LIB_DIRS "${VirtualRobot_LIBRARY_DIRS}" "${GRASP_STUDIO_LIBRARY_DIRS}" "${SABA_LIBRARY_DIRS}")
-SET(Simox_LIB_FLAGS "${VirtualRobot_COMPILE_FLAGS} ${GRASP_STUDIO_COMPILE_FLAGS} ${SABA_COMPILE_FLAGS}")
+SET(Simox_INCLUDE_DIRS "${VirtualRobot_INCLUDE_DIRS}" "${GRASP_STUDIO_INCLUDE_DIRS}" "${SABA_INCLUDE_DIRS}" "${SIMDYNAMICS_INCLUDE_DIRS}")
+	#MESSAGE ("VirtualRobot_INCLUDE_DIRS: ${VirtualRobot_INCLUDE_DIRS}")
+	#MESSAGE ("Simox_INCLUDE_DIRS: ${Simox_INCLUDE_DIRS}")
+	#MESSAGE ("Simox_LIBRARIES_ALL: ${Simox_LIBRARIES_ALL}")
+SET(Simox_LIB_DIRS "${VirtualRobot_LIBRARY_DIRS}" "${GRASP_STUDIO_LIBRARY_DIRS}" "${SABA_LIBRARY_DIRS}" "${SIMDYNAMICS_LIBRARY_DIRS}")
+	#MESSAGE ("Simox_LIB_DIRS: ${Simox_LIB_DIRS}")
+SET(Simox_LIB_FLAGS "${VirtualRobot_COMPILE_FLAGS} ${GRASP_STUDIO_COMPILE_FLAGS} ${SABA_COMPILE_FLAGS} ${SIMDYNAMICS_COMPILE_FLAGS}")
+	#MESSAGE ("Simox_LIB_FLAGS: ${Simox_LIB_FLAGS}")
 SET(Simox_CMAKE_DIR "${Simox_BUILD_DIRECTORY}/share/Simox/cmake")
 SET(VirtualRobot_CMAKE_DIR "${Simox_BUILD_DIRECTORY}/share/VirtualRobot/cmake")
 SET(Simox_LIBRARY_CMAKE_INCLUDE "${VirtualRobot_CMAKE_INCLUDE}")
@@ -86,9 +101,9 @@ include ("${VirtualRobot_CONFIG_INSTALL_LOCAL}")
 include(${PROJECT_SOURCE_DIR}/VirtualRobot/CMakeModules/VirtualRobotExternalLibrarySetup.cmake)
 include(${PROJECT_SOURCE_DIR}/VirtualRobot/CMakeModules/VirtualRobotMacros.cmake)
 
-SET(Simox_INCLUDE_DIRS "${VirtualRobot_INCLUDE_DIRS}" "${GRASP_STUDIO_INCLUDE_DIRS}" "${SABA_INCLUDE_DIRS}")
-SET(Simox_LIB_DIRS "${VirtualRobot_LIBRARY_DIRS}" "${GRASP_STUDIO_LIBRARY_DIRS}" "${SABA_LIBRARY_DIRS}")
-SET(Simox_LIB_FLAGS "${VirtualRobot_COMPILE_FLAGS} ${GRASP_STUDIO_COMPILE_FLAGS} ${SABA_COMPILE_FLAGS}")
+SET(Simox_INCLUDE_DIRS "${VirtualRobot_INCLUDE_DIRS}" "${GRASP_STUDIO_INCLUDE_DIRS}" "${SABA_INCLUDE_DIRS}" "${SIMDYNAMICS_INCLUDE_DIRS}")
+SET(Simox_LIB_DIRS "${VirtualRobot_LIBRARY_DIRS}" "${GRASP_STUDIO_LIBRARY_DIRS}" "${SABA_LIBRARY_DIRS}" "${SIMDYNAMICS_LIBRARY_DIRS}")
+SET(Simox_LIB_FLAGS "${VirtualRobot_COMPILE_FLAGS} ${GRASP_STUDIO_COMPILE_FLAGS} ${SABA_COMPILE_FLAGS} ${SIMDYNAMICS_COMPILE_FLAGS}")
 SET(Simox_BASE_DIR "${CMAKE_INSTALL_PREFIX}/include")
 SET(Simox_CMAKE_DIR "${CMAKE_INSTALL_PREFIX}/share/Simox/cmake")
 SET(VirtualRobot_CMAKE_DIR "${CMAKE_INSTALL_PREFIX}/share/VirtualRobot/cmake")
diff --git a/SimDynamics/CMakeLists.txt b/SimDynamics/CMakeLists.txt
index fd5158437d8fcfce8b626128d94ea5279ad2559f..c1a023973de836c2b7d810098d27d9adfd094f3c 100644
--- a/SimDynamics/CMakeLists.txt
+++ b/SimDynamics/CMakeLists.txt
@@ -76,8 +76,8 @@ if (SimDynamics_DYNAMICSENGINE)
     endif ()
     
     # this var is considered for generating Simox_INCLUDE_DIRS_
-    SET(SimDynamics_INCLUDE_DIRS "${SimDynamics_SimoxDir}" "${SimDynamics_DIR}")
-    
+    SET(SimDynamics_INCLUDE_DIRS "${SimDynamics_SimoxDir}" "${SimDynamics_DIR}" PARENT_SCOPE)
+    SET(SimDynamics_EXTERNAL_LIBRARIES "${SimDynamics_PHYSICS_LIBRARIES}" PARENT_SCOPE)
     INCLUDE_DIRECTORIES(${SimDynamics_SimoxDir})
     INCLUDE_DIRECTORIES(${SimDynamics_DIR})
     
@@ -128,7 +128,9 @@ if (SimDynamics_DYNAMICSENGINE)
       )
     
     INSTALL(DIRECTORY ${PROJECT_SOURCE_DIR} DESTINATION ${SimDynamics_INSTALL_HEADER_DIR}
-            FILES_MATCHING PATTERN "*.h"
+            FILES_MATCHING 
+            PATTERN "*.h"
+            PATTERN "*.hpp"
             PATTERN ".svn" EXCLUDE
             PATTERN "CMakeModules" EXCLUDE
             PATTERN "tests" EXCLUDE
diff --git a/SimDynamics/CMakeModules/FindBullet.cmake b/SimDynamics/CMakeModules/FindBullet.cmake
index 9f41ad6985d035fe8c9f51ea53a1ed612ace1dc3..4ecafc7feda6f9ca92c14545cb4363d99ab57627 100644
--- a/SimDynamics/CMakeModules/FindBullet.cmake
+++ b/SimDynamics/CMakeModules/FindBullet.cmake
@@ -58,8 +58,8 @@ IF( BULLET_INCLUDE_DIR )
 ENDIF( BULLET_INCLUDE_DIR )
 
 MACRO( FIND_BULLET_LIBRARY_DIRNAME LIBNAME DIRNAME )
-    UNSET( BULLET_${LIBNAME}_LIBRARY CACHE )
-    UNSET( BULLET_${LIBNAME}_LIBRARY_debug CACHE )
+    #UNSET( BULLET_${LIBNAME}_LIBRARY CACHE )
+    #UNSET( BULLET_${LIBNAME}_LIBRARY_debug CACHE )
     MARK_AS_ADVANCED( BULLET_${LIBNAME}_LIBRARY )
     MARK_AS_ADVANCED( BULLET_${LIBNAME}_LIBRARY_debug )
     FIND_LIBRARY( BULLET_${LIBNAME}_LIBRARY
diff --git a/SimDynamics/DynamicsEngine/BulletEngine/BulletObject.cpp b/SimDynamics/DynamicsEngine/BulletEngine/BulletObject.cpp
index 3de0590b5381e0e7520e0433f113a0d555c683c7..9e0689fb2b2032f79d8095556ca0e3afd2ac450f 100644
--- a/SimDynamics/DynamicsEngine/BulletEngine/BulletObject.cpp
+++ b/SimDynamics/DynamicsEngine/BulletEngine/BulletObject.cpp
@@ -107,6 +107,8 @@ BulletObject::BulletObject(VirtualRobot::SceneObjectPtr o, SimulationType type)
 	rigidBody->setCollisionFlags(btCollisionObject::CF_STATIC_OBJECT);
 	cout << "TEST3" << endl;
 #endif
+
+    setPoseIntern(o->getGlobalPose());
 }
 	
 BulletObject::~BulletObject()
@@ -177,17 +179,20 @@ void BulletObject::setPosition( const Eigen::Vector3f &posMM )
 	setPose(pose);
 }
 
-void BulletObject::setPose( const Eigen::Matrix4f &pose )
+void BulletObject::setPoseIntern( const Eigen::Matrix4f &pose )
 {
-	DynamicsObject::setPose(pose);
-
-	// notify motionState
-	motionState->setGlobalPose(pose);
+    // notify motionState
+    motionState->setGlobalPose(pose);
 
-	// notify bullet object
-	btTransform btT = BulletEngine::getPoseBullet(pose);
-	rigidBody->setWorldTransform(btT);
+    // notify bullet object
+    btTransform btT = BulletEngine::getPoseBullet(pose);
+    rigidBody->setWorldTransform(btT);
+}
 
+void BulletObject::setPose( const Eigen::Matrix4f &pose )
+{
+    DynamicsObject::setPose(pose);
+    setPoseIntern(pose);
 }
 
 Eigen::Vector3f BulletObject::getLinearVelocity()
diff --git a/SimDynamics/DynamicsEngine/BulletEngine/BulletObject.h b/SimDynamics/DynamicsEngine/BulletEngine/BulletObject.h
index e2417ac2a3215dc2bf7c768b7b00f5684b6b415f..0c7f85621e37ac33d4a481c504fe4adccbde43e9 100644
--- a/SimDynamics/DynamicsEngine/BulletEngine/BulletObject.h
+++ b/SimDynamics/DynamicsEngine/BulletEngine/BulletObject.h
@@ -70,6 +70,8 @@ public:
     Eigen::Matrix4f getComGlobal();
 protected:
 
+    void setPoseIntern(const Eigen::Matrix4f &pose);
+
 	btConvexHullShape* createConvexHullShape(VirtualRobot::TriMeshModelPtr trimesh);
 
 	boost::shared_ptr<btRigidBody> rigidBody;
diff --git a/SimDynamics/DynamicsEngine/BulletEngine/BulletRobot.cpp b/SimDynamics/DynamicsEngine/BulletEngine/BulletRobot.cpp
index f40ec63fd618df7d6c527eb1a3172d8208ad71fd..1c5ed7433ebd372b38b72086b5e566d3d6a00d78 100644
--- a/SimDynamics/DynamicsEngine/BulletEngine/BulletRobot.cpp
+++ b/SimDynamics/DynamicsEngine/BulletEngine/BulletRobot.cpp
@@ -454,11 +454,12 @@ void BulletRobot::createLink( VirtualRobot::RobotNodePtr bodyA, VirtualRobot::Ro
             btScalar diff = joint->getJointValueOffset();//startAngleBT + startAngle);
             limMinBT = limMin + diff;//diff - limMax;// 
             limMaxBT = limMax + diff;//diff - limMin;// 
-            if (fabs(startAngleBT - startAngle)>1e-6)
+            // what does it mean if there are different startAngles?!
+            /*if (fabs(startAngleBT - startAngle)>1e-6)
             {
 	            cout << "joint " << joint->getName() << ": jv diff:" << diff << endl;
 	            cout << "Simox limits: " << limMin << "/" << limMax << ", bullet limits:" << limMinBT << "/" << limMaxBT << endl;
-            }
+            }*/
             hinge->setLimit(btScalar(limMinBT),btScalar(limMaxBT));
              vr2bulletOffset = diff;
             //hinge->setLimit(btScalar(limMin),btScalar(limMax));
@@ -917,15 +918,25 @@ void BulletRobot::actuateJoints(float dt)
             VR_ASSERT(dof);
             btRotationalLimitMotor *m = dof->getRotationalLimitMotor(0);
             VR_ASSERT(m);
-            if (it->second.enabled)
+            switch (it->second.actuation)
             {
-                btScalar targ = btScalar(it->second.jointValueTarget+link.jointValueOffset);
-                //btScalar act = btScalar(it->first->getJointValue());
-                btScalar act = btScalar(getJointAngle(it->first));
-                m->m_enableMotor = true;
-                m->m_targetVelocity = (targ-act); // inverted joint dir?!
-            } else
-                m->m_enableMotor = false;
+                case ePosition:
+                {
+                    btScalar targ = btScalar(it->second.jointValueTarget+link.jointValueOffset);
+                    //btScalar act = btScalar(it->first->getJointValue());
+                    btScalar act = btScalar(getJointAngle(it->first));
+                    m->m_enableMotor = true;
+                    m->m_targetVelocity = (targ-act); // inverted joint dir?!
+                }
+                    break;
+                case eVelocity:
+                {
+                    m->m_enableMotor = true;
+                    m->m_targetVelocity = it->second.jointVelocityTarget;
+                }
+                default:
+                    m->m_enableMotor = false;
+            }
 #else
 			boost::shared_ptr<btHingeConstraint> hinge = boost::dynamic_pointer_cast<btHingeConstraint>(link.joint);
             if (!hinge)
@@ -943,27 +954,50 @@ void BulletRobot::actuateJoints(float dt)
                     m = hinge2->getRotationalLimitMotor(2); // third motor
                 }
                 VR_ASSERT(m);
-                if (it->second.enabled)
+                switch (it->second.actuation)
                 {
-                    btScalar targ = btScalar(it->second.jointValueTarget+link.jointValueOffset);
-                    //btScalar act = btScalar(it->first->getJointValue());
-                    btScalar act = btScalar(getJointAngle(it->first));
-                    m->m_enableMotor = true;
-                    m->m_targetVelocity = (targ-act); // inverted joint dir?!
-                } else
+                    case ePosition:
+                    {
+                        btScalar targ = btScalar(it->second.jointValueTarget+link.jointValueOffset);
+                        //btScalar act = btScalar(it->first->getJointValue());
+                        btScalar act = btScalar(getJointAngle(it->first));
+                        m->m_enableMotor = true;
+                        m->m_targetVelocity = (targ-act);
+                    }
+                    break;
+
+                    case eVelocity:
+                    {
+                        m->m_enableMotor = true;
+                        m->m_targetVelocity = it->second.jointVelocityTarget;
+                    }
+                    break;
+
+                default:
                     m->m_enableMotor = false;
+                }
             } else
             {
-			    if (it->second.enabled)
-			    {
-                    btScalar targ = btScalar(it->second.jointValueTarget+link.jointValueOffset);
-                    //btScalar act = btScalar(it->first->getJointValue());
-                    btScalar act = btScalar(getJointAngle(it->first));
-                    hinge->enableAngularMotor(true,(targ-act),bulletMaxMotorImulse);
-                    //hinge->enableMotor(true);
-				    //hinge->setMotorTarget(it->second.jointValueTarget+link.jointValueOffset,dt);
-			    } else
-				    hinge->enableMotor(false);
+                switch (it->second.actuation)
+                {
+                    case ePosition:
+                    {
+                        btScalar targ = btScalar(it->second.jointValueTarget+link.jointValueOffset);
+                        //btScalar act = btScalar(it->first->getJointValue());
+                        btScalar act = btScalar(getJointAngle(it->first));
+                        hinge->enableAngularMotor(true,(targ-act),10.0f);
+                        //hinge->enableMotor(true);
+                        //hinge->setMotorTarget(it->second.jointValueTarget+link.jointValueOffset,dt);
+                    }
+                    break;
+                    case eVelocity:
+                    {
+                        hinge->enableAngularMotor(true,it->second.jointVelocityTarget,10.0f);
+                    }
+                    break;
+                    default:
+                        hinge->enableMotor(false);
+                }
             }
 #endif
 		}
@@ -1040,12 +1074,65 @@ void BulletRobot::actuateNode( VirtualRobot::RobotNodePtr node, float jointValue
         {
 		    hinge->enableAngularMotor(true,0.0f,bulletMaxMotorImulse);// is max impulse ok?! (10 seems to be ok, 1 oscillates)
         }
-        DynamicsRobot::actuateNode(node,jointValue); // inverted joint direction in bullet
+        DynamicsRobot::actuateNode(node,jointValue);
 #endif
     } else
 	{
 		VR_ERROR << "Only Revolute joints implemented so far..." << endl;
-	}
+    }
+}
+
+void BulletRobot::actuateNodeVel(RobotNodePtr node, float jointVelocity)
+{
+    VR_ASSERT(node);
+
+    if (node->isRotationalJoint())
+    {
+        if (!hasLink(node))
+        {
+            VR_ERROR << "No link for node " << node->getName() << endl;
+            return;
+        }
+        LinkInfo link = getLink(node);
+#ifdef USE_BULLET_GENERIC_6DOF_CONSTRAINT
+        boost::shared_ptr<btGeneric6DofConstraint> dof = boost::dynamic_pointer_cast<btGeneric6DofConstraint>(link.joint);
+        VR_ASSERT(dof);
+        btRotationalLimitMotor *m = dof->getRotationalLimitMotor(0);
+        VR_ASSERT(m);
+        m->m_enableMotor = true;
+        m->m_maxMotorForce = 5;//bulletMaxMotorImulse; //?!
+        m->m_maxLimitForce = 300;
+        DynamicsRobot::actuateNodeVel(node,jointVelocity);
+#else
+        boost::shared_ptr<btHingeConstraint> hinge = boost::dynamic_pointer_cast<btHingeConstraint>(link.joint);
+        if (!hinge)
+        {
+            // hinge2 / universal joint
+            boost::shared_ptr<btUniversalConstraint> hinge2 = boost::dynamic_pointer_cast<btUniversalConstraint>(link.joint);
+            VR_ASSERT(hinge2);
+            btRotationalLimitMotor *m;
+            if (node==link.nodeJoint)
+            {
+                 m = hinge2->getRotationalLimitMotor(1); // second motor
+            } else
+            {
+                VR_ASSERT(node==link.nodeJoint2);
+                m = hinge2->getRotationalLimitMotor(2); // third motor
+            }
+            VR_ASSERT(m);
+            m->m_enableMotor = true;
+            m->m_maxMotorForce = 5;//bulletMaxMotorImulse; //?!
+            m->m_maxLimitForce = 300;
+        } else
+        {
+            //hinge->enableAngularMotor(true,jointVelocity,bulletMaxMotorImulse);// is max impulse ok?! (10 seems to be ok, 1 oscillates)
+        }
+        DynamicsRobot::actuateNodeVel(node,jointVelocity); // inverted joint direction in bullet
+#endif
+    } else
+    {
+        VR_ERROR << "Only Revolute joints implemented so far..." << endl;
+    }
 }
 
 float BulletRobot::getJointAngle( VirtualRobot::RobotNodePtr rn )
diff --git a/SimDynamics/DynamicsEngine/BulletEngine/BulletRobot.h b/SimDynamics/DynamicsEngine/BulletEngine/BulletRobot.h
index 430eff56b1ff83330c6b58657a504ceed697e68c..1184521e1fadf609842df47f27ccd9f6b4ba815f 100644
--- a/SimDynamics/DynamicsEngine/BulletEngine/BulletRobot.h
+++ b/SimDynamics/DynamicsEngine/BulletEngine/BulletRobot.h
@@ -72,7 +72,8 @@ public:
 	
 	std::vector<LinkInfo> getLinks();
 
-	virtual void actuateNode(VirtualRobot::RobotNodePtr node, float jointValue);
+    virtual void actuateNode(VirtualRobot::RobotNodePtr node, float jointValue);
+    virtual void actuateNodeVel(VirtualRobot::RobotNodePtr node, float jointVelocity);
 
 	/*!
 		Usually this method is called by the framework in every tick to perform joint actuation.
diff --git a/SimDynamics/DynamicsEngine/DynamicsRobot.cpp b/SimDynamics/DynamicsEngine/DynamicsRobot.cpp
index e0c241b70321cfdfb0376022acdcac2bf2802b70..d227088470e9be23e7b4bea297e1beeb61470dd0 100644
--- a/SimDynamics/DynamicsEngine/DynamicsRobot.cpp
+++ b/SimDynamics/DynamicsEngine/DynamicsRobot.cpp
@@ -67,6 +67,12 @@ DynamicsObjectPtr DynamicsRobot::getDynamicsRobotNode( VirtualRobot::RobotNodePt
 	return dynamicRobotNodes[node];
 }
 
+void DynamicsRobot::actuateNode( std::string &node, float jointValue )
+{
+    VR_ASSERT(robot);
+    VR_ASSERT(robot->hasRobotNode(node));
+    actuateNode(robot->getRobotNode(node),jointValue);
+}
 
 void DynamicsRobot::actuateNode( VirtualRobot::RobotNodePtr node, float jointValue )
 {
@@ -81,13 +87,42 @@ void DynamicsRobot::actuateNode( VirtualRobot::RobotNodePtr node, float jointVal
 	//	createDynamicsNode(node);
 
 
-	robotNodeActuationTarget target;
-	target.enabled = true;
-	target.node = node;
-	target.jointValueTarget = jointValue;
-	//target.dynNode = dnyRN;
+    robotNodeActuationTarget target;
+    target.actuation = ePosition;
+    target.node = node;
+    target.jointValueTarget = jointValue;
+    target.jointVelocityTarget = 0.0f;
+    //target.dynNode = dnyRN;
+
+    actuationTargets[node] = target;
+}
+
+void DynamicsRobot::actuateNodeVel( std::string &node, float jointVelocity )
+{
+    VR_ASSERT(robot);
+    VR_ASSERT(robot->hasRobotNode(node));
+    actuateNodeVel(robot->getRobotNode(node),jointVelocity);
+}
+
+void DynamicsRobot::actuateNodeVel( VirtualRobot::RobotNodePtr node, float jointVelocity )
+{
+    VR_ASSERT(robot);
+    VR_ASSERT(node);
+    VR_ASSERT(robot->hasRobotNode(node));
+
+    //if (!hasDynamicsRobotNode(node))
+    //    createDynamicsNode(node);
+
+    //DynamicsObjectPtr dnyRN = getDynamicsRobotNode(node);
+
+    robotNodeActuationTarget target;
+    target.actuation = eVelocity;
+    target.node = node;
+    target.jointValueTarget = 0.0f;
+    target.jointVelocityTarget = jointVelocity;
+    //target.dynNode = dnyRN;
 
-	actuationTargets[node] = target;
+    actuationTargets[node] = target;
 }
 
 void DynamicsRobot::disableNodeActuation( VirtualRobot::RobotNodePtr node )
@@ -97,12 +132,12 @@ void DynamicsRobot::disableNodeActuation( VirtualRobot::RobotNodePtr node )
 		actuationTargets.erase(node);
 	}
 }
-void DynamicsRobot::enableActuation()
+void DynamicsRobot::enableActuation(JointActuation mode)
 {
 	std::map<VirtualRobot::RobotNodePtr, robotNodeActuationTarget>::iterator it = actuationTargets.begin();
 	while (it!=actuationTargets.end())
 	{
-		it->second.enabled = true;
+        it->second.actuation = mode;
 		it++;
 	}
 }
@@ -111,7 +146,7 @@ void DynamicsRobot::disableActuation()
 	std::map<VirtualRobot::RobotNodePtr, robotNodeActuationTarget>::iterator it = actuationTargets.begin();
 	while (it!=actuationTargets.end())
 	{
-		it->second.enabled = false;
+        it->second.actuation = eDisabled;
 		it++;
 	}
 }
@@ -125,15 +160,15 @@ bool DynamicsRobot::isNodeActuated( VirtualRobot::RobotNodePtr node )
 	VR_ASSERT(node);
 	if (actuationTargets.find(node) == actuationTargets.end())
 		return false;
-	return actuationTargets[node].enabled;
+    return actuationTargets[node].actuation!=eDisabled;
 }
 
 float DynamicsRobot::getNodeTarget( VirtualRobot::RobotNodePtr node )
 {
-	VR_ASSERT(node);
-	if (actuationTargets.find(node) == actuationTargets.end())
-		return 0.0f;
-	return actuationTargets[node].jointValueTarget;
+    VR_ASSERT(node);
+    if (actuationTargets.find(node) == actuationTargets.end())
+        return 0.0f;
+    return actuationTargets[node].jointValueTarget;
 
 }
 
@@ -155,6 +190,21 @@ Eigen::Matrix4f DynamicsRobot::getComGlobal( VirtualRobot::RobotNodePtr rn )
     return com;
 }
 
+void DynamicsRobot::setGlobalPose(Eigen::Matrix4f &gp)
+{
+    Eigen::Matrix4f currentPose = robot->getGlobalPose();
+    Eigen::Matrix4f delta = gp * currentPose.inverse();
+
+    robot->setGlobalPose(gp);
+    std::map<VirtualRobot::RobotNodePtr, DynamicsObjectPtr>::iterator it = dynamicRobotNodes.begin();
+    while (it != dynamicRobotNodes.end())
+    {
+        Eigen::Matrix4f newPose = it->second->getSceneObject()->getGlobalPose() * delta;
+        it->second->setPose(newPose);
+        it++;
+    }
+}
+
 /*
 void DynamicsRobot::setPose( const Eigen::Matrix4f &pose )
 {
diff --git a/SimDynamics/DynamicsEngine/DynamicsRobot.h b/SimDynamics/DynamicsEngine/DynamicsRobot.h
index 7f3b47fd62fcb9fb83bd4b0eca88c10f5447528d..d3cb6503527cf5a98b455d5a93b654dd2f1f0bc5 100644
--- a/SimDynamics/DynamicsEngine/DynamicsRobot.h
+++ b/SimDynamics/DynamicsEngine/DynamicsRobot.h
@@ -56,15 +56,24 @@ public:
 	*/
 	DynamicsObjectPtr getDynamicsRobotNode(VirtualRobot::RobotNodePtr node);
 
+    enum JointActuation
+    {
+        eDisabled,
+        ePosition,
+        eVelocity
+    };
 
 	/*!
 		Enable joint actuation for given node.
 	*/
-	virtual void actuateNode(VirtualRobot::RobotNodePtr node, float jointValue);
-	virtual void disableNodeActuation(VirtualRobot::RobotNodePtr node);
+    virtual void actuateNode(VirtualRobot::RobotNodePtr node, float jointValue);
+    virtual void actuateNodeVel(VirtualRobot::RobotNodePtr node, float jointVelocity);
+    virtual void actuateNode(std::string &node, float jointValue);
+    virtual void actuateNodeVel(std::string &node, float jointVelocity);
+    virtual void disableNodeActuation(VirtualRobot::RobotNodePtr node);
 	virtual bool isNodeActuated(VirtualRobot::RobotNodePtr node);
 	virtual float getNodeTarget(VirtualRobot::RobotNodePtr node);
-	virtual void enableActuation();
+    virtual void enableActuation(JointActuation mode);
 	virtual void disableActuation();
 
 	/*!
@@ -88,16 +97,22 @@ public:
 
     virtual Eigen::Matrix4f getComGlobal(VirtualRobot::RobotNodePtr rn);
 
+    virtual void setGlobalPose(Eigen::Matrix4f &gp);
+
+
+
 protected:
 
 	virtual void createDynamicsNode(VirtualRobot::RobotNodePtr node);
 
+
 	struct robotNodeActuationTarget
 	{
-		float jointValueTarget;
-		VirtualRobot::RobotNodePtr node;
+        float jointValueTarget;
+        float jointVelocityTarget;
+        VirtualRobot::RobotNodePtr node;
 		//DynamicsObjectPtr dynNode; // if node is a joint without model, there is no dyn node!
-		bool enabled;
+        JointActuation actuation;
 	};
 
 	std::map<VirtualRobot::RobotNodePtr, robotNodeActuationTarget> actuationTargets;
diff --git a/SimDynamics/config.cmake b/SimDynamics/config.cmake
index 8475ceb47fd002a7dd23a3e3eeb361ce79d7c7b0..3d523d30b4e97d35f7c1b61528965b1135db98ce 100644
--- a/SimDynamics/config.cmake
+++ b/SimDynamics/config.cmake
@@ -56,6 +56,9 @@ IF (NOT SimDynamics_CONFIGURED)
    	        #MESSAGE (STATUS "BULLET_LIBRARIES: ${BULLET_LIBRARIES}")
    	        #MESSAGE (STATUS "BULLET_OPENGL_INCLUDE_DIR: ${BULLET_OPENGL_INCLUDE_DIR}")
    	        #MESSAGE (STATUS "BULLET_OpenGLSupport_LIBRARY_debug: ${BULLET_OpenGLSupport_LIBRARY_debug}")
+   	        SET(SIMDYNAMICS_INCLUDE_DIRS "${BULLET_INCLUDE_DIR}" "${BULLET_INCLUDE_DIR}/bullet" "${BULLET_DEMOS_INCLUDE_DIR}" "${BULLET_OPENGL_INCLUDE_DIR}" PARENT_SCOPE)
+           	
+           	
            	INCLUDE_DIRECTORIES( 
                 ${BULLET_INCLUDE_DIR}
                 ${BULLET_INCLUDE_DIR}/bullet
@@ -66,6 +69,7 @@ IF (NOT SimDynamics_CONFIGURED)
             OPTION(SimDynamics_USE_BULLET_USE_GLUT "Use Glut"	ON)
             IF( SimDynamics_USE_BULLET_DOUBLE_PRECISION )
                 ADD_DEFINITIONS( -DBT_USE_DOUBLE_PRECISION)
+                SET(SIMDYNAMICS_COMPILE_FLAGS "${SIMDYNAMICS_COMPILE_FLAGS}" "-DBT_USE_DOUBLE_PRECISION" PARENT_SCOPE)
             ENDIF( SimDynamics_USE_BULLET_DOUBLE_PRECISION )
             SET (SimDynamics_PHYSICS_LIBRARIES "${BULLET_LIBRARIES}")
             SET (SimDynamics_DYNAMICSENGINE TRUE)
@@ -83,7 +87,7 @@ IF (NOT SimDynamics_CONFIGURED)
 	            IF (GLUT_FOUND)
 	                MESSAGE("GLUT FOUND")
 	                MESSAGE(${GLUT_glut_LIBRARY})
-	                SET(SimDynamics_PHYSICS_LIBRARIES ${SimDynamics_PHYSICS_LIBRARIES} ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY})
+	                SET(SimDynamics_PHYSICS_LIBRARIES ${SimDynamics_PHYSICS_LIBRARIES} ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY})        
 	            ELSE (GLUT_FOUND)
     	            SET( GLUT_glut_LIBRARY "" CACHE PATH "Glut library." )
                     #IF (MSVC)
@@ -99,14 +103,16 @@ IF (NOT SimDynamics_CONFIGURED)
 
             	IF (WIN32)
             	    INCLUDE_DIRECTORIES(${GLUT_INCLUDE_DIR})
+            	    SET(SIMDYNAMICS_INCLUDE_DIRS "${SIMDYNAMICS_INCLUDE_DIRS}" "${GLUT_INCLUDE_DIR}" PARENT_SCOPE)
             	ELSE (WIN32)
             	    # This is the lines for linux.  This should always work if everything is installed and working fine.
             	    INCLUDE_DIRECTORIES(/usr/include /usr/local/include ${GLUT_INCLUDE_DIR}) 
+            	    SET(SIMDYNAMICS_INCLUDE_DIRS "${SIMDYNAMICS_INCLUDE_DIRS}" "/usr/include" "/usr/local/include" "${GLUT_INCLUDE_DIR}")
             	ENDIF (WIN32)
 
             ENDIF(SimDynamics_USE_BULLET_USE_GLUT)
-            
-            if (SimDynamics_USE_BULLET_USE_GLUT AND GLUT_glut_LIBRARY AND DEFINED BULLET_OpenGLSupport_LIBRARY)
+            MESSAGE ("BULLET_OpenGLSupport_LIBRARY: ${BULLET_OpenGLSupport_LIBRARY}")
+            if (SimDynamics_USE_BULLET_USE_GLUT AND GLUT_glut_LIBRARY AND BULLET_OpenGLSupport_LIBRARY)
                 MESSAGE ("Enabling OpenGL / Glut support")
                 SET (SimDynamics_BULLET_OpenGL TRUE)
             else()
@@ -123,7 +129,9 @@ IF (NOT SimDynamics_CONFIGURED)
    	endif()
    	
 
-    
+    MESSAGE ("**SIMDYNAMICS_INCLUDE_DIRS: ${SIMDYNAMICS_INCLUDE_DIRS}")
+   	MESSAGE ("**SimDynamics_PHYSICS_LIBRARIES: ${SimDynamics_PHYSICS_LIBRARIES}")
+
     #######################################################################
     # Setup for testing
     #######################################################################
diff --git a/SimDynamics/examples/SimDynamicsViewer/simDynamicsWindow.cpp b/SimDynamics/examples/SimDynamicsViewer/simDynamicsWindow.cpp
index 63bca20af11e744ef63b968385f106738ed2d291..7ee96d4c9b1709bb91aea45ac62925d7af0920d2 100644
--- a/SimDynamics/examples/SimDynamicsViewer/simDynamicsWindow.cpp
+++ b/SimDynamics/examples/SimDynamicsViewer/simDynamicsWindow.cpp
@@ -159,7 +159,7 @@ void SimDynamicsWindow::actuation()
 	bool actuate = UI.checkBoxActuation->checkState() == Qt::Checked;
 
 	if (actuate)
-		dynamicsRobot->enableActuation();
+        dynamicsRobot->enableActuation(SimDynamics::DynamicsRobot::ePosition);
 	else
 		dynamicsRobot->disableActuation();
 }