diff --git a/source/RobotAPI/libraries/core/Trajectory.cpp b/source/RobotAPI/libraries/core/Trajectory.cpp
index 26d42594bfdc6eb7b1cc4c9444947a0f4a7b500b..6642bc9f6b5d5b9a0eb53d348d5905c62eb50b40 100644
--- a/source/RobotAPI/libraries/core/Trajectory.cpp
+++ b/source/RobotAPI/libraries/core/Trajectory.cpp
@@ -30,7 +30,12 @@
 namespace armarx
 {
 
-    void Trajectory::ice_preMarshal()
+Trajectory::~Trajectory()
+{
+
+}
+
+void Trajectory::ice_preMarshal()
     {
         dataVec.clear();
         timestamps.clear();
@@ -120,7 +125,14 @@ namespace armarx
 
     std::string Trajectory::output(const Ice::Current&) const
     {
-        return "Trajectory with " + std::to_string(dim()) + " dimensions";
+        const ordered_view& ordv = dataMap.get<TagOrdered>();
+        typename ordered_view::const_iterator itMap = ordv.begin();
+        std::stringstream s;
+        for (; itMap != ordv.end(); itMap++)
+        {
+            s << *itMap << std::endl;
+        }
+        return s.str();
     }
 
     Ice::Int Trajectory::getType(const Ice::Current&) const
@@ -164,7 +176,7 @@ namespace armarx
 
         for (; it != data.end(); it++)
         {
-            TrajData dataEntry(*this);
+            TrajData dataEntry(this);
             dataEntry.timestamp = it->first;
             const Ice::DoubleSeq& dataVec = it->second;
 
@@ -472,12 +484,12 @@ namespace armarx
         }
     }
 
-    double Trajectory::getSpaceLength(size_t derivation) const
+    double Trajectory::getLength(size_t derivation) const
     {
-        return getSpaceLength(derivation, begin()->getTimestamp(), rbegin()->getTimestamp());
+        return getLength(derivation, begin()->getTimestamp(), rbegin()->getTimestamp());
     }
 
-    double Trajectory::getSpaceLength(size_t derivation, double startTime, double endTime) const
+    double Trajectory::getLength(size_t derivation, double startTime, double endTime) const
     {
         double length = 0.0;
         const ordered_view& ordv = dataMap.get<TagOrdered>();
@@ -514,12 +526,12 @@ namespace armarx
         return length;
     }
 
-    double Trajectory::getSpaceLength(size_t dimension, size_t derivation) const
+    double Trajectory::getLength(size_t dimension, size_t derivation) const
     {
-        return getSpaceLength(dimension, derivation, begin()->getTimestamp(), rbegin()->getTimestamp());
+        return getLength(dimension, derivation, begin()->getTimestamp(), rbegin()->getTimestamp());
     }
 
-    double Trajectory::getSpaceLength(size_t dimension, size_t derivation, double startTime, double endTime) const
+    double Trajectory::getLength(size_t dimension, size_t derivation, double startTime, double endTime) const
     {
         double length = 0.0;
         const ordered_view& ordv = dataMap.get<TagOrdered>();
@@ -543,12 +555,12 @@ namespace armarx
         return length;
     }
 
-    double Trajectory::getSquaredSpaceLength(size_t dimension, size_t derivation) const
+    double Trajectory::getSquaredLength(size_t dimension, size_t derivation) const
     {
-        return getSquaredSpaceLength(dimension, derivation, begin()->getTimestamp(), rbegin()->getTimestamp());
+        return getSquaredLength(dimension, derivation, begin()->getTimestamp(), rbegin()->getTimestamp());
     }
 
-    double Trajectory::getSquaredSpaceLength(size_t dimension, size_t derivation, double startTime, double endTime) const
+    double Trajectory::getSquaredLength(size_t dimension, size_t derivation, double startTime, double endTime) const
     {
         double length = 0.0;
         const ordered_view& ordv = dataMap.get<TagOrdered>();
@@ -605,7 +617,7 @@ namespace armarx
         return bestValue;
     }
 
-    double Trajectory::getTrajectorySpace(size_t dimension, size_t derivation, double startTime, double endTime) const
+    double Trajectory::getAmplitude(size_t dimension, size_t derivation, double startTime, double endTime) const
     {
         return getMax(dimension, derivation, startTime, endTime) - getMin(dimension, derivation, startTime, endTime);
     }
@@ -645,7 +657,7 @@ namespace armarx
         return result;
     }
 
-    Ice::DoubleSeq Trajectory::getMinimaPositions(size_t dimension, size_t derivation, double startTime, double endTime) const
+    Ice::DoubleSeq Trajectory::getMinimaTimestamps(size_t dimension, size_t derivation, double startTime, double endTime) const
     {
         Ice::DoubleSeq result;
         const ordered_view& ordv = dataMap.get<TagOrdered>();
@@ -714,7 +726,7 @@ namespace armarx
         return result;
     }
 
-    Ice::DoubleSeq Trajectory::getMaximaPositions(size_t dimension, size_t derivation, double startTime, double endTime) const
+    Ice::DoubleSeq Trajectory::getMaximaTimestamps(size_t dimension, size_t derivation, double startTime, double endTime) const
     {
         Ice::DoubleSeq result;
         const ordered_view& ordv = dataMap.get<TagOrdered>();
@@ -806,7 +818,7 @@ namespace armarx
             }
         }
 
-        TrajData entry(*this);
+        TrajData entry(this);
         entry.timestamp = t;
         entry.data.resize(dim());
         dataMap.insert(entry);
@@ -957,7 +969,7 @@ namespace armarx
         if (itMap == dataMap.end() || dim() == 0)
         {
             //            double dura = getTimeLength();
-            TrajData newData(*this);
+            TrajData newData(this);
             newData.timestamp = t;
             newData.data =  std::vector<DoubleSeqPtr>(std::max((size_t)1, dim()));
             newData.data[dimIndex] = DoubleSeqPtr(new Ice::DoubleSeq(y));
@@ -985,7 +997,7 @@ namespace armarx
 
         if (itMap == dataMap.end() || dim() == 0)
         {
-            TrajData newData(*this);
+            TrajData newData(this);
             newData.timestamp = t;
             newData.data =  std::vector<DoubleSeqPtr>(std::max((size_t)1, dim()));
             newData.data[dimIndex] = DoubleSeqPtr(new Ice::DoubleSeq(1, y));
@@ -1572,7 +1584,7 @@ namespace armarx
 
 
 
-    Ice::DoubleSeq Trajectory::normalizeTimestamps(const Ice::DoubleSeq& timestamps, const double startTime, const double endTime)
+    Ice::DoubleSeq Trajectory::NormalizeTimestamps(const Ice::DoubleSeq& timestamps, const double startTime, const double endTime)
     {
         Ice::DoubleSeq normTimestamps;
         normTimestamps.resize(timestamps.size());
@@ -1589,7 +1601,7 @@ namespace armarx
     }
 
 
-    Trajectory Trajectory::normalizeTimestamps(const Trajectory& traj, const double startTime, const double endTime)
+    Trajectory Trajectory::NormalizeTimestamps(const Trajectory& traj, const double startTime, const double endTime)
     {
 
         if (traj.size() <= 1 || (traj.begin()->timestamp == startTime && traj.rbegin()->timestamp == endTime))
@@ -1601,7 +1613,7 @@ namespace armarx
         Ice::DoubleSeq timestamps = traj.getTimestamps();
 
 
-        Ice::DoubleSeq normTimestamps = normalizeTimestamps(timestamps, startTime, endTime);
+        Ice::DoubleSeq normTimestamps = NormalizeTimestamps(timestamps, startTime, endTime);
         Trajectory normExampleTraj;
 
         for (size_t dim = 0; dim < traj.dim(); dim++)
@@ -1742,10 +1754,9 @@ namespace armarx
         setEntries(t, dimension, derivs);
     }
 
-    Trajectory::TrajData::TrajData(Trajectory& traj) :
-        trajectory(traj)
+    Trajectory::TrajData::TrajData(Trajectory* traj)
     {
-
+        trajectory = traj;
     }
 
     void Trajectory::shiftTime(double shift)
diff --git a/source/RobotAPI/libraries/core/Trajectory.h b/source/RobotAPI/libraries/core/Trajectory.h
index 3245c52b482c76afdd15e62d02dfaf628c96257e..0255e219a6ffed139ba821d4312e4db2e128e07a 100644
--- a/source/RobotAPI/libraries/core/Trajectory.h
+++ b/source/RobotAPI/libraries/core/Trajectory.h
@@ -52,6 +52,7 @@ namespace armarx
         const VariantTypeId Trajectory = Variant::addTypeName("::armarx::TrajectoryBase");
     }
 
+
     typedef boost::shared_ptr<Ice::DoubleSeq> DoubleSeqPtr;
 
     class Trajectory;
@@ -82,6 +83,8 @@ namespace armarx
      */
     class Trajectory : public TrajectoryBase
     {
+    protected:
+        ~Trajectory();
     public:
         // Object interface
         void ice_preMarshal();
@@ -105,11 +108,24 @@ namespace armarx
 
         struct TrajData
         {
-            TrajData(Trajectory& traj);
-            DoubleSeqPtr operator[](size_t dim)
+            TrajData(){}
+            TrajData(Trajectory *traj);
+            inline DoubleSeqPtr operator[](size_t dim)
             {
                 return data.at(dim);
             }
+            inline TrajData& operator=(const TrajData& s)
+            {
+                timestamp = s.timestamp;
+                data.resize(s.data.size());
+                int i = 0;
+                for(auto& elem : s.data)
+                {
+                    data[i++] = elem;
+                }
+                trajectory = nullptr;
+                return *this;
+            }
             inline double getTimestamp() const
             {
                 return timestamp;
@@ -120,16 +136,30 @@ namespace armarx
             }
             inline double getDeriv(size_t dim, size_t derivation) const
             {
-                return trajectory.getState(timestamp, dim, derivation);
+                if(!trajectory)
+                    throw LocalException("Ptr to trajectory is NULL");
+                return trajectory->getState(timestamp, dim, derivation);
             }
             inline const std::vector< DoubleSeqPtr >& getData() const
             {
                 return data;
             }
 
+            friend std::ostream& operator<<(std::ostream& stream, const TrajData& rhs)
+            {
+                stream << rhs.timestamp << ": ";
+                for (size_t d = 0; d < rhs.data.size(); ++d) {
+                    stream << (rhs.data[d]->size() > 0 ? std::to_string(rhs.data[d]->at(0)) : std::string("-"));
+                    if(d <= rhs.data.size()-1)
+                        stream << ", ";
+                }
+                return stream;
+            }
+
             double timestamp;
             mutable std::vector< DoubleSeqPtr > data; // mutable so that it can be changed
-            Trajectory& trajectory;
+        protected:
+            Trajectory* trajectory = nullptr;
             friend class Trajectory;
 
         };
@@ -252,20 +282,32 @@ namespace armarx
         size_t dim() const;
         size_t size() const;
         double getTimeLength() const;
-        double getSpaceLength(size_t derivation = 0) const;
-        double getSpaceLength(size_t derivation, double startTime, double endTime) const;
-        double getSpaceLength(size_t dimension, size_t derivation) const;
-        double getSpaceLength(size_t dimension, size_t derivation, double startTime, double endTime) const;
-        double getSquaredSpaceLength(size_t dimension, size_t derivation) const;
-        double getSquaredSpaceLength(size_t dimension, size_t derivation, double startTime, double endTime) const;
+        /**
+         * @brief Returns the sum of a all subsequent distances of the entries in the trajectories over all dimensions
+         * @param derivation Derivation for which the length is calculated
+         */
+        double getLength(size_t derivation = 0) const;
+        double getLength(size_t derivation, double startTime, double endTime) const;
+        double getLength(size_t dimension, size_t derivation) const;
+        double getLength(size_t dimension, size_t derivation, double startTime, double endTime) const;
+        double getSquaredLength(size_t dimension, size_t derivation) const;
+        double getSquaredLength(size_t dimension, size_t derivation, double startTime, double endTime) const;
         double getMax(size_t dimension, size_t derivation, double startTime, double endTime) const;
         double getMin(size_t dimension, size_t derivation, double startTime, double endTime) const;
         double getWithFunc(const double & (*foo)(const double&, const double&), double initValue, size_t dimension, size_t derivation, double startTime, double endTime) const;
-        double getTrajectorySpace(size_t dimension, size_t derivation, double startTime, double endTime) const;
+        double getAmplitude(size_t dimension, size_t derivation, double startTime, double endTime) const;
+        /**
+         * @brief Calculate *all* minima.
+         * @param dimension
+         * @param derivation
+         * @param startTime
+         * @param endTime
+         * @return
+         */
         Ice::DoubleSeq getMinima(size_t dimension, size_t derivation, double startTime, double endTime) const;
         Ice::DoubleSeq getMaxima(size_t dimension, size_t derivation, double startTime, double endTime) const;
-        Ice::DoubleSeq getMinimaPositions(size_t dimension, size_t derivation, double startTime, double endTime) const;
-        Ice::DoubleSeq getMaximaPositions(size_t dimension, size_t derivation, double startTime, double endTime) const;
+        Ice::DoubleSeq getMinimaTimestamps(size_t dimension, size_t derivation, double startTime, double endTime) const;
+        Ice::DoubleSeq getMaximaTimestamps(size_t dimension, size_t derivation, double startTime, double endTime) const;
 
         // calculations
 
@@ -290,8 +332,8 @@ namespace armarx
          */
         void gaussianFilter(double filterRadius);
 
-        static Trajectory normalizeTimestamps(const Trajectory& traj, const double startTime = 0.0,  const double endTime = 1.0);
-        static Ice::DoubleSeq normalizeTimestamps(const Ice::DoubleSeq& timestamps, const double startTime = 0.0,  const double endTime = 1.0);
+        static Trajectory NormalizeTimestamps(const Trajectory& traj, const double startTime = 0.0,  const double endTime = 1.0);
+        static Ice::DoubleSeq NormalizeTimestamps(const Ice::DoubleSeq& timestamps, const double startTime = 0.0,  const double endTime = 1.0);
         static Ice::DoubleSeq GenerateTimestamps(double startTime = 0.0, double endTime = 1.0, double stepSize = 0.001);
         void shiftTime(double shift);
         void shiftValue(const Ice::DoubleSeq& shift);
diff --git a/source/RobotAPI/libraries/core/test/TrajectoryTest.cpp b/source/RobotAPI/libraries/core/test/TrajectoryTest.cpp
index 54ac0bc4c7f52f97be6649ae7de20b758f8901c2..e81204ba7797f21e1a207da83ae0514bcbdb63c1 100644
--- a/source/RobotAPI/libraries/core/test/TrajectoryTest.cpp
+++ b/source/RobotAPI/libraries/core/test/TrajectoryTest.cpp
@@ -33,16 +33,16 @@ using namespace armarx;
 //{
 //    // Load the trajectory
 //    Trajectory traj;
-//    //    traj.readFromCSVFile("pouring_x_short.csv");
-//    //    traj.readFromCSVFile("sampletraj_withvel_shortened.csv.txt");
-//    traj.readFromCSVFile(std::string(DATA_DIR) + "/ExampleTrajectories/pouring_x_short.csv");
-//    BOOST_CHECK(traj.begin()->getPosition(0) == 445.35);
+//    //    traj->readFromCSVFile("pouring_x_short.csv");
+//    //    traj->readFromCSVFile("sampletraj_withvel_shortened.csv.txt");
+//    traj->readFromCSVFile(std::string(DATA_DIR) + "/ExampleTrajectories/pouring_x_short.csv");
+//    BOOST_CHECK(traj->begin()->getPosition(0) == 445.35);
 //    traj = Trajectory::normalizeTimestamps(traj, 0, 1);
-//    Ice::DoubleSeq timestamps = traj.getTimestamps();
-//    traj.differentiateDiscretly(2);
-//    Ice::DoubleSeq d0 = traj.getDimensionData(0, 0);
-//    Ice::DoubleSeq d1 = traj.getDimensionData(0, 1);
-//    BOOST_CHECK(traj.begin()->getDeriv(0, 1) == d1.at(0));
+//    Ice::DoubleSeq timestamps = traj->getTimestamps();
+//    traj->differentiateDiscretly(2);
+//    Ice::DoubleSeq d0 = traj->getDimensionData(0, 0);
+//    Ice::DoubleSeq d1 = traj->getDimensionData(0, 1);
+//    BOOST_CHECK(traj->begin()->getDeriv(0, 1) == d1.at(0));
 //    std::cout << "end" << std::endl;
 //}
 
@@ -52,16 +52,16 @@ using namespace armarx;
 //{
 //    // Load the trajectory
 //    Trajectory traj;
-//    //    traj.readFromCSVFile("pouring_x_short.csv");
-//    //    traj.readFromCSVFile("sampletraj_withvel_shortened.csv.txt");
-//    traj.readFromCSVFile(std::string(DATA_DIR) + "/ExampleTrajectories/pouring_x_short.csv");
+//    //    traj->readFromCSVFile("pouring_x_short.csv");
+//    //    traj->readFromCSVFile("sampletraj_withvel_shortened.csv.txt");
+//    traj->readFromCSVFile(std::string(DATA_DIR) + "/ExampleTrajectories/pouring_x_short.csv");
 
 //    //    traj = Trajectory::normalizeTimestamps(traj,0,1);
-//    Ice::DoubleSeq timestamps = traj.getTimestamps();
-//    traj.differentiateDiscretly(2);
-//    double first = traj.begin()->getPosition(0);
-//    double derivFirst = traj.begin()->getDeriv(0, 1);
-//    double before = traj.getState(timestamps.at(0) - 5, 0, 0);
+//    Ice::DoubleSeq timestamps = traj->getTimestamps();
+//    traj->differentiateDiscretly(2);
+//    double first = traj->begin()->getPosition(0);
+//    double derivFirst = traj->begin()->getDeriv(0, 1);
+//    double before = traj->getState(timestamps.at(0) - 5, 0, 0);
 //    BOOST_CHECK(before < SIGN_FACTOR(derivFirst) * first);
 //    std::cout << "end" << std::endl;
 //}
@@ -70,14 +70,14 @@ using namespace armarx;
 //{
 //    // Load the trajectory
 //    Trajectory traj;
-//    //    traj.readFromCSVFile("pouring_x_short.csv");
-//    //    traj.readFromCSVFile("sampletraj_withvel_shortened.csv.txt");
-//    traj.readFromCSVFile(std::string(DATA_DIR) + "/ExampleTrajectories/pouring_x_short.csv");
-//    Ice::DoubleSeq timestamps = traj.getTimestamps();
+//    //    traj->readFromCSVFile("pouring_x_short.csv");
+//    //    traj->readFromCSVFile("sampletraj_withvel_shortened.csv.txt");
+//    traj->readFromCSVFile(std::string(DATA_DIR) + "/ExampleTrajectories/pouring_x_short.csv");
+//    Ice::DoubleSeq timestamps = traj->getTimestamps();
 //    double middle = (timestamps.at(1) + timestamps.at(0)) * 0.5;
-//    double before = traj.getState(timestamps.at(0));
-//    double after = traj.getState(timestamps.at(1));
-//    double interpolation = traj.getState(middle);
+//    double before = traj->getState(timestamps.at(0));
+//    double after = traj->getState(timestamps.at(1));
+//    double interpolation = traj->getState(middle);
 //    BOOST_CHECK(before < interpolation && after > interpolation);
 //    std::cout << "end" << std::endl;
 //}
@@ -86,21 +86,21 @@ using namespace armarx;
 //{
 //    // Load the trajectory
 //    Trajectory traj;
-//    //    traj.readFromCSVFile("pouring_x_short.csv");
-//    //    traj.readFromCSVFile("sampletraj_withvel_shortened.csv.txt");
-//    traj.readFromCSVFile(std::string(DATA_DIR) + "/ExampleTrajectories/pouring_x_short.csv");
-//    traj.differentiateDiscretly(1);
-//    traj.differentiateDiscretly(2);
+//    //    traj->readFromCSVFile("pouring_x_short.csv");
+//    //    traj->readFromCSVFile("sampletraj_withvel_shortened.csv.txt");
+//    traj->readFromCSVFile(std::string(DATA_DIR) + "/ExampleTrajectories/pouring_x_short.csv");
+//    traj->differentiateDiscretly(1);
+//    traj->differentiateDiscretly(2);
 //    Trajectory traj2;
-//    traj2.readFromCSVFile(std::string(DATA_DIR) + "/ExampleTrajectories/pouring_x_short.csv");
-//    traj2.differentiateDiscretly(2);
-
-//    BOOST_CHECK_EQUAL(traj.begin()->getDeriv(0, 2), traj2.begin()->getDeriv(0, 2));
-//    BOOST_CHECK_EQUAL(traj.rbegin()->getDeriv(0, 2), traj2.rbegin()->getDeriv(0, 2));
-//    BOOST_CHECK_EQUAL(traj.rbegin()->getDeriv(0, 1), traj2.rbegin()->getDeriv(0, 1));
-//    double middleTimestamp = traj.getTimestamps().at(0) + traj.getTimeLength() / 2;
-//    BOOST_CHECK_EQUAL(traj.getState(middleTimestamp, 0, 2), traj2.getState(middleTimestamp, 0, 2));
-//    BOOST_CHECK_EQUAL(traj.getState(middleTimestamp, 0, 1), traj2.getState(middleTimestamp, 0, 1));
+//    traj2->readFromCSVFile(std::string(DATA_DIR) + "/ExampleTrajectories/pouring_x_short.csv");
+//    traj2->differentiateDiscretly(2);
+
+//    BOOST_CHECK_EQUAL(traj->begin()->getDeriv(0, 2), traj2->begin()->getDeriv(0, 2));
+//    BOOST_CHECK_EQUAL(traj->rbegin()->getDeriv(0, 2), traj2->rbegin()->getDeriv(0, 2));
+//    BOOST_CHECK_EQUAL(traj->rbegin()->getDeriv(0, 1), traj2->rbegin()->getDeriv(0, 1));
+//    double middleTimestamp = traj->getTimestamps().at(0) + traj->getTimeLength() / 2;
+//    BOOST_CHECK_EQUAL(traj->getState(middleTimestamp, 0, 2), traj2->getState(middleTimestamp, 0, 2));
+//    BOOST_CHECK_EQUAL(traj->getState(middleTimestamp, 0, 1), traj2->getState(middleTimestamp, 0, 1));
 //    std::cout << "end" << std::endl;
 //}
 
@@ -110,78 +110,78 @@ using namespace armarx;
 //{
 //    // Load the trajectory
 //    Trajectory traj;
-//    //    traj.readFromCSVFile("pouring_x_short.csv");
-//    //    traj.readFromCSVFile("sampletraj_withvel_shortened.csv.txt");
-//    traj.readFromCSVFile(std::string(DATA_DIR) + "/ExampleTrajectories/pouring_x_short.csv");
-//    double d2 = traj.begin()->getDeriv(0, 2);
+//    //    traj->readFromCSVFile("pouring_x_short.csv");
+//    //    traj->readFromCSVFile("sampletraj_withvel_shortened.csv.txt");
+//    traj->readFromCSVFile(std::string(DATA_DIR) + "/ExampleTrajectories/pouring_x_short.csv");
+//    double d2 = traj->begin()->getDeriv(0, 2);
 //    BOOST_CHECK(d2 != 0);
 //    std::cout << "end" << std::endl;
 //}
 
 BOOST_AUTO_TEST_CASE(testInplaceDerivation2)
 {
-    // Load the trajectory
+
     Ice::DoubleSeq timestamps { 0, 1, 2 };
     Ice::DoubleSeq positions { 1, 2, 5 };
 
-    Trajectory traj(timestamps, positions);
-    Trajectory traj2(timestamps, positions);
-    traj.differentiateDiscretly(1);
-    BOOST_CHECK_EQUAL(traj.getState(-1, 0, 1), traj2.getState(-1, 0, 1));
+    TrajectoryPtr traj = new Trajectory(timestamps, positions);
+    TrajectoryPtr traj2 = new Trajectory(timestamps, positions);
+    traj->differentiateDiscretly(1);
+    BOOST_CHECK_EQUAL(traj->getState(-1, 0, 1), traj2->getState(-1, 0, 1));
 }
 
 BOOST_AUTO_TEST_CASE(testInplaceDerivation3)
 {
-    // Load the trajectory
+
     Ice::DoubleSeq timestamps { 0, 1, 2 };
     Ice::DoubleSeq positions { 1, 2, 5 };
 
-    Trajectory traj(timestamps, positions);
-    Trajectory traj2(timestamps, positions);
-    traj.differentiateDiscretly(2);
-    BOOST_CHECK_EQUAL(traj.getState(-1, 0, 2), traj2.getState(-1, 0, 2));
+    TrajectoryPtr traj = new Trajectory(timestamps, positions);
+    TrajectoryPtr traj2 = new Trajectory(timestamps, positions);
+    traj->differentiateDiscretly(2);
+    BOOST_CHECK_EQUAL(traj->getState(-1, 0, 2), traj2->getState(-1, 0, 2));
 }
 
 BOOST_AUTO_TEST_CASE(testDerivationRemoval)
 {
-    // Load the trajectory
+
     Ice::DoubleSeq timestamps { 0, 1, 2 };
     Ice::DoubleSeq positions { 1, 2, 5 };
 
-    Trajectory traj(timestamps, positions);
-    //    Trajectory traj2(timestamps, positions);
-    traj.differentiateDiscretly(2);
-    BOOST_CHECK_EQUAL(traj.begin()->getData().at(0)->size(), 3);
-    traj.removeDerivation(1);
-    BOOST_CHECK_EQUAL(traj.begin()->getData().at(0)->size(), 1);
+    TrajectoryPtr traj = new Trajectory(timestamps, positions);
+    //    TrajectoryPtr traj2 = new Trajectory(timestamps, positions);
+    traj->differentiateDiscretly(2);
+    BOOST_CHECK_EQUAL(traj->begin()->getData().at(0)->size(), 3);
+    traj->removeDerivation(1);
+    BOOST_CHECK_EQUAL(traj->begin()->getData().at(0)->size(), 1);
 }
 
 
 
 BOOST_AUTO_TEST_CASE(TrajectoryMarshalTest)
 {
-    // Load the trajectory
+
     Ice::DoubleSeq timestamps { 0, 1, 2 };
     Ice::DoubleSeq positions { 1, 2, 5 };
 
-    Trajectory traj(timestamps, positions);
-    traj.ice_preMarshal();
-    TrajectoryPtr traj2 = TrajectoryPtr::dynamicCast(traj.clone());
+    TrajectoryPtr traj = new Trajectory(timestamps, positions);
+    traj->ice_preMarshal();
+    TrajectoryPtr traj2 = TrajectoryPtr::dynamicCast(traj->clone());
     traj2->clear();
     traj2->ice_postUnmarshal();
-    BOOST_CHECK_EQUAL(traj.getState(0), traj2->getState(0));
+    BOOST_CHECK_EQUAL(traj->getState(0), traj2->getState(0));
 }
 
 BOOST_AUTO_TEST_CASE(TrajectoryPerformanceTest)
 {
-    // Load the trajectory
+
     Ice::DoubleSeq timestamps;
     int count = 1000;
     for (int i = 0; i < count; ++i)
     {
         timestamps.push_back(rand());
     }
-    Trajectory traj;
+    TrajectoryPtr traj(new Trajectory());
     for (int var = 0; var < 8; ++var)
     {
         Ice::DoubleSeq p;
@@ -190,49 +190,63 @@ BOOST_AUTO_TEST_CASE(TrajectoryPerformanceTest)
         {
             p.push_back(rand());
         }
-        traj.addDimension(timestamps, p);
+        traj->addDimension(timestamps, p);
     }
     ARMARX_INFO_S << "Starting";
-    traj.ice_preMarshal();
+    traj->ice_preMarshal();
     ARMARX_INFO_S << "Marshalled";
-    TrajectoryPtr traj2 = TrajectoryPtr::dynamicCast(traj.clone());
+    TrajectoryPtr traj2 = TrajectoryPtr::dynamicCast(traj->clone());
     ARMARX_INFO_S << "Cloned";
 
     traj2->clear();
     ARMARX_INFO_S << "Cleared";
     traj2->ice_postUnmarshal();
     ARMARX_INFO_S << "Unmarshalled";
-    traj.getSpaceLength();
+    traj->getLength();
     ARMARX_INFO_S << "Length calculated";
-    BOOST_CHECK_EQUAL(traj.getState(0), traj2->getState(0));
-    JSONObjectPtr json = new JSONObject();
-    traj.serialize(json);
-    ARMARX_INFO_S << json->asString(true);
+    BOOST_CHECK_EQUAL(traj->getState(0), traj2->getState(0));
 }
 
 
 BOOST_AUTO_TEST_CASE(TrajectorySerializationTest)
 {
-    // Load the trajectory
+
     FloatSeqSeq positions {{ 1, 2, 5 }, { 10, 2332, 53425 }};
     JSONObjectPtr json = new JSONObject();
-    Trajectory traj(positions, {}, {"joint1", "joint2"});
-    traj.serialize(json);
+    TrajectoryPtr traj =  new Trajectory(positions, {}, {"joint1", "joint2"});
+    traj->serialize(json);
     ARMARX_INFO_S << json->asString(true);
-    Trajectory traj2;
-    traj2.deserialize(json);
-    BOOST_CHECK_CLOSE(traj.getState(0), traj2.getState(0), 0.01);
-    BOOST_CHECK_CLOSE(traj.getState(0.4, 1), traj2.getState(0.4, 1), 0.01);
-    BOOST_CHECK_EQUAL(traj.getDimensionName(0), traj2.getDimensionName(0));
+    TrajectoryPtr traj2 =  new Trajectory();
+    traj2->deserialize(json);
+    BOOST_CHECK_CLOSE(traj->getState(0), traj2->getState(0), 0.01);
+    BOOST_CHECK_CLOSE(traj->getState(0.4, 1), traj2->getState(0.4, 1), 0.01);
+    BOOST_CHECK_EQUAL(traj->getDimensionName(0), traj2->getDimensionName(0));
 }
 
 BOOST_AUTO_TEST_CASE(TrajectoryLengthTest)
 {
-    // Load the trajectory
+
     FloatSeqSeq positions {{ 0, 0, 1 }, { 0, 1, 1 }};
-    Trajectory traj(positions, {}, {"joint1", "joint2"});
+    TrajectoryPtr traj = new Trajectory(positions, {}, {"joint1", "joint2"});
+
+    BOOST_CHECK_EQUAL(traj->getLength(), (Eigen::Vector3f(positions[0].data())- Eigen::Vector3f(positions[1].data())).norm());
+}
 
-    BOOST_CHECK_EQUAL(traj.getSpaceLength(), (Eigen::Vector3f(positions[0].data())- Eigen::Vector3f(positions[1].data())).norm());
+BOOST_AUTO_TEST_CASE(TrajectoryCopyIfTest)
+{
+
+    FloatSeqSeq positions {{ 0, 0, 1 }, { 0, 1, 1 }};
+    TrajectoryPtr traj = new Trajectory(positions, {}, {"joint1", "joint2"});
+    std::vector<Trajectory::TrajData> selection(traj->size());
+    // select all elements with velocity > 0
+    auto it = std::copy_if(traj->begin(), traj->end(), selection.begin(),
+                 [](const Trajectory::TrajData& elem)
+    {
+       return fabs(elem.getDeriv(0,1)) > 0;
+    });
+    selection.resize(std::distance(selection.begin(),it));
+    ARMARX_INFO_S << VAROUT(*traj);
+    ARMARX_INFO_S << VAROUT(selection);
 }