diff --git a/include/curves/curve_constraint.h b/include/curves/curve_constraint.h
index d43323faf4630ea5c1fa089212d7c98cd57c1dbd..f218f6f37c6dce9a4f19efebd95340c2b8822dde 100644
--- a/include/curves/curve_constraint.h
+++ b/include/curves/curve_constraint.h
@@ -19,12 +19,11 @@
 
 namespace curves
 {
-  template <typename Point, std::size_t Dim=3>
+  template <typename Point>
   struct curve_constraints
   {
     typedef Point   point_t;
-    curve_constraints():
-    init_vel(point_t::Zero(Dim)),init_acc(init_vel),end_vel(init_vel),end_acc(init_vel){}
+    curve_constraints(){}
 
     ~curve_constraints(){}
 
diff --git a/include/curves/exact_cubic.h b/include/curves/exact_cubic.h
index 172f2b7f04459560b5e9c8abc2babbde71055455..fa76cd4bdde4a5faae0b8196832c4bf9ead12ddc 100644
--- a/include/curves/exact_cubic.h
+++ b/include/curves/exact_cubic.h
@@ -37,7 +37,7 @@ namespace curves
   /// \brief Represents a set of cubic splines defining a continuous function 
   /// crossing each of the waypoint given in its initialization.
   ///
-  template<typename Time= double, typename Numeric=Time, std::size_t Dim=3, bool Safe=false,
+  template<typename Time= double, typename Numeric=Time, bool Safe=false,
            typename Point= Eigen::Matrix<Numeric, Eigen::Dynamic, 1>, 
            typename T_Point =std::vector<Point,Eigen::aligned_allocator<Point> >,
            typename SplineBase=polynomial<Time, Numeric, Safe, Point, T_Point> >
@@ -53,9 +53,9 @@ namespace curves
     typedef typename std::vector<spline_t> t_spline_t;
     typedef typename t_spline_t::iterator it_spline_t;
     typedef typename t_spline_t::const_iterator cit_spline_t;
-    typedef curve_constraints<Point, Dim> spline_constraints;
+    typedef curve_constraints<Point> spline_constraints;
 
-    typedef exact_cubic<Time, Numeric, Dim, Safe, Point, T_Point, SplineBase> exact_cubic_t;
+    typedef exact_cubic<Time, Numeric, Safe, Point, T_Point, SplineBase> exact_cubic_t;
     typedef piecewise_curve<Time, Numeric, Safe, Point, T_Point, SplineBase> piecewise_curve_t;
 
     /* Constructors - destructors */
@@ -119,7 +119,8 @@ namespace curves
       template<typename In>
       t_spline_t computeWayPoints(In wayPointsBegin, In wayPointsEnd) const
       {
-        std::size_t const size(std::distance(wayPointsBegin, wayPointsEnd));
+        const std::size_t dim = wayPointsBegin->second.size();
+        const std::size_t size = std::distance(wayPointsBegin, wayPointsEnd);
         if(Safe && size < 1)
         {
           throw std::length_error("size of waypoints must be superior to 0") ; // TODO
@@ -132,11 +133,11 @@ namespace curves
         MatrixX h4 = MatrixX::Zero(size, size);
         MatrixX h5 = MatrixX::Zero(size, size);
         MatrixX h6 = MatrixX::Zero(size, size);
-        MatrixX a =  MatrixX::Zero(size, Dim);
-        MatrixX b =  MatrixX::Zero(size, Dim);
-        MatrixX c =  MatrixX::Zero(size, Dim);
-        MatrixX d =  MatrixX::Zero(size, Dim);
-        MatrixX x =  MatrixX::Zero(size, Dim);
+        MatrixX a =  MatrixX::Zero(size, dim);
+        MatrixX b =  MatrixX::Zero(size, dim);
+        MatrixX c =  MatrixX::Zero(size, dim);
+        MatrixX d =  MatrixX::Zero(size, dim);
+        MatrixX x =  MatrixX::Zero(size, dim);
         In it(wayPointsBegin), next(wayPointsBegin);
         ++next;
         // Fill the matrices H as specified in the paper.
@@ -226,9 +227,10 @@ namespace curves
       template<typename In>
       void compute_end_spline(In wayPointsBegin, In wayPointsNext, spline_constraints& constraints, t_spline_t& subSplines) const
       {
+        const std::size_t dim = wayPointsBegin->second.size();
         const point_t& a0 = wayPointsBegin->second, a1 = wayPointsNext->second;
         const point_t& b0 = constraints.init_vel, b1 = constraints.end_vel,
-        c0 = constraints.init_acc / 2., c1 = constraints.end_acc;
+                       c0 = constraints.init_acc / 2., c1 = constraints.end_acc;
         const num_t& init_t = wayPointsBegin->first, end_t = wayPointsNext->first;
         const num_t dt = end_t - init_t, dt_2 = dt * dt, dt_3 = dt_2 * dt, dt_4 = dt_3 * dt, dt_5 = dt_4 * dt;
         //solving a system of four linear eq with 4 unknows: d0, e0
@@ -239,7 +241,7 @@ namespace curves
         const num_t x_e_0 = dt_4, x_e_1 = 4*dt_3, x_e_2 = 12*dt_2;
         const num_t x_f_0 = dt_5, x_f_1 = 5*dt_4, x_f_2 = 20*dt_3;
         point_t d, e, f;
-        MatrixX rhs = MatrixX::Zero(3,Dim);
+        MatrixX rhs = MatrixX::Zero(3,dim);
         rhs.row(0) = alpha_0; rhs.row(1) = alpha_1; rhs.row(2) = alpha_2;
         Matrix3 eq  = Matrix3::Zero(3,3);
         eq(0,0) = x_d_0; eq(0,1) = x_e_0; eq(0,2) = x_f_0;
diff --git a/include/curves/helpers/effector_spline.h b/include/curves/helpers/effector_spline.h
index 7cf61b2fdbb876bd519ea88a4d2b9a830fed9ae7..bc6bb44231b76750d90f5655709ecdaef56296e0 100644
--- a/include/curves/helpers/effector_spline.h
+++ b/include/curves/helpers/effector_spline.h
@@ -28,11 +28,11 @@ namespace curves
   {
     typedef double Numeric;
     typedef double Time;
-    typedef Eigen::Matrix<Numeric, 3, 1> Point;
+    typedef Eigen::Matrix<Numeric, Eigen::Dynamic, 1> Point;
     typedef std::vector<Point,Eigen::aligned_allocator<Point> > T_Point;
     typedef std::pair<double, Point> Waypoint;
     typedef std::vector<Waypoint> T_Waypoint;
-    typedef exact_cubic<Time, Numeric, 3, true, Point, T_Point> exact_cubic_t;
+    typedef exact_cubic<Time, Numeric, true, Point, T_Point> exact_cubic_t;
     typedef exact_cubic_t::spline_constraints spline_constraints_t;
     typedef exact_cubic_t::t_spline_t t_spline_t;
     typedef exact_cubic_t::spline_t spline_t;
@@ -68,6 +68,8 @@ namespace curves
     spline_constraints_t compute_required_offset_velocity_acceleration(const spline_t& end_spline, const Time /*time_offset*/)
     {
       spline_constraints_t constraints;
+      constraints.init_acc = Point::Zero(end_spline.dim());
+      constraints.init_vel = Point::Zero(end_spline.dim());
       constraints.end_acc = end_spline.derivate(end_spline.min(),2);
       constraints.end_vel = end_spline.derivate(end_spline.min(),1);
       return constraints;
diff --git a/include/curves/helpers/effector_spline_rotation.h b/include/curves/helpers/effector_spline_rotation.h
index a733c4b610b8d8a9ee01ed78080fb5082fa75d78..1e34c79b4fe7d49e9991acfabc59132089a289ea 100644
--- a/include/curves/helpers/effector_spline_rotation.h
+++ b/include/curves/helpers/effector_spline_rotation.h
@@ -36,7 +36,7 @@ namespace curves
     typedef std::pair<Numeric, quat_t > waypoint_quat_t;
     typedef std::vector<waypoint_quat_t> t_waypoint_quat_t;
     typedef Eigen::Matrix<Numeric, 1, 1> point_one_dim_t;
-    typedef exact_cubic <Numeric, Numeric, 1, false, point_one_dim_t> exact_cubic_constraint_one_dim;
+    typedef exact_cubic <Numeric, Numeric, false, point_one_dim_t> exact_cubic_constraint_one_dim;
     typedef std::pair<Numeric, point_one_dim_t > waypoint_one_dim_t;
     typedef std::vector<waypoint_one_dim_t> t_waypoint_one_dim_t;
 
@@ -102,7 +102,7 @@ namespace curves
     }; // End class rotation_spline
 
 
-    typedef exact_cubic<Time, Numeric, 4, false, quat_t, std::vector<quat_t,Eigen::aligned_allocator<quat_t> >, rotation_spline> exact_cubic_quat_t;
+    typedef exact_cubic<Time, Numeric, false, quat_t, std::vector<quat_t,Eigen::aligned_allocator<quat_t> >, rotation_spline> exact_cubic_quat_t;
 
     /// \class effector_spline_rotation.
     /// \brief Represents a trajectory for and end effector.
diff --git a/python/curves_python.cpp b/python/curves_python.cpp
index d078eeb471645658fff288b07042360df29530f1..1e4412143674953e9f77c0800c0a41fa00b6432a 100644
--- a/python/curves_python.cpp
+++ b/python/curves_python.cpp
@@ -23,33 +23,18 @@
 using namespace curves;
 typedef double real;
 typedef Eigen::VectorXd time_waypoints_t;
-// 3D
-typedef Eigen::Vector3d point3_t;
-typedef Eigen::Matrix<double, 3, 1, 0, 3, 1> ret_point3_t;
-typedef std::pair<point3_t, point3_t> pair_point3_tangent_t;
-typedef Eigen::Matrix<real, 3, Eigen::Dynamic> point3_list_t;
-typedef std::vector<point3_t,Eigen::aligned_allocator<point3_t> >  t_point3_t;
-typedef std::vector<pair_point3_tangent_t,Eigen::aligned_allocator<pair_point3_tangent_t> > t_pair_point3_tangent_t;
-typedef curves::curve_constraints<point3_t> curve_constraints3_t;
-// XD
+
 typedef Eigen::VectorXd pointX_t;
 typedef Eigen::Matrix<double, Eigen::Dynamic, 1, 0, Eigen::Dynamic, 1> ret_pointX_t;
 typedef std::pair<pointX_t, pointX_t> pair_pointX_tangent_t;
 typedef Eigen::MatrixXd pointX_list_t;
-typedef std::vector<pointX_t,Eigen::aligned_allocator<point3_t> >  t_pointX_t;
+typedef std::vector<pointX_t,Eigen::aligned_allocator<pointX_t> >  t_pointX_t;
 typedef std::vector<pair_pointX_tangent_t,Eigen::aligned_allocator<pair_pointX_tangent_t> > t_pair_pointX_tangent_t;
 typedef curves::curve_constraints<pointX_t> curve_constraints_t;
-// Else
-typedef std::pair<real, point3_t> Waypoint;
-typedef std::vector<Waypoint> T_Waypoint;
-typedef std::vector<Waypoint6> T_Waypoint6;
-
-// 3D
-typedef curves::exact_cubic  <real, real, 3, true, point3_t, t_point3_t> exact_cubic3_t;
-typedef std::pair<real, point3_t> waypoint3_t;
-typedef std::vector<waypoint3_t, Eigen::aligned_allocator<point3_t> > t_waypoint3_t;
+typedef std::pair<real, pointX_t> waypoint_t;
+typedef std::vector<waypoint_t> t_waypoint_t;
 
-// Dynamic dim
+// Curves
 typedef curves::cubic_hermite_spline <real, real, true, pointX_t> cubic_hermite_spline_t;
 typedef curves::bezier_curve  <real, real, true, pointX_t> bezier_t;
 typedef curves::polynomial  <real, real, true, pointX_t, t_pointX_t> polynomial_t;
@@ -57,12 +42,12 @@ typedef polynomial_t::coeff_t coeff_t;
 typedef curves::piecewise_curve <real, real, true, pointX_t, t_pointX_t, polynomial_t> piecewise_polynomial_curve_t;
 typedef curves::piecewise_curve <real, real, true, pointX_t, t_pointX_t, bezier_t> piecewise_bezier_curve_t;
 typedef curves::piecewise_curve <real, real, true, pointX_t, t_pointX_t, cubic_hermite_spline_t> piecewise_cubic_hermite_curve_t;
+typedef curves::exact_cubic  <real, real, true, pointX_t, t_pointX_t> exact_cubic_t;
 
 typedef curves::Bern<double> bernstein_t;
-/*** TEMPLATE SPECIALIZATION FOR PYTHON ****/
 
+/*** TEMPLATE SPECIALIZATION FOR PYTHON ****/
 EIGENPY_DEFINE_STRUCT_ALLOCATOR_SPECIALIZATION(bernstein_t)
-
 EIGENPY_DEFINE_STRUCT_ALLOCATOR_SPECIALIZATION(cubic_hermite_spline_t)
 EIGENPY_DEFINE_STRUCT_ALLOCATOR_SPECIALIZATION(bezier_t)
 EIGENPY_DEFINE_STRUCT_ALLOCATOR_SPECIALIZATION(polynomial_t)
@@ -70,9 +55,7 @@ EIGENPY_DEFINE_STRUCT_ALLOCATOR_SPECIALIZATION(curve_constraints_t)
 EIGENPY_DEFINE_STRUCT_ALLOCATOR_SPECIALIZATION(piecewise_polynomial_curve_t)
 EIGENPY_DEFINE_STRUCT_ALLOCATOR_SPECIALIZATION(piecewise_bezier_curve_t)
 EIGENPY_DEFINE_STRUCT_ALLOCATOR_SPECIALIZATION(piecewise_cubic_hermite_curve_t)
-
-EIGENPY_DEFINE_STRUCT_ALLOCATOR_SPECIALIZATION(exact_cubic3_t)
-EIGENPY_DEFINE_STRUCT_ALLOCATOR_SPECIALIZATION(curve_constraints3_t)
+EIGENPY_DEFINE_STRUCT_ALLOCATOR_SPECIALIZATION(exact_cubic_t)
 
 namespace curves
 {
@@ -183,9 +166,9 @@ namespace curves
   /* end wrap piecewise polynomial curve */
 
   /* Wrap exact cubic spline */
-  t_waypoint3_t getWayPoints(const coeff_t& array, const time_waypoints_t& time_wp)
+  t_waypoint_t getWayPoints(const coeff_t& array, const time_waypoints_t& time_wp)
   {
-    t_waypoint3_t res;
+    t_waypoint_t res;
     for(int i =0;i<array.cols();++i)
     {
       res.push_back(std::make_pair(time_wp(i), array.col(i)));
@@ -193,96 +176,56 @@ namespace curves
     return res;
   }
 
-  exact_cubic3_t* wrapExactCubic3Constructor(const coeff_t& array, const time_waypoints_t& time_wp)
-  {
-    t_waypoint3_t wps = getWayPoints(array, time_wp);
-    return new exact_cubic3_t(wps.begin(), wps.end());
-  }
-
-  exact_cubic3_t* wrapExactCubic3ConstructorConstraint(const coeff_t& array, const time_waypoints_t& time_wp, 
-                                                     const curve_constraints3_t& constraints)
-  {
-    t_waypoint3_t wps = getWayPoints(array, time_wp);
-    return new exact_cubic3_t(wps.begin(), wps.end(), constraints);
-  }
-
-  /// For constraints 3D
-  point3_t get_init_vel(const curve_constraints3_t& c)
-  {
-    return c.init_vel;
-  }
-
-  point3_t get_init_acc(const curve_constraints3_t& c)
-  {
-    return c.init_acc;
-  }
-
-  point3_t get_end_vel(const curve_constraints3_t& c)
-  {
-    return c.end_vel;
-  }
-
-  point3_t get_end_acc(const curve_constraints3_t& c)
-  {
-    return c.end_acc;
-  }
-
-  void set_init_vel(curve_constraints3_t& c, const point3_t& val)
+  exact_cubic_t* wrapExactCubicConstructor(const coeff_t& array, const time_waypoints_t& time_wp)
   {
-    c.init_vel = val;
-  }
-
-  void set_init_acc(curve_constraints3_t& c, const point3_t& val)
-  {
-    c.init_acc = val;
+    t_waypoint_t wps = getWayPoints(array, time_wp);
+    return new exact_cubic_t(wps.begin(), wps.end());
   }
 
-  void set_end_vel(curve_constraints3_t& c, const point3_t& val)
+  exact_cubic_t* wrapExactCubicConstructorConstraint(const coeff_t& array, const time_waypoints_t& time_wp, 
+                                                     const curve_constraints_t& constraints)
   {
-    c.end_vel = val;
+    t_waypoint_t wps = getWayPoints(array, time_wp);
+    return new exact_cubic_t(wps.begin(), wps.end(), constraints);
   }
 
-  void set_end_acc(curve_constraints3_t& c, const point3_t& val)
-  {
-    c.end_acc = val;
-  }
   /// For constraints XD
-  point3_t get_init_velX(const curve_constraints_t& c)
+  point_t get_init_vel(const curve_constraints_t& c)
   {
     return c.init_vel;
   }
 
-  point3_t get_init_accX(const curve_constraints_t& c)
+  point_t get_init_acc(const curve_constraints_t& c)
   {
     return c.init_acc;
   }
 
-  point3_t get_end_velX(const curve_constraints_t& c)
+  point_t get_end_vel(const curve_constraints_t& c)
   {
     return c.end_vel;
   }
 
-  point3_t get_end_accX(const curve_constraints_t& c)
+  point_t get_end_acc(const curve_constraints_t& c)
   {
     return c.end_acc;
   }
 
-  void set_init_velX(curve_constraints_t& c, const point_t& val)
+  void set_init_vel(curve_constraints_t& c, const point_t& val)
   {
     c.init_vel = val;
   }
 
-  void set_init_accX(curve_constraints_t& c, const point_t& val)
+  void set_init_acc(curve_constraints_t& c, const point_t& val)
   {
     c.init_acc = val;
   }
 
-  void set_end_velX(curve_constraints_t& c, const point_t& val)
+  void set_end_vel(curve_constraints_t& c, const point_t& val)
   {
     c.end_vel = val;
   }
 
-  void set_end_accX(curve_constraints_t& c, const point_t& val)
+  void set_end_acc(curve_constraints_t& c, const point_t& val)
   {
     c.end_acc = val;
   }
@@ -297,8 +240,6 @@ namespace curves
     eigenpy::enableEigenPy();
     eigenpy::enableEigenPySpecific<pointX_t,pointX_t>();
     eigenpy::enableEigenPySpecific<pointX_list_t,pointX_list_t>();
-    eigenpy::enableEigenPySpecific<point3_t,point3_t>();
-    eigenpy::enableEigenPySpecific<point3_list_t,point3_list_t>();
     eigenpy::enableEigenPySpecific<coeff_t,coeff_t>();
     /*eigenpy::exposeAngleAxis();
     eigenpy::exposeQuaternion();*/
@@ -440,24 +381,24 @@ namespace curves
     ;
     /** END piecewise curve function **/
     /** BEGIN exact_cubic curve**/
-    class_<exact_cubic3_t>
-    ("exact_cubic3", init<>())
-      .def("__init__", make_constructor(&wrapExactCubic3Constructor))
-      .def("__init__", make_constructor(&wrapExactCubic3ConstructorConstraint))
-      .def("min", &exact_cubic3_t::min)
-      .def("max", &exact_cubic3_t::max)
-      .def("dim", &exact_cubic3_t::dim)
-      .def("__call__", &exact_cubic3_t::operator())
-      .def("derivate", &exact_cubic3_t::derivate)
-      .def("getNumberSplines", &exact_cubic3_t::getNumberSplines)
-      .def("getSplineAt", &exact_cubic3_t::getSplineAt)
-      .def("saveAsText", &exact_cubic3_t::saveAsText<exact_cubic3_t>,bp::args("filename"),"Saves *this inside a text file.")
-      .def("loadFromText",&exact_cubic3_t::loadFromText<exact_cubic3_t>,bp::args("filename"),"Loads *this from a text file.")
-      .def("saveAsXML",&exact_cubic3_t::saveAsXML<exact_cubic3_t>,bp::args("filename","tag_name"),"Saves *this inside a XML file.")
-      .def("loadFromXML",&exact_cubic3_t::loadFromXML<exact_cubic3_t>,bp::args("filename","tag_name"),"Loads *this from a XML file.")
-      .def("saveAsBinary",&exact_cubic3_t::saveAsBinary<exact_cubic3_t>,bp::args("filename"),"Saves *this inside a binary file.")
-      .def("loadFromBinary",&exact_cubic3_t::loadFromBinary<exact_cubic3_t>,bp::args("filename"),"Loads *this from a binary file.")
-      //.def(SerializableVisitor<exact_cubic3_t>())
+    class_<exact_cubic_t>
+    ("exact_cubic", init<>())
+      .def("__init__", make_constructor(&wrapExactCubicConstructor))
+      .def("__init__", make_constructor(&wrapExactCubicConstructorConstraint))
+      .def("min", &exact_cubic_t::min)
+      .def("max", &exact_cubic_t::max)
+      .def("dim", &exact_cubic_t::dim)
+      .def("__call__", &exact_cubic_t::operator())
+      .def("derivate", &exact_cubic_t::derivate)
+      .def("getNumberSplines", &exact_cubic_t::getNumberSplines)
+      .def("getSplineAt", &exact_cubic_t::getSplineAt)
+      .def("saveAsText", &exact_cubic_t::saveAsText<exact_cubic_t>,bp::args("filename"),"Saves *this inside a text file.")
+      .def("loadFromText",&exact_cubic_t::loadFromText<exact_cubic_t>,bp::args("filename"),"Loads *this from a text file.")
+      .def("saveAsXML",&exact_cubic_t::saveAsXML<exact_cubic_t>,bp::args("filename","tag_name"),"Saves *this inside a XML file.")
+      .def("loadFromXML",&exact_cubic_t::loadFromXML<exact_cubic_t>,bp::args("filename","tag_name"),"Loads *this from a XML file.")
+      .def("saveAsBinary",&exact_cubic_t::saveAsBinary<exact_cubic_t>,bp::args("filename"),"Saves *this inside a binary file.")
+      .def("loadFromBinary",&exact_cubic_t::loadFromBinary<exact_cubic_t>,bp::args("filename"),"Loads *this from a binary file.")
+      //.def(SerializableVisitor<exact_cubic_t>())
     ;
     /** END exact_cubic curve**/
     /** BEGIN cubic_hermite_spline **/
@@ -479,23 +420,14 @@ namespace curves
     ;
     /** END cubic_hermite_spline **/
     /** BEGIN curve constraints**/
-    class_<curve_constraints3_t>
-    ("curve_constraints3", init<>())
+    class_<curve_constraints_t>
+    ("curve_constraints", init<>())
       .add_property("init_vel", &get_init_vel, &set_init_vel)
       .add_property("init_acc", &get_init_acc, &set_init_acc)
       .add_property("end_vel", &get_end_vel, &set_end_vel)
       .add_property("end_acc", &get_end_acc, &set_end_acc)
     ;
     /** END curve constraints**/
-    /** BEGIN curve constraints**/
-    class_<curve_constraints_t>
-    ("curve_constraints", init<>())
-      .add_property("init_vel", &get_init_velX, &set_init_velX)
-      .add_property("init_acc", &get_init_accX, &set_init_accX)
-      .add_property("end_vel", &get_end_velX, &set_end_velX)
-      .add_property("end_acc", &get_end_accX, &set_end_accX)
-    ;
-    /** END curve constraints**/
     /** BEGIN bernstein polynomial**/
     class_<bernstein_t>
     ("bernstein", init<const unsigned int, const unsigned int>())
diff --git a/python/test/test.py b/python/test/test.py
index 4e54ae414d0319f6cf8ecec799685ffbf6184b6b..182984b629f9ec2b2ec7fa2c1ba29e6d161d1aa9 100644
--- a/python/test/test.py
+++ b/python/test/test.py
@@ -8,7 +8,7 @@ from numpy.linalg import norm
 
 from curves import (bezier_from_hermite, bezier_from_polynomial, hermite_from_polynomial,
                     hermite_from_bezier, polynomial_from_hermite, polynomial_from_bezier,
-                    cubic_hermite_spline, curve_constraints3,curve_constraints, exact_cubic3, bezier, 
+                    cubic_hermite_spline, curve_constraints, exact_cubic, bezier, 
                     piecewise_bezier_curve, piecewise_cubic_hermite_curve,
                     piecewise_polynomial_curve, polynomial
                     )
@@ -21,6 +21,7 @@ class TestCurves(unittest.TestCase):
     #   return
 
     def test_bezier(self):
+        print("test_bezier")
         # To test :
         # - Functions : constructor, min, max, derivate,compute_derivate, compute_primitive
         # - Variables : degree, nbWayPoints
@@ -103,6 +104,7 @@ class TestCurves(unittest.TestCase):
         return
 
     def test_polynomial(self):
+        print("test_polynomial")
         # To test :
         # - Functions : constructor, min, max, derivate, serialize, deserialize
         waypoints_0 = matrix([[0.,0.,0.], [0.,0.,0.]]).transpose()
@@ -125,6 +127,7 @@ class TestCurves(unittest.TestCase):
         return
 
     def test_cubic_hermite_spline(self):
+        print("test_cubic_hermite_spline")
         points = matrix([[1., 2., 3.], [4., 5., 6.]]).transpose()
         tangents = matrix([[1., 2., 3.], [4., 5., 6.]]).transpose()
         time_points = matrix([0., 1.]).transpose()
@@ -159,6 +162,7 @@ class TestCurves(unittest.TestCase):
         return
 
     def test_piecewise_polynomial_curve(self):
+        print("test_piecewise_polynomial_curve")
         # To test :
         # - Functions : constructor, min, max, derivate, add_curve, is_continuous, serialize, deserialize
         waypoints0 = matrix([[0., 0., 0.]]).transpose()
@@ -185,6 +189,7 @@ class TestCurves(unittest.TestCase):
         return
 
     def test_piecewise_bezier_curve(self):
+        print("test_piecewise_bezier_curve")
         # To test :
         # - Functions : constructor, min, max, derivate, add_curve, is_continuous
         waypoints = matrix([[1., 2., 3.], [4., 5., 6.]]).transpose()
@@ -208,6 +213,7 @@ class TestCurves(unittest.TestCase):
         return
 
     def test_piecewise_cubic_hermite_curve(self):
+        print("test_piecewise_cubic_hermite_curve")
         # To test :
         # - Functions : constructor, min, max, derivate, add_curve, is_continuous
         points = matrix([[1., 2., 3.], [4., 5., 6.]]).transpose()
@@ -234,12 +240,12 @@ class TestCurves(unittest.TestCase):
         return
 
     def test_exact_cubic(self):
-        '''
+        print("test_exact_cubic")
         # To test :
         # - Functions : constructor, min, max, derivate, getNumberSplines, getSplineAt
         waypoints = matrix([[1., 2., 3.], [4., 5., 6.]]).transpose()
         time_waypoints = matrix([0., 1.]).transpose()
-        a = exact_cubic3(waypoints, time_waypoints)
+        a = exact_cubic(waypoints, time_waypoints)
         a.min()
         a.max()
         a(0.4)
@@ -249,32 +255,33 @@ class TestCurves(unittest.TestCase):
         a.getSplineAt(0)
         # Test serialization
         a.saveAsText("serialization_pc.test")
-        b = exact_cubic3()
+        b = exact_cubic()
         b.loadFromText("serialization_pc.test")
         self.assertTrue((a(0.4) == b(0.4)).all())
         os.remove("serialization_pc.test")
-        '''
         return
 
     def test_exact_cubic_constraint(self):
+        print("test_exact_cubic_constraint")
         # To test :
         # - Functions : constructor, min, max, derivate
         waypoints = matrix([[1., 2., 3.], [4., 5., 6.]]).transpose()
         time_waypoints = matrix([0., 1.]).transpose()
-        c = curve_constraints3()
-        c.init_vel
-        c.end_vel
-        c.init_acc
-        c.end_acc
+        c = curve_constraints()
         c.init_vel = matrix([0., 1., 1.]).transpose()
         c.end_vel = matrix([0., 1., 1.]).transpose()
         c.init_acc = matrix([0., 1., 1.]).transpose()
         c.end_acc = matrix([0., 1., 1.]).transpose()
-        a = exact_cubic3(waypoints, time_waypoints)
-        a = exact_cubic3(waypoints, time_waypoints, c)
+        c.init_vel
+        c.end_vel
+        c.init_acc
+        c.end_acc
+        a = exact_cubic(waypoints, time_waypoints)
+        a = exact_cubic(waypoints, time_waypoints, c)
         return
 
     def test_conversion_curves(self):
+        print("test_conversion_curves")
         __EPS = 1e-6
         waypoints = matrix([[1., 2., 3.], [4., 5., 6.]]).transpose()
         a = bezier(waypoints)
diff --git a/tests/Main.cpp b/tests/Main.cpp
index f128222ec5f6e978a99b8daeeeeb76da68e6d133..2bf56c4497ff53022875a81bc53c4e69c01bd32c 100644
--- a/tests/Main.cpp
+++ b/tests/Main.cpp
@@ -18,14 +18,13 @@ using namespace std;
 namespace curves
 {
   typedef Eigen::Vector3d point_t;
-  typedef Eigen::Vector3d tangent_t;
   typedef std::vector<point_t,Eigen::aligned_allocator<point_t> >  t_point_t;
   typedef curve_abc  <double, double, true, point_t> curve_abc_t;
   typedef polynomial  <double, double, true, point_t, t_point_t> polynomial_t;
-  typedef exact_cubic <double, double, 3, true, point_t> exact_cubic_t;
+  typedef exact_cubic <double, double, true, point_t> exact_cubic_t;
+  typedef exact_cubic   <double, double, true, Eigen::Matrix<double,1,1> > exact_cubic_one;
   typedef bezier_curve  <double, double, true, point_t> bezier_curve_t;
   typedef cubic_hermite_spline <double, double, true, point_t> cubic_hermite_spline_t;
-  typedef exact_cubic   <double, double, 1, true, Eigen::Matrix<double,1,1> > exact_cubic_one;
   typedef piecewise_curve <double, double, true, point_t, t_point_t, polynomial_t> piecewise_polynomial_curve_t;
   typedef piecewise_curve <double, double, true, point_t, t_point_t, bezier_curve_t> piecewise_bezier_curve_t;
   typedef piecewise_curve <double, double, true, point_t, t_point_t, cubic_hermite_spline_t> piecewise_cubic_hermite_curve_t;
@@ -35,7 +34,7 @@ namespace curves
   typedef Eigen::Matrix<double,1,1> point_one;
   typedef std::pair<double, point_one> WaypointOne;
   typedef std::vector<WaypointOne> T_WaypointOne;
-  typedef std::pair<point_t, tangent_t> pair_point_tangent_t;
+  typedef std::pair<point_t, point_t> pair_point_tangent_t;
   typedef std::vector<pair_point_tangent_t,Eigen::aligned_allocator<pair_point_tangent_t> > t_pair_point_tangent_t;
   
   const double margin = 1e-3;
@@ -630,12 +629,6 @@ void CheckWayPointConstraint(const std::string& errmsg, const double step, const
   }
 }
 
-void CheckDerivative(const std::string& errmsg, const double eval_point, const std::size_t order, const point_t& target, const exact_cubic_t* curve, bool& error )
-{
-  point_t res1 = curve->derivate(eval_point,order);
-  ComparePoints(target, res1, errmsg, error);
-}
-
 
 void ExactCubicPointsCrossedTest(bool& error)
 {
@@ -667,10 +660,10 @@ void ExactCubicVelocityConstraintsTest(bool& error)
   CheckWayPointConstraint(errmsg, 0.2, waypoints, &exactCubic, error);
   std::string errmsg3("Error in ExactCubicVelocityConstraintsTest (2); while checking derivative (expected / obtained)");
   // now check derivatives
-  CheckDerivative(errmsg3,0,1,constraints.init_vel,&exactCubic, error);
-  CheckDerivative(errmsg3,1,1,constraints.end_vel,&exactCubic, error);
-  CheckDerivative(errmsg3,0,2,constraints.init_acc,&exactCubic, error);
-  CheckDerivative(errmsg3,1,2,constraints.end_acc,&exactCubic, error);
+  ComparePoints(constraints.init_vel, exactCubic.derivate(0,1), errmsg3, error);
+  ComparePoints(constraints.end_vel, exactCubic.derivate(1,1), errmsg3, error);
+  ComparePoints(constraints.init_acc, exactCubic.derivate(0,2), errmsg3, error);
+  ComparePoints(constraints.end_acc, exactCubic.derivate(1,2), errmsg3, error);
   constraints.end_vel = point_t(1,2,3);
   constraints.init_vel = point_t(-1,-2,-3);
   constraints.end_acc = point_t(4,5,6);
@@ -680,13 +673,14 @@ void ExactCubicVelocityConstraintsTest(bool& error)
   CheckWayPointConstraint(errmsg2, 0.2, waypoints, &exactCubic2, error);
   std::string errmsg4("Error in ExactCubicVelocityConstraintsTest (4); while checking derivative (expected / obtained)");
   // now check derivatives
-  CheckDerivative(errmsg4,0,1,constraints.init_vel,&exactCubic2, error);
-  CheckDerivative(errmsg4,1,1,constraints.end_vel ,&exactCubic2, error);
-  CheckDerivative(errmsg4,0,2,constraints.init_acc,&exactCubic2, error);
-  CheckDerivative(errmsg4,1,2,constraints.end_acc ,&exactCubic2, error);
+  ComparePoints(constraints.init_vel, exactCubic2.derivate(0,1), errmsg4, error);
+  ComparePoints(constraints.end_vel, exactCubic2.derivate(1,1), errmsg4, error);
+  ComparePoints(constraints.init_acc, exactCubic2.derivate(0,2), errmsg4, error);
+  ComparePoints(constraints.end_acc, exactCubic2.derivate(1,2), errmsg4, error);
 }
 
-void CheckPointOnline(const std::string& errmsg, const point_t& A, const point_t& B, const double target, const exact_cubic_t* curve, bool& error )
+template<typename CurveType>
+void CheckPointOnline(const std::string& errmsg, const point_t& A, const point_t& B, const double target, const CurveType* curve, bool& error )
 {
   point_t res1 = curve->operator ()(target);
   point_t ar =(res1-A); ar.normalize();
@@ -721,21 +715,20 @@ void EffectorTrajectoryTest(bool& error)
   ComparePoints(off1, (*eff_traj)(1), errmsg, error);
   ComparePoints(off2, (*eff_traj)(9.5), errmsg, error);
   ComparePoints(end , (*eff_traj)(10), errmsg, error);
-  //then check offset at start / goal positions
   // now check derivatives
-  CheckDerivative(errmsg2,0,1,zero,eff_traj, error);
-  CheckDerivative(errmsg2,10,1,zero ,eff_traj, error);
-  CheckDerivative(errmsg2,0,2,zero,eff_traj, error);
-  CheckDerivative(errmsg2,10,2,zero ,eff_traj, error);
+  ComparePoints(zero, (*eff_traj).derivate(0,1), errmsg2, error);
+  ComparePoints(zero, (*eff_traj).derivate(10,1), errmsg2, error);
+  ComparePoints(zero, (*eff_traj).derivate(0,2), errmsg2, error);
+  ComparePoints(zero, (*eff_traj).derivate(10,2), errmsg2, error);
   //check that end and init splines are line
   std::string errmsg3("Error in EffectorTrajectoryTest; while checking that init/end splines are line (point A/ point B, time value / point obtained) \n");
   for(double i = 0.1; i<1; i+=0.1)
   {
-    CheckPointOnline(errmsg3,(*eff_traj)(0),(*eff_traj)(1),i,eff_traj,error);
+    CheckPointOnline<helpers::exact_cubic_t>(errmsg3,(*eff_traj)(0),(*eff_traj)(1),i,eff_traj,error);
   }
   for(double i = 9.981; i<10; i+=0.002)
   {
-    CheckPointOnline(errmsg3,(*eff_traj)(9.5),(*eff_traj)(10),i,eff_traj,error);
+    CheckPointOnline<helpers::exact_cubic_t>(errmsg3,(*eff_traj)(9.5),(*eff_traj)(10),i,eff_traj,error);
   }
   delete eff_traj;
 }
@@ -989,41 +982,41 @@ void BezierSplitCurve(bool& error)
 /* cubic hermite spline function test */
 void CubicHermitePairsPositionDerivativeTest(bool& error)
 {
-  std::string errmsg1("in Cubic Hermite 2 pairs (pos,vel), Error While checking that given wayPoints are crossed (expected / obtained) : ");
   std::string errmsg2("in Cubic Hermite 2 points, Error While checking value of point on curve : ");
   std::string errmsg3("in Cubic Hermite 2 points, Error While checking value of tangent on curve : ");
   std::vector< pair_point_tangent_t > control_points;
   point_t res1;
-
   point_t p0(0.,0.,0.);
   point_t p1(1.,2.,3.);
   point_t p2(4.,4.,4.);
-
-  tangent_t t0(0.5,0.5,0.5);
-  tangent_t t1(0.1,0.2,-0.5);
-  tangent_t t2(0.1,0.2,0.3);
-
-  std::vector< double > time_control_points;
-
+  point_t t0(0.5,0.5,0.5);
+  point_t t1(0.1,0.2,-0.5);
+  point_t t2(0.1,0.2,0.3);
+  std::vector< double > time_control_points, time_control_points_test;
   // Two pairs
   control_points.clear();
   control_points.push_back(pair_point_tangent_t(p0,t0));
   control_points.push_back(pair_point_tangent_t(p1,t1));
-  time_control_points.push_back(1.);  // Time at P0
-  time_control_points.push_back(3.);  // Time at P1
+  time_control_points.push_back(0.);  // Time at P0
+  time_control_points.push_back(1.);  // Time at P1
   // Create cubic hermite spline
   cubic_hermite_spline_t cubic_hermite_spline_1Pair(control_points.begin(), control_points.end(), time_control_points);
+  // Dimension
+  if (cubic_hermite_spline_1Pair.dim() != 3)
+  {
+    error = true;
+    std::cout << "Cubic hermite spline test, Error : Dimension of curve is wrong\n";
+  }
   //Check
-  res1 = cubic_hermite_spline_1Pair(1.);   // t=0
+  res1 = cubic_hermite_spline_1Pair(0.);   // t=0
   ComparePoints(p0, res1, errmsg1, error);
-  res1 = cubic_hermite_spline_1Pair(3.);   // t=1
+  res1 = cubic_hermite_spline_1Pair(1.);   // t=1
   ComparePoints(p1, res1, errmsg1, error);
   // Test derivative : two pairs
-  res1 = cubic_hermite_spline_1Pair.derivate(1.,1);
+  res1 = cubic_hermite_spline_1Pair.derivate(0.,1);
   ComparePoints(t0, res1, errmsg3, error);
-  res1 = cubic_hermite_spline_1Pair.derivate(3.,1);
+  res1 = cubic_hermite_spline_1Pair.derivate(1.,1);
   ComparePoints(t1, res1, errmsg3, error);
-
   // Three pairs
   control_points.push_back(pair_point_tangent_t(p2,t2));
   time_control_points.clear();
@@ -1047,11 +1040,11 @@ void CubicHermitePairsPositionDerivativeTest(bool& error)
   ComparePoints(t2, res1, errmsg3, error);
   // Test time control points by default [0,1] => with N control points : 
   // Time at P0= 0. | Time at P1= 1.0/(N-1) | Time at P2= 2.0/(N-1) | ... | Time at P_(N-1)= (N-1)/(N-1)= 1.0
-  time_control_points.clear();
-  time_control_points.push_back(0.);  // Time at P0
-  time_control_points.push_back(0.5);  // Time at P1
-  time_control_points.push_back(1.);  // Time at P2
-  cubic_hermite_spline_2Pairs.setTime(time_control_points);
+  time_control_points_test.clear();
+  time_control_points_test.push_back(0.);  // Time at P0
+  time_control_points_test.push_back(0.5);  // Time at P1
+  time_control_points_test.push_back(1.0);  // Time at P2
+  cubic_hermite_spline_2Pairs.setTime(time_control_points_test);
   res1 = cubic_hermite_spline_2Pairs(0.);  // t=0
   ComparePoints(p0, res1, errmsg1, error);
   res1 = cubic_hermite_spline_2Pairs(0.5); // t=0.5
@@ -1145,9 +1138,9 @@ void piecewiseCurveTest(bool& error)
     point_t p0(0.,0.,0.);
     point_t p1(1.,2.,3.);
     point_t p2(4.,4.,4.);
-    tangent_t t0(0.5,0.5,0.5);
-    tangent_t t1(0.1,0.2,-0.5);
-    tangent_t t2(0.1,0.2,0.3);
+    point_t t0(0.5,0.5,0.5);
+    point_t t1(0.1,0.2,-0.5);
+    point_t t2(0.1,0.2,0.3);
     std::vector< pair_point_tangent_t > control_points_0;
     control_points_0.push_back(pair_point_tangent_t(p0,t0));
     control_points_0.push_back(pair_point_tangent_t(p1,t1)); // control_points_0 = 1st piece of curve
@@ -1243,7 +1236,7 @@ void curveAbcDimDynamicTest(bool& error)
 {
   typedef curve_abc<double,double,true> curve_abc_test_t;
   typedef polynomial  <double, double, true> polynomial_test_t;
-  typedef exact_cubic <double, double, 3, true> exact_cubic_test_t;
+  typedef exact_cubic <double, double, true> exact_cubic_test_t;
   typedef exact_cubic_test_t::spline_constraints spline_constraints_test_t;
   typedef bezier_curve  <double, double, true> bezier_curve_test_t;
   typedef cubic_hermite_spline <double, double, true> cubic_hermite_spline_test_t;