diff --git a/ChangeLog b/ChangeLog
index a3b5120ddae5a526f4f5db287c7a85a5f5e2d9e9..237f203273ceef734df52a947d35ff7cd52f8a33 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,6 +2,11 @@ chameleon-1.3.0
 ------------------------------------------------------------------------
  - types: add support for half precision arithmetic into the data descriptors
  - cuda: add half precision conversion kernels, and variants of the gemm kernels (hgemm, and gemmex)
+ - descriptors: Add the possibility to pass arguments to the rankof
+   function. This is used to provide custom distribuitions through a
+   given file. *WARNING*: It changes the interface of
+   CHAMELEON_Desc_Create_User that requires aan additional `, NULL`
+   parameters in the general case.
 
 chameleon-1.2.0
 ------------------------------------------------------------------------
diff --git a/compute/pzgenm2.c b/compute/pzgenm2.c
index 36b0ae6ee45dfdd82639f8cc521626da93aee1a8..77c07aa17fe681eaf75a6c133363eff92e5a2298 100644
--- a/compute/pzgenm2.c
+++ b/compute/pzgenm2.c
@@ -12,11 +12,12 @@
  *
  * @brief Chameleon parallel algorithm to compute 2-norm estimator.
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Mathieu Faverge
  * @author Dalal Sukkari
  * @author Alycia Lisito
- * @date 2022-02-22
+ * @author Lionel Eyraud-Dubois
+ * @date 2023-07-05
  * @precisions normal z -> s d c
  *
  */
@@ -67,7 +68,7 @@ chameleon_pzgenm2( double tol, const CHAM_desc_t *A, double *result,
      */
     chameleon_desc_init( &DROW, CHAMELEON_MAT_ALLOC_GLOBAL, ChamRealDouble, 1, A->nb, A->nb,
                          A->p, A->n, 0, 0, A->p, A->n, A->p, A->q,
-                         NULL, NULL, NULL );
+                         NULL, NULL, NULL, NULL );
     /**
      * NRMX must be allocated with GLOBAL to be able to access the norm value
      * after flushing the descriptor.
@@ -75,7 +76,7 @@ chameleon_pzgenm2( double tol, const CHAM_desc_t *A, double *result,
      */
     chameleon_desc_init( &NRMX, CHAMELEON_MAT_ALLOC_GLOBAL, ChamRealDouble, 2, 1, 2,
                          A->p * 2, A->q, 0, 0, A->p * 2, A->q, A->p, A->q,
-                         NULL, NULL, NULL );
+                         NULL, NULL, NULL, NULL );
 
     /**
      * Start by computing the initial vector of the iterative process, and that
@@ -171,13 +172,13 @@ chameleon_pzgenm2( double tol, const CHAM_desc_t *A, double *result,
 
     chameleon_desc_init( &NRMSX, CHAMELEON_MAT_ALLOC_GLOBAL, ChamRealDouble, 2, 1, 2,
                          A->p * 2, A->q, 0, 0, A->p * 2, A->q, A->p, A->q,
-                         NULL, NULL, NULL );
+                         NULL, NULL, NULL, NULL );
     chameleon_desc_init( &X,  CHAMELEON_MAT_ALLOC_GLOBAL, ChamComplexDouble, 1, A->nb, A->nb,
                          A->p, A->n, 0, 0, A->p, A->n, A->p, A->q,
-                         NULL, NULL, NULL );
+                         NULL, NULL, NULL, NULL );
     chameleon_desc_init( &SX, CHAMELEON_MAT_ALLOC_GLOBAL, ChamComplexDouble, A->mb, 1, A->mb,
                          A->m, A->q, 0, 0, A->m, A->q, A->p, A->q,
-                         NULL, NULL, NULL );
+                         NULL, NULL, NULL, NULL );
 
     cnt = 0;
     e0  = 0.;
diff --git a/compute/pzgepdf_qdwh.c b/compute/pzgepdf_qdwh.c
index 1f369ff3a802d24e7de8c8ae40d971bec99155f0..3cace25b8b53b996c0363b2bbf6ae1a884ea6182 100644
--- a/compute/pzgepdf_qdwh.c
+++ b/compute/pzgepdf_qdwh.c
@@ -11,10 +11,11 @@
  *
  * @brief Chameleon QDWH Polar Decomposition parallel algorithm
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Mathieu Faverge
  * @author Hatem Ltaief
- * @date 2022-02-22
+ * @author Lionel Eyraud-Dubois
+ * @date 2023-07-05
  * @precisions normal z -> s d c
  *
  */
@@ -109,23 +110,23 @@ chameleon_pzgepdf_qdwh_init( const CHAM_desc_t *U, const CHAM_desc_t *H,
                          ChamComplexDouble, ib, nb, ib * nb,
                          ib * U->mt, nb * U->nt, 0, 0,
                          ib * U->mt, nb * U->nt, U->p, U->q,
-                         NULL, NULL, NULL );
+                         NULL, NULL, NULL, NULL );
     chameleon_desc_init( TT1, CHAMELEON_MAT_ALLOC_TILE,
                          ChamComplexDouble, ib, nb, ib * nb,
                          ib * U->mt, nb * U->nt, 0, 0,
                          ib * U->mt, nb * U->nt, H->p, H->q,
-                         NULL, NULL, NULL );
+                         NULL, NULL, NULL, NULL );
 
     chameleon_desc_init( TS2, CHAMELEON_MAT_ALLOC_TILE,
                          ChamComplexDouble, ib, nb, ib * nb,
                          ib * H->mt, nb * H->nt, 0, 0,
                          ib * H->mt, nb * H->nt, U->p, U->q,
-                         NULL, NULL, NULL );
+                         NULL, NULL, NULL, NULL );
     chameleon_desc_init( TT2, CHAMELEON_MAT_ALLOC_TILE,
                          ChamComplexDouble, ib, nb, ib * nb,
                          ib * H->mt, nb * H->nt, 0, 0,
                          ib * H->mt, nb * H->nt, H->p, H->q,
-                         NULL, NULL, NULL );
+                         NULL, NULL, NULL, NULL );
 
     /*
      * Create the adapted trees to perform the QR factorizations
@@ -170,7 +171,7 @@ chameleon_pzgepdf_qdwh_init( const CHAM_desc_t *U, const CHAM_desc_t *H,
                          ChamComplexDouble, U->mb, U->nb, U->mb * U->nb,
                          U->n, U->m, 0, 0,
                          U->n, U->m, U->p, U->q,
-                         NULL, NULL, NULL );
+                         NULL, NULL, NULL, NULL );
 
     /*
      * Allocate the data descriptors for the lookahead if needed
diff --git a/compute/pzhetrd_he2hb.c b/compute/pzhetrd_he2hb.c
index 7d416d185317d7f7d77abbffabd0f218d417fe8b..288cc93828c06a1d2bd1412435d59b5cc589a2b2 100644
--- a/compute/pzhetrd_he2hb.c
+++ b/compute/pzhetrd_he2hb.c
@@ -11,13 +11,14 @@
  *
  * @brief Chameleon zhetrd_he2hb parallel algorithm
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Hatem Ltaief
  * @author Azzam Haidar
  * @author Mathieu Faverge
  * @author Samuel Thibault
  * @author Alycia Lisito
- * @date 2022-02-22
+ * @author Lionel Eyraud-Dubois
+ * @date 2023-07-05
  * @precisions normal z -> s d c
  *
  */
@@ -94,7 +95,7 @@ void chameleon_pzhetrd_he2hb(cham_uplo_t uplo,
     chameleon_desc_init( &AT, CHAMELEON_MAT_ALLOC_GLOBAL, ChamComplexDouble, A->mb, A->nb, (A->mb*A->nb),
                          chameleon_min(A->mt, A->nt) * A->mb, A->nb, 0, 0,
                          chameleon_min(A->mt, A->nt) * A->mb, A->nb, 1, 1,
-                         NULL, NULL, NULL );
+                         NULL, NULL, NULL, NULL );
 
     /* Let's extract the diagonal in a temporary copy that contains A and A' */
     for (k = 1; k < A->nt; k++){
diff --git a/compute/pzlange.c b/compute/pzlange.c
index fd29e505e2e5fd9996fbc5284069fa86aa0eedb3..4944d8fb48bdb4a61ab6d846f3b32e061c0f4b36 100644
--- a/compute/pzlange.c
+++ b/compute/pzlange.c
@@ -11,14 +11,15 @@
  *
  * @brief Chameleon zlange parallel algorithm
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @comment This file has been automatically generated
  *          from Plasma 2.6.0 for CHAMELEON 0.9.2
  * @author Emmanuel Agullo
  * @author Mathieu Faverge
  * @author Florent Pruvost
  * @author Alycia Lisito
- * @date 2022-02-22
+ * @author Lionel Eyraud-Dubois
+ * @date 2023-07-05
  * @precisions normal z -> s d c
  *
  */
@@ -403,7 +404,7 @@ void chameleon_pzlange_generic( cham_normtype_t norm, cham_uplo_t uplo, cham_dia
 
         chameleon_desc_init( &Wcol, CHAMELEON_MAT_ALLOC_TILE, ChamRealDouble, 1, A->nb, A->nb,
                              workmt, worknt * A->nb, 0, 0, workmt, worknt * A->nb, A->p, A->q,
-                             NULL, NULL, NULL );
+                             NULL, NULL, NULL, NULL );
         wcol_init = 1;
 
         /*
@@ -411,7 +412,7 @@ void chameleon_pzlange_generic( cham_normtype_t norm, cham_uplo_t uplo, cham_dia
          */
         chameleon_desc_init( &Welt, CHAMELEON_MAT_ALLOC_GLOBAL, ChamRealDouble, 1, 1, 1,
                              A->p, worknt, 0, 0, A->p, worknt, A->p, A->q,
-                             NULL, NULL, NULL );
+                             NULL, NULL, NULL, NULL );
 
         break;
 
@@ -423,12 +424,12 @@ void chameleon_pzlange_generic( cham_normtype_t norm, cham_uplo_t uplo, cham_dia
 
         chameleon_desc_init( &Wcol, CHAMELEON_MAT_ALLOC_TILE, ChamRealDouble, A->mb, 1, A->mb,
                              workmt * A->mb, worknt, 0, 0, workmt * A->mb, worknt, A->p, A->q,
-                             NULL, NULL, NULL );
+                             NULL, NULL, NULL, NULL );
         wcol_init = 1;
 
         chameleon_desc_init( &Welt, CHAMELEON_MAT_ALLOC_GLOBAL, ChamRealDouble, 1, 1, 1,
                              workmt, A->q, 0, 0, workmt, A->q, A->p, A->q,
-                             NULL, NULL, NULL );
+                             NULL, NULL, NULL, NULL );
         break;
 
         /*
@@ -440,7 +441,7 @@ void chameleon_pzlange_generic( cham_normtype_t norm, cham_uplo_t uplo, cham_dia
         alpha = 1.;
         chameleon_desc_init( &Welt, CHAMELEON_MAT_ALLOC_GLOBAL, ChamRealDouble, 2, 1, 2,
                              workmt*2, worknt, 0, 0, workmt*2, worknt, A->p, A->q,
-                             NULL, NULL, NULL );
+                             NULL, NULL, NULL, NULL );
         break;
 
         /*
@@ -452,7 +453,7 @@ void chameleon_pzlange_generic( cham_normtype_t norm, cham_uplo_t uplo, cham_dia
 
         chameleon_desc_init( &Welt, CHAMELEON_MAT_ALLOC_GLOBAL, ChamRealDouble, 1, 1, 1,
                              workmt, worknt, 0, 0, workmt, worknt, A->p, A->q,
-                             NULL, NULL, NULL );
+                             NULL, NULL, NULL, NULL );
     }
 
     /* Initialize workspaces */
diff --git a/compute/pzlansy.c b/compute/pzlansy.c
index c19aada11adfcb52cab8176e8955effa6ba040fc..9c427cee9181cb593c54d2a6703bb50d195f463b 100644
--- a/compute/pzlansy.c
+++ b/compute/pzlansy.c
@@ -11,14 +11,15 @@
  *
  * @brief Chameleon zlansy parallel algorithm
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @comment This file has been automatically generated
  *          from Plasma 2.6.0 for CHAMELEON 0.9.2
  * @author Emmanuel Agullo
  * @author Mathieu Faverge
  * @author Florent Pruvost
  * @author Alycia Lisito
- * @date 2022-02-22
+ * @author Lionel Eyraud-Dubois
+ * @date 2023-07-05
  * @precisions normal z -> c d s
  *
  */
@@ -330,7 +331,7 @@ void chameleon_pzlansy_generic( cham_normtype_t norm, cham_uplo_t uplo, cham_tra
 
         chameleon_desc_init( &Wcol, CHAMELEON_MAT_ALLOC_TILE, ChamRealDouble, A->mb, 1, A->mb,
                              workmt * A->mb, worknt, 0, 0, workmt * A->mb, worknt, A->p, A->q,
-                             NULL, NULL, NULL );
+                             NULL, NULL, NULL, NULL );
         wcol_init = 1;
 
         /*
@@ -338,7 +339,7 @@ void chameleon_pzlansy_generic( cham_normtype_t norm, cham_uplo_t uplo, cham_tra
          */
         chameleon_desc_init( &Welt, CHAMELEON_MAT_ALLOC_GLOBAL, ChamRealDouble, 1, 1, 1,
                              workmt, A->q, 0, 0, workmt, A->q, A->p, A->q,
-                             NULL, NULL, NULL );
+                             NULL, NULL, NULL, NULL );
         break;
 
         /*
@@ -350,7 +351,7 @@ void chameleon_pzlansy_generic( cham_normtype_t norm, cham_uplo_t uplo, cham_tra
         alpha = 1.;
         chameleon_desc_init( &Welt, CHAMELEON_MAT_ALLOC_GLOBAL, ChamRealDouble, 2, 1, 2,
                              workmt*2, worknt, 0, 0, workmt*2, worknt, A->p, A->q,
-                             NULL, NULL, NULL );
+                             NULL, NULL, NULL, NULL );
         break;
 
         /*
@@ -362,7 +363,7 @@ void chameleon_pzlansy_generic( cham_normtype_t norm, cham_uplo_t uplo, cham_tra
 
         chameleon_desc_init( &Welt, CHAMELEON_MAT_ALLOC_GLOBAL, ChamRealDouble, 1, 1, 1,
                              workmt, worknt, 0, 0, workmt, worknt, A->p, A->q,
-                             NULL, NULL, NULL );
+                             NULL, NULL, NULL, NULL );
     }
 
     /* Initialize workspaces */
diff --git a/compute/pzlatms.c b/compute/pzlatms.c
index 3881a9f9d43fdd8cc4dd65e977abf8e4cff24842..c8e1fa5a91eade31262f5e40a8a98b124b24281e 100644
--- a/compute/pzlatms.c
+++ b/compute/pzlatms.c
@@ -10,9 +10,10 @@
  *
  * @brief Chameleon zlatms parallel algorithm
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Mathieu Faverge
- * @date 2022-02-22
+ * @author Lionel Eyraud-Dubois
+ * @date 2023-07-05
  * @precisions normal z -> s d c
  *
  */
@@ -212,12 +213,12 @@ void chameleon_pzlatms( cham_dist_t idist, unsigned long long int seed, cham_sym
                              ChamComplexDouble, ib, descU.nb, ib * descU.nb,
                              ib * descU.mt, descU.nb * descU.nt, 0, 0,
                              ib * descU.mt, descU.nb * descU.nt, descU.p, descU.q,
-                             NULL, NULL, NULL );
+                             NULL, NULL, NULL, NULL );
         chameleon_desc_init( &descTT, CHAMELEON_MAT_ALLOC_TILE,
                              ChamComplexDouble, ib, descU.nb, ib * descU.nb,
                              ib * descU.mt, descU.nb * descU.nt, 0, 0,
                              ib * descU.mt, descU.nb * descU.nt, descU.p, descU.q,
-                             NULL, NULL, NULL );
+                             NULL, NULL, NULL, NULL );
 
         /* U <= qr(U) */
         chameleon_pzgeqrf_param( 1, kt, &qrtree, &descU,
@@ -283,12 +284,12 @@ void chameleon_pzlatms( cham_dist_t idist, unsigned long long int seed, cham_sym
                              ChamComplexDouble, ib, descV.nb, ib * descV.nb,
                              ib * descV.mt, descV.nb * descV.nt, 0, 0,
                              ib * descV.mt, descV.nb * descV.nt, descV.p, descV.q,
-                             NULL, NULL, NULL );
+                             NULL, NULL, NULL, NULL );
         chameleon_desc_init( &descTT, CHAMELEON_MAT_ALLOC_TILE,
                              ChamComplexDouble, ib, descV.nb, ib * descV.nb,
                              ib * descV.mt, descV.nb * descV.nt, 0, 0,
                              ib * descV.mt, descV.nb * descV.nt, descV.p, descV.q,
-                             NULL, NULL, NULL );
+                             NULL, NULL, NULL, NULL );
 
         /* V <= qr(V) */
         chameleon_pzgelqf_param( 1, kt, &qrtree, &descV,
diff --git a/compute/pzplrnk.c b/compute/pzplrnk.c
index c4367c4cc63d26cbdeb8d49fc6a042c8958febb1..368ddec75f0919a219cc72846458f4b0e6ccd161 100644
--- a/compute/pzplrnk.c
+++ b/compute/pzplrnk.c
@@ -9,10 +9,11 @@
  *
  * @brief Chameleon zplrnk parallel algorithm
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Mathieu Faverge
  * @author Florent Pruvost
- * @date 2022-02-22
+ * @author Lionel Eyraud-Dubois
+ * @date 2023-07-05
  * @precisions normal z -> s d c
  *
  */
@@ -48,12 +49,12 @@ void chameleon_pzplrnk( int K, CHAM_desc_t *C,
                          ChamComplexDouble, C->mb, C->nb, (C->mb * C->nb),
                          C->mt * C->mb, C->nb * C->q, 0, 0,
                          C->mt * C->mb, C->nb * C->q, C->p, C->q,
-                         NULL, NULL, NULL );
+                         NULL, NULL, NULL, NULL );
     chameleon_desc_init( &WB, CHAMELEON_MAT_ALLOC_TILE,
                          ChamComplexDouble, C->mb, C->nb, (C->mb * C->nb),
                          C->mb * C->p, C->nt * C->nb, 0, 0,
                          C->mb * C->p, C->nt * C->nb, C->p, C->q,
-                         NULL, NULL, NULL );
+                         NULL, NULL, NULL, NULL );
 
     KT = (K + C->mb - 1) / C->mb;
     myp = C->myrank / C->q;
diff --git a/compute/zcesca.c b/compute/zcesca.c
index 36c7358429cf53e498336338c33e6e176b41e6c6..76489d42f9b1241c701703cd9e7075cf7984381f 100644
--- a/compute/zcesca.c
+++ b/compute/zcesca.c
@@ -9,9 +9,10 @@
  *
  * @brief Chameleon zcesca wrappers
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Florent Pruvost
- * @date 2022-02-22
+ * @author Lionel Eyraud-Dubois
+ * @date 2023-07-05
  * @precisions normal z -> s d c z
  *
  */
@@ -61,31 +62,31 @@ void *CHAMELEON_zcesca_WS_Alloc( const CHAM_desc_t *A )
                          ChamComplexDouble, 1, A->nb, A->nb,
                          workmt, A->n, 0, 0,
                          workmt, A->n, A->p, A->q,
-                         NULL, NULL, NULL );
+                         NULL, NULL, NULL, NULL );
 
     chameleon_desc_init( &(options->Wgrow), CHAMELEON_MAT_ALLOC_TILE,
                          ChamComplexDouble, A->mb, 1, A->mb,
                          A->m, worknt, 0, 0,
                          A->m, worknt, A->p, A->q,
-                         NULL, NULL, NULL );
+                         NULL, NULL, NULL, NULL );
 
     chameleon_desc_init( &(options->Wgelt), CHAMELEON_MAT_ALLOC_TILE,
                          ChamComplexDouble, 1, 1, 1,
                          1, worknt, 0, 0,
                          1, worknt, A->p, A->q,
-                         NULL, NULL, NULL );
+                         NULL, NULL, NULL, NULL );
 
     chameleon_desc_init( &(options->Wdcol), CHAMELEON_MAT_ALLOC_TILE,
                          ChamRealDouble, 2, A->nb, 2*A->nb,
                          2*workmt, A->n, 0, 0,
                          2*workmt, A->n, A->p, A->q,
-                         NULL, NULL, NULL );
+                         NULL, NULL, NULL, NULL );
 
     chameleon_desc_init( &(options->Wdrow), CHAMELEON_MAT_ALLOC_TILE,
                          ChamRealDouble, A->mb, 2, 2*A->mb,
                          A->m, 2*worknt, 0, 0,
                          A->m, 2*worknt, A->p, A->q,
-                         NULL, NULL, NULL );
+                         NULL, NULL, NULL, NULL );
 
     return (void*)options;
 }
diff --git a/compute/zgemm.c b/compute/zgemm.c
index 320b0868a2b485085861c248eeb4268ba45a156d..d8892fe79051e2a27f9d2a45e2db435c00549f80 100644
--- a/compute/zgemm.c
+++ b/compute/zgemm.c
@@ -11,14 +11,15 @@
  *
  * @brief Chameleon zgemm wrappers
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @comment This file has been automatically generated
  *          from Plasma 2.5.0 for CHAMELEON 0.9.2
  * @author Mathieu Faverge
  * @author Emmanuel Agullo
  * @author Cedric Castagnede
  * @author Florent Pruvost
- * @date 2022-02-22
+ * @author Lionel Eyraud-Dubois
+ * @date 2023-07-05
  * @precisions normal z -> s d c
  *
  */
@@ -154,8 +155,12 @@ void *CHAMELEON_zgemm_WS_Alloc( cham_trans_t       transA __attribute__((unused)
         sizeB = ((double)B->m * (double)B->n) / (double)(B->p * B->q);
         sizeC = ((double)C->m * (double)C->n) / (double)(C->p * C->q) * ratio;
 
-        if ( (sizeC > sizeA) && (sizeC > sizeB) ) {
-            options->alg = ChamGemmAlgSummaC;
+        options->alg = ChamGemmAlgGeneric;
+        if ( (sizeC > sizeA) && (sizeC > sizeB) )
+        {
+            if ( C->get_rankof_init == chameleon_getrankof_2d ) {
+                options->alg = ChamGemmAlgSummaC;
+            }
         }
         else {
             if ( sizeA > sizeB ) {
@@ -170,8 +175,7 @@ void *CHAMELEON_zgemm_WS_Alloc( cham_trans_t       transA __attribute__((unused)
     assert( options->alg != ChamGemmAlgAuto );
 
     /* Now that we have decided which algorithm, let's allocate the required data structures. */
-    if ( (options->alg == ChamGemmAlgSummaC ) &&
-         (C->get_rankof_init == chameleon_getrankof_2d ) )
+    if ( options->alg == ChamGemmAlgSummaC )
     {
         int lookahead = chamctxt->lookahead;
 
@@ -179,12 +183,12 @@ void *CHAMELEON_zgemm_WS_Alloc( cham_trans_t       transA __attribute__((unused)
                              ChamComplexDouble, C->mb, C->nb, (C->mb * C->nb),
                              C->mt * C->mb, C->nb * C->q * lookahead, 0, 0,
                              C->mt * C->mb, C->nb * C->q * lookahead, C->p, C->q,
-                             NULL, NULL, NULL );
+                             NULL, NULL, NULL, NULL );
         chameleon_desc_init( &(options->WB), CHAMELEON_MAT_ALLOC_TILE,
                              ChamComplexDouble, C->mb, C->nb, (C->mb * C->nb),
                              C->mb * C->p * lookahead, C->nt * C->nb, 0, 0,
                              C->mb * C->p * lookahead, C->nt * C->nb, C->p, C->q,
-                             NULL, NULL, NULL );
+                             NULL, NULL, NULL, NULL );
     }
 
     return (void*)options;
diff --git a/compute/zgetrf.c b/compute/zgetrf.c
index 72c595373df2f4c95bf844597993b1c7ed8aec38..4a39cb5bba18ff489c69d81858626b5cdf955bbd 100644
--- a/compute/zgetrf.c
+++ b/compute/zgetrf.c
@@ -11,14 +11,15 @@
  *
  * @brief Chameleon zgetrf wrappers
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Omar Zenati
  * @author Mathieu Faverge
  * @author Emmanuel Agullo
  * @author Cedric Castagnede
  * @author Florent Pruvost
  * @author Matthieu Kuhn
- * @date 2023-02-21
+ * @author Lionel Eyraud-Dubois
+ * @date 2023-07-05
  *
  * @precisions normal z -> s d c
  *
@@ -86,7 +87,7 @@ CHAMELEON_zgetrf_WS_Alloc( const CHAM_desc_t *A )
                              ChamComplexDouble, 1, A->nb, A->nb,
                              A->mt, A->nt * A->nb, 0, 0,
                              A->mt, A->nt * A->nb, A->p, A->q,
-                             NULL, NULL, A->get_rankof_init );
+                             NULL, NULL, A->get_rankof_init, A->get_rankof_init_arg );
     }
 
     return ws;
diff --git a/compute/zgram.c b/compute/zgram.c
index fac51926e74db06951a18c0fdf74da451d835833..141f0ffcdb253a00f640f03cb965eed3f6a4f5c9 100644
--- a/compute/zgram.c
+++ b/compute/zgram.c
@@ -9,11 +9,12 @@
  *
  * @brief Chameleon zgram wrappers
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Mathieu Faverge
  * @author Florent Pruvost
  * @author Philippe Swartvagher
- * @date 2022-02-22
+ * @author Lionel Eyraud-Dubois
+ * @date 2023-07-05
  * @precisions normal z -> s d c z
  *
  */
@@ -64,13 +65,13 @@ void *CHAMELEON_zgram_WS_Alloc( const CHAM_desc_t *A )
                          ChamRealDouble, 2, A->nb, 2*A->nb,
                          2*workmt, A->n, 0, 0,
                          2*workmt, A->n, A->p, A->q,
-                         NULL, NULL, NULL );
+                         NULL, NULL, NULL, NULL );
 
     chameleon_desc_init( &(options->Welt), CHAMELEON_MAT_ALLOC_TILE,
                          ChamRealDouble, 2, 1, 2,
                          2, worknt, 0, 0,
                          2, worknt, A->p, A->q,
-                         NULL, NULL, NULL );
+                         NULL, NULL, NULL, NULL );
 
     return (void*)options;
 }
diff --git a/compute/zhemm.c b/compute/zhemm.c
index 92ea4650208184a5526e5f4b5a3f535938e735a6..8b01715c4480010e0fc0db4a97959b64cf0ca771 100644
--- a/compute/zhemm.c
+++ b/compute/zhemm.c
@@ -11,14 +11,15 @@
  *
  * @brief Chameleon zhemm wrappers
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @comment This file has been automatically generated
  *          from Plasma 2.5.0 for CHAMELEON 0.9.2
  * @author Mathieu Faverge
  * @author Emmanuel Agullo
  * @author Cedric Castagnede
  * @author Florent Pruvost
- * @date 2022-02-22
+ * @author Lionel Eyraud-Dubois
+ * @date 2023-07-05
  * @precisions normal z -> c
  *
  */
@@ -158,12 +159,12 @@ void *CHAMELEON_zhemm_WS_Alloc( cham_side_t        side __attribute__((unused)),
                              ChamComplexDouble, C->mb, C->nb, (C->mb * C->nb),
                              C->mt * C->mb, C->nb * C->q * lookahead, 0, 0,
                              C->mt * C->mb, C->nb * C->q * lookahead, C->p, C->q,
-                             NULL, NULL, NULL );
+                             NULL, NULL, NULL, NULL );
         chameleon_desc_init( &(options->WB), CHAMELEON_MAT_ALLOC_TILE,
                              ChamComplexDouble, C->mb, C->nb, (C->mb * C->nb),
                              C->mb * C->p * lookahead, C->nt * C->nb, 0, 0,
                              C->mb * C->p * lookahead, C->nt * C->nb, C->p, C->q,
-                             NULL, NULL, NULL );
+                             NULL, NULL, NULL, NULL );
     }
 
     return (void*)options;
diff --git a/compute/zprint.c b/compute/zprint.c
index 2329d1a9bbfe25b286f29857e0cfea41b9254b62..1ef093253451083057c7515a949f50edbfe608c8 100644
--- a/compute/zprint.c
+++ b/compute/zprint.c
@@ -9,10 +9,10 @@
  *
  * @brief Chameleon zprint wrappers
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Mathieu Faverge
  * @author Matthieu Kuhn
- * @date 2022-02-22
+ * @date 2023-07-05
  * @precisions normal z -> s d c
  *
  */
@@ -42,7 +42,7 @@ zprint( const CHAM_desc_t *descA,
 
     int tempmm = m == descA->mt-1 ? descA->m-m*descA->mb : descA->mb;
     int tempnn = n == descA->nt-1 ? descA->n-n*descA->nb : descA->nb;
-    int lda, i;
+    int lda;
 
     if ( zprint_runtime_id == RUNTIME_SCHED_PARSEC ) {
         A   = (CHAMELEON_Complex64_t*)tileA;
diff --git a/compute/zsymm.c b/compute/zsymm.c
index fe680aa2850c6b067fa932621b00a319fcd53c4e..f493497b8dec3be6f7f6de79bfc9c4c654e0ca36 100644
--- a/compute/zsymm.c
+++ b/compute/zsymm.c
@@ -11,14 +11,15 @@
  *
  * @brief Chameleon zsymm wrappers
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @comment This file has been automatically generated
  *          from Plasma 2.5.0 for CHAMELEON 0.9.2
  * @author Mathieu Faverge
  * @author Emmanuel Agullo
  * @author Cedric Castagnede
  * @author Florent Pruvost
- * @date 2022-02-22
+ * @author Lionel Eyraud-Dubois
+ * @date 2023-07-05
  * @precisions normal z -> s d c
  *
  */
@@ -158,12 +159,12 @@ void *CHAMELEON_zsymm_WS_Alloc( cham_side_t        side __attribute__((unused)),
                              ChamComplexDouble, C->mb, C->nb, (C->mb * C->nb),
                              C->mt * C->mb, C->nb * C->q * lookahead, 0, 0,
                              C->mt * C->mb, C->nb * C->q * lookahead, C->p, C->q,
-                             NULL, NULL, NULL );
+                             NULL, NULL, NULL, NULL );
         chameleon_desc_init( &(options->WB), CHAMELEON_MAT_ALLOC_TILE,
                              ChamComplexDouble, C->mb, C->nb, (C->mb * C->nb),
                              C->mb * C->p * lookahead, C->nt * C->nb, 0, 0,
                              C->mb * C->p * lookahead, C->nt * C->nb, C->p, C->q,
-                             NULL, NULL, NULL );
+                             NULL, NULL, NULL, NULL );
     }
 
     return (void*)options;
diff --git a/compute/ztile.c b/compute/ztile.c
index bdcfd29e7c3a4ea146711b0f46412f715eae8860..2e270790871d76008ac29d663f194ef7e0def040 100644
--- a/compute/ztile.c
+++ b/compute/ztile.c
@@ -11,12 +11,13 @@
  *
  * @brief Chameleon auxiliary routines
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Jakub Kurzak
  * @author Mathieu Faverge
  * @author Cedric Castagnede
  * @author Florent Pruvost
- * @date 2022-02-22
+ * @author Lionel Eyraud-Dubois
+ * @date 2023-07-05
  * @precisions normal z -> s d c
  *
  */
@@ -139,7 +140,7 @@ int CHAMELEON_zLap2Desc( cham_uplo_t uplo, CHAMELEON_Complex64_t *Af77, int LDA,
     /* Create the B descriptor to handle the Lapack format matrix */
     status = CHAMELEON_Desc_Create_User( &B, Af77, ChamComplexDouble, A->mb, A->nb, A->bsiz,
                                          LDA, A->n, 0, 0, A->m, A->n, 1, 1,
-                                         chameleon_getaddr_cm, chameleon_getblkldd_cm, NULL );
+                                         chameleon_getaddr_cm, chameleon_getblkldd_cm, NULL, NULL );
     if ( status != CHAMELEON_SUCCESS ) {
         chameleon_error("CHAMELEON_zTile_to_Lapack", "Failed to create the descriptor");
         return status;
@@ -223,7 +224,7 @@ int CHAMELEON_zDesc2Lap( cham_uplo_t uplo, CHAM_desc_t *A, CHAMELEON_Complex64_t
     /* Create the B descriptor to handle the Lapack format matrix */
     status = CHAMELEON_Desc_Create_User( &B, Af77, ChamComplexDouble, A->mb, A->nb, A->bsiz,
                                          LDA, A->n, 0, 0, A->m, A->n, 1, 1,
-                                         chameleon_getaddr_cm, chameleon_getblkldd_cm, NULL );
+                                         chameleon_getaddr_cm, chameleon_getblkldd_cm, NULL, NULL );
     if ( status != CHAMELEON_SUCCESS ) {
         chameleon_error("CHAMELEON_zTile_to_Lapack", "Failed to create the descriptor");
         return status;
diff --git a/control/auxiliary.c b/control/auxiliary.c
index d299d8fa8b47f9c5e2eb04f6a66c62c8dbafdc78..15fc1905e108ae08ced208a05fa2d1e85fe8d184 100644
--- a/control/auxiliary.c
+++ b/control/auxiliary.c
@@ -19,7 +19,7 @@
  * @author Florent Pruvost
  * @author Guillaume Sylvand
  * @author Mathieu Faverge
- * @date 2023-07-04
+ * @date 2023-07-05
  *
  ***
  *
@@ -78,7 +78,7 @@ void chameleon_warning(const char *func_name, const char *msg_text)
  */
 void chameleon_error(const char *func_name, const char *msg_text)
 {
-    fprintf(stderr, "CHAMELEON ERROR: %s(): %s\n", func_name, msg_text);
+    fprintf( stderr, "CHAMELEON ERROR: %s(): %s\n", func_name, msg_text );
 }
 
 /**
diff --git a/control/chameleon_f77.c b/control/chameleon_f77.c
index 21a6316ee95448b02147bf517c4d31878bfee8d4..648c80793c027005fcbe723f0aa7e284da7344ed 100644
--- a/control/chameleon_f77.c
+++ b/control/chameleon_f77.c
@@ -11,13 +11,14 @@
  *
  * @brief Chameleon Fortran77 interface
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Bilel Hadri
  * @author Cedric Castagnede
  * @author Florent Pruvost
  * @author Mathieu Faverge
  * @author Philippe Virouleau
- * @date 2022-02-22
+ * @author Lionel Eyraud-Dubois
+ * @date 2023-07-05
  *
  */
 #include "control/common.h"
@@ -80,16 +81,18 @@ extern "C" {
                                 void* (*get_blkaddr)( const CHAM_desc_t*, int, int ),
                                 int   (*get_blkldd) ( const CHAM_desc_t*, int      ),
                                 int   (*get_rankof) ( const CHAM_desc_t*, int, int ),
+                                void* get_rankof_arg,
                                 int *INFO)
     {   *INFO = CHAMELEON_Desc_Create_User(descptr, mat, *dtyp, *mb, *nb, *bsiz, *lm, *ln, *i, *j, *m, *n, *p, *q,
-                                       get_blkaddr, get_blkldd, get_rankof); }
+                                           get_blkaddr, get_blkldd, get_rankof, get_rankof_arg); }
     void CHAMELEON_DESC_CREATE_OOC_USER(CHAM_desc_t **descptr, cham_flttype_t *dtyp,
                                     int *mb, int *nb, int *bsiz, int *lm, int *ln,
                                     int *i, int *j, int *m, int *n, int *p, int *q,
                                     int (*get_rankof) ( const CHAM_desc_t*, int, int ),
+                                    void* get_rankof_arg,
                                     int *INFO)
     {   *INFO = CHAMELEON_Desc_Create_OOC_User(descptr, *dtyp, *mb, *nb, *bsiz, *lm, *ln, *i, *j, *m, *n, *p, *q,
-                                           get_rankof); }
+                                               get_rankof, get_rankof_arg); }
 
     void CHAMELEON_DESC_DESTROY(CHAM_desc_t **desc, int *INFO)
     {   *INFO = CHAMELEON_Desc_Destroy(desc); }
diff --git a/control/compute_z.h b/control/compute_z.h
index 634bd2d5cf8088a8cab84724a9c1d82498d70610..8bec9da5fa4bab356cde2bdb61b7717ffd086fde 100644
--- a/control/compute_z.h
+++ b/control/compute_z.h
@@ -11,7 +11,7 @@
  *
  * @brief Chameleon computational functions header
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @comment This file has been automatically generated
  *          from Plasma 2.5.0 for CHAMELEON 0.9.2
  * @author Jakub Kurzak
@@ -21,7 +21,8 @@
  * @author Florent Pruvost
  * @author Alycia Lisito
  * @author Matthieu Kuhn
- * @date 2023-02-21
+ * @author Lionel Eyraud-Dubois
+ * @date 2023-07-05
  * @precisions normal z -> c d s
  *
  */
@@ -219,7 +220,7 @@ chameleon_zdesc_alloc_diag( CHAM_desc_t *descA, int nb, int m, int n, int p, int
                                 diag_m, nb, 0, 0, diag_m, nb, p, q,
                                 chameleon_getaddr_diag,
                                 chameleon_getblkldd_ccrb,
-                                chameleon_getrankof_2d_diag );
+                                chameleon_getrankof_2d_diag, NULL );
 }
 
 #define chameleon_zdesc_alloc( descA, mb, nb, lm, ln, i, j, m, n, free) \
@@ -228,7 +229,7 @@ chameleon_zdesc_alloc_diag( CHAM_desc_t *descA, int nb, int m, int n, int p, int
         rc = chameleon_desc_init( &(descA), CHAMELEON_MAT_ALLOC_GLOBAL, \
                                   ChamComplexDouble, (mb), (nb), ((mb)*(nb)), \
                                   (m), (n), (i), (j), (m), (n), 1, 1,   \
-                                  NULL, NULL, NULL );                   \
+                                  NULL, NULL, NULL, NULL );             \
         if ( rc != CHAMELEON_SUCCESS ) {                                \
             {free;}                                                     \
             return rc;                                                  \
@@ -254,7 +255,7 @@ chameleon_zdesc_copy_and_restrict( const CHAM_desc_t *descIn,
                               m, n, 0, 0, m, n, descIn->p, descIn->q,
                               descIn->get_blkaddr,
                               descIn->get_blkldd,
-                              descIn->get_rankof_init );
+                              descIn->get_rankof_init, descIn->get_rankof_init_arg );
     return rc;
 }
 
@@ -273,13 +274,13 @@ chameleon_zlap2tile( CHAM_context_t *chamctxt,
         /* Initialize the Lapack descriptor */
         chameleon_desc_init( descAl, A, ChamComplexDouble, mb, nb, (mb)*(nb),
                             lm, ln, 0, 0, m, n, 1, 1,
-                            chameleon_getaddr_cm, chameleon_getblkldd_cm, NULL  );
+                             chameleon_getaddr_cm, chameleon_getblkldd_cm, NULL, NULL );
         descAl->styp = ChamCM;
 
         /* Initialize the tile descriptor */
         chameleon_desc_init( descAt, CHAMELEON_MAT_ALLOC_TILE, ChamComplexDouble, mb, nb, (mb)*(nb),
                              lm, ln, 0, 0, m, n, 1, 1,
-                             chameleon_getaddr_ccrb, chameleon_getblkldd_ccrb, NULL );
+                             chameleon_getaddr_ccrb, chameleon_getblkldd_ccrb, NULL, NULL );
 
         if ( mode & ChamDescInput ) {
             chameleon_pzlacpy( uplo, descAl, descAt, seq, req );
@@ -289,7 +290,7 @@ chameleon_zlap2tile( CHAM_context_t *chamctxt,
         /* Initialize the tile descriptor */
         chameleon_desc_init( descAt, A, ChamComplexDouble, mb, nb, (mb)*(nb),
                              lm, ln, 0, 0, m, n, 1, 1,
-                             chameleon_getaddr_cm, chameleon_getblkldd_cm, NULL );
+                             chameleon_getaddr_cm, chameleon_getblkldd_cm, NULL, NULL );
     }
     return CHAMELEON_SUCCESS;
 }
diff --git a/control/descriptor.c b/control/descriptor.c
index c5e4ca2d23ebd0507c752c8b0852ad6edbe1ee82..1436ad25d7c195bfa173b8f5ed2e70cf4c3ad2a2 100644
--- a/control/descriptor.c
+++ b/control/descriptor.c
@@ -18,7 +18,8 @@
  * @author Guillaume Sylvand
  * @author Raphael Boucherie
  * @author Samuel Thibault
- * @date 2023-07-04
+ * @author Lionel Eyraud-Dubois
+ * @date 2023-07-05
  *
  ***
  *
@@ -169,6 +170,9 @@ void chameleon_desc_init_tiles( CHAM_desc_t *desc, blkrankof_fct_t rankof )
  * @param[in] get_rankof
  *          A function that return the MPI rank of the tile A(m,n).
  *
+ * @param[in] get_rankof_arg
+ *          A pointer to custom data that can be used by the get_rankof function
+ *
  ******************************************************************************
  *
  * @return  The descriptor with the matrix description parameters set.
@@ -179,7 +183,8 @@ int chameleon_desc_init_internal( CHAM_desc_t *desc, const char *name, void *mat
                                   int lm, int ln, int m, int n, int p, int q,
                                   blkaddr_fct_t   get_blkaddr,
                                   blkldd_fct_t    get_blkldd,
-                                  blkrankof_fct_t get_rankof )
+                                  blkrankof_fct_t get_rankof,
+                                  void           *get_rankof_arg )
 {
     CHAM_context_t *chamctxt;
     int rc = CHAMELEON_SUCCESS;
@@ -200,6 +205,7 @@ int chameleon_desc_init_internal( CHAM_desc_t *desc, const char *name, void *mat
     desc->get_blkldd  = get_blkldd  ? get_blkldd  : chameleon_getblkldd_ccrb;
     desc->get_rankof  = chameleon_getrankof_tile;
     desc->get_rankof_init = get_rankof ? get_rankof : chameleon_getrankof_2d;
+    desc->get_rankof_init_arg = get_rankof_arg;
 
     /* Matrix properties */
     desc->dtyp = dtyp;
@@ -492,9 +498,17 @@ CHAMELEON_Desc_SubMatrix( CHAM_desc_t *descA, int i, int j, int m, int n )
 int CHAMELEON_Desc_Create( CHAM_desc_t **descptr, void *mat, cham_flttype_t dtyp, int mb, int nb, int bsiz,
                            int lm, int ln, int i, int j, int m, int n, int p, int q )
 {
+    blkrankof_fct_t get_rankof = NULL;
+
+    /* if (getenv("CHAMELEON_1Dx1D_DISTRIBUTION")){ */
+    /*     printf("[CHAMELEON] : Using 1Dx1D distribubtion\n"); */
+    /*     get_rankof = chameleon_getrankof_custom; */
+    /*     load_dist(&custom_dist_a, m, n, mb, nb); */
+    /* } */
+
     return CHAMELEON_Desc_Create_User( descptr, mat, dtyp, mb, nb, bsiz,
                                        lm, ln, i, j, m, n, p, q,
-                                       NULL, NULL, NULL );
+                                       NULL, NULL, get_rankof, NULL );
 }
 
 /**
@@ -564,6 +578,9 @@ int CHAMELEON_Desc_Create( CHAM_desc_t **descptr, void *mat, cham_flttype_t dtyp
  * @param[in] get_rankof
  *          A function that return the MPI rank of the tile A(m,n).
  *
+ * @param[in] get_rankof_arg
+ *          A pointer to custom data that can be used by the get_rankof function
+ *
  ******************************************************************************
  *
  * @retval CHAMELEON_SUCCESS successful exit
@@ -573,7 +590,8 @@ int CHAMELEON_Desc_Create_User( CHAM_desc_t **descptr, void *mat, cham_flttype_t
                                 int lm, int ln, int i, int j, int m, int n, int p, int q,
                                 blkaddr_fct_t   get_blkaddr,
                                 blkldd_fct_t    get_blkldd,
-                                blkrankof_fct_t get_rankof )
+                                blkrankof_fct_t get_rankof,
+                                void* get_rankof_arg )
 {
     CHAM_context_t *chamctxt;
     CHAM_desc_t *desc;
@@ -594,7 +612,7 @@ int CHAMELEON_Desc_Create_User( CHAM_desc_t **descptr, void *mat, cham_flttype_t
 
     chameleon_desc_init( desc, mat, dtyp, mb, nb, bsiz,
                          lm, ln, i, j, m, n, p, q,
-                         get_blkaddr, get_blkldd, get_rankof );
+                         get_blkaddr, get_blkldd, get_rankof, get_rankof_arg );
 
     status = chameleon_desc_check( desc );
     if (status != CHAMELEON_SUCCESS) {
@@ -663,6 +681,9 @@ int CHAMELEON_Desc_Create_User( CHAM_desc_t **descptr, void *mat, cham_flttype_t
  * @param[in] get_rankof
  *          A function that return the MPI rank of the tile A(m,n).
  *
+ * @param[in] get_rankof_arg
+ *          A pointer to custom data that can be used by the get_rankof function
+ *
  ******************************************************************************
  *
  * @retval CHAMELEON_SUCCESS successful exit
@@ -670,7 +691,7 @@ int CHAMELEON_Desc_Create_User( CHAM_desc_t **descptr, void *mat, cham_flttype_t
  */
 int CHAMELEON_Desc_Create_OOC_User(CHAM_desc_t **descptr, cham_flttype_t dtyp, int mb, int nb, int bsiz,
                                    int lm, int ln, int i, int j, int m, int n, int p, int q,
-                                   blkrankof_fct_t get_rankof )
+                                   blkrankof_fct_t get_rankof, void* get_rankof_arg )
 {
 #if !defined (CHAMELEON_SCHED_STARPU)
     (void)descptr; (void)dtyp; (void)mb; (void)nb; (void)bsiz;
@@ -683,7 +704,7 @@ int CHAMELEON_Desc_Create_OOC_User(CHAM_desc_t **descptr, cham_flttype_t dtyp, i
     int rc;
     rc = CHAMELEON_Desc_Create_User( descptr, CHAMELEON_MAT_OOC, dtyp, mb, nb, bsiz,
                                      lm, ln, i, j, m, n, p, q,
-                                     chameleon_getaddr_null, NULL, get_rankof );
+                                     chameleon_getaddr_null, NULL, get_rankof, get_rankof_arg );
     return rc;
 #endif
 }
@@ -751,7 +772,7 @@ int CHAMELEON_Desc_Create_OOC(CHAM_desc_t **descptr, cham_flttype_t dtyp, int mb
 {
     return CHAMELEON_Desc_Create_User( descptr, CHAMELEON_MAT_OOC, dtyp, mb, nb, bsiz,
                                        lm, ln, i, j, m, n, p, q,
-                                       chameleon_getaddr_null, NULL, NULL );
+                                       chameleon_getaddr_null, NULL, NULL, NULL );
 }
 
 /**
@@ -785,7 +806,7 @@ CHAM_desc_t *CHAMELEON_Desc_Copy( const CHAM_desc_t *descin, void *mat )
     CHAMELEON_Desc_Create_User( &descout, mat,
                                 descin->dtyp, descin->mb, descin->nb, descin->bsiz,
                                 descin->lm, descin->ln, descin->i, descin->j, descin->m, descin->n, descin->p, descin->q,
-                                NULL, NULL, descin->get_rankof_init );
+                                NULL, NULL, descin->get_rankof_init, descin->get_rankof_init_arg );
     return descout;
 }
 
@@ -820,7 +841,7 @@ CHAM_desc_t *CHAMELEON_Desc_CopyOnZero( const CHAM_desc_t *descin, void *mat )
     CHAMELEON_Desc_Create_User( &descout, mat,
                                 descin->dtyp, descin->mb, descin->nb, descin->bsiz,
                                 descin->lm, descin->ln, descin->i, descin->j, descin->m, descin->n, 1, 1,
-                                NULL, NULL, descin->get_rankof_init );
+                                NULL, NULL, descin->get_rankof_init, descin->get_rankof_init_arg );
     return descout;
 }
 
@@ -1043,7 +1064,8 @@ CHAMELEON_Desc_Print( const CHAM_desc_t *desc )
  */
 int CHAMELEON_Desc_Change_Distribution( cham_uplo_t      uplo,
                                         CHAM_desc_t     *desc,
-                                        blkrankof_fct_t  new_get_rankof )
+                                        blkrankof_fct_t  new_get_rankof,
+                                        void*            new_get_rankof_arg )
 {
     int                 status;
     CHAM_context_t     *chamctxt;
@@ -1057,7 +1079,7 @@ int CHAMELEON_Desc_Change_Distribution( cham_uplo_t      uplo,
 
     chameleon_sequence_create( chamctxt, &sequence );
 
-    CHAMELEON_Desc_Change_Distribution_Async( uplo, desc, new_get_rankof, sequence );
+    CHAMELEON_Desc_Change_Distribution_Async( uplo, desc, new_get_rankof, new_get_rankof_arg, sequence );
 
     RUNTIME_desc_flush( desc, sequence );
     chameleon_sequence_wait( chamctxt, sequence );
@@ -1098,6 +1120,7 @@ int CHAMELEON_Desc_Change_Distribution( cham_uplo_t      uplo,
 int CHAMELEON_Desc_Change_Distribution_Async( cham_uplo_t         uplo,
                                               CHAM_desc_t        *desc,
                                               blkrankof_fct_t     new_get_rankof,
+                                              void*               new_get_rankof_arg,
                                               RUNTIME_sequence_t *sequence )
 {
     CHAM_context_t *chamctxt;
@@ -1111,7 +1134,8 @@ int CHAMELEON_Desc_Change_Distribution_Async( cham_uplo_t         uplo,
     }
 
     /* Nothing to do if the new mapping is the same as the original one */
-    if ( ( new_get_rankof == desc->get_rankof_init ) ||
+    if ( ( ( new_get_rankof     == desc->get_rankof_init    ) &&
+           ( new_get_rankof_arg == desc->get_rankof_init_arg) ) ||
          ( RUNTIME_comm_size( chamctxt ) == 1 ) )
     {
         return CHAMELEON_SUCCESS;
@@ -1132,6 +1156,8 @@ int CHAMELEON_Desc_Change_Distribution_Async( cham_uplo_t         uplo,
     }
 #endif
 
+    desc->get_rankof_init_arg = new_get_rankof_arg;
+
     for ( n = 0; n < desc->nt; n++ ) {
         mmin = ( uplo == ChamLower ) ? chameleon_min( n,   desc->mt ) : 0;
         mmax = ( uplo == ChamUpper ) ? chameleon_min( n+1, desc->mt ) : desc->mt;
diff --git a/control/descriptor.h b/control/descriptor.h
index 96bf0bf0bc7f264f44beea28660de358c35a7a90..38153b6b2bc444155315d249139236a827a2b1de 100644
--- a/control/descriptor.h
+++ b/control/descriptor.h
@@ -19,7 +19,8 @@
  * @author Guillaume Sylvand
  * @author Raphael Boucherie
  * @author Samuel Thibault
- * @date 2023-07-04
+ * @author Lionel Eyraud-Dubois
+ * @date 2023-07-05
  *
  */
 #ifndef _chameleon_descriptor_h_
@@ -48,7 +49,8 @@ int chameleon_desc_init_internal( CHAM_desc_t *desc, const char *name, void *mat
                                   int lm, int ln, int m, int n, int p, int q,
                                   void* (*get_blkaddr)( const CHAM_desc_t*, int, int ),
                                   int   (*get_blkldd) ( const CHAM_desc_t*, int      ),
-                                  int   (*get_rankof) ( const CHAM_desc_t*, int, int ) );
+                                  int   (*get_rankof) ( const CHAM_desc_t*, int, int ),
+                                  void* get_rankof_arg );
 
 
 static inline int chameleon_desc_init( CHAM_desc_t *desc, void *mat,
@@ -57,7 +59,8 @@ static inline int chameleon_desc_init( CHAM_desc_t *desc, void *mat,
                                        int m,  int n,  int p, int q,
                                        void* (*get_blkaddr)( const CHAM_desc_t*, int, int ),
                                        int   (*get_blkldd) ( const CHAM_desc_t*, int      ),
-                                       int   (*get_rankof) ( const CHAM_desc_t*, int, int ) )
+                                       int   (*get_rankof) ( const CHAM_desc_t*, int, int ),
+                                       void* get_rankof_arg)
 {
     assert( i == 0 );
     assert( j == 0 );
@@ -66,7 +69,7 @@ static inline int chameleon_desc_init( CHAM_desc_t *desc, void *mat,
     (void)i;
     (void)j;
     return chameleon_desc_init_internal( desc, NULL, mat, dtyp, mb, nb, lm, ln, m, n, p, q,
-                                         get_blkaddr, get_blkldd, get_rankof );
+                                         get_blkaddr, get_blkldd, get_rankof, get_rankof_arg );
 }
 
 CHAM_desc_t* chameleon_desc_submatrix( CHAM_desc_t *descA, int i, int j, int m, int n );
diff --git a/control/descriptor_helpers.c b/control/descriptor_helpers.c
index dd5c3981d257af213bcdf54f47604a9d153449f9..f11e487d32d578577534de023b37179765e263ff 100644
--- a/control/descriptor_helpers.c
+++ b/control/descriptor_helpers.c
@@ -11,14 +11,15 @@
  *
  * @brief Chameleon descriptors routines
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Mathieu Faverge
  * @author Cedric Castagnede
  * @author Florent Pruvost
  * @author Guillaume Sylvand
  * @author Raphael Boucherie
  * @author Samuel Thibault
- * @date 2022-02-22
+ * @author Lionel Eyraud-Dubois
+ * @date 2023-07-05
  *
  ***
  *
@@ -81,6 +82,149 @@ int chameleon_getrankof_2d_diag( const CHAM_desc_t *A, int m, int n )
     return (mm % A->p) * A->q + (mm % A->q);
 }
 
+/**
+ * @brief Initializes a custom distribution based on an external file.
+ *
+ *  External file format: First line contains the dimensions M and N (space-separated)
+ *  Next M lines each have N integers (with values from 1 to number of nodes)
+ *
+ *
+ * @param[out] custom_dist
+ *        On exit, the resulting custom distribution
+ *
+ * @param[in] dist_file
+ *        The path to the external file to be read
+ *
+ * @return CHAMELEON_SUCCESS on successful exit, CHAMELEON_ERR_OUT_OF_RESOURCES
+ *         or CHAMELEON_ERR_ILLEGAL_VALUE on issue.
+ *
+ */
+int chameleon_getrankof_custom_init( custom_dist_t **custom_dist,
+                                     const char     *dist_file )
+{
+    custom_dist_t *result;
+    FILE          *f;
+    int            i, j, rc;
+    int            np, dist_m, dist_n;
+
+    *custom_dist = NULL;
+
+    /* Get number of processes to check for correctness */
+    np = CHAMELEON_Comm_size();
+
+    /* Allocate memory */
+    result = (custom_dist_t*) malloc( sizeof(custom_dist_t) );
+    if ( result == NULL ) {
+        chameleon_error( "chameleon_getrankof_custom_init", "malloc() failed" );
+        return CHAMELEON_ERR_OUT_OF_RESOURCES;
+    }
+
+    result->dist_file = dist_file;
+    f = fopen( result->dist_file , "r" );
+    if ( f == NULL ) {
+        char message[300];
+        snprintf( message, 300, "could not open file '%s'", dist_file );
+        chameleon_error( "chameleon_getrankof_custom_init", message );
+        free( result );
+        return CHAMELEON_ERR_ILLEGAL_VALUE;
+    }
+
+    rc = fscanf( f, "%d %d", &dist_m, &dist_n );
+    if ( rc < 2 ) {
+        char message[300];
+        snprintf( message, 300, "could not read m and n in file '%s'", dist_file );
+        chameleon_error( "chameleon_getrankof_custom_init", message );
+        free( result );
+        fclose( f );
+        return CHAMELEON_ERR_ILLEGAL_VALUE;
+    }
+
+    result->dist_m = dist_m;
+    result->dist_n = dist_n;
+
+    result->blocks_dist = (int*) malloc( sizeof(int) * dist_m * dist_n );
+    if ( result->blocks_dist == NULL ) {
+        chameleon_error( "chameleon_getrankof_custom_init", "could not allocate blocks table" );
+        free( result );
+        fclose( f );
+        return CHAMELEON_ERR_OUT_OF_RESOURCES;
+    }
+
+    for(i = 0; i < dist_m; i++) {
+        for(j = 0; j < dist_n; j++) {
+            int rank;
+
+            rc = fscanf( f, "%d", &rank );
+            if ( rc < 1 ) {
+                char message[300];
+                snprintf(message, 300, "file '%s': could not read value at position (%d, %d)", dist_file, i, j );
+                chameleon_error( "chameleon_getrankof_custom_init", message );
+                free( result->blocks_dist );
+                free( result );
+                fclose( f );
+                return CHAMELEON_ERR_ILLEGAL_VALUE;
+            }
+
+            if ( (rank < 0 ) || (rank >= np) )
+            {
+                char message[300];
+                snprintf( message, 300, "file '%s': value %d at position (%d, %d) is invalid with %d processes",
+                          dist_file, rank, i, j, np );
+                chameleon_error( "chameleon_getrankof_custom_init", message );
+                free( result->blocks_dist );
+                free( result );
+                fclose( f );
+                return CHAMELEON_ERR_ILLEGAL_VALUE;
+            }
+
+            result->blocks_dist[j * dist_m + i] = rank;
+        }
+    }
+    fclose(f);
+
+    *custom_dist = result;
+    return CHAMELEON_SUCCESS;
+}
+
+/**
+ * @brief Destroys a custom distribution based on an external file.
+ *
+ * @param[int] dist
+ *        The custom distribution to be destroyed
+ *
+ * @return CHAMELEON_SUCCESS on successful exit, CHAMELEON_ERR_UNALLOCATED otherwise.
+ *
+ */
+int
+chameleon_getrankof_custom_destroy( custom_dist_t **dist )
+{
+    if ((dist == NULL) || (*dist == NULL)) {
+        chameleon_error("chameleon_getrankof_custom_destroy", "attempting to destroy a NULL descriptor");
+        return CHAMELEON_ERR_UNALLOCATED;
+    }
+
+    free((*dist)->blocks_dist);
+    free(*dist);
+    *dist = NULL;
+    return CHAMELEON_SUCCESS;
+}
+
+/**
+ * @brief Internal function to return MPI rank of block (m,n) in distribution
+ * custom from dist file
+ *
+ * @param[in] desc matrix
+ * @param[in] m row index of tile to consider
+ * @param[in] n column index of tile to consider
+ *
+ * @return The rank of the tile at coordinate (m, n).
+ */
+int chameleon_getrankof_custom( const CHAM_desc_t *desc, int m, int n )
+{
+    custom_dist_t *dist = desc->get_rankof_init_arg;
+    return dist->blocks_dist[(n % dist->dist_n) * dist->dist_m + (m % dist->dist_m)];
+}
+
 /**
  * @brief Return the address of the tile A( m, n ) in a tile storage.
  *
diff --git a/control/descriptor_rec.c b/control/descriptor_rec.c
index a69171411fc4464d53e0a48cd72248da43813481..058758b66179881742c6882d2ec0d8732b2593c7 100644
--- a/control/descriptor_rec.c
+++ b/control/descriptor_rec.c
@@ -11,10 +11,11 @@
  *
  * @brief Chameleon descriptors routines
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Mathieu Faverge
  * @author Gwenole Lucas
- * @date 2022-02-22
+ * @author Lionel Eyraud-Dubois
+ * @date 2023-07-05
  *
  */
 #include "control/common.h"
@@ -24,7 +25,8 @@ static int
 chameleon_recdesc_create( const char *name, CHAM_desc_t **descptr, void *mat, cham_flttype_t dtyp,
                           int *mb, int *nb,
                           int lm, int ln, int m, int n, int p, int q,
-                          blkaddr_fct_t get_blkaddr, blkldd_fct_t get_blkldd, blkrankof_fct_t get_rankof )
+                          blkaddr_fct_t get_blkaddr, blkldd_fct_t get_blkldd,
+                          blkrankof_fct_t get_rankof, void* get_rankof_arg )
 {
     CHAM_context_t *chamctxt;
     CHAM_desc_t    *desc;
@@ -49,7 +51,7 @@ chameleon_recdesc_create( const char *name, CHAM_desc_t **descptr, void *mat, ch
     desc = (CHAM_desc_t*)malloc(sizeof(CHAM_desc_t));
     rc = chameleon_desc_init_internal( desc, name, mat, dtyp, mb[0], nb[0],
                                        lm, ln, m, n, p, q,
-                                       get_blkaddr, get_blkldd, get_rankof );
+                                       get_blkaddr, get_blkldd, get_rankof, get_rankof_arg );
     *descptr = desc;
 
     if ( rc != CHAMELEON_SUCCESS ) {
@@ -81,7 +83,7 @@ chameleon_recdesc_create( const char *name, CHAM_desc_t **descptr, void *mat, ch
                                            tile->ld, tempnn, /* Abuse as ln is not used */
                                            tempmm, tempnn,
                                            1, 1,             /* can recurse only on local data */
-                                           chameleon_getaddr_cm, chameleon_getblkldd_cm, NULL);
+                                           chameleon_getaddr_cm, chameleon_getblkldd_cm, NULL, NULL);
 
             tile->format = CHAMELEON_TILE_DESC;
             tile->mat    = tiledesc;
@@ -98,7 +100,8 @@ chameleon_recdesc_create( const char *name, CHAM_desc_t **descptr, void *mat, ch
 int
 CHAMELEON_Recursive_Desc_Create( CHAM_desc_t **descptr, void *mat, cham_flttype_t dtyp,
                                  int *mb, int *nb, int lm, int ln, int m, int n, int p, int q,
-                                 blkaddr_fct_t get_blkaddr, blkldd_fct_t get_blkldd, blkrankof_fct_t get_rankof )
+                                 blkaddr_fct_t get_blkaddr, blkldd_fct_t get_blkldd,
+                                 blkrankof_fct_t get_rankof, void* get_rankof_arg )
 {
     /*
      * The first layer must be allocated, otherwise we will give unitialized
@@ -109,5 +112,5 @@ CHAMELEON_Recursive_Desc_Create( CHAM_desc_t **descptr, void *mat, cham_flttype_
 
     return chameleon_recdesc_create( "A", descptr, mat, dtyp,
                                      mb, nb, lm, ln, m, n, p, q,
-                                     get_blkaddr, get_blkldd, get_rankof );
+                                     get_blkaddr, get_blkldd, get_rankof, get_rankof_arg );
 }
diff --git a/coreblas/compute/core_zprint.c b/coreblas/compute/core_zprint.c
index 9c127b6ea62dc740a2d5dc279d7eca689f60be25..af9740ff17c6e84cd07322f83864c31e89827a18 100644
--- a/coreblas/compute/core_zprint.c
+++ b/coreblas/compute/core_zprint.c
@@ -9,10 +9,10 @@
  *
  * @brief Chameleon core_zprint CPU kernel
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Mathieu Faverge
  * @author Florent Pruvost
- * @date 2020-03-03
+ * @date 2023-07-05
  * @precisions normal z -> c d s
  *
  */
@@ -28,7 +28,7 @@ CORE_zprint( FILE *file, const char *header,
     int   i, j;
 
     fflush( output );
-    fprintf( output, "--- %10s (%2d, %2d) / %p, %d:\n", header, Am, An, A, lda );
+    fprintf( output, "--- %10s (%2d, %2d) / %p, %d:\n", header, Am, An, (void*)A, lda );
     for(i=0; i<M; i++) {
         fprintf( output, "  " );
         for(j=0; j<N; j++) {
diff --git a/doc/user/chapters/using.org b/doc/user/chapters/using.org
index 18c2f1e74414368f72f1ad72eb5e9dce90dea93f..1b69490f67dea9c1a741293df59f176731c2fcfb 100644
--- a/doc/user/chapters/using.org
+++ b/doc/user/chapters/using.org
@@ -517,14 +517,18 @@
                             0, 0, N, N, 1, 1,
                             user_getaddr_arrayofpointers,
                             user_getblkldd_arrayofpointers,
-                            user_getrankof_zero);
+                            user_getrankof_zero, NULL);
      #+end_example
      Firsts arguments are the same than *CHAMELEON_Desc_Create* routine.
      Following arguments allows you to give pointer to functions that
      manage the access to tiles from the structure given as second
      argument.  Here for example, *matA* is an array containing
      addresses to tiles, see the function *allocate_tile_matrix*
-     defined in step3.h.  The three functions you have to
+     defined in step3.h. If you want the matrix to be allocate by
+     Chameleon, you can use the *CHAMELEON_MAT_ALLOC_GLOBAL*, or the
+     *CHAMELEON_MAT_ALLOC_TILE* variables to allocate repectively as a
+     single large allocation, or to allocate tile by tile as late as
+     possible. The three functions you have to
      define for *Desc_Create_User* are:
      * a function that returns address of tile $A(m,n)$, m and n
        standing for the indexes of the tile in the global matrix. Lets
@@ -533,8 +537,10 @@
        $A(m=1,n=0)$, $A(m=1,n=1)$
      * a function that returns the leading dimension of tile $A(m,*)$
      * a function that returns MPI rank of tile $A(m,n)$
+     * a pointer to a structure that these three functions can use to store
+       additional data.
 
-     Examples for these functions are vizible in step3.h.  Note that
+     Examples for these functions are visible in step3.h.  Note that
      the way we define these functions is related to the tile matrix
      format and to the data distribution considered.  This example
      should not be used with MPI since all tiles are affected to
@@ -680,7 +686,7 @@
                             GRID_P, GRID_Q,
                             chameleon_getaddr_ccrb,
                             chameleon_getblkldd_ccrb,
-                            chameleon_getrankof_2d);
+                            chameleon_getrankof_2d, NULL);
      #+end_example
      is equivalent to the following call
 
@@ -738,6 +744,71 @@
      by his function.  The last parameter is the pointer to the user's
      function.
 
+*** Using custom data distributions
+:PROPERTIES:
+:CUSTOM_ID: doc-using-custom-distributions
+:END:
+
+**** Interface
+     It is possible to provide custom data distributions to Chameleon, to go beyond the 2D block
+     cyclic distributions. A generic interface is provided with the functions
+     *chameleon_getrankof_custom_init*, *chameleon_getrankof_custom_destroy* and
+     *chameleon_getrankof_custom*, with the following signatures:
+
+     #+begin_src
+     int chameleon_getrankof_custom_init( custom_dist_t **custom_dist,
+                                          const char     *dist_file );
+
+     int chameleon_getrankof_custom_destroy( custom_dist_t **dist );
+
+     int chameleon_getrankof_custom( const CHAM_desc_t *desc, int m, int n );
+     #+end_src
+
+     The first function is used to read a custom distribution from an external file, whose name is
+     provided in the *dist_file* argument. The file format is described below. The second function
+     can be used to destroy the *custom_dist_t* pointer when it is no longer useful. The last
+     function should be used as the *get_rankof* argument to *CHAMELEON_Desc_Create_User*, together
+     with the custom distribution obtained from *chameleon_getrankof_custom_init*. The typical usage
+     is the following:
+
+     #+begin_src
+     custom_dist_t* custom_dist;
+     chameleon_getrankof_custom_init( &custom_dist, "filename" );
+     CHAMELEON_Desc_Create_User(&descA, NULL, ChamRealDouble,
+                                NB, NB, NB*NB, N, N,
+                                0, 0, N, N,
+                                CHAMELEON_Comm_size(), 1,
+                                chameleon_getaddr_ccrb,
+                                chameleon_getblkldd_ccrb,
+                                chameleon_getrankof_custom, custom_dist);
+     /* Use the descriptor */
+     CHAMELEON_Desc_Destroy(&descA);
+     chameleon_getrankof_custom_destroy(&custom_dist);
+     #+end_src
+
+     Since we do not use a 2D block-cyclic distribution, the values of
+     *P* and *Q* have no importance in
+     *CHAMELEON_Desc_Create_User*. However, make sure that the product
+     of *P* and *Q* is equal to the number of processes by using the
+     couple *(CHAMELEON_Comm_size(), 1)* as a replacement for *(P,
+     Q)*.
+
+**** File format
+
+     The custom distribution is provided by a pattern that can have any dimension, and which is
+     repeated all over the matrix. The file format expected by *chameleon_getrankof_custom_init* is
+     a simple text format, with space-separated integer values. The first two values represent the
+     size of the pattern (number of rows $m_d$ and number of columns $n_d$). Then, the function
+     expects $m_d * n_d$ values, where each value is the index of the process that should handle
+     this tile. For example, the following file content would result in a 2D block-cyclic
+     distribution with *P=2* and *Q=3* (it is not necessary to skip lines, but it can make the file
+     more readable):
+     #+begin_src
+     2 3
+     0 1 2
+     3 4 5
+     #+end_src
+
 *** List of available routines
 :PROPERTIES:
 :CUSTOM_ID: doc-using-list-routines
@@ -1009,7 +1080,8 @@
                                 int i, int j, int m, int n, int p, int q,
                                 void* (*get_blkaddr)( const CHAM_desc_t*, int, int),
                                 int (*get_blkldd)( const CHAM_desc_t*, int ),
-                                int (*get_rankof)( const CHAM_desc_t*, int, int ));
+                                int (*get_rankof)( const CHAM_desc_t*, int, int ),
+                                void* get_rankof_arg);
      #+end_src
 
      Create matrix descriptor for tiled matrix which may not fit
@@ -1023,7 +1095,8 @@
      #+begin_src
      int CHAMELEON_Desc_Create_OOC_User(CHAM_desc_t **descptr, cham_flttype_t dtyp, int mb, int nb, int bsiz,
                                     int lm, int ln, int i, int j, int m, int n, int p, int q,
-                                    int (*get_rankof)( const CHAM_desc_t*, int, int ));
+                                    int (*get_rankof)( const CHAM_desc_t*, int, int ),
+                                    void* get_rankof_arg);
      #+end_src
 
      Destroys matrix descriptor.
diff --git a/example/lapack_to_chameleon/step3.c b/example/lapack_to_chameleon/step3.c
index ac32b0d3ff8bc364af21277eecf56313689f0547..aae96bab7e5b3bfd5ca278ff0a2ad4102620ece5 100644
--- a/example/lapack_to_chameleon/step3.c
+++ b/example/lapack_to_chameleon/step3.c
@@ -11,11 +11,12 @@
  *
  * @brief Chameleon step3 example
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Florent Pruvost
  * @author Mathieu Faverge
  * @author Philippe Virouleau
- * @date 2022-02-22
+ * @author Lionel Eyraud-Dubois
+ * @date 2023-07-05
  *
  */
 #include "step3.h"
@@ -101,11 +102,11 @@ int main(int argc, char *argv[]) {
      *     returns the MPI rank of the tile m, n (0 here because we do not
      *     intend to use this program with MPI)
      */
-    CHAMELEON_Desc_Create_User(&descA, matA, ChamRealDouble,
-                           NB, NB, NB*NB, N, N, 0, 0, N, N, 1, 1,
-                           user_getaddr_arrayofpointers,
-                           user_getblkldd_arrayofpointers,
-                           user_getrankof_zero);
+    CHAMELEON_Desc_Create_User( &descA, matA, ChamRealDouble,
+                                NB, NB, NB*NB, N, N, 0, 0, N, N, 1, 1,
+                                user_getaddr_arrayofpointers,
+                                user_getblkldd_arrayofpointers,
+                                user_getrankof_zero, NULL );
 
     /*
      * We use the classical CHAMELEON way for accessing tiles for descripotrs
diff --git a/include/chameleon.h b/include/chameleon.h
index b6ff6913c9f74c6960d4615bfeaf82ec878001c8..cce6539fc5cc06e00d3cd887c18bd12f7d570ae1 100644
--- a/include/chameleon.h
+++ b/include/chameleon.h
@@ -17,7 +17,8 @@
  * @author Cedric Castagnede
  * @author Florent Pruvost
  * @author Philippe Virouleau
- * @date 2023-07-04
+ * @author Lionel Eyraud-Dubois
+ * @date 2023-07-05
  *
  */
 #ifndef _chameleon_h_
@@ -124,7 +125,8 @@ int CHAMELEON_Element_Size( cham_flttype_t type );
 
 int CHAMELEON_Desc_Create_User( CHAM_desc_t **desc, void *mat, cham_flttype_t dtyp, int mb, int nb, int bsiz,
                                 int lm, int ln, int i, int j, int m, int n, int p, int q,
-                                blkaddr_fct_t get_blkaddr, blkldd_fct_t get_blkldd, blkrankof_fct_t get_rankof );
+                                blkaddr_fct_t get_blkaddr, blkldd_fct_t get_blkldd,
+                                blkrankof_fct_t get_rankof, void* get_rankof_arg );
 
 int CHAMELEON_Desc_Create( CHAM_desc_t **desc, void *mat, cham_flttype_t dtyp,
                            int mb, int nb, int bsiz, int lm, int ln,
@@ -133,7 +135,7 @@ int CHAMELEON_Desc_Create( CHAM_desc_t **desc, void *mat, cham_flttype_t dtyp,
 int CHAMELEON_Desc_Create_OOC_User( CHAM_desc_t **desc, cham_flttype_t dtyp,
                                     int mb, int nb, int bsiz, int lm, int ln,
                                     int i, int j, int m, int n, int p, int q,
-                                    blkrankof_fct_t get_rankof );
+                                    blkrankof_fct_t get_rankof, void* get_rankof_arg );
 int CHAMELEON_Desc_Create_OOC( CHAM_desc_t **desc, cham_flttype_t dtyp,
                                int mb, int nb, int bsiz, int lm, int ln,
                                int i, int j, int m, int n, int p, int q );
@@ -150,10 +152,12 @@ int CHAMELEON_Desc_Flush  ( const CHAM_desc_t        *desc,
 
 int CHAMELEON_Desc_Change_Distribution( cham_uplo_t      uplo,
                                         CHAM_desc_t     *desc,
-                                        blkrankof_fct_t  new_get_rankof );
+                                        blkrankof_fct_t  new_get_rankof,
+                                        void*            new_get_rankof_arg );
 int CHAMELEON_Desc_Change_Distribution_Async( cham_uplo_t         uplo,
                                               CHAM_desc_t        *desc,
                                               blkrankof_fct_t     new_get_rankof,
+                                              void*               new_get_rankof_arg,
                                               RUNTIME_sequence_t *sequence );
 
 void CHAMELEON_Desc_Print( const CHAM_desc_t *desc );
@@ -168,7 +172,7 @@ int  CHAMELEON_Set     (int param, int  value);
 int  CHAMELEON_Get     (int param, int *value);
 int  CHAMELEON_Set_update_progress_callback(void (*p)(int, int)) ;
 
-static inline void CHAMELEON_user_tag_size(int, int)  __attribute__((deprecated("This function is no longer needed")));;
+static inline void CHAMELEON_user_tag_size(int, int)  __attribute__((deprecated("This function is no longer needed")));
 static inline void CHAMELEON_user_tag_size(int user_tag_width, int user_tag_sep) {
     (void)user_tag_width;
     (void)user_tag_sep;
@@ -188,7 +192,8 @@ int CHAMELEON_Request_Set     (RUNTIME_request_t *request, int param, int value)
 
 int  CHAMELEON_Recursive_Desc_Create( CHAM_desc_t **descptr, void *mat, cham_flttype_t dtyp,
                                       int *mb, int *nb, int lm, int ln, int m, int n, int p, int q,
-                                      blkaddr_fct_t get_blkaddr, blkldd_fct_t get_blkldd, blkrankof_fct_t get_rankof );
+                                      blkaddr_fct_t get_blkaddr, blkldd_fct_t get_blkldd,
+                                      blkrankof_fct_t get_rankof, void* get_rankof_arg );
 
 /**
  *
diff --git a/include/chameleon/descriptor_helpers.h b/include/chameleon/descriptor_helpers.h
index c732e930c8e05824da8ebf675bc38126f5a21ea7..185b161778526714c3c07c1367a17c0731661ea5 100644
--- a/include/chameleon/descriptor_helpers.h
+++ b/include/chameleon/descriptor_helpers.h
@@ -11,7 +11,7 @@
  *
  * @brief Set of functions to help the user to declare matrix descriptors (allocation, mapping... )
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Jakub Kurzak
  * @author Mathieu Faverge
  * @author Cedric Castagnede
@@ -19,7 +19,8 @@
  * @author Guillaume Sylvand
  * @author Raphael Boucherie
  * @author Samuel Thibault
- * @date 2020-03-03
+ * @author Lionel Eyraud-Dubois
+ * @date 2023-07-05
  *
  * @addtogroup chameleon_descriptors
  * @{
@@ -43,8 +44,18 @@ extern "C" {
  * @name Mapping functions
  * @{
  */
-int chameleon_getrankof_2d      ( const CHAM_desc_t *A, int m, int n );
-int chameleon_getrankof_2d_diag ( const CHAM_desc_t *A, int m, int n );
+int chameleon_getrankof_2d     ( const CHAM_desc_t *A, int m, int n );
+int chameleon_getrankof_2d_diag( const CHAM_desc_t *A, int m, int n );
+
+typedef struct custom_dist_s{
+    int *blocks_dist;         // Matrix of size dist_m times dist_n with values from 1 to number of process MPI
+    int dist_m, dist_n;       // The matrix has dist_m rows of dist_n elements
+    const char* dist_file;    // Name of the file that contains the distribution
+} custom_dist_t;
+
+int chameleon_getrankof_custom_init   ( custom_dist_t **dist, const char *filename );
+int chameleon_getrankof_custom_destroy( custom_dist_t **dist );
+int chameleon_getrankof_custom        ( const CHAM_desc_t *A, int m, int n );
 
 /**
  * @}
diff --git a/include/chameleon/struct.h b/include/chameleon/struct.h
index 2b324ef54d9ef40113498052627b4a06714c7a2b..efa64a1c534b8472c4514cedb330919b31d4fa0c 100644
--- a/include/chameleon/struct.h
+++ b/include/chameleon/struct.h
@@ -11,14 +11,15 @@
  *
  * @brief Chameleon structures
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Cedric Augonnet
  * @author Mathieu Faverge
  * @author Cedric Castagnede
  * @author Florent Pruvost
  * @author Samuel Thibault
  * @author Matthieu Kuhn
- * @date 2022-12-13
+ * @author Lionel Eyraud-Dubois
+ * @date 2023-07-05
  *
  */
 #ifndef _chameleon_struct_h_
@@ -93,6 +94,7 @@ struct chameleon_desc_s {
     blkrankof_fct_t get_rankof;
     // function to get chameleon tiles MPI rank
     blkrankof_fct_t get_rankof_init;
+    void* get_rankof_init_arg;
     CHAM_tile_t *tiles; // pointer to the array of tiles descriptors
     void *mat;        // pointer to the beginning of the matrix
     size_t A21;       // pointer to the beginning of the matrix A21
diff --git a/runtime/starpu/include/chameleon_starpu.h.in b/runtime/starpu/include/chameleon_starpu.h.in
index 122bef359eade63b5d9a51db3441c35ad730e79e..6eceaf063d23bfda2f7e6a2eb4ea1f402f929241 100644
--- a/runtime/starpu/include/chameleon_starpu.h.in
+++ b/runtime/starpu/include/chameleon_starpu.h.in
@@ -11,7 +11,7 @@
  *
  * @brief Chameleon StarPU runtime header
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Mathieu Faverge
  * @author Cedric Castagnede
  * @author Florent Pruvost
@@ -19,7 +19,7 @@
  * @author Samuel Thibault
  * @author Loris Lucido
  * @author Terry Cojean
- * @date 2023-01-30
+ * @date 2023-07-05
  *
  */
 #ifndef _chameleon_starpu_h_
@@ -110,9 +110,9 @@ typedef struct starpu_option_request_s {
 /**/
 
 static inline int cham_to_starpu_access( cham_access_t accessA ) {
-    assert( ChamR  == STARPU_R  );
-    assert( ChamW  == STARPU_W  );
-    assert( ChamRW == STARPU_RW );
+    assert( (enum starpu_data_access_mode)ChamR  == STARPU_R  );
+    assert( (enum starpu_data_access_mode)ChamW  == STARPU_W  );
+    assert( (enum starpu_data_access_mode)ChamRW == STARPU_RW );
     return accessA;
 }
 
diff --git a/testing/chameleon_ztesting.c b/testing/chameleon_ztesting.c
index 9d70612cb80e409320c5d441589145f897b30c58..4d8317ed37f1939ab2135059616ce766071ae12d 100644
--- a/testing/chameleon_ztesting.c
+++ b/testing/chameleon_ztesting.c
@@ -11,7 +11,7 @@
  *
  * @brief Chameleon CHAMELEON_Complex64_t auxiliary testings routines
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Mathieu Faverge
  * @author Cedric Castagnede
  * @author Lucas Barros de Assis
@@ -21,7 +21,8 @@
  * @author Philippe Swartvagher
  * @author Lucas Nesi
  * @author Matthieu Kuhn
- * @date 2023-01-05
+ * @author Lionel Eyraud-Dubois
+ * @date 2023-07-05
  * @precisions normal z -> c d s
  *
  */
@@ -57,11 +58,12 @@ parameter_t parameters[] = {
 #endif
 
     { NULL, "Machine parameters", 0, PARAM_OPTION, 0, 0, 0, {0}, NULL, NULL, NULL },
-    { "threads", "Number of CPU workers per node",      't', PARAM_OPTION | PARAM_OUTPUT, 1, 7, TestValInt, {-1}, NULL, pread_int, sprint_int },
+    { "threads", "Number of CPU workers per node",      't', PARAM_OPTION | PARAM_OUTPUT, 1, 7, TestValInt, {-1}, NULL, pread_int,    sprint_int    },
 #if !defined(CHAMELEON_TESTINGS_VENDOR)
-    { "gpus",    "Number of GPU workers per node",      'g', PARAM_OPTION | PARAM_OUTPUT, 1, 4, TestValInt, { 0}, NULL, pread_int, sprint_int },
-    { "P",       "Rows (P) in the PxQ process grid",    'P', PARAM_OPTION | PARAM_OUTPUT, 1, 2, TestValInt, { 1}, NULL, pread_int, sprint_int },
-    { "Q",       "Columns (Q) in the PxQ process grid", 'Q', PARAM_OUTPUT,                1, 2, TestValInt, { 1}, NULL, pread_int, sprint_int },
+    { "gpus",    "Number of GPU workers per node",      'g', PARAM_OPTION | PARAM_OUTPUT, 1, 4, TestValInt, { 0}, NULL, pread_int,    sprint_int    },
+    { "P",       "Rows (P) in the PxQ process grid",    'P', PARAM_OPTION | PARAM_OUTPUT, 1, 2, TestValInt, { 1}, NULL, pread_int,    sprint_int    },
+    { "Q",       "Columns (Q) in the PxQ process grid", 'Q', PARAM_OUTPUT,                1, 2, TestValInt, { 1}, NULL, pread_int,    sprint_int    },
+    { "custom",  "Name of custom distribution file",    -61, PARAM_OPTION,                1, 1, TestString, { 0}, NULL, pread_string, sprint_string },
 #endif
 
     { NULL, "Main input parameters", 0, PARAM_OPTION, 0, 0, 0, {0}, NULL, NULL, NULL },
diff --git a/testing/parameters.c b/testing/parameters.c
index f8b936946e77cc610b90adbb88fc34fdc76bc25a..745f1c15648ecd3ca2bc6921e994407399724585 100644
--- a/testing/parameters.c
+++ b/testing/parameters.c
@@ -8,11 +8,12 @@
  *
  * @brief Chameleon auxiliary routines for testing structures
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Lucas Barros de Assis
  * @author Mathieu Faverge
  * @author Alycia Lisito
- * @date 2022-02-22
+ * @author Lionel Eyraud-Dubois
+ * @date 2023-07-05
  *
  */
 #include "testings.h"
@@ -465,6 +466,87 @@ parameters_compute_q( int p )
     param->value.ival = np / p;
     return param->value.ival;
 }
+
+/**
+ ********************************************************************************
+ *
+ * @brief Helper function to generate the testing descriptors with the right
+ * data distrbution.
+ *
+ *******************************************************************************
+ *
+ * @param[in] filename
+ *          The name of the input file.
+ *
+ *******************************************************************************
+ */
+int
+parameters_desc_create( const char *id, CHAM_desc_t **descptr, cham_flttype_t dtyp,
+                        int mb, int nb, int lm, int ln, int m, int n )
+{
+    custom_dist_t *custom_args = NULL;
+    const char    *custom = parameters_getvalue_str( "custom" );
+    intptr_t       mtxfmt = parameters_getvalue_int( "mtxfmt" );
+    int            rc;
+
+    mtxfmt = -mtxfmt; /* Inverse sign to get the defined values */
+
+    if ( !custom ) {
+        int P = parameters_getvalue_int( "P" );
+        int Q = parameters_compute_q( P );
+        rc = CHAMELEON_Desc_Create(
+            descptr, (void*)mtxfmt, dtyp, mb, nb, mb * nb, lm, ln, 0, 0, m, n, P, Q );
+        (*descptr)->name = id;
+        return rc;
+    }
+
+    if ( ((void*)mtxfmt) == CHAMELEON_MAT_ALLOC_GLOBAL ) {
+        fprintf( stderr, "In parameters_desc_create, cannot use custom distributions with global matrix allocation (Use --mtxfmt=1)\n" );
+        return CHAMELEON_ERR_ILLEGAL_VALUE;
+    }
+
+    rc = chameleon_getrankof_custom_init( &custom_args, custom );
+    if ( rc != CHAMELEON_SUCCESS ) {
+        return rc;
+    }
+
+    rc = CHAMELEON_Desc_Create_User(
+        descptr, (void*)mtxfmt, dtyp, mb, nb, mb * nb, lm, ln, 0, 0, m, n, CHAMELEON_Comm_size(), 1,
+        NULL, NULL, chameleon_getrankof_custom, custom_args );
+    (*descptr)->name = id;
+    return rc;
+}
+
+/**
+ *******************************************************************************
+ *
+ * @brief Helper function to destroy the testing descriptors.
+ *
+ *******************************************************************************
+ *
+ * @param[inout] descptr
+ *      The descriptor to destroy. On exit the descriptor can no longer be used.
+ *
+ *******************************************************************************
+ */
+int
+parameters_desc_destroy(CHAM_desc_t **descptr)
+{
+    CHAM_desc_t *desc;
+    if ( descptr == NULL ) {
+        return CHAMELEON_ERR_ILLEGAL_VALUE;
+    }
+    desc = *descptr;
+    if ( desc == NULL ) {
+        return CHAMELEON_ERR_ILLEGAL_VALUE;
+    }
+    if ( desc->get_rankof_init_arg ) {
+        if ( desc->get_rankof_init == chameleon_getrankof_custom ) {
+            chameleon_getrankof_custom_destroy( (custom_dist_t**)&(desc->get_rankof_init_arg) );
+        }
+    }
+    return CHAMELEON_Desc_Destroy( descptr );
+}
 #endif
 
 void
diff --git a/testing/testing_zcesca.c b/testing/testing_zcesca.c
index 1ac5b7816b0f37c759f4f1b601ad63d2c5a316dc..166f0239bfa671c306bf18027d4c1fec8a0533f5 100644
--- a/testing/testing_zcesca.c
+++ b/testing/testing_zcesca.c
@@ -9,11 +9,11 @@
  *
  * @brief Chameleon zcesca testing
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Florent Pruvost
  * @author Alycia Lisito
  * @author Philippe Swartvagher
- * @date 2022-02-22
+ * @date 2023-07-05
  * @precisions normal z -> c d s
  *
  */
@@ -46,15 +46,12 @@ testing_zcesca_desc( run_arg_list_t *args, int check )
     int        hres      = 0;
 
     /* Read arguments */
-    int      async  = parameters_getvalue_int( "async" );
-    intptr_t mtxfmt = parameters_getvalue_int( "mtxfmt" );
-    int      nb     = run_arg_get_int( args, "nb", 320 );
-    int      P      = parameters_getvalue_int( "P" );
-    int      N      = run_arg_get_int( args, "N", 1000 );
-    int      M      = run_arg_get_int( args, "M", N );
-    int      LDA    = run_arg_get_int( args, "LDA", M );
-    int      seedA  = run_arg_get_int( args, "seedA", testing_ialea() );
-    int      Q      = parameters_compute_q( P );
+    int async = parameters_getvalue_int( "async" );
+    int nb    = run_arg_get_int( args, "nb", 320 );
+    int N     = run_arg_get_int( args, "N", 1000 );
+    int M     = run_arg_get_int( args, "M", N );
+    int LDA   = run_arg_get_int( args, "LDA", M );
+    int seedA = run_arg_get_int( args, "seedA", testing_ialea() );
 
     /* Descriptors */
     CHAM_desc_t *descA;
@@ -63,8 +60,7 @@ testing_zcesca_desc( run_arg_list_t *args, int check )
     CHAMELEON_Set( CHAMELEON_TILE_SIZE, nb );
 
     /* Create the matrices */
-    CHAMELEON_Desc_Create(
-        &descA, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDA, N, 0, 0, M, N, P, Q );
+    parameters_desc_create( "A", &descA, ChamComplexDouble, nb, nb, LDA, N, M, N );
 
     /* Fill the matrix with random values */
     CHAMELEON_zplrnt_Tile( descA, seedA );
@@ -90,7 +86,7 @@ testing_zcesca_desc( run_arg_list_t *args, int check )
         CHAMELEON_zgemm_WS_Free( ws );
     }
 
-    CHAMELEON_Desc_Destroy( &descA );
+    parameters_desc_destroy( &descA );
 
     (void)check;
     return hres;
diff --git a/testing/testing_zcheck_facto.c b/testing/testing_zcheck_facto.c
index dea1fbc2b53fc0c360041f2d831911a65c0f7d5c..03e709488c0334c36f5293076434d1925ba3d82d 100644
--- a/testing/testing_zcheck_facto.c
+++ b/testing/testing_zcheck_facto.c
@@ -9,13 +9,13 @@
  *
  * @brief Chameleon CHAMELEON_Complex64_t auxiliary testings routines
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Lucas Barros de Assis
  * @author Florent Pruvost
  * @author Mathieu Faverge
  * @author Nathalie Furmento
  * @author Alycia Lisito
- * @date 2023-01-05
+ * @date 2023-07-05
  * @precisions normal z -> c d s
  *
  */
@@ -73,7 +73,7 @@ int check_zlauum( run_arg_list_t *args, cham_uplo_t uplo, CHAM_desc_t *descA, CH
     AAtnorm = CHAMELEON_zlantr_Tile( ChamOneNorm, uplo, ChamNonUnit, descAAt );
 
     if ( uplo == ChamUpper ) {
-        descAt = CHAMELEON_Desc_Copy( descA, NULL );
+        descAt = CHAMELEON_Desc_Copy( descA, CHAMELEON_MAT_ALLOC_TILE );
         CHAMELEON_zlaset_Tile( ChamLower, 0., 0., descAt );
         CHAMELEON_zlacpy_Tile( ChamUpper, descA, descAt );
 
@@ -81,7 +81,7 @@ int check_zlauum( run_arg_list_t *args, cham_uplo_t uplo, CHAM_desc_t *descA, CH
         CHAMELEON_ztrmm_Tile( ChamRight, ChamUpper, ChamConjTrans, ChamNonUnit, 1., descA, descAt );
     }
     else {
-        descAt = CHAMELEON_Desc_Copy( descA, NULL );
+        descAt = CHAMELEON_Desc_Copy( descA, CHAMELEON_MAT_ALLOC_TILE );
         CHAMELEON_zlaset_Tile( ChamUpper, 0., 0., descAt );
         CHAMELEON_zlacpy_Tile( ChamLower, descA, descAt );
 
@@ -207,8 +207,8 @@ int check_zxxtrf( run_arg_list_t *args, cham_mtxtype_t matrix_type, cham_uplo_t
     cham_trans_t transL = ChamNoTrans;
     cham_trans_t transU = ChamNoTrans;
 
-    descL = CHAMELEON_Desc_Copy( descA, NULL );
-    descU = CHAMELEON_Desc_Copy( descA, NULL );
+    descL = CHAMELEON_Desc_Copy( descA, CHAMELEON_MAT_ALLOC_TILE );
+    descU = CHAMELEON_Desc_Copy( descA, CHAMELEON_MAT_ALLOC_TILE );
 
     CHAMELEON_zlaset_Tile( ChamUpperLower, 0., 0., descL );
     CHAMELEON_zlaset_Tile( ChamUpperLower, 0., 0., descU );
@@ -254,6 +254,7 @@ int check_zxxtrf( run_arg_list_t *args, cham_mtxtype_t matrix_type, cham_uplo_t
     }
         break;
 
+        /* WARNING: A must be fully initialized and not just the correct triangular part */
 #if defined(PRECISION_z) || defined(PRECISION_c)
     case ChamHermitian:
         Anorm = CHAMELEON_zlanhe_Tile( ChamOneNorm, uplo, descA );
@@ -562,7 +563,7 @@ int check_ztrtri( run_arg_list_t *args, cham_mtxtype_t matrix_type, cham_uplo_t
     int          N   = descA0->m;
 
     /* Creates an identity matrix */
-    descI = CHAMELEON_Desc_Copy( descA0, NULL );
+    descI = CHAMELEON_Desc_Copy( descA0, CHAMELEON_MAT_ALLOC_TILE );
     CHAMELEON_zlaset_Tile( ChamUpperLower, 0., 1., descI );
 
     /* Calculates the residual I - A*(A**-1) */
@@ -580,7 +581,7 @@ int check_ztrtri( run_arg_list_t *args, cham_mtxtype_t matrix_type, cham_uplo_t
          * Ainv on the left by A.
          */
         uplo_inv = ( uplo == ChamUpper ) ? ChamLower : ChamUpper;
-        descB = CHAMELEON_Desc_Copy( descAi, NULL );
+        descB = CHAMELEON_Desc_Copy( descAi, CHAMELEON_MAT_ALLOC_TILE );
         CHAMELEON_ztradd_Tile( uplo_inv, ChamConjTrans, 1., descAi, 0., descB );
         CHAMELEON_zlacpy_Tile( uplo, descAi, descB );
 
@@ -600,7 +601,7 @@ int check_ztrtri( run_arg_list_t *args, cham_mtxtype_t matrix_type, cham_uplo_t
          * Ainv on the left by A.
          */
         uplo_inv = ( uplo == ChamUpper ) ? ChamLower : ChamUpper;
-        descB = CHAMELEON_Desc_Copy( descAi, NULL );
+        descB = CHAMELEON_Desc_Copy( descAi, CHAMELEON_MAT_ALLOC_TILE );
         CHAMELEON_ztradd_Tile( uplo_inv, ChamTrans, 1., descAi, 0., descB );
         CHAMELEON_zlacpy_Tile( uplo, descAi, descB );
 
@@ -619,7 +620,7 @@ int check_ztrtri( run_arg_list_t *args, cham_mtxtype_t matrix_type, cham_uplo_t
          * Ainv on the left by A.
          */
         uplo_inv = ( uplo == ChamUpper ) ? ChamLower : ChamUpper;
-        descB = CHAMELEON_Desc_Copy( descAi, NULL );
+        descB = CHAMELEON_Desc_Copy( descAi, CHAMELEON_MAT_ALLOC_TILE );
 
         if ( diag == ChamUnit ) {
             //CHAMELEON_ztradd_Tile( uplo, ChamNoTrans, 1., descAi, 0., descB );
diff --git a/testing/testing_zcheck_polar_decomp.c b/testing/testing_zcheck_polar_decomp.c
index 8ae32e124019a227e72e715dd2e63ecee5e1ca85..69bdc9d6af1d0bf292e94744ab4b4dee26f03661 100644
--- a/testing/testing_zcheck_polar_decomp.c
+++ b/testing/testing_zcheck_polar_decomp.c
@@ -9,13 +9,13 @@
  *
  * @brief Chameleon CHAMELEON_Complex64_t auxiliary testings routines
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Lucas Barros de Assis
  * @author Florent Pruvost
  * @author Mathieu Faverge
  * @author Nathalie Furmento
  * @author Alycia Lisito
- * @date 2023-01-05
+ * @date 2023-07-05
  * @precisions normal z -> c d s
  *
  */
@@ -92,7 +92,7 @@ int check_zgepdf_qr( run_arg_list_t *args, CHAM_desc_t *descA1, CHAM_desc_t *des
     /*
      * First check: || R - Q' A ||
      */
-    descR = CHAMELEON_Desc_Copy( descAF1, NULL );
+    descR = CHAMELEON_Desc_Copy( descAF1, CHAMELEON_MAT_ALLOC_TILE );
 
     /* Copy R(1:n,1:k) */
     subR  = chameleon_desc_submatrix( descR,   0, 0, N, K );
diff --git a/testing/testing_zcheck_qr_lq.c b/testing/testing_zcheck_qr_lq.c
index 2c60071f890160efd728f32aa7f1ad5267d65b1e..304c4696114d2c5f38f51465f0d0f4b48cf2e078 100644
--- a/testing/testing_zcheck_qr_lq.c
+++ b/testing/testing_zcheck_qr_lq.c
@@ -9,13 +9,13 @@
  *
  * @brief Chameleon CHAMELEON_Complex64_t auxiliary testings routines
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Lucas Barros de Assis
  * @author Florent Pruvost
  * @author Mathieu Faverge
  * @author Nathalie Furmento
  * @author Alycia Lisito
- * @date 2023-01-05
+ * @date 2023-07-05
  * @precisions normal z -> c d s
  *
  */
@@ -62,7 +62,7 @@ int check_zortho( run_arg_list_t *args, CHAM_desc_t *descQ )
     CHAM_desc_t *descI, *subI;
 
     /* Builds the identity */
-    descI = CHAMELEON_Desc_Copy( descQ, NULL );
+    descI = CHAMELEON_Desc_Copy( descQ, CHAMELEON_MAT_ALLOC_TILE );
     subI = chameleon_desc_submatrix( descI, 0, 0, minMN, minMN );
     CHAMELEON_zlaset_Tile( ChamUpperLower, 0., 1., subI );
 
@@ -182,7 +182,7 @@ int check_zgelqf( run_arg_list_t *args, CHAM_desc_t *descA, CHAM_desc_t *descAF,
     assert( descA->n == N );
     assert( descA->m == descAF->m );
 
-    descL = CHAMELEON_Desc_Copy( descA, NULL );
+    descL = CHAMELEON_Desc_Copy( descA, CHAMELEON_MAT_ALLOC_TILE );
 
     if ( full_lq ) {
         /*
@@ -353,7 +353,7 @@ int check_zgeqrf( run_arg_list_t *args, CHAM_desc_t *descA, CHAM_desc_t *descAF,
     assert( descA->m == M );
     assert( descA->n == descAF->n );
 
-    descR = CHAMELEON_Desc_Copy( descA, NULL );
+    descR = CHAMELEON_Desc_Copy( descA, CHAMELEON_MAT_ALLOC_TILE );
 
     if ( full_qr ) {
         /*
diff --git a/testing/testing_zgeadd.c b/testing/testing_zgeadd.c
index 943f7a3bd1ac1578968201d0f5ebbc5025313b06..512903444d97ed840e5174bd620291d9c138d2c8 100644
--- a/testing/testing_zgeadd.c
+++ b/testing/testing_zgeadd.c
@@ -9,12 +9,12 @@
  *
  * @brief Chameleon zgeadd testing
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Lucas Barros de Assis
  * @author Mathieu Faverge
  * @author Alycia Lisito
  * @author Philippe Swartvagher
- * @date 2022-02-22
+ * @date 2023-07-05
  * @precisions normal z -> c d s
  *
  */
@@ -47,18 +47,15 @@ testing_zgeadd_desc( run_arg_list_t *args, int check )
     int        hres      = 0;
 
     /* Read arguments */
-    int          async  = parameters_getvalue_int( "async" );
-    intptr_t     mtxfmt = parameters_getvalue_int( "mtxfmt" );
-    int          nb     = run_arg_get_int( args, "nb", 320 );
-    int          P      = parameters_getvalue_int( "P" );
-    cham_trans_t trans  = run_arg_get_trans( args, "trans", ChamNoTrans );
-    int          N      = run_arg_get_int( args, "N", 1000 );
-    int          M      = run_arg_get_int( args, "M", N );
-    int          LDA    = run_arg_get_int( args, "LDA", ( ( trans == ChamNoTrans ) ? M : N ) );
-    int          LDB    = run_arg_get_int( args, "LDB", M );
-    int          seedA  = run_arg_get_int( args, "seedA", testing_ialea() );
-    int          seedB  = run_arg_get_int( args, "seedB", testing_ialea() );
-    int          Q      = parameters_compute_q( P );
+    int                   async = parameters_getvalue_int( "async" );
+    int                   nb    = run_arg_get_int( args, "nb", 320 );
+    cham_trans_t          trans = run_arg_get_trans( args, "trans", ChamNoTrans );
+    int                   N     = run_arg_get_int( args, "N", 1000 );
+    int                   M     = run_arg_get_int( args, "M", N );
+    int                   LDA   = run_arg_get_int( args, "LDA", ( ( trans == ChamNoTrans ) ? M : N ) );
+    int                   LDB   = run_arg_get_int( args, "LDB", M );
+    int                   seedA = run_arg_get_int( args, "seedA", testing_ialea() );
+    int                   seedB = run_arg_get_int( args, "seedB", testing_ialea() );
     CHAMELEON_Complex64_t alpha = testing_zalea();
     CHAMELEON_Complex64_t beta  = testing_zalea();
 
@@ -81,10 +78,8 @@ testing_zgeadd_desc( run_arg_list_t *args, int check )
     }
 
     /* Create the matrices */
-    CHAMELEON_Desc_Create(
-        &descA, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDA, An, 0, 0, Am, An, P, Q );
-    CHAMELEON_Desc_Create(
-        &descB, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDB, N, 0, 0, M, N, P, Q );
+    parameters_desc_create( "A", &descA, ChamComplexDouble, nb, nb, LDA, An, Am, An );
+    parameters_desc_create( "B", &descB, ChamComplexDouble, nb, nb, LDB, N, M, N );
 
     /* Fill the matrix with random values */
     CHAMELEON_zplrnt_Tile( descA, seedA );
@@ -106,7 +101,7 @@ testing_zgeadd_desc( run_arg_list_t *args, int check )
 
     /* Check the solution */
     if ( check ) {
-        CHAM_desc_t *descB0 = CHAMELEON_Desc_Copy( descB, NULL );
+        CHAM_desc_t *descB0 = CHAMELEON_Desc_Copy( descB, CHAMELEON_MAT_ALLOC_TILE );
         CHAMELEON_zplrnt_Tile( descB0, seedB );
 
         hres += check_zsum( args, ChamUpperLower, trans, alpha, descA, beta, descB0, descB );
@@ -114,8 +109,8 @@ testing_zgeadd_desc( run_arg_list_t *args, int check )
         CHAMELEON_Desc_Destroy( &descB0 );
     }
 
-    CHAMELEON_Desc_Destroy( &descA );
-    CHAMELEON_Desc_Destroy( &descB );
+    parameters_desc_destroy( &descA );
+    parameters_desc_destroy( &descB );
 
     return hres;
 }
diff --git a/testing/testing_zgelqf.c b/testing/testing_zgelqf.c
index 59b4b2d78cb4e1771ddc872f9ce0633199e068b0..83c3c853905264618c0d373e96c337dad880a9ae 100644
--- a/testing/testing_zgelqf.c
+++ b/testing/testing_zgelqf.c
@@ -9,11 +9,11 @@
  *
  * @brief Chameleon zgelqf testing
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Lucas Barros de Assis
  * @author Mathieu Faverge
  * @author Alycia Lisito
- * @date 2022-02-22
+ * @date 2023-07-05
  * @precisions normal z -> c d s
  *
  */
@@ -79,7 +79,7 @@ testing_zgelqf_desc( run_arg_list_t *args, int check )
     /* Checks the factorisation and orthogonality */
     if ( check ) {
         CHAM_desc_t *descQ;
-        CHAM_desc_t *descA0 = CHAMELEON_Desc_Copy( descA, NULL );
+        CHAM_desc_t *descA0 = CHAMELEON_Desc_Copy( descA, CHAMELEON_MAT_ALLOC_TILE );
 
         CHAMELEON_Desc_Create(
             &descQ, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, N, N, 0, 0, N, N, P, Q );
diff --git a/testing/testing_zgelqf_hqr.c b/testing/testing_zgelqf_hqr.c
index c93d4ae4c05a2b802fa4788b44cb3ceef1e4580c..c48e361accaa281409cc5c941918719e4cdf6563 100644
--- a/testing/testing_zgelqf_hqr.c
+++ b/testing/testing_zgelqf_hqr.c
@@ -9,11 +9,11 @@
  *
  * @brief Chameleon zgelqf_param testing
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Lucas Barros de Assis
  * @author Mathieu Faverge
  * @author Alycia Lisito
- * @date 2022-02-22
+ * @date 2023-07-05
  * @precisions normal z -> c d s
  *
  */
@@ -88,7 +88,7 @@ testing_zgelqf_hqr_desc( run_arg_list_t *args, int check )
     /* Checks the factorisation and orthogonality */
     if ( check ) {
         CHAM_desc_t *descQ;
-        CHAM_desc_t *descA0 = CHAMELEON_Desc_Copy( descA, NULL );
+        CHAM_desc_t *descA0 = CHAMELEON_Desc_Copy( descA, CHAMELEON_MAT_ALLOC_TILE );
 
         CHAMELEON_Desc_Create(
             &descQ, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, N, N, 0, 0, N, N, P, Q );
diff --git a/testing/testing_zgelqs.c b/testing/testing_zgelqs.c
index d57d1011becd8b184bc8e6e226be4b106ef4b54d..60ec7b72140c83041b728dd2f4e2039fb8cb59d1 100644
--- a/testing/testing_zgelqs.c
+++ b/testing/testing_zgelqs.c
@@ -9,11 +9,11 @@
  *
  * @brief Chameleon zgelqs testing
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Lucas Barros de Assis
  * @author Mathieu Faverge
  * @author Alycia Lisito
- * @date 2022-02-22
+ * @date 2023-07-05
  * @precisions normal z -> c d s
  *
  */
@@ -89,8 +89,8 @@ testing_zgelqs_desc( run_arg_list_t *args, int check )
 
     /* Checks the factorisation, orthogonality and residue */
     if ( check ) {
-        CHAM_desc_t *descA0 = CHAMELEON_Desc_Copy( descA, NULL );
-        CHAM_desc_t *descB  = CHAMELEON_Desc_Copy( descX, NULL );
+        CHAM_desc_t *descA0 = CHAMELEON_Desc_Copy( descA, CHAMELEON_MAT_ALLOC_TILE );
+        CHAM_desc_t *descB  = CHAMELEON_Desc_Copy( descX, CHAMELEON_MAT_ALLOC_TILE );
         CHAM_desc_t *subX   = chameleon_desc_submatrix( descX, 0, 0, N, NRHS );
         CHAM_desc_t *subB   = chameleon_desc_submatrix( descB, 0, 0, M, NRHS );
 
diff --git a/testing/testing_zgemm.c b/testing/testing_zgemm.c
index 84272df649db94d0d70da9143118bcb0ba99ff9c..7084304dbe6999fa948b54111e4f35beb6a5e568 100644
--- a/testing/testing_zgemm.c
+++ b/testing/testing_zgemm.c
@@ -9,12 +9,12 @@
  *
  * @brief Chameleon zgemm testing
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Lucas Barros de Assis
  * @author Florent Pruvost
  * @author Mathieu Faverge
  * @author Alycia Lisito
- * @date 2022-02-11
+ * @date 2023-07-05
  * @precisions normal z -> c d s
  *
  */
@@ -36,7 +36,6 @@ testing_zgemm_desc( run_arg_list_t *args, int check )
 
     /* Read arguments */
     int          async  = parameters_getvalue_int( "async" );
-    intptr_t     mtxfmt = parameters_getvalue_int( "mtxfmt" );
     int          nb     = run_arg_get_int( args, "nb", 320 );
     int          P      = parameters_getvalue_int( "P" );
     cham_trans_t transA = run_arg_get_trans( args, "transA", ChamNoTrans );
@@ -83,12 +82,9 @@ testing_zgemm_desc( run_arg_list_t *args, int check )
     }
 
     /* Create the matrices */
-    CHAMELEON_Desc_Create(
-        &descA, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDA, An, 0, 0, Am, An, P, Q );
-    CHAMELEON_Desc_Create(
-        &descB, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDB, Bn, 0, 0, Bm, Bn, P, Q );
-    CHAMELEON_Desc_Create(
-        &descC, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDC, N, 0, 0, M, N, P, Q );
+    parameters_desc_create( "A", &descA, ChamComplexDouble, nb, nb, LDA, An, Am, An );
+    parameters_desc_create( "B", &descB, ChamComplexDouble, nb, nb, LDB, Bn, Bm, Bn );
+    parameters_desc_create( "C", &descC, ChamComplexDouble, nb, nb, LDC, N, M, N );
 
     /* Fill the matrices with random values */
     CHAMELEON_zplrnt_Tile( descA, seedA );
@@ -121,7 +117,7 @@ testing_zgemm_desc( run_arg_list_t *args, int check )
     /* Check the solution */
     if ( check ) {
         CHAMELEON_Desc_Create(
-            &descCinit, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDC, N, 0, 0, M, N, P, Q );
+            &descCinit, CHAMELEON_MAT_ALLOC_TILE, ChamComplexDouble, nb, nb, nb * nb, LDC, N, 0, 0, M, N, P, Q );
         CHAMELEON_zplrnt_Tile( descCinit, seedC );
 
         hres += check_zgemm( args, transA, transB, alpha, descA, descB, beta, descCinit, descC );
@@ -129,9 +125,9 @@ testing_zgemm_desc( run_arg_list_t *args, int check )
         CHAMELEON_Desc_Destroy( &descCinit );
     }
 
-    CHAMELEON_Desc_Destroy( &descA );
-    CHAMELEON_Desc_Destroy( &descB );
-    CHAMELEON_Desc_Destroy( &descC );
+    parameters_desc_destroy( &descA );
+    parameters_desc_destroy( &descB );
+    parameters_desc_destroy( &descC );
 
     return hres;
 }
diff --git a/testing/testing_zgepdf_qdwh.c b/testing/testing_zgepdf_qdwh.c
index 9dbe9d743bd66c34e87827f8bb08764fef77987b..0d41939de91f5a6bf9ca35de399e1a575170787b 100644
--- a/testing/testing_zgepdf_qdwh.c
+++ b/testing/testing_zgepdf_qdwh.c
@@ -10,11 +10,11 @@
  *
  * @brief Chameleon zgepdf_qdwh testing
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Mathieu Faverge
  * @author Hatem Ltaief
  * @author Alycia Lisito
- * @date 2022-02-22
+ * @date 2023-07-05
  * @precisions normal z -> c d s
  *
  */
@@ -92,7 +92,7 @@ testing_zgepdf_qdwh_desc( run_arg_list_t *args, int check )
      * with the call to CHAMELEON_zgepdf_qdwh_Tile[_Async]).
      */
     if ( check ) {
-        descA0 = CHAMELEON_Desc_Copy( descA, CHAMELEON_MAT_ALLOC_GLOBAL );
+        descA0 = CHAMELEON_Desc_Copy( descA, CHAMELEON_MAT_ALLOC_TILE );
         CHAMELEON_zlacpy_Tile( ChamUpperLower, descA, descA0 );
     }
 
diff --git a/testing/testing_zgepdf_qr.c b/testing/testing_zgepdf_qr.c
index f373b8e5d6ca4e5a4eb3618e1b26d9b10d9338bf..5c3f0059685aa342762285003bab6b79b5b5f68a 100644
--- a/testing/testing_zgepdf_qr.c
+++ b/testing/testing_zgepdf_qr.c
@@ -10,11 +10,11 @@
  *
  * @brief Chameleon zgepdf_qr testing
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Mathieu Faverge
  * @author Hatem Ltaief
  * @author Alycia Lisito
- * @date 2022-02-22
+ * @date 2023-07-05
  * @precisions normal z -> c d s
  *
  */
@@ -154,7 +154,7 @@ testing_zgepdf_qr_desc( run_arg_list_t *args, int check )
     /* Checks the solution */
     if ( check ) {
         CHAM_desc_t *descA01, *descA02;
-        descA01 = CHAMELEON_Desc_Copy( descA1, NULL );
+        descA01 = CHAMELEON_Desc_Copy( descA1, CHAMELEON_MAT_ALLOC_TILE );
         descA02 = descA2; /* A2 is useless now */
 
         CHAMELEON_zplrnt_Tile( descA01, seedA );
diff --git a/testing/testing_zgeqrf.c b/testing/testing_zgeqrf.c
index 7a13bb7a1d8f764628f94c8ea8651109379936c0..d5d370462b017246682d2ef6fd592fd5d27d566b 100644
--- a/testing/testing_zgeqrf.c
+++ b/testing/testing_zgeqrf.c
@@ -9,11 +9,11 @@
  *
  * @brief Chameleon zgeqrf testing
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Lucas Barros de Assis
  * @author Mathieu Faverge
  * @author Alycia Lisito
- * @date 2022-02-22
+ * @date 2023-07-05
  * @precisions normal z -> c d s
  *
  */
@@ -79,7 +79,7 @@ testing_zgeqrf_desc( run_arg_list_t *args, int check )
     /* Checks the factorisation and orthogonality */
     if ( check ) {
         CHAM_desc_t *descQ;
-        CHAM_desc_t *descA0 = CHAMELEON_Desc_Copy( descA, NULL );
+        CHAM_desc_t *descA0 = CHAMELEON_Desc_Copy( descA, CHAMELEON_MAT_ALLOC_TILE );
 
         CHAMELEON_Desc_Create(
             &descQ, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, M, M, 0, 0, M, M, P, Q );
diff --git a/testing/testing_zgeqrf_hqr.c b/testing/testing_zgeqrf_hqr.c
index 5b7821311266737ae11910ed1e1ada01d0ad4dfd..b1c0156c6b85670e5908524d82e19512b4930f87 100644
--- a/testing/testing_zgeqrf_hqr.c
+++ b/testing/testing_zgeqrf_hqr.c
@@ -9,11 +9,11 @@
  *
  * @brief Chameleon zgeqrf_hqr testing
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Lucas Barros de Assis
  * @author Mathieu Faverge
  * @author Alycia Lisito
- * @date 2022-02-22
+ * @date 2023-07-05
  * @precisions normal z -> c d s
  *
  */
@@ -88,7 +88,7 @@ testing_zgeqrf_hqr_desc( run_arg_list_t *args, int check )
     /* Checks the factorisation and orthogonality */
     if ( check ) {
         CHAM_desc_t *descQ;
-        CHAM_desc_t *descA0 = CHAMELEON_Desc_Copy( descA, NULL );
+        CHAM_desc_t *descA0 = CHAMELEON_Desc_Copy( descA, CHAMELEON_MAT_ALLOC_TILE );
 
         CHAMELEON_Desc_Create(
             &descQ, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, M, M, 0, 0, M, M, P, Q );
diff --git a/testing/testing_zgeqrs.c b/testing/testing_zgeqrs.c
index 4f8cf8699c55714414f3052a60ccf7bb30eb1e33..5c0109d88d60375d8e3527e3871c45f4b79973aa 100644
--- a/testing/testing_zgeqrs.c
+++ b/testing/testing_zgeqrs.c
@@ -9,11 +9,11 @@
  *
  * @brief Chameleon zgeqrs testing
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Lucas Barros de Assis
  * @author Mathieu Faverge
  * @author Alycia Lisito
- * @date 2022-02-22
+ * @date 2023-07-05
  * @precisions normal z -> c d s
  *
  */
@@ -96,8 +96,8 @@ testing_zgeqrs_desc( run_arg_list_t *args, int check )
 
     /* Checks the factorisation, orthogonality and residue */
     if ( check ) {
-        CHAM_desc_t *descA0 = CHAMELEON_Desc_Copy( descA, NULL );
-        CHAM_desc_t *descB  = CHAMELEON_Desc_Copy( descX, NULL );
+        CHAM_desc_t *descA0 = CHAMELEON_Desc_Copy( descA, CHAMELEON_MAT_ALLOC_TILE );
+        CHAM_desc_t *descB  = CHAMELEON_Desc_Copy( descX, CHAMELEON_MAT_ALLOC_TILE );
         CHAM_desc_t *subX   = chameleon_desc_submatrix( descX, 0, 0, N, NRHS );
         CHAM_desc_t *subB   = chameleon_desc_submatrix( descB, 0, 0, M, NRHS );
 
diff --git a/testing/testing_zgesv_nopiv.c b/testing/testing_zgesv_nopiv.c
index 85dc12fd81304dd3bc7c5aad452ca88f6a5eec52..9b9a624266760d0dd73f21a5624a69657bd0f73e 100644
--- a/testing/testing_zgesv_nopiv.c
+++ b/testing/testing_zgesv_nopiv.c
@@ -9,11 +9,11 @@
  *
  * @brief Chameleon zgesv_nopiv testing
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Lucas Barros de Assis
  * @author Mathieu Faverge
  * @author Alycia Lisito
- * @date 2022-02-22
+ * @date 2023-07-05
  * @precisions normal z -> c d s
  *
  */
@@ -36,18 +36,15 @@ testing_zgesv_nopiv_desc( run_arg_list_t *args, int check )
     int        hres      = 0;
 
     /* Read arguments */
-    int      async  = parameters_getvalue_int( "async" );
-    intptr_t mtxfmt = parameters_getvalue_int( "mtxfmt" );
-    int      nb     = run_arg_get_int( args, "nb", 320 );
-    int      P      = parameters_getvalue_int( "P" );
-    int      N      = run_arg_get_int( args, "N", 1000 );
-    int      NRHS   = run_arg_get_int( args, "NRHS", 1 );
-    int      LDA    = run_arg_get_int( args, "LDA", N );
-    int      LDB    = run_arg_get_int( args, "LDB", N );
-    int      seedA  = run_arg_get_int( args, "seedA", testing_ialea() );
-    int      seedB  = run_arg_get_int( args, "seedB", testing_ialea() );
-    double   bump   = run_arg_get_double( args, "bump", (double)N );
-    int      Q      = parameters_compute_q( P );
+    int    async = parameters_getvalue_int( "async" );
+    int    nb    = run_arg_get_int( args, "nb", 320 );
+    int    N     = run_arg_get_int( args, "N", 1000 );
+    int    NRHS  = run_arg_get_int( args, "NRHS", 1 );
+    int    LDA   = run_arg_get_int( args, "LDA", N );
+    int    LDB   = run_arg_get_int( args, "LDB", N );
+    int    seedA = run_arg_get_int( args, "seedA", testing_ialea() );
+    int    seedB = run_arg_get_int( args, "seedB", testing_ialea() );
+    double bump  = run_arg_get_double( args, "bump", (double)N );
 
     /* Descriptors */
     CHAM_desc_t *descA, *descX;
@@ -55,10 +52,8 @@ testing_zgesv_nopiv_desc( run_arg_list_t *args, int check )
     CHAMELEON_Set( CHAMELEON_TILE_SIZE, nb );
 
     /* Creates the matrices */
-    CHAMELEON_Desc_Create(
-        &descA, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDA, N, 0, 0, N, N, P, Q );
-    CHAMELEON_Desc_Create(
-        &descX, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDB, NRHS, 0, 0, N, NRHS, P, Q );
+    parameters_desc_create( "A", &descA, ChamComplexDouble, nb, nb, LDA, N, N, N );
+    parameters_desc_create( "X", &descX, ChamComplexDouble, nb, nb, LDB, NRHS, N, NRHS );
 
     /* Fills the matrix with random values */
     CHAMELEON_zplgtr_Tile( 0,    ChamUpper, descA, seedA   );
@@ -83,8 +78,8 @@ testing_zgesv_nopiv_desc( run_arg_list_t *args, int check )
     if ( check ) {
         CHAM_desc_t *descA0, *descB;
 
-        descA0 = CHAMELEON_Desc_Copy( descA, NULL );
-        descB  = CHAMELEON_Desc_Copy( descX, NULL );
+        descA0 = CHAMELEON_Desc_Copy( descA, CHAMELEON_MAT_ALLOC_TILE );
+        descB  = CHAMELEON_Desc_Copy( descX, CHAMELEON_MAT_ALLOC_TILE );
 
         CHAMELEON_zplgtr_Tile( 0,    ChamUpper, descA0, seedA   );
         CHAMELEON_zplgtr_Tile( bump, ChamLower, descA0, seedA+1 );
@@ -100,8 +95,8 @@ testing_zgesv_nopiv_desc( run_arg_list_t *args, int check )
         CHAMELEON_Desc_Destroy( &descB );
     }
 
-    CHAMELEON_Desc_Destroy( &descA );
-    CHAMELEON_Desc_Destroy( &descX );
+    parameters_desc_destroy( &descA );
+    parameters_desc_destroy( &descX );
 
     return hres;
 }
diff --git a/testing/testing_zgesvd.c b/testing/testing_zgesvd.c
index 14564be3eb446f01a8e3b9983b4d2ac0fae5b1a7..3c28671d9df05e3b4dd90be090901464bb13a177 100644
--- a/testing/testing_zgesvd.c
+++ b/testing/testing_zgesvd.c
@@ -9,9 +9,9 @@
  *
  * @brief Chameleon zgesvd testing
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Alycia Lisito
- * @date 2022-03-30
+ * @date 2023-07-05
  * @precisions normal z -> c d s
  *
  */
@@ -139,7 +139,7 @@ testing_zgesvd_desc( run_arg_list_t *args, int check )
      * with the call to CHAMELEON_zgepdf_qdwh_Tile[_Async]).
      */
     if ( check ) {
-        descA0 = CHAMELEON_Desc_Copy( descA, CHAMELEON_MAT_ALLOC_GLOBAL );
+        descA0 = CHAMELEON_Desc_Copy( descA, CHAMELEON_MAT_ALLOC_TILE );
         CHAMELEON_zlacpy_Tile( ChamUpperLower, descA, descA0 );
     }
 
diff --git a/testing/testing_zgetrf.c b/testing/testing_zgetrf.c
index 92a82eb6b97547b4ee65549bc701561f78d68f1d..978017c413f879736b8f1321b081618608c45622 100644
--- a/testing/testing_zgetrf.c
+++ b/testing/testing_zgetrf.c
@@ -9,12 +9,13 @@
  *
  * @brief Chameleon zgetrf testing
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Lucas Barros de Assis
  * @author Mathieu Faverge
  * @author Alycia Lisito
  * @author Matthieu Kuhn
- * @date 2023-02-21
+ * @author Lionel Eyraud-Dubois
+ * @date 2023-07-05
  * @precisions normal z -> c d s
  *
  */
@@ -32,17 +33,14 @@ testing_zgetrf_desc( run_arg_list_t *args, int check )
     int        hres      = 0;
 
     /* Read arguments */
-    int         async  = parameters_getvalue_int( "async" );
-    intptr_t    mtxfmt = parameters_getvalue_int( "mtxfmt" );
-    int         nb     = run_arg_get_int( args, "nb", 320 );
-    int         P      = parameters_getvalue_int( "P" );
-    int         N      = run_arg_get_int( args, "N", 1000 );
-    int         M      = run_arg_get_int( args, "M", N );
-    int         LDA    = run_arg_get_int( args, "LDA", M );
-    int         seedA  = run_arg_get_int( args, "seedA", testing_ialea() );
-    cham_diag_t diag   = run_arg_get_diag( args, "diag", ChamUnit );
-    int         Q      = parameters_compute_q( P );
-    int         minMN  = chameleon_min( M, N );
+    int         async = parameters_getvalue_int( "async" );
+    int         nb    = run_arg_get_int( args, "nb", 320 );
+    int         N     = run_arg_get_int( args, "N", 1000 );
+    int         M     = run_arg_get_int( args, "M", N );
+    int         LDA   = run_arg_get_int( args, "LDA", M );
+    int         seedA = run_arg_get_int( args, "seedA", testing_ialea() );
+    cham_diag_t diag  = run_arg_get_diag( args, "diag", ChamUnit );
+    int         minMN = chameleon_min( M, N );
 
     /* Descriptors */
     CHAM_desc_t *descA, *descIPIV;
@@ -51,10 +49,9 @@ testing_zgetrf_desc( run_arg_list_t *args, int check )
     CHAMELEON_Set( CHAMELEON_TILE_SIZE, nb );
 
     /* Creates the matrices */
+    parameters_desc_create( "A", &descA, ChamComplexDouble, nb, nb, LDA, N, M, N );
     CHAMELEON_Desc_Create(
-        &descA, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDA, N, 0, 0, M, N, P, Q );
-    CHAMELEON_Desc_Create(
-        &descIPIV, CHAMELEON_MAT_ALLOC_TILE, ChamInteger, nb, 1, nb, minMN, 1, 0, 0, minMN, 1, P, Q );
+        &descIPIV, CHAMELEON_MAT_ALLOC_TILE, ChamInteger, nb, 1, nb, minMN, 1, 0, 0, minMN, 1, CHAMELEON_Comm_size(), 1 );
 
     /* Fills the matrix with random values */
     if ( diag == ChamUnit ) {
@@ -93,11 +90,11 @@ testing_zgetrf_desc( run_arg_list_t *args, int check )
         CHAMELEON_Desc_Create_User(
             &descA0c, (void*)CHAMELEON_MAT_ALLOC_GLOBAL, ChamComplexDouble,
             nb, nb, nb*nb, M, N, 0, 0, M, N, 1, 1,
-            chameleon_getaddr_cm, chameleon_getblkldd_cm, NULL );
+            chameleon_getaddr_cm, chameleon_getblkldd_cm, NULL, NULL );
         CHAMELEON_Desc_Create_User(
             &descIPIVc, (void*)CHAMELEON_MAT_ALLOC_GLOBAL, ChamInteger,
             nb, 1, nb, M, 1, 0, 0, M, 1, 1, 1,
-            chameleon_getaddr_cm, chameleon_getblkldd_cm, NULL );
+            chameleon_getaddr_cm, chameleon_getblkldd_cm, NULL, NULL );
 
         if ( diag == ChamUnit ) {
             CHAMELEON_zplgtr_Tile( 0,     ChamUpper, descA0c, seedA   );
@@ -131,7 +128,7 @@ testing_zgetrf_desc( run_arg_list_t *args, int check )
         CHAMELEON_zgetrf_WS_Free( ws );
     }
 
-    CHAMELEON_Desc_Destroy( &descA );
+    parameters_desc_destroy( &descA );
     CHAMELEON_Desc_Destroy( &descIPIV );
 
     return hres;
diff --git a/testing/testing_zgetrf_nopiv.c b/testing/testing_zgetrf_nopiv.c
index a6429b3aa505b63d82363cef412f111305acefb3..099898fd0eca15b337b017619faa29a584c9935c 100644
--- a/testing/testing_zgetrf_nopiv.c
+++ b/testing/testing_zgetrf_nopiv.c
@@ -9,11 +9,11 @@
  *
  * @brief Chameleon zgetrf_nopiv testing
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Lucas Barros de Assis
  * @author Mathieu Faverge
  * @author Alycia Lisito
- * @date 2022-02-22
+ * @date 2023-07-05
  * @precisions normal z -> c d s
  *
  */
@@ -29,16 +29,13 @@ testing_zgetrf_nopiv_desc( run_arg_list_t *args, int check )
     int        hres      = 0;
 
     /* Read arguments */
-    int      async  = parameters_getvalue_int( "async" );
-    intptr_t mtxfmt = parameters_getvalue_int( "mtxfmt" );
-    int      nb     = run_arg_get_int( args, "nb", 320 );
-    int      P      = parameters_getvalue_int( "P" );
-    int      N      = run_arg_get_int( args, "N", 1000 );
-    int      M      = run_arg_get_int( args, "M", N );
-    int      LDA    = run_arg_get_int( args, "LDA", M );
-    int      seedA  = run_arg_get_int( args, "seedA", testing_ialea() );
-    double   bump   = run_arg_get_double( args, "bump", (double)N );
-    int      Q      = parameters_compute_q( P );
+    int    async = parameters_getvalue_int( "async" );
+    int    nb    = run_arg_get_int( args, "nb", 320 );
+    int    N     = run_arg_get_int( args, "N", 1000 );
+    int    M     = run_arg_get_int( args, "M", N );
+    int    LDA   = run_arg_get_int( args, "LDA", M );
+    int    seedA = run_arg_get_int( args, "seedA", testing_ialea() );
+    double bump  = run_arg_get_double( args, "bump", (double)N );
 
     /* Descriptors */
     CHAM_desc_t *descA;
@@ -46,8 +43,7 @@ testing_zgetrf_nopiv_desc( run_arg_list_t *args, int check )
     CHAMELEON_Set( CHAMELEON_TILE_SIZE, nb );
 
     /* Creates the matrices */
-    CHAMELEON_Desc_Create(
-        &descA, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDA, N, 0, 0, M, N, P, Q );
+    parameters_desc_create( "A", &descA, ChamComplexDouble, nb, nb, LDA, N, M, N );
 
     /* Fills the matrix with random values */
     CHAMELEON_zplgtr_Tile( 0,    ChamUpper, descA, seedA   );
@@ -67,7 +63,7 @@ testing_zgetrf_nopiv_desc( run_arg_list_t *args, int check )
 
     /* Checks the factorisation and residue */
     if ( check ) {
-        CHAM_desc_t *descA0 = CHAMELEON_Desc_Copy( descA, NULL );
+        CHAM_desc_t *descA0 = CHAMELEON_Desc_Copy( descA, CHAMELEON_MAT_ALLOC_TILE );
         CHAMELEON_zplgtr_Tile( 0,    ChamUpper, descA0, seedA   );
         CHAMELEON_zplgtr_Tile( bump, ChamLower, descA0, seedA+1 );
 
@@ -76,7 +72,7 @@ testing_zgetrf_nopiv_desc( run_arg_list_t *args, int check )
         CHAMELEON_Desc_Destroy( &descA0 );
     }
 
-    CHAMELEON_Desc_Destroy( &descA );
+    parameters_desc_destroy( &descA );
 
     return hres;
 }
diff --git a/testing/testing_zgetrs_nopiv.c b/testing/testing_zgetrs_nopiv.c
index 5f042eea5761b9a285c405eaa4121e63ee4bf5c7..2e611763d500e9f5f9f828c883f3c5d25e50d4d3 100644
--- a/testing/testing_zgetrs_nopiv.c
+++ b/testing/testing_zgetrs_nopiv.c
@@ -9,11 +9,11 @@
  *
  * @brief Chameleon zgetrs_nopiv testing
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Lucas Barros de Assis
  * @author Mathieu Faverge
  * @author Alycia Lisito
- * @date 2022-02-22
+ * @date 2023-07-05
  * @precisions normal z -> c d s
  *
  */
@@ -30,18 +30,15 @@ testing_zgetrs_nopiv_desc( run_arg_list_t *args, int check )
     int        hres      = 0;
 
     /* Read arguments */
-    int      async  = parameters_getvalue_int( "async" );
-    intptr_t mtxfmt = parameters_getvalue_int( "mtxfmt" );
-    int      nb     = run_arg_get_int( args, "nb", 320 );
-    int      P      = parameters_getvalue_int( "P" );
-    int      N      = run_arg_get_int( args, "N", 1000 );
-    int      NRHS   = run_arg_get_int( args, "NRHS", 1 );
-    int      LDA    = run_arg_get_int( args, "LDA", N );
-    int      LDB    = run_arg_get_int( args, "LDB", N );
-    int      seedA  = run_arg_get_int( args, "seedA", testing_ialea() );
-    int      seedB  = run_arg_get_int( args, "seedB", testing_ialea() );
-    double   bump   = run_arg_get_double( args, "bump", (double)N );
-    int      Q      = parameters_compute_q( P );
+    int    async = parameters_getvalue_int( "async" );
+    int    nb    = run_arg_get_int( args, "nb", 320 );
+    int    N     = run_arg_get_int( args, "N", 1000 );
+    int    NRHS  = run_arg_get_int( args, "NRHS", 1 );
+    int    LDA   = run_arg_get_int( args, "LDA", N );
+    int    LDB   = run_arg_get_int( args, "LDB", N );
+    int    seedA = run_arg_get_int( args, "seedA", testing_ialea() );
+    int    seedB = run_arg_get_int( args, "seedB", testing_ialea() );
+    double bump  = run_arg_get_double( args, "bump", (double)N );
 
     /* Descriptors */
     CHAM_desc_t *descA, *descX;
@@ -49,10 +46,8 @@ testing_zgetrs_nopiv_desc( run_arg_list_t *args, int check )
     CHAMELEON_Set( CHAMELEON_TILE_SIZE, nb );
 
     /* Creates the matrices */
-    CHAMELEON_Desc_Create(
-        &descA, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDA, N, 0, 0, N, N, P, Q );
-    CHAMELEON_Desc_Create(
-        &descX, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDB, NRHS, 0, 0, N, NRHS, P, Q );
+    parameters_desc_create( "A", &descA, ChamComplexDouble, nb, nb, LDA, N, N, N );
+    parameters_desc_create( "X", &descX, ChamComplexDouble, nb, nb, LDB, NRHS, N, NRHS );
 
     /* Fills the matrix with random values */
     CHAMELEON_zplgtr_Tile( 0,    ChamUpper, descA, seedA   );
@@ -78,8 +73,8 @@ testing_zgetrs_nopiv_desc( run_arg_list_t *args, int check )
 
     /* Checks the factorisation and residue */
     if ( check ) {
-        CHAM_desc_t *descA0 = CHAMELEON_Desc_Copy( descA, NULL );
-        CHAM_desc_t *descB  = CHAMELEON_Desc_Copy( descX, NULL );
+        CHAM_desc_t *descA0 = CHAMELEON_Desc_Copy( descA, CHAMELEON_MAT_ALLOC_TILE );
+        CHAM_desc_t *descB  = CHAMELEON_Desc_Copy( descX, CHAMELEON_MAT_ALLOC_TILE );
 
         CHAMELEON_zplgtr_Tile( 0,    ChamUpper, descA0, seedA   );
         CHAMELEON_zplgtr_Tile( bump, ChamLower, descA0, seedA+1 );
@@ -92,8 +87,8 @@ testing_zgetrs_nopiv_desc( run_arg_list_t *args, int check )
         CHAMELEON_Desc_Destroy( &descB );
     }
 
-    CHAMELEON_Desc_Destroy( &descA );
-    CHAMELEON_Desc_Destroy( &descX );
+    parameters_desc_destroy( &descA );
+    parameters_desc_destroy( &descX );
 
     return hres;
 }
diff --git a/testing/testing_zgram.c b/testing/testing_zgram.c
index b43fcc8b57641983fc424b660777a652d50e1c9a..d23f17d780393573d5a7bcf2381bca53fda30e7b 100644
--- a/testing/testing_zgram.c
+++ b/testing/testing_zgram.c
@@ -9,11 +9,11 @@
  *
  * @brief Chameleon zgram testing
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Florent Pruvost
  * @author Alycia Lisito
  * @author Philippe Swartvagher
- * @date 2022-02-22
+ * @date 2023-07-05
  * @precisions normal z -> c d s
  *
  */
@@ -45,15 +45,12 @@ testing_zgram_desc( run_arg_list_t *args, int check )
     int        hres      = 0;
 
     /* Read arguments */
-    int         async  = parameters_getvalue_int( "async" );
-    intptr_t    mtxfmt = parameters_getvalue_int( "mtxfmt" );
-    int         nb     = run_arg_get_int( args, "nb", 320 );
-    cham_uplo_t uplo   = run_arg_get_uplo( args, "uplo", ChamUpper );
-    int         P      = parameters_getvalue_int( "P" );
-    int         N      = run_arg_get_int( args, "N", 1000 );
-    int         LDA    = run_arg_get_int( args, "LDA", N );
-    int         seedA  = run_arg_get_int( args, "seedA", testing_ialea() );
-    int         Q      = parameters_compute_q( P );
+    int         async = parameters_getvalue_int( "async" );
+    int         nb    = run_arg_get_int( args, "nb", 320 );
+    cham_uplo_t uplo  = run_arg_get_uplo( args, "uplo", ChamUpper );
+    int         N     = run_arg_get_int( args, "N", 1000 );
+    int         LDA   = run_arg_get_int( args, "LDA", N );
+    int         seedA = run_arg_get_int( args, "seedA", testing_ialea() );
 
     /* Descriptors */
     CHAM_desc_t *descA;
@@ -62,8 +59,7 @@ testing_zgram_desc( run_arg_list_t *args, int check )
     CHAMELEON_Set( CHAMELEON_TILE_SIZE, nb );
 
     /* Create the matrices */
-    CHAMELEON_Desc_Create(
-        &descA, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDA, N, 0, 0, N, N, P, Q );
+    parameters_desc_create( "A", &descA, ChamComplexDouble, nb, nb, LDA, N, N, N );
 
     /* Fill the matrix with random values */
     CHAMELEON_zplghe_Tile( (double)N, uplo, descA, seedA );
@@ -89,7 +85,7 @@ testing_zgram_desc( run_arg_list_t *args, int check )
         CHAMELEON_zgemm_WS_Free( ws );
     }
 
-    CHAMELEON_Desc_Destroy( &descA );
+    parameters_desc_destroy( &descA );
 
     (void)check;
     return hres;
diff --git a/testing/testing_zhemm.c b/testing/testing_zhemm.c
index bdd9d928b8b638777e59896e3da49ab72d017fe8..157f8552b475d6fab1dda442bd64d2bbf11cfdcf 100644
--- a/testing/testing_zhemm.c
+++ b/testing/testing_zhemm.c
@@ -9,12 +9,12 @@
  *
  * @brief Chameleon zhemm testing
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Lucas Barros de Assis
  * @author Florent Pruvost
  * @author Mathieu Faverge
  * @author Alycia Lisito
- * @date 2022-02-22
+ * @date 2023-07-05
  * @precisions normal z -> c
  *
  */
@@ -35,24 +35,23 @@ testing_zhemm_desc( run_arg_list_t *args, int check )
     int        hres      = 0;
 
     /* Read arguments */
-    int                   async  = parameters_getvalue_int( "async" );
-    intptr_t              mtxfmt = parameters_getvalue_int( "mtxfmt" );
-    int                   nb     = run_arg_get_int( args, "nb", 320 );
-    int                   P      = parameters_getvalue_int( "P" );
-    cham_side_t           side   = run_arg_get_side( args, "side", ChamLeft );
-    cham_uplo_t           uplo   = run_arg_get_uplo( args, "uplo", ChamUpper );
-    int                   N      = run_arg_get_int( args, "N", 1000 );
-    int                   M      = run_arg_get_int( args, "M", N );
-    int                   LDA    = run_arg_get_int( args, "LDA", ( ( side == ChamLeft ) ? M : N ) );
-    int                   LDB    = run_arg_get_int( args, "LDB", M );
-    int                   LDC    = run_arg_get_int( args, "LDC", M );
-    CHAMELEON_Complex64_t alpha  = testing_zalea();
-    CHAMELEON_Complex64_t beta   = testing_zalea();
-    int                   seedA  = run_arg_get_int( args, "seedA", testing_ialea() );
-    int                   seedB  = run_arg_get_int( args, "seedB", testing_ialea() );
-    int                   seedC  = run_arg_get_int( args, "seedC", testing_ialea() );
-    double                bump   = testing_dalea();
-    int                   Q      = parameters_compute_q( P );
+    int                   async = parameters_getvalue_int( "async" );
+    int                   nb    = run_arg_get_int( args, "nb", 320 );
+    int                   P     = parameters_getvalue_int( "P" );
+    cham_side_t           side  = run_arg_get_side( args, "side", ChamLeft );
+    cham_uplo_t           uplo  = run_arg_get_uplo( args, "uplo", ChamUpper );
+    int                   N     = run_arg_get_int( args, "N", 1000 );
+    int                   M     = run_arg_get_int( args, "M", N );
+    int                   LDA   = run_arg_get_int( args, "LDA", ( ( side == ChamLeft ) ? M : N ) );
+    int                   LDB   = run_arg_get_int( args, "LDB", M );
+    int                   LDC   = run_arg_get_int( args, "LDC", M );
+    CHAMELEON_Complex64_t alpha = testing_zalea();
+    CHAMELEON_Complex64_t beta  = testing_zalea();
+    int                   seedA = run_arg_get_int( args, "seedA", testing_ialea() );
+    int                   seedB = run_arg_get_int( args, "seedB", testing_ialea() );
+    int                   seedC = run_arg_get_int( args, "seedC", testing_ialea() );
+    double                bump  = testing_dalea();
+    int                   Q     = parameters_compute_q( P );
 
     /* Descriptors */
     int          Am;
@@ -74,12 +73,9 @@ testing_zhemm_desc( run_arg_list_t *args, int check )
     }
 
     /* Create the matrices */
-    CHAMELEON_Desc_Create(
-        &descA, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDA, Am, 0, 0, Am, Am, P, Q );
-    CHAMELEON_Desc_Create(
-        &descB, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDB, N, 0, 0, M, N, P, Q );
-    CHAMELEON_Desc_Create(
-        &descC, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDC, N, 0, 0, M, N, P, Q );
+    parameters_desc_create( "A", &descA, ChamComplexDouble, nb, nb, LDA, Am, Am, Am );
+    parameters_desc_create( "B", &descB, ChamComplexDouble, nb, nb, LDB, N, M, N );
+    parameters_desc_create( "C", &descC, ChamComplexDouble, nb, nb, LDC, N, M, N );
 
     /* Fills the matrix with random values */
     CHAMELEON_zplghe_Tile( bump, uplo, descA, seedA );
@@ -112,7 +108,7 @@ testing_zhemm_desc( run_arg_list_t *args, int check )
     /* Checks the solution */
     if ( check ) {
         CHAMELEON_Desc_Create(
-            &descCinit, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDC, N, 0, 0, M, N, P, Q );
+            &descCinit, CHAMELEON_MAT_ALLOC_TILE, ChamComplexDouble, nb, nb, nb * nb, LDC, N, 0, 0, M, N, P, Q );
         CHAMELEON_zplrnt_Tile( descCinit, seedC );
 
         hres +=
@@ -121,9 +117,9 @@ testing_zhemm_desc( run_arg_list_t *args, int check )
         CHAMELEON_Desc_Destroy( &descCinit );
     }
 
-    CHAMELEON_Desc_Destroy( &descA );
-    CHAMELEON_Desc_Destroy( &descB );
-    CHAMELEON_Desc_Destroy( &descC );
+    parameters_desc_destroy( &descA );
+    parameters_desc_destroy( &descB );
+    parameters_desc_destroy( &descC );
 
     return hres;
 }
diff --git a/testing/testing_zher2k.c b/testing/testing_zher2k.c
index eab554bf8fabfa38f7e801e1f1911b7848e20441..cd85c00729ac526796a55fbb586b64eaafa5e45d 100644
--- a/testing/testing_zher2k.c
+++ b/testing/testing_zher2k.c
@@ -9,12 +9,12 @@
  *
  * @brief Chameleon zher2k testing
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Lucas Barros de Assis
  * @author Florent Pruvost
  * @author Mathieu Faverge
  * @author Alycia Lisito
- * @date 2022-02-22
+ * @date 2023-07-05
  * @precisions normal z -> z c
  *
  */
@@ -35,17 +35,16 @@ testing_zher2k_desc( run_arg_list_t *args, int check )
     int        hres      = 0;
 
     /* Read arguments */
-    int          async  = parameters_getvalue_int( "async" );
-    intptr_t     mtxfmt = parameters_getvalue_int( "mtxfmt" );
-    int          nb     = run_arg_get_int( args, "nb", 320 );
-    int          P      = parameters_getvalue_int( "P" );
-    cham_trans_t trans  = run_arg_get_trans( args, "trans", ChamNoTrans );
-    cham_uplo_t  uplo   = run_arg_get_uplo( args, "uplo", ChamUpper );
-    int          N      = run_arg_get_int( args, "N", 1000 );
-    int          K      = run_arg_get_int( args, "K", N );
-    int          LDA    = run_arg_get_int( args, "LDA", ( ( trans == ChamNoTrans ) ? N : K ) );
-    int          LDB    = run_arg_get_int( args, "LDB", ( ( trans == ChamNoTrans ) ? N : K ) );
-    int          LDC    = run_arg_get_int( args, "LDC", N );
+    int                   async = parameters_getvalue_int( "async" );
+    int                   nb    = run_arg_get_int( args, "nb", 320 );
+    int                   P     = parameters_getvalue_int( "P" );
+    cham_trans_t          trans = run_arg_get_trans( args, "trans", ChamNoTrans );
+    cham_uplo_t           uplo  = run_arg_get_uplo( args, "uplo", ChamUpper );
+    int                   N     = run_arg_get_int( args, "N", 1000 );
+    int                   K     = run_arg_get_int( args, "K", N );
+    int                   LDA   = run_arg_get_int( args, "LDA", ( ( trans == ChamNoTrans ) ? N : K ) );
+    int                   LDB   = run_arg_get_int( args, "LDB", ( ( trans == ChamNoTrans ) ? N : K ) );
+    int                   LDC   = run_arg_get_int( args, "LDC", N );
     CHAMELEON_Complex64_t alpha = testing_zalea();
     double                beta  = testing_dalea();
     int                   seedA = run_arg_get_int( args, "seedA", testing_ialea() );
@@ -75,12 +74,9 @@ testing_zher2k_desc( run_arg_list_t *args, int check )
     }
 
     /* Create the matrices */
-    CHAMELEON_Desc_Create(
-        &descA, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDA, An, 0, 0, Am, An, P, Q );
-    CHAMELEON_Desc_Create(
-        &descB, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDB, An, 0, 0, Am, An, P, Q );
-    CHAMELEON_Desc_Create(
-        &descC, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDC, N, 0, 0, N, N, P, Q );
+    parameters_desc_create( "A", &descA, ChamComplexDouble, nb, nb, LDA, An, Am, An );
+    parameters_desc_create( "B", &descB, ChamComplexDouble, nb, nb, LDB, An, Am, An );
+    parameters_desc_create( "C", &descC, ChamComplexDouble, nb, nb, LDC, N, N, N );
 
     /* Fill the matrix with random values */
     CHAMELEON_zplrnt_Tile( descA, seedA );
@@ -105,7 +101,7 @@ testing_zher2k_desc( run_arg_list_t *args, int check )
     /* Check the solution */
     if ( check ) {
         CHAMELEON_Desc_Create(
-            &descCinit, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDC, N, 0, 0, N, N, P, Q );
+            &descCinit, CHAMELEON_MAT_ALLOC_TILE, ChamComplexDouble, nb, nb, nb * nb, LDC, N, 0, 0, N, N, P, Q );
         CHAMELEON_zplghe_Tile( bump, uplo, descCinit, seedC );
 
         hres += check_zsyrk( args, ChamHermitian, uplo, trans, alpha, descA, descB,
@@ -114,9 +110,9 @@ testing_zher2k_desc( run_arg_list_t *args, int check )
         CHAMELEON_Desc_Destroy( &descCinit );
     }
 
-    CHAMELEON_Desc_Destroy( &descA );
-    CHAMELEON_Desc_Destroy( &descB );
-    CHAMELEON_Desc_Destroy( &descC );
+    parameters_desc_destroy( &descA );
+    parameters_desc_destroy( &descB );
+    parameters_desc_destroy( &descC );
 
     return hres;
 }
diff --git a/testing/testing_zherk.c b/testing/testing_zherk.c
index 0dd6ce591808908bb6ddaa23f9d039c5106570d2..6cf801f151663fcd5fcadcf6f8325e9029c52af2 100644
--- a/testing/testing_zherk.c
+++ b/testing/testing_zherk.c
@@ -9,12 +9,12 @@
  *
  * @brief Chameleon zherk testing
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Lucas Barros de Assis
  * @author Florent Pruvost
  * @author Mathieu Faverge
  * @author Alycia Lisito
- * @date 2022-02-22
+ * @date 2023-07-05
  * @precisions normal z -> z c
  *
  */
@@ -35,22 +35,21 @@ testing_zherk_desc( run_arg_list_t *args, int check )
     int        hres      = 0;
 
     /* Read arguments */
-    int          async  = parameters_getvalue_int( "async" );
-    intptr_t     mtxfmt = parameters_getvalue_int( "mtxfmt" );
-    int          nb     = run_arg_get_int( args, "nb", 320 );
-    int          P      = parameters_getvalue_int( "P" );
-    cham_trans_t trans  = run_arg_get_trans( args, "trans", ChamNoTrans );
-    cham_uplo_t  uplo   = run_arg_get_uplo( args, "uplo", ChamUpper );
-    int          N      = run_arg_get_int( args, "N", 1000 );
-    int          K      = run_arg_get_int( args, "K", N );
-    int          LDA    = run_arg_get_int( args, "LDA", ( ( trans == ChamNoTrans ) ? N : K ) );
-    int          LDC    = run_arg_get_int( args, "LDC", N );
-    double       alpha  = testing_dalea();
-    double       beta   = testing_dalea();
-    double       bump   = testing_dalea();
-    int          seedA  = run_arg_get_int( args, "seedA", testing_ialea() );
-    int          seedC  = run_arg_get_int( args, "seedC", testing_ialea() );
-    int          Q      = parameters_compute_q( P );
+    int          async = parameters_getvalue_int( "async" );
+    int          nb    = run_arg_get_int( args, "nb", 320 );
+    int          P     = parameters_getvalue_int( "P" );
+    cham_trans_t trans = run_arg_get_trans( args, "trans", ChamNoTrans );
+    cham_uplo_t  uplo  = run_arg_get_uplo( args, "uplo", ChamUpper );
+    int          N     = run_arg_get_int( args, "N", 1000 );
+    int          K     = run_arg_get_int( args, "K", N );
+    int          LDA   = run_arg_get_int( args, "LDA", ( ( trans == ChamNoTrans ) ? N : K ) );
+    int          LDC   = run_arg_get_int( args, "LDC", N );
+    double       alpha = testing_dalea();
+    double       beta  = testing_dalea();
+    double       bump  = testing_dalea();
+    int          seedA = run_arg_get_int( args, "seedA", testing_ialea() );
+    int          seedC = run_arg_get_int( args, "seedC", testing_ialea() );
+    int          Q     = parameters_compute_q( P );
 
     /* Descriptors */
     int          Am, An;
@@ -73,10 +72,8 @@ testing_zherk_desc( run_arg_list_t *args, int check )
     }
 
     /* Creates the matrices */
-    CHAMELEON_Desc_Create(
-        &descA, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDA, An, 0, 0, Am, An, P, Q );
-    CHAMELEON_Desc_Create(
-        &descC, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDC, N, 0, 0, N, N, P, Q );
+    parameters_desc_create( "A", &descA, ChamComplexDouble, nb, nb, LDA, An, Am, An );
+    parameters_desc_create( "C", &descC, ChamComplexDouble, nb, nb, LDC, N, N, N );
 
     /* Fills the matrix with random values */
     CHAMELEON_zplrnt_Tile( descA, seedA );
@@ -99,7 +96,7 @@ testing_zherk_desc( run_arg_list_t *args, int check )
     /* Checks the solution */
     if ( check ) {
         CHAMELEON_Desc_Create(
-            &descCinit, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDC, N, 0, 0, N, N, P, Q );
+            &descCinit, CHAMELEON_MAT_ALLOC_TILE, ChamComplexDouble, nb, nb, nb * nb, LDC, N, 0, 0, N, N, P, Q );
         CHAMELEON_zplghe_Tile( bump, uplo, descCinit, seedC );
 
         hres += check_zsyrk( args, ChamHermitian, uplo, trans, alpha, descA, NULL,
@@ -108,8 +105,8 @@ testing_zherk_desc( run_arg_list_t *args, int check )
         CHAMELEON_Desc_Destroy( &descCinit );
     }
 
-    CHAMELEON_Desc_Destroy( &descA );
-    CHAMELEON_Desc_Destroy( &descC );
+    parameters_desc_destroy( &descA );
+    parameters_desc_destroy( &descC );
 
     return hres;
 }
diff --git a/testing/testing_zlacpy.c b/testing/testing_zlacpy.c
index d82da3d111e5388dfa90b26f7f9bd0e3f1208845..9c88f76e0b49485a7a79ebef4aef4443a76fd3c6 100644
--- a/testing/testing_zlacpy.c
+++ b/testing/testing_zlacpy.c
@@ -9,13 +9,13 @@
  *
  * @brief Chameleon zlacpy testing
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Lucas Barros de Assis
  * @author Mathieu Faverge
  * @author Alycia Lisito
  * @author Florent Pruvost
  * @author Philippe Swartvagher
- * @date 2022-02-22
+ * @date 2023-07-05
  * @precisions normal z -> c d s
  *
  */
@@ -67,17 +67,14 @@ testing_zlacpy_desc( run_arg_list_t *args, int check )
     int        hres      = 0;
 
     /* Read arguments */
-    int         async  = parameters_getvalue_int( "async" );
-    intptr_t    mtxfmt = parameters_getvalue_int( "mtxfmt" );
-    int         nb     = run_arg_get_int( args, "nb", 320 );
-    int         P      = parameters_getvalue_int( "P" );
-    cham_uplo_t uplo   = run_arg_get_uplo( args, "uplo", ChamUpper );
-    int         N      = run_arg_get_int( args, "N", 1000 );
-    int         M      = run_arg_get_int( args, "M", N );
-    int         LDA    = run_arg_get_int( args, "LDA", M );
-    int         LDB    = run_arg_get_int( args, "LDB", M );
-    int         seedA  = run_arg_get_int( args, "seedA", testing_ialea() );
-    int         Q      = parameters_compute_q( P );
+    int         async = parameters_getvalue_int( "async" );
+    int         nb    = run_arg_get_int( args, "nb", 320 );
+    cham_uplo_t uplo  = run_arg_get_uplo( args, "uplo", ChamUpper );
+    int         N     = run_arg_get_int( args, "N", 1000 );
+    int         M     = run_arg_get_int( args, "M", N );
+    int         LDA   = run_arg_get_int( args, "LDA", M );
+    int         LDB   = run_arg_get_int( args, "LDB", M );
+    int         seedA = run_arg_get_int( args, "seedA", testing_ialea() );
 
     /* Descriptors */
     CHAM_desc_t *descA, *descB;
@@ -85,10 +82,8 @@ testing_zlacpy_desc( run_arg_list_t *args, int check )
     CHAMELEON_Set( CHAMELEON_TILE_SIZE, nb );
 
     /* Creates two different matrices */
-    CHAMELEON_Desc_Create(
-        &descA, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDA, N, 0, 0, M, N, P, Q );
-    CHAMELEON_Desc_Create(
-        &descB, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDB, N, 0, 0, M, N, P, Q );
+    parameters_desc_create( "A", &descA, ChamComplexDouble, nb, nb, LDA, N, M, N );
+    parameters_desc_create( "B", &descB, ChamComplexDouble, nb, nb, LDB, N, M, N );
 
     /* Fills each matrix with different random values */
     CHAMELEON_zplrnt_Tile( descA, seedA );
@@ -114,8 +109,8 @@ testing_zlacpy_desc( run_arg_list_t *args, int check )
         hres += check_zmatrices( args, uplo, descA, descB );
     }
 
-    CHAMELEON_Desc_Destroy( &descA );
-    CHAMELEON_Desc_Destroy( &descB );
+    parameters_desc_destroy( &descA );
+    parameters_desc_destroy( &descB );
 
     return hres;
 }
diff --git a/testing/testing_zlange.c b/testing/testing_zlange.c
index 1d9263ea1ee46d0e844279d24bbe21650c3116b2..1f4f8e8ff336d0649d8d11d5768ca508286e814b 100644
--- a/testing/testing_zlange.c
+++ b/testing/testing_zlange.c
@@ -9,13 +9,13 @@
  *
  * @brief Chameleon zlange testing
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Lucas Barros de Assis
  * @author Florent Pruvost
  * @author Mathieu Faverge
  * @author Alycia Lisito
  * @author Philippe Swartvagher
- * @date 2022-02-14
+ * @date 2023-07-05
  * @precisions normal z -> c d s
  *
  */
@@ -71,15 +71,12 @@ testing_zlange_desc( run_arg_list_t *args, int check )
 
     /* Read arguments */
     int             async     = parameters_getvalue_int( "async" );
-    intptr_t        mtxfmt    = parameters_getvalue_int( "mtxfmt" );
     int             nb        = run_arg_get_int( args, "nb", 320 );
-    int             P         = parameters_getvalue_int( "P" );
     cham_normtype_t norm_type = run_arg_get_ntype( args, "norm", ChamMaxNorm );
     int             N         = run_arg_get_int( args, "N", 1000 );
     int             M         = run_arg_get_int( args, "M", N );
     int             LDA       = run_arg_get_int( args, "LDA", M );
     int             seedA     = run_arg_get_int( args, "seedA", testing_ialea() );
-    int             Q         = parameters_compute_q( P );
 
     /* Descriptors */
     double       norm;
@@ -88,8 +85,7 @@ testing_zlange_desc( run_arg_list_t *args, int check )
     CHAMELEON_Set( CHAMELEON_TILE_SIZE, nb );
 
     /* Creates the matrix */
-    CHAMELEON_Desc_Create(
-        &descA, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDA, N, 0, 0, M, N, P, Q );
+    parameters_desc_create( "A", &descA, ChamComplexDouble, nb, nb, LDA, N, M, N );
 
     /* Fills the matrix with random values */
     CHAMELEON_zplrnt_Tile( descA, seedA );
@@ -113,7 +109,7 @@ testing_zlange_desc( run_arg_list_t *args, int check )
                             ChamNonUnit, norm, descA );
     }
 
-    CHAMELEON_Desc_Destroy( &descA );
+    parameters_desc_destroy( &descA );
 
     return hres;
 }
diff --git a/testing/testing_zlanhe.c b/testing/testing_zlanhe.c
index bf89c966a3025e4995038f2519d89cacf04e0268..d9b7a6411c1a7cc8c28081e181a4b0a762686215 100644
--- a/testing/testing_zlanhe.c
+++ b/testing/testing_zlanhe.c
@@ -9,13 +9,13 @@
  *
  * @brief Chameleon zlanhe testing
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Lucas Barros de Assis
  * @author Mathieu Faverge
  * @author Alycia Lisito
  * @author Philippe Swartvagher
  * @author Florent Pruvost
- * @date 2022-02-14
+ * @date 2023-07-05
  * @precisions normal z -> c
  *
  */
@@ -67,16 +67,13 @@ testing_zlanhe_desc( run_arg_list_t *args, int check )
 
     /* Read arguments */
     int             async     = parameters_getvalue_int( "async" );
-    intptr_t        mtxfmt    = parameters_getvalue_int( "mtxfmt" );
     int             nb        = run_arg_get_int( args, "nb", 320 );
-    int             P         = parameters_getvalue_int( "P" );
     cham_normtype_t norm_type = run_arg_get_ntype( args, "norm", ChamMaxNorm );
     cham_uplo_t     uplo      = run_arg_get_uplo( args, "uplo", ChamUpper );
     int             N         = run_arg_get_int( args, "N", 1000 );
     int             LDA       = run_arg_get_int( args, "LDA", N );
     int             seedA     = run_arg_get_int( args, "seedA", testing_ialea() );
     double          bump      = testing_dalea();
-    int             Q         = parameters_compute_q( P );
 
     /* Descriptors */
     double       norm;
@@ -87,8 +84,7 @@ testing_zlanhe_desc( run_arg_list_t *args, int check )
     CHAMELEON_Set( CHAMELEON_TILE_SIZE, nb );
 
     /* Creates the matrix */
-    CHAMELEON_Desc_Create(
-        &descA, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDA, N, 0, 0, N, N, P, Q );
+    parameters_desc_create( "A", &descA, ChamComplexDouble, nb, nb, LDA, N, N, N );
 
     /* Fills the matrix with random values */
     CHAMELEON_zplghe_Tile( bump, uplo, descA, seedA );
@@ -111,7 +107,7 @@ testing_zlanhe_desc( run_arg_list_t *args, int check )
         hres = check_znorm( args, ChamHermitian, norm_type, uplo, ChamNonUnit, norm, descA );
     }
 
-    CHAMELEON_Desc_Destroy( &descA );
+    parameters_desc_destroy( &descA );
 
     return hres;
 }
diff --git a/testing/testing_zlansy.c b/testing/testing_zlansy.c
index 2247dbfec47679903e1094470c0cd509cd2c1e28..7d839646273b808f0e8e41b6c333863ac6cbcfe4 100644
--- a/testing/testing_zlansy.c
+++ b/testing/testing_zlansy.c
@@ -9,13 +9,13 @@
  *
  * @brief Chameleon zlansy testing
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Lucas Barros de Assis
  * @author Mathieu Faverge
  * @author Alycia Lisito
  * @author Philippe Swartvagher
  * @author Florent Pruvost
- * @date 2022-02-14
+ * @date 2023-07-05
  * @precisions normal z -> c d s
  *
  */
@@ -67,16 +67,13 @@ testing_zlansy_desc( run_arg_list_t *args, int check )
 
     /* Read arguments */
     int                   async     = parameters_getvalue_int( "async" );
-    intptr_t              mtxfmt    = parameters_getvalue_int( "mtxfmt" );
     int                   nb        = run_arg_get_int( args, "nb", 320 );
-    int                   P         = parameters_getvalue_int( "P" );
     cham_normtype_t       norm_type = run_arg_get_ntype( args, "norm", ChamMaxNorm );
     cham_uplo_t           uplo      = run_arg_get_uplo( args, "uplo", ChamUpper );
     int                   N         = run_arg_get_int( args, "N", 1000 );
     int                   LDA       = run_arg_get_int( args, "LDA", N );
     int                   seedA     = run_arg_get_int( args, "seedA", testing_ialea() );
     CHAMELEON_Complex64_t bump      = testing_zalea();
-    int                   Q         = parameters_compute_q( P );
 
     /* Descriptors */
     double       norm;
@@ -87,8 +84,7 @@ testing_zlansy_desc( run_arg_list_t *args, int check )
     CHAMELEON_Set( CHAMELEON_TILE_SIZE, nb );
 
     /* Creates the matrix */
-    CHAMELEON_Desc_Create(
-        &descA, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDA, N, 0, 0, N, N, P, Q );
+    parameters_desc_create( "A", &descA, ChamComplexDouble, nb, nb, LDA, N, N, N );
 
     /* Fills the matrix with random values */
     CHAMELEON_zplgsy_Tile( bump, uplo, descA, seedA );
@@ -111,7 +107,7 @@ testing_zlansy_desc( run_arg_list_t *args, int check )
         hres = check_znorm( args, ChamSymmetric, norm_type, uplo, ChamNonUnit, norm, descA );
     }
 
-    CHAMELEON_Desc_Destroy( &descA );
+    parameters_desc_destroy( &descA );
 
     return hres;
 }
diff --git a/testing/testing_zlantr.c b/testing/testing_zlantr.c
index c051cfa5a7a03349ee7538855243a65cca33e1a7..1a9c85e007441f1122023bf208de7fa917e82069 100644
--- a/testing/testing_zlantr.c
+++ b/testing/testing_zlantr.c
@@ -9,13 +9,13 @@
  *
  * @brief Chameleon zlantr testing
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Lucas Barros de Assis
  * @author Mathieu Faverge
  * @author Alycia Lisito
  * @author Philippe Swartvagher
  * @author Florent Pruvost
- * @date 2022-02-14
+ * @date 2023-07-05
  * @precisions normal z -> c d s
  *
  */
@@ -92,9 +92,7 @@ testing_zlantr_desc( run_arg_list_t *args, int check )
 
     /* Read arguments */
     int             async     = parameters_getvalue_int( "async" );
-    intptr_t        mtxfmt    = parameters_getvalue_int( "mtxfmt" );
     int             nb        = run_arg_get_int( args, "nb", 320 );
-    int             P         = parameters_getvalue_int( "P" );
     cham_normtype_t norm_type = run_arg_get_ntype( args, "norm", ChamMaxNorm );
     cham_uplo_t     uplo      = run_arg_get_uplo( args, "uplo", ChamUpper );
     cham_diag_t     diag      = run_arg_get_diag( args, "diag", ChamNonUnit );
@@ -102,7 +100,6 @@ testing_zlantr_desc( run_arg_list_t *args, int check )
     int             M         = run_arg_get_int( args, "M", N );
     int             LDA       = run_arg_get_int( args, "LDA", M );
     int             seedA     = run_arg_get_int( args, "seedA", testing_ialea() );
-    int             Q         = parameters_compute_q( P );
 
     /* Descriptors */
     double       norm;
@@ -111,8 +108,7 @@ testing_zlantr_desc( run_arg_list_t *args, int check )
     CHAMELEON_Set( CHAMELEON_TILE_SIZE, nb );
 
     /* Creates the matrix */
-    CHAMELEON_Desc_Create(
-        &descA, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDA, N, 0, 0, M, N, P, Q );
+    parameters_desc_create( "A", &descA, ChamComplexDouble, nb, nb, LDA, N, M, N );
 
     /* Fills the matrix with random values */
     CHAMELEON_zplrnt_Tile( descA, seedA );
@@ -135,7 +131,7 @@ testing_zlantr_desc( run_arg_list_t *args, int check )
         hres = check_znorm( args, ChamTriangular, norm_type, uplo, diag, norm, descA );
     }
 
-    CHAMELEON_Desc_Destroy( &descA );
+    parameters_desc_destroy( &descA );
 
     return hres;
 }
diff --git a/testing/testing_zlascal.c b/testing/testing_zlascal.c
index 6869b9c7b6c29cda4b6a7f05fd348d937b728b2e..6c96b0dbfa1e56e7b27b83ff6810a5efd1f5aae8 100644
--- a/testing/testing_zlascal.c
+++ b/testing/testing_zlascal.c
@@ -9,12 +9,12 @@
  *
  * @brief Chameleon zlascal testing
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Lucas Barros de Assis
  * @author Mathieu Faverge
  * @author Alycia Lisito
  * @author Philippe Swartvagher
- * @date 2022-02-22
+ * @date 2023-07-05
  * @precisions normal z -> c d s
  *
  */
@@ -58,17 +58,16 @@ testing_zlascal_desc( run_arg_list_t *args, int check )
     int        hres      = 0;
 
     /* Read arguments */
-    int                   async  = parameters_getvalue_int( "async" );
-    intptr_t              mtxfmt = parameters_getvalue_int( "mtxfmt" );
-    int                   nb     = run_arg_get_int( args, "nb", 320 );
-    int                   P      = parameters_getvalue_int( "P" );
-    cham_uplo_t           uplo   = run_arg_get_uplo( args, "uplo", ChamUpper );
-    int                   N      = run_arg_get_int( args, "N", 1000 );
-    int                   M      = run_arg_get_int( args, "M", N );
-    int                   LDA    = run_arg_get_int( args, "LDA", M );
-    CHAMELEON_Complex64_t alpha  = run_arg_get_complex64( args, "alpha", 1. );
-    int                   seedA  = run_arg_get_int( args, "seedA", testing_ialea() );
-    int                   Q      = parameters_compute_q( P );
+    int                   async = parameters_getvalue_int( "async" );
+    int                   nb    = run_arg_get_int( args, "nb", 320 );
+    int                   P     = parameters_getvalue_int( "P" );
+    cham_uplo_t           uplo  = run_arg_get_uplo( args, "uplo", ChamUpper );
+    int                   N     = run_arg_get_int( args, "N", 1000 );
+    int                   M     = run_arg_get_int( args, "M", N );
+    int                   LDA   = run_arg_get_int( args, "LDA", M );
+    CHAMELEON_Complex64_t alpha = run_arg_get_complex64( args, "alpha", 1. );
+    int                   seedA = run_arg_get_int( args, "seedA", testing_ialea() );
+    int                   Q     = parameters_compute_q( P );
 
     /* Descriptors */
     CHAM_desc_t *descA, *descAinit;
@@ -76,8 +75,7 @@ testing_zlascal_desc( run_arg_list_t *args, int check )
     CHAMELEON_Set( CHAMELEON_TILE_SIZE, nb );
 
     /* Creates the matrix */
-    CHAMELEON_Desc_Create(
-        &descA, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDA, N, 0, 0, M, N, P, Q );
+    parameters_desc_create( "A", &descA, ChamComplexDouble, nb, nb, LDA, N, M, N );
 
     /* Fills the matrix with random values */
     CHAMELEON_zplrnt_Tile( descA, seedA );
@@ -98,7 +96,7 @@ testing_zlascal_desc( run_arg_list_t *args, int check )
     /* Checks the solution */
     if ( check ) {
         CHAMELEON_Desc_Create(
-            &descAinit, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDA, N, 0, 0, M, N, P, Q );
+            &descAinit, CHAMELEON_MAT_ALLOC_TILE, ChamComplexDouble, nb, nb, nb * nb, LDA, N, 0, 0, M, N, P, Q );
         CHAMELEON_zplrnt_Tile( descAinit, seedA );
 
         hres += check_zscale( args, uplo, alpha, descAinit, descA );
@@ -106,7 +104,7 @@ testing_zlascal_desc( run_arg_list_t *args, int check )
         CHAMELEON_Desc_Destroy( &descAinit );
     }
 
-    CHAMELEON_Desc_Destroy( &descA );
+    parameters_desc_destroy( &descA );
 
     return hres;
 }
diff --git a/testing/testing_zlauum.c b/testing/testing_zlauum.c
index ae4f00ad4af46de96195d872d8466dd23fee653d..d94853260cf2ed0763177e6be02bae4374e1fc59 100644
--- a/testing/testing_zlauum.c
+++ b/testing/testing_zlauum.c
@@ -9,13 +9,13 @@
  *
  * @brief Chameleon zlauum testing
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Lucas Barros de Assis
  * @author Mathieu Faverge
  * @author Alycia Lisito
  * @author Florent Pruvost
  * @author Philippe Swartvagher
- * @date 2022-02-22
+ * @date 2023-07-05
  * @precisions normal z -> c d s
  *
  */
@@ -41,15 +41,12 @@ testing_zlauum_desc( run_arg_list_t *args, int check )
     int        hres      = 0;
 
     /* Read arguments */
-    int         async  = parameters_getvalue_int( "async" );
-    intptr_t    mtxfmt = parameters_getvalue_int( "mtxfmt" );
-    int         nb     = run_arg_get_int( args, "nb", 320 );
-    int         P      = parameters_getvalue_int( "P" );
-    cham_uplo_t uplo   = run_arg_get_uplo( args, "uplo", ChamUpper );
-    int         N      = run_arg_get_int( args, "N", 1000 );
-    int         LDA    = run_arg_get_int( args, "LDA", N );
-    int         seedA  = run_arg_get_int( args, "seedA", testing_ialea() );
-    int         Q      = parameters_compute_q( P );
+    int         async = parameters_getvalue_int( "async" );
+    int         nb    = run_arg_get_int( args, "nb", 320 );
+    cham_uplo_t uplo  = run_arg_get_uplo( args, "uplo", ChamUpper );
+    int         N     = run_arg_get_int( args, "N", 1000 );
+    int         LDA   = run_arg_get_int( args, "LDA", N );
+    int         seedA = run_arg_get_int( args, "seedA", testing_ialea() );
 
     /* Descriptors */
     CHAM_desc_t *descA;
@@ -57,8 +54,7 @@ testing_zlauum_desc( run_arg_list_t *args, int check )
     CHAMELEON_Set( CHAMELEON_TILE_SIZE, nb );
 
     /* Creates the matrices */
-    CHAMELEON_Desc_Create(
-        &descA, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDA, N, 0, 0, N, N, P, Q );
+    parameters_desc_create( "A", &descA, ChamComplexDouble, nb, nb, LDA, N, N, N );
 
     /* Initialises the matrices with the same values */
     CHAMELEON_zplghe_Tile( 0., uplo, descA, seedA );
@@ -76,7 +72,7 @@ testing_zlauum_desc( run_arg_list_t *args, int check )
     testing_stop( &test_data, flops_zlauum( N ) );
 
     if ( check ) {
-        CHAM_desc_t *descA0 = CHAMELEON_Desc_Copy( descA, NULL );
+        CHAM_desc_t *descA0 = CHAMELEON_Desc_Copy( descA, CHAMELEON_MAT_ALLOC_TILE );
         CHAMELEON_zplghe_Tile( 0., uplo, descA0, seedA );
 
         hres += check_zlauum( args, uplo, descA0, descA );
@@ -84,7 +80,7 @@ testing_zlauum_desc( run_arg_list_t *args, int check )
         CHAMELEON_Desc_Destroy( &descA0 );
     }
 
-    CHAMELEON_Desc_Destroy( &descA );
+    parameters_desc_destroy( &descA );
 
     return hres;
 }
diff --git a/testing/testing_zplrnk.c b/testing/testing_zplrnk.c
index ab9cfdd21fdf3d3323b77229316b0f6c25d30108..53d2f7f4afbeb7b1aab7755113cb917d9ff7ec38 100644
--- a/testing/testing_zplrnk.c
+++ b/testing/testing_zplrnk.c
@@ -9,12 +9,12 @@
  *
  * @brief Chameleon zplrnk testing
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Lucas Barros de Assis
  * @author Florent Pruvost
  * @author Mathieu Faverge
  * @author Alycia Lisito
- * @date 2022-02-22
+ * @date 2023-07-05
  * @precisions normal z -> c d s
  *
  */
@@ -32,14 +32,12 @@ testing_zplrnk_desc( run_arg_list_t *args, int check )
     /* Read arguments */
     int async = parameters_getvalue_int( "async" );
     int nb    = run_arg_get_int( args, "nb", 320 );
-    int P     = parameters_getvalue_int( "P" );
     int N     = run_arg_get_int( args, "N", 1000 );
     int M     = run_arg_get_int( args, "M", N );
     int K     = run_arg_get_int( args, "K", N );
     int LDC   = run_arg_get_int( args, "LDC", M );
     int seedA = run_arg_get_int( args, "seedA", testing_ialea() );
     int seedB = run_arg_get_int( args, "seedB", testing_ialea() );
-    int Q     = parameters_compute_q( P );
 
     /* Descriptors */
     CHAM_desc_t *descC;
@@ -47,8 +45,7 @@ testing_zplrnk_desc( run_arg_list_t *args, int check )
     CHAMELEON_Set( CHAMELEON_TILE_SIZE, nb );
 
     /* Creates the matrix */
-    CHAMELEON_Desc_Create(
-        &descC, NULL, ChamComplexDouble, nb, nb, nb * nb, LDC, N, 0, 0, M, N, P, Q );
+    parameters_desc_create( "C", &descC, ChamComplexDouble, nb, nb, LDC, N, M, N );
 
     /* Calculates the random rank-k matrix */
     testing_start( &test_data );
@@ -68,7 +65,7 @@ testing_zplrnk_desc( run_arg_list_t *args, int check )
         hres = check_zrankk( args, K, descC );
     }
 
-    CHAMELEON_Desc_Destroy( &descC );
+    parameters_desc_destroy( &descC );
 
     return hres;
 }
diff --git a/testing/testing_zpoinv.c b/testing/testing_zpoinv.c
index eab5caf0aef7bfe123a327921bd0be8df3a83cca..d9c47565c1ba12ce27e98ae1ddc1b95cd354cdaa 100644
--- a/testing/testing_zpoinv.c
+++ b/testing/testing_zpoinv.c
@@ -9,12 +9,12 @@
  *
  * @brief Chameleon zpoinv testing
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Lucas Barros de Assis
  * @author Florent Pruvost
  * @author Mathieu Faverge
  * @author Alycia Lisito
- * @date 2022-02-14
+ * @date 2023-07-05
  * @precisions normal z -> c d s
  *
  */
@@ -43,15 +43,12 @@ testing_zpoinv_desc( run_arg_list_t *args, int check )
     int        hres      = 0;
 
     /* Read arguments */
-    int         async  = parameters_getvalue_int( "async" );
-    intptr_t    mtxfmt = parameters_getvalue_int( "mtxfmt" );
-    int         nb     = run_arg_get_int( args, "nb", 320 );
-    int         P      = parameters_getvalue_int( "P" );
-    cham_uplo_t uplo   = run_arg_get_uplo( args, "uplo", ChamUpper );
-    int         N      = run_arg_get_int( args, "N", 1000 );
-    int         LDA    = run_arg_get_int( args, "LDA", N );
-    int         seedA  = run_arg_get_int( args, "seedA", testing_ialea() );
-    int         Q      = parameters_compute_q( P );
+    int         async = parameters_getvalue_int( "async" );
+    int         nb    = run_arg_get_int( args, "nb", 320 );
+    cham_uplo_t uplo  = run_arg_get_uplo( args, "uplo", ChamUpper );
+    int         N     = run_arg_get_int( args, "N", 1000 );
+    int         LDA   = run_arg_get_int( args, "LDA", N );
+    int         seedA = run_arg_get_int( args, "seedA", testing_ialea() );
 
     /* Descriptors */
     CHAM_desc_t *descA;
@@ -59,8 +56,7 @@ testing_zpoinv_desc( run_arg_list_t *args, int check )
     CHAMELEON_Set( CHAMELEON_TILE_SIZE, nb );
 
     /* Create the matrices */
-    CHAMELEON_Desc_Create(
-        &descA, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDA, N, 0, 0, N, N, P, Q );
+    parameters_desc_create( "A", &descA, ChamComplexDouble, nb, nb, LDA, N, N, N );
 
     /* Initialise the matrix with the random values */
     CHAMELEON_zplghe_Tile( (double)N, uplo, descA, seedA );
@@ -79,7 +75,7 @@ testing_zpoinv_desc( run_arg_list_t *args, int check )
 
     /* Check the inverse */
     if ( check ) {
-        CHAM_desc_t *descA0 = CHAMELEON_Desc_Copy( descA, NULL );
+        CHAM_desc_t *descA0 = CHAMELEON_Desc_Copy( descA, CHAMELEON_MAT_ALLOC_TILE );
         CHAMELEON_zplghe_Tile( (double)N, uplo, descA0, seedA );
 
         hres += check_ztrtri( args, ChamHermitian, uplo, ChamNonUnit, descA0, descA );
@@ -87,7 +83,7 @@ testing_zpoinv_desc( run_arg_list_t *args, int check )
         CHAMELEON_Desc_Destroy( &descA0 );
     }
 
-    CHAMELEON_Desc_Destroy( &descA );
+    parameters_desc_destroy( &descA );
 
     return hres;
 }
diff --git a/testing/testing_zposv.c b/testing/testing_zposv.c
index 823f9e0391ead992b7c5db3ebd2c7d5d990c3e8f..bc60d41a5cddea7dd2270b9f2a133bf3f3fd015a 100644
--- a/testing/testing_zposv.c
+++ b/testing/testing_zposv.c
@@ -9,12 +9,12 @@
  *
  * @brief Chameleon zposv testing
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Lucas Barros de Assis
  * @author Florent Pruvost
  * @author Mathieu Faverge
  * @author Alycia Lisito
- * @date 2022-02-22
+ * @date 2023-07-05
  * @precisions normal z -> c d s
  *
  */
@@ -44,18 +44,15 @@ testing_zposv_desc( run_arg_list_t *args, int check )
     int        hres      = 0;
 
     /* Read arguments */
-    int         async  = parameters_getvalue_int( "async" );
-    intptr_t    mtxfmt = parameters_getvalue_int( "mtxfmt" );
-    int         nb     = run_arg_get_int( args, "nb", 320 );
-    int         P      = parameters_getvalue_int( "P" );
-    cham_uplo_t uplo   = run_arg_get_uplo( args, "uplo", ChamUpper );
-    int         N      = run_arg_get_int( args, "N", 1000 );
-    int         NRHS   = run_arg_get_int( args, "NRHS", 1 );
-    int         LDA    = run_arg_get_int( args, "LDA", N );
-    int         LDB    = run_arg_get_int( args, "LDB", N );
-    int         seedA  = run_arg_get_int( args, "seedA", testing_ialea() );
-    int         seedB  = run_arg_get_int( args, "seedB", testing_ialea() );
-    int         Q      = parameters_compute_q( P );
+    int         async = parameters_getvalue_int( "async" );
+    int         nb    = run_arg_get_int( args, "nb", 320 );
+    cham_uplo_t uplo  = run_arg_get_uplo( args, "uplo", ChamUpper );
+    int         N     = run_arg_get_int( args, "N", 1000 );
+    int         NRHS  = run_arg_get_int( args, "NRHS", 1 );
+    int         LDA   = run_arg_get_int( args, "LDA", N );
+    int         LDB   = run_arg_get_int( args, "LDB", N );
+    int         seedA = run_arg_get_int( args, "seedA", testing_ialea() );
+    int         seedB = run_arg_get_int( args, "seedB", testing_ialea() );
 
     /* Descriptors */
     CHAM_desc_t *descA, *descX;
@@ -63,10 +60,8 @@ testing_zposv_desc( run_arg_list_t *args, int check )
     CHAMELEON_Set( CHAMELEON_TILE_SIZE, nb );
 
     /* Creates the matrices */
-    CHAMELEON_Desc_Create(
-        &descA, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDA, N, 0, 0, N, N, P, Q );
-    CHAMELEON_Desc_Create(
-        &descX, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDB, NRHS, 0, 0, N, NRHS, P, Q );
+    parameters_desc_create( "A", &descA, ChamComplexDouble, nb, nb, LDA, N, N, N );
+    parameters_desc_create( "X", &descX, ChamComplexDouble, nb, nb, LDB, NRHS, N, NRHS );
 
     /* Fills the matrix with random values */
     CHAMELEON_zplghe_Tile( (double)N, uplo, descA, seedA );
@@ -91,13 +86,13 @@ testing_zposv_desc( run_arg_list_t *args, int check )
         CHAM_desc_t *descA0, *descB;
 
         /* Check the factorization */
-        descA0 = CHAMELEON_Desc_Copy( descA, NULL );
-        CHAMELEON_zplghe_Tile( (double)N, uplo, descA0, seedA );
+        descA0 = CHAMELEON_Desc_Copy( descA, CHAMELEON_MAT_ALLOC_TILE );
+        CHAMELEON_zplghe_Tile( (double)N, ChamUpperLower, descA0, seedA );
 
         hres += check_zxxtrf( args, ChamHermitian, uplo, descA0, descA );
 
         /* Check the solve */
-        descB = CHAMELEON_Desc_Copy( descX, NULL );
+        descB = CHAMELEON_Desc_Copy( descX, CHAMELEON_MAT_ALLOC_TILE );
         CHAMELEON_zplrnt_Tile( descB, seedB );
 
         CHAMELEON_zplghe_Tile( (double)N, uplo, descA0, seedA );
@@ -107,8 +102,8 @@ testing_zposv_desc( run_arg_list_t *args, int check )
         CHAMELEON_Desc_Destroy( &descB );
     }
 
-    CHAMELEON_Desc_Destroy( &descA );
-    CHAMELEON_Desc_Destroy( &descX );
+    parameters_desc_destroy( &descA );
+    parameters_desc_destroy( &descX );
 
     return hres;
 }
diff --git a/testing/testing_zpotrf.c b/testing/testing_zpotrf.c
index b49c7294d841c9018026b3c4caafc9146ffa3f6c..4f84e08f53a7cb0583d84e83f5d240bd938a648b 100644
--- a/testing/testing_zpotrf.c
+++ b/testing/testing_zpotrf.c
@@ -9,12 +9,12 @@
  *
  * @brief Chameleon zpotrf testing
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Lucas Barros de Assis
  * @author Mathieu Faverge
  * @author Alycia Lisito
  * @author Florent Pruvost
- * @date 2022-02-22
+ * @date 2023-07-05
  * @precisions normal z -> c d s
  *
  */
@@ -37,15 +37,12 @@ testing_zpotrf_desc( run_arg_list_t *args, int check )
     int        hres      = 0;
 
     /* Read arguments */
-    int         async  = parameters_getvalue_int( "async" );
-    intptr_t    mtxfmt = parameters_getvalue_int( "mtxfmt" );
-    int         nb     = run_arg_get_int( args, "nb", 320 );
-    int         P      = parameters_getvalue_int( "P" );
-    cham_uplo_t uplo   = run_arg_get_uplo( args, "uplo", ChamUpper );
-    int         N      = run_arg_get_int( args, "N", 1000 );
-    int         LDA    = run_arg_get_int( args, "LDA", N );
-    int         seedA  = run_arg_get_int( args, "seedA", testing_ialea() );
-    int         Q      = parameters_compute_q( P );
+    int         async = parameters_getvalue_int( "async" );
+    int         nb    = run_arg_get_int( args, "nb", 320 );
+    cham_uplo_t uplo  = run_arg_get_uplo( args, "uplo", ChamUpper );
+    int         N     = run_arg_get_int( args, "N", 1000 );
+    int         LDA   = run_arg_get_int( args, "LDA", N );
+    int         seedA = run_arg_get_int( args, "seedA", testing_ialea() );
 
     /* Descriptors */
     CHAM_desc_t *descA;
@@ -53,8 +50,7 @@ testing_zpotrf_desc( run_arg_list_t *args, int check )
     CHAMELEON_Set( CHAMELEON_TILE_SIZE, nb );
 
     /* Creates the matrices */
-    CHAMELEON_Desc_Create(
-        &descA, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDA, N, 0, 0, N, N, P, Q );
+    parameters_desc_create( "A", &descA, ChamComplexDouble, nb, nb, LDA, N, N, N );
 
     /* Fills the matrix with random values */
     CHAMELEON_zplghe_Tile( (double)N, uplo, descA, seedA );
@@ -74,15 +70,15 @@ testing_zpotrf_desc( run_arg_list_t *args, int check )
 
     /* Checks the factorisation and residue */
     if ( check ) {
-        CHAM_desc_t *descA0 = CHAMELEON_Desc_Copy( descA, NULL );
-        CHAMELEON_zplghe_Tile( (double)N, uplo, descA0, seedA );
+        CHAM_desc_t *descA0 = CHAMELEON_Desc_Copy( descA, CHAMELEON_MAT_ALLOC_TILE );
+        CHAMELEON_zplghe_Tile( (double)N, ChamUpperLower, descA0, seedA );
 
         hres += check_zxxtrf( args, ChamHermitian, uplo, descA0, descA );
 
         CHAMELEON_Desc_Destroy( &descA0 );
     }
 
-    CHAMELEON_Desc_Destroy( &descA );
+    parameters_desc_destroy( &descA );
 
     return hres;
 }
diff --git a/testing/testing_zpotri.c b/testing/testing_zpotri.c
index e1bca7535e47b7a9d60c7d1a04336eb29cf5afc8..fed682df0d8e372ccc3c8666f54a7da10991a60b 100644
--- a/testing/testing_zpotri.c
+++ b/testing/testing_zpotri.c
@@ -9,12 +9,12 @@
  *
  * @brief Chameleon zpotri testing
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Lucas Barros de Assis
  * @author Florent Pruvost
  * @author Mathieu Faverge
  * @author Alycia Lisito
- * @date 2022-02-14
+ * @date 2023-07-05
  * @precisions normal z -> c d s
  *
  */
@@ -38,15 +38,12 @@ testing_zpotri_desc( run_arg_list_t *args, int check )
     int        hres      = 0;
 
     /* Read arguments */
-    int         async  = parameters_getvalue_int( "async" );
-    intptr_t    mtxfmt = parameters_getvalue_int( "mtxfmt" );
-    int         nb     = run_arg_get_int( args, "nb", 320 );
-    int         P      = parameters_getvalue_int( "P" );
-    cham_uplo_t uplo   = run_arg_get_uplo( args, "uplo", ChamUpper );
-    int         N      = run_arg_get_int( args, "N", 1000 );
-    int         LDA    = run_arg_get_int( args, "LDA", N );
-    int         seedA  = run_arg_get_int( args, "seedA", testing_ialea() );
-    int         Q      = parameters_compute_q( P );
+    int         async = parameters_getvalue_int( "async" );
+    int         nb    = run_arg_get_int( args, "nb", 320 );
+    cham_uplo_t uplo  = run_arg_get_uplo( args, "uplo", ChamUpper );
+    int         N     = run_arg_get_int( args, "N", 1000 );
+    int         LDA   = run_arg_get_int( args, "LDA", N );
+    int         seedA = run_arg_get_int( args, "seedA", testing_ialea() );
 
     /* Descriptors */
     CHAM_desc_t *descA;
@@ -54,8 +51,7 @@ testing_zpotri_desc( run_arg_list_t *args, int check )
     CHAMELEON_Set( CHAMELEON_TILE_SIZE, nb );
 
     /* Create the matrices */
-    CHAMELEON_Desc_Create(
-        &descA, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDA, N, 0, 0, N, N, P, Q );
+    parameters_desc_create( "A", &descA, ChamComplexDouble, nb, nb, LDA, N, N, N );
 
     /* Initialise the matrix with the random values */
     CHAMELEON_zplghe_Tile( (double)N, uplo, descA, seedA );
@@ -77,7 +73,7 @@ testing_zpotri_desc( run_arg_list_t *args, int check )
 
     /* Check the inverse */
     if ( check ) {
-        CHAM_desc_t *descA0 = CHAMELEON_Desc_Copy( descA, NULL );
+        CHAM_desc_t *descA0 = CHAMELEON_Desc_Copy( descA, CHAMELEON_MAT_ALLOC_TILE );
         CHAMELEON_zplghe_Tile( (double)N, uplo, descA0, seedA );
 
         hres += check_ztrtri( args, ChamHermitian, uplo, ChamNonUnit, descA0, descA );
@@ -85,7 +81,7 @@ testing_zpotri_desc( run_arg_list_t *args, int check )
         CHAMELEON_Desc_Destroy( &descA0 );
     }
 
-    CHAMELEON_Desc_Destroy( &descA );
+    parameters_desc_destroy( &descA );
 
     return hres;
 }
diff --git a/testing/testing_zpotrs.c b/testing/testing_zpotrs.c
index 3a865db992dba0cf3978ec140f7446215551f136..7f86ee7bdfd361cb12f0c06ecdc5a279df2de4d3 100644
--- a/testing/testing_zpotrs.c
+++ b/testing/testing_zpotrs.c
@@ -9,12 +9,12 @@
  *
  * @brief Chameleon zpotrs testing
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Lucas Barros de Assis
  * @author Mathieu Faverge
  * @author Alycia Lisito
  * @author Florent Pruvost
- * @date 2022-02-22
+ * @date 2023-07-05
  * @precisions normal z -> c d s
  *
  */
@@ -38,18 +38,15 @@ testing_zpotrs_desc( run_arg_list_t *args, int check )
     int        hres      = 0;
 
     /* Read arguments */
-    int         async  = parameters_getvalue_int( "async" );
-    intptr_t    mtxfmt = parameters_getvalue_int( "mtxfmt" );
-    int         nb     = run_arg_get_int( args, "nb", 320 );
-    int         P      = parameters_getvalue_int( "P" );
-    cham_uplo_t uplo   = run_arg_get_uplo( args, "uplo", ChamUpper );
-    int         N      = run_arg_get_int( args, "N", 1000 );
-    int         NRHS   = run_arg_get_int( args, "NRHS", 1 );
-    int         LDA    = run_arg_get_int( args, "LDA", N );
-    int         LDB    = run_arg_get_int( args, "LDB", N );
-    int         seedA  = run_arg_get_int( args, "seedA", testing_ialea() );
-    int         seedB  = run_arg_get_int( args, "seedB", testing_ialea() );
-    int         Q      = parameters_compute_q( P );
+    int         async = parameters_getvalue_int( "async" );
+    int         nb    = run_arg_get_int( args, "nb", 320 );
+    cham_uplo_t uplo  = run_arg_get_uplo( args, "uplo", ChamUpper );
+    int         N     = run_arg_get_int( args, "N", 1000 );
+    int         NRHS  = run_arg_get_int( args, "NRHS", 1 );
+    int         LDA   = run_arg_get_int( args, "LDA", N );
+    int         LDB   = run_arg_get_int( args, "LDB", N );
+    int         seedA = run_arg_get_int( args, "seedA", testing_ialea() );
+    int         seedB = run_arg_get_int( args, "seedB", testing_ialea() );
 
     /* Descriptors */
     CHAM_desc_t *descA, *descX;
@@ -57,10 +54,8 @@ testing_zpotrs_desc( run_arg_list_t *args, int check )
     CHAMELEON_Set( CHAMELEON_TILE_SIZE, nb );
 
     /* Creates the matrices */
-    CHAMELEON_Desc_Create(
-        &descA, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDA, N, 0, 0, N, N, P, Q );
-    CHAMELEON_Desc_Create(
-        &descX, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDB, NRHS, 0, 0, N, NRHS, P, Q );
+    parameters_desc_create( "A", &descA, ChamComplexDouble, nb, nb, LDA, N, N, N );
+    parameters_desc_create( "X", &descX, ChamComplexDouble, nb, nb, LDB, NRHS, N, NRHS );
 
     /* Fills the matrix with random values */
     CHAMELEON_zplghe_Tile( (double)N, uplo, descA, seedA );
@@ -85,8 +80,8 @@ testing_zpotrs_desc( run_arg_list_t *args, int check )
 
     /* Checks the factorisation and residue */
     if ( check ) {
-        CHAM_desc_t *descA0 = CHAMELEON_Desc_Copy( descA, NULL );
-        CHAM_desc_t *descB  = CHAMELEON_Desc_Copy( descX, NULL );
+        CHAM_desc_t *descA0 = CHAMELEON_Desc_Copy( descA, CHAMELEON_MAT_ALLOC_TILE );
+        CHAM_desc_t *descB  = CHAMELEON_Desc_Copy( descX, CHAMELEON_MAT_ALLOC_TILE );
 
         CHAMELEON_zplghe_Tile( (double)N, uplo, descA0, seedA );
         CHAMELEON_zplrnt_Tile( descB, seedB );
@@ -97,8 +92,8 @@ testing_zpotrs_desc( run_arg_list_t *args, int check )
         CHAMELEON_Desc_Destroy( &descB );
     }
 
-    CHAMELEON_Desc_Destroy( &descA );
-    CHAMELEON_Desc_Destroy( &descX );
+    parameters_desc_destroy( &descA );
+    parameters_desc_destroy( &descX );
 
     return hres;
 }
@@ -173,7 +168,7 @@ testing_zpotrs_std( run_arg_list_t *args, int check )
         CHAMELEON_Complex64_t *A0 = malloc( LDA*N*   sizeof(CHAMELEON_Complex64_t) );
         CHAMELEON_Complex64_t *B  = malloc( LDB*NRHS*sizeof(CHAMELEON_Complex64_t) );
 
-        CHAMELEON_zplghe( (double)N, uplo, N, A0, LDA, seedA );
+        CHAMELEON_zplghe( (double)N, ChamUpperLower, N, A0, LDA, seedA );
         CHAMELEON_zplrnt( N, NRHS, B, LDB, seedB );
 
         hres += check_zsolve_std( args, ChamHermitian, ChamNoTrans, uplo, N, NRHS, A0, LDA, X, B, LDB );
diff --git a/testing/testing_zprint.c b/testing/testing_zprint.c
index 3aab544aa3434f4ee6a7a742a35d60c1ddb03415..bff288a0233e1ba61a5fd901d5d19715137b4e41 100644
--- a/testing/testing_zprint.c
+++ b/testing/testing_zprint.c
@@ -9,11 +9,12 @@
  *
  * @brief Chameleon zprint testing
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Lucas Barros de Assis
  * @author Mathieu Faverge
  * @author Alycia Lisito
- * @date 2022-02-22
+ * @author Lionel Eyraud-Dubois
+ * @date 2023-07-05
  * @precisions normal z -> c d s
  *
  */
@@ -62,7 +63,7 @@ testing_zprint_desc( run_arg_list_t *args, int check )
     fprintf( stdout, "--- Lapack layout ---\n" );
     rc = CHAMELEON_Desc_Create_User(
         &descA, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDA, N, 0, 0, M, N, P, Q,
-        chameleon_getaddr_cm, chameleon_getblkldd_cm, NULL );
+        chameleon_getaddr_cm, chameleon_getblkldd_cm, NULL, NULL );
 
     if ( rc == CHAMELEON_SUCCESS ) {
         CHAMELEON_Desc_Print( descA );
@@ -79,7 +80,7 @@ testing_zprint_desc( run_arg_list_t *args, int check )
         rc = CHAMELEON_Recursive_Desc_Create(
             &descA, CHAMELEON_MAT_ALLOC_GLOBAL, ChamComplexDouble,
             list_nb, list_nb, LDA, N, M, N, P, Q,
-            NULL, NULL, NULL );
+            NULL, NULL, NULL, NULL );
 
         if ( rc == CHAMELEON_SUCCESS ) {
             CHAMELEON_Desc_Print( descA );
@@ -90,7 +91,7 @@ testing_zprint_desc( run_arg_list_t *args, int check )
         rc = CHAMELEON_Recursive_Desc_Create(
             &descA, CHAMELEON_MAT_ALLOC_GLOBAL, ChamComplexDouble,
             list_nb, list_nb, LDA, N, M, N, P, Q,
-            chameleon_getaddr_cm, chameleon_getblkldd_cm, NULL );
+            chameleon_getaddr_cm, chameleon_getblkldd_cm, NULL, NULL );
 
         if ( rc == CHAMELEON_SUCCESS ) {
             CHAMELEON_Desc_Print( descA );
diff --git a/testing/testing_zsymm.c b/testing/testing_zsymm.c
index 1d8f2c5b802dd64a51a34f6b36917f9e6516ec5b..dc44dba13a4811493cc02b8f91fc74a3bba6a41c 100644
--- a/testing/testing_zsymm.c
+++ b/testing/testing_zsymm.c
@@ -9,12 +9,12 @@
  *
  * @brief Chameleon zsymm testing
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Lucas Barros de Assis
  * @author Florent Pruvost
  * @author Mathieu Faverge
  * @author Alycia Lisito
- * @date 2022-02-22
+ * @date 2023-07-05
  * @precisions normal z -> c d s
  *
  */
@@ -35,24 +35,23 @@ testing_zsymm_desc( run_arg_list_t *args, int check )
     int        hres      = 0;
 
     /* Read arguments */
-    int                   async  = parameters_getvalue_int( "async" );
-    intptr_t              mtxfmt = parameters_getvalue_int( "mtxfmt" );
-    int                   nb     = run_arg_get_int( args, "nb", 320 );
-    int                   P      = parameters_getvalue_int( "P" );
-    cham_side_t           side   = run_arg_get_side( args, "side", ChamLeft );
-    cham_uplo_t           uplo   = run_arg_get_uplo( args, "uplo", ChamUpper );
-    int                   N      = run_arg_get_int( args, "N", 1000 );
-    int                   M      = run_arg_get_int( args, "M", N );
-    int                   LDA    = run_arg_get_int( args, "LDA", ( ( side == ChamLeft ) ? M : N ) );
-    int                   LDB    = run_arg_get_int( args, "LDB", M );
-    int                   LDC    = run_arg_get_int( args, "LDC", M );
-    CHAMELEON_Complex64_t alpha  = testing_zalea();
-    CHAMELEON_Complex64_t beta   = testing_zalea();
-    int                   seedA  = run_arg_get_int( args, "seedA", testing_ialea() );
-    int                   seedB  = run_arg_get_int( args, "seedB", testing_ialea() );
-    int                   seedC  = run_arg_get_int( args, "seedC", testing_ialea() );
-    double                bump   = testing_dalea();
-    int                   Q      = parameters_compute_q( P );
+    int                   async = parameters_getvalue_int( "async" );
+    int                   nb    = run_arg_get_int( args, "nb", 320 );
+    int                   P     = parameters_getvalue_int( "P" );
+    cham_side_t           side  = run_arg_get_side( args, "side", ChamLeft );
+    cham_uplo_t           uplo  = run_arg_get_uplo( args, "uplo", ChamUpper );
+    int                   N     = run_arg_get_int( args, "N", 1000 );
+    int                   M     = run_arg_get_int( args, "M", N );
+    int                   LDA   = run_arg_get_int( args, "LDA", ( ( side == ChamLeft ) ? M : N ) );
+    int                   LDB   = run_arg_get_int( args, "LDB", M );
+    int                   LDC   = run_arg_get_int( args, "LDC", M );
+    CHAMELEON_Complex64_t alpha = testing_zalea();
+    CHAMELEON_Complex64_t beta  = testing_zalea();
+    int                   seedA = run_arg_get_int( args, "seedA", testing_ialea() );
+    int                   seedB = run_arg_get_int( args, "seedB", testing_ialea() );
+    int                   seedC = run_arg_get_int( args, "seedC", testing_ialea() );
+    double                bump  = testing_dalea();
+    int                   Q     = parameters_compute_q( P );
 
     /* Descriptors */
     int          Am;
@@ -74,12 +73,9 @@ testing_zsymm_desc( run_arg_list_t *args, int check )
     }
 
     /* Create the matrices */
-    CHAMELEON_Desc_Create(
-        &descA, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDA, Am, 0, 0, Am, Am, P, Q );
-    CHAMELEON_Desc_Create(
-        &descB, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDB, N, 0, 0, M, N, P, Q );
-    CHAMELEON_Desc_Create(
-        &descC, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDC, N, 0, 0, M, N, P, Q );
+    parameters_desc_create( "A", &descA, ChamComplexDouble, nb, nb, LDA, Am, Am, Am );
+    parameters_desc_create( "B", &descB, ChamComplexDouble, nb, nb, LDB, N, M, N );
+    parameters_desc_create( "C", &descC, ChamComplexDouble, nb, nb, LDC, N, M, N );
 
     /* Fills the matrix with random values */
     CHAMELEON_zplgsy_Tile( bump, uplo, descA, seedA );
@@ -112,7 +108,7 @@ testing_zsymm_desc( run_arg_list_t *args, int check )
     /* Checks the solution */
     if ( check ) {
         CHAMELEON_Desc_Create(
-            &descCinit, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDC, N, 0, 0, M, N, P, Q );
+            &descCinit, CHAMELEON_MAT_ALLOC_TILE, ChamComplexDouble, nb, nb, nb * nb, LDC, N, 0, 0, M, N, P, Q );
         CHAMELEON_zplrnt_Tile( descCinit, seedC );
 
         hres +=
@@ -121,9 +117,9 @@ testing_zsymm_desc( run_arg_list_t *args, int check )
         CHAMELEON_Desc_Destroy( &descCinit );
     }
 
-    CHAMELEON_Desc_Destroy( &descA );
-    CHAMELEON_Desc_Destroy( &descB );
-    CHAMELEON_Desc_Destroy( &descC );
+    parameters_desc_destroy( &descA );
+    parameters_desc_destroy( &descB );
+    parameters_desc_destroy( &descC );
 
     return hres;
 }
diff --git a/testing/testing_zsyr2k.c b/testing/testing_zsyr2k.c
index 9fe468976d2a669bcbcbcc82b88ab1c4771b53aa..482aa43a925656c678ebeddac81c9ab249f5b4e9 100644
--- a/testing/testing_zsyr2k.c
+++ b/testing/testing_zsyr2k.c
@@ -9,12 +9,12 @@
  *
  * @brief Chameleon zsyr2k testing
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Lucas Barros de Assis
  * @author Florent Pruvost
  * @author Mathieu Faverge
  * @author Alycia Lisito
- * @date 2022-02-22
+ * @date 2023-07-05
  * @precisions normal z -> z c d s
  *
  */
@@ -35,17 +35,16 @@ testing_zsyr2k_desc( run_arg_list_t *args, int check )
     int        hres      = 0;
 
     /* Read arguments */
-    int          async  = parameters_getvalue_int( "async" );
-    intptr_t     mtxfmt = parameters_getvalue_int( "mtxfmt" );
-    int          nb     = run_arg_get_int( args, "nb", 320 );
-    int          P      = parameters_getvalue_int( "P" );
-    cham_trans_t trans  = run_arg_get_trans( args, "trans", ChamNoTrans );
-    cham_uplo_t  uplo   = run_arg_get_uplo( args, "uplo", ChamUpper );
-    int          N      = run_arg_get_int( args, "N", 1000 );
-    int          K      = run_arg_get_int( args, "K", N );
-    int          LDA    = run_arg_get_int( args, "LDA", ( ( trans == ChamNoTrans ) ? N : K ) );
-    int          LDB    = run_arg_get_int( args, "LDB", ( ( trans == ChamNoTrans ) ? N : K ) );
-    int          LDC    = run_arg_get_int( args, "LDC", N );
+    int                   async = parameters_getvalue_int( "async" );
+    int                   nb    = run_arg_get_int( args, "nb", 320 );
+    int                   P     = parameters_getvalue_int( "P" );
+    cham_trans_t          trans = run_arg_get_trans( args, "trans", ChamNoTrans );
+    cham_uplo_t           uplo  = run_arg_get_uplo( args, "uplo", ChamUpper );
+    int                   N     = run_arg_get_int( args, "N", 1000 );
+    int                   K     = run_arg_get_int( args, "K", N );
+    int                   LDA   = run_arg_get_int( args, "LDA", ( ( trans == ChamNoTrans ) ? N : K ) );
+    int                   LDB   = run_arg_get_int( args, "LDB", ( ( trans == ChamNoTrans ) ? N : K ) );
+    int                   LDC   = run_arg_get_int( args, "LDC", N );
     CHAMELEON_Complex64_t alpha = testing_zalea();
     CHAMELEON_Complex64_t beta  = testing_zalea();
     int                   seedA = run_arg_get_int( args, "seedA", testing_ialea() );
@@ -75,12 +74,9 @@ testing_zsyr2k_desc( run_arg_list_t *args, int check )
     }
 
     /* Create the matrices */
-    CHAMELEON_Desc_Create(
-        &descA, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDA, An, 0, 0, Am, An, P, Q );
-    CHAMELEON_Desc_Create(
-        &descB, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDB, An, 0, 0, Am, An, P, Q );
-    CHAMELEON_Desc_Create(
-        &descC, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDC, N, 0, 0, N, N, P, Q );
+    parameters_desc_create( "A", &descA, ChamComplexDouble, nb, nb, LDA, An, Am, An );
+    parameters_desc_create( "B", &descB, ChamComplexDouble, nb, nb, LDB, An, Am, An );
+    parameters_desc_create( "C", &descC, ChamComplexDouble, nb, nb, LDC, N, N, N );
 
     /* Fill the matrix with random values */
     CHAMELEON_zplrnt_Tile( descA, seedA );
@@ -105,7 +101,7 @@ testing_zsyr2k_desc( run_arg_list_t *args, int check )
     /* Check the solution */
     if ( check ) {
         CHAMELEON_Desc_Create(
-            &descCinit, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDC, N, 0, 0, N, N, P, Q );
+            &descCinit, CHAMELEON_MAT_ALLOC_TILE, ChamComplexDouble, nb, nb, nb * nb, LDC, N, 0, 0, N, N, P, Q );
         CHAMELEON_zplgsy_Tile( bump, uplo, descCinit, seedC );
 
         hres += check_zsyrk( args, ChamSymmetric, uplo, trans, alpha, descA, descB,
@@ -114,9 +110,9 @@ testing_zsyr2k_desc( run_arg_list_t *args, int check )
         CHAMELEON_Desc_Destroy( &descCinit );
     }
 
-    CHAMELEON_Desc_Destroy( &descA );
-    CHAMELEON_Desc_Destroy( &descB );
-    CHAMELEON_Desc_Destroy( &descC );
+    parameters_desc_destroy( &descA );
+    parameters_desc_destroy( &descB );
+    parameters_desc_destroy( &descC );
 
     return hres;
 }
diff --git a/testing/testing_zsyrk.c b/testing/testing_zsyrk.c
index 39564d56736102d2d6d9a2aef652b0f1e4c5aff6..c6d7a082dfde7d39292033bc018ddc8c8ed55345 100644
--- a/testing/testing_zsyrk.c
+++ b/testing/testing_zsyrk.c
@@ -9,12 +9,12 @@
  *
  * @brief Chameleon zsyrk testing
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Lucas Barros de Assis
  * @author Florent Pruvost
  * @author Mathieu Faverge
  * @author Alycia Lisito
- * @date 2022-02-22
+ * @date 2023-07-05
  * @precisions normal z -> z c d s
  *
  */
@@ -35,16 +35,15 @@ testing_zsyrk_desc( run_arg_list_t *args, int check )
     int        hres      = 0;
 
     /* Read arguments */
-    int          async  = parameters_getvalue_int( "async" );
-    intptr_t     mtxfmt = parameters_getvalue_int( "mtxfmt" );
-    int          nb     = run_arg_get_int( args, "nb", 320 );
-    int          P      = parameters_getvalue_int( "P" );
-    cham_trans_t trans  = run_arg_get_trans( args, "trans", ChamNoTrans );
-    cham_uplo_t  uplo   = run_arg_get_uplo( args, "uplo", ChamUpper );
-    int          N      = run_arg_get_int( args, "N", 1000 );
-    int          K      = run_arg_get_int( args, "K", N );
-    int          LDA    = run_arg_get_int( args, "LDA", ( ( trans == ChamNoTrans ) ? N : K ) );
-    int          LDC    = run_arg_get_int( args, "LDC", N );
+    int                   async = parameters_getvalue_int( "async" );
+    int                   nb    = run_arg_get_int( args, "nb", 320 );
+    int                   P     = parameters_getvalue_int( "P" );
+    cham_trans_t          trans = run_arg_get_trans( args, "trans", ChamNoTrans );
+    cham_uplo_t           uplo  = run_arg_get_uplo( args, "uplo", ChamUpper );
+    int                   N     = run_arg_get_int( args, "N", 1000 );
+    int                   K     = run_arg_get_int( args, "K", N );
+    int                   LDA   = run_arg_get_int( args, "LDA", ( ( trans == ChamNoTrans ) ? N : K ) );
+    int                   LDC   = run_arg_get_int( args, "LDC", N );
     CHAMELEON_Complex64_t alpha = testing_zalea();
     CHAMELEON_Complex64_t beta  = testing_zalea();
     CHAMELEON_Complex64_t bump  = testing_zalea();
@@ -73,10 +72,8 @@ testing_zsyrk_desc( run_arg_list_t *args, int check )
     }
 
     /* Creates the matrices */
-    CHAMELEON_Desc_Create(
-        &descA, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDA, An, 0, 0, Am, An, P, Q );
-    CHAMELEON_Desc_Create(
-        &descC, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDC, N, 0, 0, N, N, P, Q );
+    parameters_desc_create( "A", &descA, ChamComplexDouble, nb, nb, LDA, An, Am, An );
+    parameters_desc_create( "C", &descC, ChamComplexDouble, nb, nb, LDC, N, N, N );
 
     /* Fills the matrix with random values */
     CHAMELEON_zplrnt_Tile( descA, seedA );
@@ -99,7 +96,7 @@ testing_zsyrk_desc( run_arg_list_t *args, int check )
     /* Checks the solution */
     if ( check ) {
         CHAMELEON_Desc_Create(
-            &descCinit, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDC, N, 0, 0, N, N, P, Q );
+            &descCinit, CHAMELEON_MAT_ALLOC_TILE, ChamComplexDouble, nb, nb, nb * nb, LDC, N, 0, 0, N, N, P, Q );
         CHAMELEON_zplgsy_Tile( bump, uplo, descCinit, seedC );
 
         hres += check_zsyrk( args, ChamSymmetric, uplo, trans, alpha, descA, NULL,
@@ -108,8 +105,8 @@ testing_zsyrk_desc( run_arg_list_t *args, int check )
         CHAMELEON_Desc_Destroy( &descCinit );
     }
 
-    CHAMELEON_Desc_Destroy( &descA );
-    CHAMELEON_Desc_Destroy( &descC );
+    parameters_desc_destroy( &descA );
+    parameters_desc_destroy( &descC );
 
     return hres;
 }
diff --git a/testing/testing_zsysv.c b/testing/testing_zsysv.c
index 93e5069675ed60a1c34623625615fb58fa55a7ff..51dc5746ca8dff540127078038b6406d3421adea 100644
--- a/testing/testing_zsysv.c
+++ b/testing/testing_zsysv.c
@@ -9,11 +9,11 @@
  *
  * @brief Chameleon zsysv testing
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Lucas Barros de Assis
  * @author Mathieu Faverge
  * @author Alycia Lisito
- * @date 2022-02-22
+ * @date 2023-07-05
  * @precisions normal z -> c
  *
  */
@@ -36,18 +36,17 @@ testing_zsysv_desc( run_arg_list_t *args, int check )
     int        hres      = 0;
 
     /* Read arguments */
-    int         async  = parameters_getvalue_int( "async" );
-    intptr_t    mtxfmt = parameters_getvalue_int( "mtxfmt" );
-    int         nb     = run_arg_get_int( args, "nb", 320 );
-    int         P      = parameters_getvalue_int( "P" );
-    cham_uplo_t uplo   = run_arg_get_uplo( args, "uplo", ChamUpper );
-    int         N      = run_arg_get_int( args, "N", 1000 );
-    int         NRHS   = run_arg_get_int( args, "NRHS", 1 );
-    int         LDA    = run_arg_get_int( args, "LDA", N );
-    int         LDB    = run_arg_get_int( args, "LDB", N );
-    int         seedA  = run_arg_get_int( args, "seedA", testing_ialea() );
-    int         seedB  = run_arg_get_int( args, "seedB", testing_ialea() );
-    int         Q      = parameters_compute_q( P );
+    int         async = parameters_getvalue_int( "async" );
+    int         nb    = run_arg_get_int( args, "nb", 320 );
+    int         P     = parameters_getvalue_int( "P" );
+    cham_uplo_t uplo  = run_arg_get_uplo( args, "uplo", ChamUpper );
+    int         N     = run_arg_get_int( args, "N", 1000 );
+    int         NRHS  = run_arg_get_int( args, "NRHS", 1 );
+    int         LDA   = run_arg_get_int( args, "LDA", N );
+    int         LDB   = run_arg_get_int( args, "LDB", N );
+    int         seedA = run_arg_get_int( args, "seedA", testing_ialea() );
+    int         seedB = run_arg_get_int( args, "seedB", testing_ialea() );
+    int         Q     = parameters_compute_q( P );
 
     /* Descriptors */
     CHAM_desc_t *descA, *descX;
@@ -55,10 +54,8 @@ testing_zsysv_desc( run_arg_list_t *args, int check )
     CHAMELEON_Set( CHAMELEON_TILE_SIZE, nb );
 
     /* Creates the matrices */
-    CHAMELEON_Desc_Create(
-        &descA, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDA, N, 0, 0, N, N, P, Q );
-    CHAMELEON_Desc_Create(
-        &descX, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDB, NRHS, 0, 0, N, NRHS, P, Q );
+    parameters_desc_create( "A", &descA, ChamComplexDouble, nb, nb, LDA, N, N, N );
+    parameters_desc_create( "X", &descX, ChamComplexDouble, nb, nb, LDB, NRHS, N, NRHS );
 
     /* Fills the matrix with random values */
     CHAMELEON_zplgsy_Tile( (double)N, uplo, descA, seedA );
@@ -83,13 +80,13 @@ testing_zsysv_desc( run_arg_list_t *args, int check )
         CHAM_desc_t *descA0, *descB;
 
         /* Check the factorization */
-        descA0 = CHAMELEON_Desc_Copy( descA, NULL );
+        descA0 = CHAMELEON_Desc_Copy( descA, CHAMELEON_MAT_ALLOC_TILE );
         CHAMELEON_zplgsy_Tile( (double)N, uplo, descA0, seedA );
 
         hres += check_zxxtrf( args, ChamSymmetric, uplo, descA0, descA );
 
         /* Check the solve */
-        descB = CHAMELEON_Desc_Copy( descX, NULL );
+        descB = CHAMELEON_Desc_Copy( descX, CHAMELEON_MAT_ALLOC_TILE );
         CHAMELEON_zplrnt_Tile( descB, seedB );
 
         CHAMELEON_zplgsy_Tile( (double)N, uplo, descA0, seedA );
@@ -99,8 +96,8 @@ testing_zsysv_desc( run_arg_list_t *args, int check )
         CHAMELEON_Desc_Destroy( &descB );
     }
 
-    CHAMELEON_Desc_Destroy( &descA );
-    CHAMELEON_Desc_Destroy( &descX );
+    parameters_desc_destroy( &descA );
+    parameters_desc_destroy( &descX );
 
     return hres;
 }
diff --git a/testing/testing_zsytrf.c b/testing/testing_zsytrf.c
index 930604623ffbb03b99e88c316cecc8c7506d7212..676c73b19b59ea1dceed6845abb26f1d74b2e5b0 100644
--- a/testing/testing_zsytrf.c
+++ b/testing/testing_zsytrf.c
@@ -9,11 +9,11 @@
  *
  * @brief Chameleon zsytrf testing
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Lucas Barros de Assis
  * @author Mathieu Faverge
  * @author Alycia Lisito
- * @date 2022-02-22
+ * @date 2023-07-05
  * @precisions normal z -> c
  *
  */
@@ -29,15 +29,14 @@ testing_zsytrf_desc( run_arg_list_t *args, int check )
     int        hres      = 0;
 
     /* Read arguments */
-    int         async  = parameters_getvalue_int( "async" );
-    intptr_t    mtxfmt = parameters_getvalue_int( "mtxfmt" );
-    int         nb     = run_arg_get_int( args, "nb", 320 );
-    int         P      = parameters_getvalue_int( "P" );
-    cham_uplo_t uplo   = run_arg_get_uplo( args, "uplo", ChamUpper );
-    int         N      = run_arg_get_int( args, "N", 1000 );
-    int         LDA    = run_arg_get_int( args, "LDA", N );
-    int         seedA  = run_arg_get_int( args, "seedA", testing_ialea() );
-    int         Q      = parameters_compute_q( P );
+    int         async = parameters_getvalue_int( "async" );
+    int         nb    = run_arg_get_int( args, "nb", 320 );
+    int         P     = parameters_getvalue_int( "P" );
+    cham_uplo_t uplo  = run_arg_get_uplo( args, "uplo", ChamUpper );
+    int         N     = run_arg_get_int( args, "N", 1000 );
+    int         LDA   = run_arg_get_int( args, "LDA", N );
+    int         seedA = run_arg_get_int( args, "seedA", testing_ialea() );
+    int         Q     = parameters_compute_q( P );
 
     /* Descriptors */
     CHAM_desc_t *descA;
@@ -45,8 +44,7 @@ testing_zsytrf_desc( run_arg_list_t *args, int check )
     CHAMELEON_Set( CHAMELEON_TILE_SIZE, nb );
 
     /* Creates the matrices */
-    CHAMELEON_Desc_Create(
-        &descA, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDA, N, 0, 0, N, N, P, Q );
+    parameters_desc_create( "A", &descA, ChamComplexDouble, nb, nb, LDA, N, N, N );
 
     /* Fills the matrix with random values */
     CHAMELEON_zplgsy_Tile( (double)N, uplo, descA, seedA );
@@ -65,7 +63,7 @@ testing_zsytrf_desc( run_arg_list_t *args, int check )
 
     /* Checks the factorisation and residue */
     if ( check ) {
-        CHAM_desc_t *descA0 = CHAMELEON_Desc_Copy( descA, NULL );
+        CHAM_desc_t *descA0 = CHAMELEON_Desc_Copy( descA, CHAMELEON_MAT_ALLOC_TILE );
         CHAMELEON_zplgsy_Tile( (double)N, uplo, descA0, seedA );
 
         hres += check_zxxtrf( args, ChamSymmetric, uplo, descA0, descA );
@@ -73,7 +71,7 @@ testing_zsytrf_desc( run_arg_list_t *args, int check )
         CHAMELEON_Desc_Destroy( &descA0 );
     }
 
-    CHAMELEON_Desc_Destroy( &descA );
+    parameters_desc_destroy( &descA );
 
     return hres;
 }
diff --git a/testing/testing_zsytrs.c b/testing/testing_zsytrs.c
index 78faa466eb44358b9844e0d8444ca4446d5c4c88..8fa343a9d4ed5d88b82f97ba0496176b53e664a9 100644
--- a/testing/testing_zsytrs.c
+++ b/testing/testing_zsytrs.c
@@ -9,11 +9,11 @@
  *
  * @brief Chameleon zsytrs testing
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Lucas Barros de Assis
  * @author Mathieu Faverge
  * @author Alycia Lisito
- * @date 2022-02-22
+ * @date 2023-07-05
  * @precisions normal z -> c
  *
  */
@@ -30,18 +30,17 @@ testing_zsytrs_desc( run_arg_list_t *args, int check )
     int        hres      = 0;
 
     /* Read arguments */
-    int         async  = parameters_getvalue_int( "async" );
-    intptr_t    mtxfmt = parameters_getvalue_int( "mtxfmt" );
-    int         nb     = run_arg_get_int( args, "nb", 320 );
-    int         P      = parameters_getvalue_int( "P" );
-    cham_uplo_t uplo   = run_arg_get_uplo( args, "uplo", ChamUpper );
-    int         N      = run_arg_get_int( args, "N", 1000 );
-    int         NRHS   = run_arg_get_int( args, "NRHS", 1 );
-    int         LDA    = run_arg_get_int( args, "LDA", N );
-    int         LDB    = run_arg_get_int( args, "LDB", N );
-    int         seedA  = run_arg_get_int( args, "seedA", testing_ialea() );
-    int         seedB  = run_arg_get_int( args, "seedB", testing_ialea() );
-    int         Q      = parameters_compute_q( P );
+    int         async = parameters_getvalue_int( "async" );
+    int         nb    = run_arg_get_int( args, "nb", 320 );
+    int         P     = parameters_getvalue_int( "P" );
+    cham_uplo_t uplo  = run_arg_get_uplo( args, "uplo", ChamUpper );
+    int         N     = run_arg_get_int( args, "N", 1000 );
+    int         NRHS  = run_arg_get_int( args, "NRHS", 1 );
+    int         LDA   = run_arg_get_int( args, "LDA", N );
+    int         LDB   = run_arg_get_int( args, "LDB", N );
+    int         seedA = run_arg_get_int( args, "seedA", testing_ialea() );
+    int         seedB = run_arg_get_int( args, "seedB", testing_ialea() );
+    int         Q     = parameters_compute_q( P );
 
     /* Descriptors */
     CHAM_desc_t *descA, *descX;
@@ -49,10 +48,8 @@ testing_zsytrs_desc( run_arg_list_t *args, int check )
     CHAMELEON_Set( CHAMELEON_TILE_SIZE, nb );
 
     /* Creates the matrices */
-    CHAMELEON_Desc_Create(
-        &descA, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDA, N, 0, 0, N, N, P, Q );
-    CHAMELEON_Desc_Create(
-        &descX, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDB, NRHS, 0, 0, N, NRHS, P, Q );
+    parameters_desc_create( "A", &descA, ChamComplexDouble, nb, nb, LDA, N, N, N );
+    parameters_desc_create( "X", &descX, ChamComplexDouble, nb, nb, LDB, NRHS, N, NRHS );
 
     /* Fills the matrix with random values */
     CHAMELEON_zplgsy_Tile( (double)N, uplo, descA, seedA );
@@ -77,8 +74,8 @@ testing_zsytrs_desc( run_arg_list_t *args, int check )
 
     /* Checks the factorisation and residue */
     if ( check ) {
-        CHAM_desc_t *descA0 = CHAMELEON_Desc_Copy( descA, NULL );
-        CHAM_desc_t *descB  = CHAMELEON_Desc_Copy( descX, NULL );
+        CHAM_desc_t *descA0 = CHAMELEON_Desc_Copy( descA, CHAMELEON_MAT_ALLOC_TILE );
+        CHAM_desc_t *descB  = CHAMELEON_Desc_Copy( descX, CHAMELEON_MAT_ALLOC_TILE );
 
         CHAMELEON_zplgsy_Tile( (double)N, uplo, descA0, seedA );
         CHAMELEON_zplrnt_Tile( descB, seedB );
@@ -89,8 +86,8 @@ testing_zsytrs_desc( run_arg_list_t *args, int check )
         CHAMELEON_Desc_Destroy( &descB );
     }
 
-    CHAMELEON_Desc_Destroy( &descA );
-    CHAMELEON_Desc_Destroy( &descX );
+    parameters_desc_destroy( &descA );
+    parameters_desc_destroy( &descX );
 
     return hres;
 }
diff --git a/testing/testing_ztradd.c b/testing/testing_ztradd.c
index ea49e85b758e3eec412b1b4ec9b01b2e2a23374b..a07d4520b8170c04761096017e24cc7268713aa5 100644
--- a/testing/testing_ztradd.c
+++ b/testing/testing_ztradd.c
@@ -9,12 +9,12 @@
  *
  * @brief Chameleon ztradd testing
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Lucas Barros de Assis
  * @author Mathieu Faverge
  * @author Alycia Lisito
  * @author Philippe Swartvagher
- * @date 2022-02-22
+ * @date 2023-07-05
  * @precisions normal z -> c d s
  *
  */
@@ -60,26 +60,23 @@ testing_ztradd_desc( run_arg_list_t *args, int check )
     int        hres      = 0;
 
     /* Read arguments */
-    int          async  = parameters_getvalue_int( "async" );
-    intptr_t     mtxfmt = parameters_getvalue_int( "mtxfmt" );
-    int          nb     = run_arg_get_int( args, "nb", 320 );
-    int          P      = parameters_getvalue_int( "P" );
-    cham_trans_t trans  = run_arg_get_trans( args, "trans", ChamNoTrans );
-    cham_uplo_t  uplo   = run_arg_get_uplo( args, "uplo", ChamUpper );
-    int          N      = run_arg_get_int( args, "N", 1000 );
-    int          M      = run_arg_get_int( args, "M", N );
-    int          LDA    = run_arg_get_int( args, "LDA", ( ( trans == ChamNoTrans ) ? M : N ) );
-    int          LDB    = run_arg_get_int( args, "LDB", M );
+    int                   async = parameters_getvalue_int( "async" );
+    int                   nb    = run_arg_get_int( args, "nb", 320 );
+    cham_trans_t          trans = run_arg_get_trans( args, "trans", ChamNoTrans );
+    cham_uplo_t           uplo  = run_arg_get_uplo( args, "uplo", ChamUpper );
+    int                   N     = run_arg_get_int( args, "N", 1000 );
+    int                   M     = run_arg_get_int( args, "M", N );
+    int                   LDA   = run_arg_get_int( args, "LDA", ( ( trans == ChamNoTrans ) ? M : N ) );
+    int                   LDB   = run_arg_get_int( args, "LDB", M );
     CHAMELEON_Complex64_t alpha = testing_zalea();
     CHAMELEON_Complex64_t beta  = testing_zalea();
     int                   seedA = run_arg_get_int( args, "seedA", testing_ialea() );
     int                   seedB = run_arg_get_int( args, "seedB", testing_ialea() );
-    int                   Q     = parameters_compute_q( P );
 
     /* Descriptors */
     int          Am, An;
     CHAM_desc_t *descA, *descB;
-    cham_uplo_t            uplo_inv = uplo;
+    cham_uplo_t  uplo_inv = uplo;
 
     if ( uplo != ChamUpperLower && trans != ChamNoTrans ) {
         uplo_inv = (uplo == ChamUpper) ? ChamLower : ChamUpper;
@@ -100,10 +97,8 @@ testing_ztradd_desc( run_arg_list_t *args, int check )
     }
 
     /* Creates the matrices */
-    CHAMELEON_Desc_Create(
-        &descA, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDA, An, 0, 0, Am, An, P, Q );
-    CHAMELEON_Desc_Create(
-        &descB, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDB, N, 0, 0, M, N, P, Q );
+    parameters_desc_create( "A", &descA, ChamComplexDouble, nb, nb, LDA, An, Am, An );
+    parameters_desc_create( "B", &descB, ChamComplexDouble, nb, nb, LDB, N, M, N );
 
     /* Fills the matrix with random values */
     switch ( uplo ) {
@@ -135,7 +130,7 @@ testing_ztradd_desc( run_arg_list_t *args, int check )
 
     /* Checks the solution */
     if ( check ) {
-        CHAM_desc_t *descB0 = CHAMELEON_Desc_Copy( descB, NULL );
+        CHAM_desc_t *descB0 = CHAMELEON_Desc_Copy( descB, CHAMELEON_MAT_ALLOC_TILE );
 
         if ( uplo == ChamUpperLower ) {
             CHAMELEON_zplrnt_Tile( descB0, seedB );
@@ -148,8 +143,8 @@ testing_ztradd_desc( run_arg_list_t *args, int check )
         CHAMELEON_Desc_Destroy( &descB0 );
     }
 
-    CHAMELEON_Desc_Destroy( &descA );
-    CHAMELEON_Desc_Destroy( &descB );
+    parameters_desc_destroy( &descA );
+    parameters_desc_destroy( &descB );
 
     return hres;
 }
diff --git a/testing/testing_ztrmm.c b/testing/testing_ztrmm.c
index 694e437068de549c84893324b7bdb81a3318df42..e987f5e301cbbb34382e19052e79dfe82b4c666c 100644
--- a/testing/testing_ztrmm.c
+++ b/testing/testing_ztrmm.c
@@ -9,12 +9,12 @@
  *
  * @brief Chameleon ztrmm testing
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Lucas Barros de Assis
  * @author Florent Pruvost
  * @author Mathieu Faverge
  * @author Alycia Lisito
- * @date 2022-02-22
+ * @date 2023-07-05
  * @precisions normal z -> c d s
  *
  */
@@ -35,22 +35,21 @@ testing_ztrmm_desc( run_arg_list_t *args, int check )
     int        hres      = 0;
 
     /* Read arguments */
-    int                   async  = parameters_getvalue_int( "async" );
-    intptr_t              mtxfmt = parameters_getvalue_int( "mtxfmt" );
-    int                   nb     = run_arg_get_int( args, "nb", 320 );
-    int                   P      = parameters_getvalue_int( "P" );
-    cham_trans_t          trans  = run_arg_get_trans( args, "trans", ChamNoTrans );
-    cham_side_t           side   = run_arg_get_side( args, "side", ChamLeft );
-    cham_uplo_t           uplo   = run_arg_get_uplo( args, "uplo", ChamUpper );
-    cham_diag_t           diag   = run_arg_get_diag( args, "diag", ChamNonUnit );
-    int                   N      = run_arg_get_int( args, "N", 1000 );
-    int                   M      = run_arg_get_int( args, "M", N );
-    int                   LDA    = run_arg_get_int( args, "LDA", ( side == ChamLeft ) ? M : N );
-    int                   LDB    = run_arg_get_int( args, "LDB", M );
-    CHAMELEON_Complex64_t alpha  = testing_zalea();
-    int                   seedA  = run_arg_get_int( args, "seedA", testing_ialea() );
-    int                   seedB  = run_arg_get_int( args, "seedB", testing_ialea() );
-    int                   Q      = parameters_compute_q( P );
+    int                   async = parameters_getvalue_int( "async" );
+    int                   nb    = run_arg_get_int( args, "nb", 320 );
+    int                   P     = parameters_getvalue_int( "P" );
+    cham_trans_t          trans = run_arg_get_trans( args, "trans", ChamNoTrans );
+    cham_side_t           side  = run_arg_get_side( args, "side", ChamLeft );
+    cham_uplo_t           uplo  = run_arg_get_uplo( args, "uplo", ChamUpper );
+    cham_diag_t           diag  = run_arg_get_diag( args, "diag", ChamNonUnit );
+    int                   N     = run_arg_get_int( args, "N", 1000 );
+    int                   M     = run_arg_get_int( args, "M", N );
+    int                   LDA   = run_arg_get_int( args, "LDA", ( side == ChamLeft ) ? M : N );
+    int                   LDB   = run_arg_get_int( args, "LDB", M );
+    CHAMELEON_Complex64_t alpha = testing_zalea();
+    int                   seedA = run_arg_get_int( args, "seedA", testing_ialea() );
+    int                   seedB = run_arg_get_int( args, "seedB", testing_ialea() );
+    int                   Q     = parameters_compute_q( P );
 
     /* Descriptors */
     CHAM_desc_t *descA, *descB, *descBinit;
@@ -61,17 +60,14 @@ testing_ztrmm_desc( run_arg_list_t *args, int check )
 
     /* Calculates the dimensions according to the side */
     if ( side == ChamLeft ) {
-        CHAMELEON_Desc_Create(
-            &descA, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDA, M, 0, 0, M, M, P, Q );
+        parameters_desc_create( "A", &descA, ChamComplexDouble, nb, nb, LDA, M, M, M );
     }
     else {
-        CHAMELEON_Desc_Create(
-            &descA, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDA, N, 0, 0, N, N, P, Q );
+        parameters_desc_create( "A", &descA, ChamComplexDouble, nb, nb, LDA, N, N, N );
     }
 
     /* Creates the matrices */
-    CHAMELEON_Desc_Create(
-        &descB, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDB, N, 0, 0, M, N, P, Q );
+    parameters_desc_create( "B", &descB, ChamComplexDouble, nb, nb, LDB, N, M, N );
 
     /* Fills the matrix with random values */
     CHAMELEON_zplrnt_Tile( descA, seedA );
@@ -94,7 +90,7 @@ testing_ztrmm_desc( run_arg_list_t *args, int check )
     /* Checks the solution */
     if ( check ) {
         CHAMELEON_Desc_Create(
-            &descBinit, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDB, N, 0, 0, M, N, P, Q );
+            &descBinit, CHAMELEON_MAT_ALLOC_TILE, ChamComplexDouble, nb, nb, nb * nb, LDB, N, 0, 0, M, N, P, Q );
         CHAMELEON_zplrnt_Tile( descBinit, seedB );
 
         hres += check_ztrmm( args, CHECK_TRMM, side, uplo, trans, diag,
@@ -103,8 +99,8 @@ testing_ztrmm_desc( run_arg_list_t *args, int check )
         CHAMELEON_Desc_Destroy( &descBinit );
     }
 
-    CHAMELEON_Desc_Destroy( &descA );
-    CHAMELEON_Desc_Destroy( &descB );
+    parameters_desc_destroy( &descA );
+    parameters_desc_destroy( &descB );
 
     return hres;
 }
diff --git a/testing/testing_ztrsm.c b/testing/testing_ztrsm.c
index 450b795b668f16ccbb90662d555ab54fbd382486..593ef78cb5b588d381491a2e2b878f736b928a3e 100644
--- a/testing/testing_ztrsm.c
+++ b/testing/testing_ztrsm.c
@@ -9,12 +9,12 @@
  *
  * @brief Chameleon ztrsm testing
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Lucas Barros de Assis
  * @author Florent Pruvost
  * @author Mathieu Faverge
  * @author Alycia Lisito
- * @date 2022-02-22
+ * @date 2023-07-05
  * @precisions normal z -> c d s
  *
  */
@@ -35,23 +35,22 @@ testing_ztrsm_desc( run_arg_list_t *args, int check )
     int        hres      = 0;
 
     /* Read arguments */
-    int                   async  = parameters_getvalue_int( "async" );
-    intptr_t              mtxfmt = parameters_getvalue_int( "mtxfmt" );
-    int                   nb     = run_arg_get_int( args, "nb", 320 );
-    int                   P      = parameters_getvalue_int( "P" );
-    cham_trans_t          trans  = run_arg_get_trans( args, "trans", ChamNoTrans );
-    cham_side_t           side   = run_arg_get_side( args, "side", ChamLeft );
-    cham_uplo_t           uplo   = run_arg_get_uplo( args, "uplo", ChamUpper );
-    cham_diag_t           diag   = run_arg_get_diag( args, "diag", ChamNonUnit );
-    int                   N      = run_arg_get_int( args, "N", 1000 );
-    int                   M      = run_arg_get_int( args, "M", N );
-    int                   An     = ( side == ChamLeft ) ? M : N;
-    int                   LDA    = run_arg_get_int( args, "LDA", An );
-    int                   LDB    = run_arg_get_int( args, "LDB", M );
-    CHAMELEON_Complex64_t alpha  = testing_zalea();
-    int                   seedA  = run_arg_get_int( args, "seedA", testing_ialea() );
-    int                   seedB  = run_arg_get_int( args, "seedB", testing_ialea() );
-    int                   Q      = parameters_compute_q( P );
+    int                   async = parameters_getvalue_int( "async" );
+    int                   nb    = run_arg_get_int( args, "nb", 320 );
+    int                   P     = parameters_getvalue_int( "P" );
+    cham_trans_t          trans = run_arg_get_trans( args, "trans", ChamNoTrans );
+    cham_side_t           side  = run_arg_get_side( args, "side", ChamLeft );
+    cham_uplo_t           uplo  = run_arg_get_uplo( args, "uplo", ChamUpper );
+    cham_diag_t           diag  = run_arg_get_diag( args, "diag", ChamNonUnit );
+    int                   N     = run_arg_get_int( args, "N", 1000 );
+    int                   M     = run_arg_get_int( args, "M", N );
+    int                   An    = ( side == ChamLeft ) ? M : N;
+    int                   LDA   = run_arg_get_int( args, "LDA", An );
+    int                   LDB   = run_arg_get_int( args, "LDB", M );
+    CHAMELEON_Complex64_t alpha = testing_zalea();
+    int                   seedA = run_arg_get_int( args, "seedA", testing_ialea() );
+    int                   seedB = run_arg_get_int( args, "seedB", testing_ialea() );
+    int                   Q     = parameters_compute_q( P );
 
     /* Descriptors */
     CHAM_desc_t *descA, *descB, *descBinit;
@@ -61,10 +60,8 @@ testing_ztrsm_desc( run_arg_list_t *args, int check )
     CHAMELEON_Set( CHAMELEON_TILE_SIZE, nb );
 
     /* Creates the matrices */
-    CHAMELEON_Desc_Create(
-        &descA, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDA, An, 0, 0, An, An, P, Q );
-    CHAMELEON_Desc_Create(
-        &descB, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDB, N,  0, 0, M,  N,  P, Q );
+    parameters_desc_create( "A", &descA, ChamComplexDouble, nb, nb, LDA, An, An, An );
+    parameters_desc_create( "B", &descB, ChamComplexDouble, nb, nb, LDB, N, M, N );
 
     /* Fills the matrix with random values */
     /* We bump a little bit the diagonal to make it stable */
@@ -88,7 +85,7 @@ testing_ztrsm_desc( run_arg_list_t *args, int check )
     /* Checks the solution */
     if ( check ) {
         CHAMELEON_Desc_Create(
-            &descBinit, NULL, ChamComplexDouble, nb, nb, nb * nb, LDB, N, 0, 0, M, N, P, Q );
+            &descBinit, CHAMELEON_MAT_ALLOC_TILE, ChamComplexDouble, nb, nb, nb * nb, LDB, N, 0, 0, M, N, P, Q );
         CHAMELEON_zplrnt_Tile( descBinit, seedB );
 
         hres += check_ztrmm( args, CHECK_TRSM, side, uplo, trans, diag,
@@ -97,8 +94,8 @@ testing_ztrsm_desc( run_arg_list_t *args, int check )
         CHAMELEON_Desc_Destroy( &descBinit );
     }
 
-    CHAMELEON_Desc_Destroy( &descA );
-    CHAMELEON_Desc_Destroy( &descB );
+    parameters_desc_destroy( &descA );
+    parameters_desc_destroy( &descB );
 
     return hres;
 }
diff --git a/testing/testing_ztrtri.c b/testing/testing_ztrtri.c
index 757fb100d690fa88edc3b9ba3cad8cfe52a00c6a..3eba5959a8e597caccf23793e2d29131bc7f7b04 100644
--- a/testing/testing_ztrtri.c
+++ b/testing/testing_ztrtri.c
@@ -9,12 +9,12 @@
  *
  * @brief Chameleon ztrtri testing
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Lucas Barros de Assis
  * @author Mathieu Faverge
  * @author Alycia Lisito
  * @author Florent Pruvost
- * @date 2022-02-22
+ * @date 2023-07-05
  * @precisions normal z -> c d s
  *
  */
@@ -33,16 +33,13 @@ testing_ztrtri_desc( run_arg_list_t *args, int check )
     int        hres      = 0;
 
     /* Read arguments */
-    int         async  = parameters_getvalue_int( "async" );
-    intptr_t    mtxfmt = parameters_getvalue_int( "mtxfmt" );
-    int         nb     = run_arg_get_int( args, "nb", 320 );
-    int         P      = parameters_getvalue_int( "P" );
-    cham_uplo_t uplo   = run_arg_get_uplo( args, "uplo", ChamUpper );
-    cham_diag_t diag   = run_arg_get_diag( args, "diag", ChamNonUnit );
-    int         N      = run_arg_get_int( args, "N", 1000 );
-    int         LDA    = run_arg_get_int( args, "LDA", N );
-    int         seedA  = run_arg_get_int( args, "seedA", testing_ialea() );
-    int         Q      = parameters_compute_q( P );
+    int         async = parameters_getvalue_int( "async" );
+    int         nb    = run_arg_get_int( args, "nb", 320 );
+    cham_uplo_t uplo  = run_arg_get_uplo( args, "uplo", ChamUpper );
+    cham_diag_t diag  = run_arg_get_diag( args, "diag", ChamNonUnit );
+    int         N     = run_arg_get_int( args, "N", 1000 );
+    int         LDA   = run_arg_get_int( args, "LDA", N );
+    int         seedA = run_arg_get_int( args, "seedA", testing_ialea() );
 
     /* Descriptors */
     CHAM_desc_t *descA;
@@ -50,8 +47,7 @@ testing_ztrtri_desc( run_arg_list_t *args, int check )
     CHAMELEON_Set( CHAMELEON_TILE_SIZE, nb );
 
     /* Creates the matrices */
-    CHAMELEON_Desc_Create(
-        &descA, (void*)(-mtxfmt), ChamComplexDouble, nb, nb, nb * nb, LDA, N, 0, 0, N, N, P, Q );
+    parameters_desc_create( "A", &descA, ChamComplexDouble, nb, nb, LDA, N, N, N );
 
     /* Initialises the matrices with the same values */
     CHAMELEON_zplghe_Tile( (double)N, uplo, descA, seedA );
@@ -71,7 +67,7 @@ testing_ztrtri_desc( run_arg_list_t *args, int check )
 
     /* Checks the inverse */
     if ( check ) {
-        CHAM_desc_t *descA0 = CHAMELEON_Desc_Copy( descA, NULL );
+        CHAM_desc_t *descA0 = CHAMELEON_Desc_Copy( descA, CHAMELEON_MAT_ALLOC_TILE );
         CHAMELEON_zplghe_Tile( (double)N, uplo, descA0, seedA );
 
         hres += check_ztrtri( args, ChamTriangular, uplo, diag, descA0, descA );
@@ -79,7 +75,7 @@ testing_ztrtri_desc( run_arg_list_t *args, int check )
         CHAMELEON_Desc_Destroy( &descA0 );
     }
 
-    CHAMELEON_Desc_Destroy( &descA );
+    parameters_desc_destroy( &descA );
 
     return hres;
 }
diff --git a/testing/testing_zunglq.c b/testing/testing_zunglq.c
index 7b140ef8ef9901f406652d84773a4746a5bdb779..f56dce8846cd1675a4aa4d23e77ed4a75fae9c80 100644
--- a/testing/testing_zunglq.c
+++ b/testing/testing_zunglq.c
@@ -9,11 +9,11 @@
  *
  * @brief Chameleon zunglq testing
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Lucas Barros de Assis
  * @author Mathieu Faverge
  * @author Alycia Lisito
- * @date 2022-02-22
+ * @date 2023-07-05
  * @precisions normal z -> c d s
  *
  */
@@ -104,7 +104,7 @@ testing_zunglq_desc( run_arg_list_t *args, int check )
 
     /* Checks the factorisation and orthogonality */
     if ( check ) {
-        CHAM_desc_t *descA0 = CHAMELEON_Desc_Copy( descA, NULL );
+        CHAM_desc_t *descA0 = CHAMELEON_Desc_Copy( descA, CHAMELEON_MAT_ALLOC_TILE );
         CHAMELEON_zplrnt_Tile( descA0, seedA );
 
         hres += check_zortho( args, descQ );
diff --git a/testing/testing_zunglq_hqr.c b/testing/testing_zunglq_hqr.c
index e0d74d5230c49f5a4a71316600b0083eb8bf6ab5..12f51d7fb09fe7af974de5a894be92d3ef6ee696 100644
--- a/testing/testing_zunglq_hqr.c
+++ b/testing/testing_zunglq_hqr.c
@@ -9,11 +9,11 @@
  *
  * @brief Chameleon zunglq_hqr testing
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Lucas Barros de Assis
  * @author Mathieu Faverge
  * @author Alycia Lisito
- * @date 2022-02-22
+ * @date 2023-07-05
  * @precisions normal z -> c d s
  *
  */
@@ -114,7 +114,7 @@ testing_zunglq_hqr_desc( run_arg_list_t *args, int check )
 
     /* Checks the factorisation and orthogonality */
     if ( check ) {
-        CHAM_desc_t *descA0 = CHAMELEON_Desc_Copy( descA, NULL );
+        CHAM_desc_t *descA0 = CHAMELEON_Desc_Copy( descA, CHAMELEON_MAT_ALLOC_TILE );
         CHAMELEON_zplrnt_Tile( descA0, seedA );
 
         hres += check_zortho( args, descQ );
diff --git a/testing/testing_zungqr.c b/testing/testing_zungqr.c
index a617589257311efeb5c1d0f0ce2a11ddd95e40ed..eda3bf789ac8b1700099c14887efd6f8b37a399d 100644
--- a/testing/testing_zungqr.c
+++ b/testing/testing_zungqr.c
@@ -9,11 +9,11 @@
  *
  * @brief Chameleon zungqr testing
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Lucas Barros de Assis
  * @author Mathieu Faverge
  * @author Alycia Lisito
- * @date 2022-02-22
+ * @date 2023-07-05
  * @precisions normal z -> c d s
  *
  */
@@ -104,7 +104,7 @@ testing_zungqr_desc( run_arg_list_t *args, int check )
 
     /* Checks the factorisation and orthogonality */
     if ( check ) {
-        CHAM_desc_t *descA0 = CHAMELEON_Desc_Copy( descA, NULL );
+        CHAM_desc_t *descA0 = CHAMELEON_Desc_Copy( descA, CHAMELEON_MAT_ALLOC_TILE );
         CHAMELEON_zplrnt_Tile( descA0, seedA );
 
         hres += check_zortho( args, descQ );
diff --git a/testing/testing_zungqr_hqr.c b/testing/testing_zungqr_hqr.c
index ae96c2def57b0eb20e4815f71bb6ddff8d044dcd..85410033df781c2b2da88d58b57c81b668c2f3bf 100644
--- a/testing/testing_zungqr_hqr.c
+++ b/testing/testing_zungqr_hqr.c
@@ -9,11 +9,11 @@
  *
  * @brief Chameleon zungqr_hqr testing
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Lucas Barros de Assis
  * @author Mathieu Faverge
  * @author Alycia Lisito
- * @date 2022-02-22
+ * @date 2023-07-05
  * @precisions normal z -> c d s
  *
  */
@@ -114,7 +114,7 @@ testing_zungqr_hqr_desc( run_arg_list_t *args, int check )
 
     /* Checks the factorisation and orthogonality */
     if ( check ) {
-        CHAM_desc_t *descA0 = CHAMELEON_Desc_Copy( descA, NULL );
+        CHAM_desc_t *descA0 = CHAMELEON_Desc_Copy( descA, CHAMELEON_MAT_ALLOC_TILE );
         CHAMELEON_zplrnt_Tile( descA0, seedA );
 
         hres += check_zortho( args, descQ );
diff --git a/testing/testing_zunmlq.c b/testing/testing_zunmlq.c
index 2edbe3aa79fbfa57f27ced1fa489d4a3234a24a4..98de7c95bed0eb1b766934e265a52d0309844419 100644
--- a/testing/testing_zunmlq.c
+++ b/testing/testing_zunmlq.c
@@ -9,11 +9,11 @@
  *
  * @brief Chameleon zunmlq testing
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Lucas Barros de Assis
  * @author Mathieu Faverge
  * @author Alycia Lisito
- * @date 2022-02-22
+ * @date 2023-07-05
  * @precisions normal z -> c d s
  *
  */
@@ -97,7 +97,7 @@ testing_zunmlq_desc( run_arg_list_t *args, int check )
 
     /* Checks the factorisation and orthogonality */
     if ( check ) {
-        CHAM_desc_t *descC0 = CHAMELEON_Desc_Copy( descC, NULL );
+        CHAM_desc_t *descC0 = CHAMELEON_Desc_Copy( descC, CHAMELEON_MAT_ALLOC_TILE );
         CHAM_desc_t *descQ;
 
         CHAMELEON_zplrnt_Tile( descC0, seedC );
diff --git a/testing/testing_zunmlq_hqr.c b/testing/testing_zunmlq_hqr.c
index 8e2bd0ebd0cf12086327d9e23bd3e69ab161b667..c951c3010fb91137bde259223de882d44164db8d 100644
--- a/testing/testing_zunmlq_hqr.c
+++ b/testing/testing_zunmlq_hqr.c
@@ -9,11 +9,11 @@
  *
  * @brief Chameleon zunmlq_hqr testing
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Lucas Barros de Assis
  * @author Mathieu Faverge
  * @author Alycia Lisito
- * @date 2022-02-22
+ * @date 2023-07-05
  * @precisions normal z -> c d s
  *
  */
@@ -105,7 +105,7 @@ testing_zunmlq_hqr_desc( run_arg_list_t *args, int check )
 
     /* Checks the factorisation and orthogonality */
     if ( check ) {
-        CHAM_desc_t *descC0 = CHAMELEON_Desc_Copy( descC, NULL );
+        CHAM_desc_t *descC0 = CHAMELEON_Desc_Copy( descC, CHAMELEON_MAT_ALLOC_TILE );
         CHAM_desc_t *descQ;
 
         CHAMELEON_zplrnt_Tile( descC0, seedC );
diff --git a/testing/testing_zunmqr.c b/testing/testing_zunmqr.c
index aa9f604e2eec9772b9f1fa4097ffde5eece209a2..e8ddd686fa1fc0973afe66474d263199acb3f7d6 100644
--- a/testing/testing_zunmqr.c
+++ b/testing/testing_zunmqr.c
@@ -9,11 +9,11 @@
  *
  * @brief Chameleon zunmqr testing
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Lucas Barros de Assis
  * @author Mathieu Faverge
  * @author Alycia Lisito
- * @date 2022-02-22
+ * @date 2023-07-05
  * @precisions normal z -> c d s
  *
  */
@@ -97,7 +97,7 @@ testing_zunmqr_desc( run_arg_list_t *args, int check )
 
     /* Checks the factorisation and orthogonality */
     if ( check ) {
-        CHAM_desc_t *descC0 = CHAMELEON_Desc_Copy( descC, NULL );
+        CHAM_desc_t *descC0 = CHAMELEON_Desc_Copy( descC, CHAMELEON_MAT_ALLOC_TILE );
         CHAM_desc_t *descQ;
 
         CHAMELEON_zplrnt_Tile( descC0, seedC );
diff --git a/testing/testing_zunmqr_hqr.c b/testing/testing_zunmqr_hqr.c
index d8c3c5b57cc4c8111b19541d347e3ab0f8ced4a1..0dec690d3cecefb13ce9264d214bb286c6974731 100644
--- a/testing/testing_zunmqr_hqr.c
+++ b/testing/testing_zunmqr_hqr.c
@@ -9,11 +9,11 @@
  *
  * @brief Chameleon zunmqr_hqr testing
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Lucas Barros de Assis
  * @author Mathieu Faverge
  * @author Alycia Lisito
- * @date 2022-02-22
+ * @date 2023-07-05
  * @precisions normal z -> c d s
  *
  */
@@ -105,7 +105,7 @@ testing_zunmqr_hqr_desc( run_arg_list_t *args, int check )
 
     /* Checks the factorisation and orthogonality */
     if ( check ) {
-        CHAM_desc_t *descC0 = CHAMELEON_Desc_Copy( descC, NULL );
+        CHAM_desc_t *descC0 = CHAMELEON_Desc_Copy( descC, CHAMELEON_MAT_ALLOC_TILE );
         CHAM_desc_t *descQ;
 
         CHAMELEON_zplrnt_Tile( descC0, seedC );
diff --git a/testing/testings.h b/testing/testings.h
index 14383a1938fdc7e147d2a3bb6e4e0284460d1daf..abd70ab22cbe3a850986de53bfbcef99fd1eabd1 100644
--- a/testing/testings.h
+++ b/testing/testings.h
@@ -8,12 +8,13 @@
  *
  * @brief Chameleon auxiliary routines for testing structures
  *
- * @version 1.2.0
+ * @version 1.3.0
  * @author Lucas Barros de Assis
  * @author Mathieu Faverge
  * @author Alycia Lisito
  * @author Florent Pruvost
- * @date 2023-01-05
+ * @author Lionel Eyraud-Dubois
+ * @date 2023-07-05
  *
  */
 #ifndef _testings_h_
@@ -242,6 +243,10 @@ void         parameters_destroy( );
 run_list_t *run_list_generate( const char **params );
 void        run_list_destroy( run_list_elt_t *run );
 
+int parameters_desc_create( const char *id, CHAM_desc_t **descptr, cham_flttype_t dtyp,
+                            int mb, int nb, int lm, int ln, int m, int n );
+int parameters_desc_destroy( CHAM_desc_t **descptr );
+
 /**
  * @brief Define the data associated to a single run of a testing
  */