diff --git a/CMakeLists.txt b/CMakeLists.txt
index 014301b90cbaedfd83b424632d8f689d0033d1a0..0f1f954826e1e28c068a9483a7819758b0b1ece5 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -153,7 +153,7 @@ SET(${PROJECT_NAME}_MULTIBODY_JOINT_HEADERS
   multibody/joint/joint-free-flyer.hpp
   multibody/joint/joint-variant.hpp
   multibody/joint/joint-generic.hpp
-  multibody/joint/joint-accessor.hpp
+  multibody/joint/joint.hpp
   multibody/joint/joint-basic-visitors.hpp
   multibody/joint/joint-basic-visitors.hxx
   ) 
@@ -168,7 +168,6 @@ SET(${PROJECT_NAME}_MULTIBODY_HEADERS
   multibody/constraint.hpp
   multibody/force-set.hpp
   multibody/frame.hpp
-  multibody/joint.hpp
   multibody/model.hpp
   multibody/model.hxx
   multibody/visitor.hpp
@@ -209,7 +208,7 @@ IF(BUILD_PYTHON_INTERFACE)
     python/inertia.hpp
     python/joints-models.hpp
     python/joints-variant.hpp
-    python/joint-accessor.hpp
+    python/joint.hpp
     python/joint-derived.hpp
     python/frame.hpp
     python/model.hpp
diff --git a/benchmark/timings-geometry.cpp b/benchmark/timings-geometry.cpp
index e2973853105f7afa069b112f48e19b5202e9dfd4..66bc7073e131db99231d8c7dcbf6032b89dc2743 100644
--- a/benchmark/timings-geometry.cpp
+++ b/benchmark/timings-geometry.cpp
@@ -17,7 +17,6 @@
 
 #include "pinocchio/spatial/fwd.hpp"
 #include "pinocchio/spatial/se3.hpp"
-#include "pinocchio/multibody/joint.hpp"
 #include "pinocchio/multibody/visitor.hpp"
 #include "pinocchio/multibody/model.hpp"
 #include "pinocchio/algorithm/crba.hpp"
diff --git a/benchmark/timings.cpp b/benchmark/timings.cpp
index 31835fc452382cb83c052c9aedfa0b1eaa4a9e24..e23c37c6544f500db82ba33ebe65929e1e109fc9 100644
--- a/benchmark/timings.cpp
+++ b/benchmark/timings.cpp
@@ -17,7 +17,6 @@
 
 #include "pinocchio/spatial/fwd.hpp"
 #include "pinocchio/spatial/se3.hpp"
-#include "pinocchio/multibody/joint.hpp"
 #include "pinocchio/multibody/visitor.hpp"
 #include "pinocchio/multibody/model.hpp"
 #include "pinocchio/algorithm/crba.hpp"
diff --git a/src/algorithm/aba.hxx b/src/algorithm/aba.hxx
index 3ef1b88d0b1d19e443011760e238ebf1a3992f76..9ecb9c4c9c4a2130cae4cbaa855adf709300d1dd 100644
--- a/src/algorithm/aba.hxx
+++ b/src/algorithm/aba.hxx
@@ -36,7 +36,7 @@ namespace se3
     
     template<typename JointModel>
     static void algo(const se3::JointModelBase<JointModel> & jmodel,
-                     se3::JointDataBase<typename JointModel::JointData> & jdata,
+                     se3::JointDataBase<typename JointModel::JointDataDerived> & jdata,
                      const se3::Model & model,
                      se3::Data & data,
                      const Eigen::VectorXd & q,
@@ -75,7 +75,7 @@ namespace se3
     
     template<typename JointModel>
     static void algo(const JointModelBase<JointModel> & jmodel,
-                     JointDataBase<typename JointModel::JointData> & jdata,
+                     JointDataBase<typename JointModel::JointDataDerived> & jdata,
                      const Model & model,
                      Data & data)
     {
@@ -171,7 +171,7 @@ namespace se3
     
     template<typename JointModel>
     static void algo(const se3::JointModelBase<JointModel> & jmodel,
-                     se3::JointDataBase<typename JointModel::JointData> & jdata,
+                     se3::JointDataBase<typename JointModel::JointDataDerived> & jdata,
                      const se3::Model & model,
                      se3::Data & data)
     {
diff --git a/src/algorithm/center-of-mass.hxx b/src/algorithm/center-of-mass.hxx
index 72c6e2a6accb3c52aab79a9f481e4e0a5ef846a4..10571588a4db128cc4a19ca073f170d74be17479 100644
--- a/src/algorithm/center-of-mass.hxx
+++ b/src/algorithm/center-of-mass.hxx
@@ -208,7 +208,7 @@ namespace se3
     
     template<typename JointModel>
     static void algo(const se3::JointModelBase<JointModel> & jmodel,
-                     se3::JointDataBase<typename JointModel::JointData> & jdata,
+                     se3::JointDataBase<typename JointModel::JointDataDerived> & jdata,
                      const se3::Model& model,
                      se3::Data& data,
                      const bool computeSubtreeComs )
diff --git a/src/algorithm/compute-all-terms.hpp b/src/algorithm/compute-all-terms.hpp
index f8da568b078deef5b88998806e0ed1a2b4d33146..ec83b54340c1135cecf1d319831ae5c363e01381 100644
--- a/src/algorithm/compute-all-terms.hpp
+++ b/src/algorithm/compute-all-terms.hpp
@@ -68,7 +68,7 @@ namespace se3
 
     template<typename JointModel>
     static void algo(const se3::JointModelBase<JointModel> & jmodel,
-                     se3::JointDataBase<typename JointModel::JointData> & jdata,
+                     se3::JointDataBase<typename JointModel::JointDataDerived> & jdata,
                      const se3::Model & model,
                      se3::Data & data,
                      const Eigen::VectorXd & q,
@@ -128,7 +128,7 @@ namespace se3
 
     template<typename JointModel>
     static void algo(const JointModelBase<JointModel> & jmodel,
-                     JointDataBase<typename JointModel::JointData> & jdata,
+                     JointDataBase<typename JointModel::JointDataDerived> & jdata,
                      const Model & model,
                      Data & data)
     {
diff --git a/src/algorithm/crba.hxx b/src/algorithm/crba.hxx
index 33ac8ebf9e1894e0cb0ef97a04770ff39f772f8e..e92988db59f2dc83abe2f9b0f3e84470cbeae5ab 100644
--- a/src/algorithm/crba.hxx
+++ b/src/algorithm/crba.hxx
@@ -37,7 +37,7 @@ namespace se3
 
     template<typename JointModel>
     static void algo(const se3::JointModelBase<JointModel> & jmodel,
-		     se3::JointDataBase<typename JointModel::JointData> & jdata,
+		     se3::JointDataBase<typename JointModel::JointDataDerived> & jdata,
 		     const se3::Model & model,
 		     se3::Data & data,
 		     const Eigen::VectorXd & q)
@@ -60,7 +60,7 @@ namespace se3
 
     template<typename JointModel>
     static void algo(const JointModelBase<JointModel> & jmodel,
-                     JointDataBase<typename JointModel::JointData> & jdata,
+                     JointDataBase<typename JointModel::JointDataDerived> & jdata,
                      const Model & model,
                      Data & data)
     {
@@ -128,7 +128,7 @@ namespace se3
     
     template<typename JointModel>
     static void algo(const se3::JointModelBase<JointModel> & jmodel,
-                     se3::JointDataBase<typename JointModel::JointData> & jdata,
+                     se3::JointDataBase<typename JointModel::JointDataDerived> & jdata,
                      const se3::Model & model,
                      se3::Data & data,
                      const Eigen::VectorXd & q)
@@ -157,7 +157,7 @@ namespace se3
     
     template<typename JointModel>
     static void algo(const se3::JointModelBase<JointModel> & jmodel,
-                     se3::JointDataBase<typename JointModel::JointData> & jdata,
+                     se3::JointDataBase<typename JointModel::JointDataDerived> & jdata,
                      const se3::Model & model,
                      se3::Data & data)
     {
diff --git a/src/algorithm/jacobian.hxx b/src/algorithm/jacobian.hxx
index b3a54e8ff51d7084a5610684ee0da89f471732e2..f5fcbf3670bee0e68155323d744877722fe7e158 100644
--- a/src/algorithm/jacobian.hxx
+++ b/src/algorithm/jacobian.hxx
@@ -35,7 +35,7 @@ namespace se3
     
     template<typename JointModel>
     static void algo(const se3::JointModelBase<JointModel> & jmodel,
-                     se3::JointDataBase<typename JointModel::JointData> & jdata,
+                     se3::JointDataBase<typename JointModel::JointDataDerived> & jdata,
                      const se3::Model & model,
                      se3::Data & data,
                      const Eigen::VectorXd & q)
@@ -101,7 +101,7 @@ namespace se3
     
     template<typename JointModel>
     static void algo(const se3::JointModelBase<JointModel> & jmodel,
-                     se3::JointDataBase<typename JointModel::JointData> & jdata,
+                     se3::JointDataBase<typename JointModel::JointDataDerived> & jdata,
                      const se3::Model & model,
                      se3::Data & data,
                      const Eigen::VectorXd & q)
diff --git a/src/algorithm/kinematics.hxx b/src/algorithm/kinematics.hxx
index d61d1c1123e7ac6c5e0149d20882f654989c3104..eb2446dd07e32b36534a3f4451799904da32c5b5 100644
--- a/src/algorithm/kinematics.hxx
+++ b/src/algorithm/kinematics.hxx
@@ -33,7 +33,7 @@ namespace se3
     
     template<typename JointModel>
     static void algo(const se3::JointModelBase<JointModel> &,
-                     se3::JointDataBase<typename JointModel::JointData> &,
+                     se3::JointDataBase<typename JointModel::JointDataDerived> &,
                      const se3::Model &,
                      se3::Data &)
     { // do nothing
@@ -64,7 +64,7 @@ namespace se3
 
     template<typename JointModel>
     static void algo(const se3::JointModelBase<JointModel> & jmodel,
-                     se3::JointDataBase<typename JointModel::JointData> & jdata,
+                     se3::JointDataBase<typename JointModel::JointDataDerived> & jdata,
                      const se3::Model & model,
                      se3::Data & data,
                      const Eigen::VectorXd & q)
@@ -111,7 +111,7 @@ namespace se3
 
     template<typename JointModel>
     static void algo(const se3::JointModelBase<JointModel> & jmodel,
-                     se3::JointDataBase<typename JointModel::JointData> & jdata,
+                     se3::JointDataBase<typename JointModel::JointDataDerived> & jdata,
                      const se3::Model & model,
                      se3::Data & data,
                      const Eigen::VectorXd & q,
@@ -166,7 +166,7 @@ namespace se3
     
     template<typename JointModel>
     static void algo(const se3::JointModelBase<JointModel> & jmodel,
-                     se3::JointDataBase<typename JointModel::JointData> & jdata,
+                     se3::JointDataBase<typename JointModel::JointDataDerived> & jdata,
                      const se3::Model & model,
                      se3::Data & data,
                      const Eigen::VectorXd & q,
diff --git a/src/algorithm/rnea.hxx b/src/algorithm/rnea.hxx
index d0d098aa639b813b3c37402cda3d1a57f67a07f4..fe31feac12f14f1a7cb1e965b10f99840c6d8faa 100644
--- a/src/algorithm/rnea.hxx
+++ b/src/algorithm/rnea.hxx
@@ -37,7 +37,7 @@ namespace se3
 
     template<typename JointModel>
     static void algo(const se3::JointModelBase<JointModel> & jmodel,
-                     se3::JointDataBase<typename JointModel::JointData> & jdata,
+                     se3::JointDataBase<typename JointModel::JointDataDerived> & jdata,
                      const se3::Model & model,
                      se3::Data & data,
                      const Eigen::VectorXd & q,
@@ -72,7 +72,7 @@ namespace se3
 
     template<typename JointModel>
     static void algo(const JointModelBase<JointModel> & jmodel,
-                     JointDataBase<typename JointModel::JointData> & jdata,
+                     JointDataBase<typename JointModel::JointDataDerived> & jdata,
                      const Model & model,
                      Data & data)
     {
@@ -120,7 +120,7 @@ namespace se3
     
     template<typename JointModel>
     static void algo(const se3::JointModelBase<JointModel> & jmodel,
-                     se3::JointDataBase<typename JointModel::JointData> & jdata,
+                     se3::JointDataBase<typename JointModel::JointDataDerived> & jdata,
                      const se3::Model & model,
                      se3::Data & data,
                      const Eigen::VectorXd & q,
@@ -154,7 +154,7 @@ namespace se3
     
     template<typename JointModel>
     static void algo(const JointModelBase<JointModel> & jmodel,
-                     JointDataBase<typename JointModel::JointData> & jdata,
+                     JointDataBase<typename JointModel::JointDataDerived> & jdata,
                      const Model & model,
                      Data & data)
     {
diff --git a/src/multibody/joint.hpp b/src/multibody/joint.hpp
deleted file mode 100644
index cf8303790c6289b2496d2f2652792a739d8ec392..0000000000000000000000000000000000000000
--- a/src/multibody/joint.hpp
+++ /dev/null
@@ -1,39 +0,0 @@
-//
-// Copyright (c) 2015 CNRS
-//
-// This file is part of Pinocchio
-// Pinocchio is free software: you can redistribute it
-// and/or modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation, either version
-// 3 of the License, or (at your option) any later version.
-//
-// Pinocchio is distributed in the hope that it will be
-// useful, but WITHOUT ANY WARRANTY; without even the implied warranty
-// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// General Lesser Public License for more details. You should have
-// received a copy of the GNU Lesser General Public License along with
-// Pinocchio If not, see
-// <http://www.gnu.org/licenses/>.
-
-#ifndef __se3_joint_hpp__
-#define __se3_joint_hpp__
-
-#include "pinocchio/multibody/joint/joint-base.hpp"
-#include "pinocchio/multibody/joint/joint-dense.hpp"
-#include "pinocchio/multibody/joint/joint-free-flyer.hpp"
-#include "pinocchio/multibody/joint/joint-planar.hpp"
-#include "pinocchio/multibody/joint/joint-prismatic.hpp"
-#include "pinocchio/multibody/joint/joint-prismatic-unaligned.hpp"
-#include "pinocchio/multibody/joint/joint-revolute-unaligned.hpp"
-#include "pinocchio/multibody/joint/joint-revolute.hpp"
-#include "pinocchio/multibody/joint/joint-spherical-ZYX.hpp"
-#include "pinocchio/multibody/joint/joint-spherical.hpp"
-#include "pinocchio/multibody/joint/joint-translation.hpp"
-// #include "pinocchio/multibody/joint/joint-variant.hpp"
-
-namespace se3
-{
-  enum { MAX_JOINT_NV = 6 }; 
-}
-
-#endif // ifndef __se3_joint_hpp__
diff --git a/src/multibody/joint/joint-base.hpp b/src/multibody/joint/joint-base.hpp
index ca145109836e5c0a4fe15787919bff476713cecb..9a251fad2c0f3e954f09d9c871bf1cce8bbb557d 100644
--- a/src/multibody/joint/joint-base.hpp
+++ b/src/multibody/joint/joint-base.hpp
@@ -68,22 +68,22 @@ namespace se3
 
 #define SE3_JOINT_TYPEDEF_ARG(prefix)              \
    typedef int Index;                \
-   typedef prefix traits<Joint>::JointData JointData;        \
-   typedef prefix traits<Joint>::JointModel JointModel;      \
-   typedef prefix traits<Joint>::Constraint_t Constraint_t;      \
-   typedef prefix traits<Joint>::Transformation_t Transformation_t; \
-   typedef prefix traits<Joint>::Motion_t Motion_t;        \
-   typedef prefix traits<Joint>::Bias_t Bias_t;        \
-   typedef prefix traits<Joint>::F_t F_t;          \
-   typedef prefix traits<Joint>::U_t U_t;       \
-   typedef prefix traits<Joint>::D_t D_t;       \
-   typedef prefix traits<Joint>::UD_t UD_t;       \
+   typedef prefix traits<JointDerived>::JointDataDerived JointDataDerived;        \
+   typedef prefix traits<JointDerived>::JointModelDerived JointModelDerived;      \
+   typedef prefix traits<JointDerived>::Constraint_t Constraint_t;      \
+   typedef prefix traits<JointDerived>::Transformation_t Transformation_t; \
+   typedef prefix traits<JointDerived>::Motion_t Motion_t;        \
+   typedef prefix traits<JointDerived>::Bias_t Bias_t;        \
+   typedef prefix traits<JointDerived>::F_t F_t;          \
+   typedef prefix traits<JointDerived>::U_t U_t;       \
+   typedef prefix traits<JointDerived>::D_t D_t;       \
+   typedef prefix traits<JointDerived>::UD_t UD_t;       \
    enum {                  \
-    NQ = traits<Joint>::NQ,              \
-    NV = traits<Joint>::NV               \
+    NQ = traits<JointDerived>::NQ,              \
+    NV = traits<JointDerived>::NV               \
   };                        \
-  typedef prefix traits<Joint>::ConfigVector_t ConfigVector_t;        \
-  typedef prefix traits<Joint>::TangentVector_t TangentVector_t
+  typedef prefix traits<JointDerived>::ConfigVector_t ConfigVector_t;        \
+  typedef prefix traits<JointDerived>::TangentVector_t TangentVector_t
 
 #define SE3_JOINT_TYPEDEF SE3_JOINT_TYPEDEF_ARG()
 #define SE3_JOINT_TYPEDEF_TEMPLATE SE3_JOINT_TYPEDEF_ARG(typename)
@@ -92,41 +92,41 @@ namespace se3
 
 #define SE3_JOINT_TYPEDEF_NOARG()       \
   typedef int Index;            \
-  typedef traits<Joint>::JointData JointData;     \
-  typedef traits<Joint>::JointModel JointModel;     \
-  typedef traits<Joint>::Constraint_t Constraint_t;   \
-  typedef traits<Joint>::Transformation_t Transformation_t; \
-  typedef traits<Joint>::Motion_t Motion_t;     \
-  typedef traits<Joint>::Bias_t Bias_t;       \
-  typedef traits<Joint>::F_t F_t;       \
-  typedef traits<Joint>::U_t U_t;       \
-  typedef traits<Joint>::D_t D_t;       \
-  typedef traits<Joint>::UD_t UD_t;       \
+  typedef traits<JointDerived>::JointDataDerived JointDataDerived;     \
+  typedef traits<JointDerived>::JointModelDerived JointModelDerived;     \
+  typedef traits<JointDerived>::Constraint_t Constraint_t;   \
+  typedef traits<JointDerived>::Transformation_t Transformation_t; \
+  typedef traits<JointDerived>::Motion_t Motion_t;     \
+  typedef traits<JointDerived>::Bias_t Bias_t;       \
+  typedef traits<JointDerived>::F_t F_t;       \
+  typedef traits<JointDerived>::U_t U_t;       \
+  typedef traits<JointDerived>::D_t D_t;       \
+  typedef traits<JointDerived>::UD_t UD_t;       \
   enum {              \
-    NQ = traits<Joint>::NQ,         \
-    NV = traits<Joint>::NV          \
+    NQ = traits<JointDerived>::NQ,         \
+    NV = traits<JointDerived>::NV          \
   };                        \
-  typedef traits<Joint>::ConfigVector_t ConfigVector_t;        \
-  typedef traits<Joint>::TangentVector_t TangentVector_t
+  typedef traits<JointDerived>::ConfigVector_t ConfigVector_t;        \
+  typedef traits<JointDerived>::TangentVector_t TangentVector_t
 
 #define SE3_JOINT_TYPEDEF_ARG(prefix)         \
   typedef int Index;              \
-  typedef prefix traits<Joint>::JointData JointData;      \
-  typedef prefix traits<Joint>::JointModel JointModel;      \
-  typedef prefix traits<Joint>::Constraint_t Constraint_t;    \
-  typedef prefix traits<Joint>::Transformation_t Transformation_t;  \
-  typedef prefix traits<Joint>::Motion_t Motion_t;      \
-  typedef prefix traits<Joint>::Bias_t Bias_t;        \
-  typedef prefix traits<Joint>::F_t F_t;        \
-  typedef prefix traits<Joint>::U_t U_t;       \
-  typedef prefix traits<Joint>::D_t D_t;       \
-  typedef prefix traits<Joint>::UD_t UD_t;       \
+  typedef prefix traits<JointDerived>::JointDataDerived JointDataDerived;      \
+  typedef prefix traits<JointDerived>::JointModelDerived JointModelDerived;      \
+  typedef prefix traits<JointDerived>::Constraint_t Constraint_t;    \
+  typedef prefix traits<JointDerived>::Transformation_t Transformation_t;  \
+  typedef prefix traits<JointDerived>::Motion_t Motion_t;      \
+  typedef prefix traits<JointDerived>::Bias_t Bias_t;        \
+  typedef prefix traits<JointDerived>::F_t F_t;        \
+  typedef prefix traits<JointDerived>::U_t U_t;       \
+  typedef prefix traits<JointDerived>::D_t D_t;       \
+  typedef prefix traits<JointDerived>::UD_t UD_t;       \
   enum {                \
-    NQ = traits<Joint>::NQ,           \
-    NV = traits<Joint>::NV            \
+    NQ = traits<JointDerived>::NQ,           \
+    NV = traits<JointDerived>::NV            \
   };                        \
-  typedef prefix traits<Joint>::ConfigVector_t ConfigVector_t;        \
-  typedef prefix traits<Joint>::TangentVector_t TangentVector_t
+  typedef prefix traits<JointDerived>::ConfigVector_t ConfigVector_t;        \
+  typedef prefix traits<JointDerived>::TangentVector_t TangentVector_t
 
 #define SE3_JOINT_TYPEDEF SE3_JOINT_TYPEDEF_NOARG()
 #define SE3_JOINT_TYPEDEF_TEMPLATE SE3_JOINT_TYPEDEF_ARG(typename)
@@ -135,22 +135,22 @@ namespace se3
 
 #define SE3_JOINT_TYPEDEF_ARG()              \
   typedef int Index;                 \
-  typedef typename traits<Joint>::JointData JointData;         \
-  typedef typename traits<Joint>::JointModel JointModel;       \
-  typedef typename traits<Joint>::Constraint_t Constraint_t;       \
-  typedef typename traits<Joint>::Transformation_t Transformation_t; \
-  typedef typename traits<Joint>::Motion_t Motion_t;         \
-  typedef typename traits<Joint>::Bias_t Bias_t;         \
-  typedef typename traits<Joint>::F_t F_t;           \
-  typedef typename traits<Joint>::U_t U_t;       \
-  typedef typename traits<Joint>::D_t D_t;       \
-  typedef typename traits<Joint>::UD_t UD_t;       \
+  typedef typename traits<JointDerived>::JointDataDerived JointDataDerived;         \
+  typedef typename traits<JointDerived>::JointModelDerived JointModelDerived;       \
+  typedef typename traits<JointDerived>::Constraint_t Constraint_t;       \
+  typedef typename traits<JointDerived>::Transformation_t Transformation_t; \
+  typedef typename traits<JointDerived>::Motion_t Motion_t;         \
+  typedef typename traits<JointDerived>::Bias_t Bias_t;         \
+  typedef typename traits<JointDerived>::F_t F_t;           \
+  typedef typename traits<JointDerived>::U_t U_t;       \
+  typedef typename traits<JointDerived>::D_t D_t;       \
+  typedef typename traits<JointDerived>::UD_t UD_t;       \
   enum {                   \
-    NQ = traits<Joint>::NQ,              \
-    NV = traits<Joint>::NV               \
+    NQ = traits<JointDerived>::NQ,              \
+    NV = traits<JointDerived>::NV               \
   };                        \
-  typedef typename traits<Joint>::ConfigVector_t ConfigVector_t;        \
-  typedef typename traits<Joint>::TangentVector_t TangentVector_t
+  typedef typename traits<JointDerived>::ConfigVector_t ConfigVector_t;        \
+  typedef typename traits<JointDerived>::TangentVector_t TangentVector_t
 
 #define SE3_JOINT_TYPEDEF SE3_JOINT_TYPEDEF_ARG()
 #define SE3_JOINT_TYPEDEF_TEMPLATE SE3_JOINT_TYPEDEF_ARG()
@@ -158,7 +158,7 @@ namespace se3
 #endif
 
 #define SE3_JOINT_USE_INDEXES \
-  typedef JointModelBase<JointModel> Base; \
+  typedef JointModelBase<JointModelDerived> Base; \
   using Base::idx_q; \
   using Base::idx_v
 
@@ -173,25 +173,25 @@ namespace se3
     typedef _JointData Derived;
     typedef JointDataBase<_JointData> Base;
     
-    typedef typename traits<_JointData>::Joint Joint;
+    typedef typename traits<_JointData>::JointDerived JointDerived;
     SE3_JOINT_TYPEDEF_TEMPLATE;
 
-    JointData& derived() { return *static_cast<JointData*>(this); }
-    const JointData& derived() const { return *static_cast<const JointData*>(this); }
+    JointDataDerived& derived() { return *static_cast<JointDataDerived*>(this); }
+    const JointDataDerived& derived() const { return *static_cast<const JointDataDerived*>(this); }
 
-    const Constraint_t     & S() const  { return static_cast<const JointData*>(this)->S;   }
-    const Transformation_t & M() const  { return static_cast<const JointData*>(this)->M;   }
-    const Motion_t         & v() const  { return static_cast<const JointData*>(this)->v;   }
-    const Bias_t           & c() const  { return static_cast<const JointData*>(this)->c;   }
-    F_t & F()        { return static_cast<      JointData*>(this)->F; }
+    const Constraint_t     & S() const  { return static_cast<const JointDataDerived*>(this)->S;   }
+    const Transformation_t & M() const  { return static_cast<const JointDataDerived*>(this)->M;   }
+    const Motion_t         & v() const  { return static_cast<const JointDataDerived*>(this)->v;   }
+    const Bias_t           & c() const  { return static_cast<const JointDataDerived*>(this)->c;   }
+    F_t & F()        { return static_cast<      JointDataDerived*>(this)->F; }
     
     // [ABA CCRBA]
-    const U_t & U() const { return static_cast<const JointData*>(this)->U; }
-    U_t & U() { return static_cast<JointData*>(this)->U; }
-    const D_t & Dinv() const { return static_cast<const JointData*>(this)->Dinv; }
-    const UD_t & UDinv() const { return static_cast<const JointData*>(this)->UDinv; }
+    const U_t & U() const { return static_cast<const JointDataDerived*>(this)->U; }
+    U_t & U() { return static_cast<JointDataDerived*>(this)->U; }
+    const D_t & Dinv() const { return static_cast<const JointDataDerived*>(this)->Dinv; }
+    const UD_t & UDinv() const { return static_cast<const JointDataDerived*>(this)->UDinv; }
 
-    JointDataDense<NQ, NV> toDense() const  { return static_cast<const JointData*>(this)->toDense_impl();   }
+    JointDataDense<NQ, NV> toDense() const  { return static_cast<const JointDataDerived*>(this)->toDense_impl();   }
 
   }; // struct JointDataBase
 
@@ -233,25 +233,25 @@ namespace se3
   {
     typedef _JointModel Derived;
     typedef JointModelBase<_JointModel> Base;
-    typedef typename traits<_JointModel>::Joint Joint;
+    typedef typename traits<_JointModel>::JointDerived JointDerived;
     SE3_JOINT_TYPEDEF_TEMPLATE;
   
 
-    JointModel& derived() { return *static_cast<Derived*>(this); }
-    const JointModel& derived() const { return *static_cast<const Derived*>(this); }
+    JointModelDerived& derived() { return *static_cast<Derived*>(this); }
+    const JointModelDerived& derived() const { return *static_cast<const Derived*>(this); }
 
-    JointData createData() const { return derived().createData(); }
+    JointDataDerived createData() const { return derived().createData(); }
     
-    void calc(JointData& data,
+    void calc(JointDataDerived& data,
               const Eigen::VectorXd & qs ) const
     { derived().calc(data,qs); }
     
-    void calc(JointData& data,
+    void calc(JointDataDerived& data,
               const Eigen::VectorXd & qs,
               const Eigen::VectorXd & vs ) const
     { derived().calc(data,qs,vs); }
     
-    void calc_aba(JointData & data,
+    void calc_aba(JointDataDerived & data,
                   Inertia::Matrix6 & I,
                   const bool update_I = false) const
     { derived().calc_aba(data, I, update_I); }
diff --git a/src/multibody/joint/joint-basic-visitors.hxx b/src/multibody/joint/joint-basic-visitors.hxx
index 27741f1f16d1e173091d07110981807eb5ca15d7..fe490d7cee75df105802fc91359bfa2058654bed 100644
--- a/src/multibody/joint/joint-basic-visitors.hxx
+++ b/src/multibody/joint/joint-basic-visitors.hxx
@@ -59,7 +59,7 @@ namespace se3
 
     template<typename JointModel>
     static void algo(const se3::JointModelBase<JointModel> & jmodel,
-                     se3::JointDataBase<typename JointModel::JointData> & jdata,
+                     se3::JointDataBase<typename JointModel::JointDataDerived> & jdata,
                      const Eigen::VectorXd & q
                      )
     {
@@ -85,7 +85,7 @@ namespace se3
 
     template<typename JointModel>
     static void algo(const se3::JointModelBase<JointModel> & jmodel,
-                     se3::JointDataBase<typename JointModel::JointData> & jdata,
+                     se3::JointDataBase<typename JointModel::JointDataDerived> & jdata,
                      const Eigen::VectorXd & q,
                      const Eigen::VectorXd & v
                      )
@@ -113,7 +113,7 @@ namespace se3
 
     template<typename JointModel>
     static void algo(const se3::JointModelBase<JointModel> & jmodel,
-                     se3::JointDataBase<typename JointModel::JointData> & jdata,
+                     se3::JointDataBase<typename JointModel::JointDataDerived> & jdata,
                      Inertia::Matrix6 & I,
                      const bool update_I
                      )
diff --git a/src/multibody/joint/joint-dense.hpp b/src/multibody/joint/joint-dense.hpp
index 41a7bee2acc850302f5d7f938b1d1ce9062c9e8d..cc53c0070b672c78f425fa191e9c0f8852af25f2 100644
--- a/src/multibody/joint/joint-dense.hpp
+++ b/src/multibody/joint/joint-dense.hpp
@@ -30,8 +30,8 @@ namespace se3
       NQ = _NQ, // pb
       NV = _NV
     };
-    typedef JointDataDense<_NQ, _NV> JointData;
-    typedef JointModelDense<_NQ, _NV> JointModel;
+    typedef JointDataDense<_NQ, _NV> JointDataDerived;
+    typedef JointModelDense<_NQ, _NV> JointModelDerived;
     typedef ConstraintXd Constraint_t;
     typedef SE3 Transformation_t;
     typedef Motion Motion_t;
@@ -47,13 +47,13 @@ namespace se3
     typedef Eigen::Matrix<double,NV,1> TangentVector_t;
   };
 
-  template<int _NQ, int _NV> struct traits< JointDataDense<_NQ, _NV > > { typedef JointDense<_NQ,_NV > Joint; };
-  template<int _NQ, int _NV> struct traits< JointModelDense<_NQ, _NV > > { typedef JointDense<_NQ,_NV > Joint; };
+  template<int _NQ, int _NV> struct traits< JointDataDense<_NQ, _NV > > { typedef JointDense<_NQ,_NV > JointDerived; };
+  template<int _NQ, int _NV> struct traits< JointModelDense<_NQ, _NV > > { typedef JointDense<_NQ,_NV > JointDerived; };
 
   template <int _NQ, int _NV>
   struct JointDataDense : public JointDataBase< JointDataDense<_NQ, _NV > >
   {
-    typedef JointDense<_NQ, _NV > Joint;
+    typedef JointDense<_NQ, _NV > JointDerived;
     typedef JointDataBase< JointDataDense<_NQ,_NV> > Base;
     typedef JointDataDense<_NQ,_NV> Derived;
     SE3_JOINT_TYPEDEF_TEMPLATE;
@@ -109,7 +109,7 @@ namespace se3
   template <int _NQ, int _NV>
   struct JointModelDense : public JointModelBase< JointModelDense<_NQ, _NV > >
   {
-    typedef JointDense<_NQ, _NV > Joint;
+    typedef JointDense<_NQ, _NV > JointDerived;
     typedef JointModelBase<JointModelDense<_NQ, _NV > > Base;
     
     SE3_JOINT_TYPEDEF_TEMPLATE;
@@ -123,25 +123,25 @@ namespace se3
 
     int nv_dyn,nq_dyn;
     
-    JointData createData() const
+    JointDataDerived createData() const
     {
       //assert(false && "JointModelDense is read-only, should not createData");
-      return JointData();
+      return JointDataDerived();
     }
-    void calc(JointData &,
+    void calc(JointDataDerived &,
               const Eigen::VectorXd &) const
     {
       assert(false && "JointModelDense is read-only, should not perform any calc");
     }
 
-    void calc(JointData &,
+    void calc(JointDataDerived &,
               const Eigen::VectorXd &,
               const Eigen::VectorXd &) const
     {
       assert(false && "JointModelDense is read-only, should not perform any calc");
     }
     
-    void calc_aba(JointData &,
+    void calc_aba(JointDataDerived &,
                   Inertia::Matrix6 &,
                   const bool) const
     {
diff --git a/src/multibody/joint/joint-free-flyer.hpp b/src/multibody/joint/joint-free-flyer.hpp
index a405f2ffdf91365bd8dbb4234204e28427002bbd..69c4b8d0f2ea804d3ba4d28cddedb4b74112e793 100644
--- a/src/multibody/joint/joint-free-flyer.hpp
+++ b/src/multibody/joint/joint-free-flyer.hpp
@@ -142,8 +142,8 @@ namespace se3
       NQ = 7,
       NV = 6
     };
-    typedef JointDataFreeFlyer JointData;
-    typedef JointModelFreeFlyer JointModel;
+    typedef JointDataFreeFlyer JointDataDerived;
+    typedef JointModelFreeFlyer JointModelDerived;
     typedef ConstraintIdentity Constraint_t;
     typedef SE3 Transformation_t;
     typedef Motion Motion_t;
@@ -158,12 +158,12 @@ namespace se3
     typedef Eigen::Matrix<double,NQ,1> ConfigVector_t;
     typedef Eigen::Matrix<double,NV,1> TangentVector_t;
   };
-  template<> struct traits<JointDataFreeFlyer> { typedef JointFreeFlyer Joint; };
-  template<> struct traits<JointModelFreeFlyer> { typedef JointFreeFlyer Joint; };
+  template<> struct traits<JointDataFreeFlyer> { typedef JointFreeFlyer JointDerived; };
+  template<> struct traits<JointModelFreeFlyer> { typedef JointFreeFlyer JointDerived; };
 
   struct JointDataFreeFlyer : public JointDataBase<JointDataFreeFlyer>
   {
-    typedef JointFreeFlyer Joint;
+    typedef JointFreeFlyer JointDerived;
     SE3_JOINT_TYPEDEF;
 
     typedef Eigen::Matrix<double,6,6> Matrix6;
@@ -192,7 +192,7 @@ namespace se3
 
   struct JointModelFreeFlyer : public JointModelBase<JointModelFreeFlyer>
   {
-    typedef JointFreeFlyer Joint;
+    typedef JointFreeFlyer JointDerived;
     SE3_JOINT_TYPEDEF;
 
     using JointModelBase<JointModelFreeFlyer>::id;
@@ -202,8 +202,8 @@ namespace se3
     typedef Motion::Vector3 Vector3;
     typedef double Scalar_t;
 
-    JointData createData() const { return JointData(); }
-    void calc(JointData & data,
+    JointDataDerived createData() const { return JointDataDerived(); }
+    void calc(JointDataDerived & data,
               const Eigen::VectorXd & qs) const
     {
       typedef Eigen::Map<const Motion_t::Quaternion_t> ConstQuaternionMap_t;
@@ -215,7 +215,7 @@ namespace se3
       data.M.translation (q.head<3>());
     }
     
-    void calc(JointData & data,
+    void calc(JointDataDerived & data,
               const Eigen::VectorXd & qs,
               const Eigen::VectorXd & vs ) const
     {
@@ -230,7 +230,7 @@ namespace se3
       data.M.translation (q.head<3>());
     }
     
-    void calc_aba(JointData & data, Inertia::Matrix6 & I, const bool update_I) const
+    void calc_aba(JointDataDerived & data, Inertia::Matrix6 & I, const bool update_I) const
     {
       data.U = I;
       data.Dinv = I.inverse();
diff --git a/src/multibody/joint/joint-generic.hpp b/src/multibody/joint/joint-generic.hpp
index ea5d647e58e4070e2af90e50a1ba9ca792212218..1278cf05333f2bc33666b5722f8a7a62dfc20668 100644
--- a/src/multibody/joint/joint-generic.hpp
+++ b/src/multibody/joint/joint-generic.hpp
@@ -44,12 +44,12 @@ namespace se3
       NV = -1
     };
   };
-  template<> struct traits<JointDataGeneric> { typedef JointGeneric Joint; };
-  template<> struct traits<JointModelGeneric> { typedef JointGeneric Joint; };
+  template<> struct traits<JointDataGeneric> { typedef JointGeneric JointDerived; };
+  template<> struct traits<JointModelGeneric> { typedef JointGeneric JointDerived; };
 
   struct JointDataGeneric : public JointDataBase<JointDataGeneric> 
   {
-    typedef JointGeneric Joint;
+    typedef JointGeneric JointDerived;
     SE3_JOINT_TYPEDEF;
 
     Constraint_t S;
@@ -63,7 +63,7 @@ namespace se3
 
   struct JointModelGeneric : public JointModelBase<JointModelGeneric> 
   {
-    typedef JointGeneric Joint;
+    typedef JointGeneric JointDerived;
     SE3_JOINT_TYPEDEF;
     SE3_JOINT_USE_INDEXES;
 
diff --git a/src/multibody/joint/joint-planar.hpp b/src/multibody/joint/joint-planar.hpp
index 9b7667750d30f018ec2b5b3fc78919ade967e378..a7835c05d33aee34504fde485e8331f4d1ad8974 100644
--- a/src/multibody/joint/joint-planar.hpp
+++ b/src/multibody/joint/joint-planar.hpp
@@ -273,8 +273,8 @@ namespace se3
       NQ = 3,
       NV = 3
     };
-    typedef JointDataPlanar JointData;
-    typedef JointModelPlanar JointModel;
+    typedef JointDataPlanar JointDataDerived;
+    typedef JointModelPlanar JointModelDerived;
     typedef ConstraintPlanar Constraint_t;
     typedef SE3 Transformation_t;
     typedef MotionPlanar Motion_t;
@@ -289,12 +289,12 @@ namespace se3
     typedef Eigen::Matrix<double,NQ,1> ConfigVector_t;
     typedef Eigen::Matrix<double,NV,1> TangentVector_t;
   };
-  template<> struct traits<JointDataPlanar> { typedef JointPlanar Joint; };
-  template<> struct traits<JointModelPlanar> { typedef JointPlanar Joint; };
+  template<> struct traits<JointDataPlanar> { typedef JointPlanar JointDerived; };
+  template<> struct traits<JointModelPlanar> { typedef JointPlanar JointDerived; };
 
   struct JointDataPlanar : public JointDataBase<JointDataPlanar>
   {
-    typedef JointPlanar Joint;
+    typedef JointPlanar JointDerived;
     SE3_JOINT_TYPEDEF;
     
     Constraint_t S;
@@ -319,7 +319,7 @@ namespace se3
 
   struct JointModelPlanar : public JointModelBase<JointModelPlanar>
   {
-    typedef JointPlanar Joint;
+    typedef JointPlanar JointDerived;
     SE3_JOINT_TYPEDEF;
 
     using JointModelBase<JointModelPlanar>::id;
@@ -327,9 +327,9 @@ namespace se3
     using JointModelBase<JointModelPlanar>::idx_v;
     using JointModelBase<JointModelPlanar>::setIndexes;
 
-    JointData createData() const { return JointData(); }
+    JointDataDerived createData() const { return JointDataDerived(); }
 
-    void calc (JointData & data,
+    void calc (JointDataDerived & data,
                const Eigen::VectorXd & qs) const
     {
       Eigen::VectorXd::ConstFixedSegmentReturnType<NQ>::Type & q = qs.segment<NQ>(idx_q ());
@@ -341,7 +341,7 @@ namespace se3
 
     }
 
-    void calc (JointData & data,
+    void calc (JointDataDerived & data,
                const Eigen::VectorXd & qs,
                const Eigen::VectorXd & vs ) const
     {
@@ -358,7 +358,7 @@ namespace se3
       data.v.theta_dot_ = q_dot(2);
     }
     
-    void calc_aba(JointData & data, Inertia::Matrix6 & I, const bool update_I) const
+    void calc_aba(JointDataDerived & data, Inertia::Matrix6 & I, const bool update_I) const
     {
       data.U.leftCols<2> () = I.leftCols<2> ();
       data.U.rightCols<1> () = I.rightCols<1> ();
diff --git a/src/multibody/joint/joint-prismatic-unaligned.hpp b/src/multibody/joint/joint-prismatic-unaligned.hpp
index af68a5f533146cac30ef17418e7f3c89a9f68950..45f7cb5c9c559ce2cf8cf0a63f76d382185ed84f 100644
--- a/src/multibody/joint/joint-prismatic-unaligned.hpp
+++ b/src/multibody/joint/joint-prismatic-unaligned.hpp
@@ -252,8 +252,8 @@ namespace se3
         NQ = 1,
         NV = 1
       };
-      typedef JointDataPrismaticUnaligned JointData;
-      typedef JointModelPrismaticUnaligned JointModel;
+      typedef JointDataPrismaticUnaligned JointDataDerived;
+      typedef JointModelPrismaticUnaligned JointModelDerived;
       typedef ConstraintPrismaticUnaligned Constraint_t;
       typedef SE3 Transformation_t;
       typedef MotionPrismaticUnaligned Motion_t;
@@ -269,12 +269,12 @@ namespace se3
       typedef Eigen::Matrix<double,NV,1> TangentVector_t;
     };
 
-  template<> struct traits<JointDataPrismaticUnaligned> { typedef JointPrismaticUnaligned Joint; };
-  template<> struct traits<JointModelPrismaticUnaligned> { typedef JointPrismaticUnaligned Joint; };
+  template<> struct traits<JointDataPrismaticUnaligned> { typedef JointPrismaticUnaligned JointDerived; };
+  template<> struct traits<JointModelPrismaticUnaligned> { typedef JointPrismaticUnaligned JointDerived; };
 
   struct JointDataPrismaticUnaligned : public JointDataBase <JointDataPrismaticUnaligned>
   {
-    typedef JointPrismaticUnaligned Joint;
+    typedef JointPrismaticUnaligned JointDerived;
     SE3_JOINT_TYPEDEF;
 
     Transformation_t M;
@@ -311,7 +311,7 @@ namespace se3
 
   struct JointModelPrismaticUnaligned : public JointModelBase <JointModelPrismaticUnaligned>
   {
-    typedef JointPrismaticUnaligned Joint;
+    typedef JointPrismaticUnaligned JointDerived;
     SE3_JOINT_TYPEDEF;
 
     using JointModelBase<JointModelPrismaticUnaligned>::id;
@@ -334,9 +334,9 @@ namespace se3
       assert(axis.isUnitary() && "Translation axis is not unitary");
     }
 
-    JointData createData() const { return JointData(axis); }
+    JointDataDerived createData() const { return JointDataDerived(axis); }
     
-    void calc(JointData & data, const Eigen::VectorXd & qs) const
+    void calc(JointDataDerived & data, const Eigen::VectorXd & qs) const
     {
       const double & q = qs[idx_q()];
 
@@ -346,7 +346,7 @@ namespace se3
       data.M.translation() = data.S.axis * q;
     }
 
-    void calc(JointData & data,
+    void calc(JointDataDerived & data,
               const Eigen::VectorXd & qs,
               const Eigen::VectorXd & vs) const
     {
@@ -360,7 +360,7 @@ namespace se3
       data.v.v = v;
     }
     
-    void calc_aba(JointData & data, Inertia::Matrix6 & I, const bool update_I) const
+    void calc_aba(JointDataDerived & data, Inertia::Matrix6 & I, const bool update_I) const
     {
       data.U = I.block<6,3> (0,Inertia::LINEAR) * data.S.axis;
       data.Dinv[0] = 1./data.S.axis.dot(data.U.segment <3> (Inertia::LINEAR));
diff --git a/src/multibody/joint/joint-prismatic.hpp b/src/multibody/joint/joint-prismatic.hpp
index 4f85a698b7810911feafe76343ed426774446fb8..f6e1ee47eb9caa64a01f6c2202919ef5ced7c39d 100644
--- a/src/multibody/joint/joint-prismatic.hpp
+++ b/src/multibody/joint/joint-prismatic.hpp
@@ -337,8 +337,8 @@ namespace se3
       NQ = 1,
       NV = 1
     };
-    typedef JointDataPrismatic<axis> JointData;
-    typedef JointModelPrismatic<axis> JointModel;
+    typedef JointDataPrismatic<axis> JointDataDerived;
+    typedef JointModelPrismatic<axis> JointModelDerived;
     typedef ConstraintPrismatic<axis> Constraint_t;
     typedef SE3 Transformation_t;
     typedef MotionPrismatic<axis> Motion_t;
@@ -354,13 +354,13 @@ namespace se3
     typedef Eigen::Matrix<double,NV,1> TangentVector_t;
   };
 
-  template<int axis> struct traits< JointDataPrismatic<axis> > { typedef JointPrismatic<axis> Joint; };
-  template<int axis> struct traits< JointModelPrismatic<axis> > { typedef JointPrismatic<axis> Joint; };
+  template<int axis> struct traits< JointDataPrismatic<axis> > { typedef JointPrismatic<axis> JointDerived; };
+  template<int axis> struct traits< JointModelPrismatic<axis> > { typedef JointPrismatic<axis> JointDerived; };
 
   template<int axis>
   struct JointDataPrismatic : public JointDataBase< JointDataPrismatic<axis> >
   {
-    typedef JointPrismatic<axis> Joint;
+    typedef JointPrismatic<axis> JointDerived;
     SE3_JOINT_TYPEDEF_TEMPLATE;
 
     Constraint_t S;
@@ -388,7 +388,7 @@ namespace se3
   template<int axis>
   struct JointModelPrismatic : public JointModelBase< JointModelPrismatic<axis> >
   {
-    typedef JointPrismatic<axis> Joint;
+    typedef JointPrismatic<axis> JointDerived;
     SE3_JOINT_TYPEDEF_TEMPLATE;
 
     using JointModelBase<JointModelPrismatic>::id;
@@ -398,15 +398,15 @@ namespace se3
     typedef Motion::Vector3 Vector3;
     typedef double Scalar_t;
     
-    JointData createData() const { return JointData(); }
-    void calc( JointData& data, 
+    JointDataDerived createData() const { return JointDataDerived(); }
+    void calc( JointDataDerived& data, 
       const Eigen::VectorXd & qs ) const
     {
       const double & q = qs[idx_q()];
       data.M.translation(JointPrismatic<axis>::cartesianTranslation(q));
     }
 
-    void calc( JointData& data, 
+    void calc( JointDataDerived& data, 
       const Eigen::VectorXd & qs, 
       const Eigen::VectorXd & vs ) const
     {
@@ -417,7 +417,7 @@ namespace se3
       data.v.v = v;
     }
     
-    void calc_aba(JointData & data, Inertia::Matrix6 & I, const bool update_I) const
+    void calc_aba(JointDataDerived & data, Inertia::Matrix6 & I, const bool update_I) const
     {
       data.U = I.col(Inertia::LINEAR + axis);
       data.Dinv[0] = 1./I(Inertia::LINEAR + axis, Inertia::LINEAR + axis);
diff --git a/src/multibody/joint/joint-revolute-unaligned.hpp b/src/multibody/joint/joint-revolute-unaligned.hpp
index 747a55dd04addd7a5492cfb3930d67e595b3dcb9..808323bade45ad98fd3e410f7cefa020d0ca2a3d 100644
--- a/src/multibody/joint/joint-revolute-unaligned.hpp
+++ b/src/multibody/joint/joint-revolute-unaligned.hpp
@@ -257,8 +257,8 @@ namespace se3
         NV = 1
       };
       
-      typedef JointDataRevoluteUnaligned JointData;
-      typedef JointModelRevoluteUnaligned JointModel;
+      typedef JointDataRevoluteUnaligned JointDataDerived;
+      typedef JointModelRevoluteUnaligned JointModelDerived;
       typedef ConstraintRevoluteUnaligned Constraint_t;
       typedef SE3 Transformation_t;
       typedef MotionRevoluteUnaligned Motion_t;
@@ -275,12 +275,12 @@ namespace se3
       
     };
 
-  template<> struct traits<JointDataRevoluteUnaligned> { typedef JointRevoluteUnaligned Joint; };
-  template<> struct traits<JointModelRevoluteUnaligned> { typedef JointRevoluteUnaligned Joint; };
+  template<> struct traits<JointDataRevoluteUnaligned> { typedef JointRevoluteUnaligned JointDerived; };
+  template<> struct traits<JointModelRevoluteUnaligned> { typedef JointRevoluteUnaligned JointDerived; };
 
   struct JointDataRevoluteUnaligned : public JointDataBase< JointDataRevoluteUnaligned >
   {
-    typedef JointRevoluteUnaligned Joint;
+    typedef JointRevoluteUnaligned JointDerived;
     SE3_JOINT_TYPEDEF;
 
     Transformation_t M;
@@ -316,7 +316,7 @@ namespace se3
 
   struct JointModelRevoluteUnaligned : public JointModelBase< JointModelRevoluteUnaligned >
   {
-    typedef JointRevoluteUnaligned Joint;
+    typedef JointRevoluteUnaligned JointDerived;
     SE3_JOINT_TYPEDEF;
 
     using JointModelBase<JointModelRevoluteUnaligned>::id;
@@ -338,8 +338,8 @@ namespace se3
       assert(axis.isUnitary() && "Rotation axis is not unitary");
     }
 
-    JointData createData() const { return JointData(axis); }
-    void calc( JointData& data, 
+    JointDataDerived createData() const { return JointDataDerived(axis); }
+    void calc( JointDataDerived& data, 
 	       const Eigen::VectorXd & qs ) const
     {
       const double & q = qs[idx_q()];
@@ -351,7 +351,7 @@ namespace se3
       data.M.rotation(data.angleaxis.toRotationMatrix());
     }
 
-    void calc( JointData& data, 
+    void calc( JointDataDerived& data, 
 	       const Eigen::VectorXd & qs, 
 	       const Eigen::VectorXd & vs ) const
     {
@@ -366,7 +366,7 @@ namespace se3
       data.v.w = v;
     }
     
-    void calc_aba(JointData & data, Inertia::Matrix6 & I, const bool update_I) const
+    void calc_aba(JointDataDerived & data, Inertia::Matrix6 & I, const bool update_I) const
     {
       data.U = I.block<6,3> (0,Inertia::ANGULAR) * data.angleaxis.axis();
       data.Dinv[0] = 1./data.angleaxis.axis().dot(data.U.segment <3> (Inertia::ANGULAR));
diff --git a/src/multibody/joint/joint-revolute.hpp b/src/multibody/joint/joint-revolute.hpp
index 8fae95fced4e922d5838a6aeb71f0d36163670f7..52a216e68b627093ed2132a542a13ccd4c8b85b8 100644
--- a/src/multibody/joint/joint-revolute.hpp
+++ b/src/multibody/joint/joint-revolute.hpp
@@ -373,8 +373,8 @@ namespace se3
       NV = 1
     };
     
-    typedef JointDataRevolute<axis> JointData;
-    typedef JointModelRevolute<axis> JointModel;
+    typedef JointDataRevolute<axis> JointDataDerived;
+    typedef JointModelRevolute<axis> JointModelDerived;
     typedef ConstraintRevolute<axis> Constraint_t;
     typedef SE3 Transformation_t;
     typedef MotionRevolute<axis> Motion_t;
@@ -390,13 +390,13 @@ namespace se3
     typedef Eigen::Matrix<double,NV,1> TangentVector_t;
   };
 
-  template<int axis> struct traits< JointDataRevolute<axis> > { typedef JointRevolute<axis> Joint; };
-  template<int axis> struct traits< JointModelRevolute<axis> > { typedef JointRevolute<axis> Joint; };
+  template<int axis> struct traits< JointDataRevolute<axis> > { typedef JointRevolute<axis> JointDerived; };
+  template<int axis> struct traits< JointModelRevolute<axis> > { typedef JointRevolute<axis> JointDerived; };
 
   template<int axis>
   struct JointDataRevolute : public JointDataBase< JointDataRevolute<axis> >
   {
-    typedef JointRevolute<axis> Joint;
+    typedef JointRevolute<axis> JointDerived;
     SE3_JOINT_TYPEDEF_TEMPLATE;
 
     Constraint_t S;
@@ -422,7 +422,7 @@ namespace se3
   template<int axis>
   struct JointModelRevolute : public JointModelBase< JointModelRevolute<axis> >
   {
-    typedef JointRevolute<axis> Joint;
+    typedef JointRevolute<axis> JointDerived;
     SE3_JOINT_TYPEDEF_TEMPLATE;
 
     using JointModelBase<JointModelRevolute>::id;
@@ -432,15 +432,15 @@ namespace se3
     typedef Motion::Vector3 Vector3;
     typedef double Scalar_t;
     
-    JointData createData() const { return JointData(); }
-    void calc( JointData& data, 
+    JointDataDerived createData() const { return JointDataDerived(); }
+    void calc( JointDataDerived& data, 
      const Eigen::VectorXd & qs ) const
     {
       const double & q = qs[idx_q()];
       data.M.rotation(JointRevolute<axis>::cartesianRotation(q));
     }
 
-    void calc( JointData& data, 
+    void calc( JointDataDerived& data, 
      const Eigen::VectorXd & qs, 
      const Eigen::VectorXd & vs ) const
     {
@@ -451,7 +451,7 @@ namespace se3
       data.v.w = v;
     }
     
-    void calc_aba(JointData & data, Inertia::Matrix6 & I, const bool update_I) const
+    void calc_aba(JointDataDerived & data, Inertia::Matrix6 & I, const bool update_I) const
     {
       data.U = I.col(Inertia::ANGULAR + axis);
       data.Dinv[0] = 1./I(Inertia::ANGULAR + axis,Inertia::ANGULAR + axis);
diff --git a/src/multibody/joint/joint-spherical-ZYX.hpp b/src/multibody/joint/joint-spherical-ZYX.hpp
index 46fc7eb313c6504078216b01f80c8fbe103e3a1d..e57ca6db051ad13e9c6036beaebba36abccbce68 100644
--- a/src/multibody/joint/joint-spherical-ZYX.hpp
+++ b/src/multibody/joint/joint-spherical-ZYX.hpp
@@ -269,8 +269,8 @@ namespace se3
       NQ = 3,
       NV = 3
     };
-    typedef JointDataSphericalZYX JointData;
-    typedef JointModelSphericalZYX JointModel;
+    typedef JointDataSphericalZYX JointDataDerived;
+    typedef JointModelSphericalZYX JointModelDerived;
     typedef JointSphericalZYX::ConstraintRotationalSubspace Constraint_t;
     typedef SE3 Transformation_t;
     typedef JointSphericalZYX::MotionSpherical Motion_t;
@@ -285,12 +285,12 @@ namespace se3
     typedef Eigen::Matrix<double,NQ,1> ConfigVector_t;
     typedef Eigen::Matrix<double,NV,1> TangentVector_t;
   };
-  template<> struct traits<JointDataSphericalZYX> { typedef JointSphericalZYX Joint; };
-  template<> struct traits<JointModelSphericalZYX> { typedef JointSphericalZYX Joint; };
+  template<> struct traits<JointDataSphericalZYX> { typedef JointSphericalZYX JointDerived; };
+  template<> struct traits<JointModelSphericalZYX> { typedef JointSphericalZYX JointDerived; };
 
   struct JointDataSphericalZYX : public JointDataBase<JointDataSphericalZYX>
   {
-    typedef JointSphericalZYX Joint;
+    typedef JointSphericalZYX JointDerived;
     SE3_JOINT_TYPEDEF;
 
     typedef Motion::Scalar_t Scalar;
@@ -321,7 +321,7 @@ namespace se3
 
   struct JointModelSphericalZYX : public JointModelBase<JointModelSphericalZYX>
   {
-    typedef JointSphericalZYX Joint;
+    typedef JointSphericalZYX JointDerived;
     SE3_JOINT_TYPEDEF;
 
     using JointModelBase<JointModelSphericalZYX>::id;
@@ -331,9 +331,9 @@ namespace se3
     typedef Motion::Vector3 Vector3;
     typedef double Scalar_t;
 
-    JointData createData() const { return JointData(); }
+    JointDataDerived createData() const { return JointDataDerived(); }
 
-    void calc (JointData & data,
+    void calc (JointDataDerived & data,
                const Eigen::VectorXd & qs) const
     {
       Eigen::VectorXd::ConstFixedSegmentReturnType<NQ>::Type & q = qs.segment<NQ>(idx_q ());
@@ -355,7 +355,7 @@ namespace se3
       data.S.matrix () <<  -s1, 0., 1., c1 * s2, c2, 0, c1 * c2, -s2, 0;
     }
 
-    void calc (JointData & data,
+    void calc (JointDataDerived & data,
                const Eigen::VectorXd & qs,
                const Eigen::VectorXd & vs ) const
     {
@@ -386,7 +386,7 @@ namespace se3
       data.c ()(2) = -s1 * c2 * q_dot (0) * q_dot (1) - c1 * s2 * q_dot (0) * q_dot (2) - c2 * q_dot (1) * q_dot (2);
     }
     
-    void calc_aba(JointData & data, Inertia::Matrix6 & I, const bool update_I) const
+    void calc_aba(JointDataDerived & data, Inertia::Matrix6 & I, const bool update_I) const
     {
       data.U = I.middleCols<3> (Inertia::ANGULAR) * data.S.matrix();
       Inertia::Matrix3 tmp (data.S.matrix().transpose() * data.U.middleRows<3> (Inertia::ANGULAR));
diff --git a/src/multibody/joint/joint-spherical.hpp b/src/multibody/joint/joint-spherical.hpp
index 8fa9d98446970efefb050f126348041bc0ea2004..c3acc3fad6dcb30d4a29075057410d70a495d873 100644
--- a/src/multibody/joint/joint-spherical.hpp
+++ b/src/multibody/joint/joint-spherical.hpp
@@ -205,8 +205,8 @@ namespace se3
       NQ = 4,
       NV = 3
     };
-    typedef JointDataSpherical JointData;
-    typedef JointModelSpherical JointModel;
+    typedef JointDataSpherical JointDataDerived;
+    typedef JointModelSpherical JointModelDerived;
     typedef ConstraintRotationalSubspace Constraint_t;
     typedef SE3 Transformation_t;
     typedef MotionSpherical Motion_t;
@@ -221,12 +221,12 @@ namespace se3
     typedef Eigen::Matrix<double,NQ,1> ConfigVector_t;
     typedef Eigen::Matrix<double,NV,1> TangentVector_t;
   };
-  template<> struct traits<JointDataSpherical> { typedef JointSpherical Joint; };
-  template<> struct traits<JointModelSpherical> { typedef JointSpherical Joint; };
+  template<> struct traits<JointDataSpherical> { typedef JointSpherical JointDerived; };
+  template<> struct traits<JointModelSpherical> { typedef JointSpherical JointDerived; };
 
   struct JointDataSpherical : public JointDataBase<JointDataSpherical>
   {
-    typedef JointSpherical Joint;
+    typedef JointSpherical JointDerived;
     SE3_JOINT_TYPEDEF;
 
     typedef Eigen::Matrix<double,6,6> Matrix6;
@@ -255,7 +255,7 @@ namespace se3
 
   struct JointModelSpherical : public JointModelBase<JointModelSpherical>
   {
-    typedef JointSpherical Joint;
+    typedef JointSpherical JointDerived;
     SE3_JOINT_TYPEDEF;
 
     using JointModelBase<JointModelSpherical>::id;
@@ -265,9 +265,9 @@ namespace se3
     typedef Motion::Vector3 Vector3;
     typedef double Scalar_t;
 
-    JointData createData() const { return JointData(); }
+    JointDataDerived createData() const { return JointDataDerived(); }
 
-    void calc (JointData & data,
+    void calc (JointDataDerived & data,
                const Eigen::VectorXd & qs) const
     {
       typedef Eigen::Map<const Motion_t::Quaternion_t> ConstQuaternionMap_t;
@@ -278,7 +278,7 @@ namespace se3
       data.M.rotation (quat.matrix());
     }
 
-    void calc (JointData & data,
+    void calc (JointDataDerived & data,
                const Eigen::VectorXd & qs,
                const Eigen::VectorXd & vs ) const
     {
@@ -291,7 +291,7 @@ namespace se3
       data.M.rotation (quat.matrix ());
     }
     
-    void calc_aba(JointData & data, Inertia::Matrix6 & I, const bool update_I) const
+    void calc_aba(JointDataDerived & data, Inertia::Matrix6 & I, const bool update_I) const
     {
       data.U = I.block<6,3> (0,Inertia::ANGULAR);
       data.Dinv = I.block<3,3> (Inertia::ANGULAR,Inertia::ANGULAR).inverse();
diff --git a/src/multibody/joint/joint-translation.hpp b/src/multibody/joint/joint-translation.hpp
index 0d2f1f6416d233bce2a974404bbc1071be277c8a..61f0292a2bfb4a9286409c2246fe0077b3fd981a 100644
--- a/src/multibody/joint/joint-translation.hpp
+++ b/src/multibody/joint/joint-translation.hpp
@@ -219,8 +219,8 @@ namespace se3
       NQ = 3,
       NV = 3
     };
-    typedef JointDataTranslation JointData;
-    typedef JointModelTranslation JointModel;
+    typedef JointDataTranslation JointDataDerived;
+    typedef JointModelTranslation JointModelDerived;
     typedef ConstraintTranslationSubspace Constraint_t;
     typedef SE3 Transformation_t;
     typedef MotionTranslation Motion_t;
@@ -236,12 +236,12 @@ namespace se3
     typedef Eigen::Matrix<double,NV,1> TangentVector_t;
   }; // traits JointTranslation
   
-  template<> struct traits<JointDataTranslation> { typedef JointTranslation Joint; };
-  template<> struct traits<JointModelTranslation> { typedef JointTranslation Joint; };
+  template<> struct traits<JointDataTranslation> { typedef JointTranslation JointDerived; };
+  template<> struct traits<JointModelTranslation> { typedef JointTranslation JointDerived; };
 
   struct JointDataTranslation : public JointDataBase<JointDataTranslation>
   {
-    typedef JointTranslation Joint;
+    typedef JointTranslation JointDerived;
     SE3_JOINT_TYPEDEF;
 
     typedef Eigen::Matrix<double,6,6> Matrix6;
@@ -270,7 +270,7 @@ namespace se3
 
   struct JointModelTranslation : public JointModelBase<JointModelTranslation>
   {
-    typedef JointTranslation Joint;
+    typedef JointTranslation JointDerived;
     SE3_JOINT_TYPEDEF;
 
     using JointModelBase<JointModelTranslation>::id;
@@ -280,14 +280,14 @@ namespace se3
     typedef Motion::Vector3 Vector3;
     typedef double Scalar_t;
 
-    JointData createData() const { return JointData(); }
+    JointDataDerived createData() const { return JointDataDerived(); }
 
-    void calc (JointData & data,
+    void calc (JointDataDerived & data,
                const Eigen::VectorXd & qs) const
     {
       data.M.translation (qs.segment<NQ>(idx_q ()));
     }
-    void calc (JointData & data,
+    void calc (JointDataDerived & data,
                const Eigen::VectorXd & qs,
                const Eigen::VectorXd & vs ) const
     {
@@ -295,7 +295,7 @@ namespace se3
       data.v () = vs.segment<NQ> (idx_v ());
     }
     
-    void calc_aba(JointData & data, Inertia::Matrix6 & I, const bool update_I) const
+    void calc_aba(JointDataDerived & data, Inertia::Matrix6 & I, const bool update_I) const
     {
       data.U = I.block<6,3> (0,Inertia::LINEAR);
       data.Dinv = I.block<3,3> (Inertia::LINEAR,Inertia::LINEAR).inverse();
diff --git a/src/multibody/joint/joint-variant.hpp b/src/multibody/joint/joint-variant.hpp
index 9b0c22cb50804c38fe0c9401857b7d16e1507980..fc6b303e0f0f143bd34cac51899f724cbbabbf07 100644
--- a/src/multibody/joint/joint-variant.hpp
+++ b/src/multibody/joint/joint-variant.hpp
@@ -18,17 +18,30 @@
 #ifndef __se3_joint_variant_hpp__
 #define __se3_joint_variant_hpp__
 
-#include "pinocchio/multibody/joint.hpp"
+#include "pinocchio/multibody/joint/joint-base.hpp"
+#include "pinocchio/multibody/joint/joint-dense.hpp"
+#include "pinocchio/multibody/joint/joint-free-flyer.hpp"
+#include "pinocchio/multibody/joint/joint-planar.hpp"
+#include "pinocchio/multibody/joint/joint-prismatic.hpp"
+#include "pinocchio/multibody/joint/joint-prismatic-unaligned.hpp"
+#include "pinocchio/multibody/joint/joint-revolute-unaligned.hpp"
+#include "pinocchio/multibody/joint/joint-revolute.hpp"
+#include "pinocchio/multibody/joint/joint-spherical-ZYX.hpp"
+#include "pinocchio/multibody/joint/joint-spherical.hpp"
+#include "pinocchio/multibody/joint/joint-translation.hpp"
+
 #include <Eigen/StdVector>
 #include <boost/variant.hpp>
 
 namespace se3
 {
+  enum { MAX_JOINT_NV = 6 };
+
   typedef boost::variant< JointModelRX, JointModelRY, JointModelRZ, JointModelRevoluteUnaligned, JointModelSpherical, JointModelSphericalZYX, JointModelPX, JointModelPY, JointModelPZ, JointModelPrismaticUnaligned, JointModelFreeFlyer, JointModelPlanar, JointModelTranslation, JointModelDense<-1,-1> > JointModelVariant;
   typedef boost::variant< JointDataRX, JointDataRY, JointDataRZ, JointDataRevoluteUnaligned, JointDataSpherical, JointDataSphericalZYX, JointDataPX, JointDataPY, JointDataPZ, JointDataPrismaticUnaligned, JointDataFreeFlyer, JointDataPlanar, JointDataTranslation, JointDataDense<-1,-1> > JointDataVariant;
 
-  typedef std::vector<JointModelVariant> JointModelVector;
-  typedef std::vector<JointDataVariant> JointDataVector;
+  typedef std::vector<JointModelVariant> JointModelVariantVector;
+  typedef std::vector<JointDataVariant> JointDataVariantVector;
 
 
 } // namespace se3
diff --git a/src/multibody/joint/joint-accessor.hpp b/src/multibody/joint/joint.hpp
similarity index 77%
rename from src/multibody/joint/joint-accessor.hpp
rename to src/multibody/joint/joint.hpp
index ebde21386fbaa29577d7a8c9f120aee589b2d933..43a49eedd3f6acd419c59fbe71e2c7497cdaf439 100644
--- a/src/multibody/joint/joint-accessor.hpp
+++ b/src/multibody/joint/joint.hpp
@@ -15,8 +15,8 @@
 // Pinocchio If not, see
 // <http://www.gnu.org/licenses/>.
 
-#ifndef __se3_joint_accessor_hpp__
-#define __se3_joint_accessor_hpp__
+#ifndef __se3_joint_model_hpp__
+#define __se3_joint_model_hpp__
 
 #include "pinocchio/assert.hpp"
 #include "pinocchio/multibody/joint/joint-variant.hpp"
@@ -25,20 +25,20 @@
 namespace se3
 {
 
-  struct JointAccessor;
-  struct JointModelAccessor;
-  struct JointDataAccessor;
+  struct Joint;
+  struct JointModel;
+  struct JointData;
 
   template<>
-  struct traits<JointAccessor>
+  struct traits<Joint>
   {
 
     enum {
       NQ = -1, // Dynamic because unknown at compilation
       NV = -1
     };
-    typedef JointDataAccessor JointData;
-    typedef JointModelAccessor JointModel;
+    typedef JointData JointDataDerived;
+    typedef JointModel JointModelDerived;
     typedef ConstraintXd Constraint_t;
     typedef SE3 Transformation_t;
     typedef Motion Motion_t;
@@ -53,14 +53,14 @@ namespace se3
     typedef Eigen::Matrix<double,Eigen::Dynamic,1> ConfigVector_t;
     typedef Eigen::Matrix<double,Eigen::Dynamic,1> TangentVector_t;
   };
-  template<> struct traits<JointDataAccessor> { typedef JointAccessor Joint; };
-  template<> struct traits<JointModelAccessor> { typedef JointAccessor Joint; };
+  template<> struct traits<JointData> { typedef Joint JointDerived; };
+  template<> struct traits<JointModel> { typedef Joint JointDerived; };
 
-  struct JointDataAccessor : public JointDataBase<JointDataAccessor> , JointDataVariant
+  struct JointData : public JointDataBase<JointData> , JointDataVariant
   {
     typedef JointDataVariant JointDataBoostVariant;
 
-    typedef JointAccessor Joint;
+    typedef Joint JointDerived;
     SE3_JOINT_TYPEDEF;
 
     JointDataVariant& toVariant() { return *static_cast<JointDataVariant*>(this); }
@@ -78,20 +78,20 @@ namespace se3
     const UD_t              UDinv() const { return udinv_inertia(*this); }
 
 
-    JointDataAccessor() : JointDataBoostVariant() {}
-    JointDataAccessor(const JointDataVariant & jdata ) : JointDataBoostVariant(jdata){}
+    JointData() : JointDataBoostVariant() {}
+    JointData(const JointDataVariant & jdata ) : JointDataBoostVariant(jdata){}
 
   };
 
-  struct JointModelAccessor : public JointModelBase<JointModelAccessor> , JointModelVariant
+  struct JointModel : public JointModelBase<JointModel> , JointModelVariant
   {
     typedef JointModelVariant JointModelBoostVariant;
 
-    typedef JointAccessor Joint;
+    typedef Joint JointDerived;
     SE3_JOINT_TYPEDEF;
     SE3_JOINT_USE_INDEXES;
-    using JointModelBase<JointModelAccessor>::id;
-    using JointModelBase<JointModelAccessor>::setIndexes;
+    using JointModelBase<JointModel>::id;
+    using JointModelBase<JointModel>::setIndexes;
 
     JointModelVariant& toVariant() { return *static_cast<JointModelVariant*>(this); }
     const JointModelVariant& toVariant() const { return *static_cast<const JointModelVariant*>(this); }
@@ -146,18 +146,18 @@ namespace se3
       return ::se3::distance(*this, q0, q1);
     }
 
-    JointModelAccessor() : JointModelBoostVariant() {}
-    JointModelAccessor( const JointModelVariant & model_variant ) : JointModelBoostVariant(model_variant)
+    JointModel() : JointModelBoostVariant() {}
+    JointModel( const JointModelVariant & model_variant ) : JointModelBoostVariant(model_variant)
     {}
 
 
-    JointModelAccessor& operator=( const JointModelAccessor& other) 
+    JointModel& operator=( const JointModel& other) 
     {
       *this = other;
       return *this;
     }
 
-    JointModelAccessor& operator=( const JointModelVariant& other)
+    JointModel& operator=( const JointModelVariant& other)
     {
       *this = other;
       return *this;
@@ -169,7 +169,7 @@ namespace se3
       return false;
     }
     
-    bool operator == (const JointModelBase<JointModelAccessor> & jmodel) const
+    bool operator == (const JointModelBase<JointModel> & jmodel) const
     {
       return jmodel.id() == id()
           && jmodel.idx_q() == idx_q()
@@ -192,10 +192,10 @@ namespace se3
     }
   };
   
-  typedef std::vector<JointDataAccessor> JointDataAccessorVector;  
-  typedef std::vector<JointModelAccessor> JointModelAccessorVector;
+  typedef std::vector<JointData> JointDataVector;  
+  typedef std::vector<JointModel> JointModelVector;
 
 } // namespace se3
 
 
-#endif // ifndef __se3_joint_accessor_hpp__
+#endif // ifndef __se3_joint_model_hpp__
diff --git a/src/multibody/model.hpp b/src/multibody/model.hpp
index 31c0d630b20e454b8e969f77c9f5a4534a6f0d7e..a1ef547b4201722f367705aa2890058bf52ce255 100644
--- a/src/multibody/model.hpp
+++ b/src/multibody/model.hpp
@@ -26,7 +26,7 @@
 #include "pinocchio/spatial/inertia.hpp"
 #include "pinocchio/multibody/fwd.hpp"
 #include "pinocchio/multibody/frame.hpp"
-#include "pinocchio/multibody/joint/joint-accessor.hpp"
+#include "pinocchio/multibody/joint/joint.hpp"
 #include "pinocchio/tools/string-generator.hpp"
 #include <iostream>
 #include <Eigen/Cholesky>
@@ -75,7 +75,7 @@ namespace se3
     std::vector<SE3> jointPlacements;
 
     /// \brief Model of joint <i>, encapsulated in a JointModelAccessor.
-    JointModelAccessorVector joints;
+    JointModelVector joints;
     
     /// \brief Joint parent of joint <i>, denoted <li> (li==parents[i]).
     std::vector<JointIndex> parents;
@@ -393,7 +393,7 @@ namespace se3
     const Model & model;
     
     /// \brief Vector of se3::JointData associated to the se3::JointModel stored in model, encapsulated in JointDataAccessor.
-    JointDataAccessorVector joints;
+    JointDataVector joints;
     
     /// \brief Vector of joint accelerations.
     std::vector<Motion> a;
diff --git a/src/multibody/model.hxx b/src/multibody/model.hxx
index 1373073d09d176e043ec58001eed8191cc460595..93510925818dc384d524fa56c18f097287c2951b 100644
--- a/src/multibody/model.hxx
+++ b/src/multibody/model.hxx
@@ -83,7 +83,7 @@ namespace se3
 
     Model::JointIndex idx = (Model::JointIndex) (njoint ++);
 
-    joints         .push_back(JointModelAccessor(j.derived())); 
+    joints         .push_back(JointModel(j.derived())); 
     boost::get<D>(joints.back()).setIndexes(idx,nq,nv);
 
     inertias       .push_back(Inertia::Zero());
@@ -115,7 +115,7 @@ namespace se3
 
     Model::JointIndex idx = (Model::JointIndex) (njoint ++);
 
-    joints         .push_back(JointModelAccessor(j.derived())); 
+    joints         .push_back(JointModel(j.derived())); 
     boost::get<D>(joints.back()).setIndexes(idx,nq,nv);
 
     inertias       .push_back(Inertia::Zero());
diff --git a/src/multibody/visitor.hpp b/src/multibody/visitor.hpp
index c7b14f23f0e45459d762da2dd77fe79b37895aae..fb768442d7f2c3c932541fbd2465a8d34f2a0a9a 100644
--- a/src/multibody/visitor.hpp
+++ b/src/multibody/visitor.hpp
@@ -54,7 +54,7 @@ namespace se3
 
 	bf::invoke(&Visitor::template algo<D>,
 		   bf::append2(jmodel,
-			       boost::ref(boost::get<typename D::JointData>(jdataSpec)),
+			       boost::ref(boost::get<typename D::JointDataDerived>(jdataSpec)),
 			       static_cast<const Visitor*>(this)->args));
       }
 
diff --git a/src/python/joint-accessor.hpp b/src/python/joint-accessor.hpp
deleted file mode 100644
index 19b2bd9875d5fd0347049b986d961a0719475a45..0000000000000000000000000000000000000000
--- a/src/python/joint-accessor.hpp
+++ /dev/null
@@ -1,102 +0,0 @@
-//
-// Copyright (c) 2015 CNRS
-//
-// This file is part of Pinocchio
-// Pinocchio is free software: you can redistribute it
-// and/or modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation, either version
-// 3 of the License, or (at your option) any later version.
-//
-// Pinocchio is distributed in the hope that it will be
-// useful, but WITHOUT ANY WARRANTY; without even the implied warranty
-// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// General Lesser Public License for more details. You should have
-// received a copy of the GNU Lesser General Public License along with
-// Pinocchio If not, see
-// <http://www.gnu.org/licenses/>.
-
-#ifndef __se3_python_joint_accessor_hpp__
-#define __se3_python_joint_accessor_hpp__
-
-#include <eigenpy/exception.hpp>
-#include <eigenpy/eigenpy.hpp>
-#include "pinocchio/multibody/joint/joint-accessor.hpp"
-
-
-// namespace eigenpy
-// {
-//   template<>
-//   struct UnalignedEquivalentTypes<se3::JointModelAccessor>
-//   {
-//     typedef Eigen::Matrix<double, -1, 1, Eigen::DontAlign> MatrixNQd_fx;
-//     typedef Eigen::Matrix<double, -1, 1, Eigen::DontAlign> MatrixNVd_fx;
-//   };
-// } // namespace eigenpy
-
-namespace se3
-{
-  namespace python
-  {
-    namespace bp = boost::python;
-    
-    struct JointModelAccessorPythonVisitor
-      : public boost::python::def_visitor< JointModelAccessorPythonVisitor >
-    {
-      // typedef eigenpy::UnalignedEquivalentTypes<JointModelAccessor>::MatrixNQd_fx MatrixNQd_fx;
-      // typedef eigenpy::UnalignedEquivalentTypes<JointModelAccessor>::MatrixNVd_fx MatrixNVd_fx;
-
-    public:
-
-      static PyObject* convert(JointModelAccessor const& jm)
-      {
-        return boost::python::incref(boost::python::object(jm).ptr());
-      }
-
-      template<class PyClass>
-      void visit(PyClass& cl) const 
-      {
-        cl
-        .def(bp::init<>())
-        // All are add_properties cause ReadOnly
-        .add_property("id",&JointModelAccessorPythonVisitor::getId)
-        .add_property("idx_q",&JointModelAccessorPythonVisitor::getIdx_q)
-        .add_property("idx_v",&JointModelAccessorPythonVisitor::getIdx_v)
-        .add_property("nq",&JointModelAccessorPythonVisitor::getNq)
-        .add_property("nv",&JointModelAccessorPythonVisitor::getNv)
-
-        .def("setIndexes",&JointModelAccessor::setIndexes)
-        ;
-      }
-
-      static JointIndex getId( const JointModelAccessor & self ) { return self.id(); }
-      static int getIdx_q(const JointModelAccessor & self) {return self.idx_q();}
-      static int getIdx_v(const JointModelAccessor & self) {return self.idx_v();}
-      static int getNq(const JointModelAccessor & self) {return self.nq();}
-      static int getNv(const JointModelAccessor & self) {return self.nv();}
-
-      // static void setIndexes(JointModelAccessor & self, JointIndex id,
-      //                        int idx_q, int idx_v)
-      // { 
-      //   self.setIndexes(id, idx_q, idx_v);
-      // }
-
-      static void expose()
-      {
-        bp::class_<JointModelAccessor>("JointModelAccessor",
-                                       "Generic Joint Model",
-                                       bp::no_init)
-        .def(bp::init<se3::JointModelVariant>())
-        .def(JointModelAccessorPythonVisitor())
-        ;
-        
-        // bp::to_python_converter< JointModelAccessor,JointModelAccessorPythonVisitor >();
-      }
-
-    }; 
-    
-
-
-  }} // namespace se3::python
-
-#endif // ifndef __se3_python_joint_accessor_hpp__
-
diff --git a/src/python/joint.hpp b/src/python/joint.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..55a1b76c192b380e9d121c43176ee3ea754d2c8d
--- /dev/null
+++ b/src/python/joint.hpp
@@ -0,0 +1,82 @@
+//
+// Copyright (c) 2015 CNRS
+//
+// This file is part of Pinocchio
+// Pinocchio is free software: you can redistribute it
+// and/or modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation, either version
+// 3 of the License, or (at your option) any later version.
+//
+// Pinocchio is distributed in the hope that it will be
+// useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Lesser Public License for more details. You should have
+// received a copy of the GNU Lesser General Public License along with
+// Pinocchio If not, see
+// <http://www.gnu.org/licenses/>.
+
+#ifndef __se3_python_joint_hpp__
+#define __se3_python_joint_hpp__
+
+#include <eigenpy/exception.hpp>
+#include <eigenpy/eigenpy.hpp>
+#include "pinocchio/multibody/joint/joint.hpp"
+
+
+
+namespace se3
+{
+  namespace python
+  {
+    namespace bp = boost::python;
+    
+    struct JointModelPythonVisitor
+      : public boost::python::def_visitor< JointModelPythonVisitor >
+    {
+
+    public:
+
+      static PyObject* convert(JointModel const& jm)
+      {
+        return boost::python::incref(boost::python::object(jm).ptr());
+      }
+
+      template<class PyClass>
+      void visit(PyClass& cl) const 
+      {
+        cl
+        .def(bp::init<>())
+        // All are add_properties cause ReadOnly
+        .add_property("id",&JointModelPythonVisitor::getId)
+        .add_property("idx_q",&JointModelPythonVisitor::getIdx_q)
+        .add_property("idx_v",&JointModelPythonVisitor::getIdx_v)
+        .add_property("nq",&JointModelPythonVisitor::getNq)
+        .add_property("nv",&JointModelPythonVisitor::getNv)
+
+        .def("setIndexes",&JointModel::setIndexes)
+        ;
+      }
+
+      static JointIndex getId( const JointModel & self ) { return self.id(); }
+      static int getIdx_q(const JointModel & self) {return self.idx_q();}
+      static int getIdx_v(const JointModel & self) {return self.idx_v();}
+      static int getNq(const JointModel & self) {return self.nq();}
+      static int getNv(const JointModel & self) {return self.nv();}
+
+      static void expose()
+      {
+        bp::class_<JointModel>("JointModel",
+                               "Generic Joint Model",
+                               bp::no_init)
+        .def(bp::init<se3::JointModelVariant>())
+        .def(JointModelPythonVisitor())
+        ;
+        
+        // bp::to_python_converter< JointModel,JointModelPythonVisitor >();
+      }
+
+    }; 
+    
+}} // namespace se3::python
+
+#endif // ifndef __se3_python_joint_hpp__
diff --git a/src/python/model.hpp b/src/python/model.hpp
index cd5e8f24b97d6823611f3385bb05c1fbbc4a7a28..3fae0c002db9917fbb0f6f1e3811e129c3a76aca 100644
--- a/src/python/model.hpp
+++ b/src/python/model.hpp
@@ -155,7 +155,7 @@ namespace se3
       static int nbody( ModelHandler & m ) { return m->nbody; }
       static std::vector<Inertia> & inertias( ModelHandler & m ) { return m->inertias; }
       static std::vector<SE3> & jointPlacements( ModelHandler & m ) { return m->jointPlacements; }
-      static JointModelAccessorVector & joints( ModelHandler & m ) { return m->joints; }
+      static JointModelVector & joints( ModelHandler & m ) { return m->joints; }
       static std::vector<Model::JointIndex> & parents( ModelHandler & m ) { return m->parents; }
       static std::vector<std::string> & names ( ModelHandler & m ) { return m->names; }
 
diff --git a/src/python/python.cpp b/src/python/python.cpp
index ed62970bd6e7ccc4ab550e1cbf42438f9fa1336f..6586e0f1937397e1acdd0248207d59160284dc77 100644
--- a/src/python/python.cpp
+++ b/src/python/python.cpp
@@ -23,7 +23,7 @@
 #include "pinocchio/python/inertia.hpp"
 #include "pinocchio/python/joint-derived.hpp"
 #include "pinocchio/python/joints-variant.hpp"
-#include "pinocchio/python/joint-accessor.hpp"
+#include "pinocchio/python/joint.hpp"
 
 #include "pinocchio/python/frame.hpp"
 #include "pinocchio/python/model.hpp"
@@ -65,9 +65,9 @@ namespace se3
     void exposeJoints()
     {
       exposeVariants();
-      JointModelAccessorPythonVisitor::expose();
-      bp::class_< JointModelAccessorVector >("StdVec_JointModelAccessorVector")
-          .def(bp::vector_indexing_suite< JointModelAccessorVector, true >());
+      JointModelPythonVisitor::expose();
+      bp::class_< JointModelVector >("StdVec_JointModelVector")
+          .def(bp::vector_indexing_suite< JointModelVector, true >());
     }
     void exposeModel()
     {
diff --git a/unittest/CMakeLists.txt b/unittest/CMakeLists.txt
index a59f1d911062129a17098941e36bfe480df502aa..7435edfd3c989d919c75560ed771a326b0edf18e 100644
--- a/unittest/CMakeLists.txt
+++ b/unittest/CMakeLists.txt
@@ -99,5 +99,4 @@ ADD_UNIT_TEST(compute-all-terms eigen3)
 ADD_UNIT_TEST(energy eigen3)
 ADD_UNIT_TEST(frames eigen3)
 ADD_UNIT_TEST(joint-configurations eigen3)
-ADD_UNIT_TEST(joint-accessor eigen3)
-
+ADD_UNIT_TEST(joint eigen3)
diff --git a/unittest/aba.cpp b/unittest/aba.cpp
index 88c1309a2b0a39eed73d827e0bf371e167205f1e..c5c60e6a97c48577a3c5af530ec85a2ca7d4f6c0 100644
--- a/unittest/aba.cpp
+++ b/unittest/aba.cpp
@@ -18,7 +18,6 @@
 
 #include "pinocchio/spatial/fwd.hpp"
 #include "pinocchio/spatial/se3.hpp"
-#include "pinocchio/multibody/joint.hpp"
 #include "pinocchio/multibody/visitor.hpp"
 #include "pinocchio/multibody/model.hpp"
 #include "pinocchio/algorithm/aba.hpp"
diff --git a/unittest/compute-all-terms.cpp b/unittest/compute-all-terms.cpp
index bb687809b4a2c58724a8b6b776cc3677ae88333b..6577cdbd1a1468b07d8b10313b38138623eb0dc5 100644
--- a/unittest/compute-all-terms.cpp
+++ b/unittest/compute-all-terms.cpp
@@ -24,7 +24,6 @@
 
 #include "pinocchio/spatial/fwd.hpp"
 #include "pinocchio/spatial/se3.hpp"
-#include "pinocchio/multibody/joint.hpp"
 #include "pinocchio/multibody/visitor.hpp"
 #include "pinocchio/multibody/model.hpp"
 #include "pinocchio/algorithm/crba.hpp"
diff --git a/unittest/joint-accessor.cpp b/unittest/joint.cpp
similarity index 87%
rename from unittest/joint-accessor.cpp
rename to unittest/joint.cpp
index 9a31d174c02e743e1307b94dd06c76702d51fad0..8f1724f73137c43864e1a2b72b7702babdd1cef9 100644
--- a/unittest/joint-accessor.cpp
+++ b/unittest/joint.cpp
@@ -25,17 +25,17 @@
 #include "pinocchio/multibody/parser/sample-models.hpp"
 #include "pinocchio/tools/timer.hpp"
 
-#include "pinocchio/multibody/joint/joint-accessor.hpp"
+#include "pinocchio/multibody/joint/joint.hpp"
 
 #include <iostream>
 
 #define BOOST_TEST_DYN_LINK
-#define BOOST_TEST_MODULE JointAccessorTest
+#define BOOST_TEST_MODULE JointTest
 #include <boost/test/unit_test.hpp>
 #include <boost/utility/binary.hpp>
 
 template <typename T>
-void test_joint_methods (T & jmodel, typename T::JointData & jdata)
+void test_joint_methods (T & jmodel, typename T::JointDataDerived & jdata)
 {
     Eigen::VectorXd q1(Eigen::VectorXd::Random (jmodel.nq()));
     Eigen::VectorXd q1_dot(Eigen::VectorXd::Random (jmodel.nv()));
@@ -49,14 +49,14 @@ void test_joint_methods (T & jmodel, typename T::JointData & jdata)
 
 
 
-    se3::JointModelAccessor jma(jmodel);
-    se3::JointDataAccessor jda(jdata);
+    se3::JointModel jma(jmodel);
+    se3::JointData jda(jdata);
 
                                                             
     jma.calc(jda, q1, q1_dot);
     jma.calc_aba(jda, Ia, update_I); 
 
-    std::string error_prefix("Joint Model Accessor on " + T::shortname());
+    std::string error_prefix("JointModel on " + T::shortname());
     BOOST_CHECK_MESSAGE(jmodel.nq() == jma.nq() ,std::string(error_prefix + " - nq "));
     BOOST_CHECK_MESSAGE(jmodel.nv() == jma.nv() ,std::string(error_prefix + " - nv "));
 
@@ -85,14 +85,14 @@ void test_joint_methods (T & jmodel, typename T::JointData & jdata)
     BOOST_CHECK_MESSAGE((jda.UDinv()).isApprox(jdata.UDinv),std::string(error_prefix + " - Joint UDInv inertia matrix decomposition "));
 }
 
-struct TestJointAccessor{
+struct TestJoint{
 
   template <typename T>
   void operator()(const T ) const
   {
     T jmodel;
     jmodel.setIndexes(0,0,0);
-    typename T::JointData jdata = jmodel.createData();
+    typename T::JointDataDerived jdata = jmodel.createData();
 
     test_joint_methods(jmodel, jdata);    
   }
@@ -107,7 +107,7 @@ struct TestJointAccessor{
   {
     se3::JointModelRevoluteUnaligned jmodel(1.5, 1., 0.);
     jmodel.setIndexes(0,0,0);
-    se3::JointModelRevoluteUnaligned::JointData jdata = jmodel.createData();
+    se3::JointModelRevoluteUnaligned::JointDataDerived jdata = jmodel.createData();
 
     test_joint_methods(jmodel, jdata);
   }
@@ -116,7 +116,7 @@ struct TestJointAccessor{
   {
     se3::JointModelPrismaticUnaligned jmodel(1.5, 1., 0.);
     jmodel.setIndexes(0,0,0);
-    se3::JointModelPrismaticUnaligned::JointData jdata = jmodel.createData();
+    se3::JointModelPrismaticUnaligned::JointDataDerived jdata = jmodel.createData();
 
     test_joint_methods(jmodel, jdata);
   }
@@ -124,7 +124,7 @@ struct TestJointAccessor{
 };
 
 
-BOOST_AUTO_TEST_SUITE ( JointAccessorTest)
+BOOST_AUTO_TEST_SUITE ( JointTest)
 
 BOOST_AUTO_TEST_CASE ( test_all_joints )
 {
@@ -136,9 +136,8 @@ BOOST_AUTO_TEST_CASE ( test_all_joints )
   se3::Data data(model);
 
 
-  boost::mpl::for_each<JointModelVariant::types>(TestJointAccessor());
+  boost::mpl::for_each<JointModelVariant::types>(TestJoint());
 
 
 }
-BOOST_AUTO_TEST_SUITE_END ()
-
+BOOST_AUTO_TEST_SUITE_END ()
\ No newline at end of file
diff --git a/unittest/joints.cpp b/unittest/joints.cpp
index fe09c9a2d3adccf3e0a0624d62e9da96cf180688..ec1b05ab363da07bb2bd255aab25c9f9bd7bdc5c 100644
--- a/unittest/joints.cpp
+++ b/unittest/joints.cpp
@@ -635,8 +635,8 @@ BOOST_AUTO_TEST_CASE ( toJointDataDense )
 
   JointDataRX jdata = jmodel.createData();
 
-  JointDataDense< JointDataBase<JointModelRX::JointData>::NQ,
-                  JointDataBase<JointModelRX::JointData>::NV
+  JointDataDense< JointDataBase<JointModelRX::JointDataDerived>::NQ,
+                  JointDataBase<JointModelRX::JointDataDerived>::NV
                   > jdd = jdata.toDense();
 
   BOOST_CHECK(ConstraintXd(jdata.S).matrix().isApprox(jdd.S.matrix()));
diff --git a/unittest/rnea.cpp b/unittest/rnea.cpp
index a4150436995e92c0cc6f5d1c1f36bd597ae85fae..7a6e0075730a3ddf6800f41ce31fa3f596f121f0 100644
--- a/unittest/rnea.cpp
+++ b/unittest/rnea.cpp
@@ -24,7 +24,6 @@
 
 #include "pinocchio/spatial/fwd.hpp"
 #include "pinocchio/spatial/se3.hpp"
-#include "pinocchio/multibody/joint.hpp"
 #include "pinocchio/multibody/visitor.hpp"
 #include "pinocchio/multibody/model.hpp"
 #include "pinocchio/algorithm/rnea.hpp"