diff --git a/src/libhqr.c b/src/libhqr.c
index ca1c524309838b01c35b7931d9635211c160a090..c63dd1560b92eefb144b12009b39d8c5ef2cd4d4 100644
--- a/src/libhqr.c
+++ b/src/libhqr.c
@@ -206,8 +206,13 @@ static int rdmtx_gettype(const libhqr_tree_t *qrtree, int k, int m){
 }
 
 static int rdmtx_currpiv(const libhqr_tree_t *qrtree, int k, int m){
-    int id;
+    int id, perm_m, p, a;
     libhqr_tileinfo_t *arg = (libhqr_tileinfo_t*)(qrtree->args);
+    perm_m = hqr_getinvperm( qrtree, k, m );
+    p = qrtree->p;
+    a = qrtree->a;
+    myassert( (p==1) || (perm_m / (p*a)) == (m / (p*a)) );
+    myassert( (p==1) || (perm_m % p) == (m % p) );
     id = (k * qrtree->mt) + m;
     return arg[id].currpiv;
 }
@@ -218,10 +223,15 @@ static int rdmtx_currpiv(const libhqr_tree_t *qrtree, int k, int m){
  */
 
 static int rdmtx_nextpiv(const libhqr_tree_t *qrtree, int k, int p, int m){
-    int id;
+    int id, om, op;
     libhqr_tileinfo_t *arg = (libhqr_tileinfo_t*)(qrtree->args);
+    int gmt = qrtree->mt;
+    om = m;
+    op = p;
+    m = hqr_getinvperm( qrtree, k, om);
+    p = hqr_getinvperm( qrtree, k, op);
     myassert( m > p && p >= k );
-    myassert( m == qrtree->mt || p == rdmtx_currpiv( qrtree, k, m ) );
+    myassert( m == gmt || op == rdmtx_currpiv( qrtree, k, om ) );
     if(m == qrtree->mt){
         id = (k * qrtree->mt) + p;
         return arg[id].first_nextpiv;
@@ -233,17 +243,23 @@ static int rdmtx_nextpiv(const libhqr_tree_t *qrtree, int k, int p, int m){
 }
 
 static int rdmtx_prevpiv(const libhqr_tree_t *qrtree, int k, int p, int m){
-    int id;
+    int id, om, op;
     libhqr_tileinfo_t *arg = (libhqr_tileinfo_t*)(qrtree->args);
-    myassert( m >= p && p >= k && m < qrtree->mt );
-    myassert( m == p || p == rdmtx_currpiv( qrtree, k, m ) );
+    int gmt = qrtree->mt;
+    om = m;
+    op = p;
+    m = hqr_getinvperm( qrtree, k, om );
+    p = hqr_getinvperm( qrtree, k, op );
+    myassert( m >= p && p >= k && m < gmt );
+    myassert( m == p || op == rdmtx_currpiv( qrtree, k, om ) );
+
     if(m == p){
         id = (k * qrtree->mt) + p;
         return arg[id].first_prevpiv;
     }
     else{
         id = (k * qrtree->mt) + m;
-        return arg[id].nextpiv;
+        return arg[id].prevpiv;
     }
 }
 /****************************************************
@@ -377,10 +393,9 @@ static int hqr_geti( const libhqr_tree_t *qrtree, int k, int m )
  *      3 - if m is reduced in distributed
  */
 static int hqr_gettype( const libhqr_tree_t *qrtree, int k, int m ) {
-    hqr_args_t *arg = (hqr_args_t*)(qrtree->args);
     int a = qrtree->a;
     int p = qrtree->p;
-    int domino = arg->domino;
+    int domino = qrtree->domino;
 
     int lm = hqr_getinvperm( qrtree, k, m );
     myassert( lm >= k );
@@ -1342,7 +1357,7 @@ static int hqr_currpiv(const libhqr_tree_t *qrtree, int k, int m)
     int lm, rank;
     int a = qrtree->a;
     int p = qrtree->p;
-    int domino = arg->domino;
+    int domino = qrtree->domino;
     int gmt = qrtree->mt;
 
     perm_m = hqr_getinvperm( qrtree, k, m );
@@ -1889,7 +1904,7 @@ libhqr_hqr_init( libhqr_tree_t *qrtree,
     }
     if ((trans != LIBHQR_QR) &&
         (trans != LIBHQR_LQ)) {
-      fprintf(stderr, "libhqr_hqr_ini, illegal value of trans");
+      fprintf(stderr, "libhqr_hqr_init, illegal value of trans");
       return -2;
     }
     if (A == NULL) {
@@ -2838,6 +2853,7 @@ void libhqr_matrix_init(libhqr_tree_t *qrtree, const libhqr_tree_t *qrtree_init)
             tile_id = (k * qrtree->mt) + i;
 
             arg[tile_id].type    = qrtree_init->gettype(qrtree_init, k, i);
+            assert( (i < k) || (arg[tile_id].type >= 0) );
             arg[tile_id].currpiv = qrtree_init->currpiv(qrtree_init, k, i);
             p = arg[tile_id].currpiv;
             arg[tile_id].first_nextpiv = qrtree_init->nextpiv(qrtree_init, k, i, qrtree->mt);
diff --git a/src/libhqr_dbg.c b/src/libhqr_dbg.c
index 46d82ef0a7e92db340cc4ab08271813c3cbd97cd..cc333f41fbafe64b3061bd13356f7dfc53c8f959 100644
--- a/src/libhqr_dbg.c
+++ b/src/libhqr_dbg.c
@@ -19,13 +19,16 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <assert.h>
 
 /* static int libhqr_qrtree_getinon0( const qr_piv_t *arg,  */
 /*                                 const int k, int i, int mt ); */
 
 #define ENDCHECK( test, ret )                   \
-    if ( !test )                                \
-	return ret;
+    if ( !test ) {                              \
+        assert( ret == 0 );                     \
+        return ret;                             \
+    }
 
 int libhqr_tree_check( libhqr_tiledesc_t *A, libhqr_tree_t *qrtree)
 {
@@ -152,7 +155,7 @@ int libhqr_tree_check( libhqr_tiledesc_t *A, libhqr_tree_t *qrtree)
 			   a, p, A->mt, A->nt,
 			   m, k);
 		    check = 0;
-		    return 3;
+                    ENDCHECK( check, 3 );
 		}
 	    }
 	}
@@ -195,7 +198,7 @@ int libhqr_tree_check( libhqr_tiledesc_t *A, libhqr_tree_t *qrtree)
 			   a, p, A->mt, A->nt,
 			   m, k);
 		    check = 0;
-		    return 3;
+                    ENDCHECK( check, 3 );
 		}
 	    }
 	}
@@ -227,11 +230,11 @@ int libhqr_tree_check( libhqr_tiledesc_t *A, libhqr_tree_t *qrtree)
 			printf(" ----------------------------------------------------\n"
 			       "  - a = %d, p = %d, M = %d, N = %d\n"
 			       "     Check next/prev:\n"
-			       "       next( m=%d, k=%d, start=%d ) => %d && prev( m=%d, k=%d, start=%d ) => %d\n ( %d != %d )",
+			       "       next( k=%d, m=%d, start=%d ) => %d && prev( k=%d, m=%d, start=%d ) => %d (instead of %d)\n",
 			       a, p, A->mt, A->nt,
-			       m, k, start, next, m, k, next, prev, start, prev);
-			check = 0;
-			return 3;
+			       k, m, start, next, k, m, next, prev, start);
+                        check = 0;
+			ENDCHECK( check, 3 );
 		    }
 		    start = next;
 		} while ( start != A->mt );
diff --git a/testings/testing_pivgen.c b/testings/testing_pivgen.c
index f28bd0fd78be7ee1b19975a1856af7f18ba20f12..ef8827ec6955f6e38933eeecb3a3585653b4bd2d 100644
--- a/testings/testing_pivgen.c
+++ b/testings/testing_pivgen.c
@@ -76,6 +76,7 @@ int main(int argc, char ** argv)
 		fprintf(stderr, "-M %d -N %d --treel=%d --qr_a=%d --tsrr=%d                                   FAILED(%d)\n",
 			allM[m], allN[n], alltreel[l], allA[a], r, rc);
 		ret |= 1;
+                libhqr_matrix_finalize( &qrtree );
                 return 0;
 	      }
 	      libhqr_matrix_finalize( &qrtree );
diff --git a/testings/testing_tileinit.c b/testings/testing_tileinit.c
index 7938c86dbd2400c49bf76e41bf4ca32897e59383..9f40d84b1b5fa76e5b7d19e25d1c0cb35702eb5f 100644
--- a/testings/testing_tileinit.c
+++ b/testings/testing_tileinit.c
@@ -28,11 +28,9 @@ main(int argc, char ** argv)
     libhqr_tileinfo_t *tiles;
     matrix.nodes = 1;
     matrix.p     = 1;
-    matrix.mt    = 16;
-    matrix.nt    = 4;
-    tiles = (libhqr_tileinfo_t*)malloc(matrix.mt*sizeof(libhqr_tileinfo_t));
+    matrix.mt    = 3;
+    matrix.nt    = 1;
     libhqr_hqr_init( &qrtree, LIBHQR_QR, &matrix, LIBHQR_BINARY_TREE, LIBHQR_FLAT_TREE, 1, 2, 0, 0);
-    libhqr_tile_init(&qrtree, 0, tiles);
     libhqr_hqr_finalize( &qrtree );
     free(tiles);
     return 1;