diff --git a/compute/pzlatms.c b/compute/pzlatms.c
index 7a1334d9d479ba16df52429219644160fb8bd4be..ab0cbe473a3e2f647d295fd47ce1cf18fdbc2200 100644
--- a/compute/pzlatms.c
+++ b/compute/pzlatms.c
@@ -181,7 +181,7 @@ void chameleon_pzlatms( cham_dist_t idist, unsigned long long int seed, cham_sym
         /* U is of size A->m by min(A->m, A->n) */
         chameleon_zdesc_copy_and_restrict( A, &descU, A->m, minmn );
 
-        chameleon_pzplrnt( &descU, seed, sequence, request );
+        chameleon_pzplrnt( &descU, descU.m, 0, 0, seed, sequence, request );
 
         /* Shift the seed to generate the next random unitary matrix */
 #if !defined(CHAMELEON_SIMULATION)
@@ -257,7 +257,7 @@ void chameleon_pzlatms( cham_dist_t idist, unsigned long long int seed, cham_sym
         /* V is of size min(A->m, A->n) by A->n */
         chameleon_zdesc_copy_and_restrict( A, &descV, minmn, A->n );
 
-        chameleon_pzplrnt( &descV, seed, sequence, request );
+        chameleon_pzplrnt( &descV, descV.m, 0, 0, seed, sequence, request );
 
         /* Apply a QR factorization */
         mat.mt    = descV.mt;
diff --git a/compute/pzplghe.c b/compute/pzplghe.c
index d20b36a617cc1e88b79d6df68bf884fdfcbf92c4..7a1f03120228e8b2e4189f15d783e6ff936395f2 100644
--- a/compute/pzplghe.c
+++ b/compute/pzplghe.c
@@ -28,7 +28,7 @@
  *  chameleon_pzplghe - Generate a random hermitian (positive definite if 'bump' is large enough) half-matrix by tiles.
  */
 void chameleon_pzplghe( double bump, cham_uplo_t uplo, CHAM_desc_t *A,
-                        unsigned long long int seed,
+                        int bigM, int m0, int n0, unsigned long long int seed,
                         RUNTIME_sequence_t *sequence, RUNTIME_request_t *request )
 {
     CHAM_context_t *chamctxt;
@@ -56,7 +56,7 @@ void chameleon_pzplghe( double bump, cham_uplo_t uplo, CHAM_desc_t *A,
                 INSERT_TASK_zplghe(
                     &options,
                     bump, tempmm, tempnn, A(m, n),
-                    A->m, m*A->mb, n*A->nb, seed );
+                    bigM, m*A->mb + m0, n*A->nb + n0, seed );
             }
         }
         break;
@@ -72,7 +72,7 @@ void chameleon_pzplghe( double bump, cham_uplo_t uplo, CHAM_desc_t *A,
                 INSERT_TASK_zplghe(
                     &options,
                     bump, tempmm, tempnn, A(m, n),
-                    A->m, m*A->mb, n*A->nb, seed );
+                    bigM, m*A->mb + m0, n*A->nb + n0, seed );
             }
         }
         break;
@@ -89,7 +89,7 @@ void chameleon_pzplghe( double bump, cham_uplo_t uplo, CHAM_desc_t *A,
                 INSERT_TASK_zplghe(
                     &options,
                     bump, tempmm, tempnn, A(m, n),
-                    A->m, m*A->mb, n*A->nb, seed );
+                    bigM, m*A->mb + m0, n*A->nb + n0, seed );
             }
         }
     }
diff --git a/compute/pzplgsy.c b/compute/pzplgsy.c
index 726543b5ac29735f2df0e6bf347109efd6a34ea8..b9a03562030a64d726f37f42d5af988d875f44bf 100644
--- a/compute/pzplgsy.c
+++ b/compute/pzplgsy.c
@@ -28,7 +28,7 @@
  *  chameleon_pzplgsy - Generate a random symmetric (positive definite if 'bump' is large enough) half-matrix by tiles.
  */
 void chameleon_pzplgsy( CHAMELEON_Complex64_t bump, cham_uplo_t uplo, CHAM_desc_t *A,
-                        unsigned long long int seed,
+                        int bigM, int m0, int n0, unsigned long long int seed,
                         RUNTIME_sequence_t *sequence, RUNTIME_request_t *request )
 {
     CHAM_context_t *chamctxt;
@@ -56,7 +56,7 @@ void chameleon_pzplgsy( CHAMELEON_Complex64_t bump, cham_uplo_t uplo, CHAM_desc_
                 INSERT_TASK_zplgsy(
                     &options,
                     bump, tempmm, tempnn, A(m, n),
-                    A->m, m*A->mb, n*A->nb, seed );
+                    bigM, m*A->mb + m0, n*A->nb + n0, seed );
             }
         }
         break;
@@ -72,7 +72,7 @@ void chameleon_pzplgsy( CHAMELEON_Complex64_t bump, cham_uplo_t uplo, CHAM_desc_
                 INSERT_TASK_zplgsy(
                     &options,
                     bump, tempmm, tempnn, A(m, n),
-                    A->m, m*A->mb, n*A->nb, seed );
+                    bigM, m*A->mb + m0, n*A->nb + n0, seed );
             }
         }
         break;
@@ -89,7 +89,7 @@ void chameleon_pzplgsy( CHAMELEON_Complex64_t bump, cham_uplo_t uplo, CHAM_desc_
                 INSERT_TASK_zplgsy(
                     &options,
                     bump, tempmm, tempnn, A(m, n),
-                    A->m, m*A->mb, n*A->nb, seed );
+                    bigM, m*A->mb + m0, n*A->nb + n0, seed );
             }
         }
     }
diff --git a/compute/pzplrnt.c b/compute/pzplrnt.c
index 77845a2ed94dabe157e729e1fd017e35f807cede..a0d08d9bea95ba87abe5c833efa04f6f286949a1 100644
--- a/compute/pzplrnt.c
+++ b/compute/pzplrnt.c
@@ -28,8 +28,9 @@
 /**
  *  chameleon_pzplghe - Generate a random matrix by tiles.
  */
-void chameleon_pzplrnt( CHAM_desc_t *A, unsigned long long int seed,
-                    RUNTIME_sequence_t *sequence, RUNTIME_request_t *request )
+void chameleon_pzplrnt( CHAM_desc_t *A,
+                        int bigM, int m0, int n0, unsigned long long int seed,
+                        RUNTIME_sequence_t *sequence, RUNTIME_request_t *request )
 {
     CHAM_context_t *chamctxt;
     RUNTIME_option_t options;
@@ -52,7 +53,7 @@ void chameleon_pzplrnt( CHAM_desc_t *A, unsigned long long int seed,
             INSERT_TASK_zplrnt(
                 &options,
                 tempmm, tempnn, A(m, n),
-                A->m, m*A->mb, n*A->nb, seed );
+                bigM, m*A->mb + m0, n*A->nb + n0, seed );
         }
     }
     RUNTIME_options_finalize(&options, chamctxt);
diff --git a/compute/zplghe.c b/compute/zplghe.c
index 28f849ea49bcfed4bb915e9712f07253875784b6..ea6a7364f76463233cc13d3f799834a1d82ce51e 100644
--- a/compute/zplghe.c
+++ b/compute/zplghe.c
@@ -270,7 +270,7 @@ int CHAMELEON_zplghe_Tile_Async( double                 bump,
     if (chameleon_min( A->m, A->n ) == 0)
         return CHAMELEON_SUCCESS;
 
-    chameleon_pzplghe( bump, uplo, A, seed, sequence, request );
+    chameleon_pzplghe( bump, uplo, A, A->m, A->i, A->j, seed, sequence, request );
 
     return CHAMELEON_SUCCESS;
 }
diff --git a/compute/zplgsy.c b/compute/zplgsy.c
index c09673df742f391d0c5f5615a5f44d8121bd17e2..2f592151779d658e7caca905922c17a8a8923e63 100644
--- a/compute/zplgsy.c
+++ b/compute/zplgsy.c
@@ -272,7 +272,7 @@ int CHAMELEON_zplgsy_Tile_Async( CHAMELEON_Complex64_t  bump,
     if (chameleon_min( A->m, A->n ) == 0)
         return CHAMELEON_SUCCESS;
 
-    chameleon_pzplgsy( bump, uplo, A, seed, sequence, request );
+    chameleon_pzplgsy( bump, uplo, A, A->m, A->i, A->j, seed, sequence, request );
 
     return CHAMELEON_SUCCESS;
 }
diff --git a/compute/zplrnt.c b/compute/zplrnt.c
index 272e5b4a814008c532ec2b715e8e1999f026aa31..4f25f18a008b184134444bf122addb0f30891803 100644
--- a/compute/zplrnt.c
+++ b/compute/zplrnt.c
@@ -261,7 +261,7 @@ int CHAMELEON_zplrnt_Tile_Async( CHAM_desc_t     *A,
     if (chameleon_min( A->m, A->n ) == 0)
         return CHAMELEON_SUCCESS;
 
-    chameleon_pzplrnt( A, seed, sequence, request );
+    chameleon_pzplrnt( A, A->m, A->i, A->j, seed, sequence, request );
 
     return CHAMELEON_SUCCESS;
 }
diff --git a/control/compute_z.h b/control/compute_z.h
index acc3c54458b4d0462be8adbe6f20404daa5cd643..0e3dc6ae213c42a1c2e9a40fee0724c671606895 100644
--- a/control/compute_z.h
+++ b/control/compute_z.h
@@ -97,9 +97,9 @@ void chameleon_pzlaswp(CHAM_desc_t *B, int *IPIV, int inc, RUNTIME_sequence_t *s
 void chameleon_pzlaswpc(CHAM_desc_t *B, int *IPIV, int inc, RUNTIME_sequence_t *sequence, RUNTIME_request_t *request);
 void chameleon_pzlatms( cham_dist_t idist, unsigned long long int seed, cham_sym_t sym, double *D, int mode, double cond, double dmax, CHAM_desc_t *A, RUNTIME_sequence_t *sequence, RUNTIME_request_t *request );
 void chameleon_pzlauum(cham_uplo_t uplo, CHAM_desc_t *A, RUNTIME_sequence_t *sequence, RUNTIME_request_t *request);
-void chameleon_pzplghe(double bump, cham_uplo_t uplo, CHAM_desc_t *A, unsigned long long int seed, RUNTIME_sequence_t *sequence, RUNTIME_request_t *request );
-void chameleon_pzplgsy(CHAMELEON_Complex64_t bump, cham_uplo_t uplo, CHAM_desc_t *A, unsigned long long int seed, RUNTIME_sequence_t *sequence, RUNTIME_request_t *request );
-void chameleon_pzplrnt(CHAM_desc_t *A, unsigned long long int seed, RUNTIME_sequence_t *sequence, RUNTIME_request_t *request );
+void chameleon_pzplghe(double bump, cham_uplo_t uplo, CHAM_desc_t *A, int bigM, int m0, int n0, unsigned long long int seed, RUNTIME_sequence_t *sequence, RUNTIME_request_t *request );
+void chameleon_pzplgsy(CHAMELEON_Complex64_t bump, cham_uplo_t uplo, CHAM_desc_t *A, int bigM, int m0, int n0, unsigned long long int seed, RUNTIME_sequence_t *sequence, RUNTIME_request_t *request );
+void chameleon_pzplrnt(CHAM_desc_t *A, int bigM, int m0, int n0, unsigned long long int seed, RUNTIME_sequence_t *sequence, RUNTIME_request_t *request );
 void chameleon_pzplrnk(int K, CHAM_desc_t *C, unsigned long long int seedA, unsigned long long int seedB, RUNTIME_sequence_t *sequence, RUNTIME_request_t *request );
 void chameleon_pzpotrf(cham_uplo_t uplo, CHAM_desc_t *A, RUNTIME_sequence_t *sequence, RUNTIME_request_t *request);
 void chameleon_pzpotrimm(cham_uplo_t uplo, CHAM_desc_t *A, CHAM_desc_t *B, CHAM_desc_t *C, RUNTIME_sequence_t *sequence, RUNTIME_request_t *request);
diff --git a/control/descriptor_rec.c b/control/descriptor_rec.c
index d595ec08b043b77ffff98ad4aba3132237f9025d..333a4472a44bd5138f4284ca3246a229b32e8cf0 100644
--- a/control/descriptor_rec.c
+++ b/control/descriptor_rec.c
@@ -17,10 +17,7 @@
  * @date 2020-03-03
  *
  */
-#define _GNU_SOURCE 1
 #include "control/common.h"
-#include <stdlib.h>
-#include <stdio.h>
 #include "chameleon/runtime.h"
 
 static int
diff --git a/include/chameleon/struct.h b/include/chameleon/struct.h
index a43e46d699092a3308f7cfb8896fddc39e8457f2..33f19584eef1dcf1272b96530aff0452caff2bc4 100644
--- a/include/chameleon/struct.h
+++ b/include/chameleon/struct.h
@@ -158,6 +158,20 @@ CHAM_tile_get_ptr( const CHAM_tile_t *tile )
     return tile->mat;
 }
 
+static inline const char *
+CHAM_tile_get_typestr( const CHAM_tile_t *tile )
+{
+    if ( tile->format & CHAMELEON_TILE_DESC ) {
+        return "Desc";
+    }
+
+    if ( tile->format & CHAMELEON_TILE_HMAT ) {
+        return "HMat";
+    }
+
+    return "Full";
+}
+
 END_C_DECLS
 
 #endif /* _chameleon_struct_h_ */
diff --git a/runtime/starpu/codelets/codelet_zgemm.c b/runtime/starpu/codelets/codelet_zgemm.c
index e66b85dedb1c17a8bff8e8ceb49f18fd662060dd..cac587414bc35f51eaa6142f57e07e12195b307d 100644
--- a/runtime/starpu/codelets/codelet_zgemm.c
+++ b/runtime/starpu/codelets/codelet_zgemm.c
@@ -153,6 +153,14 @@ void INSERT_TASK_zgemm( const RUNTIME_option_t *options,
     /* Reduce the C access if needed */
     accessC = ( beta == 0. ) ? STARPU_W : STARPU_RW;
 
+#if defined(CHAMELEON_KERNELS_TRACE)
+    {
+        char *cl_fullname;
+        chameleon_asprintf( &cl_fullname, "%s( %s, %s, %s )", cl_name, clargs->tileA->name, clargs->tileB->name, clargs->tileC->name );
+        cl_name = cl_fullname;
+    }
+#endif
+
     /* Insert the task */
     rt_starpu_insert_task(
         &cl_zgemm,
diff --git a/runtime/starpu/codelets/codelet_zherk.c b/runtime/starpu/codelets/codelet_zherk.c
index 3cc33f4236be6b6619f91c1032df22e787d11724..c4b6eedd83e4004783b2f5f00c630aa53707918d 100644
--- a/runtime/starpu/codelets/codelet_zherk.c
+++ b/runtime/starpu/codelets/codelet_zherk.c
@@ -135,6 +135,14 @@ void INSERT_TASK_zherk( const RUNTIME_option_t *options,
     /* Reduce the C access if needed */
     accessC = ( beta == 0. ) ? STARPU_W : STARPU_RW;
 
+#if defined(CHAMELEON_KERNELS_TRACE)
+    {
+        char *cl_fullname;
+        chameleon_asprintf( &cl_fullname, "%s( %s, %s )", cl_name, clargs->tileA->name, clargs->tileC->name );
+        cl_name = cl_fullname;
+    }
+#endif
+
     /* Insert the task */
     rt_starpu_insert_task(
         &cl_zherk,
diff --git a/runtime/starpu/codelets/codelet_zlauum.c b/runtime/starpu/codelets/codelet_zlauum.c
index 700352172f44c4f3fdbda09f0474d073cb44bc44..31f8012645c2065892434d153151db5f9a6642b8 100644
--- a/runtime/starpu/codelets/codelet_zlauum.c
+++ b/runtime/starpu/codelets/codelet_zlauum.c
@@ -82,6 +82,14 @@ void INSERT_TASK_zlauum( const RUNTIME_option_t *options,
     /* Fix the worker id */
     workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
+#if defined(CHAMELEON_KERNELS_TRACE)
+    {
+        char *cl_fullname;
+        chameleon_asprintf( &cl_fullname, "%s( %s )", cl_name, clargs->tileA->name );
+        cl_name = cl_fullname;
+    }
+#endif
+
     /* Insert the task */
     rt_starpu_insert_task(
         &cl_zlauum,
diff --git a/runtime/starpu/codelets/codelet_zpotrf.c b/runtime/starpu/codelets/codelet_zpotrf.c
index 4f58f7239f494902ba2c067a42ff0ca3e853559f..b0f42d459e51bed0c96b41bdde85256a06ca229a 100644
--- a/runtime/starpu/codelets/codelet_zpotrf.c
+++ b/runtime/starpu/codelets/codelet_zpotrf.c
@@ -98,6 +98,14 @@ void INSERT_TASK_zpotrf( const RUNTIME_option_t *options,
     /* Fix the worker id */
     workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
+#if defined(CHAMELEON_KERNELS_TRACE)
+    {
+        char *cl_fullname;
+        chameleon_asprintf( &cl_fullname, "%s( %s )", cl_name, clargs->tileA->name );
+        cl_name = cl_fullname;
+    }
+#endif
+
     /* Insert the task */
     rt_starpu_insert_task(
         &cl_zpotrf,
diff --git a/runtime/starpu/codelets/codelet_zsyrk.c b/runtime/starpu/codelets/codelet_zsyrk.c
index a878aaa19adfc5c60ece27a785a7dd2fd1e67986..49a16f71bbfec0754d540caf48cdd0ed6540a866 100644
--- a/runtime/starpu/codelets/codelet_zsyrk.c
+++ b/runtime/starpu/codelets/codelet_zsyrk.c
@@ -135,6 +135,14 @@ void INSERT_TASK_zsyrk( const RUNTIME_option_t *options,
     /* Reduce the C access if needed */
     accessC = ( beta == 0. ) ? STARPU_W : STARPU_RW;
 
+#if defined(CHAMELEON_KERNELS_TRACE)
+    {
+        char *cl_fullname;
+        chameleon_asprintf( &cl_fullname, "%s( %s, %s )", cl_name, clargs->tileA->name, clargs->tileC->name );
+        cl_name = cl_fullname;
+    }
+#endif
+
     /* Insert the task */
     rt_starpu_insert_task(
         &cl_zsyrk,
diff --git a/runtime/starpu/codelets/codelet_ztrmm.c b/runtime/starpu/codelets/codelet_ztrmm.c
index 20f86bd38af1f4842aa6e853392f00ed7adfbea3..887ff71d3c7c237d924afe849858ea8d4ba99979 100644
--- a/runtime/starpu/codelets/codelet_ztrmm.c
+++ b/runtime/starpu/codelets/codelet_ztrmm.c
@@ -128,6 +128,14 @@ void INSERT_TASK_ztrmm( const RUNTIME_option_t *options,
     /* Fix the worker id */
     workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
+#if defined(CHAMELEON_KERNELS_TRACE)
+    {
+        char *cl_fullname;
+        chameleon_asprintf( &cl_fullname, "%s( %s, %s )", cl_name, clargs->tileA->name, clargs->tileB->name );
+        cl_name = cl_fullname;
+    }
+#endif
+
     /* Insert the task */
     rt_starpu_insert_task(
         &cl_ztrmm,
diff --git a/runtime/starpu/codelets/codelet_ztrsm.c b/runtime/starpu/codelets/codelet_ztrsm.c
index e40dde763ed018a29003e39bc1b5ee377fbeb4df..2aa43232e8404cfa31431ba7fb3779d3ff0c9e92 100644
--- a/runtime/starpu/codelets/codelet_ztrsm.c
+++ b/runtime/starpu/codelets/codelet_ztrsm.c
@@ -129,6 +129,14 @@ void INSERT_TASK_ztrsm( const RUNTIME_option_t *options,
     /* Fix the worker id */
     workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
+#if defined(CHAMELEON_KERNELS_TRACE)
+    {
+        char *cl_fullname;
+        chameleon_asprintf( &cl_fullname, "%s( %s, %s )", cl_name, clargs->tileA->name, clargs->tileB->name );
+        cl_name = cl_fullname;
+    }
+#endif
+
     /* Insert the task */
     rt_starpu_insert_task(
         &cl_ztrsm,
diff --git a/runtime/starpu/codelets/codelet_ztrtri.c b/runtime/starpu/codelets/codelet_ztrtri.c
index 9732e84c36f4c88c310ee35a8028fc66d4c7b572..9605d034eca04fbced137f051f54b962706c5308 100644
--- a/runtime/starpu/codelets/codelet_ztrtri.c
+++ b/runtime/starpu/codelets/codelet_ztrtri.c
@@ -96,6 +96,14 @@ void INSERT_TASK_ztrtri( const RUNTIME_option_t *options,
     /* Fix the worker id */
     workerid = (schedopt == NULL) ? -1 : schedopt->workerid;
 
+#if defined(CHAMELEON_KERNELS_TRACE)
+    {
+        char *cl_fullname;
+        chameleon_asprintf( &cl_fullname, "%s( %s )", cl_name, clargs->tileA->name );
+        cl_name = cl_fullname;
+    }
+#endif
+
     /* Insert the task */
     rt_starpu_insert_task(
         &cl_ztrtri,
diff --git a/runtime/starpu/interface/cham_tile_interface.c b/runtime/starpu/interface/cham_tile_interface.c
index c95bf0b85a829b59b3c41e00024f57c4bcd46ad5..4ba295ddc6b5f3ad1981775516d18a00c0bbb404 100644
--- a/runtime/starpu/interface/cham_tile_interface.c
+++ b/runtime/starpu/interface/cham_tile_interface.c
@@ -536,10 +536,18 @@ static starpu_ssize_t
 cti_describe( void *data_interface, char *buf, size_t size )
 {
     starpu_cham_tile_interface_t *cham_tile_interface = (starpu_cham_tile_interface_t *) data_interface;
+#if defined(CHAMELEON_KERNELS_TRACE)
+    return snprintf( buf, size, "M%ux%ux%u %s",
+                     (unsigned) cham_tile_interface->tile.m,
+                     (unsigned) cham_tile_interface->tile.n,
+                     (unsigned) cham_tile_interface->flttype,
+                     cham_tile_interface->tile.name);
+#else
     return snprintf( buf, size, "M%ux%ux%u",
                      (unsigned) cham_tile_interface->tile.m,
                      (unsigned) cham_tile_interface->tile.n,
                      (unsigned) cham_tile_interface->flttype );
+#endif
 }
 
 static int cti_copy_any_to_any( void *src_interface, unsigned src_node,
@@ -554,11 +562,23 @@ static int cti_copy_any_to_any( void *src_interface, unsigned src_node,
     size_t ld_dst = cham_tile_dst->tile.ld;
     int ret = 0;
 
+    void *src_mat = CHAM_tile_get_ptr( &(cham_tile_src->tile) );
+    void *dst_mat = CHAM_tile_get_ptr( &(cham_tile_dst->tile) );
+
+#if defined(CHAMELEON_KERNELS_TRACE)
+    fprintf( stderr,
+             "[ANY->ANY] src(%s, type:%s, m=%d, n=%d, ld=%d, ptr:%p) dest(%s, type:%s, m=%d, n=%d, ld=%d, ptr:%p)\n",
+             cham_tile_src->tile.name, CHAM_tile_get_typestr( &(cham_tile_src->tile) ),
+             cham_tile_src->tile.m, cham_tile_src->tile.n, cham_tile_src->tile.ld, src_mat,
+             cham_tile_dst->tile.name, CHAM_tile_get_typestr( &(cham_tile_dst->tile) ),
+             cham_tile_dst->tile.m, cham_tile_dst->tile.n, cham_tile_dst->tile.ld, dst_mat );
+#endif
+
 #if defined(HAVE_STARPU_INTERFACE_COPY2D)
     ld_src *= elemsize;
     ld_dst *= elemsize;
-    if (starpu_interface_copy2d( (uintptr_t) cham_tile_src->tile.mat, 0, src_node,
-                                 (uintptr_t) cham_tile_dst->tile.mat, 0, dst_node,
+    if (starpu_interface_copy2d( (uintptr_t) src_mat, 0, src_node,
+                                 (uintptr_t) dst_mat, 0, dst_node,
                                  m * elemsize, n, ld_src, ld_dst, async_data ) ) {
         ret = -EAGAIN;
     }
@@ -566,8 +586,8 @@ static int cti_copy_any_to_any( void *src_interface, unsigned src_node,
     if ( (ld_src == m) && (ld_dst == m) )
     {
         /* Optimize unpartitioned and y-partitioned cases */
-        if ( starpu_interface_copy( (uintptr_t) cham_tile_src->tile.mat, 0, src_node,
-                                    (uintptr_t) cham_tile_dst->tile.mat, 0, dst_node,
+        if ( starpu_interface_copy( (uintptr_t) src_mat, 0, src_node,
+                                    (uintptr_t) dst_mat, 0, dst_node,
                                     m * n * elemsize, async_data ) )
         {
             ret = -EAGAIN;
@@ -584,8 +604,8 @@ static int cti_copy_any_to_any( void *src_interface, unsigned src_node,
             uint32_t src_offset = y * ld_src;
             uint32_t dst_offset = y * ld_dst;
 
-            if ( starpu_interface_copy( (uintptr_t) cham_tile_src->tile.mat, src_offset, src_node,
-                                        (uintptr_t) cham_tile_dst->tile.mat, dst_offset, dst_node,
+            if ( starpu_interface_copy( (uintptr_t) srcmat, src_offset, src_node,
+                                        (uintptr_t) dstmat, dst_offset, dst_node,
                                         m * elemsize, async_data ) )
             {
                 ret = -EAGAIN;
@@ -651,6 +671,9 @@ starpu_cham_tile_register( starpu_data_handle_t *handleptr,
     if ( tile->format & CHAMELEON_TILE_FULLRANK ) {
         cham_tile_interface.allocsize = tile->m * tile->n * elemsize;
     }
+    else if ( tile->format & CHAMELEON_TILE_DESC ) { /* Needed in case starpu ask for it */
+        cham_tile_interface.allocsize = tile->m * tile->n * elemsize;
+    }
     else if ( tile->format & CHAMELEON_TILE_HMAT ) {
         /* For hmat, allocated data will be handled by hmat library. StarPU cannot allocate it for the library */
         cham_tile_interface.allocsize = 0;