diff --git a/CMakeLists.txt b/CMakeLists.txt
index 32ea88cd47d579a6be21d629727077f4acdb31a8..2f920662f3e98ee4254b38c522640e2a43b2c727 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -97,7 +97,7 @@ add_documented_files(
   # Source files
   spm.c
   spm_io.c
-  spm_integers.c
-  spm_dofs.c
   spm_read_driver.c
+  spm_dof_extend.c
+  spm_integers.c
   )
diff --git a/integer_sort.c b/integer_sort.c
index dd519240fd47adb91ac10c186aac697961841893..93cfb426926c0276e9b46966dea91cddc7f79c9e 100644
--- a/integer_sort.c
+++ b/integer_sort.c
@@ -35,7 +35,7 @@
  *
  * @file integer_sort.c
  *
- * @ingroup pastix_spm_dev
+ * @ingroup spm_dev_integer
  *
  * File to include to create integer sort function using qsort based
  * algorithm. DO NOT compile directly.
diff --git a/integer_sort_mtypes.c b/integer_sort_mtypes.c
index e900c8788d7e4cc3b3da1c24506ece662ccf02c8..c79ee9ee7d28b499addf6080128f5ee25a14f67a 100644
--- a/integer_sort_mtypes.c
+++ b/integer_sort_mtypes.c
@@ -34,7 +34,7 @@
 /**
  *******************************************************************************
  *
- * @ingroup pastix_spm_dev
+ * @ingroup spm_dev_integer
  *
  * @file integer_sort_mtypes.c
  *
diff --git a/spm.h b/spm.h
index f79b9a69e8ec0b9ab96e53ac56b717dd49b35a94..b931fbeb6025de505c31c4a4a5521f4112bb2cab 100644
--- a/spm.h
+++ b/spm.h
@@ -185,7 +185,7 @@ pastix_spm_t *spmDofExtend( const int type, const int dof, const pastix_spm_t *s
  */
 
 /**
- * @ingroup pastix_spm_dev
+ * @ingroup spm_dev_print
  * @brief Subroutines to print one element of an spm structure
  *
  * @param[in] f Pointer to the file
diff --git a/spm_integers.c b/spm_integers.c
index 18deca7dfdb0d0deff568f58eeabbcbb2237defd..1d74d6ce7880a7009cdac3373980a03d73800bf9 100644
--- a/spm_integers.c
+++ b/spm_integers.c
@@ -68,7 +68,7 @@ spmIntConvert( pastix_int_t n, int *input )
  *******************************************************************************
  *
  * @fn      void spmIntSort1Asc1(void * const pbase, const pastix_int_t n);
- * @ingroup pastix_spm_dev
+ * @ingroup spm_dev_integer
  *
  * Sorts in ascending order array of element composed of one single
  * pastix_int_t with a single key value.
@@ -104,7 +104,7 @@ spmIntConvert( pastix_int_t n, int *input )
  *******************************************************************************
  *
  * @fn      void spmIntSort2Asc1(void * const pbase, const pastix_int_t n);
- * @ingroup pastix_spm_dev
+ * @ingroup spm_dev_integer
  *
  * Sorts in ascending order array of element composed of two
  * pastix_int_t by ascending order. The first value is used as key.
@@ -143,7 +143,7 @@ spmIntConvert( pastix_int_t n, int *input )
  *******************************************************************************
  *
  * @fn      void spmIntSort3Asc1(void * const pbase, const pastix_int_t n);
- * @ingroup pastix_spm_dev
+ * @ingroup spm_dev_integer
  *
  * @brief Sorts in ascending order array of element composed of three
  * pastix_int_t by ascending order. The first value is used as key.
@@ -188,7 +188,7 @@ void spmIntSort3Asc1(void *const pbase, const pastix_int_t n);
  *******************************************************************************
  *
  * @fn      void spmIntSort2Asc2(void * const pbase, const pastix_int_t n);
- * @ingroup pastix_spm_dev
+ * @ingroup spm_dev_integer
  * @brief Sorts in ascending order array of element composed of two
  * pastix_int_t by ascending order. Both values are used as key.
  *
@@ -226,7 +226,7 @@ void spmIntSort3Asc1(void *const pbase, const pastix_int_t n);
  *******************************************************************************
  *
  * @fn      void spmIntMSortIntAsc(void ** const pbase, const pastix_int_t n);
- * @ingroup pastix_spm_dev
+ * @ingroup spm_dev_integer
  *
  * @brief Sort 2 arrays simultaneously, the first array is an array of
  * pastix_int_t and used as primary key for sorting.  The second array is an
@@ -279,7 +279,7 @@ void spmIntMSortIntAsc(void ** const pbase, const pastix_int_t n);
  *******************************************************************************
  *
  * @fn      void spmIntMSortSmallIntAsc(void **const pbase, const pastix_int_t n);
- * @ingroup pastix_spm_dev
+ * @ingroup spm_dev_integer
  * @brief Sort 2 arrays simultaneously, the first array is an array of
  * pastix_int_t and used as primary key for sorting.  The second array is an
  * other array of pastix_int_t used as secondary key.
diff --git a/spm_io.c b/spm_io.c
index e4bf21fc52a849ff93e02ae98779bb930d930619..da1559cf2f6a754336d253c78aae16225ff34183 100644
--- a/spm_io.c
+++ b/spm_io.c
@@ -20,7 +20,7 @@
 /**
  *******************************************************************************
  *
- * @ingroup pastix_spm_dev
+ * @ingroup spm_dev_io
  *
  * @brief Read an array of integer.
  *
@@ -101,7 +101,7 @@ readArrayOfInteger( FILE         *stream,
 /**
  *******************************************************************************
  *
- * @ingroup pastix_spm_dev
+ * @ingroup spm_dev_io
  *
  * @brief  Read an array of 64bits complex.
  *
@@ -187,7 +187,7 @@ readArrayOfComplex64( FILE               *stream,
 /**
  *******************************************************************************
  *
- * @ingroup pastix_spm_dev
+ * @ingroup spm_dev_io
  *
  * @brief  Read an array of 32bits complex.
  *
@@ -273,7 +273,7 @@ readArrayOfComplex32( FILE               *stream,
 /**
  *******************************************************************************
  *
- * @ingroup pastix_spm_dev
+ * @ingroup spm_dev_io
  *
  * @brief  Read an array of double.
  *
@@ -357,7 +357,7 @@ readArrayOfDouble( FILE         *stream,
 /**
  *******************************************************************************
  *
- * @ingroup pastix_spm_dev
+ * @ingroup spm_dev_io
  *
  * @brief  Read an array of float.
  *
@@ -605,7 +605,7 @@ spmLoad( pastix_spm_t  *spm,
 /**
  *******************************************************************************
  *
- * @ingroup pastix_spm_dev
+ * @ingroup spm_dev_io
  *
  * @brief write an array of 64bits complex.
  *
@@ -646,7 +646,7 @@ writeArrayOfComplex64( FILE               *outfile,
 /**
  *******************************************************************************
  *
- * @ingroup pastix_spm_dev
+ * @ingroup spm_dev_io
  *
  * @brief write an array of 32bits complex.
  *
@@ -687,7 +687,7 @@ writeArrayOfComplex32( FILE               *outfile,
 /**
  *******************************************************************************
  *
- * @ingroup pastix_spm_dev
+ * @ingroup spm_dev_io
  *
  * @brief write an array of double.
  *
@@ -728,7 +728,7 @@ writeArrayOfDouble( FILE         *outfile,
 /**
  *******************************************************************************
  *
- * @ingroup pastix_spm_dev
+ * @ingroup spm_dev_io
  *
  * @brief write an array of float.
  *
diff --git a/z_spm.c b/z_spm.c
index a9923f3c607b486a82c92e0de33f5573ff5b19ff..b1e9fde96566a7e2f290787a5493123cdd4a0851 100644
--- a/z_spm.c
+++ b/z_spm.c
@@ -21,7 +21,7 @@
 /**
  *******************************************************************************
  *
- * @ingroup pastix_spm_dev
+ * @ingroup spm_dev_check
  *
  * @brief This routine sorts the subarray of edges of each vertex in a
  * centralized spm stored in CSC or CSR format.
@@ -92,7 +92,7 @@ z_spmSort( pastix_spm_t *spm )
 /**
  *******************************************************************************
  *
- * @ingroup pastix_spm_dev
+ * @ingroup spm_dev_check
  *
  * @brief This routine merge the multiple entries in a sparse
  * matrix by suming their values together.
@@ -186,7 +186,7 @@ z_spmMergeDuplicate( pastix_spm_t *spm )
 /**
  *******************************************************************************
  *
- * @ingroup pastix_spm_dev
+ * @ingroup spm_dev_check
  *
  * @brief This routine corrects the sparse matrix structure if it's
  * pattern is not symmetric.
diff --git a/z_spm_2dense.c b/z_spm_2dense.c
index ed2b4044e178a934fb40192222ae9e10e5e4293d..0c1da2d71e0919ea7c05620ec18631a0e123ae1c 100644
--- a/z_spm_2dense.c
+++ b/z_spm_2dense.c
@@ -30,7 +30,7 @@
 /**
  *******************************************************************************
  *
- * @ingroup pastix_spm_dev
+ * @ingroup spm_dev_convert
  *
  * @brief Convert a CSC matrix into a dense matrix.
  *
@@ -208,7 +208,7 @@ z_spmCSC2dense( const pastix_spm_t *spm )
 /**
  *******************************************************************************
  *
- * @ingroup pastix_spm_dev
+ * @ingroup spm_dev_convert
  *
  * @brief Convert a CSR matrix into a dense matrix.
  *
@@ -386,7 +386,7 @@ z_spmCSR2dense( const pastix_spm_t *spm )
 /**
  *******************************************************************************
  *
- * @ingroup pastix_spm_dev
+ * @ingroup spm_dev_convert
  *
  * @brief Convert a IJV matrix into a dense matrix.
  *
@@ -580,7 +580,7 @@ z_spmIJV2dense( const pastix_spm_t *spm )
 /**
  *******************************************************************************
  *
- * @ingroup pastix_spm_dev
+ * @ingroup spm_dev_convert
  *
  * @brief Convert a sparse matrix into a dense matrix.
  *
@@ -615,7 +615,7 @@ z_spm2dense( const pastix_spm_t *spm )
 /**
  *******************************************************************************
  *
- * @ingroup pastix_spm_dev
+ * @ingroup spm_dev_convert
  *
  * @brief Print a dense matrix to the given file
  *
diff --git a/z_spm_convert_to_csc.c b/z_spm_convert_to_csc.c
index 378fde18dd32df47f182a80d44dde1a17f473ee8..c238ba270702b417f8457ca1762b828968f40a5a 100644
--- a/z_spm_convert_to_csc.c
+++ b/z_spm_convert_to_csc.c
@@ -22,7 +22,7 @@
 /**
  *******************************************************************************
  *
- * @ingroup pastix_spm_dev
+ * @ingroup spm_dev_convert
  *
  * @brief convert a matrix in IJV format to a matrix in CSC
  * format.
@@ -127,7 +127,7 @@ z_spmConvertIJV2CSC( pastix_spm_t *spm )
 /**
  *******************************************************************************
  *
- * @ingroup pastix_spm_dev
+ * @ingroup spm_dev_convert
  *
  * @brief  convert a matrix in CSR format to a matrix in CSC
  * format.
diff --git a/z_spm_convert_to_csr.c b/z_spm_convert_to_csr.c
index 58631f87b6f1f9f9238b933adfe32d2ae696d031..7b5a458f5bbdc85343a66add88b547ae4c6a3d1e 100644
--- a/z_spm_convert_to_csr.c
+++ b/z_spm_convert_to_csr.c
@@ -21,7 +21,7 @@
 /**
  *******************************************************************************
  *
- * @ingroup pastix_spm_dev
+ * @ingroup spm_dev_convert
  *
  * @brief convert a matrix in CSC format to a matrix in CSR format.
  *
@@ -100,7 +100,7 @@ z_spmConvertCSC2CSR( pastix_spm_t *spm )
 /**
  *******************************************************************************
  *
- * @ingroup pastix_spm_dev
+ * @ingroup spm_dev_convert
  *
  * @brief convert a matrix in IJV format to a matrix in CSR
  * format.
diff --git a/z_spm_convert_to_ijv.c b/z_spm_convert_to_ijv.c
index 5f4e4dc491b3dba65d2ec445dc771358494c2077..9657f42f9712f85c03dffab51fdaae8e049cc089 100644
--- a/z_spm_convert_to_ijv.c
+++ b/z_spm_convert_to_ijv.c
@@ -21,7 +21,7 @@
 /**
  *******************************************************************************
  *
- * @ingroup pastix_spm_dev
+ * @ingroup spm_dev_convert
  *
  * @brief convert a matrix in CSC format to a matrix in IJV format.
  *
@@ -70,7 +70,7 @@ z_spmConvertCSC2IJV( pastix_spm_t *spm )
 /**
  *******************************************************************************
  *
- * @ingroup pastix_spm_dev
+ * @ingroup spm_dev_convert
  *
  * @brief convert a matrix in CSR format to a matrix in IJV format.
  *
diff --git a/z_spm_dof_extend.c b/z_spm_dof_extend.c
index df45dc39664bb9cf21f5085032eadb19b3ac09dc..ecd881178d41628cf1805d9b41ebd9d6faabfbb2 100644
--- a/z_spm_dof_extend.c
+++ b/z_spm_dof_extend.c
@@ -21,7 +21,7 @@
 /**
  *******************************************************************************
  *
- * @ingroup pastix_spm_dev
+ * @ingroup spm_dev_dof
  *
  * @brief Extend a multi-dof sparse matrix to a single dof sparse matrix.
  *
diff --git a/z_spm_expand.c b/z_spm_expand.c
index d0ae69ba87b37e482b0df407e17a23b3f9d4a622..9e62c153c52af01eb664dffd44c286be755658c4 100644
--- a/z_spm_expand.c
+++ b/z_spm_expand.c
@@ -21,7 +21,7 @@
 /**
  *******************************************************************************
  *
- * @ingroup pastix_spm_dev
+ * @ingroup spm_dev_dof
  *
  * @brief Expand a single dof CSC to a multi-dofs CSC.
  *
@@ -206,7 +206,7 @@ z_spmCSCExpand(const pastix_spm_t *spm)
 /**
  *******************************************************************************
  *
- * @ingroup pastix_spm_dev
+ * @ingroup spm_dev_dof
  *
  * @brief Expand a single dof CSR to a multi-dofs CSR.
  *
@@ -389,7 +389,7 @@ z_spmCSRExpand(const pastix_spm_t *spm)
 /**
  *******************************************************************************
  *
- * @ingroup pastix_spm_dev
+ * @ingroup spm_dev_dof
  *
  * @brief Expand a single dof IJV to a multi-dofs IJV.
  *
@@ -562,7 +562,7 @@ z_spmIJVExpand(const pastix_spm_t *spm)
 /**
  *******************************************************************************
  *
- * @ingroup pastix_spm_dev
+ * @ingroup spm_dev_dof
  *
  * @brief Expand a single dof sparse matrix to a multi-dofs sparse matrix.
  *
diff --git a/z_spm_genrhs.c b/z_spm_genrhs.c
index 6e2983dc7443da4d839fb17a840eb938a6464171..e83f1f99b3282e9ef90b705106672c2f9868029f 100644
--- a/z_spm_genrhs.c
+++ b/z_spm_genrhs.c
@@ -37,7 +37,7 @@ static pastix_complex64_t zzero = (pastix_complex64_t) 0.;
 /**
  *******************************************************************************
  *
- * @ingroup pastix_spm_dev
+ * @ingroup spm_dev_rhs
  *
  * @brief Random generator from the HPL library
  *
@@ -83,7 +83,7 @@ Rnd64_jump(unsigned long long int n, unsigned long long int seed ) {
 /**
  *******************************************************************************
  *
- * @ingroup pastix_spm_dev
+ * @ingroup spm_dev_rhs
  *
  * @brief Generate a vector of random values.
  *
@@ -148,7 +148,7 @@ z_spmRndVect( double scale, int m, int n, pastix_complex64_t *A, int lda,
 /**
  *******************************************************************************
  *
- * @ingroup pastix_spm_dev
+ * @ingroup spm_dev_rhs
  *
  * @brief Generate nrhs right hand side vectors associated to a given
  * matrix to test a problem with a solver.
@@ -308,7 +308,7 @@ z_spmGenRHS( int type, int nrhs,
 /**
  *******************************************************************************
  *
- * @ingroup pastix_spm_dev
+ * @ingroup spm_dev_rhs
  *
  * @brief Check the backward error, and the forward error if x0 is provided.
  *
diff --git a/z_spm_integer.c b/z_spm_integer.c
index a2dce6808e50355e51351d33442e011c49cd5ebd..5270c13823eba69a8508288e1d2b6e9775c513f8 100644
--- a/z_spm_integer.c
+++ b/z_spm_integer.c
@@ -26,7 +26,7 @@
  *******************************************************************************
  *
  * @fn      void z_spmIntSortAsc(void ** const pbase, const pastix_int_t n)
- * @ingroup pastix_spm_dev
+ * @ingroup spm_dev_integer
  * @brief Sort 2 arrays simultaneously, the first array is an array of
  * pastix_int_t and used as key for sorting.  The second array is an array of
  * pastix_complex64_t.
diff --git a/z_spm_laplacian.c b/z_spm_laplacian.c
index 5d8dbccc6c23d19e6017f5c537b0b8b7be542273..56d388b4e31242006e4098e2454c0d7c69694778 100644
--- a/z_spm_laplacian.c
+++ b/z_spm_laplacian.c
@@ -22,7 +22,7 @@
 /**
  *******************************************************************************
  *
- * @ingroup pastix_spm_driver
+ * @ingroup spm_dev_driver
  *
  * z_spmLaplacian1D - Generate a 1D laplacian matrix.
  *
@@ -113,7 +113,7 @@ z_spmLaplacian1D( pastix_spm_t  *spm,
 /**
  *******************************************************************************
  *
- * @ingroup pastix_spm_driver
+ * @ingroup spm_dev_driver
  *
  * z_spmLaplacian2D - Generate a 2D laplacian matrix.
  *
@@ -222,7 +222,7 @@ z_spmLaplacian2D( pastix_spm_t  *spm,
 /**
  *******************************************************************************
  *
- * @ingroup pastix_spm_driver
+ * @ingroup spm_dev_driver
  *
  * z_spmLaplacian3D - Generate a 3D laplacian matrix.
  *
@@ -353,7 +353,7 @@ z_spmLaplacian3D( pastix_spm_t  *spm,
 /**
  *******************************************************************************
  *
- * @ingroup pastix_spm_driver
+ * @ingroup spm_dev_driver
  *
  * z_spmExtendedLaplacian2D - Generate a 2D extended laplacian matrix.
  *
@@ -476,7 +476,7 @@ z_spmExtendedLaplacian2D( pastix_spm_t  *spm,
 /**
  *******************************************************************************
  *
- * @ingroup pastix_spm_driver
+ * @ingroup spm_dev_driver
  *
  * z_spmExtendedLaplacian3D - Generate a 3D extended laplacian matrix.
  *
diff --git a/z_spm_matrixvector.c b/z_spm_matrixvector.c
index 05b503bbde822d3ac0704f931f1b96af7cfaff72..e94d679195fba2125f7a986adb068fab148546f2 100644
--- a/z_spm_matrixvector.c
+++ b/z_spm_matrixvector.c
@@ -21,7 +21,7 @@
 /**
  *******************************************************************************
  *
- * @ingroup pastix_spm_dev
+ * @ingroup spm_dev_matvec
  *
  * @brief compute the matrix-vector product:
  *          y = alpha * op( A ) * x + beta * y
@@ -152,7 +152,7 @@ z_spmGeCSCv(const pastix_trans_t      trans,
 /**
  *******************************************************************************
  *
- * @ingroup pastix_spm_dev
+ * @ingroup spm_dev_matvec
  *
  * @brief compute the matrix-vector product:
  *          y = alpha * A + beta * y
@@ -240,7 +240,7 @@ z_spmSyCSCv(      pastix_complex64_t  alpha,
 /**
  *******************************************************************************
  *
- * @ingroup pastix_spm_dev
+ * @ingroup spm_dev_matvec
  *
  * @brief compute the matrix-vector product:
  *          y = alpha * A + beta * y
@@ -330,7 +330,7 @@ z_spmHeCSCv(      pastix_complex64_t  alpha,
 /**
  *******************************************************************************
  *
- * @ingroup pastix_spm_dev
+ * @ingroup spm_dev_matvec
  *
  * @brief compute the matrix-vector product:
  *          y = alpha * A + beta * y
diff --git a/z_spm_norm.c b/z_spm_norm.c
index 6432e18fc54230c534e1b793601e4720d7c15963..50419ded08a0bce6f42f9cd381fe9e7f7f954572 100644
--- a/z_spm_norm.c
+++ b/z_spm_norm.c
@@ -14,6 +14,9 @@
  * @date 2015-06-01
  * @precisions normal z -> c d s
  *
+ * @addtogroup spm_dev_norm
+ * @{
+ *
  **/
 #include "common.h"
 #include "spm.h"
@@ -423,3 +426,6 @@ z_spmNorm( int ntype,
 
     return norm;
 }
+/**
+ * @}
+ */
diff --git a/z_spm_print.c b/z_spm_print.c
index d0c8c2f00789baa46ef6d1605094cf39abd64508..2da95721f29f07ebb8061d92337d7ce6650ea578 100644
--- a/z_spm_print.c
+++ b/z_spm_print.c
@@ -30,7 +30,7 @@
 /**
  *******************************************************************************
  *
- * @ingroup pastix_spm_dev
+ * @ingroup spm_dev_print
  *
  * @brief Write CSC matrix in a file
  *
@@ -215,7 +215,7 @@ z_spmCSCPrint( FILE *f, const pastix_spm_t *spm )
 /**
  *******************************************************************************
  *
- * @ingroup pastix_spm_dev
+ * @ingroup spm_dev_print
  *
  * @brief Write CSR matrix in a file
  *
@@ -400,7 +400,7 @@ z_spmCSRPrint( FILE *f, const pastix_spm_t *spm )
 /**
  *******************************************************************************
  *
- * @ingroup pastix_spm_dev
+ * @ingroup spm_dev_print
  *
  * @brief Write IJV matrix in a file
  *
@@ -603,7 +603,7 @@ z_spmIJVPrint( FILE *f, const pastix_spm_t *spm )
 /**
  *******************************************************************************
  *
- * @ingroup pastix_spm_dev
+ * @ingroup spm_dev_print
  *
  * @brief Write a spm matrix in a file
  *
diff --git a/z_spm_scal.c b/z_spm_scal.c
index 5536e8a9bf3cda335699b886cbde26ea22a982a8..50428b4f2aa7f64c07c4fea482deb9043bc2e3ab 100644
--- a/z_spm_scal.c
+++ b/z_spm_scal.c
@@ -22,7 +22,7 @@
 /**
  *******************************************************************************
  *
- * @ingroup pastix_spm_dev
+ * @ingroup spm_dev_scal
  *
  * @brief Scal the spm: A = alpha * A
  *