diff --git a/include/curves/curve_abc.h b/include/curves/curve_abc.h
index d5d0583fc4b732a1c98a5a9d131d7860eadc57e8..acfa3c78dbe59c79098af133a1a366fa7a608cb2 100644
--- a/include/curves/curve_abc.h
+++ b/include/curves/curve_abc.h
@@ -14,6 +14,7 @@
 #include "MathDefs.h"
 #include "serialization/archive.hpp"
 #include "serialization/eigen-matrix.hpp"
+#include <boost/serialization/shared_ptr.hpp>
 
 #include <functional>
 
@@ -73,5 +74,6 @@ struct curve_abc : std::unary_function<Time, Point>, public serialization::Seria
     }
   }
 };
+BOOST_SERIALIZATION_ASSUME_ABSTRACT(curve_abc)
 }  // namespace curves
 #endif  //_STRUCT_CURVE_ABC
diff --git a/include/curves/se3_curve.h b/include/curves/se3_curve.h
index c65ebc3776ced2809eb135747f39407d0ea28226..d4fae42febe16d62a6fe597338f02d4e941d11dc 100644
--- a/include/curves/se3_curve.h
+++ b/include/curves/se3_curve.h
@@ -1,6 +1,7 @@
 #ifndef _STRUCT_SE3_CURVE_H
 #define _STRUCT_SE3_CURVE_H
 
+#include "fwd.h"
 #include "MathDefs.h"
 #include "curve_abc.h"
 #include "so3_linear.h"
@@ -191,6 +192,21 @@ struct SE3Curve : public curve_abc<Time, Numeric, Safe, Eigen::Transform<Numeric
     if (version) {
       // Do something depending on version ?
     }
+    //register derived class
+    ar.template register_type<bezier_curve<Scalar, Scalar, Safe, pointX_t> >();
+    ar.template register_type<cubic_hermite_spline<Scalar, Scalar, Safe, pointX_t> >();
+    ar.template register_type<exact_cubic<Scalar, Scalar, Safe, pointX_t> >();
+    ar.template register_type<piecewise_curve<Scalar, Scalar, Safe, pointX_t,
+        std::vector<pointX_t, Eigen::aligned_allocator<pointX_t> >, polynomial_t> >();
+    ar.template register_type<piecewise_curve<Scalar, Scalar, Safe, pointX_t,
+        std::vector<pointX_t, Eigen::aligned_allocator<pointX_t> >, bezier_curve<Scalar, Scalar, Safe, pointX_t> > >();
+    ar.template register_type<piecewise_curve<Scalar, Scalar, Safe, pointX_t,
+        std::vector<pointX_t, Eigen::aligned_allocator<pointX_t> >, cubic_hermite_spline<Scalar, Scalar, Safe, pointX_t> > >();
+    ar.template register_type<polynomial_t>();
+    ar.template register_type<SO3Linear_t>();
+
+
+    ar& BOOST_SERIALIZATION_BASE_OBJECT_NVP(curve_abc_t);
     ar& boost::serialization::make_nvp("dim", dim_);
     ar& boost::serialization::make_nvp("translation_curve", translation_curve_);
     ar& boost::serialization::make_nvp("rotation_curve", rotation_curve_);