diff --git a/.gitignore b/.gitignore
index efe7e6e621bb44ff3b61c296ce841445f5353451..6bbc3ffa11b5ac3f4e9acca1b3eeeb70d886e60d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,17 +1,23 @@
-.keep_in_git
+/build/*
+!/build/.gitkeep
+!.gitkeep
+!.gitignore
 
-/build*
-
-source/RobotAPI/Test.h
+source/*/Test.h
 
 *.bak
 *#
 .#*
 *~
+*.swp
+.*.kate-swp
+.*.swo
+*.pyc
 
 .DS_Store
 CMakeFiles
 CMakeCache.txt
+CMakeLists.txt.user
 
 *.o
 *.os
@@ -22,3 +28,18 @@ CMakeCache.txt
 *.dylib
 moc_*
 
+# eclipse stuff
+.project
+.pydevproject
+.settings
+.metadata
+.cproject
+.project
+
+# MemoryX
+.cache
+mongod.log*
+data/db/
+data/dbdump/
+
+
diff --git a/source/RobotAPI/motioncontrol/MotionControl.cpp b/source/RobotAPI/motioncontrol/MotionControl.cpp
index 31911fccc1564278b7abec0dc0c5090970fd3554..644169dafb80c50029eaa149469249fb72381b47 100644
--- a/source/RobotAPI/motioncontrol/MotionControl.cpp
+++ b/source/RobotAPI/motioncontrol/MotionControl.cpp
@@ -15,24 +15,22 @@
 using namespace armarx;
 using namespace armarx::MotionControl;
 
-MotionControlOfferer::MotionControlOfferer()
+MotionControlHandler::MotionControlHandler()
 {
 }
 
 
 
-void MotionControlOfferer::onInitRemoteStateOfferer()
+void MotionControlHandler::onInitRemoteStateOfferer()
 {
-    addState<MoveJoints>("MoveJoints");
-    addState<MoveJointsVelocityControl>("MoveJointsVelocityControl");
-    addState<MoveTCPPoseIK>("MoveTCPPoseIK");
+    //addState<MoveJoints>("MoveJoints");
     //addState<MotionControlTestState>("MotionControlTestState");
-//    addState<MotionControlTestStateIK>("MotionControlTestStateIK");
+    addState<MotionControlTestStateIK>("MotionControlTestStateIK");
 }
 
 
 
-void MotionControlOfferer::onConnectRemoteStateOfferer()
+void MotionControlHandler::onConnectRemoteStateOfferer()
 {
 }
 
@@ -42,16 +40,16 @@ void MoveJoints::defineParameters()
 {
     context = getContext<RobotStatechartContext>();
 
-    setConfigFile("RobotAPI/data/stateconfigs/MotionControl.xml");
+    //setConfigFile("RobotAPI/data/stateconfigs/MotionControl.xml");
 
     addToInput("jointNames", VariantType::List(VariantType::String), false);
-    addToInput("targetJointValues", VariantType::Float, false);
+    addToInput("targetJointValues", VariantType::List(VariantType::Float), false);
 
     // TODO: add when we have decided how to do it
     addToInput("jointMaxSpeeds", VariantType::List(VariantType::Float), true);
     addToInput("jointMaxSpeed", VariantType::List(VariantType::Float), true);
 
-    addToInput("targetTolerance", VariantType::Float, false);
+    addToInput("jointTargetTolerance", VariantType::Float, false);
 
     addToInput("timeoutInMs", VariantType::Int, false);
 
@@ -71,7 +69,9 @@ void MoveJoints::onEnter()
         throw LocalException("Sizes of joint name list and joint value list do not match!");
     }
 
-    for(int i=0; i<jointNames->getSize(); i++ )
+    ARMARX_LOG << "number of joints that will be set: " << jointNames->getSize() << flush;
+
+    for (int i=0; i<jointNames->getSize(); i++)
     {
         targetJointAngles[jointNames->getVariant(i)->getString()] = targetJointValues->getVariant(i)->getFloat();
         ARMARX_VERBOSE << "setting joint angle for joint '" << jointNames->getVariant(i)->getString() << "' to " << targetJointValues->getVariant(i)->getFloat() << std::endl;
@@ -82,14 +82,15 @@ void MoveJoints::onEnter()
 
     //ExpressionPtr cond = Expression::create();
     Term cond;
-    float tolerance = getInput<float>("targetTolerance");
-    for(int i=0; i<jointNames->getSize(); i++ )
+    float tolerance = getInput<float>("jointTargetTolerance");
+    for (int i=0; i<jointNames->getSize(); i++)
     {
+        //ARMARX_VERBOSE << "creating condition (" << i << " of " << jointNames->getSize() << ")" << flush;
         ParameterList inrangeCheck;
         inrangeCheck.push_back(new Variant(targetJointValues->getVariant(i)->getFloat()-tolerance));
         inrangeCheck.push_back(new Variant(targetJointValues->getVariant(i)->getFloat()+tolerance));
 
-        Literal inrangeLiteral(DataFieldIdentifier(context->getKinematicUnitObserverName(),"jointangles", jointNames->getVariant(i)->getString()), "inrange", inrangeCheck);
+        Literal inrangeLiteral(DataFieldIdentifier(context->getKinematicUnitObserverName(), "jointangles", jointNames->getVariant(i)->getString()), "inrange", inrangeCheck);
         cond = cond && inrangeLiteral;
     }
 
@@ -137,7 +138,7 @@ void MoveJointsVelocityControl::defineParameters()
 {
     context = getContext<RobotStatechartContext>();
 
-    setConfigFile("RobotAPI/data/stateconfigs/MotionControl.xml");
+    //setConfigFile("RobotAPI/data/stateconfigs/MotionControl.xml");
 
     addToInput("jointNames", VariantType::List(VariantType::String), false);
     addToInput("targetJointVelocities", VariantType::List(VariantType::Float), false);
@@ -146,7 +147,7 @@ void MoveJointsVelocityControl::defineParameters()
     addToInput("jointMaxSpeeds", VariantType::List(VariantType::Float), true);
     addToInput("jointMaxSpeed", VariantType::Float, true);
 
-    addToInput("accelerationTime", VariantType::Float, true);
+    addToInput("accelerationTime", VariantType::Float, false);
 
     addToInput("targetJointVelocityTolerance", VariantType::Float, false);
 
@@ -227,7 +228,7 @@ void MoveTCPPoseIK::defineParameters()
 {
     context = getContext<RobotStatechartContext>();
 
-    setConfigFile("RobotAPI/data/stateconfigs/MotionControl.xml");
+    //setConfigFile("RobotAPI/data/stateconfigs/MotionControl.xml");
 
     addToInput("kinematicChainName", VariantType::String, false);
     addToInput("targetTCPPosition", VariantType::FramedPosition, false);
@@ -239,6 +240,7 @@ void MoveTCPPoseIK::defineParameters()
     addToInput("targetOrientationDistanceTolerance", VariantType::Float, false);
     addToInput("timeoutInMs", VariantType::Int, false);
 
+    addToInput("jointTargetTolerance", VariantType::Float, false);
 
     addToOutput("TCPDistanceToTarget", VariantType::Float, true);
     addToOutput("TCPOrientationDistanceToTarget", VariantType::Float, true);
@@ -262,12 +264,13 @@ void MoveTCPPoseIK::onExit()
 
 void MoveTCPPoseIK::defineSubstates()
 {
-    StatePtr moveJoints = addState<MoveJoints>("MoveJoints");
     StatePtr calculateJointAngleConfiguration = addState<CalculateJointAngleConfiguration>("CalculateJointAngleConfiguration");
+    StatePtr moveJoints = addState<MoveJoints>("MoveJoints");
     StatePtr validateJointAngleConfiguration = addState<ValidateJointAngleConfiguration>("ValidateJointAngleConfiguration");
     StatePtr movingDone = addState<SuccessState>("movingDone") ;
     StatePtr movingFailed = addState<FailureState>("movingFailed") ;
-    setInitState(calculateJointAngleConfiguration, PM::createMapping()->mapFromParent("*","*"));
+
+    setInitState(calculateJointAngleConfiguration, createMapping()->mapFromParent("*","*")); // PM::createMapping()->mapFromParent("*","*") ??
     addTransition<EvCalculationDone>(calculateJointAngleConfiguration, moveJoints, createMapping()->mapFromParent("*","*")->mapFromOutput("*","*"));
     addTransition<EvJointTargetReached>(moveJoints, validateJointAngleConfiguration, createMapping()->mapFromParent("*","*")->mapFromOutput("*","*"));
     addTransition<EvSuccess>(validateJointAngleConfiguration, movingDone, createMapping()->mapFromOutput("*","*"));
@@ -281,7 +284,7 @@ void MoveTCPTrajectory::defineParameters()
 {
     context = getContext<RobotStatechartContext>();
 
-    setConfigFile("RobotAPI/data/stateconfigs/MotionControl.xml");
+    //setConfigFile("RobotAPI/data/stateconfigs/MotionControl.xml");
 
     addToInput("kinematicChainName", VariantType::String, false);
     addToInput("targetTCPPositions", VariantType::List(VariantType::FramedPosition), false);
@@ -322,7 +325,7 @@ void MoveTCPTrajectory::onEnter()
 void MoveTCPTrajectory::onExit()
 {
     removeTimeoutEvent(timeoutEvent);
-    ChannelRefPtr r = getLocal<ChannelRefPtr>("trajectoryPointCounterID");
+    ChannelRefPtr r = getLocal<ChannelRef>("trajectoryPointCounterID");
     getContext()->systemObserverPrx->removeCounter(r);
     //removeCounterEvent(trajectoryPointCounterID);
 }
@@ -463,12 +466,13 @@ void MoveTCPTrajectoryNextPoint::defineSubstates()
 
 void CalculateJointAngleConfiguration::defineParameters()
 {
-    addToInput("KinematicChainName", VariantType::String, false);
+    addToInput("kinematicChainName", VariantType::String, false);
     addToInput("targetTCPPosition", VariantType::FramedPosition, false);
     addToInput("targetTCPOrientation", VariantType::FramedOrientation, false);
+    addToInput("targetPositionDistanceTolerance", VariantType::Float, false);
 
-    addToOutput("jointNames", VariantType::String, true);
-    addToOutput("targetJointValues", VariantType::Float, true);
+    addToOutput("jointNames", VariantType::List(VariantType::String), true);
+    addToOutput("targetJointValues", VariantType::List(VariantType::Float), true);
 }
 
 
@@ -476,17 +480,18 @@ void CalculateJointAngleConfiguration::defineParameters()
 void CalculateJointAngleConfiguration::run()
 {
     RobotStatechartContext* context = getContext<RobotStatechartContext>();
-    VirtualRobot::RobotPtr robot(new RemoteRobot(context->robotStateComponent->getRobotSnapshot("CalculateTCPPoseTime")));
+    VirtualRobot::RobotPtr robotPtr(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");
     std::string robotModelFile;
-//    ArmarXDataPath::getAbsolutePath("Armar4/data/Armar4/ArmarIV.xml", robotModelFile);
-//    VirtualRobot::RobotPtr robot = VirtualRobot::RobotIO::loadRobot(robotModelFile.c_str());
-
-    //VirtualRobot::RobotConfigPtr configPtr(new VirtualRobot::RobotConfig(robotPtr, "blub"));
-    //robotPtr->getRobotNodeSet("Root")->getJointValues(configPtr);
-    //robot->setJointValues(robotPtr->getRobotNodeSet("Root"), robotPtr->getRobotNodeSet("Root")->getJointValues());
-    VirtualRobot::RobotNodeSetPtr robotNodeset = robot->getRobotNodeSet(getInput<std::string>("KinematicChainName"));
-    VirtualRobot::GenericIKSolverPtr ikSolver(new VirtualRobot::GenericIKSolver(robotNodeset));
+    //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());
+
+    VirtualRobot::GenericIKSolverPtr ikSolver(new VirtualRobot::GenericIKSolver(robot->getRobotNodeSet(getInput<std::string>("kinematicChainName"))));
     ikSolver->setVerbose(true);
+    ikSolver->setMaximumError(getInput<float>("targetPositionDistanceTolerance"));
 
     VirtualRobot::LinkedCoordinate target = ArmarPose::createLinkedCoordinate(robot, getInput<FramedPosition>("targetTCPPosition"), getInput<FramedOrientation>("targetTCPOrientation"));
     Eigen::Matrix4f goalInRoot = target.getInFrame(robot->getRootNode());
@@ -500,7 +505,7 @@ void CalculateJointAngleConfiguration::run()
 //    ARMARX_INFO << "GOAL TCP:" << goalTmpTCP << endl;
 
     ARMARX_INFO << "Calculating IK" << flush;
-    if (!ikSolver->solve(goalInRoot, VirtualRobot::IKSolver::All, 1))
+    if (!ikSolver->solve(goalInRoot, VirtualRobot::IKSolver::Position, 1))
     {
         ARMARX_WARNING << "IKSolver found no solution! " << flush;
         sendEvent<EvFailure>();
@@ -510,14 +515,18 @@ void CalculateJointAngleConfiguration::run()
 
         SingleTypeVariantList jointNames = SingleTypeVariantList(VariantType::String);
         SingleTypeVariantList targetJointValues = SingleTypeVariantList(VariantType::Float);
-//        VirtualRobot::RobotNodeSetPtr robotNodeset = robot->getRobotNodeSet(getInput<std::string>("KinematicChainName") );
-        for (int i = 0; i < (signed int)robotNodeset->getSize(); i++)
+        VirtualRobot::RobotNodeSetPtr kinematicChain = robot->getRobotNodeSet(getInput<std::string>("kinematicChainName") );
+        for (int i = 0; i < (signed int)kinematicChain->getSize(); i++)
         {
-            jointNames.addVariant(Variant(robotNodeset->getNode(i)->getName()));
-            targetJointValues.addVariant(Variant(robotNodeset->getNode(i)->getJointValue()));
+            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;
         }
-        setOutput("targetJointValues",targetJointValues);
-        setOutput("jointNames",jointNames);
+        ARMARX_LOG << "number of joints to be set: " << jointNames.getSize() << flush;
+        ARMARX_LOG << "setting output: jointNames" << flush;
+        setOutput("jointNames", jointNames);
+        ARMARX_LOG << "setting output: targetJointValues" << flush;
+        setOutput("targetJointValues", targetJointValues);
         sendEvent<EvCalculationDone>();
     }
 }
@@ -545,7 +554,7 @@ void ValidateJointAngleConfiguration::onEnter()
     RobotStatechartContext* context = getContext<RobotStatechartContext>();
     VirtualRobot::RobotPtr robot(new RemoteRobot(context->robotStateComponent->getRobotSnapshot("ValidateTCPPoseTime")));
     VirtualRobot::LinkedCoordinate actualPose(robot);
-    actualPose.set(robot->getRobotNodeSet(getInput<std::string>("KinematicChainName"))->getTCP()->getName(), Vector3f(0,0,0));
+    actualPose.set(robot->getRobotNodeSet(getInput<std::string>("kinematicChainName"))->getTCP()->getName(), Vector3f(0,0,0));
     actualPose.changeFrame(robot->getRootNode());
     Vector3f actualPosition = actualPose.getPosition();
     Quaternionf actualOrientation(actualPose.getPose().block<3,3>(0,0));
@@ -578,14 +587,14 @@ void ValidateJointAngleConfiguration::onEnter()
 
 void MotionControlTestState::defineParameters()
 {
-    setConfigFile("RobotAPIConfigs/stateconfigs/MotionControl.xml");
+    //setConfigFile("RobotAPIConfigs/stateconfigs/MotionControl.xml");
 
     addToInput("jointNames", VariantType::List(VariantType::String), false);
     addToInput("targetJointValues", VariantType::List(VariantType::Float), false);
 
     addToInput("jointMaxSpeed", VariantType::Float, true);
 
-    addToInput("targetTolerance", VariantType::Float, false);
+    addToInput("jointTargetTolerance", VariantType::Float, false);
 
     addToInput("timeoutInMs", VariantType::Int, false);
 
@@ -610,7 +619,7 @@ void MotionControlTestState::defineSubstates()
 
 void MotionControlTestStateIK::defineParameters()
 {
-    setConfigFile("RobotAPIConfigs/stateconfigs/MotionControl.xml");
+    //setConfigFile("RobotAPIConfigs/stateconfigs/MotionControl.xml");
 
     addToInput("kinematicChainName", VariantType::String, false);
     //addToInput("targetTCPPosition", VariantType::FramedPosition, false);