diff --git a/compute/pzgelqf_param.c b/compute/pzgelqf_param.c
index bfe2c6d7342caa2b5c2d85f40a4056a98c41d990..4ab23160fb6e5b6ced1d4cc67bcd8fadcd58019a 100644
--- a/compute/pzgelqf_param.c
+++ b/compute/pzgelqf_param.c
@@ -83,8 +83,7 @@ void morse_pzgelqf_param( const libhqr_tree_t *qrtree, MORSE_desc_t *A,
 
     /* Initialisation of tiles */
 
-    tiles = (int*)malloc((qrtree->mt)*sizeof(int));
-    memset( tiles, 0, (qrtree->mt)*sizeof(int) );
+    tiles = (int*)calloc(qrtree->mt, sizeof(int));
 
     ws_worker *= sizeof(MORSE_Complex64_t);
     ws_host   *= sizeof(MORSE_Complex64_t);
@@ -140,9 +139,9 @@ void morse_pzgelqf_param( const libhqr_tree_t *qrtree, MORSE_desc_t *A,
         }
 
         /* Setting the order of the tiles */
-        libhqr_treewalk(qrtree, k, tiles);
+        libhqr_walk_stepk( qrtree, k, tiles + (k+1) );
 
-        for (i = k; i < A->nt-1; i++) {
+        for (i = k+1; i < A->nt; i++) {
             n = tiles[i];
             p = qrtree->currpiv(qrtree, k, n);
 
diff --git a/compute/pzgeqrf_param.c b/compute/pzgeqrf_param.c
index feba0f364e0baf3139e8399e5ba0a7b40c09785b..945a07029ea0865a843836704f59d5c5c12e0e88 100644
--- a/compute/pzgeqrf_param.c
+++ b/compute/pzgeqrf_param.c
@@ -83,8 +83,7 @@ void morse_pzgeqrf_param( const libhqr_tree_t *qrtree, MORSE_desc_t *A,
 
     /* Initialisation of tiles */
 
-    tiles = (int*)malloc((qrtree->mt)*sizeof(int));
-    memset( tiles, 0, (qrtree->mt)*sizeof(int) );
+    tiles = (int*)calloc(qrtree->mt, sizeof(int));
 
     ws_worker *= sizeof(MORSE_Complex64_t);
     ws_host   *= sizeof(MORSE_Complex64_t);
@@ -139,9 +138,9 @@ void morse_pzgeqrf_param( const libhqr_tree_t *qrtree, MORSE_desc_t *A,
         }
 
         /* Setting the order of the tiles */
-        libhqr_treewalk(qrtree, k, tiles);
+        libhqr_walk_stepk( qrtree, k, tiles + (k+1) );
 
-        for (i = k; i < A->mt-1; i++) {
+        for (i = k+1; i < A->mt; i++) {
             m = tiles[i];
             p = qrtree->currpiv(qrtree, k, m);
 
diff --git a/compute/pzunglq_param.c b/compute/pzunglq_param.c
index 91aad1791060ff1e2084772eff4f962abac1247f..4a5d7c21c60ea1bdf92997eb166cb630c612057e 100644
--- a/compute/pzunglq_param.c
+++ b/compute/pzunglq_param.c
@@ -79,8 +79,7 @@ void morse_pzunglq_param(const libhqr_tree_t *qrtree, MORSE_desc_t *A, MORSE_des
 
     /* Initialisation of tiles */
 
-    tiles = (int*)malloc((qrtree->mt)*sizeof(int));
-    memset( tiles, 0, (qrtree->mt)*sizeof(int) );
+    tiles = (int*)calloc( qrtree->mt, sizeof(int));
 
     ws_worker *= sizeof(MORSE_Complex64_t);
     ws_host   *= sizeof(MORSE_Complex64_t);
@@ -96,9 +95,9 @@ void morse_pzunglq_param(const libhqr_tree_t *qrtree, MORSE_desc_t *A, MORSE_des
         ldak = BLKLDD(A, k);
 
         /* Setting the order of the tiles*/
-        libhqr_treewalk(qrtree, k, tiles);
+        libhqr_walk_stepk(qrtree, k, tiles + (k+1));
 
-        for (i = A->nt-2; i >= k; i--) {
+        for (i = A->nt-1; i > k; i--) {
             n = tiles[i];
             p = qrtree->currpiv(qrtree, k, n);
 
diff --git a/compute/pzungqr_param.c b/compute/pzungqr_param.c
index eaa3b753d3347a07caebda51f19c635c4d68443c..d5a3169d71614a6413a9f91934a8c96a22f1e33d 100644
--- a/compute/pzungqr_param.c
+++ b/compute/pzungqr_param.c
@@ -85,8 +85,7 @@ void morse_pzungqr_param(const libhqr_tree_t *qrtree,
 
     /* Initialisation of tiles */
 
-    tiles = (int*)malloc((qrtree->mt)*sizeof(int));
-    memset( tiles, 0, (qrtree->mt)*sizeof(int) );
+    tiles = (int*)calloc(qrtree->mt, sizeof(int));
 
     ws_worker *= sizeof(MORSE_Complex64_t);
     ws_host   *= sizeof(MORSE_Complex64_t);
@@ -99,9 +98,9 @@ void morse_pzungqr_param(const libhqr_tree_t *qrtree,
         tempkn = k == A->nt-1 ? A->n-k*A->nb : A->nb;
 
         /* Setting the order of tiles */
-        libhqr_treewalk(qrtree, k, tiles);
+        libhqr_walk_stepk(qrtree, k, tiles + (k+1));
 
-        for (i = Q->mt - 2; i >= k; i--) {
+        for (i = Q->mt-1; i > k; i--) {
             m = tiles[i];
             p = qrtree->currpiv(qrtree, k, m);
 
diff --git a/compute/pzunmlq_param.c b/compute/pzunmlq_param.c
index 1763d7fadbe8489939f11c8134ea9ae63ed4f48c..10731ba0534956c130c39c442850cb7e5e365084 100644
--- a/compute/pzunmlq_param.c
+++ b/compute/pzunmlq_param.c
@@ -81,8 +81,7 @@ void morse_pzunmlq_param(const libhqr_tree_t *qrtree,
 #endif
 
     /* Initialisation of tiles */
-    tiles = (int*)malloc((qrtree->mt)*sizeof(int));
-    memset( tiles, 0, (qrtree->mt)*sizeof(int) );
+    tiles = (int*)calloc( qrtree->mt, sizeof(int) );
 
     ws_worker *= sizeof(MORSE_Complex64_t);
     ws_host   *= sizeof(MORSE_Complex64_t);
@@ -134,9 +133,9 @@ void morse_pzunmlq_param(const libhqr_tree_t *qrtree,
                 }
 
                 /* Setting the order of the tiles*/
-                libhqr_treewalk(qrtree, k, tiles);
+                libhqr_walk_stepk(qrtree, k, tiles + (k+1));
 
-                for (i = k; i < A->nt-1; i++) {
+                for (i = k+1; i < A->nt; i++) {
                     m = tiles[i];
                     p = qrtree->currpiv(qrtree, k, m);
 
@@ -187,9 +186,9 @@ void morse_pzunmlq_param(const libhqr_tree_t *qrtree,
                 ldak = BLKLDD(A, k);
 
                 /* Setting the order of the tiles*/
-                libhqr_treewalk(qrtree, k, tiles);
+                libhqr_walk_stepk(qrtree, k, tiles + (k+1));
 
-                for (i = A->nt-2; i >= k; i--) {
+                for (i = A->nt-1; i > k; i--) {
                     m = tiles[i];
                     p = qrtree->currpiv(qrtree, k, m);
 
@@ -272,9 +271,9 @@ void morse_pzunmlq_param(const libhqr_tree_t *qrtree,
                 ldak = BLKLDD(A, k);
 
                 /* Setting the order of the tiles*/
-                libhqr_treewalk(qrtree, k, tiles);
+                libhqr_walk_stepk(qrtree, k, tiles + (k+1));
 
-                for (i = A->nt-2; i >= k; i--) {
+                for (i = A->nt-1; i > k; i--) {
                     n = tiles[i];
                     p = qrtree->currpiv(qrtree, k, n);
 
@@ -389,9 +388,9 @@ void morse_pzunmlq_param(const libhqr_tree_t *qrtree,
                     }
                 }
                 /* Setting the order of tiles */
-                libhqr_treewalk(qrtree, k, tiles);
+                libhqr_walk_stepk(qrtree, k, tiles + (k+1));
 
-                for (i = k; i < A->nt-1; i++) {
+                for (i = k+1; i < A->nt; i++) {
                     n = tiles[i];
                     p = qrtree->currpiv(qrtree, k, n);
 
diff --git a/compute/pzunmqr_param.c b/compute/pzunmqr_param.c
index ab5f3a7fb39a4fec9d8486fa75b4c76d9598ea11..6dc3e7dacb25e2516d2c8f887a0f79243216e253 100644
--- a/compute/pzunmqr_param.c
+++ b/compute/pzunmqr_param.c
@@ -81,8 +81,7 @@ void morse_pzunmqr_param(const libhqr_tree_t *qrtree,
 
     /* Initialisation of tiles */
 
-    tiles = (int*)malloc((qrtree->mt)*sizeof(int));
-    memset( tiles, 0, (qrtree->mt)*sizeof(int) );
+    tiles = (int*)calloc( qrtree->mt, sizeof(int) );
 
     ws_worker *= sizeof(MORSE_Complex64_t);
     ws_host   *= sizeof(MORSE_Complex64_t);
@@ -133,9 +132,9 @@ void morse_pzunmqr_param(const libhqr_tree_t *qrtree,
                     }
                 }
                 /* Setting the order of the tiles*/
-                libhqr_treewalk(qrtree, k, tiles);
+                libhqr_walk_stepk(qrtree, k, tiles + (k+1));
 
-                for (i = k; i < B->mt-1; i++) {
+                for (i = k+1; i < B->mt; i++) {
                     m = tiles[i];
                     p = qrtree->currpiv(qrtree, k, m);
 
@@ -182,9 +181,9 @@ void morse_pzunmqr_param(const libhqr_tree_t *qrtree,
                 tempkn = k == A->nt-1 ? A->n-k*A->nb : A->nb;
 
                 /* Setting the order of the tiles*/
-                libhqr_treewalk(qrtree, k, tiles);
+                libhqr_walk_stepk(qrtree, k, tiles + (k+1));
 
-                for (i = B->mt-2; i >= k; i--) {
+                for (i = B->mt-1; i > k; i--) {
                     m = tiles[i];
                     p = qrtree->currpiv(qrtree, k, m);
 
@@ -269,9 +268,9 @@ void morse_pzunmqr_param(const libhqr_tree_t *qrtree,
                 tempkn = k == A->nt-1 ? A->n - k*A->nb : A->nb;
 
                 /* Setting the order of tiles */
-                libhqr_treewalk(qrtree, k, tiles);
+                libhqr_walk_stepk(qrtree, k, tiles + (k+1));
 
-                for (i = B->nt-2; i >= k; i--) {
+                for (i = B->nt-1; i > k; i--) {
                     n = tiles[i];
                     p = qrtree->currpiv(qrtree, k, n);
 
@@ -388,9 +387,9 @@ void morse_pzunmqr_param(const libhqr_tree_t *qrtree,
                     }
                 }
                 /* Setting the order of tiles */
-                libhqr_treewalk(qrtree, k, tiles);
+                libhqr_walk_stepk(qrtree, k, tiles + (k+1));
 
-                for (i = k; i < B->nt-1; i++) {
+                for (i = k+1; i < B->nt; i++) {
                     n = tiles[i];
                     p = qrtree->currpiv(qrtree, k, n);
 
diff --git a/hqr b/hqr
index d11ed5ef457af3ebb6556e8ec2b4c3744e8688c0..95de89897e6221e48e29b34bc47b8a1ba92621e7 160000
--- a/hqr
+++ b/hqr
@@ -1 +1 @@
-Subproject commit d11ed5ef457af3ebb6556e8ec2b4c3744e8688c0
+Subproject commit 95de89897e6221e48e29b34bc47b8a1ba92621e7
diff --git a/testing/testing_zgels_hqr.c b/testing/testing_zgels_hqr.c
index fd9de27534e894a87d9671c0a01adb6bfd2118e8..b155ffb9ba5bb51a870d1fc744934598dac082e6 100644
--- a/testing/testing_zgels_hqr.c
+++ b/testing/testing_zgels_hqr.c
@@ -77,8 +77,8 @@ int testing_zgels_hqr(int argc, char **argv)
     int llvl   = atoi(argv[7]);
     int hlvl   = atoi(argv[8]);
     int domino = atoi(argv[9]);
-    libhqr_tree_t     qrtree;
-    libhqr_tiledesc_t matrix;
+    libhqr_tree_t   qrtree;
+    libhqr_matrix_t matrix;
 
     int K = min(M, N);
     double eps;
@@ -117,7 +117,7 @@ int testing_zgels_hqr(int argc, char **argv)
     matrix.nodes = 1;
     matrix.p = 1;
 
-    libhqr_hqr_init( &qrtree,
+    libhqr_init_hqr( &qrtree,
                      ( M >= N ) ? LIBHQR_QR : LIBHQR_LQ,
                      &matrix, llvl, hlvl, qr_a, qr_p, domino, 0);
 
@@ -322,7 +322,7 @@ int testing_zgels_hqr(int argc, char **argv)
         }
     }
 
-    libhqr_matrix_finalize( &qrtree );
+    libhqr_finalize( &qrtree );
 
     free(A1); free(A2); free(B1); free(B2); free(Q);
     MORSE_Dealloc_Workspace( &TS );
diff --git a/testing/testing_zgels_systolic.c b/testing/testing_zgels_systolic.c
index fce16bfc8fa637f8616d1da1b2475345567ca569..a3d78696d71884f572906859820abb29d840ea14 100644
--- a/testing/testing_zgels_systolic.c
+++ b/testing/testing_zgels_systolic.c
@@ -71,8 +71,8 @@ int testing_zgels_systolic(int argc, char **argv)
     int LDB    = max( max( atoi(argv[4]), M ), N );
     int p      = atoi(argv[5]);
     int q      = atoi(argv[6]);
-    libhqr_tree_t     qrtree;
-    libhqr_tiledesc_t matrix;
+    libhqr_tree_t   qrtree;
+    libhqr_matrix_t matrix;
 
     int K = min(M, N);
     double eps;
@@ -111,9 +111,9 @@ int testing_zgels_systolic(int argc, char **argv)
     matrix.nodes = 1;
     matrix.p = 1;
 
-    libhqr_systolic_init( &qrtree,
-                          ( M >= N ) ? LIBHQR_QR : LIBHQR_LQ,
-                          &matrix, p, q );
+    libhqr_init_sys( &qrtree,
+                     ( M >= N ) ? LIBHQR_QR : LIBHQR_LQ,
+                     &matrix, p, q );
 
     /* Initialize A1 and A2 */
     LAPACKE_zlarnv_work(IONE, ISEED, LDAxN, A1);
@@ -320,7 +320,7 @@ int testing_zgels_systolic(int argc, char **argv)
         }
     }
 
-    libhqr_matrix_finalize( &qrtree );
+    libhqr_finalize( &qrtree );
 
     free(A1); free(A2); free(B1); free(B2); free(Q);
     MORSE_Dealloc_Workspace( &TS );