diff --git a/include/curves/curve_constraint.h b/include/curves/curve_constraint.h
index 142dcf9d7ebe46c2233499a2fd208248dbe4fdf7..8ff8960cfb399449eec8e02d7f41d53a5a9176aa 100644
--- a/include/curves/curve_constraint.h
+++ b/include/curves/curve_constraint.h
@@ -24,6 +24,13 @@ struct curve_constraints {
 
   ~curve_constraints() {}
 
+  curve_constraints(const curve_constraints& other)
+    :init_vel(other.init_vel)
+    ,init_acc(other.init_acc)
+    ,end_vel(other.end_vel)
+    ,end_acc(other.end_acc)
+  {}
+
   point_t init_vel;
   point_t init_acc;
   point_t end_vel;
@@ -31,3 +38,4 @@ struct curve_constraints {
 };
 }  // namespace curves
 #endif  //_CLASS_CUBICZEROVELACC
+
diff --git a/python/curves_python.cpp b/python/curves_python.cpp
index d023162bc3c79eb97a14ba1c01944ec736797ffc..3094201a50751e7150991bb94c309f85ee76c1fc 100644
--- a/python/curves_python.cpp
+++ b/python/curves_python.cpp
@@ -25,12 +25,17 @@ typedef double real;
 typedef Eigen::VectorXd time_waypoints_t;
 
 typedef Eigen::VectorXd pointX_t;
+typedef Eigen::Matrix<double,3, 1> point3_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 Eigen::Matrix<double,3, Eigen::Dynamic> point3_list_t;
 typedef std::vector<pointX_t,Eigen::aligned_allocator<pointX_t> >  t_pointX_t;
+typedef std::vector<pointX_t,Eigen::aligned_allocator<point3_t> >  t_point3_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;
+typedef curves::curve_constraints<point3_t> curve_constraints3_t;
+
 typedef std::pair<real, pointX_t> waypoint_t;
 typedef std::vector<waypoint_t> t_waypoint_t;
 
@@ -38,6 +43,7 @@ typedef std::vector<waypoint_t> t_waypoint_t;
 typedef curve_abc<real, real, true, pointX_t> curve_abc_t; // generic class of curve
 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::bezier_curve  <real, real, true, point3_t> bezier3_t;
 typedef curves::polynomial  <real, real, true, pointX_t, t_pointX_t> polynomial_t;
 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;
@@ -46,7 +52,6 @@ typedef curves::piecewise_curve <real, real, true, pointX_t, t_pointX_t, cubic_h
 typedef curves::exact_cubic  <real, real, true, pointX_t, t_pointX_t> exact_cubic_t;
 
 // Bezier 3
-typedef curves::bezier_curve  <real, real, true, Eigen::Vector3d> bezier3_t;
 
 typedef curves::Bern<double> bernstein_t;
 
@@ -94,8 +99,38 @@ namespace curves
     return new Bezier(asVector.begin(), asVector.end(), constraints, T_min, T_max);
   }
   /* End Template constructor bezier */
+  /* Helper converter constraintsX -> constraints 3 */
+  curve_constraints3_t convertToConstraints3(curve_constraints_t constraintsX){
+    curve_constraints3_t constraints3;
+    constraints3.init_vel =point3_t(constraintsX.init_vel);
+    constraints3.init_acc = point3_t(constraintsX.init_acc);
+    constraints3.end_vel = point3_t(constraintsX.end_vel);
+    constraints3.end_acc = point3_t(constraintsX.end_acc);
+    return constraints3;
+  }
+  /* END helper converter constraintsX -> constraints 3 */
 
   /*3D constructors bezier */
+  bezier3_t* wrapBezier3Constructor(const pointX_list_t& array)
+  {
+    return wrapBezierConstructorTemplate<bezier3_t, pointX_list_t, t_point3_t>(array) ;
+  }
+  bezier3_t* wrapBezier3ConstructorBounds(const pointX_list_t& array, const real T_min, const real T_max)
+  {
+    return wrapBezierConstructorTemplate<bezier3_t, pointX_list_t, t_point3_t>(array, T_min, T_max) ;
+  }
+  bezier3_t* wrapBezier3ConstructorConstraints(const pointX_list_t& array, const curve_constraints_t& constraints)
+  {
+    return wrapBezierConstructorConstraintsTemplate<bezier3_t, pointX_list_t, t_point3_t, curve_constraints3_t>(array, convertToConstraints3(constraints)) ;
+  }
+  bezier3_t* wrapBezier3ConstructorBoundsConstraints(const pointX_list_t& array, const curve_constraints_t& constraints,
+                                                   const real T_min, const real T_max)
+  {
+    return wrapBezierConstructorConstraintsTemplate<bezier3_t, pointX_list_t, t_point3_t, curve_constraints3_t>(array, convertToConstraints3(constraints),T_min, T_max) ;
+  }
+  /*END 3D constructors bezier */
+
+  /*constructors bezier */
   bezier_t* wrapBezierConstructor(const pointX_list_t& array)
   {
     return wrapBezierConstructorTemplate<bezier_t, pointX_list_t, t_pointX_t>(array) ;
@@ -111,10 +146,10 @@ namespace curves
   bezier_t* wrapBezierConstructorBoundsConstraints(const pointX_list_t& array, const curve_constraints_t& constraints,
                                                    const real T_min, const real T_max)
   {
-    return wrapBezierConstructorConstraintsTemplate<bezier_t, pointX_list_t, t_pointX_t, curve_constraints_t>(array, constraints, 
+    return wrapBezierConstructorConstraintsTemplate<bezier_t, pointX_list_t, t_pointX_t, curve_constraints_t>(array, constraints,
                                                                                                             T_min, T_max) ;
   }
-  /*END 3D constructors bezier */
+  /*END constructors bezier */
 
   /* Wrap Cubic hermite spline */
   t_pair_pointX_tangent_t getPairsPointTangent(const pointX_list_t& points, const pointX_list_t& tangents)
@@ -131,7 +166,7 @@ namespace curves
     return res;
   }
 
-  cubic_hermite_spline_t* wrapCubicHermiteSplineConstructor(const pointX_list_t& points, const pointX_list_t& tangents, 
+  cubic_hermite_spline_t* wrapCubicHermiteSplineConstructor(const pointX_list_t& points, const pointX_list_t& tangents,
                                                             const time_waypoints_t& time_pts)
   {
     t_pair_pointX_tangent_t ppt = getPairsPointTangent(points, tangents);
@@ -254,7 +289,7 @@ namespace curves
     return new exact_cubic_t(wps.begin(), wps.end());
   }
 
-  exact_cubic_t* wrapExactCubicConstructorConstraint(const coeff_t& array, const time_waypoints_t& time_wp, 
+  exact_cubic_t* wrapExactCubicConstructorConstraint(const coeff_t& array, const time_waypoints_t& time_wp,
                                                      const curve_constraints_t& constraints)
   {
     t_waypoint_t wps = getWayPoints(array, time_wp);
@@ -304,7 +339,7 @@ namespace curves
   /* End wrap exact cubic spline */
 
 
-  // TO DO : Replace all load and save function for serialization in class by using 
+  // TO DO : Replace all load and save function for serialization in class by using
   //         SerializableVisitor in archive_python_binding.
   BOOST_PYTHON_MODULE(curves)
   {
@@ -332,10 +367,15 @@ namespace curves
 
     /** BEGIN bezier3 curve**/
     class_<bezier3_t>("bezier3", init<>())
-      .def("__init__", make_constructor(&wrapBezierConstructor))
-      .def("__init__", make_constructor(&wrapBezierConstructorBounds))
-      .def("__init__", make_constructor(&wrapBezierConstructorConstraints))
-      .def("__init__", make_constructor(&wrapBezierConstructorBoundsConstraints))
+      .def("__init__", make_constructor(&wrapBezier3Constructor))
+      .def("__init__", make_constructor(&wrapBezier3ConstructorBounds))
+      .def("__init__", make_constructor(&wrapBezier3ConstructorConstraints))
+      .def("__init__", make_constructor(&wrapBezier3ConstructorBoundsConstraints))
+      .def("min", &bezier3_t::min)
+      .def("max", &bezier3_t::max)
+      .def("dim", &bezier3_t::dim)
+      .def("__call__", &bezier3_t::operator())
+      .def("derivate", &bezier3_t::derivate)
       .def("compute_derivate", &bezier3_t::compute_derivate)
       .def("compute_primitive", &bezier3_t::compute_primitive)
       .def("waypointAtIndex", &bezier3_t::waypointAtIndex)