diff --git a/src/print.c b/src/print.c
new file mode 100644
index 0000000000000000000000000000000000000000..edb1a7e8618cc90d8b8413a5b5d7ced14090131a
--- /dev/null
+++ b/src/print.c
@@ -0,0 +1,222 @@
+/**
+ *
+ * @file print.c
+ *
+ * @copyright 2010-2017 The University of Tennessee and The University
+ *                      of Tennessee Research Foundation.  All rights
+ *                      reserved.
+ *
+ * @copyright 2012-2018 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
+ *                      Univ. Bordeaux. All rights reserved.
+ *
+ * @version 1.0.0
+ * @author Raphael Boucherie
+ * @author Mathieu Faverge
+ * @date 2017-03-21
+ *
+ */
+#include "libhqr_internal.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+/**
+ * @brief Print the matrix of tiles' type in the reduction trees
+ * @param[in] qrtree
+ *         The reduction tree to print
+ */
+void
+libhqr_print_type( const libhqr_tree_t *qrtree )
+{
+    int minMN = qrtree->nt;
+    int m, k;
+    int lm = 0;
+    int lmg = 0;
+    int rank = 0;
+
+    printf("\n------------ Localization = Type of pivot --------------\n");
+    for(m=0; m<qrtree->mt; m++) {
+        printf("%3d | ", m);
+        for (k=0; k<libhqr_imin(minMN, m+1); k++) {
+            printf( "%3d ", qrtree->gettype( qrtree, k, m ) );
+        }
+        for (k=libhqr_imin(minMN, m+1); k<minMN; k++) {
+            printf( "    " );
+        }
+
+        printf("    ");
+        printf("%2d,%3d | ", rank, lmg);
+        for (k=0; k<libhqr_imin(minMN, lmg+1); k++) {
+            printf( "%3d ", qrtree->gettype( qrtree, k, lmg) );
+        }
+        for (k=libhqr_imin(minMN, lmg+1); k<minMN; k++) {
+            printf( "    " );
+        }
+        lm++; lmg+=qrtree->p;
+        if ( lmg >= qrtree->mt ) {
+            rank++;
+            lmg = rank;
+            lm = 0;
+        }
+        printf("\n");
+    }
+}
+
+/**
+ * @brief Print the pivot of each tile
+ * @param[in] qrtree
+ *         The reduction tree to print
+ */
+void
+libhqr_print_pivot( const libhqr_tree_t *qrtree )
+{
+    int minMN = qrtree->nt;
+    int m, k;
+    int lm = 0;
+    int lmg = 0;
+    int rank = 0;
+    printf("\n------------ Current Pivot--------------\n");
+    for(m=0; m<qrtree->mt; m++) {
+        printf("%3d | ", m);
+        for (k=0; k<libhqr_imin(minMN, m+1); k++) {
+            printf( "%3d ", qrtree->currpiv(qrtree, k, m) );
+        }
+        for (k=libhqr_imin(minMN, m+1); k<minMN; k++) {
+            printf( "    " );
+        }
+
+        printf("    ");
+        printf("%2d,%3d | ", rank, lmg);
+        for (k=0; k<libhqr_imin(minMN, lmg+1); k++) {
+            printf( "%3d ", qrtree->currpiv(qrtree, k, lmg) );
+        }
+        for (k=libhqr_imin(minMN, lmg+1); k<minMN; k++) {
+            printf( "    " );
+        }
+        lm++; lmg+=qrtree->p;
+        if ( lmg >= qrtree->mt ) {
+            rank++;
+            lmg = rank;
+            lm = 0;
+        }
+        printf("\n");
+    }
+}
+
+/**
+ * @brief Print the next tile killed by a given pivot at step k
+ * @param[in] qrtree
+ *         The reduction tree to print
+ */
+void
+libhqr_print_next_k( const libhqr_tree_t *qrtree, int k )
+{
+    int m, s;
+    printf("\n------------ Next (k = %d)--------------\n", k);
+
+    printf( "      " );
+    for(s=qrtree->mt; s>0; s--)
+        printf( "%3d ", s );
+    printf( "\n" );
+
+    for(m=0; m<qrtree->mt; m++) {
+        printf("%3d | ", m);
+        for(s=qrtree->mt; s>0; s--) {
+            printf( "%3d ", qrtree->nextpiv(qrtree, k, m, s) );
+        }
+        printf("\n");
+    }
+}
+
+/**
+ * @brief Print the previous tile killed by a given pivot at step k
+ * @param[in] qrtree
+ *         The reduction tree to print
+ * @parma[in] k
+ *         The step k to print
+ */
+void
+libhqr_print_prev_k( const libhqr_tree_t *qrtree, int k )
+{
+    int m, s;
+    printf("\n------------ Prev (k = %d)--------------\n", k);
+
+    printf( "      " );
+    for(s=qrtree->mt; s>-1; s--)
+        printf( "%3d ", s );
+    printf( "\n" );
+
+    for(m=0; m<qrtree->mt; m++) {
+        printf("%3d | ", m);
+        for(s=qrtree->mt; s>-1; s--) {
+            printf( "%3d ", qrtree->prevpiv(qrtree, k, m, s) );
+        }
+        printf("\n");
+    }
+}
+
+/**
+ * @brief Print the number of geqrt per column
+ * @param[in] qrtree
+ *         The reduction tree to print
+ * @parma[in] k
+ *         The step k to print
+ */
+void
+libhqr_print_nbgeqrt( const libhqr_tree_t *qrtree )
+{
+    int minMN = qrtree->nt;
+    int m, k, nb;
+
+    printf("\n------------ Nb GEQRT per k --------------\n");
+    printf(" k      : ");
+    for (k=0; k<minMN; k++) {
+        printf( "%3d ", k );
+    }
+    printf( "\n" );
+    printf(" Compute: ");
+    for (k=0; k<minMN; k++) {
+        nb = 0;
+        for (m=k; m < qrtree->mt; m++) {
+            if ( qrtree->gettype(qrtree, k, m) > 0 ) {
+                nb++;
+            }
+        }
+        printf( "%3d ", nb );
+    }
+    printf( "\n" );
+    printf(" Formula: ");
+    for (k=0; k<minMN; k++) {
+        printf( "%3d ", qrtree->getnbgeqrf( qrtree, k ) );
+    }
+    printf( "\n" );
+}
+
+/**
+ * @brief Print the list of geqrt indices at step k
+ * @param[in] qrtree
+ *         The reduction tree to print
+ * @parma[in] k
+ *         The step k to print
+ */
+void
+libhqr_print_geqrt_k( const libhqr_tree_t *qrtree, int k )
+{
+    int i, m, nb;
+
+    printf("\n------------ Liste of geqrt for k = %d --------------\n", k);
+
+    printf( "  m:");
+    nb = qrtree->getnbgeqrf( qrtree, k );
+    for (i=0; i < nb; i++) {
+        m = qrtree->getm( qrtree, k, i );
+        if ( i == qrtree->geti( qrtree, k, m) ) {
+            printf( "%3d ", m );
+        }
+        else {
+            printf( "x%2d ", qrtree->geti( qrtree, k, m) );
+        }
+    }
+    printf( "\n" );
+}