diff --git a/source/RobotAPI/applications/WeissHapticSensor/WeissHapticSensorApp.h b/source/RobotAPI/applications/WeissHapticSensor/WeissHapticSensorApp.h
index c5812ade6b568e8aed6571b785ea4f4d58e303f5..ef4be92672a3180801e7f8246fb51950674f5b80 100644
--- a/source/RobotAPI/applications/WeissHapticSensor/WeissHapticSensorApp.h
+++ b/source/RobotAPI/applications/WeissHapticSensor/WeissHapticSensorApp.h
@@ -1,4 +1,4 @@
-/**
+/*
  * This file is part of ArmarX.
  *
  * ArmarX is free software; you can redistribute it and/or modify
diff --git a/source/RobotAPI/applications/WeissHapticSensor/main.cpp b/source/RobotAPI/applications/WeissHapticSensor/main.cpp
index edff60ba31440bbdcb1e8908eacfd3ebd57ac4fb..6239a8defeecb16baeb50154638ee96924703d27 100644
--- a/source/RobotAPI/applications/WeissHapticSensor/main.cpp
+++ b/source/RobotAPI/applications/WeissHapticSensor/main.cpp
@@ -1,4 +1,4 @@
-/**
+/*
  * This file is part of ArmarX.
  *
  * ArmarX is free software; you can redistribute it and/or modify
diff --git a/source/RobotAPI/applications/WeissHapticSensorsUnit/WeissHapticSensorsUnitApp.h b/source/RobotAPI/applications/WeissHapticSensorsUnit/WeissHapticSensorsUnitApp.h
index fba3b1a793e7963b95932e033863113ba0630ec8..275ac159957e230ddbe1125f5abd3f451953af30 100644
--- a/source/RobotAPI/applications/WeissHapticSensorsUnit/WeissHapticSensorsUnitApp.h
+++ b/source/RobotAPI/applications/WeissHapticSensorsUnit/WeissHapticSensorsUnitApp.h
@@ -1,4 +1,4 @@
-/**
+/*
  * This file is part of ArmarX.
  *
  * ArmarX is free software; you can redistribute it and/or modify
diff --git a/source/RobotAPI/applications/WeissHapticSensorsUnit/main.cpp b/source/RobotAPI/applications/WeissHapticSensorsUnit/main.cpp
index 383d05876e7eadfd48ab4faeb807d8443f9fba7f..d2dffa82773301e9539add9c743338a94a70265d 100644
--- a/source/RobotAPI/applications/WeissHapticSensorsUnit/main.cpp
+++ b/source/RobotAPI/applications/WeissHapticSensorsUnit/main.cpp
@@ -1,4 +1,4 @@
-/**
+/*
  * This file is part of ArmarX.
  *
  * ArmarX is free software; you can redistribute it and/or modify
diff --git a/source/RobotAPI/armarx-objects/WeissHapticSensorListener/WeissHapticSensorListener.cpp b/source/RobotAPI/armarx-objects/WeissHapticSensorListener/WeissHapticSensorListener.cpp
index 5e2ddaeb4920ebc0175c3a451f28f11b7f5ee5e2..be6fc19e0aec5d313af934ceb557c75cf724bfbe 100644
--- a/source/RobotAPI/armarx-objects/WeissHapticSensorListener/WeissHapticSensorListener.cpp
+++ b/source/RobotAPI/armarx-objects/WeissHapticSensorListener/WeissHapticSensorListener.cpp
@@ -1,4 +1,4 @@
-/**
+/*
  * This file is part of ArmarX.
  *
  * ArmarX is free software; you can redistribute it and/or modify
diff --git a/source/RobotAPI/armarx-objects/WeissHapticSensorListener/WeissHapticSensorListener.h b/source/RobotAPI/armarx-objects/WeissHapticSensorListener/WeissHapticSensorListener.h
index 11b773cb28684d48825035af867ec7feeca92b53..fa115ec5f3d86b799d95a11e85f8870135a37783 100644
--- a/source/RobotAPI/armarx-objects/WeissHapticSensorListener/WeissHapticSensorListener.h
+++ b/source/RobotAPI/armarx-objects/WeissHapticSensorListener/WeissHapticSensorListener.h
@@ -1,4 +1,4 @@
-/**
+/*
  * This file is part of ArmarX.
  *
  * ArmarX is free software; you can redistribute it and/or modify
diff --git a/source/RobotAPI/armarx-objects/WeissHapticSensorListener/test/WeissHapticSensorListenerTest.cpp b/source/RobotAPI/armarx-objects/WeissHapticSensorListener/test/WeissHapticSensorListenerTest.cpp
index 089961daf9fcd32354f8b52cb28ad509c22503cb..e6da98a3206689f9cf4ea7a1fc2cd1988e1fdb77 100644
--- a/source/RobotAPI/armarx-objects/WeissHapticSensorListener/test/WeissHapticSensorListenerTest.cpp
+++ b/source/RobotAPI/armarx-objects/WeissHapticSensorListener/test/WeissHapticSensorListenerTest.cpp
@@ -1,4 +1,4 @@
-/**
+/*
  * This file is part of ArmarX.
  *
  * ArmarX is free software; you can redistribute it and/or modify
diff --git a/source/RobotAPI/core/RobotStatechartContext.h b/source/RobotAPI/core/RobotStatechartContext.h
index 6513191b24e053422753eef748cbecaf6c030050..a8ce3d992ddc73a91567be210f6fbfa13598d54c 100644
--- a/source/RobotAPI/core/RobotStatechartContext.h
+++ b/source/RobotAPI/core/RobotStatechartContext.h
@@ -52,7 +52,8 @@ namespace armarx
         {
             defineRequiredProperty<std::string>("KinematicUnitName", "Name of the kinematic unit that should be used");
             defineRequiredProperty<std::string>("KinematicUnitObserverName", "Name of the kinematic unit observer that should be used");
-            defineOptionalProperty<std::string>("HandUnits", "RightHandUnit", "Name of the comma-seperated hand units that should be used. Unitname for left hand should be LeftHandUnit, and for right hand RightHandUnit");
+            //HandUnits should only be changed via config file and default parameter should remain empty
+            defineOptionalProperty<std::string>("HandUnits", "", "Name of the comma-seperated hand units that should be used. Unitname for left hand should be LeftHandUnit, and for right hand RightHandUnit");
 
         }
     };
diff --git a/source/RobotAPI/drivers/WeissHapticSensor/WeissHapticSensorsUnit.cpp b/source/RobotAPI/drivers/WeissHapticSensor/WeissHapticSensorsUnit.cpp
index f71224bfed1f9e0b4bf6452eabe25f7cd3b55cd1..ad7fc94e2f76e0d7356f8b2bb47fc25a3aaabccf 100755
--- a/source/RobotAPI/drivers/WeissHapticSensor/WeissHapticSensorsUnit.cpp
+++ b/source/RobotAPI/drivers/WeissHapticSensor/WeissHapticSensorsUnit.cpp
@@ -1,4 +1,4 @@
-/**
+/*
  * This file is part of ArmarX.
  *
  * ArmarX is free software; you can redistribute it and/or modify
diff --git a/source/RobotAPI/drivers/WeissHapticSensor/WeissHapticSensorsUnit.h b/source/RobotAPI/drivers/WeissHapticSensor/WeissHapticSensorsUnit.h
index 078bfe63905991b19026b71856470acf892e7d6a..797a8f4306ab089d3e4af6d47e45320919e9a7ff 100755
--- a/source/RobotAPI/drivers/WeissHapticSensor/WeissHapticSensorsUnit.h
+++ b/source/RobotAPI/drivers/WeissHapticSensor/WeissHapticSensorsUnit.h
@@ -1,4 +1,4 @@
-/**
+/*
  * This file is part of ArmarX.
  *
  * ArmarX is free software; you can redistribute it and/or modify
diff --git a/source/RobotAPI/motioncontrol/MotionControl.cpp b/source/RobotAPI/motioncontrol/MotionControl.cpp
index 4804e2bfeec2d22fe01f99d01d1d9d598bc21f3c..becc080f3022e160a8e183d97eacb5fdacf33b5a 100644
--- a/source/RobotAPI/motioncontrol/MotionControl.cpp
+++ b/source/RobotAPI/motioncontrol/MotionControl.cpp
@@ -244,6 +244,8 @@ void MoveTCPPoseIK::defineParameters()
 
     addToInput("targetPositionDistanceTolerance", VariantType::Float, false);
     addToInput("targetOrientationDistanceTolerance", VariantType::Float, false);
+    addToInput("ikWithOrientation", VariantType::Bool, false);
+
     addToInput("timeoutInMs", VariantType::Int, false);
 
     addToInput("jointTargetTolerance", VariantType::Float, false);
@@ -300,8 +302,11 @@ void MoveTCPTrajectory::defineParameters()
 
     addToInput("targetPositionDistanceTolerance", VariantType::Float, false);
     addToInput("targetOrientationDistanceTolerance", VariantType::Float, false);
+    addToInput("ikWithOrientation", VariantType::Bool, false);
+
     addToInput("timeoutInMs", VariantType::Int, false);
 
+    addToInput("jointTargetTolerance", VariantType::Float, false);
 
     addToOutput("TCPDistanceToTarget", VariantType::Float, true);
     addToOutput("TCPOrientationDistanceToTarget", VariantType::Float, true);
@@ -422,10 +427,13 @@ void MoveTCPTrajectoryNextPoint::defineParameters()
 
     addToInput("targetPositionDistanceTolerance", VariantType::Float, false);
     addToInput("targetOrientationDistanceTolerance", VariantType::Float, false);
+    addToInput("ikWithOrientation", VariantType::Bool, false);
+
     addToInput("timeoutInMs", VariantType::Int, false);
 
     addToInput("trajectoryPointCounterID", VariantType::ChannelRef, false);
 
+    addToInput("jointTargetTolerance", VariantType::Float, false);
 
     addToLocal("targetTCPPosition", VariantType::FramedPosition);
     addToLocal("targetTCPOrientation", VariantType::FramedOrientation);
@@ -473,6 +481,8 @@ void CalculateJointAngleConfiguration::defineParameters()
     addToInput("targetTCPPosition", VariantType::FramedPosition, false);
     addToInput("targetTCPOrientation", VariantType::FramedOrientation, false);
     addToInput("targetPositionDistanceTolerance", VariantType::Float, false);
+    addToInput("targetOrientationDistanceTolerance", VariantType::Float, false);
+    addToInput("ikWithOrientation", VariantType::Bool, false);
 
     addToOutput("jointNames", VariantType::List(VariantType::String), true);
     addToOutput("targetJointValues", VariantType::List(VariantType::Float), true);
@@ -487,18 +497,52 @@ void CalculateJointAngleConfiguration::run()
 
     // 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");
-    std::string robotModelFile;
+    //std::string robotModelFile;
     //ArmarXDataPath::getAbsolutePath("Armar4/data/Armar4/ArmarIV.xml", robotModelFile);
-    ArmarXDataPath::getAbsolutePath("Armar3/data/robotmodel/ArmarIII.xml", robotModelFile);
-    VirtualRobot::RobotPtr robot = VirtualRobot::RobotIO::loadRobot(robotModelFile.c_str());
+    //ArmarXDataPath::getAbsolutePath("Armar3/data/robotmodel/ArmarIII.xml", robotModelFile);
+    //VirtualRobot::RobotPtr robot = VirtualRobot::RobotIO::loadRobot(robotModelFile.c_str());
+
+    std::string kinChainName = getInput<std::string>("kinematicChainName");
+    float maxError = getInput<float>("targetPositionDistanceTolerance");
+    float maxErrorRot = getInput<float>("targetOrientationDistanceTolerance");
+    bool withOrientation = getInput<bool>("ikWithOrientation");
+    VirtualRobot::IKSolver::CartesianSelection ikType = VirtualRobot::IKSolver::All;
+    if (!withOrientation)
+        ikType = VirtualRobot::IKSolver::Position;
+
+
+    RobotStatechartContext* context = getContext<RobotStatechartContext>();
+    if (!context)
+    {
+        ARMARX_WARNING << "Need a RobotStatechartContext" << flush;
+        sendEvent<EvFailure>();
+    }
 
-    VirtualRobot::GenericIKSolverPtr ikSolver(new VirtualRobot::GenericIKSolver(robot->getRobotNodeSet(getInput<std::string>("kinematicChainName"))));
+    if (!context->robotStateComponent)
+    {
+        ARMARX_WARNING << "No RobotStatechartContext->robotStateComponent" << flush;
+        sendEvent<EvFailure>();
+    }
+
+    VirtualRobot::RobotPtr robot = RemoteRobot::createLocalClone(context->robotStateComponent);
+    if (!robot)
+    {
+        ARMARX_WARNING << "Could not create a local clone of RemoteRobot" << flush;
+        sendEvent<EvFailure>();
+    }
+    if (!robot->hasRobotNodeSet(kinChainName))
+    {
+        ARMARX_WARNING << "Robot does not know kinematic chain with name " << kinChainName << flush;
+        sendEvent<EvFailure>();
+    }
+    ARMARX_INFO << "Setting up ik solver for kin chain: " << kinChainName << ", max position error:" << maxError << ", max orientation erorr " << maxErrorRot << ", useOrientation:" << withOrientation << armarx::flush;
+    VirtualRobot::GenericIKSolverPtr ikSolver(new VirtualRobot::GenericIKSolver(robot->getRobotNodeSet(kinChainName), VirtualRobot::JacobiProvider::eSVDDamped));
     ikSolver->setVerbose(true);
-    ikSolver->setMaximumError(getInput<float>("targetPositionDistanceTolerance"));
-    ikSolver->setupJacobian(0.1, 40);
+    ikSolver->setMaximumError(maxError,maxErrorRot);
+    ikSolver->setupJacobian(0.6f, 10);
 
     VirtualRobot::LinkedCoordinate target = ArmarPose::createLinkedCoordinate(robot, getInput<FramedPosition>("targetTCPPosition"), getInput<FramedOrientation>("targetTCPOrientation"));
-    ARMARX_INFO << "target: " << target.getPose() << armarx::flush;
+    ARMARX_INFO << "IK target: " << target.getPose() << armarx::flush;
     Eigen::Matrix4f goalInRoot = target.getInFrame(robot->getRootNode());
 
 //    // test
@@ -511,7 +555,7 @@ void CalculateJointAngleConfiguration::run()
 
     ARMARX_INFO << "Calculating IK" << flush;
     //if (!ikSolver->solve(goalGlobal, VirtualRobot::IKSolver::Position, 50))
-    if (!ikSolver->solve(goalGlobal, VirtualRobot::IKSolver::All, 50))
+    if (!ikSolver->solve(goalGlobal, ikType, 5))
     {
         ARMARX_WARNING << "IKSolver found no solution! " << flush;
         sendEvent<EvFailure>();
@@ -521,15 +565,12 @@ void CalculateJointAngleConfiguration::run()
 
         SingleTypeVariantList jointNames = SingleTypeVariantList(VariantType::String);
         SingleTypeVariantList targetJointValues = SingleTypeVariantList(VariantType::Float);
-        VirtualRobot::RobotNodeSetPtr kinematicChain = robot->getRobotNodeSet(getInput<std::string>("kinematicChainName") );
+        VirtualRobot::RobotNodeSetPtr kinematicChain = robot->getRobotNodeSet(kinChainName);
         for (int i = 0; i < (signed int)kinematicChain->getSize(); i++)
         {
-            if (kinematicChain->getNode(i)->getName().compare("VirtualCentralGaze") != 0)
-            {
-                jointNames.addVariant(Variant(kinematicChain->getNode(i)->getName()));
-                targetJointValues.addVariant(Variant(kinematicChain->getNode(i)->getJointValue()));
-                ARMARX_LOG << " joint: " << kinematicChain->getNode(i)->getName() << "   value: " << kinematicChain->getNode(i)->getJointValue() << flush;
-            }
+            jointNames.addVariant(Variant(kinematicChain->getNode(i)->getName()));
+            targetJointValues.addVariant(Variant(kinematicChain->getNode(i)->getJointValue()));
+            ARMARX_LOG << " joint: " << kinematicChain->getNode(i)->getName() << "   value: " << kinematicChain->getNode(i)->getJointValue() << flush;
         }
         ARMARX_LOG << "number of joints to be set: " << jointNames.getSize() << flush;
         ARMARX_LOG << "setting output: jointNames" << flush;
@@ -548,6 +589,7 @@ void ValidateJointAngleConfiguration::defineParameters()
     addToInput("targetTCPOrientation", VariantType::FramedOrientation, false);
     addToInput("targetPositionDistanceTolerance", VariantType::Float, false);
     addToInput("targetOrientationDistanceTolerance", VariantType::Float, false);
+    addToInput("ikWithOrientation", VariantType::Bool, false);
     addToInput("kinematicChainName", VariantType::String, false);
 
     addToOutput("TCPDistanceToTarget", VariantType::Float, true);
@@ -579,7 +621,8 @@ void ValidateJointAngleConfiguration::onEnter()
 
     setOutput("TCPDistanceToTarget", cartesianDistance);
     setOutput("TCPOrientationDistanceToTarget", orientationDistance);
-    if (cartesianDistance <= getInput<float>("targetPositionDistanceTolerance") && orientationDistance <= getInput<float>("targetOrientationDistanceTolerance"))
+    bool withOri = getInput<bool>("ikWithOrientation");
+    if (cartesianDistance <= getInput<float>("targetPositionDistanceTolerance") && (!withOri || orientationDistance <= getInput<float>("targetOrientationDistanceTolerance")))
     {
         sendEvent<EvSuccess>();
     }
@@ -640,6 +683,8 @@ void MotionControlTestStateIK::defineParameters()
 
     addToInput("targetPositionDistanceTolerance", VariantType::Float, false);
     addToInput("targetOrientationDistanceTolerance", VariantType::Float, false);
+    addToInput("ikWithOrientation", VariantType::Bool, false);
+
     addToInput("timeoutInMs", VariantType::Int, false);
 
 
@@ -990,6 +1035,7 @@ void CalculateHeadIK::onEnter()
 {
     targetPosition = getInput<FramedPosition>("target");
     kinematicChainName = getInput<std::string>("headIKKinematicChainName");
+    virtualPrismaticJointName = getInput<std::string>("headIKVirtualPrismaticJointName");
 }
 
 
@@ -1005,15 +1051,33 @@ void CalculateHeadIK::run()
     VirtualRobot::RobotPtr robot = VirtualRobot::RobotIO::loadRobot(robotModelFile.c_str(), VirtualRobot::RobotIO::eStructure);
     robot->setConfig(robotSnapshotConfig);
 
+    if (!robot)
+    {
+        ARMARX_WARNING << "No robot!" << flush;
+        sendEvent<EvFailure>();
+    }
+
     VirtualRobot::RobotNodeSetPtr kinematicChain = robot->getRobotNodeSet(kinematicChainName);
-    VirtualRobot::RobotNodePrismaticPtr virtualJoint;
-    for (unsigned int i=0; i<kinematicChain->getSize(); i++)
+    if (!kinematicChain)
+    {
+        ARMARX_WARNING << "No kinematicChain with name " << kinematicChainName << flush;
+        sendEvent<EvFailure>();
+    }
+
+    VirtualRobot::RobotNodePrismaticPtr virtualJoint = boost::dynamic_pointer_cast<VirtualRobot::RobotNodePrismatic>(robot->getRobotNode(virtualPrismaticJointName));
+    if (!virtualJoint)
+    {
+        ARMARX_WARNING << "No virtualJoint with name " << virtualPrismaticJointName << flush;
+        sendEvent<EvFailure>();
+    }
+
+    /*for (unsigned int i=0; i<kinematicChain->getSize(); i++)
     {
         if (kinematicChain->getNode(i)->getName().compare("VirtualCentralGaze") == 0)
         {
             virtualJoint = boost::dynamic_pointer_cast<VirtualRobot::RobotNodePrismatic>(kinematicChain->getNode(i));
         }
-    }
+    }*/
     VirtualRobot::GazeIK ikSolver(kinematicChain, virtualJoint);
     ikSolver.enableJointLimitAvoidance(true);
 
@@ -1038,7 +1102,7 @@ void CalculateHeadIK::run()
         SingleTypeVariantList targetJointValues = SingleTypeVariantList(VariantType::Float);
         for (int i = 0; i < (signed int)kinematicChain->getSize(); i++)
         {
-            if (kinematicChain->getNode(i)->getName().compare("VirtualCentralGaze") != 0)
+            if (kinematicChain->getNode(i)->getName().compare(virtualPrismaticJointName) != 0)
             {
                 jointNames.addVariant(Variant(kinematicChain->getNode(i)->getName()));
                 targetJointValues.addVariant(Variant(kinematicChain->getNode(i)->getJointValue()));
diff --git a/source/RobotAPI/motioncontrol/MotionControl.h b/source/RobotAPI/motioncontrol/MotionControl.h
index 494afd727e225f1409a555dba18b1a68e4eed432..f7a7139e0643cae44b17ce9c6e3ee659110a5f59 100644
--- a/source/RobotAPI/motioncontrol/MotionControl.h
+++ b/source/RobotAPI/motioncontrol/MotionControl.h
@@ -59,6 +59,7 @@ namespace MotionControl
     - targetTCPOrientation: the target orientation
     - targetPositionDistanceTolerance: tolerance for the position to decide if the motion was successfull
     - targetOrientationDistanceTolerance: tolerance for the orientation to decide if the motion was successfull
+    - ikWithOrientation: Consider orientation for IK computation. if false, the rotation of the TCP is not considered.
     - timeoutInMs: a timeout after which the motion is aborted
     Output parameters:
     - TCPDistanceToTarget: kartesian distance between TCP and target position
@@ -72,6 +73,7 @@ namespace MotionControl
     - targetTCPOrientations: the list of target orientations
     - targetPositionDistanceTolerance: tolerance for the position to decide if the motion was successfull
     - targetOrientationDistanceTolerance: tolerance for the orientation to decide if the motion was successfull
+    - ikWithOrientation: Consider orientation for IK computation. if false, the rotation of the TCP is not considered.
     - timeoutInMs: a timeout after which the motion is aborted
     Output parameters:
     - TCPDistanceToTarget: kartesian distance between TCP and target position
@@ -169,6 +171,7 @@ namespace MotionControl
     *   \param targetTCPPosition the target position for the TCP
     *   \param targetTCPOrientation the target orientation
     *   \param targetPositionDistanceTolerance tolerance for the position to decide if the motion was successfull
+    *   \param ikWithOrientation: Consider orientation for IK computation. if false, the rotation of the TCP is not considered.
     *   \param targetOrientationDistanceTolerance tolerance for the orientation to decide if the motion was successfull
     *   \param timeoutInMs a timeout after which the motion is aborted
     */
@@ -195,6 +198,7 @@ namespace MotionControl
     *   \param targetTCPOrientations the list of target orientations
     *   \param targetPositionDistanceTolerance tolerance for the position to decide if the motion was successfull
     *   \param targetOrientationDistanceTolerance tolerance for the orientation to decide if the motion was successfull
+    *   \param ikWithOrientation: Consider orientation for IK computation. if false, the rotation of the TCP is not considered.
     *   \param timeoutInMs a timeout after which the motion is aborted
     */
     struct MoveTCPTrajectory : StateTemplate<MoveTCPTrajectory>
@@ -378,6 +382,7 @@ namespace MotionControl
         void run();
         FramedPositionPtr targetPosition;
         std::string kinematicChainName;
+        std::string virtualPrismaticJointName;
     };
 
 } // namespace MotionControl