diff --git a/include/hpp/fcl/eigen/math_details.h b/include/hpp/fcl/eigen/math_details.h
index cd90acd71ddd2619f20c8cd101cc5c2044af12c3..3867583ddf733d01db6103caae9a868d216a8395 100644
--- a/include/hpp/fcl/eigen/math_details.h
+++ b/include/hpp/fcl/eigen/math_details.h
@@ -303,6 +303,133 @@ static inline bool equal(const eigen_wrapper_v4<T>& x, const eigen_wrapper_v4<T>
   return ((x.v - y.v).cwiseAbs ().array () < epsilon).all();
 }
 
+template <typename T>
+struct eigen_v3 :
+  Eigen::Matrix <T, 3, 1>
+{
+  typedef T meta_type;
+  typedef Eigen::Matrix <T, 3, 1> Base;
+
+  eigen_v3(void): Base () { this->setZero (); }
+
+  // This constructor allows you to construct MyVectorType from Eigen expressions
+  template<typename OtherDerived>
+    eigen_v3(const Eigen::MatrixBase<OtherDerived>& other)
+    : Base(other)
+  {}
+
+  // This method allows you to assign Eigen expressions to MyVectorType
+  template<typename OtherDerived>
+    eigen_v3& operator= (const Eigen::MatrixBase <OtherDerived>& other)
+    {
+      this->Base::operator=(other);
+      return *this;
+    }
+
+  eigen_v3(T x) :
+    Base (x, x, x)
+  {}
+
+  eigen_v3(T* x) :
+    Base (*x, *x, *x)
+  {}
+
+  eigen_v3(T x, T y, T z) :
+    Base (x, y, z)
+  {}
+
+  inline void setValue(T x, T y, T z)
+  {
+    this->operator[] (0) = x;
+    this->operator[] (1) = y;
+    this->operator[] (2) = z;
+  }
+
+  inline void setValue(T x)
+  {
+    this->setConstant (x);
+  }
+
+  inline void negate()
+  {
+    this->operator*= (-1);
+  }
+
+  template<typename OtherDerived>
+  inline eigen_v3<T>& ubound(const Eigen::MatrixBase<OtherDerived>& u)
+  {
+    *this = this->cwiseMin (u);
+    return *this;
+  }
+
+  template<typename OtherDerived>
+  inline eigen_v3<T>& lbound(const Eigen::MatrixBase<OtherDerived>& l)
+  {
+    *this = this->cwiseMax (l);
+    return *this;
+  }
+
+  // T operator [] (size_t i) const { return v[i]; }
+  // T& operator [] (size_t i) { return v[i]; }
+
+  // inline eigen_wrapper_v3<T> operator + (const eigen_wrapper_v3<T>& other) const { return eigen_wrapper_v3<T>(v + other.v); }
+  // inline eigen_wrapper_v3<T> operator - (const eigen_wrapper_v3<T>& other) const { return eigen_wrapper_v3<T>(v[0] - other.v[0], v[1] - other.v[1], v[2] - other.v[2]); }
+  // inline eigen_wrapper_v3<T> operator * (const eigen_wrapper_v3<T>& other) const { return eigen_wrapper_v3<T>(v[0] * other.v[0], v[1] * other.v[1], v[2] * other.v[2]); }
+  // inline eigen_v3<T> operator / (const eigen_v3<T>& other) const { return eigen_v3<T>(this->array().cwiseQuotient (other)); }
+  inline eigen_v3<T>& operator += (const eigen_v3<T>& other) { return static_cast<eigen_v3<T>&>(this->Base::operator+= (other)); }
+  inline eigen_v3<T>& operator -= (const eigen_v3<T>& other) { return static_cast<eigen_v3<T>&>(this->Base::operator-= (other)); }
+  inline eigen_v3<T>& operator *= (const eigen_v3<T>& other) { return static_cast<eigen_v3<T>&>(this->array().operator*=(other)); }
+  inline eigen_v3<T>& operator /= (const eigen_v3<T>& other) { return static_cast<eigen_v3<T>&>(this->array().operator/=(other)); }
+  // inline eigen_wrapper_v4<T>& operator /= (const eigen_wrapper_v4<T>& other) {  = d().cwiseQuotient (other.d()); return *this; }
+  // inline eigen_wrapper_v3<T>& operator *= (const eigen_wrapper_v3<T>& other) { return this->Base::operator*= (other); }
+  // inline eigen_wrapper_v3<T>& operator /= (const eigen_wrapper_v3<T>& other) { return this->Base::operator/= (other); }
+  // inline eigen_wrapper_v3<T> operator + (T t) const { return eigen_wrapper_v3<T>(v + t); }
+  // inline eigen_wrapper_v3<T> operator - (T t) const { return eigen_wrapper_v3<T>(v - t); }
+  // inline eigen_wrapper_v3<T> operator * (T t) const { return eigen_wrapper_v3<T>(v * t); }
+  // inline eigen_wrapper_v3<T> operator / (T t) const { return eigen_wrapper_v3<T>(v / t); }
+  inline eigen_v3<T>& operator += (T t) { this->array() += t; return *this; }
+  inline eigen_v3<T>& operator -= (T t) { this->array() -= t; return *this; }
+  inline eigen_v3<T>& operator *= (T t) { this->array() *= t; return *this; }
+  inline eigen_v3<T>& operator /= (T t) { this->array() /= t; return *this; }
+  // inline eigen_wrapper_v3<T> operator - () const { return eigen_wrapper_v3<T>(-v); }
+};
+
+
+template <typename T>
+static inline eigen_v3<T> cross_prod(const eigen_v3<T>& l, const eigen_v3<T>& r)
+{
+  return l.cross (r);
+}
+
+template <typename T>
+static inline T dot_prod3(const eigen_v3<T>& l, const eigen_v3<T>& r)
+{
+  return l.dot(r);
+}
+
+template <typename T>
+static inline eigen_v3<T> min(const eigen_v3<T>& x, const eigen_v3<T>& y)
+{
+  return x.cwiseMin (y);
+}
+
+template <typename T>
+static inline eigen_v3<T> max(const eigen_v3<T>& x, const eigen_v3<T>& y)
+{
+  return x.cwiseMax(y);
+}
+
+template <typename T>
+static inline eigen_v3<T> abs(const eigen_v3<T>& x)
+{
+  return x.cwiseAbs();
+}
+
+template <typename T>
+static inline bool equal(const eigen_v3<T>& x, const eigen_v3<T>& y, T epsilon)
+{
+  return ((x - y).cwiseAbs ().array () < epsilon).all();
+}
 
 template<typename T>
 struct eigen_wrapper_m3
@@ -474,6 +601,177 @@ eigen_wrapper_m3<T> inverse(const eigen_wrapper_m3<T>& m)
   return eigen_wrapper_m3<T> (m.m.inverse().eval ());
 }
 
+template<typename T>
+struct eigen_m3 :
+  Eigen::Matrix <T, 3, 3>
+{
+  typedef T meta_type;
+  typedef eigen_v3<T> vector_type;
+  typedef Eigen::Matrix <T, 3, 3> Base;
+
+  typedef typename Base::ColXpr ColXpr;
+  typedef typename Base::ConstColXpr ConstColXpr;
+  typedef typename Base::RowXpr RowXpr;
+  typedef typename Base::ConstRowXpr ConstRowXpr;
+
+  eigen_m3(void): Base () { }
+
+  // This constructor allows you to construct MyVectorType from Eigen expressions
+  template<typename OtherDerived>
+    eigen_m3(const Eigen::MatrixBase<OtherDerived>& other)
+    : Base(other)
+  {}
+
+  // This method allows you to assign Eigen expressions to MyVectorType
+  template<typename OtherDerived>
+    eigen_m3& operator= (const Eigen::MatrixBase <OtherDerived>& other)
+    {
+      this->Base::operator=(other);
+      return *this;
+    }
+
+  eigen_m3(T xx, T xy, T xz,
+           T yx, T yy, T yz,
+           T zx, T zy, T zz)
+  {
+    setValue(xx, xy, xz,
+             yx, yy, yz,
+             zx, zy, zz);
+  }
+
+  eigen_m3(const vector_type& v1, const vector_type& v2, const vector_type& v3)
+  {
+    this->row(1) = v1;
+    this->row(2) = v2;
+    this->row(3) = v3;
+  }
+
+  inline ColXpr getColumn(size_t i) { return this->col (i); }
+  inline RowXpr getRow(size_t i)    { return this->row (i); }
+  inline ConstColXpr getColumn(size_t i) const { return this->col (i); }
+  inline ConstRowXpr getRow(size_t i) const    { return this->row (i); }
+
+  inline eigen_m3<T>& operator *= (const eigen_m3<T>& other) { return static_cast<eigen_m3<T>&>(this->operator*=(other)); }
+  inline eigen_m3<T>& operator += (const eigen_m3<T>& other) { return static_cast<eigen_m3<T>&>(this->operator+=(other)); }
+  inline eigen_m3<T>& operator -= (const eigen_m3<T>& other) { return static_cast<eigen_m3<T>&>(this->operator-=(other)); }
+
+  inline eigen_m3<T>& operator += (T c) { return static_cast<eigen_m3<T>&>(this->operator+=(c)); }
+  inline eigen_m3<T>& operator -= (T c) { return static_cast<eigen_m3<T>&>(this->operator-=(c)); }
+  inline eigen_m3<T>& operator *= (T c) { return static_cast<eigen_m3<T>&>(this->operator*=(c)); }
+  inline eigen_m3<T>& operator /= (T c) { return static_cast<eigen_m3<T>&>(this->operator/=(c)); }
+
+  static const eigen_m3<T>& getIdentity()
+  {
+    static const eigen_m3<T> I(Base::Identity ());
+    return I;
+  }
+
+  eigen_m3<T>& transpose() { this->transposeInPlace (); return *this; }
+
+  eigen_m3<T>& inverse()
+  {
+    this->Base::operator=(this->inverse ().eval());
+    // m = m.inverse().eval();
+    return *this;
+  }
+
+  template <typename OtherDerived>
+    const Eigen::ProductReturnType<eigen_m3<T>, OtherDerived>::Type
+    transposeTimes(const Eigen::MatrixBase<OtherDerived>& other) const
+  {
+    return this->Base::transpose() * other;
+  }
+
+  template <typename OtherDerived>
+    const Eigen::ProductReturnType<eigen_m3<T>, OtherDerived>::Type
+    timesTranspose(const Eigen::MatrixBase<OtherDerived>& other) const
+  {
+    return this->operator* (other.Base::transpose());
+  }
+
+  template <typename OtherDerived>
+  inline T transposeDotX(const Eigen::MatrixBase<OtherDerived>& other) const
+  {
+    return this->col(0).dot(other);
+  }
+
+  template <typename OtherDerived>
+  inline T transposeDotY(const Eigen::MatrixBase<OtherDerived>& other) const
+  {
+    return this->col(1).dot(other);
+  }
+
+  template <typename OtherDerived>
+  inline T transposeDotZ(const Eigen::MatrixBase<OtherDerived>& other) const
+  {
+    return this->col(2).dot(other);
+  }
+
+  template <typename OtherDerived>
+  inline T transposeDot(size_t i, const Eigen::MatrixBase<OtherDerived>& other) const
+  {
+    return this->col(i).dot(other);
+  }
+
+  template <typename OtherDerived>
+  inline T dotX(const Eigen::MatrixBase<OtherDerived>& other) const
+  {
+    return this->row(0).dot(other);
+  }
+
+  template <typename OtherDerived>
+  inline T dotY(const Eigen::MatrixBase<OtherDerived>& other) const
+  {
+    return this->row(1).dot(other);
+  }
+
+  template <typename OtherDerived>
+  inline T dotZ(const Eigen::MatrixBase<OtherDerived>& other) const
+  {
+    return this->row(2).dot(other);
+  }
+
+  template <typename OtherDerived>
+  inline T dot(size_t i, const Eigen::MatrixBase<OtherDerived>& other) const
+  {
+    return this->row(i).dot(other);
+  }
+
+  inline void setValue(T xx, T xy, T xz,
+                       T yx, T yy, T yz,
+                       T zx, T zy, T zz)
+  {
+    *this << xx, xy, xz,
+             yx, yy, yz,
+             zx, zy, zz;
+  }
+
+  inline void setValue(T x)
+  {
+    this->setConstant (x);
+  }
+};
+
+
+template<typename T>
+eigen_m3<T> abs(const eigen_m3<T>& m)
+{
+  return eigen_m3<T>(m.cwiseAbs ());
+}
+
+template<typename T>
+eigen_m3<T> transpose(const eigen_m3<T>& m)
+{
+  return eigen_m3<T>(m.eigen_m3<T>::Base::transpose ());
+}
+
+
+template<typename T>
+eigen_m3<T> inverse(const eigen_m3<T>& m)
+{
+  return eigen_m3<T> (m.eigen_m3<T>::Base::inverse().eval ());
+}
+
 }
 
 }