diff --git a/compute/pzgenm2.c b/compute/pzgenm2.c
index 26689f87448fa62c129e70e70348ac5b5b72452b..bb440cc2d2984ff6f0991d8274f99923f5dfe599 100644
--- a/compute/pzgenm2.c
+++ b/compute/pzgenm2.c
@@ -42,7 +42,7 @@ chameleon_pzgenm2( double tol, const CHAM_desc_t *A, double *result,
     int cnt, maxiter;
     double e0, normx, normsx, beta, scl;
 
-    if ( A->get_rankof != chameleon_getrankof_2d ) {
+    if ( A->get_rankof_init != chameleon_getrankof_2d ) {
         sequence->status = CHAMELEON_ERR_NOT_SUPPORTED;
     }
 
diff --git a/compute/zgemm.c b/compute/zgemm.c
index 9ce47be609ea6784527cba041a1cefbead3409e7..f634ed6be2935dc5785ce3a9d8d205590b021f30 100644
--- a/compute/zgemm.c
+++ b/compute/zgemm.c
@@ -171,7 +171,7 @@ void *CHAMELEON_zgemm_WS_Alloc( cham_trans_t       transA __attribute__((unused)
 
     /* Now that we have decided which algorithm, let's allocate the required data structures. */
     if ( (options->alg == ChamGemmAlgSummaC ) &&
-         (C->get_rankof == chameleon_getrankof_2d ) )
+         (C->get_rankof_init == chameleon_getrankof_2d ) )
     {
         int lookahead = chamctxt->lookahead;
 
diff --git a/compute/zhemm.c b/compute/zhemm.c
index 23c7fdf985ab84b2e604ca5dec633556ff35e68c..6f2eb33d676c1161d7a93582a17de8b0a5402937 100644
--- a/compute/zhemm.c
+++ b/compute/zhemm.c
@@ -150,7 +150,7 @@ void *CHAMELEON_zhemm_WS_Alloc( cham_side_t        side __attribute__((unused)),
 
     /* Now that we have decided which algorithm, let's allocate the required data structures. */
     if ( (options->alg == ChamGemmAlgSummaC ) &&
-         (C->get_rankof == chameleon_getrankof_2d ) )
+         (C->get_rankof_init == chameleon_getrankof_2d ) )
     {
         int lookahead = chamctxt->lookahead;
 
diff --git a/compute/zsymm.c b/compute/zsymm.c
index 397c8f65c7f4387cc4a3fd106538a2fa58ab3325..cf9f194273c4c2840789f3075d142fd7ca904946 100644
--- a/compute/zsymm.c
+++ b/compute/zsymm.c
@@ -150,7 +150,7 @@ void *CHAMELEON_zsymm_WS_Alloc( cham_side_t        side __attribute__((unused)),
 
     /* Now that we have decided which algorithm, let's allocate the required data structures. */
     if ( (options->alg == ChamGemmAlgSummaC ) &&
-         (C->get_rankof == chameleon_getrankof_2d ) )
+         (C->get_rankof_init == chameleon_getrankof_2d ) )
     {
         int lookahead = chamctxt->lookahead;
 
diff --git a/control/common.h b/control/common.h
index d68934a6cc77f28680bc84860c1d6ae7f1e8444d..888cdedf719475f12e6a72c140b276946674cb8b 100644
--- a/control/common.h
+++ b/control/common.h
@@ -119,19 +119,19 @@ void chameleon_pclag2z(CHAM_context_t *chamctxt);
 */
 
 #if defined(__GNUC__)
-static inline void chameleon_asprintf( char **strp, const char *fmt, ... ) __attribute__((format(printf,2,3)));
+static inline int chameleon_asprintf( char **strp, const char *fmt, ... ) __attribute__((format(printf,2,3)));
 #endif
-static inline void chameleon_asprintf( char **strp, const char *fmt, ... )
+static inline int chameleon_asprintf( char **strp, const char *fmt, ... )
 {
     va_list ap;
     int rc;
 
     va_start( ap, fmt );
     rc = asprintf( strp, fmt, ap );
-    va_end(ap);
+    va_end( ap );
 
     assert( rc != -1 );
-    (void)rc;
+    return rc;
 }
 
 #ifdef __cplusplus
diff --git a/control/compute_z.h b/control/compute_z.h
index 1ee61f62894310b1f41c442d47422c7729745e10..b58984838807e61bc20ba4f494c4868fc8f5b6c8 100644
--- a/control/compute_z.h
+++ b/control/compute_z.h
@@ -242,7 +242,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 );
+                              descIn->get_rankof_init );
     return rc;
 }
 
diff --git a/control/descriptor.c b/control/descriptor.c
index 8458fae118c28d6b1fab1bf706038fcd6701f116..7e4e6117b9549a106f63ddb4eeb71c58749cfb82 100644
--- a/control/descriptor.c
+++ b/control/descriptor.c
@@ -88,22 +88,24 @@ int chameleon_desc_mat_free( CHAM_desc_t *desc )
     return CHAMELEON_SUCCESS;
 }
 
-void chameleon_desc_init_tiles( CHAM_desc_t *desc )
+void chameleon_desc_init_tiles( CHAM_desc_t *desc, blkrankof_fct_t rankof )
 {
     CHAM_tile_t *tile;
     int ii, jj;
 
+    assert( rankof != chameleon_getrankof_tile );
     desc->tiles = malloc( desc->lmt * desc->lnt * sizeof(CHAM_tile_t) );
 
     tile = desc->tiles;
     for( jj=0; jj<desc->lnt; jj++ ) {
         for( ii=0; ii<desc->lmt; ii++, tile++ ) {
-            int rank = desc->get_rankof( desc, ii, jj );
+            int rank = rankof( desc, ii, jj );
             tile->format = CHAMELEON_TILE_FULLRANK;
-            tile->m   = ii == desc->lmt-1 ? desc->lm - ii * desc->mb : desc->mb;
-            tile->n   = jj == desc->lnt-1 ? desc->ln - jj * desc->nb : desc->nb;
-            tile->mat = (rank == desc->myrank) ? desc->get_blkaddr( desc, ii, jj ) : NULL;
-            tile->ld  = desc->get_blkldd( desc, ii );
+            tile->rank   = rank;
+            tile->m      = ii == desc->lmt-1 ? desc->lm - ii * desc->mb : desc->mb;
+            tile->n      = jj == desc->lnt-1 ? desc->ln - jj * desc->nb : desc->nb;
+            tile->mat    = (rank == desc->myrank) ? desc->get_blkaddr( desc, ii, jj ) : NULL;
+            tile->ld     = desc->get_blkldd( desc, ii );
 #if defined(CHAMELEON_KERNELS_TRACE)
             chameleon_asprintf( &(tile->name), "%s(%d,%d)", desc->name, ii, jj );
 #endif
@@ -215,7 +217,8 @@ int chameleon_desc_init_internal( CHAM_desc_t *desc, const char *name, void *mat
     desc->get_blktile = chameleon_desc_gettile;
     desc->get_blkaddr = get_blkaddr ? get_blkaddr : chameleon_getaddr_ccrb;
     desc->get_blkldd  = get_blkldd  ? get_blkldd  : chameleon_getblkldd_ccrb;
-    desc->get_rankof  = get_rankof  ? get_rankof  : chameleon_getrankof_2d;
+    desc->get_rankof  = chameleon_getrankof_tile;
+    desc->get_rankof_init = get_rankof ? get_rankof : chameleon_getrankof_2d;
 
     /* Matrix properties */
     desc->dtyp = dtyp;
@@ -331,7 +334,7 @@ int chameleon_desc_init_internal( CHAM_desc_t *desc, const char *name, void *mat
     desc->A12 = (size_t)(            desc->llm%mb)*(size_t)(desc->lln - desc->lln%nb) + desc->A21;
     desc->A22 = (size_t)(desc->llm - desc->llm%mb)*(size_t)(            desc->lln%nb) + desc->A12;
 
-    chameleon_desc_init_tiles( desc );
+    chameleon_desc_init_tiles( desc, desc->get_rankof_init );
 
     /* Create runtime specific structure like registering data */
     RUNTIME_desc_create( desc );
@@ -790,7 +793,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 );
+                                NULL, NULL, descin->get_rankof_init );
     return descout;
 }
 
@@ -825,7 +828,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 );
+                                NULL, NULL, descin->get_rankof_init );
     return descout;
 }
 
@@ -1003,6 +1006,7 @@ chameleon_desc_print( const CHAM_desc_t *desc, int shift )
             trank    = desc->get_rankof( desc, m, n );
             tile     = desc->get_blktile( desc, m, n );
             tiledesc = tile->mat;
+            assert( trank == tile->rank );
 
             ptr = ( tile->format == CHAMELEON_TILE_DESC ) ? (intptr_t)(tiledesc->mat) : (intptr_t)(tile->mat);
 
@@ -1139,7 +1143,7 @@ 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 ) ||
+    if ( ( new_get_rankof == desc->get_rankof_init ) ||
          ( RUNTIME_comm_size( chamctxt ) == 1 ) )
     {
         return CHAMELEON_SUCCESS;
@@ -1164,12 +1168,16 @@ int CHAMELEON_Desc_Change_Distribution_Async( cham_uplo_t         uplo,
         mmin = ( uplo == ChamLower ) ? chameleon_min( n,   desc->mt ) : 0;
         mmax = ( uplo == ChamUpper ) ? chameleon_min( n+1, desc->mt ) : desc->mt;
         for ( m = mmin; m < mmax; m++ ) {
+            CHAM_tile_t *tile = desc->get_blktile( desc, m, n );
+            int rank = new_get_rankof( desc, m, n );
+
             RUNTIME_data_migrate( sequence, desc, m, n, new_get_rankof( desc, m, n ) );
+            tile->rank = rank;
         }
     }
 
     /* Actually change data location in Chameleon */
-    desc->get_rankof = new_get_rankof;
+    desc->get_rankof_init = new_get_rankof;
 
     return CHAMELEON_SUCCESS;
 }
diff --git a/control/descriptor.h b/control/descriptor.h
index 47f0edbdfa270ad988609cc1baffbd542f5c4a93..1e0d883f61db4ff6365fbeaf76e4323124f48240 100644
--- a/control/descriptor.h
+++ b/control/descriptor.h
@@ -51,6 +51,12 @@ inline static int   chameleon_getblkldd_ccrb(const CHAM_desc_t *A, int m);
 int chameleon_getrankof_2d(const CHAM_desc_t *desc, int m, int n);
 int chameleon_getrankof_2d_diag(const CHAM_desc_t *desc, int m, int n);
 
+static inline int chameleon_getrankof_tile(const CHAM_desc_t *desc, int m, int n) {
+    CHAM_tile_t *tile = desc->get_blktile( desc, m, n );
+    assert( tile != NULL );
+    return tile->rank;
+}
+
 int chameleon_desc_init_internal( CHAM_desc_t *desc, const char *name, void *mat,
                                   cham_flttype_t dtyp, int mb, int nb,
                                   int lm, int ln, int m, int n, int p, int q,
diff --git a/include/chameleon/struct.h b/include/chameleon/struct.h
index 7e16010124e1ff8782449d8c0d6630abf42c7e5a..785185550aa8243fe8571fddd76db692bf4fbfeb 100644
--- a/include/chameleon/struct.h
+++ b/include/chameleon/struct.h
@@ -39,9 +39,9 @@ typedef struct chameleon_tile_s {
 #if defined(CHAMELEON_KERNELS_TRACE)
     char  *name;
 #endif
-    int8_t format;
-    int    m, n, ld;
     void  *mat;
+    int    rank, m, n, ld;
+    int8_t format;
 } CHAM_tile_t;
 
 /**
@@ -80,6 +80,8 @@ struct chameleon_desc_s {
     blkldd_fct_t    get_blkldd;
     // function to get chameleon tiles MPI rank
     blkrankof_fct_t get_rankof;
+    // function to get chameleon tiles MPI rank
+    blkrankof_fct_t get_rankof_init;
     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