diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt
index 8d5d461b78d66a68525eb5aa830b8ad0fe2f4e8f..9e45c7a7c993af301e56687b453adc91b4b24128 100644
--- a/python/CMakeLists.txt
+++ b/python/CMakeLists.txt
@@ -42,6 +42,7 @@ INCLUDE_DIRECTORIES("${Boost_INCLUDE_DIRS}" ${PYTHON_INCLUDE_DIRS})
 # To be run manually:
 # make doc
 # ./cmake/doxygen/doxygen_xml_parser.py build-rel/doc/doxygen-xml/index.xml > build-rel/python/doxygen_autodoc.hh
+INCLUDE_DIRECTORIES("${CMAKE_SOURCE_DIR}/src")
 INCLUDE_DIRECTORIES("${CMAKE_CURRENT_BINARY_DIR}")
 
 SET(${LIBRARY_NAME}_HEADERS
diff --git a/python/collision-geometries.cc b/python/collision-geometries.cc
index b0a6f55938a281dd45d72ed03a689fd523cf7784..77d614339a6368d2cde2b9fc25f5a3c3e20f00d6 100644
--- a/python/collision-geometries.cc
+++ b/python/collision-geometries.cc
@@ -43,6 +43,9 @@
 #include <hpp/fcl/shape/convex.h>
 #include <hpp/fcl/BVH/BVH_model.h>
 
+#include "doxygen_autodoc/hpp/fcl/BVH/BVH_model.h"
+#include "doxygen_autodoc/hpp/fcl/shape/geometric_shapes.h"
+
 using namespace boost::python;
 
 using namespace hpp::fcl;
@@ -71,7 +74,7 @@ void exposeBVHModel (const std::string& bvname)
 
   std::string type = "BVHModel" + bvname;
   class_ <BVHModel_t, bases<BVHModelBase>, shared_ptr<BVHModel_t> >
-    (type.c_str(), init<>())
+    (type.c_str(), doxygen::class_doc<BVHModel_t>(), init<>(doxygen::constructor_doc<BVHModel_t>()))
     ;
 }
 
@@ -108,12 +111,12 @@ struct ConvexWrapper
 void exposeShapes ()
 {
   class_ <ShapeBase, bases<CollisionGeometry>, shared_ptr<ShapeBase>, noncopyable>
-    ("ShapeBase", no_init)
+    ("ShapeBase", doxygen::class_doc<ShapeBase>(), no_init)
     //.def ("getObjectType", &CollisionGeometry::getObjectType)
     ;
 
   class_ <Box, bases<ShapeBase>, shared_ptr<Box> >
-    ("Box", init<>())
+    ("Box", doxygen::class_doc<ShapeBase>(), init<>())
     .def (init<FCL_REAL,FCL_REAL,FCL_REAL>())
     .def (init<Vec3f>())
     .add_property("halfSide",
@@ -122,19 +125,19 @@ void exposeShapes ()
     ;
 
   class_ <Capsule, bases<ShapeBase>, shared_ptr<Capsule> >
-    ("Capsule", init<FCL_REAL, FCL_REAL>())
+    ("Capsule", doxygen::class_doc<Capsule>(), init<FCL_REAL, FCL_REAL>())
     .def_readwrite ("radius", &Capsule::radius)
     .def_readwrite ("halfLength", &Capsule::halfLength)
     ;
 
   class_ <Cone, bases<ShapeBase>, shared_ptr<Cone> >
-    ("Cone", init<FCL_REAL, FCL_REAL>())
+    ("Cone", doxygen::class_doc<Cone>(), init<FCL_REAL, FCL_REAL>())
     .def_readwrite ("radius", &Cone::radius)
     .def_readwrite ("halfLength", &Cone::halfLength)
     ;
 
   class_ <ConvexBase, bases<ShapeBase>, shared_ptr<ConvexBase >, noncopyable>
-    ("ConvexBase", no_init)
+    ("ConvexBase", doxygen::class_doc<ConvexBase>(), no_init)
     .def_readonly ("center", &ConvexBase::center)
     .def_readonly ("num_points", &ConvexBase::num_points)
     .def ("points", &ConvexBaseWrapper::points)
@@ -142,19 +145,19 @@ void exposeShapes ()
     ;
 
   class_ <Convex<Triangle>, bases<ConvexBase>, shared_ptr<Convex<Triangle> >, noncopyable>
-    ("Convex", no_init)
+    ("Convex", doxygen::class_doc< Convex<Triangle> >(), no_init)
     .def_readonly ("num_polygons", &Convex<Triangle>::num_polygons)
     .def ("polygons", &ConvexWrapper<Triangle>::polygons)
     ;
 
   class_ <Cylinder, bases<ShapeBase>, shared_ptr<Cylinder> >
-    ("Cylinder", init<FCL_REAL, FCL_REAL>())
+    ("Cylinder", doxygen::class_doc<Cylinder>(), init<FCL_REAL, FCL_REAL>())
     .def_readwrite ("radius", &Cylinder::radius)
     .def_readwrite ("halfLength", &Cylinder::halfLength)
     ;
 
   class_ <Halfspace, bases<ShapeBase>, shared_ptr<Halfspace> >
-    ("Halfspace", "The half-space is defined by {x | n * x < d}.", init<const Vec3f&, FCL_REAL>())
+    ("Halfspace", doxygen::class_doc<Halfspace>(), init<const Vec3f&, FCL_REAL>())
     .def (init<FCL_REAL,FCL_REAL,FCL_REAL,FCL_REAL>())
     .def (init<>())
     .def_readwrite ("n", &Halfspace::n)
@@ -162,7 +165,7 @@ void exposeShapes ()
     ;
 
   class_ <Plane, bases<ShapeBase>, shared_ptr<Plane> >
-    ("Plane", "The plane is defined by {x | n * x = d}.", init<const Vec3f&, FCL_REAL>())
+    ("Plane", doxygen::class_doc<Plane>(), init<const Vec3f&, FCL_REAL>())
     .def (init<FCL_REAL,FCL_REAL,FCL_REAL,FCL_REAL>())
     .def (init<>())
     .def_readwrite ("n", &Plane::n)
@@ -170,12 +173,12 @@ void exposeShapes ()
     ;
 
   class_ <Sphere, bases<ShapeBase>, shared_ptr<Sphere> >
-    ("Sphere", init<FCL_REAL>())
+    ("Sphere", doxygen::class_doc<Sphere>(), init<FCL_REAL>())
     .def_readwrite ("radius", &Sphere::radius)
     ;
 
   class_ <TriangleP, bases<ShapeBase>, shared_ptr<TriangleP> >
-    ("TriangleP", init<const Vec3f&, const Vec3f&, const Vec3f&>())
+    ("TriangleP", doxygen::class_doc<TriangleP>(), init<const Vec3f&, const Vec3f&, const Vec3f&>())
     .def_readwrite ("a", &TriangleP::a)
     .def_readwrite ("b", &TriangleP::b)
     .def_readwrite ("c", &TriangleP::c)
diff --git a/python/math.cc b/python/math.cc
index 1fc05eb964cff576a16b57582fb56980aea51200..a719b05d111366e718a62670801f8025ffd7eb2c 100644
--- a/python/math.cc
+++ b/python/math.cc
@@ -41,21 +41,10 @@
 #include <hpp/fcl/math/transform.h>
 
 #include "fcl.hh"
-#include <hpp/fcl/collision.h>
-#include <hpp/fcl/traversal/traversal_node_bvh_shape.h>
-#include <hpp/fcl/traversal/traversal_node_bvhs.h>
-#include <hpp/fcl/traversal/traversal_node_octree.h>
-#include <hpp/fcl/traversal/traversal_node_shapes.h>
-#include <hpp/fcl/mesh_loader/loader.h>
-#include <hpp/fcl/narrowphase/gjk.h>
-#include <hpp/fcl/BVH/BVH_model.h>
-#include <hpp/fcl/octree.h>
-#include <hpp/fcl/profile.h>
-
-#include "doxygen_autodoc.hh"
 
-using namespace boost::python;
+#include "doxygen_autodoc/hpp/fcl/math/transform.h"
 
+using namespace boost::python;
 using namespace hpp::fcl;
 
 struct TriangleWrapper
@@ -81,13 +70,15 @@ void exposeMaths ()
   if(!eigenpy::register_symbolic_link_to_registered_type<Eigen::AngleAxisd>())
     eigenpy::exposeAngleAxis();
 
-  class_ <Transform3f> ("Transform3f", init<>("Default constructor."))
-    .def (init<Matrix3f, Vec3f>())
-    .def (init<Quaternion3f, Vec3f>())
-    .def (init<Matrix3f>())
-    .def (init<Quaternion3f>())
-    .def (init<Vec3f>())
-    .def (init<Transform3f>(args("self","other"),"Copy constructor."))
+  eigenpy::enableEigenPySpecific<Matrix3f>();
+  eigenpy::enableEigenPySpecific<Vec3f   >();
+
+  class_ <Transform3f> ("Transform3f", doxygen::class_doc<Transform3f>(), init<>(doxygen::constructor_doc<Transform3f>()))
+    .def (init<Matrix3f, Vec3f>    (doxygen::constructor_doc<Transform3f, const Matrix3f::MatrixBase&, const Vec3f::MatrixBase&>()))
+    .def (init<Quaternion3f, Vec3f>(doxygen::constructor_doc<Transform3f, const Quaternion3f&        , const Vec3f::MatrixBase&>()))
+    .def (init<Matrix3f>           (doxygen::constructor_doc<Transform3f, const Matrix3f&                                      >()))
+    .def (init<Quaternion3f>       (doxygen::constructor_doc<Transform3f, const Quaternion3f&                                  >()))
+    .def (init<Vec3f>              (doxygen::constructor_doc<Transform3f, const Vec3f&                                         >()))
 
     .def ("getQuatRotation", &Transform3f::getQuatRotation, doxygen::member_func_doc(&Transform3f::getQuatRotation))
     .def ("getTranslation", &Transform3f::getTranslation, doxygen::member_func_doc(&Transform3f::getTranslation), return_value_policy<copy_const_reference>())