diff --git a/Eigen/Geometry b/Eigen/Geometry
index 429dc2a..5e73ce9 100644
--- a/Eigen/Geometry
+++ b/Eigen/Geometry
@@ -5,7 +5,16 @@
 
 namespace Eigen {
 
-/** \defgroup Geometry */
+/** \defgroup Geometry
+  * This module provides support for:
+  *  - fixed-size homogeneous transformations
+  *  - 2D and 3D rotations
+  *  - \ref MatrixBase::cross() "cross product"
+  * 
+  * \code
+  * #include <Eigen/Geometry>
+  * \endcode
+  */
 
 #include "src/Geometry/Cross.h"
 #include "src/Geometry/Quaternion.h"
diff --git a/Eigen/src/Cholesky/Cholesky.h b/Eigen/src/Cholesky/Cholesky.h
index c1f05d7..dd4fc6e 100644
--- a/Eigen/src/Cholesky/Cholesky.h
+++ b/Eigen/src/Cholesky/Cholesky.h
@@ -42,7 +42,7 @@
   * Note that during the decomposition, only the upper triangular part of A is considered. Therefore,
   * the strict lower part does not have to store correct values.
   *
-  * \sa class CholeskyWithoutSquareRoot
+  * \sa MatrixBase::cholesky(), class CholeskyWithoutSquareRoot
   */
 template<typename MatrixType> class Cholesky
 {
@@ -107,20 +107,22 @@
   }
 }
 
-/** \returns the solution of A x = \a b using the current decomposition of A.
-  * In other words, it returns \code A^-1 b \endcode computing
-  * \code L^-*  L^1 b \endcode from right to left.
+/** \returns the solution of \f$ A x = b \f$ using the current decomposition of A.
+  * In other words, it returns \f$ A^{-1} b \f$ computing
+  * \f$ {L^{*}}^{-1} L^{-1} b \f$ from right to left.
+  * \param b the column vector \f$ b \f$, which can also be a matrix.
   *
   * Example: \include Cholesky_solve.cpp
   * Output: \verbinclude Cholesky_solve.out
   *
+  * \sa MatrixBase::cholesky(), CholeskyWithoutSquareRoot::solve()
   */
 template<typename MatrixType>
 template<typename Derived>
 typename Derived::Eval Cholesky<MatrixType>::solve(const MatrixBase<Derived> &b) const
 {
   const int size = m_matrix.rows();
-  ei_assert(size==b.size());
+  ei_assert(size==b.rows());
 
   return m_matrix.adjoint().template extract<Upper>().inverseProduct(matrixL().inverseProduct(b));
 }
diff --git a/Eigen/src/Cholesky/CholeskyWithoutSquareRoot.h b/Eigen/src/Cholesky/CholeskyWithoutSquareRoot.h
index 2d85f78..2572b88 100644
--- a/Eigen/src/Cholesky/CholeskyWithoutSquareRoot.h
+++ b/Eigen/src/Cholesky/CholeskyWithoutSquareRoot.h
@@ -32,8 +32,8 @@
   * \param MatrixType the type of the matrix of which we are computing the Cholesky decomposition
   *
   * This class performs a Cholesky decomposition without square root of a symmetric, positive definite
-  * matrix A such that A = L D L^* = U^* D U, where L is lower triangular with a unit diagonal and D is a diagonal
-  * matrix.
+  * matrix A such that A = L D L^* = U^* D U, where L is lower triangular with a unit diagonal
+  * and D is a diagonal matrix.
   *
   * Compared to a standard Cholesky decomposition, avoiding the square roots allows for faster and more
   * stable computation.
@@ -41,7 +41,7 @@
   * Note that during the decomposition, only the upper triangular part of A is considered. Therefore,
   * the strict lower part does not have to store correct values.
   *
-  * \sa class Cholesky
+  * \sa MatrixBase::choleskyNoSqrt(), class Cholesky
   */
 template<typename MatrixType> class CholeskyWithoutSquareRoot
 {
@@ -123,19 +123,23 @@
 /** \returns the solution of \f$ A x = b \f$ using the current decomposition of A.
   * In other words, it returns \f$ A^{-1} b \f$ computing
   * \f$ {L^{*}}^{-1} D^{-1} L^{-1} b \f$ from right to left.
-  * \param vecB the vector \f$ b \f$  (or an array of vectors)
+  * \param b the column vector \f$ b \f$, which can also be a matrix.
+  *
+  * See Cholesky::solve() for a example.
+  * 
+  * \sa MatrixBase::choleskyNoSqrt()
   */
 template<typename MatrixType>
 template<typename Derived>
-typename Derived::Eval CholeskyWithoutSquareRoot<MatrixType>::solve(const MatrixBase<Derived> &vecB) const
+typename Derived::Eval CholeskyWithoutSquareRoot<MatrixType>::solve(const MatrixBase<Derived> &b) const
 {
   const int size = m_matrix.rows();
-  ei_assert(size==vecB.size());
+  ei_assert(size==b.rows());
 
   return m_matrix.adjoint().template extract<UnitUpper>()
     .inverseProduct(
       (matrixL()
-        .inverseProduct(vecB))
+        .inverseProduct(b))
         .cwise()/m_matrix.diagonal()
       );
 }
diff --git a/Eigen/src/Core/InverseProduct.h b/Eigen/src/Core/InverseProduct.h
index 57dbf75..0ee54a3 100755
--- a/Eigen/src/Core/InverseProduct.h
+++ b/Eigen/src/Core/InverseProduct.h
@@ -72,9 +72,9 @@
   }
 }
 
-/** \returns the product of the inverse of \c *this with \a other.
+/** \returns the product of the inverse of \c *this with \a other, \a *this being triangular.
   *
-  * This function computes the inverse-matrix matrix product inverse(\c*this) * \a other
+  * This function computes the inverse-matrix matrix product inverse(\c *this) * \a other
   * It works as a forward (resp. backward) substitution if \c *this is an upper (resp. lower)
   * triangular matrix.
   *
diff --git a/Eigen/src/Core/Matrix.h b/Eigen/src/Core/Matrix.h
index 92988b7..85a9849 100644
--- a/Eigen/src/Core/Matrix.h
+++ b/Eigen/src/Core/Matrix.h
@@ -71,6 +71,8 @@
   * \li \c VectorXf is a typedef for \c Matrix<float,Dynamic,1>
   * \li \c RowVector3i is a typedef for \c Matrix<int,1,3>
   *
+  * See \ref matrixtypedefs for an explicit list of all matrix typedefs.
+  *
   * Of course these typedefs do not exhaust all the possibilities offered by the Matrix class
   * template, they only address some of the most common cases. For instance, if you want a
   * fixed-size matrix with 3 rows and 5 columns, there is no typedef for that, so you should use
@@ -355,9 +357,18 @@
     }
 };
 
-#define EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, Size, SizeSuffix) \
-typedef Matrix<Type, Size, Size> Matrix##SizeSuffix##TypeSuffix; \
-typedef Matrix<Type, Size, 1>    Vector##SizeSuffix##TypeSuffix; \
+/** \defgroup matrixtypedefs Global matrix typedefs
+  * Eigen defines several typedef shortcuts for most common matrix types.
+  * Here is the explicit list.
+  * \sa class Matrix
+  */
+
+#define EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, Size, SizeSuffix)   \
+/** \ingroup matrixtypedefs */                                    \
+typedef Matrix<Type, Size, Size> Matrix##SizeSuffix##TypeSuffix;  \
+/** \ingroup matrixtypedefs */                                    \
+typedef Matrix<Type, Size, 1>    Vector##SizeSuffix##TypeSuffix;  \
+/** \ingroup matrixtypedefs */                                    \
 typedef Matrix<Type, 1, Size>    RowVector##SizeSuffix##TypeSuffix;
 
 #define EIGEN_MAKE_TYPEDEFS_ALL_SIZES(Type, TypeSuffix) \
diff --git a/Eigen/src/Core/Part.h b/Eigen/src/Core/Part.h
index eb8dcbb..a055392 100644
--- a/Eigen/src/Core/Part.h
+++ b/Eigen/src/Core/Part.h
@@ -106,9 +106,9 @@
     if(Mode == SelfAdjoint)
     {
       if(row == col)
-	dst.coeffRef(row, col) = ei_real(src.coeff(row, col));
+        dst.coeffRef(row, col) = ei_real(src.coeff(row, col));
       else if(row < col)
-	dst.coeffRef(col, row) = ei_conj(dst.coeffRef(row, col) = src.coeff(row, col));
+        dst.coeffRef(col, row) = ei_conj(dst.coeffRef(row, col) = src.coeff(row, col));
     }
     else
     {
@@ -116,7 +116,7 @@
       || (Mode == Lower && row >= col)
       || (Mode == StrictlyUpper && row < col)
       || (Mode == StrictlyLower && row > col))
-	dst.coeffRef(row, col) = src.coeff(row, col);
+        dst.coeffRef(row, col) = src.coeff(row, col);
     }
   }
 };
@@ -262,6 +262,8 @@
   * The \a Mode parameter can have the following values: \c Upper, \c StrictlyUpper, \c Lower,
   * \c StrictlyLower, \c SelfAdjoint.
   *
+  * \addexample PartExample \label How to write to a triangular part of a matrix
+  *
   * Example: \include MatrixBase_part.cpp
   * Output: \verbinclude MatrixBase_part.out
   *
diff --git a/Eigen/src/Core/Visitor.h b/Eigen/src/Core/Visitor.h
index 18e90ca..041aa94 100644
--- a/Eigen/src/Core/Visitor.h
+++ b/Eigen/src/Core/Visitor.h
@@ -76,6 +76,9 @@
   * };
   * \endcode
   *
+  * \note compared to one or two \em for \em loops, visitors offer automatic
+  * unrolling for small fixed size matrix.
+  *
   * \sa minCoeff(int*,int*), maxCoeff(int*,int*), MatrixBase::redux()
   */
 template<typename Derived>
diff --git a/Eigen/src/Core/util/Constants.h b/Eigen/src/Core/util/Constants.h
index 7e2d37d..24c653e 100644
--- a/Eigen/src/Core/util/Constants.h
+++ b/Eigen/src/Core/util/Constants.h
@@ -28,9 +28,7 @@
 
 const int Dynamic = 10000;
 
-/** \defgroup flags */
-
-/** \name flags
+/** \defgroup flags
   *
   * These are the possible bits which can be OR'ed to constitute the flags of a matrix or
   * expression.
diff --git a/Eigen/src/Geometry/AngleAxis.h b/Eigen/src/Geometry/AngleAxis.h
index 647e075..ca53140 100644
--- a/Eigen/src/Geometry/AngleAxis.h
+++ b/Eigen/src/Geometry/AngleAxis.h
@@ -64,10 +64,15 @@
 
 public:
 
+  /** Default constructor without initialization. */
   AngleAxis() {}
+  /** Constructs and initialize the angle-axis rotation from an \a angle in radian
+    * and an \a axis which must be normalized. */
   template<typename Derived>
   inline AngleAxis(Scalar angle, const MatrixBase<Derived>& axis) : m_axis(axis), m_angle(angle) {}
+  /** Constructs and initialize the angle-axis rotation from a quaternion \a q. */
   inline AngleAxis(const QuaternionType& q) { *this = q; }
+  /** Constructs and initialize the angle-axis rotation from a 3x3 rotation matrix. */
   template<typename Derived>
   inline AngleAxis(const MatrixBase<Derived>& m) { *this = m; }
 
@@ -77,6 +82,8 @@
   const Vector3& axis() const { return m_axis; }
   Vector3& axis() { return m_axis; }
 
+  /** Automatic conversion to a 3x3 rotation matrix.
+    * \sa toRotationMatrix() */
   operator Matrix3 () const { return toRotationMatrix(); }
 
   inline QuaternionType operator* (const AngleAxis& other) const
@@ -105,7 +112,11 @@
   Matrix3 toRotationMatrix(void) const;
 };
 
+/** \ingroup Geometry
+  * single precision angle-axis type */
 typedef AngleAxis<float> AngleAxisf;
+/** \ingroup Geometry
+  * double precision angle-axis type */
 typedef AngleAxis<double> AngleAxisd;
 
 /** Set \c *this from a quaternion.
diff --git a/Eigen/src/Geometry/Quaternion.h b/Eigen/src/Geometry/Quaternion.h
index 1d31e2f..ab6994b 100644
--- a/Eigen/src/Geometry/Quaternion.h
+++ b/Eigen/src/Geometry/Quaternion.h
@@ -38,13 +38,12 @@
   *
   * \param _Scalar the scalar type, i.e., the type of the coefficients
   *
-  * This class represents a quaternion that is a convenient representation of
-  * orientations and rotations of objects in three dimensions. Compared to other
-  * representations like Euler angles or 3x3 matrices, quatertions offer the
-  * following advantages:
-  * \li \c compact storage (4 scalars)
-  * \li \c efficient to compose (28 flops),
-  * \li \c stable spherical interpolation
+  * This class represents a quaternion \f$ w+xi+yj+zk \f$ that is a convenient representation of
+  * orientations and rotations of objects in three dimensions. Compared to other representations
+  * like Euler angles or 3x3 matrices, quatertions offer the following advantages:
+  * \li \b compact storage (4 scalars)
+  * \li \b efficient to compose (28 flops),
+  * \li \b stable spherical interpolation
   *
   * The following two typedefs are provided for convenience:
   * \li \c Quaternionf for \c float
@@ -63,18 +62,29 @@
   /** the scalar type of the coefficients */
   typedef _Scalar Scalar;
 
+  /** the type of a 3D vector */
   typedef Matrix<Scalar,3,1> Vector3;
+  /** the equivalent rotation matrix type */
   typedef Matrix<Scalar,3,3> Matrix3;
+  /** the equivalent angle-axis type */
   typedef AngleAxis<Scalar> AngleAxisType;
 
+  /** \returns the \c x coefficient */
   inline Scalar x() const { return m_coeffs.coeff(0); }
+  /** \returns the \c y coefficient */
   inline Scalar y() const { return m_coeffs.coeff(1); }
+  /** \returns the \c z coefficient */
   inline Scalar z() const { return m_coeffs.coeff(2); }
+  /** \returns the \c w coefficient */
   inline Scalar w() const { return m_coeffs.coeff(3); }
 
+  /** \returns a reference to the \c x coefficient */
   inline Scalar& x() { return m_coeffs.coeffRef(0); }
+  /** \returns a reference to the \c y coefficient */
   inline Scalar& y() { return m_coeffs.coeffRef(1); }
+  /** \returns a reference to the \c z coefficient */
   inline Scalar& z() { return m_coeffs.coeffRef(2); }
+  /** \returns a reference to the \c w coefficient */
   inline Scalar& w() { return m_coeffs.coeffRef(3); }
 
   /** \returns a read-only vector expression of the imaginary part (x,y,z) */
@@ -83,25 +93,33 @@
   /** \returns a vector expression of the imaginary part (x,y,z) */
   inline Block<Coefficients,3,1> vec() { return m_coeffs.template start<3>(); }
 
-  /** \returns a read-only vector expression of the coefficients */
+  /** \returns a read-only vector expression of the coefficients (x,y,z,w) */
   inline const Coefficients& coeffs() const { return m_coeffs; }
 
-  /** \returns a vector expression of the coefficients */
+  /** \returns a vector expression of the coefficients (x,y,z,w) */
   inline Coefficients& coeffs() { return m_coeffs; }
 
+  /** Default constructor and initializing an identity quaternion. */
+  inline Quaternion()
+  { m_coeffs << 0, 0, 0, 1; }
+
+  /** Constructs and initializes the quaternion \f$ w+xi+yj+zk \f$ from
+    * its four coefficients \a w, \a x, \a y and \a z.
+    */
   // FIXME what is the prefered order: w x,y,z or x,y,z,w ?
-  inline Quaternion(Scalar w = 1.0, Scalar x = 0.0, Scalar y = 0.0, Scalar z = 0.0)
-  {
-    m_coeffs.coeffRef(0) = x;
-    m_coeffs.coeffRef(1) = y;
-    m_coeffs.coeffRef(2) = z;
-    m_coeffs.coeffRef(3) = w;
-  }
+  inline Quaternion(Scalar w, Scalar x, Scalar y, Scalar z)
+  { m_coeffs << x, y, z, w; }
 
   /** Copy constructor */
   inline Quaternion(const Quaternion& other) { m_coeffs = other.m_coeffs; }
 
+  /** Constructs and initializes a quaternion from the angle-axis \a aa */
   explicit inline Quaternion(const AngleAxisType& aa) { *this = aa; }
+  /** Constructs and initializes a quaternion from either:
+    *  - a rotation matrix expression,
+    *  - a 4D vector expression representing quaternion coefficients.
+    * \sa operator=(MatrixBase<Derived>)
+    */
   template<typename Derived>
   explicit inline Quaternion(const MatrixBase<Derived>& other) { *this = other; }
 
@@ -110,6 +128,7 @@
   template<typename Derived>
   Quaternion& operator=(const MatrixBase<Derived>& m);
 
+  /** Automatic conversion to a rotation matrix. */
   operator Matrix3 () const { return toRotationMatrix(); }
 
   /** \returns a quaternion representing an identity rotation
@@ -149,7 +168,11 @@
 
 };
 
+/** \ingroup Geometry
+  * single precision quaternion type */
 typedef Quaternion<float> Quaternionf;
+/** \ingroup Geometry
+  * double precision quaternion type */
 typedef Quaternion<double> Quaterniond;
 
 /** \returns the concatenation of two rotations as a quaternion-quaternion product */
@@ -165,6 +188,7 @@
   );
 }
 
+/** \sa operator*(Quaternion) */
 template <typename Scalar>
 inline Quaternion<Scalar>& Quaternion<Scalar>::operator*= (const Quaternion& other)
 {
@@ -200,8 +224,7 @@
   return *this;
 }
 
-/** Set \c *this from an angle-axis \a aa
-  * and returns a reference to \c *this
+/** Set \c *this from an angle-axis \a aa and returns a reference to \c *this
   */
 template<typename Scalar>
 inline Quaternion<Scalar>& Quaternion<Scalar>::operator=(const AngleAxisType& aa)
diff --git a/Eigen/src/Geometry/Rotation.h b/Eigen/src/Geometry/Rotation.h
index e0855b7..a98ed06 100644
--- a/Eigen/src/Geometry/Rotation.h
+++ b/Eigen/src/Geometry/Rotation.h
@@ -28,7 +28,7 @@
 // this file aims to contains the various representations of rotation/orientation
 // in 2D and 3D space excepted Matrix and Quaternion.
 
-/** \geometry_module
+/** \internal
   *
   * \class ToRotationMatrix
   *
@@ -103,7 +103,7 @@
   }
 };
 
-/** \geometry_module
+/** \geometry_module \ingroup Geometry
   *
   * \class Rotation2D
   *
@@ -111,10 +111,10 @@
   *
   * \param _Scalar the scalar type, i.e., the type of the coefficients
   *
-  * This class is equivalent to a single scalar representing the rotation angle
-  * in radian with some additional features such as the conversion from/to
-  * rotation matrix. Moreover this class aims to provide a similar interface
-  * to Quaternion in order to facilitate the writing of generic algorithm
+  * This class is equivalent to a single scalar representing a counter clock wise rotation
+  * as a single angle in radian. It provides some additional features such as the automatic
+  * conversion from/to a 2x2 rotation matrix. Moreover this class aims to provide a similar
+  * interface to Quaternion in order to facilitate the writing of generic algorithm
   * dealing with rotations.
   *
   * \sa class Quaternion, class Transform
@@ -134,16 +134,22 @@
 
 public:
 
+  /** Construct a 2D counter clock wise rotation from the angle \a a in radian. */
   inline Rotation2D(Scalar a) : m_angle(a) {}
   inline operator Scalar& () { return m_angle; }
   inline operator Scalar () const { return m_angle; }
 
+  /** Automatic convertion to a 2D rotation matrix.
+    * \sa toRotationMatrix()
+    */
+  inline operator Matrix2() const { return toRotationMatrix(); }
+
   template<typename Derived>
   Rotation2D& fromRotationMatrix(const MatrixBase<Derived>& m);
   Matrix2 toRotationMatrix(void) const;
 
   /** \returns the spherical interpolation between \c *this and \a other using
-    * parameter \a t. It is equivalent to a linear interpolation.
+    * parameter \a t. It is in fact equivalent to a linear interpolation.
     */
   inline Rotation2D slerp(Scalar t, const Rotation2D& other) const
   { return m_angle * (1-t) + t * other; }
diff --git a/Eigen/src/Geometry/Transform.h b/Eigen/src/Geometry/Transform.h
index 7669838..73e268e 100644
--- a/Eigen/src/Geometry/Transform.h
+++ b/Eigen/src/Geometry/Transform.h
@@ -50,20 +50,29 @@
   * Conversion methods from/to Qt's QMatrix are available if the preprocessor token
   * EIGEN_QT_SUPPORT is defined.
   *
+  * \sa class Matrix, class Quaternion
   */
 template<typename _Scalar, int _Dim>
 class Transform
 {
 public:
 
-  enum { Dim = _Dim, HDim = _Dim+1 };
+  enum {
+    Dim = _Dim,     ///< space dimension in which the transformation holds
+    HDim = _Dim+1   ///< size of a respective homogeneous vector
+  };
   /** the scalar type of the coefficients */
   typedef _Scalar Scalar;
+  /** type of the matrix used to represent the transformation */
   typedef Matrix<Scalar,HDim,HDim> MatrixType;
+  /** type of the matrix used to represent the affine part of the transformation */
   typedef Matrix<Scalar,Dim,Dim> AffineMatrixType;
-  typedef Block<MatrixType,Dim,Dim> AffineMatrixRef;
+  /** type of read/write reference to the affine part of the transformation */
+  typedef Block<MatrixType,Dim,Dim> AffinePart;
+  /** type of a vector */
   typedef Matrix<Scalar,Dim,1> VectorType;
-  typedef Block<MatrixType,Dim,1> VectorRef;
+  /** type of a read/write reference to the translation part of the rotation */
+  typedef Block<MatrixType,Dim,1> TranslationPart;
 
 protected:
 
@@ -80,10 +89,12 @@
   inline Transform& operator=(const Transform& other)
   { m_matrix = other.m_matrix; return *this; }
 
+  /** Constructs and initializes a transformation from a (Dim+1)^2 matrix. */
   template<typename OtherDerived>
   inline explicit Transform(const MatrixBase<OtherDerived>& other)
   { m_matrix = other; }
 
+  /** Set \c *this from a (Dim+1)^2 matrix. */
   template<typename OtherDerived>
   inline Transform& operator=(const MatrixBase<OtherDerived>& other)
   { m_matrix = other; return *this; }
@@ -100,14 +111,14 @@
   inline MatrixType& matrix() { return m_matrix; }
 
   /** \returns a read-only expression of the affine (linear) part of the transformation */
-  inline const AffineMatrixRef affine() const { return m_matrix.template block<Dim,Dim>(0,0); }
+  inline const AffinePart affine() const { return m_matrix.template block<Dim,Dim>(0,0); }
   /** \returns a writable expression of the affine (linear) part of the transformation */
-  inline AffineMatrixRef affine() { return m_matrix.template block<Dim,Dim>(0,0); }
+  inline AffinePart affine() { return m_matrix.template block<Dim,Dim>(0,0); }
 
   /** \returns a read-only expression of the translation vector of the transformation */
-  inline const VectorRef translation() const { return m_matrix.template block<Dim,1>(0,Dim); }
+  inline const TranslationPart translation() const { return m_matrix.template block<Dim,1>(0,Dim); }
   /** \returns a writable expression of the translation vector of the transformation */
-  inline VectorRef translation() { return m_matrix.template block<Dim,1>(0,Dim); }
+  inline TranslationPart translation() { return m_matrix.template block<Dim,1>(0,Dim); }
 
   template<typename OtherDerived>
   const typename ei_transform_product_impl<OtherDerived,_Dim,_Dim+1>::ResultType
@@ -118,6 +129,7 @@
   operator * (const Transform& other) const
   { return m_matrix * other.matrix(); }
 
+  /** \sa MatrixBase::setIdentity() */
   void setIdentity() { m_matrix.setIdentity(); }
 
   template<typename OtherDerived>
@@ -138,10 +150,7 @@
   template<typename RotationType>
   Transform& prerotate(const RotationType& rotation);
 
-  template<typename OtherDerived>
   Transform& shear(Scalar sx, Scalar sy);
-
-  template<typename OtherDerived>
   Transform& preshear(Scalar sx, Scalar sy);
 
   AffineMatrixType extractRotation() const;
@@ -151,6 +160,7 @@
   Transform& fromPositionOrientationScale(const MatrixBase<PositionDerived> &position,
     const OrientationType& orientation, const MatrixBase<ScaleDerived> &scale);
 
+  /** \sa MatrixBase::inverse() */
   const Inverse<MatrixType, false> inverse() const
   { return m_matrix.inverse(); }
 
@@ -158,8 +168,19 @@
 
 };
 
+/** \ingroup Geometry */
+typedef Transform<float,2> Transform2f;
+/** \ingroup Geometry */
+typedef Transform<float,3> Transform3f;
+/** \ingroup Geometry */
+typedef Transform<double,2> Transform2d;
+/** \ingroup Geometry */
+typedef Transform<double,3> Transform3d;
+
 #ifdef EIGEN_QT_SUPPORT
 /** Initialises \c *this from a QMatrix assuming the dimension is 2.
+  *
+  * This function is available only if the token EIGEN_QT_SUPPORT is defined.
   */
 template<typename Scalar, int Dim>
 Transform<Scalar,Dim>::Transform(const QMatrix& other)
@@ -168,6 +189,8 @@
 }
 
 /** Set \c *this from a QMatrix assuming the dimension is 2.
+  *
+  * This function is available only if the token EIGEN_QT_SUPPORT is defined.
   */
 template<typename Scalar, int Dim>
 Transform<Scalar,Dim>& Transform<Scalar,Dim>::operator=(const QMatrix& other)
@@ -180,21 +203,25 @@
 }
 
 /** \returns a QMatrix from \c *this assuming the dimension is 2.
+  *
+  * This function is available only if the token EIGEN_QT_SUPPORT is defined.
   */
 template<typename Scalar, int Dim>
 QMatrix Transform<Scalar,Dim>::toQMatrix(void) const
 {
   EIGEN_STATIC_ASSERT(Dim==2, you_did_a_programming_error);
-  return QMatrix( other.coeffRef(0,0), other.coeffRef(1,0),
-                  other.coeffRef(0,1), other.coeffRef(1,1),
-                  other.coeffRef(0,2), other.coeffRef(1,2),
+  return QMatrix(other.coeffRef(0,0), other.coeffRef(1,0),
+                 other.coeffRef(0,1), other.coeffRef(1,1),
+                 other.coeffRef(0,2), other.coeffRef(1,2));
 }
 #endif
 
 /** \returns an expression of the product between the transform \c *this and a matrix expression \a other
   *
-  * The right hand side \a other might be a vector of size Dim, an homogeneous vector of size Dim+1
-  * or a transformation matrix of size Dim+1 x Dim+1.
+  * The right hand side \a other might be either:
+  * \li a vector of size Dim,
+  * \li an homogeneous vector of size Dim+1,
+  * \li a transformation matrix of size Dim+1 x Dim+1.
   */
 template<typename Scalar, int Dim>
 template<typename OtherDerived>
@@ -213,8 +240,7 @@
 Transform<Scalar,Dim>&
 Transform<Scalar,Dim>::scale(const MatrixBase<OtherDerived> &other)
 {
-  EIGEN_STATIC_ASSERT(int(OtherDerived::IsVectorAtCompileTime)
-    && int(OtherDerived::SizeAtCompileTime)==int(Dim), you_did_a_programming_error);
+  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(OtherDerived,Dim);
   affine() = (affine() * other.asDiagonal()).lazy();
   return *this;
 }
@@ -228,8 +254,7 @@
 Transform<Scalar,Dim>&
 Transform<Scalar,Dim>::prescale(const MatrixBase<OtherDerived> &other)
 {
-  EIGEN_STATIC_ASSERT(int(OtherDerived::IsVectorAtCompileTime)
-    && int(OtherDerived::SizeAtCompileTime)==int(Dim), you_did_a_programming_error);
+  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(OtherDerived,Dim);
   m_matrix.template block<Dim,HDim>(0,0) = (other.asDiagonal() * m_matrix.template block<Dim,HDim>(0,0)).lazy();
   return *this;
 }
@@ -243,8 +268,7 @@
 Transform<Scalar,Dim>&
 Transform<Scalar,Dim>::translate(const MatrixBase<OtherDerived> &other)
 {
-  EIGEN_STATIC_ASSERT(int(OtherDerived::IsVectorAtCompileTime)
-    && int(OtherDerived::SizeAtCompileTime)==int(Dim), you_did_a_programming_error);
+  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(OtherDerived,Dim);
   translation() += affine() * other;
   return *this;
 }
@@ -258,8 +282,7 @@
 Transform<Scalar,Dim>&
 Transform<Scalar,Dim>::pretranslate(const MatrixBase<OtherDerived> &other)
 {
-  EIGEN_STATIC_ASSERT(int(OtherDerived::IsVectorAtCompileTime)
-    && int(OtherDerived::SizeAtCompileTime)==int(Dim), you_did_a_programming_error);
+  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(OtherDerived,Dim);
   translation() += other;
   return *this;
 }
@@ -273,8 +296,8 @@
   * Natively supported types includes:
   *   - any scalar (2D),
   *   - a Dim x Dim matrix expression,
-  *   - Quaternion (3D),
-  *   - AngleAxis (3D)
+  *   - a Quaternion (3D),
+  *   - a AngleAxis (3D)
   *
   * This mechanism is easily extendable to support user types such as Euler angles,
   * or a pair of Quaternion for 4D rotations.
@@ -293,9 +316,9 @@
 /** Applies on the left the rotation represented by the rotation \a rotation
   * to \c *this and returns a reference to \c *this.
   *
-  * See rotate(RotationType) for further details.
+  * See rotate() for further details.
   *
-  * \sa rotate(RotationType), rotate(Scalar)
+  * \sa rotate()
   */
 template<typename Scalar, int Dim>
 template<typename RotationType>
@@ -303,7 +326,7 @@
 Transform<Scalar,Dim>::prerotate(const RotationType& rotation)
 {
   m_matrix.template block<Dim,HDim>(0,0) = ToRotationMatrix<Scalar,Dim,RotationType>::convert(rotation)
-                                      * m_matrix.template block<Dim,HDim>(0,0);
+                                         * m_matrix.template block<Dim,HDim>(0,0);
   return *this;
 }
 
@@ -313,12 +336,10 @@
   * \sa preshear()
   */
 template<typename Scalar, int Dim>
-template<typename OtherDerived>
 Transform<Scalar,Dim>&
 Transform<Scalar,Dim>::shear(Scalar sx, Scalar sy)
 {
-  EIGEN_STATIC_ASSERT(int(OtherDerived::IsVectorAtCompileTime)
-    && int(OtherDerived::SizeAtCompileTime)==int(Dim) && int(Dim)==2, you_did_a_programming_error);
+  EIGEN_STATIC_ASSERT(int(Dim)==2, you_did_a_programming_error);
   VectorType tmp = affine().col(0)*sy + affine().col(1);
   affine() << affine().col(0) + affine().col(1)*sx, tmp;
   return *this;
@@ -330,18 +351,16 @@
   * \sa shear()
   */
 template<typename Scalar, int Dim>
-template<typename OtherDerived>
 Transform<Scalar,Dim>&
 Transform<Scalar,Dim>::preshear(Scalar sx, Scalar sy)
 {
-  EIGEN_STATIC_ASSERT(int(OtherDerived::IsVectorAtCompileTime)
-    && int(OtherDerived::SizeAtCompileTime)==int(Dim), you_did_a_programming_error);
+  EIGEN_STATIC_ASSERT(int(Dim)==2, you_did_a_programming_error);
   m_matrix.template block<Dim,HDim>(0,0) = AffineMatrixType(1, sx, sy, 1) * m_matrix.template block<Dim,HDim>(0,0);
   return *this;
 }
 
 /** \returns the rotation part of the transformation using a QR decomposition.
-  * \sa extractRotationNoShear()
+  * \sa extractRotationNoShear(), class QR
   */
 template<typename Scalar, int Dim>
 typename Transform<Scalar,Dim>::AffineMatrixType
@@ -408,15 +427,15 @@
 {
   typedef typename Other::Scalar Scalar;
   typedef Transform<Scalar,Dim> TransformType;
-  typedef typename TransformType::AffineMatrixRef MatrixType;
+  typedef typename TransformType::AffinePart MatrixType;
   typedef const CwiseUnaryOp<
       ei_scalar_multiple_op<Scalar>,
       NestByValue<CwiseBinaryOp<
         ei_scalar_sum_op<Scalar>,
         NestByValue<typename ProductReturnType<NestByValue<MatrixType>,Other>::Type >,
-        NestByValue<typename TransformType::VectorRef> > >
+        NestByValue<typename TransformType::TranslationPart> > >
       > ResultType;
-  // FIXME shall we offer an optimized version when the last row is known to be 0,0...,0,1 ?
+  // FIXME should we offer an optimized version when the last row is known to be 0,0...,0,1 ?
   static ResultType run(const TransformType& tr, const Other& other)
   { return ((tr.affine().nestByValue() * other).nestByValue() + tr.translation().nestByValue()).nestByValue()
           * (Scalar(1) / ( (tr.matrix().template block<1,Dim>(Dim,0) * other).coeff(0) + tr.matrix().coeff(Dim,Dim))); }
diff --git a/doc/Doxyfile.in b/doc/Doxyfile.in
index 4c5c71f..eed3fe6 100644
--- a/doc/Doxyfile.in
+++ b/doc/Doxyfile.in
@@ -1191,7 +1191,9 @@
 # The macro definition that is found in the sources will be used.
 # Use the PREDEFINED tag if you want to use a different macro definition.
 
-EXPAND_AS_DEFINED      = EIGEN_MAKE_SCALAR_OPS
+EXPAND_AS_DEFINED      = EIGEN_MAKE_SCALAR_OPS          \
+                         EIGEN_MAKE_TYPEDEFS            \
+                         EIGEN_MAKE_TYPEDEFS_ALL_SIZES 
 
 # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
 # doxygen's preprocessor will remove all function-like macros that are alone
diff --git a/doc/snippets/AngleAxis_mimic_euler.cpp b/doc/snippets/AngleAxis_mimic_euler.cpp
index be6b8ad..46ec41a 100644
--- a/doc/snippets/AngleAxis_mimic_euler.cpp
+++ b/doc/snippets/AngleAxis_mimic_euler.cpp
@@ -1,4 +1,4 @@
 Matrix3f m = AngleAxisf(0.25*M_PI, Vector3f::UnitX())
            * AngleAxisf(0.5*M_PI,  Vector3f::UnitY())
            * AngleAxisf(0.33*M_PI, Vector3f::UnitZ());
-cout << m << endl;
+cout << m << endl << "is unitary: " << m.isUnitary() << endl;
