diff --git a/python/spline_python.cpp b/python/spline_python.cpp
index 3dfeb5035d97085cbf1f5a3e9a81edcb9b34226c..4777c58bf3f338c82b85e77fb5f45863dc5286a0 100644
--- a/python/spline_python.cpp
+++ b/python/spline_python.cpp
@@ -60,57 +60,56 @@ T_Point vectorFromEigenArray(const PointList& array)
     return res;
 }
 
-bezier_t* wrapBezierConstructor(const point_list_t& array)
+template <typename Bezier, typename PointList, typename T_Point>
+Bezier* wrapBezierConstructorTemplate(const PointList& array, const real lb = 0., const real ub =1.)
 {
-    t_point_t asVector = vectorFromEigenArray<point_list_t, t_point_t>(array);
-    return new bezier_t(asVector.begin(), asVector.end());
+    T_Point asVector = vectorFromEigenArray<PointList, T_Point>(array);
+    return new Bezier(asVector.begin(), asVector.end(), lb, ub);
 }
 
+template <typename Bezier, typename PointList, typename T_Point, typename CurveConstraints>
+Bezier* wrapBezierConstructorConstraintsTemplate(const PointList& array, const CurveConstraints& constraints, const real lb = 0., const real ub =1.)
+{
+    T_Point asVector = vectorFromEigenArray<PointList, T_Point>(array);
+    return new Bezier(asVector.begin(), asVector.end(), constraints, lb, ub);
+}
 
+/*3D constructors */
+bezier_t* wrapBezierConstructor(const point_list_t& array)
+{
+    return wrapBezierConstructorTemplate<bezier_t, point_list_t, t_point_t>(array) ;
+}
 bezier_t* wrapBezierConstructorBounds(const point_list_t& array, const real lb, const real ub)
 {
-    t_point_t asVector = vectorFromEigenArray<point_list_t, t_point_t>(array);
-    return new bezier_t(asVector.begin(), asVector.end(), lb, ub);
+    return wrapBezierConstructorTemplate<bezier_t, point_list_t, t_point_t>(array, lb, ub) ;
 }
-
 bezier_t* wrapBezierConstructorConstraints(const point_list_t& array, const curve_constraints_t& constraints)
 {
-    t_point_t asVector = vectorFromEigenArray<point_list_t, t_point_t>(array);
-    return new bezier_t(asVector.begin(), asVector.end(), constraints);
+    return wrapBezierConstructorConstraintsTemplate<bezier_t, point_list_t, t_point_t, curve_constraints_t>(array, constraints) ;
 }
-
-
-bezier_t* wrapBezierConstructorConstraintsBounds(const point_list_t& array, const curve_constraints_t& constraints, const real lb, const real ub)
+bezier_t* wrapBezierConstructorBoundsConstraints(const point_list_t& array, const curve_constraints_t& constraints, const real lb, const real ub)
 {
-    t_point_t asVector = vectorFromEigenArray<point_list_t, t_point_t>(array);
-    return new bezier_t(asVector.begin(), asVector.end(), constraints, lb, ub);
+    return wrapBezierConstructorConstraintsTemplate<bezier_t, point_list_t, t_point_t, curve_constraints_t>(array, constraints, lb, ub) ;
 }
-
+/*END 3D constructors */
+/*6D constructors */
 bezier6_t* wrapBezierConstructor6(const point_list6_t& array)
 {
-    t_point6_t asVector = vectorFromEigenArray<point_list6_t, t_point6_t>(array);
-    return new bezier6_t(asVector.begin(), asVector.end());
+    return wrapBezierConstructorTemplate<bezier6_t, point_list6_t, t_point6_t>(array) ;
 }
-
-
 bezier6_t* wrapBezierConstructorBounds6(const point_list6_t& array, const real lb, const real ub)
 {
-    t_point6_t asVector = vectorFromEigenArray<point_list6_t, t_point6_t>(array);
-    return new bezier6_t(asVector.begin(), asVector.end(), lb, ub);
+    return wrapBezierConstructorTemplate<bezier6_t, point_list6_t, t_point6_t>(array, lb, ub) ;
 }
-
 bezier6_t* wrapBezierConstructor6Constraints(const point_list6_t& array, const curve_constraints6_t& constraints)
 {
-    t_point6_t asVector = vectorFromEigenArray<point_list6_t, t_point6_t>(array);
-    return new bezier6_t(asVector.begin(), asVector.end(), constraints);
+    return wrapBezierConstructorConstraintsTemplate<bezier6_t, point_list6_t, t_point6_t, curve_constraints6_t>(array, constraints) ;
 }
-
-
 bezier6_t* wrapBezierConstructorBounds6Constraints(const point_list6_t& array, const curve_constraints6_t& constraints, const real lb, const real ub)
 {
-    t_point6_t asVector = vectorFromEigenArray<point_list6_t, t_point6_t>(array);
-    return new bezier6_t(asVector.begin(), asVector.end(), constraints, lb, ub);
+    return wrapBezierConstructorConstraintsTemplate<bezier6_t, point_list6_t, t_point6_t, curve_constraints6_t>(array, constraints, lb, ub) ;
 }
+/*END 6D constructors */
 
 spline_curve_t* wrapSplineConstructor(const coeff_t& array)
 {
@@ -221,6 +220,8 @@ BOOST_PYTHON_MODULE(spline)
         ("bezier6", no_init)
             .def("__init__", make_constructor(&wrapBezierConstructor6))
             .def("__init__", make_constructor(&wrapBezierConstructorBounds6))
+            //.def("__init__", make_constructor(&wrapBezierConstructor6Constraints))
+            //.def("__init__", make_constructor(&wrapBezierConstructorBounds6Constraints))
             .def("min", &bezier6_t::min)
             .def("max", &bezier6_t::max)
             .def("__call__", &bezier6_t::operator())
@@ -238,6 +239,8 @@ BOOST_PYTHON_MODULE(spline)
         ("bezier", no_init)
             .def("__init__", make_constructor(&wrapBezierConstructor))
             .def("__init__", make_constructor(&wrapBezierConstructorBounds))
+            .def("__init__", make_constructor(&wrapBezierConstructorConstraints))
+            .def("__init__", make_constructor(&wrapBezierConstructorBoundsConstraints))
             .def("min", &bezier_t::min)
             .def("max", &bezier_t::max)
             .def("__call__", &bezier_t::operator())
@@ -274,7 +277,7 @@ BOOST_PYTHON_MODULE(spline)
     /** END bezier curve**/
 
 
-    /** BEGIN spline constraints**/
+    /** BEGIN curve constraints**/
     class_<curve_constraints_t>
         ("curve_constraints", init<>())
             .add_property("init_vel", &get_init_vel, &set_init_vel)
@@ -282,7 +285,7 @@ BOOST_PYTHON_MODULE(spline)
             .add_property("end_vel", &get_end_vel, &set_end_vel)
             .add_property("end_acc", &get_end_acc, &set_end_acc)
         ;
-    /** END spline constraints**/
+    /** END curve constraints**/
 
 
     /** BEGIN spline_deriv_constraints**/
diff --git a/python/test/test.py b/python/test/test.py
index 4487e9ae5a78518bf0ef9299a60131852d33b657..8840c541fda0f335b89fe3bd1c7b60635fb65a85 100644
--- a/python/test/test.py
+++ b/python/test/test.py
@@ -1,14 +1,16 @@
-from spline import bezier, spline, exact_cubic, curve_constraints, spline_deriv_constraint
+from spline import bezier, bezier6, spline, exact_cubic, curve_constraints, spline_deriv_constraint
 
 from numpy import matrix
+from numpy.linalg import norm
 
 waypoints = matrix([[1.,2.,3.],[4.,5.,6.]]).transpose()
+waypoints6 = matrix([[1.,2.,3.,7.,5.,5.],[4.,5.,6.,4.,5.,6.]]).transpose()
 time_waypoints = matrix([0.,1.])
 
 #testing bezier curve
+a = bezier6(waypoints6)
 a = bezier(waypoints, -1., 3.)
 
-a = bezier(waypoints)
 assert(a.degree == a.nbWaypoints -1)
 a.min()
 a.max()
@@ -31,6 +33,18 @@ for i in range(10):
 assert(prim(0) == matrix([0.,0.,0.])).all()
 
 
+#testing bezier with constraints
+c = curve_constraints();
+c.init_vel = matrix([0.,1.,1.]);
+c.end_vel  = matrix([0.,1.,1.]);
+c.init_acc = matrix([0.,1.,-1.]);
+c.end_acc  = matrix([0.,100.,1.]);
+
+
+a = bezier(waypoints,c)
+assert norm(a.derivate(0,1) - c.init_vel) < 1e-10
+assert norm(a.derivate(1,2) - c.end_acc) < 1e-10
+
 
 #testing spline function
 a = spline(waypoints)