diff --git a/VirtualRobot/IK/Constraint.cpp b/VirtualRobot/IK/Constraint.cpp
index dbf0a14656a9f43b724bee739cb65d60ebb8dc20..42ba844cf8e13d2fdf7ea3f6c4ba8b64daf8102b 100644
--- a/VirtualRobot/IK/Constraint.cpp
+++ b/VirtualRobot/IK/Constraint.cpp
@@ -3,7 +3,7 @@
 using namespace VirtualRobot;
 
 Constraint::Constraint(const RobotNodeSetPtr &nodeSet) :
-    JacobiProvider(nodeSet, JacobiProvider::eSVD),
+    JacobiProvider(nodeSet, JacobiProvider::eSVDDamped),
     lastError(-1),
     lastLastError(-1)
 {
diff --git a/VirtualRobot/IK/constraints/TSRConstraint.cpp b/VirtualRobot/IK/constraints/TSRConstraint.cpp
index 399139aa84c3f6b682128dd02d1af2ad962d6147..6bdaed898aa066f72ae5cac0eeb4dcd8c3d24832 100644
--- a/VirtualRobot/IK/constraints/TSRConstraint.cpp
+++ b/VirtualRobot/IK/constraints/TSRConstraint.cpp
@@ -84,21 +84,33 @@ Eigen::VectorXf TSRConstraint::getError(float stepSize)
     Eigen::Matrix4f T_dx;
     MathTools::posrpy2eigen4f(target.block<3,1>(0,0), target.block<3,1>(3,0), T_dx);
 
-    float target_global[6];
-    MathTools::eigen4f2rpy(transformation * T_dx, target_global);
+    Eigen::Matrix4f P_target = transformation * T_dx;
+    //float target_global[6];
+    //MathTools::eigen4f2rpy(P_target, target_global);
 
-    float e_global[6];
-    MathTools::eigen4f2rpy(eef_global * eefOffset, e_global);
+    Eigen::Matrix4f P_eef = eef_global * eefOffset;
+    //float e_global[6];
+    //MathTools::eigen4f2rpy(P_eef, e_global);
 
-    resolveRPYAmbiguities(e_global, target_global);
+    Eigen::Matrix4f P_delta = P_target * P_eef.inverse();
+    Eigen::AngleAxis<float> P_delta_AA;
+    P_delta_AA = P_delta.block<3, 3>(0, 0);
 
     Eigen::VectorXf dx(6);
+    dx.head(3) = Eigen::Vector3f(
+                P_target(0,3) - P_eef(0,3),
+                P_target(1,3) - P_eef(1,3),
+                P_target(2,3) - P_eef(2,3)
+                );
+    dx.tail(3) = P_delta_AA.axis() * P_delta_AA.angle();
+
+    /*resolveRPYAmbiguities(e_global, target_global);
     dx << (target_global[0] - e_global[0]),
           (target_global[1] - e_global[1]),
           (target_global[2] - e_global[2]),
           getShortestDistanceForRPYComponent(e_global[3], target_global[3]),
           getShortestDistanceForRPYComponent(e_global[4], target_global[4]),
-          getShortestDistanceForRPYComponent(e_global[5], target_global[5]);
+          getShortestDistanceForRPYComponent(e_global[5], target_global[5]);*/
 
     return dx * stepSize;
 }