diff --git a/source/RobotAPI/interface/units/RobotUnit/NJointTaskSpaceDMPController.ice b/source/RobotAPI/interface/units/RobotUnit/NJointTaskSpaceDMPController.ice
index 850ab231f12ca392810c78c0af412454c8a4a28f..ea8580ace2601cc93d498f4fab9319e1af0615bb 100644
--- a/source/RobotAPI/interface/units/RobotUnit/NJointTaskSpaceDMPController.ice
+++ b/source/RobotAPI/interface/units/RobotUnit/NJointTaskSpaceDMPController.ice
@@ -100,9 +100,12 @@ module armarx
         double phaseKpPos = 1;
         double phaseKpOri = 0.1;
 
+
         // misc
         Ice::DoubleSeq timeDurations;
         Ice::StringSeq dmpTypes;
+        Ice::DoubleSeq amplitudes;
+
         double posToOriRatio = 100;
 
         // velocity controller configuration
diff --git a/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointCCDMPController.cpp b/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointCCDMPController.cpp
index d13c9d954d32b5a7a3b78f98543cdc4595c4c352..c00253ed7a2524d5e6d8a591754f458ef2649168 100644
--- a/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointCCDMPController.cpp
+++ b/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointCCDMPController.cpp
@@ -72,6 +72,7 @@ namespace armarx
 
         // initialize tcp position and orientation
         Eigen::Matrix4f pose = tcp->getPoseInRootFrame();
+        oldPose = pose;
         tcpPosition(0) = pose(0, 3);
         tcpPosition(1) = pose(1, 3);
         tcpPosition(2) = pose(2, 3);
@@ -103,6 +104,8 @@ namespace armarx
         reinitTripleBuffer(initData);
 
         learnedDMP.clear();
+
+        amplitudes = cfg->amplitudes;
     }
 
     std::string NJointCCDMPController::getClassName(const Ice::Current&) const
@@ -149,7 +152,7 @@ namespace armarx
             phaseDist = phaseDist0;
         }
 
-        double phaseStop = 0;//phaseL / (1 + exp(-phaseK * (error - phaseDist)));
+        double phaseStop = phaseL / (1 + exp(-phaseK * (error - phaseDist)));
         double mpcFactor = 1 - (phaseStop / phaseL);
 
 
@@ -165,25 +168,20 @@ namespace armarx
 
         // run DMP one after another
         Eigen::Matrix4f targetPose = Eigen::Matrix4f::Identity();
-        std::vector<double> vel0;
-        vel0.resize(6);
-        for (size_t i = 0; i < vel0.size(); ++i)
-        {
-            vel0[i] = 0;
-        }
-
         bool finished = true;
         for (size_t i = 0; i < cfg->dmpNum; ++i)
         {
             double timeDuration = timeDurations[i];
             std::string dmpType = dmpTypes[i];
 
+            double amplitude = 1.0;
             if (dmpType == "Periodic")
             {
                 if (canVals[i] <= 1e-8)
                 {
                     canVals[i] = timeDuration;
                 }
+                amplitude = amplitudes[i];
             }
 
             if (canVals[i] > 1e-8)
@@ -197,37 +195,25 @@ namespace armarx
                 currentStates[i] = dmpPtr->calculateDirectlyVelocity
                                    (currentStates[i], canVals[i] / timeDurations[i], dmpDeltaT, targetSubStates[i]);
 
-                for (size_t j = 0; j < vel0.size(); ++j)
-                {
-                    vel0[j] += currentStates[i][j].vel / timeDuration;
-                }
 
+                finished = false;
 
-                Eigen::Matrix4f targetSubMat = VirtualRobot::MathTools::rpy2eigen4f(targetSubStates[i][3], targetSubStates[i][4], targetSubStates[i][5]);
-                targetSubMat(0, 3) = targetSubStates[i][0];
-                targetSubMat(1, 3) = targetSubStates[i][1];
-                targetSubMat(2, 3) = targetSubStates[i][2];
+            }
 
-                targetPose = targetPose * targetSubMat;
 
-                finished = false;
-            }
-            else
-            {
-                for (size_t j = 0; j < vel0.size(); ++j)
-                {
-                    vel0[j] += 0;
-                }
+            Eigen::Matrix4f targetSubMat = VirtualRobot::MathTools::rpy2eigen4f(targetSubStates[i][3], targetSubStates[i][4], targetSubStates[i][5]);
+            targetSubMat(0, 3) = targetSubStates[i][0];
+            targetSubMat(1, 3) = targetSubStates[i][1];
+            targetSubMat(2, 3) = targetSubStates[i][2];
 
-                Eigen::Matrix4f targetSubMat = VirtualRobot::MathTools::rpy2eigen4f(targetSubStates[i][3], targetSubStates[i][4], targetSubStates[i][5]);
-                targetSubMat(0, 3) = targetSubStates[i][0];
-                targetSubMat(1, 3) = targetSubStates[i][1];
-                targetSubMat(2, 3) = targetSubStates[i][2];
-                targetPose = targetPose * targetSubMat;
-            }
+            ARMARX_INFO << "targetSubMat: " << targetSubMat;
+
+            targetPose = targetPose * targetSubMat;
 
         }
 
+        ARMARX_INFO << "targetPose: " << targetPose;
+
         Eigen::Vector3f targetRPY = VirtualRobot::MathTools::eigen4f2rpy(targetPose);
         targetState[0] = targetPose(0, 3);
         targetState[1] = targetPose(1, 3);
@@ -236,18 +222,24 @@ namespace armarx
         targetState[4] = targetRPY(1);
         targetState[5] = targetRPY(2);
 
+        Eigen::Vector3f oldRPY = VirtualRobot::MathTools::eigen4f2rpy(oldPose);
+
+
         for (size_t i = 0; i < 3; i++)
         {
+            double vel0 = (targetState[i] - oldPose(i, 3)) / deltaT;
             double vel1 = phaseKpPos * (targetState[i] - currentPose(i, 3));
-            targetVels[i] = mpcFactor * vel0[i] + (1 - mpcFactor) * vel1;
+            targetVels[i] = mpcFactor * vel0 + (1 - mpcFactor) * vel1;
         }
 
         for (size_t i = 0; i < 3; i++)
         {
+            double vel0 = (targetState[i + 3] - oldRPY(i)) / deltaT;
             double vel1 = phaseKpOri * (targetState[i + 3] - currentRPY(i));
-            targetVels[i + 3] = mpcFactor * vel0[i + 3] + (1 - mpcFactor) * vel1;
+            targetVels[i + 3] = mpcFactor * vel0 + (1 - mpcFactor) * vel1;
         }
 
+        oldPose = targetPose;
 
         debugOutputData.getWriteBuffer().latestTargetVelocities["x_vel"] = targetVels[0];
         debugOutputData.getWriteBuffer().latestTargetVelocities["y_vel"] = targetVels[1];
@@ -576,7 +568,7 @@ namespace armarx
     void NJointCCDMPController::onInitComponent()
     {
         ARMARX_INFO << "init ...";
-        controllerTask = new PeriodicTask<NJointCCDMPController>(this, &NJointCCDMPController::controllerRun, 0.5);
+        controllerTask = new PeriodicTask<NJointCCDMPController>(this, &NJointCCDMPController::controllerRun, 0.3);
     }
 
     void NJointCCDMPController::onDisconnectComponent()
diff --git a/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointCCDMPController.h b/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointCCDMPController.h
index cde02bb4e350de36c37c022e9904597f6811e8c9..7dc42afd1e8c99b9a5d269727cec270753abfc5c 100644
--- a/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointCCDMPController.h
+++ b/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointCCDMPController.h
@@ -128,6 +128,7 @@ namespace armarx
         std::vector<double> canVals;
         std::vector<double> timeDurations;
         std::vector<std::string > dmpTypes;
+        std::vector<double> amplitudes;
 
         std::vector<Vec<DMPState > > currentStates;
         std::vector<DVec > targetSubStates;
@@ -156,6 +157,8 @@ namespace armarx
         Eigen::Vector3f tcpPosition;
         Eigen::Vector3f tcpOrientation;
 
+        Eigen::Matrix4f oldPose;
+
         DMP::DVec targetState;
         mutable MutexType controllerMutex;
         PeriodicTask<NJointCCDMPController>::pointer_type controllerTask;
diff --git a/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTSDMPController.cpp b/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTSDMPController.cpp
index a9d87b71878959e6dc716a1ccb99c748c5f30521..28f315c41525c72ba1a89caf313162603acd9d2c 100644
--- a/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTSDMPController.cpp
+++ b/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTSDMPController.cpp
@@ -64,11 +64,7 @@ namespace armarx
         posToOriRatio = cfg->posToOriRatio;
 
         // initialize tcp position and orientation
-        Eigen::Matrix4f pose = tcp->getPoseInRootFrame();
-        tcpPosition(0) = pose(0, 3);
-        tcpPosition(1) = pose(1, 3);
-        tcpPosition(2) = pose(2, 3);
-        tcpOrientation = VirtualRobot::MathTools::eigen4f2rpy(pose);
+
 
 
         NJointTSDMPControllerSensorData initSensorData;
@@ -90,6 +86,7 @@ namespace armarx
         initData.torqueKd.resize(tcpController->rns->getSize(), 0);
         initData.mode = ModeFromIce(cfg->mode);
         reinitTripleBuffer(initData);
+
     }
 
     std::string NJointTSDMPController::getClassName(const Ice::Current&) const
@@ -107,6 +104,8 @@ namespace armarx
         double deltaT = 0;
         std::vector<double> currentposi;
         std::vector<double> currentori;
+        currentposi.resize(3);
+        currentori.resize(3);
 
         if (canVal > 1e-8)
         {
@@ -118,14 +117,12 @@ namespace armarx
             currentState = controllerSensorData.getReadBuffer().currentState;
 
 
-            currentposi.resize(3);
             for (size_t i = 0; i < 3; ++i)
             {
                 currentposi[i] = currentState[i].pos;
                 posError += pow(currentState[i].pos - targetState[i], 2);
             }
 
-            currentori.resize(3);
             for (size_t i = 0; i < 3; ++i)
             {
                 currentori[i] = currentState[i + 3].pos;
@@ -169,6 +166,7 @@ namespace armarx
 
 
             double vel0, vel1;
+
             for (size_t i = 0; i < 3; i++)
             {
                 vel0 = currentState[i].vel / timeDuration;
@@ -181,6 +179,7 @@ namespace armarx
                 vel1 = phaseKpOri * (targetState[i + 3] - currentori[i]);
                 targetVels[i + 3] = mpcFactor * vel0 + (1 - mpcFactor) * vel1;
             }
+
         }
         else
         {
@@ -190,14 +189,24 @@ namespace armarx
             {
                 targetVels[i] = 0;
             }
+
+            for (size_t i = 0; i < 3; ++i)
+            {
+                currentposi[i] = currentState[i].pos;
+            }
+
+            for (size_t i = 0; i < 3; ++i)
+            {
+                currentori[i] = currentState[i + 3].pos;
+            }
         }
 
         debugOutputData.getWriteBuffer().latestTargetVelocities["x_vel"] = targetVels[0];
         debugOutputData.getWriteBuffer().latestTargetVelocities["y_vel"] = targetVels[1];
         debugOutputData.getWriteBuffer().latestTargetVelocities["z_vel"] = targetVels[2];
-        debugOutputData.getWriteBuffer().latestTargetVelocities["roll_vel"] = targetVels[3];
-        debugOutputData.getWriteBuffer().latestTargetVelocities["pitch_vel"] = targetVels[4];
-        debugOutputData.getWriteBuffer().latestTargetVelocities["yaw_vel"] = targetVels[5];
+        debugOutputData.getWriteBuffer().latestTargetVelocities["angle_x"] = targetVels[3];
+        debugOutputData.getWriteBuffer().latestTargetVelocities["angle_y"] = targetVels[4];
+        debugOutputData.getWriteBuffer().latestTargetVelocities["angle_z"] = targetVels[5];
         debugOutputData.getWriteBuffer().dmpTargets["dmp_x"] = targetState[0];
         debugOutputData.getWriteBuffer().dmpTargets["dmp_y"] = targetState[1];
         debugOutputData.getWriteBuffer().dmpTargets["dmp_z"] = targetState[2];
@@ -435,6 +444,15 @@ namespace armarx
 
     void NJointTSDMPController::runDMP(const Ice::DoubleSeq&  goals, double tau, const Ice::Current&)
     {
+        Eigen::Matrix4f pose = tcp->getPoseInRootFrame();
+        tcpPosition(0) = pose(0, 3);
+        tcpPosition(1) = pose(1, 3);
+        tcpPosition(2) = pose(2, 3);
+        tcpOrientation = VirtualRobot::MathTools::eigen4f2rpy(pose);
+
+        ARMARX_INFO << "tcpPosition: " << tcpPosition;
+        ARMARX_INFO << "tcpOrientation: " << tcpOrientation;
+
         currentState.clear();
         targetState.clear();
         for (size_t i = 0; i < 3; i++)