diff --git a/compute/zgelqf.c b/compute/zgelqf.c
index 0b2ee5b69e80ef6d1ea054ef976637cf4b224a42..b1440bb794d718bd1e2f8ff443e189d8c2687137 100644
--- a/compute/zgelqf.c
+++ b/compute/zgelqf.c
@@ -4,7 +4,7 @@
  *
  * @copyright 2009-2014 The University of Tennessee and The University of
  *                      Tennessee Research Foundation. All rights reserved.
- * @copyright 2012-2019 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
+ * @copyright 2012-2020 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
  *                      Univ. Bordeaux. All rights reserved.
  *
  ***
@@ -278,8 +278,8 @@ int CHAMELEON_zgelqf_Tile_Async( CHAM_desc_t *A, CHAM_desc_t *T,
      */
 #if defined(CHAMELEON_COPY_DIAG)
     {
-        int m = chameleon_min(A->m, A->n);
-        chameleon_zdesc_alloc(D, A->mb, A->nb, m, A->n, 0, 0, m, A->n, );
+        int m = chameleon_min( A->m, A->n );
+        chameleon_zdesc_copy_and_restrict( A, &D, m, A->n );
         Dptr = &D;
     }
 #endif
diff --git a/compute/zgelqf_param.c b/compute/zgelqf_param.c
index 6d8c125a518b5593d9e415909afe8675633e41cc..8f12de563ae14a6f625bf376cb830e1f29485fb7 100644
--- a/compute/zgelqf_param.c
+++ b/compute/zgelqf_param.c
@@ -4,7 +4,7 @@
  *
  * @copyright 2009-2014 The University of Tennessee and The University of
  *                      Tennessee Research Foundation. All rights reserved.
- * @copyright 2012-2019 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
+ * @copyright 2012-2020 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
  *                      Univ. Bordeaux. All rights reserved.
  *
  ***
@@ -282,8 +282,8 @@ int CHAMELEON_zgelqf_param_Tile_Async( const libhqr_tree_t *qrtree, CHAM_desc_t
      */
 #if defined(CHAMELEON_COPY_DIAG)
     {
-        int m = chameleon_min(A->m, A->n);
-        chameleon_zdesc_alloc(D, A->mb, A->nb, m, A->n, 0, 0, m, A->n, );
+        int m = chameleon_min( A->m, A->n );
+        chameleon_zdesc_copy_and_restrict( A, &D, m, A->n );
         Dptr = &D;
     }
 #endif
diff --git a/compute/zgelqs.c b/compute/zgelqs.c
index 703650460f4881ee64633fe939179c3359ce628a..a6a635de5dd6c5f6d3ce74b775c8902bf52972f4 100644
--- a/compute/zgelqs.c
+++ b/compute/zgelqs.c
@@ -4,7 +4,7 @@
  *
  * @copyright 2009-2014 The University of Tennessee and The University of
  *                      Tennessee Research Foundation. All rights reserved.
- * @copyright 2012-2019 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
+ * @copyright 2012-2020 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
  *                      Univ. Bordeaux. All rights reserved.
  *
  ***
@@ -318,8 +318,8 @@ int CHAMELEON_zgelqs_Tile_Async( CHAM_desc_t *A, CHAM_desc_t *T, CHAM_desc_t *B,
 
 #if defined(CHAMELEON_COPY_DIAG)
     {
-        int m = chameleon_min(A->m, A->n);
-        chameleon_zdesc_alloc(D, A->mb, A->nb, m, A->n, 0, 0, m, A->n, );
+        int m = chameleon_min( A->m, A->n );
+        chameleon_zdesc_copy_and_restrict( A, &D, m, A->n );
         Dptr = &D;
     }
 #endif
diff --git a/compute/zgelqs_param.c b/compute/zgelqs_param.c
index eedb2dacd145743702424b164760495ba2803ce5..7d5b48ecd33eeb354247a52235c88ba53e3bc7d0 100644
--- a/compute/zgelqs_param.c
+++ b/compute/zgelqs_param.c
@@ -4,7 +4,7 @@
  *
  * @copyright 2009-2014 The University of Tennessee and The University of
  *                      Tennessee Research Foundation. All rights reserved.
- * @copyright 2012-2019 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
+ * @copyright 2012-2020 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
  *                      Univ. Bordeaux. All rights reserved.
  *
  ***
@@ -330,8 +330,8 @@ int CHAMELEON_zgelqs_param_Tile_Async( const libhqr_tree_t *qrtree, CHAM_desc_t
 
 #if defined(CHAMELEON_COPY_DIAG)
     {
-        int m = chameleon_min(A->m, A->n);
-        chameleon_zdesc_alloc(D, A->mb, A->nb, m, A->n, 0, 0, m, A->n, );
+        int m = chameleon_min( A->m, A->n );
+        chameleon_zdesc_copy_and_restrict( A, &D, m, A->n );
         Dptr = &D;
     }
 #endif
diff --git a/compute/zgels.c b/compute/zgels.c
index b132610a81546f8c9d3882e4afbab171096673d7..f316c01aa93d81dc9d5c95e3a5f9acb631bdb802 100644
--- a/compute/zgels.c
+++ b/compute/zgels.c
@@ -4,7 +4,7 @@
  *
  * @copyright 2009-2014 The University of Tennessee and The University of
  *                      Tennessee Research Foundation. All rights reserved.
- * @copyright 2012-2019 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
+ * @copyright 2012-2020 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
  *                      Univ. Bordeaux. All rights reserved.
  *
  ***
@@ -364,8 +364,8 @@ int CHAMELEON_zgels_Tile_Async( cham_trans_t trans, CHAM_desc_t *A,
     if (A->m >= A->n) {
 #if defined(CHAMELEON_COPY_DIAG)
         {
-            int n = chameleon_min(A->m, A->n);
-            chameleon_zdesc_alloc(D, A->mb, A->nb, A->m, n, 0, 0, A->m, n, );
+            int n = chameleon_min( A->m, A->n );
+            chameleon_zdesc_copy_and_restrict( A, &D, A->m, n );
             Dptr = &D;
         }
 #endif
@@ -432,8 +432,8 @@ int CHAMELEON_zgels_Tile_Async( cham_trans_t trans, CHAM_desc_t *A,
     else {
 #if defined(CHAMELEON_COPY_DIAG)
         {
-            int m = chameleon_min(A->m, A->n);
-            chameleon_zdesc_alloc(D, A->mb, A->nb, m, A->n, 0, 0, m, A->n, );
+            int m = chameleon_min( A->m, A->n );
+            chameleon_zdesc_copy_and_restrict( A, &D, m, A->n );
             Dptr = &D;
         }
 #endif
diff --git a/compute/zgels_param.c b/compute/zgels_param.c
index 01999735fd6cbc7f5c9fe7c72f6d46c40634c168..964f04d548be1c8315ae445a0d289df15a4e661d 100644
--- a/compute/zgels_param.c
+++ b/compute/zgels_param.c
@@ -4,7 +4,7 @@
  *
  * @copyright 2009-2014 The University of Tennessee and The University of
  *                      Tennessee Research Foundation. All rights reserved.
- * @copyright 2012-2019 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
+ * @copyright 2012-2020 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
  *                      Univ. Bordeaux. All rights reserved.
  *
  ***
@@ -377,8 +377,8 @@ int CHAMELEON_zgels_param_Tile_Async( const libhqr_tree_t *qrtree, cham_trans_t
     if (A->m >= A->n) {
 #if defined(CHAMELEON_COPY_DIAG)
         {
-            int n = chameleon_min(A->m, A->n);
-            chameleon_zdesc_alloc(D, A->mb, A->nb, A->m, n, 0, 0, A->m, n, );
+            int n = chameleon_min( A->m, A->n );
+            chameleon_zdesc_copy_and_restrict( A, &D, A->m, n );
             Dptr = &D;
         }
 #endif
@@ -431,8 +431,8 @@ int CHAMELEON_zgels_param_Tile_Async( const libhqr_tree_t *qrtree, cham_trans_t
     else {
 #if defined(CHAMELEON_COPY_DIAG)
         {
-            int m = chameleon_min(A->m, A->n);
-            chameleon_zdesc_alloc(D, A->mb, A->nb, m, A->n, 0, 0, m, A->n, );
+            int m = chameleon_min( A->m, A->n );
+            chameleon_zdesc_copy_and_restrict( A, &D, m, A->n );
             Dptr = &D;
         }
 #endif
diff --git a/compute/zgeqrf.c b/compute/zgeqrf.c
index 98675a46764601d76a38b731866ec83d32380c4e..fdf5c95753a1dfa5b8c3d04cf4981feea30d1f32 100644
--- a/compute/zgeqrf.c
+++ b/compute/zgeqrf.c
@@ -4,7 +4,7 @@
  *
  * @copyright 2009-2014 The University of Tennessee and The University of
  *                      Tennessee Research Foundation. All rights reserved.
- * @copyright 2012-2019 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
+ * @copyright 2012-2020 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
  *                      Univ. Bordeaux. All rights reserved.
  *
  ***
@@ -277,8 +277,8 @@ int CHAMELEON_zgeqrf_Tile_Async( CHAM_desc_t *A, CHAM_desc_t *T,
      */
 #if defined(CHAMELEON_COPY_DIAG)
     {
-        int n = chameleon_min(A->m, A->n);
-        chameleon_zdesc_alloc(D, A->mb, A->nb, A->m, n, 0, 0, A->m, n, );
+        int n = chameleon_min( A->m, A->n );
+        chameleon_zdesc_copy_and_restrict( A, &D, A->m, n );
         Dptr = &D;
     }
 #endif
diff --git a/compute/zgeqrf_param.c b/compute/zgeqrf_param.c
index c406b9207f2072b983e6a7b3948f4392297f77cb..a7899546545631ff2414338005db30213e516e43 100644
--- a/compute/zgeqrf_param.c
+++ b/compute/zgeqrf_param.c
@@ -4,7 +4,7 @@
  *
  * @copyright 2009-2014 The University of Tennessee and The University of
  *                      Tennessee Research Foundation. All rights reserved.
- * @copyright 2012-2019 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
+ * @copyright 2012-2020 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
  *                      Univ. Bordeaux. All rights reserved.
  *
  ***
@@ -302,8 +302,8 @@ int CHAMELEON_zgeqrf_param_Tile_Async( const libhqr_tree_t *qrtree, CHAM_desc_t
 
 #if defined(CHAMELEON_COPY_DIAG)
     {
-        int n = chameleon_min(A->m, A->n);
-        chameleon_zdesc_alloc(D, A->mb, A->nb, A->m, n, 0, 0, A->m, n, );
+        int n = chameleon_min( A->m, A->n );
+        chameleon_zdesc_copy_and_restrict( A, &D, A->m, n );
         Dptr = &D;
     }
 #endif
diff --git a/compute/zgeqrs.c b/compute/zgeqrs.c
index a6b41d0b1e257355c73121871d61b16a6023493f..af9dddbd3367996cf9410d2c6056b75897198804 100644
--- a/compute/zgeqrs.c
+++ b/compute/zgeqrs.c
@@ -4,7 +4,7 @@
  *
  * @copyright 2009-2014 The University of Tennessee and The University of
  *                      Tennessee Research Foundation. All rights reserved.
- * @copyright 2012-2019 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
+ * @copyright 2012-2020 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
  *                      Univ. Bordeaux. All rights reserved.
  *
  ***
@@ -307,8 +307,8 @@ int CHAMELEON_zgeqrs_Tile_Async( CHAM_desc_t *A, CHAM_desc_t *T, CHAM_desc_t *B,
      */
 #if defined(CHAMELEON_COPY_DIAG)
     {
-        int n = chameleon_min(A->m, A->n);
-        chameleon_zdesc_alloc(D, A->mb, A->nb, A->m, n, 0, 0, A->m, n, );
+        int n = chameleon_min( A->m, A->n );
+        chameleon_zdesc_copy_and_restrict( A, &D, A->m, n );
         Dptr = &D;
     }
 #endif
diff --git a/compute/zgeqrs_param.c b/compute/zgeqrs_param.c
index 84aa1af688d62c989aa28ce83b84326f10a0c46c..c1a61651448a267bbdfb34ed951f91468324c8a2 100644
--- a/compute/zgeqrs_param.c
+++ b/compute/zgeqrs_param.c
@@ -4,7 +4,7 @@
  *
  * @copyright 2009-2014 The University of Tennessee and The University of
  *                      Tennessee Research Foundation. All rights reserved.
- * @copyright 2012-2019 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
+ * @copyright 2012-2020 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
  *                      Univ. Bordeaux. All rights reserved.
  *
  ***
@@ -311,8 +311,8 @@ int CHAMELEON_zgeqrs_param_Tile_Async( const libhqr_tree_t *qrtree,
      */
 #if defined(CHAMELEON_COPY_DIAG)
     {
-        int n = chameleon_min(A->m, A->n);
-        chameleon_zdesc_alloc(D, A->mb, A->nb, A->m, n, 0, 0, A->m, n, );
+        int n = chameleon_min( A->m, A->n );
+        chameleon_zdesc_copy_and_restrict( A, &D, A->m, n );
         Dptr = &D;
     }
 #endif
diff --git a/compute/zgesv_incpiv.c b/compute/zgesv_incpiv.c
index 89cc15107a81ba8487352119261fe559f1bf2dd1..56909582865036d225ebc7c84a7d400d9afd5c8b 100644
--- a/compute/zgesv_incpiv.c
+++ b/compute/zgesv_incpiv.c
@@ -4,7 +4,7 @@
  *
  * @copyright 2009-2014 The University of Tennessee and The University of
  *                      Tennessee Research Foundation. All rights reserved.
- * @copyright 2012-2019 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
+ * @copyright 2012-2020 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
  *                      Univ. Bordeaux. All rights reserved.
  *
  ***
@@ -311,8 +311,8 @@ int CHAMELEON_zgesv_incpiv_Tile_Async( CHAM_desc_t *A, CHAM_desc_t *L, int *IPIV
 
 #if defined(CHAMELEON_COPY_DIAG)
     {
-        int n = chameleon_min(A->mt, A->nt) * A->nb;
-        chameleon_zdesc_alloc(D, A->mb, A->nb, A->m, n, 0, 0, A->m, n, );
+        int n = chameleon_min( A->m, A->n );
+        chameleon_zdesc_copy_and_restrict( A, &D, A->m, n );
         Dptr = &D;
     }
 #endif
diff --git a/compute/zgetrf_incpiv.c b/compute/zgetrf_incpiv.c
index f1f2e795a3bca4e6d8fe4d2626f179f97cb94828..f4b1b197cd64131c386973557a8fd16026c23a5e 100644
--- a/compute/zgetrf_incpiv.c
+++ b/compute/zgetrf_incpiv.c
@@ -4,7 +4,7 @@
  *
  * @copyright 2009-2014 The University of Tennessee and The University of
  *                      Tennessee Research Foundation. All rights reserved.
- * @copyright 2012-2019 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
+ * @copyright 2012-2020 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
  *                      Univ. Bordeaux. All rights reserved.
  *
  ***
@@ -283,8 +283,8 @@ int CHAMELEON_zgetrf_incpiv_Tile_Async( CHAM_desc_t *A, CHAM_desc_t *L, int *IPI
 
 #if defined(CHAMELEON_COPY_DIAG)
     {
-        int n = chameleon_min(A->mt, A->nt) * A->nb;
-        chameleon_zdesc_alloc(D, A->mb, A->nb, A->m, n, 0, 0, A->m, n, );
+        int n = chameleon_min( A->m, A->n ) * A->nb;
+        chameleon_zdesc_copy_and_restrict( A, &D, A->m, n );
         Dptr = &D;
     }
 #endif
diff --git a/compute/ztpgqrt.c b/compute/ztpgqrt.c
index 98db159afb8e089b7b696401d48bb1e1974edbe1..41c89e69e1179a9885d64f348cab0d4ae8d11734 100644
--- a/compute/ztpgqrt.c
+++ b/compute/ztpgqrt.c
@@ -4,7 +4,7 @@
  *
  * @copyright 2009-2016 The University of Tennessee and The University of
  *                      Tennessee Research Foundation. All rights reserved.
- * @copyright 2012-2019 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
+ * @copyright 2012-2020 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
  *                      Univ. Bordeaux. All rights reserved.
  * @copyright 2016-2018 KAUST. All rights reserved.
  *
@@ -404,7 +404,7 @@ int CHAMELEON_ztpgqrt_Tile_Async( int L,
 
 #if defined(CHAMELEON_COPY_DIAG)
     {
-        chameleon_zdesc_alloc(D, V1->mb, V1->nb, V1->m, KT*V1->nb, 0, 0, V1->m, KT*V1->nb, );
+        chameleon_zdesc_copy_and_restrict( V1, &D, V1->m, KT*V1->nb );
         Dptr = &D;
     }
 #endif
diff --git a/compute/zunglq.c b/compute/zunglq.c
index 3d3ce3062eff4f92e911ab4850526eda11ebb5ec..552fe9f5709ea42f6c7ccd3f905b7b09b4ac7c07 100644
--- a/compute/zunglq.c
+++ b/compute/zunglq.c
@@ -4,7 +4,7 @@
  *
  * @copyright 2009-2014 The University of Tennessee and The University of
  *                      Tennessee Research Foundation. All rights reserved.
- * @copyright 2012-2019 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
+ * @copyright 2012-2020 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
  *                      Univ. Bordeaux. All rights reserved.
  *
  ***
@@ -300,8 +300,8 @@ int CHAMELEON_zunglq_Tile_Async( CHAM_desc_t *A, CHAM_desc_t *T, CHAM_desc_t *Q,
 
 #if defined(CHAMELEON_COPY_DIAG)
     {
-        int m = chameleon_min(A->m, A->n);
-        chameleon_zdesc_alloc(D, A->mb, A->nb, m, A->n, 0, 0, m, A->n, );
+        int m = chameleon_min( A->m, A->n );
+        chameleon_zdesc_copy_and_restrict( A, &D, m, A->n );
         Dptr = &D;
     }
 #endif
diff --git a/compute/zunglq_param.c b/compute/zunglq_param.c
index aec224f967b56e19904e253dd6871d8fadffbd07..fa4c16c3777fba00330eec9bef37edc2a2507e33 100644
--- a/compute/zunglq_param.c
+++ b/compute/zunglq_param.c
@@ -4,7 +4,7 @@
  *
  * @copyright 2009-2014 The University of Tennessee and The University of
  *                      Tennessee Research Foundation. All rights reserved.
- * @copyright 2012-2019 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
+ * @copyright 2012-2020 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
  *                      Univ. Bordeaux. All rights reserved.
  *
  ***
@@ -303,8 +303,8 @@ int CHAMELEON_zunglq_param_Tile_Async( const libhqr_tree_t *qrtree, CHAM_desc_t
      */
 #if defined(CHAMELEON_COPY_DIAG)
     {
-        int m = chameleon_min(A->m, A->n);
-        chameleon_zdesc_alloc(D, A->mb, A->nb, m, A->n, 0, 0, m, A->n, );
+        int m = chameleon_min( A->m, A->n );
+        chameleon_zdesc_copy_and_restrict( A, &D, m, A->n );
         Dptr = &D;
     }
 #endif
diff --git a/compute/zungqr.c b/compute/zungqr.c
index 69f8be30e599d076837fe3a4bd8f413487e59722..20c0d6d35ae9b5e22b45504354c5ab1e4766084d 100644
--- a/compute/zungqr.c
+++ b/compute/zungqr.c
@@ -4,7 +4,7 @@
  *
  * @copyright 2009-2014 The University of Tennessee and The University of
  *                      Tennessee Research Foundation. All rights reserved.
- * @copyright 2012-2019 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
+ * @copyright 2012-2020 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
  *                      Univ. Bordeaux. All rights reserved.
  *
  ***
@@ -297,8 +297,8 @@ int CHAMELEON_zungqr_Tile_Async( CHAM_desc_t *A, CHAM_desc_t *T, CHAM_desc_t *Q,
      */
 #if defined(CHAMELEON_COPY_DIAG)
     {
-        int n = chameleon_min(A->m, A->n);
-        chameleon_zdesc_alloc(D, A->mb, A->nb, A->m, n, 0, 0, A->m, n, );
+        int n = chameleon_min( A->m, A->n );
+        chameleon_zdesc_copy_and_restrict( A, &D, A->m, n );
         Dptr = &D;
     }
 #endif
diff --git a/compute/zungqr_param.c b/compute/zungqr_param.c
index 36bacc08921fda83e45bf14b8a41194cae68f6f2..edc69caaf5f1bb0d03e4f59dbabb144053275139 100644
--- a/compute/zungqr_param.c
+++ b/compute/zungqr_param.c
@@ -4,7 +4,7 @@
  *
  * @copyright 2009-2014 The University of Tennessee and The University of
  *                      Tennessee Research Foundation. All rights reserved.
- * @copyright 2012-2019 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
+ * @copyright 2012-2020 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
  *                      Univ. Bordeaux. All rights reserved.
  *
  ***
@@ -310,8 +310,8 @@ int CHAMELEON_zungqr_param_Tile_Async( const libhqr_tree_t *qrtree, CHAM_desc_t
 
 #if defined(CHAMELEON_COPY_DIAG)
     {
-        int n = chameleon_min(A->m, A->n);
-        chameleon_zdesc_alloc(D, A->mb, A->nb, A->m, n, 0, 0, A->m, n, );
+        int n = chameleon_min( A->m, A->n );
+        chameleon_zdesc_copy_and_restrict( A, &D, A->m, n );
         Dptr = &D;
     }
 #endif
diff --git a/compute/zunmlq.c b/compute/zunmlq.c
index 07c635a67d1923f9b09039fd741de925c5fe1546..2dbc905542e971caa3b1b0967d9b3487f637b313 100644
--- a/compute/zunmlq.c
+++ b/compute/zunmlq.c
@@ -4,7 +4,7 @@
  *
  * @copyright 2009-2014 The University of Tennessee and The University of
  *                      Tennessee Research Foundation. All rights reserved.
- * @copyright 2012-2019 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
+ * @copyright 2012-2020 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
  *                      Univ. Bordeaux. All rights reserved.
  *
  ***
@@ -359,8 +359,8 @@ int CHAMELEON_zunmlq_Tile_Async( cham_side_t side, cham_trans_t trans,
      */
 #if defined(CHAMELEON_COPY_DIAG)
     {
-        int m = chameleon_min(A->m, A->n);
-        chameleon_zdesc_alloc(D, A->mb, A->nb, m, A->n, 0, 0, m, A->n, );
+        int m = chameleon_min( A->m, A->n );
+        chameleon_zdesc_copy_and_restrict( A, &D, m, A->n );
         Dptr = &D;
     }
 #endif
diff --git a/compute/zunmlq_param.c b/compute/zunmlq_param.c
index df0fba8bad95e072825f0677f80bcde122fef881..408d1b24225c4cd4d5f16265f2f22c737a0b0be8 100644
--- a/compute/zunmlq_param.c
+++ b/compute/zunmlq_param.c
@@ -4,7 +4,7 @@
  *
  * @copyright 2009-2014 The University of Tennessee and The University of
  *                      Tennessee Research Foundation. All rights reserved.
- * @copyright 2012-2019 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
+ * @copyright 2012-2020 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
  *                      Univ. Bordeaux. All rights reserved.
  *
  ***
@@ -365,8 +365,8 @@ int CHAMELEON_zunmlq_param_Tile_Async( const libhqr_tree_t *qrtree, cham_side_t
 
 #if defined(CHAMELEON_COPY_DIAG)
     {
-        int m = chameleon_min(A->m, A->n);
-        chameleon_zdesc_alloc(D, A->mb, A->nb, m, A->n, 0, 0, m, A->n, );
+        int m = chameleon_min( A->m, A->n );
+        chameleon_zdesc_copy_and_restrict( A, &D, m, A->n );
         Dptr = &D;
     }
 #endif
diff --git a/compute/zunmqr.c b/compute/zunmqr.c
index 09387b79bf49214c25b85a3a5413225f43baba8b..15adf30ef74d87369936d1db8c9239b110604e68 100644
--- a/compute/zunmqr.c
+++ b/compute/zunmqr.c
@@ -4,7 +4,7 @@
  *
  * @copyright 2009-2014 The University of Tennessee and The University of
  *                      Tennessee Research Foundation. All rights reserved.
- * @copyright 2012-2019 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
+ * @copyright 2012-2020 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
  *                      Univ. Bordeaux. All rights reserved.
  *
  ***
@@ -362,8 +362,8 @@ int CHAMELEON_zunmqr_Tile_Async( cham_side_t side, cham_trans_t trans,
 
 #if defined(CHAMELEON_COPY_DIAG)
     {
-        int n = chameleon_min(A->m, A->n);
-        chameleon_zdesc_alloc(D, A->mb, A->nb, A->m, n, 0, 0, A->m, n, );
+        int n = chameleon_min( A->m, A->n );
+        chameleon_zdesc_copy_and_restrict( A, &D, A->m, n );
         Dptr = &D;
     }
 #endif
diff --git a/compute/zunmqr_param.c b/compute/zunmqr_param.c
index e7b31e742f1775d7837b373bad935f81d9f63bff..36bf757e27138ae4c1911dd35752f574a359ee66 100644
--- a/compute/zunmqr_param.c
+++ b/compute/zunmqr_param.c
@@ -4,7 +4,7 @@
  *
  * @copyright 2009-2014 The University of Tennessee and The University of
  *                      Tennessee Research Foundation. All rights reserved.
- * @copyright 2012-2019 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
+ * @copyright 2012-2020 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
  *                      Univ. Bordeaux. All rights reserved.
  *
  ***
@@ -372,8 +372,8 @@ int CHAMELEON_zunmqr_param_Tile_Async( const libhqr_tree_t *qrtree,
 
 #if defined(CHAMELEON_COPY_DIAG)
     {
-        int n = chameleon_min(A->m, A->n);
-        chameleon_zdesc_alloc(D, A->mb, A->nb, A->m, n, 0, 0, A->m, n, );
+        int n = chameleon_min( A->m, A->n );
+        chameleon_zdesc_copy_and_restrict( A, &D, A->m, n );
         Dptr = &D;
     }
 #endif
diff --git a/control/compute_z.h b/control/compute_z.h
index 196fde2047bf7ac40676bd383f63c8f9010405e3..7f7903d04d1b97646ad88ea294592e0374872508 100644
--- a/control/compute_z.h
+++ b/control/compute_z.h
@@ -4,7 +4,7 @@
  *
  * @copyright 2009-2014 The University of Tennessee and The University of
  *                      Tennessee Research Foundation. All rights reserved.
- * @copyright 2012-2019 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
+ * @copyright 2012-2020 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
  *                      Univ. Bordeaux. All rights reserved.
  *
  ***
@@ -154,6 +154,29 @@ chameleon_zdesc_alloc_diag( CHAM_desc_t *descA, int nb, int m, int n, int p, int
         }                                                               \
     }
 
+/**
+ * @brief Create a copy of a descriptor restricted to a smaller size.
+ * @param[in]  descIn  The input descriptor from which the structure should be copied.
+ * @param[out] descOut The output descriptor that is a copy of the input one with allocation on the fly.
+ * @param[in]  m       The number of rows of the output descriptor.
+ * @param[in]  n       The number of columns of the output descriptor.
+ * @return CHAMELEON_SUCCESS on success, the associated error on failure.
+ */
+static inline int
+chameleon_zdesc_copy_and_restrict( CHAM_desc_t *descIn,
+                                   CHAM_desc_t *descOut,
+                                   int m, int n )
+{
+    int rc;
+    rc = chameleon_desc_init( descOut, CHAMELEON_MAT_ALLOC_TILE,
+                              ChamComplexDouble, descIn->mb, descIn->nb, descIn->mb * descIn->nb,
+                              m, n, 0, 0, m, n, descIn->p, descIn->q,
+                              descIn->get_blkaddr,
+                              descIn->get_blkldd,
+                              descIn->get_rankof );
+    return rc;
+}
+
 /**
  * @brief Internal function to convert the lapack format to tile format in
  * LAPACK interface calls
diff --git a/runtime/starpu/control/runtime_options.c b/runtime/starpu/control/runtime_options.c
index 32dce7c5b9c3e717a61fd702b836ad3e4721b07b..225112b40c6beec0dedfb55e34064fcb28a7183d 100644
--- a/runtime/starpu/control/runtime_options.c
+++ b/runtime/starpu/control/runtime_options.c
@@ -4,7 +4,7 @@
  *
  * @copyright 2009-2014 The University of Tennessee and The University of
  *                      Tennessee Research Foundation. All rights reserved.
- * @copyright 2012-2019 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
+ * @copyright 2012-2020 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
  *                      Univ. Bordeaux. All rights reserved.
  *
  ***
@@ -57,7 +57,7 @@ int RUNTIME_options_ws_alloc( RUNTIME_option_t *options, size_t worker_size, siz
         };
         options->ws_wsize = worker_size;
         starpu_cham_tile_register( (starpu_data_handle_t*)(&(options->ws_worker)),
-                                   -1, &tile, sizeof(char) );
+                                   -1, &tile, ChamByte );
     }
     if ( host_size > 0 ) {
         options->ws_hsize = host_size;