diff --git a/source/RobotAPI/motioncontrol/MotionControl.cpp b/source/RobotAPI/motioncontrol/MotionControl.cpp
index 6a5f6dd527495c0cf613ac9a5af1dd5b202a672c..dfb63eca2165533aaa75215bb2759f61e03a5e80 100644
--- a/source/RobotAPI/motioncontrol/MotionControl.cpp
+++ b/source/RobotAPI/motioncontrol/MotionControl.cpp
@@ -57,7 +57,6 @@ void MoveJoints::defineParameters()
     addToInput("jointMaxSpeed", VariantType::List(VariantType::Float), true);
 
     addToInput("jointTargetTolerance", VariantType::Float, false);
-
     addToInput("timeoutInMs", VariantType::Int, false);
 
     addToOutput("jointDistancesToTargets", VariantType::List(VariantType::Float), true);
@@ -86,8 +85,6 @@ void MoveJoints::onEnter()
     // TODO: Set Max Velocities
 
     // now install the condition
-
-    //ExpressionPtr cond = Expression::create();
     Term cond;
     float tolerance = getInput<float>("jointTargetTolerance");
     for (int i=0; i<jointNames->getSize(); i++)
@@ -515,7 +512,8 @@ void CalculateJointAngleConfiguration::run()
 //    ARMARX_INFO << "GOAL TCP:" << goalTmpTCP << endl;
 
     ARMARX_INFO << "Calculating IK" << flush;
-    if (!ikSolver->solve(goalGlobal, VirtualRobot::IKSolver::Position, 50))
+    //if (!ikSolver->solve(goalGlobal, VirtualRobot::IKSolver::Position, 50))
+    if (!ikSolver->solve(goalGlobal, VirtualRobot::IKSolver::All, 50))
     {
         ARMARX_WARNING << "IKSolver found no solution! " << flush;
         sendEvent<EvFailure>();
@@ -763,6 +761,8 @@ void HeadLookAtTarget::defineParameters()
 {
     addToInput("target", VariantType::FramedPosition, false);
     addToInput("headIKKinematicChainName", VariantType::String, false);
+    addToInput("jointTargetTolerance", VariantType::Float, false);
+    addToInput("timeoutInMs", VariantType::Int, false);
 }
 
 
@@ -777,9 +777,10 @@ void HeadLookAtTarget::defineSubstates()
     ParameterMappingPtr transitionMapping = ParameterMapping::createMapping()->mapFromOutput("*", "*")->mapFromParent("*", "*");
 
     setInitState(stateCalculateHeadIK, initialMapping);
-    addTransition<EvSuccess>(stateCalculateHeadIK, stateMoveHeadJoints, transitionMapping);
-    addTransition<EvSuccess>(stateMoveHeadJoints, stateSuccess, transitionMapping);
+    addTransition<EvCalculationDone>(stateCalculateHeadIK, stateMoveHeadJoints, transitionMapping);
+    addTransition<EvJointTargetReached>(stateMoveHeadJoints, stateSuccess, transitionMapping);
     addTransitionFromAllStates<EvFailure>(stateFailure);
+    addTransitionFromAllStates<EvTimeout>(stateFailure);
 }
 
 
@@ -789,20 +790,32 @@ void CalculateHeadIK::defineParameters()
 {
     addToInput("target", VariantType::FramedPosition, false);
     addToInput("headIKKinematicChainName", VariantType::String, false);
+
+    addToOutput("jointNames", VariantType::List(VariantType::String), true);
+    addToOutput("targetJointValues", VariantType::List(VariantType::Float), true);
+}
+
+
+void CalculateHeadIK::onEnter()
+{
+    targetPosition = getInput<FramedPosition>("target");
+    kinematicChainName = getInput<std::string>("headIKKinematicChainName");
 }
 
 
 void CalculateHeadIK::run()
 {
-    //RobotStatechartContext* context = getContext<RobotStatechartContext>();
-    //VirtualRobot::RobotPtr robot(new RemoteRobot(context->robotStateComponent->getRobotSnapshot("CalculateTCPPoseTime")));
+    RobotStatechartContext* context = getContext<RobotStatechartContext>();
+    VirtualRobot::RobotPtr robotSnapshot(new RemoteRobot(context->robotStateComponent->getRobotSnapshot("CalculateTCPPoseTime")));
     // TODO: with the following line, the IK doesn't find a solution, so this terrible hack must be used. Fix it!!!
     //VirtualRobot::RobotPtr robot = robotPtr->clone("CalculateTCPPoseClone");
+    VirtualRobot::RobotConfigPtr robotSnapshotConfig = robotSnapshot->getConfig();
     std::string robotModelFile;
     ArmarXDataPath::getAbsolutePath("Armar3/data/robotmodel/ArmarIII.xml", robotModelFile);
-    VirtualRobot::RobotPtr robot = VirtualRobot::RobotIO::loadRobot(robotModelFile.c_str());
+    VirtualRobot::RobotPtr robot = VirtualRobot::RobotIO::loadRobot(robotModelFile.c_str(), VirtualRobot::RobotIO::eStructure);
+    robot->setConfig(robotSnapshotConfig);
 
-    VirtualRobot::RobotNodeSetPtr kinematicChain = robot->getRobotNodeSet(getInput<std::string>("kinematicChainName"));
+    VirtualRobot::RobotNodeSetPtr kinematicChain = robot->getRobotNodeSet(kinematicChainName);
     VirtualRobot::RobotNodePrismaticPtr virtualJoint;
     for (unsigned int i=0; i<kinematicChain->getSize(); i++)
     {
@@ -814,18 +827,18 @@ void CalculateHeadIK::run()
     VirtualRobot::GazeIK ikSolver(kinematicChain, virtualJoint);
     ikSolver.enableJointLimitAvoidance(true);
 
-    FramedPositionPtr targetPosition = getInput<FramedPosition>("target");
-    VirtualRobot::LinkedCoordinate target = ArmarPose::createLinkedCoordinate(robot, targetPosition, FramedOrientationPtr());
-    ARMARX_INFO << "target: " << target.getPose() << armarx::flush;
+    Eigen::Matrix3f m = Eigen::Matrix3f::Identity();
+    FramedOrientationPtr targetOri = new FramedOrientation(m, targetPosition->frame);
+    VirtualRobot::LinkedCoordinate target = ArmarPose::createLinkedCoordinate(robot, targetPosition, targetOri);
+    ARMARX_INFO << "Target: " << target.getPose() << armarx::flush;
     Eigen::Matrix4f goalInRoot = target.getInFrame(robot->getRootNode());
-    Eigen::Matrix4f goalGlobal = robot->getRootNode()->toGlobalCoordinateSystem(goalInRoot);
-    ARMARX_VERBOSE << "GOAL in root: " << goalInRoot << armarx::flush;
-    ARMARX_VERBOSE << "GOAL global: " << goalGlobal << armarx::flush;
+    //Eigen::Matrix4f goalGlobal = robot->getRootNode()->toGlobalCoordinateSystem(goalInRoot);
+    Eigen::Vector3f targetPos = goalInRoot.block<3,1>(0,3);
 
-    ARMARX_INFO << "Calculating IK" << flush;
-    if (!ikSolver.solve(goalGlobal.block<3,1>(0,3)))
+    ARMARX_INFO << "Calculating IK for target position " << targetPos;
+    if (!ikSolver.solve(targetPos))
     {
-        ARMARX_WARNING << "IKSolver found no solution! " << flush;
+        ARMARX_WARNING << "IKSolver found no solution! ";
         sendEvent<EvFailure>();
     }
     else
diff --git a/source/RobotAPI/motioncontrol/MotionControl.h b/source/RobotAPI/motioncontrol/MotionControl.h
index 382447e460072b4734d89e6a2414f0610b509059..8132c75e7549a5c8421eff5e0760415df8937ef2 100644
--- a/source/RobotAPI/motioncontrol/MotionControl.h
+++ b/source/RobotAPI/motioncontrol/MotionControl.h
@@ -326,7 +326,10 @@ namespace MotionControl
     struct CalculateHeadIK : StateTemplate<CalculateHeadIK>
     {
         void defineParameters();
+        void onEnter();
         void run();
+        FramedPositionPtr targetPosition;
+        std::string kinematicChainName;
     };
 
 } // namespace MotionControl