diff --git a/src/algorithm/crba.hpp b/src/algorithm/crba.hpp
index 13ecee8fd1b9bc9649b465b585eb4dc4f6902cff..0bd17c31ddbb9c01dd70c390757425860500fc24 100644
--- a/src/algorithm/crba.hpp
+++ b/src/algorithm/crba.hpp
@@ -93,32 +93,6 @@ namespace se3
     
   } // namespace internal
 
-  template<typename D>
-  struct CrbaInternalBackwardStep : public fusion::JointVisitor<CrbaInternalBackwardStep<D> >
-  {
-    typedef boost::fusion::vector<const Model&,
-				  Data&,
-				  const Eigen::MatrixBase<D>&,
-				  const int &,
-				  const int &>  ArgsType;
-    
-    CrbaInternalBackwardStep( JointDataVariant & jdata,ArgsType args ) : jdata(jdata),args(args) {}
-    using fusion::JointVisitor< CrbaInternalBackwardStep<D> >::run;				       
-    JointDataVariant & jdata;
-    ArgsType args;
-
-    template<typename JointModel>
-    static void algo(const JointModelBase<JointModel> & jmodel,
-		     JointDataBase<typename JointModel::JointData> & jdata,
-		     const Model&,
-		     Data& data,
-		     const Eigen::MatrixBase<D> & F,
-		     const int & idx_v, const int & nv)
-    {
-      data.M.block(jmodel.idx_v(),idx_v,JointModel::nv,nv) = jdata.S().transpose()*F;
-    }
-  };
-
   struct CrbaBackwardStep : public fusion::JointVisitor<CrbaBackwardStep>
   {
     typedef boost::fusion::vector<const Model&,
@@ -142,9 +116,9 @@ namespace se3
        *   F[1:6,SUBTREE] = liXi F[1:6,SUBTREE]
        */
 
-      data.Fcrb[i].block<6,JointModel::nv>(0,jmodel.idx_v()) = data.Ycrb[i] * jdata.S();
+      data.Fcrb[i].block<6,JointModel::NV>(0,jmodel.idx_v()) = data.Ycrb[i] * jdata.S();
 
-      data.M.block(jmodel.idx_v(),jmodel.idx_v(),JointModel::nv,data.nvSubtree[i]) 
+      data.M.block(jmodel.idx_v(),jmodel.idx_v(),jmodel.nv(),data.nvSubtree[i]) 
 	= jdata.S().transpose()*data.Fcrb[i].block(0,jmodel.idx_v(),6,data.nvSubtree[i]);
 
       // std::cout << "*** joint " << i << std::endl;
diff --git a/src/multibody/constraint.hpp b/src/multibody/constraint.hpp
index 18eddb33c0cf282f81667e9c8fa8dd7cf467ab74..abb13d1e1405695a12043b5352088ae83d7a6e8f 100644
--- a/src/multibody/constraint.hpp
+++ b/src/multibody/constraint.hpp
@@ -15,21 +15,24 @@ namespace se3
   class ConstraintTpl
   { 
   public:
-    enum { nv = _Dim, Options = _Options };
+    enum { NV = _Dim, Options = _Options };
     typedef _Scalar Scalar;
 
-    typedef Eigen::Matrix<Scalar,nv,1,Options> JointMotion;
-    typedef Eigen::Matrix<Scalar,nv,1,Options> JointForce;
+    typedef Eigen::Matrix<Scalar,NV,1,Options> JointMotion;
+    typedef Eigen::Matrix<Scalar,NV,1,Options> JointForce;
     typedef MotionTpl<Scalar,Options> Motion;
     typedef ForceTpl<Scalar,Options> Force;
-    typedef Eigen::Matrix<Scalar,6,nv> DenseBase;
+    typedef Eigen::Matrix<Scalar,6,NV> DenseBase;
   public:
     template<typename D>
     ConstraintTpl( const Eigen::MatrixBase<D> & _S ) : S(_S) {}
-    //{  EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(S,_S); }
-
-    ConstraintTpl() : S() { S.fill( NAN ); } 
 
+    ConstraintTpl() : S() 
+    {
+      EIGEN_STATIC_ASSERT_FIXED_SIZE(DenseBase);
+      S.fill( NAN ); 
+    } 
+    ConstraintTpl(const int dim) : S(dim,6)     {      S.fill( NAN );     } 
 
     Motion operator* (const JointMotion& vj) const
     { return Motion(S*vj); }
@@ -47,6 +50,8 @@ namespace se3
     DenseBase & matrix() { return S; }
     const DenseBase & matrix() const { return S; }
 
+    int nv() const { return NV; }
+
   private:
     DenseBase S;
   };
diff --git a/src/multibody/joint/joint-base.hpp b/src/multibody/joint/joint-base.hpp
index 6a9cfa9d1c3f01bcd9541c11a0e1805dcc0aaacd..ba9a1f1b67f24f7138251f0a9ec8bc2cf37d695e 100644
--- a/src/multibody/joint/joint-base.hpp
+++ b/src/multibody/joint/joint-base.hpp
@@ -49,8 +49,8 @@ namespace se3
   typedef typename traits<Joint>::Bias_t Bias_t; \
   typedef typename traits<Joint>::F_t F_t; \
   enum { \
-    nq = traits<Joint>::nq, \
-    nv = traits<Joint>::nv \
+    NQ = traits<Joint>::NQ, \
+    NV = traits<Joint>::NV \
   }
 
 #define SE3_JOINT_USE_INDEXES \
@@ -93,23 +93,30 @@ namespace se3
     { return static_cast<const JointModel*>(this)->calc(data,qs,vs); }
 
   private:
-    int i_q,i_v;
+    int i_id; // ID of the joint in the multibody list.
+    int i_q;  // Index of the joint configuration in the joint configuration vector.
+    int i_v;  // Index of the joint velocity in the joint velocity vector.
+
   public:
+          int   nv()    const { return NV; }
+          int   nq()    const { return NQ; }
     const int & idx_q() const { return i_q; }
     const int & idx_v() const { return i_v; }
-    void setIndexes(int q,int v) { i_q = q; i_v = v; }
+    const int & id()    const { return i_id; }
+
+    void setIndexes(int id,int q,int v) { i_id = id, i_q = q; i_v = v; }
 
     template<typename D>
-    typename D::template ConstFixedSegmentReturnType<nv>::Type jointMotion(const Eigen::MatrixBase<D>& a) const     { return a.template segment<nv>(i_v); }
+    typename D::template ConstFixedSegmentReturnType<NV>::Type jointMotion(const Eigen::MatrixBase<D>& a) const     { return a.template segment<NV>(i_v); }
     template<typename D>
-    typename D::template FixedSegmentReturnType<nv>::Type jointMotion(Eigen::MatrixBase<D>& a) const 
-    { return a.template segment<nv>(i_v); }
+    typename D::template FixedSegmentReturnType<NV>::Type jointMotion(Eigen::MatrixBase<D>& a) const 
+    { return a.template segment<NV>(i_v); }
     template<typename D>
-    typename D::template ConstFixedSegmentReturnType<nv>::Type jointForce(const Eigen::MatrixBase<D>& tau) const 
-    { return tau.template segment<nv>(i_v); }
+    typename D::template ConstFixedSegmentReturnType<NV>::Type jointForce(const Eigen::MatrixBase<D>& tau) const 
+    { return tau.template segment<NV>(i_v); }
     template<typename D>
-    typename D::template FixedSegmentReturnType<nv>::Type jointForce(Eigen::MatrixBase<D>& tau) const 
-    { return tau.template segment<nv>(i_v); }
+    typename D::template FixedSegmentReturnType<NV>::Type jointForce(Eigen::MatrixBase<D>& tau) const 
+    { return tau.template segment<NV>(i_v); }
   };
 
 } // namespace se3
diff --git a/src/multibody/joint/joint-free-flyer.hpp b/src/multibody/joint/joint-free-flyer.hpp
index defa115ba9698f3e81d11c395e7b57e68c39e022..977cdd93f1b877b59252c88a71462f8e617700e1 100644
--- a/src/multibody/joint/joint-free-flyer.hpp
+++ b/src/multibody/joint/joint-free-flyer.hpp
@@ -66,8 +66,8 @@ namespace se3
     typedef JointFreeFlyer::BiasZero Bias_t;
     typedef Eigen::Matrix<double,6,6> F_t;
     enum {
-      nq = 7,
-      nv = 6
+      NQ = 7,
+      NV = 6
     };
   };
   template<> struct traits<JointDataFreeFlyer> { typedef JointFreeFlyer Joint; };
@@ -102,7 +102,7 @@ namespace se3
     void calc( JointData& data, 
 	       const Eigen::VectorXd & qs) const
     {
-      Eigen::VectorXd::ConstFixedSegmentReturnType<nq>::Type q = qs.segment<nq>(idx_q());
+      Eigen::VectorXd::ConstFixedSegmentReturnType<NQ>::Type q = qs.segment<NQ>(idx_q());
       JointData::Quaternion quat(Eigen::Matrix<double,4,1>(q.tail(4))); // TODO
       data.M = SE3(quat.matrix(),q.head<3>());
     }
@@ -110,8 +110,8 @@ namespace se3
 	       const Eigen::VectorXd & qs, 
 	       const Eigen::VectorXd & vs ) const
     {
-      Eigen::VectorXd::ConstFixedSegmentReturnType<nq>::Type q = qs.segment<nq>(idx_q());
-      data.v = vs.segment<nv>(idx_v());
+      Eigen::VectorXd::ConstFixedSegmentReturnType<NQ>::Type q = qs.segment<NQ>(idx_q());
+      data.v = vs.segment<NV>(idx_v());
 
       JointData::Quaternion quat(Eigen::Matrix<double,4,1>(q.tail(4))); // TODO
       data.M = SE3(quat.matrix(),q.head<3>());
diff --git a/src/multibody/joint/joint-generic.hpp b/src/multibody/joint/joint-generic.hpp
index 533b87c56e15b5d0531c2b6e38af7ac7111cd681..1bc9a198bd808e03821eae32d586cbb9586cb3cf 100644
--- a/src/multibody/joint/joint-generic.hpp
+++ b/src/multibody/joint/joint-generic.hpp
@@ -22,8 +22,8 @@ namespace se3
     typedef Motion Motion_t;
     typedef Motion Bias_t;
     enum {
-      nq = -1,
-      nv = -1
+      NQ = -1,
+      NV = -1
     };
   };
   template<> struct traits<JointDataGeneric> { typedef JointGeneric Joint; };
diff --git a/src/multibody/joint/joint-revolute.hpp b/src/multibody/joint/joint-revolute.hpp
index 804fc7afd6eaaa4d0c1762d8999411eae28a1bf8..2e898d6995bda29b034fc4849ffd06a5ae55b2a3 100644
--- a/src/multibody/joint/joint-revolute.hpp
+++ b/src/multibody/joint/joint-revolute.hpp
@@ -242,8 +242,8 @@ namespace se3
     typedef typename JointRevolute<axis>::BiasZero Bias_t;
     typedef Eigen::Matrix<double,6,1> F_t;
     enum {
-      nq = 1,
-      nv = 1
+      NQ = 1,
+      NV = 1
     };
   };
 
diff --git a/src/multibody/joint/joint-variant.hpp b/src/multibody/joint/joint-variant.hpp
index 3e7ae192f8588ec213c1f141e12c07458be0743d..311719750e16ac55ec4c837cdbe337b3de395568 100644
--- a/src/multibody/joint/joint-variant.hpp
+++ b/src/multibody/joint/joint-variant.hpp
@@ -28,7 +28,7 @@ namespace se3
   public:
     template<typename D>
     int operator()(const JointModelBase<D> & ) const
-    { return D::nv; }
+    { return D::NV; }
     
     static int run( const JointModelVariant & jmodel)
     { return boost::apply_visitor( Joint_nv(), jmodel ); }
@@ -39,7 +39,7 @@ namespace se3
   public:
     template<typename D>
     int operator()(const JointModelBase<D> & ) const
-    { return D::nq; }
+    { return D::NQ; }
     
     static int run( const JointModelVariant & jmodel)
     { return boost::apply_visitor( Joint_nq(), jmodel ); }
diff --git a/src/multibody/model.hpp b/src/multibody/model.hpp
index 8adb4ecbdb537ac33b95d6c763dcacb9a34f969b..db7493e64f2273a44f7181dac3be1bbea2bd6657 100644
--- a/src/multibody/model.hpp
+++ b/src/multibody/model.hpp
@@ -131,20 +131,20 @@ namespace se3
   {
     assert( (nbody==(int)joints.size())&&(nbody==(int)inertias.size())
 	    &&(nbody==(int)parents.size())&&(nbody==(int)jointPlacements.size()) );
-    assert( (j.nq>=0)&&(j.nv>=0) );
+    assert( (j.nq()>=0)&&(j.nv()>=0) );
 
     Index idx = nbody ++;
 
     joints         .push_back(j.derived()); 
-    boost::get<D&>(joints.back()).setIndexes(nq,nv);
+    boost::get<D&>(joints.back()).setIndexes(idx,nq,nv);
 
     inertias       .push_back(Y);
     parents        .push_back(parent);
     jointPlacements.push_back(placement);
     names          .push_back( (name!="")?name:random(8) );
 
-    nq += j.nq;
-    nv += j.nv;
+    nq += j.nq();
+    nv += j.nv();
     return idx;
   }
   Model::Index Model::getBodyId( const std::string & name ) const
diff --git a/unittest/crba.cpp b/unittest/crba.cpp
index 69a818aa4e6d93aa2201d446f30e8f698e24a7e1..e8e6c7893273e4b8e96e939cf2a504665538dadf 100644
--- a/unittest/crba.cpp
+++ b/unittest/crba.cpp
@@ -36,31 +36,7 @@ int main(int argc, const char ** argv)
   if(argc>1) filename = argv[1];
   model = se3::buildModel(filename,argc>1);
 
-
-  // SIMPLE no FF
-  // model.addBody(model.getBodyId("universe"),JointModelRX(),SE3(I3,SE3::Vector3::Random()),Inertia::Random(),"rleg1");
-  // model.addBody(model.getBodyId("rleg1"),JointModelRX(),SE3(I3,SE3::Vector3::Random()),Inertia::Random(),"rleg2");
-  // model.addBody(model.getBodyId("rleg2"),JointModelRX(),SE3(I3,SE3::Vector3::Random()),Inertia::Random(),"rleg3");
-
-  // model.addBody(model.getBodyId("universe"),JointModelRX(),SE3(I3,SE3::Vector3::Random()),Inertia::Random(),"lleg1");
-  // model.addBody(model.getBodyId("lleg1"),JointModelRX(),SE3(I3,SE3::Vector3::Random()),Inertia::Random(),"lleg2");
-  // model.addBody(model.getBodyId("lleg2"),JointModelRX(),SE3(I3,SE3::Vector3::Random()),Inertia::Random(),"lleg3");
-
-
-  //SIMPLE with FF
-  // model.addBody(model.getBodyId("universe"),JointModelFreeFlyer(),SE3(I3,SE3::Vector3::Random()),Inertia::Random(),"root");
-
-  // model.addBody(model.getBodyId("root"),JointModelRX(),SE3(I3,SE3::Vector3::Random()),Inertia::Random(),"rleg1");
-  // model.addBody(model.getBodyId("rleg1"),JointModelRX(),SE3(I3,SE3::Vector3::Random()),Inertia::Random(),"rleg2");
-  // model.addBody(model.getBodyId("rleg2"),JointModelRX(),SE3(I3,SE3::Vector3::Random()),Inertia::Random(),"rleg3");
-
-  // model.addBody(model.getBodyId("root"),JointModelRX(),SE3(I3,SE3::Vector3::Random()),Inertia::Random(),"lleg1");
-  // model.addBody(model.getBodyId("lleg1"),JointModelRX(),SE3(I3,SE3::Vector3::Random()),Inertia::Random(),"lleg2");
-  // model.addBody(model.getBodyId("lleg2"),JointModelRX(),SE3(I3,SE3::Vector3::Random()),Inertia::Random(),"lleg3");
-
-
   se3::Data data(model);
-
   VectorXd q = VectorXd::Zero(model.nq);
  
   StackTicToc timer(StackTicToc::US); timer.tic();