diff --git a/compute/zbuild.c b/compute/zbuild.c
index 24e03410e290cc218e1510f463012eeb46baee7a..5256ff049612a4fc012e3fb1c3ec45e505b2d602 100644
--- a/compute/zbuild.c
+++ b/compute/zbuild.c
@@ -130,12 +130,14 @@ int MORSE_zbuild( MORSE_enum uplo, int M, int N,
     /* Call the tile interface */
     MORSE_zbuild_Tile_Async(uplo, &descA, user_data, user_build_callback, sequence, &request );
 
+    /* Submit the matrix conversion back */
     morse_ztile2lap( morse, &descAl, &descAt,
                      MorseUpperLower, sequence, &request );
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
diff --git a/compute/zgeadd.c b/compute/zgeadd.c
index 501e5e42e95fe9401faa7b6e00427e5f3eb28147..0d26a7cdf4dcdaf96bb7048b2b38a9307a89e21f 100644
--- a/compute/zgeadd.c
+++ b/compute/zgeadd.c
@@ -169,8 +169,9 @@ int MORSE_zgeadd(MORSE_enum trans, int M, int N,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
-    morse_desc_mat_free(&descB);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
+    morse_ztile2lap_cleanup( morse, &descBl, &descBt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
diff --git a/compute/zgelqf.c b/compute/zgelqf.c
index 6047b801e054dd3edd8214c32350c0d80701f7dd..fc257fd5c8cf2dff67ff95a8eb1e73b13fe0a3a3 100644
--- a/compute/zgelqf.c
+++ b/compute/zgelqf.c
@@ -135,7 +135,8 @@ int MORSE_zgelqf(int M, int N,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
@@ -292,7 +293,7 @@ int MORSE_zgelqf_Tile_Async(MORSE_desc_t *A, MORSE_desc_t *T,
         morse_pzgelqfrh(A, T, Dptr, MORSE_RHBLK, sequence, request);
     }
     if (Dptr != NULL) {
-        morse_desc_mat_free(Dptr);
+    morse_ztile2lap_cleanup( morse, &Dptrl, &Dptrt );
     }
     (void)D;
     return MORSE_SUCCESS;
diff --git a/compute/zgelqf_param.c b/compute/zgelqf_param.c
index 2c90ef470acd98a43c484b463f0515a9ac6ad53a..0f1632a74d43625d978a63728e724e956fff7757 100644
--- a/compute/zgelqf_param.c
+++ b/compute/zgelqf_param.c
@@ -132,7 +132,8 @@ int MORSE_zgelqf_param(const libhqr_tree_t *qrtree, int M, int N,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
@@ -288,7 +289,7 @@ int MORSE_zgelqf_param_Tile_Async(const libhqr_tree_t *qrtree, MORSE_desc_t *A,
 
     morse_pzgelqf_param(qrtree, A, TS, TT, Dptr, sequence, request);
     if (Dptr != NULL) {
-        morse_desc_mat_free(Dptr);
+    morse_ztile2lap_cleanup( morse, &Dptrl, &Dptrt );
     }
     (void)D;
     return MORSE_SUCCESS;
diff --git a/compute/zgelqs.c b/compute/zgelqs.c
index 290a3627aa3fb0a1b7c593ad07d27daf8064c0f7..b57f6557c9d97aa36f82a404a32e5c9a27c7f7ef 100644
--- a/compute/zgelqs.c
+++ b/compute/zgelqs.c
@@ -154,8 +154,9 @@ int MORSE_zgelqs(int M, int N, int NRHS,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
-    morse_desc_mat_free(&descB);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
+    morse_ztile2lap_cleanup( morse, &descBl, &descBt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
@@ -332,7 +333,7 @@ int MORSE_zgelqs_Tile_Async(MORSE_desc_t *A, MORSE_desc_t *T, MORSE_desc_t *B,
     }
 
     if (Dptr != NULL) {
-        morse_desc_mat_free(Dptr);
+    morse_ztile2lap_cleanup( morse, &Dptrl, &Dptrt );
     }
     (void)D;
     return MORSE_SUCCESS;
diff --git a/compute/zgelqs_param.c b/compute/zgelqs_param.c
index e2efe30d1fa4ab39b85feac01484098da52954d9..d3c83ff56f758f31dbd402a7c301664644406719 100644
--- a/compute/zgelqs_param.c
+++ b/compute/zgelqs_param.c
@@ -156,8 +156,9 @@ int MORSE_zgelqs_param(const libhqr_tree_t *qrtree, int M, int N, int NRHS,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
-    morse_desc_mat_free(&descB);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
+    morse_ztile2lap_cleanup( morse, &descBl, &descBt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
@@ -335,7 +336,7 @@ int MORSE_zgelqs_param_Tile_Async(const libhqr_tree_t *qrtree, MORSE_desc_t *A,
 
     morse_pzunmlq_param(qrtree, MorseLeft, MorseConjTrans, A, B, TS, TT, Dptr, sequence, request);
     if (Dptr != NULL) {
-        morse_desc_mat_free(Dptr);
+    morse_ztile2lap_cleanup( morse, &Dptrl, &Dptrt );
     }
     (void)D;
     return MORSE_SUCCESS;
diff --git a/compute/zgels.c b/compute/zgels.c
index 885d1e3de2e2f2a8f79fe983e8bc879fc4961fd7..cc8497c1f627709fd32dae2f75005b5be870372f 100644
--- a/compute/zgels.c
+++ b/compute/zgels.c
@@ -196,8 +196,9 @@ int MORSE_zgels(MORSE_enum trans, int M, int N, int NRHS,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
-    morse_desc_mat_free(&descB);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
+    morse_ztile2lap_cleanup( morse, &descBl, &descBt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
@@ -428,7 +429,7 @@ int MORSE_zgels_Tile_Async(MORSE_enum trans, MORSE_desc_t *A,
     free(subB);
 
     if (Dptr != NULL) {
-        morse_desc_mat_free(Dptr);
+    morse_ztile2lap_cleanup( morse, &Dptrl, &Dptrt );
     }
     (void)D;
     return MORSE_SUCCESS;
diff --git a/compute/zgels_param.c b/compute/zgels_param.c
index ee5d6640bf1e4c67930b5ae640dc7fe6b377ea62..4c82539f7455d3a14120dbf6ae8c0b750e2bf422 100644
--- a/compute/zgels_param.c
+++ b/compute/zgels_param.c
@@ -197,8 +197,9 @@ int MORSE_zgels_param(const libhqr_tree_t *qrtree, MORSE_enum trans, int M, int
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
-    morse_desc_mat_free(&descB);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
+    morse_ztile2lap_cleanup( morse, &descBl, &descBt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
@@ -416,7 +417,7 @@ int MORSE_zgels_param_Tile_Async(const libhqr_tree_t *qrtree, MORSE_enum trans,
     free(subB);
 
     if (Dptr != NULL) {
-        morse_desc_mat_free(Dptr);
+    morse_ztile2lap_cleanup( morse, &Dptrl, &Dptrt );
     }
     (void)D;
     return MORSE_SUCCESS;
diff --git a/compute/zgemm.c b/compute/zgemm.c
index 1ab3eda0d33da823b60e2c4e484aec770719930a..24b167fa72c9cddc1951fdf279979e6ba9e21345 100644
--- a/compute/zgemm.c
+++ b/compute/zgemm.c
@@ -228,9 +228,10 @@ int MORSE_zgemm(MORSE_enum transA, MORSE_enum transB, int M, int N, int K,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
-    morse_desc_mat_free(&descB);
-    morse_desc_mat_free(&descC);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
+    morse_ztile2lap_cleanup( morse, &descBl, &descBt );
+    morse_ztile2lap_cleanup( morse, &descCl, &descCt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
diff --git a/compute/zgeqrf.c b/compute/zgeqrf.c
index cf96233802f6ca949215eeab259ae416e5045735..bf6d3624810b22f48eb5fc2d68c56be24099c798 100644
--- a/compute/zgeqrf.c
+++ b/compute/zgeqrf.c
@@ -134,7 +134,8 @@ int MORSE_zgeqrf(int M, int N,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
@@ -291,7 +292,7 @@ int MORSE_zgeqrf_Tile_Async(MORSE_desc_t *A, MORSE_desc_t *T,
         morse_pzgeqrfrh(A, T, Dptr, MORSE_RHBLK, sequence, request);
     }
     if (Dptr != NULL) {
-        morse_desc_mat_free(Dptr);
+    morse_ztile2lap_cleanup( morse, &Dptrl, &Dptrt );
     }
     (void)D;
     return MORSE_SUCCESS;
diff --git a/compute/zgeqrf_param.c b/compute/zgeqrf_param.c
index 2384113225c51eaf438f6aed87b252a36086fa07..a8dedd643c648cffc3990d4ab8e5a6834f8f42fc 100644
--- a/compute/zgeqrf_param.c
+++ b/compute/zgeqrf_param.c
@@ -137,7 +137,8 @@ int MORSE_zgeqrf_param(const libhqr_tree_t *qrtree, int M, int N,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
@@ -298,7 +299,7 @@ int MORSE_zgeqrf_param_Tile_Async(const libhqr_tree_t *qrtree, MORSE_desc_t *A,
     morse_pzgeqrf_param(qrtree, A, TS, TT, Dptr, sequence, request);
 
     if (Dptr != NULL) {
-        morse_desc_mat_free(Dptr);
+    morse_ztile2lap_cleanup( morse, &Dptrl, &Dptrt );
     }
     (void)D;
     return MORSE_SUCCESS;
diff --git a/compute/zgeqrs.c b/compute/zgeqrs.c
index 445daf03f02fcc7f3ef71d77c5f05b45cc702f02..8bfd7a57205a7e1ab0bfdce30f3878d999456dfe 100644
--- a/compute/zgeqrs.c
+++ b/compute/zgeqrs.c
@@ -154,8 +154,9 @@ int MORSE_zgeqrs(int M, int N, int NRHS,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
-    morse_desc_mat_free(&descB);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
+    morse_ztile2lap_cleanup( morse, &descBl, &descBt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
@@ -328,7 +329,7 @@ int MORSE_zgeqrs_Tile_Async(MORSE_desc_t *A, MORSE_desc_t *T, MORSE_desc_t *B,
     free(subB);
 
     if (Dptr != NULL) {
-        morse_desc_mat_free(Dptr);
+    morse_ztile2lap_cleanup( morse, &Dptrl, &Dptrt );
     }
     (void)D;
     return MORSE_SUCCESS;
diff --git a/compute/zgeqrs_param.c b/compute/zgeqrs_param.c
index 467955410754bc464ee17af6152ab68565bf0d7d..7c83d4979057acfdd41c9703f2021e0ee3f15b49 100644
--- a/compute/zgeqrs_param.c
+++ b/compute/zgeqrs_param.c
@@ -149,8 +149,9 @@ int MORSE_zgeqrs_param(const libhqr_tree_t *qrtree, int M, int N, int NRHS,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
-    morse_desc_mat_free(&descB);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
+    morse_ztile2lap_cleanup( morse, &descBl, &descBt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
@@ -325,7 +326,7 @@ int MORSE_zgeqrs_param_Tile_Async(const libhqr_tree_t *qrtree,
     free(subB);
 
     if (Dptr != NULL) {
-        morse_desc_mat_free(Dptr);
+    morse_ztile2lap_cleanup( morse, &Dptrl, &Dptrt );
     }
     (void)D;
     return MORSE_SUCCESS;
diff --git a/compute/zgesv_incpiv.c b/compute/zgesv_incpiv.c
index e43014e2fa1207fa23b54873a0505a28148c4d0d..d8486636e0107eeb7dcaa45ea609446a0754bdd7 100644
--- a/compute/zgesv_incpiv.c
+++ b/compute/zgesv_incpiv.c
@@ -153,8 +153,9 @@ int MORSE_zgesv_incpiv(int N, int NRHS,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
-    morse_desc_mat_free(&descB);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
+    morse_ztile2lap_cleanup( morse, &descBl, &descBt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
diff --git a/compute/zgesv_nopiv.c b/compute/zgesv_nopiv.c
index 1693481d3703c4e6744501e6cd1d7ca82142cd4a..3efc96c49127306aef949a3728f388caa83ff628 100644
--- a/compute/zgesv_nopiv.c
+++ b/compute/zgesv_nopiv.c
@@ -152,8 +152,9 @@ int MORSE_zgesv_nopiv(int N, int NRHS,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
-    morse_desc_mat_free(&descB);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
+    morse_ztile2lap_cleanup( morse, &descBl, &descBt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
diff --git a/compute/zgesvd.c b/compute/zgesvd.c
index b55aa9d82179b9659606aa4b4ccf22658c03511a..52c24290f411aa70789a55c44b89c326ff57a79a 100644
--- a/compute/zgesvd.c
+++ b/compute/zgesvd.c
@@ -227,7 +227,8 @@ int MORSE_zgesvd(MORSE_enum jobu, MORSE_enum jobvt,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
@@ -547,7 +548,7 @@ int MORSE_zgesvd_Tile_Async(MORSE_enum jobu, MORSE_enum jobvt,
         fprintf(stderr, "MORSE_zgesvd_Tile_Async: LAPACKE_zgbbrd = %d\n", info );
     }
 #endif /* !defined(CHAMELEON_SIMULATION) */
-    morse_desc_mat_free(&descAB);
+    morse_ztile2lap_cleanup( morse, &descABl, &descABt );
 
     /* Transform U and Vt into tile format */
     if ( jobu != MorseNoVec ) {
@@ -626,7 +627,7 @@ int MORSE_zgesvd_Tile_Async(MORSE_enum jobu, MORSE_enum jobvt,
         morse_desc_mat_free( &descVT );
     free(E);
     if (Dptr != NULL) {
-        morse_desc_mat_free(Dptr);
+    morse_ztile2lap_cleanup( morse, &Dptrl, &Dptrt );
     }
     (void)D;
     return MORSE_SUCCESS;
diff --git a/compute/zgetrf_incpiv.c b/compute/zgetrf_incpiv.c
index bfad3adf256c604fc15be4b0ac3247833d7305ec..94bf78ac3aa592935c2cdddd0449293dd3b92d60 100644
--- a/compute/zgetrf_incpiv.c
+++ b/compute/zgetrf_incpiv.c
@@ -136,7 +136,8 @@ int MORSE_zgetrf_incpiv(int M, int N,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
diff --git a/compute/zgetrf_nopiv.c b/compute/zgetrf_nopiv.c
index 344f1d26afd1e5227a13f1d788423de27b034e70..42ac616b1d4c845b3d665fb8fc0203e0f5edc07d 100644
--- a/compute/zgetrf_nopiv.c
+++ b/compute/zgetrf_nopiv.c
@@ -129,7 +129,8 @@ int MORSE_zgetrf_nopiv(int M, int N,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
diff --git a/compute/zgetrs_incpiv.c b/compute/zgetrs_incpiv.c
index 536a51113a9451557eb45fca96f9149adfbcdf0a..eaf8cdb88877e9e2c57d665d82c3b364c46bcee0 100644
--- a/compute/zgetrs_incpiv.c
+++ b/compute/zgetrs_incpiv.c
@@ -157,8 +157,9 @@ int MORSE_zgetrs_incpiv(MORSE_enum trans, int N, int NRHS,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
-    morse_desc_mat_free(&descB);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
+    morse_ztile2lap_cleanup( morse, &descBl, &descBt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
diff --git a/compute/zgetrs_nopiv.c b/compute/zgetrs_nopiv.c
index f3fdfc502e344cc440cf17df9c09e2964922eb64..4be0522d7d3de62181f78ac9c58b7fa92902f407 100644
--- a/compute/zgetrs_nopiv.c
+++ b/compute/zgetrs_nopiv.c
@@ -151,8 +151,9 @@ int MORSE_zgetrs_nopiv(MORSE_enum trans, int N, int NRHS,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
-    morse_desc_mat_free(&descB);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
+    morse_ztile2lap_cleanup( morse, &descBl, &descBt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
diff --git a/compute/zheevd.c b/compute/zheevd.c
index 67d343211b309a41027bdad36a3f75959c878f49..a7211f559e82c48e40b8a9e854de2751d5c11fe9 100644
--- a/compute/zheevd.c
+++ b/compute/zheevd.c
@@ -165,7 +165,8 @@ int MORSE_zheevd(MORSE_enum jobz, MORSE_enum uplo, int N,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
@@ -465,7 +466,7 @@ int MORSE_zheevd_Tile_Async(MORSE_enum jobz, MORSE_enum uplo,
     /* V   from LAPACKE_zstedc refers to V  (lapack layout) */
     /* The final eigenvectors are (Q1 Q2 V) or (Q1^h Q2 V)  */
     morse_zooplap2tile( descQ2, Q2, NB, NB, N, N, 0, 0, N, N, sequence, request,
-                        morse_desc_mat_free(&(descQ2)) );
+    morse_ztile2lap_cleanup( morse, &(descQ2)) l, &(descQ2)) t );
     morse_zooplap2tile( descV,  V,  NB, NB, N, N, 0, 0, N, N, sequence, request,
                         morse_desc_mat_free(&(descQ2)); morse_desc_mat_free(&(descV)) );
     if (uplo == MorseLower)
@@ -520,15 +521,16 @@ int MORSE_zheevd_Tile_Async(MORSE_enum jobz, MORSE_enum uplo,
     morse_sequence_wait(morse, sequence);
 
     free(subA); free(subQ); free(subT);
-    morse_desc_mat_free(&descQ2);
+    morse_ztile2lap_cleanup( morse, &descQ2l, &descQ2t );
     free(Q2);
 
-    morse_desc_mat_free(&descV);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descVl, &descVt );
     free(V);
 
     free(E);
     if (Dptr != NULL) {
-        morse_desc_mat_free(Dptr);
+    morse_ztile2lap_cleanup( morse, &Dptrl, &Dptrt );
     }
     (void)D;
     return MORSE_SUCCESS;
diff --git a/compute/zhemm.c b/compute/zhemm.c
index ab49a42e2e4f6bfd2f1fd6291e2b6f97099acade..cfa808021215628a5cd5018acf9e271999ca14a8 100644
--- a/compute/zhemm.c
+++ b/compute/zhemm.c
@@ -191,9 +191,10 @@ int MORSE_zhemm(MORSE_enum side, MORSE_enum uplo, int M, int N,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
-    morse_desc_mat_free(&descB);
-    morse_desc_mat_free(&descC);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
+    morse_ztile2lap_cleanup( morse, &descBl, &descBt );
+    morse_ztile2lap_cleanup( morse, &descCl, &descCt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
diff --git a/compute/zher2k.c b/compute/zher2k.c
index 03c76ebf9e02e2c8fd7cef77f7b90558b32ed673..067764bd8803d281951cb10c6f8d395d21cda13c 100644
--- a/compute/zher2k.c
+++ b/compute/zher2k.c
@@ -195,9 +195,10 @@ int MORSE_zher2k(MORSE_enum uplo, MORSE_enum trans, int N, int K,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
-    morse_desc_mat_free(&descB);
-    morse_desc_mat_free(&descC);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
+    morse_ztile2lap_cleanup( morse, &descBl, &descBt );
+    morse_ztile2lap_cleanup( morse, &descCl, &descCt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
diff --git a/compute/zherk.c b/compute/zherk.c
index 05901be70e0a151e00b09677ce5abddb6acb9ee8..947f8893f686d9995cc4f70936113fb5c9959cc6 100644
--- a/compute/zherk.c
+++ b/compute/zherk.c
@@ -179,8 +179,9 @@ int MORSE_zherk(MORSE_enum uplo, MORSE_enum trans, int N, int K,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
-    morse_desc_mat_free(&descC);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
+    morse_ztile2lap_cleanup( morse, &descCl, &descCt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
diff --git a/compute/zhetrd.c b/compute/zhetrd.c
index b63b5d1a7979af0a55feba49300e63e7af267d7b..aa7152dc054731f99dfe5e4ef4431e1c40614bc5 100644
--- a/compute/zhetrd.c
+++ b/compute/zhetrd.c
@@ -179,7 +179,8 @@ int MORSE_zhetrd(MORSE_enum jobz, MORSE_enum uplo, int N,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
@@ -429,9 +430,9 @@ int MORSE_zhetrd_Tile_Async(MORSE_enum jobz,
     }
 #endif /* !defined(CHAMELEON_SIMULATION) */
     if (Dptr != NULL) {
-        morse_desc_mat_free(Dptr);
+    morse_ztile2lap_cleanup( morse, &Dptrl, &Dptrt );
     }
-    morse_desc_mat_free(&descAB);
+    morse_ztile2lap_cleanup( morse, &descABl, &descABt );
     (void)D;
     return MORSE_SUCCESS;
 }
diff --git a/compute/zlacpy.c b/compute/zlacpy.c
index 885ae54d578b236a8f27b387276b2a7e761f5828..d5aab8ec129f8865c268d8a0804cf5686b0ba081 100644
--- a/compute/zlacpy.c
+++ b/compute/zlacpy.c
@@ -145,8 +145,9 @@ int MORSE_zlacpy(MORSE_enum uplo, int M, int N,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
-    morse_desc_mat_free(&descB);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
+    morse_ztile2lap_cleanup( morse, &descBl, &descBt );
 
     morse_sequence_destroy(morse, sequence);
     return MORSE_SUCCESS;
diff --git a/compute/zlange.c b/compute/zlange.c
index f1ea38a96d327c17516fdb9397eae22cd12b5a0a..403acb5ef70b5872cc36741399dee5735253e621 100644
--- a/compute/zlange.c
+++ b/compute/zlange.c
@@ -148,7 +148,8 @@ double MORSE_zlange(MORSE_enum norm, int M, int N,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
 
     morse_sequence_destroy(morse, sequence);
     return value;
diff --git a/compute/zlanhe.c b/compute/zlanhe.c
index ce7e4fa199dbd06fafe8e4cc056ecf0539061e70..501df0f39deb7368660beb9e974292ae21d60b5b 100644
--- a/compute/zlanhe.c
+++ b/compute/zlanhe.c
@@ -148,7 +148,8 @@ double MORSE_zlanhe(MORSE_enum norm, MORSE_enum uplo, int N,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
 
     morse_sequence_destroy(morse, sequence);
     return value;
diff --git a/compute/zlansy.c b/compute/zlansy.c
index 8912e0f619352d66f2945a34b29b608bbf79b638..0383a7be99864827f12454358ace374bcdfb8e49 100644
--- a/compute/zlansy.c
+++ b/compute/zlansy.c
@@ -145,7 +145,8 @@ double MORSE_zlansy(MORSE_enum norm, MORSE_enum uplo, int N,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
 
     morse_sequence_destroy(morse, sequence);
     return value;
diff --git a/compute/zlantr.c b/compute/zlantr.c
index 61dcb8be9e2985b99eb071738f129729cbd23d58..8c06e19679558a70ce2852e65bec3bee09695a21 100644
--- a/compute/zlantr.c
+++ b/compute/zlantr.c
@@ -165,7 +165,8 @@ double MORSE_zlantr(MORSE_enum norm, MORSE_enum uplo, MORSE_enum diag,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
 
     morse_sequence_destroy(morse, sequence);
     return value;
diff --git a/compute/zlascal.c b/compute/zlascal.c
index 2b1979406954eb715ff85dc8ee408563a03f4af4..5a8f0352520d27e32141175db0e339a0d8a1e77a 100644
--- a/compute/zlascal.c
+++ b/compute/zlascal.c
@@ -125,7 +125,7 @@ int MORSE_zlascal(MORSE_enum uplo, int M, int N,
     morse_ztile2lap( morse, &descAl, &descAt,
                      MorseUpperLower, sequence, &request );
     RUNTIME_sequence_wait(morse, sequence);
-    morse_desc_mat_free(&descA);
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
diff --git a/compute/zlaset.c b/compute/zlaset.c
index f0b8269fbac856ed012f2f89592b53377c32eabd..f8e42f788bad81d2118f9a44957ee8fc7bc071b0 100644
--- a/compute/zlaset.c
+++ b/compute/zlaset.c
@@ -138,7 +138,8 @@ int MORSE_zlaset(MORSE_enum uplo, int M, int N,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
 
     morse_sequence_destroy(morse, sequence);
     return MORSE_SUCCESS;
diff --git a/compute/zlauum.c b/compute/zlauum.c
index a07910ca165226d21d14a6e1c1b20dc3457bd998..59578adee0da3ae550b9cc1f6c04b95ac61ec88e 100644
--- a/compute/zlauum.c
+++ b/compute/zlauum.c
@@ -134,7 +134,8 @@ int MORSE_zlauum(MORSE_enum uplo, int N,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
diff --git a/compute/zplghe.c b/compute/zplghe.c
index 7ba0cef44baacd46e7a18dc9764f32261c5200e7..5e63663d2b3a7ff968e9c210722976cd25a574ff 100644
--- a/compute/zplghe.c
+++ b/compute/zplghe.c
@@ -125,7 +125,8 @@ int MORSE_zplghe( double bump, MORSE_enum uplo, int N,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
diff --git a/compute/zplgsy.c b/compute/zplgsy.c
index 7b4f36a67ce7383d89e9badd034a949d86c386a7..265ad6d9a09ded848ec29100af221e3cd4ebc7c4 100644
--- a/compute/zplgsy.c
+++ b/compute/zplgsy.c
@@ -125,7 +125,8 @@ int MORSE_zplgsy( MORSE_Complex64_t bump, MORSE_enum uplo, int N,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
diff --git a/compute/zplrnt.c b/compute/zplrnt.c
index 0040cd9e5583b5e0d54050c426e7ce8435e1498b..fb0f450cd250fe46ec4a923a258e104ec71173d4 100644
--- a/compute/zplrnt.c
+++ b/compute/zplrnt.c
@@ -122,7 +122,8 @@ int MORSE_zplrnt( int M, int N,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
diff --git a/compute/zposv.c b/compute/zposv.c
index 418f623d05719b05230ba0e0a315119c16fdda41..7081a57712a0906be8213a99236ab423d4dfdee5 100644
--- a/compute/zposv.c
+++ b/compute/zposv.c
@@ -166,8 +166,9 @@ int MORSE_zposv(MORSE_enum uplo, int N, int NRHS,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
-    morse_desc_mat_free(&descB);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
+    morse_ztile2lap_cleanup( morse, &descBl, &descBt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
diff --git a/compute/zpotri.c b/compute/zpotri.c
index f88cb514863bf9343c06cee28923e207c99a0623..49cd7aa3537205e30858a36cf0cddbfff6e62e33 100644
--- a/compute/zpotri.c
+++ b/compute/zpotri.c
@@ -131,7 +131,8 @@ int MORSE_zpotri(MORSE_enum uplo, int N,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
diff --git a/compute/zpotrimm.c b/compute/zpotrimm.c
index f45957e617a26e4fa368066f4f60eace59bd6db9..d418054881417307bf32ee9270b21082f4b6803d 100644
--- a/compute/zpotrimm.c
+++ b/compute/zpotrimm.c
@@ -149,9 +149,10 @@ int MORSE_zpotrimm(MORSE_enum uplo, int N,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
-    morse_desc_mat_free(&descB);
-    morse_desc_mat_free(&descC);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
+    morse_ztile2lap_cleanup( morse, &descBl, &descBt );
+    morse_ztile2lap_cleanup( morse, &descCl, &descCt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
diff --git a/compute/zpotrs.c b/compute/zpotrs.c
index 242a53cbe7726c5c8088811e4f802f5a5eea5ff8..611b30ee9682e719d5ced78b3ff8bc6fab2ae42b 100644
--- a/compute/zpotrs.c
+++ b/compute/zpotrs.c
@@ -148,8 +148,9 @@ int MORSE_zpotrs(MORSE_enum uplo, int N, int NRHS,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
-    morse_desc_mat_free(&descB);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
+    morse_ztile2lap_cleanup( morse, &descBl, &descBt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
diff --git a/compute/zsymm.c b/compute/zsymm.c
index a18c588727a106aa43c3a122dd4b4b9e45a56b90..94d7584a44ed92ba64658105d9c83340421727d0 100644
--- a/compute/zsymm.c
+++ b/compute/zsymm.c
@@ -191,9 +191,10 @@ int MORSE_zsymm(MORSE_enum side, MORSE_enum uplo, int M, int N,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
-    morse_desc_mat_free(&descB);
-    morse_desc_mat_free(&descC);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
+    morse_ztile2lap_cleanup( morse, &descBl, &descBt );
+    morse_ztile2lap_cleanup( morse, &descCl, &descCt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
diff --git a/compute/zsyr2k.c b/compute/zsyr2k.c
index 388d8d8fa5d6bafd2779169d722abf56b60586f9..bf4149197d583afee38357478ab0bb30c0ffac27 100644
--- a/compute/zsyr2k.c
+++ b/compute/zsyr2k.c
@@ -195,9 +195,10 @@ int MORSE_zsyr2k(MORSE_enum uplo, MORSE_enum trans, int N, int K,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
-    morse_desc_mat_free(&descB);
-    morse_desc_mat_free(&descC);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
+    morse_ztile2lap_cleanup( morse, &descBl, &descBt );
+    morse_ztile2lap_cleanup( morse, &descCl, &descCt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
diff --git a/compute/zsyrk.c b/compute/zsyrk.c
index 215010573e5406888956c7a5a7c6f15a1e5dab70..806bf0c4711257ac6ea2fe278e99891cea75b58a 100644
--- a/compute/zsyrk.c
+++ b/compute/zsyrk.c
@@ -179,8 +179,9 @@ int MORSE_zsyrk(MORSE_enum uplo, MORSE_enum trans, int N, int K,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
-    morse_desc_mat_free(&descC);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
+    morse_ztile2lap_cleanup( morse, &descCl, &descCt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
diff --git a/compute/zsysv.c b/compute/zsysv.c
index 83dcd0c39f9f872e717011d47741c4bba32b4bfe..426a0248b027cd72f96094788e05da19f31312ee 100644
--- a/compute/zsysv.c
+++ b/compute/zsysv.c
@@ -163,8 +163,9 @@ int MORSE_zsysv(MORSE_enum uplo, int N, int NRHS,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
-    morse_desc_mat_free(&descB);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
+    morse_ztile2lap_cleanup( morse, &descBl, &descBt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
diff --git a/compute/zsytrf.c b/compute/zsytrf.c
index 75742227aa7c8ed067038b561ca966f2c9cac542..c478d3ace2520477d0dbb49510b9bc410f8629c3 100644
--- a/compute/zsytrf.c
+++ b/compute/zsytrf.c
@@ -135,7 +135,8 @@ int MORSE_zsytrf(MORSE_enum uplo, int N,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
diff --git a/compute/zsytrs.c b/compute/zsytrs.c
index cb5587397a4eb78894b3d86a0715e3e0a05949c5..ffc58be2c672735152334227461dda65a7460355 100644
--- a/compute/zsytrs.c
+++ b/compute/zsytrs.c
@@ -147,8 +147,9 @@ int MORSE_zsytrs(MORSE_enum uplo, int N, int NRHS,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
-    morse_desc_mat_free(&descB);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
+    morse_ztile2lap_cleanup( morse, &descBl, &descBt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
diff --git a/compute/ztpgqrt.c b/compute/ztpgqrt.c
index 9c3acdf8a515bbb78a1b884cba26d8fe6027b5cb..432ee7072f313d7f05f0ede2addee689b1a44c5d 100644
--- a/compute/ztpgqrt.c
+++ b/compute/ztpgqrt.c
@@ -228,10 +228,11 @@ int MORSE_ztpgqrt( int M, int N, int K, int L,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descV1);
-    morse_desc_mat_free(&descV2);
-    morse_desc_mat_free(&descQ1);
-    morse_desc_mat_free(&descQ2);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descV1l, &descV1t );
+    morse_ztile2lap_cleanup( morse, &descV2l, &descV2t );
+    morse_ztile2lap_cleanup( morse, &descQ1l, &descQ1t );
+    morse_ztile2lap_cleanup( morse, &descQ2l, &descQ2t );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
@@ -406,7 +407,7 @@ int MORSE_ztpgqrt_Tile_Async( int L,
     /*    morse_pztpgqrtrh(Q1, T, MORSE_RHBLK, sequence, request); */
     /* } */
     if (Dptr != NULL) {
-        morse_desc_mat_free(Dptr);
+    morse_ztile2lap_cleanup( morse, &Dptrl, &Dptrt );
     }
     (void)D;
     return MORSE_SUCCESS;
diff --git a/compute/ztpqrt.c b/compute/ztpqrt.c
index b87bf269e4b76cabb4aab44788716fe312ebb038..07db102412d75bfb2608bd93bdbe3b9ca62a882d 100644
--- a/compute/ztpqrt.c
+++ b/compute/ztpqrt.c
@@ -202,8 +202,9 @@ int MORSE_ztpqrt( int M, int N, int L,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
-    morse_desc_mat_free(&descB);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
+    morse_ztile2lap_cleanup( morse, &descBl, &descBt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
diff --git a/compute/ztradd.c b/compute/ztradd.c
index 938ee9f06c0d54650ae82c2971d2cd3b76f118cc..60d76860eba9f546cdff5056b32b33765bd899d6 100644
--- a/compute/ztradd.c
+++ b/compute/ztradd.c
@@ -179,8 +179,9 @@ int MORSE_ztradd(MORSE_enum uplo, MORSE_enum trans, int M, int N,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
-    morse_desc_mat_free(&descB);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
+    morse_ztile2lap_cleanup( morse, &descBl, &descBt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
diff --git a/compute/ztrmm.c b/compute/ztrmm.c
index 70718e1aea8f37263a7999bdada1550a48e57038..5adaee188041af3dcf25719be474aa24361207cc 100644
--- a/compute/ztrmm.c
+++ b/compute/ztrmm.c
@@ -193,8 +193,9 @@ int MORSE_ztrmm(MORSE_enum side, MORSE_enum uplo,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
-    morse_desc_mat_free(&descB);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
+    morse_ztile2lap_cleanup( morse, &descBl, &descBt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
diff --git a/compute/ztrsm.c b/compute/ztrsm.c
index 652d6eb4531983f5ba2122435010a3e113c75b02..f65bb94decc18953172eb118170706d39967ef8b 100644
--- a/compute/ztrsm.c
+++ b/compute/ztrsm.c
@@ -191,8 +191,9 @@ int MORSE_ztrsm(MORSE_enum side, MORSE_enum uplo,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
-    morse_desc_mat_free(&descB);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
+    morse_ztile2lap_cleanup( morse, &descBl, &descBt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
diff --git a/compute/ztrsmpl.c b/compute/ztrsmpl.c
index 0f8bbf2b66f95450076aa836e0cc1cde04219456..fcc86aafffb93b73eb935de2a895fa57929ee3be 100644
--- a/compute/ztrsmpl.c
+++ b/compute/ztrsmpl.c
@@ -145,8 +145,9 @@ int MORSE_ztrsmpl(int N, int NRHS,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
-    morse_desc_mat_free(&descB);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
+    morse_ztile2lap_cleanup( morse, &descBl, &descBt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
diff --git a/compute/ztrtri.c b/compute/ztrtri.c
index dd5cf330646d40f0aecd61c9b455977836a874df..7eb605b37659ee61d053d90a6e600458b1098e3a 100644
--- a/compute/ztrtri.c
+++ b/compute/ztrtri.c
@@ -143,7 +143,8 @@ int MORSE_ztrtri(MORSE_enum uplo, MORSE_enum diag, int N,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
diff --git a/compute/zunglq.c b/compute/zunglq.c
index 854d8889494d1e293db7e4ad90239b7749e84d34..c41d7f7105667d41cfceb3bbcf2831ad446dd83f 100644
--- a/compute/zunglq.c
+++ b/compute/zunglq.c
@@ -151,8 +151,9 @@ int MORSE_zunglq(int M, int N, int K,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
-    morse_desc_mat_free(&descQ);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
+    morse_ztile2lap_cleanup( morse, &descQl, &descQt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
@@ -313,7 +314,7 @@ int MORSE_zunglq_Tile_Async(MORSE_desc_t *A, MORSE_desc_t *T, MORSE_desc_t *Q,
     }
 
     if (Dptr != NULL) {
-        morse_desc_mat_free(Dptr);
+    morse_ztile2lap_cleanup( morse, &Dptrl, &Dptrt );
     }
     (void)D;
     return MORSE_SUCCESS;
diff --git a/compute/zunglq_param.c b/compute/zunglq_param.c
index 5fd114954d81a4d6e218b149c67c52f7bfe604f2..5ff156c7176968a94fb67f26eda7ca429f599109 100644
--- a/compute/zunglq_param.c
+++ b/compute/zunglq_param.c
@@ -148,8 +148,9 @@ int MORSE_zunglq_param(const libhqr_tree_t *qrtree, int M, int N, int K,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
-    morse_desc_mat_free(&descQ);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
+    morse_ztile2lap_cleanup( morse, &descQl, &descQt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
@@ -308,7 +309,7 @@ int MORSE_zunglq_param_Tile_Async(const libhqr_tree_t *qrtree, MORSE_desc_t *A,
     morse_pzunglq_param(qrtree, A, Q, TS, TT, Dptr, sequence, request);
 
     if (Dptr != NULL) {
-        morse_desc_mat_free(Dptr);
+    morse_ztile2lap_cleanup( morse, &Dptrl, &Dptrt );
     }
     (void)D;
     return MORSE_SUCCESS;
diff --git a/compute/zungqr.c b/compute/zungqr.c
index e482c3ac9dd704e3b5c9b20d8d0352581709d9ad..e830d4c91046e58a812588c5e0056eb1559374cb 100644
--- a/compute/zungqr.c
+++ b/compute/zungqr.c
@@ -150,8 +150,9 @@ int MORSE_zungqr(int M, int N, int K,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
-    morse_desc_mat_free(&descQ);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
+    morse_ztile2lap_cleanup( morse, &descQl, &descQt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
@@ -310,7 +311,7 @@ int MORSE_zungqr_Tile_Async(MORSE_desc_t *A, MORSE_desc_t *T, MORSE_desc_t *Q,
     }
 
     if (Dptr != NULL) {
-        morse_desc_mat_free(Dptr);
+    morse_ztile2lap_cleanup( morse, &Dptrl, &Dptrt );
     }
     (void)D;
     return MORSE_SUCCESS;
diff --git a/compute/zungqr_param.c b/compute/zungqr_param.c
index c209d8b4f6c34df5e739c00dd5fc7b42aa543b78..cdd5370f8d8ea17a9630b8bf62aa7779fc5c0ffd 100644
--- a/compute/zungqr_param.c
+++ b/compute/zungqr_param.c
@@ -149,8 +149,9 @@ int MORSE_zungqr_param(const libhqr_tree_t *qrtree,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
-    morse_desc_mat_free(&descQ);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
+    morse_ztile2lap_cleanup( morse, &descQl, &descQt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
@@ -306,7 +307,7 @@ int MORSE_zungqr_param_Tile_Async(const libhqr_tree_t *qrtree, MORSE_desc_t *A,
     morse_pzungqr_param(qrtree, A, Q, TS, TT, Dptr, sequence, request);
 
     if (Dptr != NULL) {
-        morse_desc_mat_free(Dptr);
+    morse_ztile2lap_cleanup( morse, &Dptrl, &Dptrt );
     }
     (void)D;
     return MORSE_SUCCESS;
diff --git a/compute/zunmlq.c b/compute/zunmlq.c
index 385e898f7c90db7fa7639fb7ddbc04c2a8b77081..8a4b9ac2db511ccd8add4d2214a8f41b6901cedf 100644
--- a/compute/zunmlq.c
+++ b/compute/zunmlq.c
@@ -189,8 +189,9 @@ int MORSE_zunmlq(MORSE_enum side, MORSE_enum trans, int M, int N, int K,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
-    morse_desc_mat_free(&descC);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
+    morse_ztile2lap_cleanup( morse, &descCl, &descCt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
@@ -375,7 +376,7 @@ int MORSE_zunmlq_Tile_Async(MORSE_enum side, MORSE_enum trans,
         morse_pzunmlqrh(side, trans, A, C, T, Dptr, MORSE_RHBLK, sequence, request);
     }
     if (Dptr != NULL) {
-        morse_desc_mat_free(Dptr);
+    morse_ztile2lap_cleanup( morse, &Dptrl, &Dptrt );
     }
     (void)D;
     return MORSE_SUCCESS;
diff --git a/compute/zunmlq_param.c b/compute/zunmlq_param.c
index fd065cdc1e39cfd6465f6af90e33257b04e0135c..21b7f90acb0c2f1fff82ce5d14b734580114bfea 100644
--- a/compute/zunmlq_param.c
+++ b/compute/zunmlq_param.c
@@ -188,8 +188,9 @@ int MORSE_zunmlq_param(const libhqr_tree_t *qrtree, MORSE_enum side, MORSE_enum
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
-    morse_desc_mat_free(&descC);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
+    morse_ztile2lap_cleanup( morse, &descCl, &descCt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
@@ -370,7 +371,7 @@ int MORSE_zunmlq_param_Tile_Async(const libhqr_tree_t *qrtree, MORSE_enum side,
     morse_pzunmlq_param(qrtree, side, trans, A, C, TS, TT, Dptr, sequence, request);
 
     if (Dptr != NULL) {
-        morse_desc_mat_free(Dptr);
+    morse_ztile2lap_cleanup( morse, &Dptrl, &Dptrt );
     }
     (void)D;
     return MORSE_SUCCESS;
diff --git a/compute/zunmqr.c b/compute/zunmqr.c
index 711543b02c2b95ab9c527c8eac0565a6ed3047ee..9494b69bcd010689f193d19ef851993c31057954 100644
--- a/compute/zunmqr.c
+++ b/compute/zunmqr.c
@@ -192,8 +192,9 @@ int MORSE_zunmqr(MORSE_enum side, MORSE_enum trans, int M, int N, int K,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
-    morse_desc_mat_free(&descC);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
+    morse_ztile2lap_cleanup( morse, &descCl, &descCt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
@@ -382,7 +383,7 @@ int MORSE_zunmqr_Tile_Async(MORSE_enum side, MORSE_enum trans,
     }
 
     if (Dptr != NULL) {
-        morse_desc_mat_free(Dptr);
+    morse_ztile2lap_cleanup( morse, &Dptrl, &Dptrt );
     }
     (void)D;
     return MORSE_SUCCESS;
diff --git a/compute/zunmqr_param.c b/compute/zunmqr_param.c
index 3ab4e9606a59ba9015059636359d107eef985255..a18d362653a4a32e84106d669ed7ba619bb7383d 100644
--- a/compute/zunmqr_param.c
+++ b/compute/zunmqr_param.c
@@ -193,8 +193,9 @@ int MORSE_zunmqr_param(const libhqr_tree_t *qrtree,
 
     morse_sequence_wait(morse, sequence);
 
-    morse_desc_mat_free(&descA);
-    morse_desc_mat_free(&descC);
+    /* Cleanup the temporary data */
+    morse_ztile2lap_cleanup( morse, &descAl, &descAt );
+    morse_ztile2lap_cleanup( morse, &descCl, &descCt );
 
     status = sequence->status;
     morse_sequence_destroy(morse, sequence);
@@ -377,7 +378,7 @@ int MORSE_zunmqr_param_Tile_Async(const libhqr_tree_t *qrtree,
     morse_pzunmqr_param(qrtree, side, trans, A, C, TS, TT, Dptr, sequence, request);
 
     if (Dptr != NULL) {
-        morse_desc_mat_free(Dptr);
+    morse_ztile2lap_cleanup( morse, &Dptrl, &Dptrt );
     }
     (void)D;
     return MORSE_SUCCESS;